@design.estate/dees-catalog 3.91.0 → 3.92.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 (228) hide show
  1. package/dist_bundle/bundle.js +10381 -4788
  2. package/dist_ts_web/00_commitinfo_data.js +1 -1
  3. package/dist_ts_web/elements/00group-appui/dees-appui/dees-appui.js +5 -4
  4. package/dist_ts_web/elements/00group-appui/dees-appui-profiledropdown/dees-appui-profiledropdown.js +6 -7
  5. package/dist_ts_web/elements/00group-appui/dees-appui-tabs/dees-appui-tabs.js +4 -6
  6. package/dist_ts_web/elements/00group-button/dees-button/dees-button.d.ts +6 -0
  7. package/dist_ts_web/elements/00group-button/dees-button/dees-button.demo.js +14 -1
  8. package/dist_ts_web/elements/00group-button/dees-button/dees-button.js +49 -24
  9. package/dist_ts_web/elements/00group-chart/dees-chart-log/dees-chart-log.js +1 -1
  10. package/dist_ts_web/elements/00group-dataview/dees-dataview-codebox/codebox.diff.d.ts +69 -0
  11. package/dist_ts_web/elements/00group-dataview/dees-dataview-codebox/codebox.diff.js +342 -0
  12. package/dist_ts_web/elements/00group-dataview/dees-dataview-codebox/dees-dataview-codebox.d.ts +48 -3
  13. package/dist_ts_web/elements/00group-dataview/dees-dataview-codebox/dees-dataview-codebox.demo.js +128 -39
  14. package/dist_ts_web/elements/00group-dataview/dees-dataview-codebox/dees-dataview-codebox.js +663 -190
  15. package/dist_ts_web/elements/00group-dataview/dees-dataview-codebox/index.d.ts +1 -0
  16. package/dist_ts_web/elements/00group-dataview/dees-dataview-codebox/index.js +2 -1
  17. package/dist_ts_web/elements/00group-dataview/dees-dataview-statusobject/dees-dataview-statusobject.d.ts +3 -0
  18. package/dist_ts_web/elements/00group-dataview/dees-dataview-statusobject/dees-dataview-statusobject.js +48 -30
  19. package/dist_ts_web/elements/00group-dataview/dees-grouped-list/dees-grouped-list.js +1 -1
  20. package/dist_ts_web/elements/00group-dataview/dees-statsgrid/dees-statsgrid.js +1 -2
  21. package/dist_ts_web/elements/00group-dataview/dees-storage-browser/dees-storage-keys.js +1 -1
  22. package/dist_ts_web/elements/00group-dataview/dees-table/styles.js +1 -1
  23. package/dist_ts_web/elements/00group-feedback/dees-progressbar/dees-progressbar.js +9 -9
  24. package/dist_ts_web/elements/00group-harness/dees-harness-chat/dees-harness-chat.d.ts +55 -0
  25. package/dist_ts_web/elements/00group-harness/dees-harness-chat/dees-harness-chat.demo.d.ts +1 -0
  26. package/dist_ts_web/elements/00group-harness/dees-harness-chat/dees-harness-chat.demo.js +183 -0
  27. package/dist_ts_web/elements/00group-harness/dees-harness-chat/dees-harness-chat.js +412 -0
  28. package/dist_ts_web/elements/00group-harness/dees-harness-chat/index.d.ts +1 -0
  29. package/dist_ts_web/elements/00group-harness/dees-harness-chat/index.js +2 -0
  30. package/dist_ts_web/elements/00group-harness/dees-harness-composer/dees-harness-composer.d.ts +65 -0
  31. package/dist_ts_web/elements/00group-harness/dees-harness-composer/dees-harness-composer.demo.d.ts +1 -0
  32. package/dist_ts_web/elements/00group-harness/dees-harness-composer/dees-harness-composer.demo.js +55 -0
  33. package/dist_ts_web/elements/00group-harness/dees-harness-composer/dees-harness-composer.js +589 -0
  34. package/dist_ts_web/elements/00group-harness/dees-harness-composer/index.d.ts +1 -0
  35. package/dist_ts_web/elements/00group-harness/dees-harness-composer/index.js +2 -0
  36. package/dist_ts_web/elements/00group-harness/dees-harness-content-blocks/dees-harness-content-blocks.d.ts +21 -0
  37. package/dist_ts_web/elements/00group-harness/dees-harness-content-blocks/dees-harness-content-blocks.demo.d.ts +1 -0
  38. package/dist_ts_web/elements/00group-harness/dees-harness-content-blocks/dees-harness-content-blocks.demo.js +41 -0
  39. package/dist_ts_web/elements/00group-harness/dees-harness-content-blocks/dees-harness-content-blocks.js +215 -0
  40. package/dist_ts_web/elements/00group-harness/dees-harness-content-blocks/index.d.ts +1 -0
  41. package/dist_ts_web/elements/00group-harness/dees-harness-content-blocks/index.js +2 -0
  42. package/dist_ts_web/elements/00group-harness/dees-harness-message/dees-harness-message.d.ts +58 -0
  43. package/dist_ts_web/elements/00group-harness/dees-harness-message/dees-harness-message.demo.d.ts +1 -0
  44. package/dist_ts_web/elements/00group-harness/dees-harness-message/dees-harness-message.demo.js +126 -0
  45. package/dist_ts_web/elements/00group-harness/dees-harness-message/dees-harness-message.js +551 -0
  46. package/dist_ts_web/elements/00group-harness/dees-harness-message/index.d.ts +1 -0
  47. package/dist_ts_web/elements/00group-harness/dees-harness-message/index.js +2 -0
  48. package/dist_ts_web/elements/00group-harness/dees-harness-message-list/dees-harness-message-list.d.ts +50 -0
  49. package/dist_ts_web/elements/00group-harness/dees-harness-message-list/dees-harness-message-list.demo.d.ts +1 -0
  50. package/dist_ts_web/elements/00group-harness/dees-harness-message-list/dees-harness-message-list.demo.js +101 -0
  51. package/dist_ts_web/elements/00group-harness/dees-harness-message-list/dees-harness-message-list.js +424 -0
  52. package/dist_ts_web/elements/00group-harness/dees-harness-message-list/index.d.ts +1 -0
  53. package/dist_ts_web/elements/00group-harness/dees-harness-message-list/index.js +2 -0
  54. package/dist_ts_web/elements/00group-harness/dees-harness-permission-card/dees-harness-permission-card.d.ts +27 -0
  55. package/dist_ts_web/elements/00group-harness/dees-harness-permission-card/dees-harness-permission-card.demo.d.ts +1 -0
  56. package/dist_ts_web/elements/00group-harness/dees-harness-permission-card/dees-harness-permission-card.demo.js +46 -0
  57. package/dist_ts_web/elements/00group-harness/dees-harness-permission-card/dees-harness-permission-card.js +282 -0
  58. package/dist_ts_web/elements/00group-harness/dees-harness-permission-card/index.d.ts +1 -0
  59. package/dist_ts_web/elements/00group-harness/dees-harness-permission-card/index.js +2 -0
  60. package/dist_ts_web/elements/00group-harness/dees-harness-reasoning/dees-harness-reasoning.d.ts +24 -0
  61. package/dist_ts_web/elements/00group-harness/dees-harness-reasoning/dees-harness-reasoning.demo.d.ts +1 -0
  62. package/dist_ts_web/elements/00group-harness/dees-harness-reasoning/dees-harness-reasoning.demo.js +32 -0
  63. package/dist_ts_web/elements/00group-harness/dees-harness-reasoning/dees-harness-reasoning.js +241 -0
  64. package/dist_ts_web/elements/00group-harness/dees-harness-reasoning/index.d.ts +1 -0
  65. package/dist_ts_web/elements/00group-harness/dees-harness-reasoning/index.js +2 -0
  66. package/dist_ts_web/elements/00group-harness/dees-harness-session-list/dees-harness-session-list.d.ts +28 -0
  67. package/dist_ts_web/elements/00group-harness/dees-harness-session-list/dees-harness-session-list.demo.d.ts +1 -0
  68. package/dist_ts_web/elements/00group-harness/dees-harness-session-list/dees-harness-session-list.demo.js +56 -0
  69. package/dist_ts_web/elements/00group-harness/dees-harness-session-list/dees-harness-session-list.js +279 -0
  70. package/dist_ts_web/elements/00group-harness/dees-harness-session-list/index.d.ts +1 -0
  71. package/dist_ts_web/elements/00group-harness/dees-harness-session-list/index.js +2 -0
  72. package/dist_ts_web/elements/00group-harness/dees-harness-status/dees-harness-status.d.ts +30 -0
  73. package/dist_ts_web/elements/00group-harness/dees-harness-status/dees-harness-status.demo.d.ts +1 -0
  74. package/dist_ts_web/elements/00group-harness/dees-harness-status/dees-harness-status.demo.js +35 -0
  75. package/dist_ts_web/elements/00group-harness/dees-harness-status/dees-harness-status.js +235 -0
  76. package/dist_ts_web/elements/00group-harness/dees-harness-status/index.d.ts +1 -0
  77. package/dist_ts_web/elements/00group-harness/dees-harness-status/index.js +2 -0
  78. package/dist_ts_web/elements/00group-harness/dees-harness-todos/dees-harness-todos.d.ts +27 -0
  79. package/dist_ts_web/elements/00group-harness/dees-harness-todos/dees-harness-todos.demo.d.ts +1 -0
  80. package/dist_ts_web/elements/00group-harness/dees-harness-todos/dees-harness-todos.demo.js +41 -0
  81. package/dist_ts_web/elements/00group-harness/dees-harness-todos/dees-harness-todos.js +258 -0
  82. package/dist_ts_web/elements/00group-harness/dees-harness-todos/index.d.ts +1 -0
  83. package/dist_ts_web/elements/00group-harness/dees-harness-todos/index.js +2 -0
  84. package/dist_ts_web/elements/00group-harness/dees-harness-tool-card/dees-harness-tool-card.d.ts +35 -0
  85. package/dist_ts_web/elements/00group-harness/dees-harness-tool-card/dees-harness-tool-card.demo.d.ts +1 -0
  86. package/dist_ts_web/elements/00group-harness/dees-harness-tool-card/dees-harness-tool-card.demo.js +162 -0
  87. package/dist_ts_web/elements/00group-harness/dees-harness-tool-card/dees-harness-tool-card.js +368 -0
  88. package/dist_ts_web/elements/00group-harness/dees-harness-tool-card/index.d.ts +2 -0
  89. package/dist_ts_web/elements/00group-harness/dees-harness-tool-card/index.js +3 -0
  90. package/dist_ts_web/elements/00group-harness/dees-harness-tool-card/renderers.d.ts +5 -0
  91. package/dist_ts_web/elements/00group-harness/dees-harness-tool-card/renderers.js +183 -0
  92. package/dist_ts_web/elements/00group-harness/dees-harness-usage/dees-harness-usage.d.ts +19 -0
  93. package/dist_ts_web/elements/00group-harness/dees-harness-usage/dees-harness-usage.demo.d.ts +1 -0
  94. package/dist_ts_web/elements/00group-harness/dees-harness-usage/dees-harness-usage.demo.js +25 -0
  95. package/dist_ts_web/elements/00group-harness/dees-harness-usage/dees-harness-usage.js +148 -0
  96. package/dist_ts_web/elements/00group-harness/dees-harness-usage/index.d.ts +1 -0
  97. package/dist_ts_web/elements/00group-harness/dees-harness-usage/index.js +2 -0
  98. package/dist_ts_web/elements/00group-harness/harness.demodata.d.ts +22 -0
  99. package/dist_ts_web/elements/00group-harness/harness.demodata.js +94 -0
  100. package/dist_ts_web/elements/00group-harness/harness.helpers.d.ts +37 -0
  101. package/dist_ts_web/elements/00group-harness/harness.helpers.js +221 -0
  102. package/dist_ts_web/elements/00group-harness/harness.markdown.d.ts +25 -0
  103. package/dist_ts_web/elements/00group-harness/harness.markdown.js +147 -0
  104. package/dist_ts_web/elements/00group-harness/harness.styles.d.ts +9 -0
  105. package/dist_ts_web/elements/00group-harness/harness.styles.js +94 -0
  106. package/dist_ts_web/elements/00group-harness/index.d.ts +18 -0
  107. package/dist_ts_web/elements/00group-harness/index.js +22 -0
  108. package/dist_ts_web/elements/00group-harness/interfaces.d.ts +210 -0
  109. package/dist_ts_web/elements/00group-harness/interfaces.js +11 -0
  110. package/dist_ts_web/elements/00group-harness/toolregistry.d.ts +76 -0
  111. package/dist_ts_web/elements/00group-harness/toolregistry.js +210 -0
  112. package/dist_ts_web/elements/00group-input/dees-input-code/dees-input-code.js +30 -18
  113. package/dist_ts_web/elements/00group-input/dees-input-datepicker/datepicker-popup.js +73 -46
  114. package/dist_ts_web/elements/00group-input/dees-input-datepicker/styles.js +15 -16
  115. package/dist_ts_web/elements/00group-input/dees-input-list/dees-input-list.js +2 -4
  116. package/dist_ts_web/elements/00group-input/dees-input-tags/dees-input-tags.js +36 -15
  117. package/dist_ts_web/elements/00group-input/dees-input-toggle/dees-input-toggle.js +5 -4
  118. package/dist_ts_web/elements/00group-input/dees-input-wysiwyg/blocks/text/code.block.js +10 -89
  119. package/dist_ts_web/elements/00group-input/dees-input-wysiwyg/dees-input-wysiwyg.js +12 -8
  120. package/dist_ts_web/elements/00group-layout/dees-chips/dees-chips.js +1 -1
  121. package/dist_ts_web/elements/00group-layout/dees-pagination/dees-pagination.js +27 -12
  122. package/dist_ts_web/elements/00group-layout/dees-settings/dees-settings.js +1 -1
  123. package/dist_ts_web/elements/00group-layout/dees-stepper/dees-stepper.js +14 -18
  124. package/dist_ts_web/elements/00group-overlay/dees-contextmenu/dees-contextmenu.js +6 -7
  125. package/dist_ts_web/elements/00group-overlay/dees-modal/dees-modal.js +6 -21
  126. package/dist_ts_web/elements/00group-overlay/dees-windowlayer/dees-windowlayer.d.ts +2 -1
  127. package/dist_ts_web/elements/00group-overlay/dees-windowlayer/dees-windowlayer.js +10 -4
  128. package/dist_ts_web/elements/00group-simple/dees-shopping-productcard/dees-shopping-productcard.js +1 -1
  129. package/dist_ts_web/elements/00group-simple/dees-simple-appdash/dees-simple-appdash.js +9 -8
  130. package/dist_ts_web/elements/00group-workspace/dees-workspace/dees-workspace.js +1 -1
  131. package/dist_ts_web/elements/00group-workspace/dees-workspace-filetree/dees-workspace-filetree.js +3 -4
  132. package/dist_ts_web/elements/00group-workspace/dees-workspace-markdownoutlet/dees-workspace-markdownoutlet.js +8 -78
  133. package/dist_ts_web/elements/00syntax.d.ts +28 -0
  134. package/dist_ts_web/elements/00syntax.js +98 -0
  135. package/dist_ts_web/elements/00theme.js +26 -14
  136. package/dist_ts_web/elements/index.d.ts +1 -0
  137. package/dist_ts_web/elements/index.js +2 -1
  138. package/dist_watch/bundle.js +233948 -0
  139. package/dist_watch/bundle.js.map +7 -0
  140. package/dist_watch/index.html +28 -0
  141. package/package.json +1 -1
  142. package/readme.hints.md +7 -1
  143. package/readme.md +110 -0
  144. package/readme.playbook.md +10 -0
  145. package/ts_web/00_commitinfo_data.ts +1 -1
  146. package/ts_web/elements/00group-appui/dees-appui/dees-appui.ts +4 -3
  147. package/ts_web/elements/00group-appui/dees-appui-profiledropdown/dees-appui-profiledropdown.ts +5 -6
  148. package/ts_web/elements/00group-appui/dees-appui-tabs/dees-appui-tabs.ts +3 -5
  149. package/ts_web/elements/00group-button/dees-button/dees-button.demo.ts +13 -0
  150. package/ts_web/elements/00group-button/dees-button/dees-button.ts +42 -22
  151. package/ts_web/elements/00group-chart/dees-chart-log/dees-chart-log.ts +1 -1
  152. package/ts_web/elements/00group-dataview/dees-dataview-codebox/codebox.diff.ts +401 -0
  153. package/ts_web/elements/00group-dataview/dees-dataview-codebox/dees-dataview-codebox.demo.ts +132 -38
  154. package/ts_web/elements/00group-dataview/dees-dataview-codebox/dees-dataview-codebox.ts +649 -187
  155. package/ts_web/elements/00group-dataview/dees-dataview-codebox/index.ts +1 -0
  156. package/ts_web/elements/00group-dataview/dees-dataview-statusobject/dees-dataview-statusobject.ts +45 -30
  157. package/ts_web/elements/00group-dataview/dees-grouped-list/dees-grouped-list.ts +1 -1
  158. package/ts_web/elements/00group-dataview/dees-statsgrid/dees-statsgrid.ts +0 -1
  159. package/ts_web/elements/00group-dataview/dees-storage-browser/dees-storage-keys.ts +1 -1
  160. package/ts_web/elements/00group-dataview/dees-table/styles.ts +1 -1
  161. package/ts_web/elements/00group-feedback/dees-progressbar/dees-progressbar.ts +9 -9
  162. package/ts_web/elements/00group-harness/dees-harness-chat/dees-harness-chat.demo.ts +193 -0
  163. package/ts_web/elements/00group-harness/dees-harness-chat/dees-harness-chat.ts +301 -0
  164. package/ts_web/elements/00group-harness/dees-harness-chat/index.ts +1 -0
  165. package/ts_web/elements/00group-harness/dees-harness-composer/dees-harness-composer.demo.ts +56 -0
  166. package/ts_web/elements/00group-harness/dees-harness-composer/dees-harness-composer.ts +514 -0
  167. package/ts_web/elements/00group-harness/dees-harness-composer/index.ts +1 -0
  168. package/ts_web/elements/00group-harness/dees-harness-content-blocks/dees-harness-content-blocks.demo.ts +44 -0
  169. package/ts_web/elements/00group-harness/dees-harness-content-blocks/dees-harness-content-blocks.ts +172 -0
  170. package/ts_web/elements/00group-harness/dees-harness-content-blocks/index.ts +1 -0
  171. package/ts_web/elements/00group-harness/dees-harness-message/dees-harness-message.demo.ts +129 -0
  172. package/ts_web/elements/00group-harness/dees-harness-message/dees-harness-message.ts +498 -0
  173. package/ts_web/elements/00group-harness/dees-harness-message/index.ts +1 -0
  174. package/ts_web/elements/00group-harness/dees-harness-message-list/dees-harness-message-list.demo.ts +105 -0
  175. package/ts_web/elements/00group-harness/dees-harness-message-list/dees-harness-message-list.ts +342 -0
  176. package/ts_web/elements/00group-harness/dees-harness-message-list/index.ts +1 -0
  177. package/ts_web/elements/00group-harness/dees-harness-permission-card/dees-harness-permission-card.demo.ts +47 -0
  178. package/ts_web/elements/00group-harness/dees-harness-permission-card/dees-harness-permission-card.ts +225 -0
  179. package/ts_web/elements/00group-harness/dees-harness-permission-card/index.ts +1 -0
  180. package/ts_web/elements/00group-harness/dees-harness-reasoning/dees-harness-reasoning.demo.ts +32 -0
  181. package/ts_web/elements/00group-harness/dees-harness-reasoning/dees-harness-reasoning.ts +195 -0
  182. package/ts_web/elements/00group-harness/dees-harness-reasoning/index.ts +1 -0
  183. package/ts_web/elements/00group-harness/dees-harness-session-list/dees-harness-session-list.demo.ts +59 -0
  184. package/ts_web/elements/00group-harness/dees-harness-session-list/dees-harness-session-list.ts +222 -0
  185. package/ts_web/elements/00group-harness/dees-harness-session-list/index.ts +1 -0
  186. package/ts_web/elements/00group-harness/dees-harness-status/dees-harness-status.demo.ts +35 -0
  187. package/ts_web/elements/00group-harness/dees-harness-status/dees-harness-status.ts +187 -0
  188. package/ts_web/elements/00group-harness/dees-harness-status/index.ts +1 -0
  189. package/ts_web/elements/00group-harness/dees-harness-todos/dees-harness-todos.demo.ts +43 -0
  190. package/ts_web/elements/00group-harness/dees-harness-todos/dees-harness-todos.ts +206 -0
  191. package/ts_web/elements/00group-harness/dees-harness-todos/index.ts +1 -0
  192. package/ts_web/elements/00group-harness/dees-harness-tool-card/dees-harness-tool-card.demo.ts +166 -0
  193. package/ts_web/elements/00group-harness/dees-harness-tool-card/dees-harness-tool-card.ts +315 -0
  194. package/ts_web/elements/00group-harness/dees-harness-tool-card/index.ts +2 -0
  195. package/ts_web/elements/00group-harness/dees-harness-tool-card/renderers.ts +205 -0
  196. package/ts_web/elements/00group-harness/dees-harness-usage/dees-harness-usage.demo.ts +25 -0
  197. package/ts_web/elements/00group-harness/dees-harness-usage/dees-harness-usage.ts +96 -0
  198. package/ts_web/elements/00group-harness/dees-harness-usage/index.ts +1 -0
  199. package/ts_web/elements/00group-harness/harness.demodata.ts +113 -0
  200. package/ts_web/elements/00group-harness/harness.helpers.ts +227 -0
  201. package/ts_web/elements/00group-harness/harness.markdown.ts +151 -0
  202. package/ts_web/elements/00group-harness/harness.styles.ts +96 -0
  203. package/ts_web/elements/00group-harness/index.ts +22 -0
  204. package/ts_web/elements/00group-harness/interfaces.ts +203 -0
  205. package/ts_web/elements/00group-harness/toolregistry.ts +264 -0
  206. package/ts_web/elements/00group-input/dees-input-code/dees-input-code.ts +29 -17
  207. package/ts_web/elements/00group-input/dees-input-datepicker/datepicker-popup.ts +72 -45
  208. package/ts_web/elements/00group-input/dees-input-datepicker/styles.ts +14 -15
  209. package/ts_web/elements/00group-input/dees-input-list/dees-input-list.ts +1 -3
  210. package/ts_web/elements/00group-input/dees-input-tags/dees-input-tags.ts +35 -14
  211. package/ts_web/elements/00group-input/dees-input-toggle/dees-input-toggle.ts +4 -3
  212. package/ts_web/elements/00group-input/dees-input-wysiwyg/blocks/text/code.block.ts +9 -88
  213. package/ts_web/elements/00group-input/dees-input-wysiwyg/dees-input-wysiwyg.ts +11 -7
  214. package/ts_web/elements/00group-layout/dees-chips/dees-chips.ts +1 -1
  215. package/ts_web/elements/00group-layout/dees-pagination/dees-pagination.ts +26 -11
  216. package/ts_web/elements/00group-layout/dees-settings/dees-settings.ts +1 -1
  217. package/ts_web/elements/00group-layout/dees-stepper/dees-stepper.ts +13 -17
  218. package/ts_web/elements/00group-overlay/dees-contextmenu/dees-contextmenu.ts +5 -6
  219. package/ts_web/elements/00group-overlay/dees-modal/dees-modal.ts +5 -20
  220. package/ts_web/elements/00group-overlay/dees-windowlayer/dees-windowlayer.ts +10 -3
  221. package/ts_web/elements/00group-simple/dees-shopping-productcard/dees-shopping-productcard.ts +1 -1
  222. package/ts_web/elements/00group-simple/dees-simple-appdash/dees-simple-appdash.ts +8 -7
  223. package/ts_web/elements/00group-workspace/dees-workspace/dees-workspace.ts +1 -1
  224. package/ts_web/elements/00group-workspace/dees-workspace-filetree/dees-workspace-filetree.ts +2 -3
  225. package/ts_web/elements/00group-workspace/dees-workspace-markdownoutlet/dees-workspace-markdownoutlet.ts +7 -77
  226. package/ts_web/elements/00syntax.ts +124 -0
  227. package/ts_web/elements/00theme.ts +25 -13
  228. package/ts_web/elements/index.ts +1 -0
