@adia-ai/web-components 0.4.5 → 0.4.7

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 (316) hide show
  1. package/README.md +63 -24
  2. package/USAGE.md +604 -0
  3. package/components/accordion/accordion.d.ts +17 -0
  4. package/components/accordion/accordion.js +10 -117
  5. package/components/accordion/class.js +132 -0
  6. package/components/action-list/action-list.d.ts +15 -0
  7. package/components/action-list/action-list.js +9 -140
  8. package/components/action-list/class.js +156 -0
  9. package/components/agent-artifact/agent-artifact.d.ts +25 -0
  10. package/components/agent-artifact/agent-artifact.js +8 -181
  11. package/components/agent-artifact/class.js +200 -0
  12. package/components/agent-feedback-bar/agent-feedback-bar.d.ts +21 -0
  13. package/components/agent-feedback-bar/agent-feedback-bar.js +8 -143
  14. package/components/agent-feedback-bar/class.js +162 -0
  15. package/components/agent-questions/agent-questions.d.ts +23 -0
  16. package/components/agent-questions/agent-questions.js +8 -180
  17. package/components/agent-questions/class.js +199 -0
  18. package/components/agent-reasoning/agent-reasoning.d.ts +23 -0
  19. package/components/agent-reasoning/agent-reasoning.js +8 -494
  20. package/components/agent-reasoning/class.js +513 -0
  21. package/components/agent-suggestions/agent-suggestions.d.ts +21 -0
  22. package/components/agent-suggestions/agent-suggestions.js +8 -78
  23. package/components/agent-suggestions/class.js +97 -0
  24. package/components/agent-trace/agent-trace.d.ts +19 -0
  25. package/components/alert/alert.d.ts +29 -0
  26. package/components/alert/alert.js +8 -175
  27. package/components/alert/class.js +194 -0
  28. package/components/avatar/avatar.d.ts +27 -0
  29. package/components/avatar/avatar.js +9 -159
  30. package/components/avatar/class.js +173 -0
  31. package/components/badge/badge.d.ts +27 -0
  32. package/components/badge/badge.js +9 -75
  33. package/components/badge/class.js +93 -0
  34. package/components/block/block.d.ts +19 -0
  35. package/components/block/block.js +9 -15
  36. package/components/block/class.js +33 -0
  37. package/components/breadcrumb/breadcrumb.d.ts +23 -0
  38. package/components/breadcrumb/breadcrumb.js +8 -113
  39. package/components/breadcrumb/class.js +132 -0
  40. package/components/button/button.d.ts +34 -0
  41. package/components/button/button.js +15 -66
  42. package/components/button/class.js +80 -0
  43. package/components/calendar-picker/calendar-picker.a2ui.json +6 -1
  44. package/components/calendar-picker/calendar-picker.d.ts +27 -0
  45. package/components/calendar-picker/calendar-picker.js +8 -332
  46. package/components/calendar-picker/calendar-picker.yaml +51 -177
  47. package/components/calendar-picker/class.js +351 -0
  48. package/components/canvas/canvas.a2ui.json +6 -1
  49. package/components/canvas/canvas.d.ts +17 -0
  50. package/components/canvas/canvas.yaml +19 -36
  51. package/components/card/card.a2ui.json +3 -0
  52. package/components/card/card.d.ts +27 -0
  53. package/components/card/card.js +9 -50
  54. package/components/card/card.yaml +171 -433
  55. package/components/card/class.js +68 -0
  56. package/components/chart/chart.d.ts +41 -0
  57. package/components/chart/chart.js +8 -2131
  58. package/components/chart/class.js +2150 -0
  59. package/components/chart-legend/chart-legend.d.ts +27 -0
  60. package/components/chart-legend/chart-legend.js +8 -197
  61. package/components/chart-legend/class.js +215 -0
  62. package/components/chat-thread/chat-thread.d.ts +17 -0
  63. package/components/chat-thread/chat-thread.js +8 -157
  64. package/components/chat-thread/class.js +176 -0
  65. package/components/check/check.d.ts +30 -0
  66. package/components/check/check.js +11 -52
  67. package/components/check/class.js +68 -0
  68. package/components/code/class.js +501 -0
  69. package/components/code/code.d.ts +39 -0
  70. package/components/code/code.js +8 -482
  71. package/components/col/class.js +30 -0
  72. package/components/col/col.d.ts +23 -0
  73. package/components/col/col.js +10 -13
  74. package/components/color-picker/class.js +550 -0
  75. package/components/color-picker/color-picker.d.ts +37 -0
  76. package/components/color-picker/color-picker.js +8 -531
  77. package/components/command/class.js +364 -0
  78. package/components/command/command.a2ui.json +3 -0
  79. package/components/command/command.d.ts +19 -0
  80. package/components/command/command.js +8 -345
  81. package/components/command/command.yaml +105 -124
  82. package/components/demo-toggle/class.js +153 -0
  83. package/components/demo-toggle/demo-toggle.d.ts +23 -0
  84. package/components/demo-toggle/demo-toggle.js +8 -135
  85. package/components/description-list/class.js +86 -0
  86. package/components/description-list/description-list.d.ts +21 -0
  87. package/components/description-list/description-list.js +8 -67
  88. package/components/divider/class.js +57 -0
  89. package/components/divider/divider.d.ts +19 -0
  90. package/components/divider/divider.js +10 -40
  91. package/components/drawer/class.js +306 -0
  92. package/components/drawer/drawer.d.ts +25 -0
  93. package/components/drawer/drawer.js +8 -287
  94. package/components/embed/class.js +73 -0
  95. package/components/embed/embed.d.ts +23 -0
  96. package/components/embed/embed.js +9 -55
  97. package/components/empty-state/class.js +108 -0
  98. package/components/empty-state/empty-state.d.ts +21 -0
  99. package/components/empty-state/empty-state.js +9 -90
  100. package/components/feed/class.js +381 -0
  101. package/components/feed/feed.d.ts +19 -0
  102. package/components/feed/feed.js +9 -367
  103. package/components/field/class.js +266 -0
  104. package/components/field/field.d.ts +23 -0
  105. package/components/field/field.js +8 -247
  106. package/components/fields/class.js +106 -0
  107. package/components/fields/fields.d.ts +19 -0
  108. package/components/fields/fields.js +8 -87
  109. package/components/grid/class.js +31 -0
  110. package/components/grid/grid.d.ts +23 -0
  111. package/components/grid/grid.js +10 -14
  112. package/components/heatmap/class.js +305 -0
  113. package/components/heatmap/heatmap.d.ts +31 -0
  114. package/components/heatmap/heatmap.js +8 -286
  115. package/components/icon/class.js +54 -0
  116. package/components/icon/icon.d.ts +23 -0
  117. package/components/icon/icon.js +13 -40
  118. package/components/image/class.js +112 -0
  119. package/components/image/image.d.ts +33 -0
  120. package/components/image/image.js +9 -94
  121. package/components/index.js +1 -0
  122. package/components/input/class.js +773 -0
  123. package/components/input/input.a2ui.json +3 -0
  124. package/components/input/input.d.ts +61 -0
  125. package/components/input/input.js +8 -755
  126. package/components/input/input.yaml +171 -442
  127. package/components/inspector/class.js +142 -0
  128. package/components/inspector/inspector.a2ui.json +8 -1
  129. package/components/inspector/inspector.d.ts +17 -0
  130. package/components/inspector/inspector.js +8 -124
  131. package/components/inspector/inspector.yaml +15 -30
  132. package/components/kbd/class.js +34 -0
  133. package/components/kbd/kbd.a2ui.json +3 -0
  134. package/components/kbd/kbd.d.ts +17 -0
  135. package/components/kbd/kbd.js +10 -17
  136. package/components/kbd/kbd.yaml +54 -185
  137. package/components/link/class.js +187 -0
  138. package/components/link/link.d.ts +55 -0
  139. package/components/link/link.js +8 -168
  140. package/components/list/class.js +249 -0
  141. package/components/list/list.d.ts +23 -0
  142. package/components/list/list.js +9 -231
  143. package/components/menu/class.js +332 -0
  144. package/components/menu/menu.d.ts +21 -0
  145. package/components/menu/menu.js +11 -316
  146. package/components/modal/class.js +231 -0
  147. package/components/modal/modal.a2ui.json +5 -1
  148. package/components/modal/modal.d.ts +23 -0
  149. package/components/modal/modal.js +8 -212
  150. package/components/modal/modal.yaml +19 -39
  151. package/components/nav/class.js +150 -0
  152. package/components/nav/nav.d.ts +31 -0
  153. package/components/nav/nav.js +8 -131
  154. package/components/nav-group/class.js +152 -0
  155. package/components/nav-group/nav-group.d.ts +35 -0
  156. package/components/nav-group/nav-group.js +9 -134
  157. package/components/nav-item/class.js +86 -0
  158. package/components/nav-item/nav-item.d.ts +37 -0
  159. package/components/nav-item/nav-item.js +10 -69
  160. package/components/noodles/class.js +510 -0
  161. package/components/noodles/noodles.d.ts +33 -0
  162. package/components/noodles/noodles.js +9 -493
  163. package/components/option-card/class.js +167 -0
  164. package/components/option-card/option-card.d.ts +30 -0
  165. package/components/option-card/option-card.js +8 -149
  166. package/components/otp-input/class.js +180 -0
  167. package/components/otp-input/otp-input.a2ui.json +5 -1
  168. package/components/otp-input/otp-input.d.ts +25 -0
  169. package/components/otp-input/otp-input.js +9 -162
  170. package/components/otp-input/otp-input.yaml +45 -174
  171. package/components/page/class.js +97 -0
  172. package/components/page/page.d.ts +46 -0
  173. package/components/page/page.js +8 -79
  174. package/components/pagination/class.js +195 -0
  175. package/components/pagination/pagination.d.ts +23 -0
  176. package/components/pagination/pagination.js +9 -177
  177. package/components/pane/class.js +186 -0
  178. package/components/pane/pane.a2ui.json +12 -1
  179. package/components/pane/pane.css +10 -0
  180. package/components/pane/pane.d.ts +31 -0
  181. package/components/pane/pane.js +8 -143
  182. package/components/pane/pane.yaml +57 -157
  183. package/components/pipeline-status/class.js +189 -0
  184. package/components/pipeline-status/pipeline-status.a2ui.json +7 -1
  185. package/components/pipeline-status/pipeline-status.d.ts +21 -0
  186. package/components/pipeline-status/pipeline-status.js +9 -172
  187. package/components/pipeline-status/pipeline-status.yaml +34 -72
  188. package/components/popover/class.js +194 -0
  189. package/components/popover/popover.d.ts +23 -0
  190. package/components/popover/popover.js +9 -176
  191. package/components/progress/class.js +74 -0
  192. package/components/progress/progress.a2ui.json +3 -0
  193. package/components/progress/progress.d.ts +19 -0
  194. package/components/progress/progress.js +10 -57
  195. package/components/progress/progress.yaml +124 -287
  196. package/components/progress-row/class.js +110 -0
  197. package/components/progress-row/progress-row.d.ts +23 -0
  198. package/components/progress-row/progress-row.js +8 -92
  199. package/components/radio/class.js +83 -0
  200. package/components/radio/radio.d.ts +28 -0
  201. package/components/radio/radio.js +11 -67
  202. package/components/range/class.js +194 -0
  203. package/components/range/range.d.ts +31 -0
  204. package/components/range/range.js +9 -176
  205. package/components/rating/class.js +148 -0
  206. package/components/rating/rating.d.ts +33 -0
  207. package/components/rating/rating.js +9 -130
  208. package/components/richtext/class.js +87 -0
  209. package/components/richtext/richtext.a2ui.json +7 -1
  210. package/components/richtext/richtext.d.ts +19 -0
  211. package/components/richtext/richtext.js +8 -68
  212. package/components/richtext/richtext.yaml +30 -65
  213. package/components/row/class.js +50 -0
  214. package/components/row/row.d.ts +27 -0
  215. package/components/row/row.js +10 -33
  216. package/components/search/class.js +134 -0
  217. package/components/search/search.d.ts +35 -0
  218. package/components/search/search.js +10 -117
  219. package/components/segment/class.js +62 -0
  220. package/components/segment/segment.d.ts +25 -0
  221. package/components/segment/segment.js +10 -45
  222. package/components/segmented/class.js +165 -0
  223. package/components/segmented/segmented.a2ui.json +4 -0
  224. package/components/segmented/segmented.d.ts +24 -0
  225. package/components/segmented/segmented.js +10 -148
  226. package/components/segmented/segmented.yaml +41 -59
  227. package/components/select/class.js +408 -0
  228. package/components/select/select.d.ts +57 -0
  229. package/components/select/select.js +15 -396
  230. package/components/skeleton/class.js +52 -0
  231. package/components/skeleton/skeleton.d.ts +23 -0
  232. package/components/skeleton/skeleton.js +8 -34
  233. package/components/slider/class.js +184 -0
  234. package/components/slider/slider.d.ts +31 -0
  235. package/components/slider/slider.js +9 -166
  236. package/components/stack/class.js +28 -0
  237. package/components/stack/stack.d.ts +17 -0
  238. package/components/stack/stack.js +10 -11
  239. package/components/step-progress/class.js +98 -0
  240. package/components/step-progress/step-progress.d.ts +27 -0
  241. package/components/step-progress/step-progress.js +8 -79
  242. package/components/stepper/class.js +126 -0
  243. package/components/stepper/stepper.d.ts +19 -0
  244. package/components/stepper/stepper.js +9 -112
  245. package/components/stream/class.js +109 -0
  246. package/components/stream/stream.d.ts +19 -0
  247. package/components/stream/stream.js +8 -90
  248. package/components/swatch/class.js +131 -0
  249. package/components/swatch/swatch.d.ts +28 -0
  250. package/components/swatch/swatch.js +8 -112
  251. package/components/swiper/class.js +373 -0
  252. package/components/swiper/swiper.a2ui.json +4 -0
  253. package/components/swiper/swiper.d.ts +31 -0
  254. package/components/swiper/swiper.js +8 -354
  255. package/components/swiper/swiper.yaml +68 -212
  256. package/components/switch/class.js +63 -0
  257. package/components/switch/switch.a2ui.json +6 -1
  258. package/components/switch/switch.d.ts +30 -0
  259. package/components/switch/switch.js +11 -47
  260. package/components/switch/switch.yaml +70 -265
  261. package/components/table/class.js +1453 -0
  262. package/components/table/table.d.ts +37 -0
  263. package/components/table/table.js +8 -1435
  264. package/components/table-toolbar/class.js +680 -0
  265. package/components/table-toolbar/table-toolbar.d.ts +33 -0
  266. package/components/table-toolbar/table-toolbar.js +8 -689
  267. package/components/tabs/class.js +242 -0
  268. package/components/tabs/tabs.d.ts +21 -0
  269. package/components/tabs/tabs.js +8 -223
  270. package/components/tag/class.js +99 -0
  271. package/components/tag/tag.d.ts +27 -0
  272. package/components/tag/tag.js +8 -80
  273. package/components/text/class.js +46 -0
  274. package/components/text/text.d.ts +25 -0
  275. package/components/text/text.js +9 -28
  276. package/components/textarea/class.js +134 -0
  277. package/components/textarea/textarea.d.ts +31 -0
  278. package/components/textarea/textarea.js +11 -118
  279. package/components/timeline/class.js +176 -0
  280. package/components/timeline/timeline.d.ts +19 -0
  281. package/components/timeline/timeline.js +9 -162
  282. package/components/toast/class.js +92 -0
  283. package/components/toast/toast.d.ts +23 -0
  284. package/components/toast/toast.js +9 -76
  285. package/components/toggle-group/class.js +154 -0
  286. package/components/toggle-group/toggle-group.d.ts +19 -0
  287. package/components/toggle-group/toggle-group.js +11 -140
  288. package/components/toggle-scheme/class.js +286 -0
  289. package/components/toggle-scheme/toggle-scheme.a2ui.json +197 -0
  290. package/components/toggle-scheme/toggle-scheme.css +20 -0
  291. package/components/toggle-scheme/toggle-scheme.d.ts +41 -0
  292. package/components/toggle-scheme/toggle-scheme.js +17 -0
  293. package/components/toggle-scheme/toggle-scheme.yaml +173 -0
  294. package/components/toolbar/class.js +388 -0
  295. package/components/toolbar/toolbar.d.ts +23 -0
  296. package/components/toolbar/toolbar.js +10 -376
  297. package/components/tooltip/class.js +299 -0
  298. package/components/tooltip/tooltip.d.ts +27 -0
  299. package/components/tooltip/tooltip.js +8 -280
  300. package/components/tree/class.js +245 -0
  301. package/components/tree/tree.d.ts +15 -0
  302. package/components/tree/tree.js +9 -244
  303. package/components/upload/class.js +199 -0
  304. package/components/upload/upload.d.ts +27 -0
  305. package/components/upload/upload.js +11 -183
  306. package/core/element.d.ts +174 -0
  307. package/core/form.d.ts +108 -0
  308. package/core/index.d.ts +11 -0
  309. package/core/index.js +1 -0
  310. package/core/register.d.ts +25 -0
  311. package/core/register.js +58 -0
  312. package/core/signals.d.ts +94 -0
  313. package/core/template.d.ts +70 -0
  314. package/index.d.ts +315 -0
  315. package/package.json +25 -6
  316. package/traits/CATEGORIES.md +1 -1
