@cardstack/boxel-cli 0.11.0-unstable.1 → 0.11.0-unstable.3

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 (177) hide show
  1. package/bundled-realms/pretui/components/agent-mark.gts +98 -0
  2. package/bundled-realms/pretui/components/agent-question.gts +340 -37
  3. package/bundled-realms/pretui/components/answer-footer.gts +249 -0
  4. package/bundled-realms/pretui/components/card-embed.gts +523 -0
  5. package/bundled-realms/pretui/components/card-pills.gts +725 -0
  6. package/bundled-realms/pretui/components/code-block.gts +87 -45
  7. package/bundled-realms/pretui/components/collapsed-turn.gts +133 -12
  8. package/bundled-realms/pretui/components/compaction-chip.gts +81 -67
  9. package/bundled-realms/pretui/components/composer-cap.gts +516 -0
  10. package/bundled-realms/pretui/components/context-ring.gts +108 -0
  11. package/bundled-realms/pretui/components/diff-block.gts +1002 -31
  12. package/bundled-realms/pretui/components/diff-stat.gts +102 -0
  13. package/bundled-realms/pretui/components/jump-chip.gts +86 -53
  14. package/bundled-realms/pretui/components/markdown-stream.gts +799 -0
  15. package/bundled-realms/pretui/components/markdown-surface.gts +71 -0
  16. package/bundled-realms/pretui/components/plan-mark.gts +147 -0
  17. package/bundled-realms/pretui/components/prose.gts +185 -8
  18. package/bundled-realms/pretui/components/prose.md +6 -8
  19. package/bundled-realms/pretui/components/quick-look.gts +377 -0
  20. package/bundled-realms/pretui/components/reactions.gts +136 -0
  21. package/bundled-realms/pretui/components/recommendation.gts +67 -36
  22. package/bundled-realms/pretui/components/result-card.gts +58 -22
  23. package/bundled-realms/pretui/components/segmented-control.gts +13 -8
  24. package/bundled-realms/pretui/components/session-prep.gts +12 -11
  25. package/bundled-realms/pretui/components/sliding-highlight.gts +8 -3
  26. package/bundled-realms/pretui/components/speaker-label.gts +132 -0
  27. package/bundled-realms/pretui/components/state-glyph.gts +121 -0
  28. package/bundled-realms/pretui/components/step-list.gts +62 -60
  29. package/bundled-realms/pretui/components/stick-to-bottom.gts +1150 -0
  30. package/bundled-realms/pretui/components/system-line.gts +143 -0
  31. package/bundled-realms/pretui/components/task-checklist.gts +184 -0
  32. package/bundled-realms/pretui/components/thinking.gts +63 -94
  33. package/bundled-realms/pretui/components/tool-change-table.gts +285 -0
  34. package/bundled-realms/pretui/components/tool-gate.gts +462 -0
  35. package/bundled-realms/pretui/components/tool-group.gts +920 -0
  36. package/bundled-realms/pretui/components/tool-icon.ts +64 -0
  37. package/bundled-realms/pretui/components/tool-meta.gts +82 -0
  38. package/bundled-realms/pretui/components/tool-plan.gts +197 -0
  39. package/bundled-realms/pretui/components/tool-row.gts +2087 -0
  40. package/bundled-realms/pretui/components/turn-changes.gts +227 -0
  41. package/bundled-realms/pretui/components/user-bubble.gts +575 -0
  42. package/bundled-realms/pretui/components/work-item.gts +185 -48
  43. package/bundled-realms/pretui/docs/scroll-anchoring-protocol.md +136 -0
  44. package/bundled-realms/pretui/internal/markdown-projection.ts +438 -0
  45. package/bundled-realms/pretui/internal/mount-queue.ts +79 -0
  46. package/bundled-realms/pretui/internal/tool-phrases.ts +168 -0
  47. package/bundled-realms/pretui/package.json +2 -1
  48. package/bundled-test-harness/assets/{ai-module-creation-test-beRNwH-e.js → ai-module-creation-test-B6FQKqIl.js} +1 -1
  49. package/bundled-test-harness/assets/{app-QAuw0l8v.js → app-KpPqdyX3.js} +4 -4
  50. package/bundled-test-harness/assets/{binary-upload-dedupe-test-bI8T0QLl.js → binary-upload-dedupe-test-DN00y1tM.js} +1 -1
  51. package/bundled-test-harness/assets/{can-invoke-test-DVaU_yRT.js → can-invoke-test-Bl-EUFM3.js} +1 -1
  52. package/bundled-test-harness/assets/{card-chooser-paging-test-DnxMnXKR.js → card-chooser-paging-test-BNuZRHX3.js} +1 -1
  53. package/bundled-test-harness/assets/{card-chooser-test-DUSnLr-u.js → card-chooser-test-wKfPOOT4.js} +1 -1
  54. package/bundled-test-harness/assets/{card-def-field-def-relationships-test-GBUr3tFK.js → card-def-field-def-relationships-test-CduQ6zan.js} +1 -1
  55. package/bundled-test-harness/assets/{card-delete-test-CQveO1VC.js → card-delete-test-DKxolj5o.js} +1 -1
  56. package/bundled-test-harness/assets/{check-correctness-test-D2M2p66N.js → check-correctness-test-B-kgHztp.js} +1 -1
  57. package/bundled-test-harness/assets/choreo-BEHW-NOc.js +2 -0
  58. package/bundled-test-harness/assets/{choreo-CJfBb_EY.js → choreo-C2cpCfhA.js} +164 -13
  59. package/bundled-test-harness/assets/{choreo-feature-reel-test-D2OrygZv.js → choreo-feature-reel-test-CPI_6nkT.js} +2 -2
  60. package/bundled-test-harness/assets/{choreo-gallery-w07xqtO-.js → choreo-gallery-BxA9cyzF.js} +3 -3
  61. package/bundled-test-harness/assets/{choreo-gallery-build-order-test-yQg4JER6.js → choreo-gallery-build-order-test-CLVoseAJ.js} +1 -1
  62. package/bundled-test-harness/assets/{choreo-gallery-compositor-test-C2THCXJN.js → choreo-gallery-compositor-test-BpT5Ia6B.js} +1 -1
  63. package/bundled-test-harness/assets/{choreo-gallery-cover-test-D4T_Tk4s.js → choreo-gallery-cover-test-DL_fdSsh.js} +1 -1
  64. package/bundled-test-harness/assets/{choreo-gallery-crossing-stage-test-tHUPJ-Hy.js → choreo-gallery-crossing-stage-test-BcKHhpOK.js} +2 -2
  65. package/bundled-test-harness/assets/{choreo-gallery-demos-alive-test-BOtBOnEZ.js → choreo-gallery-demos-alive-test-KufLhXG8.js} +1 -1
  66. package/bundled-test-harness/assets/{choreo-gallery-drift-test-D_6U1Z2c.js → choreo-gallery-drift-test-Cx58rYIA.js} +1 -1
  67. package/bundled-test-harness/assets/{choreo-gallery-escort-test-DDBU0n4C.js → choreo-gallery-escort-test-Wz-emmID.js} +1 -1
  68. package/bundled-test-harness/assets/{choreo-gallery-films-test-CgW1NSdr.js → choreo-gallery-films-test-BFrVs5WW.js} +2 -2
  69. package/bundled-test-harness/assets/{choreo-gallery-filter-test-DUIsNwdO.js → choreo-gallery-filter-test-DCKQkhwe.js} +1 -1
  70. package/bundled-test-harness/assets/{choreo-gallery-fold-test-Chzlxvdr.js → choreo-gallery-fold-test-UtpDgpG9.js} +1 -1
  71. package/bundled-test-harness/assets/{choreo-gallery-guide-pages-test-DOWnqALT.js → choreo-gallery-guide-pages-test-rXDU9JLM.js} +1 -1
  72. package/bundled-test-harness/assets/{choreo-gallery-guides-test-Dra2J4LJ.js → choreo-gallery-guides-test-DfVFdIuU.js} +3 -3
  73. package/bundled-test-harness/assets/{choreo-gallery-hang-test-zzn1eiB-.js → choreo-gallery-hang-test-Cj7MbkFf.js} +1 -1
  74. package/bundled-test-harness/assets/{choreo-gallery-highlight-test-CW99hncQ.js → choreo-gallery-highlight-test-D6CF3IYZ.js} +2 -2
  75. package/bundled-test-harness/assets/{choreo-gallery-inline-edit-test-CYFm1kUz.js → choreo-gallery-inline-edit-test-LfHWsbqc.js} +1 -1
  76. package/bundled-test-harness/assets/{choreo-gallery-interruption-test-CYIBrKV9.js → choreo-gallery-interruption-test-CvQQAgTp.js} +2 -2
  77. package/bundled-test-harness/assets/{choreo-gallery-lone-stack-test-DL8R3SG7.js → choreo-gallery-lone-stack-test-D7Zci7fm.js} +1 -1
  78. package/bundled-test-harness/assets/{choreo-gallery-navigation-test-Dcv04kDx.js → choreo-gallery-navigation-test-DB1EnBEW.js} +1 -1
  79. package/bundled-test-harness/assets/{choreo-gallery-playhead-transport-test-Cfz7GsXl.js → choreo-gallery-playhead-transport-test-CtBlc6AJ.js} +1 -1
  80. package/bundled-test-harness/assets/{choreo-gallery-poplayout-subtree-test-CwoklBkW.js → choreo-gallery-poplayout-subtree-test-BQbmjsvI.js} +1 -1
  81. package/bundled-test-harness/assets/{choreo-gallery-presence-modes-test-BDCIZzJ0.js → choreo-gallery-presence-modes-test-CIdXVG1K.js} +1 -1
  82. package/bundled-test-harness/assets/{choreo-gallery-presentation-test-DlyiHwFf.js → choreo-gallery-presentation-test-C_rPFp29.js} +1 -1
  83. package/bundled-test-harness/assets/{choreo-gallery-reduced-motion-test-DVz5SKNR.js → choreo-gallery-reduced-motion-test-CH5w8Lw-.js} +2 -2
  84. package/bundled-test-harness/assets/{choreo-gallery-sheet-standalone-test-CpD_-BvS.js → choreo-gallery-sheet-standalone-test-CDgI4mGX.js} +1 -1
  85. package/bundled-test-harness/assets/{choreo-gallery-sheet-test-BjvAKHDL.js → choreo-gallery-sheet-test-5lsFX7Rk.js} +1 -1
  86. package/bundled-test-harness/assets/{choreo-gallery-site-test-oq_7y_PN.js → choreo-gallery-site-test-DbMa2xeC.js} +2 -2
  87. package/bundled-test-harness/assets/{choreo-gallery-stage-Bzr4_8Xd.js → choreo-gallery-stage-b3Sk86hp.js} +2 -2
  88. package/bundled-test-harness/assets/{choreo-gallery-stage-keyboard-test-a83d2euJ.js → choreo-gallery-stage-keyboard-test-ds6fT5Eg.js} +1 -1
  89. package/bundled-test-harness/assets/{choreo-gallery-stages-test-C9Sl1kH6.js → choreo-gallery-stages-test-ahioKCct.js} +2 -2
  90. package/bundled-test-harness/assets/{choreo-gallery-subdivision-test-BVVnkOwk.js → choreo-gallery-subdivision-test-g7anTDhT.js} +1 -1
  91. package/bundled-test-harness/assets/{choreo-gallery-table-plan-test-B0YdYEA0.js → choreo-gallery-table-plan-test-Bozc4uUf.js} +1 -1
  92. package/bundled-test-harness/assets/{choreo-gallery-theater-test-BLA147xw.js → choreo-gallery-theater-test-kE535d-b.js} +3 -3
  93. package/bundled-test-harness/assets/{choreo-gallery-tuning-test-DSXiNzCh.js → choreo-gallery-tuning-test-6rHkQBnZ.js} +1 -1
  94. package/bundled-test-harness/assets/{choreo-gallery-widget-room-test-BI574PdO.js → choreo-gallery-widget-room-test-0Vq-uTo1.js} +2 -2
  95. package/bundled-test-harness/assets/{choreo-gallery-wires-test-B6Mz2WZl.js → choreo-gallery-wires-test-CdtnAWYO.js} +1 -1
  96. package/bundled-test-harness/assets/clip-BLfuHi8g.js +2 -0
  97. package/bundled-test-harness/assets/{clip-C_pXjVvY.js → clip-q1QE5f73.js} +1 -1
  98. package/bundled-test-harness/assets/{codeblocks-test-AdolhdCA.js → codeblocks-test-BDD7qK_V.js} +1 -1
  99. package/bundled-test-harness/assets/{compaction-test-DvyAQq56.js → compaction-test-BweolkhG.js} +1 -1
  100. package/bundled-test-harness/assets/{container-DIF_9lZ9.css → container-B5B6u-xm.css} +29 -22
  101. package/bundled-test-harness/assets/{container-DvvqmNpg.js → container-BnJjIM6J.js} +9 -6
  102. package/bundled-test-harness/assets/{create-listing-modal-test-D95JfQab.js → create-listing-modal-test-FvcAKpIa.js} +1 -1
  103. package/bundled-test-harness/assets/{debug-message-test-BcNtj7Wr.js → debug-message-test-CJ18Evt7.js} +1 -1
  104. package/bundled-test-harness/assets/{externals-6ZWftYIb.js → externals-BWjhmCD4.js} +12 -12
  105. package/bundled-test-harness/assets/{fallback-banner-live-delete-test-5lnN1pv2.js → fallback-banner-live-delete-test-C2H3BrT-.js} +1 -1
  106. package/bundled-test-harness/assets/{fallback-banner-test-DFb_m_Kq.js → fallback-banner-test-C10aYjkj.js} +1 -1
  107. package/bundled-test-harness/assets/{fallback-models-test-p3YIwj1L.js → fallback-models-test-BxoPiaGF.js} +1 -1
  108. package/bundled-test-harness/assets/{file-attachment-test-CmyjNWRR.js → file-attachment-test-DeKyzYaz.js} +1 -1
  109. package/bundled-test-harness/assets/film-B68PjRlr.js +2 -0
  110. package/bundled-test-harness/assets/{film-D7vtJO5q.js → film-CeUpnHN_.js} +6 -6
  111. package/bundled-test-harness/assets/{film-DN0A8JHx.js → film-DBZqyqW4.js} +6 -6
  112. package/bundled-test-harness/assets/{general-test-CX-TFDuX.js → general-test-BewzrpoB.js} +1 -1
  113. package/bundled-test-harness/assets/{glimmer-motion-and-choreo-in-cards-test-BHte2t9G.js → glimmer-motion-and-choreo-in-cards-test-HA-INN3d.js} +14 -14
  114. package/bundled-test-harness/assets/{glimmer-motion-and-choreo-test-BPNVeIio.js → glimmer-motion-and-choreo-test-BZ0ZuuAw.js} +3 -3
  115. package/bundled-test-harness/assets/{index-query-engine-test-Dz7Q4Xmk.js → index-query-engine-test-BtI8Y2LR.js} +1 -1
  116. package/bundled-test-harness/assets/{instance-filter-matcher-test-BoLU3bVg.js → instance-filter-matcher-test-BHXHGHjE.js} +1 -1
  117. package/bundled-test-harness/assets/{main-Dlgp8c7v.js → main-CqAHZ2kK.js} +1 -1
  118. package/bundled-test-harness/assets/{message-tool-test-CfjRSJvt.js → message-tool-test-NMaPJFsd.js} +1 -1
  119. package/bundled-test-harness/assets/{model-cost-tier-test-mZG84Uso.js → model-cost-tier-test-BgbfN2LH.js} +1 -1
  120. package/bundled-test-harness/assets/{operation-lowering-test-B0KpI1xu.js → operation-lowering-test-C4IaOjsA.js} +1 -1
  121. package/bundled-test-harness/assets/{operator-mode-card-chooser-test-KWS8lq16.js → operator-mode-card-chooser-test-Bwe47Rn7.js} +1 -1
  122. package/bundled-test-harness/assets/{operator-mode-links-test-CViFt0Ws.js → operator-mode-links-test-BU4jkC-B.js} +1 -1
  123. package/bundled-test-harness/assets/{operator-mode-test-D0gZM2yw.js → operator-mode-test-Bh0rGM9z.js} +1 -1
  124. package/bundled-test-harness/assets/{operator-mode-ui-test-CEvHJ9DS.js → operator-mode-ui-test-whgUw0ju.js} +1 -1
  125. package/bundled-test-harness/assets/{overlay-menu-items-test-Pw80RXsr.js → overlay-menu-items-test-Cwn1vr8q.js} +1 -1
  126. package/bundled-test-harness/assets/{overlays-BnOM360u.js → overlays-BOzLbVDK.js} +1 -1
  127. package/bundled-test-harness/assets/{overlays-kBVfa4i8.js → overlays-C_PuGDGh.js} +1 -1
  128. package/bundled-test-harness/assets/{past-sessions-test-CW0-Bjav.js → past-sessions-test-Bh24N-Kz.js} +1 -1
  129. package/bundled-test-harness/assets/{permission-checking-realm-test-D5uXQypS.js → permission-checking-realm-test-DKnnAy0f.js} +1 -1
  130. package/bundled-test-harness/assets/{plate-CFvCDv2t.js → plate-BL7UtyKE.js} +1 -1
  131. package/bundled-test-harness/assets/plate-CqG3igCJ.js +2 -0
  132. package/bundled-test-harness/assets/player-BJfsgdSI.js +2 -0
  133. package/bundled-test-harness/assets/{player-DzuYjrTU.js → player-Da_CIsp_.js} +1 -1
  134. package/bundled-test-harness/assets/{realm-config-policy-standing-test-Btatheni.js → realm-config-policy-standing-test-DngdYypq.js} +1 -1
  135. package/bundled-test-harness/assets/{realm-config-routing-rule-edit-test-Dh5zW13o.js → realm-config-routing-rule-edit-test-_rkFU8SN.js} +1 -1
  136. package/bundled-test-harness/assets/{realm-config-settings-test-BJa8gv_C.js → realm-config-settings-test-CR9NH0Zn.js} +1 -1
  137. package/bundled-test-harness/assets/{reasoning-test-2Zp37cQB.js → reasoning-test-0lH10kRl.js} +1 -1
  138. package/bundled-test-harness/assets/{room-message-test-BsrON13e.js → room-message-test-C-PddE4Y.js} +1 -1
  139. package/bundled-test-harness/assets/{run-BMyvn_UL.js → run-D4n4LPcK.js} +96 -6
  140. package/bundled-test-harness/assets/{run-realm-code-BxktQf6R.js → run-realm-code-C8N7DtN-.js} +1 -1
  141. package/bundled-test-harness/assets/{run-realm-code-test-7grpTos-.js → run-realm-code-test-DBdp147q.js} +1 -1
  142. package/bundled-test-harness/assets/{schema-generation-test-CM9ggQji.js → schema-generation-test-CB1Hb7GQ.js} +1 -1
  143. package/bundled-test-harness/assets/{scrolling-test-BER00htB.js → scrolling-test-3PhVin8h.js} +1 -1
  144. package/bundled-test-harness/assets/{searchable-option-test-BBr5BPow.js → searchable-option-test-BAdOiL4U.js} +1 -1
  145. package/bundled-test-harness/assets/{sending-test-BJGobs2E.js → sending-test-KSmu1tSJ.js} +1 -1
  146. package/bundled-test-harness/assets/{skills-test-GPOsHRN6.js → skills-test-D-dlcFpd.js} +1 -1
  147. package/bundled-test-harness/assets/{src-Df148w_b.js → src-B_DEhPze.js} +4 -4
  148. package/bundled-test-harness/assets/{src-Cf2wv-Le.js → src-BoTgwqUA.js} +2 -2
  149. package/bundled-test-harness/assets/{store-test-QvvHimzH.js → store-test-CEW7xQjZ.js} +1 -1
  150. package/bundled-test-harness/assets/{test-support-rNHuieEc.js → test-support-FXDPpIl3.js} +1 -1
  151. package/bundled-test-harness/assets/{test-support-C6N_2X-l.js → test-support-VX6ukQNR.js} +1 -1
  152. package/bundled-test-harness/assets/{tests-CmsQ-Z_3.js → tests-QYqqa6nv.js} +84 -84
  153. package/bundled-test-harness/assets/{text-input-validator-test-CYYH2N0L.js → text-input-validator-test-D8iNOWep.js} +1 -1
  154. package/bundled-test-harness/assets/{titles-B1pTaIfP.js → titles-DFJj5O0E.js} +1 -1
  155. package/bundled-test-harness/assets/titles-xGlgu7ys.js +2 -0
  156. package/bundled-test-harness/assets/{to-device-streaming-test-Ctqa0bVp.js → to-device-streaming-test-trCX-505.js} +1 -1
  157. package/bundled-test-harness/assets/{token-usage-test-BQVbK3X0.js → token-usage-test-C6sULooH.js} +1 -1
  158. package/bundled-test-harness/assets/{tools-DU8Rc15s.js → tools-UJfD-_al.js} +1 -1
  159. package/bundled-test-harness/assets/{tools-test-B13yvEKE.js → tools-test-Brav31AV.js} +1 -1
  160. package/bundled-test-harness/assets/{worker-DHBEBihX.js → worker-9ph9_Lpv.js} +31 -26
  161. package/bundled-test-harness/index.html +8 -8
  162. package/bundled-test-harness/tests/index.html +8 -8
  163. package/bundled-types/choreo/beacons.ts +16 -4
  164. package/bundled-types/choreo/changeset.ts +25 -5
  165. package/bundled-types/choreo/choreo.gts +245 -3
  166. package/bundled-types/choreo/far.ts +39 -0
  167. package/bundled-types/choreo/index.ts +2 -0
  168. package/bundled-types/choreo/run.ts +104 -1
  169. package/bundled-types/host-app/lib/realm-runner/worker.ts +8 -51
  170. package/bundled-types/runtime-common/realm-runner-script.d.ts +3 -0
  171. package/package.json +1 -1
  172. package/bundled-test-harness/assets/choreo-B3Z9QhDH.js +0 -2
  173. package/bundled-test-harness/assets/clip-BjcXuTwN.js +0 -2
  174. package/bundled-test-harness/assets/film-DMDPP7ma.js +0 -2
  175. package/bundled-test-harness/assets/plate-66qnQ-M9.js +0 -2
  176. package/bundled-test-harness/assets/player-pygg1PwA.js +0 -2
  177. package/bundled-test-harness/assets/titles-Ccpcl-jq.js +0 -2
