@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
@@ -1,2468 +0,0 @@
1
- import { s as __toESM } from "./chunk-Rp0pCe6z.js";
2
- import { Ar as testRealmURL, Xn as APP_BOXEL_ROOM_SKILLS_EVENT_TYPE, jn as APP_BOXEL_ACTIVE_LLM, or as CAPTURE_SOURCE_URL_PREFIX, sr as DEFAULT_FALLBACK_MODELS, uo as SupportedMimeType } from "./runtime-common-ClpqhbwG.js";
3
- import { T as settled } from "./dist-BOAdzfkP.js";
4
- import { r as runRealmCode, t as RunRealmCodeTool } from "./run-realm-code-DyVyEDBl.js";
5
- import { t as require_qunit } from "./qunit-C-Foo4Nd.js";
6
- import { Ct as testRealmSecretSeed, F as setupLocalIndexing, L as setupRealmCacheTeardown, P as setupIntegrationTestRealm, R as setupRealmServerEndpoints, St as createJWT, Z as withCachedRealmSetup, lt as setupRenderingTest, t as setupMockMatrix } from "./mock-matrix-DPQ0j2MD.js";
7
- import { r as getService } from "./dist-CPfIHBla.js";
8
- //#region tests/integration/tools/run-realm-code-test.gts
9
- var import_qunit = /* @__PURE__ */ __toESM(require_qunit());
10
- var otherRealmURL = "http://test-realm/test2/";
11
- function knowReadableWorkspace(identifier) {
12
- getService("realm").getOrCreateRealmResource(identifier, createJWT({
13
- user: "@testuser:localhost",
14
- realm: identifier,
15
- sessionRoom: "boxel-session-room-id",
16
- permissions: ["read"],
17
- realmServerURL: "http://test-realm/"
18
- }, "1d", testRealmSecretSeed), { exact: true });
19
- }
20
- function recipeJSON(name, attributes, chef, module = "../recipe", helpers = []) {
21
- let relationships = {};
22
- if (chef) relationships.chef = { links: { self: chef } };
23
- helpers.forEach((helper, index) => {
24
- relationships[`helpers.${index}`] = { links: { self: helper } };
25
- });
26
- return `${JSON.stringify({ data: {
27
- type: "card",
28
- attributes,
29
- ...Object.keys(relationships).length ? { relationships } : {},
30
- meta: { adoptsFrom: {
31
- module,
32
- name
33
- } }
34
- } }, null, 2)}\n`;
35
- }
36
- var PNG_BASE64 = "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==";
37
- (0, import_qunit.module)("Integration | tools | run-realm-code", function(hooks) {
38
- setupRenderingTest(hooks);
39
- setupLocalIndexing(hooks);
40
- let mockMatrixUtils = setupMockMatrix(hooks, {
41
- activeRealms: [testRealmURL, otherRealmURL],
42
- autostart: true
43
- });
44
- let captureRequests = [];
45
- setupRealmServerEndpoints(hooks, [{
46
- route: "_capture",
47
- getResponse: async (req) => {
48
- captureRequests.push(await req.clone().json());
49
- return new Response(JSON.stringify({ data: {
50
- type: "capture-result",
51
- attributes: {
52
- status: "ready",
53
- base64: PNG_BASE64,
54
- width: 1,
55
- height: 1,
56
- contentType: "image/png"
57
- }
58
- } }), {
59
- status: 201,
60
- headers: { "Content-Type": "application/vnd.api+json" }
61
- });
62
- }
63
- }]);
64
- setupRealmCacheTeardown(hooks);
65
- hooks.beforeEach(function() {
66
- captureRequests = [];
67
- });
68
- hooks.beforeEach(async function() {
69
- await withCachedRealmSetup(async () => setupIntegrationTestRealm({
70
- mockMatrixUtils,
71
- contents: {
72
- "task.json": `{
73
- "title": "Old title",
74
- "count": 1
75
- }
76
- `,
77
- "notes/first.md": "# First\n",
78
- "images/existing.png": Uint8Array.from(atob(PNG_BASE64), (char) => char.charCodeAt(0)),
79
- "docs/report.docx": Uint8Array.from([
80
- 80,
81
- 75,
82
- 3,
83
- 4,
84
- 20,
85
- 0,
86
- 6,
87
- 0,
88
- 255,
89
- 254,
90
- 156
91
- ]),
92
- "docs/README": "Plain text with no extension\n",
93
- "docs/replacement.txt": "A replacement character: �\n",
94
- "docs/latin1.txt": Uint8Array.from([
95
- 99,
96
- 97,
97
- 102,
98
- 233,
99
- 10
100
- ]),
101
- "unformatted.gts": `import { CardDef } from "@cardstack/base/card-api"
102
- export class Unformatted extends CardDef {}
103
- `,
104
- "skills/test-skill/SKILL.md": `---
105
- name: Test Skill
106
- description: A skill a script turns on
107
- boxel:
108
- kind: skill
109
- ---
110
- # Test Skill
111
- `,
112
- "pet.gts": `
113
- import { CardDef, field, contains } from '@cardstack/base/card-api';
114
- import StringField from '@cardstack/base/string';
115
-
116
- export class Pet extends CardDef {
117
- static displayName = 'Pet';
118
- @field name = contains(StringField);
119
- }
120
- `,
121
- "Pet/mango.json": { data: {
122
- type: "card",
123
- attributes: { name: "Mango" },
124
- meta: { adoptsFrom: {
125
- module: "../pet",
126
- name: "Pet"
127
- } }
128
- } },
129
- "Spec/pet.json": { data: {
130
- type: "card",
131
- attributes: {
132
- cardTitle: "Pet",
133
- cardDescription: "A pet with a name",
134
- specType: "card",
135
- readMe: "# Pet\n\nUse Pet for any animal with a name.",
136
- ref: {
137
- module: "../pet",
138
- name: "Pet"
139
- }
140
- },
141
- meta: { adoptsFrom: {
142
- module: "@cardstack/base/spec",
143
- name: "Spec"
144
- } }
145
- } },
146
- "Plain/base-typed.json": { data: {
147
- type: "card",
148
- meta: { adoptsFrom: {
149
- module: "@cardstack/base/card-api",
150
- name: "CardDef"
151
- } }
152
- } },
153
- "recipe.gts": `
154
- import { contains, field, linksTo, linksToMany, CardDef } from "@cardstack/base/card-api";
155
- import StringField from "@cardstack/base/string";
156
-
157
- export class Chef extends CardDef {
158
- static displayName = 'Chef';
159
- @field name = contains(StringField);
160
- @field cardTitle = contains(StringField, {
161
- computeVia: function (this: Chef) {
162
- return this.name;
163
- },
164
- });
165
- }
166
-
167
- export class Recipe extends CardDef {
168
- static displayName = 'Recipe';
169
- @field name = contains(StringField);
170
- @field cuisine = contains(StringField);
171
- @field chef = linksTo(Chef);
172
- @field helpers = linksToMany(Chef);
173
- @field cardTitle = contains(StringField, {
174
- computeVia: function (this: Recipe) {
175
- return 'Recipe: ' + this.name;
176
- },
177
- });
178
- }
179
- `,
180
- "person.gts": `
181
- import { contains, field, linksTo, CardDef } from "@cardstack/base/card-api";
182
- import StringField from "@cardstack/base/string";
183
-
184
- export class Person extends CardDef {
185
- @field firstName = contains(StringField);
186
- @field friend = linksTo(() => Person);
187
- @field cardTitle = contains(StringField, {
188
- computeVia: function (this: Person) {
189
- return this.firstName;
190
- },
191
- });
192
- }
193
- `,
194
- "Chef/ana.json": recipeJSON("Chef", { name: "Ana" }),
195
- "Recipe/pancakes.json": recipeJSON("Recipe", {
196
- name: "Pancakes",
197
- cuisine: "unknown"
198
- }, "../Chef/ana"),
199
- "Recipe/ramen.json": recipeJSON("Recipe", {
200
- name: "Ramen",
201
- cuisine: "Japanese"
202
- }, void 0, "../recipe", ["../Chef/ana"]),
203
- "Recipe/desserts/tiramisu.json": recipeJSON("Recipe", {
204
- name: "Tiramisu",
205
- cuisine: "unknown"
206
- }, void 0, "../../recipe"),
207
- "people/hassan.json": { data: {
208
- attributes: { firstName: "Hassan" },
209
- relationships: { friend: { links: { self: "./mango" } } },
210
- meta: { adoptsFrom: {
211
- module: "../person",
212
- name: "Person"
213
- } }
214
- } },
215
- "people/mango.json": { data: {
216
- attributes: { firstName: "Mango" },
217
- meta: { adoptsFrom: {
218
- module: "../person",
219
- name: "Person"
220
- } }
221
- } }
222
- }
223
- }));
224
- await withCachedRealmSetup(async () => setupIntegrationTestRealm({
225
- mockMatrixUtils,
226
- realmURL: otherRealmURL,
227
- contents: { "Recipe/elsewhere.json": recipeJSON("Recipe", {
228
- name: "Elsewhere",
229
- cuisine: "unknown"
230
- }, void 0, `${testRealmURL}recipe`) }
231
- }));
232
- await getService("realm").login(testRealmURL);
233
- });
234
- (0, import_qunit.test)("realm.capture attaches a capture to the result and tells the script only what it needs", async function(assert) {
235
- let result = await new RunRealmCodeTool(getService("tool-service").toolContext).execute({
236
- realm: testRealmURL,
237
- roomId: "!room:example.com",
238
- code: `return await realm.capture('task.json');`
239
- });
240
- assert.strictEqual(captureRequests.length, 1, "one capture request");
241
- assert.strictEqual(captureRequests[0].data.attributes.fileURL, `${testRealmURL}task.json`);
242
- assert.deepEqual(JSON.parse(result.scriptResult), {
243
- path: "task.json",
244
- kind: "file",
245
- format: "isolated",
246
- width: 1,
247
- height: 1,
248
- attached: true
249
- });
250
- assert.strictEqual(result.captures.length, 1, "the capture rides the result");
251
- assert.strictEqual(result.captures[0].contentType, "image/png");
252
- assert.ok(result.captures[0].url, "the capture is uploaded to the room");
253
- });
254
- (0, import_qunit.test)("the result attaches the files the run saved, then the captures it took", async function(assert) {
255
- let command = new RunRealmCodeTool(getService("tool-service").toolContext);
256
- let result = await command.execute({
257
- realm: testRealmURL,
258
- roomId: "!room:example.com",
259
- code: `await realm.fs.writeText('seen.json', '{}');
260
- return await realm.capture('seen.json');`
261
- });
262
- let attachments = command.resultAttachments(result);
263
- assert.deepEqual(attachments.map((file) => file.sourceUrl), [`${testRealmURL}seen.json`, result.captures[0].sourceUrl], "the saved file, then the capture");
264
- assert.strictEqual(attachments[0].url, void 0, "the saved file is uploaded from the realm when the result is sent");
265
- assert.strictEqual(attachments[1].url, result.captures[0].url, "the capture rides as the media already uploaded");
266
- assert.true(attachments[1].sourceUrl.startsWith(CAPTURE_SOURCE_URL_PREFIX), `the capture is named by a capture source URL, which keeps it out of correctness checks: ${attachments[1].sourceUrl}`);
267
- });
268
- (0, import_qunit.test)("opens the card the script returns to show", async function(assert) {
269
- let toolService = getService("tool-service");
270
- let operatorModeStateService = getService("operator-mode-state-service");
271
- operatorModeStateService.restore({
272
- stacks: [[]],
273
- submode: "interact"
274
- });
275
- let result = await new RunRealmCodeTool(toolService.toolContext).execute({
276
- realm: testRealmURL,
277
- roomId: "!room:example.com",
278
- code: `await realm.fs.writeText('Pet/biscuit.json', JSON.stringify({
279
- data: {
280
- attributes: { name: 'Biscuit' },
281
- meta: { adoptsFrom: { module: '../pet', name: 'Pet' } },
282
- },
283
- }));
284
- return { show: 'Pet/biscuit' };`
285
- });
286
- assert.strictEqual(result.files[0]?.status, "saved");
287
- assert.strictEqual(result.shownCard, `${testRealmURL}Pet/biscuit`);
288
- assert.notOk(result.showError);
289
- let shownIds = operatorModeStateService.state.stacks.flat().map((item) => item.id);
290
- assert.true(shownIds.includes(`${testRealmURL}Pet/biscuit`), "the card is open on a stack");
291
- });
292
- (0, import_qunit.test)("show opens a file that is not a card in code mode", async function(assert) {
293
- let toolService = getService("tool-service");
294
- let operatorModeStateService = getService("operator-mode-state-service");
295
- operatorModeStateService.restore({
296
- stacks: [[]],
297
- submode: "interact"
298
- });
299
- let result = await new RunRealmCodeTool(toolService.toolContext).execute({
300
- realm: testRealmURL,
301
- roomId: "!room:example.com",
302
- code: `return { show: 'notes/first.md' };`
303
- });
304
- assert.strictEqual(result.shownCard, `${testRealmURL}notes/first.md`);
305
- assert.notOk(result.showError);
306
- assert.strictEqual(operatorModeStateService.state.submode, "code");
307
- assert.strictEqual(operatorModeStateService.state.codePath, `${testRealmURL}notes/first.md`);
308
- });
309
- (0, import_qunit.test)("a card it cannot show does not fail the run", async function(assert) {
310
- let toolService = getService("tool-service");
311
- let operatorModeStateService = getService("operator-mode-state-service");
312
- operatorModeStateService.restore({
313
- stacks: [[]],
314
- submode: "interact"
315
- });
316
- let command = new RunRealmCodeTool(toolService.toolContext);
317
- let result = await command.execute({
318
- realm: testRealmURL,
319
- roomId: "!room:example.com",
320
- code: `await realm.fs.writeText('seen.json', '{}');
321
- return { show: 'Pet/missing' };`
322
- });
323
- assert.strictEqual(result.files[0]?.status, "saved", "files still report");
324
- assert.notOk(result.shownCard);
325
- assert.true(/Not found: .*Pet\/missing/.test(result.showError ?? ""), `says why: ${result.showError}`);
326
- let outside = await command.execute({
327
- realm: testRealmURL,
328
- roomId: "!room:example.com",
329
- code: `return { show: 'https://example.com/card' };`
330
- });
331
- assert.true(/Path is outside this realm/.test(outside.showError ?? ""), `refuses another realm: ${outside.showError}`);
332
- assert.deepEqual(operatorModeStateService.state.stacks.flat(), [], "nothing is opened");
333
- });
334
- (0, import_qunit.test)("realm.capture refuses a fourth capture in one run", async function(assert) {
335
- let command = new RunRealmCodeTool(getService("tool-service").toolContext);
336
- await assert.rejects(command.execute({
337
- realm: testRealmURL,
338
- roomId: "!room:example.com",
339
- code: `for (let i = 0; i < 4; i++) { await realm.capture('task.json'); }`
340
- }), /realm\.capture may run at most 3 times in one run/);
341
- assert.strictEqual(captureRequests.length, 3, "three captures were taken");
342
- });
343
- (0, import_qunit.test)("realm.capture captures a card by its path or its id, with the options it is given", async function(assert) {
344
- let result = await new RunRealmCodeTool(getService("tool-service").toolContext).execute({
345
- realm: testRealmURL,
346
- roomId: "!room:example.com",
347
- code: `return [
348
- await realm.capture('Pet/mango'),
349
- await realm.capture('${testRealmURL}Pet/mango', {
350
- format: 'embedded',
351
- viewportWidth: 600,
352
- viewportHeight: 400,
353
- }),
354
- ];`
355
- });
356
- assert.strictEqual(captureRequests.length, 2, "two capture requests");
357
- let [byPath, byId] = captureRequests.map((r) => r.data.attributes);
358
- assert.strictEqual(byPath.cardId, `${testRealmURL}Pet/mango`);
359
- assert.strictEqual(byId.cardId, `${testRealmURL}Pet/mango`);
360
- assert.strictEqual(byId.format, "embedded");
361
- assert.deepEqual(byId.captureSpec, { viewport: {
362
- width: 600,
363
- height: 400
364
- } });
365
- let [first, second] = JSON.parse(result.scriptResult);
366
- assert.strictEqual(first.path, "Pet/mango");
367
- assert.strictEqual(first.kind, "card");
368
- assert.strictEqual(second.path, "Pet/mango", "a URL in the run realm is named by its path");
369
- assert.strictEqual(second.format, "embedded");
370
- assert.strictEqual(result.captures.length, 2);
371
- });
372
- (0, import_qunit.test)("realm.capture refuses a URL outside every workspace", async function(assert) {
373
- let command = new RunRealmCodeTool(getService("tool-service").toolContext);
374
- await assert.rejects(command.execute({
375
- realm: testRealmURL,
376
- roomId: "!room:example.com",
377
- code: `await realm.capture('https://example.com/page.html');`
378
- }), /not in a workspace the user can read/);
379
- assert.strictEqual(captureRequests.length, 0, "no capture is attempted");
380
- });
381
- (0, import_qunit.test)("realm.capture finds the workspace of a prefixed id, whatever form the workspace is known by", async function(assert) {
382
- let { virtualNetwork } = getService("network");
383
- virtualNetwork.addRealmMapping("@test/mapped/", "http://test-realm/mapped/");
384
- try {
385
- knowReadableWorkspace("@test/mapped/");
386
- let result = await new RunRealmCodeTool(getService("tool-service").toolContext).execute({
387
- realm: testRealmURL,
388
- roomId: "!room:example.com",
389
- code: `return await realm.capture('@test/mapped/Pet/mango');`
390
- });
391
- assert.strictEqual(captureRequests.length, 1, "one capture request");
392
- let { realmURL, cardId } = captureRequests[0].data.attributes;
393
- assert.strictEqual(realmURL, "http://test-realm/mapped/");
394
- assert.strictEqual(cardId, "http://test-realm/mapped/Pet/mango");
395
- assert.strictEqual(JSON.parse(result.scriptResult).path, "@test/mapped/Pet/mango", "the capture is named by the id the script gave");
396
- } finally {
397
- virtualNetwork.removeRealmMapping("@test/mapped/");
398
- }
399
- });
400
- (0, import_qunit.test)("realm.capture asks a workspace nested under the run realm for its own card, and names it by its URL", async function(assert) {
401
- let nestedRealmURL = `${testRealmURL}nested/`;
402
- knowReadableWorkspace(nestedRealmURL);
403
- let result = await new RunRealmCodeTool(getService("tool-service").toolContext).execute({
404
- realm: testRealmURL,
405
- roomId: "!room:example.com",
406
- code: `return [
407
- await realm.capture('${nestedRealmURL}Pet/mango'),
408
- await realm.capture('${testRealmURL}Pet/mango'),
409
- ];`
410
- });
411
- assert.deepEqual(captureRequests.map((r) => r.data.attributes.realmURL), [nestedRealmURL, testRealmURL], "each capture is asked of the deepest workspace that holds it");
412
- let [nested, own] = JSON.parse(result.scriptResult);
413
- assert.strictEqual(nested.path, `${nestedRealmURL}Pet/mango`, "a card in the nested workspace keeps its URL");
414
- assert.strictEqual(own.path, "Pet/mango");
415
- });
416
- (0, import_qunit.test)("realm.cards.get returns a card as data, with computed fields and absolute URLs", async function(assert) {
417
- let command = new RunRealmCodeTool(getService("tool-service").toolContext);
418
- let result = await command.execute({
419
- realm: testRealmURL,
420
- roomId: "!room:example.com",
421
- code: `return {
422
- bare: await realm.cards.get('people/hassan'),
423
- withExtension: await realm.cards.get('people/hassan.json'),
424
- byURL: await realm.cards.get(${JSON.stringify(`${testRealmURL}people/hassan`)}),
425
- };`
426
- });
427
- assert.deepEqual(result.files, [], "reading a card saves nothing");
428
- let { bare, withExtension, byURL } = JSON.parse(result.scriptResult);
429
- assert.strictEqual(bare.path, "people/hassan.json");
430
- assert.strictEqual(bare.id, `${testRealmURL}people/hassan`);
431
- assert.deepEqual(bare.type, {
432
- module: `${testRealmURL}person`,
433
- name: "Person"
434
- });
435
- assert.strictEqual(bare.attributes.firstName, "Hassan");
436
- assert.strictEqual(bare.attributes.cardTitle, "Hassan", "computed fields are included");
437
- assert.deepEqual(bare.relationships, { friend: `${testRealmURL}people/mango` }, "links are keyed by field path, as realm.cards.search returns them");
438
- assert.deepEqual(withExtension, bare, "a .json path reads the same card");
439
- assert.deepEqual(byURL, bare, "a URL reads the same card");
440
- let afterEdit = await command.execute({
441
- realm: testRealmURL,
442
- roomId: "!room:example.com",
443
- code: `await realm.cards.get('people/hassan');
444
- await realm.fs.replace('people/hassan.json', '"Hassan"', '"Hassan Abdel"');
445
- return await realm.cards.get('people/hassan');`
446
- });
447
- assert.strictEqual(JSON.parse(afterEdit.scriptResult).attributes.firstName, "Hassan Abdel", "a card read after an edit in the same run shows the edit");
448
- await assert.rejects(command.execute({
449
- realm: testRealmURL,
450
- roomId: "!room:example.com",
451
- code: `await realm.cards.get('people/missing');`
452
- }), /Card not found/);
453
- await assert.rejects(command.execute({
454
- realm: testRealmURL,
455
- roomId: "!room:example.com",
456
- code: `await realm.cards.get('https://example.com/card');`
457
- }), /Path is outside this realm/);
458
- });
459
- (0, import_qunit.test)("replays a replacement against the source that was read", async function(assert) {
460
- let toolService = getService("tool-service");
461
- let cardService = getService("card-service");
462
- let command = new RunRealmCodeTool(toolService.toolContext);
463
- let fileUrl = `${testRealmURL}task.json`;
464
- let result = await command.execute({
465
- realm: testRealmURL,
466
- roomId: "!room:example.com",
467
- code: `await realm.fs.replace(${JSON.stringify(fileUrl)}, '"Old title"', '"New title"');`
468
- });
469
- assert.strictEqual(result.files[0]?.status, "saved");
470
- let source = await cardService.getSource(new URL(fileUrl));
471
- assert.strictEqual(source.content, `{
472
- "title": "New title",
473
- "count": 1
474
- }
475
- `);
476
- });
477
- (0, import_qunit.test)("creates a declared source file", async function(assert) {
478
- let toolService = getService("tool-service");
479
- let cardService = getService("card-service");
480
- let command = new RunRealmCodeTool(toolService.toolContext);
481
- let fileUrl = `${testRealmURL}new-task.json`;
482
- let result = await command.execute({
483
- realm: testRealmURL,
484
- roomId: "!room:example.com",
485
- code: `await realm.fs.writeText(${JSON.stringify(fileUrl)}, '{\\n "title": "New task"\\n}\\n');`
486
- });
487
- assert.strictEqual(result.files[0]?.status, "saved");
488
- let source = await cardService.getSource(new URL(fileUrl));
489
- assert.strictEqual(source.status, 200);
490
- assert.strictEqual(source.content, "{\n \"title\": \"New task\"\n}\n");
491
- });
492
- (0, import_qunit.test)("realm.fs.writeBytes saves the decoded bytes of a new binary file", async function(assert) {
493
- let toolService = getService("tool-service");
494
- let network = getService("network");
495
- let result = await new RunRealmCodeTool(toolService.toolContext).execute({
496
- realm: testRealmURL,
497
- roomId: "!room:example.com",
498
- code: `let saved = await realm.fs.writeBytes('images/dot.png', ${JSON.stringify(PNG_BASE64)});
499
- return { saved, exists: await realm.fs.exists('images/dot.png') };`
500
- });
501
- let expected = Uint8Array.from(atob(PNG_BASE64), (char) => char.charCodeAt(0));
502
- assert.deepEqual(JSON.parse(result.scriptResult), {
503
- saved: {
504
- path: "images/dot.png",
505
- size: expected.byteLength,
506
- saved: true
507
- },
508
- exists: true
509
- });
510
- assert.deepEqual(result.files.map((file) => [
511
- file.fileUrl,
512
- file.status,
513
- file.detail
514
- ]), [[
515
- `${testRealmURL}images/dot.png`,
516
- "saved",
517
- "Binary file saved."
518
- ]]);
519
- let response = await network.authedFetch(new URL("images/dot.png", testRealmURL));
520
- assert.strictEqual(response.status, 200);
521
- assert.deepEqual(Array.from(new Uint8Array(await response.arrayBuffer())), Array.from(expected), "the realm holds the decoded bytes");
522
- });
523
- (0, import_qunit.test)("realm.fs.writeBytes accepts a base64 data URL", async function(assert) {
524
- let result = await new RunRealmCodeTool(getService("tool-service").toolContext).execute({
525
- realm: testRealmURL,
526
- roomId: "!room:example.com",
527
- code: `return await realm.fs.writeBytes('dot.png', ${JSON.stringify(`data:image/png;base64,${PNG_BASE64}`)});`
528
- });
529
- assert.true(JSON.parse(result.scriptResult).saved);
530
- });
531
- (0, import_qunit.test)("realm.fs.writeBytes refuses a file that exists, and content that is not base64", async function(assert) {
532
- let command = new RunRealmCodeTool(getService("tool-service").toolContext);
533
- await assert.rejects(command.execute({
534
- realm: testRealmURL,
535
- roomId: "!room:example.com",
536
- code: `await realm.fs.writeBytes('task.json', ${JSON.stringify(PNG_BASE64)});`
537
- }), /File already exists/, "refuses an existing text file");
538
- await command.execute({
539
- realm: testRealmURL,
540
- roomId: "!room:example.com",
541
- code: `await realm.fs.writeBytes('dot.png', ${JSON.stringify(PNG_BASE64)});`
542
- });
543
- await assert.rejects(command.execute({
544
- realm: testRealmURL,
545
- roomId: "!room:example.com",
546
- code: `await realm.fs.writeBytes('dot.png', ${JSON.stringify(PNG_BASE64)});`
547
- }), /File already exists/, "refuses an existing binary file");
548
- await assert.rejects(command.execute({
549
- realm: testRealmURL,
550
- roomId: "!room:example.com",
551
- code: `await realm.fs.writeBytes('bad.png', 'not base64!');`
552
- }), /not valid base64/);
553
- await assert.rejects(command.execute({
554
- realm: testRealmURL,
555
- roomId: "!room:example.com",
556
- code: `await realm.fs.readText('dot.png');`
557
- }), /is a binary file/, "readText names a binary file instead of failing on its status");
558
- await command.execute({
559
- realm: testRealmURL,
560
- roomId: "!room:example.com",
561
- code: `await realm.fs.writeBytes('report.xlsx', ${JSON.stringify(PNG_BASE64)});`
562
- });
563
- await assert.rejects(command.execute({
564
- realm: testRealmURL,
565
- roomId: "!room:example.com",
566
- code: `await realm.fs.replace('report.xlsx', 'a', 'b');`
567
- }), /is a binary file/, "replace refuses a vendor binary type");
568
- });
569
- (0, import_qunit.test)("realm.fs.writeBytes refuses a file over the size limit", async function(assert) {
570
- let command = new RunRealmCodeTool(getService("tool-service").toolContext);
571
- await assert.rejects(command.execute({
572
- realm: testRealmURL,
573
- roomId: "!room:example.com",
574
- code: `await realm.fs.writeBytes('big.bin', 'AAAA'.repeat(700000));`
575
- }), /at most 2000000 bytes per file.*No file was saved/);
576
- });
577
- (0, import_qunit.test)("realm.fs.delete deletes a file the same run created, and the result reports it", async function(assert) {
578
- let toolService = getService("tool-service");
579
- let cardService = getService("card-service");
580
- let command = new RunRealmCodeTool(toolService.toolContext);
581
- let result = await command.execute({
582
- realm: testRealmURL,
583
- roomId: "!room:example.com",
584
- code: `await realm.fs.writeText('plan.md', '# Plan\\n');
585
- await realm.fs.writeText('kept.md', '# Kept\\n');
586
- await realm.fs.writeBytes('dot.png', ${JSON.stringify(PNG_BASE64)});
587
- let deleted = [
588
- await realm.fs.delete('plan.md'),
589
- await realm.fs.delete('dot.png'),
590
- ];
591
- return {
592
- deleted,
593
- planExists: await realm.fs.exists('plan.md'),
594
- dotExists: await realm.fs.exists('dot.png'),
595
- };`
596
- });
597
- assert.deepEqual(JSON.parse(result.scriptResult), {
598
- deleted: [{
599
- path: "plan.md",
600
- deleted: true
601
- }, {
602
- path: "dot.png",
603
- deleted: true
604
- }],
605
- planExists: false,
606
- dotExists: false
607
- });
608
- assert.deepEqual(result.files.map((file) => [file.fileUrl, file.status]), [
609
- [`${testRealmURL}kept.md`, "saved"],
610
- [`${testRealmURL}plan.md`, "deleted"],
611
- [`${testRealmURL}dot.png`, "deleted"]
612
- ]);
613
- assert.deepEqual(command.resultAttachments(result).map((attachment) => attachment.sourceUrl), [`${testRealmURL}kept.md`], "a deleted file is not attached to the result");
614
- for (let path of ["plan.md", "dot.png"]) {
615
- let source = await cardService.getSource(new URL(path, testRealmURL));
616
- assert.strictEqual(source.status, 404, `${path} is not in the realm`);
617
- }
618
- });
619
- (0, import_qunit.test)("realm.fs.delete refuses a binary file the run created when someone replaced it", async function(assert) {
620
- let toolService = getService("tool-service");
621
- let network = getService("network");
622
- let command = new RunRealmCodeTool(toolService.toolContext);
623
- let dotURL = `${testRealmURL}dot.png`;
624
- let replacement = Uint8Array.from([
625
- 137,
626
- 80,
627
- 78,
628
- 71,
629
- 255,
630
- 254
631
- ]);
632
- let real = network.authedFetch;
633
- Object.defineProperty(network, "authedFetch", {
634
- configurable: true,
635
- value: async (url, init) => {
636
- let response = await real(url, init);
637
- if (url === dotURL && init?.method === "POST" && response.ok) {
638
- let replaced = await real(dotURL, {
639
- method: "POST",
640
- headers: { "Content-Type": "application/octet-stream" },
641
- body: new Blob([replacement])
642
- });
643
- assert.true(replaced.ok, "the collaborator replaced the file");
644
- }
645
- return response;
646
- }
647
- });
648
- let result = await command.execute({
649
- realm: testRealmURL,
650
- roomId: "!room:example.com",
651
- code: `await realm.fs.writeBytes('dot.png', ${JSON.stringify(PNG_BASE64)});
652
- try {
653
- await realm.fs.delete('dot.png');
654
- return 'deleted';
655
- } catch (e) {
656
- return e.message;
657
- }`
658
- });
659
- assert.true(/File changed while the script ran: .*dot\.png/.test(JSON.parse(result.scriptResult)), `the delete is refused: ${result.scriptResult}`);
660
- let response = await real(dotURL, { headers: { Accept: SupportedMimeType.CardSource } });
661
- assert.strictEqual(response.status, 200, "dot.png is still in the realm");
662
- assert.deepEqual(Array.from(new Uint8Array(await response.arrayBuffer())), Array.from(replacement), "the collaborator's bytes are kept");
663
- });
664
- (0, import_qunit.test)("a script that deletes a file always waits for the user", function(assert) {
665
- assert.true(RunRealmCodeTool.neverAutoExecutesFor({ code: `await realm.fs.delete('notes/first.md');` }), "a run that names realm.fs.delete waits for a click");
666
- assert.true(RunRealmCodeTool.neverAutoExecutesFor({ code: `await realm.fs.writeText('a.md', 'x'); await realm.fs.delete('a.md');` }), "a run that deletes only its own file also waits for a click");
667
- assert.false(RunRealmCodeTool.neverAutoExecutesFor({ code: `await realm.fs.writeText('a.md', 'x');` }), "a run that deletes nothing keeps the room mode");
668
- });
669
- (0, import_qunit.test)("realm.fs.delete deletes files that were there before the run, and the result reports them", async function(assert) {
670
- let toolService = getService("tool-service");
671
- let cardService = getService("card-service");
672
- let result = await new RunRealmCodeTool(toolService.toolContext).execute({
673
- realm: testRealmURL,
674
- roomId: "!room:example.com",
675
- code: `await realm.fs.readText('notes/first.md');
676
- await realm.fs.replace('task.json', '"Old title"', '"New title"');
677
- await realm.fs.writeText('plan.md', '# Plan\\n');
678
- let deleted = [
679
- await realm.fs.delete('notes/first.md'),
680
- await realm.fs.delete('task.json'),
681
- await realm.fs.delete('images/existing.png'),
682
- await realm.fs.delete('plan.md'),
683
- ];
684
- let refused = [];
685
- try { await realm.fs.delete('notes/first.md'); } catch (e) { refused.push(e.message); }
686
- try { await realm.fs.delete('missing.md'); } catch (e) { refused.push(e.message); }
687
- try { await realm.fs.delete('notes/'); } catch (e) { refused.push(e.message); }
688
- return { deleted, refused };`
689
- });
690
- let { deleted, refused } = JSON.parse(result.scriptResult);
691
- assert.deepEqual(deleted, [
692
- {
693
- path: "notes/first.md",
694
- deleted: true
695
- },
696
- {
697
- path: "task.json",
698
- deleted: true
699
- },
700
- {
701
- path: "images/existing.png",
702
- deleted: true
703
- },
704
- {
705
- path: "plan.md",
706
- deleted: true
707
- }
708
- ]);
709
- assert.true(/this run already deleted it: .*notes\/first\.md/.test(refused[0]), `a file the run already deleted: ${refused[0]}`);
710
- assert.true(/File not found: .*missing\.md/.test(refused[1]), `a file that does not exist: ${refused[1]}`);
711
- assert.true(/Path must be relative to the realm root: notes\//.test(refused[2]), `a folder: ${refused[2]}`);
712
- assert.deepEqual(result.files.map((file) => [
713
- file.fileUrl,
714
- file.status,
715
- file.detail
716
- ]), [
717
- [
718
- `${testRealmURL}plan.md`,
719
- "deleted",
720
- "Created by this run and then deleted."
721
- ],
722
- [
723
- `${testRealmURL}notes/first.md`,
724
- "deleted",
725
- "Existed before this run; deleted."
726
- ],
727
- [
728
- `${testRealmURL}task.json`,
729
- "deleted",
730
- "Existed before this run; deleted."
731
- ],
732
- [
733
- `${testRealmURL}images/existing.png`,
734
- "deleted",
735
- "Existed before this run; deleted."
736
- ]
737
- ]);
738
- for (let path of [
739
- "notes/first.md",
740
- "task.json",
741
- "images/existing.png"
742
- ]) {
743
- let source = await cardService.getSource(new URL(path, testRealmURL));
744
- assert.strictEqual(source.status, 404, `${path} is not in the realm`);
745
- }
746
- });
747
- (0, import_qunit.test)("realm.fs.delete refuses a file someone changed after the script read it", async function(assert) {
748
- let toolService = getService("tool-service");
749
- let cardService = getService("card-service");
750
- let network = getService("network");
751
- let command = new RunRealmCodeTool(toolService.toolContext);
752
- let noteURL = `${testRealmURL}notes/first.md`;
753
- let real = network.authedFetch;
754
- let changed = false;
755
- Object.defineProperty(network, "authedFetch", {
756
- configurable: true,
757
- value: async (url, init) => {
758
- let response = await real(url, init);
759
- if (url === noteURL && !init?.method && !changed) {
760
- changed = true;
761
- let replaced = await real(noteURL, {
762
- method: "POST",
763
- headers: { "Content-Type": "application/octet-stream" },
764
- body: new Blob(["# Changed\n"])
765
- });
766
- assert.true(replaced.ok, "the collaborator changed the file");
767
- }
768
- return response;
769
- }
770
- });
771
- let result = await command.execute({
772
- realm: testRealmURL,
773
- roomId: "!room:example.com",
774
- code: `await realm.fs.readText('notes/first.md');
775
- try {
776
- await realm.fs.delete('notes/first.md');
777
- return 'deleted';
778
- } catch (e) {
779
- return e.message;
780
- }`
781
- });
782
- assert.true(/File changed while the script ran: .*notes\/first\.md/.test(JSON.parse(result.scriptResult)), `the delete is refused: ${result.scriptResult}`);
783
- let source = await cardService.getSource(new URL(noteURL));
784
- assert.strictEqual(source.status, 200, "the file is still in the realm");
785
- assert.strictEqual(source.content, "# Changed\n", "the change is kept");
786
- });
787
- (0, import_qunit.test)("a script that reaches realm.fs.delete another way is refused", async function(assert) {
788
- let cardService = getService("card-service");
789
- let command = new RunRealmCodeTool(getService("tool-service").toolContext);
790
- let code = `await realm.fs['de' + 'lete']('notes/first.md');`;
791
- assert.false(RunRealmCodeTool.neverAutoExecutesFor({ code }), "this run would not wait for a click");
792
- await assert.rejects(command.execute({
793
- realm: testRealmURL,
794
- roomId: "!room:example.com",
795
- code
796
- }), /must be called by that name/);
797
- let source = await cardService.getSource(new URL("notes/first.md", testRealmURL));
798
- assert.strictEqual(source.status, 200, "the file is still in the realm");
799
- });
800
- (0, import_qunit.test)("a failed run names the files from before the run that it deleted", async function(assert) {
801
- let command = new RunRealmCodeTool(getService("tool-service").toolContext);
802
- await assert.rejects(command.execute({
803
- realm: testRealmURL,
804
- roomId: "!room:example.com",
805
- code: `await realm.fs.delete('notes/first.md');
806
- await realm.fs.readText('missing.md');`
807
- }), /Files that existed before this run and that it already deleted: .*notes\/first\.md/);
808
- });
809
- (0, import_qunit.test)("a failed run names the files it created and deleted", async function(assert) {
810
- let command = new RunRealmCodeTool(getService("tool-service").toolContext);
811
- await assert.rejects(command.execute({
812
- realm: testRealmURL,
813
- roomId: "!room:example.com",
814
- code: `await realm.fs.writeText('plan.md', 'x');
815
- await realm.fs.delete('plan.md');
816
- await realm.fs.readText('missing.md');`
817
- }), /No file was saved\. Files this run created and already deleted: .*plan\.md/);
818
- });
819
- (0, import_qunit.test)("realm.fs.copy copies a file and leaves the source as it was", async function(assert) {
820
- let toolService = getService("tool-service");
821
- let cardService = getService("card-service");
822
- let result = await new RunRealmCodeTool(toolService.toolContext).execute({
823
- realm: testRealmURL,
824
- roomId: "!room:example.com",
825
- code: `return await realm.fs.copy('notes/first.md', 'notes/second.md');`
826
- });
827
- assert.deepEqual(JSON.parse(result.scriptResult), {
828
- path: "notes/second.md",
829
- saved: true
830
- });
831
- assert.deepEqual(result.files.map((file) => [file?.fileUrl, file?.status]), [[`${testRealmURL}notes/second.md`, "saved"]]);
832
- let copy = await cardService.getSource(new URL(`${testRealmURL}notes/second.md`));
833
- assert.strictEqual(copy.content, "# First\n");
834
- let source = await cardService.getSource(new URL(`${testRealmURL}notes/first.md`));
835
- assert.strictEqual(source.content, "# First\n", "the source is unchanged");
836
- });
837
- (0, import_qunit.test)("realm.fs.copy of a card instance in the same folder loads as the same card type", async function(assert) {
838
- let toolService = getService("tool-service");
839
- let store = getService("store");
840
- await new RunRealmCodeTool(toolService.toolContext).execute({
841
- realm: testRealmURL,
842
- roomId: "!room:example.com",
843
- code: `await realm.fs.copy('Pet/mango.json', 'Pet/mango-copy.json');
844
- await realm.fs.replace('Pet/mango-copy.json', '"Mango"', '"Mango Two"');`
845
- });
846
- let copy = await store.get(`${testRealmURL}Pet/mango-copy`);
847
- assert.strictEqual(copy.constructor.displayName, "Pet");
848
- assert.strictEqual(copy.name, "Mango Two");
849
- });
850
- (0, import_qunit.test)("realm.fs.copy refuses an existing target, a missing source, and paths outside the realm", async function(assert) {
851
- let toolService = getService("tool-service");
852
- let cardService = getService("card-service");
853
- let command = new RunRealmCodeTool(toolService.toolContext);
854
- let run = (code) => command.execute({
855
- realm: testRealmURL,
856
- roomId: "!room:example.com",
857
- code
858
- });
859
- await assert.rejects(run(`await realm.fs.copy('notes/first.md', 'task.json');`), /File already exists: .*task\.json/);
860
- let target = await cardService.getSource(new URL(`${testRealmURL}task.json`));
861
- assert.true(target.content.includes("\"Old title\""), "the existing target is unchanged");
862
- await assert.rejects(run(`await realm.fs.copy('nope.md', 'copy.md');`), /File not found: .*nope\.md/);
863
- await assert.rejects(run(`await realm.fs.copy('notes/first.md', '../elsewhere.md');`), /Path must be relative to the realm root/);
864
- await assert.rejects(run(`await realm.fs.copy('https://example.com/other/first.md', 'copy.md');`), /Path is outside this realm/);
865
- });
866
- (0, import_qunit.test)("realm.fs.copy refuses files that are not UTF-8 text", async function(assert) {
867
- let toolService = getService("tool-service");
868
- let cardService = getService("card-service");
869
- let command = new RunRealmCodeTool(toolService.toolContext);
870
- for (let [from, to] of [
871
- ["images/existing.png", "images/existing-copy.png"],
872
- ["docs/report.docx", "docs/report-copy.docx"],
873
- ["docs/latin1.txt", "docs/latin1-copy.txt"]
874
- ]) {
875
- await assert.rejects(command.execute({
876
- realm: testRealmURL,
877
- roomId: "!room:example.com",
878
- code: `await realm.fs.copy('${from}', '${to}');`
879
- }), /is a binary file/, `refuses ${from}`);
880
- let copy = await cardService.getSource(new URL(`${testRealmURL}${to}`));
881
- assert.strictEqual(copy.status, 404, `no copy of ${from} is saved`);
882
- }
883
- });
884
- (0, import_qunit.test)("realm.fs.copy copies UTF-8 text byte for byte, whatever its content type", async function(assert) {
885
- let toolService = getService("tool-service");
886
- let network = getService("network");
887
- let command = new RunRealmCodeTool(toolService.toolContext);
888
- let bytesOf = async (path) => {
889
- let response = await network.authedFetch(`${testRealmURL}${path}`, { headers: { Accept: "application/vnd.card+source" } });
890
- return Array.from(new Uint8Array(await response.arrayBuffer()));
891
- };
892
- await command.execute({
893
- realm: testRealmURL,
894
- roomId: "!room:example.com",
895
- code: `await realm.fs.copy('docs/README', 'docs/README-copy');
896
- await realm.fs.copy('docs/replacement.txt', 'docs/replacement-copy.txt');
897
- await realm.fs.copy('unformatted.gts', 'unformatted-copy.gts');`
898
- });
899
- for (let path of [
900
- "docs/README",
901
- "docs/replacement.txt",
902
- "unformatted.gts"
903
- ]) {
904
- let copyPath = path.replace(/(\.[^./]+)?$/, "-copy$1");
905
- assert.deepEqual(await bytesOf(copyPath), await bytesOf(path), `${copyPath} has the same bytes as ${path}`);
906
- }
907
- });
908
- (0, import_qunit.test)("a binary file exists, and is not overwritten", async function(assert) {
909
- let command = new RunRealmCodeTool(getService("tool-service").toolContext);
910
- let run = (code) => command.execute({
911
- realm: testRealmURL,
912
- roomId: "!room:example.com",
913
- code
914
- });
915
- let result = await run(`return await realm.fs.exists('images/existing.png');`);
916
- assert.true(JSON.parse(result.scriptResult), "exists returns true");
917
- await assert.rejects(run(`await realm.fs.copy('notes/first.md', 'images/existing.png');`), /File already exists: .*existing\.png/);
918
- await assert.rejects(run(`await realm.fs.writeText('images/existing.png', 'text');`), /File already exists; use realm\.fs\.replace/);
919
- });
920
- (0, import_qunit.module)("realm.fs.download", function(hooks) {
921
- const sourceURL = "https://media.example/images/pet.png";
922
- let pngBytes = Uint8Array.from(atob(PNG_BASE64), (char) => char.charCodeAt(0));
923
- let sourceRequests;
924
- hooks.beforeEach(function() {
925
- sourceRequests = [];
926
- getService("network").virtualNetwork.mount(async (req) => {
927
- if (!req.url.startsWith("https://media.example/")) return null;
928
- sourceRequests.push(req.url);
929
- if (req.url === sourceURL) return new Response(pngBytes, {
930
- status: 200,
931
- headers: { "Content-Type": "image/png" }
932
- });
933
- if (req.url.endsWith("/nine.bin")) return new Response(new Uint8Array(9e6), {
934
- status: 200,
935
- headers: { "Content-Type": "application/octet-stream" }
936
- });
937
- if (req.url.endsWith("/large.bin")) return new Response(new Uint8Array(10000001), {
938
- status: 200,
939
- headers: { "Content-Type": "application/octet-stream" }
940
- });
941
- return new Response("Not found", { status: 404 });
942
- }, { prepend: true });
943
- });
944
- (0, import_qunit.test)("saves the file at a URL into the realm", async function(assert) {
945
- let command = new RunRealmCodeTool(getService("tool-service").toolContext);
946
- let code = `return await realm.fs.download('${sourceURL}', 'images/pet.png');`;
947
- assert.true(RunRealmCodeTool.neverAutoExecutesFor({ code }), "a run that names realm.fs.download waits for a click");
948
- let result = await command.execute({
949
- realm: testRealmURL,
950
- roomId: "!room:example.com",
951
- code
952
- });
953
- assert.deepEqual(JSON.parse(result.scriptResult), {
954
- path: "images/pet.png",
955
- size: pngBytes.byteLength,
956
- saved: true
957
- });
958
- assert.deepEqual(result.files.map((file) => [
959
- file.fileUrl,
960
- file.status,
961
- file.detail
962
- ]), [[
963
- `${testRealmURL}images/pet.png`,
964
- "saved",
965
- "Binary file saved."
966
- ]]);
967
- let response = await getService("network").authedFetch(new URL("images/pet.png", testRealmURL));
968
- assert.strictEqual(response.status, 200);
969
- assert.deepEqual(Array.from(new Uint8Array(await response.arrayBuffer())), Array.from(pngBytes), "the realm holds the downloaded bytes");
970
- });
971
- (0, import_qunit.test)("realm.fs.delete removes a file the same run downloaded", async function(assert) {
972
- let result = await new RunRealmCodeTool(getService("tool-service").toolContext).execute({
973
- realm: testRealmURL,
974
- roomId: "!room:example.com",
975
- code: `await realm.fs.download('${sourceURL}', 'images/pet.png');
976
- return {
977
- deleted: await realm.fs.delete('images/pet.png'),
978
- exists: await realm.fs.exists('images/pet.png'),
979
- };`
980
- });
981
- assert.deepEqual(JSON.parse(result.scriptResult), {
982
- deleted: {
983
- path: "images/pet.png",
984
- deleted: true
985
- },
986
- exists: false
987
- });
988
- assert.deepEqual(result.files.map((file) => [file.fileUrl, file.status]), [[`${testRealmURL}images/pet.png`, "deleted"]]);
989
- });
990
- (0, import_qunit.test)("refuses an existing file, a path with no extension, a source that is not http, and a failed download", async function(assert) {
991
- let command = new RunRealmCodeTool(getService("tool-service").toolContext);
992
- let run = (code) => command.execute({
993
- realm: testRealmURL,
994
- roomId: "!room:example.com",
995
- code
996
- });
997
- await assert.rejects(run(`await realm.fs.download('${sourceURL}', 'task.json');`), /File already exists/);
998
- await assert.rejects(run(`await realm.fs.download('${sourceURL}', 'images/pet');`), /needs a path with a file extension/);
999
- await assert.rejects(run(`await realm.fs.download('file:///etc/hosts', 'hosts.txt');`), /downloads only http and https URLs/);
1000
- assert.deepEqual(sourceRequests, [], "nothing was fetched so far");
1001
- await assert.rejects(run(`await realm.fs.download('https://media.example/missing.png', 'missing.png');`), /Unable to download https:\/\/media\.example\/missing\.png: 404.*No file was saved/);
1002
- });
1003
- (0, import_qunit.test)("refuses a file over the size limit", async function(assert) {
1004
- let command = new RunRealmCodeTool(getService("tool-service").toolContext);
1005
- await assert.rejects(command.execute({
1006
- realm: testRealmURL,
1007
- roomId: "!room:example.com",
1008
- code: `await realm.fs.download('https://media.example/large.bin', 'large.bin');`
1009
- }), /at most 10000000 bytes per file.*No file was saved/);
1010
- });
1011
- (0, import_qunit.test)("a download whose save fails still counts toward the per-run limit", async function(assert) {
1012
- getService("network").virtualNetwork.mount(async (req) => {
1013
- if (req.method === "POST" && req.url.startsWith(`${testRealmURL}failing/`)) return new Response("Server error", { status: 500 });
1014
- return null;
1015
- }, { prepend: true });
1016
- let result = await new RunRealmCodeTool(getService("tool-service").toolContext).execute({
1017
- realm: testRealmURL,
1018
- roomId: "!room:example.com",
1019
- code: `let errors = [];
1020
- for (let name of ['a', 'b', 'c']) {
1021
- try {
1022
- await realm.fs.download('https://media.example/nine.bin', 'failing/' + name + '.bin');
1023
- } catch (error) {
1024
- errors.push(error.message);
1025
- }
1026
- }
1027
- return errors;`
1028
- });
1029
- let errors = JSON.parse(result.scriptResult);
1030
- assert.strictEqual(errors.length, 3, "no save succeeded");
1031
- assert.notOk(/per run/.test(errors[0]), errors[0]);
1032
- assert.notOk(/per run/.test(errors[1]), errors[1]);
1033
- assert.ok(/at most 25000000 bytes per run/.test(errors[2]), "the third download is over the bytes the failed saves left");
1034
- });
1035
- (0, import_qunit.test)("a download the script did not await fails the run and is not fetched", async function(assert) {
1036
- getService("network").virtualNetwork.mount(async (req) => {
1037
- if (req.method === "GET" && req.url === `${testRealmURL}late.png`) await new Promise((resolve) => setTimeout(resolve, 1e3));
1038
- return null;
1039
- }, { prepend: true });
1040
- let command = new RunRealmCodeTool(getService("tool-service").toolContext);
1041
- await assert.rejects(command.execute({
1042
- realm: testRealmURL,
1043
- roomId: "!room:example.com",
1044
- code: `realm.fs.download('${sourceURL}', 'late.png');
1045
- return 'done';`
1046
- }), /await every realm call/);
1047
- assert.deepEqual(sourceRequests, [], "nothing is fetched");
1048
- let response = await getService("network").authedFetch(new URL("late.png", testRealmURL));
1049
- assert.strictEqual(response.status, 404, "nothing is saved");
1050
- });
1051
- (0, import_qunit.test)("a script that reaches realm.fs.download another way is refused", async function(assert) {
1052
- let command = new RunRealmCodeTool(getService("tool-service").toolContext);
1053
- let code = `await realm.fs['down' + 'load']('${sourceURL}', 'pet.png');`;
1054
- assert.false(RunRealmCodeTool.neverAutoExecutesFor({ code }), "this run would not wait for a click");
1055
- await assert.rejects(command.execute({
1056
- realm: testRealmURL,
1057
- roomId: "!room:example.com",
1058
- code
1059
- }), /realm\.fs\.download must be called by that name/);
1060
- assert.deepEqual(sourceRequests, [], "nothing is fetched");
1061
- });
1062
- });
1063
- (0, import_qunit.test)("resolves paths against the realm root", async function(assert) {
1064
- let toolService = getService("tool-service");
1065
- let cardService = getService("card-service");
1066
- let command = new RunRealmCodeTool(toolService.toolContext);
1067
- let fileUrl = `${testRealmURL}task.json`;
1068
- let result = await command.execute({
1069
- realm: testRealmURL,
1070
- roomId: "!room:example.com",
1071
- code: `return await realm.fs.replace('task.json', '"count": 1', '"count": 2');`
1072
- });
1073
- assert.strictEqual(result.files[0]?.status, "saved");
1074
- assert.deepEqual(JSON.parse(result.scriptResult), {
1075
- path: "task.json",
1076
- matches: 1,
1077
- saved: true
1078
- });
1079
- let source = await cardService.getSource(new URL(fileUrl));
1080
- assert.true(source.content.includes("\"count\": 2"));
1081
- });
1082
- (0, import_qunit.test)("refuses paths outside the realm, and names the files it already saved", async function(assert) {
1083
- let toolService = getService("tool-service");
1084
- let cardService = getService("card-service");
1085
- let command = new RunRealmCodeTool(toolService.toolContext);
1086
- let fileUrl = `${testRealmURL}task.json`;
1087
- await assert.rejects(command.execute({
1088
- realm: testRealmURL,
1089
- roomId: "!room:example.com",
1090
- code: `await realm.fs.replace('task.json', '"count": 1', '"count": 2');
1091
- await realm.fs.writeText('../elsewhere.json', '{}');`
1092
- }), /Path must be relative to the realm root.*Files already saved by this run: .*task\.json/);
1093
- let source = await cardService.getSource(new URL(fileUrl));
1094
- assert.true(source.content.includes("\"count\": 2"));
1095
- });
1096
- (0, import_qunit.test)("reads a file inside the script and edits it from what it read", async function(assert) {
1097
- let toolService = getService("tool-service");
1098
- let cardService = getService("card-service");
1099
- let result = await new RunRealmCodeTool(toolService.toolContext).execute({
1100
- realm: testRealmURL,
1101
- roomId: "!room:example.com",
1102
- code: `const task = JSON.parse(await realm.fs.readText('task.json'));
1103
- await realm.fs.replace('task.json', '"count": ' + task.count, '"count": ' + (task.count + 1));
1104
- return { exists: await realm.fs.exists('task.json'), missing: await realm.fs.exists('nope.json') };`
1105
- });
1106
- assert.strictEqual(result.files[0]?.status, "saved");
1107
- assert.deepEqual(JSON.parse(result.scriptResult), {
1108
- exists: true,
1109
- missing: false
1110
- });
1111
- let source = await cardService.getSource(new URL(`${testRealmURL}task.json`));
1112
- assert.true(source.content.includes("\"count\": 2"));
1113
- });
1114
- (0, import_qunit.test)("each write is saved before the script goes on", async function(assert) {
1115
- let toolService = getService("tool-service");
1116
- let cardService = getService("card-service");
1117
- let command = new RunRealmCodeTool(toolService.toolContext);
1118
- await assert.rejects(command.execute({
1119
- realm: testRealmURL,
1120
- roomId: "!room:example.com",
1121
- code: `await realm.fs.writeText('first.json', '{}');
1122
- throw new Error('stop here');`
1123
- }), /stop here.*Files already saved by this run: .*first\.json/);
1124
- let source = await cardService.getSource(new URL(`${testRealmURL}first.json`));
1125
- assert.strictEqual(source.status, 200);
1126
- });
1127
- (0, import_qunit.test)("a thrown message that ends a sentence gets no second period", async function(assert) {
1128
- let command = new RunRealmCodeTool(getService("tool-service").toolContext);
1129
- await assert.rejects(command.execute({
1130
- realm: testRealmURL,
1131
- roomId: "!room:example.com",
1132
- code: `throw new Error('Could not find the styles.');`
1133
- }), /Could not find the styles\. No file was saved\./);
1134
- });
1135
- (0, import_qunit.test)("a caught failed write does not fail the run", async function(assert) {
1136
- let toolService = getService("tool-service");
1137
- let cardService = getService("card-service");
1138
- let result = await new RunRealmCodeTool(toolService.toolContext).execute({
1139
- realm: testRealmURL,
1140
- roomId: "!room:example.com",
1141
- code: `await realm.fs.replace('task.json', '"count": 1', '"count": 2');
1142
- try { await realm.fs.replace('task.json', 'not there', 'x'); } catch (e) {}
1143
- return 'done';`
1144
- });
1145
- assert.strictEqual(result.files.length, 1);
1146
- assert.strictEqual(result.files[0]?.status, "saved");
1147
- let source = await cardService.getSource(new URL(`${testRealmURL}task.json`));
1148
- assert.true(source.content.includes("\"count\": 2"));
1149
- });
1150
- (0, import_qunit.test)("a caught failed read does not fail the run", async function(assert) {
1151
- let toolService = getService("tool-service");
1152
- let cardService = getService("card-service");
1153
- let result = await new RunRealmCodeTool(toolService.toolContext).execute({
1154
- realm: testRealmURL,
1155
- roomId: "!room:example.com",
1156
- code: `let found = true;
1157
- try { await realm.fs.readText('new-task.json'); } catch (e) { found = false; }
1158
- if (!found) await realm.fs.writeText('new-task.json', '{}');
1159
- return found;`
1160
- });
1161
- assert.strictEqual(result.files[0]?.status, "saved");
1162
- let source = await cardService.getSource(new URL(`${testRealmURL}new-task.json`));
1163
- assert.strictEqual(source.status, 200);
1164
- });
1165
- (0, import_qunit.test)("a realm call the script does not await fails the run, and the report says whether it saved", async function(assert) {
1166
- let toolService = getService("tool-service");
1167
- let cardService = getService("card-service");
1168
- let command = new RunRealmCodeTool(toolService.toolContext);
1169
- let error;
1170
- try {
1171
- await command.execute({
1172
- realm: testRealmURL,
1173
- roomId: "!room:example.com",
1174
- code: `realm.fs.writeText('late.json', '{}');`
1175
- });
1176
- } catch (e) {
1177
- error = e;
1178
- }
1179
- assert.ok(error, "the run rejected");
1180
- assert.true(/await every realm call/.test(error?.message ?? ""), `the error says to await every realm call: ${error?.message}`);
1181
- let reportedSaved = /Files already saved by this run: .*late\.json/.test(error?.message ?? "");
1182
- let reportedNoneSaved = /No file was saved/.test(error?.message ?? "");
1183
- assert.notStrictEqual(reportedSaved, reportedNoneSaved, `the report says either that late.json was saved or that nothing was: ${error?.message}`);
1184
- await settled();
1185
- let source = await cardService.getSource(new URL(`${testRealmURL}late.json`));
1186
- assert.strictEqual(source.status, reportedSaved ? 200 : 404, reportedSaved ? "the file the report names as saved is in the realm" : "the report said nothing was saved, and nothing landed after it");
1187
- });
1188
- (0, import_qunit.test)("a script that never returns is stopped by the sandbox, not by the caller", async function(assert) {
1189
- let error;
1190
- try {
1191
- await runRealmCode({
1192
- code: "while (true) {}",
1193
- realmURL: testRealmURL,
1194
- timeoutMs: 500
1195
- }, async () => null);
1196
- } catch (e) {
1197
- error = e;
1198
- }
1199
- assert.ok(error, "the run rejected");
1200
- assert.strictEqual(error?.message, "interrupted");
1201
- });
1202
- (0, import_qunit.test)("lists a directory without counting toward the file limit", async function(assert) {
1203
- let command = new RunRealmCodeTool(getService("tool-service").toolContext);
1204
- let result = await command.execute({
1205
- realm: testRealmURL,
1206
- roomId: "!room:example.com",
1207
- code: `return {
1208
- root: await realm.fs.list(),
1209
- notes: await realm.fs.list('notes'),
1210
- notesWithSlash: await realm.fs.list('notes/'),
1211
- notesByURL: await realm.fs.list(${JSON.stringify(`${testRealmURL}notes/`)}),
1212
- };`
1213
- });
1214
- assert.deepEqual(result.files, [], "a listing saves nothing");
1215
- let listed = JSON.parse(result.scriptResult);
1216
- assert.deepEqual(listed.root.find((entry) => entry.name === "task.json"), {
1217
- name: "task.json",
1218
- path: "task.json",
1219
- kind: "file"
1220
- });
1221
- assert.deepEqual(listed.root.find((entry) => entry.name === "notes"), {
1222
- name: "notes",
1223
- path: "notes/",
1224
- kind: "directory"
1225
- });
1226
- let notes = [{
1227
- name: "first.md",
1228
- path: "notes/first.md",
1229
- kind: "file"
1230
- }];
1231
- assert.deepEqual(listed.notes, notes);
1232
- assert.deepEqual(listed.notesWithSlash, notes);
1233
- assert.deepEqual(listed.notesByURL, notes);
1234
- await assert.rejects(command.execute({
1235
- realm: testRealmURL,
1236
- roomId: "!room:example.com",
1237
- code: `await realm.fs.list('../');`
1238
- }), /Path must be relative to the realm root/);
1239
- await assert.rejects(command.execute({
1240
- realm: testRealmURL,
1241
- roomId: "!room:example.com",
1242
- code: `await realm.fs.list('missing');`
1243
- }), /Directory not found/);
1244
- });
1245
- (0, import_qunit.test)("realm.entries.search runs several searches in one script and returns only what the script keeps", async function(assert) {
1246
- let result = await new RunRealmCodeTool(getService("tool-service").toolContext).execute({
1247
- realm: testRealmURL,
1248
- roomId: "!room:example.com",
1249
- code: `const found = {};
1250
- for (const title of ['Pet', 'Unicorn']) {
1251
- const { entries, total, truncated, incomplete } = await realm.entries.search(
1252
- {
1253
- filter: {
1254
- on: { module: '@cardstack/base/spec', name: 'Spec' },
1255
- eq: { cardTitle: title },
1256
- },
1257
- },
1258
- { realms: [realm.current.url] },
1259
- );
1260
- found[title] = {
1261
- total,
1262
- truncated,
1263
- incomplete,
1264
- entries: entries.map((entry) => ({
1265
- url: entry.url,
1266
- kind: entry.kind,
1267
- specType: entry.specType,
1268
- refName: entry.ref?.name,
1269
- readMe: entry.readMe,
1270
- })),
1271
- };
1272
- }
1273
- return found;`
1274
- });
1275
- assert.deepEqual(result.files, [], "a search saves nothing");
1276
- assert.deepEqual(JSON.parse(result.scriptResult), {
1277
- Pet: {
1278
- total: 1,
1279
- truncated: false,
1280
- incomplete: false,
1281
- entries: [{
1282
- url: `${testRealmURL}Spec/pet`,
1283
- kind: "card",
1284
- specType: "card",
1285
- refName: "Pet",
1286
- readMe: "# Pet\n\nUse Pet for any animal with a name."
1287
- }]
1288
- },
1289
- Unicorn: {
1290
- total: 0,
1291
- truncated: false,
1292
- incomplete: false,
1293
- entries: []
1294
- }
1295
- });
1296
- });
1297
- (0, import_qunit.test)("realm.entries.search caps the entries at the limit and reports the rest", async function(assert) {
1298
- let result = await new RunRealmCodeTool(getService("tool-service").toolContext).execute({
1299
- realm: testRealmURL,
1300
- roomId: "!room:example.com",
1301
- code: `const { entries, total, truncated } = await realm.entries.search(
1302
- {},
1303
- { realms: [realm.current.url], scope: 'cards', limit: 1 },
1304
- );
1305
- return { count: entries.length, kind: entries[0].kind, more: total > 1, truncated };`
1306
- });
1307
- assert.deepEqual(JSON.parse(result.scriptResult), {
1308
- count: 1,
1309
- kind: "card",
1310
- more: true,
1311
- truncated: true
1312
- });
1313
- });
1314
- (0, import_qunit.test)("realm.entries.search finds the entries of a realm named by a registered prefix", async function(assert) {
1315
- let { virtualNetwork } = getService("network");
1316
- virtualNetwork.addRealmMapping("@test/mapped/", otherRealmURL);
1317
- try {
1318
- let result = await new RunRealmCodeTool(getService("tool-service").toolContext).execute({
1319
- realm: testRealmURL,
1320
- roomId: "!room:example.com",
1321
- code: `const { entries, total, incomplete } = await realm.entries.search(
1322
- {
1323
- filter: {
1324
- on: { module: ${JSON.stringify(`${testRealmURL}recipe`)}, name: 'Recipe' },
1325
- eq: { name: 'Elsewhere' },
1326
- },
1327
- },
1328
- { realms: ['@test/mapped'], scope: 'cards' },
1329
- );
1330
- return { total, incomplete, urls: entries.map((entry) => entry.url) };`
1331
- });
1332
- assert.deepEqual(JSON.parse(result.scriptResult), {
1333
- total: 1,
1334
- incomplete: false,
1335
- urls: [`${otherRealmURL}Recipe/elsewhere`]
1336
- });
1337
- } finally {
1338
- virtualNetwork.removeRealmMapping("@test/mapped/");
1339
- }
1340
- });
1341
- (0, import_qunit.test)("realm.entries.search sends a realm as the identifier given, once per realm", async function(assert) {
1342
- let { virtualNetwork } = getService("network");
1343
- let sentRealms = [];
1344
- let spy = async (request) => {
1345
- if (new URL(request.url).pathname.endsWith("/_federated-search")) sentRealms.push(JSON.parse(await request.clone().text()).realms);
1346
- return null;
1347
- };
1348
- virtualNetwork.mount(spy, { prepend: true });
1349
- try {
1350
- let command = new RunRealmCodeTool(getService("tool-service").toolContext);
1351
- await command.execute({
1352
- realm: testRealmURL,
1353
- roomId: "!room:example.com",
1354
- code: `await realm.entries.search({}, { realms: ['@cardstack/catalog/', ${JSON.stringify(virtualNetwork.toURL("@cardstack/catalog/").href)}] });`
1355
- });
1356
- assert.deepEqual(sentRealms, [["@cardstack/catalog/"]], "the prefix goes out as given, and its URL, naming the same realm, is dropped");
1357
- await command.execute({
1358
- realm: testRealmURL,
1359
- roomId: "!room:example.com",
1360
- code: `await realm.entries.search({}, { realms: ['@cardstack/base/'] });`
1361
- });
1362
- assert.deepEqual(sentRealms[1], ["@cardstack/base/"], "the base prefix goes out as given");
1363
- } finally {
1364
- virtualNetwork.unmount(spy);
1365
- }
1366
- });
1367
- (0, import_qunit.test)("realm.entries.search refuses a scoped identifier no realm is registered under", async function(assert) {
1368
- let command = new RunRealmCodeTool(getService("tool-service").toolContext);
1369
- await assert.rejects(command.execute({
1370
- realm: testRealmURL,
1371
- roomId: "!room:example.com",
1372
- code: `await realm.entries.search({}, { realms: ['@nope/realm/'] });`
1373
- }), (error) => error.message.includes("Unknown realm identifier \"@nope/realm/\"") && error.message.includes("@cardstack/catalog/"));
1374
- await assert.rejects(command.execute({
1375
- realm: testRealmURL,
1376
- roomId: "!room:example.com",
1377
- code: `await realm.entries.search({}, { realms: ['@cardstack/boxel-ui/'] });`
1378
- }), /Unknown realm identifier "@cardstack\/boxel-ui\/"/);
1379
- });
1380
- (0, import_qunit.test)("realm.entries.search refuses a page and an unknown scope", async function(assert) {
1381
- let command = new RunRealmCodeTool(getService("tool-service").toolContext);
1382
- await assert.rejects(command.execute({
1383
- realm: testRealmURL,
1384
- roomId: "!room:example.com",
1385
- code: `await realm.entries.search({ page: { number: 1 } });`
1386
- }), /does not page; pass \{ limit \}/);
1387
- await assert.rejects(command.execute({
1388
- realm: testRealmURL,
1389
- roomId: "!room:example.com",
1390
- code: `await realm.entries.search({}, { scope: 'modules' });`
1391
- }), /Invalid scope "modules"/);
1392
- });
1393
- function stubWorkspaceCreation() {
1394
- let calls = [];
1395
- let realmServer = getService("realm-server");
1396
- realmServer.createRealm = async (args) => {
1397
- calls.push(args);
1398
- return new URL(`http://test-realm/testuser/${args.endpoint}/`);
1399
- };
1400
- getService("realm").ensureRealmMeta = async () => {};
1401
- return calls;
1402
- }
1403
- (0, import_qunit.test)("realm.workspaces.create creates a workspace, returns its URL, and opens it after the run", async function(assert) {
1404
- let createRealmCalls = stubWorkspaceCreation();
1405
- let operatorModeStateService = getService("operator-mode-state-service");
1406
- let result = await new RunRealmCodeTool(getService("tool-service").toolContext).execute({
1407
- realm: testRealmURL,
1408
- roomId: "!room:example.com",
1409
- code: `let created = await realm.workspaces.create({ name: 'Sales Pipeline' });
1410
- return { created, realmAfterCreate: realm.current.url };`
1411
- });
1412
- assert.deepEqual(createRealmCalls.map(({ endpoint, name }) => ({
1413
- endpoint,
1414
- name
1415
- })), [{
1416
- endpoint: "sales-pipeline",
1417
- name: "Sales Pipeline"
1418
- }], "the endpoint is derived from the name, as the create-workspace tool does");
1419
- assert.deepEqual(JSON.parse(result.scriptResult), {
1420
- created: {
1421
- url: "http://test-realm/testuser/sales-pipeline/",
1422
- name: "Sales Pipeline"
1423
- },
1424
- realmAfterCreate: testRealmURL
1425
- });
1426
- assert.strictEqual(operatorModeStateService.state?.stacks[0]?.[0]?.id, "http://test-realm/testuser/sales-pipeline/index", "the new workspace is opened once the run ends");
1427
- assert.deepEqual(result.createdWorkspaces, ["http://test-realm/testuser/sales-pipeline/"], "the result names the created workspace");
1428
- });
1429
- (0, import_qunit.test)("a failed run names the workspaces it created and opens none", async function(assert) {
1430
- stubWorkspaceCreation();
1431
- let operatorModeStateService = getService("operator-mode-state-service");
1432
- let stackBefore = operatorModeStateService.state?.stacks[0]?.[0]?.id;
1433
- let command = new RunRealmCodeTool(getService("tool-service").toolContext);
1434
- await assert.rejects(command.execute({
1435
- realm: testRealmURL,
1436
- roomId: "!room:example.com",
1437
- code: `await realm.workspaces.create({ name: 'First Try' });
1438
- throw new Error('boom');`
1439
- }), /boom.*Workspaces already created by this run: http:\/\/test-realm\/testuser\/first-try\//);
1440
- assert.strictEqual(operatorModeStateService.state?.stacks[0]?.[0]?.id, stackBefore, "no workspace is opened after a failed run");
1441
- });
1442
- (0, import_qunit.test)("a run that saves files and creates a workspace stays in its realm", async function(assert) {
1443
- stubWorkspaceCreation();
1444
- let operatorModeStateService = getService("operator-mode-state-service");
1445
- let stackBefore = operatorModeStateService.state?.stacks[0]?.[0]?.id;
1446
- let result = await new RunRealmCodeTool(getService("tool-service").toolContext).execute({
1447
- realm: testRealmURL,
1448
- roomId: "!room:example.com",
1449
- code: `await realm.fs.writeText('notes/new-workspace.txt', 'hello');
1450
- await realm.workspaces.create({ name: 'Side Project' });`
1451
- });
1452
- assert.deepEqual(result.createdWorkspaces, ["http://test-realm/testuser/side-project/"]);
1453
- assert.strictEqual(operatorModeStateService.state?.stacks[0]?.[0]?.id, stackBefore, "the new workspace is not opened, so the next run defaults to this realm");
1454
- });
1455
- (0, import_qunit.test)("realm.workspaces.create refuses options that are not strings", async function(assert) {
1456
- let createRealmCalls = stubWorkspaceCreation();
1457
- let command = new RunRealmCodeTool(getService("tool-service").toolContext);
1458
- await assert.rejects(command.execute({
1459
- realm: testRealmURL,
1460
- roomId: "!room:example.com",
1461
- code: `await realm.workspaces.create({ name: 42 });`
1462
- }), /expects name to be a string/);
1463
- assert.strictEqual(createRealmCalls.length, 0, "no realm is created");
1464
- });
1465
- function stubWorkspaceDeletion(ownedRealmURL) {
1466
- let calls = [];
1467
- getService("realm-server").deleteRealm = async (realmURL) => {
1468
- calls.push(realmURL);
1469
- };
1470
- let realmService = getService("realm");
1471
- let isRealmOwner = realmService.isRealmOwner.bind(realmService);
1472
- realmService.isRealmOwner = (url) => url === ownedRealmURL || isRealmOwner(url);
1473
- return calls;
1474
- }
1475
- (0, import_qunit.test)("a script that deletes a workspace always waits for the user", function(assert) {
1476
- assert.true(RunRealmCodeTool.neverAutoExecutesFor({ code: `await realm.workspaces.delete('http://test-realm/testuser/old/');` }), "a run that names realm.workspaces.delete waits for a click");
1477
- assert.false(RunRealmCodeTool.neverAutoExecutesFor({ code: `await realm.fs.writeText('a.json', '{}');` }), "other runs keep the room mode");
1478
- assert.false(RunRealmCodeTool.neverAutoExecutesFor(void 0), "a call whose input has not arrived yet is not judged");
1479
- });
1480
- (0, import_qunit.test)("realm.workspaces.delete deletes a workspace the user owns", async function(assert) {
1481
- let oldWorkspace = "http://test-realm/testuser/old/";
1482
- let deleteRealmCalls = stubWorkspaceDeletion(oldWorkspace);
1483
- let result = await new RunRealmCodeTool(getService("tool-service").toolContext).execute({
1484
- realm: testRealmURL,
1485
- roomId: "!room:example.com",
1486
- code: `return await realm.workspaces.delete('${oldWorkspace}');`
1487
- });
1488
- assert.deepEqual(deleteRealmCalls, [oldWorkspace]);
1489
- assert.deepEqual(JSON.parse(result.scriptResult), {
1490
- url: oldWorkspace,
1491
- deleted: true
1492
- });
1493
- });
1494
- (0, import_qunit.test)("the result names the deleted workspace when the script does not return it", async function(assert) {
1495
- let oldWorkspace = "http://test-realm/testuser/old/";
1496
- stubWorkspaceDeletion(oldWorkspace);
1497
- let result = await new RunRealmCodeTool(getService("tool-service").toolContext).execute({
1498
- realm: testRealmURL,
1499
- roomId: "!room:example.com",
1500
- code: `await realm.workspaces.delete('${oldWorkspace}');`
1501
- });
1502
- assert.deepEqual(result.deletedWorkspaces, [oldWorkspace]);
1503
- });
1504
- (0, import_qunit.test)("a failed run names the workspaces it deleted", async function(assert) {
1505
- let oldWorkspace = "http://test-realm/testuser/old/";
1506
- stubWorkspaceDeletion(oldWorkspace);
1507
- let command = new RunRealmCodeTool(getService("tool-service").toolContext);
1508
- await assert.rejects(command.execute({
1509
- realm: testRealmURL,
1510
- roomId: "!room:example.com",
1511
- code: `await realm.workspaces.delete('${oldWorkspace}');
1512
- throw new Error('boom');`
1513
- }), /boom.*Workspaces already deleted by this run: http:\/\/test-realm\/testuser\/old\//);
1514
- });
1515
- (0, import_qunit.test)("a workspace recreated at a URL the run deleted is opened", async function(assert) {
1516
- let oldWorkspace = "http://test-realm/testuser/old/";
1517
- stubWorkspaceDeletion(oldWorkspace);
1518
- stubWorkspaceCreation();
1519
- let operatorModeStateService = getService("operator-mode-state-service");
1520
- await new RunRealmCodeTool(getService("tool-service").toolContext).execute({
1521
- realm: testRealmURL,
1522
- roomId: "!room:example.com",
1523
- code: `await realm.workspaces.delete('${oldWorkspace}');
1524
- await realm.workspaces.create({ name: 'Old' });`
1525
- });
1526
- assert.strictEqual(operatorModeStateService.state?.stacks[0]?.[0]?.id, `${oldWorkspace}index`);
1527
- });
1528
- (0, import_qunit.test)("realm.workspaces.delete refuses a workspace the user does not own", async function(assert) {
1529
- let deleteRealmCalls = stubWorkspaceDeletion("http://test-realm/testuser/old/");
1530
- let command = new RunRealmCodeTool(getService("tool-service").toolContext);
1531
- await assert.rejects(command.execute({
1532
- realm: testRealmURL,
1533
- roomId: "!room:example.com",
1534
- code: `await realm.workspaces.delete('http://test-realm/someone-else/theirs/');`
1535
- }), /the current user is not its owner/);
1536
- assert.deepEqual(deleteRealmCalls, [], "no realm is deleted");
1537
- });
1538
- (0, import_qunit.test)("a script that reaches realm.workspaces.delete another way is refused", async function(assert) {
1539
- let oldWorkspace = "http://test-realm/testuser/old/";
1540
- let deleteRealmCalls = stubWorkspaceDeletion(oldWorkspace);
1541
- let command = new RunRealmCodeTool(getService("tool-service").toolContext);
1542
- let code = `let workspaces = realm.workspaces;
1543
- await workspaces['del' + 'ete']('${oldWorkspace}');`;
1544
- assert.false(RunRealmCodeTool.neverAutoExecutesFor({ code }), "this run would not wait for a click");
1545
- await assert.rejects(command.execute({
1546
- realm: testRealmURL,
1547
- roomId: "!room:example.com",
1548
- code
1549
- }), /must be called by that name/);
1550
- assert.deepEqual(deleteRealmCalls, [], "no realm is deleted");
1551
- });
1552
- function stubIndexing() {
1553
- let calls = [];
1554
- let realmService = getService("realm");
1555
- realmService.invalidateUrls = async (realm, urls) => {
1556
- calls.push({
1557
- action: "invalidate",
1558
- realm,
1559
- urls
1560
- });
1561
- };
1562
- realmService.reindex = async (realm) => {
1563
- calls.push({
1564
- action: "reindex",
1565
- realm
1566
- });
1567
- };
1568
- realmService.fullReindex = async (realm) => {
1569
- calls.push({
1570
- action: "fullReindex",
1571
- realm
1572
- });
1573
- };
1574
- realmService.cancelIndexingJob = async (realm) => {
1575
- calls.push({
1576
- action: "cancelJob",
1577
- realm
1578
- });
1579
- };
1580
- return calls;
1581
- }
1582
- (0, import_qunit.test)("realm.index.invalidate and realm.index.reindex refresh the index of the run realm without a click", async function(assert) {
1583
- let calls = stubIndexing();
1584
- let command = new RunRealmCodeTool(getService("tool-service").toolContext);
1585
- let code = `return {
1586
- invalidated: await realm.index.invalidate(['Pet/mango.json', '${testRealmURL}pet.gts']),
1587
- one: await realm.index.invalidate('task.json'),
1588
- reindex: await realm.index.reindex(),
1589
- };`;
1590
- assert.false(RunRealmCodeTool.neverAutoExecutesFor({ code }), "the run keeps the room mode");
1591
- let result = await command.execute({
1592
- realm: testRealmURL,
1593
- roomId: "!room:example.com",
1594
- code
1595
- });
1596
- assert.deepEqual(calls, [
1597
- {
1598
- action: "invalidate",
1599
- realm: testRealmURL,
1600
- urls: [`${testRealmURL}Pet/mango.json`, `${testRealmURL}pet.gts`]
1601
- },
1602
- {
1603
- action: "invalidate",
1604
- realm: testRealmURL,
1605
- urls: [`${testRealmURL}task.json`]
1606
- },
1607
- {
1608
- action: "reindex",
1609
- realm: testRealmURL
1610
- }
1611
- ]);
1612
- assert.deepEqual(JSON.parse(result.scriptResult), {
1613
- invalidated: { invalidated: ["Pet/mango.json", "pet.gts"] },
1614
- one: { invalidated: ["task.json"] },
1615
- reindex: { reindex: "started" }
1616
- });
1617
- assert.deepEqual(result.indexActions, [
1618
- "invalidate Pet/mango.json, pet.gts",
1619
- "invalidate task.json",
1620
- "reindex"
1621
- ]);
1622
- });
1623
- (0, import_qunit.test)("realm.index.invalidate refuses a path outside the realm and an empty list", async function(assert) {
1624
- let calls = stubIndexing();
1625
- let result = await new RunRealmCodeTool(getService("tool-service").toolContext).execute({
1626
- realm: testRealmURL,
1627
- roomId: "!room:example.com",
1628
- code: `let refused = [];
1629
- try { await realm.index.invalidate(['http://other-realm/a.json']); } catch (e) { refused.push(e.message); }
1630
- try { await realm.index.invalidate([]); } catch (e) { refused.push(e.message); }
1631
- return refused;`
1632
- });
1633
- let [outside, empty] = JSON.parse(result.scriptResult);
1634
- assert.true(/Path is outside this realm/.test(outside), outside);
1635
- assert.true(/expects a path or an array/.test(empty), empty);
1636
- assert.deepEqual(calls, [], "nothing is invalidated");
1637
- });
1638
- (0, import_qunit.test)("a script that starts a full reindex or cancels an indexing job always waits for the user", async function(assert) {
1639
- let calls = stubIndexing();
1640
- let command = new RunRealmCodeTool(getService("tool-service").toolContext);
1641
- for (let code of [`await realm.index.fullReindex();`, `await realm.index.cancelJob();`]) assert.true(RunRealmCodeTool.neverAutoExecutesFor({ code }), `waits for a click: ${code}`);
1642
- let result = await command.execute({
1643
- realm: testRealmURL,
1644
- roomId: "!room:example.com",
1645
- code: `return {
1646
- cancel: await realm.index.cancelJob(),
1647
- full: await realm.index.fullReindex(),
1648
- };`
1649
- });
1650
- assert.deepEqual(calls, [{
1651
- action: "cancelJob",
1652
- realm: testRealmURL
1653
- }, {
1654
- action: "fullReindex",
1655
- realm: testRealmURL
1656
- }]);
1657
- assert.deepEqual(JSON.parse(result.scriptResult), {
1658
- cancel: { cancelled: true },
1659
- full: { fullReindex: "started" }
1660
- });
1661
- });
1662
- (0, import_qunit.test)("a failed run names the index actions it already started", async function(assert) {
1663
- let calls = stubIndexing();
1664
- let command = new RunRealmCodeTool(getService("tool-service").toolContext);
1665
- await assert.rejects(command.execute({
1666
- realm: testRealmURL,
1667
- roomId: "!room:example.com",
1668
- code: `await realm.index.invalidate('task.json');
1669
- await realm.index.fullReindex();
1670
- throw new Error('boom');`
1671
- }), /boom\. No file was saved\. Index actions already started by this run: invalidate task\.json; fullReindex/);
1672
- assert.deepEqual(calls, [{
1673
- action: "invalidate",
1674
- realm: testRealmURL,
1675
- urls: [`${testRealmURL}task.json`]
1676
- }, {
1677
- action: "fullReindex",
1678
- realm: testRealmURL
1679
- }]);
1680
- });
1681
- (0, import_qunit.test)("a script that reaches realm.index.fullReindex another way is refused", async function(assert) {
1682
- let calls = stubIndexing();
1683
- let command = new RunRealmCodeTool(getService("tool-service").toolContext);
1684
- let code = `let index = realm.index;
1685
- await index['full' + 'Reindex']();`;
1686
- assert.false(RunRealmCodeTool.neverAutoExecutesFor({ code }), "this run would not wait for a click");
1687
- await assert.rejects(command.execute({
1688
- realm: testRealmURL,
1689
- roomId: "!room:example.com",
1690
- code
1691
- }), /realm\.index\.fullReindex must be called by that name/);
1692
- assert.deepEqual(calls, [], "no reindex starts");
1693
- });
1694
- (0, import_qunit.module)("room actions", function(hooks) {
1695
- let roomId;
1696
- let skillId = `${testRealmURL}skills/test-skill/SKILL.md`;
1697
- let model = DEFAULT_FALLBACK_MODELS[0].modelId;
1698
- hooks.beforeEach(async function() {
1699
- await getService("matrix-service").ready;
1700
- roomId = mockMatrixUtils.createAndJoinRoom({
1701
- sender: "@testuser:localhost",
1702
- name: "room-actions"
1703
- });
1704
- });
1705
- (0, import_qunit.test)("room actions change the room after the script finishes", async function(assert) {
1706
- let command = new RunRealmCodeTool(getService("tool-service").toolContext);
1707
- let result = await command.execute({
1708
- realm: testRealmURL,
1709
- roomId,
1710
- code: `return {
1711
- skills: await room.enableSkills([${JSON.stringify(skillId)}]),
1712
- model: await room.setModel(${JSON.stringify(model)}),
1713
- };`
1714
- });
1715
- assert.deepEqual(JSON.parse(result.scriptResult), {
1716
- skills: {
1717
- enable: [skillId],
1718
- appliedAfterRun: true
1719
- },
1720
- model: {
1721
- model,
1722
- appliedAfterRun: true
1723
- }
1724
- });
1725
- let skills = mockMatrixUtils.getRoomState(roomId, APP_BOXEL_ROOM_SKILLS_EVENT_TYPE);
1726
- assert.deepEqual(skills.enabledSkillCards.map((file) => file.sourceUrl), [skillId], "the skill is enabled");
1727
- assert.strictEqual(mockMatrixUtils.getRoomState(roomId, APP_BOXEL_ACTIVE_LLM)?.model, model, "the model is set");
1728
- assert.deepEqual(result.roomChanges, [`Enabled skills: ${skillId}`, `Model set to ${model}`]);
1729
- await command.execute({
1730
- realm: testRealmURL,
1731
- roomId,
1732
- code: `await room.disableSkills([${JSON.stringify(skillId)}]);`
1733
- });
1734
- skills = mockMatrixUtils.getRoomState(roomId, APP_BOXEL_ROOM_SKILLS_EVENT_TYPE);
1735
- assert.deepEqual(skills.enabledSkillCards, [], "the skill is disabled");
1736
- assert.deepEqual(skills.disabledSkillCards.map((file) => file.sourceUrl), [skillId]);
1737
- });
1738
- (0, import_qunit.test)("a run that fails makes no room change", async function(assert) {
1739
- let command = new RunRealmCodeTool(getService("tool-service").toolContext);
1740
- await assert.rejects(command.execute({
1741
- realm: testRealmURL,
1742
- roomId,
1743
- code: `await room.enableSkills([${JSON.stringify(skillId)}]);
1744
- throw new Error('stop');`
1745
- }), /stop\. No file was saved\. The room changes it asked for were not made\./);
1746
- assert.notOk(mockMatrixUtils.getRoomEvents(roomId).some((event) => event.type === APP_BOXEL_ROOM_SKILLS_EVENT_TYPE), "the room skills are not changed");
1747
- });
1748
- (0, import_qunit.test)("room actions refuse a skill that does not exist and an unknown model", async function(assert) {
1749
- let command = new RunRealmCodeTool(getService("tool-service").toolContext);
1750
- await assert.rejects(command.execute({
1751
- realm: testRealmURL,
1752
- roomId,
1753
- code: `await room.enableSkills([${JSON.stringify(`${testRealmURL}notes/first.md`)}]);`
1754
- }), /Not a skill card or skill markdown file/);
1755
- await assert.rejects(command.execute({
1756
- realm: testRealmURL,
1757
- roomId,
1758
- code: `await room.setModel('no-such/model');`
1759
- }), /Unknown model: no-such\/model/);
1760
- });
1761
- });
1762
- (0, import_qunit.test)("realm.ui actions run in order after the script finishes", async function(assert) {
1763
- let toolService = getService("tool-service");
1764
- let operatorModeStateService = getService("operator-mode-state-service");
1765
- let command = new RunRealmCodeTool(toolService.toolContext);
1766
- let result = await command.execute({
1767
- realm: testRealmURL,
1768
- roomId: "!room:example.com",
1769
- code: `let queued = await realm.ui.openFile('pet.gts');
1770
- await realm.ui.previewFormat('Pet/mango', 'fitted');
1771
- return queued;`
1772
- });
1773
- assert.deepEqual(JSON.parse(result.scriptResult), {
1774
- action: "openFile",
1775
- runs: "after the script finishes"
1776
- });
1777
- assert.deepEqual(result.uiActions.map(({ action, target, status }) => ({
1778
- action,
1779
- target,
1780
- status
1781
- })), [{
1782
- action: "openFile",
1783
- target: `${testRealmURL}pet.gts`,
1784
- status: "done"
1785
- }, {
1786
- action: "previewFormat",
1787
- target: `${testRealmURL}Pet/mango (fitted)`,
1788
- status: "done"
1789
- }]);
1790
- assert.strictEqual(operatorModeStateService.state.submode, "code");
1791
- assert.strictEqual(operatorModeStateService.state.codePath, `${testRealmURL}pet.gts`);
1792
- assert.strictEqual(operatorModeStateService.state.moduleInspector, "preview");
1793
- let selection = getService("playground-panel-service").getSelection(`${testRealmURL}pet/Pet`);
1794
- assert.strictEqual(selection?.cardId, `${testRealmURL}Pet/mango`);
1795
- assert.strictEqual(selection?.format, "fitted");
1796
- await command.execute({
1797
- realm: testRealmURL,
1798
- roomId: "!room:example.com",
1799
- code: `await realm.ui.switchSubmode('interact');`
1800
- });
1801
- assert.strictEqual(operatorModeStateService.state.submode, "interact");
1802
- });
1803
- (0, import_qunit.test)("realm.ui.previewFormat uses the base module of a card whose type comes from base", async function(assert) {
1804
- let command = new RunRealmCodeTool(getService("tool-service").toolContext);
1805
- let baseModule = getService("network").virtualNetwork.toURL("@cardstack/base/card-api.gts").href;
1806
- let detail = (await command.execute({
1807
- realm: testRealmURL,
1808
- roomId: "!room:example.com",
1809
- code: `await realm.ui.previewFormat('Plain/base-typed', 'isolated');`
1810
- })).uiActions[0]?.detail ?? "";
1811
- assert.true(detail.includes(baseModule), `asks for ${baseModule}: ${detail}`);
1812
- assert.false(detail.includes(`${testRealmURL}Plain/`), "does not join the module to the instance path");
1813
- });
1814
- (0, import_qunit.test)("realm.ui opens a file the same run wrote", async function(assert) {
1815
- let toolService = getService("tool-service");
1816
- let operatorModeStateService = getService("operator-mode-state-service");
1817
- let result = await new RunRealmCodeTool(toolService.toolContext).execute({
1818
- realm: testRealmURL,
1819
- roomId: "!room:example.com",
1820
- code: `await realm.fs.writeText('notes/second.md', '# Second\\n');
1821
- await realm.ui.openFile('notes/second.md');`
1822
- });
1823
- assert.strictEqual(result.uiActions[0]?.status, "done");
1824
- assert.strictEqual(operatorModeStateService.state.codePath, `${testRealmURL}notes/second.md`);
1825
- });
1826
- (0, import_qunit.test)("realm.ui refuses a missing file, a path outside the realm, and a file that is not a card", async function(assert) {
1827
- let command = new RunRealmCodeTool(getService("tool-service").toolContext);
1828
- let run = (code) => command.execute({
1829
- realm: testRealmURL,
1830
- roomId: "!room:example.com",
1831
- code
1832
- });
1833
- await assert.rejects(run(`await realm.ui.openFile('missing.gts');`), /File not found/);
1834
- await assert.rejects(run(`await realm.ui.openFile('../elsewhere.gts');`), /Path must be relative to the realm root/);
1835
- await assert.rejects(run(`await realm.ui.previewFormat('task', 'isolated');`), /Not a card instance/);
1836
- await assert.rejects(run(`await realm.ui.previewFormat('Pet/mango', 'head');`), /one of these formats/);
1837
- await assert.rejects(run(`await realm.ui.switchSubmode('host');`), /expects 'interact' or 'code'/);
1838
- });
1839
- (0, import_qunit.test)("a failed run does not do its realm.ui actions", async function(assert) {
1840
- let toolService = getService("tool-service");
1841
- let operatorModeStateService = getService("operator-mode-state-service");
1842
- let command = new RunRealmCodeTool(toolService.toolContext);
1843
- let submodeBefore = operatorModeStateService.state.submode;
1844
- await assert.rejects(command.execute({
1845
- realm: testRealmURL,
1846
- roomId: "!room:example.com",
1847
- code: `await realm.ui.openFile('pet.gts');
1848
- throw new Error('stop here');`
1849
- }), /stop here\. No file was saved\. The UI actions it asked for were not done\./);
1850
- assert.strictEqual(operatorModeStateService.state.submode, submodeBefore);
1851
- });
1852
- (0, import_qunit.module)("realm.cards.update", function() {
1853
- async function run(code) {
1854
- return await new RunRealmCodeTool(getService("tool-service").toolContext).execute({
1855
- realm: testRealmURL,
1856
- roomId: "!room:example.com",
1857
- code
1858
- });
1859
- }
1860
- async function cardJSON(path) {
1861
- let source = await getService("card-service").getSource(new URL(`${testRealmURL}${path}`));
1862
- return JSON.parse(source.content);
1863
- }
1864
- (0, import_qunit.test)("changes the fields it is given and keeps the others", async function(assert) {
1865
- let result = await run(`
1866
- const updated = await realm.cards.update('Recipe/pancakes', { cuisine: 'French' });
1867
- return updated;`);
1868
- assert.deepEqual(JSON.parse(result.scriptResult), {
1869
- path: "Recipe/pancakes.json",
1870
- fields: ["cuisine"],
1871
- saves: "after the script finishes"
1872
- });
1873
- assert.deepEqual(result.files.map((file) => [file.fileUrl, file.status]), [[`${testRealmURL}Recipe/pancakes.json`, "saved"]]);
1874
- let { data } = await cardJSON("Recipe/pancakes.json");
1875
- assert.strictEqual(data.attributes.cuisine, "French");
1876
- assert.strictEqual(data.attributes.name, "Pancakes");
1877
- assert.strictEqual(data.relationships.chef.links.self, "../Chef/ana", "links are kept");
1878
- });
1879
- (0, import_qunit.test)("saves the update to a realm named by a prefix-form identifier", async function(assert) {
1880
- let { virtualNetwork } = getService("network");
1881
- let testRealmPrefix = "@test/cards-update/";
1882
- virtualNetwork.addRealmMapping(testRealmPrefix, testRealmURL);
1883
- try {
1884
- let result = await new RunRealmCodeTool(getService("tool-service").toolContext).execute({
1885
- realm: testRealmPrefix,
1886
- roomId: "!room:example.com",
1887
- code: `await realm.cards.update('Recipe/pancakes', { cuisine: 'Belgian' });`
1888
- });
1889
- assert.deepEqual(result.files.map((file) => file.status), ["saved"], "the update is saved");
1890
- let { data } = await cardJSON("Recipe/pancakes.json");
1891
- assert.strictEqual(data.attributes.cuisine, "Belgian");
1892
- } finally {
1893
- virtualNetwork.removeRealmMapping(testRealmPrefix);
1894
- }
1895
- });
1896
- (0, import_qunit.test)("edits a long text field in the script without cutting it", async function(assert) {
1897
- let long = Array.from({ length: 40 }, (_, n) => `Line ${n}: a \`code\` span, a \${placeholder} and "quotes".`).join("\n");
1898
- assert.true(long.length > 500);
1899
- await run(`await realm.cards.update('Pet/mango', { name: ${JSON.stringify(long)} });`);
1900
- let result = await run(`
1901
- const card = await realm.cards.get('Pet/mango');
1902
- const name = card.attributes.name.replace('Line 0:', 'First line:');
1903
- await realm.cards.update('Pet/mango', { name });
1904
- return name.length;`);
1905
- let expected = long.replace("Line 0:", "First line:");
1906
- assert.strictEqual(JSON.parse(result.scriptResult), expected.length);
1907
- let { data } = await cardJSON("Pet/mango.json");
1908
- assert.strictEqual(data.attributes.name, expected);
1909
- });
1910
- (0, import_qunit.test)("updates more cards than the file limit in one run, and saves them all", async function(assert) {
1911
- let cardService = getService("card-service");
1912
- for (let n = 0; n < 25; n++) await cardService.saveSource(new URL(`${testRealmURL}Recipe/batch/r${n}.json`), recipeJSON("Recipe", {
1913
- name: `R${n}`,
1914
- cuisine: "batch"
1915
- }, void 0, "../../recipe"), "editor");
1916
- let result = await run(`
1917
- for (let n = 0; n < 25; n++) {
1918
- await realm.cards.update('Recipe/batch/r' + n, { cuisine: 'done' });
1919
- }`);
1920
- assert.strictEqual(result.files.length, 25, "the result names each card");
1921
- for (let n of [0, 24]) {
1922
- let { data } = await cardJSON(`Recipe/batch/r${n}.json`);
1923
- assert.strictEqual(data.attributes.cuisine, "done");
1924
- assert.strictEqual(data.attributes.name, `R${n}`);
1925
- }
1926
- });
1927
- (0, import_qunit.test)("refuses an update that makes a card larger than the card size limit, counted in bytes", async function(assert) {
1928
- let result = await run(`
1929
- try {
1930
- await realm.cards.update('Pet/mango', { name: '\u{1F600}'.repeat(200000) });
1931
- } catch (error) {
1932
- return error.message;
1933
- }`);
1934
- assert.true(/Card is too large after this update: .*Pet\/mango\.json/.test(JSON.parse(result.scriptResult)), result.scriptResult);
1935
- assert.deepEqual(result.files, [], "nothing is saved");
1936
- });
1937
- (0, import_qunit.test)("two updates to the same card in one run both apply", async function(assert) {
1938
- let result = await run(`
1939
- await realm.cards.update('Recipe/ramen', { cuisine: 'Japanese street food' });
1940
- await realm.cards.update('Recipe/ramen.json', { name: 'Shoyu ramen' });`);
1941
- assert.strictEqual(result.files.length, 1);
1942
- let { data } = await cardJSON("Recipe/ramen.json");
1943
- assert.strictEqual(data.attributes.cuisine, "Japanese street food");
1944
- assert.strictEqual(data.attributes.name, "Shoyu ramen");
1945
- });
1946
- (0, import_qunit.test)("a run that fails saves no card update, and says so", async function(assert) {
1947
- await assert.rejects(run(`
1948
- await realm.cards.update('Recipe/pancakes', { cuisine: 'French' });
1949
- throw new Error('stop');`), /stop.*The card updates it asked for were not saved/);
1950
- let { data } = await cardJSON("Recipe/pancakes.json");
1951
- assert.strictEqual(data.attributes.cuisine, "unknown");
1952
- });
1953
- (0, import_qunit.test)("refuses a file that is not a card, attributes that are not an object, and realm.fs on an updated card", async function(assert) {
1954
- let result = await run(`
1955
- const errors = [];
1956
- for (const call of [
1957
- () => realm.cards.update('task.json', { title: 'x' }),
1958
- () => realm.cards.update('Recipe/missing', { name: 'x' }),
1959
- () => realm.cards.update('Recipe/pancakes', ['x']),
1960
- () => realm.cards.update('Recipe/pancakes', 'x'),
1961
- ]) {
1962
- try { await call(); } catch (error) { errors.push(error.message); }
1963
- }
1964
- await realm.cards.update('Recipe/ramen', { cuisine: 'Ramen-ya' });
1965
- try { await realm.fs.readText('Recipe/ramen.json'); } catch (error) { errors.push(error.message); }
1966
- return errors;`);
1967
- let errors = JSON.parse(result.scriptResult);
1968
- assert.true(/Not a card instance: .*task\.json/.test(errors[0]), errors[0]);
1969
- assert.true(/Card not found/.test(errors[1]), errors[1]);
1970
- assert.true(/attributes object/.test(errors[2]), errors[2]);
1971
- assert.true(/attributes object/.test(errors[3]), errors[3]);
1972
- assert.true(/realm\.fs cannot read or change it in the same run/.test(errors[4]), errors[4]);
1973
- let { data } = await cardJSON("Recipe/ramen.json");
1974
- assert.strictEqual(data.attributes.cuisine, "Ramen-ya");
1975
- });
1976
- });
1977
- (0, import_qunit.module)("realm.cards.search", function() {
1978
- const recipeRef = `{ module: ${JSON.stringify(`${testRealmURL}recipe`)}, name: 'Recipe' }`;
1979
- async function run(code) {
1980
- let result = await new RunRealmCodeTool(getService("tool-service").toolContext).execute({
1981
- realm: testRealmURL,
1982
- roomId: "!room:example.com",
1983
- code
1984
- });
1985
- return {
1986
- result,
1987
- value: JSON.parse(result.scriptResult)
1988
- };
1989
- }
1990
- (0, import_qunit.test)("returns each card as plain data the script can use", async function(assert) {
1991
- let { result, value } = await run(`return await realm.cards.search({ filter: { eq: { name: 'Pancakes' }, on: ${recipeRef} } });`);
1992
- assert.deepEqual(result.files, [], "a search saves nothing");
1993
- assert.strictEqual(value.total, 1);
1994
- assert.false(value.truncated);
1995
- assert.strictEqual(value.cards.length, 1);
1996
- let [card] = value.cards;
1997
- assert.strictEqual(card.id, `${testRealmURL}Recipe/pancakes`);
1998
- assert.strictEqual(card.path, "Recipe/pancakes.json");
1999
- assert.deepEqual(card.type, {
2000
- module: `${testRealmURL}recipe`,
2001
- name: "Recipe"
2002
- });
2003
- assert.strictEqual(card.attributes.name, "Pancakes");
2004
- assert.strictEqual(card.attributes.cuisine, "unknown");
2005
- assert.strictEqual(card.attributes.cardTitle, "Recipe: Pancakes", "computed values come from the index");
2006
- assert.strictEqual(card.relationships.chef, `${testRealmURL}Chef/ana`, "a link is the full URL of the card it names");
2007
- });
2008
- (0, import_qunit.test)("a linksToMany field reports each link under its field path", async function(assert) {
2009
- let { value } = await run(`return (await realm.cards.search({ filter: { eq: { name: 'Ramen' }, on: ${recipeRef} } })).cards[0].relationships;`);
2010
- assert.strictEqual(value["helpers.0"], `${testRealmURL}Chef/ana`);
2011
- });
2012
- (0, import_qunit.test)("a script can search, then read and edit every card it found", async function(assert) {
2013
- let { result, value } = await run(`
2014
- const { cards } = await realm.cards.search({ filter: { eq: { cuisine: 'unknown' }, on: ${recipeRef} } });
2015
- for (const card of cards) {
2016
- await realm.fs.replace(card.path, '"cuisine": "unknown"', '"cuisine": "Italian"');
2017
- }
2018
- return cards.map((card) => card.path);`);
2019
- assert.deepEqual(value, ["Recipe/desserts/tiramisu.json", "Recipe/pancakes.json"]);
2020
- assert.deepEqual(result.files.map((file) => file.fileUrl), [`${testRealmURL}Recipe/desserts/tiramisu.json`, `${testRealmURL}Recipe/pancakes.json`]);
2021
- let source = await getService("card-service").getSource(new URL(`${testRealmURL}Recipe/desserts/tiramisu.json`));
2022
- assert.true(source.content.includes("\"cuisine\": \"Italian\""));
2023
- });
2024
- (0, import_qunit.test)("a type from a result is a type a query can search for", async function(assert) {
2025
- let { value } = await run(`
2026
- const { cards: [pancakes] } = await realm.cards.search({ filter: { eq: { name: 'Pancakes' }, on: ${recipeRef} } });
2027
- const { cards } = await realm.cards.search({ filter: { type: pancakes.type } });
2028
- return cards.map((card) => card.path);`);
2029
- assert.deepEqual(value, [
2030
- "Recipe/desserts/tiramisu.json",
2031
- "Recipe/pancakes.json",
2032
- "Recipe/ramen.json"
2033
- ]);
2034
- });
2035
- (0, import_qunit.test)("pages through the results and says when a page cut the list", async function(assert) {
2036
- let { value } = await run(`
2037
- const first = await realm.cards.search({ filter: { type: ${recipeRef} }, page: { size: 2 } });
2038
- const second = await realm.cards.search({ filter: { type: ${recipeRef} }, page: { size: 2, number: 1 } });
2039
- return { first, second };`);
2040
- assert.strictEqual(value.first.total, 3);
2041
- assert.true(value.first.truncated);
2042
- assert.deepEqual(value.first.cards.map((card) => card.path), ["Recipe/desserts/tiramisu.json", "Recipe/pancakes.json"]);
2043
- assert.false(value.second.truncated, "no card matches past the last page");
2044
- assert.deepEqual(value.second.cards.map((card) => card.path), ["Recipe/ramen.json"]);
2045
- });
2046
- (0, import_qunit.test)("searches only the realm the script runs in", async function(assert) {
2047
- let { value } = await run(`return (await realm.cards.search({ filter: { type: ${recipeRef} } })).cards.map((card) => card.id);`);
2048
- assert.false(value.some((id) => id.startsWith(otherRealmURL)), "another realm's cards are not returned");
2049
- let command = new RunRealmCodeTool(getService("tool-service").toolContext);
2050
- await assert.rejects(command.execute({
2051
- realm: testRealmURL,
2052
- roomId: "!room:example.com",
2053
- code: `await realm.cards.search({ filter: { type: ${recipeRef} }, realms: [${JSON.stringify(otherRealmURL)}] });`
2054
- }), /realm\.cards\.search searches only this realm/);
2055
- });
2056
- (0, import_qunit.test)("an invalid query rejects, and a script that catches it carries on", async function(assert) {
2057
- let { value } = await run(`
2058
- let message;
2059
- try { await realm.cards.search({ filter: { type: ${recipeRef} }, limit: 10 }); } catch (e) { message = e.message; }
2060
- return { message, found: (await realm.cards.search({ filter: { type: ${recipeRef} } })).total };`);
2061
- assert.true(/unknown field in query: limit/.test(value.message), `the bad query was refused: ${value.message}`);
2062
- assert.strictEqual(value.found, 3, "the next search still ran");
2063
- });
2064
- (0, import_qunit.test)("a search does not count toward the file limit", async function(assert) {
2065
- let { value } = await run(`
2066
- await realm.cards.search({ filter: { type: ${recipeRef} } });
2067
- let found = 0;
2068
- for (let i = 0; i < 20; i++) {
2069
- if (!(await realm.fs.exists('missing-' + i + '.json'))) found++;
2070
- }
2071
- return found;`);
2072
- assert.strictEqual(value, 20);
2073
- });
2074
- (0, import_qunit.test)("a search a realm did not answer fails instead of finding nothing", async function(assert) {
2075
- let store = getService("store");
2076
- let searchEntries = store.searchEntries;
2077
- store.searchEntries = async () => ({
2078
- data: [],
2079
- meta: {
2080
- page: { total: 0 },
2081
- incomplete: true
2082
- }
2083
- });
2084
- try {
2085
- let command = new RunRealmCodeTool(getService("tool-service").toolContext);
2086
- await assert.rejects(command.execute({
2087
- realm: testRealmURL,
2088
- roomId: "!room:example.com",
2089
- code: `await realm.cards.search({ filter: { type: ${recipeRef} } });`
2090
- }), /did not answer/);
2091
- } finally {
2092
- store.searchEntries = searchEntries;
2093
- }
2094
- });
2095
- });
2096
- });
2097
- var readOnlyRealmURL = "http://test-realm/other/";
2098
- (0, import_qunit.module)("Integration | tools | run-realm-code | read-only workspace", function(hooks) {
2099
- setupRenderingTest(hooks);
2100
- setupLocalIndexing(hooks);
2101
- let mockMatrixUtils = setupMockMatrix(hooks, {
2102
- autostart: true,
2103
- activeRealms: [testRealmURL, readOnlyRealmURL],
2104
- realmPermissions: {
2105
- [testRealmURL]: ["read"],
2106
- [readOnlyRealmURL]: ["read"]
2107
- }
2108
- });
2109
- let captureRequests = [];
2110
- setupRealmServerEndpoints(hooks, [{
2111
- route: "_capture",
2112
- getResponse: async (req) => {
2113
- captureRequests.push(await req.clone().json());
2114
- return new Response(JSON.stringify({ data: {
2115
- type: "capture-result",
2116
- attributes: {
2117
- status: "ready",
2118
- base64: PNG_BASE64,
2119
- width: 1,
2120
- height: 1,
2121
- contentType: "image/png"
2122
- }
2123
- } }), {
2124
- status: 201,
2125
- headers: { "Content-Type": "application/vnd.api+json" }
2126
- });
2127
- }
2128
- }]);
2129
- setupRealmCacheTeardown(hooks);
2130
- hooks.beforeEach(async function() {
2131
- captureRequests = [];
2132
- await setupIntegrationTestRealm({
2133
- mockMatrixUtils,
2134
- realmURL: readOnlyRealmURL,
2135
- enforcePermissions: true,
2136
- permissions: { "*": ["read"] },
2137
- contents: { "brand.md": "# Brand\n" }
2138
- });
2139
- await setupIntegrationTestRealm({
2140
- mockMatrixUtils,
2141
- enforcePermissions: true,
2142
- permissions: { "*": ["read"] },
2143
- contents: {
2144
- "task.json": "{ \"title\": \"Old title\" }\n",
2145
- "notes/first.md": "# First\n",
2146
- "pet.gts": `
2147
- import { CardDef, field, contains } from '@cardstack/base/card-api';
2148
- import StringField from '@cardstack/base/string';
2149
-
2150
- export class Pet extends CardDef {
2151
- static displayName = 'Pet';
2152
- @field name = contains(StringField);
2153
- }
2154
- `,
2155
- "Pet/mango.json": { data: {
2156
- type: "card",
2157
- attributes: { name: "Mango" },
2158
- meta: { adoptsFrom: {
2159
- module: "../pet",
2160
- name: "Pet"
2161
- } }
2162
- } }
2163
- }
2164
- });
2165
- await getService("realm").login(testRealmURL);
2166
- await getService("realm").login(readOnlyRealmURL);
2167
- });
2168
- (0, import_qunit.test)("realm.capture captures in a workspace the user can only read, and in another workspace by URL", async function(assert) {
2169
- let result = await new RunRealmCodeTool(getService("tool-service").toolContext).execute({
2170
- realm: testRealmURL,
2171
- roomId: "!room:example.com",
2172
- code: `return [
2173
- await realm.capture('notes/first.md'),
2174
- await realm.capture('${readOnlyRealmURL}brand.md'),
2175
- ];`
2176
- });
2177
- assert.deepEqual(captureRequests.map((r) => r.data.attributes.fileURL), [`${testRealmURL}notes/first.md`, `${readOnlyRealmURL}brand.md`]);
2178
- assert.deepEqual(captureRequests.map((r) => r.data.attributes.realmURL), [testRealmURL, readOnlyRealmURL], "each capture is asked of the workspace that holds it");
2179
- assert.deepEqual(JSON.parse(result.scriptResult).map((c) => c.path), ["notes/first.md", `${readOnlyRealmURL}brand.md`], "a capture in another workspace is named by its URL");
2180
- assert.strictEqual(result.captures.length, 2);
2181
- });
2182
- (0, import_qunit.test)("a script reads a workspace the user can only read", async function(assert) {
2183
- let result = await new RunRealmCodeTool(getService("tool-service").toolContext).execute({
2184
- realm: testRealmURL,
2185
- roomId: "!room:example.com",
2186
- code: `return {
2187
- text: await realm.fs.readText('task.json'),
2188
- exists: await realm.fs.exists('task.json'),
2189
- notes: await realm.fs.list('notes'),
2190
- };`
2191
- });
2192
- assert.deepEqual(result.files, [], "nothing is saved");
2193
- assert.deepEqual(JSON.parse(result.scriptResult), {
2194
- text: "{ \"title\": \"Old title\" }\n",
2195
- exists: true,
2196
- notes: [{
2197
- name: "first.md",
2198
- path: "notes/first.md",
2199
- kind: "file"
2200
- }]
2201
- });
2202
- });
2203
- (0, import_qunit.test)("a script searches a workspace the user can only read", async function(assert) {
2204
- let result = await new RunRealmCodeTool(getService("tool-service").toolContext).execute({
2205
- realm: testRealmURL,
2206
- roomId: "!room:example.com",
2207
- code: `let found = await realm.cards.search({
2208
- filter: { type: { module: ${JSON.stringify(`${testRealmURL}pet`)}, name: 'Pet' } },
2209
- });
2210
- return { total: found.total, paths: found.cards.map((card) => card.path) };`
2211
- });
2212
- assert.deepEqual(result.files, [], "nothing is saved");
2213
- assert.deepEqual(JSON.parse(result.scriptResult), {
2214
- total: 1,
2215
- paths: ["Pet/mango.json"]
2216
- });
2217
- });
2218
- (0, import_qunit.test)("each write is refused, and the script goes on", async function(assert) {
2219
- let toolService = getService("tool-service");
2220
- let cardService = getService("card-service");
2221
- let result = await new RunRealmCodeTool(toolService.toolContext).execute({
2222
- realm: testRealmURL,
2223
- roomId: "!room:example.com",
2224
- code: `let refused = [];
2225
- try { await realm.fs.writeText('new.json', '{}'); } catch (e) { refused.push(e.message); }
2226
- try { await realm.fs.replace('task.json', 'Old', 'New'); } catch (e) { refused.push(e.message); }
2227
- return { refused, text: await realm.fs.readText('task.json') };`
2228
- });
2229
- assert.deepEqual(result.files, [], "nothing is saved");
2230
- let { refused, text } = JSON.parse(result.scriptResult);
2231
- assert.strictEqual(refused.length, 2, "both writes are refused");
2232
- for (let message of refused) assert.true(/You can only read this workspace/.test(message), `the refusal says why: ${message}`);
2233
- assert.strictEqual(text, "{ \"title\": \"Old title\" }\n");
2234
- let source = await cardService.getSource(new URL(`${testRealmURL}new.json`));
2235
- assert.strictEqual(source.status, 404, "the new file is not in the realm");
2236
- });
2237
- (0, import_qunit.test)("a write the script does not catch fails the run, and the report says nothing was saved", async function(assert) {
2238
- let command = new RunRealmCodeTool(getService("tool-service").toolContext);
2239
- await assert.rejects(command.execute({
2240
- realm: testRealmURL,
2241
- roomId: "!room:example.com",
2242
- code: `await realm.fs.writeText('new.json', '{}');`
2243
- }), /You can only read this workspace.*No file was saved/);
2244
- });
2245
- (0, import_qunit.test)("realm.index calls are refused", async function(assert) {
2246
- let result = await new RunRealmCodeTool(getService("tool-service").toolContext).execute({
2247
- realm: testRealmURL,
2248
- roomId: "!room:example.com",
2249
- code: `let refused = [];
2250
- try { await realm.index.invalidate('task.json'); } catch (e) { refused.push(e.message); }
2251
- try { await realm.index.reindex(); } catch (e) { refused.push(e.message); }
2252
- return refused;`
2253
- });
2254
- let refused = JSON.parse(result.scriptResult);
2255
- assert.strictEqual(refused.length, 2, "both calls are refused");
2256
- for (let message of refused) assert.true(/You can only read this workspace/.test(message), `the refusal says why: ${message}`);
2257
- });
2258
- });
2259
- (0, import_qunit.module)("Integration | tools | run-realm-code | images", function(hooks) {
2260
- setupRenderingTest(hooks);
2261
- setupLocalIndexing(hooks);
2262
- let mockMatrixUtils = setupMockMatrix(hooks, {
2263
- loggedInAs: "@testuser:localhost",
2264
- activeRealms: [testRealmURL],
2265
- autostart: true
2266
- });
2267
- const PNG_BASE64 = "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==";
2268
- let imageRequests = [];
2269
- let abortedImageRequests = 0;
2270
- setupRealmServerEndpoints(hooks, [{
2271
- route: "_request-forward",
2272
- getResponse: async (req) => {
2273
- let body = await req.clone().json();
2274
- let request = JSON.parse(body.requestBody);
2275
- imageRequests.push({
2276
- url: body.url,
2277
- request
2278
- });
2279
- if (request.messages[0].content[0].text === "never answers") await new Promise((resolve, reject) => {
2280
- let fallback = setTimeout(resolve, 2e4);
2281
- let onAbort = () => {
2282
- clearTimeout(fallback);
2283
- abortedImageRequests += 1;
2284
- reject(new DOMException("aborted", "AbortError"));
2285
- };
2286
- if (req.signal.aborted) onAbort();
2287
- req.signal.addEventListener("abort", onAbort, { once: true });
2288
- });
2289
- return new Response(JSON.stringify({ choices: [{ message: {
2290
- content: "",
2291
- images: [{
2292
- type: "image_url",
2293
- image_url: { url: `data:image/png;base64,${PNG_BASE64}` }
2294
- }]
2295
- } }] }), {
2296
- status: 200,
2297
- headers: { "Content-Type": "application/json" }
2298
- });
2299
- }
2300
- }]);
2301
- setupRealmCacheTeardown(hooks);
2302
- hooks.beforeEach(async function() {
2303
- imageRequests = [];
2304
- abortedImageRequests = 0;
2305
- await setupIntegrationTestRealm({
2306
- mockMatrixUtils,
2307
- contents: {
2308
- "task.json": "{ \"title\": \"Old title\" }\n",
2309
- "photos/cat.jpg": "not really a jpeg"
2310
- }
2311
- });
2312
- });
2313
- (0, import_qunit.test)("a script that generates images always waits for the user, and gets more time", function(assert) {
2314
- let code = `await realm.images.generate({ prompt: 'a cat', path: 'cat.png' });`;
2315
- assert.true(RunRealmCodeTool.neverAutoExecutesFor({ code }), "a run that names realm.images.generate waits for a click");
2316
- assert.true(RunRealmCodeTool.extraExecuteTimeMsFor({ code }) > 0, "the tool service gives the run more time");
2317
- assert.strictEqual(RunRealmCodeTool.extraExecuteTimeMsFor({ code: `await realm.fs.writeText('a.json', '{}');` }), 0, "other runs keep the usual execute timeout");
2318
- });
2319
- (0, import_qunit.test)("realm.fs.delete removes an image the same run generated", async function(assert) {
2320
- let result = await new RunRealmCodeTool(getService("tool-service").toolContext).execute({
2321
- realm: testRealmURL,
2322
- roomId: "!room:example.com",
2323
- code: `await realm.images.generate({ prompt: 'A small dot', path: 'images/dot.png' });
2324
- return {
2325
- deleted: await realm.fs.delete('images/dot.png'),
2326
- exists: await realm.fs.exists('images/dot.png'),
2327
- };`
2328
- });
2329
- assert.deepEqual(JSON.parse(result.scriptResult), {
2330
- deleted: {
2331
- path: "images/dot.png",
2332
- deleted: true
2333
- },
2334
- exists: false
2335
- });
2336
- assert.deepEqual(result.files.map((file) => [file.fileUrl, file.status]), [[`${testRealmURL}images/dot.png`, "deleted"]]);
2337
- });
2338
- (0, import_qunit.test)("realm.images.generate saves the image and returns its path", async function(assert) {
2339
- let toolService = getService("tool-service");
2340
- let network = getService("network");
2341
- let command = new RunRealmCodeTool(toolService.toolContext);
2342
- await command.execute({
2343
- realm: testRealmURL,
2344
- roomId: "!room:example.com",
2345
- code: `await realm.fs.writeBytes('source.png', ${JSON.stringify(PNG_BASE64)});`
2346
- });
2347
- let result = await command.execute({
2348
- realm: testRealmURL,
2349
- roomId: "!room:example.com",
2350
- code: `return await realm.images.generate({
2351
- prompt: 'A small dot',
2352
- path: 'images/dot',
2353
- sourceImageUrl: 'source.png',
2354
- llmModel: 'test/image-model',
2355
- });`
2356
- });
2357
- let expected = Uint8Array.from(atob(PNG_BASE64), (char) => char.charCodeAt(0));
2358
- assert.deepEqual(JSON.parse(result.scriptResult), {
2359
- path: "images/dot.png",
2360
- contentType: "image/png",
2361
- size: expected.byteLength,
2362
- saved: true
2363
- });
2364
- assert.deepEqual(result.files.map((file) => [file.fileUrl, file.status]), [[`${testRealmURL}images/dot.png`, "saved"]]);
2365
- assert.strictEqual(imageRequests.length, 1, "one image was requested");
2366
- let [{ request }] = imageRequests;
2367
- assert.strictEqual(request.model, "test/image-model");
2368
- assert.deepEqual(request.messages[0].content, [{
2369
- type: "text",
2370
- text: "A small dot"
2371
- }, {
2372
- type: "image_url",
2373
- image_url: { url: `data:image/png;base64,${PNG_BASE64}` }
2374
- }]);
2375
- let response = await network.authedFetch(new URL("images/dot.png", testRealmURL));
2376
- assert.deepEqual(Array.from(new Uint8Array(await response.arrayBuffer())), Array.from(expected), "the realm holds the image bytes");
2377
- });
2378
- (0, import_qunit.test)("realm.images.generate refuses a fifth image in one run", async function(assert) {
2379
- let command = new RunRealmCodeTool(getService("tool-service").toolContext);
2380
- await assert.rejects(command.execute({
2381
- realm: testRealmURL,
2382
- roomId: "!room:example.com",
2383
- code: `for (let i = 1; i <= 5; i++) {
2384
- await realm.images.generate({ prompt: 'dot ' + i, path: 'dots/' + i + '.png' });
2385
- }`
2386
- }), /at most 4 images.*Files already saved by this run: .*dots\/4\.png/);
2387
- assert.strictEqual(imageRequests.length, 4, "four images were requested");
2388
- });
2389
- (0, import_qunit.test)("realm.images.generate refuses an existing file before it asks the model", async function(assert) {
2390
- let command = new RunRealmCodeTool(getService("tool-service").toolContext);
2391
- await assert.rejects(command.execute({
2392
- realm: testRealmURL,
2393
- roomId: "!room:example.com",
2394
- code: `await realm.images.generate({ prompt: 'a task', path: 'task.json' });`
2395
- }), /File already exists/);
2396
- assert.strictEqual(imageRequests.length, 0, "no image was requested");
2397
- });
2398
- (0, import_qunit.test)("realm.images.generate refuses a path whose image may be saved over an existing file, before it asks the model", async function(assert) {
2399
- let command = new RunRealmCodeTool(getService("tool-service").toolContext);
2400
- for (let path of ["photos/cat", "photos/cat.png"]) await assert.rejects(command.execute({
2401
- realm: testRealmURL,
2402
- roomId: "!room:example.com",
2403
- code: `await realm.images.generate({ prompt: 'a cat', path: '${path}' });`
2404
- }), /File already exists: .*photos\/cat\.jpg/, `${path} is refused`);
2405
- assert.strictEqual(imageRequests.length, 0, "no image was requested");
2406
- });
2407
- (0, import_qunit.test)("realm.images.generate takes one file slot per image", async function(assert) {
2408
- let result = await new RunRealmCodeTool(getService("tool-service").toolContext).execute({
2409
- realm: testRealmURL,
2410
- roomId: "!room:example.com",
2411
- code: `for (let i = 1; i <= 16; i++) {
2412
- await realm.fs.exists('missing-' + i + '.json');
2413
- }
2414
- let paths = [];
2415
- for (let i = 1; i <= 4; i++) {
2416
- paths.push((await realm.images.generate({ prompt: 'dot ' + i, path: 'dots/' + i })).path);
2417
- }
2418
- return paths;`
2419
- });
2420
- assert.deepEqual(JSON.parse(result.scriptResult), [
2421
- "dots/1.png",
2422
- "dots/2.png",
2423
- "dots/3.png",
2424
- "dots/4.png"
2425
- ]);
2426
- });
2427
- (0, import_qunit.test)("realm.images.generate refuses a source image outside this realm", async function(assert) {
2428
- let command = new RunRealmCodeTool(getService("tool-service").toolContext);
2429
- await assert.rejects(command.execute({
2430
- realm: testRealmURL,
2431
- roomId: "!room:example.com",
2432
- code: `await realm.images.generate({
2433
- prompt: 'a dot',
2434
- path: 'dot.png',
2435
- sourceImageUrl: 'http://other-realm.example/private/photo.png',
2436
- });`
2437
- }), /Path is outside this realm/);
2438
- assert.strictEqual(imageRequests.length, 0, "no image was requested");
2439
- });
2440
- (0, import_qunit.test)("an image request still in flight when the run ends is stopped", async function(assert) {
2441
- let cardService = getService("card-service");
2442
- let command = new RunRealmCodeTool(getService("tool-service").toolContext);
2443
- let started = Date.now();
2444
- await assert.rejects(command.execute({
2445
- realm: testRealmURL,
2446
- roomId: "!room:example.com",
2447
- code: `realm.images.generate({ prompt: 'never answers', path: 'late.png' });`
2448
- }), /await every realm call/);
2449
- assert.true(Date.now() - started < 15e3, "the run reports without waiting for the image");
2450
- if (imageRequests.length > 0) assert.strictEqual(abortedImageRequests, 1, "the image request was aborted");
2451
- await settled();
2452
- let source = await cardService.getSource(new URL(`${testRealmURL}late.png`));
2453
- assert.strictEqual(source.status, 404, "no image was saved");
2454
- });
2455
- (0, import_qunit.test)("a script that reaches realm.images.generate another way is refused", async function(assert) {
2456
- let command = new RunRealmCodeTool(getService("tool-service").toolContext);
2457
- let code = `let images = realm['ima' + 'ges'];
2458
- await images.generate({ prompt: 'a dot', path: 'dot.png' });`;
2459
- assert.false(RunRealmCodeTool.neverAutoExecutesFor({ code }), "this run would not wait for a click");
2460
- await assert.rejects(command.execute({
2461
- realm: testRealmURL,
2462
- roomId: "!room:example.com",
2463
- code
2464
- }), /realm\.images\.generate must be called by that name/);
2465
- assert.strictEqual(imageRequests.length, 0, "no image was requested");
2466
- });
2467
- });
2468
- //#endregion