@cardstack/boxel-cli 0.3.2-unstable.61 → 0.4.0-unstable.1

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 (344) hide show
  1. package/bundled-realms/base/card-api.gts +2 -0
  2. package/bundled-realms/base/components/cards-grid-layout.gts +24 -2
  3. package/bundled-realms/base/field-component.gts +16 -4
  4. package/bundled-realms/base/links-to-editor.gts +27 -3
  5. package/bundled-realms/base/realm-config.gts +18 -1
  6. package/bundled-test-harness/assets/adapter-unm-Xq4g.js +2 -0
  7. package/bundled-test-harness/assets/{add-field-to-card-definition-command-test-DkxmkPH6.js → add-field-to-card-definition-command-test-CCaDu5uP.js} +2 -2
  8. package/bundled-test-harness/assets/{add-workspace-tMjv_Ar4.js → add-workspace-DBDTvtP2.js} +3 -3
  9. package/bundled-test-harness/assets/{add-workspace-test-BMKxSlaC.js → add-workspace-test-CE21v7jK.js} +3 -3
  10. package/bundled-test-harness/assets/{ai-assistant-test-C3LjW9Uz.js → ai-assistant-test-DSyMR0hY.js} +8 -7
  11. package/bundled-test-harness/assets/{ai-function-generation-test-WqD9vlzP.js → ai-function-generation-test-BkTvuCnq.js} +1 -1
  12. package/bundled-test-harness/assets/{ai-module-creation-test-CeP1V90-.js → ai-module-creation-test-zY83EN93.js} +3 -3
  13. package/bundled-test-harness/assets/{aibot-message-CiwsV-h8.js → aibot-message-BfRah4Lm.js} +2 -2
  14. package/bundled-test-harness/assets/{app-C8fZHSIY.js → app-CPRVydcd.js} +321 -33
  15. package/bundled-test-harness/assets/{apply-markdown-edit-test-VkN9mVg4.js → apply-markdown-edit-test-CpeCS12T.js} +2 -2
  16. package/bundled-test-harness/assets/{apply-search-replace-block-test-C4GiLUbz.js → apply-search-replace-block-test-Czoi47xr.js} +1 -1
  17. package/bundled-test-harness/assets/{auth-service-worker-registration-CGUqW_lr.js → auth-service-worker-registration-C3rAs9Yi.js} +1 -1
  18. package/bundled-test-harness/assets/{auth-service-worker-test-DjVH_n4v.js → auth-service-worker-test-DTHQyoUg.js} +3 -3
  19. package/bundled-test-harness/assets/{authed-fetch-test-PT9AWQEk.js → authed-fetch-test-BRqybmXe.js} +2 -2
  20. package/bundled-test-harness/assets/{avif-image-def-test-BMFnvMFY.js → avif-image-def-test-BVwv4Ahc.js} +1 -1
  21. package/bundled-test-harness/assets/{basic-test-B5EcLZRP.js → basic-test-Dbky79J2.js} +1 -1
  22. package/bundled-test-harness/assets/{binary-upload-dedupe-test-BvQVNF95.js → binary-upload-dedupe-test-nnaYqiTh.js} +3 -3
  23. package/bundled-test-harness/assets/{bot-registration-test-Cy1HY7PT.js → bot-registration-test-zrufhFTo.js} +2 -2
  24. package/bundled-test-harness/assets/{box-test-BTOPLQ3k.js → box-test-B85wfMJn.js} +1 -1
  25. package/bundled-test-harness/assets/{brand-guide-attachments-test-C4R_z8N5.js → brand-guide-attachments-test-C8-n-naq.js} +2 -2
  26. package/bundled-test-harness/assets/{brand-guide-custom-css-test-Me-k86li.js → brand-guide-custom-css-test-B2fmvFp4.js} +2 -2
  27. package/bundled-test-harness/assets/{brand-logo-mark-field-test-DcCSpYJq.js → brand-logo-mark-field-test-CJ4s6jjd.js} +2 -2
  28. package/bundled-test-harness/assets/{broken-link-template-test-BRD2BX45.js → broken-link-template-test-BHXrPxQ6.js} +2 -2
  29. package/bundled-test-harness/assets/{can-read-realm-test-_flXUfS4.js → can-read-realm-test-mHnz9-_s.js} +2 -2
  30. package/bundled-test-harness/assets/{cancel-indexing-job-test-0JyPszPo.js → cancel-indexing-job-test-Drx2ghoA.js} +2 -2
  31. package/bundled-test-harness/assets/{card-api-test-BpeMpeQ0.js → card-api-test-C0HrvAuC.js} +3 -3
  32. package/bundled-test-harness/assets/{card-basics-test-C-UCeun-.js → card-basics-test-CvITmKK-.js} +3 -3
  33. package/bundled-test-harness/assets/{card-catalog-test-4K3_LE47.js → card-catalog-test-CWkfBRuQ.js} +3 -3
  34. package/bundled-test-harness/assets/{card-copy-test-BFFsV3G-.js → card-copy-test-Co_MPCIJ.js} +3 -3
  35. package/bundled-test-harness/assets/{card-def-field-def-relationships-test-CRjFV5pq.js → card-def-field-def-relationships-test-7e-g4qJs.js} +3 -3
  36. package/bundled-test-harness/assets/{card-def-menu-items-test-DQNnU_0P.js → card-def-menu-items-test-DLO6TEhC.js} +1 -1
  37. package/bundled-test-harness/assets/{card-delete-test-DOyt5y-x.js → card-delete-test-BcOtJYm4.js} +3 -3
  38. package/bundled-test-harness/assets/{card-error-detail-DuFoktdn.js → card-error-detail-Q7wtuRcv.js} +2 -2
  39. package/bundled-test-harness/assets/{card-playground-test-CiESzD5-.js → card-playground-test-DxoIBbjx.js} +3 -3
  40. package/bundled-test-harness/assets/{card-search-adorn-test-DdTUl5RY.js → card-search-adorn-test-CbsnFvDF.js} +2 -2
  41. package/bundled-test-harness/assets/{card-search-selection-menu-test-BJFUbgA1.js → card-search-selection-menu-test-CY77b1kz.js} +2 -2
  42. package/bundled-test-harness/assets/{check-correctness-test-B4E7WXSZ.js → check-correctness-test-D0EYMlP7.js} +2 -2
  43. package/bundled-test-harness/assets/{check-domain-availability-test-BnmsW2P7.js → check-domain-availability-test-BYAkVLGj.js} +2 -2
  44. package/bundled-test-harness/assets/{code-patches-test-6Lvfhm1l.js → code-patches-test-BDg35i4X.js} +1 -1
  45. package/bundled-test-harness/assets/{code-ref-test-BWuTdZ2e.js → code-ref-test-BZGL3teK.js} +1 -1
  46. package/bundled-test-harness/assets/{code-submode-test-DPzE9tKe.js → code-submode-test-DIiXgCRB.js} +3 -3
  47. package/bundled-test-harness/assets/{codeblocks-test-MV1tHflj.js → codeblocks-test-CFR0u5-j.js} +3 -3
  48. package/bundled-test-harness/assets/{codemirror-editor-test-SD3gDmHw.js → codemirror-editor-test-e1Yn_b_1.js} +1 -1
  49. package/bundled-test-harness/assets/{color-field-test-C_7cf4Z2.js → color-field-test-okcvtdsF.js} +2 -2
  50. package/bundled-test-harness/assets/{commands-DoigkJc8.js → commands-BOwQjc8N.js} +3 -3
  51. package/bundled-test-harness/assets/{commands-calling-test-Br4sMoMf.js → commands-calling-test-BETL8EWm.js} +2 -2
  52. package/bundled-test-harness/assets/{commands-test-71b4Fun5.js → commands-test-BpFjXsiC.js} +3 -3
  53. package/bundled-test-harness/assets/{commands-test-COT9Ck-6.js → commands-test-QSW7zRvO.js} +2 -2
  54. package/bundled-test-harness/assets/{components-CBfd9MIo.js → components-DYC4nC4r.js} +184 -184
  55. package/bundled-test-harness/assets/{components-8vaKSlYm.css → components-DgK6vTbM.css} +17 -14
  56. package/bundled-test-harness/assets/{computed-test-BbCVTMkD.js → computed-test-C2j8r-e_.js} +2 -2
  57. package/bundled-test-harness/assets/{container-BVdtw4NT.js → container-DRblzvCW.js} +18 -18
  58. package/bundled-test-harness/assets/{convert-to-class-name-test-DmF3wUKb.js → convert-to-class-name-test-BiCrnGxA.js} +1 -1
  59. package/bundled-test-harness/assets/{copy-and-edit-test-1xrTe8p1.js → copy-and-edit-test-DqV_dpu_.js} +1 -1
  60. package/bundled-test-harness/assets/{copy-card-test-D0rXx03h.js → copy-card-test-B4dNP03f.js} +1 -1
  61. package/bundled-test-harness/assets/{copy-file-to-realm-test-DxW5PABL.js → copy-file-to-realm-test-oGK9EM0P.js} +1 -1
  62. package/bundled-test-harness/assets/{copy-source-test-Dy83btnV.js → copy-source-test-GtNFw5fv.js} +2 -2
  63. package/bundled-test-harness/assets/{create-file-modal-BNJHELMz.js → create-file-modal-Cfvn0u5s.js} +4 -4
  64. package/bundled-test-harness/assets/{create-file-test-DimDxpRl.js → create-file-test-2WPpTJ5F.js} +1 -1
  65. package/bundled-test-harness/assets/{create-file-test-COppMhde.js → create-file-test-HxkEMHWL.js} +2 -2
  66. package/bundled-test-harness/assets/{create-listing-modal-test-D57Altg2.js → create-listing-modal-test-W6LuCzaK.js} +4 -4
  67. package/bundled-test-harness/assets/{create-listing-pr-request-test-HJmFkx_x.js → create-listing-pr-request-test-2ZRF_IBk.js} +2 -2
  68. package/bundled-test-harness/assets/{create-spec-test-C-4bkoj3.js → create-spec-test-JVOisAUl.js} +1 -1
  69. package/bundled-test-harness/assets/{csv-file-def-test-GOmD6Ikx.js → csv-file-def-test-DIVp_7a6.js} +1 -1
  70. package/bundled-test-harness/assets/{date-time-fields-test-BYn57092.js → date-time-fields-test-BWdrrYdj.js} +2 -2
  71. package/bundled-test-harness/assets/{debug-message-test-CNzx_IFI.js → debug-message-test-CXVfUuec.js} +3 -3
  72. package/bundled-test-harness/assets/{diffing-test-PA40XPFB.js → diffing-test-JzXF051K.js} +1 -1
  73. package/bundled-test-harness/assets/{editor-test-Dg1fTno0.js → editor-test-j9znzFxy.js} +2 -2
  74. package/bundled-test-harness/assets/{email-field-test-rPWkRvgR.js → email-field-test-D4vZ2Qnc.js} +2 -2
  75. package/bundled-test-harness/assets/{enum-field-test-DjQ-sjAR.js → enum-field-test-DtZ_sOiA.js} +2 -2
  76. package/bundled-test-harness/assets/{error-display-test-Cp1vgWSg.js → error-display-test-B6I8CYXw.js} +2 -2
  77. package/bundled-test-harness/assets/{evaluate-module-test-Bm6adsJS.js → evaluate-module-test-C_F1Y9Az.js} +1 -1
  78. package/bundled-test-harness/assets/{execute-atomic-operations-test-BAB2vv15.js → execute-atomic-operations-test-D_z5eJ6K.js} +2 -2
  79. package/bundled-test-harness/assets/{externals-C65aJ_7H.js → externals-DiG6hYU9.js} +2 -2
  80. package/bundled-test-harness/assets/fallback-banner-live-delete-test-Bv_OBmzY.js +209 -0
  81. package/bundled-test-harness/assets/{fallback-banner-test-Md-3yTpX.js → fallback-banner-test-DSjH5ank.js} +1 -1
  82. package/bundled-test-harness/assets/{fallback-banner-test-DpCz2idU.js → fallback-banner-test-TL8jNe4f.js} +3 -3
  83. package/bundled-test-harness/assets/{fallback-models-test-DcB9u65l.js → fallback-models-test-DEhvKsfY.js} +3 -3
  84. package/bundled-test-harness/assets/{fetch-card-json-test-CPHdklsi.js → fetch-card-json-test-BPfTOr4N.js} +2 -2
  85. package/bundled-test-harness/assets/{field-configuration-test-Da5xu3ar.js → field-configuration-test-CH1Kc0iA.js} +2 -2
  86. package/bundled-test-harness/assets/{field-markdown-domain-test-7aY4gMQ3.js → field-markdown-domain-test-COaJBBzN.js} +2 -2
  87. package/bundled-test-harness/assets/{field-markdown-primitives-test-B8UurS_m.js → field-markdown-primitives-test-C52WikZw.js} +2 -2
  88. package/bundled-test-harness/assets/{field-markdown-specialized-test-CHiWEV2t.js → field-markdown-specialized-test-Cmq-3t4u.js} +2 -2
  89. package/bundled-test-harness/assets/{field-playground-test-DBVHB2_g.js → field-playground-test-DbXri11f.js} +3 -3
  90. package/bundled-test-harness/assets/{field-support-predicates-test-i8LXzh_P.js → field-support-predicates-test-ni5pZ9sU.js} +1 -1
  91. package/bundled-test-harness/assets/{field-test-helpers-F8iX3xAt.js → field-test-helpers-BLApZo43.js} +1 -1
  92. package/bundled-test-harness/assets/{file-DUbLArQi.js → file-D8hnXC1_.js} +8 -2
  93. package/bundled-test-harness/assets/{file-attachment-test-yfZsKhWQ.js → file-attachment-test-CkL6IaWf.js} +3 -3
  94. package/bundled-test-harness/assets/{file-chooser-test-JOvGg1N8.js → file-chooser-test-M1rOgltw.js} +2 -2
  95. package/bundled-test-harness/assets/{file-def-live-reload-test-B_XsrkaB.js → file-def-live-reload-test--L4MvUj5.js} +1 -1
  96. package/bundled-test-harness/assets/{file-def-menu-items-test-CkZrFXrK.js → file-def-menu-items-test-B_dVulF7.js} +1 -1
  97. package/bundled-test-harness/assets/{file-def-navigation-test-CyO27adK.js → file-def-navigation-test-B4_pzEXy.js} +1 -1
  98. package/bundled-test-harness/assets/{file-def-serialization-test-1XrP63F8.js → file-def-serialization-test-IoGIzKST.js} +1 -1
  99. package/bundled-test-harness/assets/{file-def-test-BJEhQN1c.js → file-def-test-CT8jTLQy.js} +1 -1
  100. package/bundled-test-harness/assets/{file-tree-test-DQSPDeb2.js → file-tree-test-DQNSRISM.js} +2 -2
  101. package/bundled-test-harness/assets/{flac-audio-def-test-CeyxsGOr.js → flac-audio-def-test-CEt7tShK.js} +1 -1
  102. package/bundled-test-harness/assets/{formatted-aibot-message-test-D09eSldQ.js → formatted-aibot-message-test-CNk1lVYO.js} +3 -3
  103. package/bundled-test-harness/assets/{formatted-user-message-test-DmX95kEo.js → formatted-user-message-test-By3DTUBk.js} +2 -2
  104. package/bundled-test-harness/assets/{freestyle-test-KaFCs8l2.js → freestyle-test-BOVAHn_7.js} +1 -1
  105. package/bundled-test-harness/assets/{full-reindex-realm-test-BCUSPZuX.js → full-reindex-realm-test-BQji9QK_.js} +2 -2
  106. package/bundled-test-harness/assets/{garbage-collection-test-BJmgY3IQ.js → garbage-collection-test-bPtmt69E.js} +1 -1
  107. package/bundled-test-harness/assets/{general-test-B5RcCakW.js → general-test-B_QwZC0y.js} +3 -3
  108. package/bundled-test-harness/assets/{generate-example-cards-one-shot-test-Bh9_GXLK.js → generate-example-cards-one-shot-test-DtYqN3qW.js} +1 -1
  109. package/bundled-test-harness/assets/{get-available-realm-identifiers-test-C18mJr3L.js → get-available-realm-identifiers-test-BiHIbpFc.js} +2 -2
  110. package/bundled-test-harness/assets/{get-catalog-realm-identifiers-test-vDnl-arI.js → get-catalog-realm-identifiers-test-B4EVfXvp.js} +2 -2
  111. package/bundled-test-harness/assets/{get-default-writable-realm-test-Co4F_EH-.js → get-default-writable-realm-test-C2izRfTp.js} +2 -2
  112. package/bundled-test-harness/assets/{get-published-realms-test-D6auThJu.js → get-published-realms-test-CJlYS6SA.js} +1 -1
  113. package/bundled-test-harness/assets/{get-realm-of-resource-identifier-test-BeVoQztL.js → get-realm-of-resource-identifier-test-DZG0gROs.js} +2 -2
  114. package/bundled-test-harness/assets/{get-relationship-membership-state-test-Cm_VeTXw.js → get-relationship-membership-state-test-wOVStpnA.js} +1 -1
  115. package/bundled-test-harness/assets/{get-user-system-card-test-CAc-Ainy.js → get-user-system-card-test-Bf_il1b_.js} +2 -2
  116. package/bundled-test-harness/assets/{gif-image-def-test-Co2Woq8R.js → gif-image-def-test-DD4BOFUq.js} +1 -1
  117. package/bundled-test-harness/assets/{gts-file-def-test-DMhWqyxZ.js → gts-file-def-test-KrlOMcTY.js} +1 -1
  118. package/bundled-test-harness/assets/{head-format-preview-test-DPOjt1cu.js → head-format-preview-test-CGzx-i_Q.js} +2 -2
  119. package/bundled-test-harness/assets/{helpers-BIQP26gX.js → helpers-CR-27yCL.js} +1 -1
  120. package/bundled-test-harness/assets/{host-mode-service-BYjO5JXT.js → host-mode-service-BPYfmILw.js} +1 -1
  121. package/bundled-test-harness/assets/{host-mode-test-D9kRy5kW.js → host-mode-test-sjKqSasU.js} +3 -3
  122. package/bundled-test-harness/assets/{host-submode-test-Zy7-q9vh.js → host-submode-test-CvezMbrv.js} +1 -1
  123. package/bundled-test-harness/assets/{hydratable-card-test-DvgHojHD.js → hydratable-card-test-Ds6x3mv5.js} +1 -1
  124. package/bundled-test-harness/assets/{index-query-engine-test-Bk52a889.js → index-query-engine-test-x77vbwML.js} +2 -2
  125. package/bundled-test-harness/assets/{index-writer-test-DNeo1Uod.js → index-writer-test-BMajX3Mj.js} +1 -1
  126. package/bundled-test-harness/assets/{inspector-test-OaFEP4S0.js → inspector-test-CtCAKlpG.js} +42 -5
  127. package/bundled-test-harness/assets/{instance-filter-matcher-test-PeeLVGMO.js → instance-filter-matcher-test-YKzjZAa3.js} +2 -2
  128. package/bundled-test-harness/assets/{instantiate-card-test-C0Y8FG7w.js → instantiate-card-test-Ba3rd5Zn.js} +1 -1
  129. package/bundled-test-harness/assets/{interact-submode-creation-and-permissions-test-Cp3YiIQG.js → interact-submode-creation-and-permissions-test-2_4tHla6.js} +4 -4
  130. package/bundled-test-harness/assets/{interact-submode-setup-CtFp9kvB.js → interact-submode-setup-DI2HM3S-.js} +2 -2
  131. package/bundled-test-harness/assets/{interact-submode-test-B_JqGk2t.js → interact-submode-test-BUKZnm-y.js} +2 -2
  132. package/bundled-test-harness/assets/{invalidate-realm-identifiers-test-Dpa0TzwS.js → invalidate-realm-identifiers-test-Bl1RP3Kp.js} +2 -2
  133. package/bundled-test-harness/assets/{invite-user-to-room-test-DXzTeCgP.js → invite-user-to-room-test-Q26QQwvj.js} +2 -2
  134. package/bundled-test-harness/assets/{isolated-render-test-DVzQEdsY.js → isolated-render-test-Bc2ASFB1.js} +1 -1
  135. package/bundled-test-harness/assets/{item-button-CAhhwhRh.js → item-button-CepLHUN-.js} +1 -1
  136. package/bundled-test-harness/assets/{job-priority-header-test-J8emfVrj.js → job-priority-header-test-CDDfX3mF.js} +1 -1
  137. package/bundled-test-harness/assets/{jpg-image-def-test-D7txmQ4U.js → jpg-image-def-test-DGjpMEj5.js} +1 -1
  138. package/bundled-test-harness/assets/{json-file-def-test-C3W6amHE.js → json-file-def-test-8NlQ7NyF.js} +1 -1
  139. package/bundled-test-harness/assets/{linksto-broken-link-placeholder-test-nZIKEYDd.js → linksto-broken-link-placeholder-test-OPR5aao3.js} +2 -2
  140. package/bundled-test-harness/assets/{linksto-error-sentinel-test-E5UdAPkR.js → linksto-error-sentinel-test-DNEi2-4f.js} +1 -1
  141. package/bundled-test-harness/assets/{linksto-many-broken-link-placeholder-test-D5lhE5y-.js → linksto-many-broken-link-placeholder-test-Bl3-UMZt.js} +2 -2
  142. package/bundled-test-harness/assets/{linksto-many-per-slot-access-test-uONh3sy8.js → linksto-many-per-slot-access-test-Cv88sT3k.js} +1 -1
  143. package/bundled-test-harness/assets/{linksto-sentinel-roundtrip-test-CUbMHhoz.js → linksto-sentinel-roundtrip-test-DDrNtJgY.js} +1 -1
  144. package/bundled-test-harness/assets/{linksto-singular-js-access-contract-test-Doycge43.js → linksto-singular-js-access-contract-test-CMOxHvSS.js} +1 -1
  145. package/bundled-test-harness/assets/{live-prerendered-search-kxxMxyHS.js → live-prerendered-search-DiFs_MHd.js} +1 -1
  146. package/bundled-test-harness/assets/{live-test-pbHzyWf7.js → live-test-BfSJ7dPf.js} +6 -6
  147. package/bundled-test-harness/assets/live-test-CfcRApCW.js +2 -0
  148. package/bundled-test-harness/assets/{loader-parallel-prefetch-test-cfEJV65W.js → loader-parallel-prefetch-test-DchEbilk.js} +1 -1
  149. package/bundled-test-harness/assets/{loader-test-DZX-dw3F.js → loader-test-LyM1F2ON.js} +1 -1
  150. package/bundled-test-harness/assets/{loading-test-PwEVbSuF.js → loading-test-DrK02DRI.js} +2 -2
  151. package/bundled-test-harness/assets/{local-storage-keys-Do9I1BSV.js → local-storage-keys-C0jyxDKn.js} +4 -1
  152. package/bundled-test-harness/assets/{login-ou9E1DG9.js → login-DWNfbapF.js} +1 -1
  153. package/bundled-test-harness/assets/{login-error-text-test-BGvtn9op.js → login-error-text-test-3lQ69Gme.js} +1 -1
  154. package/bundled-test-harness/assets/{m4a-audio-def-test-Dkbh40DD.js → m4a-audio-def-test-B1PZDu-M.js} +1 -1
  155. package/bundled-test-harness/assets/{main-CE7KR5Ht.js → main-CDat3XsY.js} +1 -1
  156. package/bundled-test-harness/assets/{markdown-fallback-test-BHejXXnE.js → markdown-fallback-test-D32xPo5m.js} +2 -2
  157. package/bundled-test-harness/assets/{markdown-file-def-test-BOvu8beB.js → markdown-file-def-test-2_0tc-pT.js} +1 -1
  158. package/bundled-test-harness/assets/{markdown-helpers-test-Be9UUlnA.js → markdown-helpers-test-D6Ty5K6K.js} +1 -1
  159. package/bundled-test-harness/assets/{markdown-highlighting-test-D-jxOaxc.js → markdown-highlighting-test-CD22pEyx.js} +2 -2
  160. package/bundled-test-harness/assets/{markdown-preview-CKlpPkbc.js → markdown-preview-o2AI98EN.js} +1 -1
  161. package/bundled-test-harness/assets/{markdown-preview-test-D2kl56R1.js → markdown-preview-test-D2YoXqUY.js} +3 -3
  162. package/bundled-test-harness/assets/{matrix-service-sliding-sync-test-Cl1D6ID4.js → matrix-service-sliding-sync-test-Co9EhDYF.js} +1 -1
  163. package/bundled-test-harness/assets/{message-service-subscription-test-OvYUTr8V.js → message-service-subscription-test-BK3W9wng.js} +2 -2
  164. package/bundled-test-harness/assets/{mock-matrix-CD6YHaHR.js → mock-matrix-Bkfl9ACG.js} +6 -2
  165. package/bundled-test-harness/assets/{mock-matrix-Dt4s2hUe.js → mock-matrix-DbxVPkSl.js} +1 -1
  166. package/bundled-test-harness/assets/{modal-container-wzIBYeE_.js → modal-container-BzEkpeIx.js} +1 -1
  167. package/bundled-test-harness/assets/{module-transpile-cache-test-Bj11UbQJ.js → module-transpile-cache-test-BFmN6_si.js} +1 -1
  168. package/bundled-test-harness/assets/{mp3-audio-def-test-C6tzxO6X.js → mp3-audio-def-test-DorbFtva.js} +1 -1
  169. package/bundled-test-harness/assets/{number-field-test-l5WRd3N9.js → number-field-test-C9F_sOf8.js} +2 -2
  170. package/bundled-test-harness/assets/{ogg-audio-def-test-CQ04xrfS.js → ogg-audio-def-test-DRXLSBVQ.js} +1 -1
  171. package/bundled-test-harness/assets/{on-key-CpWVcRaS.js → on-key-C8yMINOQ.js} +1 -1
  172. package/bundled-test-harness/assets/{open-create-listing-modal-test-VxITHH84.js → open-create-listing-modal-test-Yp6EOMGK.js} +1 -1
  173. package/bundled-test-harness/assets/open-image-in-new-tab-test-3iRCTOjd.js +52 -0
  174. package/bundled-test-harness/assets/{open-workspace-test-goAg_TVx.js → open-workspace-test-DrkNS6zm.js} +1 -1
  175. package/bundled-test-harness/assets/{operator-mode-acceptance-test-DO3lt95I.js → operator-mode-acceptance-test-DoQ5Klyi.js} +7 -7
  176. package/bundled-test-harness/assets/{operator-mode-card-catalog-test-C3e1--M7.js → operator-mode-card-catalog-test-Came_pKy.js} +4 -4
  177. package/bundled-test-harness/assets/{operator-mode-links-test-AWhMhHM2.js → operator-mode-links-test-DoTvJvpI.js} +4 -4
  178. package/bundled-test-harness/assets/{operator-mode-state-service-test-BICXMa5O.js → operator-mode-state-service-test-cwdudDwm.js} +2 -2
  179. package/bundled-test-harness/assets/{operator-mode-test-DMyFaXHK.js → operator-mode-test-DeUtV1XR.js} +4 -4
  180. package/bundled-test-harness/assets/{operator-mode-ui-test-z2SU5ozt.js → operator-mode-ui-test-DTUMZBlw.js} +4 -4
  181. package/bundled-test-harness/assets/{overlay-menu-items-test-Dkulmtpn.js → overlay-menu-items-test-DhPIUwmz.js} +3 -3
  182. package/bundled-test-harness/assets/{panel-BXXk_P7h.js → panel-DcMU_CGT.js} +55 -31
  183. package/bundled-test-harness/assets/{past-sessions-test-gKLwZO61.js → past-sessions-test-BrdqlYxe.js} +3 -3
  184. package/bundled-test-harness/assets/{patch-code-ClPL6B_d.js → patch-code-F_7JKtTQ.js} +1 -1
  185. package/bundled-test-harness/assets/{patch-code-test-CIdB45Nv.js → patch-code-test-O5_p8vp4.js} +4 -4
  186. package/bundled-test-harness/assets/{patch-fields-test-CBGnqUme.js → patch-fields-test-D1aSP1q_.js} +1 -1
  187. package/bundled-test-harness/assets/{patch-instance-test-DmDpfS3p.js → patch-instance-test-DHBeFzYI.js} +1 -1
  188. package/bundled-test-harness/assets/{persist-module-inspector-view-test-D6vpSfX4.js → persist-module-inspector-view-test-DDYttEKD.js} +2 -2
  189. package/bundled-test-harness/assets/{phone-number-field-test-DogtMkDx.js → phone-number-field-test-CUY1miSH.js} +2 -2
  190. package/bundled-test-harness/assets/{playground-CMnQXTzR.js → playground-DFwsIC-9.js} +2 -2
  191. package/bundled-test-harness/assets/{png-image-def-test-BzfrYGhY.js → png-image-def-test-C9COAyWm.js} +1 -1
  192. package/bundled-test-harness/assets/{prerender-file-extract-test-C-1R1B32.js → prerender-file-extract-test-B76NnPJt.js} +1 -1
  193. package/bundled-test-harness/assets/{prerender-html-test-1XGnbGuQ.js → prerender-html-test-ImXJjrpR.js} +1 -1
  194. package/bundled-test-harness/assets/{prerender-meta-test-B02oGS-5.js → prerender-meta-test-xIFFdF1X.js} +1 -1
  195. package/bundled-test-harness/assets/{prerender-module-test-CSKywVQA.js → prerender-module-test-CoxYOMro.js} +1 -1
  196. package/bundled-test-harness/assets/{prerendered-card-search-test-Cf_Hvr4P.js → prerendered-card-search-test-DLYUamOp.js} +2 -2
  197. package/bundled-test-harness/assets/{preview-format-Bb5FIkOY.js → preview-format-BqY_j3zZ.js} +1 -1
  198. package/bundled-test-harness/assets/{preview-format-test-DBKtwgvo.js → preview-format-test-CublqRWy.js} +4 -4
  199. package/bundled-test-harness/assets/{preview-test-dgbtaeLg.js → preview-test-CcGZEu6Y.js} +2 -2
  200. package/bundled-test-harness/assets/{publish-realm-test-B4c6TqTI.js → publish-realm-test-Cqq_X3L4.js} +2 -2
  201. package/bundled-test-harness/assets/{query-field-barrier-test-DytVxOcd.js → query-field-barrier-test-CeDBxTwq.js} +2 -2
  202. package/bundled-test-harness/assets/{query-field-error-sentinel-test-Cs2wXQuL.js → query-field-error-sentinel-test-CwOzGgRw.js} +2 -2
  203. package/bundled-test-harness/assets/{query-field-schema-test-ByfKD-mO.js → query-field-schema-test-CXt4ktVo.js} +1 -1
  204. package/bundled-test-harness/assets/{query-fields-test-SlJNtzM3.js → query-fields-test-CrsGkXWE.js} +1 -1
  205. package/bundled-test-harness/assets/{read-card-for-ai-assistant-test-BzThkf4s.js → read-card-for-ai-assistant-test-DORLxJXd.js} +2 -2
  206. package/bundled-test-harness/assets/{read-file-for-ai-assistant-test-CV5PoqSP.js → read-file-for-ai-assistant-test-DyyCSmMv.js} +2 -2
  207. package/bundled-test-harness/assets/{read-source-test-jfWyZkQO.js → read-source-test-hAUdteMO.js} +2 -2
  208. package/bundled-test-harness/assets/{read-text-file-test-Kg6tx07O.js → read-text-file-test-juQ-OJET.js} +2 -2
  209. package/bundled-test-harness/assets/{realm-oWsFVfdH.js → realm-CxU8jc8l.js} +2 -2
  210. package/bundled-test-harness/assets/{realm-config-routing-rule-edit-test-VyMT__jT.js → realm-config-routing-rule-edit-test-T8S_2Lwq.js} +47 -4
  211. package/bundled-test-harness/assets/{realm-field-test-CBmQY3Va.js → realm-field-test-wqNbmdgM.js} +2 -2
  212. package/bundled-test-harness/assets/{realm-indexing-test-CQ29IEno.js → realm-indexing-test-DTuwfnZZ.js} +1 -1
  213. package/bundled-test-harness/assets/{realm-querying-test-PR_91CCq.js → realm-querying-test-ojIOXC3n.js} +1 -1
  214. package/bundled-test-harness/assets/{realm-test-C6Kw7gWx.js → realm-test-MgXPmHwc.js} +1 -1
  215. package/bundled-test-harness/assets/{reasoning-test-M4JuH0RZ.js → reasoning-test-DcQkF04r.js} +3 -3
  216. package/bundled-test-harness/assets/{recent-files-cards-D845sggD.js → recent-files-cards-BICbCMhW.js} +1 -1
  217. package/bundled-test-harness/assets/{recent-files-test-Du5oiGDf.js → recent-files-test-Df_1aE3G.js} +2 -2
  218. package/bundled-test-harness/assets/{reindex-realm-test-BrgFBbOc.js → reindex-realm-test-DDYvNGWh.js} +2 -2
  219. package/bundled-test-harness/assets/{relationship-loading-state-test-CnCYYtmY.js → relationship-loading-state-test-C2EialRQ.js} +1 -1
  220. package/bundled-test-harness/assets/{render-component-BJwKMGDa.js → render-component-DLXpC-Bc.js} +1 -1
  221. package/bundled-test-harness/assets/{rendered-markdown-test-BvQ96-0V.js → rendered-markdown-test-DblOECt_.js} +2 -2
  222. package/bundled-test-harness/assets/{rich-markdown-field-test-neZFxfcc.js → rich-markdown-field-test-B34TJAq8.js} +2 -2
  223. package/bundled-test-harness/assets/{room-message-test-DWEcr5le.js → room-message-test-DuSkABnU.js} +3 -3
  224. package/bundled-test-harness/assets/{sanitize-module-list-test-B4VjLVx_.js → sanitize-module-list-test-BTFw8-Do.js} +2 -2
  225. package/bundled-test-harness/assets/{schema-editor-test-CHeST1JD.js → schema-editor-test-w7ANspy0.js} +1 -1
  226. package/bundled-test-harness/assets/{schema-generation-test-G4ZL90Sn.js → schema-generation-test-z90uBA7r.js} +3 -3
  227. package/bundled-test-harness/assets/{scrolling-test-D3Asc3Yr.js → scrolling-test-jCKormjp.js} +4 -4
  228. package/bundled-test-harness/assets/{search-and-choose-test-DMB-Nv1z.js → search-and-choose-test-BhIWdkFp.js} +2 -2
  229. package/bundled-test-harness/assets/{search-command-test-BNZzENdS.js → search-command-test-BlTBufTS.js} +1 -1
  230. package/bundled-test-harness/assets/{search-correlation-id-test-tM-SfbrA.js → search-correlation-id-test-BR7bFNCy.js} +1 -1
  231. package/bundled-test-harness/assets/{search-data-test-CYrjasBZ.js → search-data-test-bc2foKLa.js} +2 -2
  232. package/bundled-test-harness/assets/{search-google-images-test-DzFbLWZE.js → search-google-images-test-C96iDOxU.js} +1 -1
  233. package/bundled-test-harness/assets/{search-result-header-5VQHm_Ev.js → search-result-header-Ch7TKEzn.js} +1 -1
  234. package/bundled-test-harness/assets/{search-test-CBH8l5JD.js → search-test-iR0wammw.js} +2 -2
  235. package/bundled-test-harness/assets/{send-ai-assistant-message-test-CAlK3x0a.js → send-ai-assistant-message-test-BmJdWdzI.js} +2 -2
  236. package/bundled-test-harness/assets/{send-bot-trigger-event-test-CwI4Rkf8.js → send-bot-trigger-event-test-CJCAf2db.js} +2 -2
  237. package/bundled-test-harness/assets/{send-request-via-proxy-test-BRuk6sv0.js → send-request-via-proxy-test-DSdZppno.js} +2 -2
  238. package/bundled-test-harness/assets/{sending-test-BA2F7Hfk.js → sending-test-Bocu5vf9.js} +270 -12
  239. package/bundled-test-harness/assets/{serialization-test-DHTHfzsn.js → serialization-test-CE3TeQ4Z.js} +2 -2
  240. package/bundled-test-harness/assets/{set-user-system-card-test-Ct8xegEY.js → set-user-system-card-test-JZW2LcIA.js} +2 -2
  241. package/bundled-test-harness/assets/{setup-v4v1a2Qc.js → setup-C5QslpqI.js} +1 -1
  242. package/bundled-test-harness/assets/{setup-BfvQ1zfD.js → setup-CN-HHlT_.js} +2 -2
  243. package/bundled-test-harness/assets/{show-card-test-7VGIdTJh.js → show-card-test-B41I3EWZ.js} +3 -3
  244. package/bundled-test-harness/assets/{skills-test-NKDA1G9S.js → skills-test-Cut0gpNU.js} +3 -3
  245. package/bundled-test-harness/assets/{spec-test-61E0gdIB.js → spec-test-DytzFxZb.js} +3 -3
  246. package/bundled-test-harness/assets/{store-BM5pUF94.js → store-CbIxTljQ.js} +30 -0
  247. package/bundled-test-harness/assets/{store-add-test-mRtjroP0.js → store-add-test-ulvv9A3X.js} +2 -2
  248. package/bundled-test-harness/assets/{store-test-CVHw6LMN.js → store-test-C747NJ3O.js} +77 -4
  249. package/bundled-test-harness/assets/{submode-switcher-Popj4iN5.js → submode-switcher-iR4m0GzD.js} +1 -1
  250. package/bundled-test-harness/assets/{summarize-session-test-UZOGVM_F.js → summarize-session-test-BcXrj1r3.js} +2 -2
  251. package/bundled-test-harness/assets/{svg-image-def-test-Dqjy84jw.js → svg-image-def-test-DW1rtFSA.js} +1 -1
  252. package/bundled-test-harness/assets/{switch-submode-DOdRs5QD.js → switch-submode--ZVbWG3S.js} +1 -1
  253. package/bundled-test-harness/assets/{switch-submode-test-MWnyo759.js → switch-submode-test--Ncx8g_l.js} +3 -3
  254. package/bundled-test-harness/assets/{test-support-BfonQA4V.js → test-support-CCargU9V.js} +1 -1
  255. package/bundled-test-harness/assets/{tests-DQLSvmHe.js → tests-Dw_agY8k.js} +265 -263
  256. package/bundled-test-harness/assets/{text-file-def-test-DlyCDiM4.js → text-file-def-test-Bl2R6NO8.js} +1 -1
  257. package/bundled-test-harness/assets/{text-input-validator-test-Ccx-4gLo.js → text-input-validator-test-CAlDivoV.js} +3 -3
  258. package/bundled-test-harness/assets/{text-suggestion-test-mIvJOTS7.js → text-suggestion-test-CbJWk97Q.js} +1 -1
  259. package/bundled-test-harness/assets/{theme-card-test-Bs3Q034n.js → theme-card-test-Q5eP-lEF.js} +3 -3
  260. package/bundled-test-harness/assets/{transform-cards-test-BsTtRP0g.js → transform-cards-test-3PsuM2Sv.js} +2 -2
  261. package/bundled-test-harness/assets/{ts-file-def-test-DtWzgXkt.js → ts-file-def-test-BoXA3RgL.js} +1 -1
  262. package/bundled-test-harness/assets/{unpublish-realm-test-BFJEMQL7.js → unpublish-realm-test-CgiIcZ6j.js} +2 -2
  263. package/bundled-test-harness/assets/{update-room-skills-test-BrFhA3El.js → update-room-skills-test-B-BI7daL.js} +3 -3
  264. package/bundled-test-harness/assets/{use-ai-assistant-test-BsyBY6-a.js → use-ai-assistant-test-BEiEjFOH.js} +2 -2
  265. package/bundled-test-harness/assets/user-message-Bbw4pQmd.css +22 -0
  266. package/bundled-test-harness/assets/{user-message-BFN7dtqK.js → user-message-CVG3cgJq.js} +2 -2
  267. package/bundled-test-harness/assets/{validate-realm-test-DQlQ-pWZ.js → validate-realm-test-DBx-3YG9.js} +2 -2
  268. package/bundled-test-harness/assets/{wav-audio-def-test-BZ0oLTT1.js → wav-audio-def-test-CPJl6Hpr.js} +1 -1
  269. package/bundled-test-harness/assets/{webp-image-def-test-tuOTQeTt.js → webp-image-def-test-Bh3SOpDa.js} +1 -1
  270. package/bundled-test-harness/assets/{workspace-DvhB0Ltb.js → workspace-PBphyb9N.js} +2 -2
  271. package/bundled-test-harness/assets/{workspace-chooser-delete-test-D_Gp78-R.js → workspace-chooser-delete-test-1n1lqK_X.js} +3 -3
  272. package/bundled-test-harness/assets/{workspace-chooser-test-CuJ4pgJh.js → workspace-chooser-test-wcKYsTgx.js} +1 -1
  273. package/bundled-test-harness/assets/{workspace-delete-multiple-test-BUmKPHGp.js → workspace-delete-multiple-test-DlXWFVK1.js} +1 -1
  274. package/bundled-test-harness/assets/{workspace-delete-summary-test-B8qyNd7w.js → workspace-delete-summary-test-iqD1ae55.js} +1 -1
  275. package/bundled-test-harness/assets/{write-binary-file-test-D1h4TED_.js → write-binary-file-test-BkADCn85.js} +2 -2
  276. package/bundled-test-harness/assets/{write-text-file-test-DKA9TpIm.js → write-text-file-test-C9K0doTU.js} +2 -2
  277. package/bundled-test-harness/boxel-ui-checksum.txt +1 -1
  278. package/bundled-test-harness/index.html +33 -33
  279. package/bundled-test-harness/tests/index.html +36 -36
  280. package/bundled-types/base/field-component.d.ts +15 -4
  281. package/bundled-types/base/links-to-editor.d.ts +9 -0
  282. package/bundled-types/boxel-ui/components/filter-list/index.gts +4 -1
  283. package/bundled-types/host-app/components/ai-assistant/chat-input/index.gts +2 -1
  284. package/bundled-types/host-app/components/ai-assistant/message/user-message.gts +6 -2
  285. package/bundled-types/host-app/components/matrix/room.gts +115 -44
  286. package/bundled-types/host-app/lib/matrix-classes/message-builder.ts +13 -0
  287. package/bundled-types/host-app/services/local-persistence-service.ts +179 -0
  288. package/bundled-types/host-app/services/matrix-service.ts +372 -1
  289. package/bundled-types/host-app/services/store.ts +70 -0
  290. package/bundled-types/host-app/utils/local-storage-keys.ts +2 -0
  291. package/bundled-types/host-tests/helpers/mock-matrix/_client.ts +3 -0
  292. package/bundled-types/host-tests/helpers/mock-matrix/_utils.ts +3 -0
  293. package/bundled-types/host-tests/helpers/mock-matrix.ts +1 -0
  294. package/dist/index.js +257 -253
  295. package/package.json +3 -3
  296. package/src/commands/realm/index.ts +2 -0
  297. package/src/commands/realm/ingest-card.ts +567 -0
  298. package/src/commands/realm/publish.ts +87 -16
  299. package/src/commands/realm/pull.ts +9 -13
  300. package/src/commands/realm/push.ts +10 -14
  301. package/src/commands/realm/status.ts +14 -18
  302. package/src/commands/realm/sync.ts +9 -13
  303. package/src/commands/realm/unpublish.ts +11 -0
  304. package/src/lib/auth-resolver.ts +15 -2
  305. package/bundled-test-harness/assets/adapter-Dk9jvNQb.js +0 -2
  306. package/bundled-test-harness/assets/live-test-B7uB4aVp.js +0 -2
  307. package/bundled-test-harness/assets/user-message-B8olA3Ml.css +0 -18
  308. /package/bundled-test-harness/assets/{ai-assistant-panel-service-test-B2pqk_1r.js → ai-assistant-panel-service-test-DEeul-zv.js} +0 -0
  309. /package/bundled-test-harness/assets/{amd-transpile-test-ftXbwnFz.js → amd-transpile-test-DmEkMdCo.js} +0 -0
  310. /package/bundled-test-harness/assets/{apply-boxel-formatting-test-BSzr4sNI.js → apply-boxel-formatting-test-RixVcq5N.js} +0 -0
  311. /package/bundled-test-harness/assets/{auth-error-guard-test-BxIq12aN.js → auth-error-guard-test-beazl6s5.js} +0 -0
  312. /package/bundled-test-harness/assets/{bfm-card-references-test-6aAhfBzH.js → bfm-card-references-test-IEbg0jo-.js} +0 -0
  313. /package/bundled-test-harness/assets/{cached-fetch-test-CPr-eiq_.js → cached-fetch-test-DlnnpQGz.js} +0 -0
  314. /package/bundled-test-harness/assets/{card-directory-name-test-BS8WD3oH.js → card-directory-name-test-QKl1Ykz6.js} +0 -0
  315. /package/bundled-test-harness/assets/{card-search-query-builder-test-zp6muUB1.js → card-search-query-builder-test-BWc5lDv3.js} +0 -0
  316. /package/bundled-test-harness/assets/{code-patching-test-BZPvPsMr.js → code-patching-test-BRNMumI6.js} +0 -0
  317. /package/bundled-test-harness/assets/{code-semantics-service-test-BBjJ3EF3.js → code-semantics-service-test-CJOSUAQH.js} +0 -0
  318. /package/bundled-test-harness/assets/{command-definitions-test-BcMJzIBM.js → command-definitions-test-De0BMqHI.js} +0 -0
  319. /package/bundled-test-harness/assets/{extract-css-variables-test-FIZxFxaL.js → extract-css-variables-test-Di5CFXG-.js} +0 -0
  320. /package/bundled-test-harness/assets/{fetcher-test-g2cjjXxV.js → fetcher-test-Cb8cS9JN.js} +0 -0
  321. /package/bundled-test-harness/assets/{field-path-parser-test-DkY-DFQN.js → field-path-parser-test-Db4kG7EB.js} +0 -0
  322. /package/bundled-test-harness/assets/{file-def-manager-canonicalize-test-Dlf4HlLX.js → file-def-manager-canonicalize-test-Cq5B5KN4.js} +0 -0
  323. /package/bundled-test-harness/assets/{generate-css-variables-test-De4LPdBt.js → generate-css-variables-test-BahavIHR.js} +0 -0
  324. /package/bundled-test-harness/assets/{get-type-refs-from-filter-test-DmDF_dTY.js → get-type-refs-from-filter-test-CH5flf8B.js} +0 -0
  325. /package/bundled-test-harness/assets/{last-modified-date-test-C2hEJ3xU.js → last-modified-date-test-C_jV0b05.js} +0 -0
  326. /package/bundled-test-harness/assets/{limited-set-test-SLbA1cwS.js → limited-set-test-CcpIJCrn.js} +0 -0
  327. /package/bundled-test-harness/assets/{loader-icon-error-test-DTo5t1OQ.js → loader-icon-error-test-Bc_L-0Zb.js} +0 -0
  328. /package/bundled-test-harness/assets/{loader-retry-test-CPFmHSUN.js → loader-retry-test-DQ0E0a0N.js} +0 -0
  329. /package/bundled-test-harness/assets/{marked-sync-test-CaZYJo4x.js → marked-sync-test-JSqOc6hu.js} +0 -0
  330. /package/bundled-test-harness/assets/{mutex-test-p2qp1xRj.js → mutex-test-BDkeJutn.js} +0 -0
  331. /package/bundled-test-harness/assets/{plan-install-test-CrYUs1-G.js → plan-install-test-fUZIttPZ.js} +0 -0
  332. /package/bundled-test-harness/assets/{qs-test-DEH8SHFS.js → qs-test-CminVD53.js} +0 -0
  333. /package/bundled-test-harness/assets/{query-field-normalization-test-DrqBkUxD.js → query-field-normalization-test-B9alzE_u.js} +0 -0
  334. /package/bundled-test-harness/assets/{queue-test-CS3aOeHM.js → queue-test-BvWT6K7Z.js} +0 -0
  335. /package/bundled-test-harness/assets/{realm-index-card-id-test-FV_gOG_K.js → realm-index-card-id-test-hvCyEpGZ.js} +0 -0
  336. /package/bundled-test-harness/assets/{realm-paths-test-CvXB4BUZ.js → realm-paths-test-DrwpPXyh.js} +0 -0
  337. /package/bundled-test-harness/assets/{render-component-BabSF5nE.js → render-component-DY19erxA.js} +0 -0
  338. /package/bundled-test-harness/assets/{render-error-test-CvMDARjN.js → render-error-test-BC4QmstW.js} +0 -0
  339. /package/bundled-test-harness/assets/{render-service-test-DRCvv7lo.js → render-service-test-BkCkB3a2.js} +0 -0
  340. /package/bundled-test-harness/assets/{render-timer-stub-test-CVa_rjXp.js → render-timer-stub-test-cnMPidgA.js} +0 -0
  341. /package/bundled-test-harness/assets/{search-cache-key-test-r83Xl6Io.js → search-cache-key-test-DI0DKzU5.js} +0 -0
  342. /package/bundled-test-harness/assets/{search-in-flight-key-test-BmqFzX6o.js → search-in-flight-key-test-DyRDbEX1.js} +0 -0
  343. /package/bundled-test-harness/assets/{unified-search-results-test-D9v-CCog.js → unified-search-results-test-BF8Dps_j.js} +0 -0
  344. /package/bundled-test-harness/assets/{url-test-DtekKUme.js → url-test-DkEL_mbR.js} +0 -0
