@design.estate/dees-catalog 3.90.1 → 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.
- package/dist_bundle/bundle.js +10399 -4790
- package/dist_ts_web/00_commitinfo_data.js +1 -1
- package/dist_ts_web/elements/00group-appui/dees-appui/dees-appui.js +5 -4
- package/dist_ts_web/elements/00group-appui/dees-appui-profiledropdown/dees-appui-profiledropdown.js +6 -7
- package/dist_ts_web/elements/00group-appui/dees-appui-tabs/dees-appui-tabs.js +4 -6
- package/dist_ts_web/elements/00group-button/dees-button/dees-button.d.ts +7 -1
- package/dist_ts_web/elements/00group-button/dees-button/dees-button.demo.js +16 -2
- package/dist_ts_web/elements/00group-button/dees-button/dees-button.js +65 -25
- package/dist_ts_web/elements/00group-chart/dees-chart-log/dees-chart-log.js +1 -1
- package/dist_ts_web/elements/00group-dataview/dees-dataview-codebox/codebox.diff.d.ts +69 -0
- package/dist_ts_web/elements/00group-dataview/dees-dataview-codebox/codebox.diff.js +342 -0
- package/dist_ts_web/elements/00group-dataview/dees-dataview-codebox/dees-dataview-codebox.d.ts +48 -3
- package/dist_ts_web/elements/00group-dataview/dees-dataview-codebox/dees-dataview-codebox.demo.js +128 -39
- package/dist_ts_web/elements/00group-dataview/dees-dataview-codebox/dees-dataview-codebox.js +663 -190
- package/dist_ts_web/elements/00group-dataview/dees-dataview-codebox/index.d.ts +1 -0
- package/dist_ts_web/elements/00group-dataview/dees-dataview-codebox/index.js +2 -1
- package/dist_ts_web/elements/00group-dataview/dees-dataview-statusobject/dees-dataview-statusobject.d.ts +3 -0
- package/dist_ts_web/elements/00group-dataview/dees-dataview-statusobject/dees-dataview-statusobject.js +48 -30
- package/dist_ts_web/elements/00group-dataview/dees-grouped-list/dees-grouped-list.js +1 -1
- package/dist_ts_web/elements/00group-dataview/dees-statsgrid/dees-statsgrid.js +1 -2
- package/dist_ts_web/elements/00group-dataview/dees-storage-browser/dees-storage-keys.js +1 -1
- package/dist_ts_web/elements/00group-dataview/dees-table/styles.js +1 -1
- package/dist_ts_web/elements/00group-feedback/dees-progressbar/dees-progressbar.js +9 -9
- package/dist_ts_web/elements/00group-form/dees-form-submit/dees-form-submit.d.ts +1 -1
- package/dist_ts_web/elements/00group-form/dees-form-submit/dees-form-submit.js +1 -1
- package/dist_ts_web/elements/00group-harness/dees-harness-chat/dees-harness-chat.d.ts +55 -0
- package/dist_ts_web/elements/00group-harness/dees-harness-chat/dees-harness-chat.demo.d.ts +1 -0
- package/dist_ts_web/elements/00group-harness/dees-harness-chat/dees-harness-chat.demo.js +183 -0
- package/dist_ts_web/elements/00group-harness/dees-harness-chat/dees-harness-chat.js +412 -0
- package/dist_ts_web/elements/00group-harness/dees-harness-chat/index.d.ts +1 -0
- package/dist_ts_web/elements/00group-harness/dees-harness-chat/index.js +2 -0
- package/dist_ts_web/elements/00group-harness/dees-harness-composer/dees-harness-composer.d.ts +65 -0
- package/dist_ts_web/elements/00group-harness/dees-harness-composer/dees-harness-composer.demo.d.ts +1 -0
- package/dist_ts_web/elements/00group-harness/dees-harness-composer/dees-harness-composer.demo.js +55 -0
- package/dist_ts_web/elements/00group-harness/dees-harness-composer/dees-harness-composer.js +589 -0
- package/dist_ts_web/elements/00group-harness/dees-harness-composer/index.d.ts +1 -0
- package/dist_ts_web/elements/00group-harness/dees-harness-composer/index.js +2 -0
- package/dist_ts_web/elements/00group-harness/dees-harness-content-blocks/dees-harness-content-blocks.d.ts +21 -0
- package/dist_ts_web/elements/00group-harness/dees-harness-content-blocks/dees-harness-content-blocks.demo.d.ts +1 -0
- package/dist_ts_web/elements/00group-harness/dees-harness-content-blocks/dees-harness-content-blocks.demo.js +41 -0
- package/dist_ts_web/elements/00group-harness/dees-harness-content-blocks/dees-harness-content-blocks.js +215 -0
- package/dist_ts_web/elements/00group-harness/dees-harness-content-blocks/index.d.ts +1 -0
- package/dist_ts_web/elements/00group-harness/dees-harness-content-blocks/index.js +2 -0
- package/dist_ts_web/elements/00group-harness/dees-harness-message/dees-harness-message.d.ts +58 -0
- package/dist_ts_web/elements/00group-harness/dees-harness-message/dees-harness-message.demo.d.ts +1 -0
- package/dist_ts_web/elements/00group-harness/dees-harness-message/dees-harness-message.demo.js +126 -0
- package/dist_ts_web/elements/00group-harness/dees-harness-message/dees-harness-message.js +551 -0
- package/dist_ts_web/elements/00group-harness/dees-harness-message/index.d.ts +1 -0
- package/dist_ts_web/elements/00group-harness/dees-harness-message/index.js +2 -0
- package/dist_ts_web/elements/00group-harness/dees-harness-message-list/dees-harness-message-list.d.ts +50 -0
- package/dist_ts_web/elements/00group-harness/dees-harness-message-list/dees-harness-message-list.demo.d.ts +1 -0
- package/dist_ts_web/elements/00group-harness/dees-harness-message-list/dees-harness-message-list.demo.js +101 -0
- package/dist_ts_web/elements/00group-harness/dees-harness-message-list/dees-harness-message-list.js +424 -0
- package/dist_ts_web/elements/00group-harness/dees-harness-message-list/index.d.ts +1 -0
- package/dist_ts_web/elements/00group-harness/dees-harness-message-list/index.js +2 -0
- package/dist_ts_web/elements/00group-harness/dees-harness-permission-card/dees-harness-permission-card.d.ts +27 -0
- package/dist_ts_web/elements/00group-harness/dees-harness-permission-card/dees-harness-permission-card.demo.d.ts +1 -0
- package/dist_ts_web/elements/00group-harness/dees-harness-permission-card/dees-harness-permission-card.demo.js +46 -0
- package/dist_ts_web/elements/00group-harness/dees-harness-permission-card/dees-harness-permission-card.js +282 -0
- package/dist_ts_web/elements/00group-harness/dees-harness-permission-card/index.d.ts +1 -0
- package/dist_ts_web/elements/00group-harness/dees-harness-permission-card/index.js +2 -0
- package/dist_ts_web/elements/00group-harness/dees-harness-reasoning/dees-harness-reasoning.d.ts +24 -0
- package/dist_ts_web/elements/00group-harness/dees-harness-reasoning/dees-harness-reasoning.demo.d.ts +1 -0
- package/dist_ts_web/elements/00group-harness/dees-harness-reasoning/dees-harness-reasoning.demo.js +32 -0
- package/dist_ts_web/elements/00group-harness/dees-harness-reasoning/dees-harness-reasoning.js +241 -0
- package/dist_ts_web/elements/00group-harness/dees-harness-reasoning/index.d.ts +1 -0
- package/dist_ts_web/elements/00group-harness/dees-harness-reasoning/index.js +2 -0
- package/dist_ts_web/elements/00group-harness/dees-harness-session-list/dees-harness-session-list.d.ts +28 -0
- package/dist_ts_web/elements/00group-harness/dees-harness-session-list/dees-harness-session-list.demo.d.ts +1 -0
- package/dist_ts_web/elements/00group-harness/dees-harness-session-list/dees-harness-session-list.demo.js +56 -0
- package/dist_ts_web/elements/00group-harness/dees-harness-session-list/dees-harness-session-list.js +279 -0
- package/dist_ts_web/elements/00group-harness/dees-harness-session-list/index.d.ts +1 -0
- package/dist_ts_web/elements/00group-harness/dees-harness-session-list/index.js +2 -0
- package/dist_ts_web/elements/00group-harness/dees-harness-status/dees-harness-status.d.ts +30 -0
- package/dist_ts_web/elements/00group-harness/dees-harness-status/dees-harness-status.demo.d.ts +1 -0
- package/dist_ts_web/elements/00group-harness/dees-harness-status/dees-harness-status.demo.js +35 -0
- package/dist_ts_web/elements/00group-harness/dees-harness-status/dees-harness-status.js +235 -0
- package/dist_ts_web/elements/00group-harness/dees-harness-status/index.d.ts +1 -0
- package/dist_ts_web/elements/00group-harness/dees-harness-status/index.js +2 -0
- package/dist_ts_web/elements/00group-harness/dees-harness-todos/dees-harness-todos.d.ts +27 -0
- package/dist_ts_web/elements/00group-harness/dees-harness-todos/dees-harness-todos.demo.d.ts +1 -0
- package/dist_ts_web/elements/00group-harness/dees-harness-todos/dees-harness-todos.demo.js +41 -0
- package/dist_ts_web/elements/00group-harness/dees-harness-todos/dees-harness-todos.js +258 -0
- package/dist_ts_web/elements/00group-harness/dees-harness-todos/index.d.ts +1 -0
- package/dist_ts_web/elements/00group-harness/dees-harness-todos/index.js +2 -0
- package/dist_ts_web/elements/00group-harness/dees-harness-tool-card/dees-harness-tool-card.d.ts +35 -0
- package/dist_ts_web/elements/00group-harness/dees-harness-tool-card/dees-harness-tool-card.demo.d.ts +1 -0
- package/dist_ts_web/elements/00group-harness/dees-harness-tool-card/dees-harness-tool-card.demo.js +162 -0
- package/dist_ts_web/elements/00group-harness/dees-harness-tool-card/dees-harness-tool-card.js +368 -0
- package/dist_ts_web/elements/00group-harness/dees-harness-tool-card/index.d.ts +2 -0
- package/dist_ts_web/elements/00group-harness/dees-harness-tool-card/index.js +3 -0
- package/dist_ts_web/elements/00group-harness/dees-harness-tool-card/renderers.d.ts +5 -0
- package/dist_ts_web/elements/00group-harness/dees-harness-tool-card/renderers.js +183 -0
- package/dist_ts_web/elements/00group-harness/dees-harness-usage/dees-harness-usage.d.ts +19 -0
- package/dist_ts_web/elements/00group-harness/dees-harness-usage/dees-harness-usage.demo.d.ts +1 -0
- package/dist_ts_web/elements/00group-harness/dees-harness-usage/dees-harness-usage.demo.js +25 -0
- package/dist_ts_web/elements/00group-harness/dees-harness-usage/dees-harness-usage.js +148 -0
- package/dist_ts_web/elements/00group-harness/dees-harness-usage/index.d.ts +1 -0
- package/dist_ts_web/elements/00group-harness/dees-harness-usage/index.js +2 -0
- package/dist_ts_web/elements/00group-harness/harness.demodata.d.ts +22 -0
- package/dist_ts_web/elements/00group-harness/harness.demodata.js +94 -0
- package/dist_ts_web/elements/00group-harness/harness.helpers.d.ts +37 -0
- package/dist_ts_web/elements/00group-harness/harness.helpers.js +221 -0
- package/dist_ts_web/elements/00group-harness/harness.markdown.d.ts +25 -0
- package/dist_ts_web/elements/00group-harness/harness.markdown.js +147 -0
- package/dist_ts_web/elements/00group-harness/harness.styles.d.ts +9 -0
- package/dist_ts_web/elements/00group-harness/harness.styles.js +94 -0
- package/dist_ts_web/elements/00group-harness/index.d.ts +18 -0
- package/dist_ts_web/elements/00group-harness/index.js +22 -0
- package/dist_ts_web/elements/00group-harness/interfaces.d.ts +210 -0
- package/dist_ts_web/elements/00group-harness/interfaces.js +11 -0
- package/dist_ts_web/elements/00group-harness/toolregistry.d.ts +76 -0
- package/dist_ts_web/elements/00group-harness/toolregistry.js +210 -0
- package/dist_ts_web/elements/00group-input/dees-input-code/dees-input-code.js +30 -18
- package/dist_ts_web/elements/00group-input/dees-input-datepicker/datepicker-popup.js +73 -46
- package/dist_ts_web/elements/00group-input/dees-input-datepicker/styles.js +15 -16
- package/dist_ts_web/elements/00group-input/dees-input-list/dees-input-list.js +2 -4
- package/dist_ts_web/elements/00group-input/dees-input-tags/dees-input-tags.js +36 -15
- package/dist_ts_web/elements/00group-input/dees-input-toggle/dees-input-toggle.js +5 -4
- package/dist_ts_web/elements/00group-input/dees-input-wysiwyg/blocks/text/code.block.js +10 -89
- package/dist_ts_web/elements/00group-input/dees-input-wysiwyg/dees-input-wysiwyg.js +12 -8
- package/dist_ts_web/elements/00group-layout/dees-chips/dees-chips.js +1 -1
- package/dist_ts_web/elements/00group-layout/dees-pagination/dees-pagination.js +27 -12
- package/dist_ts_web/elements/00group-layout/dees-settings/dees-settings.js +1 -1
- package/dist_ts_web/elements/00group-layout/dees-stepper/dees-stepper.js +14 -18
- package/dist_ts_web/elements/00group-overlay/dees-contextmenu/dees-contextmenu.js +6 -7
- package/dist_ts_web/elements/00group-overlay/dees-modal/dees-modal.js +6 -21
- package/dist_ts_web/elements/00group-overlay/dees-windowlayer/dees-windowlayer.d.ts +2 -1
- package/dist_ts_web/elements/00group-overlay/dees-windowlayer/dees-windowlayer.js +10 -4
- package/dist_ts_web/elements/00group-simple/dees-shopping-productcard/dees-shopping-productcard.js +1 -1
- package/dist_ts_web/elements/00group-simple/dees-simple-appdash/dees-simple-appdash.js +9 -8
- package/dist_ts_web/elements/00group-workspace/dees-workspace/dees-workspace.js +1 -1
- package/dist_ts_web/elements/00group-workspace/dees-workspace-filetree/dees-workspace-filetree.js +3 -4
- package/dist_ts_web/elements/00group-workspace/dees-workspace-markdownoutlet/dees-workspace-markdownoutlet.js +8 -78
- package/dist_ts_web/elements/00syntax.d.ts +28 -0
- package/dist_ts_web/elements/00syntax.js +98 -0
- package/dist_ts_web/elements/00theme.js +26 -14
- package/dist_ts_web/elements/index.d.ts +1 -0
- package/dist_ts_web/elements/index.js +2 -1
- package/dist_watch/bundle.js +233948 -0
- package/dist_watch/bundle.js.map +7 -0
- package/dist_watch/index.html +28 -0
- package/package.json +2 -2
- package/readme.hints.md +7 -1
- package/readme.md +116 -9
- package/readme.playbook.md +10 -0
- package/ts_web/00_commitinfo_data.ts +1 -1
- package/ts_web/elements/00group-appui/dees-appui/dees-appui.ts +4 -3
- package/ts_web/elements/00group-appui/dees-appui-profiledropdown/dees-appui-profiledropdown.ts +5 -6
- package/ts_web/elements/00group-appui/dees-appui-tabs/dees-appui-tabs.ts +3 -5
- package/ts_web/elements/00group-button/dees-button/dees-button.demo.ts +15 -1
- package/ts_web/elements/00group-button/dees-button/dees-button.ts +59 -24
- package/ts_web/elements/00group-chart/dees-chart-log/dees-chart-log.ts +1 -1
- package/ts_web/elements/00group-dataview/dees-dataview-codebox/codebox.diff.ts +401 -0
- package/ts_web/elements/00group-dataview/dees-dataview-codebox/dees-dataview-codebox.demo.ts +132 -38
- package/ts_web/elements/00group-dataview/dees-dataview-codebox/dees-dataview-codebox.ts +649 -187
- package/ts_web/elements/00group-dataview/dees-dataview-codebox/index.ts +1 -0
- package/ts_web/elements/00group-dataview/dees-dataview-statusobject/dees-dataview-statusobject.ts +45 -30
- package/ts_web/elements/00group-dataview/dees-grouped-list/dees-grouped-list.ts +1 -1
- package/ts_web/elements/00group-dataview/dees-statsgrid/dees-statsgrid.ts +0 -1
- package/ts_web/elements/00group-dataview/dees-storage-browser/dees-storage-keys.ts +1 -1
- package/ts_web/elements/00group-dataview/dees-table/styles.ts +1 -1
- package/ts_web/elements/00group-feedback/dees-progressbar/dees-progressbar.ts +9 -9
- package/ts_web/elements/00group-form/dees-form-submit/dees-form-submit.ts +1 -1
- package/ts_web/elements/00group-harness/dees-harness-chat/dees-harness-chat.demo.ts +193 -0
- package/ts_web/elements/00group-harness/dees-harness-chat/dees-harness-chat.ts +301 -0
- package/ts_web/elements/00group-harness/dees-harness-chat/index.ts +1 -0
- package/ts_web/elements/00group-harness/dees-harness-composer/dees-harness-composer.demo.ts +56 -0
- package/ts_web/elements/00group-harness/dees-harness-composer/dees-harness-composer.ts +514 -0
- package/ts_web/elements/00group-harness/dees-harness-composer/index.ts +1 -0
- package/ts_web/elements/00group-harness/dees-harness-content-blocks/dees-harness-content-blocks.demo.ts +44 -0
- package/ts_web/elements/00group-harness/dees-harness-content-blocks/dees-harness-content-blocks.ts +172 -0
- package/ts_web/elements/00group-harness/dees-harness-content-blocks/index.ts +1 -0
- package/ts_web/elements/00group-harness/dees-harness-message/dees-harness-message.demo.ts +129 -0
- package/ts_web/elements/00group-harness/dees-harness-message/dees-harness-message.ts +498 -0
- package/ts_web/elements/00group-harness/dees-harness-message/index.ts +1 -0
- package/ts_web/elements/00group-harness/dees-harness-message-list/dees-harness-message-list.demo.ts +105 -0
- package/ts_web/elements/00group-harness/dees-harness-message-list/dees-harness-message-list.ts +342 -0
- package/ts_web/elements/00group-harness/dees-harness-message-list/index.ts +1 -0
- package/ts_web/elements/00group-harness/dees-harness-permission-card/dees-harness-permission-card.demo.ts +47 -0
- package/ts_web/elements/00group-harness/dees-harness-permission-card/dees-harness-permission-card.ts +225 -0
- package/ts_web/elements/00group-harness/dees-harness-permission-card/index.ts +1 -0
- package/ts_web/elements/00group-harness/dees-harness-reasoning/dees-harness-reasoning.demo.ts +32 -0
- package/ts_web/elements/00group-harness/dees-harness-reasoning/dees-harness-reasoning.ts +195 -0
- package/ts_web/elements/00group-harness/dees-harness-reasoning/index.ts +1 -0
- package/ts_web/elements/00group-harness/dees-harness-session-list/dees-harness-session-list.demo.ts +59 -0
- package/ts_web/elements/00group-harness/dees-harness-session-list/dees-harness-session-list.ts +222 -0
- package/ts_web/elements/00group-harness/dees-harness-session-list/index.ts +1 -0
- package/ts_web/elements/00group-harness/dees-harness-status/dees-harness-status.demo.ts +35 -0
- package/ts_web/elements/00group-harness/dees-harness-status/dees-harness-status.ts +187 -0
- package/ts_web/elements/00group-harness/dees-harness-status/index.ts +1 -0
- package/ts_web/elements/00group-harness/dees-harness-todos/dees-harness-todos.demo.ts +43 -0
- package/ts_web/elements/00group-harness/dees-harness-todos/dees-harness-todos.ts +206 -0
- package/ts_web/elements/00group-harness/dees-harness-todos/index.ts +1 -0
- package/ts_web/elements/00group-harness/dees-harness-tool-card/dees-harness-tool-card.demo.ts +166 -0
- package/ts_web/elements/00group-harness/dees-harness-tool-card/dees-harness-tool-card.ts +315 -0
- package/ts_web/elements/00group-harness/dees-harness-tool-card/index.ts +2 -0
- package/ts_web/elements/00group-harness/dees-harness-tool-card/renderers.ts +205 -0
- package/ts_web/elements/00group-harness/dees-harness-usage/dees-harness-usage.demo.ts +25 -0
- package/ts_web/elements/00group-harness/dees-harness-usage/dees-harness-usage.ts +96 -0
- package/ts_web/elements/00group-harness/dees-harness-usage/index.ts +1 -0
- package/ts_web/elements/00group-harness/harness.demodata.ts +113 -0
- package/ts_web/elements/00group-harness/harness.helpers.ts +227 -0
- package/ts_web/elements/00group-harness/harness.markdown.ts +151 -0
- package/ts_web/elements/00group-harness/harness.styles.ts +96 -0
- package/ts_web/elements/00group-harness/index.ts +22 -0
- package/ts_web/elements/00group-harness/interfaces.ts +203 -0
- package/ts_web/elements/00group-harness/toolregistry.ts +264 -0
- package/ts_web/elements/00group-input/dees-input-code/dees-input-code.ts +29 -17
- package/ts_web/elements/00group-input/dees-input-datepicker/datepicker-popup.ts +72 -45
- package/ts_web/elements/00group-input/dees-input-datepicker/styles.ts +14 -15
- package/ts_web/elements/00group-input/dees-input-list/dees-input-list.ts +1 -3
- package/ts_web/elements/00group-input/dees-input-tags/dees-input-tags.ts +35 -14
- package/ts_web/elements/00group-input/dees-input-toggle/dees-input-toggle.ts +4 -3
- package/ts_web/elements/00group-input/dees-input-wysiwyg/blocks/text/code.block.ts +9 -88
- package/ts_web/elements/00group-input/dees-input-wysiwyg/dees-input-wysiwyg.ts +11 -7
- package/ts_web/elements/00group-layout/dees-chips/dees-chips.ts +1 -1
- package/ts_web/elements/00group-layout/dees-pagination/dees-pagination.ts +26 -11
- package/ts_web/elements/00group-layout/dees-settings/dees-settings.ts +1 -1
- package/ts_web/elements/00group-layout/dees-stepper/dees-stepper.ts +13 -17
- package/ts_web/elements/00group-overlay/dees-contextmenu/dees-contextmenu.ts +5 -6
- package/ts_web/elements/00group-overlay/dees-modal/dees-modal.ts +5 -20
- package/ts_web/elements/00group-overlay/dees-windowlayer/dees-windowlayer.ts +10 -3
- package/ts_web/elements/00group-simple/dees-shopping-productcard/dees-shopping-productcard.ts +1 -1
- package/ts_web/elements/00group-simple/dees-simple-appdash/dees-simple-appdash.ts +8 -7
- package/ts_web/elements/00group-workspace/dees-workspace/dees-workspace.ts +1 -1
- package/ts_web/elements/00group-workspace/dees-workspace-filetree/dees-workspace-filetree.ts +2 -3
- package/ts_web/elements/00group-workspace/dees-workspace-markdownoutlet/dees-workspace-markdownoutlet.ts +7 -77
- package/ts_web/elements/00syntax.ts +124 -0
- package/ts_web/elements/00theme.ts +25 -13
- package/ts_web/elements/index.ts +1 -0
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared demo fixtures for the harness group. Pure data plus a small
|
|
3
|
+
* streaming simulator used by the demos to exercise the delta fast path.
|
|
4
|
+
* Tool-call and MCP fixtures grow with the tool-card components.
|
|
5
|
+
*/
|
|
6
|
+
import type { IHarnessMessage, THarnessStreamDelta } from './interfaces.js';
|
|
7
|
+
|
|
8
|
+
export const harnessDemoMarkdown = [
|
|
9
|
+
'## Deploy summary',
|
|
10
|
+
'',
|
|
11
|
+
'The pipeline finished in **4m 12s** — one job regressed:',
|
|
12
|
+
'',
|
|
13
|
+
'| job | duration | baseline |',
|
|
14
|
+
'| --- | --- | --- |',
|
|
15
|
+
'| build | 61s | 58s |',
|
|
16
|
+
'| tests | 122s | 119s |',
|
|
17
|
+
'| sitemap | 41s | 13s |',
|
|
18
|
+
'',
|
|
19
|
+
'```typescript',
|
|
20
|
+
"const cacheKey = hash(routeManifest); // pin to manifest, not locale",
|
|
21
|
+
'```',
|
|
22
|
+
'',
|
|
23
|
+
'Recommendation: pin the sitemap cache key to the route manifest hash.',
|
|
24
|
+
].join('\n');
|
|
25
|
+
|
|
26
|
+
export const harnessDemoConversation = (): IHarnessMessage[] => [
|
|
27
|
+
{
|
|
28
|
+
id: 'demo-u1',
|
|
29
|
+
role: 'user',
|
|
30
|
+
text: 'Summarize the last deploy and flag anything that regressed.',
|
|
31
|
+
createdAt: Date.now() - 420_000,
|
|
32
|
+
attachments: [
|
|
33
|
+
{ id: 'demo-att1', name: 'deploy.log', mediaType: 'text/plain', size: 18_432, kind: 'text', truncated: true },
|
|
34
|
+
],
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
id: 'demo-a1',
|
|
38
|
+
role: 'assistant',
|
|
39
|
+
text: harnessDemoMarkdown,
|
|
40
|
+
createdAt: Date.now() - 400_000,
|
|
41
|
+
reasoning: [
|
|
42
|
+
{
|
|
43
|
+
id: 'demo-r1',
|
|
44
|
+
text: 'Compare job timings against the previous three runs; anything above 2× baseline is a regression worth naming.',
|
|
45
|
+
startedAt: Date.now() - 415_000,
|
|
46
|
+
endedAt: Date.now() - 411_000,
|
|
47
|
+
},
|
|
48
|
+
],
|
|
49
|
+
usage: { inputTokens: 1840, outputTokens: 310, totalTokens: 2150 },
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
id: 'demo-u2',
|
|
53
|
+
role: 'user',
|
|
54
|
+
text: 'Prepare the cache-key patch please.',
|
|
55
|
+
createdAt: Date.now() - 300_000,
|
|
56
|
+
},
|
|
57
|
+
];
|
|
58
|
+
|
|
59
|
+
export interface IHarnessStreamSimulatorTarget {
|
|
60
|
+
applyDelta(delta: THarnessStreamDelta): void;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Streams a canned reply into a target (message list or chat) through the
|
|
65
|
+
* delta fast path. Returns a stop function. The caller adds the (initially
|
|
66
|
+
* empty, streaming) message to the target's `.messages` first.
|
|
67
|
+
*/
|
|
68
|
+
export const makeStreamingSimulator = (
|
|
69
|
+
target: IHarnessStreamSimulatorTarget,
|
|
70
|
+
messageId: string,
|
|
71
|
+
options: { intervalMs?: number; chunkSize?: number; text?: string; withReasoning?: boolean } = {},
|
|
72
|
+
): (() => void) => {
|
|
73
|
+
const text = options.text
|
|
74
|
+
?? 'Working on the patch: pinning the sitemap cache key to the route manifest hash. The change is three lines in `sitemap.job.ts`, plus a regression test that asserts the cache key stays stable across locale rollouts.';
|
|
75
|
+
const intervalMs = options.intervalMs ?? 40;
|
|
76
|
+
const chunkSize = options.chunkSize ?? 6;
|
|
77
|
+
let offset = 0;
|
|
78
|
+
let reasoningDone = !(options.withReasoning ?? true);
|
|
79
|
+
const reasoningText = 'The cache key currently includes the locale list, which changed with the rollout — that is why every route re-crawled.';
|
|
80
|
+
let reasoningOffset = 0;
|
|
81
|
+
|
|
82
|
+
if (!reasoningDone) {
|
|
83
|
+
target.applyDelta({ type: 'reasoning-start', messageId, partId: `${messageId}-r1`, startedAt: Date.now() });
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
const interval = setInterval(() => {
|
|
87
|
+
if (!reasoningDone) {
|
|
88
|
+
const chunk = reasoningText.slice(reasoningOffset, reasoningOffset + chunkSize * 2);
|
|
89
|
+
reasoningOffset += chunkSize * 2;
|
|
90
|
+
if (chunk) {
|
|
91
|
+
target.applyDelta({ type: 'reasoning', messageId, partId: `${messageId}-r1`, delta: chunk });
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
target.applyDelta({ type: 'reasoning-end', messageId, partId: `${messageId}-r1`, endedAt: Date.now() });
|
|
95
|
+
reasoningDone = true;
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
const chunk = text.slice(offset, offset + chunkSize);
|
|
99
|
+
offset += chunkSize;
|
|
100
|
+
if (!chunk) {
|
|
101
|
+
clearInterval(interval);
|
|
102
|
+
target.applyDelta({
|
|
103
|
+
type: 'message-end',
|
|
104
|
+
messageId,
|
|
105
|
+
usage: { inputTokens: 980, outputTokens: 140, totalTokens: 1120 },
|
|
106
|
+
});
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
target.applyDelta({ type: 'text', messageId, delta: chunk });
|
|
110
|
+
}, intervalMs);
|
|
111
|
+
|
|
112
|
+
return () => clearInterval(interval);
|
|
113
|
+
};
|
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure helpers shared across the harness group: formatting, language
|
|
3
|
+
* detection, attachment constraints, and defensive value summarization.
|
|
4
|
+
* No DOM access; safe to import from anywhere including tests.
|
|
5
|
+
*/
|
|
6
|
+
import type { IHarnessTodoItem } from './interfaces.js';
|
|
7
|
+
|
|
8
|
+
export const harnessMaxAttachmentBytes = 10 * 1024 * 1024;
|
|
9
|
+
export const harnessMaxTotalAttachmentBytes = 30 * 1024 * 1024;
|
|
10
|
+
|
|
11
|
+
export const harnessSupportedImageTypes = new Set([
|
|
12
|
+
'image/png',
|
|
13
|
+
'image/jpeg',
|
|
14
|
+
'image/webp',
|
|
15
|
+
'image/gif',
|
|
16
|
+
]);
|
|
17
|
+
|
|
18
|
+
export const harnessSupportedTextTypes = new Set([
|
|
19
|
+
'application/csv',
|
|
20
|
+
'application/json',
|
|
21
|
+
'application/ld+json',
|
|
22
|
+
'application/xml',
|
|
23
|
+
'application/yaml',
|
|
24
|
+
'text/csv',
|
|
25
|
+
'text/html',
|
|
26
|
+
'text/javascript',
|
|
27
|
+
'text/markdown',
|
|
28
|
+
'text/plain',
|
|
29
|
+
'text/xml',
|
|
30
|
+
'text/yaml',
|
|
31
|
+
]);
|
|
32
|
+
|
|
33
|
+
const mediaTypeByExtension: Record<string, string> = {
|
|
34
|
+
css: 'text/css',
|
|
35
|
+
csv: 'text/csv',
|
|
36
|
+
html: 'text/html',
|
|
37
|
+
jpeg: 'image/jpeg',
|
|
38
|
+
jpg: 'image/jpeg',
|
|
39
|
+
js: 'text/javascript',
|
|
40
|
+
json: 'application/json',
|
|
41
|
+
jsonl: 'application/json',
|
|
42
|
+
log: 'text/plain',
|
|
43
|
+
md: 'text/markdown',
|
|
44
|
+
mjs: 'text/javascript',
|
|
45
|
+
png: 'image/png',
|
|
46
|
+
svg: 'image/svg+xml',
|
|
47
|
+
ts: 'text/plain',
|
|
48
|
+
tsx: 'text/plain',
|
|
49
|
+
txt: 'text/plain',
|
|
50
|
+
webp: 'image/webp',
|
|
51
|
+
xml: 'application/xml',
|
|
52
|
+
yaml: 'application/yaml',
|
|
53
|
+
yml: 'application/yaml',
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
const languageByExtension: Record<string, string> = {
|
|
57
|
+
c: 'c',
|
|
58
|
+
cjs: 'javascript',
|
|
59
|
+
cpp: 'cpp',
|
|
60
|
+
cs: 'csharp',
|
|
61
|
+
css: 'css',
|
|
62
|
+
go: 'go',
|
|
63
|
+
h: 'c',
|
|
64
|
+
html: 'html',
|
|
65
|
+
java: 'java',
|
|
66
|
+
js: 'javascript',
|
|
67
|
+
json: 'json',
|
|
68
|
+
jsx: 'javascript',
|
|
69
|
+
kt: 'kotlin',
|
|
70
|
+
md: 'markdown',
|
|
71
|
+
mjs: 'javascript',
|
|
72
|
+
php: 'php',
|
|
73
|
+
py: 'python',
|
|
74
|
+
rb: 'ruby',
|
|
75
|
+
rs: 'rust',
|
|
76
|
+
sh: 'bash',
|
|
77
|
+
sql: 'sql',
|
|
78
|
+
swift: 'swift',
|
|
79
|
+
toml: 'ini',
|
|
80
|
+
ts: 'typescript',
|
|
81
|
+
tsx: 'typescript',
|
|
82
|
+
xml: 'xml',
|
|
83
|
+
yaml: 'yaml',
|
|
84
|
+
yml: 'yaml',
|
|
85
|
+
zsh: 'bash',
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
export const harnessIsRecord = (value: unknown): value is Record<string, unknown> => {
|
|
89
|
+
return Boolean(value) && typeof value === 'object' && !Array.isArray(value);
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
export const harnessFormatBytes = (bytes: unknown): string => {
|
|
93
|
+
const value = typeof bytes === 'number' && Number.isFinite(bytes) ? bytes : 0;
|
|
94
|
+
if (value < 1024) return `${value} B`;
|
|
95
|
+
if (value < 1024 * 1024) return `${(value / 1024).toFixed(value < 10 * 1024 ? 1 : 0)} KB`;
|
|
96
|
+
return `${(value / 1024 / 1024).toFixed(value < 10 * 1024 * 1024 ? 1 : 0)} MB`;
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
export const harnessFormatDuration = (startedAt?: number, finishedAt?: number): string => {
|
|
100
|
+
if (!startedAt || !finishedAt || finishedAt < startedAt) return '';
|
|
101
|
+
const ms = finishedAt - startedAt;
|
|
102
|
+
if (ms < 1000) return `${ms}ms`;
|
|
103
|
+
if (ms < 60_000) return `${(ms / 1000).toFixed(ms < 10_000 ? 1 : 0)}s`;
|
|
104
|
+
return `${Math.floor(ms / 60_000)}m ${Math.round((ms % 60_000) / 1000)}s`;
|
|
105
|
+
};
|
|
106
|
+
|
|
107
|
+
export const harnessFormatRelativeTime = (epochMs?: number): string => {
|
|
108
|
+
if (!epochMs) return '';
|
|
109
|
+
const deltaMs = Date.now() - epochMs;
|
|
110
|
+
if (deltaMs < 45_000) return 'just now';
|
|
111
|
+
const minutes = Math.round(deltaMs / 60_000);
|
|
112
|
+
if (minutes < 60) return `${minutes}m ago`;
|
|
113
|
+
const hours = Math.round(minutes / 60);
|
|
114
|
+
if (hours < 24) return `${hours}h ago`;
|
|
115
|
+
const days = Math.round(hours / 24);
|
|
116
|
+
if (days < 7) return `${days}d ago`;
|
|
117
|
+
return new Date(epochMs).toLocaleDateString();
|
|
118
|
+
};
|
|
119
|
+
|
|
120
|
+
export const harnessLanguageForPath = (filePath: unknown): string => {
|
|
121
|
+
const extension = String(filePath || '').split('.').pop()?.toLowerCase() || '';
|
|
122
|
+
return languageByExtension[extension] || 'plaintext';
|
|
123
|
+
};
|
|
124
|
+
|
|
125
|
+
export const harnessMediaTypeForFile = (file: File): string => {
|
|
126
|
+
if (file.type) return file.type;
|
|
127
|
+
const extension = file.name.split('.').pop()?.toLowerCase() || '';
|
|
128
|
+
return mediaTypeByExtension[extension] || 'application/octet-stream';
|
|
129
|
+
};
|
|
130
|
+
|
|
131
|
+
export const harnessIsSupportedAttachmentType = (mediaType: string): boolean => {
|
|
132
|
+
return (
|
|
133
|
+
harnessSupportedImageTypes.has(mediaType)
|
|
134
|
+
|| mediaType.startsWith('text/')
|
|
135
|
+
|| harnessSupportedTextTypes.has(mediaType)
|
|
136
|
+
);
|
|
137
|
+
};
|
|
138
|
+
|
|
139
|
+
export const harnessFileToBase64 = (file: File): Promise<string> =>
|
|
140
|
+
new Promise<string>((resolve, reject) => {
|
|
141
|
+
const reader = new FileReader();
|
|
142
|
+
reader.onload = () => {
|
|
143
|
+
const result = typeof reader.result === 'string' ? reader.result : '';
|
|
144
|
+
const marker = ';base64,';
|
|
145
|
+
const markerIndex = result.indexOf(marker);
|
|
146
|
+
resolve(markerIndex === -1 ? result : result.slice(markerIndex + marker.length));
|
|
147
|
+
};
|
|
148
|
+
reader.onerror = () => reject(reader.error || new Error(`Could not read ${file.name || 'file'}.`));
|
|
149
|
+
reader.readAsDataURL(file);
|
|
150
|
+
});
|
|
151
|
+
|
|
152
|
+
export const harnessTruncate = (text: string, maxChars = 6000): { text: string; truncated: boolean } => {
|
|
153
|
+
if (text.length <= maxChars) return { text, truncated: false };
|
|
154
|
+
return { text: text.slice(0, maxChars), truncated: true };
|
|
155
|
+
};
|
|
156
|
+
|
|
157
|
+
export const harnessStringifyValue = (value: unknown): string => {
|
|
158
|
+
if (value === undefined || value === null) return '';
|
|
159
|
+
if (typeof value === 'string') return value;
|
|
160
|
+
if (typeof value === 'number' || typeof value === 'boolean') return String(value);
|
|
161
|
+
try {
|
|
162
|
+
return JSON.stringify(value, undefined, 2);
|
|
163
|
+
} catch {
|
|
164
|
+
return String(value);
|
|
165
|
+
}
|
|
166
|
+
};
|
|
167
|
+
|
|
168
|
+
/**
|
|
169
|
+
* Defensive one-glance summary of an arbitrary tool input/output object:
|
|
170
|
+
* well-known keys first, then remaining scalars. Ported from the git.zone
|
|
171
|
+
* IDE's agent formatting layer.
|
|
172
|
+
*/
|
|
173
|
+
/**
|
|
174
|
+
* Extracts todo items from a todo-tool input/output. Accepts { todos: [...] }
|
|
175
|
+
* or a bare array; items may carry content/subject/title and unknown statuses
|
|
176
|
+
* normalize to 'pending'.
|
|
177
|
+
*/
|
|
178
|
+
export const harnessParseTodos = (value: unknown): IHarnessTodoItem[] => {
|
|
179
|
+
const rawList = Array.isArray(value)
|
|
180
|
+
? value
|
|
181
|
+
: harnessIsRecord(value) && Array.isArray(value.todos)
|
|
182
|
+
? value.todos
|
|
183
|
+
: [];
|
|
184
|
+
const result: IHarnessTodoItem[] = [];
|
|
185
|
+
for (const entry of rawList) {
|
|
186
|
+
if (typeof entry === 'string') {
|
|
187
|
+
result.push({ content: entry, status: 'pending' });
|
|
188
|
+
continue;
|
|
189
|
+
}
|
|
190
|
+
if (!harnessIsRecord(entry)) continue;
|
|
191
|
+
const content = String(entry.content ?? entry.subject ?? entry.title ?? '').trim();
|
|
192
|
+
if (!content) continue;
|
|
193
|
+
const status = entry.status === 'completed' || entry.status === 'in_progress' ? entry.status : 'pending';
|
|
194
|
+
result.push({
|
|
195
|
+
id: entry.id !== undefined ? String(entry.id) : undefined,
|
|
196
|
+
content,
|
|
197
|
+
status,
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
return result;
|
|
201
|
+
};
|
|
202
|
+
|
|
203
|
+
export const harnessSummarizeValue = (value: unknown): string => {
|
|
204
|
+
if (!harnessIsRecord(value)) return harnessStringifyValue(value);
|
|
205
|
+
const lines: string[] = [];
|
|
206
|
+
const seenKeys = new Set<string>();
|
|
207
|
+
for (const key of ['description', 'command', 'workdir', 'cwd', 'filePath', 'path', 'pattern', 'query', 'url', 'action']) {
|
|
208
|
+
const item = value[key];
|
|
209
|
+
if (typeof item === 'string' && item) {
|
|
210
|
+
lines.push(`${key}: ${item}`);
|
|
211
|
+
seenKeys.add(key);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
for (const [key, item] of Object.entries(value)) {
|
|
215
|
+
if (seenKeys.has(key) || item === undefined || item === null) continue;
|
|
216
|
+
if (typeof item === 'string' || typeof item === 'number' || typeof item === 'boolean') {
|
|
217
|
+
const text = String(item);
|
|
218
|
+
lines.push(`${key}: ${text.length > 240 ? `${text.slice(0, 240)}…` : text}`);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
return lines.join('\n');
|
|
222
|
+
};
|
|
223
|
+
|
|
224
|
+
/** First meaningful line of a summarized value; used for card subtitles. */
|
|
225
|
+
export const harnessSummaryLine = (value: unknown): string => {
|
|
226
|
+
return harnessSummarizeValue(value).split('\n')[0] || '';
|
|
227
|
+
};
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import { css, type CSSResult } from '@design.estate/dees-element';
|
|
2
|
+
import * as domtools from '@design.estate/dees-domtools';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Markdown service for harness messages. Uses smartmarkdown (already in the
|
|
6
|
+
* dependency graph via dees-domtools; GFM-capable, sanitized-by-default) so
|
|
7
|
+
* the group adds zero dependencies. Results are LRU-cached because streaming
|
|
8
|
+
* re-parses the same growing text repeatedly. Swap seam: if the parser ever
|
|
9
|
+
* changes, only this file does.
|
|
10
|
+
*/
|
|
11
|
+
export class HarnessMarkdown {
|
|
12
|
+
private static instance: HarnessMarkdown | undefined;
|
|
13
|
+
|
|
14
|
+
public static getInstance(): HarnessMarkdown {
|
|
15
|
+
HarnessMarkdown.instance ??= new HarnessMarkdown();
|
|
16
|
+
return HarnessMarkdown.instance;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
private cache = new Map<string, string>();
|
|
20
|
+
private static readonly maxCacheEntries = 200;
|
|
21
|
+
|
|
22
|
+
public async renderToHtml(markdownText: string): Promise<string> {
|
|
23
|
+
const cached = this.cache.get(markdownText);
|
|
24
|
+
if (cached !== undefined) {
|
|
25
|
+
// refresh LRU position
|
|
26
|
+
this.cache.delete(markdownText);
|
|
27
|
+
this.cache.set(markdownText, cached);
|
|
28
|
+
return cached;
|
|
29
|
+
}
|
|
30
|
+
const html = await domtools.plugins.smartmarkdown.SmartMarkdown.easyMarkdownToHtml(markdownText);
|
|
31
|
+
const processed = this.postProcess(html);
|
|
32
|
+
this.cache.set(markdownText, processed);
|
|
33
|
+
if (this.cache.size > HarnessMarkdown.maxCacheEntries) {
|
|
34
|
+
const oldestKey = this.cache.keys().next().value;
|
|
35
|
+
if (oldestKey !== undefined) this.cache.delete(oldestKey);
|
|
36
|
+
}
|
|
37
|
+
return processed;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/** External links open in a new context and never leak the opener. */
|
|
41
|
+
private postProcess(html: string): string {
|
|
42
|
+
return html.replaceAll('<a href=', '<a target="_blank" rel="noopener noreferrer" href=');
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Token-based typography for rendered markdown. Included by components that
|
|
48
|
+
* render HarnessMarkdown output inside a `.markdown-body` container. Code
|
|
49
|
+
* fence syntax colors reuse the codebox palette convention (dark defaults,
|
|
50
|
+
* `:host([gobright])` for light) — kept in the consuming component's styles
|
|
51
|
+
* where :host is available; this block covers structure and rhythm.
|
|
52
|
+
*/
|
|
53
|
+
export const markdownStyles: CSSResult = css`
|
|
54
|
+
.markdown-body {
|
|
55
|
+
color: var(--dees-color-text-primary);
|
|
56
|
+
font-size: var(--dees-font-control-size, 13px);
|
|
57
|
+
line-height: 1.55;
|
|
58
|
+
overflow-wrap: anywhere;
|
|
59
|
+
}
|
|
60
|
+
.markdown-body > :first-child {
|
|
61
|
+
margin-top: 0;
|
|
62
|
+
}
|
|
63
|
+
.markdown-body > :last-child {
|
|
64
|
+
margin-bottom: 0;
|
|
65
|
+
}
|
|
66
|
+
.markdown-body h1,
|
|
67
|
+
.markdown-body h2,
|
|
68
|
+
.markdown-body h3,
|
|
69
|
+
.markdown-body h4 {
|
|
70
|
+
margin: var(--dees-spacing-lg) 0 var(--dees-spacing-sm);
|
|
71
|
+
color: var(--dees-color-text-primary);
|
|
72
|
+
font-weight: 600;
|
|
73
|
+
line-height: 1.3;
|
|
74
|
+
}
|
|
75
|
+
.markdown-body h1 { font-size: 1.35em; }
|
|
76
|
+
.markdown-body h2 { font-size: 1.2em; }
|
|
77
|
+
.markdown-body h3 { font-size: 1.05em; }
|
|
78
|
+
.markdown-body h4 { font-size: 1em; }
|
|
79
|
+
.markdown-body p {
|
|
80
|
+
margin: var(--dees-spacing-sm) 0;
|
|
81
|
+
}
|
|
82
|
+
.markdown-body ul,
|
|
83
|
+
.markdown-body ol {
|
|
84
|
+
margin: var(--dees-spacing-sm) 0;
|
|
85
|
+
padding-left: 1.4em;
|
|
86
|
+
}
|
|
87
|
+
.markdown-body li {
|
|
88
|
+
margin: 2px 0;
|
|
89
|
+
}
|
|
90
|
+
.markdown-body a {
|
|
91
|
+
color: var(--dees-color-link);
|
|
92
|
+
text-decoration: none;
|
|
93
|
+
}
|
|
94
|
+
.markdown-body a:hover {
|
|
95
|
+
color: var(--dees-color-link-hover);
|
|
96
|
+
text-decoration: underline;
|
|
97
|
+
}
|
|
98
|
+
.markdown-body blockquote {
|
|
99
|
+
margin: var(--dees-spacing-sm) 0;
|
|
100
|
+
padding: var(--dees-spacing-xs) var(--dees-spacing-md);
|
|
101
|
+
border-left: 3px solid var(--dees-color-border-strong);
|
|
102
|
+
color: var(--dees-color-text-secondary);
|
|
103
|
+
}
|
|
104
|
+
.markdown-body code {
|
|
105
|
+
padding: 1px 5px;
|
|
106
|
+
border-radius: var(--dees-radius-xs);
|
|
107
|
+
background: var(--dees-color-code-bg);
|
|
108
|
+
font-family: var(--dees-font-family-mono);
|
|
109
|
+
font-size: 0.92em;
|
|
110
|
+
}
|
|
111
|
+
.markdown-body pre {
|
|
112
|
+
margin: var(--dees-spacing-sm) 0;
|
|
113
|
+
padding: var(--dees-spacing-md);
|
|
114
|
+
border: 1px solid var(--dees-color-border-subtle);
|
|
115
|
+
border-radius: var(--dees-radius-md);
|
|
116
|
+
corner-shape: var(--dees-corner-shape);
|
|
117
|
+
background: var(--dees-color-code-block-bg);
|
|
118
|
+
overflow: auto;
|
|
119
|
+
}
|
|
120
|
+
.markdown-body pre code {
|
|
121
|
+
padding: 0;
|
|
122
|
+
border-radius: 0;
|
|
123
|
+
background: transparent;
|
|
124
|
+
font-size: var(--dees-font-control-size-sm, 12px);
|
|
125
|
+
line-height: 1.5;
|
|
126
|
+
}
|
|
127
|
+
.markdown-body table {
|
|
128
|
+
margin: var(--dees-spacing-sm) 0;
|
|
129
|
+
border-collapse: collapse;
|
|
130
|
+
font-size: 0.95em;
|
|
131
|
+
}
|
|
132
|
+
.markdown-body th,
|
|
133
|
+
.markdown-body td {
|
|
134
|
+
padding: 4px 10px;
|
|
135
|
+
border: 1px solid var(--dees-color-border-default);
|
|
136
|
+
text-align: left;
|
|
137
|
+
}
|
|
138
|
+
.markdown-body th {
|
|
139
|
+
background: var(--dees-color-bg-tertiary);
|
|
140
|
+
font-weight: 600;
|
|
141
|
+
}
|
|
142
|
+
.markdown-body img {
|
|
143
|
+
max-width: 100%;
|
|
144
|
+
border-radius: var(--dees-radius-md);
|
|
145
|
+
}
|
|
146
|
+
.markdown-body hr {
|
|
147
|
+
margin: var(--dees-spacing-md) 0;
|
|
148
|
+
border: 0;
|
|
149
|
+
border-top: 1px solid var(--dees-color-border-subtle);
|
|
150
|
+
}
|
|
151
|
+
`;
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { css, type CSSResult } from '@design.estate/dees-element';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Shared visual vocabulary for harness components: card chrome, status
|
|
5
|
+
* pills, and monospace output blocks. Tokens only — both themes flip
|
|
6
|
+
* automatically.
|
|
7
|
+
*/
|
|
8
|
+
export const harnessCardStyles: CSSResult = css`
|
|
9
|
+
.harness-card {
|
|
10
|
+
border: 1px solid var(--dees-color-border-subtle);
|
|
11
|
+
border-left: 2px solid var(--dees-color-border-default);
|
|
12
|
+
border-radius: var(--dees-radius-lg);
|
|
13
|
+
corner-shape: var(--dees-corner-shape);
|
|
14
|
+
background: var(--dees-color-bg-secondary);
|
|
15
|
+
overflow: hidden;
|
|
16
|
+
}
|
|
17
|
+
.harness-card.status-running,
|
|
18
|
+
.harness-card.status-pending {
|
|
19
|
+
border-left-color: var(--dees-color-accent-primary);
|
|
20
|
+
}
|
|
21
|
+
.harness-card.status-completed {
|
|
22
|
+
border-left-color: var(--dees-color-accent-success);
|
|
23
|
+
}
|
|
24
|
+
.harness-card.status-error {
|
|
25
|
+
border-left-color: var(--dees-color-accent-error);
|
|
26
|
+
}
|
|
27
|
+
.harness-card.destructive {
|
|
28
|
+
border-left-color: var(--dees-color-accent-error);
|
|
29
|
+
}
|
|
30
|
+
`;
|
|
31
|
+
|
|
32
|
+
export const harnessPillStyles: CSSResult = css`
|
|
33
|
+
.harness-pill {
|
|
34
|
+
flex: 0 0 auto;
|
|
35
|
+
padding: 2px 8px;
|
|
36
|
+
border-radius: var(--dees-radius-full);
|
|
37
|
+
background: var(--dees-color-badge-default-bg);
|
|
38
|
+
color: var(--dees-color-badge-default-fg);
|
|
39
|
+
font-size: 10px;
|
|
40
|
+
font-weight: 700;
|
|
41
|
+
letter-spacing: 0.04em;
|
|
42
|
+
text-transform: uppercase;
|
|
43
|
+
white-space: nowrap;
|
|
44
|
+
}
|
|
45
|
+
.harness-pill.tone-running,
|
|
46
|
+
.harness-pill.tone-pending {
|
|
47
|
+
background: var(--dees-color-fill-secondary);
|
|
48
|
+
color: var(--dees-color-accent-primary);
|
|
49
|
+
}
|
|
50
|
+
.harness-pill.tone-success {
|
|
51
|
+
background: var(--dees-color-badge-success-bg);
|
|
52
|
+
color: var(--dees-color-badge-success-fg);
|
|
53
|
+
}
|
|
54
|
+
.harness-pill.tone-warning {
|
|
55
|
+
background: var(--dees-color-badge-warning-bg);
|
|
56
|
+
color: var(--dees-color-badge-warning-fg);
|
|
57
|
+
}
|
|
58
|
+
.harness-pill.tone-error {
|
|
59
|
+
background: var(--dees-color-badge-error-bg);
|
|
60
|
+
color: var(--dees-color-badge-error-fg);
|
|
61
|
+
}
|
|
62
|
+
`;
|
|
63
|
+
|
|
64
|
+
export const harnessMonoStyles: CSSResult = css`
|
|
65
|
+
.harness-mono {
|
|
66
|
+
margin: 0;
|
|
67
|
+
padding: var(--dees-spacing-sm) var(--dees-spacing-md);
|
|
68
|
+
border: 1px solid var(--dees-color-border-subtle);
|
|
69
|
+
border-radius: var(--dees-radius-md);
|
|
70
|
+
corner-shape: var(--dees-corner-shape);
|
|
71
|
+
background: var(--dees-color-code-block-bg);
|
|
72
|
+
color: var(--dees-color-text-primary);
|
|
73
|
+
white-space: pre-wrap;
|
|
74
|
+
overflow-wrap: anywhere;
|
|
75
|
+
overflow: auto;
|
|
76
|
+
font-family: var(--dees-font-family-mono);
|
|
77
|
+
font-size: var(--dees-font-control-size-sm, 12px);
|
|
78
|
+
line-height: 1.5;
|
|
79
|
+
}
|
|
80
|
+
.harness-mono.tone-error {
|
|
81
|
+
color: var(--dees-color-text-error);
|
|
82
|
+
}
|
|
83
|
+
.harness-mono-expand {
|
|
84
|
+
margin-top: var(--dees-spacing-xs);
|
|
85
|
+
padding: 0;
|
|
86
|
+
border: 0;
|
|
87
|
+
background: transparent;
|
|
88
|
+
color: var(--dees-color-link);
|
|
89
|
+
cursor: pointer;
|
|
90
|
+
font-size: var(--dees-font-control-size-sm, 12px);
|
|
91
|
+
}
|
|
92
|
+
.harness-mono-expand:hover {
|
|
93
|
+
color: var(--dees-color-link-hover);
|
|
94
|
+
text-decoration: underline;
|
|
95
|
+
}
|
|
96
|
+
`;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
// Agentic Chat (harness) Components
|
|
2
|
+
// Renders what an agent harness produces: messages, reasoning, tool calls,
|
|
3
|
+
// MCP content, permissions — plus the composer and session chrome around it.
|
|
4
|
+
export * from './interfaces.js';
|
|
5
|
+
export * from './toolregistry.js';
|
|
6
|
+
export * from './harness.helpers.js';
|
|
7
|
+
export { HarnessMarkdown, markdownStyles } from './harness.markdown.js';
|
|
8
|
+
export { harnessCardStyles, harnessPillStyles, harnessMonoStyles } from './harness.styles.js';
|
|
9
|
+
export * from './harness.demodata.js';
|
|
10
|
+
|
|
11
|
+
export * from './dees-harness-chat/index.js';
|
|
12
|
+
export * from './dees-harness-composer/index.js';
|
|
13
|
+
export * from './dees-harness-content-blocks/index.js';
|
|
14
|
+
export * from './dees-harness-message/index.js';
|
|
15
|
+
export * from './dees-harness-permission-card/index.js';
|
|
16
|
+
export * from './dees-harness-message-list/index.js';
|
|
17
|
+
export * from './dees-harness-reasoning/index.js';
|
|
18
|
+
export * from './dees-harness-session-list/index.js';
|
|
19
|
+
export * from './dees-harness-status/index.js';
|
|
20
|
+
export * from './dees-harness-todos/index.js';
|
|
21
|
+
export * from './dees-harness-tool-card/index.js';
|
|
22
|
+
export * from './dees-harness-usage/index.js';
|