@@ -1,503 +1,17 @@
1
1
  /**
2
- * <agent-reasoning-ui>Agent inner monologue + pipeline viewer.
2
+ * `<agent-reasoning-ui>`auto-registers the tag on import.
3
3
  *
4
- * Unified chain-of-thought surface. Composes <timeline-ui size="sm"> for step
5
- * rendering and adds plan / thought / iteration interstitials. Auto-collapses
6
- * after finish.
4
+ * For non-side-effect class import (test isolation, tag override), use
5
+ * the `class` subpath:
7
6
  *
8
- * - STEPS → timeline-ui size="sm" rows (completed / active+spinner / error)
9
- * - THOUGHTS → free-form monologue paragraphs
10
- * - PLAN → ordered up-front list in a subtle panel
11
- * - ITERATION → attempt N blocks, each with its own sub-timeline
7
+ * import { UIAgentReasoning } from '@adia-ai/web-components/components/agent-reasoning/class';
12
8
  *
13
- * JS API:
14
- * const r = document.createElement('agent-reasoning-ui');
15
- *
16
- * r.setPlan(['Read intent', 'Search patterns', 'Synthesize output']);
17
- * r.addThought('The request matches the "product card" pattern.');
18
- *
19
- * r.addStep({ id: 'search', label: 'search: Finding patterns…' });
20
- * r.updateStep('search', { outcomes: ['3 candidates ranked'] });
21
- * r.completeStep('search', 1200);
22
- *
23
- * r.startIteration(1, 'First attempt');
24
- * r.addStep({ id: 'gen', label: 'generate' });
25
- * r.completeStep('gen', 3000);
26
- * r.endIteration(1, { status: 'error', summary: 'validation 62/100' });
27
- *
28
- * r.startIteration(2, 'Retry with hint');
29
- * r.addStep({ id: 'gen2', label: 'generate (retry)' });
30
- * r.completeStep('gen2', 2500);
31
- * r.endIteration(2, { status: 'done', summary: 'validation 94/100' });
32
- *
33
- * r.finish('2 iterations · 94/100 · 7s');
34
- *
35
- * Attributes:
36
- * collapsed — start collapsed
37
- * no-autocollapse — disable auto-collapse 1.2s after finish (default: false — auto-collapse on)
38
- * heading — fallback summary label while active
39
- * status — 'idle' | 'active' | 'done' | 'error' (default: 'active')
40
- * Drives the status icon: spinner / check-circle / warning-circle
41
- *
42
- * Events:
43
- * reasoning-toggle — summary expanded/collapsed (detail: { collapsed })
44
- * reasoning-step-toggle — a step's outcomes were toggled (detail: { stepId })
45
- * reasoning-finish — .finish() was called (detail: { summary, status })
9
+ * @see ../../USAGE.md#registration--auto-vs-explicit
46
10
  */