@@ -1,20 +1,20 @@
1
1
  import { s as __toESM } from "./chunk-CGdGNDIi.js";
2
2
  import { r as initializeDeferredDecorator, t as decorateFieldV2 } from "./runtime-CYyqkz5q-z3Y1hsJm.js";
3
- import { Si as baseRealm, Zn as testRealmURL } from "./runtime-common-BY5dBG5N.js";
3
+ import { Si as baseRealm, Zn as testRealmURL, _a as Deferred } from "./runtime-common-BY5dBG5N.js";
4
4
  import { or as setComponentTemplate } from "./service-BaBMSYir.js";
5
5
  import { H as templateFactory } from "./index-DaCZcoCY-Bfb0Qdzr.js";
6
- import { n as Submodes } from "./submode-switcher-Popj4iN5.js";
6
+ import { n as Submodes } from "./submode-switcher-iR4m0GzD.js";
7
7
  import "./component-CqcrwY5l.js";
8
8
  import { t as Component } from "./dist-CE2G0-tp.js";
9
9
  import "./template-factory-CigcGcbz.js";
10
- import { t as AiAssistantMessageDrafts, v as src_default } from "./local-storage-keys-Do9I1BSV.js";
11
- import { t as OperatorModeContainer } from "./container-BVdtw4NT.js";
10
+ import { i as AiAssistantPendingSends, t as AiAssistantMessageDrafts, y as src_default } from "./local-storage-keys-C0jyxDKn.js";
11
+ import { t as OperatorModeContainer } from "./container-DRblzvCW.js";
12
12
  import { A as settled, I as waitUntil, d as click, l as triggerEvent, o as waitFor, s as fillIn } from "./dist-CWCoBB72.js";