@@ -0,0 +1,143 @@
1
+ // Pretui — SystemLine: a change to the conversation itself, said once in the thread.
2
+ import Component from '@glimmer/component';
3
+ import { StateGlyph } from './state-glyph';
4
+ import { on } from '@ember/modifier';
5
+
6
+ export interface SystemLineSignature {
7
+ Args: {
8
+ /** what changed: 'Model set to GPT-5.6 Terra', 'Skills on: Showcase' */
9
+ text: string;
10
+ /** one character before it. Default '·' */
11
+ glyph?: string;
12
+ /** who changed it, when it was not the reader: 'the assistant',
13
+ * 'Rupert' */
14
+ by?: string;
15
+ /** 'line' (default), or 'checkpoint': a rule across the thread with
16
+ * the point's name on it, a place the session can go back to */
17
+ variant?: 'line' | 'checkpoint';
18
+ /** one verb on the line: Restore (a checkpoint), Switch back (a model
19
+ * fallback), Fix (a broken skill) */
20
+ action?: string;
21
+ onAction?: () => void;
22
+ /** dismiss a notice the reader has seen */
23
+ onDismiss?: () => void;
24
+ };
25
+ Element: HTMLParagraphElement;
26
+ }
27
+
28
+ /**
29
+ * A model switch, a skill turned on, someone joining: facts about the
30
+ * room, not work, so they read as one caption line on the transcript's text
31
+ * edge between turns, never as a row.
32
+ */
33
+ export class SystemLine extends Component<SystemLineSignature> {
34
+ act = () => this.args.onAction?.();
35
+ dismiss = () => this.args.onDismiss?.();
36
+ <template>
37
+ <p
38
+ class='pretui-systemline'
39
+ data-variant={{if @variant @variant 'line'}}
40
+ data-test-pretui-system-line
41
+ ...attributes
42
+ >
43
+ <StateGlyph
44
+ class='pretui-systemline-glyph'
45
+ @glyph={{if @glyph @glyph '·'}}
46
+ @size={{11}}
47
+ />
48
+ <span class='pretui-systemline-text'>{{@text}}{{#if @by}}<span
49
+ class='pretui-systemline-by'
50
+ > · by {{@by}}</span>{{/if}}</span>
51
+ {{#if @onAction}}<button
52
+ type='button'
53
+ class='pretui-systemline-act'
54
+ data-test-pretui-system-line-action
55
+ {{on 'click' this.act}}
56
+ >{{if @action @action 'Restore'}}</button>{{/if}}
57
+ {{#if @onDismiss}}<button
58
+ type='button'
59
+ class='pretui-systemline-act'
60
+ aria-label='Dismiss'
61
+ data-test-pretui-system-line-dismiss
62
+ {{on 'click' this.dismiss}}
63
+ ><StateGlyph @glyph='failed' @size={{11}} /></button>{{/if}}
64
+ </p>
65
+ <style scoped>
66
+ @layer PretComponent {
67
+ .pretui-systemline {
68
+ display: grid;
69
+ grid-template-columns:
70
+ var(--pretui-toolrow-disc, 1rem) minmax(0, 1fr)
71
+ auto auto;
72
+ column-gap: var(--pretui-toolrow-gap, var(--boxel-sp-xs));
73
+ align-items: baseline;
74
+ margin: 0;
75
+ /* on the transcript's text edge; inside a row, the row's inset */
76
+ padding-inline: var(--pretui-toolrow-inset, 0);
77
+ font-size: var(--boxel-caption-font-size);
78
+ line-height: var(--boxel-caption-line-height);
79
+ color: var(--subtle-foreground);
80
+ }
81
+ .pretui-systemline-glyph {
82
+ text-align: center;
83
+ }
84
+ .pretui-systemline-text {
85
+ min-width: 0;
86
+ overflow-wrap: break-word;
87
+ }
88
+ /* a checkpoint is a rule across the thread with its name on it. A
89
+ flex row, not a grid, so the two rules take the slack on either
90
+ side of whatever sits between them: the name alone, or the name
91
+ with an action, a dismiss button or both, all on one line */
92
+ .pretui-systemline[data-variant='checkpoint'] {
93
+ display: flex;
94
+ align-items: center;
95
+ column-gap: var(--boxel-sp-xs);
96
+ }
97
+ .pretui-systemline[data-variant='checkpoint']::before,
98
+ .pretui-systemline[data-variant='checkpoint']::after {
99
+ content: '';
100
+ flex: 1 1 var(--boxel-sp-sm);
101
+ min-width: var(--boxel-sp-sm);
102
+ height: 1px;
103
+ background-color: var(--border);
104
+ }
105
+ .pretui-systemline[data-variant='checkpoint'] .pretui-systemline-glyph {
106
+ display: none;
107
+ }
108
+ /* a 24px target (WCAG 2.5.8) inside a caption line: the negative
109
+ block margin gives back what the height adds, so the line keeps
110
+ its caption height */
111
+ .pretui-systemline-act {
112
+ --_systemline-target: 1.5rem;
113
+ display: inline-flex;
114
+ align-items: center;
115
+ justify-content: center;
116
+ min-width: var(--_systemline-target);
117
+ min-height: var(--_systemline-target);
118
+ margin-block: calc((1lh - var(--_systemline-target)) / 2);
119
+ padding: 0 var(--boxel-sp-4xs);
120
+ border: 0;
121
+ border-radius: var(--boxel-border-radius-xs);
122
+ background-color: transparent;
123
+ font-family: inherit;
124
+ font-size: inherit;
125
+ line-height: inherit;
126
+ font-weight: 600;
127
+ color: var(--muted-foreground);
128
+ cursor: pointer;
129
+ }
130
+ .pretui-systemline-act:hover {
131
+ color: var(--primary-ink);
132
+ }
133
+ .pretui-systemline-act:focus-visible {
134
+ outline: 2px solid var(--ring);
135
+ outline-offset: 1px;
136
+ }
137
+ .pretui-systemline-by {
138
+ color: var(--muted-foreground);
139
+ }
140
+ }
141
+ </style>
142
+ </template>
143
+ }
@@ -0,0 +1,184 @@
1
+ // Pretui — TaskChecklist: what the agent is doing now, over the plan it is working through.
2
+ import Component from '@glimmer/component';
3
+ import { on } from '@ember/modifier';
4
+ import ChevronRightIcon from '@cardstack/boxel-icons/chevron-right';
5
+ import { ToolPlan } from './tool-plan';
6
+ import type { ToolPlanStep } from './tool-plan';
7
+
8
+ export interface TaskChecklistSignature {
9
+ Args: {
10
+ steps: ToolPlanStep[];
11
+ /** what the agent is doing this moment, in its own words: "Fixing the
12
+ * regex lint error; read host approval test". Shimmers while it runs */
13
+ activity?: string;
14
+ /** open the activity's detail (the call it is making). Omit and the
15
+ * line is plain text */
16
+ onActivity?: () => void;
17
+ /** the run is still going. Default: a step is under way */
18
+ running?: boolean;
19
+ /** the list's accessible name. Default 'Tasks' */
20
+ label?: string;
21
+ };
22
+ Element: HTMLElement;
23
+ }
24
+
25
+ /**
26
+ * The plan the agent keeps while it works, as the reader follows it: the
27
+ * thing it is doing now on one line, then every step with its mark — a
28
+ * soft tick for done, a thin turning ring for the one under way, a dashed
29
+ * circle for what is left. Steps finish in any order; a done step steps
30
+ * back in ink so the eye lands on the work still to do. One soft card, no
31
+ * stripe.
32
+ */
33
+ export class TaskChecklist extends Component<TaskChecklistSignature> {
34
+ get running(): boolean {
35
+ return (
36
+ this.args.running ??
37
+ this.args.steps.some((step) => step.state === 'current')
38
+ );
39
+ }
40
+ get done(): number {
41
+ return this.args.steps.filter((step) => step.state === 'done').length;
42
+ }
43
+ get summary(): string {
44
+ return `${this.done} of ${this.args.steps.length} done`;
45
+ }
46
+ activity = () => this.args.onActivity?.();
47
+ <template>
48
+ <section
49
+ class='pretui-checklist'
50
+ data-running={{if this.running 'true'}}
51
+ aria-label={{if @label @label 'Tasks'}}
52
+ data-test-pretui-task-checklist
53
+ ...attributes
54
+ >
55
+ {{#if @activity}}
56
+ {{#if @onActivity}}
57
+ <button
58
+ type='button'
59
+ class='pretui-checklist-activity'
60
+ data-test-pretui-task-checklist-activity
61
+ {{on 'click' this.activity}}
62
+ >
63
+ <span class='pretui-checklist-activity-text'>{{@activity}}</span>
64
+ <ChevronRightIcon
65
+ class='pretui-checklist-chevron'
66
+ width='14'
67
+ height='14'
68
+ />
69
+ </button>
70
+ {{else}}
71
+ <p
72
+ class='pretui-checklist-activity'
73
+ data-test-pretui-task-checklist-activity
74
+ >
75
+ <span class='pretui-checklist-activity-text'>{{@activity}}</span>
76
+ </p>
77
+ {{/if}}
78
+ {{/if}}
79
+ <div class='pretui-checklist-card'>
80
+ <ToolPlan
81
+ @steps={{@steps}}
82
+ @density='comfortable'
83
+ @label={{if @label @label 'Tasks'}}
84
+ />
85
+ <span
86
+ class='pretui-checklist-summary'
87
+ role='status'
88
+ data-test-pretui-task-checklist-summary
89
+ >{{this.summary}}</span>
90
+ </div>
91
+ </section>
92
+ <style scoped>
93
+ @layer PretComponent {
94
+ .pretui-checklist {
95
+ display: grid;
96
+ gap: var(--boxel-sp-xs);
97
+ min-width: 0;
98
+ }
99
+ .pretui-checklist-activity {
100
+ display: inline-flex;
101
+ align-items: center;
102
+ gap: var(--boxel-sp-4xs);
103
+ justify-self: start;
104
+ max-width: 100%;
105
+ margin: 0;
106
+ padding: 0;
107
+ border: 0;
108
+ background-color: transparent;
109
+ font-family: inherit;
110
+ font-size: var(--boxel-ui-label-font-size);
111
+ line-height: var(--boxel-ui-label-line-height);
112
+ text-align: start;
113
+ color: var(--muted-foreground);
114
+ }
115
+ button.pretui-checklist-activity {
116
+ cursor: pointer;
117
+ }
118
+ button.pretui-checklist-activity:hover {
119
+ color: var(--foreground);
120
+ }
121
+ button.pretui-checklist-activity:focus-visible {
122
+ outline: 2px solid var(--ring);
123
+ outline-offset: 2px;
124
+ border-radius: var(--boxel-border-radius-xs);
125
+ }
126
+ .pretui-checklist-activity-text {
127
+ min-width: 0;
128
+ overflow: hidden;
129
+ white-space: nowrap;
130
+ text-overflow: ellipsis;
131
+ }
132
+ /* while it runs, the line's tail shimmers as TextShimmer does */
133
+ .pretui-checklist[data-running] .pretui-checklist-activity-text {
134
+ background: linear-gradient(
135
+ 90deg,
136
+ var(--muted-foreground) 0%,
137
+ var(--muted-foreground) 40%,
138
+ var(--foreground) 50%,
139
+ var(--muted-foreground) 60%,
140
+ var(--muted-foreground) 100%
141
+ )
142
+ 0 0 / 300% 100%;
143
+ -webkit-background-clip: text;
144
+ background-clip: text;
145
+ color: transparent;
146
+ animation: pretui-checklist-shimmer 2.4s linear infinite;
147
+ }
148
+ @keyframes pretui-checklist-shimmer {
149
+ from {
150
+ background-position: 100% 0;
151
+ }
152
+ to {
153
+ background-position: 0% 0;
154
+ }
155
+ }
156
+ @media (prefers-reduced-motion: reduce) {
157
+ .pretui-checklist[data-running] .pretui-checklist-activity-text {
158
+ animation: none;
159
+ background-image: none;
160
+ color: var(--muted-foreground);
161
+ }
162
+ }
163
+ .pretui-checklist-chevron {
164
+ flex: none;
165
+ }
166
+ .pretui-checklist-card {
167
+ padding: var(--boxel-sp-sm);
168
+ border-radius: var(--boxel-border-radius-lg);
169
+ box-shadow: inset 0 0 0 1px var(--border);
170
+ background-color: var(--card);
171
+ }
172
+ /* the count is for a screen reader; the marks say it to the eye */
173
+ .pretui-checklist-summary {
174
+ position: absolute;
175
+ width: 1px;
176
+ height: 1px;
177
+ overflow: hidden;
178
+ clip-path: inset(50%);
179
+ white-space: nowrap;
180
+ }
181
+ }
182
+ </style>
183
+ </template>
184
+ }
@@ -3,6 +3,10 @@ import Component from '@glimmer/component';
3
3
  import { tracked } from '@glimmer/tracking';
4
4
  import { on } from '@ember/modifier';
5
5
  import { guidFor } from '@ember/object/internals';
6
+ import CheckIcon from '@cardstack/boxel-icons/check';
7
+ import ChevronDownIcon from '@cardstack/boxel-icons/chevron-down';
8
+ import SearchIcon from '@cardstack/boxel-icons/search';
9
+ import SparklesIcon from '@cardstack/boxel-icons/sparkles';
6
10
  import { Spinner } from './spinner';
7
11
  import { cssStyleFrom } from '../pretui-css';
8
12
  import { Collapse } from '../internal/agentic-chat';
@@ -130,35 +134,26 @@ export class Thinking extends Component<ThinkingSignature> {
130
134
  data-test-pretui-thinking-toggle
131
135
  {{on 'click' this.toggle}}
132
136
  >
133
- <svg
137
+ <SparklesIcon
134
138
  class='pretui-trace-spark'
135
- viewBox='0 0 24 24'
139
+ width='15'
140
+ height='15'
136
141
  aria-hidden='true'
137
- focusable='false'
138
- >
139
- <path d='M12 2l2.4 7.2L22 12l-7.6 2.8L12 22l-2.4-7.2L2 12l7.6-2.8z' />
140
- </svg>
142
+ />
141
143
  {{#if this.working}}
142
- <span class='pretui-trace-label' data-shimmer='true'
144
+ <span
145
+ class='pretui-trace-label'
146
+ data-shimmer='true'
143
147
  >{{this.label}}</span>
144
148
  {{else}}
145
149
  <span class='pretui-trace-label'>{{this.doneLabel}}</span>
146
150
  {{/if}}
147
- <svg
151
+ <ChevronDownIcon
148
152
  class='pretui-trace-chev'
149
- viewBox='0 0 24 24'
153
+ width='14'
154
+ height='14'
150
155
  aria-hidden='true'
151
- focusable='false'
152
- >
153
- <path
154
- d='M6 9l6 6 6-6'
155
- fill='none'
156
- stroke='currentColor'
157
- stroke-width='2.2'
158
- stroke-linecap='round'
159
- stroke-linejoin='round'
160
- />
161
- </svg>
156
+ />
162
157
  </button>
163
158
  {{! the state change announces once, politely, from outside the button }}
164
159
  <span class='pretui-sr' role='status'>{{if
@@ -171,23 +166,7 @@ export class Thinking extends Component<ThinkingSignature> {
171
166
  <div class='pretui-trace-rail' data-open={{if this.expanded 'true'}}>
172
167
  {{#if @query}}
173
168
  <div class='pretui-trace-row' data-kind='query'>
174
- <svg viewBox='0 0 24 24' aria-hidden='true' focusable='false'>
175
- <circle
176
- cx='11'
177
- cy='11'
178
- r='7'
179
- fill='none'
180
- stroke='currentColor'
181
- stroke-width='2'
182
- />
183
- <path
184
- d='M21 21l-4.3-4.3'
185
- fill='none'
186
- stroke='currentColor'
187
- stroke-width='2'
188
- stroke-linecap='round'
189
- />
190
- </svg>
169
+ <SearchIcon width='13' height='13' aria-hidden='true' />
191
170
  <span class='pretui-trace-primary'>{{@query}}</span>
192
171
  </div>
193
172
  {{/if}}
@@ -196,21 +175,12 @@ export class Thinking extends Component<ThinkingSignature> {
196
175
  {{#if row.isRunning}}
197
176
  <Spinner @size={{11}} />
198
177
  {{else if row.isDone}}
199
- <svg
178
+ <CheckIcon
200
179
  class='pretui-trace-check'
201
- viewBox='0 0 24 24'
180
+ width='13'
181
+ height='13'
202
182
  aria-hidden='true'
203
- focusable='false'
204
- >
205
- <path
206
- d='M20 6L9 17l-5-5'
207
- fill='none'
208
- stroke='currentColor'
209
- stroke-width='2.5'
210
- stroke-linecap='round'
211
- stroke-linejoin='round'
212
- />
213
- </svg>
183
+ />
214
184
  {{/if}}
215
185
  <span
216
186
  class='pretui-trace-primary'
@@ -238,7 +208,8 @@ export class Thinking extends Component<ThinkingSignature> {
238
208
  <style scoped>
239
209
  @layer PretComponent {
240
210
  .pretui-trace {
241
- font-size: var(--text-ui-md, 12.5px);
211
+ font-size: var(--boxel-ui-label-font-size);
212
+ line-height: var(--boxel-ui-label-line-height);
242
213
  }
243
214
  .pretui-sr {
244
215
  position: absolute;
@@ -251,35 +222,33 @@ export class Thinking extends Component<ThinkingSignature> {
251
222
  .pretui-trace-head {
252
223
  display: inline-flex;
253
224
  align-items: center;
254
- gap: 8px;
255
- min-height: 28px;
256
- padding: 4px 6px;
257
- margin: -4px -6px;
225
+ gap: var(--boxel-sp-xs);
226
+ min-height: 1.75rem;
227
+ padding: var(--boxel-sp-4xs) var(--boxel-sp-xs);
228
+ margin: calc(-1 * var(--boxel-sp-4xs)) calc(-1 * var(--boxel-sp-xs));
258
229
  border: 0;
259
- border-radius: 8px;
260
- background: none;
261
- font: inherit;
230
+ border-radius: var(--boxel-border-radius-sm);
231
+ background-color: transparent;
232
+ font-family: inherit;
262
233
  color: var(--muted-foreground);
263
234
  cursor: pointer;
264
235
  }
265
236
  .pretui-trace-head:hover {
266
- background: var(--hover, var(--boxel-100));
237
+ background-color: var(--hover);
267
238
  }
268
239
  .pretui-trace-head:focus-visible {
269
240
  outline: 2px solid var(--ring);
270
241
  outline-offset: 1px;
271
242
  }
272
243
  .pretui-trace-spark {
273
- width: 15px;
274
- height: 15px;
275
244
  flex: none;
276
- fill: var(--ink-3, var(--boxel-400));
245
+ color: var(--subtle-foreground);
277
246
  }
278
247
  .pretui-trace-head[data-working] .pretui-trace-spark {
279
- fill: var(--muted-foreground);
248
+ color: var(--muted-foreground);
280
249
  }
281
250
  .pretui-trace-label {
282
- font-weight: 500;
251
+ font-weight: 600;
283
252
  }
284
253
  /* Law 5: the sweep says "still going" and nothing else animates */
285
254
  .pretui-trace-label[data-shimmer] {
@@ -304,10 +273,8 @@ export class Thinking extends Component<ThinkingSignature> {
304
273
  }
305
274
  }
306
275
  .pretui-trace-chev {
307
- width: 14px;
308
- height: 14px;
309
276
  flex: none;
310
- color: var(--ink-3, var(--boxel-400));
277
+ color: var(--subtle-foreground);
311
278
  transition: transform 300ms
312
279
  var(--pretui-ease-enter, cubic-bezier(0.22, 0.61, 0.25, 1));
313
280
  }
@@ -316,79 +283,81 @@ export class Thinking extends Component<ThinkingSignature> {
316
283
  }
317
284
  .pretui-trace-rail {
318
285
  position: relative;
319
- margin: 6px 0 0 5px;
320
- padding-left: 16px;
286
+ margin: var(--boxel-sp-3xs) 0 0 var(--boxel-sp-3xs);
287
+ padding-left: var(--boxel-sp);
321
288
  display: flex;
322
289
  flex-direction: column;
323
- gap: 2px;
290
+ gap: var(--boxel-sp-6xs);
324
291
  }
325
292
  .pretui-trace-rail::before {
326
293
  content: '';
327
294
  position: absolute;
328
- left: 3px;
329
- top: 4px;
330
- bottom: 6px;
295
+ left: var(--boxel-sp-5xs);
296
+ top: var(--boxel-sp-4xs);
297
+ bottom: var(--boxel-sp-3xs);
331
298
  width: 1px;
332
- background: var(--border);
299
+ background-color: var(--border);
333
300
  }
334
301
  .pretui-trace-row {
335
302
  display: flex;
336
303
  align-items: center;
337
- gap: 8px;
338
- min-height: 26px;
339
- padding: 2px 6px;
340
- border-radius: 6px;
304
+ gap: var(--boxel-sp-xs);
305
+ min-height: 1.625rem;
306
+ padding: var(--boxel-sp-6xs) var(--boxel-sp-xs);
307
+ border-radius: var(--boxel-border-radius-sm);
341
308
  color: var(--foreground);
342
309
  }
343
310
  .pretui-trace-row:hover {
344
- background: var(--hover, var(--boxel-100));
311
+ background-color: var(--hover);
345
312
  }
346
313
  .pretui-trace-row[data-kind='query'] {
347
314
  color: var(--muted-foreground);
348
315
  }
349
316
  .pretui-trace-row > svg {
350
- width: 13px;
351
- height: 13px;
352
317
  flex: none;
353
318
  }
354
319
  .pretui-trace-check {
355
- color: var(--ink-3, var(--boxel-400));
320
+ color: var(--subtle-foreground);
356
321
  }
357
322
  .pretui-trace-primary {
358
323
  min-width: 0;
359
324
  overflow: hidden;
360
325
  text-overflow: ellipsis;
361
326
  white-space: nowrap;
362
- font-weight: 500;
327
+ font-weight: 400;
363
328
  }
364
329
  .pretui-trace-primary[data-wrap] {
365
330
  white-space: normal;
366
- font-weight: 400;
367
- line-height: 1.55;
368
331
  color: var(--muted-foreground);
369
332
  }
370
333
  .pretui-trace-sec {
371
334
  margin-left: auto;
372
335
  flex: none;
373
- font-size: var(--text-ui-sm, 11.5px);
374
- color: var(--ink-3, var(--boxel-400));
336
+ font-size: var(--boxel-caption-font-size);
337
+ line-height: var(--boxel-caption-line-height);
338
+ font-variant-numeric: tabular-nums;
339
+ color: var(--subtle-foreground);
375
340
  }
341
+ /* a machine value is a pasteable string: mono at the data size */
376
342
  .pretui-trace-sec[data-mono] {
377
343
  font-family: var(--font-mono);
344
+ font-size: var(--boxel-font-size-xs);
345
+ line-height: var(--boxel-line-height-xs);
378
346
  }
347
+ /* the counts are figures, not strings to paste: sans, tabular */
379
348
  .pretui-trace-diff {
380
349
  flex: none;
381
350
  display: inline-flex;
382
- gap: 6px;
383
- font-family: var(--font-mono);
384
- font-size: 11px;
351
+ gap: var(--boxel-sp-4xs);
352
+ font-size: var(--boxel-caption-font-size);
353
+ line-height: var(--boxel-caption-line-height);
385
354
  font-variant-numeric: tabular-nums;
386
355
  }
387
356
  .pretui-trace-add {
388
- color: var(--success, var(--boxel-success));
357
+ color: var(--success-ink);
389
358
  }
390
359
  .pretui-trace-del {
391
- color: var(--pretui-destructive-ink, var(--boxel-danger));
360
+ color: var(--destructive-ink);
392
361
  }
393
362
  /* the stagger is a precomputed delay, retriggered by the open flip.
394
363
  The flag lives on the rail, not on Collapse's own element: a
@@ -403,7 +372,7 @@ export class Thinking extends Component<ThinkingSignature> {
403
372
  @keyframes pretui-trace-in {
404
373
  from {
405
374
  opacity: 0;
406
- transform: translateY(4px);
375
+ transform: translateY(var(--boxel-sp-4xs));
407
376
  }
408
377
  to {
409
378
  opacity: 1;
@@ -413,7 +382,7 @@ export class Thinking extends Component<ThinkingSignature> {
413
382
  @media (prefers-reduced-motion: reduce) {
414
383
  .pretui-trace-label[data-shimmer] {
415
384
  animation: none;
416
- background: none;
385
+ background-image: none;
417
386
  -webkit-background-clip: border-box;
418
387
  background-clip: border-box;
419
388
  color: var(--foreground);