@cardstack/boxel-cli 0.9.0 → 0.10.0-unstable.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (995) hide show
  1. package/README.md +12 -0
  2. package/bundled-test-harness/assets/account-switch-failed-GCSVbJML.js +23 -0
  3. package/bundled-test-harness/assets/account-switch-failed-GsWni_Gk.css +18 -0
  4. package/bundled-test-harness/assets/account-switch-failed-test-CdZWNths.js +45 -0
  5. package/bundled-test-harness/assets/add-workspace-c7L50Gx8.js +141 -0
  6. package/bundled-test-harness/assets/add-workspace-test-BZxHa6Pe.js +72 -0
  7. package/bundled-test-harness/assets/advanced-color-picker-0pGF-3WG.js +504 -0
  8. package/bundled-test-harness/assets/advanced-color-picker-pbO4HWc_.js +2 -0
  9. package/bundled-test-harness/assets/ai-assistant-test-Dnm4o9vK.js +2211 -0
  10. package/bundled-test-harness/assets/ai-module-creation-test-C6253CMt.js +151 -0
  11. package/bundled-test-harness/assets/aibot-message-miKyGeKk.js +278 -0
  12. package/bundled-test-harness/assets/app-i8pGdQkw.js +22855 -0
  13. package/bundled-test-harness/assets/app-zC7o6PyQ.css +2718 -0
  14. package/bundled-test-harness/assets/audio-file-def-DHnydP0t.js +133 -0
  15. package/bundled-test-harness/assets/auth-container-BP2gSoo4.css +51 -0
  16. package/bundled-test-harness/assets/auth-container-DN94iVfX.js +24 -0
  17. package/bundled-test-harness/assets/avif-meta-extractor-Bo5zRX1V.js +162 -0
  18. package/bundled-test-harness/assets/base64-image-B0RYxzHT.js +2 -0
  19. package/bundled-test-harness/assets/base64-image-Bxjqdwew.js +262 -0
  20. package/bundled-test-harness/assets/big-integer-7RLj5_7H.js +89 -0
  21. package/bundled-test-harness/assets/big-integer-C9sJxKVy.js +2 -0
  22. package/bundled-test-harness/assets/binary-upload-dedupe-test-DZo3EaV0.js +308 -0
  23. package/bundled-test-harness/assets/boolean-CcKPYUph.js +94 -0
  24. package/bundled-test-harness/assets/boolean-DvsSmtM7.js +2 -0
  25. package/bundled-test-harness/assets/brand-functional-palette-KpVSY2Sa.js +137 -0
  26. package/bundled-test-harness/assets/brand-logo-DDiOec0t.js +295 -0
  27. package/bundled-test-harness/assets/broken-link-template-test-DAngUbFJ.js +192 -0
  28. package/bundled-test-harness/assets/bundled-base-C_lumba6.js +254 -0
  29. package/bundled-test-harness/assets/bundled-base-modules-test-CSF7Rl4Z.js +54 -0
  30. package/bundled-test-harness/assets/buried-stack-item-scroll-test-B0J_EP88.js +236 -0
  31. package/bundled-test-harness/assets/bxl-expression-test-Dej7WgI6.js +250 -0
  32. package/bundled-test-harness/assets/can-invoke-test-elyUcOKT.js +401 -0
  33. package/bundled-test-harness/assets/card-api-CjWXCkqh.js +8 -0
  34. package/bundled-test-harness/assets/card-api-Dzje0smT.js +4393 -0
  35. package/bundled-test-harness/assets/card-api-test-DA8d4Ooc.js +198 -0
  36. package/bundled-test-harness/assets/card-basics-test-mp1Odo-l.js +5364 -0
  37. package/bundled-test-harness/assets/card-chooser-paging-test-y8OfboYd.js +235 -0
  38. package/bundled-test-harness/assets/card-chooser-test-nmg2zkDj.js +393 -0
  39. package/bundled-test-harness/assets/card-collection-BXiO3i7R.js +118 -0
  40. package/bundled-test-harness/assets/card-context-search-results-Dbhn7lvW.js +30 -0
  41. package/bundled-test-harness/assets/card-context-search-results-test-DVXT-YC5.js +184 -0
  42. package/bundled-test-harness/assets/card-def-field-def-relationships-test-mX4rxrtO.js +562 -0
  43. package/bundled-test-harness/assets/card-delete-test-BxFsqFnX.js +466 -0
  44. package/bundled-test-harness/assets/card-error-C-7hjxu9.js +72 -0
  45. package/bundled-test-harness/assets/card-error-awaiting-index-test-BvfY2eaW.js +53 -0
  46. package/bundled-test-harness/assets/card-error-detail-nMwopDir.js +271 -0
  47. package/bundled-test-harness/assets/card-info-CTFxdohf.js +2 -0
  48. package/bundled-test-harness/assets/card-list-B9QrkJ97.js +2 -0
  49. package/bundled-test-harness/assets/card-list-XbwLCXZS.js +202 -0
  50. package/bundled-test-harness/assets/card-resource-JGLjQUy6.js +86 -0
  51. package/bundled-test-harness/assets/cards-grid-CWG41hZE.js +344 -0
  52. package/bundled-test-harness/assets/cards-grid-DSpX99p6.js +2 -0
  53. package/bundled-test-harness/assets/cards-grid-layout-Bht0LwZy.js +2 -0
  54. package/bundled-test-harness/assets/cards-grid-layout-CdpKlHUb.js +111 -0
  55. package/bundled-test-harness/assets/check-correctness-test-C4BrUeKA.js +554 -0
  56. package/bundled-test-harness/assets/clip-BEVvLrXx.js +2 -0
  57. package/bundled-test-harness/assets/clip-CoB714qX.js +92 -0
  58. package/bundled-test-harness/assets/code-ref-C2uguisI.js +2 -0
  59. package/bundled-test-harness/assets/code-ref-Cy7sV5a4.js +138 -0
  60. package/bundled-test-harness/assets/code-submode-availability-test-BsA_Ul01.js +198 -0
  61. package/bundled-test-harness/assets/code-submode-test-DkBhpEPB.js +1839 -0
  62. package/bundled-test-harness/assets/codeblocks-test-B1eZ2_JF.js +418 -0
  63. package/bundled-test-harness/assets/codemirror-editor-C6pxSm5y.js +2 -0
  64. package/bundled-test-harness/assets/codemirror-editor-DzM46Cd8.js +701 -0
  65. package/bundled-test-harness/assets/codemirror-embed-toolbar-test-BemP-ZdG.js +366 -0
  66. package/bundled-test-harness/assets/color-C-jGNFWZ.js +2 -0
  67. package/bundled-test-harness/assets/color-field-test-DPIRaBec.js +212 -0
  68. package/bundled-test-harness/assets/color-picker-field-Bv4IjS-d.js +139 -0
  69. package/bundled-test-harness/assets/color-picker-field-D1bYCQIg.js +2 -0
  70. package/bundled-test-harness/assets/color-wheel-picker-IIaCQplL.js +283 -0
  71. package/bundled-test-harness/assets/color-wheel-picker-Kw-UN3kV.js +2 -0
  72. package/bundled-test-harness/assets/color-zzCBneih.js +65 -0
  73. package/bundled-test-harness/assets/command-data-BMBtjT1E.js +95 -0
  74. package/bundled-test-harness/assets/command-data-BXC5Z0oA.js +2 -0
  75. package/bundled-test-harness/assets/compaction-test-CxUKnxlQ.js +150 -0
  76. package/bundled-test-harness/assets/components-Ct_agx0G.js +14294 -0
  77. package/bundled-test-harness/assets/computed-test-C-lpGQQ3.js +1320 -0
  78. package/bundled-test-harness/assets/container-BdPu8rvc.css +5565 -0
  79. package/bundled-test-harness/assets/container-Dj-5prh9.js +11288 -0
  80. package/bundled-test-harness/assets/contains-many-component-CAWqzX8W.js +2 -0
  81. package/bundled-test-harness/assets/contrast-checker-addon-BTLD7oMx.js +2 -0
  82. package/bundled-test-harness/assets/contrast-checker-addon-DBzizR04.js +71 -0
  83. package/bundled-test-harness/assets/convert-to-class-name-test-zZuKxYvF.js +17 -0
  84. package/bundled-test-harness/assets/coordinate-Bw8va6tO.js +48 -0
  85. package/bundled-test-harness/assets/copy-file-to-realm-test-DtCKPzqj.js +148 -0
  86. package/bundled-test-harness/assets/country-B_tWpLlO.js +199 -0
  87. package/bundled-test-harness/assets/create-file-modal-D-VPyEYp.js +570 -0
  88. package/bundled-test-harness/assets/create-listing-modal-test-hyLkQY0u.js +273 -0
  89. package/bundled-test-harness/assets/create-listing-pr-request-test-rjWFA_5S.js +117 -0
  90. package/bundled-test-harness/assets/create-spec-test-HKIxZGxK.js +256 -0
  91. package/bundled-test-harness/assets/create-specs-9-ELVyJP.js +215 -0
  92. package/bundled-test-harness/assets/create-submission-workflow-test-DNZrbRX8.js +132 -0
  93. package/bundled-test-harness/assets/credential-fields-test-xPEdA911.js +157 -0
  94. package/bundled-test-harness/assets/css-value-Du3HL39X.js +48 -0
  95. package/bundled-test-harness/assets/csv-file-def-EHRmilrp.js +277 -0
  96. package/bundled-test-harness/assets/currency-y6ZCHIqG.js +134 -0
  97. package/bundled-test-harness/assets/date-B27PrSFT.js +183 -0
  98. package/bundled-test-harness/assets/date-CiP5Eb9i.js +2 -0
  99. package/bundled-test-harness/assets/date-time-fields-test-Clf5vxRW.js +359 -0
  100. package/bundled-test-harness/assets/datetime-BEbR9YgU.js +201 -0
  101. package/bundled-test-harness/assets/datetime-DPnrt1wl.js +2 -0
  102. package/bundled-test-harness/assets/datetime-stamp-AuT7F7qn.js +2 -0
  103. package/bundled-test-harness/assets/datetime-stamp-CGwP2P3f.js +81 -0
  104. package/bundled-test-harness/assets/day-BFLxZ9bQ.js +2 -0
  105. package/bundled-test-harness/assets/day-CQoEkqgE.js +113 -0
  106. package/bundled-test-harness/assets/debug-message-test-CzgOpfcI.js +117 -0
  107. package/bundled-test-harness/assets/dist-B-fYvxfL.js +389 -0
  108. package/bundled-test-harness/assets/dist-C2IXvIKX.js +323 -0
  109. package/bundled-test-harness/assets/dist-CdNZu43l.js +1710 -0
  110. package/bundled-test-harness/assets/docx-file-def-BQMw460_.js +60 -0
  111. package/bundled-test-harness/assets/docx-meta-extractor-DBlmH_kV.js +60 -0
  112. package/bundled-test-harness/assets/docx-meta-extractor-Dw4gZ0ae.js +2 -0
  113. package/bundled-test-harness/assets/duration-B0SnEiw1.js +184 -0
  114. package/bundled-test-harness/assets/duration-DbjJTFeA.js +2 -0
  115. package/bundled-test-harness/assets/email-C-8cyWiQ.js +80 -0
  116. package/bundled-test-harness/assets/email-field-test-BOBmvQqx.js +75 -0
  117. package/bundled-test-harness/assets/email-xUgCst-p.js +2 -0
  118. package/bundled-test-harness/assets/enum-BWiCyJlu.js +167 -0
  119. package/bundled-test-harness/assets/enum-CzYjivhO.js +2 -0
  120. package/bundled-test-harness/assets/enum-field-test-Bea9EsQR.js +953 -0
  121. package/bundled-test-harness/assets/error-display-test-Cbl2D_0c.js +343 -0
  122. package/bundled-test-harness/assets/ethereum-address-Bw_J05bD.js +78 -0
  123. package/bundled-test-harness/assets/ethereum-address-C9wHMBt3.js +2 -0
  124. package/bundled-test-harness/assets/expiration-warning-BHcJEjZt.js +90 -0
  125. package/bundled-test-harness/assets/expiration-warning-_G8SKZd0.js +2 -0
  126. package/bundled-test-harness/assets/externals-CKblKBo1.js +4393 -0
  127. package/bundled-test-harness/assets/fallback-banner-BqCrvTDt.js +24 -0
  128. package/bundled-test-harness/assets/fallback-banner-live-delete-test-D_AYMvf6.js +207 -0
  129. package/bundled-test-harness/assets/fallback-banner-test-B8Ne9a5g.js +225 -0
  130. package/bundled-test-harness/assets/fallback-banner-test-C7oaSxd1.js +53 -0
  131. package/bundled-test-harness/assets/fallback-models-test-DY-PvU9k.js +161 -0
  132. package/bundled-test-harness/assets/field-component-Bj8YthPE.js +2 -0
  133. package/bundled-test-harness/assets/field-configuration-test-B5LztQ47.js +548 -0
  134. package/bundled-test-harness/assets/field-edit-Cx_haspD.js +36 -0
  135. package/bundled-test-harness/assets/field-edit-DQZWUz3F.js +2 -0
  136. package/bundled-test-harness/assets/field-markdown-domain-test-DnqK3CrE.js +616 -0
  137. package/bundled-test-harness/assets/field-markdown-oversize-test-BEpbXIvl.js +88 -0
  138. package/bundled-test-harness/assets/field-markdown-primitives-test-BDORWoOk.js +365 -0
  139. package/bundled-test-harness/assets/field-markdown-specialized-test-BmIzadYq.js +534 -0
  140. package/bundled-test-harness/assets/field-test-helpers-CRF9-jFw.js +45 -0
  141. package/bundled-test-harness/assets/file-api-DPMJghBY.js +7 -0
  142. package/bundled-test-harness/assets/file-attachment-test-DFLXg3xV.js +796 -0
  143. package/bundled-test-harness/assets/file-chooser-panel-test-B4DzCWkt.js +153 -0
  144. package/bundled-test-harness/assets/file-chooser-test-DpjOWgpB.js +504 -0
  145. package/bundled-test-harness/assets/file-def-edit-Bstl7Kkl.js +2 -0
  146. package/bundled-test-harness/assets/file-def-edit-C1dzJxmQ.js +26 -0
  147. package/bundled-test-harness/assets/file-def-embedded-CUy4G7Vc.js +2 -0
  148. package/bundled-test-harness/assets/file-def-embedded-DJs6P5t0.js +38 -0
  149. package/bundled-test-harness/assets/file-def-fitted-BlrBFfLh.js +38 -0
  150. package/bundled-test-harness/assets/file-def-fitted-Bo5Qfkyf.js +2 -0
  151. package/bundled-test-harness/assets/file-def-isolated-BsHydanv.js +38 -0
  152. package/bundled-test-harness/assets/file-def-isolated-Dp-Lc99-.js +2 -0
  153. package/bundled-test-harness/assets/file-def-serialization-test-CISKpt_o.js +89 -0
  154. package/bundled-test-harness/assets/file-menu-items-7_ltrFZq.js +117 -0
  155. package/bundled-test-harness/assets/file-menu-items-BnRG9ydE.js +2 -0
  156. package/bundled-test-harness/assets/file-preview-stage-CV3qZpiK.js +72 -0
  157. package/bundled-test-harness/assets/file-preview-stage-DTA5X8rX.js +2 -0
  158. package/bundled-test-harness/assets/file-shell-embedded-BpmiVzIG.js +2 -0
  159. package/bundled-test-harness/assets/file-shell-embedded-CEv0-6OE.js +68 -0
  160. package/bundled-test-harness/assets/file-shell-fitted-C6k3GnMc.js +2 -0
  161. package/bundled-test-harness/assets/file-shell-fitted-iSTg3PJa.js +98 -0
  162. package/bundled-test-harness/assets/file-shell-isolated-C-pEod2J.js +195 -0
  163. package/bundled-test-harness/assets/file-shell-isolated-DI9oU7ix.js +2 -0
  164. package/bundled-test-harness/assets/file-tree-from-index-BtOOMqnb.js +151 -0
  165. package/bundled-test-harness/assets/file-tree-from-index-test-T8w3hPw_.js +96 -0
  166. package/bundled-test-harness/assets/film-5n9_gRqZ.js +4074 -0
  167. package/bundled-test-harness/assets/film-Ca2Vzlfu.js +13 -0
  168. package/bundled-test-harness/assets/film-DEvhBbBu.js +2 -0
  169. package/bundled-test-harness/assets/fitted-6OGuHgoU.js +2 -0
  170. package/bundled-test-harness/assets/fitted-B2l1jlSp.js +34 -0
  171. package/bundled-test-harness/assets/flac-meta-extractor-BoJqvmDC.js +99 -0
  172. package/bundled-test-harness/assets/font-file-def-Czzt5paT.js +64 -0
  173. package/bundled-test-harness/assets/font-meta-extractor-DQYT_e5b.js +2 -0
  174. package/bundled-test-harness/assets/font-meta-extractor-IHD-pG8V.js +303 -0
  175. package/bundled-test-harness/assets/formatted-aibot-message-test-Djsl8RzE.js +109 -0
  176. package/bundled-test-harness/assets/from-elsewhere-BXcLYxxu.js +131 -0
  177. package/bundled-test-harness/assets/frontmatter-field-CciolgL3.js +41 -0
  178. package/bundled-test-harness/assets/garbage-collection-test-BTOLAfB6.js +403 -0
  179. package/bundled-test-harness/assets/gauge-C1loqGq3.js +2 -0
  180. package/bundled-test-harness/assets/gauge-u8dxl90d.js +106 -0
  181. package/bundled-test-harness/assets/general-test-Cd5WtVvd.js +926 -0
  182. package/bundled-test-harness/assets/get-relationship-membership-state-test-DJAuhOVM.js +1308 -0
  183. package/bundled-test-harness/assets/gif-meta-extractor-tSaPtuYW.js +114 -0
  184. package/bundled-test-harness/assets/glimmer-motion-and-choreo-in-cards-test-DNSy5l59.js +160 -0
  185. package/bundled-test-harness/assets/glimmer-motion-and-choreo-test-B6BbQxYq.js +74 -0
  186. package/bundled-test-harness/assets/helper-m6jA5HmU.js +478 -0
  187. package/bundled-test-harness/assets/host-submode-test-CsgdksBi.js +1243 -0
  188. package/bundled-test-harness/assets/html-file-def-yKtdMSa-.js +82 -0
  189. package/bundled-test-harness/assets/hydratable-card-CxNfbqly.js +147 -0
  190. package/bundled-test-harness/assets/hydratable-card-test-NJ4CI4ey.js +426 -0
  191. package/bundled-test-harness/assets/icons-B3SAtRoj.js +894 -0
  192. package/bundled-test-harness/assets/image-file-def-B0rpS3Yy.js +3 -0
  193. package/bundled-test-harness/assets/image-file-def-DUFmjNL8.js +65 -0
  194. package/bundled-test-harness/assets/image-olOUqgMQ.js +47 -0
  195. package/bundled-test-harness/assets/index-changes-test-D7OE-99k.js +367 -0
  196. package/bundled-test-harness/assets/index-query-engine-test-BBKqgSmg.js +2593 -0
  197. package/bundled-test-harness/assets/inspector-test-DV6Ms2uz.js +1930 -0
  198. package/bundled-test-harness/assets/instance-filter-matcher-test-Bs4kf7E8.js +788 -0
  199. package/bundled-test-harness/assets/interact-submode-creation-and-permissions-test-DIfgRhIN.js +475 -0
  200. package/bundled-test-harness/assets/interact-submode-setup-D4M_e580.js +566 -0
  201. package/bundled-test-harness/assets/is-component-declaration-test-jPGRTVh1.js +50 -0
  202. package/bundled-test-harness/assets/iso-bmff-DHtkSbQM.js +205 -0
  203. package/bundled-test-harness/assets/iso-bmff-zmOHoSVg.js +2 -0
  204. package/bundled-test-harness/assets/isolated-and-edit-BAnwcK1T.js +2 -0
  205. package/bundled-test-harness/assets/job-priority-header-test-7j2f3Dtl.js +81 -0
  206. package/bundled-test-harness/assets/job-scoped-instance-residency-test-DPzVQUL3.js +103 -0
  207. package/bundled-test-harness/assets/join-the-community-Ft5fjeIA.js +86 -0
  208. package/bundled-test-harness/assets/jpg-meta-extractor-Dsq6rZ8F.js +88 -0
  209. package/bundled-test-harness/assets/json-field-CxOZvp3k.js +19 -0
  210. package/bundled-test-harness/assets/json-field-ojdwGD6T.js +2 -0
  211. package/bundled-test-harness/assets/json-file-def-Da_5-zSM.js +298 -0
  212. package/bundled-test-harness/assets/last-modified-date-BnyJsc04.js +43 -0
  213. package/bundled-test-harness/assets/last-modified-date-test-DFl2mo1B.js +28 -0
  214. package/bundled-test-harness/assets/links-to-editor-DO24-71w.js +2 -0
  215. package/bundled-test-harness/assets/links-to-many-component-C7DabwAY.js +2 -0
  216. package/bundled-test-harness/assets/linksto-broken-link-placeholder-test-D4lDhvnQ.js +398 -0
  217. package/bundled-test-harness/assets/linksto-error-sentinel-test-oWgDz00K.js +238 -0
  218. package/bundled-test-harness/assets/linksto-many-broken-link-placeholder-test-CpSl7zJ7.js +354 -0
  219. package/bundled-test-harness/assets/linksto-many-per-slot-access-test-DJY3J8Xl.js +303 -0
  220. package/bundled-test-harness/assets/linksto-sentinel-reload-test-BxzfoONe.js +197 -0
  221. package/bundled-test-harness/assets/linksto-sentinel-roundtrip-test-DyE99km_.js +260 -0
  222. package/bundled-test-harness/assets/linksto-singular-js-access-contract-test-dcWAAgxt.js +196 -0
  223. package/bundled-test-harness/assets/llm-model-DrswiczZ.js +64 -0
  224. package/bundled-test-harness/assets/login-C-EIG0-Q.css +543 -0
  225. package/bundled-test-harness/assets/login-CNeL-9IC.js +408 -0
  226. package/bundled-test-harness/assets/login-error-text-test-CEH2tjNP.js +51 -0
  227. package/bundled-test-harness/assets/login-test-BpMx7qwV.js +246 -0
  228. package/bundled-test-harness/assets/m4a-meta-extractor-BJkMHUIK.js +204 -0
  229. package/bundled-test-harness/assets/main-BaUgfpPE.js +5 -0
  230. package/bundled-test-harness/assets/markdown-ByEGbwov.js +7 -0
  231. package/bundled-test-harness/assets/markdown-KJzgTg-A.js +2 -0
  232. package/bundled-test-harness/assets/markdown-editor-mode-select-BUGPXaSE.js +2 -0
  233. package/bundled-test-harness/assets/markdown-editor-mode-select-DBk8dG0O.js +54 -0
  234. package/bundled-test-harness/assets/markdown-embed-chooser-modal-test-BIlEmna9.js +470 -0
  235. package/bundled-test-harness/assets/markdown-embed-preview-pane-test-B6rscKpk.js +447 -0
  236. package/bundled-test-harness/assets/markdown-embed-preview-test-CTQw1wq-.js +368 -0
  237. package/bundled-test-harness/assets/markdown-fallback-BVsco6gJ.js +2 -0
  238. package/bundled-test-harness/assets/markdown-fallback-test-C_CIFEzH.js +316 -0
  239. package/bundled-test-harness/assets/markdown-highlighting-test-D6YvywF5.js +244 -0
  240. package/bundled-test-harness/assets/markdown-preview-1TSMSUv0.js +64 -0
  241. package/bundled-test-harness/assets/markdown-preview-jbuUjLoD.js +72 -0
  242. package/bundled-test-harness/assets/markdown-preview-test-zuU5uoA_.js +238 -0
  243. package/bundled-test-harness/assets/markdown-skill-frontmatter-test-CoicGRkb.js +146 -0
  244. package/bundled-test-harness/assets/menu-items-DZ_uOoYu.js +2 -0
  245. package/bundled-test-harness/assets/message-tool-test-K6LgTq5d.js +33 -0
  246. package/bundled-test-harness/assets/metadata-fields-WiOuUCDl.js +1415 -0
  247. package/bundled-test-harness/assets/metadata-fields-iu5AfQp3.js +2 -0
  248. package/bundled-test-harness/assets/midi-audio-def-CD2-4Wjx.js +52 -0
  249. package/bundled-test-harness/assets/midi-meta-extractor-CE3sLiEV.js +284 -0
  250. package/bundled-test-harness/assets/midi-meta-extractor-O7c8LHYV.js +2 -0
  251. package/bundled-test-harness/assets/migrate-skill-test-Beh-AeSN.js +161 -0
  252. package/bundled-test-harness/assets/mini-BNXINKKF.js +85 -0
  253. package/bundled-test-harness/assets/mini-C43Q4BWp.js +1519 -0
  254. package/bundled-test-harness/assets/mini-card-chooser-test-B1GMp-31.js +272 -0
  255. package/bundled-test-harness/assets/mini-file-chooser-test-CbI1vrQn.js +201 -0
  256. package/bundled-test-harness/assets/missing-template-BPhJRbDs.js +48 -0
  257. package/bundled-test-harness/assets/missing-template-DP-Pi-HQ.js +2 -0
  258. package/bundled-test-harness/assets/modal-KpPz2f8x.js +322 -0
  259. package/bundled-test-harness/assets/modal-container-0Efz_h2z.js +40 -0
  260. package/bundled-test-harness/assets/model-cost-tier-test-D-5VSjh6.js +173 -0
  261. package/bundled-test-harness/assets/module-contents-service-BRkTETb6.js +256 -0
  262. package/bundled-test-harness/assets/moment-Cln59YUK.js +3474 -0
  263. package/bundled-test-harness/assets/monaco-AbHCoDJY.js +143 -0
  264. package/bundled-test-harness/assets/monaco-test-DCPi18sy.js +100 -0
  265. package/bundled-test-harness/assets/monaco-test-waiter-lvFEYpFj.js +190 -0
  266. package/bundled-test-harness/assets/month-1eUIsvWN.js +2 -0
  267. package/bundled-test-harness/assets/month-BeUdWMWQ.js +123 -0
  268. package/bundled-test-harness/assets/month-day-Bbsd8YbR.js +192 -0
  269. package/bundled-test-harness/assets/month-day-Dks5STJu.js +2 -0
  270. package/bundled-test-harness/assets/month-year-pL_rpUhX.js +2 -0
  271. package/bundled-test-harness/assets/month-year-wH_YnYgL.js +93 -0
  272. package/bundled-test-harness/assets/mp3-meta-extractor-C3u34UHM.js +476 -0
  273. package/bundled-test-harness/assets/mp4-meta-extractor-Bj3F7dxs.js +188 -0
  274. package/bundled-test-harness/assets/multiple-stacks-test-mkNdTUMI.js +208 -0
  275. package/bundled-test-harness/assets/nested-query-field-render-test-BQLn3wg9.js +249 -0
  276. package/bundled-test-harness/assets/no-stacks-test-DpwZQAJ-.js +48 -0
  277. package/bundled-test-harness/assets/number-DZa-fHpu.js +151 -0
  278. package/bundled-test-harness/assets/number-Dvua76YP.js +3 -0
  279. package/bundled-test-harness/assets/number-field-test-BiaH2eaB.js +184 -0
  280. package/bundled-test-harness/assets/number-input-D5nDYDkK.js +82 -0
  281. package/bundled-test-harness/assets/office-extract-JzYva33g.js +27 -0
  282. package/bundled-test-harness/assets/office-extract-XMpsyYRh.js +2 -0
  283. package/bundled-test-harness/assets/ogg-meta-extractor-DJosZ9LA.js +225 -0
  284. package/bundled-test-harness/assets/on-key-BBVkS8Bi.js +472 -0
  285. package/bundled-test-harness/assets/ooxml-BlAE2w4d.js +172 -0
  286. package/bundled-test-harness/assets/ooxml-D-p8OmuM.js +2 -0
  287. package/bundled-test-harness/assets/open-image-in-new-tab-test-DWBU5pw9.js +52 -0
  288. package/bundled-test-harness/assets/operation-lowering-test-nzqprueU.js +2812 -0
  289. package/bundled-test-harness/assets/operations-CPvfTuY3.js +766 -0
  290. package/bundled-test-harness/assets/operations-invocation-test-C75T6zn3.js +523 -0
  291. package/bundled-test-harness/assets/operations-query-test-BoCszQEW.js +459 -0
  292. package/bundled-test-harness/assets/operations-test-79ipSnpM.js +2518 -0
  293. package/bundled-test-harness/assets/operations-x3Aw2Nky.js +3 -0
  294. package/bundled-test-harness/assets/operator-mode-acceptance-test-jjsYtt96.js +1188 -0
  295. package/bundled-test-harness/assets/operator-mode-card-chooser-test-hZP9gEQK.js +1036 -0
  296. package/bundled-test-harness/assets/operator-mode-links-test-DN16SuIx.js +793 -0
  297. package/bundled-test-harness/assets/operator-mode-state-service-gwiTSiWX.js +1275 -0
  298. package/bundled-test-harness/assets/operator-mode-state-service-test-Dt2qnKKP.js +206 -0
  299. package/bundled-test-harness/assets/operator-mode-test-BZnnxO9q.js +683 -0
  300. package/bundled-test-harness/assets/operator-mode-ui-test-O--qEo-y.js +1027 -0
  301. package/bundled-test-harness/assets/overlay-menu-items-test-Bl2k0aAa.js +317 -0
  302. package/bundled-test-harness/assets/overlays-CdN_JokA.js +270 -0
  303. package/bundled-test-harness/assets/overlays-clip-test-DpbR1ZTz.js +91 -0
  304. package/bundled-test-harness/assets/overlays-detached-element-test-cLgEGvMs.js +56 -0
  305. package/bundled-test-harness/assets/pane-PYdezM7g.js +330 -0
  306. package/bundled-test-harness/assets/panel-7FDqkxrr.js +474 -0
  307. package/bundled-test-harness/assets/panel-C3E0s49q.js +3540 -0
  308. package/bundled-test-harness/assets/past-sessions-test-BsjEeoze.js +321 -0
  309. package/bundled-test-harness/assets/patch-fields-test-CsixJmSr.js +1014 -0
  310. package/bundled-test-harness/assets/patch-instance-test-CBDgTi0L.js +348 -0
  311. package/bundled-test-harness/assets/pdf-file-def-9VNjnqDa.js +76 -0
  312. package/bundled-test-harness/assets/pdf-meta-extractor-BF4e5kMR.js +156 -0
  313. package/bundled-test-harness/assets/pdf-meta-extractor-D8Bxh2cc.js +2 -0
  314. package/bundled-test-harness/assets/pdf-viewer-Bu413sN8.js +112 -0
  315. package/bundled-test-harness/assets/pdf-viewer-GKDi_xmf.js +2 -0
  316. package/bundled-test-harness/assets/percentage-TOr6qK2T.js +84 -0
  317. package/bundled-test-harness/assets/permission-checking-realm-test-BRNVYszm.js +306 -0
  318. package/bundled-test-harness/assets/phone-number-D5SR8nWu.js +236 -0
  319. package/bundled-test-harness/assets/phone-number-field-test-DffwtqGd.js +73 -0
  320. package/bundled-test-harness/assets/phone-number-hf_xIVGQ.js +2 -0
  321. package/bundled-test-harness/assets/plate-Vojc88hM.js +41 -0
  322. package/bundled-test-harness/assets/plate-dTUzEMj5.js +2 -0
  323. package/bundled-test-harness/assets/player-CmRw0uM5.js +82 -0
  324. package/bundled-test-harness/assets/player-Dt85lPZl.js +2 -0
  325. package/bundled-test-harness/assets/plural-field-components-test-DNpGuH1D.js +198 -0
  326. package/bundled-test-harness/assets/png-image-def-GY7gjqya.js +48 -0
  327. package/bundled-test-harness/assets/png-meta-extractor-4pI611re.js +2 -0
  328. package/bundled-test-harness/assets/png-meta-extractor-CHp_rpAi.js +111 -0
  329. package/bundled-test-harness/assets/policy-scoped-search-test-CipPu7tY.js +339 -0
  330. package/bundled-test-harness/assets/pptx-file-def-lBBiebvn.js +60 -0
  331. package/bundled-test-harness/assets/pptx-meta-extractor-BjJYWiOJ.js +77 -0
  332. package/bundled-test-harness/assets/pptx-meta-extractor-DbT-dPRg.js +2 -0
  333. package/bundled-test-harness/assets/prerender-persistence-block-test-ClHMVvJt.js +124 -0
  334. package/bundled-test-harness/assets/prerender-serialize-cycle-test-LdqaMTK8.js +134 -0
  335. package/bundled-test-harness/assets/preview-CYlam_aW.js +74 -0
  336. package/bundled-test-harness/assets/preview-format-CiSo4kEa.js +41 -0
  337. package/bundled-test-harness/assets/preview-format-test-MsB1TOLB.js +103 -0
  338. package/bundled-test-harness/assets/process-card-B3xBGkv1.js +2 -0
  339. package/bundled-test-harness/assets/process-card-DumVcx9E.js +114 -0
  340. package/bundled-test-harness/assets/process-card-test-C44H8yVy.js +94 -0
  341. package/bundled-test-harness/assets/profile-settings-modal-ipYzrVTz.js +708 -0
  342. package/bundled-test-harness/assets/progress-circle-DJ6WSO2E.js +95 -0
  343. package/bundled-test-harness/assets/progress-circle-q358_9Sn.js +2 -0
  344. package/bundled-test-harness/assets/quarter-BjO5DlU2.js +2 -0
  345. package/bundled-test-harness/assets/quarter-_D72FwfS.js +168 -0
  346. package/bundled-test-harness/assets/query-field-membership-status-test-CzDyfK49.js +323 -0
  347. package/bundled-test-harness/assets/query-field-page-optin-test-B-x3vsmC.js +126 -0
  348. package/bundled-test-harness/assets/query-field-schema-test-DFw6KuYv.js +231 -0
  349. package/bundled-test-harness/assets/query-field-stale-prerender-test-DSQ-cv_O.js +152 -0
  350. package/bundled-test-harness/assets/query-fields-test-DQiMFRCe.js +535 -0
  351. package/bundled-test-harness/assets/rail-CNspDFyn.js +44 -0
  352. package/bundled-test-harness/assets/rail-D2YcQ0VP.js +2 -0
  353. package/bundled-test-harness/assets/realm-82Z5RUM_.js +95 -0
  354. package/bundled-test-harness/assets/realm-config-SgrwqjRu.js +844 -0
  355. package/bundled-test-harness/assets/realm-config-policy-standing-test-C6sQNk2u.js +290 -0
  356. package/bundled-test-harness/assets/realm-config-routing-rule-edit-test-DcYXBlvi.js +274 -0
  357. package/bundled-test-harness/assets/realm-config-settings-test-DblJv06X.js +187 -0
  358. package/bundled-test-harness/assets/realm-dropdown-CDvL8k3B.js +560 -0
  359. package/bundled-test-harness/assets/realm-et890flh.js +2 -0
  360. package/bundled-test-harness/assets/realm-field-test-pBK_x-Xw.js +100 -0
  361. package/bundled-test-harness/assets/realm-indexing-test-DSFn2F8F.js +4380 -0
  362. package/bundled-test-harness/assets/realm-policy-test-DYnLqzTS.js +1141 -0
  363. package/bundled-test-harness/assets/realm-test-DOZT2EG5.js +2363 -0
  364. package/bundled-test-harness/assets/realm-url-tooltip-qaXTjRb-.js +56 -0
  365. package/bundled-test-harness/assets/realm-url-tooltip-test-DGTEeLH9.js +78 -0
  366. package/bundled-test-harness/assets/reasoning-test-BRkhvYjr.js +234 -0
  367. package/bundled-test-harness/assets/recent-colors-addon-BreXcpg8.js +2 -0
  368. package/bundled-test-harness/assets/recent-colors-addon-CmCkbJ2_.js +61 -0
  369. package/bundled-test-harness/assets/relationship-loading-state-test-B6UGYKzG.js +290 -0
  370. package/bundled-test-harness/assets/relative-time-BjHvL023.js +2 -0
  371. package/bundled-test-harness/assets/relative-time-ChYKOMIM.js +129 -0
  372. package/bundled-test-harness/assets/remix-card-test-CpV0kKfq.js +58 -0
  373. package/bundled-test-harness/assets/rendered-markdown-CJa7IzCC.js +263 -0
  374. package/bundled-test-harness/assets/rendered-markdown-test-CVKsHS4P.js +587 -0
  375. package/bundled-test-harness/assets/resident-instance-reuse-test-jQfW1NMn.js +82 -0
  376. package/bundled-test-harness/assets/response-field-B2-daCl2.js +38 -0
  377. package/bundled-test-harness/assets/result-tile-BSg4mzbc.js +140 -0
  378. package/bundled-test-harness/assets/rich-markdown-BtP1yamM.js +2 -0
  379. package/bundled-test-harness/assets/rich-markdown-C6rQUngb.js +218 -0
  380. package/bundled-test-harness/assets/rich-markdown-field-test-9yB6ykCe.js +1647 -0
  381. package/bundled-test-harness/assets/room-C7tKd02X.js +1008 -0
  382. package/bundled-test-harness/assets/room-message-test-DsMmRYpV.js +445 -0
  383. package/bundled-test-harness/assets/room-test-golI1H61.js +95 -0
  384. package/bundled-test-harness/assets/run-realm-code-CbXk6bnK.js +1600 -0
  385. package/bundled-test-harness/assets/run-realm-code-test-B9JeesaW.js +2468 -0
  386. package/bundled-test-harness/assets/schema-generation-test-uLLGm5Vh.js +28 -0
  387. package/bundled-test-harness/assets/score-BQhCQdUP.js +2 -0
  388. package/bundled-test-harness/assets/score-CoWEzENH.js +100 -0
  389. package/bundled-test-harness/assets/scrolling-test-WHWEkKeZ.js +384 -0
  390. package/bundled-test-harness/assets/search-BkQYpQDY.js +605 -0
  391. package/bundled-test-harness/assets/search-adorn-test-CW92JPOk.js +136 -0
  392. package/bundled-test-harness/assets/search-entries-BU4w6Ymc.js +472 -0
  393. package/bundled-test-harness/assets/search-entries-result-test-9eydsDtD.js +234 -0
  394. package/bundled-test-harness/assets/search-entries-test-ByUREx0G.js +1486 -0
  395. package/bundled-test-harness/assets/search-result-header-UFkdo0Bx.js +128 -0
  396. package/bundled-test-harness/assets/search-results-DrHTuVRZ.js +266 -0
  397. package/bundled-test-harness/assets/search-results-test-krtQQM57.js +578 -0
  398. package/bundled-test-harness/assets/search-selection-menu-test-DoqSbez7.js +108 -0
  399. package/bundled-test-harness/assets/search-sheet-persistence-test-4ZPaEY-y.js +131 -0
  400. package/bundled-test-harness/assets/search-test-BYpq32RM.js +2241 -0
  401. package/bundled-test-harness/assets/searchable-BXw4T11q.js +192 -0
  402. package/bundled-test-harness/assets/searchable-CVvPDA3Q.js +2 -0
  403. package/bundled-test-harness/assets/searchable-option-test-BhLFI4ei.js +322 -0
  404. package/bundled-test-harness/assets/searchable-search-doc-test-DrNLCF73.js +1271 -0
  405. package/bundled-test-harness/assets/secure-sign-in-VNQhe0ae.js +130 -0
  406. package/bundled-test-harness/assets/secure-sign-in-Za8PX9cD.css +24 -0
  407. package/bundled-test-harness/assets/secure-sign-in-aunWHCrB.js +73 -0
  408. package/bundled-test-harness/assets/secure-sign-in-test-BcY1TcNd.js +32 -0
  409. package/bundled-test-harness/assets/secure-sign-in-test-DRdz89BT.js +245 -0
  410. package/bundled-test-harness/assets/sending-test-mbHpGZUu.js +576 -0
  411. package/bundled-test-harness/assets/serialization-rri-form-audit-test-nypV9J82.js +136 -0
  412. package/bundled-test-harness/assets/serialization-test-aLwrFv4d.js +8758 -0
  413. package/bundled-test-harness/assets/setup-Dgn0s6Zk.js +772 -0
  414. package/bundled-test-harness/assets/shared-link-target-reuse-test-D9MR2UNc.js +207 -0
  415. package/bundled-test-harness/assets/show-card-Dwfk332M.js +67 -0
  416. package/bundled-test-harness/assets/show-card-test-CRPwwJvc.js +365 -0
  417. package/bundled-test-harness/assets/show-file-DLdFPHMR.js +34 -0
  418. package/bundled-test-harness/assets/signed-capture-DUR9PohQ.js +204 -0
  419. package/bundled-test-harness/assets/signed-capture-link-test-DfTAB6OT.js +132 -0
  420. package/bundled-test-harness/assets/single-stack-test-Crr_8nti.js +652 -0
  421. package/bundled-test-harness/assets/skill-DQ00VonZ.js +3 -0
  422. package/bundled-test-harness/assets/skill-reference-LEitQV9i.js +112 -0
  423. package/bundled-test-harness/assets/skill-yZXS1VHQ.js +76 -0
  424. package/bundled-test-harness/assets/skills-test-D3-C-Dbm.js +648 -0
  425. package/bundled-test-harness/assets/slider-picker-B6AxKL2j.js +245 -0
  426. package/bundled-test-harness/assets/slider-picker-C4Tc5o-s.js +2 -0
  427. package/bundled-test-harness/assets/spec-Cl_LB6nC.js +602 -0
  428. package/bundled-test-harness/assets/spinner-BHFM7zcR.js +39 -0
  429. package/bundled-test-harness/assets/spinner-DvAvsyDT.css +21 -0
  430. package/bundled-test-harness/assets/store-BV6WX8oV.js +2205 -0
  431. package/bundled-test-harness/assets/store-module-rebuild-test-HyphFJiF.js +454 -0
  432. package/bundled-test-harness/assets/store-search-test-nUeJ5opb.js +175 -0
  433. package/bundled-test-harness/assets/store-test-BebUIJAg.js +3460 -0
  434. package/bundled-test-harness/assets/string-BHZZwNlZ.js +9 -0
  435. package/bundled-test-harness/assets/submode-switcher-D-U9cXo0.js +169 -0
  436. package/bundled-test-harness/assets/svg-meta-extractor-BsG4w2nX.js +42 -0
  437. package/bundled-test-harness/assets/swatches-picker-4vFztxHo.js +33 -0
  438. package/bundled-test-harness/assets/swatches-picker-C7RE7uJ8.js +2 -0
  439. package/bundled-test-harness/assets/switch-submode-CuA0Zfjn.js +79 -0
  440. package/bundled-test-harness/assets/switch-submode-test-i1Qic_Cp.js +168 -0
  441. package/bundled-test-harness/assets/tag-CZNs3DPN.js +105 -0
  442. package/bundled-test-harness/assets/tests-BneuP252.js +3523 -0
  443. package/bundled-test-harness/assets/text-area-DAShQQBe.js +9 -0
  444. package/bundled-test-harness/assets/text-file-def-D2Rs6nS1.js +151 -0
  445. package/bundled-test-harness/assets/text-input-validator-test-C9IG-1GZ.js +156 -0
  446. package/bundled-test-harness/assets/theme-Dm8LWaRK.js +9 -0
  447. package/bundled-test-harness/assets/theme-card-test-Cbb6tAap.js +621 -0
  448. package/bundled-test-harness/assets/theme-scheme-island-test-DOVLakx3.js +264 -0
  449. package/bundled-test-harness/assets/three-d-model-def-DWSPQGgD.js +70 -0
  450. package/bundled-test-harness/assets/time--_Txqya1.js +126 -0
  451. package/bundled-test-harness/assets/time-DKD7Bdjd.js +2 -0
  452. package/bundled-test-harness/assets/time-slots-BZaugjq_.js +2 -0
  453. package/bundled-test-harness/assets/time-slots-C85M0rWl.js +85 -0
  454. package/bundled-test-harness/assets/timeline-B3KGDm3M.js +2 -0
  455. package/bundled-test-harness/assets/timeline-BMwgaZZu.js +59 -0
  456. package/bundled-test-harness/assets/to-device-streaming-test-CMp5bFiz.js +163 -0
  457. package/bundled-test-harness/assets/token-usage-test-CXA0b8Ep.js +166 -0
  458. package/bundled-test-harness/assets/tool-field-BGLelnsr.js +94 -0
  459. package/bundled-test-harness/assets/tool-field-BOFuDDt3.js +2 -0
  460. package/bundled-test-harness/assets/tools-CTjy7Aub.js +725 -0
  461. package/bundled-test-harness/assets/tools-calling-test--JR-7AK7.js +200 -0
  462. package/bundled-test-harness/assets/tools-test-6yAW3W5I.js +2820 -0
  463. package/bundled-test-harness/assets/tools-test-DhpMUQkz.js +1624 -0
  464. package/bundled-test-harness/assets/ts-file-def-CDbf8aw2.js +159 -0
  465. package/bundled-test-harness/assets/update-room-skills-test-DoKsS_1C.js +240 -0
  466. package/bundled-test-harness/assets/url-D0ooeJxC.js +2 -0
  467. package/bundled-test-harness/assets/url-mFskVPSX.js +96 -0
  468. package/bundled-test-harness/assets/video-file-def-AcmWqzev.js +76 -0
  469. package/bundled-test-harness/assets/wav-meta-extractor-CbTLruQf.js +368 -0
  470. package/bundled-test-harness/assets/webm-meta-extractor-C9JH-CMX.js +178 -0
  471. package/bundled-test-harness/assets/webp-meta-extractor-C6sHm4J7.js +98 -0
  472. package/bundled-test-harness/assets/website-Bxuk_OmR.js +92 -0
  473. package/bundled-test-harness/assets/week-Bxssxce7.js +2 -0
  474. package/bundled-test-harness/assets/week-DQLj9974.js +111 -0
  475. package/bundled-test-harness/assets/welcome-to-boxel-BH82RsW5.js +172 -0
  476. package/bundled-test-harness/assets/workspace-DJ_s2x4g.js +614 -0
  477. package/bundled-test-harness/assets/workspace-a11y-test-BJbZNgoP.js +197 -0
  478. package/bundled-test-harness/assets/workspace-behavior-test-BLBARTfb.js +200 -0
  479. package/bundled-test-harness/assets/workspace-chooser-BpmlVrVn.js +2219 -0
  480. package/bundled-test-harness/assets/workspace-chooser-CqLR2Dzh.css +1296 -0
  481. package/bundled-test-harness/assets/workspace-chooser-catalog-order-test-CmAVNAWC.js +36 -0
  482. package/bundled-test-harness/assets/workspace-chooser-unreachable-notice-test-DEfG7Uh9.js +60 -0
  483. package/bundled-test-harness/assets/workspace-delete-multiple-test-DE7Z8ooj.js +212 -0
  484. package/bundled-test-harness/assets/workspace-delete-summary-test-CwtG_zLH.js +63 -0
  485. package/bundled-test-harness/assets/workspace-timestamp-labels-test-DFAaRmJW.js +58 -0
  486. package/bundled-test-harness/assets/xlsx-file-def-DcvaRYnZ.js +60 -0
  487. package/bundled-test-harness/assets/xlsx-meta-extractor-0RlViVaf.js +101 -0
  488. package/bundled-test-harness/assets/xlsx-meta-extractor-BH30Vuem.js +2 -0
  489. package/bundled-test-harness/assets/year-B_MBk_hE.js +78 -0
  490. package/bundled-test-harness/assets/year-hSpccI9L.js +2 -0
  491. package/bundled-test-harness/assets/zip-file-def-c84iddi9.js +288 -0
  492. package/bundled-test-harness/index.html +78 -68
  493. package/bundled-test-harness/tests/index.html +78 -68
  494. package/bundled-types/host-app/components/matrix/account-switch-failed.gts +2 -2
  495. package/bundled-types/host-app/components/matrix/auth.gts +2 -2
  496. package/bundled-types/host-app/components/matrix/cli-auth.gts +7 -6
  497. package/bundled-types/host-app/components/matrix/forgot-password.gts +43 -129
  498. package/bundled-types/host-app/components/matrix/login.gts +15 -118
  499. package/bundled-types/host-app/components/matrix/register-user.gts +45 -226
  500. package/bundled-types/host-app/components/matrix/secure-sign-in.gts +235 -0
  501. package/bundled-types/host-app/components/operator-mode/container.gts +13 -1
  502. package/bundled-types/host-app/components/operator-mode/profile-info-popover.gts +1 -1
  503. package/bundled-types/host-app/config/environment.ts +1 -1
  504. package/bundled-types/host-app/lib/secure-sign-in.ts +130 -0
  505. package/bundled-types/host-app/services/matrix-service.ts +46 -0
  506. package/bundled-types/host-app/services/monaco-service.ts +0 -5
  507. package/bundled-types/host-app/utils/login-token.ts +23 -10
  508. package/dist/api.js +1 -1
  509. package/dist/index.js +289 -285
  510. package/package.json +1 -1
  511. package/src/build-program.ts +6 -2
  512. package/src/commands/profile.ts +72 -3
  513. package/src/lib/profile-manager.ts +5 -1
  514. package/src/lib/secure-session.ts +29 -0
  515. package/src/lib/sso-login.ts +94 -15
  516. package/bundled-test-harness/assets/account-switch-failed-B3pr_iC3.js +0 -32
  517. package/bundled-test-harness/assets/account-switch-failed-DTGZZo-G.css +0 -61
  518. package/bundled-test-harness/assets/account-switch-failed-test-9ENVgvlx.js +0 -45
  519. package/bundled-test-harness/assets/add-workspace-BAbk0250.js +0 -141
  520. package/bundled-test-harness/assets/add-workspace-test-ChAja_t-.js +0 -72
  521. package/bundled-test-harness/assets/advanced-color-picker-C-xBFJ2S.js +0 -504
  522. package/bundled-test-harness/assets/advanced-color-picker-bWAmCT-8.js +0 -2
  523. package/bundled-test-harness/assets/ai-assistant-test-BJ9yetuC.js +0 -2211
  524. package/bundled-test-harness/assets/ai-module-creation-test-Bw3TKS9d.js +0 -151
  525. package/bundled-test-harness/assets/aibot-message-DkgHT6eJ.js +0 -465
  526. package/bundled-test-harness/assets/app-DW5QjtRp.js +0 -22816
  527. package/bundled-test-harness/assets/app-yCDjO4mk.css +0 -2718
  528. package/bundled-test-harness/assets/audio-file-def-bJ3cXVmC.js +0 -133
  529. package/bundled-test-harness/assets/avif-meta-extractor-CrSDfYEt.js +0 -162
  530. package/bundled-test-harness/assets/base64-image-C7UBjK5W.js +0 -262
  531. package/bundled-test-harness/assets/base64-image-CjWpxROT.js +0 -2
  532. package/bundled-test-harness/assets/big-integer-BBql7oGZ.js +0 -89
  533. package/bundled-test-harness/assets/big-integer-B_TrzRy_.js +0 -2
  534. package/bundled-test-harness/assets/binary-upload-dedupe-test-BiX8kS7D.js +0 -308
  535. package/bundled-test-harness/assets/boolean-9LNUUTfw.js +0 -2
  536. package/bundled-test-harness/assets/boolean-BAmK01TF.js +0 -94
  537. package/bundled-test-harness/assets/brand-functional-palette-CFuoS-LS.js +0 -137
  538. package/bundled-test-harness/assets/brand-logo-By89eknI.js +0 -295
  539. package/bundled-test-harness/assets/broken-link-template-test-odBriDSP.js +0 -192
  540. package/bundled-test-harness/assets/bundled-base-CLQkkmN4.js +0 -254
  541. package/bundled-test-harness/assets/bundled-base-modules-test-BYrTaTwa.js +0 -54
  542. package/bundled-test-harness/assets/buried-stack-item-scroll-test-DU4bM5nd.js +0 -236
  543. package/bundled-test-harness/assets/bxl-expression-test-Cs9JaZbC.js +0 -250
  544. package/bundled-test-harness/assets/can-invoke-test-ccMc06BU.js +0 -401
  545. package/bundled-test-harness/assets/card-api-Bn65NUT0.js +0 -8
  546. package/bundled-test-harness/assets/card-api-test-COrFXu2i.js +0 -198
  547. package/bundled-test-harness/assets/card-api-u1pOrwS6.js +0 -4393
  548. package/bundled-test-harness/assets/card-basics-test-D4rn3iN-.js +0 -5364
  549. package/bundled-test-harness/assets/card-chooser-paging-test-bZhdrUXt.js +0 -235
  550. package/bundled-test-harness/assets/card-chooser-test-D9w1duob.js +0 -393
  551. package/bundled-test-harness/assets/card-collection-ClCV-__1.js +0 -118
  552. package/bundled-test-harness/assets/card-context-search-results-H_rN3Upz.js +0 -30
  553. package/bundled-test-harness/assets/card-context-search-results-test-jciyaouV.js +0 -184
  554. package/bundled-test-harness/assets/card-def-field-def-relationships-test-BVZoQzM8.js +0 -562
  555. package/bundled-test-harness/assets/card-delete-test-CuLcZFnY.js +0 -466
  556. package/bundled-test-harness/assets/card-error-DIOivSkD.js +0 -72
  557. package/bundled-test-harness/assets/card-error-awaiting-index-test-JMwcRONq.js +0 -53
  558. package/bundled-test-harness/assets/card-error-detail-96jWBx6B.js +0 -271
  559. package/bundled-test-harness/assets/card-info-BxPtwG1h.js +0 -2
  560. package/bundled-test-harness/assets/card-list-B34qY3io.js +0 -2
  561. package/bundled-test-harness/assets/card-list-BpCaKkZJ.js +0 -202
  562. package/bundled-test-harness/assets/card-resource-DcPbIwH9.js +0 -86
  563. package/bundled-test-harness/assets/cards-grid-CTN8nBT_.js +0 -344
  564. package/bundled-test-harness/assets/cards-grid-Cx44vL-M.js +0 -2
  565. package/bundled-test-harness/assets/cards-grid-layout-BdL0Uzxl.js +0 -111
  566. package/bundled-test-harness/assets/cards-grid-layout-Dn8Yb4ma.js +0 -2
  567. package/bundled-test-harness/assets/check-correctness-test-BfMV-MC0.js +0 -554
  568. package/bundled-test-harness/assets/clip-CK6mVuyN.js +0 -92
  569. package/bundled-test-harness/assets/clip-CfXD1JTr.js +0 -2
  570. package/bundled-test-harness/assets/code-ref-85Bih6Zl.js +0 -138
  571. package/bundled-test-harness/assets/code-ref-DATHaoyt.js +0 -2
  572. package/bundled-test-harness/assets/code-submode-availability-test-DLYlx0wo.js +0 -198
  573. package/bundled-test-harness/assets/code-submode-test-CDIi7MjD.js +0 -1824
  574. package/bundled-test-harness/assets/codeblocks-test-CNPyTvuv.js +0 -418
  575. package/bundled-test-harness/assets/codemirror-editor-BPOPTR-f.js +0 -2
  576. package/bundled-test-harness/assets/codemirror-editor-DPhG0pec.js +0 -701
  577. package/bundled-test-harness/assets/codemirror-embed-toolbar-test-Dk5lFOUq.js +0 -366
  578. package/bundled-test-harness/assets/color-BxN5gRSg.js +0 -65
  579. package/bundled-test-harness/assets/color-CrunRcis.js +0 -2
  580. package/bundled-test-harness/assets/color-field-test-COjFIpXV.js +0 -212
  581. package/bundled-test-harness/assets/color-picker-field-C-GS1CIw.js +0 -139
  582. package/bundled-test-harness/assets/color-picker-field-D3RXhbCK.js +0 -2
  583. package/bundled-test-harness/assets/color-wheel-picker-Bz8cBmf4.js +0 -283
  584. package/bundled-test-harness/assets/color-wheel-picker-DrwPrB8B.js +0 -2
  585. package/bundled-test-harness/assets/command-data-BxXgtNBf.js +0 -2
  586. package/bundled-test-harness/assets/command-data-ZdkcpEgG.js +0 -95
  587. package/bundled-test-harness/assets/compaction-test-DS7DTGT_.js +0 -150
  588. package/bundled-test-harness/assets/components-CbCTWAON.js +0 -17777
  589. package/bundled-test-harness/assets/computed-test-D_OrXDtR.js +0 -1320
  590. package/bundled-test-harness/assets/container-DDolu1gk.js +0 -11109
  591. package/bundled-test-harness/assets/container-DndcCIMv.css +0 -5169
  592. package/bundled-test-harness/assets/contains-many-component-BtgnAXih.js +0 -2
  593. package/bundled-test-harness/assets/contrast-checker-addon-kwtLKWdL.js +0 -2
  594. package/bundled-test-harness/assets/contrast-checker-addon-zFY5cen1.js +0 -71
  595. package/bundled-test-harness/assets/convert-to-class-name-test-BcGWl2K1.js +0 -17
  596. package/bundled-test-harness/assets/coordinate-D72EF1Pl.js +0 -48
  597. package/bundled-test-harness/assets/copy-file-to-realm-test-CYoDX4YV.js +0 -148
  598. package/bundled-test-harness/assets/country-B-iIe5v8.js +0 -199
  599. package/bundled-test-harness/assets/create-file-modal-PpvMksjR.js +0 -570
  600. package/bundled-test-harness/assets/create-listing-modal-test-CQtEf_UD.js +0 -273
  601. package/bundled-test-harness/assets/create-listing-pr-request-test-CDtKWyfk.js +0 -117
  602. package/bundled-test-harness/assets/create-spec-test-Cbqk8I9T.js +0 -256
  603. package/bundled-test-harness/assets/create-specs-CZg2cpnh.js +0 -215
  604. package/bundled-test-harness/assets/create-submission-workflow-test-CYrxF7bg.js +0 -132
  605. package/bundled-test-harness/assets/credential-fields-test-Di4jCJgU.js +0 -157
  606. package/bundled-test-harness/assets/css-value-CceJyI5o.js +0 -48
  607. package/bundled-test-harness/assets/csv-file-def-DJL2aZI9.js +0 -277
  608. package/bundled-test-harness/assets/currency-Bn5WIqzF.js +0 -134
  609. package/bundled-test-harness/assets/date-XI2CVYA2.js +0 -2
  610. package/bundled-test-harness/assets/date-h83UJcFR.js +0 -183
  611. package/bundled-test-harness/assets/date-time-fields-test-Cterr2mj.js +0 -359
  612. package/bundled-test-harness/assets/datetime-DadI80tC.js +0 -201
  613. package/bundled-test-harness/assets/datetime-Dpb_Sejj.js +0 -2
  614. package/bundled-test-harness/assets/datetime-stamp-C4vv397u.js +0 -81
  615. package/bundled-test-harness/assets/datetime-stamp-DIsJdQux.js +0 -2
  616. package/bundled-test-harness/assets/day-C4pZoGNM.js +0 -113
  617. package/bundled-test-harness/assets/day-D0goBhKb.js +0 -2
  618. package/bundled-test-harness/assets/debug-message-test-CV0sj-fl.js +0 -117
  619. package/bundled-test-harness/assets/dist-CAIttNZm.js +0 -1710
  620. package/bundled-test-harness/assets/dist-CLbqnmnm.js +0 -389
  621. package/bundled-test-harness/assets/dist-qkBOmIQy.js +0 -323
  622. package/bundled-test-harness/assets/docx-file-def-hz2tVQKf.js +0 -60
  623. package/bundled-test-harness/assets/docx-meta-extractor-CeRshlxL.js +0 -60
  624. package/bundled-test-harness/assets/docx-meta-extractor-muK5CKF3.js +0 -2
  625. package/bundled-test-harness/assets/duration-BYx1dLfm.js +0 -2
  626. package/bundled-test-harness/assets/duration-FAmTFeUa.js +0 -184
  627. package/bundled-test-harness/assets/email-D-bFy_C1.js +0 -80
  628. package/bundled-test-harness/assets/email-field-test-CY9K2zur.js +0 -75
  629. package/bundled-test-harness/assets/email-j4DZNH2-.js +0 -2
  630. package/bundled-test-harness/assets/enum-B7_baAn_.js +0 -167
  631. package/bundled-test-harness/assets/enum-BQqNzVQS.js +0 -2
  632. package/bundled-test-harness/assets/enum-field-test-BJ9Epz15.js +0 -953
  633. package/bundled-test-harness/assets/error-display-test-CbDWjJ2F.js +0 -343
  634. package/bundled-test-harness/assets/ethereum-address-BOLEnKsm.js +0 -78
  635. package/bundled-test-harness/assets/ethereum-address-s3Kvb2wG.js +0 -2
  636. package/bundled-test-harness/assets/expiration-warning-BaIP1MOZ.js +0 -2
  637. package/bundled-test-harness/assets/expiration-warning-gjEtxPk0.js +0 -90
  638. package/bundled-test-harness/assets/externals-Bih8ejPS.js +0 -4393
  639. package/bundled-test-harness/assets/fallback-banner-MlImHjSD.js +0 -24
  640. package/bundled-test-harness/assets/fallback-banner-live-delete-test-Bm7IKXPf.js +0 -207
  641. package/bundled-test-harness/assets/fallback-banner-test-C7TGA0Ob.js +0 -53
  642. package/bundled-test-harness/assets/fallback-banner-test-lvuaVRXu.js +0 -225
  643. package/bundled-test-harness/assets/fallback-models-test-Dy7iIKUS.js +0 -161
  644. package/bundled-test-harness/assets/field-component-DBoOxTke.js +0 -2
  645. package/bundled-test-harness/assets/field-configuration-test-DnAnzyC-.js +0 -548
  646. package/bundled-test-harness/assets/field-edit-DdJ8Akso.js +0 -2
  647. package/bundled-test-harness/assets/field-edit-XAop92l8.js +0 -36
  648. package/bundled-test-harness/assets/field-markdown-domain-test-cZCqbcjj.js +0 -616
  649. package/bundled-test-harness/assets/field-markdown-oversize-test-BuATetVz.js +0 -88
  650. package/bundled-test-harness/assets/field-markdown-primitives-test-BsubQfhv.js +0 -365
  651. package/bundled-test-harness/assets/field-markdown-specialized-test-4eNLiYpF.js +0 -534
  652. package/bundled-test-harness/assets/field-test-helpers-9I7cHnaU.js +0 -45
  653. package/bundled-test-harness/assets/file-api-CC86I7Er.js +0 -7
  654. package/bundled-test-harness/assets/file-attachment-test-o9191GMb.js +0 -796
  655. package/bundled-test-harness/assets/file-chooser-panel-test-C8aZuJlk.js +0 -153
  656. package/bundled-test-harness/assets/file-chooser-test-B0Tn8CCR.js +0 -504
  657. package/bundled-test-harness/assets/file-def-edit-BSiF2Lje.js +0 -2
  658. package/bundled-test-harness/assets/file-def-edit-C5TYBp_q.js +0 -26
  659. package/bundled-test-harness/assets/file-def-embedded-BLVTCiVB.js +0 -2
  660. package/bundled-test-harness/assets/file-def-embedded-Bep4iD6s.js +0 -38
  661. package/bundled-test-harness/assets/file-def-fitted-BTs-AS78.js +0 -2
  662. package/bundled-test-harness/assets/file-def-fitted-DcPitdYu.js +0 -38
  663. package/bundled-test-harness/assets/file-def-isolated-Kg1YVhm-.js +0 -38
  664. package/bundled-test-harness/assets/file-def-isolated-tK5JWCam.js +0 -2
  665. package/bundled-test-harness/assets/file-def-serialization-test-D4wnd5XK.js +0 -89
  666. package/bundled-test-harness/assets/file-menu-items-CH4-naSK.js +0 -117
  667. package/bundled-test-harness/assets/file-menu-items-emUxx3ZI.js +0 -2
  668. package/bundled-test-harness/assets/file-preview-stage-B1McIWwu.js +0 -2
  669. package/bundled-test-harness/assets/file-preview-stage-BgZLNMN4.js +0 -72
  670. package/bundled-test-harness/assets/file-shell-embedded-BmfuwWfU.js +0 -2
  671. package/bundled-test-harness/assets/file-shell-embedded-zh8CJanA.js +0 -68
  672. package/bundled-test-harness/assets/file-shell-fitted-DSFUNRGJ.js +0 -2
  673. package/bundled-test-harness/assets/file-shell-fitted-DXKDH0fn.js +0 -98
  674. package/bundled-test-harness/assets/file-shell-isolated-0F1MFv4q.js +0 -2
  675. package/bundled-test-harness/assets/file-shell-isolated-DduZZzmi.js +0 -195
  676. package/bundled-test-harness/assets/file-tree-from-index-BzDvvUHy.js +0 -151
  677. package/bundled-test-harness/assets/file-tree-from-index-test-D0hfI4a1.js +0 -96
  678. package/bundled-test-harness/assets/film-BN_HVXBU.js +0 -13
  679. package/bundled-test-harness/assets/film-CKkbUi0L.js +0 -2
  680. package/bundled-test-harness/assets/film-CMNJITZ-.js +0 -4074
  681. package/bundled-test-harness/assets/fitted-CAvdcKpu.js +0 -34
  682. package/bundled-test-harness/assets/fitted-CbKOwd1u.js +0 -2
  683. package/bundled-test-harness/assets/flac-meta-extractor-e8qajPSl.js +0 -99
  684. package/bundled-test-harness/assets/font-file-def-9atde5W8.js +0 -64
  685. package/bundled-test-harness/assets/font-meta-extractor-IralDC8M.js +0 -303
  686. package/bundled-test-harness/assets/font-meta-extractor-zPBVOfoR.js +0 -2
  687. package/bundled-test-harness/assets/formatted-aibot-message-test-CWOiZUng.js +0 -109
  688. package/bundled-test-harness/assets/from-elsewhere-ChxbtsBa.js +0 -131
  689. package/bundled-test-harness/assets/frontmatter-field-cdig7KR9.js +0 -41
  690. package/bundled-test-harness/assets/garbage-collection-test-Dg-ww_Sb.js +0 -403
  691. package/bundled-test-harness/assets/gauge-B45nLOGe.js +0 -106
  692. package/bundled-test-harness/assets/gauge-BK-768BM.js +0 -2
  693. package/bundled-test-harness/assets/general-test-D7cn7PUr.js +0 -926
  694. package/bundled-test-harness/assets/get-relationship-membership-state-test-Skmj9V6y.js +0 -1308
  695. package/bundled-test-harness/assets/gif-meta-extractor-BychhK9q.js +0 -114
  696. package/bundled-test-harness/assets/glimmer-motion-and-choreo-in-cards-test-C09YUmk4.js +0 -160
  697. package/bundled-test-harness/assets/glimmer-motion-and-choreo-test-DYskx_Kk.js +0 -74
  698. package/bundled-test-harness/assets/helper-BHX0HLF2.js +0 -478
  699. package/bundled-test-harness/assets/host-submode-test-Clw_QnvF.js +0 -1243
  700. package/bundled-test-harness/assets/html-file-def-C0P9giwU.js +0 -82
  701. package/bundled-test-harness/assets/hydratable-card-DnjrxKsT.js +0 -147
  702. package/bundled-test-harness/assets/hydratable-card-test-BAmWHfv1.js +0 -426
  703. package/bundled-test-harness/assets/icons-DBXBZgLe.js +0 -894
  704. package/bundled-test-harness/assets/image-Cip6ojDd.js +0 -47
  705. package/bundled-test-harness/assets/image-file-def-BdQxjZcN.js +0 -65
  706. package/bundled-test-harness/assets/image-file-def-DP4aqWcS.js +0 -3
  707. package/bundled-test-harness/assets/index-changes-test-D8b_56Ke.js +0 -367
  708. package/bundled-test-harness/assets/index-query-engine-test-CCyaUwMX.js +0 -2593
  709. package/bundled-test-harness/assets/inspector-test-BJTVGdOO.js +0 -1930
  710. package/bundled-test-harness/assets/instance-filter-matcher-test-DjsPrXL7.js +0 -788
  711. package/bundled-test-harness/assets/interact-submode-creation-and-permissions-test-DSqM0vxh.js +0 -475
  712. package/bundled-test-harness/assets/interact-submode-setup-DF31UMX-.js +0 -566
  713. package/bundled-test-harness/assets/is-component-declaration-test-Did47eG9.js +0 -50
  714. package/bundled-test-harness/assets/iso-bmff-LuWkGL__.js +0 -205
  715. package/bundled-test-harness/assets/iso-bmff-_flO6c20.js +0 -2
  716. package/bundled-test-harness/assets/isolated-and-edit-frocLHin.js +0 -2
  717. package/bundled-test-harness/assets/job-priority-header-test-DHLAXfp7.js +0 -81
  718. package/bundled-test-harness/assets/job-scoped-instance-residency-test-C1Bt5j98.js +0 -103
  719. package/bundled-test-harness/assets/join-the-community-BBUSO2cs.js +0 -86
  720. package/bundled-test-harness/assets/jpg-meta-extractor-CoybO4Hq.js +0 -88
  721. package/bundled-test-harness/assets/json-field-8sdH5RQb.js +0 -2
  722. package/bundled-test-harness/assets/json-field-BDD3iTUh.js +0 -19
  723. package/bundled-test-harness/assets/json-file-def-BKibsfc6.js +0 -298
  724. package/bundled-test-harness/assets/last-modified-date-CR5jru2m.js +0 -43
  725. package/bundled-test-harness/assets/last-modified-date-test-jJ00YdTm.js +0 -28
  726. package/bundled-test-harness/assets/links-to-editor-rDoCYaN-.js +0 -2
  727. package/bundled-test-harness/assets/links-to-many-component-BqZT88Fb.js +0 -2
  728. package/bundled-test-harness/assets/linksto-broken-link-placeholder-test-Cp1Eb_4U.js +0 -398
  729. package/bundled-test-harness/assets/linksto-error-sentinel-test-Bddavnh_.js +0 -238
  730. package/bundled-test-harness/assets/linksto-many-broken-link-placeholder-test-c5WegXnR.js +0 -354
  731. package/bundled-test-harness/assets/linksto-many-per-slot-access-test-CWskzfGW.js +0 -303
  732. package/bundled-test-harness/assets/linksto-sentinel-reload-test-ByeVNhr8.js +0 -197
  733. package/bundled-test-harness/assets/linksto-sentinel-roundtrip-test-DP26i6Gb.js +0 -260
  734. package/bundled-test-harness/assets/linksto-singular-js-access-contract-test-fDUXx8tO.js +0 -196
  735. package/bundled-test-harness/assets/llm-model-BcLEkTV7.js +0 -64
  736. package/bundled-test-harness/assets/login-CeuuNVvU.css +0 -139
  737. package/bundled-test-harness/assets/login-DV0WlJv-.js +0 -348
  738. package/bundled-test-harness/assets/login-error-text-test-BMGY_9gW.js +0 -51
  739. package/bundled-test-harness/assets/login-test-CL9YpMH5.js +0 -246
  740. package/bundled-test-harness/assets/m4a-meta-extractor-CHO1JQtb.js +0 -204
  741. package/bundled-test-harness/assets/main-CPLT8JNu.js +0 -5
  742. package/bundled-test-harness/assets/markdown-BvBALLGh.js +0 -7
  743. package/bundled-test-harness/assets/markdown-DFezmrFD.js +0 -2
  744. package/bundled-test-harness/assets/markdown-editor-mode-select-Au64bcIO.js +0 -2
  745. package/bundled-test-harness/assets/markdown-editor-mode-select-rK9PP8rv.js +0 -54
  746. package/bundled-test-harness/assets/markdown-embed-chooser-modal-test-CIxizf5k.js +0 -470
  747. package/bundled-test-harness/assets/markdown-embed-preview-pane-test-C7GoNN7l.js +0 -447
  748. package/bundled-test-harness/assets/markdown-embed-preview-test-CDnj4uhd.js +0 -368
  749. package/bundled-test-harness/assets/markdown-fallback-n7PsLNmO.js +0 -2
  750. package/bundled-test-harness/assets/markdown-fallback-test-DTHT6OwQ.js +0 -316
  751. package/bundled-test-harness/assets/markdown-highlighting-test-DJ-4WSE_.js +0 -244
  752. package/bundled-test-harness/assets/markdown-preview-Ccelx5W-.js +0 -64
  753. package/bundled-test-harness/assets/markdown-preview-JXuMC_ve.js +0 -72
  754. package/bundled-test-harness/assets/markdown-preview-test-ByZqrpPk.js +0 -238
  755. package/bundled-test-harness/assets/markdown-skill-frontmatter-test-DAHGeL4K.js +0 -146
  756. package/bundled-test-harness/assets/menu-items-DzJm9H_H.js +0 -2
  757. package/bundled-test-harness/assets/message-tool-test-lmdrIEdY.js +0 -33
  758. package/bundled-test-harness/assets/metadata-fields-BZZr4Qe5.js +0 -2
  759. package/bundled-test-harness/assets/metadata-fields-BtdjGsKE.js +0 -1415
  760. package/bundled-test-harness/assets/midi-audio-def-uYbYFmFi.js +0 -52
  761. package/bundled-test-harness/assets/midi-meta-extractor-DNI5gc1q.js +0 -284
  762. package/bundled-test-harness/assets/midi-meta-extractor-DbKZ4fMG.js +0 -2
  763. package/bundled-test-harness/assets/migrate-skill-test-DI1xceiL.js +0 -161
  764. package/bundled-test-harness/assets/mini-CNoDyHqG.js +0 -1519
  765. package/bundled-test-harness/assets/mini-DexlIeKK.js +0 -85
  766. package/bundled-test-harness/assets/mini-card-chooser-test-DT5eIf1_.js +0 -272
  767. package/bundled-test-harness/assets/mini-file-chooser-test-DTQnKTZJ.js +0 -201
  768. package/bundled-test-harness/assets/missing-template-DL2mwddM.js +0 -2
  769. package/bundled-test-harness/assets/missing-template-ltqlJ4JC.js +0 -48
  770. package/bundled-test-harness/assets/modal-container-DRnt95-S.js +0 -40
  771. package/bundled-test-harness/assets/modal-zE95eEFp.js +0 -322
  772. package/bundled-test-harness/assets/model-cost-tier-test-CcFz7hcv.js +0 -173
  773. package/bundled-test-harness/assets/module-contents-service-Dk_zWt-V.js +0 -256
  774. package/bundled-test-harness/assets/month-BqReBYWo.js +0 -2
  775. package/bundled-test-harness/assets/month-RhvmIp40.js +0 -123
  776. package/bundled-test-harness/assets/month-day-XFAQA72z.js +0 -2
  777. package/bundled-test-harness/assets/month-day-XzKpk6nz.js +0 -192
  778. package/bundled-test-harness/assets/month-year-BeuNr2Cl.js +0 -2
  779. package/bundled-test-harness/assets/month-year-DhU7hATV.js +0 -93
  780. package/bundled-test-harness/assets/mp3-meta-extractor-Dx2RnJc5.js +0 -476
  781. package/bundled-test-harness/assets/mp4-meta-extractor--k0m8KsT.js +0 -188
  782. package/bundled-test-harness/assets/multiple-stacks-test-bC24IWcJ.js +0 -208
  783. package/bundled-test-harness/assets/nested-query-field-render-test-qxElXx1e.js +0 -249
  784. package/bundled-test-harness/assets/no-stacks-test-Br7IGAgV.js +0 -48
  785. package/bundled-test-harness/assets/number-73SsCMEF.js +0 -3
  786. package/bundled-test-harness/assets/number-CicTBWQd.js +0 -151
  787. package/bundled-test-harness/assets/number-field-test-kV5zXo1J.js +0 -184
  788. package/bundled-test-harness/assets/number-input-CQy4xUeA.js +0 -82
  789. package/bundled-test-harness/assets/office-extract-Bo8sbNkK.js +0 -27
  790. package/bundled-test-harness/assets/office-extract-CfBaoRMD.js +0 -2
  791. package/bundled-test-harness/assets/ogg-meta-extractor-aIf5q_Rq.js +0 -225
  792. package/bundled-test-harness/assets/on-key-C8acaldQ.js +0 -472
  793. package/bundled-test-harness/assets/ooxml-Bu3iZezv.js +0 -172
  794. package/bundled-test-harness/assets/ooxml-jQPBQK25.js +0 -2
  795. package/bundled-test-harness/assets/open-image-in-new-tab-test-CP7q3kMm.js +0 -52
  796. package/bundled-test-harness/assets/operation-lowering-test-9Mdr0hRT.js +0 -2812
  797. package/bundled-test-harness/assets/operations-R9b661Qn.js +0 -3
  798. package/bundled-test-harness/assets/operations-Zv_V3Api.js +0 -766
  799. package/bundled-test-harness/assets/operations-invocation-test-BJPpWb2H.js +0 -523
  800. package/bundled-test-harness/assets/operations-query-test-DufdmPQF.js +0 -459
  801. package/bundled-test-harness/assets/operations-test-CzT051YH.js +0 -2518
  802. package/bundled-test-harness/assets/operator-mode-acceptance-test-ByOIOcD0.js +0 -1188
  803. package/bundled-test-harness/assets/operator-mode-card-chooser-test-CNhR9mvv.js +0 -1036
  804. package/bundled-test-harness/assets/operator-mode-links-test-CuxSVTPR.js +0 -793
  805. package/bundled-test-harness/assets/operator-mode-state-service-CCeHt5SH.js +0 -1275
  806. package/bundled-test-harness/assets/operator-mode-state-service-test-C8TI9WWg.js +0 -206
  807. package/bundled-test-harness/assets/operator-mode-test-DG-mG8Tn.js +0 -683
  808. package/bundled-test-harness/assets/operator-mode-ui-test-DB7xhjS0.js +0 -1027
  809. package/bundled-test-harness/assets/overlay-menu-items-test-C6rcdF_S.js +0 -317
  810. package/bundled-test-harness/assets/overlays-D2zmPxzK.js +0 -270
  811. package/bundled-test-harness/assets/overlays-clip-test-Clpq3JzQ.js +0 -91
  812. package/bundled-test-harness/assets/overlays-detached-element-test-BtsTeJch.js +0 -56
  813. package/bundled-test-harness/assets/pane-f-IYhcWT.js +0 -330
  814. package/bundled-test-harness/assets/panel-B3PCSBbf.js +0 -3540
  815. package/bundled-test-harness/assets/panel-Ban7zCBP.js +0 -474
  816. package/bundled-test-harness/assets/past-sessions-test-uM2m-oKV.js +0 -321
  817. package/bundled-test-harness/assets/patch-fields-test-COPjDhnt.js +0 -1014
  818. package/bundled-test-harness/assets/patch-instance-test-CRb3dfby.js +0 -348
  819. package/bundled-test-harness/assets/pdf-file-def-J_yOUU8_.js +0 -76
  820. package/bundled-test-harness/assets/pdf-meta-extractor-83T5Bdo7.js +0 -156
  821. package/bundled-test-harness/assets/pdf-meta-extractor-INFIklMy.js +0 -2
  822. package/bundled-test-harness/assets/pdf-viewer-B4rRluWA.js +0 -2
  823. package/bundled-test-harness/assets/pdf-viewer-vYem8ozk.js +0 -112
  824. package/bundled-test-harness/assets/percentage-ChagfNRG.js +0 -84
  825. package/bundled-test-harness/assets/permission-checking-realm-test-Dmb2a428.js +0 -306
  826. package/bundled-test-harness/assets/phone-number-BiD2eaSd.js +0 -236
  827. package/bundled-test-harness/assets/phone-number-C-wt4_UK.js +0 -2
  828. package/bundled-test-harness/assets/phone-number-field-test-BHzAmuBP.js +0 -73
  829. package/bundled-test-harness/assets/plate-CqN2nM6P.js +0 -41
  830. package/bundled-test-harness/assets/plate-DaIfpORN.js +0 -2
  831. package/bundled-test-harness/assets/player-CGt5fTd5.js +0 -2
  832. package/bundled-test-harness/assets/player-CN0l44LK.js +0 -82
  833. package/bundled-test-harness/assets/plural-field-components-test-CO2g2opW.js +0 -198
  834. package/bundled-test-harness/assets/png-image-def-B_oou2wS.js +0 -48
  835. package/bundled-test-harness/assets/png-meta-extractor-BfPz1qP_.js +0 -2
  836. package/bundled-test-harness/assets/png-meta-extractor-C8ai8sPw.js +0 -111
  837. package/bundled-test-harness/assets/policy-scoped-search-test-BRRp2a1A.js +0 -339
  838. package/bundled-test-harness/assets/pptx-file-def-C3qYEHDM.js +0 -60
  839. package/bundled-test-harness/assets/pptx-meta-extractor-8IuoBq4I.js +0 -77
  840. package/bundled-test-harness/assets/pptx-meta-extractor-BPhy9RMM.js +0 -2
  841. package/bundled-test-harness/assets/prerender-persistence-block-test-Cteb_Rs_.js +0 -124
  842. package/bundled-test-harness/assets/prerender-serialize-cycle-test-CH7b6Ra9.js +0 -134
  843. package/bundled-test-harness/assets/preview-CmERZpI6.js +0 -74
  844. package/bundled-test-harness/assets/preview-format-BPMlCSbb.js +0 -41
  845. package/bundled-test-harness/assets/preview-format-test-B7sA8fbZ.js +0 -103
  846. package/bundled-test-harness/assets/process-card-CtDzDB-_.js +0 -2
  847. package/bundled-test-harness/assets/process-card-erbWKY5h.js +0 -114
  848. package/bundled-test-harness/assets/process-card-test-DXOt1jDW.js +0 -94
  849. package/bundled-test-harness/assets/profile-settings-modal-11BrR058.js +0 -708
  850. package/bundled-test-harness/assets/progress-circle-Cd79Zqh2.js +0 -2
  851. package/bundled-test-harness/assets/progress-circle-sc-W5aUl.js +0 -95
  852. package/bundled-test-harness/assets/quarter-B61kCpcD.js +0 -168
  853. package/bundled-test-harness/assets/quarter-d5jkTzcz.js +0 -2
  854. package/bundled-test-harness/assets/query-field-membership-status-test-BmpVfohw.js +0 -323
  855. package/bundled-test-harness/assets/query-field-page-optin-test-9_Cce-OJ.js +0 -126
  856. package/bundled-test-harness/assets/query-field-schema-test-CwV7xanX.js +0 -231
  857. package/bundled-test-harness/assets/query-field-stale-prerender-test-RkdnZ-VV.js +0 -152
  858. package/bundled-test-harness/assets/query-fields-test-BLxYkTAM.js +0 -535
  859. package/bundled-test-harness/assets/rail-CFPU0tFe.js +0 -2
  860. package/bundled-test-harness/assets/rail-CQ53Dakr.js +0 -44
  861. package/bundled-test-harness/assets/realm-DdVH9lSZ.js +0 -95
  862. package/bundled-test-harness/assets/realm-DdsFw3b-.js +0 -2
  863. package/bundled-test-harness/assets/realm-config-DIslxoB7.js +0 -844
  864. package/bundled-test-harness/assets/realm-config-policy-standing-test-b4WxNDor.js +0 -290
  865. package/bundled-test-harness/assets/realm-config-routing-rule-edit-test-C-rcvkkD.js +0 -274
  866. package/bundled-test-harness/assets/realm-config-settings-test-DDUkM3zw.js +0 -187
  867. package/bundled-test-harness/assets/realm-dropdown-1j55Dy-1.js +0 -560
  868. package/bundled-test-harness/assets/realm-field-test-D-uEtFKO.js +0 -100
  869. package/bundled-test-harness/assets/realm-indexing-test-U9m0epR-.js +0 -4380
  870. package/bundled-test-harness/assets/realm-policy-test-DhKabhlk.js +0 -1141
  871. package/bundled-test-harness/assets/realm-test-BX6C9SS5.js +0 -2363
  872. package/bundled-test-harness/assets/realm-url-tooltip-BjjcKqBx.js +0 -56
  873. package/bundled-test-harness/assets/realm-url-tooltip-test-DW0ZwEEE.js +0 -78
  874. package/bundled-test-harness/assets/reasoning-test-BWT94KXG.js +0 -234
  875. package/bundled-test-harness/assets/recent-colors-addon-CfgmgilF.js +0 -61
  876. package/bundled-test-harness/assets/recent-colors-addon-D--Ry3Pf.js +0 -2
  877. package/bundled-test-harness/assets/relationship-loading-state-test-C5R6jao_.js +0 -290
  878. package/bundled-test-harness/assets/relative-time-Bq7pqums.js +0 -2
  879. package/bundled-test-harness/assets/relative-time-D0QyW4ig.js +0 -129
  880. package/bundled-test-harness/assets/remix-card-test-Cy0h3Xdf.js +0 -58
  881. package/bundled-test-harness/assets/rendered-markdown-Hw_EF8SO.js +0 -263
  882. package/bundled-test-harness/assets/rendered-markdown-test-CqeF-UZd.js +0 -587
  883. package/bundled-test-harness/assets/resident-instance-reuse-test-BiI6L40n.js +0 -82
  884. package/bundled-test-harness/assets/response-field-BCxG5phG.js +0 -38
  885. package/bundled-test-harness/assets/result-tile-DMzRnTP8.js +0 -140
  886. package/bundled-test-harness/assets/rich-markdown-C4RUl7L0.js +0 -2
  887. package/bundled-test-harness/assets/rich-markdown-DxQSCg-o.js +0 -218
  888. package/bundled-test-harness/assets/rich-markdown-field-test-B7wpedKs.js +0 -1647
  889. package/bundled-test-harness/assets/room-D0M0Zwrs.js +0 -1008
  890. package/bundled-test-harness/assets/room-message-test-BWWd4xC8.js +0 -445
  891. package/bundled-test-harness/assets/room-test-DFH-nOwi.js +0 -95
  892. package/bundled-test-harness/assets/run-realm-code-DyVyEDBl.js +0 -1600
  893. package/bundled-test-harness/assets/run-realm-code-test-BpxF-tOz.js +0 -2468
  894. package/bundled-test-harness/assets/schema-generation-test-DjaJqpYP.js +0 -28
  895. package/bundled-test-harness/assets/score-Cfp34BE7.js +0 -2
  896. package/bundled-test-harness/assets/score-DIWWpeyf.js +0 -100
  897. package/bundled-test-harness/assets/scrolling-test-hA_uBwBg.js +0 -384
  898. package/bundled-test-harness/assets/search-C0-b7dJI.js +0 -605
  899. package/bundled-test-harness/assets/search-adorn-test-C6KP3AwA.js +0 -136
  900. package/bundled-test-harness/assets/search-entries-BfPq5sPS.js +0 -472
  901. package/bundled-test-harness/assets/search-entries-result-test-Bl9u_BOD.js +0 -234
  902. package/bundled-test-harness/assets/search-entries-test-BDC_lS43.js +0 -1486
  903. package/bundled-test-harness/assets/search-result-header-DCAze_cg.js +0 -128
  904. package/bundled-test-harness/assets/search-results-Dd0enVun.js +0 -266
  905. package/bundled-test-harness/assets/search-results-test-T5KEEII4.js +0 -578
  906. package/bundled-test-harness/assets/search-selection-menu-test-CCssnBq1.js +0 -108
  907. package/bundled-test-harness/assets/search-sheet-persistence-test-BzQiO-FK.js +0 -131
  908. package/bundled-test-harness/assets/search-test-fyCWb24m.js +0 -2241
  909. package/bundled-test-harness/assets/searchable-BkgeKQMl.js +0 -2
  910. package/bundled-test-harness/assets/searchable-D_6p6fyb.js +0 -192
  911. package/bundled-test-harness/assets/searchable-option-test-CnCUYGaq.js +0 -322
  912. package/bundled-test-harness/assets/searchable-search-doc-test-B8Q0D98v.js +0 -1271
  913. package/bundled-test-harness/assets/sending-test-D5PGBDys.js +0 -576
  914. package/bundled-test-harness/assets/serialization-rri-form-audit-test-BRJ1cJ31.js +0 -136
  915. package/bundled-test-harness/assets/serialization-test-DM6hK258.js +0 -8758
  916. package/bundled-test-harness/assets/setup-C_GgVgzM.js +0 -772
  917. package/bundled-test-harness/assets/shared-link-target-reuse-test-Be-lSKib.js +0 -207
  918. package/bundled-test-harness/assets/show-card-BFG6KR1m.js +0 -67
  919. package/bundled-test-harness/assets/show-card-test-l0wMrfZq.js +0 -365
  920. package/bundled-test-harness/assets/show-file-B8-FRVHj.js +0 -34
  921. package/bundled-test-harness/assets/signed-capture-D_Q44TQ7.js +0 -204
  922. package/bundled-test-harness/assets/signed-capture-link-test-DOS5xpYv.js +0 -132
  923. package/bundled-test-harness/assets/single-stack-test-BIEtzHVS.js +0 -652
  924. package/bundled-test-harness/assets/skill-BUTGmSsm.js +0 -76
  925. package/bundled-test-harness/assets/skill-Bo7R_2Ud.js +0 -3
  926. package/bundled-test-harness/assets/skill-reference-Cs64py3k.js +0 -112
  927. package/bundled-test-harness/assets/skills-test-CXxSIkYa.js +0 -648
  928. package/bundled-test-harness/assets/slider-picker-C81errGI.js +0 -245
  929. package/bundled-test-harness/assets/slider-picker-mvKsy6cR.js +0 -2
  930. package/bundled-test-harness/assets/spec-B55lJurX.js +0 -602
  931. package/bundled-test-harness/assets/store-DyQ0KiyI.js +0 -2205
  932. package/bundled-test-harness/assets/store-module-rebuild-test-C7532_bS.js +0 -454
  933. package/bundled-test-harness/assets/store-search-test-80NMJuoW.js +0 -175
  934. package/bundled-test-harness/assets/store-test-dHiWXXMs.js +0 -3460
  935. package/bundled-test-harness/assets/string-DHlQEHYm.js +0 -9
  936. package/bundled-test-harness/assets/submode-switcher-DQv-CD6G.js +0 -169
  937. package/bundled-test-harness/assets/svg-meta-extractor-Uw_EJytF.js +0 -42
  938. package/bundled-test-harness/assets/swatches-picker-CaEoibN1.js +0 -33
  939. package/bundled-test-harness/assets/swatches-picker-gPl50JbP.js +0 -2
  940. package/bundled-test-harness/assets/switch-submode-BKDnJd4m.js +0 -79
  941. package/bundled-test-harness/assets/switch-submode-test-_E2mVk4z.js +0 -168
  942. package/bundled-test-harness/assets/tag-B60lDr-j.js +0 -105
  943. package/bundled-test-harness/assets/tests-BBBgPBB6.js +0 -3520
  944. package/bundled-test-harness/assets/text-area-CJjWmwpi.js +0 -9
  945. package/bundled-test-harness/assets/text-file-def-u_dl0i2z.js +0 -151
  946. package/bundled-test-harness/assets/text-input-validator-test-BTwnkSS2.js +0 -156
  947. package/bundled-test-harness/assets/theme-BK-fAHVn.js +0 -9
  948. package/bundled-test-harness/assets/theme-card-test-BQmT7rqr.js +0 -621
  949. package/bundled-test-harness/assets/theme-scheme-island-test-Oi3aeyp1.js +0 -264
  950. package/bundled-test-harness/assets/three-d-model-def-B4KckPVC.js +0 -70
  951. package/bundled-test-harness/assets/time-BcuaSkHg.js +0 -126
  952. package/bundled-test-harness/assets/time-f7Irg7Z7.js +0 -2
  953. package/bundled-test-harness/assets/time-slots-ClYIZN53.js +0 -2
  954. package/bundled-test-harness/assets/time-slots-TI1aaqRN.js +0 -85
  955. package/bundled-test-harness/assets/timeline-Cof9eyq0.js +0 -59
  956. package/bundled-test-harness/assets/timeline-DFWQtCWE.js +0 -2
  957. package/bundled-test-harness/assets/to-device-streaming-test-BDrUUlOt.js +0 -163
  958. package/bundled-test-harness/assets/token-usage-test-CiZo03fY.js +0 -166
  959. package/bundled-test-harness/assets/tool-field-BXHr9r0w.js +0 -94
  960. package/bundled-test-harness/assets/tool-field-CoRO5C4R.js +0 -2
  961. package/bundled-test-harness/assets/tools-CmVaYDIS.js +0 -725
  962. package/bundled-test-harness/assets/tools-calling-test-B454__XF.js +0 -200
  963. package/bundled-test-harness/assets/tools-test-CLu51dJO.js +0 -1624
  964. package/bundled-test-harness/assets/tools-test-XGRAvVug.js +0 -2820
  965. package/bundled-test-harness/assets/ts-file-def-C05BDwdg.js +0 -159
  966. package/bundled-test-harness/assets/update-room-skills-test-jOvP14JX.js +0 -240
  967. package/bundled-test-harness/assets/url-BFf2CNo-.js +0 -2
  968. package/bundled-test-harness/assets/url-CYm-CeXp.js +0 -96
  969. package/bundled-test-harness/assets/video-file-def-B2UIrOFS.js +0 -76
  970. package/bundled-test-harness/assets/wav-meta-extractor-BNkv7e2f.js +0 -368
  971. package/bundled-test-harness/assets/webm-meta-extractor-C933kYyc.js +0 -178
  972. package/bundled-test-harness/assets/webp-meta-extractor-BLz0z1pZ.js +0 -98
  973. package/bundled-test-harness/assets/website-BuOMUW1v.js +0 -92
  974. package/bundled-test-harness/assets/week-Bo0666ji.js +0 -111
  975. package/bundled-test-harness/assets/week-CaVFA8Vc.js +0 -2
  976. package/bundled-test-harness/assets/welcome-to-boxel-PWard7GF.js +0 -172
  977. package/bundled-test-harness/assets/workspace-KXfFTQNV.js +0 -614
  978. package/bundled-test-harness/assets/workspace-a11y-test-Buwb-rfO.js +0 -197
  979. package/bundled-test-harness/assets/workspace-behavior-test-CbgFUOOo.js +0 -200
  980. package/bundled-test-harness/assets/workspace-chooser-BmQvhhrl.js +0 -2248
  981. package/bundled-test-harness/assets/workspace-chooser-Cu84Gd_E.css +0 -1317
  982. package/bundled-test-harness/assets/workspace-chooser-catalog-order-test-rcRw6sni.js +0 -36
  983. package/bundled-test-harness/assets/workspace-chooser-unreachable-notice-test-DUXnBIdY.js +0 -60
  984. package/bundled-test-harness/assets/workspace-delete-multiple-test-DjRKhZ2g.js +0 -212
  985. package/bundled-test-harness/assets/workspace-delete-summary-test-CvkLVYyN.js +0 -63
  986. package/bundled-test-harness/assets/workspace-timestamp-labels-test-AYJT4inv.js +0 -58
  987. package/bundled-test-harness/assets/xlsx-file-def-DuKdbGrJ.js +0 -60
  988. package/bundled-test-harness/assets/xlsx-meta-extractor-Bz-C2JWP.js +0 -101
  989. package/bundled-test-harness/assets/xlsx-meta-extractor-ClwwgABg.js +0 -2
  990. package/bundled-test-harness/assets/year-B6ctHikl.js +0 -2
  991. package/bundled-test-harness/assets/year-C11uAQE6.js +0 -78
  992. package/bundled-test-harness/assets/zip-file-def-B8XN-OS_.js +0 -288
  993. package/bundled-types/host-app/components/matrix/auth-button.gts +0 -39
  994. package/bundled-types/host-app/components/matrix/auth-container.gts +0 -69
  995. package/bundled-types/host-app/components/matrix/auth-form-field.gts +0 -43