13
13
  import { t as require_qunit } from "./qunit-DZc8vxH_.js";
14
14
  import { r as getService } from "./dist-5hbdxMR8.js";
15
- import { A as setupIntegrationTestRealm, M as setupOnSave, N as setupRealmCacheTeardown, O as setupCardLogs, et as setupOperatorModeStateCleanup, j as setupLocalIndexing, pt as percySnapshot, q as withCachedRealmSetup, rt as setupRenderingTest, t as setupMockMatrix, w as realmConfigCardJSON } from "./mock-matrix-CD6YHaHR.js";
15
+ import { A as setupIntegrationTestRealm, M as setupOnSave, N as setupRealmCacheTeardown, O as setupCardLogs, et as setupOperatorModeStateCleanup, j as setupLocalIndexing, pt as percySnapshot, q as withCachedRealmSetup, rt as setupRenderingTest, t as setupMockMatrix, w as realmConfigCardJSON } from "./mock-matrix-Bkfl9ACG.js";
16
16
  import { G as contains, I as StringField, Q as field, a as CardDef, d as Component$1, mt as setupBaseRealm } from "./base-realm-Dw9jVsHl.js";
17
- import { n as renderComponent } from "./render-component-BabSF5nE.js";
17
+ import { n as renderComponent } from "./render-component-DY19erxA.js";
18
18
  //#region tests/integration/components/ai-assistant-panel/sending-test.gts
