@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.
- package/custom-elements.json +1329 -579
- package/dist/ai-artifact/ai-artifact.scss.mjs +1 -1
- package/dist/ai-attachment/ai-attachment.d.ts +4 -4
- package/dist/ai-chat-header/ai-chat-header.d.ts +4 -0
- package/dist/ai-chat-header/ai-chat-header.mjs +6 -0
- package/dist/ai-chat-header/ai-chat-header.scss.mjs +1 -1
- package/dist/ai-chatbot/ag-ui-adapter.mjs +34 -25
- package/dist/ai-chatbot/agent-adapter.d.ts +16 -8
- package/dist/ai-chatbot/agent-adapter.mjs +16 -16
- package/dist/ai-chatbot/agent-runner.mjs +3 -3
- package/dist/ai-chatbot/ai-chatbot-tool-call.d.ts +5 -2
- package/dist/ai-chatbot/ai-chatbot-tool-call.mjs +68 -5
- package/dist/ai-chatbot/ai-chatbot-tool-call.scss.mjs +1 -1
- package/dist/ai-chatbot/ai-chatbot.d.ts +1 -0
- package/dist/ai-chatbot/ai-chatbot.mjs +84 -23
- package/dist/ai-chatbot/create-tool-renderer.d.ts +1 -4
- package/dist/ai-chatbot/create-tool-renderer.mjs +1 -13
- package/dist/ai-chatbot/index.d.ts +1 -1
- package/dist/ai-chatbot/message-state-controller.d.ts +10 -6
- package/dist/ai-chatbot/message-state-controller.mjs +95 -6
- package/dist/ai-chatbot/types.d.ts +91 -2
- package/dist/ai-chatbot/utils.d.ts +2 -2
- package/dist/ai-chatbot/utils.mjs +3 -2
- package/dist/ai-dropdown-menu/ai-dropdown-menu-item.d.ts +1 -3
- package/dist/ai-dropdown-menu/ai-dropdown-menu-item.scss.mjs +1 -1
- package/dist/ai-dropdown-menu/ai-dropdown-menu.d.ts +5 -6
- package/dist/ai-dropdown-menu/ai-dropdown-menu.mjs +7 -1
- package/dist/ai-dropdown-menu/ai-dropdown-menu.scss.mjs +1 -1
- package/dist/ai-dropdown-menu/selection-manager.mjs +3 -3
- package/dist/ai-embedded-chat/ai-embedded-chat.mjs +1 -0
- package/dist/ai-empty-state/ai-empty-state.scss.mjs +1 -1
- package/dist/ai-event-stream-viewer/ai-event-stream-viewer.d.ts +19 -0
- package/dist/ai-event-stream-viewer/ai-event-stream-viewer.mjs +164 -0
- package/dist/ai-event-stream-viewer/ai-event-stream-viewer.scss.mjs +4 -0
- package/dist/ai-event-stream-viewer/index.d.ts +1 -0
- package/dist/ai-event-stream-viewer/index.mjs +5 -0
- package/dist/ai-file-picker/ai-file-picker.d.ts +0 -13
- package/dist/ai-gradient-container/ai-gradient-container.scss.mjs +1 -1
- package/dist/ai-icon/ai-icon.scss.mjs +1 -1
- package/dist/ai-icon-button/ai-icon-button.d.ts +19 -0
- package/dist/ai-icon-button/ai-icon-button.mjs +63 -0
- package/dist/ai-icon-button/ai-icon-button.scss.mjs +4 -0
- package/dist/ai-icon-button/index.d.ts +1 -0
- package/dist/ai-icon-button/index.mjs +5 -0
- package/dist/ai-message-thread/ai-message-thread.d.ts +3 -2
- package/dist/ai-message-thread/ai-message-thread.mjs +23 -9
- package/dist/ai-prompt/ai-prompt.d.ts +21 -0
- package/dist/ai-prompt/ai-prompt.mjs +133 -10
- package/dist/ai-prompt/ai-prompt.scss.mjs +1 -1
- package/dist/ai-response-message/ai-response-message.d.ts +5 -0
- package/dist/ai-response-message/ai-response-message.mjs +61 -3
- package/dist/ai-response-message/ai-response-message.scss.mjs +1 -1
- package/dist/ai-slash-command-menu/ai-slash-command-menu.d.ts +33 -0
- package/dist/ai-slash-command-menu/ai-slash-command-menu.mjs +200 -0
- package/dist/ai-slash-command-menu/ai-slash-command-menu.scss.mjs +4 -0
- package/dist/ai-slash-command-menu/index.d.ts +1 -0
- package/dist/ai-slash-command-menu/index.mjs +5 -0
- package/dist/ai-spinner/ai-spinner.d.ts +2 -2
- package/dist/ai-suggestions/ai-suggestions.d.ts +2 -0
- package/dist/ai-suggestions/ai-suggestions.scss.mjs +1 -1
- package/dist/ai-thinking-indicator/ai-thinking-indicator.d.ts +3 -0
- package/dist/ai-thinking-indicator/ai-thinking-indicator.mjs +24 -15
- package/dist/ai-thinking-indicator/ai-thinking-indicator.scss.mjs +14 -11
- package/dist/core/overlay/index.d.ts +1 -1
- package/dist/core/overlay/overlay.d.ts +10 -5
- package/dist/core/overlay/overlay.mjs +7 -2
- package/dist/core/popover/index.d.ts +1 -1
- package/dist/core/popover/popover.d.ts +7 -6
- package/dist/core/popover/popover.mjs +5 -0
- package/dist/core/tooltip/tooltip.d.ts +2 -2
- package/dist/index.d.ts +2 -0
- package/dist/index.mjs +6 -0
- package/dist/tools/ai-data-table/ai-data-table-definition.d.ts +2 -0
- package/dist/tools/ai-data-table/ai-data-table-definition.mjs +43 -0
- package/dist/tools/ai-data-table/ai-data-table.d.ts +33 -0
- package/dist/tools/ai-data-table/ai-data-table.mjs +206 -0
- package/dist/tools/ai-data-table/ai-data-table.scss.mjs +4 -0
- package/dist/tools/ai-data-table/index.d.ts +2 -0
- package/dist/tools/ai-data-table/index.mjs +6 -0
- package/dist/tools/ai-paginator/ai-paginator.d.ts +17 -0
- package/dist/tools/ai-paginator/ai-paginator.mjs +110 -0
- package/dist/tools/ai-paginator/ai-paginator.scss.mjs +4 -0
- package/dist/tools/ai-paginator/index.d.ts +1 -0
- package/dist/tools/ai-paginator/index.mjs +4 -0
- package/dist/tools/index.d.ts +2 -0
- package/dist/tools/index.mjs +8 -0
- package/dist/utils/keyboard-navigation-controller.d.ts +13 -0
- package/dist/utils/keyboard-navigation-controller.mjs +71 -0
- 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-
|
|
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-
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
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(
|
|
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(
|
|
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
|
|
468
|
-
|
|
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(
|
|
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
|
|
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(
|
|
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(
|
|
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:
|
|
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
|
-
|
|
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
|
|
31
|
-
|
|
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
|
}
|