@tylertech/forge-ai 0.5.0 → 0.6.1

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 (89) hide show
  1. package/custom-elements.json +1329 -579
  2. package/dist/ai-artifact/ai-artifact.scss.mjs +1 -1
  3. package/dist/ai-attachment/ai-attachment.d.ts +4 -4
  4. package/dist/ai-chat-header/ai-chat-header.d.ts +4 -0
  5. package/dist/ai-chat-header/ai-chat-header.mjs +6 -0
  6. package/dist/ai-chat-header/ai-chat-header.scss.mjs +1 -1
  7. package/dist/ai-chatbot/ag-ui-adapter.mjs +34 -25
  8. package/dist/ai-chatbot/agent-adapter.d.ts +16 -8
  9. package/dist/ai-chatbot/agent-adapter.mjs +16 -16
  10. package/dist/ai-chatbot/agent-runner.mjs +3 -3
  11. package/dist/ai-chatbot/ai-chatbot-tool-call.d.ts +5 -2
  12. package/dist/ai-chatbot/ai-chatbot-tool-call.mjs +68 -5
  13. package/dist/ai-chatbot/ai-chatbot-tool-call.scss.mjs +1 -1
  14. package/dist/ai-chatbot/ai-chatbot.d.ts +1 -0
  15. package/dist/ai-chatbot/ai-chatbot.mjs +84 -23
  16. package/dist/ai-chatbot/create-tool-renderer.d.ts +1 -4
  17. package/dist/ai-chatbot/create-tool-renderer.mjs +1 -13
  18. package/dist/ai-chatbot/index.d.ts +1 -1
  19. package/dist/ai-chatbot/message-state-controller.d.ts +10 -6
  20. package/dist/ai-chatbot/message-state-controller.mjs +95 -6
  21. package/dist/ai-chatbot/types.d.ts +91 -2
  22. package/dist/ai-chatbot/utils.d.ts +2 -2
  23. package/dist/ai-chatbot/utils.mjs +3 -2
  24. package/dist/ai-dropdown-menu/ai-dropdown-menu-item.d.ts +1 -3
  25. package/dist/ai-dropdown-menu/ai-dropdown-menu-item.scss.mjs +1 -1
  26. package/dist/ai-dropdown-menu/ai-dropdown-menu.d.ts +5 -6
  27. package/dist/ai-dropdown-menu/ai-dropdown-menu.mjs +7 -1
  28. package/dist/ai-dropdown-menu/ai-dropdown-menu.scss.mjs +1 -1
  29. package/dist/ai-dropdown-menu/selection-manager.mjs +3 -3
  30. package/dist/ai-embedded-chat/ai-embedded-chat.mjs +1 -0
  31. package/dist/ai-empty-state/ai-empty-state.scss.mjs +1 -1
  32. package/dist/ai-event-stream-viewer/ai-event-stream-viewer.d.ts +19 -0
  33. package/dist/ai-event-stream-viewer/ai-event-stream-viewer.mjs +164 -0
  34. package/dist/ai-event-stream-viewer/ai-event-stream-viewer.scss.mjs +4 -0
  35. package/dist/ai-event-stream-viewer/index.d.ts +1 -0
  36. package/dist/ai-event-stream-viewer/index.mjs +5 -0
  37. package/dist/ai-file-picker/ai-file-picker.d.ts +0 -13
  38. package/dist/ai-gradient-container/ai-gradient-container.scss.mjs +1 -1
  39. package/dist/ai-icon/ai-icon.scss.mjs +1 -1
  40. package/dist/ai-icon-button/ai-icon-button.d.ts +19 -0
  41. package/dist/ai-icon-button/ai-icon-button.mjs +63 -0
  42. package/dist/ai-icon-button/ai-icon-button.scss.mjs +4 -0
  43. package/dist/ai-icon-button/index.d.ts +1 -0
  44. package/dist/ai-icon-button/index.mjs +5 -0
  45. package/dist/ai-message-thread/ai-message-thread.d.ts +3 -2
  46. package/dist/ai-message-thread/ai-message-thread.mjs +23 -9
  47. package/dist/ai-prompt/ai-prompt.d.ts +21 -0
  48. package/dist/ai-prompt/ai-prompt.mjs +133 -10
  49. package/dist/ai-prompt/ai-prompt.scss.mjs +1 -1
  50. package/dist/ai-response-message/ai-response-message.d.ts +5 -0
  51. package/dist/ai-response-message/ai-response-message.mjs +61 -3
  52. package/dist/ai-response-message/ai-response-message.scss.mjs +1 -1
  53. package/dist/ai-slash-command-menu/ai-slash-command-menu.d.ts +33 -0
  54. package/dist/ai-slash-command-menu/ai-slash-command-menu.mjs +200 -0
  55. package/dist/ai-slash-command-menu/ai-slash-command-menu.scss.mjs +4 -0
  56. package/dist/ai-slash-command-menu/index.d.ts +1 -0
  57. package/dist/ai-slash-command-menu/index.mjs +5 -0
  58. package/dist/ai-spinner/ai-spinner.d.ts +2 -2
  59. package/dist/ai-suggestions/ai-suggestions.d.ts +2 -0
  60. package/dist/ai-suggestions/ai-suggestions.scss.mjs +1 -1
  61. package/dist/ai-thinking-indicator/ai-thinking-indicator.d.ts +3 -0
  62. package/dist/ai-thinking-indicator/ai-thinking-indicator.mjs +24 -15
  63. package/dist/ai-thinking-indicator/ai-thinking-indicator.scss.mjs +14 -11
  64. package/dist/core/overlay/index.d.ts +1 -1
  65. package/dist/core/overlay/overlay.d.ts +10 -5
  66. package/dist/core/overlay/overlay.mjs +7 -2
  67. package/dist/core/popover/index.d.ts +1 -1
  68. package/dist/core/popover/popover.d.ts +7 -6
  69. package/dist/core/popover/popover.mjs +5 -0
  70. package/dist/core/tooltip/tooltip.d.ts +2 -2
  71. package/dist/index.d.ts +2 -0
  72. package/dist/index.mjs +6 -0
  73. package/dist/tools/ai-data-table/ai-data-table-definition.d.ts +2 -0
  74. package/dist/tools/ai-data-table/ai-data-table-definition.mjs +43 -0
  75. package/dist/tools/ai-data-table/ai-data-table.d.ts +33 -0
  76. package/dist/tools/ai-data-table/ai-data-table.mjs +206 -0
  77. package/dist/tools/ai-data-table/ai-data-table.scss.mjs +4 -0
  78. package/dist/tools/ai-data-table/index.d.ts +2 -0
  79. package/dist/tools/ai-data-table/index.mjs +6 -0
  80. package/dist/tools/ai-paginator/ai-paginator.d.ts +17 -0
  81. package/dist/tools/ai-paginator/ai-paginator.mjs +110 -0
  82. package/dist/tools/ai-paginator/ai-paginator.scss.mjs +4 -0
  83. package/dist/tools/ai-paginator/index.d.ts +1 -0
  84. package/dist/tools/ai-paginator/index.mjs +4 -0
  85. package/dist/tools/index.d.ts +2 -0
  86. package/dist/tools/index.mjs +8 -0
  87. package/dist/utils/keyboard-navigation-controller.d.ts +13 -0
  88. package/dist/utils/keyboard-navigation-controller.mjs +71 -0
  89. package/package.json +15 -14
@@ -2,7 +2,9 @@ import { unsafeCSS, LitElement, html, nothing } from "lit";
2
2
  import { property, state, query, customElement } from "lit/decorators.js";
3
3
  import { createRef, ref } from "lit/directives/ref.js";
4
4
  import "../core/popover/popover.mjs";
5
- import "../ai-thinking-indicator/ai-thinking-indicator.mjs";
5
+ import "../ai-spinner/ai-spinner.mjs";
6
+ import "../ai-event-stream-viewer/ai-event-stream-viewer.mjs";
7
+ import "../core/tooltip/tooltip.mjs";
6
8
  import styles from "./ai-chatbot-tool-call.scss.mjs";
7
9
  var __defProp = Object.defineProperty;
8
10
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
@@ -22,24 +24,32 @@ var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read fr
22
24
  var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
23
25
  var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), member.set(obj, value), value);
24
26
  var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "access private method"), method);
25
- var _customRendererRef, _renderedElement, _AiChatbotToolCallComponent_instances, handleButtonClick_fn, handlePopoverToggle_fn, dispatchScrollRequest_fn, statusIcon_get, _infoIcon, customRenderer_get, popoverContent_get;
27
+ var _customRendererRef, _renderedElement, _AiChatbotToolCallComponent_instances, handleButtonClick_fn, handlePopoverToggle_fn, handleDebugClick_fn, handleDebugPopoverToggle_fn, dispatchScrollRequest_fn, statusIcon_get, _infoIcon, _debugIcon, customRenderer_get, debugButton_get, debugPopover_get, popoverContent_get;
26
28
  const AiChatbotToolCallComponentTagName = "forge-ai-chatbot-tool-call";