19
19
  var import_qunit = /* @__PURE__ */ __toESM(require_qunit());
20
20
  (0, import_qunit.module)("Integration | ai-assistant-panel | sending", function(hooks) {
@@ -103,7 +103,7 @@ var import_qunit = /* @__PURE__ */ __toESM(require_qunit());
103
103
  if (!roomId) throw new Error("Expected a room ID");
104
104
  return roomId;
105
105
  }
106
- (0, import_qunit.test)("displays message slightly muted when it is being sent", async function(assert) {
106
+ (0, import_qunit.test)("renders the optimistic bubble + clears the input at click-time", async function(assert) {
107
107
  setCardInOperatorModeState(`${testRealmURL}Person/fadhlan`);
108
108
  await renderComponent(class TestDriver extends Component {
109
109
  static {
@@ -133,7 +133,7 @@ var import_qunit = /* @__PURE__ */ __toESM(require_qunit());
133
133
  assert.dom("[data-test-ai-assistant-message]").exists({ count: 1 });
134
134
  assert.dom("[data-test-user-message]").hasNoClass("is-pending");
135
135
  });
136
- (0, import_qunit.test)("displays retry button for message that failed to send", async function(assert) {
136
+ (0, import_qunit.test)("failed bubble surfaces the retry alert and reuses the same bubble on retry", async function(assert) {
137
137
  setCardInOperatorModeState(`${testRealmURL}Person/fadhlan`);
138
138
  await renderComponent(class TestDriver extends Component {
139
139
  static {
@@ -146,7 +146,7 @@ var import_qunit = /* @__PURE__ */ __toESM(require_qunit());
146
146
  }), this);
147
147
  }
148
148
  });
149
- let roomId = await openAiAssistant();
149
+ await openAiAssistant();
150
150
  const failingMessage = "This is a magic message with a SENDING_DELAY_THEN_FAILURE!";
151
151
  await fillIn("[data-test-message-field]", failingMessage);
152
152
  assert.dom("[data-test-message-field]").hasValue(failingMessage);
@@ -159,17 +159,80 @@ var import_qunit = /* @__PURE__ */ __toESM(require_qunit());
159
159
  assert.dom("[data-test-ai-assistant-message]").exists({ count: 1 });
160
160
  assert.dom("[data-test-user-message]").hasClass("is-pending");
161
161
  await waitFor("[data-test-boxel-alert=\"error\"]");
162
- assert.dom("[data-test-message-field]").hasValue(failingMessage, "prompt is not lost after sending failed");
163
162
  await settled();
163
+ assert.dom("[data-test-message-field]").hasValue("");
164
+ assert.dom("[data-test-ai-assistant-message]").exists({ count: 1 }, "failed bubble stays in the transcript");
164
165
  assert.dom("[data-test-card-error]").containsText("Failed to send");
165
166
  assert.dom("[data-test-alert-action-button=\"Retry\"]").exists();
166
- assert.dom(`[data-test-message-field="${roomId}"]`).hasValue(failingMessage);
167
167
  await percySnapshot(assert);
168
168
  click("[data-test-alert-action-button=\"Retry\"]");
169
169
  await waitFor("[data-test-ai-assistant-message-pending]");
170
170
  assert.dom("[data-test-ai-assistant-message]").exists({ count: 1 });
171
171
  await settled();
172
- assert.dom("[data-test-message-field]").hasValue(failingMessage, "prompt is not lost after retry");
172
+ assert.dom("[data-test-message-field]").hasValue("", "input stays empty after retry — text is in the bubble");
173
+ });
174
+ (0, import_qunit.test)("shows the pending bubble immediately and clears the input while uploads are in flight", async function(assert) {
175
+ setCardInOperatorModeState(`${testRealmURL}Person/fadhlan`);
176
+ await renderComponent(class TestDriver extends Component {
177
+ static {
178
+ setComponentTemplate(templateFactory({
179
+ "id": "ouXqEoim",
180
+ "block": "[[[8,[32,0],null,[[\"@onClose\"],[[32,1]]],null]],[],[]]",
181
+ "moduleName": "/home/runner/work/boxel/boxel/packages/host/tests/integration/components/ai-assistant-panel/sending-test.gts",
182
+ "scope": () => [OperatorModeContainer, noop],
183
+ "isStrictMode": true
184
+ }), this);
185
+ }
186
+ });
187
+ await openAiAssistant();
188
+ let releaseUpload;
189
+ let uploadGate = new Promise((resolve) => {
190
+ releaseUpload = resolve;
191
+ });
192
+ mockMatrixUtils.setUploadContentInterceptor(async () => {
193
+ mockMatrixUtils.setUploadContentInterceptor(void 0);
194
+ await uploadGate;
195
+ });
196
+ await fillIn("[data-test-message-field]", "Slow-upload test message");
197
+ click("[data-test-send-message-btn]");
198
+ await waitFor("[data-test-ai-assistant-message-pending]");
199
+ assert.dom("[data-test-message-field]").hasValue("", "input clears in the same render the bubble appears");
200
+ assert.dom("[data-test-ai-assistant-message]").exists({ count: 1 }, "optimistic bubble exists before uploads complete");
201
+ assert.dom("[data-test-user-message]").hasClass("is-pending");
202
+ assert.dom("[data-test-send-message-btn]").isDisabled();
203
+ assert.dom("[data-test-stop-generating]").doesNotExist("no generating-results banner on the user pending bubble");
204
+ releaseUpload();
205
+ await waitFor("[data-test-user-message]:not(.is-pending)");
206
+ await waitUntil(() => !document.querySelector("[data-test-send-message-btn]").disabled);
207
+ assert.dom("[data-test-message-field]").isNotDisabled();
208
+ });
209
+ (0, import_qunit.test)("leaves a failed bubble + retry alert when pre-send fails", async function(assert) {
210
+ setCardInOperatorModeState(`${testRealmURL}Person/fadhlan`);
211
+ await renderComponent(class TestDriver extends Component {
212
+ static {
213
+ setComponentTemplate(templateFactory({
214
+ "id": "ouXqEoim",
215
+ "block": "[[[8,[32,0],null,[[\"@onClose\"],[[32,1]]],null]],[],[]]",
216
+ "moduleName": "/home/runner/work/boxel/boxel/packages/host/tests/integration/components/ai-assistant-panel/sending-test.gts",
217
+ "scope": () => [OperatorModeContainer, noop],
218
+ "isStrictMode": true
219
+ }), this);
220
+ }
221
+ });
222
+ await openAiAssistant();
223
+ mockMatrixUtils.setUploadContentInterceptor(async () => {
224
+ mockMatrixUtils.setUploadContentInterceptor(void 0);
225
+ throw new Error("Simulated pre-send upload failure");
226
+ });
227
+ await fillIn("[data-test-message-field]", "Pre-send failure test message");
228
+ await click("[data-test-send-message-btn]");
229
+ await waitFor("[data-test-boxel-alert=\"error\"]");
230
+ await settled();
231
+ assert.dom("[data-test-ai-assistant-message]").exists({ count: 1 }, "failed bubble stays in the transcript");
232
+ assert.dom("[data-test-user-message]").exists({ count: 1 });
233
+ assert.dom("[data-test-card-error]").containsText("Failed to send");
234
+ assert.dom("[data-test-alert-action-button=\"Retry\"]").exists();
235
+ assert.dom("[data-test-message-field]").hasValue("");
173
236
  });
174
237
  (0, import_qunit.test)("it enlarges the input box when entering/pasting lots of text", async function(assert) {
175
238
  setCardInOperatorModeState();
@@ -313,5 +376,200 @@ var import_qunit = /* @__PURE__ */ __toESM(require_qunit());
313
376
  assert.dom("[data-test-type-picker] [data-test-boxel-picker-selected-item=\"Person\"]").doesNotExist("Person type is deselected after clicking remove");
314
377
  assert.dom(`[data-test-card-catalog-item="${testRealmURL}Person/fadhlan"]`).exists("Person/fadhlan still appears in search results under Any Type");
315
378
  });
379
+ (0, import_qunit.test)("persisted pending message re-appears as a failed bubble on reload", async function(assert) {
380
+ src_default.localStorage.removeItem(AiAssistantPendingSends);
381
+ setCardInOperatorModeState(`${testRealmURL}Person/fadhlan`);
382
+ await renderComponent(class TestDriver extends Component {
383
+ static {
384
+ setComponentTemplate(templateFactory({
385
+ "id": "ouXqEoim",
386
+ "block": "[[[8,[32,0],null,[[\"@onClose\"],[[32,1]]],null]],[],[]]",
387
+ "moduleName": "/home/runner/work/boxel/boxel/packages/host/tests/integration/components/ai-assistant-panel/sending-test.gts",
388
+ "scope": () => [OperatorModeContainer, noop],
389
+ "isStrictMode": true
390
+ }), this);
391
+ }
392
+ });
393
+ let roomId = await openAiAssistant();
394
+ let pending = {
395
+ clientGeneratedId: "persisted-cgi-abc",
396
+ body: "Persisted failed message",
397
+ attachedCardIds: [],
398
+ attachedFiles: [],
399
+ createdAt: Date.now() - 5e3,
400
+ status: "not_sent",
401
+ errorMessage: "Failed to send"
402
+ };
403
+ src_default.localStorage.setItem(AiAssistantPendingSends, JSON.stringify({ [roomId]: [pending] }));
404
+ let matrixService = getService("matrix-service");
405
+ matrixService.hydratedPendingSendRooms.delete(roomId);
406
+ matrixService.ensurePendingSendsHydrated(roomId);
407
+ await waitFor("[data-test-user-message]");
408
+ assert.dom("[data-test-ai-assistant-message]").exists({ count: 1 });
409
+ assert.dom("[data-test-alert-action-button=\"Retry\"]").exists();
410
+ });
411
+ (0, import_qunit.test)("cgi bridge dedupes synthetic and real echo so events do not double-count", async function(assert) {
412
+ setCardInOperatorModeState(`${testRealmURL}Person/fadhlan`);
413
+ await renderComponent(class TestDriver extends Component {
414
+ static {
415
+ setComponentTemplate(templateFactory({
416
+ "id": "ouXqEoim",
417
+ "block": "[[[8,[32,0],null,[[\"@onClose\"],[[32,1]]],null]],[],[]]",
418
+ "moduleName": "/home/runner/work/boxel/boxel/packages/host/tests/integration/components/ai-assistant-panel/sending-test.gts",
419
+ "scope": () => [OperatorModeContainer, noop],
420
+ "isStrictMode": true
421
+ }), this);
422
+ }
423
+ });
424
+ let roomId = await openAiAssistant();
425
+ let matrixService = getService("matrix-service");
426
+ await fillIn("[data-test-message-field]", "Bridge dedup test");
427
+ let sendGate = new Deferred();
428
+ mockMatrixUtils.setSendEventInterceptor(() => sendGate.promise);
429
+ click("[data-test-send-message-btn]");
430
+ await waitFor("[data-test-ai-assistant-message-pending]");
431
+ mockMatrixUtils.setSendEventInterceptor(void 0);
432
+ sendGate.fulfill();
433
+ await waitFor("[data-test-user-message]:not(.is-pending)");
434
+ await settled();
435
+ let userMessages = (matrixService.getRoomData(roomId)?.events ?? []).filter((e) => e.type === "m.room.message" && e.sender === matrixService.userId && typeof e.content?.clientGeneratedId === "string");
436
+ assert.strictEqual(userMessages.length, 1, "exactly one user-message event remains after reconciliation");
437
+ assert.dom("[data-test-ai-assistant-message]").exists({ count: 1 }, "a single bubble renders for the cgi");
438
+ });
439
+ (0, import_qunit.test)("inverse delivery race — bubble stays sending when sendEvent succeeded", async function(assert) {
440
+ setCardInOperatorModeState(`${testRealmURL}Person/fadhlan`);
441
+ await renderComponent(class TestDriver extends Component {
442
+ static {
443
+ setComponentTemplate(templateFactory({
444
+ "id": "ouXqEoim",
445
+ "block": "[[[8,[32,0],null,[[\"@onClose\"],[[32,1]]],null]],[],[]]",
446
+ "moduleName": "/home/runner/work/boxel/boxel/packages/host/tests/integration/components/ai-assistant-panel/sending-test.gts",
447
+ "scope": () => [OperatorModeContainer, noop],
448
+ "isStrictMode": true
449
+ }), this);
450
+ }
451
+ });
452
+ let roomId = await openAiAssistant();
453
+ let matrixService = getService("matrix-service");
454
+ let cgi = "inverse-race-cgi";
455
+ await matrixService.addOptimisticEvent(roomId, {
456
+ body: "Inverse race test",
457
+ clientGeneratedId: cgi,
458
+ attachedCardIds: [],
459
+ attachedFiles: []
460
+ });
461
+ matrixService.patchPendingSend(roomId, cgi, { status: "sending" });
462
+ let beforeStatus = matrixService.findPendingMatrixEventStatus(roomId, "non-existent-cgi");
463
+ assert.strictEqual(beforeStatus, void 0, "unknown cgi has no matrix EventStatus");
464
+ let stillPending = (matrixService.getRoomData(roomId)?.events ?? []).some((e) => e.content?.clientGeneratedId === cgi && (e.status === "sending" || e.status === null));
465
+ assert.true(stillPending, "optimistic event remains in sending state after addOptimisticEvent");
466
+ });
467
+ (0, import_qunit.test)("back-to-back sends do not block the input on the prior bubble awaiting echo", async function(assert) {
468
+ setCardInOperatorModeState(`${testRealmURL}Person/fadhlan`);
469
+ await renderComponent(class TestDriver extends Component {
470
+ static {
471
+ setComponentTemplate(templateFactory({
472
+ "id": "ouXqEoim",
473
+ "block": "[[[8,[32,0],null,[[\"@onClose\"],[[32,1]]],null]],[],[]]",
474
+ "moduleName": "/home/runner/work/boxel/boxel/packages/host/tests/integration/components/ai-assistant-panel/sending-test.gts",
475
+ "scope": () => [OperatorModeContainer, noop],
476
+ "isStrictMode": true
477
+ }), this);
478
+ }
479
+ });
480
+ await openAiAssistant();
481
+ await fillIn("[data-test-message-field]", "first message");
482
+ await click("[data-test-send-message-btn]");
483
+ await waitFor("[data-test-ai-assistant-message]");
484
+ await waitUntil(() => !document.querySelector("[data-test-send-message-btn]").disabled, { timeout: 5e3 });
485
+ await fillIn("[data-test-message-field]", "second message");
486
+ assert.dom("[data-test-send-message-btn]").isEnabled();
487
+ await click("[data-test-send-message-btn]");
488
+ assert.dom("[data-test-ai-assistant-message]").exists({ count: 2 }, "both bubbles rendered");
489
+ });
490
+ (0, import_qunit.test)("a failed bubble keeps the send button disabled until retried", async function(assert) {
491
+ setCardInOperatorModeState(`${testRealmURL}Person/fadhlan`);
492
+ await renderComponent(class TestDriver extends Component {
493
+ static {
494
+ setComponentTemplate(templateFactory({
495
+ "id": "ouXqEoim",
496
+ "block": "[[[8,[32,0],null,[[\"@onClose\"],[[32,1]]],null]],[],[]]",
497
+ "moduleName": "/home/runner/work/boxel/boxel/packages/host/tests/integration/components/ai-assistant-panel/sending-test.gts",
498
+ "scope": () => [OperatorModeContainer, noop],
499
+ "isStrictMode": true
500
+ }), this);
501
+ }
502
+ });
503
+ await openAiAssistant();
504
+ await fillIn("[data-test-message-field]", "This is a magic message with a SENDING_DELAY_THEN_FAILURE!");
505
+ await click("[data-test-send-message-btn]");
506
+ await waitFor("[data-test-boxel-alert=\"error\"]");
507
+ await settled();
508
+ await fillIn("[data-test-message-field]", "try to send a new one");
509
+ assert.dom("[data-test-send-message-btn]").isDisabled("failed user bubble still blocks new sends");
510
+ });
511
+ (0, import_qunit.test)("orphaned sending persisted entries hydrate as not_sent", async function(assert) {
512
+ src_default.localStorage.removeItem(AiAssistantPendingSends);
513
+ setCardInOperatorModeState(`${testRealmURL}Person/fadhlan`);
514
+ await renderComponent(class TestDriver extends Component {
515
+ static {
516
+ setComponentTemplate(templateFactory({
517
+ "id": "ouXqEoim",
518
+ "block": "[[[8,[32,0],null,[[\"@onClose\"],[[32,1]]],null]],[],[]]",
519
+ "moduleName": "/home/runner/work/boxel/boxel/packages/host/tests/integration/components/ai-assistant-panel/sending-test.gts",
520
+ "scope": () => [OperatorModeContainer, noop],
521
+ "isStrictMode": true
522
+ }), this);
523
+ }
524
+ });
525
+ let roomId = await openAiAssistant();
526
+ let orphaned = {
527
+ clientGeneratedId: "orphaned-sending-cgi",
528
+ body: "Send interrupted by reload",
529
+ attachedCardIds: [],
530
+ attachedFiles: [],
531
+ createdAt: Date.now() - 5e3,
532
+ status: "sending"
533
+ };
534
+ src_default.localStorage.setItem(AiAssistantPendingSends, JSON.stringify({ [roomId]: [orphaned] }));
535
+ let matrixService = getService("matrix-service");
536
+ matrixService.hydratedPendingSendRooms.delete(roomId);
537
+ matrixService.ensurePendingSendsHydrated(roomId);
538
+ await waitFor("[data-test-user-message]");
539
+ assert.dom("[data-test-alert-action-button=\"Retry\"]").exists("orphaned sending surfaces a retry alert");
540
+ let raw = src_default.localStorage.getItem(AiAssistantPendingSends);
541
+ let entry = (raw ? JSON.parse(raw) : {})?.[roomId]?.[0];
542
+ assert.strictEqual(entry?.status, "not_sent", "persisted entry rewritten to not_sent on hydration");
543
+ });
544
+ (0, import_qunit.test)("persisted entry stays until matrix finalizes the send", async function(assert) {
545
+ setCardInOperatorModeState(`${testRealmURL}Person/fadhlan`);
546
+ await renderComponent(class TestDriver extends Component {
547
+ static {
548
+ setComponentTemplate(templateFactory({
549
+ "id": "ouXqEoim",
550
+ "block": "[[[8,[32,0],null,[[\"@onClose\"],[[32,1]]],null]],[],[]]",
551
+ "moduleName": "/home/runner/work/boxel/boxel/packages/host/tests/integration/components/ai-assistant-panel/sending-test.gts",
552
+ "scope": () => [OperatorModeContainer, noop],
553
+ "isStrictMode": true
554
+ }), this);
555
+ }
556
+ });
557
+ let roomId = await openAiAssistant();
558
+ let sendGate = new Deferred();
559
+ mockMatrixUtils.setSendEventInterceptor(() => sendGate.promise);
560
+ await fillIn("[data-test-message-field]", "persistence-lifecycle test");
561
+ click("[data-test-send-message-btn]");
562
+ await waitFor("[data-test-ai-assistant-message-pending]");
563
+ let raw = src_default.localStorage.getItem(AiAssistantPendingSends);
564
+ let inFlight = JSON.parse(raw ?? "{}")?.[roomId]?.[0];
565
+ assert.ok(inFlight?.clientGeneratedId, "pending entry is persisted while the matrix send is still in flight");
566
+ mockMatrixUtils.setSendEventInterceptor(void 0);
567
+ sendGate.fulfill();
568
+ await waitFor("[data-test-user-message]:not(.is-pending)");
569
+ await settled();
570
+ let after = src_default.localStorage.getItem(AiAssistantPendingSends);
571
+ let parsed = after ? JSON.parse(after) : {};
572
+ assert.notOk(parsed?.[roomId]?.length, "persisted entry is removed once matrix finalizes the send");
573
+ });
316
574
  });
317
575
  //#endregion
@@ -10,10 +10,10 @@ import "./template-factory-CigcGcbz.js";
10
10
  import { s as fillIn } from "./dist-CWCoBB72.js";
11
11
  import { t as require_qunit } from "./qunit-DZc8vxH_.js";
12
12
  import { r as getService } from "./dist-5hbdxMR8.js";
13
- import { A as setupIntegrationTestRealm, O as setupCardLogs, T as saveCard, X as provide, d as cardInfo, f as cleanWhiteSpace, j as setupLocalIndexing, rt as setupRenderingTest, t as setupMockMatrix } from "./mock-matrix-CD6YHaHR.js";
13
+ import { A as setupIntegrationTestRealm, O as setupCardLogs, T as saveCard, X as provide, d as cardInfo, f as cleanWhiteSpace, j as setupLocalIndexing, rt as setupRenderingTest, t as setupMockMatrix } from "./mock-matrix-Bkfl9ACG.js";
14
14
  import { t as p } from "./helpers-D2duENdj.js";
15
15
  import { G as contains, I as StringField, K as containsMany, O as NumberField, P as RichMarkdownField, Q as field, _t as updateFromSerialized, a as CardDef, at as getRelationshipMembershipState, b as FieldDef, c as CodeRefField, ct as isSaved, d as Component, f as DateField, ft as serializeCard, it as getQueryableValue, lt as linksTo, m as DateTimeField, mt as setupBaseRealm, n as BigIntegerField, o as CardInfoField, q as createFromSerialized, rt as getFields, t as Base64ImageField, ut as linksToMany, y as EthereumAddressField, z as Theme } from "./base-realm-Dw9jVsHl.js";
16
- import { t as renderCard } from "./render-component-BabSF5nE.js";
16
+ import { t as renderCard } from "./render-component-DY19erxA.js";
17
17
  //#region tests/integration/components/serialization-test.gts
18
18
  var import_lib = /* @__PURE__ */ __toESM(require_lib());
19
19
  var import_qunit = /* @__PURE__ */ __toESM(require_qunit());
@@ -2,10 +2,10 @@ import { s as __toESM } from "./chunk-CGdGNDIi.js";
2
2
  import { Xn as testRealmInfo, Zn as testRealmURL } from "./runtime-common-BY5dBG5N.js";
3
3
  import { t as getOwner } from "./owner-CqZ4C0QN.js";
4
4
  import { t as SetUserSystemCardCommand } from "./set-user-system-card-NmJn-CZG.js";
5
- import { t as RealmService } from "./realm-oWsFVfdH.js";
5
+ import { t as RealmService } from "./realm-CxU8jc8l.js";
6
6
  import { t as require_qunit } from "./qunit-DZc8vxH_.js";
7
7
  import { r as getService } from "./dist-5hbdxMR8.js";
8
- import { A as setupIntegrationTestRealm, N as setupRealmCacheTeardown, j as setupLocalIndexing, q as withCachedRealmSetup, rt as setupRenderingTest, t as setupMockMatrix } from "./mock-matrix-CD6YHaHR.js";
8
+ import { A as setupIntegrationTestRealm, N as setupRealmCacheTeardown, j as setupLocalIndexing, q as withCachedRealmSetup, rt as setupRenderingTest, t as setupMockMatrix } from "./mock-matrix-Bkfl9ACG.js";
9
9
  //#region tests/integration/commands/set-user-system-card-test.gts
10
10
  var import_qunit = /* @__PURE__ */ __toESM(require_qunit());
11
11
  var StubRealmService = class extends RealmService {
@@ -1,2 +1,2 @@
1
- import { nt as setupApplicationTest, rt as setupRenderingTest } from "./mock-matrix-CD6YHaHR.js";
1
+ import { nt as setupApplicationTest, rt as setupRenderingTest } from "./mock-matrix-Bkfl9ACG.js";
2
2
  export { setupApplicationTest, setupRenderingTest };
@@ -5,9 +5,9 @@ import { or as setComponentTemplate } from "./service-BaBMSYir.js";
5
5
  import { H as templateFactory } from "./index-DaCZcoCY-Bfb0Qdzr.js";
6
6
  import "./component-CqcrwY5l.js";
7
7
  import "./template-factory-CigcGcbz.js";
8
- import { p as FieldContainer } from "./components-CBfd9MIo.js";
8
+ import { p as FieldContainer } from "./components-DYC4nC4r.js";
9
9
  import { r as getService } from "./dist-5hbdxMR8.js";
10
- import { A as setupIntegrationTestRealm, M as setupOnSave, O as setupCardLogs, et as setupOperatorModeStateCleanup, j as setupLocalIndexing, rt as setupRenderingTest, t as setupMockMatrix, w as realmConfigCardJSON } from "./mock-matrix-CD6YHaHR.js";
10
+ import { A as setupIntegrationTestRealm, M as setupOnSave, O as setupCardLogs, et as setupOperatorModeStateCleanup, j as setupLocalIndexing, rt as setupRenderingTest, t as setupMockMatrix, w as realmConfigCardJSON } from "./mock-matrix-Bkfl9ACG.js";
11
11
  //#region tests/integration/components/operator-mode/setup.gts
12
12
  function setupOperatorModeTests(hooks) {
13
13
  setupRenderingTest(hooks);
@@ -6,11 +6,11 @@ import { t as Service } from "./service-BaBMSYir.js";
6
6
  import { n as tracked } from "./tracking-CPe6fHfT.js";
7
7
  import { t as ShowCardCommand } from "./show-card-CkZcK1lD.js";
8
8
  import { t as StackItem } from "./stack-item-B42VVKmV.js";
9
- import { t as RealmService } from "./realm-oWsFVfdH.js";
9
+ import { t as RealmService } from "./realm-CxU8jc8l.js";
10
10
  import { t as require_qunit } from "./qunit-DZc8vxH_.js";
11
11
  import { r as getService } from "./dist-5hbdxMR8.js";
12
- import { A as setupIntegrationTestRealm, M as setupOnSave, N as setupRealmCacheTeardown, O as setupCardLogs, j as setupLocalIndexing, q as withCachedRealmSetup, rt as setupRenderingTest, t as setupMockMatrix, w as realmConfigCardJSON } from "./mock-matrix-CD6YHaHR.js";
13
- import { t as setupWindowMock } from "./test-support-BfonQA4V.js";
12
+ import { A as setupIntegrationTestRealm, M as setupOnSave, N as setupRealmCacheTeardown, O as setupCardLogs, j as setupLocalIndexing, q as withCachedRealmSetup, rt as setupRenderingTest, t as setupMockMatrix, w as realmConfigCardJSON } from "./mock-matrix-Bkfl9ACG.js";
13
+ import { t as setupWindowMock } from "./test-support-CCargU9V.js";
14
14
  //#region tests/integration/commands/show-card-test.gts
15
15
  var import_qunit = /* @__PURE__ */ __toESM(require_qunit());
16
16
  var StubRealmService = class extends RealmService {
@@ -7,13 +7,13 @@ import { i as envSkillId } from "./utils-BXcPbdVS.js";
7
7
  import "./component-CqcrwY5l.js";
8
8
  import { t as Component } from "./dist-CE2G0-tp.js";
9
9
  import "./template-factory-CigcGcbz.js";
10
- import { t as OperatorModeContainer } from "./container-BVdtw4NT.js";
10
+ import { t as OperatorModeContainer } from "./container-DRblzvCW.js";
11
11
  import { A as settled, I as waitUntil, d as click, o as waitFor, s as fillIn } from "./dist-CWCoBB72.js";
12
12
  import { t as require_qunit } from "./qunit-DZc8vxH_.js";
13
13
  import { r as getService } from "./dist-5hbdxMR8.js";
14
- import { A as setupIntegrationTestRealm, E as setMonacoContent, M as setupOnSave, O as setupCardLogs, b as getMonacoContent, et as setupOperatorModeStateCleanup, j as setupLocalIndexing, o as addSkillToAiAssistant, rt as setupRenderingTest, t as setupMockMatrix, w as realmConfigCardJSON } from "./mock-matrix-CD6YHaHR.js";
14
+ import { A as setupIntegrationTestRealm, E as setMonacoContent, M as setupOnSave, O as setupCardLogs, b as getMonacoContent, et as setupOperatorModeStateCleanup, j as setupLocalIndexing, o as addSkillToAiAssistant, rt as setupRenderingTest, t as setupMockMatrix, w as realmConfigCardJSON } from "./mock-matrix-Bkfl9ACG.js";
15
15
  import { G as contains, I as StringField, Q as field, a as CardDef, b as FieldDef, d as Component$1, lt as linksTo, mt as setupBaseRealm, s as CardsGrid, ut as linksToMany } from "./base-realm-Dw9jVsHl.js";
16
- import { n as renderComponent } from "./render-component-BabSF5nE.js";
16
+ import { n as renderComponent } from "./render-component-DY19erxA.js";
17
17
  //#region tests/integration/components/ai-assistant-panel/skills-test.gts
18
18
  var import_qunit = /* @__PURE__ */ __toESM(require_qunit());
19
19
  (0, import_qunit.module)("Integration | ai-assistant-panel | skills", function(hooks) {
@@ -3,9 +3,9 @@ import { Si as baseRealm, Zn as testRealmURL, _a as Deferred, ya as rri } from "
3
3
  import { A as settled, a as find, d as click, l as triggerEvent, o as waitFor, s as fillIn } from "./dist-CWCoBB72.js";
4
4
  import { t as require_qunit } from "./qunit-DZc8vxH_.js";
5
5
  import { r as getService } from "./dist-5hbdxMR8.js";
6
- import { D as setupAcceptanceTestRealm, F as setupUserSubscription, M as setupOnSave, N as setupRealmCacheTeardown, P as setupRealmServerEndpoints, a as SYSTEM_CARD_FIXTURE_CONTENTS, at as setupAuthEndpoints, j as setupLocalIndexing, nt as setupApplicationTest, pt as percySnapshot, q as withCachedRealmSetup, t as setupMockMatrix, tt as visitOperatorMode, w as realmConfigCardJSON } from "./mock-matrix-CD6YHaHR.js";
7
- import { a as getPlaygroundSelections, c as removeSpecSelection, l as selectDeclaration, t as assertCardExists } from "./playground-CMnQXTzR.js";
8
- import { r as getRecentFiles } from "./recent-files-cards-D845sggD.js";
6
+ import { D as setupAcceptanceTestRealm, F as setupUserSubscription, M as setupOnSave, N as setupRealmCacheTeardown, P as setupRealmServerEndpoints, a as SYSTEM_CARD_FIXTURE_CONTENTS, at as setupAuthEndpoints, j as setupLocalIndexing, nt as setupApplicationTest, pt as percySnapshot, q as withCachedRealmSetup, t as setupMockMatrix, tt as visitOperatorMode, w as realmConfigCardJSON } from "./mock-matrix-Bkfl9ACG.js";
7
+ import { a as getPlaygroundSelections, c as removeSpecSelection, l as selectDeclaration, t as assertCardExists } from "./playground-DFwsIC-9.js";
8
+ import { r as getRecentFiles } from "./recent-files-cards-BICbCMhW.js";
9
9
  import "./code-equality-assertion-Bdj0Z0Ut.js";
10
10
  //#region tests/acceptance/code-submode/spec-test.gts
11
11
  var import_qunit = /* @__PURE__ */ __toESM(require_qunit());
@@ -102,6 +102,7 @@ var StoreService = class extends Service {
102
102
  this.#operatorModeStateService = (initializeDeferredDecorator(this, "operatorModeStateService"), void 0);
103
103
  this.#realmServer = (initializeDeferredDecorator(this, "realmServer"), void 0);
104
104
  this.subscriptions = /* @__PURE__ */ new Map();
105
+ this.cardInvalidationSubscribers = /* @__PURE__ */ new Map();
105
106
  this.referenceCount = /* @__PURE__ */ new Map();
106
107
  this.newReferencePromises = [];
107
108
  this.autoSaveStates = new TrackedMap();
@@ -219,6 +220,7 @@ var StoreService = class extends Service {
219
220
  let consumers = this.store.consumersOf(api, instance);
220
221
  this.store.delete(instance.id);
221
222
  for (let consumer of consumers) api.notifyLinksToTargetDeleted(consumer, instance.id);
223
+ this.notifyCardInvalidationSubscribers(instance.id);
222
224
  }
223
225
  } finally {
224
226
  this.finishTrackingCardLoad(instance.id, reloadTracker);
@@ -266,6 +268,7 @@ var StoreService = class extends Service {
266
268
  resetState() {
267
269
  clearInterval(this.gcInterval);
268
270
  this.subscriptions = /* @__PURE__ */ new Map();
271
+ this.cardInvalidationSubscribers = /* @__PURE__ */ new Map();
269
272
  this.onSaveSubscriber = void 0;
270
273
  this.referenceCount = /* @__PURE__ */ new Map();
271
274
  this.newReferencePromises = [];
@@ -318,6 +321,32 @@ var StoreService = class extends Service {
318
321
  this.store.reset();
319
322
  this.reestablishReferences.perform();
320
323
  }
324
+ subscribeToCardInvalidation(id, cb) {
325
+ let normalizedId = asURL(id, this.network.virtualNetwork);
326
+ let subscribers = this.cardInvalidationSubscribers.get(normalizedId);
327
+ if (!subscribers) {
328
+ subscribers = /* @__PURE__ */ new Set();
329
+ this.cardInvalidationSubscribers.set(normalizedId, subscribers);
330
+ }
331
+ subscribers.add(cb);
332
+ return () => {
333
+ let current = this.cardInvalidationSubscribers.get(normalizedId);
334
+ if (!current) return;
335
+ current.delete(cb);
336
+ if (current.size === 0) this.cardInvalidationSubscribers.delete(normalizedId);
337
+ };
338
+ }
339
+ notifyCardInvalidationSubscribers(id) {
340
+ let normalizedId = asURL(id, this.network.virtualNetwork);
341
+ let subscribers = this.cardInvalidationSubscribers.get(normalizedId);
342
+ if (!subscribers) return;
343
+ for (let cb of [...subscribers]) try {
344
+ let maybePromise = cb();
345
+ if (maybePromise && typeof maybePromise.then === "function") maybePromise.catch((err) => console.error(`card invalidation subscriber for ${normalizedId} rejected`, err));
346
+ } catch (err) {
347
+ console.error(`card invalidation subscriber for ${normalizedId} threw`, err);
348
+ }
349
+ }
321
350
  dropReference(id) {
322
351
  if (!id) return;
323
352
  id = asURL(id, this.network.virtualNetwork);
@@ -492,6 +521,7 @@ var StoreService = class extends Service {
492
521
  this.store.delete(id);
493
522
  if (api) for (let consumer of consumers) api.notifyLinksToTargetDeleted(consumer, id);
494
523
  await this.cardService.fetchJSON(id, { method: "DELETE" });
524
+ this.notifyCardInvalidationSubscribers(id);
495
525
  }
496
526
  async patch(id, patch, opts) {
497
527
  if (this.renderContextBlocksPersistence()) return;
@@ -2,10 +2,10 @@ import { s as __toESM } from "./chunk-CGdGNDIi.js";
2
2
  import { Xn as testRealmInfo, Zn as testRealmURL } from "./runtime-common-BY5dBG5N.js";
3
3
  import { t as getOwner } from "./owner-CqZ4C0QN.js";
4
4
  import { t as StoreAddCommand } from "./store-add-DYE1fMQN.js";
5
- import { t as RealmService } from "./realm-oWsFVfdH.js";
5
+ import { t as RealmService } from "./realm-CxU8jc8l.js";
6
6
  import { t as require_qunit } from "./qunit-DZc8vxH_.js";
7
7
  import { r as getService } from "./dist-5hbdxMR8.js";
8
- import { A as setupIntegrationTestRealm, N as setupRealmCacheTeardown, j as setupLocalIndexing, q as withCachedRealmSetup, rt as setupRenderingTest, t as setupMockMatrix } from "./mock-matrix-CD6YHaHR.js";
8
+ import { A as setupIntegrationTestRealm, N as setupRealmCacheTeardown, j as setupLocalIndexing, q as withCachedRealmSetup, rt as setupRenderingTest, t as setupMockMatrix } from "./mock-matrix-Bkfl9ACG.js";
9
9
  import { mt as setupBaseRealm } from "./base-realm-Dw9jVsHl.js";
10
10
  //#region tests/integration/commands/store-add-test.gts
11
11
  var import_qunit = /* @__PURE__ */ __toESM(require_qunit());
@@ -7,15 +7,15 @@ import { n as tracked, t as cached } from "./tracking-CPe6fHfT.js";
7
7
  import "./component-CqcrwY5l.js";
8
8
  import { t as Component } from "./dist-CE2G0-tp.js";
9
9
  import "./template-factory-CigcGcbz.js";
10
- import { y as getCardCollection } from "./panel-BXXk_P7h.js";
10
+ import { y as getCardCollection } from "./panel-DcMU_CGT.js";
11
11
  import { n as getCard } from "./card-resource-Dww3okhN.js";
12
- import { t as OperatorModeContainer } from "./container-BVdtw4NT.js";
12
+ import { t as OperatorModeContainer } from "./container-DRblzvCW.js";
13
13
  import { A as settled, I as waitUntil, d as click, o as waitFor, r as typeIn } from "./dist-CWCoBB72.js";
14
14
  import { t as require_qunit } from "./qunit-DZc8vxH_.js";
15
15
  import { r as getService } from "./dist-5hbdxMR8.js";
16
- import { A as setupIntegrationTestRealm, J as withSlowSave, M as setupOnSave, O as setupCardLogs, et as setupOperatorModeStateCleanup, j as setupLocalIndexing, ot as registerDefaultRoutes, rt as setupRenderingTest, st as registerRealmServerRoute, t as setupMockMatrix } from "./mock-matrix-CD6YHaHR.js";
16
+ import { A as setupIntegrationTestRealm, J as withSlowSave, M as setupOnSave, O as setupCardLogs, et as setupOperatorModeStateCleanup, j as setupLocalIndexing, ot as registerDefaultRoutes, rt as setupRenderingTest, st as registerRealmServerRoute, t as setupMockMatrix } from "./mock-matrix-Bkfl9ACG.js";
17
17
  import { G as contains, I as StringField, Q as field, a as CardDef, d as Component$1, lt as linksTo, mt as setupBaseRealm, r as BooleanField, ut as linksToMany, x as FileDef } from "./base-realm-Dw9jVsHl.js";
18
- import { n as renderComponent } from "./render-component-BabSF5nE.js";
18
+ import { n as renderComponent } from "./render-component-DY19erxA.js";
19
19
  //#region tests/integration/store-test.gts
20
20
  var import_qunit = /* @__PURE__ */ __toESM(require_qunit());
21
21
  (0, import_qunit.module)("Integration | Store", function(hooks) {
@@ -691,6 +691,79 @@ var import_qunit = /* @__PURE__ */ __toESM(require_qunit());
691
691
  let file = await testRealmAdapter.openFile(`Person/boris.json`);
692
692
  assert.strictEqual(file, void 0, "file no longer exists");
693
693
  });
694
+ (0, import_qunit.test)("subscribeToCardInvalidation fires the callback when the card is deleted", async function(assert) {
695
+ storeService.addReference(`${testRealmURL}Person/boris`);
696
+ await storeService.flush();
697
+ let fired = 0;
698
+ let unsubscribe = storeService.subscribeToCardInvalidation(`${testRealmURL}Person/boris`, () => {
699
+ fired += 1;
700
+ });
701
+ await storeService.delete(`${testRealmURL}Person/boris`);
702
+ assert.strictEqual(fired, 1, "the invalidation subscriber fires exactly once on delete");
703
+ unsubscribe();
704
+ });
705
+ (0, import_qunit.test)("subscribeToCardInvalidation unsubscribe stops firing the callback", async function(assert) {
706
+ storeService.addReference(`${testRealmURL}Person/boris`);
707
+ await storeService.flush();
708
+ let fired = 0;
709
+ storeService.subscribeToCardInvalidation(`${testRealmURL}Person/boris`, () => {
710
+ fired += 1;
711
+ })();
712
+ await storeService.delete(`${testRealmURL}Person/boris`);
713
+ assert.strictEqual(fired, 0, "no callbacks fire after unsubscribe");
714
+ });
715
+ (0, import_qunit.test)("a synchronously throwing invalidation subscriber does not break siblings", async function(assert) {
716
+ storeService.addReference(`${testRealmURL}Person/boris`);
717
+ await storeService.flush();
718
+ let originalError = console.error;
719
+ let captured = [];
720
+ console.error = (...args) => {
721
+ captured.push(args);
722
+ };
723
+ let secondFired = 0;
724
+ let unsubscribeA = storeService.subscribeToCardInvalidation(`${testRealmURL}Person/boris`, () => {
725
+ throw new Error("intentional sync throw from invalidation subscriber");
726
+ });
727
+ let unsubscribeB = storeService.subscribeToCardInvalidation(`${testRealmURL}Person/boris`, () => {
728
+ secondFired += 1;
729
+ });
730
+ try {
731
+ await storeService.delete(`${testRealmURL}Person/boris`);
732
+ assert.strictEqual(secondFired, 1, "the second subscriber still runs after the first one throws");
733
+ assert.strictEqual(captured.length, 1, "the synchronous throw is reported via console.error exactly once");
734
+ } finally {
735
+ unsubscribeA();
736
+ unsubscribeB();
737
+ console.error = originalError;
738
+ }
739
+ });
740
+ (0, import_qunit.test)("an async-rejecting invalidation subscriber does not break siblings and does not surface as an unhandled rejection", async function(assert) {
741
+ storeService.addReference(`${testRealmURL}Person/boris`);
742
+ await storeService.flush();
743
+ let originalError = console.error;
744
+ let captured = [];
745
+ console.error = (...args) => {
746
+ captured.push(args);
747
+ };
748
+ let secondFired = 0;
749
+ let unsubscribeA = storeService.subscribeToCardInvalidation(`${testRealmURL}Person/boris`, async () => {
750
+ await Promise.resolve();
751
+ throw new Error("intentional async rejection from invalidation subscriber");
752
+ });
753
+ let unsubscribeB = storeService.subscribeToCardInvalidation(`${testRealmURL}Person/boris`, () => {
754
+ secondFired += 1;
755
+ });
756
+ try {
757
+ await storeService.delete(`${testRealmURL}Person/boris`);
758
+ await settled();
759
+ assert.strictEqual(secondFired, 1, "the second subscriber still runs alongside the async-rejecting one");
760
+ assert.strictEqual(captured.length, 1, "the async rejection is reported via console.error exactly once");
761
+ } finally {
762
+ unsubscribeA();
763
+ unsubscribeB();
764
+ console.error = originalError;
765
+ }
766
+ });
694
767
  (0, import_qunit.test)("can patch an instance", async function(assert) {
695
768
  let instance = await storeService.patch(`${testRealmURL}Person/hassan`, {
696
769
  attributes: { name: "Hassan Updated" },
@@ -8,7 +8,7 @@ import { i as templateOnly } from "./dist-BHeMAIJN.js";
8
8
  import "./component-CqcrwY5l.js";
9
9
  import { t as Component } from "./dist-CE2G0-tp.js";
10
10
  import "./template-factory-CigcGcbz.js";
11
- import { M as Tooltip, i as BoxelDropdown, s as ButtonComponent, x as Menu } from "./components-CBfd9MIo.js";
11
+ import { M as Tooltip, i as BoxelDropdown, s as ButtonComponent, x as Menu } from "./components-DYC4nC4r.js";
12
12
  import { D as cn, V as menuItemFunc } from "./helpers-BGEPA06U.js";
13
13
  import { E as IconComponent$A, V as IconComponent$P, q as IconComponent$V } from "./warning-CY8WOyKw-BjT-7Nrv.js";
14
14
  import "./icons-DpXEIwY6.js";