@@ -0,0 +1,2211 @@
1
+ import { s as __toESM } from "./chunk-Rp0pCe6z.js";
2
+ import { r as initializeDeferredDecorator, t as decorateFieldV2 } from "./runtime--fcdnjmJ-BoCBNIsz.js";
3
+ import { Ar as testRealmURL, Bn as APP_BOXEL_LLM_MODE, Sc as Deferred, Ss as wrapper_default, Vn as APP_BOXEL_MESSAGE_MSGTYPE, jn as APP_BOXEL_ACTIVE_LLM, qn as APP_BOXEL_REASONING_CONTENT_KEY, uo as SupportedMimeType } from "./runtime-common-ClpqhbwG.js";
4
+ import { y as rri } from "./paths-BYHDgqsT.js";
5
+ import { D as baseRealm, E as baseRRI, J as skillCardRef } from "./constants-CqKWhRfY.js";
6
+ import { wt as setComponentTemplate } from "./cache-DtDz7X5V-Wn8jRDfL.js";
7
+ import { H as templateFactory } from "./index-DaCZcoCY-CgzbilMy.js";
8
+ import { n as src_default } from "./src-DPaAwa4H.js";
9
+ import { t as AiAssistantMessageDrafts } from "./local-storage-keys-CS7XLz7J.js";
10
+ import "./component-BJO47HTh.js";
11
+ import "./template-factory-ds9s0u8l.js";
12
+ import { O as GridContainer } from "./components-Ct_agx0G.js";
13
+ import { a as skillsIndexId, o as skillsRealmURL, t as catalogRealmURL } from "./utils-DZFRsMFd.js";
14
+ import { M as waitUntil, d as click, k as visit, l as triggerEvent, o as waitFor, s as fillIn } from "./dist-BOAdzfkP.js";
15
+ import { t as require_qunit } from "./qunit-C-Foo4Nd.js";
16
+ import { D as realmConfigCardJSON, F as setupLocalIndexing, I as setupOnSave, L as setupRealmCacheTeardown, R as setupRealmServerEndpoints, S as getMonacoContent, Z as withCachedRealmSetup, a as SYSTEM_CARD_FIXTURE_CONTENTS, ct as setupApplicationTest, g as delay, i as getRoomIdForRealmAndUser, j as setupAcceptanceTestRealm, o as addSkillToAiAssistant, pt as setupAuthEndpoints, s as assertMessages, st as visitOperatorMode, t as setupMockMatrix, z as setupUserSubscription } from "./mock-matrix-DPQ0j2MD.js";
17
+ import { r as getService } from "./dist-CPfIHBla.js";
18
+ import { A as field, H as linksTo, U as linksToMany, a as CardDef, o as CardInfoField, s as Component, w as contains } from "./card-api-Dzje0smT.js";
19
+ import { t as string_default } from "./string-BHZZwNlZ.js";
20
+ import { t as CardsGrid } from "./cards-grid-CWG41hZE.js";
21
+ import { C as ModelConfiguration, R as SystemCard, vt as setupBaseRealm } from "./base-realm-B17zVqh6.js";
22
+ //#region tests/acceptance/ai-assistant-test.gts
23
+ var import_qunit = /* @__PURE__ */ __toESM(require_qunit());
24
+ async function selectCardFromCatalog(cardId) {
25
+ await click("[data-test-attach-button]");
26
+ await click("[data-test-attach-card-btn]");
27
+ await fillIn("[data-test-search-field]", cardId);
28
+ await click(`[data-test-item-button="${cardId}"]`);
29
+ await click("[data-test-card-chooser-go-button]");
30
+ }
31
+ async function waitForSessionPreparationToFinish(timeout = 3e4) {
32
+ const aiAssistantPanelService = getService("ai-assistant-panel-service");
33
+ await waitUntil(() => !aiAssistantPanelService.isPreparingSession, { timeout });
34
+ }
35
+ var countryDefinition = `import { field, contains, CardDef } from '@cardstack/base/card-api';
36
+ import StringField from '@cardstack/base/string';
37
+ export class Country extends CardDef {
38
+ static displayName = 'Country';
39
+ @field name = contains(StringField);
40
+ }`;
41
+ var matrixRoomId;
42
+ var mockedFileContent = "Hello, world!";
43
+ var TEST_MODEL_NAMES = {
44
+ "openai/gpt-5": "OpenAI: GPT-5",
45
+ "openai/gpt-5-extended": "OpenAI: GPT-5 Extended Thinking",
46
+ "openai/gpt-4o-mini": "OpenAI: GPT-4o-mini",
47
+ "anthropic/claude-sonnet-4.6": "Anthropic: Claude Sonnet 4.6",
48
+ "anthropic/claude-sonnet-4.5": "Anthropic: Claude Sonnet 4.5",
49
+ "anthropic/claude-3.7-sonnet": "Anthropic: Claude 3.7 Sonnet",
50
+ "deepseek/deepseek-chat-v3-0324": "DeepSeek: DeepSeek V3 0324",
51
+ "google/gemini-2.5-flash": "Google: Gemini 2.5 Flash"
52
+ };
53
+ var TEST_MODEL_CONFIG_IDS = {
54
+ "openai/gpt-5": `${testRealmURL}ModelConfiguration/gpt-5`,
55
+ "openai/gpt-5-extended": `${testRealmURL}ModelConfiguration/gpt-5-extended`,
56
+ "openai/gpt-4o-mini": `${testRealmURL}ModelConfiguration/gpt-4o-mini`,
57
+ "anthropic/claude-sonnet-4.6": `${testRealmURL}ModelConfiguration/claude-sonnet-4.6`,
58
+ "anthropic/claude-sonnet-4.5": `${testRealmURL}ModelConfiguration/claude-sonnet-4.5`,
59
+ "anthropic/claude-3.7-sonnet": `${testRealmURL}ModelConfiguration/claude-sonnet-3.7`,
60
+ "deepseek/deepseek-chat-v3-0324": `${testRealmURL}ModelConfiguration/deepseek-chat-v3-0324`,
61
+ "google/gemini-2.5-flash": `${testRealmURL}ModelConfiguration/gemini-2.5-flash`
62
+ };
63
+ function configIdFor(modelId) {
64
+ return TEST_MODEL_CONFIG_IDS[modelId] ?? modelId;
65
+ }
66
+ function modelNameFor(llmId) {
67
+ return TEST_MODEL_NAMES[llmId] ?? llmId;
68
+ }
69
+ (0, import_qunit.module)("Acceptance | AI Assistant tests", function(hooks) {
70
+ setupApplicationTest(hooks);
71
+ setupLocalIndexing(hooks);
72
+ setupRealmCacheTeardown(hooks);
73
+ setupOnSave(hooks);
74
+ let mockMatrixUtils = setupMockMatrix(hooks, {
75
+ loggedInAs: "@testuser:localhost",
76
+ activeRealms: [baseRealm.url, testRealmURL],
77
+ directRooms: [
78
+ getRoomIdForRealmAndUser(testRealmURL, "@testuser:localhost"),
79
+ getRoomIdForRealmAndUser(baseRealm.url, "@testuser:localhost"),
80
+ "test-auth-realm-server-session-room"
81
+ ]
82
+ });
83
+ let { createAndJoinRoom, getRoomIds, getRoomState, simulateRemoteMessage } = mockMatrixUtils;
84
+ setupRealmServerEndpoints(hooks, [{
85
+ route: "_request-forward",
86
+ getResponse: async (req) => {
87
+ const body = await req.json();
88
+ const contentText = (content) => {
89
+ if (typeof content === "string") return content;
90
+ if (Array.isArray(content)) return content.filter((part) => part.type === "text").map((part) => part.text ?? "").join("");
91
+ return "";
92
+ };
93
+ if (body.url.includes("openrouter.ai/api/v1/chat/completions")) {
94
+ const requestBody = JSON.parse(body.requestBody);
95
+ if (requestBody.messages && requestBody.messages.some((msg) => contentText(msg.content).includes("Please provide a concise summary"))) {
96
+ const conversationText = requestBody.messages.filter((msg) => msg.role === "user" && !contentText(msg.content).includes("Please provide a concise summary")).map((msg) => contentText(msg.content)).join(" ");
97
+ let summary = "This conversation focused on general discussion.";
98
+ if (conversationText.includes("project")) summary = "This conversation focused on project help, specifically creating a new card for a person with name and age fields. The user requested assistance with card creation and field definition.";
99
+ else if (conversationText.includes("card") && conversationText.includes("file")) summary = "This conversation involved discussing a person card (Hassan) and a pet definition file. The user shared both a Person card and a pet.gts file, then asked for help understanding the structure.";
100
+ else if (conversationText.includes("error")) throw new Error("OpenRouter API error");
101
+ return new Response(JSON.stringify({ choices: [{ message: { content: summary } }] }), {
102
+ status: 200,
103
+ headers: { "Content-Type": "application/json" }
104
+ });
105
+ }
106
+ }
107
+ return new Response(JSON.stringify({
108
+ success: true,
109
+ data: {
110
+ id: 123,
111
+ name: "test"
112
+ }
113
+ }), {
114
+ status: 200,
115
+ headers: { "Content-Type": "application/json" }
116
+ });
117
+ }
118
+ }]);
119
+ setupBaseRealm(hooks);
120
+ hooks.beforeEach(async function() {
121
+ matrixRoomId = createAndJoinRoom({
122
+ sender: "@testuser:localhost",
123
+ name: "room-test"
124
+ });
125
+ setupUserSubscription();
126
+ setupAuthEndpoints();
127
+ class Pet extends CardDef {
128
+ static displayName = "Pet";
129
+ static {
130
+ decorateFieldV2(this.prototype, "name", [field], function() {
131
+ return contains(string_default);
132
+ });
133
+ }
134
+ #name = (initializeDeferredDecorator(this, "name"), void 0);
135
+ static {
136
+ decorateFieldV2(this.prototype, "favoriteTreat", [field], function() {
137
+ return contains(string_default);
138
+ });
139
+ }
140
+ #favoriteTreat = (initializeDeferredDecorator(this, "favoriteTreat"), void 0);
141
+ static {
142
+ decorateFieldV2(this.prototype, "cardTitle", [field], function() {
143
+ return contains(string_default, { computeVia: function() {
144
+ return this.name;
145
+ } });
146
+ });
147
+ }
148
+ #cardTitle = (initializeDeferredDecorator(this, "cardTitle"), void 0);
149
+ static embedded = class Embedded extends Component {
150
+ static {
151
+ setComponentTemplate(templateFactory({
152
+ "id": "42cIT+kJ",
153
+ "block": "[[[10,\"h3\"],[15,\"data-test-pet\",[30,1,[\"name\"]]],[12],[1,\"\\n \"],[8,[30,2,[\"name\"]],null,null,null],[1,\"\\n\"],[13]],[\"@model\",\"@fields\"],[]]",
154
+ "moduleName": "/home/runner/work/boxel/boxel/packages/host/tests/acceptance/ai-assistant-test.gts",
155
+ "isStrictMode": true
156
+ }), this);
157
+ }
158
+ };
159
+ static isolated = class Isolated extends Component {
160
+ static {
161
+ setComponentTemplate(templateFactory({
162
+ "id": "Z8KhIcUS",
163
+ "block": "[[[8,[32,0],[[24,0,\"container\"]],null,[[\"default\"],[[[[1,\"\\n \"],[10,\"h2\"],[12],[8,[30,1,[\"cardTitle\"]],null,null,null],[13],[1,\"\\n \"],[10,0],[12],[1,\"\\n \"],[10,0],[12],[1,\"Favorite Treat: \"],[8,[30,1,[\"favoriteTreat\"]],null,null,null],[13],[1,\"\\n \"],[10,0],[14,\"data-test-editable-meta\",\"\"],[12],[1,\"\\n\"],[41,[30,2],[[[1,\" \"],[8,[30,1,[\"cardTitle\"]],null,null,null],[1,\"\\n is editable.\\n\"]],[]],[[[1,\" \"],[8,[30,1,[\"cardTitle\"]],null,null,null],[1,\"\\n is NOT editable.\\n\"]],[]]],[1,\" \"],[13],[1,\"\\n \"],[13],[1,\"\\n\"]],[]]]]]],[\"@fields\",\"@canEdit\"],[\"if\"]]",
164
+ "moduleName": "/home/runner/work/boxel/boxel/packages/host/tests/acceptance/ai-assistant-test.gts",
165
+ "scope": () => [GridContainer],
166
+ "isStrictMode": true
167
+ }), this);
168
+ }
169
+ };
170
+ }
171
+ class Person extends CardDef {
172
+ static displayName = "Person";
173
+ static {
174
+ decorateFieldV2(this.prototype, "firstName", [field], function() {
175
+ return contains(string_default);
176
+ });
177
+ }
178
+ #firstName = (initializeDeferredDecorator(this, "firstName"), void 0);
179
+ static {
180
+ decorateFieldV2(this.prototype, "lastName", [field], function() {
181
+ return contains(string_default);
182
+ });
183
+ }
184
+ #lastName = (initializeDeferredDecorator(this, "lastName"), void 0);
185
+ static {
186
+ decorateFieldV2(this.prototype, "pet", [field], function() {
187
+ return linksTo(Pet);
188
+ });
189
+ }
190
+ #pet = (initializeDeferredDecorator(this, "pet"), void 0);
191
+ static {
192
+ decorateFieldV2(this.prototype, "friends", [field], function() {
193
+ return linksToMany(Pet);
194
+ });
195
+ }
196
+ #friends = (initializeDeferredDecorator(this, "friends"), void 0);
197
+ static {
198
+ decorateFieldV2(this.prototype, "firstLetterOfTheName", [field], function() {
199
+ return contains(string_default, { computeVia: function() {
200
+ if (!this.firstName) return;
201
+ return this.firstName[0];
202
+ } });
203
+ });
204
+ }
205
+ #firstLetterOfTheName = (initializeDeferredDecorator(this, "firstLetterOfTheName"), void 0);
206
+ static {
207
+ decorateFieldV2(this.prototype, "cardTitle", [field], function() {
208
+ return contains(string_default, { computeVia: function() {
209
+ return [this.firstName, this.lastName].filter(Boolean).join(" ");
210
+ } });
211
+ });
212
+ }
213
+ #cardTitle = (initializeDeferredDecorator(this, "cardTitle"), void 0);
214
+ static isolated = class Isolated extends Component {
215
+ static {
216
+ setComponentTemplate(templateFactory({
217
+ "id": "cygZodII",
218
+ "block": "[[[10,\"h2\"],[15,\"data-test-person\",[30,1,[\"firstName\"]]],[12],[1,\"\\n \"],[8,[30,2,[\"firstName\"]],null,null,null],[1,\"\\n\"],[13],[1,\"\\n\"],[10,2],[15,\"data-test-first-letter-of-the-name\",[30,1,[\"firstLetterOfTheName\"]]],[12],[1,\"\\n \"],[8,[30,2,[\"firstLetterOfTheName\"]],null,null,null],[1,\"\\n\"],[13],[1,\"\\nPet:\\n\"],[8,[30,2,[\"pet\"]],null,null,null],[1,\"\\nFriends:\\n\"],[8,[30,2,[\"friends\"]],null,null,null]],[\"@model\",\"@fields\"],[]]",
219
+ "moduleName": "/home/runner/work/boxel/boxel/packages/host/tests/acceptance/ai-assistant-test.gts",
220
+ "isStrictMode": true
221
+ }), this);
222
+ }
223
+ };
224
+ }
225
+ let mangoPet = new Pet({ name: "Mango" });
226
+ let openAiGpt5Model = new ModelConfiguration({
227
+ cardInfo: new CardInfoField({ name: modelNameFor("openai/gpt-5") }),
228
+ modelId: "openai/gpt-5",
229
+ toolsSupported: true,
230
+ reasoningEffort: "minimal"
231
+ });
232
+ let openAiGpt5ExtendedModel = new ModelConfiguration({
233
+ cardInfo: new CardInfoField({ name: modelNameFor("openai/gpt-5-extended") }),
234
+ modelId: "openai/gpt-5",
235
+ toolsSupported: true,
236
+ reasoningEffort: "high"
237
+ });
238
+ let openAiGpt4oMiniModel = new ModelConfiguration({
239
+ cardInfo: new CardInfoField({ name: modelNameFor("openai/gpt-4o-mini") }),
240
+ modelId: "openai/gpt-4o-mini",
241
+ toolsSupported: true
242
+ });
243
+ let anthropicClaudeSonnet46Model = new ModelConfiguration({
244
+ cardInfo: new CardInfoField({ name: modelNameFor("anthropic/claude-sonnet-4.6") }),
245
+ modelId: "anthropic/claude-sonnet-4.6",
246
+ toolsSupported: true
247
+ });
248
+ let anthropicClaudeSonnet45Model = new ModelConfiguration({
249
+ cardInfo: new CardInfoField({ name: modelNameFor("anthropic/claude-sonnet-4.5") }),
250
+ modelId: "anthropic/claude-sonnet-4.5",
251
+ toolsSupported: true
252
+ });
253
+ let anthropicClaudeSonnet37Model = new ModelConfiguration({
254
+ cardInfo: new CardInfoField({ name: modelNameFor("anthropic/claude-3.7-sonnet") }),
255
+ modelId: "anthropic/claude-3.7-sonnet",
256
+ toolsSupported: true
257
+ });
258
+ let defaultSystemCard = new SystemCard({
259
+ defaultModelConfiguration: anthropicClaudeSonnet46Model,
260
+ modelConfigurations: [
261
+ openAiGpt5Model,
262
+ openAiGpt5ExtendedModel,
263
+ openAiGpt4oMiniModel,
264
+ anthropicClaudeSonnet46Model,
265
+ anthropicClaudeSonnet45Model,
266
+ anthropicClaudeSonnet37Model
267
+ ]
268
+ });
269
+ let deepseekModel = new ModelConfiguration({
270
+ cardInfo: new CardInfoField({ name: modelNameFor("deepseek/deepseek-chat-v3-0324") }),
271
+ modelId: "deepseek/deepseek-chat-v3-0324",
272
+ toolsSupported: true
273
+ });
274
+ let geminiFlashModel = new ModelConfiguration({
275
+ cardInfo: new CardInfoField({ name: modelNameFor("google/gemini-2.5-flash") }),
276
+ modelId: "google/gemini-2.5-flash",
277
+ toolsSupported: true
278
+ });
279
+ let alternateSystemCard = new SystemCard({
280
+ defaultModelConfiguration: deepseekModel,
281
+ modelConfigurations: [
282
+ deepseekModel,
283
+ geminiFlashModel,
284
+ openAiGpt5Model
285
+ ]
286
+ });
287
+ await withCachedRealmSetup(async () => {
288
+ await setupAcceptanceTestRealm({
289
+ mockMatrixUtils,
290
+ contents: {
291
+ ...SYSTEM_CARD_FIXTURE_CONTENTS,
292
+ "person.gts": { Person },
293
+ "pet.gts": { Pet },
294
+ "broken-card.gts": `
295
+ import { CardDef, field, contains } from '@cardstack/base/card-api';
296
+ import StringField from '@cardstack/base/string';
297
+ import { BrokenField } from './does-not-exist';
298
+ export class BrokenCard extends CardDef {
299
+ static displayName = 'Broken Card';
300
+ @field name = contains(StringField);
301
+ @field broken = contains(BrokenField);
302
+ }
303
+ `,
304
+ "BrokenCard/errored.json": { data: {
305
+ attributes: { name: "Errored Instance" },
306
+ meta: { adoptsFrom: {
307
+ module: "../broken-card",
308
+ name: "BrokenCard"
309
+ } }
310
+ } },
311
+ "country.gts": countryDefinition,
312
+ "Country/indonesia.json": { data: {
313
+ attributes: { name: "Indonesia" },
314
+ meta: { adoptsFrom: {
315
+ module: `${testRealmURL}country`,
316
+ name: "Country"
317
+ } }
318
+ } },
319
+ "Pet/ringo.json": new Pet({ name: "Ringo" }),
320
+ "Person/hassan.json": new Person({
321
+ firstName: "Hassan",
322
+ lastName: "Abdel-Rahman",
323
+ pet: mangoPet,
324
+ friends: [mangoPet]
325
+ }),
326
+ "Pet/mango.json": mangoPet,
327
+ "Pet/vangogh.json": new Pet({ name: "Van Gogh" }),
328
+ "Person/fadhlan.json": new Person({
329
+ firstName: "Fadhlan",
330
+ pet: mangoPet,
331
+ friends: [mangoPet]
332
+ }),
333
+ "plant.gts": `
334
+ import { CardDef, field, contains, StringField } from '@cardstack/base/card-api';
335
+ export class Plant extends CardDef {
336
+ static displayName = "Plant";
337
+ @field commonName = contains(StringField);
338
+ }
339
+ `,
340
+ "Plant/highbush-blueberry.json": { data: {
341
+ attributes: { commonName: "Highbush Blueberry" },
342
+ meta: { adoptsFrom: {
343
+ module: `../plant`,
344
+ name: "Plant"
345
+ } }
346
+ } },
347
+ "Spec/plant-spec.json": { data: {
348
+ type: "card",
349
+ attributes: {
350
+ ref: {
351
+ name: "Plant",
352
+ module: `${testRealmURL}plant`
353
+ },
354
+ specType: "card",
355
+ cardTitle: "Plant spec"
356
+ },
357
+ meta: { adoptsFrom: {
358
+ module: "@cardstack/base/spec",
359
+ name: "Spec"
360
+ } }
361
+ } },
362
+ "Skill/example.json": { data: {
363
+ attributes: {
364
+ cardTitle: "Example Skill",
365
+ cardDescription: "This skill card is for testing purposes",
366
+ instructions: "This is an example skill card",
367
+ commands: []
368
+ },
369
+ meta: { adoptsFrom: skillCardRef }
370
+ } },
371
+ "Skill/example2.json": { data: {
372
+ attributes: {
373
+ cardTitle: "Example 2 Skill",
374
+ cardDescription: "This skill card is also for testing purposes",
375
+ instructions: "This is a second example skill card",
376
+ commands: []
377
+ },
378
+ meta: { adoptsFrom: skillCardRef }
379
+ } },
380
+ "ModelConfiguration/gpt-4o-mini.json": openAiGpt4oMiniModel,
381
+ "ModelConfiguration/gpt-5.json": openAiGpt5Model,
382
+ "ModelConfiguration/gpt-5-extended.json": openAiGpt5ExtendedModel,
383
+ "ModelConfiguration/claude-sonnet-4.6.json": anthropicClaudeSonnet46Model,
384
+ "ModelConfiguration/claude-sonnet-4.5.json": anthropicClaudeSonnet45Model,
385
+ "ModelConfiguration/claude-sonnet-3.7.json": anthropicClaudeSonnet37Model,
386
+ "SystemCard/default.json": defaultSystemCard,
387
+ "ModelConfiguration/deepseek-chat-v3-0324.json": deepseekModel,
388
+ "ModelConfiguration/gemini-2.5-flash.json": geminiFlashModel,
389
+ "SystemCard/productivity.json": alternateSystemCard,
390
+ "index.json": new CardsGrid(),
391
+ "realm.json": realmConfigCardJSON({
392
+ name: "Test Workspace B",
393
+ backgroundURL: "/test-fixtures/realm-images/pawel-czerwinski-Ly-ZLa-A5jti-Y-unsplash.jpg",
394
+ iconURL: "/test-fixtures/realm-images/boxel-logo.png"
395
+ })
396
+ }
397
+ });
398
+ });
399
+ getService("matrix-service").fetchMatrixHostedFile = async (_url) => {
400
+ return new Response(mockedFileContent);
401
+ };
402
+ });
403
+ (0, import_qunit.test)("attaches a card in a conversation multiple times", async function(assert) {
404
+ await visitOperatorMode({ stacks: [[{
405
+ id: `${testRealmURL}index`,
406
+ format: "isolated"
407
+ }]] });
408
+ await click("[data-test-open-ai-assistant]");
409
+ await waitFor(`[data-room-settled]`);
410
+ const testCard = `${testRealmURL}Person/hassan`;
411
+ for (let i = 1; i <= 3; i++) {
412
+ await fillIn("[data-test-message-field]", `Message - ${i}`);
413
+ await selectCardFromCatalog(testCard);
414
+ await click("[data-test-send-message-btn]");
415
+ }
416
+ assertMessages(assert, [
417
+ {
418
+ from: "testuser",
419
+ message: "Message - 1",
420
+ cards: [{
421
+ id: testCard,
422
+ cardTitle: "Hassan"
423
+ }]
424
+ },
425
+ {
426
+ from: "testuser",
427
+ message: "Message - 2",
428
+ cards: [{
429
+ id: testCard,
430
+ cardTitle: "Hassan"
431
+ }]
432
+ },
433
+ {
434
+ from: "testuser",
435
+ message: "Message - 3",
436
+ cards: [{
437
+ id: testCard,
438
+ cardTitle: "Hassan"
439
+ }]
440
+ }
441
+ ]);
442
+ await click("[data-test-boxel-filter-list-button=\"All Cards\"]");
443
+ await click(`[data-test-stack-card="${testRealmURL}index"] [data-test-cards-grid-item="${testCard}"] .field-component-card`);
444
+ await waitFor(`[data-test-stack-card="${testCard}"]`);
445
+ await click(`[data-test-stack-card="${testCard}"] [data-test-edit-button]`);
446
+ await fillIn("[data-test-field=\"firstName\"] [data-test-boxel-input]", "Updated Name");
447
+ await click(`[data-test-stack-card="${testCard}"] [data-test-edit-button]`);
448
+ await fillIn("[data-test-message-field]", `Message with updated card`);
449
+ await click("[data-test-send-message-btn]");
450
+ assertMessages(assert, [
451
+ {
452
+ from: "testuser",
453
+ message: "Message - 1",
454
+ cards: [{
455
+ id: testCard,
456
+ cardTitle: "Updated Name Abdel-Rahman"
457
+ }]
458
+ },
459
+ {
460
+ from: "testuser",
461
+ message: "Message - 2",
462
+ cards: [{
463
+ id: testCard,
464
+ cardTitle: "Updated Name Abdel-Rahman"
465
+ }]
466
+ },
467
+ {
468
+ from: "testuser",
469
+ message: "Message - 3",
470
+ cards: [{
471
+ id: testCard,
472
+ cardTitle: "Updated Name Abdel-Rahman"
473
+ }]
474
+ },
475
+ {
476
+ from: "testuser",
477
+ message: "Message with updated card",
478
+ cards: [{
479
+ id: testCard,
480
+ cardTitle: "Updated Name Abdel-Rahman"
481
+ }]
482
+ }
483
+ ]);
484
+ });
485
+ (0, import_qunit.test)("attached cards include computed fields", async function(assert) {
486
+ await visitOperatorMode({ stacks: [[{
487
+ id: `${testRealmURL}index`,
488
+ format: "isolated"
489
+ }]] });
490
+ await click("[data-test-open-ai-assistant]");
491
+ await waitFor(`[data-room-settled]`);
492
+ const testCard = `${testRealmURL}Person/hassan`;
493
+ await fillIn("[data-test-message-field]", `Message - 1`);
494
+ await selectCardFromCatalog(testCard);
495
+ await click("[data-test-send-message-btn]");
496
+ assertMessages(assert, [{
497
+ from: "testuser",
498
+ message: "Message - 1",
499
+ cards: [{
500
+ id: testCard,
501
+ cardTitle: "Hassan"
502
+ }]
503
+ }]);
504
+ let roomEvents = mockMatrixUtils.getRoomEvents(matrixRoomId);
505
+ let lastMessageEvent = roomEvents[roomEvents.length - 1];
506
+ assert.ok(lastMessageEvent, "A message event was found");
507
+ let messageDataString = lastMessageEvent.content?.data;
508
+ assert.ok(messageDataString, "Message has data string");
509
+ let messageData = JSON.parse(messageDataString);
510
+ assert.ok(messageData, "Message data is parsable");
511
+ let attachedCards = messageData.attachedCards;
512
+ assert.ok(attachedCards, "Message has attachedCards");
513
+ assert.strictEqual(attachedCards.length, 1, "One card is attached");
514
+ let attachedCard = attachedCards[0];
515
+ assert.ok(attachedCard, "Attached card is present");
516
+ const mxcUrl = attachedCard.url;
517
+ assert.ok(mxcUrl, "Attached card has a URL (mxc)");
518
+ assert.ok(mxcUrl.startsWith("http://mock-server/_matrix/media/"), `Card URL "${mxcUrl}" should start with http://mock-server/_matrix/media/`);
519
+ let cardContent = await getService("matrix-service").downloadCardFileDef(attachedCard);
520
+ assert.strictEqual(cardContent.data.attributes.cardTitle, "Hassan Abdel-Rahman", "Computed card title is present in downloaded content");
521
+ });
522
+ (0, import_qunit.test)("displays active LLM in chat input", async function(assert) {
523
+ await visitOperatorMode({ stacks: [[{
524
+ id: `${testRealmURL}index`,
525
+ format: "isolated"
526
+ }]] });
527
+ await click("[data-test-open-ai-assistant]");
528
+ await waitFor(`[data-room-settled]`);
529
+ let defaultModelName = modelNameFor("anthropic/claude-sonnet-4.6");
530
+ assert.dom("[data-test-llm-select-selected]").hasText(defaultModelName);
531
+ await click("[data-test-llm-select-selected]");
532
+ assert.dom("[data-test-llm-select-item]").exists({ count: 6 });
533
+ let llmIdToChangeTo = "anthropic/claude-3.7-sonnet";
534
+ let llmConfigId = configIdFor(llmIdToChangeTo);
535
+ let llmNameToChangeTo = modelNameFor("anthropic/claude-3.7-sonnet");
536
+ assert.dom(`[data-test-llm-select-item="${llmConfigId}"]`).hasText(llmNameToChangeTo);
537
+ await click(`[data-test-llm-select-item="${llmConfigId}"] button`);
538
+ await click("[data-test-llm-select-selected]");
539
+ assert.dom("[data-test-llm-select-selected]").hasText(llmNameToChangeTo);
540
+ let roomState = getRoomState(matrixRoomId, APP_BOXEL_ACTIVE_LLM, "");
541
+ assert.strictEqual(roomState.model, llmIdToChangeTo);
542
+ });
543
+ (0, import_qunit.test)("active LLM event includes metadata when switching models", async function(assert) {
544
+ await visitOperatorMode({ stacks: [[{
545
+ id: `${testRealmURL}index`,
546
+ format: "isolated"
547
+ }]] });
548
+ await click("[data-test-open-ai-assistant]");
549
+ await waitFor("[data-room-settled]");
550
+ await click("[data-test-llm-select-selected]");
551
+ await click(`[data-test-llm-select-item="${configIdFor("openai/gpt-4o-mini")}"] button`);
552
+ await click("[data-test-llm-select-selected]");
553
+ await waitUntil(() => {
554
+ return getRoomState(matrixRoomId, APP_BOXEL_ACTIVE_LLM, "").model === "openai/gpt-4o-mini";
555
+ });
556
+ let firstState = getRoomState(matrixRoomId, APP_BOXEL_ACTIVE_LLM, "");
557
+ assert.strictEqual(firstState.model, "openai/gpt-4o-mini", "Switching to GPT-4o mini updates active LLM");
558
+ assert.true(firstState.toolsSupported, "Active LLM event records tool support for GPT-4o mini");
559
+ assert.strictEqual(firstState.reasoningEffort, null, "Reasoning effort is omitted when not configured");
560
+ await click("[data-test-llm-select-selected]");
561
+ await click(`[data-test-llm-select-item="${configIdFor("openai/gpt-5")}"] button`);
562
+ await click("[data-test-llm-select-selected]");
563
+ await waitUntil(() => {
564
+ return getRoomState(matrixRoomId, APP_BOXEL_ACTIVE_LLM, "").model === "openai/gpt-5";
565
+ });
566
+ let secondState = getRoomState(matrixRoomId, APP_BOXEL_ACTIVE_LLM, "");
567
+ assert.strictEqual(secondState.model, "openai/gpt-5", "Switching back to GPT-5 updates active LLM");
568
+ assert.true(secondState.toolsSupported, "Active LLM event records tool support for GPT-5");
569
+ assert.strictEqual(secondState.reasoningEffort, "minimal", "Active LLM event records configured reasoning effort for GPT-5");
570
+ });
571
+ (0, import_qunit.test)("duplicate model IDs render as distinct menu items with correct state", async function(assert) {
572
+ await visitOperatorMode({ stacks: [[{
573
+ id: `${testRealmURL}index`,
574
+ format: "isolated"
575
+ }]] });
576
+ await click("[data-test-open-ai-assistant]");
577
+ await waitFor(`[data-room-settled]`);
578
+ await click("[data-test-llm-select-selected]");
579
+ let gpt5ConfigId = configIdFor("openai/gpt-5");
580
+ let gpt5ExtendedConfigId = configIdFor("openai/gpt-5-extended");
581
+ assert.dom(`[data-test-llm-select-item="${gpt5ConfigId}"]`).exists("GPT-5 (minimal) config appears in the menu");
582
+ assert.dom(`[data-test-llm-select-item="${gpt5ExtendedConfigId}"]`).exists("GPT-5 Extended Thinking config appears in the menu");
583
+ assert.dom(`[data-test-llm-select-item="${gpt5ConfigId}"]`).hasText(modelNameFor("openai/gpt-5"));
584
+ assert.dom(`[data-test-llm-select-item="${gpt5ExtendedConfigId}"]`).hasText(modelNameFor("openai/gpt-5-extended"));
585
+ await click(`[data-test-llm-select-item="${gpt5ExtendedConfigId}"] button`);
586
+ await click("[data-test-llm-select-selected]");
587
+ await waitUntil(() => {
588
+ let state = getRoomState(matrixRoomId, APP_BOXEL_ACTIVE_LLM, "");
589
+ return state.model === "openai/gpt-5" && state.reasoningEffort === "high";
590
+ });
591
+ let extendedState = getRoomState(matrixRoomId, APP_BOXEL_ACTIVE_LLM, "");
592
+ assert.strictEqual(extendedState.model, "openai/gpt-5", "Extended thinking variant sends the same modelId");
593
+ assert.strictEqual(extendedState.reasoningEffort, "high", "Extended thinking variant sends its own reasoningEffort");
594
+ await click("[data-test-llm-select-selected]");
595
+ await click(`[data-test-llm-select-item="${gpt5ConfigId}"] button`);
596
+ await click("[data-test-llm-select-selected]");
597
+ await waitUntil(() => {
598
+ let state = getRoomState(matrixRoomId, APP_BOXEL_ACTIVE_LLM, "");
599
+ return state.model === "openai/gpt-5" && state.reasoningEffort === "minimal";
600
+ });
601
+ let minimalState = getRoomState(matrixRoomId, APP_BOXEL_ACTIVE_LLM, "");
602
+ assert.strictEqual(minimalState.model, "openai/gpt-5", "Minimal variant sends the same modelId");
603
+ assert.strictEqual(minimalState.reasoningEffort, "minimal", "Minimal variant sends its own reasoningEffort");
604
+ });
605
+ (0, import_qunit.test)("defaults to the system card default regardless of submode", async function(assert) {
606
+ await visitOperatorMode({ stacks: [[{
607
+ id: `${testRealmURL}index`,
608
+ format: "isolated"
609
+ }]] });
610
+ await click("[data-test-open-ai-assistant]");
611
+ await waitFor(`[data-room-settled]`);
612
+ let matrixService = getService("matrix-service");
613
+ let defaultSystemModelId = matrixService.systemCard?.defaultModelConfiguration?.modelId ?? matrixService.systemCard?.modelConfigurations?.[0]?.modelId;
614
+ assert.ok(defaultSystemModelId, "system card provides a default model");
615
+ let expectedName = modelNameFor(defaultSystemModelId);
616
+ assert.dom("[data-test-llm-select-selected]").hasText(expectedName);
617
+ await click("[data-test-submode-switcher-button]");
618
+ await click("[data-test-boxel-menu-item-text=\"Code\"]");
619
+ assert.dom("[data-test-llm-select-selected]").hasText(expectedName);
620
+ await click("[data-test-close-ai-assistant]");
621
+ });
622
+ (0, import_qunit.test)("selecting a new system card via menu updates available models", async function(assert) {
623
+ await visitOperatorMode({ stacks: [[{
624
+ id: `${testRealmURL}SystemCard/productivity`,
625
+ format: "isolated"
626
+ }]] });
627
+ await click("[data-test-open-ai-assistant]");
628
+ await waitFor(`[data-room-settled]`);
629
+ await click("[data-test-llm-select-selected]");
630
+ assert.dom(`[data-test-llm-select-item="${configIdFor("deepseek/deepseek-chat-v3-0324")}"]`).doesNotExist();
631
+ await click("[data-test-llm-select-selected]");
632
+ await click("[data-test-close-ai-assistant]");
633
+ await click("[data-test-more-options-button]");
634
+ await click("[data-test-boxel-menu-item-text=\"Set as My System Card\"]");
635
+ let matrixService = getService("matrix-service");
636
+ await waitUntil(() => matrixService.systemCard?.modelConfigurations?.[0]?.modelId === "deepseek/deepseek-chat-v3-0324");
637
+ await click("[data-test-open-ai-assistant]");
638
+ await waitFor(`[data-room-settled]`);
639
+ assert.dom("[data-test-llm-select-selected]").hasText(modelNameFor("deepseek/deepseek-chat-v3-0324"));
640
+ await click("[data-test-llm-select-selected]");
641
+ assert.dom(`[data-test-llm-select-item="${configIdFor("deepseek/deepseek-chat-v3-0324")}"]`).exists();
642
+ assert.dom(`[data-test-llm-select-item="${configIdFor("deepseek/deepseek-chat-v3-0324")}"]`).hasText(modelNameFor("deepseek/deepseek-chat-v3-0324"));
643
+ assert.dom(`[data-test-llm-select-item="${configIdFor("google/gemini-2.5-flash")}"]`).exists();
644
+ await click("[data-test-pill-menu-button]");
645
+ await click("[data-test-close-ai-assistant]");
646
+ });
647
+ (0, import_qunit.test)("LLM select footer shows \"Go to current system card\" action", async function(assert) {
648
+ await visitOperatorMode({ stacks: [[{
649
+ id: `${testRealmURL}index`,
650
+ format: "isolated"
651
+ }]] });
652
+ await click("[data-test-open-ai-assistant]");
653
+ await waitFor("[data-room-settled]");
654
+ await click("[data-test-llm-select-selected]");
655
+ assert.dom("[data-test-go-to-system-card]").exists("Go to system card action is visible");
656
+ assert.dom("[data-test-go-to-system-card]").hasText("Go to Current System Card");
657
+ await click("[data-test-pill-menu-button]");
658
+ await click("[data-test-close-ai-assistant]");
659
+ });
660
+ (0, import_qunit.test)("\"Go to current system card\" closes the workspace chooser", async function(assert) {
661
+ await visitOperatorMode({
662
+ workspaceChooserOpened: true,
663
+ stacks: [[{
664
+ id: `${testRealmURL}index`,
665
+ format: "isolated"
666
+ }]]
667
+ });
668
+ assert.dom("[data-test-workspace-chooser]").exists("workspace chooser is open");
669
+ await click("[data-test-open-ai-assistant]");
670
+ await waitFor("[data-room-settled]");
671
+ await click("[data-test-llm-select-selected]");
672
+ await click("[data-test-go-to-system-card]");
673
+ assert.dom("[data-test-workspace-chooser]").doesNotExist("workspace chooser is closed after going to system card");
674
+ assert.dom(`[data-test-stack-card="${testRealmURL}SystemCard/default"]`).exists("the system card is shown on the stack");
675
+ await click("[data-test-pill-menu-button]");
676
+ await click("[data-test-close-ai-assistant]");
677
+ });
678
+ (0, import_qunit.test)("LLM select footer shows \"Restore default\" when non-default system card is active", async function(assert) {
679
+ await visitOperatorMode({ stacks: [[{
680
+ id: `${testRealmURL}SystemCard/productivity`,
681
+ format: "isolated"
682
+ }]] });
683
+ await click("[data-test-more-options-button]");
684
+ await click("[data-test-boxel-menu-item-text=\"Set as My System Card\"]");
685
+ let matrixService = getService("matrix-service");
686
+ await waitUntil(() => matrixService.systemCard?.modelConfigurations?.[0]?.modelId === "deepseek/deepseek-chat-v3-0324");
687
+ await click("[data-test-open-ai-assistant]");
688
+ await waitFor("[data-room-settled]");
689
+ await click("[data-test-llm-select-selected]");
690
+ assert.dom("[data-test-restore-default-system-card]").exists("Restore default action is visible for non-default system card");
691
+ await click("[data-test-pill-menu-button]");
692
+ await click("[data-test-close-ai-assistant]");
693
+ });
694
+ (0, import_qunit.test)("LLM select footer hides \"Restore default\" when default system card is active", async function(assert) {
695
+ await visitOperatorMode({ stacks: [[{
696
+ id: `${testRealmURL}index`,
697
+ format: "isolated"
698
+ }]] });
699
+ await click("[data-test-open-ai-assistant]");
700
+ await waitFor("[data-room-settled]");
701
+ await click("[data-test-llm-select-selected]");
702
+ assert.dom("[data-test-restore-default-system-card]").doesNotExist("Restore default action is hidden when default system card is active");
703
+ await click("[data-test-pill-menu-button]");
704
+ await click("[data-test-close-ai-assistant]");
705
+ });
706
+ (0, import_qunit.test)("auto-attached file is not displayed in interact mode", async function(assert) {
707
+ await visitOperatorMode({
708
+ submode: "interact",
709
+ codePath: `${testRealmURL}index.json`,
710
+ stacks: [[{
711
+ id: `${testRealmURL}index`,
712
+ format: "isolated"
713
+ }]]
714
+ });
715
+ await click("[data-test-boxel-filter-list-button=\"All Cards\"]");
716
+ await click("[data-test-cards-grid-item=\"http://test-realm/test/Person/fadhlan\"] .field-component-card");
717
+ await click("[data-test-open-ai-assistant]");
718
+ await waitFor(`[data-room-settled]`);
719
+ assert.dom("[data-test-autoattached-file]").doesNotExist();
720
+ assert.dom("[data-test-autoattached-card]").exists();
721
+ await click("[data-test-submode-switcher-button]");
722
+ await click("[data-test-boxel-menu-item-text=\"Code\"]");
723
+ assert.dom("[data-test-autoattached-file]").exists();
724
+ assert.dom("[data-test-autoattached-card]").exists();
725
+ await click("[data-test-submode-switcher-button]");
726
+ await click("[data-test-boxel-menu-item-text=\"Interact\"]");
727
+ assert.dom("[data-test-autoattached-file]").doesNotExist();
728
+ assert.dom("[data-test-autoattached-card]").exists();
729
+ });
730
+ (0, import_qunit.test)("cards are auto-attached in code mode", async function(assert) {
731
+ await visitOperatorMode({
732
+ submode: "interact",
733
+ codePath: `${testRealmURL}index.json`,
734
+ stacks: [[{
735
+ id: `${testRealmURL}index`,
736
+ format: "isolated"
737
+ }]]
738
+ });
739
+ await click("[data-test-boxel-filter-list-button=\"All Cards\"]");
740
+ await click("[data-test-cards-grid-item=\"http://test-realm/test/Person/fadhlan\"] .field-component-card");
741
+ await click("[data-test-open-ai-assistant]");
742
+ await waitFor(`[data-room-settled]`);
743
+ await waitUntil(() => document.querySelector("[data-test-autoattached-card]") || document.querySelector("[data-test-autoattached-file]"));
744
+ assert.dom("[data-test-autoattached-file]").doesNotExist();
745
+ assert.dom("[data-test-autoattached-card]").exists();
746
+ await click("[data-test-submode-switcher-button]");
747
+ await click("[data-test-boxel-menu-item-text=\"Code\"]");
748
+ assert.dom("[data-test-autoattached-file]").exists();
749
+ assert.dom("[data-test-autoattached-card]").exists();
750
+ await click(`[data-test-autoattached-card] [data-test-remove-card-btn]`);
751
+ assert.dom("[data-test-autoattached-card]").doesNotExist();
752
+ });
753
+ (0, import_qunit.test)("auto-attaches the module of a card whose adoptsFrom is prefix-form", async function(assert) {
754
+ await visitOperatorMode({
755
+ submode: "code",
756
+ codePath: `${testRealmURL}index.json`,
757
+ stacks: [[]]
758
+ });
759
+ await click("[data-test-open-ai-assistant]");
760
+ await waitFor(`[data-room-settled]`);
761
+ let indexJSON = await (await getService("network").authedFetch(`${testRealmURL}index.json`, { headers: { Accept: SupportedMimeType.CardSource } })).json();
762
+ assert.strictEqual(indexJSON.data.meta.adoptsFrom.module, "@cardstack/base/cards-grid", "the fixture adopts from a prefix-form module");
763
+ let cardsGridModuleURL = getService("network").virtualNetwork.toURL(rri("@cardstack/base/cards-grid.gts")).href;
764
+ assert.dom("[data-test-autoattached-file]").exists({ count: 2 });
765
+ assert.dom(`[data-test-attached-file="${testRealmURL}index.json"][data-test-autoattached-file]`).exists();
766
+ assert.dom(`[data-test-attached-file="${cardsGridModuleURL}"][data-test-autoattached-file]`).exists("the prefix-form module resolves to the base realm");
767
+ });
768
+ (0, import_qunit.test)("errored card instance is not auto-attached in code mode", async function(assert) {
769
+ await visitOperatorMode({
770
+ submode: "code",
771
+ codePath: `${testRealmURL}BrokenCard/errored.json`,
772
+ stacks: [[]]
773
+ });
774
+ await click("[data-test-open-ai-assistant]");
775
+ await waitFor(`[data-room-settled]`);
776
+ assert.dom("[data-test-autoattached-file]").exists("errored card JSON file should still be auto-attached as a file");
777
+ assert.dom("[data-test-autoattached-card]").doesNotExist("errored card instance should not be auto-attached as a card");
778
+ });
779
+ (0, import_qunit.test)("can send a newly created auto-attached card", async function(assert) {
780
+ await visitOperatorMode({
781
+ submode: "interact",
782
+ codePath: `${testRealmURL}index.json`,
783
+ stacks: [[{
784
+ id: `${testRealmURL}index`,
785
+ format: "isolated"
786
+ }]]
787
+ });
788
+ let id;
789
+ this.onSave((url) => {
790
+ id = url.href;
791
+ });
792
+ await click("[data-test-open-ai-assistant]");
793
+ assert.dom("[data-test-attached-card]").doesNotExist();
794
+ await click("[data-test-boxel-filter-list-button=\"All Cards\"]");
795
+ await click("[data-test-create-new-card-button]");
796
+ await click(`[data-test-item-button="${baseRealm.url}types/card"]`);
797
+ await click(`[data-test-card-chooser-go-button]`);
798
+ await waitUntil(() => id);
799
+ id = id;
800
+ await fillIn("[data-test-field=\"cardInfo-name\"] input", "new card");
801
+ assert.dom(`[data-test-attached-card]`).containsText("new card");
802
+ await fillIn("[data-test-message-field]", `Message with updated card`);
803
+ await click("[data-test-send-message-btn]");
804
+ assertMessages(assert, [{
805
+ from: "testuser",
806
+ message: "Message with updated card",
807
+ cards: [{
808
+ id,
809
+ cardTitle: "new card"
810
+ }]
811
+ }]);
812
+ });
813
+ (0, import_qunit.test)("can open attached card dropdown menu", async function(assert) {
814
+ await visitOperatorMode({
815
+ submode: "interact",
816
+ codePath: `${testRealmURL}index.json`,
817
+ stacks: [[{
818
+ id: `${testRealmURL}index`,
819
+ format: "isolated"
820
+ }]]
821
+ });
822
+ await click("[data-test-boxel-filter-list-button=\"All Cards\"]");
823
+ await click("[data-test-cards-grid-item=\"http://test-realm/test/Person/fadhlan\"] .field-component-card");
824
+ await click("[data-test-open-ai-assistant]");
825
+ await waitFor(`[data-room-settled]`);
826
+ await waitUntil(() => document.querySelector("[data-test-autoattached-card]") || document.querySelector("[data-test-autoattached-file]"));
827
+ await fillIn("[data-test-message-field]", `Message with updated card`);
828
+ await click("[data-test-send-message-btn]");
829
+ mockedFileContent = "test card content";
830
+ await click("[data-test-workspace-chooser-toggle]");
831
+ await click("[data-test-attached-file-dropdown-button=\"Fadhlan\"]");
832
+ assert.dom("[data-test-boxel-menu-item-text=\"Open in Code Mode\"]").exists();
833
+ assert.dom("[data-test-boxel-menu-item-text=\"Copy Submitted Content\"]").exists();
834
+ assert.dom("[data-test-boxel-menu-item-text=\"Restore Submitted Content\"]").exists();
835
+ await waitFor("[data-test-copy-file-content=\"test card content\"]");
836
+ await click("[data-test-boxel-menu-item-text=\"Open in Code Mode\"]");
837
+ await waitUntil(() => getMonacoContent().startsWith("{\"data\":{\"type\":\"card\",\"id\":\"http://test-realm/test/Person/fadhlan\""), { timeout: 5e3 });
838
+ });
839
+ (0, import_qunit.test)("can open attach file modal", async function(assert) {
840
+ await visitOperatorMode({
841
+ submode: "code",
842
+ stacks: [[{
843
+ id: `${testRealmURL}index`,
844
+ format: "isolated"
845
+ }]]
846
+ });
847
+ await click("[data-test-open-ai-assistant]");
848
+ await waitFor(`[data-room-settled]`);
849
+ await getService("monaco-service").getMonacoContext();
850
+ await click("[data-test-attach-button]");
851
+ await click("[data-test-attach-file-btn]");
852
+ assert.dom("[data-test-choose-file-modal]").exists();
853
+ assert.dom("[data-test-file=\"pet.gts\"]").exists();
854
+ await click("[data-test-realm-dropdown-trigger]");
855
+ await waitFor("[data-test-boxel-menu-item-text=\"Base Workspace\"]");
856
+ await click("[data-test-boxel-menu-item-text=\"Base Workspace\"]");
857
+ assert.dom("[data-test-file=\"boolean.gts\"]").exists();
858
+ await click("[data-test-realm-dropdown-trigger]");
859
+ await waitFor("[data-test-boxel-menu-item-text=\"Test Workspace B\"]");
860
+ await click("[data-test-boxel-menu-item-text=\"Test Workspace B\"]");
861
+ await click("[data-test-file=\"person.gts\"]");
862
+ await click("[data-test-choose-file-modal-add-button]");
863
+ assert.dom("[data-test-attached-file]").exists({ count: 1 });
864
+ assert.dom("[data-test-attached-file]").hasText("person.gts");
865
+ await click("[data-test-attach-button]");
866
+ await click("[data-test-attach-file-btn]");
867
+ await click("[data-test-file=\"pet.gts\"]");
868
+ await click("[data-test-choose-file-modal-add-button]");
869
+ assert.dom("[data-test-attached-file]").exists({ count: 2 });
870
+ assert.dom(`[data-test-attached-file="${testRealmURL}person.gts"]`).hasText("person.gts");
871
+ assert.dom(`[data-test-attached-file="${testRealmURL}pet.gts"]`).hasText("pet.gts");
872
+ await click(`[data-test-attached-file="${testRealmURL}person.gts"] [data-test-remove-file-btn]`);
873
+ assert.dom("[data-test-attached-file]").hasText("pet.gts");
874
+ await fillIn("[data-test-message-field]", `Message With File`);
875
+ await click("[data-test-send-message-btn]");
876
+ assertMessages(assert, [{
877
+ from: "testuser",
878
+ message: "Message With File",
879
+ files: [{
880
+ sourceUrl: `${testRealmURL}pet.gts`,
881
+ name: "pet.gts"
882
+ }]
883
+ }]);
884
+ });
885
+ (0, import_qunit.test)("can display and remove auto attached file", async function(assert) {
886
+ await visitOperatorMode({
887
+ submode: "code",
888
+ stacks: [[{
889
+ id: `${testRealmURL}index`,
890
+ format: "isolated"
891
+ }]]
892
+ });
893
+ await click("[data-test-open-ai-assistant]");
894
+ await waitFor(`[data-room-settled]`);
895
+ await click("[data-test-file=\"person.gts\"]");
896
+ assert.dom("[data-test-autoattached-file]").exists();
897
+ assert.dom(`[data-test-autoattached-file]`).hasText("person.gts");
898
+ await click("[data-test-file-browser-toggle]");
899
+ await click(`[data-test-autoattached-file] [data-test-remove-file-btn]`);
900
+ assert.dom("[data-test-autoattached-file]").doesNotExist();
901
+ await click("[data-test-file-browser-toggle]");
902
+ await click("[data-test-file=\"pet.gts\"]");
903
+ assert.dom("[data-test-autoattached-file]").exists();
904
+ assert.dom(`[data-test-autoattached-file]`).hasText("pet.gts");
905
+ await click("[data-test-file-browser-toggle]");
906
+ await click("[data-test-file=\"person.gts\"]");
907
+ assert.dom("[data-test-autoattached-file]").exists();
908
+ assert.dom(`[data-test-autoattached-file]`).hasText("person.gts");
909
+ });
910
+ (0, import_qunit.test)("loads more AI rooms when scrolling", async function(assert) {
911
+ for (let i = 1; i <= 15; i++) createAndJoinRoom({
912
+ sender: "@testuser:localhost",
913
+ name: `AI Room ${i}`
914
+ });
915
+ await visitOperatorMode({ stacks: [[{
916
+ id: `${testRealmURL}index`,
917
+ format: "isolated"
918
+ }]] });
919
+ await click("[data-test-open-ai-assistant]");
920
+ await waitFor(`[data-room-settled]`);
921
+ await click("[data-test-past-sessions-button]");
922
+ assert.dom("[data-test-past-sessions]").exists();
923
+ await waitUntil(() => document.querySelectorAll("[data-test-joined-room]").length >= 10);
924
+ let initialRoomCount = document.querySelectorAll("[data-test-joined-room]").length;
925
+ assert.ok(initialRoomCount >= 10, `Expected at least 10 rooms, got ${initialRoomCount}`);
926
+ let pastSessionsElement = await waitFor("[data-test-past-sessions] [data-test-panel-popover-body]");
927
+ pastSessionsElement.scrollTop = pastSessionsElement.scrollHeight;
928
+ await triggerEvent(pastSessionsElement, "scroll");
929
+ await waitUntil(() => {
930
+ return document.querySelectorAll("[data-test-joined-room]").length >= Math.min(initialRoomCount + 1, 16);
931
+ });
932
+ assert.dom("[data-test-joined-room]").exists({ count: 16 });
933
+ });
934
+ (0, import_qunit.test)("preserves ai assistant panel open/closed status", async function(assert) {
935
+ let operatorModeStateParam = wrapper_default({
936
+ stacks: [[{
937
+ id: `${testRealmURL}index`,
938
+ format: "isolated"
939
+ }]],
940
+ aiAssistantOpen: false
941
+ });
942
+ await visit(`/?operatorModeEnabled=true&operatorModeState=${encodeURIComponent(operatorModeStateParam)}`);
943
+ assert.dom("[data-test-ai-assistant-panel]").doesNotExist();
944
+ await click("[data-test-open-ai-assistant]");
945
+ await waitFor(`[data-room-settled]`);
946
+ assert.dom("[data-test-ai-assistant-panel]").exists();
947
+ let operatorModeStateService = getService("operator-mode-state-service");
948
+ assert.true(operatorModeStateService.aiAssistantOpen, "URL state should have aiAssistantOpen: true");
949
+ await click("[data-test-close-ai-assistant]");
950
+ assert.dom("[data-test-ai-assistant-panel]").doesNotExist();
951
+ assert.false(operatorModeStateService.aiAssistantOpen, "URL state should have aiAssistantOpen: false");
952
+ await visitOperatorMode({
953
+ stacks: [[{
954
+ id: `${testRealmURL}index`,
955
+ format: "isolated"
956
+ }]],
957
+ aiAssistantOpen: true
958
+ });
959
+ assert.dom("[data-test-ai-assistant-panel]").exists();
960
+ });
961
+ (0, import_qunit.test)("ai assistant panel is closed by default when the URL omits aiAssistantOpen", async function(assert) {
962
+ let operatorModeStateParam = wrapper_default({ stacks: [[{
963
+ id: `${testRealmURL}index`,
964
+ format: "isolated"
965
+ }]] });
966
+ await visit(`/?operatorModeEnabled=true&operatorModeState=${encodeURIComponent(operatorModeStateParam)}`);
967
+ assert.dom("[data-test-ai-assistant-panel]").doesNotExist();
968
+ assert.false(getService("operator-mode-state-service").aiAssistantOpen, "panel is closed by default with no URL param and no persisted preference");
969
+ });
970
+ (0, import_qunit.test)("auto-attached cards behaviour", async function(assert) {
971
+ await visitOperatorMode({
972
+ submode: "interact",
973
+ codePath: `${testRealmURL}index.json`,
974
+ stacks: [[{
975
+ id: `${testRealmURL}index`,
976
+ format: "isolated"
977
+ }]]
978
+ });
979
+ await click("[data-test-boxel-filter-list-button=\"All Cards\"]");
980
+ await click(`[data-test-cards-grid-item="${testRealmURL}Person/fadhlan"] .field-component-card`);
981
+ await click("[data-test-open-ai-assistant]");
982
+ await waitFor(`[data-room-settled]`);
983
+ assert.dom("[data-test-autoattached-file]").doesNotExist();
984
+ assert.dom("[data-test-autoattached-card]").exists({ count: 1 });
985
+ assert.dom(`[data-test-attached-card="${testRealmURL}Person/fadhlan"][data-test-autoattached-card]`).exists();
986
+ await click("[data-test-add-card-right-stack]");
987
+ await fillIn("[data-test-search-field]", "Mango");
988
+ await click(`[data-test-search-result="${testRealmURL}Pet/mango"]`);
989
+ assert.dom("[data-test-autoattached-card]").exists({ count: 2 });
990
+ assert.dom(`[data-test-attached-card="${testRealmURL}Person/fadhlan"][data-test-autoattached-card]`).exists();
991
+ assert.dom(`[data-test-attached-card="${testRealmURL}Pet/mango"][data-test-autoattached-card]`).exists();
992
+ await click("[data-test-attach-button]");
993
+ await click("[data-test-attach-card-btn]");
994
+ await fillIn("[data-test-search-field]", "Mango");
995
+ await click(`[data-test-item-button="${testRealmURL}Pet/mango"]`);
996
+ await click("[data-test-card-chooser-go-button]");
997
+ assert.dom("[data-test-autoattached-card]").exists({ count: 1 });
998
+ assert.dom(`[data-test-attached-card="${testRealmURL}Person/fadhlan"][data-test-autoattached-card]`).exists();
999
+ assert.dom(`[data-test-attached-card="${testRealmURL}Pet/mango"][data-test-autoattached-card]`).doesNotExist();
1000
+ assert.dom(`[data-test-attached-card="${testRealmURL}Pet/mango"]`).exists();
1001
+ await click("[data-test-submode-switcher-button]");
1002
+ await click("[data-test-boxel-menu-item-text=\"Code\"]");
1003
+ assert.dom(`[data-test-attached-card="${testRealmURL}Person/fadhlan"][data-test-autoattached-card]`).doesNotExist();
1004
+ assert.dom(`[data-test-attached-card="${testRealmURL}Pet/mango"][data-test-autoattached-card]`).doesNotExist();
1005
+ assert.dom(`[data-test-attached-card="${testRealmURL}Pet/mango"]`).exists();
1006
+ await click("[data-test-file-browser-toggle]");
1007
+ await click("[data-test-directory=\"Person/\"]");
1008
+ await click("[data-test-file=\"Person/fadhlan.json\"]");
1009
+ assert.dom("[data-test-attached-card]").exists({ count: 2 });
1010
+ assert.dom("[data-test-autoattached-card]").exists({ count: 1 });
1011
+ assert.dom("[data-test-autoattached-file]").exists({ count: 2 });
1012
+ assert.dom(`[data-test-attached-file="${testRealmURL}Person/fadhlan.json"][data-test-autoattached-file]`).exists();
1013
+ assert.dom(`[data-test-attached-file="${testRealmURL}person.gts"][data-test-autoattached-file]`).exists();
1014
+ assert.dom(`[data-test-attached-card="${testRealmURL}Pet/mango"]`).exists();
1015
+ assert.dom(`[data-test-attached-card="${testRealmURL}Person/fadhlan"][data-test-autoattached-card]`).exists();
1016
+ await click("[data-test-file=\"country.gts\"]");
1017
+ await click("[data-test-module-inspector-view=\"preview\"]");
1018
+ assert.dom("[data-test-attached-card]").exists({ count: 2 });
1019
+ assert.dom("[data-test-autoattached-card]").exists({ count: 1 });
1020
+ assert.dom("[data-test-autoattached-file]").exists({ count: 1 });
1021
+ assert.dom(`[data-test-attached-card="${testRealmURL}Pet/mango"]`).exists();
1022
+ assert.dom(`[data-test-attached-card="${testRealmURL}Country/indonesia"][data-test-autoattached-card]`).exists();
1023
+ assert.dom(`[data-test-attached-file="${testRealmURL}country.gts"][data-test-autoattached-file]`).exists();
1024
+ await click(`[data-test-attached-card="${testRealmURL}Country/indonesia"] [data-test-remove-card-btn]`);
1025
+ assert.dom(`[data-test-attached-card="${testRealmURL}Country/indonesia"]`).doesNotExist();
1026
+ });
1027
+ (0, import_qunit.test)("displays \"Generating results...\" when streaming", async function(assert) {
1028
+ await visitOperatorMode({
1029
+ submode: "interact",
1030
+ codePath: `${testRealmURL}index.json`,
1031
+ stacks: [[{
1032
+ id: `${testRealmURL}index`,
1033
+ format: "isolated"
1034
+ }]]
1035
+ });
1036
+ await click("[data-test-boxel-filter-list-button=\"All Cards\"]");
1037
+ await click(`[data-test-cards-grid-item="${testRealmURL}Person/fadhlan"] .field-component-card`);
1038
+ await click("[data-test-open-ai-assistant]");
1039
+ await waitFor(`[data-room-settled]`);
1040
+ let eventId = simulateRemoteMessage(matrixRoomId, "@aibot:localhost", {
1041
+ body: "Streaming...",
1042
+ msgtype: APP_BOXEL_MESSAGE_MSGTYPE,
1043
+ format: "org.matrix.custom.html",
1044
+ isStreamingFinished: false
1045
+ });
1046
+ await waitFor("[data-test-ai-assistant-action-bar]");
1047
+ assert.dom("[data-test-ai-assistant-action-bar]").containsText("Generating results...");
1048
+ assert.dom("[data-test-stop-generating]").exists();
1049
+ simulateRemoteMessage(matrixRoomId, "@aibot:localhost", {
1050
+ body: "Streaming finished",
1051
+ msgtype: APP_BOXEL_MESSAGE_MSGTYPE,
1052
+ format: "org.matrix.custom.html",
1053
+ isStreamingFinished: true,
1054
+ "m.relates_to": {
1055
+ event_id: eventId,
1056
+ rel_type: "m.replace"
1057
+ }
1058
+ });
1059
+ await waitUntil(() => !document.querySelector("[data-test-ai-assistant-action-bar]"));
1060
+ });
1061
+ (0, import_qunit.test)("displays \"Generation Cancelled\" in the bottom of the message", async function(assert) {
1062
+ await visitOperatorMode({
1063
+ submode: "interact",
1064
+ codePath: `${testRealmURL}index.json`,
1065
+ stacks: [[{
1066
+ id: `${testRealmURL}index`,
1067
+ format: "isolated"
1068
+ }]]
1069
+ });
1070
+ await click("[data-test-boxel-filter-list-button=\"All Cards\"]");
1071
+ await click(`[data-test-cards-grid-item="${testRealmURL}Person/fadhlan"] .field-component-card`);
1072
+ await click("[data-test-open-ai-assistant]");
1073
+ await waitFor(`[data-room-settled]`);
1074
+ let eventId = simulateRemoteMessage(matrixRoomId, "@aibot:localhost", {
1075
+ body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit.",
1076
+ msgtype: APP_BOXEL_MESSAGE_MSGTYPE,
1077
+ format: "org.matrix.custom.html",
1078
+ isStreamingFinished: false,
1079
+ isCanceled: false
1080
+ });
1081
+ await waitFor("[data-test-ai-assistant-message]");
1082
+ assert.dom("[data-test-ai-assistant-action-bar]").exists();
1083
+ assert.dom("[data-test-ai-assistant-action-bar]").containsText("Generating results...");
1084
+ assert.dom("[data-test-stop-generating]").exists();
1085
+ assert.dom("[data-test-ai-message-content]").hasText("Lorem ipsum dolor sit amet, consectetur adipiscing elit.");
1086
+ simulateRemoteMessage(matrixRoomId, "@aibot:localhost", {
1087
+ body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit.",
1088
+ msgtype: APP_BOXEL_MESSAGE_MSGTYPE,
1089
+ format: "org.matrix.custom.html",
1090
+ isStreamingFinished: true,
1091
+ isCanceled: true,
1092
+ "m.relates_to": {
1093
+ event_id: eventId,
1094
+ rel_type: "m.replace"
1095
+ }
1096
+ });
1097
+ await waitUntil(() => !document.querySelector("[data-test-ai-assistant-action-bar]"));
1098
+ assert.dom("[data-test-ai-message-content]").hasText("Lorem ipsum dolor sit amet, consectetur adipiscing elit. {Generation Cancelled}");
1099
+ });
1100
+ (0, import_qunit.test)(`displays "Generation Cancelled" in the bottom of the message when it's stopped during reasoning`, async function(assert) {
1101
+ await visitOperatorMode({
1102
+ submode: "interact",
1103
+ codePath: `${testRealmURL}index.json`,
1104
+ stacks: [[{
1105
+ id: `${testRealmURL}index`,
1106
+ format: "isolated"
1107
+ }]]
1108
+ });
1109
+ await click("[data-test-boxel-filter-list-button=\"All Cards\"]");
1110
+ await click(`[data-test-cards-grid-item="${testRealmURL}Person/fadhlan"] .field-component-card`);
1111
+ await click("[data-test-open-ai-assistant]");
1112
+ await waitFor(`[data-room-settled]`);
1113
+ let eventId = simulateRemoteMessage(matrixRoomId, "@aibot:localhost", {
1114
+ [APP_BOXEL_REASONING_CONTENT_KEY]: "This message will be cancelled before the reasoning is finished",
1115
+ msgtype: APP_BOXEL_MESSAGE_MSGTYPE,
1116
+ format: "org.matrix.custom.html",
1117
+ isStreamingFinished: false,
1118
+ isCanceled: false
1119
+ });
1120
+ await waitFor("[data-test-ai-assistant-message]");
1121
+ assert.dom("[data-test-ai-assistant-action-bar]").exists();
1122
+ assert.dom("[data-test-ai-assistant-action-bar]").containsText("Generating results...");
1123
+ assert.dom("[data-test-stop-generating]").exists();
1124
+ assert.dom("[data-test-ai-message-content]").containsText("Thinking...");
1125
+ assert.dom("[data-test-ai-message-content]").doesNotContainText("{Generation Cancelled}");
1126
+ assert.dom("[data-test-reasoning]").containsText("This message will be cancelled before the reasoning is finished");
1127
+ simulateRemoteMessage(matrixRoomId, "@aibot:localhost", {
1128
+ [APP_BOXEL_REASONING_CONTENT_KEY]: "This message will be cancelled before the reasoning is finished",
1129
+ msgtype: APP_BOXEL_MESSAGE_MSGTYPE,
1130
+ format: "org.matrix.custom.html",
1131
+ isStreamingFinished: true,
1132
+ isCanceled: true,
1133
+ "m.relates_to": {
1134
+ event_id: eventId,
1135
+ rel_type: "m.replace"
1136
+ }
1137
+ });
1138
+ await waitUntil(() => !document.querySelector("[data-test-ai-assistant-action-bar]"));
1139
+ assert.dom("[data-test-ai-message-content]").containsText("Thinking...");
1140
+ assert.dom("[data-test-ai-message-content]").containsText("{Generation Cancelled}");
1141
+ await click("[data-test-reasoning]");
1142
+ assert.dom("[data-test-reasoning]").containsText("This message will be cancelled before the reasoning is finished");
1143
+ });
1144
+ (0, import_qunit.test)(`should not display action bar when there is no code patch block`, async function(assert) {
1145
+ await visitOperatorMode({
1146
+ submode: "interact",
1147
+ codePath: `${testRealmURL}index.json`,
1148
+ stacks: [[{
1149
+ id: `${testRealmURL}index`,
1150
+ format: "isolated"
1151
+ }]]
1152
+ });
1153
+ await click("[data-test-boxel-filter-list-button=\"All Cards\"]");
1154
+ await click(`[data-test-cards-grid-item="${testRealmURL}Person/fadhlan"] .field-component-card`);
1155
+ await click("[data-test-open-ai-assistant]");
1156
+ await waitFor(`[data-room-settled]`);
1157
+ simulateRemoteMessage(matrixRoomId, "@aibot:localhost", {
1158
+ body: `\`\`\`
1159
+ { "name": "test" }
1160
+ \`\`\``,
1161
+ msgtype: APP_BOXEL_MESSAGE_MSGTYPE,
1162
+ format: "org.matrix.custom.html",
1163
+ isStreamingFinished: true
1164
+ });
1165
+ await waitFor("[data-test-ai-assistant-message]");
1166
+ assert.dom("[data-test-ai-assistant-action-bar]").doesNotExist();
1167
+ });
1168
+ (0, import_qunit.test)("code mode context sent with message", async function(assert) {
1169
+ await visitOperatorMode({
1170
+ submode: "code",
1171
+ codePath: `${testRealmURL}Plant/highbush-blueberry.json`,
1172
+ stacks: [[{
1173
+ id: `${testRealmURL}index`,
1174
+ format: "isolated"
1175
+ }, {
1176
+ id: `${testRealmURL}Plant/highbush-blueberry`,
1177
+ format: "isolated"
1178
+ }]]
1179
+ });
1180
+ await click("[data-test-open-ai-assistant]");
1181
+ await waitFor(`[data-room-settled]`);
1182
+ assert.dom("[data-test-focus-pill-main]").containsText("Card");
1183
+ assert.dom("[data-test-focus-pill-meta]").exists({ count: 1 }, "FocusPill shows one meta pill");
1184
+ let metaEls = document.querySelectorAll("[data-test-focus-pill-meta]");
1185
+ assert.dom(metaEls[0]).hasText("Isolated", "FocusPill shows item type \"Format\"");
1186
+ await click("[data-test-format-chooser=\"embedded\"]");
1187
+ assert.dom("[data-test-focus-pill-meta]").exists({ count: 1 }, "FocusPill shows one meta pill");
1188
+ metaEls = document.querySelectorAll("[data-test-focus-pill-meta]");
1189
+ assert.dom(metaEls[0]).hasText("Embedded", "FocusPill shows item type \"Format\"");
1190
+ await fillIn("[data-test-message-field]", `Message - 1`);
1191
+ await click("[data-test-send-message-btn]");
1192
+ let roomEvents = mockMatrixUtils.getRoomEvents(matrixRoomId);
1193
+ let lastMessageEvent = roomEvents[roomEvents.length - 1];
1194
+ let contextSent = JSON.parse(lastMessageEvent.content.data).context;
1195
+ assert.strictEqual(contextSent.realmUrl, testRealmURL, "Context sent with message contains correct realmUrl");
1196
+ assert.strictEqual(contextSent.submode, "code", "Context sent with message contains correct submode");
1197
+ assert.deepEqual(contextSent.openCardIds, [`${testRealmURL}Plant/highbush-blueberry`], "Context sent with message contains correct openCardIds");
1198
+ assert.strictEqual(contextSent.codeMode.currentFile, `${testRealmURL}Plant/highbush-blueberry.json`, "Context sent with message contains correct currentFile");
1199
+ assert.deepEqual(contextSent.codeMode.selectionRange, {
1200
+ startLine: 1,
1201
+ startColumn: 1,
1202
+ endLine: 1,
1203
+ endColumn: 1
1204
+ }, "Context sent with message contains correct selectionRange");
1205
+ assert.strictEqual(contextSent.codeMode.moduleInspectorPanel, "preview", "Context sent with message contains correct moduleInspectorPanel");
1206
+ assert.deepEqual(contextSent.codeMode.previewPanelSelection, {
1207
+ cardId: `${testRealmURL}Plant/highbush-blueberry`,
1208
+ format: "embedded"
1209
+ }, "Context sent with message contains correct previewPanelSelection");
1210
+ assert.deepEqual(contextSent.codeMode.selectedCodeRef, void 0, "Context sent with message contains correct selectedCodeRef");
1211
+ assert.deepEqual(contextSent.codeMode.inheritanceChain, void 0, "Context sent with message contains undefined inheritanceChain when no selectedCodeRef");
1212
+ assert.strictEqual(contextSent.codeMode.activeSpecId, void 0, "Context sent with message contains undefined activeSpecId when spec panel is not active");
1213
+ assert.deepEqual(contextSent.realmPermissions, {
1214
+ canRead: true,
1215
+ canWrite: true
1216
+ }, "Context sent with message contains correct realmPermissions");
1217
+ await click("[data-test-clickable-definition-container]");
1218
+ await waitFor("[data-test-focus-pill-main]");
1219
+ assert.dom("[data-test-focus-pill-main]").containsText("Plant", "FocusPill shows selected code label");
1220
+ assert.dom("[data-test-focus-pill-meta]").exists({ count: 1 }, "FocusPill shows one meta pill");
1221
+ metaEls = document.querySelectorAll("[data-test-focus-pill-meta]");
1222
+ assert.dom(metaEls[0]).hasText("Schema", "FocusPill shows item type \"Schema\"");
1223
+ await fillIn("[data-test-message-field]", `Message - 2`);
1224
+ await click("[data-test-send-message-btn]");
1225
+ roomEvents = mockMatrixUtils.getRoomEvents(matrixRoomId);
1226
+ lastMessageEvent = roomEvents[roomEvents.length - 1];
1227
+ contextSent = JSON.parse(lastMessageEvent.content.data).context;
1228
+ assert.strictEqual(contextSent.realmUrl, testRealmURL, "Context sent with message contains correct realmUrl");
1229
+ assert.strictEqual(contextSent.submode, "code", "Context sent with message contains correct submode");
1230
+ assert.deepEqual(contextSent.openCardIds, [], "Context sent with message contains correct openCardIds");
1231
+ assert.strictEqual(contextSent.codeMode.currentFile, `${testRealmURL}plant.gts`, "Context sent with message contains correct currentFile");
1232
+ assert.deepEqual(contextSent.codeMode.selectionRange, {
1233
+ startLine: 3,
1234
+ startColumn: 45,
1235
+ endLine: 3,
1236
+ endColumn: 45
1237
+ }, "Context sent with message contains correct selectionRange");
1238
+ assert.strictEqual(contextSent.codeMode.moduleInspectorPanel, "schema", "Context sent with message contains correct moduleInspectorPanel");
1239
+ assert.strictEqual(contextSent.codeMode.previewPanelSelection, void 0, "Context sent with message contains correct previewPanelSelection");
1240
+ assert.deepEqual(contextSent.codeMode.selectedCodeRef, {
1241
+ module: rri("http://test-realm/test/plant"),
1242
+ name: "Plant"
1243
+ }, "Context sent with message contains correct selectedCodeRef");
1244
+ assert.ok(contextSent.codeMode.inheritanceChain, "Context sent with message contains inheritanceChain");
1245
+ assert.deepEqual(contextSent.codeMode.inheritanceChain[0].codeRef, {
1246
+ module: rri("http://test-realm/test/plant"),
1247
+ name: "Plant"
1248
+ }, "First item in inheritanceChain is the Plant card");
1249
+ assert.ok(Array.isArray(contextSent.codeMode.inheritanceChain[0].fields), "Plant card has fields array");
1250
+ assert.ok(contextSent.codeMode.inheritanceChain[0].fields.includes("commonName"), "Plant card includes commonName field");
1251
+ let lastInheritanceItem = contextSent.codeMode.inheritanceChain[contextSent.codeMode.inheritanceChain.length - 1];
1252
+ assert.strictEqual(lastInheritanceItem.codeRef.name, "CardDef", "Last item in inheritanceChain is CardDef");
1253
+ contextSent.codeMode.inheritanceChain.forEach((item, index) => {
1254
+ assert.ok(Array.isArray(item.fields), `Inheritance chain item ${index} has fields array`);
1255
+ assert.ok("codeRef" in item, `Inheritance chain item ${index} has codeRef property`);
1256
+ });
1257
+ assert.ok(lastInheritanceItem.codeRef.module.includes("card-api"), "Last item in inheritanceChain comes from card-api module");
1258
+ assert.deepEqual(contextSent.realmPermissions, {
1259
+ canRead: true,
1260
+ canWrite: true
1261
+ }, "Context sent with message contains correct realmPermissions");
1262
+ await click("[data-test-boxel-button][data-test-module-inspector-view=\"preview\"]");
1263
+ let editor = getService("monaco-service").editor;
1264
+ if (editor?.setSelection) editor.setSelection({
1265
+ startLineNumber: 3,
1266
+ startColumn: 45,
1267
+ endLineNumber: 6,
1268
+ endColumn: 1
1269
+ });
1270
+ await waitFor("[data-test-focus-pill-main]");
1271
+ await delay(20);
1272
+ assert.dom("[data-test-focus-pill-main]").containsText("Plant", "FocusPill still shows selected code label");
1273
+ assert.dom("[data-test-focus-pill-meta]").exists({ count: 3 }, "FocusPill shows three meta pills");
1274
+ metaEls = document.querySelectorAll("[data-test-focus-pill-meta]");
1275
+ assert.dom(metaEls[0]).hasText("Preview", "FocusPill shows item type \"Preview\"");
1276
+ assert.dom(metaEls[1]).hasText("Isolated", "FocusPill shows format \"Isolated\"");
1277
+ assert.dom(metaEls[2]).hasText("Lines 3-6", "FocusPill shows multi-line selection range \"Lines 3-6\"");
1278
+ await click("[data-test-format-chooser=\"fitted\"]");
1279
+ metaEls = document.querySelectorAll("[data-test-focus-pill-meta]");
1280
+ assert.dom(metaEls[1]).hasText("Fitted", "FocusPill shows format \"Fitted\"");
1281
+ await fillIn("[data-test-message-field]", `Message - 3`);
1282
+ await click("[data-test-send-message-btn]");
1283
+ roomEvents = mockMatrixUtils.getRoomEvents(matrixRoomId);
1284
+ lastMessageEvent = roomEvents[roomEvents.length - 1];
1285
+ contextSent = JSON.parse(lastMessageEvent.content.data).context;
1286
+ assert.strictEqual(contextSent.realmUrl, testRealmURL, "Context sent with message contains correct realmUrl");
1287
+ assert.strictEqual(contextSent.submode, "code", "Context sent with message contains correct submode");
1288
+ assert.deepEqual(contextSent.openCardIds, [`${testRealmURL}Plant/highbush-blueberry`], "Context sent with message contains correct openCardIds");
1289
+ assert.strictEqual(contextSent.codeMode.currentFile, `${testRealmURL}plant.gts`, "Context sent with message contains correct currentFile");
1290
+ assert.deepEqual(contextSent.codeMode.selectionRange, {
1291
+ startLine: 3,
1292
+ startColumn: 45,
1293
+ endLine: 6,
1294
+ endColumn: 1
1295
+ }, "Context sent with message contains correct selectionRange");
1296
+ assert.strictEqual(contextSent.codeMode.moduleInspectorPanel, "preview", "Context sent with message contains correct moduleInspectorPanel");
1297
+ assert.deepEqual(contextSent.codeMode.previewPanelSelection, {
1298
+ cardId: `${testRealmURL}Plant/highbush-blueberry`,
1299
+ format: "fitted"
1300
+ }, "Context sent with message contains correct previewPanelSelection");
1301
+ assert.deepEqual(contextSent.codeMode.selectedCodeRef, {
1302
+ module: rri("http://test-realm/test/plant"),
1303
+ name: "Plant"
1304
+ }, "Context sent with message contains correct selectedCodeRef");
1305
+ assert.strictEqual(contextSent.codeMode.activeSpecId, void 0, "Context sent with message contains undefined activeSpecId when spec panel is not active");
1306
+ assert.deepEqual(contextSent.realmPermissions, {
1307
+ canRead: true,
1308
+ canWrite: true
1309
+ }, "Context sent with message contains correct realmPermissions");
1310
+ await click("[data-test-boxel-button][data-test-module-inspector-view=\"spec\"]");
1311
+ await waitFor("[data-test-focus-pill-main]");
1312
+ {
1313
+ const metaEls = document.querySelectorAll("[data-test-focus-pill-meta]");
1314
+ assert.dom(metaEls[0]).hasText("Spec", "FocusPill shows item type \"Spec\"");
1315
+ }
1316
+ await fillIn("[data-test-message-field]", `Message - 4`);
1317
+ await click("[data-test-send-message-btn]");
1318
+ roomEvents = mockMatrixUtils.getRoomEvents(matrixRoomId);
1319
+ lastMessageEvent = roomEvents[roomEvents.length - 1];
1320
+ contextSent = JSON.parse(lastMessageEvent.content.data).context;
1321
+ assert.strictEqual(contextSent.realmUrl, testRealmURL, "Context sent with message contains correct realmUrl");
1322
+ assert.strictEqual(contextSent.submode, "code", "Context sent with message contains correct submode");
1323
+ assert.deepEqual(contextSent.openCardIds, ["http://test-realm/test/Spec/plant-spec"], "Context sent with message contains correct openCardIds");
1324
+ assert.strictEqual(contextSent.codeMode.currentFile, `${testRealmURL}plant.gts`, "Context sent with message contains correct currentFile");
1325
+ assert.strictEqual(contextSent.codeMode.moduleInspectorPanel, "spec", "Context sent with message contains correct moduleInspectorPanel");
1326
+ assert.strictEqual(contextSent.codeMode.previewPanelSelection, void 0, "Context sent with message contains correct previewPanelSelection");
1327
+ assert.deepEqual(contextSent.codeMode.selectedCodeRef, {
1328
+ module: rri("http://test-realm/test/plant"),
1329
+ name: "Plant"
1330
+ }, "Context sent with message contains correct selectedCodeRef");
1331
+ assert.ok(contextSent.codeMode.activeSpecId, "Context sent with message contains activeSpecId when spec panel is active");
1332
+ assert.true(contextSent.codeMode.activeSpecId.startsWith(testRealmURL), "activeSpecId should start with test realm URL");
1333
+ assert.deepEqual(contextSent.realmPermissions, {
1334
+ canRead: true,
1335
+ canWrite: true
1336
+ }, "Context sent with message contains correct realmPermissions");
1337
+ });
1338
+ (0, import_qunit.test)("code mode context names a base module by its prefix form", async function(assert) {
1339
+ let { virtualNetwork } = getService("network");
1340
+ await visitOperatorMode({
1341
+ submode: "code",
1342
+ codePath: virtualNetwork.toURLHref(baseRRI("card-api.gts")),
1343
+ stacks: [[]]
1344
+ });
1345
+ await click("[data-test-open-ai-assistant]");
1346
+ await waitFor(`[data-room-settled]`);
1347
+ await fillIn("[data-test-message-field]", `Message`);
1348
+ await click("[data-test-send-message-btn]");
1349
+ let roomEvents = mockMatrixUtils.getRoomEvents(matrixRoomId);
1350
+ let contextSent = JSON.parse(roomEvents[roomEvents.length - 1].content.data).context;
1351
+ assert.strictEqual(contextSent.codeMode.currentFile, baseRRI("card-api.gts"), "currentFile is the prefix form");
1352
+ assert.strictEqual(contextSent.realmPrefixes?.[baseRRI("")], virtualNetwork.toURLHref(baseRRI("")), "the context maps the base prefix to the URL it is served from");
1353
+ });
1354
+ (0, import_qunit.test)("dashboard context sent with message", async function(assert) {
1355
+ await visitOperatorMode({
1356
+ submode: "interact",
1357
+ workspaceChooserOpened: true,
1358
+ stacks: [[]]
1359
+ });
1360
+ await click("[data-test-open-ai-assistant]");
1361
+ await waitFor(`[data-room-settled]`);
1362
+ await fillIn("[data-test-message-field]", `Message - 1`);
1363
+ await click("[data-test-send-message-btn]");
1364
+ let roomEvents = mockMatrixUtils.getRoomEvents(matrixRoomId);
1365
+ let lastMessageEvent = roomEvents[roomEvents.length - 1];
1366
+ let contextSent = JSON.parse(lastMessageEvent.content.data).context;
1367
+ assert.strictEqual(contextSent.realmUrl, void 0, "Context sent with message does not contain realmUrl");
1368
+ assert.strictEqual(contextSent.submode, "workspace-chooser", "Context sent with message contains correct submode");
1369
+ assert.deepEqual(contextSent.workspaces, [
1370
+ {
1371
+ name: "Test Workspace B",
1372
+ type: "user-workspace",
1373
+ url: testRealmURL
1374
+ },
1375
+ catalogRealmURL && {
1376
+ name: "Cardstack Catalog",
1377
+ type: "catalog-workspace",
1378
+ url: catalogRealmURL
1379
+ },
1380
+ {
1381
+ name: "Boxel Skills",
1382
+ type: "catalog-workspace",
1383
+ url: skillsRealmURL
1384
+ }
1385
+ ].filter(Boolean), "Context sent with message contains correct workspaces");
1386
+ });
1387
+ (0, import_qunit.test)("clicking auto-attached card makes it a chosen card", async function(assert) {
1388
+ await visitOperatorMode({
1389
+ submode: "interact",
1390
+ stacks: [[{
1391
+ id: `${testRealmURL}Person/fadhlan`,
1392
+ format: "isolated"
1393
+ }]]
1394
+ });
1395
+ await click("[data-test-open-ai-assistant]");
1396
+ await waitFor(`[data-room-settled]`);
1397
+ assert.dom("[data-test-autoattached-card]").exists({ count: 1 });
1398
+ assert.dom(`[data-test-attached-card="${testRealmURL}Person/fadhlan"][data-test-autoattached-card]`).exists();
1399
+ await click(`[data-test-attached-card="${testRealmURL}Person/fadhlan"][data-test-autoattached-card]`);
1400
+ assert.dom("[data-test-autoattached-card]").doesNotExist();
1401
+ assert.dom(`[data-test-attached-card="${testRealmURL}Person/fadhlan"]`).exists();
1402
+ assert.dom(`[data-test-attached-card="${testRealmURL}Person/fadhlan"][data-test-autoattached-card]`).doesNotExist();
1403
+ await click(`[data-test-attached-card="${testRealmURL}Person/fadhlan"] [data-test-remove-card-btn]`);
1404
+ assert.dom(`[data-test-attached-card="${testRealmURL}Person/fadhlan"]`).doesNotExist();
1405
+ });
1406
+ (0, import_qunit.test)("clicking auto-attached file makes it a chosen file", async function(assert) {
1407
+ await visitOperatorMode({
1408
+ submode: "code",
1409
+ codePath: `${testRealmURL}plant.gts`,
1410
+ stacks: [[{
1411
+ id: `${testRealmURL}index`,
1412
+ format: "isolated"
1413
+ }]]
1414
+ });
1415
+ await click("[data-test-open-ai-assistant]");
1416
+ await waitFor(`[data-room-settled]`);
1417
+ assert.dom("[data-test-autoattached-file]").exists({ count: 1 });
1418
+ assert.dom(`[data-test-attached-file="${testRealmURL}plant.gts"][data-test-autoattached-file]`).exists();
1419
+ await click(`[data-test-attached-file="${testRealmURL}plant.gts"][data-test-autoattached-file]`);
1420
+ assert.dom("[data-test-autoattached-file]").doesNotExist();
1421
+ assert.dom(`[data-test-attached-file="${testRealmURL}plant.gts"]`).exists();
1422
+ assert.dom(`[data-test-attached-file="${testRealmURL}plant.gts"][data-test-autoattached-file]`).doesNotExist();
1423
+ await click(`[data-test-attached-file="${testRealmURL}plant.gts"] [data-test-remove-file-btn]`);
1424
+ assert.dom(`[data-test-attached-file="${testRealmURL}plant.gts"]`).doesNotExist();
1425
+ await click("[data-test-module-inspector-view=\"spec\"]");
1426
+ await waitFor("[data-test-spec-selector-item-path]");
1427
+ assert.dom("[data-test-autoattached-card]").exists({ count: 1 });
1428
+ let autoAttachedCards = document.querySelectorAll("[data-test-autoattached-card]");
1429
+ let hasAutoAttachedSpec = Array.from(autoAttachedCards).some((card) => {
1430
+ return card.getAttribute("data-test-attached-card")?.includes("Spec/plant-spec");
1431
+ });
1432
+ assert.ok(hasAutoAttachedSpec, "Auto-attached card should be the plant spec card");
1433
+ });
1434
+ (0, import_qunit.test)("auto-attaches spec card when spec panel is open and spec is selected", async function(assert) {
1435
+ await visitOperatorMode({
1436
+ submode: "code",
1437
+ codePath: `${testRealmURL}plant.gts`,
1438
+ stacks: [[{
1439
+ id: `${testRealmURL}index`,
1440
+ format: "isolated"
1441
+ }]]
1442
+ });
1443
+ await click("[data-test-open-ai-assistant]");
1444
+ await waitFor(`[data-room-settled]`);
1445
+ await click("[data-test-module-inspector-view=\"spec\"]");
1446
+ await waitFor("[data-test-spec-selector-item-path]");
1447
+ assert.dom("[data-test-autoattached-card]").exists({ count: 1 });
1448
+ let autoAttachedCards = document.querySelectorAll("[data-test-autoattached-card]");
1449
+ let hasAutoAttachedSpec = Array.from(autoAttachedCards).some((card) => {
1450
+ return card.getAttribute("data-test-attached-card")?.includes("Spec/plant-spec");
1451
+ });
1452
+ assert.ok(hasAutoAttachedSpec, "Auto-attached card should be the plant spec card");
1453
+ });
1454
+ (0, import_qunit.test)("does not auto-attach spec card when spec panel is closed", async function(assert) {
1455
+ await visitOperatorMode({
1456
+ submode: "code",
1457
+ codePath: `${testRealmURL}plant.gts`,
1458
+ stacks: [[{
1459
+ id: `${testRealmURL}index`,
1460
+ format: "isolated"
1461
+ }]]
1462
+ });
1463
+ await click("[data-test-open-ai-assistant]");
1464
+ await waitFor(`[data-room-settled]`);
1465
+ await click("[data-test-module-inspector-view=\"spec\"]");
1466
+ await waitFor("[data-test-spec-selector-item-path]");
1467
+ await click("[data-test-module-inspector-view=\"schema\"]");
1468
+ let autoAttachedCards = document.querySelectorAll("[data-test-autoattached-card]");
1469
+ let hasAutoAttachedSpec = Array.from(autoAttachedCards).some((card) => {
1470
+ return card.getAttribute("data-test-attached-card")?.includes("Spec/");
1471
+ });
1472
+ assert.false(hasAutoAttachedSpec, "No spec card should be auto-attached when spec panel is closed");
1473
+ });
1474
+ (0, import_qunit.test)("does not auto-attach spec card when no spec is selected", async function(assert) {
1475
+ await visitOperatorMode({
1476
+ submode: "code",
1477
+ codePath: `${testRealmURL}country.gts`,
1478
+ stacks: [[{
1479
+ id: `${testRealmURL}index`,
1480
+ format: "isolated"
1481
+ }]]
1482
+ });
1483
+ await click("[data-test-open-ai-assistant]");
1484
+ await waitFor(`[data-room-settled]`);
1485
+ await click("[data-test-module-inspector-view=\"spec\"]");
1486
+ assert.dom("[data-test-spec-selector-item-path]").doesNotExist();
1487
+ let autoAttachedCards = document.querySelectorAll("[data-test-autoattached-card]");
1488
+ let hasAutoAttachedSpec = Array.from(autoAttachedCards).some((card) => {
1489
+ return card.getAttribute("data-test-attached-card")?.includes("Spec/");
1490
+ });
1491
+ assert.false(hasAutoAttachedSpec, "No spec card should be auto-attached when no spec is selected");
1492
+ });
1493
+ (0, import_qunit.test)("manually attached spec cards do not duplicate auto-attached ones", async function(assert) {
1494
+ await visitOperatorMode({
1495
+ submode: "code",
1496
+ codePath: `${testRealmURL}plant.gts`,
1497
+ stacks: [[{
1498
+ id: `${testRealmURL}index`,
1499
+ format: "isolated"
1500
+ }]]
1501
+ });
1502
+ await click("[data-test-open-ai-assistant]");
1503
+ await waitFor(`[data-room-settled]`);
1504
+ await click("[data-test-module-inspector-view=\"spec\"]");
1505
+ await waitFor("[data-test-spec-selector-item-path]");
1506
+ await waitUntil(() => {
1507
+ let autoAttachedCards = document.querySelectorAll("[data-test-autoattached-card]");
1508
+ return Array.from(autoAttachedCards).some((card) => {
1509
+ return card.getAttribute("data-test-attached-card")?.includes("Spec/plant-spec");
1510
+ });
1511
+ });
1512
+ let autoAttachedCardsBefore = document.querySelectorAll("[data-test-autoattached-card]");
1513
+ let autoAttachedSpecId = Array.from(autoAttachedCardsBefore).find((card) => {
1514
+ return card.getAttribute("data-test-attached-card")?.includes("Spec/");
1515
+ })?.getAttribute("data-test-attached-card");
1516
+ if (autoAttachedSpecId) {
1517
+ await click("[data-test-attach-button]");
1518
+ await click("[data-test-attach-card-btn]");
1519
+ await fillIn("[data-test-search-field]", "Plant spec");
1520
+ await click(`[data-test-item-button="${autoAttachedSpecId}"]`);
1521
+ await click("[data-test-card-chooser-go-button]");
1522
+ let specCards = document.querySelectorAll(`[data-test-attached-card="${autoAttachedSpecId}"]`);
1523
+ assert.strictEqual(specCards.length, 1, "Spec card should only appear once, not duplicated");
1524
+ let remainingAutoAttachedCards = document.querySelectorAll("[data-test-autoattached-card]");
1525
+ let hasAutoAttachedSpec = Array.from(remainingAutoAttachedCards).some((card) => {
1526
+ return card.getAttribute("data-test-attached-card") === autoAttachedSpecId;
1527
+ });
1528
+ assert.false(hasAutoAttachedSpec, "Manually attached spec should no longer be auto-attached");
1529
+ } else assert.ok(false, "Expected a spec card to be auto-attached, but none was found");
1530
+ });
1531
+ (0, import_qunit.test)("manually attached cards and files persist through reload without duplicating auto attachments", async function(assert) {
1532
+ src_default.localStorage.removeItem(AiAssistantMessageDrafts);
1533
+ await visitOperatorMode({
1534
+ submode: "code",
1535
+ codePath: `${testRealmURL}plant.gts`,
1536
+ stacks: [[{
1537
+ id: `${testRealmURL}index`,
1538
+ format: "isolated"
1539
+ }]],
1540
+ aiAssistantOpen: true
1541
+ });
1542
+ await waitFor(`[data-room-settled]`);
1543
+ await click("[data-test-module-inspector-view=\"spec\"]");
1544
+ await waitFor("[data-test-spec-selector-item-path]");
1545
+ let autoAttachedSpecId;
1546
+ await waitUntil(() => {
1547
+ let autoAttachedCards = document.querySelectorAll("[data-test-autoattached-card]");
1548
+ let specCard = Array.from(autoAttachedCards).find((card) => {
1549
+ return card.getAttribute("data-test-attached-card")?.includes("Spec/");
1550
+ });
1551
+ if (specCard) {
1552
+ autoAttachedSpecId = specCard.getAttribute("data-test-attached-card");
1553
+ return true;
1554
+ }
1555
+ return false;
1556
+ });
1557
+ assert.ok(autoAttachedSpecId, "expected a spec card to be auto-attached");
1558
+ await click("[data-test-attach-button]");
1559
+ await click("[data-test-attach-card-btn]");
1560
+ await fillIn("[data-test-search-field]", "Plant spec");
1561
+ await click(`[data-test-item-button="${autoAttachedSpecId}"]`);
1562
+ await click("[data-test-card-chooser-go-button]");
1563
+ await click("[data-test-attach-button]");
1564
+ await click("[data-test-attach-file-btn]");
1565
+ await click("[data-test-file=\"plant.gts\"]");
1566
+ await click("[data-test-choose-file-modal-add-button]");
1567
+ await fillIn("[data-test-message-field]", "Reload keeps my draft");
1568
+ await visitOperatorMode({
1569
+ submode: "code",
1570
+ codePath: `${testRealmURL}plant.gts`,
1571
+ stacks: [[{
1572
+ id: `${testRealmURL}index`,
1573
+ format: "isolated"
1574
+ }]],
1575
+ aiAssistantOpen: true
1576
+ });
1577
+ await waitFor(`[data-test-room-settled]`);
1578
+ await click("[data-test-module-inspector-view=\"spec\"]");
1579
+ await waitFor("[data-test-spec-selector-item-path]");
1580
+ assert.dom("[data-test-message-field]").hasValue("Reload keeps my draft");
1581
+ assert.dom(`[data-test-attached-card="${autoAttachedSpecId}"]`).exists({ count: 1 });
1582
+ assert.dom(`[data-test-autoattached-card][data-test-attached-card="${autoAttachedSpecId}"]`).doesNotExist();
1583
+ assert.dom(`[data-test-attached-file="${testRealmURL}plant.gts"]`).exists({ count: 1 });
1584
+ assert.dom("[data-test-autoattached-file]").doesNotExist();
1585
+ });
1586
+ (0, import_qunit.test)("auto-attached spec card can be removed", async function(assert) {
1587
+ await visitOperatorMode({
1588
+ submode: "code",
1589
+ codePath: `${testRealmURL}plant.gts`,
1590
+ stacks: [[{
1591
+ id: `${testRealmURL}index`,
1592
+ format: "isolated"
1593
+ }]]
1594
+ });
1595
+ await click("[data-test-open-ai-assistant]");
1596
+ await waitFor(`[data-room-settled]`);
1597
+ await click("[data-test-module-inspector-view=\"spec\"]");
1598
+ await waitFor("[data-test-spec-selector-item-path]");
1599
+ await waitUntil(() => {
1600
+ let autoAttachedCards = document.querySelectorAll("[data-test-autoattached-card]");
1601
+ return Array.from(autoAttachedCards).some((card) => {
1602
+ return card.getAttribute("data-test-attached-card")?.includes("Spec/plant-spec");
1603
+ });
1604
+ });
1605
+ let autoAttachedSpecCard = Array.from(document.querySelectorAll("[data-test-autoattached-card]")).find((card) => {
1606
+ return card.getAttribute("data-test-attached-card")?.includes("Spec/");
1607
+ });
1608
+ if (autoAttachedSpecCard) {
1609
+ let specCardId = autoAttachedSpecCard.getAttribute("data-test-attached-card");
1610
+ await click(autoAttachedSpecCard.querySelector("[data-test-remove-card-btn]"));
1611
+ assert.dom(`[data-test-attached-card="${specCardId}"]`).doesNotExist();
1612
+ } else assert.ok(false, "Expected a spec card to be auto-attached, but none was found");
1613
+ });
1614
+ (0, import_qunit.test)("spec card re-auto-attaches when switching back to spec panel", async function(assert) {
1615
+ await visitOperatorMode({
1616
+ submode: "code",
1617
+ codePath: `${testRealmURL}plant.gts`,
1618
+ stacks: [[{
1619
+ id: `${testRealmURL}index`,
1620
+ format: "isolated"
1621
+ }]]
1622
+ });
1623
+ await click("[data-test-open-ai-assistant]");
1624
+ await waitFor(`[data-room-settled]`);
1625
+ await click("[data-test-module-inspector-view=\"spec\"]");
1626
+ await waitFor("[data-test-spec-selector-item-path]");
1627
+ await waitUntil(() => {
1628
+ let autoAttachedCards = document.querySelectorAll("[data-test-autoattached-card]");
1629
+ return Array.from(autoAttachedCards).some((card) => {
1630
+ return card.getAttribute("data-test-attached-card")?.includes("Spec/plant-spec");
1631
+ });
1632
+ });
1633
+ let autoAttachedSpecCards = Array.from(document.querySelectorAll("[data-test-autoattached-card]")).filter((card) => {
1634
+ return card.getAttribute("data-test-attached-card")?.includes("Spec/");
1635
+ });
1636
+ assert.ok(autoAttachedSpecCards.length > 0, "Spec card should be auto-attached when spec panel is open");
1637
+ await click("[data-test-module-inspector-view=\"schema\"]");
1638
+ let autoAttachedSpecCardsAfterSwitch = Array.from(document.querySelectorAll("[data-test-autoattached-card]")).filter((card) => {
1639
+ return card.getAttribute("data-test-attached-card")?.includes("Spec/");
1640
+ });
1641
+ assert.strictEqual(autoAttachedSpecCardsAfterSwitch.length, 0, "Spec card should not be auto-attached when spec panel is closed");
1642
+ await click("[data-test-module-inspector-view=\"spec\"]");
1643
+ await waitUntil(() => {
1644
+ let autoAttachedCards = document.querySelectorAll("[data-test-autoattached-card]");
1645
+ return Array.from(autoAttachedCards).some((card) => {
1646
+ return card.getAttribute("data-test-attached-card")?.includes("Spec/plant-spec");
1647
+ });
1648
+ });
1649
+ let autoAttachedSpecCardsAfterReturn = Array.from(document.querySelectorAll("[data-test-autoattached-card]")).filter((card) => {
1650
+ return card.getAttribute("data-test-attached-card")?.includes("Spec/");
1651
+ });
1652
+ assert.ok(autoAttachedSpecCardsAfterReturn.length > 0, "Spec card should be auto-attached again when returning to spec panel");
1653
+ });
1654
+ (0, import_qunit.test)("\"Add Same Skills\" copies skill configuration to new session", async function(assert) {
1655
+ await visitOperatorMode({
1656
+ stacks: [[{
1657
+ id: `${testRealmURL}index`,
1658
+ format: "isolated"
1659
+ }]],
1660
+ aiAssistantOpen: true
1661
+ });
1662
+ await waitFor(`[data-room-settled]`);
1663
+ await addSkillToAiAssistant(`${testRealmURL}Skill/example`);
1664
+ await addSkillToAiAssistant(`${testRealmURL}Skill/example2`);
1665
+ await click("[data-test-skill-menu]");
1666
+ await waitUntil(() => document.querySelectorAll("[data-test-skill-menu] [data-test-attached-card]")?.length === 2);
1667
+ assert.dom(`[data-test-skill-menu] [data-test-attached-card="${testRealmURL}Skill/example"]`).exists();
1668
+ assert.dom(`[data-test-skill-menu] [data-test-attached-card="${testRealmURL}Skill/example2"]`).exists();
1669
+ assert.dom(`[data-test-skill-toggle="${testRealmURL}Skill/example-on"`).exists();
1670
+ assert.dom(`[data-test-skill-toggle="${testRealmURL}Skill/example2-on"`).exists();
1671
+ await click(`[data-test-skill-toggle="${testRealmURL}Skill/example2-on"`);
1672
+ await waitFor(`[data-test-skill-toggle="${testRealmURL}Skill/example2-off"`);
1673
+ assert.dom(`[data-test-skill-toggle="${testRealmURL}Skill/example2-off"`).exists();
1674
+ await fillIn("[data-test-message-field]", "Enabling create new session button");
1675
+ await click("[data-test-send-message-btn]");
1676
+ let roomsBeforeSameSkills = getRoomIds();
1677
+ await click("[data-test-create-room-btn]", { shiftKey: true });
1678
+ await click("[data-test-new-session-settings-option=\"Add Same Skills\"]");
1679
+ await click("[data-test-new-session-settings-create-button]");
1680
+ await waitFor("[data-room-settled]");
1681
+ let duplicatedSkillsRoomId = getRoomIds().find((roomId) => !roomsBeforeSameSkills.includes(roomId));
1682
+ assert.ok(duplicatedSkillsRoomId, "Creating a new session with copied skills creates a new room");
1683
+ if (duplicatedSkillsRoomId) {
1684
+ let activeLLMState = getRoomState(duplicatedSkillsRoomId, APP_BOXEL_ACTIVE_LLM, "");
1685
+ assert.strictEqual(typeof activeLLMState.toolsSupported, "boolean", "New room active LLM event includes toolsSupported metadata");
1686
+ assert.true(Object.prototype.hasOwnProperty.call(activeLLMState, "reasoningEffort"), "New room active LLM event includes reasoningEffort metadata");
1687
+ }
1688
+ await click("[data-test-skill-menu][data-test-pill-menu-button]");
1689
+ await waitFor("[data-test-skill-menu]");
1690
+ await waitUntil(() => document.querySelectorAll("[data-test-skill-menu] [data-test-attached-card]")?.length === 2);
1691
+ assert.dom(`[data-test-skill-menu] [data-test-attached-card="${testRealmURL}Skill/example"]`).exists();
1692
+ assert.dom(`[data-test-skill-menu] [data-test-attached-card="${testRealmURL}Skill/example2"]`).exists();
1693
+ assert.dom(`[data-test-skill-toggle="${testRealmURL}Skill/example-on"`).exists();
1694
+ assert.dom(`[data-test-skill-toggle="${testRealmURL}Skill/example2-off"`).exists();
1695
+ await fillIn("[data-test-message-field]", "Enabling create new session button");
1696
+ await click("[data-test-send-message-btn]");
1697
+ let roomsBeforeNewSession = getRoomIds();
1698
+ await waitFor("[data-test-create-room-btn]:not([disabled])");
1699
+ await click("[data-test-create-room-btn]");
1700
+ await waitFor("[data-room-settled]");
1701
+ let newlyCreatedRoomId = getRoomIds().find((roomId) => !roomsBeforeNewSession.includes(roomId));
1702
+ assert.ok(newlyCreatedRoomId, "Creating a new session creates a new room");
1703
+ if (newlyCreatedRoomId) {
1704
+ let activeLLMState = getRoomState(newlyCreatedRoomId, APP_BOXEL_ACTIVE_LLM, "");
1705
+ assert.strictEqual(typeof activeLLMState.toolsSupported, "boolean", "Newly created room includes toolsSupported metadata");
1706
+ assert.true(Object.prototype.hasOwnProperty.call(activeLLMState, "reasoningEffort"), "Newly created room includes reasoningEffort metadata");
1707
+ }
1708
+ await click("[data-test-skill-menu][data-test-pill-menu-button]");
1709
+ await waitFor("[data-test-skill-menu]");
1710
+ try {
1711
+ await waitUntil(() => document.querySelectorAll("[data-test-skill-menu] [data-test-attached-card]")?.length === 1);
1712
+ } catch {
1713
+ let attached = Array.from(document.querySelectorAll("[data-test-skill-menu] [data-test-attached-card]")).map((el) => el.getAttribute("data-test-attached-card"));
1714
+ assert.ok(false, `Default skill never rendered on the new session's skill menu. Attached cards seen: ${JSON.stringify(attached)}; expected exactly [${skillsIndexId}].`);
1715
+ return;
1716
+ }
1717
+ assert.dom("[data-test-skill-menu] [data-test-attached-card]").exists({ count: 1 });
1718
+ assert.dom(`[data-test-skill-menu] [data-test-attached-card="${skillsIndexId}"]`).exists();
1719
+ });
1720
+ (0, import_qunit.test)("ask/act toggle defaults to ask on new session", async function(assert) {
1721
+ await visitOperatorMode({ stacks: [[{
1722
+ id: `${testRealmURL}index`,
1723
+ format: "isolated"
1724
+ }]] });
1725
+ await click("[data-test-open-ai-assistant]");
1726
+ await waitFor("[data-room-settled]");
1727
+ assert.dom("[data-test-llm-mode-option=\"ask\"]").hasClass("selected", "Ask is selected by default on new session");
1728
+ assert.dom("[data-test-llm-mode-option=\"act\"]").doesNotHaveClass("selected", "Act is not selected by default");
1729
+ });
1730
+ (0, import_qunit.test)("new session inherits llm mode from current room", async function(assert) {
1731
+ await visitOperatorMode({ stacks: [[{
1732
+ id: `${testRealmURL}index`,
1733
+ format: "isolated"
1734
+ }]] });
1735
+ await click("[data-test-open-ai-assistant]");
1736
+ await waitFor("[data-room-settled]");
1737
+ await click("[data-test-llm-mode-option=\"act\"]");
1738
+ assert.dom("[data-test-llm-mode-option=\"act\"]").hasClass("selected", "LLM mode is set to act");
1739
+ await fillIn("[data-test-message-field]", "Enable create new session button");
1740
+ await click("[data-test-send-message-btn]");
1741
+ let roomsBeforeNewSession = getRoomIds();
1742
+ await waitFor("[data-test-create-room-btn]:not([disabled])");
1743
+ await click("[data-test-create-room-btn]");
1744
+ await waitFor("[data-room-settled]");
1745
+ let newlyCreatedRoomId = getRoomIds().find((roomId) => !roomsBeforeNewSession.includes(roomId));
1746
+ assert.ok(newlyCreatedRoomId, "Creating a new session creates a new room");
1747
+ if (newlyCreatedRoomId) {
1748
+ let llmModeState = getRoomState(newlyCreatedRoomId, APP_BOXEL_LLM_MODE, "");
1749
+ assert.strictEqual(llmModeState?.mode, "act", "New session inherits LLM mode from current room");
1750
+ }
1751
+ });
1752
+ (0, import_qunit.test)("copies file history when creating new session with option checked", async function(assert) {
1753
+ await visitOperatorMode({
1754
+ submode: "interact",
1755
+ stacks: [[{
1756
+ id: `${testRealmURL}index`,
1757
+ format: "isolated"
1758
+ }]]
1759
+ });
1760
+ await click("[data-test-open-ai-assistant]");
1761
+ await waitFor(`[data-room-settled]`);
1762
+ await fillIn("[data-test-message-field]", "Message with card");
1763
+ await selectCardFromCatalog(`${testRealmURL}Person/hassan`);
1764
+ await click("[data-test-send-message-btn]");
1765
+ await fillIn("[data-test-message-field]", "Message with file");
1766
+ await click("[data-test-attach-button]");
1767
+ await click("[data-test-attach-file-btn]");
1768
+ await click("[data-test-file=\"pet.gts\"]");
1769
+ await click("[data-test-choose-file-modal-add-button]");
1770
+ await click("[data-test-send-message-btn]");
1771
+ await fillIn("[data-test-message-field]", "Message with another card");
1772
+ await selectCardFromCatalog(`${testRealmURL}Pet/mango`);
1773
+ await click("[data-test-send-message-btn]");
1774
+ assertMessages(assert, [
1775
+ {
1776
+ from: "testuser",
1777
+ message: "Message with card",
1778
+ cards: [{
1779
+ id: `${testRealmURL}Person/hassan`,
1780
+ cardTitle: "Hassan"
1781
+ }]
1782
+ },
1783
+ {
1784
+ from: "testuser",
1785
+ message: "Message with file",
1786
+ files: [{
1787
+ sourceUrl: `${testRealmURL}pet.gts`,
1788
+ name: "pet.gts"
1789
+ }]
1790
+ },
1791
+ {
1792
+ from: "testuser",
1793
+ message: "Message with another card",
1794
+ cards: [{
1795
+ id: `${testRealmURL}Pet/mango`,
1796
+ cardTitle: "Mango"
1797
+ }]
1798
+ }
1799
+ ]);
1800
+ await click("[data-test-create-room-btn]", { shiftKey: true });
1801
+ await click("[data-test-new-session-settings-option=\"Copy File History\"]");
1802
+ await click("[data-test-new-session-settings-create-button]");
1803
+ await waitFor(`[data-room-settled]`);
1804
+ await waitForSessionPreparationToFinish();
1805
+ await waitUntil(() => {
1806
+ return document.querySelectorAll("[data-test-message-idx]").length === 1;
1807
+ });
1808
+ assertMessages(assert, [{
1809
+ from: "testuser",
1810
+ message: "This session includes files and cards from the previous conversation for context.",
1811
+ cards: [{
1812
+ id: `${testRealmURL}Person/hassan`,
1813
+ cardTitle: "Hassan"
1814
+ }, {
1815
+ id: `${testRealmURL}Pet/mango`,
1816
+ cardTitle: "Mango"
1817
+ }],
1818
+ files: [{
1819
+ sourceUrl: `${testRealmURL}pet.gts`,
1820
+ name: "pet.gts"
1821
+ }]
1822
+ }]);
1823
+ });
1824
+ (0, import_qunit.test)("summarizes current session when creating new session with option checked", async function(assert) {
1825
+ await visitOperatorMode({
1826
+ submode: "interact",
1827
+ stacks: [[{
1828
+ id: `${testRealmURL}index`,
1829
+ format: "isolated"
1830
+ }]]
1831
+ });
1832
+ await click("[data-test-open-ai-assistant]");
1833
+ await waitFor(`[data-room-settled]`);
1834
+ await fillIn("[data-test-message-field]", "Hello, I need help with my project");
1835
+ await click("[data-test-send-message-btn]");
1836
+ await fillIn("[data-test-message-field]", "I want to create a new card for a person");
1837
+ await click("[data-test-send-message-btn]");
1838
+ await fillIn("[data-test-message-field]", "The person should have a name and age field");
1839
+ await click("[data-test-send-message-btn]");
1840
+ assertMessages(assert, [
1841
+ {
1842
+ from: "testuser",
1843
+ message: "Hello, I need help with my project"
1844
+ },
1845
+ {
1846
+ from: "testuser",
1847
+ message: "I want to create a new card for a person"
1848
+ },
1849
+ {
1850
+ from: "testuser",
1851
+ message: "The person should have a name and age field"
1852
+ }
1853
+ ]);
1854
+ await click("[data-test-create-room-btn]", { shiftKey: true });
1855
+ await click("[data-test-new-session-settings-option=\"Summarize Current Session\"]");
1856
+ await click("[data-test-new-session-settings-create-button]");
1857
+ await waitFor(`[data-room-settled]`);
1858
+ await waitForSessionPreparationToFinish();
1859
+ await waitUntil(() => document.querySelectorAll("[data-test-message-idx]").length >= 1, {
1860
+ timeout: 5e3,
1861
+ timeoutMessage: "timed out waiting for summary message to arrive in new session"
1862
+ });
1863
+ assertMessages(assert, [{
1864
+ from: "testuser",
1865
+ message: "This is a summary of the previous conversation that should be included as context for our discussion: This conversation focused on project help, specifically creating a new card for a person with name and age fields. The user requested assistance with card creation and field definition."
1866
+ }]);
1867
+ });
1868
+ (0, import_qunit.test)("summarizes current session with cards and files when creating new session", async function(assert) {
1869
+ await visitOperatorMode({
1870
+ submode: "interact",
1871
+ stacks: [[{
1872
+ id: `${testRealmURL}index`,
1873
+ format: "isolated"
1874
+ }]]
1875
+ });
1876
+ await click("[data-test-open-ai-assistant]");
1877
+ await waitFor(`[data-room-settled]`);
1878
+ await fillIn("[data-test-message-field]", "I have a person card here");
1879
+ await selectCardFromCatalog(`${testRealmURL}Person/hassan`);
1880
+ await click("[data-test-send-message-btn]");
1881
+ await fillIn("[data-test-message-field]", "And here is the pet definition file");
1882
+ await click("[data-test-attach-button]");
1883
+ await click("[data-test-attach-file-btn]");
1884
+ await click("[data-test-file=\"pet.gts\"]");
1885
+ await click("[data-test-choose-file-modal-add-button]");
1886
+ await click("[data-test-send-message-btn]");
1887
+ await fillIn("[data-test-message-field]", "Can you help me understand this structure?");
1888
+ await click("[data-test-send-message-btn]");
1889
+ await waitFor(`[data-room-settled]`);
1890
+ assertMessages(assert, [
1891
+ {
1892
+ from: "testuser",
1893
+ message: "I have a person card here",
1894
+ cards: [{
1895
+ id: `${testRealmURL}Person/hassan`,
1896
+ cardTitle: "Hassan"
1897
+ }]
1898
+ },
1899
+ {
1900
+ from: "testuser",
1901
+ message: "And here is the pet definition file",
1902
+ files: [{
1903
+ sourceUrl: `${testRealmURL}pet.gts`,
1904
+ name: "pet.gts"
1905
+ }]
1906
+ },
1907
+ {
1908
+ from: "testuser",
1909
+ message: "Can you help me understand this structure?"
1910
+ }
1911
+ ]);
1912
+ await click("[data-test-create-room-btn]", { shiftKey: true });
1913
+ await click("[data-test-new-session-settings-option=\"Summarize Current Session\"]");
1914
+ await click("[data-test-new-session-settings-create-button]");
1915
+ await waitFor(`[data-room-settled]`);
1916
+ await waitForSessionPreparationToFinish();
1917
+ await waitUntil(() => document.querySelectorAll("[data-test-message-idx]").length >= 1, { timeoutMessage: "timed out waiting for summary message to arrive in new session" });
1918
+ assertMessages(assert, [{
1919
+ from: "testuser",
1920
+ message: "This is a summary of the previous conversation that should be included as context for our discussion: This conversation involved discussing a person card (Hassan) and a pet definition file. The user shared both a Person card and a pet.gts file, then asked for help understanding the structure."
1921
+ }]);
1922
+ });
1923
+ (0, import_qunit.test)("handles summarization error gracefully when creating new session", async function(assert) {
1924
+ await visitOperatorMode({
1925
+ submode: "interact",
1926
+ stacks: [[{
1927
+ id: `${testRealmURL}index`,
1928
+ format: "isolated"
1929
+ }]]
1930
+ });
1931
+ await click("[data-test-open-ai-assistant]");
1932
+ await waitFor(`[data-room-settled]`);
1933
+ await fillIn("[data-test-message-field]", "Test message for summarization");
1934
+ await click("[data-test-send-message-btn]");
1935
+ const originalRequestForward = getService("realm-server").requestForward;
1936
+ getService("realm-server").requestForward = async () => {
1937
+ throw new Error("Summarization service unavailable");
1938
+ };
1939
+ await click("[data-test-create-room-btn]", { shiftKey: true });
1940
+ await click("[data-test-new-session-settings-option=\"Summarize Current Session\"]");
1941
+ await click("[data-test-new-session-settings-create-button]");
1942
+ await waitFor(`[data-room-settled]`);
1943
+ await waitForSessionPreparationToFinish();
1944
+ assertMessages(assert, []);
1945
+ getService("realm-server").requestForward = originalRequestForward;
1946
+ });
1947
+ (0, import_qunit.test)("skip button skips session preparation and shows correct wording", async function(assert) {
1948
+ const matrixService = getService("matrix-service");
1949
+ const originalGetPromptParts = matrixService.getPromptParts;
1950
+ let summarizationDeferred = new Deferred();
1951
+ matrixService.getPromptParts = async (roomId) => {
1952
+ await summarizationDeferred.promise;
1953
+ return originalGetPromptParts.call(matrixService, roomId);
1954
+ };
1955
+ await visitOperatorMode({
1956
+ submode: "interact",
1957
+ stacks: [[{
1958
+ id: `${testRealmURL}index`,
1959
+ format: "isolated"
1960
+ }]]
1961
+ });
1962
+ await click("[data-test-open-ai-assistant]");
1963
+ await waitFor(`[data-room-settled]`);
1964
+ await fillIn("[data-test-message-field]", "Test message for summarization");
1965
+ await click("[data-test-send-message-btn]");
1966
+ await click("[data-test-create-room-btn]", { shiftKey: true });
1967
+ await click("[data-test-new-session-settings-option=\"Summarize Current Session\"]");
1968
+ await click("[data-test-new-session-settings-create-button]");
1969
+ try {
1970
+ await waitFor("[data-test-session-preparation]");
1971
+ assert.dom("[data-test-session-preparation]").includesText("Summarizing previous session");
1972
+ assert.dom("[data-test-session-preparation]").includesText("Takes 10-20 seconds");
1973
+ await waitFor("[data-test-session-preparation-skip-button]");
1974
+ assert.dom("[data-test-session-preparation-skip-button]").hasText("Skip");
1975
+ await click("[data-test-session-preparation-skip-button]");
1976
+ await waitFor("[data-test-session-preparation]", { count: 0 });
1977
+ await waitFor("[data-test-message-field]");
1978
+ await waitUntil(() => {
1979
+ let field = document.querySelector("[data-test-message-field]");
1980
+ return Boolean(field && !field.hasAttribute("disabled"));
1981
+ });
1982
+ assert.dom("[data-test-message-field]").isNotDisabled();
1983
+ assertMessages(assert, []);
1984
+ } finally {
1985
+ summarizationDeferred.fulfill();
1986
+ matrixService.getPromptParts = originalGetPromptParts;
1987
+ }
1988
+ });
1989
+ (0, import_qunit.test)("ai assistant panel width persists to localStorage", async function(assert) {
1990
+ src_default.localStorage.removeItem("ai-assistant-panel-width");
1991
+ const testWidth = 60;
1992
+ src_default.localStorage.setItem("ai-assistant-panel-width", String(testWidth));
1993
+ let operatorModeStateParam = wrapper_default({
1994
+ stacks: [[{
1995
+ id: `${testRealmURL}index`,
1996
+ format: "isolated"
1997
+ }]],
1998
+ aiAssistantOpen: true
1999
+ });
2000
+ await visit(`/?operatorModeEnabled=true&operatorModeState=${encodeURIComponent(operatorModeStateParam)}`);
2001
+ assert.dom("[data-test-ai-assistant-panel]").exists();
2002
+ let aiAssistantPanel = document.querySelector("[data-test-ai-assistant-panel]");
2003
+ assert.ok(aiAssistantPanel, "AI assistant panel should exist");
2004
+ let initialWidth = aiAssistantPanel.getBoundingClientRect().width;
2005
+ assert.ok(initialWidth > 0, "AI assistant panel should have a width");
2006
+ let submodeLayout = document.querySelector("[data-test-submode-layout]");
2007
+ assert.ok(submodeLayout, "submode layout should exist");
2008
+ let actualPercentageWidth = initialWidth / submodeLayout.getBoundingClientRect().width * 100;
2009
+ let storedWidth = src_default.localStorage.getItem("ai-assistant-panel-width");
2010
+ assert.ok(storedWidth, "Width should be in localStorage");
2011
+ assert.strictEqual(Number(storedWidth), testWidth, "Stored width should match the test width");
2012
+ assert.ok(Math.abs(actualPercentageWidth - testWidth) < 5, `Actual panel width percentage (${actualPercentageWidth.toFixed(1)}%) should be close to stored width (${testWidth}%)`);
2013
+ let resizeHandle = document.querySelector("[data-boxel-panel-resize-handle-id]");
2014
+ assert.ok(resizeHandle, "Resize handle should exist");
2015
+ let resizeHandleRect = resizeHandle.getBoundingClientRect();
2016
+ await triggerEvent(resizeHandle, "pointerdown", {
2017
+ clientX: resizeHandleRect.x,
2018
+ clientY: resizeHandleRect.y
2019
+ });
2020
+ await triggerEvent(resizeHandle, "pointermove", {
2021
+ clientX: resizeHandleRect.x + 20,
2022
+ clientY: resizeHandleRect.y
2023
+ });
2024
+ await triggerEvent(resizeHandle, "pointerup");
2025
+ await waitFor("[data-test-ai-assistant-panel]");
2026
+ let updatedStoredWidth = src_default.localStorage.getItem("ai-assistant-panel-width");
2027
+ assert.ok(updatedStoredWidth, "Width should still be in localStorage after resize");
2028
+ let updatedParsedWidth = Number(updatedStoredWidth);
2029
+ assert.ok(updatedParsedWidth > 0, "Updated width should be a positive number");
2030
+ assert.ok(updatedParsedWidth <= 100, "Updated width should be a percentage (<= 100)");
2031
+ assert.notStrictEqual(updatedParsedWidth, testWidth, "Width should have changed after resize");
2032
+ let resizedWidth = aiAssistantPanel.getBoundingClientRect().width;
2033
+ assert.ok(resizedWidth > 0, "AI assistant panel should still have a width after resize");
2034
+ });
2035
+ (0, import_qunit.test)("creates new session with settings even when empty new session exists", async function(assert) {
2036
+ await visitOperatorMode({ stacks: [[{
2037
+ id: `${testRealmURL}index`,
2038
+ format: "isolated"
2039
+ }]] });
2040
+ await click("[data-test-open-ai-assistant]");
2041
+ await waitFor(`[data-room-settled]`);
2042
+ await fillIn("[data-test-message-field]", "First message with card");
2043
+ await selectCardFromCatalog(`${testRealmURL}Person/hassan`);
2044
+ await click("[data-test-send-message-btn]");
2045
+ await fillIn("[data-test-message-field]", "Second message with file");
2046
+ await click("[data-test-attach-button]");
2047
+ await click("[data-test-attach-file-btn]");
2048
+ await click("[data-test-file=\"pet.gts\"]");
2049
+ await click("[data-test-choose-file-modal-add-button]");
2050
+ await click("[data-test-send-message-btn]");
2051
+ await fillIn("[data-test-message-field]", "Third message with another card");
2052
+ await selectCardFromCatalog(`${testRealmURL}Pet/mango`);
2053
+ await click("[data-test-send-message-btn]");
2054
+ assertMessages(assert, [
2055
+ {
2056
+ from: "testuser",
2057
+ message: "First message with card",
2058
+ cards: [{
2059
+ id: `${testRealmURL}Person/hassan`,
2060
+ cardTitle: "Hassan"
2061
+ }]
2062
+ },
2063
+ {
2064
+ from: "testuser",
2065
+ message: "Second message with file",
2066
+ files: [{
2067
+ sourceUrl: `${testRealmURL}pet.gts`,
2068
+ name: "pet.gts"
2069
+ }]
2070
+ },
2071
+ {
2072
+ from: "testuser",
2073
+ message: "Third message with another card",
2074
+ cards: [{
2075
+ id: `${testRealmURL}Pet/mango`,
2076
+ cardTitle: "Mango"
2077
+ }]
2078
+ }
2079
+ ]);
2080
+ const matrixService = getService("matrix-service");
2081
+ const firstRoomId = matrixService.currentRoomId;
2082
+ assert.ok(firstRoomId, "Should have first room ID");
2083
+ await click("[data-test-create-room-btn]");
2084
+ await waitFor(`[data-room-settled]`);
2085
+ const secondRoomId = matrixService.currentRoomId;
2086
+ assert.ok(secondRoomId, "Should have second room ID");
2087
+ assert.notStrictEqual(secondRoomId, firstRoomId, "Second room should be different from first room");
2088
+ await click("[data-test-past-sessions-button]");
2089
+ await waitFor(`[data-test-enter-room="${firstRoomId}"]`);
2090
+ await click(`[data-test-enter-room="${firstRoomId}"]`);
2091
+ await waitFor(`[data-room-settled]`);
2092
+ assert.strictEqual(matrixService.currentRoomId, firstRoomId, "Should be back in the first room");
2093
+ assertMessages(assert, [
2094
+ {
2095
+ from: "testuser",
2096
+ message: "First message with card",
2097
+ cards: [{
2098
+ id: `${testRealmURL}Person/hassan`,
2099
+ cardTitle: "Hassan"
2100
+ }]
2101
+ },
2102
+ {
2103
+ from: "testuser",
2104
+ message: "Second message with file",
2105
+ files: [{
2106
+ sourceUrl: `${testRealmURL}pet.gts`,
2107
+ name: "pet.gts"
2108
+ }]
2109
+ },
2110
+ {
2111
+ from: "testuser",
2112
+ message: "Third message with another card",
2113
+ cards: [{
2114
+ id: `${testRealmURL}Pet/mango`,
2115
+ cardTitle: "Mango"
2116
+ }]
2117
+ }
2118
+ ]);
2119
+ await click("[data-test-create-room-btn]", { shiftKey: true });
2120
+ await click("[data-test-new-session-settings-option=\"Copy File History\"]");
2121
+ await click("[data-test-new-session-settings-create-button]");
2122
+ await waitFor(`[data-room-settled]`);
2123
+ await waitForSessionPreparationToFinish();
2124
+ await waitFor("[data-test-user-message]");
2125
+ const thirdRoomId = matrixService.currentRoomId;
2126
+ assert.ok(thirdRoomId, "Should have third room ID");
2127
+ assert.notStrictEqual(thirdRoomId, firstRoomId, "Third room should be different from first room");
2128
+ assert.notStrictEqual(thirdRoomId, secondRoomId, "Third room should be different from second room");
2129
+ assertMessages(assert, [{
2130
+ from: "testuser",
2131
+ message: "This session includes files and cards from the previous conversation for context.",
2132
+ cards: [{
2133
+ id: `${testRealmURL}Person/hassan`,
2134
+ cardTitle: "Hassan"
2135
+ }, {
2136
+ id: `${testRealmURL}Pet/mango`,
2137
+ cardTitle: "Mango"
2138
+ }],
2139
+ files: [{
2140
+ sourceUrl: `${testRealmURL}pet.gts`,
2141
+ name: "pet.gts"
2142
+ }]
2143
+ }]);
2144
+ });
2145
+ (0, import_qunit.test)("restores chat input of unsent messages", async function(assert) {
2146
+ await visitOperatorMode({ stacks: [[{
2147
+ id: `${testRealmURL}index`,
2148
+ format: "isolated"
2149
+ }]] });
2150
+ await click("[data-test-open-ai-assistant]");
2151
+ await waitFor(`[data-room-settled]`);
2152
+ const matrixService = getService("matrix-service");
2153
+ await waitFor(`[data-room-settled]`);
2154
+ let firstRoomId = matrixService.currentRoomId;
2155
+ assert.ok(firstRoomId, "Should have an initial room ID");
2156
+ if (!firstRoomId) throw new Error("Missing room ID for initial session");
2157
+ await waitFor(`[data-test-message-field="${firstRoomId}"]`);
2158
+ await fillIn(`[data-test-message-field="${firstRoomId}"]`, "hey, could you do something for me?");
2159
+ await click("[data-test-send-message-btn]");
2160
+ await fillIn(`[data-test-message-field="${firstRoomId}"]`, "how old is the sun?");
2161
+ await click("[data-test-create-room-btn]");
2162
+ await waitFor(`[data-room-settled]`);
2163
+ let secondRoomId = matrixService.currentRoomId;
2164
+ assert.ok(secondRoomId, "Should have a second room ID");
2165
+ if (!secondRoomId) throw new Error("Missing room ID for new session");
2166
+ assert.notStrictEqual(secondRoomId, firstRoomId, "Second room should be different from first room");
2167
+ await waitFor(`[data-test-message-field="${secondRoomId}"]`);
2168
+ assert.dom(`[data-test-message-field="${secondRoomId}"]`).hasValue("", "New room starts with an empty chat input");
2169
+ await click("[data-test-past-sessions-button]");
2170
+ await waitFor(`[data-test-enter-room="${firstRoomId}"]`);
2171
+ await click(`[data-test-enter-room="${firstRoomId}"]`);
2172
+ await waitFor(`[data-room-settled]`);
2173
+ await waitUntil(() => matrixService.currentRoomId === firstRoomId);
2174
+ await waitFor(`[data-test-message-field="${firstRoomId}"]`);
2175
+ assert.dom(`[data-test-message-field="${firstRoomId}"]`).hasValue("how old is the sun?", "Draft message is restored when returning to the original room");
2176
+ });
2177
+ (0, import_qunit.test)("failed send leaves a failed bubble + retry alert; input clears at click-time", async function(assert) {
2178
+ await visitOperatorMode({ stacks: [[{
2179
+ id: `${testRealmURL}index`,
2180
+ format: "isolated"
2181
+ }]] });
2182
+ await click("[data-test-open-ai-assistant]");
2183
+ await waitFor(`[data-room-settled]`);
2184
+ const matrixService = getService("matrix-service");
2185
+ let roomId = matrixService.currentRoomId;
2186
+ assert.ok(roomId, "Should have a room ID");
2187
+ if (!roomId) throw new Error("Missing room ID for message failure test");
2188
+ await waitFor(`[data-test-message-field="${roomId}"]`);
2189
+ const originalSendMessage = matrixService.sendMessage;
2190
+ let sendAttempts = 0;
2191
+ matrixService.sendMessage = async function(..._args) {
2192
+ sendAttempts++;
2193
+ throw new Error("Intentional failure for test");
2194
+ };
2195
+ const failingMessage = "This message should trigger an error";
2196
+ try {
2197
+ await fillIn(`[data-test-message-field="${roomId}"]`, failingMessage);
2198
+ await waitUntil(() => matrixService.getMessageToSend(roomId) === failingMessage);
2199
+ await click("[data-test-send-message-btn]");
2200
+ await waitFor("[data-test-boxel-alert=\"error\"]");
2201
+ assert.strictEqual(sendAttempts, 1, "sendMessage was attempted once");
2202
+ assert.dom("[data-test-user-message]").exists({ count: 1 });
2203
+ assert.dom("[data-test-card-error]").containsText("Failed to send");
2204
+ assert.dom("[data-test-alert-action-button=\"Retry\"]").exists();
2205
+ assert.dom(`[data-test-message-field="${roomId}"]`).hasValue("", "input clears at click-time — the message lives in the bubble now");
2206
+ } finally {
2207
+ matrixService.sendMessage = originalSendMessage;
2208
+ }
2209
+ });
2210
+ });
2211
+ //#endregion