@@ -0,0 +1,315 @@
1
+ import { demoFunc } from './dees-harness-tool-card.demo.js';
2
+ import {
3
+ DeesElement,
4
+ html,
5
+ css,
6
+ customElement,
7
+ type TemplateResult,
8
+ property,
9
+ state,
10
+ cssManager,
11
+ } from '@design.estate/dees-element';
12
+ import { themeDefaultStyles } from '../../00theme.js';
13
+ import type { IHarnessToolCall, THarnessContentBlock } from '../interfaces.js';
14
+ import {
15
+ DeesHarnessToolRegistry,
16
+ parseMcpName,
17
+ type IHarnessToolDescriptor,
18
+ type IHarnessToolRenderHelpers,
19
+ } from '../toolregistry.js';
20
+ import { builtinBodyRenderers } from './renderers.js';
21
+ import { harnessCardStyles, harnessPillStyles, harnessMonoStyles } from '../harness.styles.js';
22
+ import { harnessFormatDuration, harnessTruncate } from '../harness.helpers.js';
23
+ import '../dees-harness-content-blocks/dees-harness-content-blocks.js';
24
+ import '../../00group-dataview/dees-dataview-codebox/dees-dataview-codebox.js';
25
+ import '../../00group-feedback/dees-badge/dees-badge.js';
26
+ import '../../00group-utility/dees-icon/dees-icon.js';
27
+
28
+ declare global {
29
+ interface HTMLElementTagNameMap {
30
+ 'dees-harness-tool-card': DeesHarnessToolCard;
31
+ }
32
+ }
33
+
34
+ /**
35
+ * Tool-call card: shared chrome (icon, label, subtitle, status pill,
36
+ * duration, MCP badges) with a per-kind body. Bodies come from the built-in
37
+ * renderer map or a descriptor's custom renderBody; kind resolution goes
38
+ * through the tool registry.
39
+ */
40
+ @customElement('dees-harness-tool-card')
41
+ export class DeesHarnessToolCard extends DeesElement {
42
+ public static demo = demoFunc;
43
+ public static demoGroups = ['Agent Chat'];
44
+
45
+ @property({ attribute: false })
46
+ accessor call: IHarnessToolCall = { id: '', name: '', status: 'pending' };
47
+
48
+ @property({ attribute: false })
49
+ accessor toolRegistry: DeesHarnessToolRegistry = DeesHarnessToolRegistry.default;
50
+
51
+ @state()
52
+ accessor expanded: boolean | undefined = undefined;
53
+
54
+ @state()
55
+ accessor outputExpanded: boolean = false;
56
+
57
+ public static styles = [
58
+ themeDefaultStyles,
59
+ cssManager.defaultStyles,
60
+ harnessCardStyles,
61
+ harnessPillStyles,
62
+ harnessMonoStyles,
63
+ css`
64
+ :host {
65
+ display: block;
66
+ font-family: var(--dees-font-family);
67
+ }
68
+
69
+ .header {
70
+ display: flex;
71
+ align-items: center;
72
+ gap: var(--dees-spacing-sm);
73
+ width: 100%;
74
+ padding: var(--dees-spacing-xs) var(--dees-spacing-md);
75
+ border: 0;
76
+ background: transparent;
77
+ color: inherit;
78
+ cursor: pointer;
79
+ font-family: inherit;
80
+ text-align: left;
81
+ }
82
+
83
+ .header:hover {
84
+ background: var(--dees-color-hover);
85
+ }
86
+
87
+ .toolIcon {
88
+ display: grid;
89
+ place-items: center;
90
+ width: 22px;
91
+ flex: 0 0 22px;
92
+ color: var(--dees-color-text-secondary);
93
+ }
94
+
95
+ .harness-card.status-running .toolIcon,
96
+ .harness-card.status-pending .toolIcon {
97
+ color: var(--dees-color-accent-primary);
98
+ }
99
+
100
+ .titleBlock {
101
+ min-width: 0;
102
+ flex: 1;
103
+ }
104
+
105
+ .titleRow {
106
+ display: flex;
107
+ align-items: center;
108
+ gap: var(--dees-spacing-sm);
109
+ }
110
+
111
+ .toolLabel {
112
+ color: var(--dees-color-text-primary);
113
+ font-size: var(--dees-font-control-size-sm, 12px);
114
+ font-weight: 600;
115
+ white-space: nowrap;
116
+ }
117
+
118
+ .badges {
119
+ display: flex;
120
+ gap: 4px;
121
+ flex-wrap: wrap;
122
+ }
123
+
124
+ .subtitle {
125
+ margin-top: 1px;
126
+ color: var(--dees-color-text-secondary);
127
+ font-size: var(--dees-font-caption1-size, 11px);
128
+ overflow: hidden;
129
+ text-overflow: ellipsis;
130
+ white-space: nowrap;
131
+ }
132
+
133
+ .metaColumn {
134
+ display: flex;
135
+ align-items: center;
136
+ gap: var(--dees-spacing-sm);
137
+ flex: 0 0 auto;
138
+ }
139
+
140
+ .duration {
141
+ color: var(--dees-color-text-muted);
142
+ font-size: var(--dees-font-caption1-size, 11px);
143
+ white-space: nowrap;
144
+ }
145
+
146
+ .body {
147
+ display: grid;
148
+ gap: var(--dees-spacing-sm);
149
+ padding: 0 var(--dees-spacing-md) var(--dees-spacing-md);
150
+ }
151
+
152
+ .kvGrid {
153
+ display: grid;
154
+ grid-template-columns: auto minmax(0, 1fr);
155
+ gap: 2px var(--dees-spacing-md);
156
+ font-size: var(--dees-font-control-size-sm, 12px);
157
+ }
158
+
159
+ .kvKey {
160
+ color: var(--dees-color-text-secondary);
161
+ white-space: nowrap;
162
+ }
163
+
164
+ .kvValue {
165
+ color: var(--dees-color-text-primary);
166
+ font-family: var(--dees-font-family-mono);
167
+ overflow-wrap: anywhere;
168
+ }
169
+
170
+ .bodyImage {
171
+ max-width: 100%;
172
+ max-height: 420px;
173
+ border-radius: var(--dees-radius-md);
174
+ border: 1px solid var(--dees-color-border-subtle);
175
+ }
176
+
177
+ dees-dataview-codebox {
178
+ font-family: var(--dees-font-family);
179
+ }
180
+ `,
181
+ ];
182
+
183
+ private get descriptor(): IHarnessToolDescriptor {
184
+ return this.toolRegistry.resolve(this.enrichedCall);
185
+ }
186
+
187
+ /** call with mcp meta derived from the name when the adapter didn't set it */
188
+ private get enrichedCall(): IHarnessToolCall {
189
+ if (this.call.mcp) return this.call;
190
+ const parsed = parseMcpName(this.call.name);
191
+ return parsed ? { ...this.call, mcp: { serverName: parsed.serverName, toolName: parsed.toolName } } : this.call;
192
+ }
193
+
194
+ public get isOpen(): boolean {
195
+ if (this.expanded !== undefined) return this.expanded;
196
+ const descriptor = this.descriptor;
197
+ if (this.call.status === 'error' || this.call.isError) return true;
198
+ if (typeof descriptor.defaultExpanded === 'function') return descriptor.defaultExpanded(this.enrichedCall);
199
+ return descriptor.defaultExpanded ?? false;
200
+ }
201
+
202
+ public render(): TemplateResult {
203
+ const call = this.enrichedCall;
204
+ const descriptor = this.descriptor;
205
+ const label = typeof descriptor.label === 'function' ? descriptor.label(call) : descriptor.label;
206
+ const subtitle = descriptor.subtitle?.(call) ?? '';
207
+ const statusTone = call.isError ? 'error' : call.status === 'completed' ? 'success' : call.status;
208
+ const duration = harnessFormatDuration(call.startedAt, call.finishedAt);
209
+ return html`
210
+ <div class="harness-card status-${call.isError ? 'error' : call.status} ${descriptor.destructive ? 'destructive' : ''}">
211
+ <button
212
+ class="header"
213
+ type="button"
214
+ aria-expanded=${this.isOpen ? 'true' : 'false'}
215
+ @click=${() => {
216
+ this.expanded = !this.isOpen;
217
+ }}
218
+ >
219
+ <span class="toolIcon"><dees-icon .icon=${descriptor.icon} iconSize="15"></dees-icon></span>
220
+ <span class="titleBlock">
221
+ <span class="titleRow">
222
+ <span class="toolLabel">${label}</span>
223
+ ${this.renderMcpBadges(call)}
224
+ </span>
225
+ ${subtitle ? html`<span class="subtitle" title=${subtitle}>${subtitle}</span>` : ''}
226
+ </span>
227
+ <span class="metaColumn">
228
+ ${duration ? html`<span class="duration">${duration}</span>` : ''}
229
+ <span class="harness-pill tone-${statusTone}">
230
+ ${call.isError ? 'error' : call.status}
231
+ </span>
232
+ </span>
233
+ </button>
234
+ ${this.isOpen ? html`<div class="body">${this.renderBody(call)}</div>` : ''}
235
+ </div>
236
+ `;
237
+ }
238
+
239
+ private renderMcpBadges(call: IHarnessToolCall): TemplateResult {
240
+ if (!call.mcp) return html``;
241
+ const annotations = call.mcp.annotations;
242
+ return html`
243
+ <span class="badges">
244
+ <dees-badge type="default" .text=${call.mcp.serverName} rounded></dees-badge>
245
+ ${annotations?.readOnlyHint ? html`<dees-badge type="success" text="read-only" rounded></dees-badge>` : ''}
246
+ ${annotations?.destructiveHint ? html`<dees-badge type="error" text="destructive" rounded></dees-badge>` : ''}
247
+ ${annotations?.openWorldHint ? html`<dees-badge type="warning" text="open-world" rounded></dees-badge>` : ''}
248
+ ${annotations?.idempotentHint ? html`<dees-badge type="default" text="idempotent" rounded></dees-badge>` : ''}
249
+ </span>
250
+ `;
251
+ }
252
+
253
+ private renderBody(call: IHarnessToolCall): TemplateResult {
254
+ const descriptor = this.descriptor;
255
+ const helpers = this.createHelpers();
256
+ if (descriptor.renderBody) return descriptor.renderBody(call, helpers);
257
+ const builtin = builtinBodyRenderers[descriptor.kind] ?? builtinBodyRenderers.unknown;
258
+ return builtin(call, helpers);
259
+ }
260
+
261
+ private createHelpers(): IHarnessToolRenderHelpers {
262
+ return {
263
+ codeBlock: (code, language, filename) => html`
264
+ <dees-dataview-codebox
265
+ .progLang=${language ?? 'plaintext'}
266
+ .filename=${filename ?? ''}
267
+ .codeToDisplay=${code}
268
+ ></dees-dataview-codebox>
269
+ `,
270
+ diffBlock: (before, after, options) => html`
271
+ <dees-dataview-codebox
272
+ .progLang=${options?.language ?? 'plaintext'}
273
+ .filename=${options?.filename ?? ''}
274
+ .diffView=${options?.view ?? 'inline'}
275
+ .codeBefore=${before}
276
+ .codeToDisplay=${after}
277
+ ></dees-dataview-codebox>
278
+ `,
279
+ monoBlock: (text, options) => {
280
+ const maxChars = options?.maxChars ?? 6000;
281
+ const { text: shown, truncated } = harnessTruncate(text, this.outputExpanded ? Number.MAX_SAFE_INTEGER : maxChars);
282
+ return html`
283
+ <pre class="harness-mono ${options?.tone === 'error' ? 'tone-error' : ''}">${shown}${truncated ? '…' : ''}</pre>
284
+ ${truncated
285
+ ? html`
286
+ <button
287
+ class="harness-mono-expand"
288
+ type="button"
289
+ @click=${() => {
290
+ this.outputExpanded = true;
291
+ }}
292
+ >
293
+ Show all
294
+ </button>
295
+ `
296
+ : ''}
297
+ `;
298
+ },
299
+ keyValues: (pairs) => html`
300
+ <div class="kvGrid">
301
+ ${pairs.map(([key, value]) => html`
302
+ <div class="kvKey">${key}</div>
303
+ <div class="kvValue">${value}</div>
304
+ `)}
305
+ </div>
306
+ `,
307
+ contentBlocks: (blocks: THarnessContentBlock[]) => html`
308
+ <dees-harness-content-blocks .blocks=${blocks}></dees-harness-content-blocks>
309
+ `,
310
+ image: (dataBase64, mimeType, alt) => html`
311
+ <img class="bodyImage" src=${`data:${mimeType};base64,${dataBase64}`} alt=${alt ?? 'tool output image'} />
312
+ `,
313
+ };
314
+ }
315
+ }
@@ -0,0 +1,2 @@
1
+ export * from './dees-harness-tool-card.js';
2
+ export * from './renderers.js';
@@ -0,0 +1,205 @@
1
+ import { html, type TemplateResult } from '@design.estate/dees-element';
2
+ import type { IHarnessToolCall } from '../interfaces.js';
3
+ import type { IHarnessToolRenderHelpers } from '../toolregistry.js';
4
+ import {
5
+ harnessIsRecord,
6
+ harnessLanguageForPath,
7
+ harnessParseTodos,
8
+ harnessStringifyValue,
9
+ harnessSummarizeValue,
10
+ } from '../harness.helpers.js';
11
+ import '../dees-harness-todos/dees-harness-todos.js';
12
+
13
+ /**
14
+ * Built-in tool-card bodies, one per registry kind. Kept as render functions
15
+ * (not elements): they share the card chrome and differ only in body markup.
16
+ * Custom tools override via IHarnessToolDescriptor.renderBody.
17
+ */
18
+
19
+ const inputRecord = (call: IHarnessToolCall): Record<string, unknown> =>
20
+ harnessIsRecord(call.input) ? call.input : {};
21
+
22
+ const outputText = (call: IHarnessToolCall): string => {
23
+ if (call.errorText) return call.errorText;
24
+ return harnessStringifyValue(call.output);
25
+ };
26
+
27
+ const filePathOf = (call: IHarnessToolCall): string => {
28
+ const input = inputRecord(call);
29
+ return String(input.path ?? input.filePath ?? input.file ?? '');
30
+ };
31
+
32
+ const renderTerminal = (call: IHarnessToolCall, helpers: IHarnessToolRenderHelpers): TemplateResult => {
33
+ const input = inputRecord(call);
34
+ const command = String(input.command ?? '');
35
+ const output = call.output;
36
+ let stdout = '';
37
+ let stderr = '';
38
+ let exitCode: number | undefined;
39
+ if (harnessIsRecord(output)) {
40
+ stdout = typeof output.stdout === 'string' ? output.stdout : harnessStringifyValue(output.stdout ?? '');
41
+ stderr = typeof output.stderr === 'string' ? output.stderr : '';
42
+ exitCode = typeof output.exitCode === 'number' ? output.exitCode : undefined;
43
+ } else {
44
+ stdout = harnessStringifyValue(output);
45
+ }
46
+ return html`
47
+ ${command ? helpers.monoBlock(`$ ${command}`) : ''}
48
+ ${stdout ? helpers.monoBlock(stdout) : ''}
49
+ ${stderr ? helpers.monoBlock(stderr, { tone: 'error' }) : ''}
50
+ ${call.errorText ? helpers.monoBlock(call.errorText, { tone: 'error' }) : ''}
51
+ ${exitCode !== undefined
52
+ ? helpers.keyValues([['exit code', String(exitCode)]])
53
+ : ''}
54
+ `;
55
+ };
56
+
57
+ const renderFileRead = (call: IHarnessToolCall, helpers: IHarnessToolRenderHelpers): TemplateResult => {
58
+ const path = filePathOf(call);
59
+ const content = outputText(call);
60
+ if (!content) return helpers.keyValues([['file', path || '—']]);
61
+ return helpers.codeBlock(content, harnessLanguageForPath(path), path.split('/').pop() || undefined);
62
+ };
63
+
64
+ const renderFileWrite = (call: IHarnessToolCall, helpers: IHarnessToolRenderHelpers): TemplateResult => {
65
+ const input = inputRecord(call);
66
+ const path = filePathOf(call);
67
+ const newContent = String(input.content ?? input.newContent ?? '');
68
+ const previousContent = String(input.oldContent ?? input.originalContent ?? input.before ?? '');
69
+ const filename = path.split('/').pop() || undefined;
70
+ const language = harnessLanguageForPath(path);
71
+ if (previousContent) {
72
+ return helpers.diffBlock(previousContent, newContent, { language, filename });
73
+ }
74
+ if (newContent) {
75
+ return helpers.codeBlock(newContent, language, filename);
76
+ }
77
+ return html`
78
+ ${helpers.keyValues([['file', path || '—']])}
79
+ ${outputText(call) ? helpers.monoBlock(outputText(call)) : ''}
80
+ `;
81
+ };
82
+
83
+ const renderFileDelete = (call: IHarnessToolCall, helpers: IHarnessToolRenderHelpers): TemplateResult => {
84
+ return html`
85
+ ${helpers.keyValues([['file', filePathOf(call) || '—']])}
86
+ ${outputText(call) ? helpers.monoBlock(outputText(call), call.status === 'error' ? { tone: 'error' } : undefined) : ''}
87
+ `;
88
+ };
89
+
90
+ const renderDirList = (call: IHarnessToolCall, helpers: IHarnessToolRenderHelpers): TemplateResult => {
91
+ const output = call.output;
92
+ const entries = Array.isArray(output)
93
+ ? output.map((entry) => String(entry))
94
+ : outputText(call).split('\n').filter(Boolean);
95
+ return helpers.monoBlock(entries.join('\n'));
96
+ };
97
+
98
+ const renderBrowser = (call: IHarnessToolCall, helpers: IHarnessToolRenderHelpers): TemplateResult => {
99
+ const input = inputRecord(call);
100
+ const action = String(input.action ?? 'snapshot');
101
+ const pairs: Array<[string, string]> = [['action', action]];
102
+ if (input.url) pairs.push(['url', String(input.url)]);
103
+ if (input.selector) pairs.push(['selector', String(input.selector)]);
104
+ const output = call.output;
105
+ let screenshotBase64 = '';
106
+ if (harnessIsRecord(output)) {
107
+ screenshotBase64 = String(output.screenshotBase64 ?? output.screenshot ?? output.dataBase64 ?? '');
108
+ }
109
+ const script = String(input.script ?? '');
110
+ return html`
111
+ ${helpers.keyValues(pairs)}
112
+ ${script ? helpers.codeBlock(script, 'javascript') : ''}
113
+ ${screenshotBase64 ? helpers.image(screenshotBase64, 'image/png', 'browser screenshot') : ''}
114
+ ${!screenshotBase64 && outputText(call) ? helpers.monoBlock(outputText(call)) : ''}
115
+ `;
116
+ };
117
+
118
+ const renderHttp = (call: IHarnessToolCall, helpers: IHarnessToolRenderHelpers): TemplateResult => {
119
+ const input = inputRecord(call);
120
+ const pairs: Array<[string, string]> = [];
121
+ if (input.url) pairs.push(['url', String(input.url)]);
122
+ const body = input.body !== undefined ? harnessStringifyValue(input.body) : '';
123
+ const response = outputText(call);
124
+ return html`
125
+ ${pairs.length ? helpers.keyValues(pairs) : ''}
126
+ ${body ? helpers.codeBlock(body, 'json') : ''}
127
+ ${response ? helpers.codeBlock(response, 'json') : ''}
128
+ `;
129
+ };
130
+
131
+ const renderJson = (call: IHarnessToolCall, helpers: IHarnessToolRenderHelpers): TemplateResult => {
132
+ const input = inputRecord(call);
133
+ const source = String(input.jsonString ?? '');
134
+ return html`
135
+ ${source ? helpers.codeBlock(source, 'json') : ''}
136
+ ${outputText(call) ? helpers.monoBlock(outputText(call), call.isError || call.status === 'error' ? { tone: 'error' } : undefined) : ''}
137
+ `;
138
+ };
139
+
140
+ const renderSearch = (call: IHarnessToolCall, helpers: IHarnessToolRenderHelpers): TemplateResult => {
141
+ const summary = harnessSummarizeValue(call.input);
142
+ return html`
143
+ ${summary ? helpers.monoBlock(summary) : ''}
144
+ ${outputText(call) ? helpers.monoBlock(outputText(call)) : ''}
145
+ `;
146
+ };
147
+
148
+ const renderSubtask = (call: IHarnessToolCall, helpers: IHarnessToolRenderHelpers): TemplateResult => {
149
+ const input = inputRecord(call);
150
+ const prompt = String(input.prompt ?? input.description ?? '');
151
+ return html`
152
+ ${prompt ? helpers.monoBlock(prompt) : ''}
153
+ ${outputText(call) ? helpers.monoBlock(outputText(call)) : ''}
154
+ `;
155
+ };
156
+
157
+ const renderTodo = (call: IHarnessToolCall, helpers: IHarnessToolRenderHelpers): TemplateResult => {
158
+ const todos = harnessParseTodos(call.input);
159
+ if (!todos.length) return helpers.monoBlock(harnessSummarizeValue(call.input) || outputText(call));
160
+ return html`<dees-harness-todos compact .todos=${todos}></dees-harness-todos>`;
161
+ };
162
+
163
+ const renderMcp = (call: IHarnessToolCall, helpers: IHarnessToolRenderHelpers): TemplateResult => {
164
+ return html`
165
+ ${call.contentBlocks?.length ? helpers.contentBlocks(call.contentBlocks) : ''}
166
+ ${call.structuredContent !== undefined
167
+ ? helpers.codeBlock(harnessStringifyValue(call.structuredContent), 'json')
168
+ : ''}
169
+ ${!call.contentBlocks?.length && call.structuredContent === undefined && outputText(call)
170
+ ? helpers.monoBlock(outputText(call), call.isError ? { tone: 'error' } : undefined)
171
+ : ''}
172
+ ${call.input !== undefined && harnessSummarizeValue(call.input)
173
+ ? helpers.monoBlock(harnessSummarizeValue(call.input))
174
+ : ''}
175
+ `;
176
+ };
177
+
178
+ const renderUnknown = (call: IHarnessToolCall, helpers: IHarnessToolRenderHelpers): TemplateResult => {
179
+ const inputSummary = harnessSummarizeValue(call.input);
180
+ const inputJson = !inputSummary && call.input !== undefined ? harnessStringifyValue(call.input) : '';
181
+ return html`
182
+ ${inputSummary ? helpers.monoBlock(inputSummary) : ''}
183
+ ${inputJson ? helpers.codeBlock(inputJson, 'json') : ''}
184
+ ${outputText(call) ? helpers.monoBlock(outputText(call), call.status === 'error' ? { tone: 'error' } : undefined) : ''}
185
+ `;
186
+ };
187
+
188
+ export const builtinBodyRenderers: Record<
189
+ string,
190
+ (call: IHarnessToolCall, helpers: IHarnessToolRenderHelpers) => TemplateResult
191
+ > = {
192
+ 'terminal': renderTerminal,
193
+ 'file-read': renderFileRead,
194
+ 'file-write': renderFileWrite,
195
+ 'file-delete': renderFileDelete,
196
+ 'dir-list': renderDirList,
197
+ 'browser': renderBrowser,
198
+ 'http': renderHttp,
199
+ 'json': renderJson,
200
+ 'search': renderSearch,
201
+ 'subtask': renderSubtask,
202
+ 'todo': renderTodo,
203
+ 'mcp': renderMcp,
204
+ 'unknown': renderUnknown,
205
+ };
@@ -0,0 +1,25 @@
1
+ import { html } from '@design.estate/dees-element';
2
+
3
+ export const demoFunc = () => html`
4
+ <style>
5
+ .usageDemo {
6
+ display: flex;
7
+ gap: 16px;
8
+ align-items: center;
9
+ max-width: 520px;
10
+ margin: 40px auto;
11
+ padding: 24px;
12
+ border-radius: var(--dees-radius-xl);
13
+ background: var(--dees-color-bg-secondary);
14
+ }
15
+ </style>
16
+ <div class="usageDemo">
17
+ <dees-harness-usage
18
+ .usage=${{ inputTokens: 1840, outputTokens: 310, totalTokens: 2150, cacheReadTokens: 1200 }}
19
+ ></dees-harness-usage>
20
+ <dees-harness-usage
21
+ compact
22
+ .usage=${{ inputTokens: 152_000, outputTokens: 9_400, totalTokens: 161_400 }}
23
+ ></dees-harness-usage>
24
+ </div>
25
+ `;
@@ -0,0 +1,96 @@
1
+ import { demoFunc } from './dees-harness-usage.demo.js';
2
+ import {
3
+ DeesElement,
4
+ html,
5
+ css,
6
+ customElement,
7
+ type TemplateResult,
8
+ property,
9
+ cssManager,
10
+ } from '@design.estate/dees-element';
11
+ import { themeDefaultStyles } from '../../00theme.js';
12
+ import type { IHarnessUsage } from '../interfaces.js';
13
+
14
+ declare global {
15
+ interface HTMLElementTagNameMap {
16
+ 'dees-harness-usage': DeesHarnessUsage;
17
+ }
18
+ }
19
+
20
+ const formatTokenCount = (count?: number): string => {
21
+ if (!count) return '0';
22
+ if (count < 1000) return String(count);
23
+ if (count < 1_000_000) return `${(count / 1000).toFixed(count < 10_000 ? 1 : 0)}k`;
24
+ return `${(count / 1_000_000).toFixed(1)}M`;
25
+ };
26
+
27
+ /**
28
+ * Token-usage chip. Compact mode shows only the total; the full mode shows
29
+ * in/out/total. Cache read/write detail lives in the tooltip.
30
+ */
31
+ @customElement('dees-harness-usage')
32
+ export class DeesHarnessUsage extends DeesElement {
33
+ public static demo = demoFunc;
34
+ public static demoGroups = ['Agent Chat'];
35
+
36
+ @property({ attribute: false })
37
+ accessor usage: IHarnessUsage = {};
38
+
39
+ @property({ type: Boolean })
40
+ accessor compact: boolean = false;
41
+
42
+ public static styles = [
43
+ themeDefaultStyles,
44
+ cssManager.defaultStyles,
45
+ css`
46
+ :host {
47
+ display: inline-block;
48
+ font-family: var(--dees-font-family);
49
+ }
50
+
51
+ .chip {
52
+ display: inline-flex;
53
+ align-items: center;
54
+ gap: var(--dees-spacing-xs);
55
+ padding: 2px 10px;
56
+ border-radius: var(--dees-radius-full);
57
+ background: var(--dees-color-fill-secondary);
58
+ color: var(--dees-color-text-secondary);
59
+ font-size: var(--dees-font-caption1-size, 11px);
60
+ white-space: nowrap;
61
+ cursor: default;
62
+ }
63
+
64
+ .total {
65
+ color: var(--dees-color-text-primary);
66
+ font-weight: 600;
67
+ }
68
+ `,
69
+ ];
70
+
71
+ public render(): TemplateResult {
72
+ const usage = this.usage;
73
+ if (!usage.totalTokens && !usage.inputTokens && !usage.outputTokens) return html``;
74
+ const total = usage.totalTokens ?? (usage.inputTokens ?? 0) + (usage.outputTokens ?? 0);
75
+ const tooltip = [
76
+ `input: ${usage.inputTokens ?? 0}`,
77
+ `output: ${usage.outputTokens ?? 0}`,
78
+ `total: ${total}`,
79
+ usage.cacheReadTokens ? `cache read: ${usage.cacheReadTokens}` : '',
80
+ usage.cacheWriteTokens ? `cache write: ${usage.cacheWriteTokens}` : '',
81
+ ].filter(Boolean).join('\n');
82
+ return html`
83
+ <span class="chip" title=${tooltip}>
84
+ ${this.compact
85
+ ? html`<span class="total">${formatTokenCount(total)}</span> tokens`
86
+ : html`
87
+ <span>${formatTokenCount(usage.inputTokens)} in</span>
88
+ <span>·</span>
89
+ <span>${formatTokenCount(usage.outputTokens)} out</span>
90
+ <span>·</span>
91
+ <span class="total">${formatTokenCount(total)}</span>
92
+ `}
93
+ </span>
94
+ `;
95
+ }
96
+ }
@@ -0,0 +1 @@
1
+ export * from './dees-harness-usage.js';