27
29
  let AiChatbotToolCallComponent = class extends LitElement {
28
30
  constructor() {
29
31
  super(...arguments);
30
32
  __privateAdd(this, _AiChatbotToolCallComponent_instances);
33
+ this.debugMode = false;
31
34
  this._popoverOpen = false;
35
+ this._debugPopoverOpen = false;
32
36
  __privateAdd(this, _customRendererRef, createRef());
33
37
  __privateAdd(this, _renderedElement);
34
38
  __privateAdd(this, _infoIcon, html`
35
39
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" height="24" width="24" fill="currentColor">
36
40
  <path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2m1 15h-2v-6h2zm0-8h-2V7h2z" />
37
41
  </svg>
42
+ `);
43
+ __privateAdd(this, _debugIcon, html`
44
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
45
+ <path
46
+ d="M14 12h-4v-2h4m0 6h-4v-2h4m6-6h-2.81a6 6 0 0 0-1.82-1.96L17 4.41 15.59 3l-2.17 2.17a6 6 0 0 0-2.83 0L8.41 3 7 4.41l1.62 1.63C7.88 6.55 7.26 7.22 6.81 8H4v2h2.09c-.05.33-.09.66-.09 1v1H4v2h2v1c0 .34.04.67.09 1H4v2h2.81c1.04 1.79 2.97 3 5.19 3s4.15-1.21 5.19-3H20v-2h-2.09c.05-.33.09-.66.09-1v-1h2v-2h-2v-1c0-.34-.04-.67-.09-1H20z" />
47
+ </svg>
38
48
  `);
39
49
  }
40
50
  updated(changedProperties) {
41
51
  super.updated(changedProperties);
42
- if (changedProperties.has("toolCall") || changedProperties.has("toolDefinition")) {
52
+ if (changedProperties.has("toolCall") || changedProperties.has("toolDefinition") || changedProperties.has("debugMode")) {
43
53
  const renderer = this.toolDefinition?.renderer;
44
54
  const container = __privateGet(this, _customRendererRef).value;
45
55
  if (container && this.toolCall.status === "complete") {
@@ -62,6 +72,9 @@ let AiChatbotToolCallComponent = class extends LitElement {
62
72
  }
63
73
  render() {
64
74
  const isComplete = this.toolCall.status === "complete";
75
+ if (!this.debugMode) {
76
+ return __privateGet(this, _AiChatbotToolCallComponent_instances, customRenderer_get);
77
+ }
65
78
  return html`
66
79
  <div class="tool-call">
67
80
  <span class="status-icon">${__privateGet(this, _AiChatbotToolCallComponent_instances, statusIcon_get)}</span>
@@ -75,6 +88,7 @@ let AiChatbotToolCallComponent = class extends LitElement {
75
88
  @click=${__privateMethod(this, _AiChatbotToolCallComponent_instances, handleButtonClick_fn)}>
76
89
  ${__privateGet(this, _infoIcon)}
77
90
  </button>
91
+ ${__privateGet(this, _AiChatbotToolCallComponent_instances, debugButton_get)}
78
92
  ` : nothing}
79
93
  </div>
80
94
  ${isComplete ? html`
@@ -87,7 +101,7 @@ let AiChatbotToolCallComponent = class extends LitElement {
87
101
  ${__privateGet(this, _AiChatbotToolCallComponent_instances, popoverContent_get)}
88
102
  </forge-ai-popover>
89
103
  ` : nothing}
90
- ${__privateGet(this, _AiChatbotToolCallComponent_instances, customRenderer_get)}
104
+ ${__privateGet(this, _AiChatbotToolCallComponent_instances, debugPopover_get)} ${__privateGet(this, _AiChatbotToolCallComponent_instances, customRenderer_get)}
91
105
  `;
92
106
  }
93
107
  };
@@ -100,6 +114,12 @@ handleButtonClick_fn = function(_evt) {
100
114
  handlePopoverToggle_fn = function(evt) {
101
115
  this._popoverOpen = evt.detail.newState === "open";
102
116
  };
117
+ handleDebugClick_fn = function() {
118
+ this._debugPopoverOpen = !this._debugPopoverOpen;
119
+ };
120
+ handleDebugPopoverToggle_fn = function(event) {
121
+ this._debugPopoverOpen = event.detail.open;
122
+ };
103
123
  dispatchScrollRequest_fn = function() {
104
124
  this.dispatchEvent(
105
125
  new CustomEvent("forge-ai-message-thread-scroll-request", {
@@ -112,7 +132,7 @@ statusIcon_get = function() {
112
132
  switch (this.toolCall.status) {
113
133
  case "pending":
114
134
  case "executing":
115
- return html`<forge-ai-thinking-indicator></forge-ai-thinking-indicator>`;
135
+ return html`<forge-ai-spinner size="small"></forge-ai-spinner>`;
116
136
  case "complete":
117
137
  return html`
118
138
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" height="24" width="24" fill="currentColor">
@@ -131,6 +151,7 @@ statusIcon_get = function() {
131
151
  }
132
152
  };
133
153
  _infoIcon = /* @__PURE__ */ new WeakMap();
154
+ _debugIcon = /* @__PURE__ */ new WeakMap();
134
155
  customRenderer_get = function() {
135
156
  const renderer = this.toolDefinition?.renderer;
136
157
  if (!renderer || this.toolCall.status !== "complete") {
@@ -141,6 +162,39 @@ customRenderer_get = function() {
141
162
  }
142
163
  return nothing;
143
164
  };
165
+ debugButton_get = function() {
166
+ const hasDebugData = this.debugMode && (this.toolCall.eventStream?.length ?? 0) > 0;
167
+ if (!hasDebugData) {
168
+ return nothing;
169
+ }
170
+ return html`
171
+ <button
172
+ id="debug-btn"
173
+ aria-label="View event stream"
174
+ class="forge-icon-button forge-icon-button--tonal forge-icon-button--small debug-button"
175
+ @click=${__privateMethod(this, _AiChatbotToolCallComponent_instances, handleDebugClick_fn)}>
176
+ ${__privateGet(this, _debugIcon)}
177
+ </button>
178
+ ${this._debugPopoverOpen ? html`<forge-ai-tooltip for="debug-btn" placement="bottom">Event Stream</forge-ai-tooltip>` : nothing}
179
+ `;
180
+ };
181
+ debugPopover_get = function() {
182
+ const hasDebugData = this.debugMode && this.toolCall.eventStream;
183
+ if (!hasDebugData) {
184
+ return nothing;
185
+ }
186
+ return html`
187
+ <forge-ai-popover
188
+ .anchor=${this._debugButton}
189
+ .open=${this._debugPopoverOpen}
190
+ id="debug-popover"
191
+ placement="right"
192
+ @forge-ai-popover-toggle=${__privateMethod(this, _AiChatbotToolCallComponent_instances, handleDebugPopoverToggle_fn)}>
193
+ <forge-ai-event-stream-viewer
194
+ .events=${this.toolCall.eventStream}></forge-ai-event-stream-viewer>
195
+ </forge-ai-popover>
196
+ `;
197
+ };
144
198
  popoverContent_get = function() {
145
199
  const hasArgs = Object.keys(this.toolCall.args).length > 0;
146
200
  const hasArgsBuffer = this.toolCall.argsBuffer && this.toolCall.argsBuffer.length > 0;
@@ -174,12 +228,21 @@ __decorateClass([
174
228
  __decorateClass([
175
229
  property({ attribute: false })
176
230
  ], AiChatbotToolCallComponent.prototype, "toolDefinition", 2);
231
+ __decorateClass([
232
+ property({ type: Boolean, attribute: "debug-mode" })
233
+ ], AiChatbotToolCallComponent.prototype, "debugMode", 2);
177
234
  __decorateClass([
178
235
  state()
179
236
  ], AiChatbotToolCallComponent.prototype, "_popoverOpen", 2);
237
+ __decorateClass([
238
+ state()
239
+ ], AiChatbotToolCallComponent.prototype, "_debugPopoverOpen", 2);
180
240
  __decorateClass([
181
241
  query(".info-button")
182
242
  ], AiChatbotToolCallComponent.prototype, "_infoButton", 2);
243
+ __decorateClass([
244
+ query("#debug-btn")
245
+ ], AiChatbotToolCallComponent.prototype, "_debugButton", 2);
183
246
  AiChatbotToolCallComponent = __decorateClass([
184
247
  customElement(AiChatbotToolCallComponentTagName)
185
248
  ], AiChatbotToolCallComponent);
@@ -1,4 +1,4 @@
1
- const styles = '/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/* prettier-ignore */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/* prettier-ignore */\n.forge-icon-button {\n --_icon-button-display: var(--forge-icon-button-display, inline-flex);\n --_icon-button-size: var(--forge-icon-button-size, 48px);\n --_icon-button-gap: var(--forge-icon-button-gap, 0);\n --_icon-button-icon-color: var(--forge-icon-button-icon-color, currentColor);\n --_icon-button-background-color: var(--forge-icon-button-background-color, none);\n --_icon-button-icon-size: var(--forge-icon-button-icon-size, calc(var(--forge-typography-font-size, 1rem) * 1.5));\n --_icon-button-cursor: var(--forge-icon-button-cursor, pointer);\n --_icon-button-padding: var(--forge-icon-button-padding, var(--forge-spacing-xxsmall, 4px));\n --_icon-button-border: var(--forge-icon-button-border, none);\n --_icon-button-shadow: var(--forge-icon-button-shadow, none);\n --_icon-button-transition-duration: var(--forge-icon-button-transition-duration, var(--forge-animation-duration-short3, 150ms));\n --_icon-button-transition-timing: var(--forge-icon-button-transition-timing, var(--forge-animation-easing-standard, cubic-bezier(0.2, 0, 0, 1)));\n --_icon-button-shape: var(--forge-icon-button-shape, calc(var(--forge-shape-full, 9999px) * var(--forge-shape-factor, 1)));\n --_icon-button-shape-start-start: var(--forge-icon-button-shape-start-start, var(--_icon-button-shape));\n --_icon-button-shape-start-end: var(--forge-icon-button-shape-start-end, var(--_icon-button-shape));\n --_icon-button-shape-end-start: var(--forge-icon-button-shape-end-start, var(--_icon-button-shape));\n --_icon-button-shape-end-end: var(--forge-icon-button-shape-end-end, var(--_icon-button-shape));\n --_icon-button-shape-squared: var(--forge-icon-button-shape-squared, calc(var(--forge-shape-medium, 4px) * var(--forge-shape-factor, 1)));\n --_icon-button-outlined-border-width: var(--forge-icon-button-outlined-border-width, 1px);\n --_icon-button-outlined-border-style: var(--forge-icon-button-outlined-border-style, solid);\n --_icon-button-outlined-border-color: var(--forge-icon-button-outlined-border-color, var(--_icon-button-icon-color));\n --_icon-button-tonal-icon-color: var(--forge-icon-button-tonal-icon-color, var(--forge-theme-on-primary-container, #222c62));\n --_icon-button-tonal-background-color: var(--forge-icon-button-tonal-background-color, var(--forge-theme-primary-container, #d1d5ed));\n --_icon-button-filled-icon-color: var(--forge-icon-button-filled-icon-color, var(--forge-theme-on-primary, #ffffff));\n --_icon-button-filled-background-color: var(--forge-icon-button-filled-background-color, var(--forge-theme-primary, #3f51b5));\n --_icon-button-raised-shadow: var(--forge-icon-button-raised-shadow, 0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12));\n --_icon-button-raised-hover-shadow: var(--forge-icon-button-raised-hover-shadow, 0px 2px 4px -1px rgba(0, 0, 0, 0.2), 0px 4px 5px 0px rgba(0, 0, 0, 0.14), 0px 1px 10px 0px rgba(0, 0, 0, 0.12));\n --_icon-button-raised-active-shadow: var(--forge-icon-button-raised-active-shadow, 0px 5px 5px -3px rgba(0, 0, 0, 0.2), 0px 8px 10px 1px rgba(0, 0, 0, 0.14), 0px 3px 14px 2px rgba(0, 0, 0, 0.12));\n --_icon-button-raised-disabled-shadow: var(--forge-icon-button-raised-disabled-shadow, none);\n --_icon-button-density-small-size: var(--forge-icon-button-density-small-size, 24px);\n --_icon-button-density-small-padding: var(--forge-icon-button-density-small-padding, var(--forge-spacing-xxxsmall, 2px));\n --_icon-button-density-small-icon-size: var(--forge-icon-button-density-small-icon-size, calc(var(--forge-typography-font-size, 1rem) * 1.125));\n --_icon-button-density-medium-size: var(--forge-icon-button-density-medium-size, 36px);\n --_icon-button-density-medium-padding: var(--forge-icon-button-density-medium-padding, var(--forge-spacing-xxsmall, 4px));\n --_icon-button-density-large-size: var(--forge-icon-button-density-large-size, var(--_icon-button-size));\n --_icon-button-toggle-on-background-color: var(--forge-icon-button-toggle-on-background-color, var(--forge-theme-primary-container, #d1d5ed));\n --_icon-button-toggle-on-icon-color: var(--forge-icon-button-toggle-on-icon-color, var(--forge-theme-primary, #3f51b5));\n --_icon-button-outlined-toggle-on-background-color: var(--forge-icon-button-outlined-toggle-on-background-color, var(--forge-theme-primary-container, #d1d5ed));\n --_icon-button-outlined-toggle-on-icon-color: var(--forge-icon-button-outlined-toggle-on-icon-color, var(--forge-theme-primary, #3f51b5));\n --_icon-button-tonal-toggle-background-color: var(--forge-icon-button-tonal-toggle-background-color, var(--forge-theme-surface-container-low, #ebebeb));\n --_icon-button-tonal-toggle-on-background-color: var(--forge-icon-button-tonal-toggle-on-background-color, var(--forge-theme-primary-container, #d1d5ed));\n --_icon-button-tonal-toggle-on-icon-color: var(--forge-icon-button-tonal-toggle-on-icon-color, var(--forge-theme-primary, #3f51b5));\n --_icon-button-filled-toggle-background-color: var(--forge-icon-button-filled-toggle-background-color, var(--forge-theme-surface-container-low, #ebebeb));\n --_icon-button-filled-toggle-icon-color: var(--forge-icon-button-filled-toggle-icon-color, var(--forge-theme-primary, #3f51b5));\n --_icon-button-filled-toggle-on-background-color: var(--forge-icon-button-filled-toggle-on-background-color, var(--forge-theme-primary, #3f51b5));\n --_icon-button-filled-toggle-on-icon-color: var(--forge-icon-button-filled-toggle-on-icon-color, var(--forge-theme-on-primary, #ffffff));\n --_icon-button-disabled-cursor: var(--forge-icon-button-disabled-cursor, not-allowed);\n --_icon-button-disabled-opacity: var(--forge-icon-button-disabled-opacity, 0.38);\n --_icon-button-popover-icon-padding: var(--forge-icon-button-popover-icon-padding, var(--forge-spacing-xsmall, 8px));\n --_icon-button-focus-indicator-color: var(--forge-icon-button-focus-indicator-color, var(--forge-theme-primary, #3f51b5));\n}\n\n.forge-icon-button {\n display: var(--_icon-button-display);\n position: relative;\n outline: none;\n -webkit-tap-highlight-color: transparent;\n position: relative;\n z-index: 0;\n display: var(--_icon-button-display);\n align-items: center;\n justify-content: center;\n gap: var(--_icon-button-gap);\n box-sizing: border-box;\n height: var(--_icon-button-density-large-size);\n min-width: var(--_icon-button-density-large-size);\n border: var(--_icon-button-border);\n border-start-start-radius: var(--_icon-button-shape-start-start);\n border-start-end-radius: var(--_icon-button-shape-start-end);\n border-end-start-radius: var(--_icon-button-shape-end-start);\n border-end-end-radius: var(--_icon-button-shape-end-end);\n padding: var(--_icon-button-padding);\n box-shadow: var(--_icon-button-shadow);\n color: var(--_icon-button-icon-color);\n background: var(--_icon-button-background-color);\n font-size: var(--_icon-button-icon-size);\n cursor: var(--_icon-button-cursor);\n user-select: none;\n transition-property: box-shadow, background;\n transition-duration: var(--_icon-button-transition-duration);\n transition-timing-function: var(--_icon-button-transition-timing);\n}\n\n.forge-icon-button img,\n.forge-icon-button svg {\n height: var(--_icon-button-icon-size);\n width: var(--_icon-button-icon-size);\n}\n\n.forge-icon-button svg {\n fill: currentColor;\n}\n\n.forge-icon-button:not(:disabled) {\n --_state-layer-display: var(--forge-state-layer-display, flex);\n --_state-layer-color: var(--forge-state-layer-color, var(--forge-theme-on-surface, #000000));\n --_state-layer-hover-color: var(--forge-state-layer-hover-color, var(--_state-layer-color));\n --_state-layer-hover-opacity: var(--forge-state-layer-hover-opacity, 0.08);\n --_state-layer-pressed-color: var(--forge-state-layer-pressed-color, var(--_state-layer-color));\n --_state-layer-pressed-opacity: var(--forge-state-layer-pressed-opacity, 0.12);\n --_state-layer-hover-duration: var(--forge-state-layer-hover-duration, 15ms);\n --_state-layer-pressed-duration: var(--forge-state-layer-pressed-duration, 105ms);\n --_state-layer-animation-duration: var(--forge-state-layer-animation-duration, 375ms);\n}\n\n.forge-icon-button:not(:disabled)::before {\n opacity: 0;\n position: absolute;\n backface-visibility: hidden;\n transform: translateZ(0);\n background-color: var(--_state-layer-hover-color);\n inset: 0;\n transition: opacity var(--_state-layer-hover-duration) linear, background-color var(--_state-layer-hover-duration) linear;\n --_state-layer-hover-duration: var(--forge-state-layer-hover-duration, 100ms);\n content: "";\n opacity: 0;\n border-radius: inherit;\n}\n\n.forge-icon-button:not(:disabled):hover::before {\n background-color: var(--_state-layer-hover-color);\n opacity: var(--_state-layer-hover-opacity);\n}\n\n.forge-icon-button:not(:disabled):active::before {\n opacity: var(--_state-layer-pressed-opacity);\n transition-duration: var(--_state-layer-pressed-duration);\n --_state-layer-pressed-opacity: var(--forge-state-layer-pressed-opacity, 0.18);\n}\n\n.forge-icon-button:not(:disabled) {\n --forge-state-layer-color: var(--_icon-button-icon-color);\n}\n\n@keyframes forge-focus-indicator-outward-grow {\n from {\n outline-width: 0;\n }\n to {\n outline-width: var(--_focus-indicator-active-width);\n }\n}\n@keyframes forge-focus-indicator-outward-shrink {\n from {\n outline-width: var(--_focus-indicator-active-width);\n }\n}\n@keyframes forge-focus-indicator-inward-grow {\n from {\n border-width: 0;\n }\n to {\n border-width: var(--_focus-indicator-active-width);\n }\n}\n@keyframes forge-focus-indicator-inward-shrink {\n from {\n border-width: var(--_focus-indicator-active-width);\n }\n}\n.forge-icon-button:not(:disabled) {\n outline: none;\n}\n\n.forge-icon-button:not(:disabled):focus-visible::after {\n --_focus-indicator-display: var(--forge-focus-indicator-display, flex);\n --_focus-indicator-width: var(--forge-focus-indicator-width, var(--forge-border-medium, 2px));\n --_focus-indicator-active-width: var(--forge-focus-indicator-active-width, 6px);\n --_focus-indicator-color: var(--forge-focus-indicator-color, var(--forge-theme-primary, #3f51b5));\n --_focus-indicator-shape: var(--forge-focus-indicator-shape, calc(var(--forge-shape-extra-small, 1px) * var(--forge-shape-factor, 1)));\n --_focus-indicator-duration: var(--forge-focus-indicator-duration, var(--forge-animation-duration-long4, 600ms));\n --_focus-indicator-easing: var(--forge-focus-indicator-easing, var(--forge-animation-easing-emphasized, cubic-bezier(0.2, 0, 0, 1)));\n --_focus-indicator-shape-start-start: var(--forge-focus-indicator-shape-start-start, var(--_focus-indicator-shape));\n --_focus-indicator-shape-start-end: var(--forge-focus-indicator-shape-start-end, var(--_focus-indicator-shape));\n --_focus-indicator-shape-end-end: var(--forge-focus-indicator-shape-end-end, var(--_focus-indicator-shape));\n --_focus-indicator-shape-end-start: var(--forge-focus-indicator-shape-end-start, var(--_focus-indicator-shape));\n --_focus-indicator-outward-offset: var(--forge-focus-indicator-outward-offset, var(--forge-spacing-xxsmall, 4px));\n --_focus-indicator-inward-offset: var(--forge-focus-indicator-inward-offset, 0px);\n --_focus-indicator-offset-block: var(--forge-focus-indicator-offset-block, 0);\n --_focus-indicator-offset-inline: var(--forge-focus-indicator-offset-inline, 0);\n}\n\n.forge-icon-button:not(:disabled):focus-visible::after {\n animation-delay: 0s, calc(var(--_focus-indicator-duration) * 0.25);\n animation-duration: calc(var(--_focus-indicator-duration) * 0.25), calc(var(--_focus-indicator-duration) * 0.75);\n animation-timing-function: var(--_focus-indicator-easing);\n box-sizing: border-box;\n color: var(--_focus-indicator-color);\n display: none;\n pointer-events: none;\n position: absolute;\n margin-block: var(--_focus-indicator-offset-block);\n margin-inline: var(--_focus-indicator-offset-inline);\n animation-name: forge-focus-indicator-outward-grow, forge-focus-indicator-outward-shrink;\n border-end-end-radius: calc(var(--_focus-indicator-shape-end-end) + var(--_focus-indicator-outward-offset));\n border-end-start-radius: calc(var(--_focus-indicator-shape-end-start) + var(--_focus-indicator-outward-offset));\n border-start-end-radius: calc(var(--_focus-indicator-shape-start-end) + var(--_focus-indicator-outward-offset));\n border-start-start-radius: calc(var(--_focus-indicator-shape-start-start) + var(--_focus-indicator-outward-offset));\n inset: calc(-1 * var(--_focus-indicator-outward-offset));\n outline: var(--_focus-indicator-width) solid currentColor;\n content: "";\n display: block;\n}\n\n.forge-icon-button:not(:disabled) {\n --forge-focus-indicator-color: var(--_icon-button-focus-indicator-color);\n --forge-focus-indicator-shape: var(--_icon-button-shape);\n}\n\n.forge-icon-button:not(:disabled):where(.forge-icon-button--text,\n:not(:where(.forge-icon-button--outlined, .forge-icon-button--tonal, .forge-icon-button--filled, .forge-icon-button--raised))) {\n --forge-focus-indicator-outward-offset: 0px;\n}\n\n.forge-icon-button--outlined {\n border-width: var(--_icon-button-outlined-border-width);\n border-style: var(--_icon-button-outlined-border-style);\n border-color: var(--_icon-button-outlined-border-color);\n}\n\n.forge-icon-button--tonal {\n --_icon-button-icon-color: var(--_icon-button-tonal-icon-color);\n --_icon-button-background-color: var(--_icon-button-tonal-background-color);\n}\n\n.forge-icon-button--filled, .forge-icon-button--raised {\n --_icon-button-icon-color: var(--_icon-button-filled-icon-color);\n --_icon-button-background-color: var(--_icon-button-filled-background-color);\n}\n\n.forge-icon-button--raised {\n --_icon-button-shadow: var(--_icon-button-raised-shadow);\n}\n\n.forge-icon-button--raised:hover {\n --_icon-button-raised-shadow: var(--_icon-button-raised-hover-shadow);\n}\n\n.forge-icon-button--raised:active {\n --_icon-button-raised-shadow: var(--_icon-button-raised-active-shadow);\n}\n\n.forge-icon-button--squared {\n --_icon-button-shape: var(--_icon-button-shape-squared);\n}\n\n.forge-icon-button--small {\n --_icon-button-size: var(--_icon-button-density-small-size);\n --_icon-button-icon-size: var(--_icon-button-density-small-icon-size);\n --_icon-button-padding: var(--_icon-button-density-small-padding);\n}\n\n.forge-icon-button--small > * {\n font-size: var(--_icon-button-density-small-icon-size);\n}\n\n.forge-icon-button--medium {\n --_icon-button-size: var(--_icon-button-density-medium-size);\n --_icon-button-padding: var(--_icon-button-density-medium-padding);\n}\n\n.forge-icon-button:disabled {\n pointer-events: none;\n opacity: var(--_icon-button-disabled-opacity);\n pointer-events: auto;\n cursor: not-allowed;\n}\n\n.forge-icon-button forge-circular-progress {\n --forge-circular-progress-indicator-color: var(--_icon-button-icon-color);\n --forge-circular-progress-track-color: transparent;\n --forge-circular-progress-size: 1em;\n}\n\n:host {\n display: block;\n}\n\n.tool-call {\n display: flex;\n align-items: center;\n gap: var(--forge-spacing-small, 12px);\n}\n\n.tool-name {\n -moz-osx-font-smoothing: grayscale;\n -webkit-font-smoothing: antialiased;\n font-family: var(--forge-typography-body1-font-family, var(--forge-typography-font-family, "Roboto", sans-serif));\n font-size: var(--forge-typography-body1-font-size, calc(var(--forge-typography-font-size, 1rem) * var(--forge-typography-body-font-size-scale, 0.875)));\n font-weight: var(--forge-typography-body1-font-weight, 400);\n line-height: var(--forge-typography-body1-line-height, calc(var(--forge-typography-font-size, 1rem) * var(--forge-typography-body-line-height-scale, 1.125)));\n letter-spacing: var(--forge-typography-body1-letter-spacing, 0.0357142857em);\n text-transform: var(--forge-typography-body1-text-transform, inherit);\n text-decoration: var(--forge-typography-body1-text-decoration, inherit);\n color: var(--forge-theme-text-medium, rgba(0, 0, 0, 0.6));\n}\n\n.status-icon {\n flex-shrink: 0;\n display: flex;\n align-items: center;\n color: var(--forge-theme-text-medium, rgba(0, 0, 0, 0.6));\n}\n\n.info-button {\n color: var(--forge-theme-text-medium, rgba(0, 0, 0, 0.6));\n}\n.info-button:hover {\n color: var(--forge-theme-text-high, rgba(0, 0, 0, 0.87));\n}\n\n.tool-details {\n display: grid;\n gap: var(--forge-spacing-medium, 16px);\n padding: var(--forge-spacing-medium, 16px);\n min-width: 300px;\n max-width: 500px;\n min-height: 100px;\n max-height: 400px;\n overflow-y: auto;\n}\n\n.tool-section {\n display: grid;\n gap: var(--forge-spacing-xsmall, 8px);\n}\n\n.section-label {\n -moz-osx-font-smoothing: grayscale;\n -webkit-font-smoothing: antialiased;\n font-family: var(--forge-typography-heading1-font-family, var(--forge-typography-font-family, "Roboto", sans-serif));\n font-size: var(--forge-typography-heading1-font-size, calc(var(--forge-typography-font-size, 1rem) * var(--forge-typography-heading1-font-size-scale, 0.875)));\n font-weight: var(--forge-typography-heading1-font-weight, 500);\n line-height: var(--forge-typography-heading1-line-height, calc(var(--forge-typography-font-size, 1rem) * var(--forge-typography-heading1-line-height-scale, 1.125)));\n letter-spacing: var(--forge-typography-heading1-letter-spacing, 0.0178571429em);\n text-transform: var(--forge-typography-heading1-text-transform, inherit);\n text-decoration: var(--forge-typography-heading1-text-decoration, inherit);\n}\n\n.code-block {\n background-color: var(--forge-theme-surface-container-minimum, #f5f5f5);\n color: var(--forge-theme-on-surface-container-minimum, #000000);\n padding: var(--forge-spacing-small, 12px);\n border-radius: calc(var(--forge-shape-medium, 4px) * var(--forge-shape-factor, 1));\n overflow-x: auto;\n margin: 0;\n font-family: monospace;\n font-size: 0.85em;\n white-space: pre-wrap;\n word-wrap: break-word;\n}';
1
+ const styles = '/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/* prettier-ignore */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/* prettier-ignore */\n.forge-icon-button {\n --_icon-button-display: var(--forge-icon-button-display, inline-flex);\n --_icon-button-size: var(--forge-icon-button-size, 48px);\n --_icon-button-gap: var(--forge-icon-button-gap, 0);\n --_icon-button-icon-color: var(--forge-icon-button-icon-color, currentColor);\n --_icon-button-background-color: var(--forge-icon-button-background-color, none);\n --_icon-button-icon-size: var(--forge-icon-button-icon-size, calc(var(--forge-typography-font-size, 1rem) * 1.5));\n --_icon-button-cursor: var(--forge-icon-button-cursor, pointer);\n --_icon-button-padding: var(--forge-icon-button-padding, var(--forge-spacing-xxsmall, 4px));\n --_icon-button-border: var(--forge-icon-button-border, none);\n --_icon-button-shadow: var(--forge-icon-button-shadow, none);\n --_icon-button-transition-duration: var(--forge-icon-button-transition-duration, var(--forge-animation-duration-short3, 150ms));\n --_icon-button-transition-timing: var(--forge-icon-button-transition-timing, var(--forge-animation-easing-standard, cubic-bezier(0.2, 0, 0, 1)));\n --_icon-button-shape: var(--forge-icon-button-shape, calc(var(--forge-shape-full, 9999px) * var(--forge-shape-factor, 1)));\n --_icon-button-shape-start-start: var(--forge-icon-button-shape-start-start, var(--_icon-button-shape));\n --_icon-button-shape-start-end: var(--forge-icon-button-shape-start-end, var(--_icon-button-shape));\n --_icon-button-shape-end-start: var(--forge-icon-button-shape-end-start, var(--_icon-button-shape));\n --_icon-button-shape-end-end: var(--forge-icon-button-shape-end-end, var(--_icon-button-shape));\n --_icon-button-shape-squared: var(--forge-icon-button-shape-squared, calc(var(--forge-shape-medium, 4px) * var(--forge-shape-factor, 1)));\n --_icon-button-outlined-border-width: var(--forge-icon-button-outlined-border-width, 1px);\n --_icon-button-outlined-border-style: var(--forge-icon-button-outlined-border-style, solid);\n --_icon-button-outlined-border-color: var(--forge-icon-button-outlined-border-color, var(--_icon-button-icon-color));\n --_icon-button-tonal-icon-color: var(--forge-icon-button-tonal-icon-color, var(--forge-theme-on-primary-container, #222c62));\n --_icon-button-tonal-background-color: var(--forge-icon-button-tonal-background-color, var(--forge-theme-primary-container, #d1d5ed));\n --_icon-button-filled-icon-color: var(--forge-icon-button-filled-icon-color, var(--forge-theme-on-primary, #ffffff));\n --_icon-button-filled-background-color: var(--forge-icon-button-filled-background-color, var(--forge-theme-primary, #3f51b5));\n --_icon-button-raised-shadow: var(--forge-icon-button-raised-shadow, 0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12));\n --_icon-button-raised-hover-shadow: var(--forge-icon-button-raised-hover-shadow, 0px 2px 4px -1px rgba(0, 0, 0, 0.2), 0px 4px 5px 0px rgba(0, 0, 0, 0.14), 0px 1px 10px 0px rgba(0, 0, 0, 0.12));\n --_icon-button-raised-active-shadow: var(--forge-icon-button-raised-active-shadow, 0px 5px 5px -3px rgba(0, 0, 0, 0.2), 0px 8px 10px 1px rgba(0, 0, 0, 0.14), 0px 3px 14px 2px rgba(0, 0, 0, 0.12));\n --_icon-button-raised-disabled-shadow: var(--forge-icon-button-raised-disabled-shadow, none);\n --_icon-button-density-small-size: var(--forge-icon-button-density-small-size, 24px);\n --_icon-button-density-small-padding: var(--forge-icon-button-density-small-padding, var(--forge-spacing-xxxsmall, 2px));\n --_icon-button-density-small-icon-size: var(--forge-icon-button-density-small-icon-size, calc(var(--forge-typography-font-size, 1rem) * 1.125));\n --_icon-button-density-medium-size: var(--forge-icon-button-density-medium-size, 36px);\n --_icon-button-density-medium-padding: var(--forge-icon-button-density-medium-padding, var(--forge-spacing-xxsmall, 4px));\n --_icon-button-density-large-size: var(--forge-icon-button-density-large-size, var(--_icon-button-size));\n --_icon-button-toggle-on-background-color: var(--forge-icon-button-toggle-on-background-color, var(--forge-theme-primary-container, #d1d5ed));\n --_icon-button-toggle-on-icon-color: var(--forge-icon-button-toggle-on-icon-color, var(--forge-theme-primary, #3f51b5));\n --_icon-button-outlined-toggle-on-background-color: var(--forge-icon-button-outlined-toggle-on-background-color, var(--forge-theme-primary-container, #d1d5ed));\n --_icon-button-outlined-toggle-on-icon-color: var(--forge-icon-button-outlined-toggle-on-icon-color, var(--forge-theme-primary, #3f51b5));\n --_icon-button-tonal-toggle-background-color: var(--forge-icon-button-tonal-toggle-background-color, var(--forge-theme-surface-container-low, #ebebeb));\n --_icon-button-tonal-toggle-on-background-color: var(--forge-icon-button-tonal-toggle-on-background-color, var(--forge-theme-primary-container, #d1d5ed));\n --_icon-button-tonal-toggle-on-icon-color: var(--forge-icon-button-tonal-toggle-on-icon-color, var(--forge-theme-primary, #3f51b5));\n --_icon-button-filled-toggle-background-color: var(--forge-icon-button-filled-toggle-background-color, var(--forge-theme-surface-container-low, #ebebeb));\n --_icon-button-filled-toggle-icon-color: var(--forge-icon-button-filled-toggle-icon-color, var(--forge-theme-primary, #3f51b5));\n --_icon-button-filled-toggle-on-background-color: var(--forge-icon-button-filled-toggle-on-background-color, var(--forge-theme-primary, #3f51b5));\n --_icon-button-filled-toggle-on-icon-color: var(--forge-icon-button-filled-toggle-on-icon-color, var(--forge-theme-on-primary, #ffffff));\n --_icon-button-disabled-cursor: var(--forge-icon-button-disabled-cursor, not-allowed);\n --_icon-button-disabled-opacity: var(--forge-icon-button-disabled-opacity, 0.38);\n --_icon-button-popover-icon-padding: var(--forge-icon-button-popover-icon-padding, var(--forge-spacing-xsmall, 8px));\n --_icon-button-focus-indicator-color: var(--forge-icon-button-focus-indicator-color, var(--forge-theme-primary, #3f51b5));\n}\n\n.forge-icon-button {\n display: var(--_icon-button-display);\n position: relative;\n outline: none;\n -webkit-tap-highlight-color: transparent;\n position: relative;\n z-index: 0;\n display: var(--_icon-button-display);\n align-items: center;\n justify-content: center;\n gap: var(--_icon-button-gap);\n box-sizing: border-box;\n height: var(--_icon-button-density-large-size);\n min-width: var(--_icon-button-density-large-size);\n border: var(--_icon-button-border);\n border-start-start-radius: var(--_icon-button-shape-start-start);\n border-start-end-radius: var(--_icon-button-shape-start-end);\n border-end-start-radius: var(--_icon-button-shape-end-start);\n border-end-end-radius: var(--_icon-button-shape-end-end);\n padding: var(--_icon-button-padding);\n box-shadow: var(--_icon-button-shadow);\n color: var(--_icon-button-icon-color);\n background: var(--_icon-button-background-color);\n font-size: var(--_icon-button-icon-size);\n cursor: var(--_icon-button-cursor);\n user-select: none;\n transition-property: box-shadow, background;\n transition-duration: var(--_icon-button-transition-duration);\n transition-timing-function: var(--_icon-button-transition-timing);\n}\n\n.forge-icon-button img,\n.forge-icon-button svg {\n height: var(--_icon-button-icon-size);\n width: var(--_icon-button-icon-size);\n}\n\n.forge-icon-button svg {\n fill: currentColor;\n}\n\n.forge-icon-button:not(:disabled) {\n --_state-layer-display: var(--forge-state-layer-display, flex);\n --_state-layer-color: var(--forge-state-layer-color, var(--forge-theme-on-surface, #000000));\n --_state-layer-hover-color: var(--forge-state-layer-hover-color, var(--_state-layer-color));\n --_state-layer-hover-opacity: var(--forge-state-layer-hover-opacity, 0.08);\n --_state-layer-pressed-color: var(--forge-state-layer-pressed-color, var(--_state-layer-color));\n --_state-layer-pressed-opacity: var(--forge-state-layer-pressed-opacity, 0.12);\n --_state-layer-hover-duration: var(--forge-state-layer-hover-duration, 15ms);\n --_state-layer-pressed-duration: var(--forge-state-layer-pressed-duration, 105ms);\n --_state-layer-animation-duration: var(--forge-state-layer-animation-duration, 375ms);\n}\n\n.forge-icon-button:not(:disabled)::before {\n opacity: 0;\n position: absolute;\n backface-visibility: hidden;\n transform: translateZ(0);\n background-color: var(--_state-layer-hover-color);\n inset: 0;\n transition: opacity var(--_state-layer-hover-duration) linear, background-color var(--_state-layer-hover-duration) linear;\n --_state-layer-hover-duration: var(--forge-state-layer-hover-duration, 100ms);\n content: "";\n opacity: 0;\n border-radius: inherit;\n}\n\n.forge-icon-button:not(:disabled):hover::before {\n background-color: var(--_state-layer-hover-color);\n opacity: var(--_state-layer-hover-opacity);\n}\n\n.forge-icon-button:not(:disabled):active::before {\n opacity: var(--_state-layer-pressed-opacity);\n transition-duration: var(--_state-layer-pressed-duration);\n --_state-layer-pressed-opacity: var(--forge-state-layer-pressed-opacity, 0.18);\n}\n\n.forge-icon-button:not(:disabled) {\n --forge-state-layer-color: var(--_icon-button-icon-color);\n}\n\n@keyframes forge-focus-indicator-outward-grow {\n from {\n outline-width: 0;\n }\n to {\n outline-width: var(--_focus-indicator-active-width);\n }\n}\n@keyframes forge-focus-indicator-outward-shrink {\n from {\n outline-width: var(--_focus-indicator-active-width);\n }\n}\n@keyframes forge-focus-indicator-inward-grow {\n from {\n border-width: 0;\n }\n to {\n border-width: var(--_focus-indicator-active-width);\n }\n}\n@keyframes forge-focus-indicator-inward-shrink {\n from {\n border-width: var(--_focus-indicator-active-width);\n }\n}\n.forge-icon-button:not(:disabled) {\n outline: none;\n}\n\n.forge-icon-button:not(:disabled):focus-visible::after {\n --_focus-indicator-display: var(--forge-focus-indicator-display, flex);\n --_focus-indicator-width: var(--forge-focus-indicator-width, var(--forge-border-medium, 2px));\n --_focus-indicator-active-width: var(--forge-focus-indicator-active-width, 6px);\n --_focus-indicator-color: var(--forge-focus-indicator-color, var(--forge-theme-primary, #3f51b5));\n --_focus-indicator-shape: var(--forge-focus-indicator-shape, calc(var(--forge-shape-extra-small, 1px) * var(--forge-shape-factor, 1)));\n --_focus-indicator-duration: var(--forge-focus-indicator-duration, var(--forge-animation-duration-long4, 600ms));\n --_focus-indicator-easing: var(--forge-focus-indicator-easing, var(--forge-animation-easing-emphasized, cubic-bezier(0.2, 0, 0, 1)));\n --_focus-indicator-shape-start-start: var(--forge-focus-indicator-shape-start-start, var(--_focus-indicator-shape));\n --_focus-indicator-shape-start-end: var(--forge-focus-indicator-shape-start-end, var(--_focus-indicator-shape));\n --_focus-indicator-shape-end-end: var(--forge-focus-indicator-shape-end-end, var(--_focus-indicator-shape));\n --_focus-indicator-shape-end-start: var(--forge-focus-indicator-shape-end-start, var(--_focus-indicator-shape));\n --_focus-indicator-outward-offset: var(--forge-focus-indicator-outward-offset, var(--forge-spacing-xxsmall, 4px));\n --_focus-indicator-inward-offset: var(--forge-focus-indicator-inward-offset, 0px);\n --_focus-indicator-offset-block: var(--forge-focus-indicator-offset-block, 0);\n --_focus-indicator-offset-inline: var(--forge-focus-indicator-offset-inline, 0);\n}\n\n.forge-icon-button:not(:disabled):focus-visible::after {\n animation-delay: 0s, calc(var(--_focus-indicator-duration) * 0.25);\n animation-duration: calc(var(--_focus-indicator-duration) * 0.25), calc(var(--_focus-indicator-duration) * 0.75);\n animation-timing-function: var(--_focus-indicator-easing);\n box-sizing: border-box;\n color: var(--_focus-indicator-color);\n display: none;\n pointer-events: none;\n position: absolute;\n margin-block: var(--_focus-indicator-offset-block);\n margin-inline: var(--_focus-indicator-offset-inline);\n animation-name: forge-focus-indicator-outward-grow, forge-focus-indicator-outward-shrink;\n border-end-end-radius: calc(var(--_focus-indicator-shape-end-end) + var(--_focus-indicator-outward-offset));\n border-end-start-radius: calc(var(--_focus-indicator-shape-end-start) + var(--_focus-indicator-outward-offset));\n border-start-end-radius: calc(var(--_focus-indicator-shape-start-end) + var(--_focus-indicator-outward-offset));\n border-start-start-radius: calc(var(--_focus-indicator-shape-start-start) + var(--_focus-indicator-outward-offset));\n inset: calc(-1 * var(--_focus-indicator-outward-offset));\n outline: var(--_focus-indicator-width) solid currentColor;\n content: "";\n display: block;\n}\n\n.forge-icon-button:not(:disabled) {\n --forge-focus-indicator-color: var(--_icon-button-focus-indicator-color);\n --forge-focus-indicator-shape: var(--_icon-button-shape);\n}\n\n.forge-icon-button:not(:disabled):where(.forge-icon-button--text,\n:not(:where(.forge-icon-button--outlined, .forge-icon-button--tonal, .forge-icon-button--filled, .forge-icon-button--raised))) {\n --forge-focus-indicator-outward-offset: 0px;\n}\n\n.forge-icon-button--outlined {\n border-width: var(--_icon-button-outlined-border-width);\n border-style: var(--_icon-button-outlined-border-style);\n border-color: var(--_icon-button-outlined-border-color);\n}\n\n.forge-icon-button--tonal {\n --_icon-button-icon-color: var(--_icon-button-tonal-icon-color);\n --_icon-button-background-color: var(--_icon-button-tonal-background-color);\n}\n\n.forge-icon-button--filled, .forge-icon-button--raised {\n --_icon-button-icon-color: var(--_icon-button-filled-icon-color);\n --_icon-button-background-color: var(--_icon-button-filled-background-color);\n}\n\n.forge-icon-button--raised {\n --_icon-button-shadow: var(--_icon-button-raised-shadow);\n}\n\n.forge-icon-button--raised:hover {\n --_icon-button-raised-shadow: var(--_icon-button-raised-hover-shadow);\n}\n\n.forge-icon-button--raised:active {\n --_icon-button-raised-shadow: var(--_icon-button-raised-active-shadow);\n}\n\n.forge-icon-button--squared {\n --_icon-button-shape: var(--_icon-button-shape-squared);\n}\n\n.forge-icon-button--small {\n --_icon-button-size: var(--_icon-button-density-small-size);\n --_icon-button-icon-size: var(--_icon-button-density-small-icon-size);\n --_icon-button-padding: var(--_icon-button-density-small-padding);\n}\n\n.forge-icon-button--small > * {\n font-size: var(--_icon-button-density-small-icon-size);\n}\n\n.forge-icon-button--medium {\n --_icon-button-size: var(--_icon-button-density-medium-size);\n --_icon-button-padding: var(--_icon-button-density-medium-padding);\n}\n\n.forge-icon-button:disabled {\n pointer-events: none;\n opacity: var(--_icon-button-disabled-opacity);\n pointer-events: auto;\n cursor: not-allowed;\n}\n\n.forge-icon-button forge-circular-progress {\n --forge-circular-progress-indicator-color: var(--_icon-button-icon-color);\n --forge-circular-progress-track-color: transparent;\n --forge-circular-progress-size: 1em;\n}\n\n:host {\n display: block;\n}\n\n.tool-call {\n display: flex;\n align-items: center;\n gap: var(--forge-spacing-small, 12px);\n margin-block-end: var(--forge-spacing-small, 12px);\n}\n\n.debug-button {\n color: var(--forge-theme-on-error-container-low, #5f0011);\n --forge-icon-button-focus-indicator-color: var(--forge-theme-error, #b00020);\n --forge-icon-button-tonal-background-color: var(--forge-theme-error-container-low, #f6e0e4);\n}\n\n.tool-name {\n -moz-osx-font-smoothing: grayscale;\n -webkit-font-smoothing: antialiased;\n font-family: var(--forge-typography-body1-font-family, var(--forge-typography-font-family, "Roboto", sans-serif));\n font-size: var(--forge-typography-body1-font-size, calc(var(--forge-typography-font-size, 1rem) * var(--forge-typography-body-font-size-scale, 0.875)));\n font-weight: var(--forge-typography-body1-font-weight, 400);\n line-height: var(--forge-typography-body1-line-height, calc(var(--forge-typography-font-size, 1rem) * var(--forge-typography-body-line-height-scale, 1.125)));\n letter-spacing: var(--forge-typography-body1-letter-spacing, 0.0357142857em);\n text-transform: var(--forge-typography-body1-text-transform, inherit);\n text-decoration: var(--forge-typography-body1-text-decoration, inherit);\n color: var(--forge-theme-text-medium, rgba(0, 0, 0, 0.6));\n}\n\n.status-icon {\n flex-shrink: 0;\n display: flex;\n align-items: center;\n color: var(--forge-theme-text-medium, rgba(0, 0, 0, 0.6));\n}\n\n.info-button {\n color: var(--forge-theme-text-medium, rgba(0, 0, 0, 0.6));\n}\n.info-button:hover {\n color: var(--forge-theme-text-high, rgba(0, 0, 0, 0.87));\n}\n\n.tool-details {\n display: grid;\n gap: var(--forge-spacing-medium, 16px);\n padding: var(--forge-spacing-medium, 16px);\n min-width: 300px;\n max-width: 500px;\n min-height: 100px;\n max-height: 400px;\n overflow-y: auto;\n}\n\n.tool-section {\n display: grid;\n gap: var(--forge-spacing-xsmall, 8px);\n}\n\n.section-label {\n -moz-osx-font-smoothing: grayscale;\n -webkit-font-smoothing: antialiased;\n font-family: var(--forge-typography-heading1-font-family, var(--forge-typography-font-family, "Roboto", sans-serif));\n font-size: var(--forge-typography-heading1-font-size, calc(var(--forge-typography-font-size, 1rem) * var(--forge-typography-heading1-font-size-scale, 0.875)));\n font-weight: var(--forge-typography-heading1-font-weight, 500);\n line-height: var(--forge-typography-heading1-line-height, calc(var(--forge-typography-font-size, 1rem) * var(--forge-typography-heading1-line-height-scale, 1.125)));\n letter-spacing: var(--forge-typography-heading1-letter-spacing, 0.0178571429em);\n text-transform: var(--forge-typography-heading1-text-transform, inherit);\n text-decoration: var(--forge-typography-heading1-text-decoration, inherit);\n}\n\n.code-block {\n background-color: var(--forge-theme-surface-container-minimum, #f5f5f5);\n color: var(--forge-theme-on-surface-container-minimum, #000000);\n padding: var(--forge-spacing-small, 12px);\n border-radius: calc(var(--forge-shape-medium, 4px) * var(--forge-shape-factor, 1));\n overflow-x: auto;\n margin: 0;\n font-family: monospace;\n font-size: 0.85em;\n white-space: pre-wrap;\n word-wrap: break-word;\n}';
2
2
  export {
3
3
  styles as default
4
4
  };
@@ -86,6 +86,7 @@ export declare class AiChatbotComponent extends LitElement {
86
86
  agentInfo?: AgentInfo;
87
87
  titleText: string;
88
88
  headingLevel: HeadingLevel;
89
+ debugMode: boolean;
89
90
  connectedCallback(): void;
90
91
  disconnectedCallback(): void;
91
92
  willUpdate(changedProperties: PropertyValues<this>): void;
@@ -42,7 +42,7 @@ var __privateWrapper = (obj, member, setter, getter) => ({
42
42
  return __privateGet(obj, member, getter);
43
43
  }
44
44
  });
45
- var _chatInterfaceRef, _messageThreadRef, _promptRef, _messageStateController, _fileUploadManager, _toolsMap, _adapterSubscriptions, _executingToolHandlers, _AiChatbotComponent_instances, messageItems_get, isStreaming_get, isUploading_get, hasMessages_get, tools_get, setupAdapter_fn, handleMessageStart_fn, handleMessageDelta_fn, handleMessageEnd_fn, handleToolCallStart_fn, handleToolCallArgs_fn, handleToolCallEnd_fn, createToolResponse_fn, handleToolCall_fn, executeToolHandler_fn, handleError_fn, handleRunAborted_fn, handleStateChange_fn, handleToolCallResult_fn, sendToolResult_fn, sendUserMessage_fn, handleSend_fn, handleStop_fn, handleCancel_fn, handleCopy_fn, handleRefresh_fn, handleThumbsUp_fn, handleThumbsDown_fn, processFileUpload_fn, handleFileSelect_fn, createFileUploadCallbacks_fn, handleFileError_fn, handleAttachmentRemove_fn, handleSuggestionSelect_fn, handleVoiceInputResult_fn, handleHeaderExpand_fn, handleHeaderMinimize_fn, handleHeaderClear_fn, handleHeaderInfo_fn, handleExport_fn, sessionFilesTemplate_get, promptSlot_get, messageThread_get, dispatchEvent_fn;
45
+ var _chatInterfaceRef, _messageThreadRef, _promptRef, _headerRef, _messageStateController, _fileUploadManager, _toolsMap, _adapterSubscriptions, _executingToolHandlers, _AiChatbotComponent_instances, slashCommands_get, messageItems_get, isStreaming_get, isUploading_get, hasMessages_get, tools_get, setupAdapter_fn, handleMessageStart_fn, handleMessageDelta_fn, handleMessageEnd_fn, handleToolCallStart_fn, handleToolCallArgs_fn, handleToolCallEnd_fn, createToolResponse_fn, handleToolCall_fn, executeToolHandler_fn, handleError_fn, handleRunAborted_fn, handleStateChange_fn, handleToolCallResult_fn, sendToolResult_fn, sendUserMessage_fn, handleSend_fn, handleStop_fn, handleCancel_fn, handleCopy_fn, handleRefresh_fn, handleThumbsUp_fn, handleThumbsDown_fn, processFileUpload_fn, handleFileSelect_fn, createFileUploadCallbacks_fn, handleFileError_fn, handleAttachmentRemove_fn, handleSuggestionSelect_fn, handleVoiceInputResult_fn, handleHeaderExpand_fn, handleHeaderMinimize_fn, handleHeaderClear_fn, handleHeaderInfo_fn, handleDebugToggle_fn, handleSlashCommand_fn, handleExport_fn, sessionFilesTemplate_get, promptSlot_get, messageThread_get, dispatchEvent_fn;
46
46
  const AiChatbotComponentTagName = "forge-ai-chatbot";
47
47
  let AiChatbotComponent = class extends LitElement {
48
48
  constructor() {
@@ -58,9 +58,11 @@ let AiChatbotComponent = class extends LitElement {
58
58
  this.enableReactions = false;
59
59
  this.titleText = "AI Assistant";
60
60
  this.headingLevel = 2;
61
+ this.debugMode = false;
61
62
  __privateAdd(this, _chatInterfaceRef, createRef());
62
63
  __privateAdd(this, _messageThreadRef, createRef());
63
64
  __privateAdd(this, _promptRef, createRef());
65
+ __privateAdd(this, _headerRef, createRef());
64
66
  __privateAdd(this, _messageStateController);
65
67
  __privateAdd(this, _fileUploadManager);
66
68
  __privateAdd(this, _toolsMap);
@@ -129,6 +131,7 @@ let AiChatbotComponent = class extends LitElement {
129
131
  console.warn("No adapter configured.");
130
132
  return;
131
133
  }
134
+ __privateGet(this, _promptRef).value?.closeSlashMenu();
132
135
  if (files) {
133
136
  const timestamp = Date.now();
134
137
  for (const file of files) {
@@ -184,6 +187,7 @@ let AiChatbotComponent = class extends LitElement {
184
187
  aria-live="polite"
185
188
  aria-busy=${__privateGet(this, _AiChatbotComponent_instances, isStreaming_get)}>
186
189
  <forge-ai-chat-header
190
+ ${ref(__privateGet(this, _headerRef))}
187
191
  slot="header"
188
192
  ?show-expand-button=${this.showExpandButton}
189
193
  ?show-minimize-button=${this.showMinimizeButton}
@@ -208,12 +212,27 @@ let AiChatbotComponent = class extends LitElement {
208
212
  _chatInterfaceRef = /* @__PURE__ */ new WeakMap();
209
213
  _messageThreadRef = /* @__PURE__ */ new WeakMap();
210
214
  _promptRef = /* @__PURE__ */ new WeakMap();
215
+ _headerRef = /* @__PURE__ */ new WeakMap();
211
216
  _messageStateController = /* @__PURE__ */ new WeakMap();
212
217
  _fileUploadManager = /* @__PURE__ */ new WeakMap();
213
218
  _toolsMap = /* @__PURE__ */ new WeakMap();
214
219
  _adapterSubscriptions = /* @__PURE__ */ new WeakMap();
215
220
  _executingToolHandlers = /* @__PURE__ */ new WeakMap();
216
221
  _AiChatbotComponent_instances = /* @__PURE__ */ new WeakSet();
222
+ slashCommands_get = function() {
223
+ const commands = [];
224
+ if (__privateGet(this, _AiChatbotComponent_instances, hasMessages_get)) {
225
+ commands.push({ id: "clear", name: "Clear", group: "Conversation" });
226
+ commands.push({ id: "export", name: "Export", group: "Conversation" });
227
+ }
228
+ commands.push({ id: "info", name: "Info", group: "Help" });
229
+ commands.push({
230
+ id: "debug",
231
+ name: `${this.debugMode ? "Disable debug mode" : "Enable debug mode"}`,
232
+ group: "Help"
233
+ });
234
+ return commands;
235
+ };
217
236
  messageItems_get = function() {
218
237
  return __privateGet(this, _messageStateController)?.messageItems ?? [];
219
238
  };
@@ -264,7 +283,7 @@ handleMessageStart_fn = function(event) {
264
283
  timestamp: Date.now(),
265
284
  status: "streaming"
266
285
  };
267
- __privateGet(this, _messageStateController).addMessage(message);
286
+ __privateGet(this, _messageStateController).addMessage(message, event);
268
287
  };
269
288
  handleMessageDelta_fn = function(event) {
270
289
  const message = __privateGet(this, _messageStateController).getMessage(event.messageId);
@@ -272,11 +291,11 @@ handleMessageDelta_fn = function(event) {
272
291
  __privateMethod(this, _AiChatbotComponent_instances, handleMessageStart_fn).call(this, { messageId: event.messageId });
273
292
  return;
274
293
  }
275
- __privateGet(this, _messageStateController).appendToMessage(event.messageId, event.delta);
294
+ __privateGet(this, _messageStateController).appendToMessage(event.messageId, event.delta, event);
276
295
  this.scrollToBottom();
277
296
  };
278
297
  handleMessageEnd_fn = function(event) {
279
- __privateGet(this, _messageStateController).updateMessageStatus(event.messageId, "complete");
298
+ __privateGet(this, _messageStateController).updateMessageStatus(event.messageId, "complete", event);
280
299
  const message = __privateGet(this, _messageStateController).getMessage(event.messageId);
281
300
  if (message) {
282
301
  __privateMethod(this, _AiChatbotComponent_instances, dispatchEvent_fn).call(this, { type: "forge-ai-chatbot-message-received", detail: { message } });
@@ -296,21 +315,25 @@ handleToolCallStart_fn = function(event) {
296
315
  status: "parsing",
297
316
  type: __privateGet(this, _AiChatbotComponent_instances, tools_get).has(event.name) ? "client" : "agent"
298
317
  };
299
- __privateGet(this, _messageStateController).addToolCall(toolCall);
318
+ __privateGet(this, _messageStateController).addToolCall(toolCall, event);
300
319
  };
301
320
  handleToolCallArgs_fn = function(event) {
302
- __privateGet(this, _messageStateController).updateToolCall(event.id, {
321
+ const updates = {
303
322
  argsBuffer: event.argsBuffer,
304
323
  args: event.partialArgs ?? {}
305
- });
324
+ };
325
+ const rawEvent = { eventType: "tool-call-args", event };
326
+ __privateGet(this, _messageStateController).updateToolCall(event.id, updates, rawEvent);
306
327
  this.scrollToBottom();
307
328
  };
308
329
  handleToolCallEnd_fn = function(event) {
309
- __privateGet(this, _messageStateController).updateToolCall(event.id, {
330
+ const updates = {
310
331
  args: event.args,
311
332
  argsBuffer: void 0,
312
333
  status: "executing"
313
- });
334
+ };
335
+ const rawEvent = { eventType: "tool-call-end", event };
336
+ __privateGet(this, _messageStateController).updateToolCall(event.id, updates, rawEvent);
314
337
  };
315
338
  createToolResponse_fn = function(toolName, handlerReturn) {
316
339
  if (typeof handlerReturn === "string") {
@@ -384,7 +407,7 @@ executeToolHandler_fn = async function(toolCallId, toolName, handler, args) {
384
407
  };
385
408
  handleError_fn = function(event) {
386
409
  const errorMessage = {
387
- id: generateId("msg"),
410
+ id: generateId(),
388
411
  role: "assistant",
389
412
  content: event.message,
390
413
  timestamp: Date.now(),
@@ -395,7 +418,7 @@ handleError_fn = function(event) {
395
418
  };
396
419
  handleRunAborted_fn = function() {
397
420
  const abortMessage = {
398
- id: generateId("msg"),
421
+ id: generateId(),
399
422
  role: "system",
400
423
  content: "Run cancelled",
401
424
  timestamp: Date.now(),
@@ -407,7 +430,7 @@ handleStateChange_fn = function(_state) {
407
430
  this.requestUpdate();
408
431
  };
409
432
  handleToolCallResult_fn = function(event) {
410
- __privateGet(this, _messageStateController).completeToolCall(event.toolCallId, event.result);
433
+ __privateGet(this, _messageStateController).completeToolCall(event.toolCallId, event.result, event);
411
434
  __privateGet(this, _messageStateController).addMessage(event.message);
412
435
  };
413
436
  sendToolResult_fn = async function(toolCallId, result) {
@@ -429,7 +452,7 @@ sendUserMessage_fn = async function(config) {
429
452
  return;
430
453
  }
431
454
  const userMessage = {
432
- id: generateId("msg"),
455
+ id: generateId(),
433
456
  role: "user",
434
457
  content: config.content,
435
458
  timestamp: config.timestamp ?? Date.now(),
@@ -464,13 +487,12 @@ handleCancel_fn = function() {
464
487
  __privateMethod(this, _AiChatbotComponent_instances, handleStop_fn).call(this);
465
488
  };
466
489
  handleCopy_fn = async function(evt) {
467
- const messageItemIndex = evt.detail.messageItemIndex;
468
- const item = __privateGet(this, _AiChatbotComponent_instances, messageItems_get)[messageItemIndex];
469
- if (!item || item.type !== "message") {
490
+ const message = __privateGet(this, _messageStateController).getMessage(evt.detail.messageId);
491
+ if (!message) {
470
492
  return;
471
493
  }
472
494
  try {
473
- await navigator.clipboard.writeText(item.data.content);
495
+ await navigator.clipboard.writeText(message.content);
474
496
  } catch {
475
497
  }
476
498
  };
@@ -478,7 +500,13 @@ handleRefresh_fn = function(evt) {
478
500
  if (!this.adapter) {
479
501
  return;
480
502
  }
481
- const messageItemIndex = evt.detail.messageItemIndex;
503
+ const messageId = evt.detail.messageId;
504
+ const messageItemIndex = __privateGet(this, _AiChatbotComponent_instances, messageItems_get).findIndex(
505
+ (item) => item.type === "message" && item.data.id === messageId
506
+ );
507
+ if (messageItemIndex === -1) {
508
+ return;
509
+ }
482
510
  let userMessageIndex = -1;
483
511
  for (let i = messageItemIndex - 1; i >= 0; i--) {
484
512
  const item = __privateGet(this, _AiChatbotComponent_instances, messageItems_get)[i];
@@ -500,7 +528,7 @@ handleThumbsDown_fn = function(evt) {
500
528
  console.warn("thumbs-down", evt.detail.messageId);
501
529
  };
502
530
  processFileUpload_fn = function(file, timestamp) {
503
- const fileId = generateId("file");
531
+ const fileId = generateId();
504
532
  __privateGet(this, _fileUploadManager).addAttachment(fileId, {
505
533
  filename: file.name,
506
534
  size: file.size,
@@ -544,7 +572,7 @@ createFileUploadCallbacks_fn = function(fileId) {
544
572
  };
545
573
  handleFileError_fn = function(evt) {
546
574
  const errorMessage = {
547
- id: generateId("msg"),
575
+ id: generateId(),
548
576
  role: "assistant",
549
577
  content: evt.detail.message,
550
578
  timestamp: Date.now(),
@@ -572,8 +600,9 @@ handleAttachmentRemove_fn = function(evt) {
572
600
  });
573
601
  }
574
602
  };
575
- handleSuggestionSelect_fn = function(evt) {
576
- this.sendMessage(evt.detail.text);
603
+ handleSuggestionSelect_fn = async function(evt) {
604
+ await this.sendMessage(evt.detail.text);
605
+ __privateGet(this, _promptRef).value?.focus();
577
606
  };
578
607
  handleVoiceInputResult_fn = function(evt) {
579
608
  const { transcript } = evt.detail;
@@ -594,8 +623,32 @@ handleHeaderClear_fn = function() {
594
623
  }
595
624
  };
596
625
  handleHeaderInfo_fn = function() {
626
+ const header = __privateGet(this, _headerRef).value;
627
+ if (header?.showAgentInfo) {
628
+ header.showAgentInfo();
629
+ }
597
630
  __privateMethod(this, _AiChatbotComponent_instances, dispatchEvent_fn).call(this, { type: "forge-ai-chatbot-info" });
598
631
  };
632
+ handleDebugToggle_fn = function() {
633
+ this.debugMode = !this.debugMode;
634
+ };
635
+ handleSlashCommand_fn = function(evt) {
636
+ const commandId = evt.detail.commandId;
637
+ switch (commandId) {
638
+ case "clear":
639
+ __privateMethod(this, _AiChatbotComponent_instances, handleHeaderClear_fn).call(this);
640
+ break;
641
+ case "export":
642
+ __privateMethod(this, _AiChatbotComponent_instances, handleExport_fn).call(this);
643
+ break;
644
+ case "info":
645
+ __privateMethod(this, _AiChatbotComponent_instances, handleHeaderInfo_fn).call(this);
646
+ break;
647
+ case "debug":
648
+ __privateMethod(this, _AiChatbotComponent_instances, handleDebugToggle_fn).call(this);
649
+ break;
650
+ }
651
+ };
599
652
  handleExport_fn = function() {
600
653
  const messages = this.getMessages();
601
654
  if (messages.length === 0) {
@@ -645,10 +698,14 @@ promptSlot_get = function() {
645
698
  slot="prompt"
646
699
  .placeholder=${this.placeholder}
647
700
  .running=${__privateGet(this, _AiChatbotComponent_instances, isStreaming_get) || isUploading}
701
+ .slashCommands=${__privateGet(this, _AiChatbotComponent_instances, slashCommands_get)}
648
702
  ?disabled=${isUploading}
703
+ ?debug-mode=${this.debugMode}
649
704
  @forge-ai-prompt-send=${__privateMethod(this, _AiChatbotComponent_instances, handleSend_fn)}
650
705
  @forge-ai-prompt-stop=${__privateMethod(this, _AiChatbotComponent_instances, handleStop_fn)}
651
- @forge-ai-prompt-cancel=${__privateMethod(this, _AiChatbotComponent_instances, handleCancel_fn)}>
706
+ @forge-ai-prompt-cancel=${__privateMethod(this, _AiChatbotComponent_instances, handleCancel_fn)}
707
+ @forge-ai-prompt-debug-toggle=${__privateMethod(this, _AiChatbotComponent_instances, handleDebugToggle_fn)}
708
+ @forge-ai-prompt-command=${__privateMethod(this, _AiChatbotComponent_instances, handleSlashCommand_fn)}>
652
709
  ${when(
653
710
  this.fileUpload === "on",
654
711
  () => html`
@@ -681,6 +738,7 @@ messageThread_get = function() {
681
738
  .tools=${__privateGet(this, _AiChatbotComponent_instances, tools_get)}
682
739
  ?enable-reactions=${this.enableReactions}
683
740
  ?show-thinking=${__privateGet(this, _AiChatbotComponent_instances, isStreaming_get)}
741
+ ?debug-mode=${this.debugMode}
684
742
  @forge-ai-message-thread-copy=${__privateMethod(this, _AiChatbotComponent_instances, handleCopy_fn)}
685
743
  @forge-ai-message-thread-refresh=${__privateMethod(this, _AiChatbotComponent_instances, handleRefresh_fn)}
686
744
  @forge-ai-message-thread-thumbs-up=${__privateMethod(this, _AiChatbotComponent_instances, handleThumbsUp_fn)}
@@ -746,6 +804,9 @@ __decorateClass([
746
804
  __decorateClass([
747
805
  property({ attribute: "heading-level", type: Number })
748
806
  ], AiChatbotComponent.prototype, "headingLevel", 2);
807
+ __decorateClass([
808
+ property({ type: Boolean, attribute: "debug-mode" })
809
+ ], AiChatbotComponent.prototype, "debugMode", 2);
749
810
  AiChatbotComponent = __decorateClass([
750
811
  customElement(AiChatbotComponentTagName)
751
812
  ], AiChatbotComponent);
@@ -1,12 +1,9 @@
1
1
  import { ToolCall, ToolRenderer } from './types.js';
2
2
  export interface CreateToolRendererElementConfig {
3
- elementTag: string;
4
- useSlot?: boolean;
5
- transform?: (toolCall: ToolCall) => Record<string, unknown>;
3
+ elementTag: keyof HTMLElementTagNameMap;
6
4
  }
7
5
  export interface CreateToolRendererFunctionConfig {
8
6
  render: (toolCall: ToolCall) => HTMLElement | DocumentFragment;
9
- useSlot?: boolean;
10
7
  }
11
8
  export type CreateToolRendererConfig = CreateToolRendererElementConfig | CreateToolRendererFunctionConfig;
12
9
  export declare function createToolRenderer(config: CreateToolRendererConfig): ToolRenderer;
@@ -3,21 +3,9 @@ function isElementConfig(config) {
3
3
  }
4
4
  function createToolRenderer(config) {
5
5
  if (isElementConfig(config)) {
6
- const renderer = {
6
+ return {
7
7
  elementTag: config.elementTag
8
8
  };
9
- if (config.transform) {
10
- renderer.render = (toolCall) => {
11
- const element = document.createElement(config.elementTag);
12
- const props = config.transform?.(toolCall);
13
- if (props) {
14
- Object.assign(element, props);
15
- }
16
- return element;
17
- };
18
- delete renderer.elementTag;
19
- }
20
- return renderer;
21
9
  }
22
10
  return {
23
11
  render: config.render
@@ -3,7 +3,7 @@ export type { ForgeAiChatbotMessageEventData, ForgeAiChatbotToolCallEventData, F
3
3
  export { AiChatbotToolCallComponent, AiChatbotToolCallComponentTagName } from './ai-chatbot-tool-call.js';
4
4
  export type { Suggestion } from '../ai-suggestions/index.js';
5
5
  export { AgentAdapter, type MessageStartEvent, type MessageDeltaEvent, type MessageEndEvent, type ToolCallEvent, type ToolCallStartEvent, type ToolCallArgsEvent, type ToolCallEndEvent, type FileUploadEvent, type FileRemoveEvent, type AdapterState, type ErrorEvent } from './agent-adapter.js';
6
- export type { ChatMessage, ToolDefinition, ToolCall, ToolRenderer, HandlerContext, FileAttachment, UploadedFileMetadata, FileUploadCallbacks, FileUploadHandler, FileRemoveCallbacks, ForgeAiChatbotFileSelectEventData, ThreadState } from './types.js';
6
+ export type { ChatMessage, ToolDefinition, ToolCall, ToolRenderer, IToolRenderer, HandlerContext, FileAttachment, UploadedFileMetadata, FileUploadCallbacks, FileUploadHandler, FileRemoveCallbacks, ForgeAiChatbotFileSelectEventData, ThreadState } from './types.js';
7
7
  export * from './ag-ui-adapter.js';
8
8
  export * from './http-agent-with-credentials.js';
9
9
  export * from './event-emitter.js';
@@ -1,5 +1,6 @@
1
1
  import { ReactiveController, ReactiveControllerHost } from 'lit';
2
2
  import { ChatMessage, MessageItem, ToolCall, ToolDefinition } from './types.js';
3
+ import { MessageStartEvent, MessageDeltaEvent, MessageEndEvent, ToolCallStartEvent, ToolCallArgsEvent, ToolCallEndEvent, ToolResultEvent } from './agent-adapter.js';
3
4
  export interface MessageStateControllerConfig {
4
5
  tools: Map<string, ToolDefinition>;
5
6
  }
@@ -25,12 +26,15 @@ export declare class MessageStateController implements ReactiveController {
25
26
  get messageItems(): MessageItem[];
26
27
  getToolCall(id: string): ToolCall | undefined;
27
28
  addMessageItem(item: MessageItem): void;
28
- addMessage(message: ChatMessage): void;
29
- addToolCall(toolCall: ToolCall): void;
30
- updateToolCall(toolCallId: string, updates: Partial<ToolCall>): void;
31
- appendToMessage(id: string, content: string): void;
29
+ addMessage(message: ChatMessage, event?: MessageStartEvent): void;
30
+ addToolCall(toolCall: ToolCall, event?: ToolCallStartEvent): void;
31
+ updateToolCall(toolCallId: string, updates: Partial<ToolCall>, eventData?: {
32
+ eventType: 'tool-call-args' | 'tool-call-end';
33
+ event: ToolCallArgsEvent | ToolCallEndEvent;
34
+ }): void;
35
+ appendToMessage(id: string, content: string, event?: MessageDeltaEvent): void;
32
36
  getMessage(id: string): ChatMessage | undefined;
33
- updateMessageStatus(id: string, status: ChatMessage['status']): void;
37
+ updateMessageStatus(id: string, status: ChatMessage['status'], event?: MessageEndEvent): void;
34
38
  removeMessageItem(index: number): void;
35
39
  clearMessages(): void;
36
40
  /**
@@ -41,5 +45,5 @@ export declare class MessageStateController implements ReactiveController {
41
45
  */
42
46
  getMessages(): ChatMessage[];
43
47
  setMessages(messages: ChatMessage[]): void;
44
- completeToolCall(toolCallId: string, result: unknown): void;
48
+ completeToolCall(toolCallId: string, result: unknown, event?: ToolResultEvent): void;
45
49
  }