@tylertech/forge-ai 0.7.2 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/custom-elements.json +1157 -965
- package/dist/ai-actions-toolbar/ai-actions-toolbar.mjs +4 -4
- package/dist/ai-assistant-response/ai-assistant-response.scss.mjs +1 -1
- package/dist/ai-chat-header/ai-chat-header.mjs +72 -72
- package/dist/ai-chat-interface/ai-chat-interface.scss.mjs +1 -1
- package/dist/ai-chatbot/ai-chatbot-tool-call.mjs +22 -15
- package/dist/ai-chatbot/ai-chatbot-tool-call.scss.mjs +1 -1
- package/dist/ai-chatbot/ai-chatbot.d.ts +1 -1
- package/dist/ai-chatbot/ai-chatbot.mjs +81 -22
- package/dist/ai-chatbot/message-state-controller.d.ts +1 -0
- package/dist/ai-chatbot/message-state-controller.mjs +31 -11
- package/dist/ai-chatbot/types.d.ts +1 -0
- package/dist/ai-chatbot/utils.mjs +13 -2
- package/dist/ai-dialog/ai-dialog.scss.mjs +1 -1
- package/dist/ai-empty-state/ai-empty-state.scss.mjs +1 -1
- package/dist/ai-file-picker/ai-file-picker.mjs +3 -0
- package/dist/ai-floating-chat/ai-floating-chat.scss.mjs +1 -1
- package/dist/ai-message-thread/ai-message-thread.d.ts +9 -0
- package/dist/ai-message-thread/ai-message-thread.mjs +78 -5
- package/dist/ai-message-thread/ai-message-thread.scss.mjs +1 -1
- package/dist/ai-prompt/ai-prompt.d.ts +5 -0
- package/dist/ai-prompt/ai-prompt.mjs +56 -5
- package/dist/ai-slash-command-menu/ai-slash-command-menu.mjs +1 -1
- package/dist/ai-user-message/ai-user-message.d.ts +25 -0
- package/dist/ai-user-message/ai-user-message.mjs +183 -5
- package/dist/ai-user-message/ai-user-message.scss.mjs +1 -1
- package/dist/ai-voice-input/ai-voice-input.mjs +5 -0
- package/dist/tools/ai-confirm-tool-call/ai-confirm-tool-call-definition.d.ts +10 -0
- package/dist/tools/ai-confirm-tool-call/ai-confirm-tool-call-definition.mjs +20 -0
- package/dist/tools/ai-confirm-tool-call/index.d.ts +1 -0
- package/dist/tools/ai-confirm-tool-call/index.mjs +5 -0
- package/dist/tools/ai-paginator/ai-paginator.mjs +5 -0
- package/package.json +1 -1
|
@@ -10,6 +10,7 @@ import "../ai-response-message/ai-response-message.mjs";
|
|
|
10
10
|
import "../ai-thinking-indicator/ai-thinking-indicator.mjs";
|
|
11
11
|
import "../ai-user-message/ai-user-message.mjs";
|
|
12
12
|
import "../ai-chatbot/ai-chatbot-tool-call.mjs";
|
|
13
|
+
import "../core/tooltip/tooltip.mjs";
|
|
13
14
|
import styles from "./ai-message-thread.scss.mjs";
|
|
14
15
|
var __defProp = Object.defineProperty;
|
|
15
16
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
@@ -29,7 +30,7 @@ var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read fr
|
|
|
29
30
|
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);
|
|
30
31
|
var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), member.set(obj, value), value);
|
|
31
32
|
var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "access private method"), method);
|
|
32
|
-
var _markdownController, _canAutoScroll,
|
|
33
|
+
var _markdownController, _canAutoScroll, _resizeObserver, _AiMessageThreadComponent_instances, checkScrollState_fn, _handleScroll, _handleScrollToBottomClick, scrollToBottomButton_get, handleCopy_fn, handleRefresh_fn, handleThumbsUp_fn, handleThumbsDown_fn, handleUserCopy_fn, handleUserResend_fn, handleUserEdit_fn, renderToolCall_fn, renderAssistantResponse_fn, emptyState_get, thinkingIndicator_get, messages_get, dispatchEvent_fn;
|
|
33
34
|
const AiMessageThreadComponentTagName = "forge-ai-message-thread";
|
|
34
35
|
const SCROLL_THRESHOLD = 100;
|
|
35
36
|
let AiMessageThreadComponent = class extends LitElement {
|
|
@@ -43,14 +44,25 @@ let AiMessageThreadComponent = class extends LitElement {
|
|
|
43
44
|
this.debugMode = false;
|
|
44
45
|
__privateAdd(this, _markdownController);
|
|
45
46
|
__privateAdd(this, _canAutoScroll, true);
|
|
47
|
+
__privateAdd(this, _resizeObserver);
|
|
46
48
|
__privateAdd(this, _handleScroll, () => {
|
|
47
|
-
|
|
48
|
-
|
|
49
|
+
__privateMethod(this, _AiMessageThreadComponent_instances, checkScrollState_fn).call(this);
|
|
50
|
+
});
|
|
51
|
+
__privateAdd(this, _handleScrollToBottomClick, () => {
|
|
52
|
+
this.scrollToBottom({ force: true, behavior: "smooth" });
|
|
49
53
|
});
|
|
50
54
|
}
|
|
51
55
|
connectedCallback() {
|
|
52
56
|
super.connectedCallback();
|
|
53
57
|
__privateSet(this, _markdownController, new MarkdownStreamController(this));
|
|
58
|
+
__privateSet(this, _resizeObserver, new ResizeObserver(() => __privateMethod(this, _AiMessageThreadComponent_instances, checkScrollState_fn).call(this)));
|
|
59
|
+
}
|
|
60
|
+
disconnectedCallback() {
|
|
61
|
+
super.disconnectedCallback();
|
|
62
|
+
__privateGet(this, _resizeObserver)?.disconnect();
|
|
63
|
+
}
|
|
64
|
+
firstUpdated() {
|
|
65
|
+
__privateGet(this, _resizeObserver)?.observe(this._messageThreadContainer);
|
|
54
66
|
}
|
|
55
67
|
updated(changedProperties) {
|
|
56
68
|
super.updated(changedProperties);
|
|
@@ -76,13 +88,45 @@ let AiMessageThreadComponent = class extends LitElement {
|
|
|
76
88
|
<div class="message-thread" @scroll=${this.autoScroll ? __privateGet(this, _handleScroll) : void 0}>
|
|
77
89
|
${__privateGet(this, _AiMessageThreadComponent_instances, emptyState_get)} ${__privateGet(this, _AiMessageThreadComponent_instances, messages_get)} ${__privateGet(this, _AiMessageThreadComponent_instances, thinkingIndicator_get)}
|
|
78
90
|
</div>
|
|
91
|
+
${__privateGet(this, _AiMessageThreadComponent_instances, scrollToBottomButton_get)}
|
|
79
92
|
`;
|
|
80
93
|
}
|
|
81
94
|
};
|
|
82
95
|
_markdownController = /* @__PURE__ */ new WeakMap();
|
|
83
96
|
_canAutoScroll = /* @__PURE__ */ new WeakMap();
|
|
84
|
-
|
|
97
|
+
_resizeObserver = /* @__PURE__ */ new WeakMap();
|
|
85
98
|
_AiMessageThreadComponent_instances = /* @__PURE__ */ new WeakSet();
|
|
99
|
+
checkScrollState_fn = function() {
|
|
100
|
+
const container = this._messageThreadContainer;
|
|
101
|
+
if (!container) {
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
const { scrollTop, scrollHeight, clientHeight } = container;
|
|
105
|
+
const canAutoScroll = scrollTop + clientHeight >= scrollHeight - SCROLL_THRESHOLD;
|
|
106
|
+
if (canAutoScroll !== __privateGet(this, _canAutoScroll)) {
|
|
107
|
+
__privateSet(this, _canAutoScroll, canAutoScroll);
|
|
108
|
+
this.requestUpdate();
|
|
109
|
+
}
|
|
110
|
+
};
|
|
111
|
+
_handleScroll = /* @__PURE__ */ new WeakMap();
|
|
112
|
+
_handleScrollToBottomClick = /* @__PURE__ */ new WeakMap();
|
|
113
|
+
scrollToBottomButton_get = function() {
|
|
114
|
+
if (__privateGet(this, _canAutoScroll)) {
|
|
115
|
+
return nothing;
|
|
116
|
+
}
|
|
117
|
+
return html`
|
|
118
|
+
<button
|
|
119
|
+
id="scroll-to-bottom-btn"
|
|
120
|
+
class="forge-fab scroll-to-bottom-button"
|
|
121
|
+
aria-label="Scroll to bottom"
|
|
122
|
+
@click=${__privateGet(this, _handleScrollToBottomClick)}>
|
|
123
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
|
|
124
|
+
<path d="M7.03 13.92h4V5l2.01-.03v8.95h3.99l-5 5Z" />
|
|
125
|
+
</svg>
|
|
126
|
+
</button>
|
|
127
|
+
<forge-ai-tooltip for="scroll-to-bottom-btn" placement="top">Scroll to bottom</forge-ai-tooltip>
|
|
128
|
+
`;
|
|
129
|
+
};
|
|
86
130
|
handleCopy_fn = function(messageId) {
|
|
87
131
|
__privateMethod(this, _AiMessageThreadComponent_instances, dispatchEvent_fn).call(this, {
|
|
88
132
|
type: "forge-ai-message-thread-copy",
|
|
@@ -103,6 +147,24 @@ handleThumbsDown_fn = function(messageId, feedback) {
|
|
|
103
147
|
const detail = { messageId, feedback };
|
|
104
148
|
__privateMethod(this, _AiMessageThreadComponent_instances, dispatchEvent_fn).call(this, { type: "forge-ai-message-thread-thumbs-down", detail });
|
|
105
149
|
};
|
|
150
|
+
handleUserCopy_fn = function(messageId) {
|
|
151
|
+
__privateMethod(this, _AiMessageThreadComponent_instances, dispatchEvent_fn).call(this, {
|
|
152
|
+
type: "forge-ai-message-thread-user-copy",
|
|
153
|
+
detail: { messageId }
|
|
154
|
+
});
|
|
155
|
+
};
|
|
156
|
+
handleUserResend_fn = function(messageId) {
|
|
157
|
+
__privateMethod(this, _AiMessageThreadComponent_instances, dispatchEvent_fn).call(this, {
|
|
158
|
+
type: "forge-ai-message-thread-user-resend",
|
|
159
|
+
detail: { messageId }
|
|
160
|
+
});
|
|
161
|
+
};
|
|
162
|
+
handleUserEdit_fn = function(messageId, content) {
|
|
163
|
+
__privateMethod(this, _AiMessageThreadComponent_instances, dispatchEvent_fn).call(this, {
|
|
164
|
+
type: "forge-ai-message-thread-user-edit",
|
|
165
|
+
detail: { messageId, content }
|
|
166
|
+
});
|
|
167
|
+
};
|
|
106
168
|
renderToolCall_fn = function(toolCall) {
|
|
107
169
|
const toolDefinition = this.tools?.get(toolCall.name);
|
|
108
170
|
return html`<forge-ai-chatbot-tool-call
|
|
@@ -193,7 +255,18 @@ messages_get = function() {
|
|
|
193
255
|
const msg = item.data;
|
|
194
256
|
if (msg.role === "user") {
|
|
195
257
|
const renderedHtml = __privateGet(this, _markdownController).getCachedHtml(msg.id, msg.content);
|
|
196
|
-
return html
|
|
258
|
+
return html`
|
|
259
|
+
<forge-ai-user-message
|
|
260
|
+
message-id=${msg.id}
|
|
261
|
+
.timestamp=${msg.timestamp}
|
|
262
|
+
.content=${msg.content}
|
|
263
|
+
?streaming=${this.showThinking}
|
|
264
|
+
@forge-ai-user-message-copy=${(e) => __privateMethod(this, _AiMessageThreadComponent_instances, handleUserCopy_fn).call(this, e.detail.messageId)}
|
|
265
|
+
@forge-ai-user-message-resend=${(e) => __privateMethod(this, _AiMessageThreadComponent_instances, handleUserResend_fn).call(this, e.detail.messageId)}
|
|
266
|
+
@forge-ai-user-message-edit=${(e) => __privateMethod(this, _AiMessageThreadComponent_instances, handleUserEdit_fn).call(this, e.detail.messageId, e.detail.content)}>
|
|
267
|
+
${unsafeHTML(renderedHtml)}
|
|
268
|
+
</forge-ai-user-message>
|
|
269
|
+
`;
|
|
197
270
|
} else if (msg.role === "system") {
|
|
198
271
|
return html`<div class="system-message">${msg.content}</div>`;
|
|
199
272
|
} else if (msg.status === "error") {
|
|
@@ -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/* 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/**\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:host {\n display: grid;\n height: 100%;\n}\n\n.message-thread::-webkit-scrollbar {\n height: var(--forge-scrollbar-height, 16px);\n width: var(--forge-scrollbar-width, 16px);\n}\n.message-thread::-webkit-scrollbar-track {\n background-color: var(--forge-scrollbar-track-container, var(--forge-theme-surface-container-low, #ebebeb));\n}\n.message-thread::-webkit-scrollbar-track:hover {\n background-color: var(--forge-scrollbar-track-container-hover, var(--forge-theme-surface-container-low, #ebebeb));\n}\n.message-thread::-webkit-scrollbar-corner {\n background-color: var(--forge-scrollbar-track-container, var(--forge-theme-surface-container-low, #ebebeb));\n}\n.message-thread::-webkit-scrollbar-thumb {\n height: var(--forge-scrollbar-thumb-min-height, 32px);\n width: var(--forge-scrollbar-thumb-min-width, 32px);\n border-radius: var(--forge-scrollbar-border-radius, calc(var(--forge-shape-full, 9999px) * var(--forge-shape-factor, 1)));\n border-width: var(--forge-scrollbar-border-width, 3px);\n border-style: solid;\n border-color: transparent;\n background-color: var(--forge-scrollbar-thumb-container, var(--forge-theme-surface-container-medium, #c2c2c2));\n background-clip: content-box;\n}\n.message-thread::-webkit-scrollbar-thumb:hover {\n background-color: var(--forge-scrollbar-thumb-container-hover, var(--forge-theme-surface-container-high, #9e9e9e));\n}\n.message-thread {\n display: flex;\n flex-direction: column;\n gap: var(--forge-spacing-medium, 16px);\n padding-block-end: var(--forge-spacing-large, 24px);\n overflow-y: auto;\n padding: var(--forge-spacing-medium, 16px) var(--forge-spacing-medium, 16px) var(--forge-spacing-xxlarge, 48px) var(--forge-spacing-medium, 16px);\n}\n@media not all and (min-resolution: 0.001dpcm) {\n @supports (-webkit-appearance: none) {\n .message-thread {\n overflow-y: scroll;\n }\n }\n}\n\n.thinking-indicator {\n margin-block-start: var(--forge-spacing-xsmall, 8px);\n}\n\n.system-message {\n -moz-osx-font-smoothing: grayscale;\n -webkit-font-smoothing: antialiased;\n font-family: var(--forge-typography-subheading2-font-family, var(--forge-typography-font-family, "Roboto", sans-serif));\n font-size: var(--forge-typography-subheading2-font-size, calc(var(--forge-typography-font-size, 1rem) * var(--forge-typography-subheading2-font-size-scale, 1)));\n font-weight: var(--forge-typography-subheading2-font-weight, 400);\n line-height: var(--forge-typography-subheading2-line-height, calc(var(--forge-typography-font-size, 1rem) * var(--forge-typography-subheading2-line-height-scale, 1.25)));\n letter-spacing: var(--forge-typography-subheading2-letter-spacing, normal);\n text-transform: var(--forge-typography-subheading2-text-transform, inherit);\n text-decoration: var(--forge-typography-subheading2-text-decoration, inherit);\n color: var(--forge-theme-text-medium, rgba(0, 0, 0, 0.6));\n padding-block: var(--forge-spacing-small, 12px);\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/* 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/**\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-fab {\n --_fab-display: var(--forge-fab-display, inline-flex);\n --_fab-gap: var(--forge-fab-gap, var(--forge-spacing-xsmall, 8px));\n --_fab-background: var(--forge-fab-background, var(--forge-theme-secondary, #ffc107));\n --_fab-color: var(--forge-fab-color, var(--forge-theme-on-secondary, #000000));\n --_fab-size: var(--forge-fab-size, 56px);\n --_fab-padding: var(--forge-fab-padding, var(--forge-spacing-xsmall, 8px));\n --_fab-shadow: var(--forge-fab-shadow, 0px 3px 3px -2px rgba(0, 0, 0, 0.2), 0px 3px 4px 0px rgba(0, 0, 0, 0.14), 0px 1px 8px 0px rgba(0, 0, 0, 0.12));\n --_fab-hover-shadow: var(--forge-fab-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 --_fab-active-shadow: var(--forge-fab-active-shadow, 0px 3px 3px -2px rgba(0, 0, 0, 0.2), 0px 3px 4px 0px rgba(0, 0, 0, 0.14), 0px 1px 8px 0px rgba(0, 0, 0, 0.12));\n --_fab-lowered-shadow: var(--forge-fab-lowered-shadow, 0px 2px 1px -1px rgba(0, 0, 0, 0.2), 0px 1px 1px 0px rgba(0, 0, 0, 0.14), 0px 1px 3px 0px rgba(0, 0, 0, 0.12));\n --_fab-lowered-hover-shadow: var(--forge-fab-lowered-hover-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 --_fab-lowered-active-shadow: var(--forge-fab-lowered-active-shadow, 0px 2px 1px -1px rgba(0, 0, 0, 0.2), 0px 1px 1px 0px rgba(0, 0, 0, 0.14), 0px 1px 3px 0px rgba(0, 0, 0, 0.12));\n --_fab-transition-duration: var(--forge-fab-transition-duration, var(--forge-animation-duration-short3, 150ms));\n --_fab-transition-timing: var(--forge-fab-transition-timing, var(--forge-animation-easing-standard, cubic-bezier(0.2, 0, 0, 1)));\n --_fab-shape: var(--forge-fab-shape, calc(var(--forge-shape-full, 9999px) * var(--forge-shape-factor, 1)));\n --_fab-shape-start-start: var(--forge-fab-shape-start-start, var(--_fab-shape));\n --_fab-shape-start-end: var(--forge-fab-shape-start-end, var(--_fab-shape));\n --_fab-shape-end-start: var(--forge-fab-shape-end-start, var(--_fab-shape));\n --_fab-shape-end-end: var(--forge-fab-shape-end-end, var(--_fab-shape));\n --_fab-extended-padding: var(--forge-fab-extended-padding, var(--forge-spacing-medium-large, 20px));\n --_fab-extended-min-width: var(--forge-fab-extended-min-width, 96px);\n --_fab-density-small-size: var(--forge-fab-density-small-size, 40px);\n --_fab-density-medium-size: var(--forge-fab-density-medium-size, var(--_fab-size));\n --_fab-density-large-size: var(--forge-fab-density-large-size, 96px);\n --_fab-disabled-cursor: var(--forge-fab-disabled-cursor, not-allowed);\n --_fab-disabled-background: var(--forge-fab-disabled-background, var(--forge-theme-surface-container, #e0e0e0));\n --_fab-disabled-color: var(--forge-fab-disabled-color, var(--forge-theme-on-surface-container, #000000));\n --_fab-disabled-opacity: var(--forge-fab-disabled-opacity, 0.38);\n}\n\n.forge-fab {\n -moz-osx-font-smoothing: grayscale;\n -webkit-font-smoothing: antialiased;\n font-family: var(--forge-typography-button-font-family, var(--forge-typography-font-family, "Roboto", sans-serif));\n font-size: var(--forge-typography-button-font-size, calc(var(--forge-typography-font-size, 1rem) * var(--forge-typography-button-font-size-scale, 0.875)));\n font-weight: var(--forge-typography-button-font-weight, 500);\n line-height: var(--forge-typography-button-line-height, normal);\n letter-spacing: var(--forge-typography-button-letter-spacing, 0.0714285714em);\n text-transform: var(--forge-typography-button-text-transform, inherit);\n text-decoration: var(--forge-typography-button-text-decoration, inherit);\n position: relative;\n display: inline-flex;\n justify-content: center;\n align-items: center;\n gap: var(--_fab-gap);\n z-index: 0;\n background: var(--_fab-background);\n color: var(--_fab-color);\n cursor: pointer;\n box-shadow: var(--_fab-shadow);\n box-sizing: border-box;\n height: var(--_fab-density-medium-size);\n min-width: var(--_fab-density-medium-size);\n padding-inline: var(--_fab-padding);\n border-width: medium;\n border-style: none;\n border-color: currentColor;\n border-top-left-radius: var(--_fab-shape-start-start);\n border-top-right-radius: var(--_fab-shape-start-end);\n border-bottom-left-radius: var(--_fab-shape-end-start);\n border-bottom-right-radius: var(--_fab-shape-end-end);\n user-select: none;\n white-space: nowrap;\n transition-property: box-shadow, background, color;\n transition-duration: var(--_fab-transition-duration);\n transition-timing-function: var(--_fab-transition-timing);\n}\n\n.forge-fab:hover {\n --_fab-shadow: var(--_fab-hover-shadow);\n}\n\n.forge-fab:active {\n --_fab-shadow: var(--_fab-active-shadow);\n}\n\n.forge-fab: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-fab: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-fab:not(:disabled):hover::before {\n background-color: var(--_state-layer-hover-color);\n opacity: var(--_state-layer-hover-opacity);\n}\n\n.forge-fab: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@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-fab:not(:disabled) {\n outline: none;\n}\n\n.forge-fab: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-fab: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-fab:not(:disabled) {\n --forge-focus-indicator-color: var(--_fab-background);\n --forge-focus-indicator-shape-start-start: var(--_fab-shape-start-start);\n --forge-focus-indicator-shape-start-end: var(--_fab-shape-start-end);\n --forge-focus-indicator-shape-end-start: var(--_fab-shape-end-start);\n --forge-focus-indicator-shape-end-end: var(--_fab-shape-end-end);\n}\n\n.forge-fab--extended {\n --_fab-padding: var(--_fab-extended-padding);\n min-width: var(--_fab-extended-min-width);\n}\n\n.forge-fab:disabled {\n cursor: var(--_fab-disabled-cursor);\n --_fab-background: var(--_fab-disabled-background);\n --_fab-color: var(--_fab-disabled-color);\n pointer-events: none;\n opacity: var(--_fab-disabled-opacity);\n pointer-events: auto;\n cursor: not-allowed;\n}\n\n.forge-fab--dense, .forge-fab--small {\n --_fab-size: var(--_fab-density-small-size);\n}\n\n.forge-fab--large {\n --_fab-size: var(--_fab-density-large-size);\n --_fab-shape: var(--forge-fab-shape, calc(var(--forge-shape-extra-large, 16px) * var(--forge-shape-factor, 1)));\n}\n\n.forge-fab--flat {\n --_fab-shadow: var(--_fab-lowered-shadow);\n}\n\n.forge-fab--flat:hover {\n --_fab-shadow: var(--_fab-lowered-hover-shadow);\n}\n\n.forge-fab--flat:active {\n --_fab-shadow: var(--_fab-lowered-active-shadow);\n}\n\n:host {\n display: grid;\n height: 100%;\n position: relative;\n}\n\n.message-thread::-webkit-scrollbar {\n height: var(--forge-scrollbar-height, 16px);\n width: var(--forge-scrollbar-width, 16px);\n}\n.message-thread::-webkit-scrollbar-track {\n background-color: var(--forge-scrollbar-track-container, var(--forge-theme-surface-container-low, #ebebeb));\n}\n.message-thread::-webkit-scrollbar-track:hover {\n background-color: var(--forge-scrollbar-track-container-hover, var(--forge-theme-surface-container-low, #ebebeb));\n}\n.message-thread::-webkit-scrollbar-corner {\n background-color: var(--forge-scrollbar-track-container, var(--forge-theme-surface-container-low, #ebebeb));\n}\n.message-thread::-webkit-scrollbar-thumb {\n height: var(--forge-scrollbar-thumb-min-height, 32px);\n width: var(--forge-scrollbar-thumb-min-width, 32px);\n border-radius: var(--forge-scrollbar-border-radius, calc(var(--forge-shape-full, 9999px) * var(--forge-shape-factor, 1)));\n border-width: var(--forge-scrollbar-border-width, 3px);\n border-style: solid;\n border-color: transparent;\n background-color: var(--forge-scrollbar-thumb-container, var(--forge-theme-surface-container-medium, #c2c2c2));\n background-clip: content-box;\n}\n.message-thread::-webkit-scrollbar-thumb:hover {\n background-color: var(--forge-scrollbar-thumb-container-hover, var(--forge-theme-surface-container-high, #9e9e9e));\n}\n.message-thread {\n display: flex;\n flex-direction: column;\n gap: var(--forge-spacing-xlarge, 32px);\n padding-block-end: var(--forge-spacing-large, 24px);\n overflow-y: auto;\n padding: var(--forge-spacing-medium, 16px) var(--forge-spacing-medium, 16px) var(--forge-spacing-xxlarge, 48px) var(--forge-spacing-medium, 16px);\n}\n@media not all and (min-resolution: 0.001dpcm) {\n @supports (-webkit-appearance: none) {\n .message-thread {\n overflow-y: scroll;\n }\n }\n}\n\n.thinking-indicator {\n margin-block-start: var(--forge-spacing-xsmall, 8px);\n}\n\n.system-message {\n -moz-osx-font-smoothing: grayscale;\n -webkit-font-smoothing: antialiased;\n font-family: var(--forge-typography-subheading2-font-family, var(--forge-typography-font-family, "Roboto", sans-serif));\n font-size: var(--forge-typography-subheading2-font-size, calc(var(--forge-typography-font-size, 1rem) * var(--forge-typography-subheading2-font-size-scale, 1)));\n font-weight: var(--forge-typography-subheading2-font-weight, 400);\n line-height: var(--forge-typography-subheading2-line-height, calc(var(--forge-typography-font-size, 1rem) * var(--forge-typography-subheading2-line-height-scale, 1.25)));\n letter-spacing: var(--forge-typography-subheading2-letter-spacing, normal);\n text-transform: var(--forge-typography-subheading2-text-transform, inherit);\n text-decoration: var(--forge-typography-subheading2-text-decoration, inherit);\n color: var(--forge-theme-text-medium, rgba(0, 0, 0, 0.6));\n padding-block: var(--forge-spacing-small, 12px);\n}\n\n.scroll-to-bottom-button {\n --forge-fab-size: 40px;\n --forge-fab-background: var(--forge-theme-surface, #ffffff);\n position: absolute;\n bottom: var(--forge-spacing-xxsmall, 4px);\n left: 50%;\n transform: translateX(-50%) translateY(24px);\n opacity: 0;\n z-index: 1;\n animation-name: scroll-button-enter;\n animation-duration: var(--forge-animation-duration-medium1, 250ms);\n animation-timing-function: var(--forge-animation-easing-decelerate, cubic-bezier(0, 0, 0, 1));\n animation-fill-mode: forwards;\n}\n.scroll-to-bottom-button svg {\n width: 24px;\n height: 24px;\n fill: currentColor;\n}\n\n@keyframes scroll-button-enter {\n from {\n opacity: 0;\n transform: translateX(-50%) translateY(24px);\n }\n to {\n opacity: 1;\n transform: translateX(-50%) translateY(0);\n }\n}\nforge-ai-user-message {\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-on-surface, #000000);\n overflow-wrap: break-word;\n line-height: 1.5;\n}\nforge-ai-user-message h1,\nforge-ai-user-message h2,\nforge-ai-user-message h3,\nforge-ai-user-message h4,\nforge-ai-user-message h5,\nforge-ai-user-message h6 {\n margin: 1.75rem 0 var(--forge-spacing-small, 12px);\n}\nforge-ai-user-message strong {\n font-weight: 500;\n}\nforge-ai-user-message a {\n color: var(--forge-theme-primary, #3f51b5);\n}\nforge-ai-user-message hr {\n border: none;\n border-top: 1px solid var(--forge-theme-outline, #e0e0e0);\n}\nforge-ai-user-message 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.75rem;\n}\nforge-ai-user-message 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-block: var(--forge-spacing-medium, 16px) 0;\n}\nforge-ai-user-message 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 overflow-x: auto;\n}\nforge-ai-user-message > p:has(+ ol),\nforge-ai-user-message > p:has(+ ul) {\n margin-block-end: var(--forge-spacing-small, 12px);\n}\nforge-ai-user-message > ul {\n list-style-type: disc;\n padding-inline-start: 1.6875rem;\n}\nforge-ai-user-message > ol {\n padding-inline-start: 1.75rem;\n}\nforge-ai-user-message > ol,\nforge-ai-user-message > ul {\n margin: var(--forge-spacing-xsmall, 8px) 0;\n margin-block-end: var(--forge-spacing-medium, 16px);\n}\nforge-ai-user-message > :first-child {\n margin-block-start: 0;\n}\nforge-ai-user-message > p {\n margin-block-end: var(--forge-spacing-medium, 16px);\n overflow-wrap: anywhere;\n}\nforge-ai-user-message > p:first-child {\n margin-block-start: 0;\n}\nforge-ai-user-message > p:last-child {\n margin-block-end: 0;\n}';
|
|
2
2
|
export {
|
|
3
3
|
styles as default
|
|
4
4
|
};
|
|
@@ -78,6 +78,11 @@ export declare class AiPromptComponent extends LitElement {
|
|
|
78
78
|
* Use this when sending messages externally (e.g., from suggestions).
|
|
79
79
|
*/
|
|
80
80
|
addToHistory(message: string): void;
|
|
81
|
+
/**
|
|
82
|
+
* Replaces the entire message history with the provided messages.
|
|
83
|
+
* Use this when restoring thread state from persistence.
|
|
84
|
+
*/
|
|
85
|
+
setHistory(messages: string[]): void;
|
|
81
86
|
private _handleSend;
|
|
82
87
|
private _handleInput;
|
|
83
88
|
private _handleKeyDown;
|
|
@@ -4,6 +4,7 @@ import { when } from "lit/directives/when.js";
|
|
|
4
4
|
import { toggleState } from "../utils.mjs";
|
|
5
5
|
import styles from "./ai-prompt.scss.mjs";
|
|
6
6
|
import "../ai-slash-command-menu/ai-slash-command-menu.mjs";
|
|
7
|
+
import "../core/tooltip/tooltip.mjs";
|
|
7
8
|
var __defProp = Object.defineProperty;
|
|
8
9
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
9
10
|
var __typeError = (msg) => {
|
|
@@ -30,7 +31,7 @@ var __privateWrapper = (obj, member, setter, getter) => ({
|
|
|
30
31
|
return __privateGet(obj, member, getter);
|
|
31
32
|
}
|
|
32
33
|
});
|
|
33
|
-
var _internals, _messageHistory, _historyIndex, _draftMessage, _AiPromptComponent_instances, setCssState_fn, resetHistoryNavigation_fn, navigateHistory_fn, _actionsSlot, shouldShowStopButton_get, conditionalActions_get, handleSlotChange_fn, handleSlashCommandSelect_fn, handleSlashCommandClose_fn, slashCommandMenu_get;
|
|
34
|
+
var _internals, _messageHistory, _historyIndex, _draftMessage, _AiPromptComponent_instances, setCssState_fn, resetHistoryNavigation_fn, isCursorOnFirstLine_fn, isCursorOnLastLine_fn, isCursorAtStart_fn, isCursorAtEnd_fn, moveCursorToStart_fn, moveCursorToEnd_fn, navigateHistory_fn, _actionsSlot, shouldShowStopButton_get, conditionalActions_get, handleSlotChange_fn, handleSlashCommandSelect_fn, handleSlashCommandClose_fn, slashCommandMenu_get;
|
|
34
35
|
const MAX_HISTORY_SIZE = 50;
|
|
35
36
|
const AiPromptComponentTagName = "forge-ai-prompt";
|
|
36
37
|
let AiPromptComponent = class extends LitElement {
|
|
@@ -86,6 +87,14 @@ let AiPromptComponent = class extends LitElement {
|
|
|
86
87
|
}
|
|
87
88
|
__privateMethod(this, _AiPromptComponent_instances, resetHistoryNavigation_fn).call(this);
|
|
88
89
|
}
|
|
90
|
+
/**
|
|
91
|
+
* Replaces the entire message history with the provided messages.
|
|
92
|
+
* Use this when restoring thread state from persistence.
|
|
93
|
+
*/
|
|
94
|
+
setHistory(messages) {
|
|
95
|
+
__privateSet(this, _messageHistory, messages.map((msg) => msg?.trim()).filter((msg) => msg.length > 0).slice(-MAX_HISTORY_SIZE));
|
|
96
|
+
__privateMethod(this, _AiPromptComponent_instances, resetHistoryNavigation_fn).call(this);
|
|
97
|
+
}
|
|
89
98
|
_handleSend() {
|
|
90
99
|
if (this.sendDisabled || this.inputDisabled || !this.value.trim()) {
|
|
91
100
|
return;
|
|
@@ -140,13 +149,26 @@ let AiPromptComponent = class extends LitElement {
|
|
|
140
149
|
}
|
|
141
150
|
const hasModifier = event.shiftKey || event.ctrlKey || event.metaKey;
|
|
142
151
|
if (!hasModifier) {
|
|
143
|
-
if (event.key === "ArrowUp") {
|
|
144
|
-
if (__privateMethod(this, _AiPromptComponent_instances,
|
|
152
|
+
if (event.key === "ArrowUp" && __privateMethod(this, _AiPromptComponent_instances, isCursorOnFirstLine_fn).call(this)) {
|
|
153
|
+
if (__privateMethod(this, _AiPromptComponent_instances, isCursorAtStart_fn).call(this)) {
|
|
154
|
+
if (__privateMethod(this, _AiPromptComponent_instances, navigateHistory_fn).call(this, -1)) {
|
|
155
|
+
__privateMethod(this, _AiPromptComponent_instances, moveCursorToStart_fn).call(this);
|
|
156
|
+
event.preventDefault();
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
} else {
|
|
160
|
+
__privateMethod(this, _AiPromptComponent_instances, moveCursorToStart_fn).call(this);
|
|
145
161
|
event.preventDefault();
|
|
146
162
|
return;
|
|
147
163
|
}
|
|
148
|
-
} else if (event.key === "ArrowDown") {
|
|
149
|
-
if (__privateMethod(this, _AiPromptComponent_instances,
|
|
164
|
+
} else if (event.key === "ArrowDown" && __privateMethod(this, _AiPromptComponent_instances, isCursorOnLastLine_fn).call(this)) {
|
|
165
|
+
if (__privateMethod(this, _AiPromptComponent_instances, isCursorAtEnd_fn).call(this)) {
|
|
166
|
+
if (__privateMethod(this, _AiPromptComponent_instances, navigateHistory_fn).call(this, 1)) {
|
|
167
|
+
event.preventDefault();
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
} else {
|
|
171
|
+
__privateMethod(this, _AiPromptComponent_instances, moveCursorToEnd_fn).call(this);
|
|
150
172
|
event.preventDefault();
|
|
151
173
|
return;
|
|
152
174
|
}
|
|
@@ -243,6 +265,7 @@ let AiPromptComponent = class extends LitElement {
|
|
|
243
265
|
this.debugMode,
|
|
244
266
|
() => html`
|
|
245
267
|
<button
|
|
268
|
+
id="debug-btn"
|
|
246
269
|
aria-label="Exit debug mode"
|
|
247
270
|
class="forge-icon-button forge-icon-button--medium forge-icon-button--tonal ai-icon-button debug-button"
|
|
248
271
|
@click=${this._handleDebugToggle}>
|
|
@@ -251,9 +274,11 @@ let AiPromptComponent = class extends LitElement {
|
|
|
251
274
|
d="M20 8h-2.81a5.985 5.985 0 0 0-1.82-1.96L17 4.41 15.59 3l-2.17 2.17a6.002 6.002 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-1H20V8zm-6 8h-4v-2h4v2zm0-4h-4v-2h4v2z" />
|
|
252
275
|
</svg>
|
|
253
276
|
</button>
|
|
277
|
+
<forge-ai-tooltip for="debug-btn" placement="top">Exit debug mode</forge-ai-tooltip>
|
|
254
278
|
`
|
|
255
279
|
)}
|
|
256
280
|
<button
|
|
281
|
+
id="send-btn"
|
|
257
282
|
aria-label=${__privateGet(this, _AiPromptComponent_instances, shouldShowStopButton_get) ? "Stop" : "Send message"}
|
|
258
283
|
class="forge-icon-button forge-icon-button--medium ai-icon-button"
|
|
259
284
|
?disabled=${this.sendDisabled || this.inputDisabled}
|
|
@@ -264,6 +289,9 @@ let AiPromptComponent = class extends LitElement {
|
|
|
264
289
|
<path d="m2 21 21-9L2 3v7l15 2-15 2z" />
|
|
265
290
|
</svg>`}
|
|
266
291
|
</button>
|
|
292
|
+
<forge-ai-tooltip for="send-btn" placement="top"
|
|
293
|
+
>${__privateGet(this, _AiPromptComponent_instances, shouldShowStopButton_get) ? "Stop" : "Send"}</forge-ai-tooltip
|
|
294
|
+
>
|
|
267
295
|
</div>
|
|
268
296
|
${when(this.variant === "stacked", () => html`${__privateGet(this, _AiPromptComponent_instances, conditionalActions_get)}`)}
|
|
269
297
|
</div>
|
|
@@ -285,6 +313,29 @@ resetHistoryNavigation_fn = function() {
|
|
|
285
313
|
__privateSet(this, _historyIndex, -1);
|
|
286
314
|
__privateSet(this, _draftMessage, "");
|
|
287
315
|
};
|
|
316
|
+
isCursorOnFirstLine_fn = function() {
|
|
317
|
+
const cursorPos = this._inputElement?.selectionStart ?? 0;
|
|
318
|
+
const textBeforeCursor = this.value.substring(0, cursorPos);
|
|
319
|
+
return !textBeforeCursor.includes("\n");
|
|
320
|
+
};
|
|
321
|
+
isCursorOnLastLine_fn = function() {
|
|
322
|
+
const cursorPos = this._inputElement?.selectionStart ?? 0;
|
|
323
|
+
const textAfterCursor = this.value.substring(cursorPos);
|
|
324
|
+
return !textAfterCursor.includes("\n");
|
|
325
|
+
};
|
|
326
|
+
isCursorAtStart_fn = function() {
|
|
327
|
+
return (this._inputElement?.selectionStart ?? 0) === 0;
|
|
328
|
+
};
|
|
329
|
+
isCursorAtEnd_fn = function() {
|
|
330
|
+
return (this._inputElement?.selectionStart ?? 0) === this.value.length;
|
|
331
|
+
};
|
|
332
|
+
moveCursorToStart_fn = function() {
|
|
333
|
+
this._inputElement?.setSelectionRange(0, 0);
|
|
334
|
+
};
|
|
335
|
+
moveCursorToEnd_fn = function() {
|
|
336
|
+
const len = this.value.length;
|
|
337
|
+
this._inputElement?.setSelectionRange(len, len);
|
|
338
|
+
};
|
|
288
339
|
navigateHistory_fn = function(direction) {
|
|
289
340
|
if (__privateGet(this, _messageHistory).length === 0) {
|
|
290
341
|
return false;
|
|
@@ -69,7 +69,7 @@ let AiSlashCommandMenuComponent = class extends LitElement {
|
|
|
69
69
|
placement="top-start"
|
|
70
70
|
.open=${this.open}
|
|
71
71
|
dismiss-mode="manual"
|
|
72
|
-
.offset=${{ mainAxis:
|
|
72
|
+
.offset=${{ mainAxis: 8, crossAxis: -14 }}
|
|
73
73
|
@forge-ai-popover-toggle=${__privateMethod(this, _AiSlashCommandMenuComponent_instances, handlePopoverToggle_fn)}>
|
|
74
74
|
<div class="slash-command-menu__header">
|
|
75
75
|
<span>Slash Commands</span>
|
|
@@ -3,13 +3,38 @@ declare global {
|
|
|
3
3
|
interface HTMLElementTagNameMap {
|
|
4
4
|
'forge-ai-user-message': AiUserMessageComponent;
|
|
5
5
|
}
|
|
6
|
+
interface HTMLElementEventMap {
|
|
7
|
+
'forge-ai-user-message-copy': CustomEvent<ForgeAiUserMessageCopyEventData>;
|
|
8
|
+
'forge-ai-user-message-resend': CustomEvent<ForgeAiUserMessageResendEventData>;
|
|
9
|
+
'forge-ai-user-message-edit': CustomEvent<ForgeAiUserMessageEditEventData>;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
export interface ForgeAiUserMessageCopyEventData {
|
|
13
|
+
messageId: string;
|
|
14
|
+
}
|
|
15
|
+
export interface ForgeAiUserMessageResendEventData {
|
|
16
|
+
messageId: string;
|
|
17
|
+
}
|
|
18
|
+
export interface ForgeAiUserMessageEditEventData {
|
|
19
|
+
messageId: string;
|
|
20
|
+
content: string;
|
|
6
21
|
}
|
|
7
22
|
export declare const AiUserMessageComponentTagName: keyof HTMLElementTagNameMap;
|
|
8
23
|
/**
|
|
9
24
|
* @tag forge-ai-user-message
|
|
25
|
+
*
|
|
26
|
+
* @event {CustomEvent<ForgeAiUserMessageCopyEventData>} forge-ai-user-message-copy - Fired when user clicks copy button
|
|
27
|
+
* @event {CustomEvent<ForgeAiUserMessageResendEventData>} forge-ai-user-message-resend - Fired when user clicks resend button
|
|
28
|
+
* @event {CustomEvent<ForgeAiUserMessageEditEventData>} forge-ai-user-message-edit - Fired when user saves edited message
|
|
10
29
|
*/
|
|
11
30
|
export declare class AiUserMessageComponent extends LitElement {
|
|
12
31
|
#private;
|
|
13
32
|
static styles: import('lit').CSSResult;
|
|
33
|
+
timestamp?: number;
|
|
34
|
+
messageId?: string;
|
|
35
|
+
streaming: boolean;
|
|
36
|
+
content?: string;
|
|
37
|
+
private _editing;
|
|
38
|
+
private _editContent;
|
|
14
39
|
render(): TemplateResult;
|
|
15
40
|
}
|
|
@@ -1,6 +1,9 @@
|
|
|
1
|
-
import { unsafeCSS, LitElement, html } from "lit";
|
|
2
|
-
import { customElement } from "lit/decorators.js";
|
|
1
|
+
import { unsafeCSS, LitElement, html, nothing } from "lit";
|
|
2
|
+
import { property, state, customElement } from "lit/decorators.js";
|
|
3
|
+
import { when } from "lit/directives/when.js";
|
|
4
|
+
import "../core/tooltip/tooltip.mjs";
|
|
3
5
|
import styles from "./ai-user-message.scss.mjs";
|
|
6
|
+
var __defProp = Object.defineProperty;
|
|
4
7
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
8
|
var __typeError = (msg) => {
|
|
6
9
|
throw TypeError(msg);
|
|
@@ -9,17 +12,41 @@ var __decorateClass = (decorators, target, key, kind) => {
|
|
|
9
12
|
var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
|
|
10
13
|
for (var i = decorators.length - 1, decorator; i >= 0; i--)
|
|
11
14
|
if (decorator = decorators[i])
|
|
12
|
-
result = decorator(result) || result;
|
|
15
|
+
result = (kind ? decorator(target, key, result) : decorator(result)) || result;
|
|
16
|
+
if (kind && result) __defProp(target, key, result);
|
|
13
17
|
return result;
|
|
14
18
|
};
|
|
15
19
|
var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
|
|
16
20
|
var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
|
|
17
21
|
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);
|
|
18
|
-
var
|
|
22
|
+
var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "access private method"), method);
|
|
23
|
+
var _refreshIcon, _copyIcon, _editIcon, _messageContainer, _AiUserMessageComponent_instances, formattedTime_get, formattedFullDate_get, isSaveDisabled_get, editContainer_get, toolbar_get, handleCopy_fn, handleResend_fn, handleEditClick_fn, handleEditInput_fn, handleCancel_fn, handleSave_fn;
|
|
19
24
|
const AiUserMessageComponentTagName = "forge-ai-user-message";
|
|
20
25
|
let AiUserMessageComponent = class extends LitElement {
|
|
21
26
|
constructor() {
|
|
22
27
|
super(...arguments);
|
|
28
|
+
__privateAdd(this, _AiUserMessageComponent_instances);
|
|
29
|
+
this.streaming = false;
|
|
30
|
+
this._editing = false;
|
|
31
|
+
this._editContent = "";
|
|
32
|
+
__privateAdd(this, _refreshIcon, html`
|
|
33
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
|
|
34
|
+
<path
|
|
35
|
+
d="M17.65 6.35A7.96 7.96 0 0 0 12 4a8 8 0 0 0-8 8 8 8 0 0 0 8 8c3.73 0 6.84-2.55 7.73-6h-2.08A5.99 5.99 0 0 1 12 18a6 6 0 0 1-6-6 6 6 0 0 1 6-6c1.66 0 3.14.69 4.22 1.78L13 11h7V4z" />
|
|
36
|
+
</svg>
|
|
37
|
+
`);
|
|
38
|
+
__privateAdd(this, _copyIcon, html`
|
|
39
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
|
|
40
|
+
<path
|
|
41
|
+
d="M19 21H8V7h11m0-2H8a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h11a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2m-3-4H4a2 2 0 0 0-2 2v14h2V3h12z" />
|
|
42
|
+
</svg>
|
|
43
|
+
`);
|
|
44
|
+
__privateAdd(this, _editIcon, html`
|
|
45
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
|
|
46
|
+
<path
|
|
47
|
+
d="M20.71 7.04c.39-.39.39-1.04 0-1.41l-2.34-2.34c-.37-.39-1.02-.39-1.41 0l-1.84 1.83 3.75 3.75M3 17.25V21h3.75L17.81 9.93l-3.75-3.75z" />
|
|
48
|
+
</svg>
|
|
49
|
+
`);
|
|
23
50
|
__privateAdd(this, _messageContainer, html`
|
|
24
51
|
<div class="ai-message-container">
|
|
25
52
|
<span>
|
|
@@ -29,11 +56,162 @@ let AiUserMessageComponent = class extends LitElement {
|
|
|
29
56
|
`);
|
|
30
57
|
}
|
|
31
58
|
render() {
|
|
32
|
-
return html`
|
|
59
|
+
return html`
|
|
60
|
+
<div class="grid-container">${this._editing ? __privateGet(this, _AiUserMessageComponent_instances, editContainer_get) : __privateGet(this, _messageContainer)} ${__privateGet(this, _AiUserMessageComponent_instances, toolbar_get)}</div>
|
|
61
|
+
`;
|
|
33
62
|
}
|
|
34
63
|
};
|
|
64
|
+
_refreshIcon = /* @__PURE__ */ new WeakMap();
|
|
65
|
+
_copyIcon = /* @__PURE__ */ new WeakMap();
|
|
66
|
+
_editIcon = /* @__PURE__ */ new WeakMap();
|
|
35
67
|
_messageContainer = /* @__PURE__ */ new WeakMap();
|
|
68
|
+
_AiUserMessageComponent_instances = /* @__PURE__ */ new WeakSet();
|
|
69
|
+
formattedTime_get = function() {
|
|
70
|
+
if (!this.timestamp) {
|
|
71
|
+
return "";
|
|
72
|
+
}
|
|
73
|
+
return new Date(this.timestamp).toLocaleTimeString([], {
|
|
74
|
+
hour: "2-digit",
|
|
75
|
+
minute: "2-digit"
|
|
76
|
+
});
|
|
77
|
+
};
|
|
78
|
+
formattedFullDate_get = function() {
|
|
79
|
+
if (!this.timestamp) {
|
|
80
|
+
return "";
|
|
81
|
+
}
|
|
82
|
+
return new Intl.DateTimeFormat("en-US", {
|
|
83
|
+
year: "numeric",
|
|
84
|
+
month: "short",
|
|
85
|
+
day: "numeric",
|
|
86
|
+
hour: "numeric",
|
|
87
|
+
minute: "2-digit"
|
|
88
|
+
}).format(this.timestamp);
|
|
89
|
+
};
|
|
90
|
+
isSaveDisabled_get = function() {
|
|
91
|
+
const trimmed = this._editContent.trim();
|
|
92
|
+
return !trimmed || trimmed === this.content?.trim();
|
|
93
|
+
};
|
|
94
|
+
editContainer_get = function() {
|
|
95
|
+
return html`
|
|
96
|
+
<div class="edit-container">
|
|
97
|
+
<textarea class="edit-textarea" .value=${this._editContent} @input=${__privateMethod(this, _AiUserMessageComponent_instances, handleEditInput_fn)}></textarea>
|
|
98
|
+
<div class="edit-footer">
|
|
99
|
+
<button class="forge-button forge-button--outlined" @click=${__privateMethod(this, _AiUserMessageComponent_instances, handleCancel_fn)}>Cancel</button>
|
|
100
|
+
<button
|
|
101
|
+
class="forge-button forge-button--raised"
|
|
102
|
+
?disabled=${__privateGet(this, _AiUserMessageComponent_instances, isSaveDisabled_get)}
|
|
103
|
+
@click=${__privateMethod(this, _AiUserMessageComponent_instances, handleSave_fn)}>
|
|
104
|
+
Save
|
|
105
|
+
</button>
|
|
106
|
+
</div>
|
|
107
|
+
</div>
|
|
108
|
+
`;
|
|
109
|
+
};
|
|
110
|
+
toolbar_get = function() {
|
|
111
|
+
if (!this.messageId || this._editing) {
|
|
112
|
+
return nothing;
|
|
113
|
+
}
|
|
114
|
+
return html`
|
|
115
|
+
<div class="toolbar-container">
|
|
116
|
+
<span id="timestamp" class="timestamp">${__privateGet(this, _AiUserMessageComponent_instances, formattedTime_get)}</span>
|
|
117
|
+
<forge-ai-tooltip for="timestamp" placement="bottom">${__privateGet(this, _AiUserMessageComponent_instances, formattedFullDate_get)}</forge-ai-tooltip>
|
|
118
|
+
|
|
119
|
+
${when(
|
|
120
|
+
!this.streaming,
|
|
121
|
+
() => html`
|
|
122
|
+
<button
|
|
123
|
+
id="resend-btn"
|
|
124
|
+
aria-label="Resend message"
|
|
125
|
+
class="forge-icon-button forge-icon-button--small"
|
|
126
|
+
@click=${__privateMethod(this, _AiUserMessageComponent_instances, handleResend_fn)}>
|
|
127
|
+
${__privateGet(this, _refreshIcon)}
|
|
128
|
+
</button>
|
|
129
|
+
<forge-ai-tooltip for="resend-btn" placement="bottom">Resend</forge-ai-tooltip>
|
|
130
|
+
|
|
131
|
+
<button
|
|
132
|
+
id="edit-btn"
|
|
133
|
+
aria-label="Edit message"
|
|
134
|
+
class="forge-icon-button forge-icon-button--small"
|
|
135
|
+
@click=${__privateMethod(this, _AiUserMessageComponent_instances, handleEditClick_fn)}>
|
|
136
|
+
${__privateGet(this, _editIcon)}
|
|
137
|
+
</button>
|
|
138
|
+
<forge-ai-tooltip for="edit-btn" placement="bottom">Edit</forge-ai-tooltip>
|
|
139
|
+
`
|
|
140
|
+
)}
|
|
141
|
+
|
|
142
|
+
<button
|
|
143
|
+
id="copy-btn"
|
|
144
|
+
aria-label="Copy message"
|
|
145
|
+
class="forge-icon-button forge-icon-button--small"
|
|
146
|
+
@click=${__privateMethod(this, _AiUserMessageComponent_instances, handleCopy_fn)}>
|
|
147
|
+
${__privateGet(this, _copyIcon)}
|
|
148
|
+
</button>
|
|
149
|
+
<forge-ai-tooltip for="copy-btn" placement="bottom">Copy</forge-ai-tooltip>
|
|
150
|
+
</div>
|
|
151
|
+
`;
|
|
152
|
+
};
|
|
153
|
+
handleCopy_fn = function() {
|
|
154
|
+
this.dispatchEvent(
|
|
155
|
+
new CustomEvent("forge-ai-user-message-copy", {
|
|
156
|
+
detail: { messageId: this.messageId },
|
|
157
|
+
bubbles: true,
|
|
158
|
+
composed: true
|
|
159
|
+
})
|
|
160
|
+
);
|
|
161
|
+
};
|
|
162
|
+
handleResend_fn = function() {
|
|
163
|
+
this.dispatchEvent(
|
|
164
|
+
new CustomEvent("forge-ai-user-message-resend", {
|
|
165
|
+
detail: { messageId: this.messageId },
|
|
166
|
+
bubbles: true,
|
|
167
|
+
composed: true
|
|
168
|
+
})
|
|
169
|
+
);
|
|
170
|
+
};
|
|
171
|
+
handleEditClick_fn = function() {
|
|
172
|
+
this._editContent = this.content ?? "";
|
|
173
|
+
this._editing = true;
|
|
174
|
+
};
|
|
175
|
+
handleEditInput_fn = function(evt) {
|
|
176
|
+
this._editContent = evt.target.value;
|
|
177
|
+
};
|
|
178
|
+
handleCancel_fn = function() {
|
|
179
|
+
this._editing = false;
|
|
180
|
+
this._editContent = "";
|
|
181
|
+
};
|
|
182
|
+
handleSave_fn = function() {
|
|
183
|
+
if (__privateGet(this, _AiUserMessageComponent_instances, isSaveDisabled_get)) {
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
this.dispatchEvent(
|
|
187
|
+
new CustomEvent("forge-ai-user-message-edit", {
|
|
188
|
+
detail: { messageId: this.messageId, content: this._editContent.trim() },
|
|
189
|
+
bubbles: true,
|
|
190
|
+
composed: true
|
|
191
|
+
})
|
|
192
|
+
);
|
|
193
|
+
this._editing = false;
|
|
194
|
+
this._editContent = "";
|
|
195
|
+
};
|
|
36
196
|
AiUserMessageComponent.styles = unsafeCSS(styles);
|
|
197
|
+
__decorateClass([
|
|
198
|
+
property({ attribute: false })
|
|
199
|
+
], AiUserMessageComponent.prototype, "timestamp", 2);
|
|
200
|
+
__decorateClass([
|
|
201
|
+
property({ attribute: "message-id" })
|
|
202
|
+
], AiUserMessageComponent.prototype, "messageId", 2);
|
|
203
|
+
__decorateClass([
|
|
204
|
+
property({ type: Boolean })
|
|
205
|
+
], AiUserMessageComponent.prototype, "streaming", 2);
|
|
206
|
+
__decorateClass([
|
|
207
|
+
property({ attribute: false })
|
|
208
|
+
], AiUserMessageComponent.prototype, "content", 2);
|
|
209
|
+
__decorateClass([
|
|
210
|
+
state()
|
|
211
|
+
], AiUserMessageComponent.prototype, "_editing", 2);
|
|
212
|
+
__decorateClass([
|
|
213
|
+
state()
|
|
214
|
+
], AiUserMessageComponent.prototype, "_editContent", 2);
|
|
37
215
|
AiUserMessageComponent = __decorateClass([
|
|
38
216
|
customElement(AiUserMessageComponentTagName)
|
|
39
217
|
], AiUserMessageComponent);
|