@tylertech/forge-ai 0.13.10 → 0.13.12
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 +581 -51
- package/dist/ai-assistant-response/ai-assistant-response.d.ts +1 -0
- package/dist/ai-assistant-response/ai-assistant-response.mjs +35 -3
- package/dist/ai-assistant-response/ai-assistant-response.scss.mjs +1 -1
- package/dist/ai-chain-of-thought/thought-detail/thought-detail.mjs +1 -1
- package/dist/ai-chain-of-thought/thought-image/thought-image.mjs +1 -1
- package/dist/ai-chain-of-thought/thought-search-result/thought-search-result.mjs +2 -2
- package/dist/ai-chat-header/ai-chat-header.mjs +27 -10
- package/dist/ai-chatbot/agent-adapter.d.ts +1 -0
- package/dist/ai-chatbot/ai-chatbot-base.d.ts +23 -1
- package/dist/ai-chatbot/ai-chatbot-base.mjs +28 -9
- package/dist/ai-chatbot/ai-chatbot.d.ts +2 -0
- package/dist/ai-chatbot/ai-chatbot.mjs +5 -0
- package/dist/ai-chatbot/index.d.ts +1 -1
- package/dist/ai-chatbot/message-state-controller.d.ts +11 -1
- package/dist/ai-chatbot/message-state-controller.mjs +54 -1
- package/dist/ai-chatbot/types.d.ts +27 -0
- package/dist/ai-chatbot-launcher/ai-chatbot-launcher.mjs +7 -2
- package/dist/ai-client-message/ai-client-message.d.ts +28 -0
- package/dist/ai-client-message/ai-client-message.mjs +112 -0
- package/dist/ai-client-message/ai-client-message.scss.mjs +4 -0
- package/dist/ai-client-message/index.d.ts +1 -0
- package/dist/ai-client-message/index.mjs +5 -0
- package/dist/ai-conversations-panel/ai-conversations-panel.d.ts +1 -0
- package/dist/ai-conversations-panel/ai-conversations-panel.mjs +21 -8
- package/dist/ai-conversations-panel/ai-conversations-panel.scss.mjs +1 -1
- package/dist/ai-copy-button/ai-copy-button.mjs +2 -2
- package/dist/ai-dialog/ai-dialog.d.ts +4 -0
- package/dist/ai-dialog/ai-dialog.mjs +10 -3
- package/dist/ai-dropdown-menu/ai-dropdown-menu-item.mjs +10 -2
- package/dist/ai-dropdown-menu/ai-dropdown-menu.d.ts +5 -0
- package/dist/ai-dropdown-menu/ai-dropdown-menu.mjs +4 -0
- package/dist/ai-edit-thread/ai-edit-thread.mjs +2 -2
- package/dist/ai-embedded-chat/ai-embedded-chat.d.ts +4 -0
- package/dist/ai-embedded-chat/ai-embedded-chat.mjs +5 -0
- package/dist/ai-empty-state/ai-empty-state.scss.mjs +1 -1
- package/dist/ai-error-message/ai-error-message.mjs +2 -1
- package/dist/ai-file-picker/ai-file-picker.mjs +1 -1
- package/dist/ai-floating-chat/ai-floating-chat.d.ts +5 -0
- package/dist/ai-floating-chat/ai-floating-chat.mjs +5 -0
- package/dist/ai-icon/ai-icon.mjs +1 -1
- package/dist/ai-message-thread/ai-message-thread.mjs +18 -25
- package/dist/ai-message-thread/ai-message-thread.scss.mjs +1 -1
- package/dist/ai-modal/ai-modal.d.ts +4 -0
- package/dist/ai-modal/ai-modal.mjs +5 -1
- package/dist/ai-prompt/ai-prompt.mjs +3 -3
- package/dist/ai-reasoning-header/ai-reasoning-header.mjs +3 -3
- package/dist/ai-response-message-toolbar/ai-response-message-toolbar.mjs +6 -6
- package/dist/ai-slash-command-menu/ai-slash-command-menu.mjs +1 -1
- package/dist/ai-spinner/ai-spinner.mjs +1 -1
- package/dist/ai-suggestions/ai-suggestions.mjs +1 -1
- package/dist/ai-thread-actions-menu/ai-thread-actions-menu.mjs +14 -3
- package/dist/ai-threads/ai-threads.mjs +5 -3
- package/dist/ai-threads-search/ai-threads-search.mjs +3 -3
- package/dist/ai-tool-call-indicator/ai-tool-call-indicator.mjs +32 -6
- package/dist/ai-user-message-toolbar/ai-user-message-toolbar.mjs +3 -3
- package/dist/ai-voice-input/ai-voice-input.mjs +1 -1
- package/dist/core/chatbot-core-controller.d.ts +5 -1
- package/dist/core/chatbot-core-controller.mjs +25 -10
- package/dist/index.d.ts +1 -0
- package/dist/index.mjs +3 -0
- package/dist/tools/ai-data-table/ai-data-table.d.ts +0 -1
- package/dist/tools/ai-data-table/ai-data-table.mjs +9 -16
- package/dist/tools/ai-data-table/ai-data-table.scss.mjs +1 -1
- package/dist/tools/ai-paginator/ai-paginator.mjs +2 -2
- package/dist/utils/markdown.mjs +1 -1
- package/package.json +6 -6
|
@@ -37,6 +37,7 @@ export declare class AiAssistantResponseComponent extends LitElement {
|
|
|
37
37
|
tools?: Map<string, ToolDefinition>;
|
|
38
38
|
enableReactions: boolean;
|
|
39
39
|
debugMode: boolean;
|
|
40
|
+
showThinking: boolean;
|
|
40
41
|
connectedCallback(): void;
|
|
41
42
|
willUpdate(): void;
|
|
42
43
|
render(): TemplateResult;
|
|
@@ -6,6 +6,7 @@ import { MarkdownStreamController } from "../ai-chatbot/markdown-stream-controll
|
|
|
6
6
|
import "../ai-response-message-toolbar/ai-response-message-toolbar.mjs";
|
|
7
7
|
import "../ai-chatbot/ai-chatbot-tool-call.mjs";
|
|
8
8
|
import "../ai-tool-call-indicator/ai-tool-call-indicator.mjs";
|
|
9
|
+
import "../ai-thinking-indicator/ai-thinking-indicator.mjs";
|
|
9
10
|
import styles from "./ai-assistant-response.scss.mjs";
|
|
10
11
|
var __defProp = Object.defineProperty;
|
|
11
12
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
@@ -25,7 +26,7 @@ var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read fr
|
|
|
25
26
|
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);
|
|
26
27
|
var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), member.set(obj, value), value);
|
|
27
28
|
var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "access private method"), method);
|
|
28
|
-
var _internals, _markdownController, _AiAssistantResponseComponent_instances, hasVisibleContent_get, updateEmptyState_fn, renderTextChunk_fn, renderToolCall_fn, children_get, handleToolbarAction_fn, handleToolbarFeedback_fn, toolbar_get;
|
|
29
|
+
var _internals, _markdownController, _AiAssistantResponseComponent_instances, hasVisibleContent_get, updateEmptyState_fn, renderTextChunk_fn, renderToolCall_fn, children_get, handleToolbarAction_fn, handleToolbarFeedback_fn, toolbar_get, thinkingIndicator_get;
|
|
29
30
|
const AiAssistantResponseComponentTagName = "forge-ai-assistant-response";
|
|
30
31
|
let AiAssistantResponseComponent = class extends LitElement {
|
|
31
32
|
constructor() {
|
|
@@ -33,6 +34,7 @@ let AiAssistantResponseComponent = class extends LitElement {
|
|
|
33
34
|
__privateAdd(this, _AiAssistantResponseComponent_instances);
|
|
34
35
|
this.enableReactions = false;
|
|
35
36
|
this.debugMode = false;
|
|
37
|
+
this.showThinking = false;
|
|
36
38
|
__privateAdd(this, _internals, this.attachInternals());
|
|
37
39
|
__privateAdd(this, _markdownController);
|
|
38
40
|
}
|
|
@@ -46,7 +48,7 @@ let AiAssistantResponseComponent = class extends LitElement {
|
|
|
46
48
|
render() {
|
|
47
49
|
return html`
|
|
48
50
|
<div class="assistant-response" ?data-complete=${this.response.status === "complete"}>
|
|
49
|
-
${__privateGet(this, _AiAssistantResponseComponent_instances, children_get)} ${__privateGet(this, _AiAssistantResponseComponent_instances, toolbar_get)}
|
|
51
|
+
${__privateGet(this, _AiAssistantResponseComponent_instances, children_get)} ${__privateGet(this, _AiAssistantResponseComponent_instances, thinkingIndicator_get)} ${__privateGet(this, _AiAssistantResponseComponent_instances, toolbar_get)}
|
|
50
52
|
</div>
|
|
51
53
|
`;
|
|
52
54
|
}
|
|
@@ -64,7 +66,7 @@ hasVisibleContent_get = function() {
|
|
|
64
66
|
});
|
|
65
67
|
};
|
|
66
68
|
updateEmptyState_fn = function() {
|
|
67
|
-
const isEmpty = !__privateGet(this, _AiAssistantResponseComponent_instances, hasVisibleContent_get) && this.response.status !== "complete";
|
|
69
|
+
const isEmpty = !__privateGet(this, _AiAssistantResponseComponent_instances, hasVisibleContent_get) && this.response.status !== "complete" && !this.showThinking;
|
|
68
70
|
if (isEmpty) {
|
|
69
71
|
__privateGet(this, _internals).states.add("empty");
|
|
70
72
|
} else {
|
|
@@ -160,6 +162,33 @@ toolbar_get = function() {
|
|
|
160
162
|
</div>
|
|
161
163
|
`;
|
|
162
164
|
};
|
|
165
|
+
thinkingIndicator_get = function() {
|
|
166
|
+
if (!this.showThinking) {
|
|
167
|
+
return nothing;
|
|
168
|
+
}
|
|
169
|
+
const isThinking = this.response.status === "streaming" && this.response.isThinking === true;
|
|
170
|
+
if (!isThinking) {
|
|
171
|
+
const lastChild = this.response.children[this.response.children.length - 1];
|
|
172
|
+
if (lastChild?.type === "text" && lastChild.status === "streaming") {
|
|
173
|
+
const content = typeof lastChild.content === "string" ? lastChild.content : "";
|
|
174
|
+
if (content.trim().length > 0) {
|
|
175
|
+
return nothing;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
const hasActiveToolCall = this.response.children.some((child) => {
|
|
180
|
+
if (child.type !== "toolCall") {
|
|
181
|
+
return false;
|
|
182
|
+
}
|
|
183
|
+
return child.data.status === "parsing" || child.data.status === "executing" || child.data.status === "pending";
|
|
184
|
+
});
|
|
185
|
+
if (hasActiveToolCall) {
|
|
186
|
+
return nothing;
|
|
187
|
+
}
|
|
188
|
+
return html`<div class="thinking-indicator">
|
|
189
|
+
<forge-ai-thinking-indicator show-text></forge-ai-thinking-indicator>
|
|
190
|
+
</div>`;
|
|
191
|
+
};
|
|
163
192
|
AiAssistantResponseComponent.styles = unsafeCSS(styles);
|
|
164
193
|
__decorateClass([
|
|
165
194
|
property({ attribute: false })
|
|
@@ -173,6 +202,9 @@ __decorateClass([
|
|
|
173
202
|
__decorateClass([
|
|
174
203
|
property({ type: Boolean, attribute: "debug-mode" })
|
|
175
204
|
], AiAssistantResponseComponent.prototype, "debugMode", 2);
|
|
205
|
+
__decorateClass([
|
|
206
|
+
property({ type: Boolean, attribute: "show-thinking" })
|
|
207
|
+
], AiAssistantResponseComponent.prototype, "showThinking", 2);
|
|
176
208
|
AiAssistantResponseComponent = __decorateClass([
|
|
177
209
|
customElement(AiAssistantResponseComponentTagName)
|
|
178
210
|
], AiAssistantResponseComponent);
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const styles = '/**\n * @license\n * Copyright Tyler Technologies, Inc.\n * License: Apache-2.0\n */\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: rgba(0, 0, 0, 0);\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, .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, :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/* prettier-ignore */\n@keyframes fadein {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n:host {\n display: block;\n box-sizing: border-box;\n}\n\n:host(:state(empty)) {\n display: none;\n}\n\n.assistant-response {\n position: relative;\n}\n\n.text-chunk {\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 font-size: var(--forge-ai-markdown-font-size, 0.875rem);\n line-height: var(--forge-ai-markdown-line-height, 1.5rem);\n color: var(--forge-theme-on-surface, #000000);\n overflow-wrap: break-word;\n}\n.text-chunk h1,\n.text-chunk h2,\n.text-chunk h3,\n.text-chunk h4,\n.text-chunk h5,\n.text-chunk h6 {\n margin: 1.75rem 0 var(--forge-spacing-small, 12px);\n}\n.text-chunk strong {\n font-weight: 500;\n}\n.text-chunk a {\n color: var(--forge-theme-primary, #3f51b5);\n}\n.text-chunk hr {\n border: none;\n border-top: 1px solid var(--forge-theme-outline, #e0e0e0);\n}\n.text-chunk code {\n color: var(--forge-theme-on-surface-container-low, #000000);\n background-color: var(--forge-theme-surface-container-low, #ebebeb);\n border-radius: calc(var(--forge-shape-medium, 4px) * var(--forge-shape-factor, 1));\n padding: var(--forge-spacing-xxxsmall, 2px) var(--forge-spacing-xxsmall, 4px);\n font-size: 0.75em;\n}\n.text-chunk pre {\n border: 1px solid var(--forge-theme-outline, #e0e0e0);\n border-radius: calc(var(--forge-shape-medium, 4px) * var(--forge-shape-factor, 1));\n margin: 0;\n max-width: 100%;\n overflow-x: auto;\n}\n.text-chunk pre:focus-visible {\n outline: 2px solid var(--forge-theme-primary, #3f51b5);\n outline-offset: 2px;\n}\n.text-chunk pre code {\n display: block;\n padding: var(--forge-spacing-xsmall, 8px) var(--forge-spacing-small, 12px);\n color: var(--forge-theme-on-surface-container-minimum, #000000);\n background: var(--forge-theme-surface-container-minimum, #f5f5f5);\n white-space: pre;\n}\n.text-chunk [data-scroll-region=table] {\n max-width: 100%;\n overflow-x: auto;\n border-radius: calc(var(--forge-shape-large, 8px) * var(--forge-shape-factor, 1));\n margin-block: var(--forge-spacing-medium, 16px);\n}\n.text-chunk [data-scroll-region=table]:focus-visible {\n outline: 2px solid var(--forge-theme-primary, #3f51b5);\n outline-offset: 2px;\n}\n.text-chunk [data-scroll-region=table] table {\n margin-block: 0;\n}\n.text-chunk table {\n width: 100%;\n border-spacing: 0;\n background-color: var(--forge-theme-surface, #ffffff);\n border-radius: calc(var(--forge-shape-large, 8px) * var(--forge-shape-factor, 1));\n overflow: hidden;\n margin-block: var(--forge-spacing-medium, 16px);\n}\n.text-chunk table thead {\n color: var(--forge-theme-text-medium, rgba(0, 0, 0, 0.6));\n font-weight: bold;\n text-align: left;\n font-size: calc(var(--forge-typography-font-size, 1rem) * 0.75);\n box-sizing: border-box;\n}\n.text-chunk table tr {\n height: 36px;\n height: 32px;\n}\n.text-chunk table tr:nth-child(even) {\n background-color: var(--forge-theme-surface-dim, #fafafa);\n}\n.text-chunk table tr:last-child td {\n border-bottom: none;\n}\n.text-chunk table th,\n.text-chunk table td {\n -moz-osx-font-smoothing: grayscale;\n -webkit-font-smoothing: antialiased;\n font-family: var(--forge-typography-label1-font-family, var(--forge-typography-font-family, "Roboto", sans-serif));\n font-size: var(--forge-typography-label1-font-size, calc(var(--forge-typography-font-size, 1rem) * var(--forge-typography-label-font-size-scale, 0.75)));\n font-weight: var(--forge-typography-label1-font-weight, 400);\n line-height: var(--forge-typography-label1-line-height, calc(var(--forge-typography-font-size, 1rem) * var(--forge-typography-label-line-height-scale, 1.25)));\n letter-spacing: var(--forge-typography-label1-letter-spacing, 0.0357142857em);\n text-transform: var(--forge-typography-label1-text-transform, inherit);\n text-decoration: var(--forge-typography-label1-text-decoration, inherit);\n padding-block: var(--forge-spacing-xsmall, 8px);\n padding-inline-start: var(--forge-spacing-xsmall, 8px);\n padding-inline-end: var(--forge-spacing-medium, 16px);\n border-bottom-width: 1px;\n border-bottom-style: solid;\n border-bottom-color: var(--forge-theme-outline, #e0e0e0);\n}\n.text-chunk table th {\n -moz-osx-font-smoothing: grayscale;\n -webkit-font-smoothing: antialiased;\n font-family: var(--forge-typography-label2-font-family, var(--forge-typography-font-family, "Roboto", sans-serif));\n font-size: var(--forge-typography-label2-font-size, calc(var(--forge-typography-font-size, 1rem) * var(--forge-typography-label-font-size-scale, 0.8125)));\n font-weight: var(--forge-typography-label2-font-weight, 400);\n line-height: var(--forge-typography-label2-line-height, calc(var(--forge-typography-font-size, 1rem) * var(--forge-typography-label-line-height-scale, 1.25)));\n letter-spacing: var(--forge-typography-label2-letter-spacing, 0.0096153846em);\n text-transform: var(--forge-typography-label2-text-transform, inherit);\n text-decoration: var(--forge-typography-label2-text-decoration, inherit);\n font-weight: 600;\n}\n.text-chunk > p:has(+ ol),\n.text-chunk > p:has(+ ul) {\n margin-block-end: var(--forge-spacing-small, 12px);\n}\n.text-chunk > ul {\n list-style-type: disc;\n padding-inline-start: 1.6875rem;\n}\n.text-chunk > ol {\n padding-inline-start: 1.75rem;\n}\n.text-chunk > ol,\n.text-chunk > ul {\n margin: var(--forge-spacing-xsmall, 8px) 0;\n margin-block-end: var(--forge-spacing-medium, 16px);\n}\n.text-chunk > :first-child {\n margin-block-start: 0;\n}\n.text-chunk > p {\n margin-block-end: var(--forge-spacing-medium, 16px);\n overflow-wrap: anywhere;\n}\n.text-chunk > p:first-child {\n margin-block-start: 0;\n}\n.text-chunk > p:last-child {\n margin-block-end: 0;\n}\n\n.toolbar-container {\n position: absolute;\n bottom: -28px;\n transition: opacity 200ms ease-in-out, transform 200ms ease-in-out;\n display: flex;\n align-items: center;\n gap: var(--forge-spacing-xxsmall, 4px);\n opacity: 0;\n transform: translateY(-8px);\n pointer-events: none;\n z-index: 1;\n left: 0;\n}\n\n.assistant-response[data-complete]:hover .toolbar-container,\n.assistant-response[data-complete] .toolbar-container:focus-within {\n opacity: 1;\n transform: translateY(0);\n pointer-events: auto;\n}\n\n:host(:not(:last-of-type)) .assistant-response[data-complete]::after {\n content: "";\n position: absolute;\n bottom: -40px;\n left: 0;\n right: 0;\n height: 40px;\n}\n\n:host(:last-of-type) .assistant-response[data-complete] .toolbar-container {\n opacity: 1;\n transform: translateY(0);\n pointer-events: auto;\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}';
|
|
1
|
+
const styles = '/**\n * @license\n * Copyright Tyler Technologies, Inc.\n * License: Apache-2.0\n */\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: rgba(0, 0, 0, 0);\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, .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, :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/* prettier-ignore */\n@keyframes fadein {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n:host {\n display: block;\n box-sizing: border-box;\n}\n\n:host(:state(empty)) {\n display: none;\n}\n\n.assistant-response {\n position: relative;\n}\n\n.text-chunk {\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 font-size: var(--forge-ai-markdown-font-size, 0.875rem);\n line-height: var(--forge-ai-markdown-line-height, 1.5rem);\n color: var(--forge-theme-on-surface, #000000);\n overflow-wrap: break-word;\n}\n.text-chunk h1,\n.text-chunk h2,\n.text-chunk h3,\n.text-chunk h4,\n.text-chunk h5,\n.text-chunk h6 {\n margin: 1.75rem 0 var(--forge-spacing-small, 12px);\n}\n.text-chunk strong {\n font-weight: 500;\n}\n.text-chunk a {\n color: var(--forge-theme-primary, #3f51b5);\n}\n.text-chunk hr {\n border: none;\n border-top: 1px solid var(--forge-theme-outline, #e0e0e0);\n}\n.text-chunk code {\n color: var(--forge-theme-on-surface-container-low, #000000);\n background-color: var(--forge-theme-surface-container-low, #ebebeb);\n border-radius: calc(var(--forge-shape-medium, 4px) * var(--forge-shape-factor, 1));\n padding: var(--forge-spacing-xxxsmall, 2px) var(--forge-spacing-xxsmall, 4px);\n font-size: 0.75em;\n}\n.text-chunk pre {\n border: 1px solid var(--forge-theme-outline, #e0e0e0);\n border-radius: calc(var(--forge-shape-medium, 4px) * var(--forge-shape-factor, 1));\n margin: 0;\n max-width: 100%;\n overflow-x: auto;\n}\n.text-chunk pre:focus-visible {\n outline: 2px solid var(--forge-theme-primary, #3f51b5);\n outline-offset: 2px;\n}\n.text-chunk pre code {\n display: block;\n padding: var(--forge-spacing-xsmall, 8px) var(--forge-spacing-small, 12px);\n color: var(--forge-theme-on-surface-container-minimum, #000000);\n background: var(--forge-theme-surface-container-minimum, #f5f5f5);\n white-space: pre;\n}\n.text-chunk [data-scroll-region=table] {\n max-width: 100%;\n overflow-x: auto;\n border-radius: calc(var(--forge-shape-large, 8px) * var(--forge-shape-factor, 1));\n margin-block: var(--forge-spacing-medium, 16px);\n}\n.text-chunk [data-scroll-region=table]:focus-visible {\n outline: 2px solid var(--forge-theme-primary, #3f51b5);\n outline-offset: 2px;\n}\n.text-chunk [data-scroll-region=table] table {\n margin-block: 0;\n}\n.text-chunk table {\n width: 100%;\n border-spacing: 0;\n background-color: var(--forge-theme-surface, #ffffff);\n border-radius: calc(var(--forge-shape-large, 8px) * var(--forge-shape-factor, 1));\n overflow: hidden;\n margin-block: var(--forge-spacing-medium, 16px);\n}\n.text-chunk table thead {\n color: var(--forge-theme-text-medium, rgba(0, 0, 0, 0.6));\n font-weight: bold;\n text-align: left;\n font-size: calc(var(--forge-typography-font-size, 1rem) * 0.75);\n box-sizing: border-box;\n}\n.text-chunk table tr {\n height: 36px;\n height: 32px;\n}\n.text-chunk table tr:nth-child(even) {\n background-color: var(--forge-theme-surface-dim, #fafafa);\n}\n.text-chunk table tr:last-child td {\n border-bottom: none;\n}\n.text-chunk table th,\n.text-chunk table td {\n -moz-osx-font-smoothing: grayscale;\n -webkit-font-smoothing: antialiased;\n font-family: var(--forge-typography-label1-font-family, var(--forge-typography-font-family, "Roboto", sans-serif));\n font-size: var(--forge-typography-label1-font-size, calc(var(--forge-typography-font-size, 1rem) * var(--forge-typography-label-font-size-scale, 0.75)));\n font-weight: var(--forge-typography-label1-font-weight, 400);\n line-height: var(--forge-typography-label1-line-height, calc(var(--forge-typography-font-size, 1rem) * var(--forge-typography-label-line-height-scale, 1.25)));\n letter-spacing: var(--forge-typography-label1-letter-spacing, 0.0357142857em);\n text-transform: var(--forge-typography-label1-text-transform, inherit);\n text-decoration: var(--forge-typography-label1-text-decoration, inherit);\n padding-block: var(--forge-spacing-xsmall, 8px);\n padding-inline-start: var(--forge-spacing-xsmall, 8px);\n padding-inline-end: var(--forge-spacing-medium, 16px);\n border-bottom-width: 1px;\n border-bottom-style: solid;\n border-bottom-color: var(--forge-theme-outline, #e0e0e0);\n}\n.text-chunk table th {\n -moz-osx-font-smoothing: grayscale;\n -webkit-font-smoothing: antialiased;\n font-family: var(--forge-typography-label2-font-family, var(--forge-typography-font-family, "Roboto", sans-serif));\n font-size: var(--forge-typography-label2-font-size, calc(var(--forge-typography-font-size, 1rem) * var(--forge-typography-label-font-size-scale, 0.8125)));\n font-weight: var(--forge-typography-label2-font-weight, 400);\n line-height: var(--forge-typography-label2-line-height, calc(var(--forge-typography-font-size, 1rem) * var(--forge-typography-label-line-height-scale, 1.25)));\n letter-spacing: var(--forge-typography-label2-letter-spacing, 0.0096153846em);\n text-transform: var(--forge-typography-label2-text-transform, inherit);\n text-decoration: var(--forge-typography-label2-text-decoration, inherit);\n font-weight: 600;\n}\n.text-chunk > p:has(+ ol),\n.text-chunk > p:has(+ ul) {\n margin-block-end: var(--forge-spacing-small, 12px);\n}\n.text-chunk > ul {\n list-style-type: disc;\n padding-inline-start: 1.6875rem;\n}\n.text-chunk > ol {\n padding-inline-start: 1.75rem;\n}\n.text-chunk > ol,\n.text-chunk > ul {\n margin: var(--forge-spacing-xsmall, 8px) 0;\n margin-block-end: var(--forge-spacing-medium, 16px);\n}\n.text-chunk > :first-child {\n margin-block-start: 0;\n}\n.text-chunk > p {\n margin-block-end: var(--forge-spacing-medium, 16px);\n overflow-wrap: anywhere;\n}\n.text-chunk > p:first-child {\n margin-block-start: 0;\n}\n.text-chunk > p:last-child {\n margin-block-end: 0;\n}\n\n.thinking-indicator {\n margin-block-start: var(--forge-spacing-xsmall, 8px);\n}\n\nforge-ai-tool-call-indicator + .thinking-indicator {\n margin-block-start: 0;\n}\n\n.toolbar-container {\n position: absolute;\n bottom: -28px;\n transition: opacity 200ms ease-in-out, transform 200ms ease-in-out;\n display: flex;\n align-items: center;\n gap: var(--forge-spacing-xxsmall, 4px);\n opacity: 0;\n transform: translateY(-8px);\n pointer-events: none;\n z-index: 1;\n left: 0;\n}\n\n.assistant-response[data-complete]:hover .toolbar-container,\n.assistant-response[data-complete] .toolbar-container:focus-within {\n opacity: 1;\n transform: translateY(0);\n pointer-events: auto;\n}\n\n:host(:not(:last-of-type)) .assistant-response[data-complete]::after {\n content: "";\n position: absolute;\n bottom: -40px;\n left: 0;\n right: 0;\n height: 40px;\n}\n\n:host(:last-of-type) .assistant-response[data-complete] .toolbar-container {\n opacity: 1;\n transform: translateY(0);\n pointer-events: auto;\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}';
|
|
2
2
|
export {
|
|
3
3
|
styles as default
|
|
4
4
|
};
|
|
@@ -15,7 +15,7 @@ let ThoughtDetailComponent = class extends LitElement {
|
|
|
15
15
|
render() {
|
|
16
16
|
return html`
|
|
17
17
|
<forge-ai-thought-base>
|
|
18
|
-
<svg slot="icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" class="forge-icon">
|
|
18
|
+
<svg slot="icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" class="forge-icon" aria-hidden="true">
|
|
19
19
|
<path d="M12 8a4 4 0 0 0-4 4 4 4 0 0 0 4 4 4 4 0 0 0 4-4 4 4 0 0 0-4-4" />
|
|
20
20
|
</svg>
|
|
21
21
|
<slot slot="title" name="title"></slot>
|
|
@@ -18,7 +18,7 @@ let ThoughtImageComponent = class extends LitElement {
|
|
|
18
18
|
render() {
|
|
19
19
|
return html`
|
|
20
20
|
<forge-ai-thought-base step=${ifDefined(this.step)}>
|
|
21
|
-
<svg slot="icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" class="forge-icon">
|
|
21
|
+
<svg slot="icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" class="forge-icon" aria-hidden="true">
|
|
22
22
|
<path
|
|
23
23
|
d="M19 19H5V5h14m0-2H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V5a2 2 0 0 0-2-2m-5.04 9.29-2.75 3.54-1.96-2.36L6.5 17h11z" />
|
|
24
24
|
</svg>
|
|
@@ -22,7 +22,7 @@ let ThoughtSearchResultComponent = class extends LitElement {
|
|
|
22
22
|
render() {
|
|
23
23
|
return html`
|
|
24
24
|
<forge-ai-thought-base step=${ifDefined(this.step)}>
|
|
25
|
-
<svg slot="icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" class="forge-icon">
|
|
25
|
+
<svg slot="icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" class="forge-icon" aria-hidden="true">
|
|
26
26
|
<path fill="none" d="M0 0h24v24H0z" />
|
|
27
27
|
<path
|
|
28
28
|
d="M15.5 14h-.79l-.28-.27A6.47 6.47 0 0 0 16 9.5 6.5 6.5 0 1 0 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14" />
|
|
@@ -34,7 +34,7 @@ let ThoughtSearchResultComponent = class extends LitElement {
|
|
|
34
34
|
(source) => html`
|
|
35
35
|
<a href="${source.href}" class="source" target="_blank" rel="noopener noreferrer">
|
|
36
36
|
<span>${source.title}</span>
|
|
37
|
-
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" class="forge-icon">
|
|
37
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" class="forge-icon" aria-hidden="true">
|
|
38
38
|
<path
|
|
39
39
|
d="M14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3m-2 16H5V5h7V3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7h-2z" />
|
|
40
40
|
</svg>
|
|
@@ -67,7 +67,7 @@ let AiChatHeaderComponent = class extends LitElement {
|
|
|
67
67
|
@click=${__privateMethod(this, _AiChatHeaderComponent_instances, handleConversationsToggle_fn)}
|
|
68
68
|
aria-label="Toggle conversations panel"
|
|
69
69
|
class="conversations-button forge-icon-button forge-icon-button--medium ai-icon-button">
|
|
70
|
-
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
|
|
70
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" aria-hidden="true">
|
|
71
71
|
<path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z" />
|
|
72
72
|
</svg>
|
|
73
73
|
</button>
|
|
@@ -90,13 +90,13 @@ let AiChatHeaderComponent = class extends LitElement {
|
|
|
90
90
|
${when(
|
|
91
91
|
this.minimizeIcon === "default",
|
|
92
92
|
() => html`
|
|
93
|
-
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
|
|
93
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" aria-hidden="true">
|
|
94
94
|
<path fill="none" d="M0 0h24v24H0z" />
|
|
95
95
|
<path d="M6 19h12v2H6z" />
|
|
96
96
|
</svg>
|
|
97
97
|
`,
|
|
98
98
|
() => html`
|
|
99
|
-
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
|
|
99
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" aria-hidden="true">
|
|
100
100
|
<defs>
|
|
101
101
|
<style>
|
|
102
102
|
.cls-1 {
|
|
@@ -134,12 +134,12 @@ let AiChatHeaderComponent = class extends LitElement {
|
|
|
134
134
|
${when(
|
|
135
135
|
this.expanded,
|
|
136
136
|
() => html`
|
|
137
|
-
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
|
|
137
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" aria-hidden="true">
|
|
138
138
|
<path d="M14 14h5v2h-3v3h-2zm-9 0h5v5H8v-3H5zm3-9h2v5H5V8h3zm11 3v2h-5V5h2v3z" />
|
|
139
139
|
</svg>
|
|
140
140
|
`,
|
|
141
141
|
() => html`
|
|
142
|
-
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
|
|
142
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" aria-hidden="true">
|
|
143
143
|
<path d="M5 5h5v2H7v3H5zm9 0h5v5h-2V7h-3zm3 9h2v5h-5v-2h3zm-7 3v2H5v-5h2v3z" />
|
|
144
144
|
</svg>
|
|
145
145
|
`
|
|
@@ -157,11 +157,13 @@ let AiChatHeaderComponent = class extends LitElement {
|
|
|
157
157
|
variant="icon-button"
|
|
158
158
|
popover-placement="bottom-end"
|
|
159
159
|
selection-mode="none"
|
|
160
|
+
trigger-label="More options"
|
|
160
161
|
@forge-ai-dropdown-menu-change=${__privateMethod(this, _AiChatHeaderComponent_instances, handleDropdownChange_fn)}>
|
|
161
162
|
<svg
|
|
162
163
|
slot="trigger-content"
|
|
163
164
|
xmlns="http://www.w3.org/2000/svg"
|
|
164
165
|
viewBox="0 0 24 24"
|
|
166
|
+
aria-hidden="true"
|
|
165
167
|
class="forge-icon ai-icon-button">
|
|
166
168
|
<path fill="none" d="M0 0h24v24H0z" />
|
|
167
169
|
<path
|
|
@@ -171,7 +173,12 @@ let AiChatHeaderComponent = class extends LitElement {
|
|
|
171
173
|
this.exportOption === "enabled",
|
|
172
174
|
() => html`
|
|
173
175
|
<forge-ai-dropdown-menu-item value="export">
|
|
174
|
-
<svg
|
|
176
|
+
<svg
|
|
177
|
+
slot="start"
|
|
178
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
179
|
+
viewBox="0 0 24 24"
|
|
180
|
+
class="forge-icon"
|
|
181
|
+
aria-hidden="true">
|
|
175
182
|
<path d="m15.61 8.92 1.41-1.41-5-5-5 5 1.41 1.41 2.59-2.58v9.67h2V6.34z" />
|
|
176
183
|
<path d="M19.05 14.06V19h-14v-4.94h-2V19a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-4.94z" />
|
|
177
184
|
</svg>
|
|
@@ -183,7 +190,12 @@ let AiChatHeaderComponent = class extends LitElement {
|
|
|
183
190
|
this.agentInfo,
|
|
184
191
|
() => html`
|
|
185
192
|
<forge-ai-dropdown-menu-item value="info">
|
|
186
|
-
<svg
|
|
193
|
+
<svg
|
|
194
|
+
slot="start"
|
|
195
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
196
|
+
viewBox="0 0 24 24"
|
|
197
|
+
class="forge-icon"
|
|
198
|
+
aria-hidden="true">
|
|
187
199
|
<path fill="none" d="M0 0h24v24H0z" />
|
|
188
200
|
<path
|
|
189
201
|
d="M11 7h2v2h-2zm0 4h2v6h-2zm1-9C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2m0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8" />
|
|
@@ -200,7 +212,12 @@ let AiChatHeaderComponent = class extends LitElement {
|
|
|
200
212
|
this.clearOption === "enabled",
|
|
201
213
|
() => html`
|
|
202
214
|
<forge-ai-dropdown-menu-item value="clear-chat">
|
|
203
|
-
<svg
|
|
215
|
+
<svg
|
|
216
|
+
slot="start"
|
|
217
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
218
|
+
viewBox="0 0 24 24"
|
|
219
|
+
class="forge-icon"
|
|
220
|
+
aria-hidden="true">
|
|
204
221
|
<path d="M6 19a2 2 0 0 0 2 2h8a2 2 0 0 0 2-2V7H6zM8 9h8v10H8zm7.5-5-1-1h-5l-1 1H5v2h14V4z" />
|
|
205
222
|
</svg>
|
|
206
223
|
<span>Clear chat</span>
|
|
@@ -215,7 +232,7 @@ let AiChatHeaderComponent = class extends LitElement {
|
|
|
215
232
|
${when(
|
|
216
233
|
this.agentInfo,
|
|
217
234
|
() => html`
|
|
218
|
-
<forge-ai-modal ${ref(__privateGet(this, _agentInfoModalRef))}>
|
|
235
|
+
<forge-ai-modal ${ref(__privateGet(this, _agentInfoModalRef))} label="Agent Information">
|
|
219
236
|
<div class="forge-scaffold">
|
|
220
237
|
<div class="forge-scaffold__header">
|
|
221
238
|
<div class="forge-toolbar">
|
|
@@ -225,7 +242,7 @@ let AiChatHeaderComponent = class extends LitElement {
|
|
|
225
242
|
class="forge-icon-button forge-icon-button--medium ai-icon-button close-button"
|
|
226
243
|
@click=${__privateMethod(this, _AiChatHeaderComponent_instances, handleModalClose_fn)}
|
|
227
244
|
aria-label="Close agent information dialog">
|
|
228
|
-
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
|
|
245
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" aria-hidden="true">
|
|
229
246
|
<path fill="none" d="M0 0h24v24H0z" />
|
|
230
247
|
<path
|
|
231
248
|
d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z" />
|
|
@@ -10,7 +10,7 @@ import { ForgeAiSuggestionsEventData, Suggestion } from '../ai-suggestions';
|
|
|
10
10
|
import { ForgeAiVoiceInputResultEvent } from '../ai-voice-input';
|
|
11
11
|
import { AgentAdapter } from './agent-adapter.js';
|
|
12
12
|
import { ChatbotCoreController } from '../core/chatbot-core-controller.js';
|
|
13
|
-
import { Agent, ChatMessage, ContextItem, HeadingLevel, MessageItem, SlashCommand, ThreadState, ToolDefinition } from './types.js';
|
|
13
|
+
import { Agent, ChatMessage, ClientMessageInput, ContextItem, HeadingLevel, MessageItem, SlashCommand, ThreadState, ToolDefinition } from './types.js';
|
|
14
14
|
export type FeatureToggle = 'on' | 'off';
|
|
15
15
|
export declare abstract class AiChatbotBase extends LitElement {
|
|
16
16
|
protected abstract _messageThreadRef: Ref<AiMessageThreadComponent>;
|
|
@@ -112,6 +112,28 @@ export declare abstract class AiChatbotBase extends LitElement {
|
|
|
112
112
|
startNewChat(): void;
|
|
113
113
|
getMessages(): ChatMessage[];
|
|
114
114
|
setMessages(messages: ChatMessage[]): void;
|
|
115
|
+
/**
|
|
116
|
+
* Inserts or upserts a client-only status message into the thread - never sent to
|
|
117
|
+
* the agent adapter and never included in the conversation history the adapter sees.
|
|
118
|
+
* Use this for host-driven UI feedback (e.g. "Your session expired", upload progress)
|
|
119
|
+
* instead of splicing {@link getMessages}/{@link setMessages} directly.
|
|
120
|
+
*
|
|
121
|
+
* Safe to call at any time, including while a response is streaming - it never
|
|
122
|
+
* finalizes or otherwise touches the in-progress response.
|
|
123
|
+
*
|
|
124
|
+
* @param message - Content and optional kind ('text' | 'info' | 'warning' | 'error' | 'success'),
|
|
125
|
+
* header, and actions. Pass the same `id` on a later call to upsert (replace) a
|
|
126
|
+
* previously added message.
|
|
127
|
+
* @returns The message id (generated if not provided).
|
|
128
|
+
*/
|
|
129
|
+
addClientMessage(message: ClientMessageInput): string;
|
|
130
|
+
/**
|
|
131
|
+
* Removes a client-only message previously added via {@link addClientMessage}.
|
|
132
|
+
* No-ops if no message with that id exists. Safe to call at any time, including
|
|
133
|
+
* while a response is streaming. Removal is never automatic - call this when your
|
|
134
|
+
* host logic determines the message is no longer relevant.
|
|
135
|
+
*/
|
|
136
|
+
removeClientMessage(id: string): void;
|
|
115
137
|
sendMessage(content: string, files?: File[]): Promise<void>;
|
|
116
138
|
abort(): void;
|
|
117
139
|
scrollToBottom({ behavior }?: {
|
|
@@ -125,15 +125,8 @@ class AiChatbotBase extends LitElement {
|
|
|
125
125
|
}
|
|
126
126
|
if (this._hasMessages) {
|
|
127
127
|
const agentName = agent?.name ?? this.titleText;
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
role: "system",
|
|
131
|
-
content: `Switched to ${agentName}`,
|
|
132
|
-
timestamp: Date.now(),
|
|
133
|
-
status: "complete",
|
|
134
|
-
clientOnly: true
|
|
135
|
-
};
|
|
136
|
-
this._coreController.addMessage(systemMessage);
|
|
128
|
+
this._coreController.finalizeActiveResponse();
|
|
129
|
+
this._coreController.addClientMessage({ content: `Switched to ${agentName}` });
|
|
137
130
|
}
|
|
138
131
|
}
|
|
139
132
|
}
|
|
@@ -381,6 +374,32 @@ class AiChatbotBase extends LitElement {
|
|
|
381
374
|
setMessages(messages) {
|
|
382
375
|
this._coreController.setMessages(messages);
|
|
383
376
|
}
|
|
377
|
+
/**
|
|
378
|
+
* Inserts or upserts a client-only status message into the thread - never sent to
|
|
379
|
+
* the agent adapter and never included in the conversation history the adapter sees.
|
|
380
|
+
* Use this for host-driven UI feedback (e.g. "Your session expired", upload progress)
|
|
381
|
+
* instead of splicing {@link getMessages}/{@link setMessages} directly.
|
|
382
|
+
*
|
|
383
|
+
* Safe to call at any time, including while a response is streaming - it never
|
|
384
|
+
* finalizes or otherwise touches the in-progress response.
|
|
385
|
+
*
|
|
386
|
+
* @param message - Content and optional kind ('text' | 'info' | 'warning' | 'error' | 'success'),
|
|
387
|
+
* header, and actions. Pass the same `id` on a later call to upsert (replace) a
|
|
388
|
+
* previously added message.
|
|
389
|
+
* @returns The message id (generated if not provided).
|
|
390
|
+
*/
|
|
391
|
+
addClientMessage(message) {
|
|
392
|
+
return this._coreController.addClientMessage(message);
|
|
393
|
+
}
|
|
394
|
+
/**
|
|
395
|
+
* Removes a client-only message previously added via {@link addClientMessage}.
|
|
396
|
+
* No-ops if no message with that id exists. Safe to call at any time, including
|
|
397
|
+
* while a response is streaming. Removal is never automatic - call this when your
|
|
398
|
+
* host logic determines the message is no longer relevant.
|
|
399
|
+
*/
|
|
400
|
+
removeClientMessage(id) {
|
|
401
|
+
this._coreController.removeClientMessage(id);
|
|
402
|
+
}
|
|
384
403
|
async sendMessage(content, files) {
|
|
385
404
|
if (!this._coreController.adapter) {
|
|
386
405
|
console.warn("No adapter configured.");
|
|
@@ -100,6 +100,7 @@ export declare const AiChatbotComponentTagName: keyof HTMLElementTagNameMap;
|
|
|
100
100
|
* @property {FeatureToggle} clearOption - Controls the clear-conversation header action. `'on'` (default) shows it when messages exist; `'off'` hides it entirely.
|
|
101
101
|
* @property {FeatureToggle} exportOption - Controls the export-conversation header action. `'on'` (default) shows it when messages exist; `'off'` hides it entirely.
|
|
102
102
|
* @property {string | null} selectedThreadId - The id of the currently selected conversation thread. Set this to highlight a thread in the conversations panel (e.g. when restoring a conversation loaded from the backend). Updated internally when a thread is selected or a new chat starts.
|
|
103
|
+
* @property {boolean} threadsLoading - When true, shows a loading indicator in the conversations panel's recent chats list while threads are loading (default: false)
|
|
103
104
|
*
|
|
104
105
|
* @cssproperty --forge-ai-chatbot-icon-color - The fill color for the AI icon. Defaults to `tertiary`.
|
|
105
106
|
* @cssproperty --forge-ai-chatbot-suggestion-background - The background color for suggestion buttons. Defaults to `tertiary-container`.
|
|
@@ -142,6 +143,7 @@ export declare class AiChatbotComponent extends AiChatbotBase {
|
|
|
142
143
|
showConversationRename: boolean;
|
|
143
144
|
showConversationDelete: boolean;
|
|
144
145
|
selectedThreadId: string | null;
|
|
146
|
+
threadsLoading: boolean;
|
|
145
147
|
protected _messageThreadRef: Ref<AiMessageThreadComponent>;
|
|
146
148
|
protected _promptRef: Ref<AiPromptComponent>;
|
|
147
149
|
protected _handleInfo(): void;
|
|
@@ -48,6 +48,7 @@ let AiChatbotComponent = class extends AiChatbotBase {
|
|
|
48
48
|
this.showConversationRename = false;
|
|
49
49
|
this.showConversationDelete = false;
|
|
50
50
|
this.selectedThreadId = null;
|
|
51
|
+
this.threadsLoading = false;
|
|
51
52
|
__privateAdd(this, _chatInterfaceRef, createRef());
|
|
52
53
|
this._messageThreadRef = createRef();
|
|
53
54
|
this._promptRef = createRef();
|
|
@@ -214,6 +215,7 @@ let AiChatbotComponent = class extends AiChatbotBase {
|
|
|
214
215
|
${ref(__privateGet(this, _conversationsPanelRef))}
|
|
215
216
|
.recentThreads=${this.recentThreads}
|
|
216
217
|
.selectedThreadId=${this.selectedThreadId}
|
|
218
|
+
?loading=${this.threadsLoading}
|
|
217
219
|
?show-back-button=${true}
|
|
218
220
|
?show-conversation-rename=${this.showConversationRename}
|
|
219
221
|
?show-conversation-delete=${this.showConversationDelete}
|
|
@@ -403,6 +405,9 @@ __decorateClass([
|
|
|
403
405
|
__decorateClass([
|
|
404
406
|
property({ type: String, attribute: "selected-thread-id" })
|
|
405
407
|
], AiChatbotComponent.prototype, "selectedThreadId", 2);
|
|
408
|
+
__decorateClass([
|
|
409
|
+
property({ type: Boolean, attribute: "threads-loading" })
|
|
410
|
+
], AiChatbotComponent.prototype, "threadsLoading", 2);
|
|
406
411
|
AiChatbotComponent = __decorateClass([
|
|
407
412
|
customElement(AiChatbotComponentTagName)
|
|
408
413
|
], AiChatbotComponent);
|
|
@@ -4,7 +4,7 @@ export type { ForgeAiChatbotMessageEventData, ForgeAiChatbotToolCallEventData, F
|
|
|
4
4
|
export { AiChatbotToolCallComponent, AiChatbotToolCallComponentTagName } from './ai-chatbot-tool-call.js';
|
|
5
5
|
export type { Suggestion } from '../ai-suggestions/index.js';
|
|
6
6
|
export { AgentAdapter, type MessageStartEvent, type MessageDeltaEvent, type MessageEndEvent, type ToolCallEvent, type ToolCallStartEvent, type ToolCallArgsEvent, type ToolCallEndEvent, type FileUploadEvent, type FileRemoveEvent, type AdapterState, type ErrorEvent, type CustomAgentEvent, type RawAgentEvent, type RunStartedAgentEvent, type StepStartedAgentEvent, type StepFinishedAgentEvent, type StateSnapshotAgentEvent, type StateDeltaAgentEvent, type ActivitySnapshotAgentEvent, type ActivityDeltaAgentEvent } from './agent-adapter.js';
|
|
7
|
-
export type { Agent, ChatMessage, ContextItem, ToolDefinition, ToolCall, ToolRenderer, IToolRenderer, HandlerContext, ToolStartContext, ToolDeltaContext, ToolEndContext, FileAttachment, UploadedFileMetadata, FileUploadCallbacks, FileUploadHandler, FileRemoveCallbacks, ThreadState, FeedbackType, ResponseFeedback, MessageItem, ForgeAiChatbotContextRemoveEventData, ForgeAiChatbotConversationSelectEventData, ForgeAiChatbotConversationSearchEventData, ForgeAiChatbotConversationLoadMoreEventData, ForgeAiChatbotConversationRenameEventData, ForgeAiChatbotConversationDeleteEventData } from './types.js';
|
|
7
|
+
export type { Agent, ChatMessage, ClientMessageAction, ClientMessageInput, ClientMessageKind, ContextItem, ToolDefinition, ToolCall, ToolRenderer, IToolRenderer, HandlerContext, ToolStartContext, ToolDeltaContext, ToolEndContext, FileAttachment, UploadedFileMetadata, FileUploadCallbacks, FileUploadHandler, FileRemoveCallbacks, ThreadState, FeedbackType, ResponseFeedback, MessageItem, ForgeAiChatbotContextRemoveEventData, ForgeAiChatbotConversationSelectEventData, ForgeAiChatbotConversationSearchEventData, ForgeAiChatbotConversationLoadMoreEventData, ForgeAiChatbotConversationRenameEventData, ForgeAiChatbotConversationDeleteEventData } from './types.js';
|
|
8
8
|
export * from './ag-ui-adapter.js';
|
|
9
9
|
export * from './http-agent-with-credentials.js';
|
|
10
10
|
export * from './event-emitter.js';
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ReactiveController, ReactiveControllerHost } from 'lit';
|
|
2
|
-
import { ChatMessage, MessageItem, ToolCall, AssistantResponse, ResponseFeedback } from './types.js';
|
|
2
|
+
import { ChatMessage, ClientMessageInput, MessageItem, ToolCall, AssistantResponse, ResponseFeedback } from './types.js';
|
|
3
3
|
import { MessageStartEvent, MessageDeltaEvent, MessageEndEvent, ToolCallStartEvent, ToolCallArgsEvent, ToolCallEndEvent, ToolResultEvent } from './agent-adapter.js';
|
|
4
4
|
export interface MessageStateControllerConfig {
|
|
5
5
|
onThreadSettled?: () => void;
|
|
@@ -28,6 +28,8 @@ export declare class MessageStateController implements ReactiveController {
|
|
|
28
28
|
getToolCall(id: string): ToolCall | undefined;
|
|
29
29
|
getActiveResponse(): AssistantResponse | null;
|
|
30
30
|
startResponse(): AssistantResponse;
|
|
31
|
+
markResponseThinking(): void;
|
|
32
|
+
clearResponseThinking(): void;
|
|
31
33
|
addTextToResponse(messageId: string, content: string, event?: MessageStartEvent): void;
|
|
32
34
|
appendTextDelta(messageId: string, delta: string, event?: MessageDeltaEvent): void;
|
|
33
35
|
markTextComplete(messageId: string, event?: MessageEndEvent): void;
|
|
@@ -41,6 +43,14 @@ export declare class MessageStateController implements ReactiveController {
|
|
|
41
43
|
addMessageItem(item: MessageItem): void;
|
|
42
44
|
addMessage(message: ChatMessage, event?: MessageStartEvent): void;
|
|
43
45
|
getMessage(id: string): ChatMessage | undefined;
|
|
46
|
+
/**
|
|
47
|
+
* Inserts or upserts a client-only message, never touching `_activeResponse`.
|
|
48
|
+
* Unlike {@link addMessage}, this never finalizes an in-progress response -
|
|
49
|
+
* safe to call while a real reply is streaming.
|
|
50
|
+
*/
|
|
51
|
+
addClientMessage(message: ClientMessageInput): string;
|
|
52
|
+
/** Removes a client message by id. No-ops if not found. Safe to call at any time. */
|
|
53
|
+
removeClientMessage(id: string): void;
|
|
44
54
|
updateMessageStatus(id: string, status: ChatMessage['status'], event?: MessageEndEvent): void;
|
|
45
55
|
updateMessageContent(id: string, content: string): void;
|
|
46
56
|
removeMessageItem(index: number): void;
|
|
@@ -42,8 +42,25 @@ class MessageStateController {
|
|
|
42
42
|
this.#notifyStateChange();
|
|
43
43
|
return response;
|
|
44
44
|
}
|
|
45
|
+
markResponseThinking() {
|
|
46
|
+
if (!this._activeResponse || this._activeResponse.isThinking) {
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
this._activeResponse.isThinking = true;
|
|
50
|
+
this.#updateResponseInItems();
|
|
51
|
+
this.#notifyStateChange();
|
|
52
|
+
}
|
|
53
|
+
clearResponseThinking() {
|
|
54
|
+
if (!this._activeResponse || !this._activeResponse.isThinking) {
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
this._activeResponse.isThinking = false;
|
|
58
|
+
this.#updateResponseInItems();
|
|
59
|
+
this.#notifyStateChange();
|
|
60
|
+
}
|
|
45
61
|
addTextToResponse(messageId, content, event) {
|
|
46
62
|
const response = this._activeResponse ?? this.startResponse();
|
|
63
|
+
response.isThinking = false;
|
|
47
64
|
const lastChild = response.children[response.children.length - 1];
|
|
48
65
|
if (lastChild?.type === "text" && lastChild.messageId === messageId) {
|
|
49
66
|
lastChild.content = content;
|
|
@@ -64,6 +81,7 @@ class MessageStateController {
|
|
|
64
81
|
}
|
|
65
82
|
appendTextDelta(messageId, delta, event) {
|
|
66
83
|
const response = this._activeResponse ?? this.startResponse();
|
|
84
|
+
response.isThinking = false;
|
|
67
85
|
const lastChild = response.children[response.children.length - 1];
|
|
68
86
|
if (lastChild?.type === "text" && lastChild.messageId === messageId) {
|
|
69
87
|
lastChild.content += delta;
|
|
@@ -102,6 +120,7 @@ class MessageStateController {
|
|
|
102
120
|
}
|
|
103
121
|
addToolCallToResponse(toolCall, event) {
|
|
104
122
|
const response = this._activeResponse ?? this.startResponse();
|
|
123
|
+
response.isThinking = false;
|
|
105
124
|
const toolCallWithTimestamp = { ...toolCall, startTimestamp: Date.now() };
|
|
106
125
|
this._toolCalls.set(toolCall.id, toolCallWithTimestamp);
|
|
107
126
|
response.children.push({ type: "toolCall", data: toolCallWithTimestamp });
|
|
@@ -167,7 +186,7 @@ class MessageStateController {
|
|
|
167
186
|
completeToolCallInResponse(toolCallId, result, event) {
|
|
168
187
|
this.updateToolCallInResponse(toolCallId, {
|
|
169
188
|
result,
|
|
170
|
-
status: "complete"
|
|
189
|
+
status: event?.isError === true ? "error" : "complete"
|
|
171
190
|
});
|
|
172
191
|
if (event) {
|
|
173
192
|
const streamEvent = {
|
|
@@ -255,6 +274,40 @@ class MessageStateController {
|
|
|
255
274
|
const item = this._messageItems.find((i) => i.type === "message" && i.data.id === id);
|
|
256
275
|
return item?.type === "message" ? item.data : void 0;
|
|
257
276
|
}
|
|
277
|
+
/**
|
|
278
|
+
* Inserts or upserts a client-only message, never touching `_activeResponse`.
|
|
279
|
+
* Unlike {@link addMessage}, this never finalizes an in-progress response -
|
|
280
|
+
* safe to call while a real reply is streaming.
|
|
281
|
+
*/
|
|
282
|
+
addClientMessage(message) {
|
|
283
|
+
const id = message.id ?? generateId();
|
|
284
|
+
const chatMessage = {
|
|
285
|
+
id,
|
|
286
|
+
role: "system",
|
|
287
|
+
content: message.content,
|
|
288
|
+
timestamp: Date.now(),
|
|
289
|
+
status: "complete",
|
|
290
|
+
clientOnly: true,
|
|
291
|
+
kind: message.kind,
|
|
292
|
+
header: message.header,
|
|
293
|
+
actions: message.actions
|
|
294
|
+
};
|
|
295
|
+
this._messageItems = [
|
|
296
|
+
...this._messageItems.filter((item) => !(item.type === "message" && item.data.id === id)),
|
|
297
|
+
{ type: "message", data: chatMessage }
|
|
298
|
+
];
|
|
299
|
+
this.#notifyStateChange();
|
|
300
|
+
return id;
|
|
301
|
+
}
|
|
302
|
+
/** Removes a client message by id. No-ops if not found. Safe to call at any time. */
|
|
303
|
+
removeClientMessage(id) {
|
|
304
|
+
const hasMessage = this._messageItems.some((item) => item.type === "message" && item.data.id === id);
|
|
305
|
+
if (!hasMessage) {
|
|
306
|
+
return;
|
|
307
|
+
}
|
|
308
|
+
this._messageItems = this._messageItems.filter((item) => !(item.type === "message" && item.data.id === id));
|
|
309
|
+
this.#notifyStateChange();
|
|
310
|
+
}
|
|
258
311
|
updateMessageStatus(id, status, event) {
|
|
259
312
|
this._messageItems = this._messageItems.map((item) => {
|
|
260
313
|
if (item.type === "message" && item.data.id === id) {
|