47
11
 
48
- import { UIElement } from '../../core/element.js';
49
-
50
- // Status lifecycle for the reasoning surface as a whole.
51
- // active — still thinking (default; renders the spinner)
52
- // done — finished successfully (renders check-circle)
53
- // error — finished with failure (renders warning)
54
- // idle — not started (renders muted dot)
55
- const REASONING_STATUSES = new Set(['idle', 'active', 'done', 'error']);
56
-
57
- class UIAgentReasoning extends UIElement {
58
- static properties = {
59
- collapsed: { type: Boolean, default: false, reflect: true },
60
- noAutocollapse: { type: Boolean, default: false, reflect: true, attribute: 'no-autocollapse' },
61
- heading: { type: String, default: '', reflect: true },
62
- status: { type: String, default: 'active', reflect: true },
63
- };
64
-
65
- static template = () => null;
66
-
67
- // Flat entries list; each is one of:
68
- // { kind: 'step', id, label, status, duration, outcomes, children }
69
- // { kind: 'thought', id, text }
70
- // { kind: 'plan', id, items: string[] }
71
- // { kind: 'iteration', id, n, label, status, summary, steps: step[] }
72
- #entries = [];
73
- #iterationStack = [];
74
- #startTime = Date.now();
75
- #timerInterval = null;
76
- #finishTimer = null;
77
- #summaryEl = null;
78
- #bodyEl = null;
79
- #bound = false;
80
-
81
- get entries() { return this.#entries; }
82
-
83
- connected() {
84
- if (this.#bound) return;
85
- this.#bound = true;
86
- this.#startTime = Date.now();
87
- this.#timerInterval = setInterval(() => this.#tickTimers(), 1000);
88
- this.#buildShell();
89
- }
90
-
91
- // Single delegated handler for every nested timeline-item's toggle event.
92
- // Each step element carries its id on dataset.stepId so the handler can
93
- // resolve which step fired without per-item closures.
94
- #onStepToggle = (e) => {
95
- const item = e.target.closest('timeline-item-ui[data-step-id]');
96
- if (!item || !this.#bodyEl?.contains(item)) return;
97
- this.dispatchEvent(new CustomEvent('reasoning-step-toggle', {
98
- bubbles: true, detail: { stepId: item.dataset.stepId },
99
- }));
100
- };
101
-
102
- disconnected() {
103
- if (this.#timerInterval != null) {
104
- clearInterval(this.#timerInterval);
105
- this.#timerInterval = null;
106
- }
107
- if (this.#finishTimer != null) {
108
- clearTimeout(this.#finishTimer);
109
- this.#finishTimer = null;
110
- }
111
- this.#summaryEl?.removeEventListener('click', this.#onSummaryClick);
112
- this.#summaryEl?.removeEventListener('keydown', this.#onSummaryKey);
113
- this.#bodyEl?.removeEventListener('timeline-toggle', this.#onStepToggle);
114
- this.#summaryEl = null;
115
- this.#bodyEl = null;
116
- this.#bound = false;
117
- }
118
-
119
- // ── Public API ──
120
-
121
- addStep(step) {
122
- const entry = {
123
- kind: 'step',
124
- status: 'active',
125
- duration: null,
126
- outcomes: [],
127
- children: [],
128
- ...step,
129
- };
130
- this.#appendToCurrentScope(entry);
131
- this.#render();
132
- return entry;
133
- }
134
-
135
- updateStep(id, updates) {
136
- const step = this.#findStep(id);
137
- if (!step) return;
138
- Object.assign(step, updates);
139
- this.#render();
140
- }
141
-
142
- completeStep(id, duration) {
143
- const step = this.#findStep(id);
144
- if (!step) return;
145
- step.status = 'done';
146
- if (duration != null) step.duration = duration;
147
- this.#render();
148
- }
149
-
150
- failStep(id, error) {
151
- const step = this.#findStep(id);
152
- if (!step) return;
153
- step.status = 'error';
154
- if (error) step.outcomes = [...(step.outcomes || []), String(error)];
155
- this.#render();
156
- }
157
-
158
- addThought(text, id = `thought-${this.#entries.length}`) {
159
- this.#appendToCurrentScope({ kind: 'thought', id, text });
160
- this.#render();
161
- }
162
-
163
- setPlan(items, id = 'plan') {
164
- const existing = this.#entries.find(e => e.kind === 'plan' && e.id === id);
165
- if (existing) existing.items = items.slice();
166
- else this.#entries.push({ kind: 'plan', id, items: items.slice() });
167
- this.#render();
168
- }
169
-
170
- startIteration(n, label = `Attempt ${n}`, id = `iter-${n}`) {
171
- const iter = {
172
- kind: 'iteration',
173
- id, n, label,
174
- status: 'active',
175
- summary: '',
176
- steps: [],
177
- };
178
- this.#entries.push(iter);
179
- this.#iterationStack.push(id);
180
- this.#render();
181
- return iter;
182
- }
183
-
184
- endIteration(n, { status = 'done', summary = '' } = {}) {
185
- const id = `iter-${n}`;
186
- const iter = this.#entries.find(e => e.kind === 'iteration' && e.id === id);
187
- if (!iter) return;
188
- iter.status = status;
189
- iter.summary = summary;
190
- const idx = this.#iterationStack.lastIndexOf(id);
191
- if (idx >= 0) this.#iterationStack.splice(idx, 1);
192
- this.#render();
193
- }
194
-
195
- finish(summaryLabel, { status = 'done' } = {}) {
196
- const resolved = REASONING_STATUSES.has(status) ? status : 'done';
197
- const isError = resolved === 'error';
198
- for (const entry of this.#entries) {
199
- if (entry.kind === 'step' && entry.status === 'active') {
200
- entry.status = isError ? 'error' : 'done';
201
- }
202
- if (entry.kind === 'iteration') {
203
- if (entry.status === 'active') entry.status = isError ? 'error' : 'done';
204
- for (const s of entry.steps || []) {
205
- if (s.status === 'active') s.status = isError ? 'error' : 'done';
206
- }
207
- }
208
- }
209
- if (this.#timerInterval != null) {
210
- clearInterval(this.#timerInterval);
211
- this.#timerInterval = null;
212
- }
213
- this.status = resolved;
214
- if (summaryLabel) this.dataset.summary = summaryLabel;
215
- this.#render();
216
- this.dispatchEvent(new CustomEvent('reasoning-finish', {
217
- bubbles: true,
218
- detail: { summary: summaryLabel || '', status: resolved },
219
- }));
220
-
221
- if (this.#finishTimer != null) clearTimeout(this.#finishTimer);
222
- if (!this.noAutocollapse && !isError) {
223
- this.#finishTimer = setTimeout(() => {
224
- this.#finishTimer = null;
225
- this.collapsed = true;
226
- this.#render();
227
- }, 1200);
228
- }
229
- }
230
-
231
- fail(summaryLabel) {
232
- this.finish(summaryLabel, { status: 'error' });
233
- }
234
-
235
- // ── Private ──
236
-
237
- #appendToCurrentScope(entry) {
238
- if (this.#iterationStack.length > 0) {
239
- const topId = this.#iterationStack[this.#iterationStack.length - 1];
240
- const iter = this.#entries.find(e => e.kind === 'iteration' && e.id === topId);
241
- if (iter) {
242
- if (entry.kind === 'step') iter.steps.push(entry);
243
- else this.#entries.push(entry);
244
- return;
245
- }
246
- }
247
- this.#entries.push(entry);
248
- }
249
-
250
- #findStep(id) {
251
- for (const e of this.#entries) {
252
- if (e.kind === 'step' && e.id === id) return e;
253
- if (e.kind === 'iteration') {
254
- for (const s of e.steps || []) if (s.id === id) return s;
255
- }
256
- }
257
- return null;
258
- }
259
-
260
- #onSummaryClick = () => {
261
- this.collapsed = !this.collapsed;
262
- this.dispatchEvent(new CustomEvent('reasoning-toggle', {
263
- bubbles: true,
264
- detail: { collapsed: this.collapsed },
265
- }));
266
- this.#render();
267
- };
268
-
269
- // Keyboard activation — Space/Enter toggle (matches role="button" semantics).
270
- #onSummaryKey = (e) => {
271
- if (e.key === ' ' || e.key === 'Enter') {
272
- e.preventDefault();
273
- this.#onSummaryClick();
274
- }
275
- };
276
-
277
- #buildShell() {
278
- this.innerHTML = '';
279
-
280
- // Summary is a click-to-toggle row; mark up + key-activate so it
281
- // behaves like a button under keyboard nav too.
282
- this.#summaryEl = document.createElement('div');
283
- this.#summaryEl.setAttribute('data-reasoning-summary', '');
284
- this.#summaryEl.setAttribute('role', 'button');
285
- this.#summaryEl.setAttribute('tabindex', '0');
286
- this.#summaryEl.setAttribute('aria-expanded', String(!this.collapsed));
287
- this.#summaryEl.addEventListener('click', this.#onSummaryClick);
288
- this.#summaryEl.addEventListener('keydown', this.#onSummaryKey);
289
- this.appendChild(this.#summaryEl);
290
-
291
- this.#bodyEl = document.createElement('div');
292
- this.#bodyEl.setAttribute('data-reasoning-body', '');
293
- this.#bodyEl.addEventListener('timeline-toggle', this.#onStepToggle);
294
- this.appendChild(this.#bodyEl);
295
-
296
- this.#render();
297
- }
298
-
299
- #activeLabel() {
300
- for (let i = this.#entries.length - 1; i >= 0; i--) {
301
- const e = this.#entries[i];
302
- if (e.kind === 'step' && e.status === 'active') return e.label;
303
- if (e.kind === 'iteration') {
304
- for (let j = (e.steps || []).length - 1; j >= 0; j--) {
305
- const s = e.steps[j];
306
- if (s.status === 'active') return s.label;
307
- }
308
- }
309
- if (e.kind === 'thought') return e.text;
310
- }
311
- const lastStep = this.#entries.findLast?.(e => e.kind === 'step');
312
- return lastStep?.label || this.heading || 'Thinking…';
313
- }
314
-
315
- #renderStatusIcon(status) {
316
- switch (status) {
317
- case 'done':
318
- return '<icon-ui name="check-circle" color="success" data-reasoning-check></icon-ui>';
319
- case 'error':
320
- return '<icon-ui name="warning-circle" color="danger" data-reasoning-check data-error></icon-ui>';
321
- case 'idle':
322
- return '<icon-ui name="circle" color="muted" data-reasoning-check data-idle></icon-ui>';
323
- case 'active':
324
- default:
325
- return '<span data-reasoning-spinner></span>';
326
- }
327
- }
328
-
329
- #countSteps() {
330
- let total = 0, done = 0;
331
- const tally = (s) => { total++; if (s.status === 'done') done++; };
332
- for (const e of this.#entries) {
333
- if (e.kind === 'step') tally(e);
334
- if (e.kind === 'iteration') for (const s of e.steps || []) tally(s);
335
- }
336
- return { total, done };
337
- }
338
-
339
- #render() {
340
- if (!this.#summaryEl) return;
341
-
342
- const status = REASONING_STATUSES.has(this.status) ? this.status : 'active';
343
- const isFinal = status === 'done' || status === 'error';
344
- const { total, done } = this.#countSteps();
345
- const elapsed = Math.round((Date.now() - this.#startTime) / 1000);
346
- const label = isFinal && this.dataset.summary ? this.dataset.summary : this.#activeLabel();
347
-
348
- this.#summaryEl.innerHTML = `
349
- ${this.#renderStatusIcon(status)}
350
- <span data-reasoning-label>${escapeText(label)}</span>
351
- <span data-reasoning-meta>
352
- ${total ? `<span data-reasoning-counter>${done}/${total}</span>` : ''}
353
- <span data-reasoning-time>${elapsed}s</span>
354
- <icon-ui name="${this.collapsed ? 'caret-right' : 'caret-up'}" color="muted" data-reasoning-chevron></icon-ui>
355
- </span>
356
- `;
357
-
358
- this.#bodyEl.hidden = this.collapsed;
359
- this.#summaryEl.setAttribute('aria-expanded', String(!this.collapsed));
360
- if (this.collapsed) return;
361
-
362
- // Body rendering: we group contiguous steps into timeline-ui blocks and
363
- // render plan/thought/iteration as sibling nodes between them. Keeping
364
- // steps contiguous preserves timeline-ui's connector line.
365
- this.#bodyEl.innerHTML = '';
366
- let currentTimeline = null;
367
- for (const entry of this.#entries) {
368
- if (entry.kind === 'step') {
369
- if (!currentTimeline) {
370
- currentTimeline = this.#makeTimeline();
371
- this.#bodyEl.appendChild(currentTimeline);
372
- }
373
- currentTimeline.appendChild(this.#makeStepItem(entry));
374
- } else {
375
- currentTimeline = null;
376
- this.#bodyEl.appendChild(this.#renderNonStep(entry));
377
- }
378
- }
379
- }
380
-
381
- #makeTimeline() {
382
- const tl = document.createElement('timeline-ui');
383
- tl.setAttribute('size', 'sm');
384
- return tl;
385
- }
386
-
387
- #makeStepItem(step) {
388
- const item = document.createElement('timeline-item-ui');
389
- item.setAttribute('text', step.label || '');
390
- // Map step.status → canonical timeline-item-ui [status] enum.
391
- // The legacy [completed]/[active]/[error] Booleans were removed
392
- // in the Phase 6 cut (2026-04-27); only [status] is honoured.
393
- if (step.status === 'done') item.setAttribute('status', 'completed');
394
- if (step.status === 'error') item.setAttribute('status', 'error');
395
- if (step.status === 'active') { item.setAttribute('status', 'active'); item.setAttribute('spinner', ''); }
396
-
397
- const duration = step.durationLabel
398
- || (step.duration != null ? formatDuration(step.duration) : '');
399
- if (duration) item.setAttribute('duration', duration);
400
-
401
- if (step.outcomes?.length) item.outcomes = step.outcomes;
402
-
403
- // Step id stamped on dataset so the parent's delegated #onStepToggle
404
- // listener (wired in #buildShell) can resolve which step fired.
405
- item.dataset.stepId = step.id || '';
406
- return item;
407
- }
408
-
409
- #renderNonStep(entry) {
410
- switch (entry.kind) {
411
- case 'thought': return this.#renderThought(entry);
412
- case 'plan': return this.#renderPlan(entry);
413
- case 'iteration': return this.#renderIteration(entry);
414
- default: return document.createTextNode('');
415
- }
416
- }
417
-
418
- #renderThought(entry) {
419
- const el = document.createElement('div');
420
- el.setAttribute('data-reasoning-thought', '');
421
- const text = document.createElement('span');
422
- text.setAttribute('data-reasoning-thought-text', '');
423
- text.textContent = entry.text || '';
424
- el.appendChild(text);
425
- return el;
426
- }
427
-
428
- #renderPlan(entry) {
429
- const el = document.createElement('div');
430
- el.setAttribute('data-reasoning-plan', '');
431
- const label = document.createElement('div');
432
- label.setAttribute('data-reasoning-plan-label', '');
433
- label.textContent = 'Plan';
434
- el.appendChild(label);
435
- const list = document.createElement('ol');
436
- list.setAttribute('data-reasoning-plan-list', '');
437
- for (const item of (entry.items || [])) {
438
- const li = document.createElement('li');
439
- li.textContent = item;
440
- list.appendChild(li);
441
- }
442
- el.appendChild(list);
443
- return el;
444
- }
445
-
446
- #renderIteration(entry) {
447
- const el = document.createElement('div');
448
- el.setAttribute('data-reasoning-iteration', '');
449
- if (entry.status === 'active') el.setAttribute('data-active', '');
450
- if (entry.status === 'done') el.setAttribute('data-done', '');
451
- if (entry.status === 'error') el.setAttribute('data-error', '');
452
-
453
- const header = document.createElement('div');
454
- header.setAttribute('data-reasoning-iter-header', '');
455
- const statusIcon = entry.status === 'done'
456
- ? '<icon-ui name="check-circle" color="success" size="sm"></icon-ui>'
457
- : entry.status === 'error'
458
- ? '<icon-ui name="warning" color="danger" size="sm"></icon-ui>'
459
- : '<span data-reasoning-spinner data-small></span>';
460
- header.innerHTML = `
461
- ${statusIcon}
462
- <span data-reasoning-iter-n>#${entry.n}</span>
463
- <span data-reasoning-iter-label>${escapeText(entry.label || '')}</span>
464
- ${entry.summary ? `<span data-reasoning-iter-summary>${escapeText(entry.summary)}</span>` : ''}
465
- `;
466
- el.appendChild(header);
467
-
468
- if (entry.steps?.length) {
469
- const tl = this.#makeTimeline();
470
- for (const s of entry.steps) tl.appendChild(this.#makeStepItem(s));
471
- el.appendChild(tl);
472
- }
473
- return el;
474
- }
475
-
476
- #tickTimers() {
477
- if (this.status === 'done' || this.status === 'error') return;
478
- const elapsed = Math.round((Date.now() - this.#startTime) / 1000);
479
- const timeEl = this.#summaryEl?.querySelector('[data-reasoning-time]');
480
- if (timeEl) timeEl.textContent = elapsed + 's';
481
-
482
- // Live-update active step durations inside nested timeline-item-ui
483
- const elapsedLabel = elapsed + 's';
484
- for (const item of this.querySelectorAll('timeline-item-ui[active]:not([completed])')) {
485
- // Only mirror the ticking label; do not stomp a durationLabel author set
486
- if (!item.dataset._frozenDuration) {
487
- item.setAttribute('duration', elapsedLabel);
488
- }
489
- }
490
- }
491
- }
492
-
493
- function escapeText(s) {
494
- return String(s).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
495
- }
12
+ import { defineIfFree } from '../../core/register.js';
13
+ import { UIAgentReasoning } from './class.js';
496
14
 
497
- function formatDuration(ms) {
498
- if (ms < 1000) return ms + 'ms';
499
- return Math.round(ms / 1000) + 's';
500
- }
15
+ defineIfFree('agent-reasoning-ui', UIAgentReasoning);
501
16
 
502
- customElements.define('agent-reasoning-ui', UIAgentReasoning);
503
17
  export { UIAgentReasoning };