@tylertech/forge-ai 0.4.1 → 0.6.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 +6894 -2090
- package/dist/ai-actions-toolbar/ai-actions-toolbar.d.ts +24 -1
- package/dist/ai-actions-toolbar/ai-actions-toolbar.mjs +171 -42
- package/dist/ai-actions-toolbar/ai-actions-toolbar.scss.mjs +1 -1
- package/dist/ai-agent-info/ai-agent-info.d.ts +29 -0
- package/dist/ai-agent-info/ai-agent-info.mjs +123 -0
- package/dist/ai-agent-info/ai-agent-info.scss.mjs +4 -0
- package/dist/ai-agent-info/index.d.ts +1 -0
- package/dist/ai-agent-info/index.mjs +5 -0
- package/dist/ai-artifact/ai-artifact.scss.mjs +1 -1
- package/dist/ai-attachment/ai-attachment.d.ts +39 -0
- package/dist/ai-attachment/ai-attachment.mjs +130 -0
- package/dist/ai-attachment/ai-attachment.scss.mjs +4 -0
- package/dist/ai-attachment/index.d.ts +1 -0
- package/dist/ai-attachment/index.mjs +5 -0
- package/dist/ai-button/ai-button.mjs +1 -0
- package/dist/ai-button/ai-button.scss.mjs +1 -1
- package/dist/ai-chain-of-thought/thought-base/thought-base.scss.mjs +1 -1
- package/dist/ai-chat-header/ai-chat-header.d.ts +39 -17
- package/dist/ai-chat-header/ai-chat-header.mjs +136 -30
- package/dist/ai-chat-header/ai-chat-header.scss.mjs +1 -1
- package/dist/ai-chat-header/index.d.ts +1 -0
- package/dist/ai-chat-interface/ai-chat-interface.d.ts +2 -4
- package/dist/ai-chat-interface/ai-chat-interface.mjs +24 -28
- package/dist/ai-chat-interface/ai-chat-interface.scss.mjs +1 -1
- package/dist/ai-chatbot/ag-ui-adapter.d.ts +22 -0
- package/dist/ai-chatbot/ag-ui-adapter.mjs +340 -0
- package/dist/ai-chatbot/agent-adapter.d.ts +133 -0
- package/dist/ai-chatbot/agent-adapter.mjs +136 -0
- package/dist/ai-chatbot/agent-runner.d.ts +41 -0
- package/dist/ai-chatbot/agent-runner.mjs +264 -0
- package/dist/ai-chatbot/ai-chatbot-tool-call.d.ts +24 -0
- package/dist/ai-chatbot/ai-chatbot-tool-call.mjs +252 -0
- package/dist/ai-chatbot/ai-chatbot-tool-call.scss.mjs +4 -0
- package/dist/ai-chatbot/ai-chatbot.d.ts +134 -0
- package/dist/ai-chatbot/ai-chatbot.mjs +816 -0
- package/dist/ai-chatbot/ai-chatbot.scss.mjs +4 -0
- package/dist/ai-chatbot/create-tool-renderer.d.ts +9 -0
- package/dist/ai-chatbot/create-tool-renderer.mjs +16 -0
- package/dist/ai-chatbot/event-emitter.d.ts +43 -0
- package/dist/ai-chatbot/event-emitter.mjs +81 -0
- package/dist/ai-chatbot/file-upload-manager.d.ts +27 -0
- package/dist/ai-chatbot/file-upload-manager.mjs +106 -0
- package/dist/ai-chatbot/http-agent-with-credentials.d.ts +8 -0
- package/dist/ai-chatbot/http-agent-with-credentials.mjs +14 -0
- package/dist/ai-chatbot/index.d.ts +15 -0
- package/dist/ai-chatbot/index.mjs +30 -0
- package/dist/ai-chatbot/markdown-stream-controller.d.ts +13 -0
- package/dist/ai-chatbot/markdown-stream-controller.mjs +49 -0
- package/dist/ai-chatbot/message-state-controller.d.ts +49 -0
- package/dist/ai-chatbot/message-state-controller.mjs +257 -0
- package/dist/ai-chatbot/types.d.ts +209 -0
- package/dist/ai-chatbot/utils.d.ts +12 -0
- package/dist/ai-chatbot/utils.mjs +32 -0
- package/dist/ai-confirmation-prompt/ai-confirmation-prompt.d.ts +28 -0
- package/dist/ai-confirmation-prompt/ai-confirmation-prompt.mjs +89 -0
- package/dist/ai-confirmation-prompt/ai-confirmation-prompt.scss.mjs +4 -0
- package/dist/ai-confirmation-prompt/index.d.ts +1 -0
- package/dist/ai-confirmation-prompt/index.mjs +5 -0
- package/dist/ai-dialog/ai-dialog.scss.mjs +1 -1
- package/dist/ai-dropdown-menu/ai-dropdown-menu-item.d.ts +1 -9
- package/dist/ai-dropdown-menu/ai-dropdown-menu-item.mjs +3 -16
- package/dist/ai-dropdown-menu/ai-dropdown-menu-item.scss.mjs +1 -1
- package/dist/ai-dropdown-menu/ai-dropdown-menu.d.ts +11 -6
- package/dist/ai-dropdown-menu/ai-dropdown-menu.mjs +13 -3
- package/dist/ai-dropdown-menu/ai-dropdown-menu.scss.mjs +1 -1
- package/dist/ai-dropdown-menu/selection-manager.mjs +3 -3
- package/dist/ai-embedded-chat/ai-embedded-chat.d.ts +18 -5
- package/dist/ai-embedded-chat/ai-embedded-chat.mjs +44 -18
- package/dist/ai-empty-state/ai-empty-state.d.ts +4 -2
- package/dist/ai-empty-state/ai-empty-state.mjs +237 -57
- package/dist/ai-empty-state/ai-empty-state.scss.mjs +1 -1
- package/dist/ai-error-message/ai-error-message.d.ts +19 -0
- package/dist/ai-error-message/ai-error-message.mjs +44 -0
- package/dist/ai-error-message/ai-error-message.scss.mjs +4 -0
- package/dist/ai-error-message/index.d.ts +1 -0
- package/dist/ai-error-message/index.mjs +5 -0
- package/dist/ai-event-stream-viewer/ai-event-stream-viewer.d.ts +19 -0
- package/dist/ai-event-stream-viewer/ai-event-stream-viewer.mjs +164 -0
- package/dist/ai-event-stream-viewer/ai-event-stream-viewer.scss.mjs +4 -0
- package/dist/ai-event-stream-viewer/index.d.ts +1 -0
- package/dist/ai-event-stream-viewer/index.mjs +5 -0
- package/dist/ai-fab/ai-fab.scss.mjs +1 -1
- package/dist/ai-file-picker/ai-file-picker.d.ts +20 -14
- package/dist/ai-file-picker/ai-file-picker.mjs +67 -20
- package/dist/ai-file-picker/ai-file-picker.scss.mjs +1 -1
- package/dist/ai-file-picker/index.d.ts +1 -1
- package/dist/ai-floating-chat/ai-floating-chat.d.ts +5 -30
- package/dist/ai-floating-chat/ai-floating-chat.mjs +19 -42
- package/dist/ai-gradient-container/ai-gradient-container.scss.mjs +1 -1
- package/dist/ai-icon/ai-icon.scss.mjs +1 -1
- package/dist/ai-icon-button/ai-icon-button.d.ts +19 -0
- package/dist/ai-icon-button/ai-icon-button.mjs +63 -0
- package/dist/ai-icon-button/ai-icon-button.scss.mjs +4 -0
- package/dist/ai-icon-button/index.d.ts +1 -0
- package/dist/ai-icon-button/index.mjs +5 -0
- package/dist/ai-message-thread/ai-message-thread.d.ts +59 -0
- package/dist/ai-message-thread/ai-message-thread.mjs +238 -0
- package/dist/ai-message-thread/ai-message-thread.scss.mjs +4 -0
- package/dist/ai-message-thread/index.d.ts +2 -0
- package/dist/ai-message-thread/index.mjs +5 -0
- package/dist/ai-modal/ai-modal.d.ts +6 -0
- package/dist/ai-modal/ai-modal.mjs +31 -14
- package/dist/ai-modal/ai-modal.scss.mjs +1 -1
- package/dist/ai-prompt/ai-prompt.d.ts +21 -0
- package/dist/ai-prompt/ai-prompt.mjs +135 -15
- package/dist/ai-prompt/ai-prompt.scss.mjs +1 -1
- package/dist/ai-prompt/prompt-button/prompt-button.scss.mjs +1 -1
- package/dist/ai-response-message/ai-response-message.d.ts +17 -21
- package/dist/ai-response-message/ai-response-message.mjs +86 -85
- package/dist/ai-response-message/ai-response-message.scss.mjs +1 -1
- package/dist/ai-sidebar/ai-sidebar.mjs +1 -1
- package/dist/ai-sidebar-chat/ai-sidebar-chat.d.ts +5 -29
- package/dist/ai-sidebar-chat/ai-sidebar-chat.mjs +23 -43
- package/dist/ai-slash-command-menu/ai-slash-command-menu.d.ts +33 -0
- package/dist/ai-slash-command-menu/ai-slash-command-menu.mjs +200 -0
- package/dist/ai-slash-command-menu/ai-slash-command-menu.scss.mjs +4 -0
- package/dist/ai-slash-command-menu/index.d.ts +1 -0
- package/dist/ai-slash-command-menu/index.mjs +5 -0
- package/dist/ai-spinner/ai-spinner.d.ts +24 -0
- package/dist/ai-spinner/ai-spinner.mjs +41 -0
- package/dist/ai-spinner/ai-spinner.scss.mjs +4 -0
- package/dist/ai-spinner/index.d.ts +1 -0
- package/dist/ai-spinner/index.mjs +5 -0
- package/dist/ai-suggestions/ai-suggestions.d.ts +4 -0
- package/dist/ai-suggestions/ai-suggestions.mjs +66 -7
- package/dist/ai-suggestions/ai-suggestions.scss.mjs +1 -1
- package/dist/ai-suggestions/index.d.ts +2 -1
- package/dist/ai-thinking-indicator/ai-thinking-indicator.d.ts +6 -1
- package/dist/ai-thinking-indicator/ai-thinking-indicator.mjs +94 -5
- package/dist/ai-thinking-indicator/ai-thinking-indicator.scss.mjs +320 -1
- package/dist/ai-threads/ai-threads.d.ts +9 -4
- package/dist/ai-threads/ai-threads.mjs +21 -41
- package/dist/ai-threads/ai-threads.scss.mjs +1 -1
- package/dist/ai-user-message/ai-user-message.scss.mjs +1 -1
- package/dist/ai-voice-input/ai-voice-input.scss.mjs +1 -1
- package/dist/core/drag-controller.mjs +3 -0
- package/dist/core/overlay/index.d.ts +1 -1
- package/dist/core/overlay/overlay.d.ts +20 -5
- package/dist/core/overlay/overlay.mjs +29 -4
- package/dist/core/popover/index.d.ts +1 -1
- package/dist/core/popover/popover.d.ts +24 -13
- package/dist/core/popover/popover.mjs +22 -3
- package/dist/core/popover/popover.scss.mjs +1 -1
- package/dist/core/tooltip/tooltip.d.ts +10 -9
- package/dist/core/tooltip/tooltip.mjs +45 -16
- package/dist/core/tooltip/tooltip.scss.mjs +1 -1
- package/dist/index.d.ts +12 -4
- package/dist/index.mjs +58 -9
- package/dist/tools/ai-data-table/ai-data-table-definition.d.ts +2 -0
- package/dist/tools/ai-data-table/ai-data-table-definition.mjs +43 -0
- package/dist/tools/ai-data-table/ai-data-table.d.ts +33 -0
- package/dist/tools/ai-data-table/ai-data-table.mjs +206 -0
- package/dist/tools/ai-data-table/ai-data-table.scss.mjs +4 -0
- package/dist/tools/ai-data-table/index.d.ts +2 -0
- package/dist/tools/ai-data-table/index.mjs +6 -0
- package/dist/tools/ai-paginator/ai-paginator.d.ts +17 -0
- package/dist/tools/ai-paginator/ai-paginator.mjs +110 -0
- package/dist/tools/ai-paginator/ai-paginator.scss.mjs +4 -0
- package/dist/tools/ai-paginator/index.d.ts +1 -0
- package/dist/tools/ai-paginator/index.mjs +4 -0
- package/dist/tools/index.d.ts +2 -0
- package/dist/tools/index.mjs +8 -0
- package/dist/utils/keyboard-navigation-controller.d.ts +13 -0
- package/dist/utils/keyboard-navigation-controller.mjs +71 -0
- package/package.json +65 -60
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
class MessageStateController {
|
|
2
|
+
constructor(_host, _config) {
|
|
3
|
+
this._host = _host;
|
|
4
|
+
this._config = _config;
|
|
5
|
+
this._messageItems = [];
|
|
6
|
+
this._toolCalls = /* @__PURE__ */ new Map();
|
|
7
|
+
_host.addController(this);
|
|
8
|
+
}
|
|
9
|
+
hostConnected() {
|
|
10
|
+
}
|
|
11
|
+
hostDisconnected() {
|
|
12
|
+
this._messageItems = [];
|
|
13
|
+
this._toolCalls.clear();
|
|
14
|
+
}
|
|
15
|
+
updateConfig(config) {
|
|
16
|
+
this._config = { ...this._config, ...config };
|
|
17
|
+
}
|
|
18
|
+
get messageItems() {
|
|
19
|
+
return this._messageItems;
|
|
20
|
+
}
|
|
21
|
+
getToolCall(id) {
|
|
22
|
+
return this._toolCalls.get(id);
|
|
23
|
+
}
|
|
24
|
+
#notifyStateChange() {
|
|
25
|
+
this._host.requestUpdate();
|
|
26
|
+
}
|
|
27
|
+
addMessageItem(item) {
|
|
28
|
+
this._messageItems = [...this._messageItems, item];
|
|
29
|
+
this.#notifyStateChange();
|
|
30
|
+
}
|
|
31
|
+
addMessage(message, event) {
|
|
32
|
+
const existing = this.getMessage(message.id);
|
|
33
|
+
if (existing) {
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
this.addMessageItem({ type: "message", data: message });
|
|
37
|
+
if (event) {
|
|
38
|
+
this.#appendEventToMessage(message.id, {
|
|
39
|
+
type: "message-start",
|
|
40
|
+
timestamp: Date.now(),
|
|
41
|
+
data: event,
|
|
42
|
+
rawEvent: event.rawEvent
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
addToolCall(toolCall, event) {
|
|
47
|
+
this._toolCalls.set(toolCall.id, toolCall);
|
|
48
|
+
this.addMessageItem({ type: "toolCall", data: toolCall });
|
|
49
|
+
if (event) {
|
|
50
|
+
this.#appendEventToToolCall(toolCall.id, {
|
|
51
|
+
type: "tool-call-start",
|
|
52
|
+
timestamp: Date.now(),
|
|
53
|
+
data: event,
|
|
54
|
+
rawEvent: event.rawEvent
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
updateToolCall(toolCallId, updates, eventData) {
|
|
59
|
+
const toolCall = this._toolCalls.get(toolCallId);
|
|
60
|
+
if (!toolCall) {
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
const updated = { ...toolCall, ...updates };
|
|
64
|
+
this._toolCalls.set(toolCallId, updated);
|
|
65
|
+
this._messageItems = this._messageItems.map((item) => {
|
|
66
|
+
if (item.type === "toolCall" && item.data.id === toolCallId) {
|
|
67
|
+
return { ...item, data: updated };
|
|
68
|
+
}
|
|
69
|
+
return item;
|
|
70
|
+
});
|
|
71
|
+
if (eventData) {
|
|
72
|
+
if (eventData.eventType === "tool-call-args") {
|
|
73
|
+
const argsEvent = eventData.event;
|
|
74
|
+
this.#appendEventToToolCall(toolCallId, {
|
|
75
|
+
type: "tool-call-args",
|
|
76
|
+
timestamp: Date.now(),
|
|
77
|
+
data: argsEvent,
|
|
78
|
+
rawEvent: argsEvent.rawEvent
|
|
79
|
+
});
|
|
80
|
+
} else {
|
|
81
|
+
const endEvent = eventData.event;
|
|
82
|
+
this.#appendEventToToolCall(toolCallId, {
|
|
83
|
+
type: "tool-call-end",
|
|
84
|
+
timestamp: Date.now(),
|
|
85
|
+
data: endEvent,
|
|
86
|
+
rawEvent: endEvent.rawEvent
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
this.#notifyStateChange();
|
|
91
|
+
}
|
|
92
|
+
appendToMessage(id, content, event) {
|
|
93
|
+
this._messageItems = this._messageItems.map((item) => {
|
|
94
|
+
if (item.type === "message" && item.data.id === id) {
|
|
95
|
+
return { ...item, data: { ...item.data, content: item.data.content + content } };
|
|
96
|
+
}
|
|
97
|
+
return item;
|
|
98
|
+
});
|
|
99
|
+
if (event) {
|
|
100
|
+
this.#appendEventToMessage(id, {
|
|
101
|
+
type: "message-delta",
|
|
102
|
+
timestamp: Date.now(),
|
|
103
|
+
data: event,
|
|
104
|
+
rawEvent: event.rawEvent
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
this.#notifyStateChange();
|
|
108
|
+
}
|
|
109
|
+
getMessage(id) {
|
|
110
|
+
const item = this._messageItems.find((i) => i.type === "message" && i.data.id === id);
|
|
111
|
+
return item?.type === "message" ? item.data : void 0;
|
|
112
|
+
}
|
|
113
|
+
updateMessageStatus(id, status, event) {
|
|
114
|
+
this._messageItems = this._messageItems.map((item) => {
|
|
115
|
+
if (item.type === "message" && item.data.id === id) {
|
|
116
|
+
return { ...item, data: { ...item.data, status } };
|
|
117
|
+
}
|
|
118
|
+
return item;
|
|
119
|
+
});
|
|
120
|
+
if (event) {
|
|
121
|
+
this.#appendEventToMessage(id, {
|
|
122
|
+
type: "message-end",
|
|
123
|
+
timestamp: Date.now(),
|
|
124
|
+
data: event,
|
|
125
|
+
rawEvent: event.rawEvent
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
this.#notifyStateChange();
|
|
129
|
+
}
|
|
130
|
+
removeMessageItem(index) {
|
|
131
|
+
this._messageItems = this._messageItems.filter((_, i) => i !== index);
|
|
132
|
+
this.#notifyStateChange();
|
|
133
|
+
}
|
|
134
|
+
clearMessages() {
|
|
135
|
+
this._messageItems = [];
|
|
136
|
+
this._toolCalls.clear();
|
|
137
|
+
this.#notifyStateChange();
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Reconstructs the message hierarchy by grouping tool calls under their parent messages.
|
|
141
|
+
*
|
|
142
|
+
* messageItems stores messages and tool calls in a flat, chronologically ordered list.
|
|
143
|
+
* This method rebuilds the hierarchical structure where each message contains its tool calls.
|
|
144
|
+
*/
|
|
145
|
+
getMessages() {
|
|
146
|
+
const messageMap = /* @__PURE__ */ new Map();
|
|
147
|
+
const messageOrder = [];
|
|
148
|
+
for (const item of this._messageItems) {
|
|
149
|
+
if (item.type === "message") {
|
|
150
|
+
const msg = { ...item.data, toolCalls: [] };
|
|
151
|
+
messageMap.set(msg.id, msg);
|
|
152
|
+
messageOrder.push(msg.id);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
for (const item of this._messageItems) {
|
|
156
|
+
if (item.type === "toolCall") {
|
|
157
|
+
const parentMsg = messageMap.get(item.data.messageId);
|
|
158
|
+
if (parentMsg) {
|
|
159
|
+
parentMsg.toolCalls = [...parentMsg.toolCalls || [], item.data];
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
return messageOrder.map((id) => messageMap.get(id)).filter((msg) => msg !== void 0);
|
|
164
|
+
}
|
|
165
|
+
setMessages(messages) {
|
|
166
|
+
const messageItems = [];
|
|
167
|
+
this._toolCalls.clear();
|
|
168
|
+
for (const msg of messages) {
|
|
169
|
+
messageItems.push({ type: "message", data: { ...msg, toolCalls: void 0 } });
|
|
170
|
+
if (msg.toolCalls) {
|
|
171
|
+
for (const toolCall of msg.toolCalls) {
|
|
172
|
+
messageItems.push({ type: "toolCall", data: toolCall });
|
|
173
|
+
this._toolCalls.set(toolCall.id, toolCall);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
this._messageItems = messageItems;
|
|
178
|
+
this.#notifyStateChange();
|
|
179
|
+
}
|
|
180
|
+
#appendEventToMessage(id, event) {
|
|
181
|
+
const messageExists = this._messageItems.some((item) => item.type === "message" && item.data.id === id);
|
|
182
|
+
if (!messageExists) {
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
this._messageItems = this._messageItems.map((item) => {
|
|
186
|
+
if (item.type === "message" && item.data.id === id) {
|
|
187
|
+
const eventStream = [...item.data.eventStream || [], event];
|
|
188
|
+
return { ...item, data: { ...item.data, eventStream } };
|
|
189
|
+
}
|
|
190
|
+
return item;
|
|
191
|
+
});
|
|
192
|
+
this.#notifyStateChange();
|
|
193
|
+
}
|
|
194
|
+
#appendEventToToolCall(id, event) {
|
|
195
|
+
const toolCall = this._toolCalls.get(id);
|
|
196
|
+
if (!toolCall) {
|
|
197
|
+
return;
|
|
198
|
+
}
|
|
199
|
+
const eventStream = [...toolCall.eventStream || [], event];
|
|
200
|
+
const updated = { ...toolCall, eventStream };
|
|
201
|
+
this._toolCalls.set(id, updated);
|
|
202
|
+
this._messageItems = this._messageItems.map((item) => {
|
|
203
|
+
if (item.type === "toolCall" && item.data.id === id) {
|
|
204
|
+
return { ...item, data: updated };
|
|
205
|
+
}
|
|
206
|
+
return item;
|
|
207
|
+
});
|
|
208
|
+
this.#notifyStateChange();
|
|
209
|
+
}
|
|
210
|
+
completeToolCall(toolCallId, result, event) {
|
|
211
|
+
this.updateToolCall(toolCallId, {
|
|
212
|
+
result,
|
|
213
|
+
status: "complete"
|
|
214
|
+
});
|
|
215
|
+
if (event) {
|
|
216
|
+
this.#appendEventToToolCall(toolCallId, {
|
|
217
|
+
type: "tool-result",
|
|
218
|
+
timestamp: Date.now(),
|
|
219
|
+
data: event,
|
|
220
|
+
rawEvent: event.rawEvent
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
this.#tryReorderAssistantMessage(toolCallId);
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Reorders the assistant message associated with the tool call to appear after the tool call.
|
|
227
|
+
*
|
|
228
|
+
* This can happen when tool calls come in before the assistant message is sent, which can
|
|
229
|
+
* cause the messages and tool calls to appear out of order otherwise.
|
|
230
|
+
*
|
|
231
|
+
* @param toolCallId The ID of the tool call whose assistant message should be reordered.
|
|
232
|
+
*/
|
|
233
|
+
#tryReorderAssistantMessage(toolCallId) {
|
|
234
|
+
const toolCall = this._toolCalls.get(toolCallId);
|
|
235
|
+
if (!toolCall) {
|
|
236
|
+
return;
|
|
237
|
+
}
|
|
238
|
+
const msgIdx = this._messageItems.findIndex((i) => i.type === "message" && i.data.id === toolCall.messageId);
|
|
239
|
+
if (msgIdx === -1) {
|
|
240
|
+
return;
|
|
241
|
+
}
|
|
242
|
+
const msgItem = this._messageItems[msgIdx];
|
|
243
|
+
if (msgItem.type !== "message" || msgItem.data.content.trim()) {
|
|
244
|
+
return;
|
|
245
|
+
}
|
|
246
|
+
const toolIdx = this._messageItems.findIndex((i) => i.type === "toolCall" && i.data.id === toolCallId);
|
|
247
|
+
if (toolIdx === -1 || toolIdx <= msgIdx) {
|
|
248
|
+
return;
|
|
249
|
+
}
|
|
250
|
+
const [msg] = this._messageItems.splice(msgIdx, 1);
|
|
251
|
+
this._messageItems.splice(toolIdx, 0, msg);
|
|
252
|
+
this.#notifyStateChange();
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
export {
|
|
256
|
+
MessageStateController
|
|
257
|
+
};
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Valid HTML heading levels for accessibility and semantic structure
|
|
3
|
+
*/
|
|
4
|
+
export type HeadingLevel = 1 | 2 | 3 | 4 | 5 | 6;
|
|
5
|
+
export type SlashCommandId = 'clear' | 'export' | 'info' | 'debug';
|
|
6
|
+
export type SlashCommandGroup = 'Conversation' | 'Help';
|
|
7
|
+
export interface SlashCommand {
|
|
8
|
+
id: SlashCommandId;
|
|
9
|
+
name: string;
|
|
10
|
+
group: SlashCommandGroup;
|
|
11
|
+
}
|
|
12
|
+
export interface ForgeAiSlashCommandMenuSelectEventData {
|
|
13
|
+
command: SlashCommand;
|
|
14
|
+
index: number;
|
|
15
|
+
}
|
|
16
|
+
export interface ToolRenderer {
|
|
17
|
+
elementTag?: string;
|
|
18
|
+
render?: (toolCall: ToolCall) => HTMLElement | DocumentFragment;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Interface that tool renderer components should implement for type-safe tool call handling.
|
|
22
|
+
* @template TArgs - Type of the tool call arguments
|
|
23
|
+
*/
|
|
24
|
+
export interface IToolRenderer<TArgs = Record<string, unknown>> {
|
|
25
|
+
toolCall: ToolCall<TArgs>;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Context provided to tool handlers when they are invoked.
|
|
29
|
+
* @template TArgs - Type of the tool call arguments
|
|
30
|
+
*/
|
|
31
|
+
export interface HandlerContext<TArgs = Record<string, unknown>> {
|
|
32
|
+
/** Tool call arguments */
|
|
33
|
+
args: TArgs;
|
|
34
|
+
/** Unique identifier for this tool call */
|
|
35
|
+
toolCallId: string;
|
|
36
|
+
/** Name of the tool being called */
|
|
37
|
+
toolName: string;
|
|
38
|
+
/** Optional abort signal for cancellation support */
|
|
39
|
+
signal?: AbortSignal;
|
|
40
|
+
}
|
|
41
|
+
export type ToolType = 'client' | 'agent';
|
|
42
|
+
/**
|
|
43
|
+
* Tool definition with optional type-safe handler.
|
|
44
|
+
* @template TArgs - Type of the tool call arguments for type-safe handler context
|
|
45
|
+
*/
|
|
46
|
+
export interface ToolDefinition<THandlerArgs = Record<string, unknown>> {
|
|
47
|
+
name: string;
|
|
48
|
+
displayName?: string;
|
|
49
|
+
description?: string;
|
|
50
|
+
parameters?: {
|
|
51
|
+
type: 'object';
|
|
52
|
+
properties?: Record<string, unknown>;
|
|
53
|
+
required?: string[];
|
|
54
|
+
};
|
|
55
|
+
/** Optional renderer for displaying tool call results within the chat UI. */
|
|
56
|
+
renderer?: ToolRenderer;
|
|
57
|
+
/**
|
|
58
|
+
* Optional handler function invoked when tool is called.
|
|
59
|
+
* Can return a string, object, or void. Strings and objects are used directly as tool results.
|
|
60
|
+
*/
|
|
61
|
+
handler?: (context: HandlerContext<THandlerArgs>) => Promise<string | Record<string, unknown> | void> | string | Record<string, unknown> | void;
|
|
62
|
+
}
|
|
63
|
+
export interface MessageStartEvent {
|
|
64
|
+
messageId: string;
|
|
65
|
+
}
|
|
66
|
+
export interface MessageDeltaEvent {
|
|
67
|
+
messageId: string;
|
|
68
|
+
delta: string;
|
|
69
|
+
}
|
|
70
|
+
export interface MessageEndEvent {
|
|
71
|
+
messageId: string;
|
|
72
|
+
}
|
|
73
|
+
export interface ToolCallStartEvent {
|
|
74
|
+
id: string;
|
|
75
|
+
messageId: string;
|
|
76
|
+
name: string;
|
|
77
|
+
}
|
|
78
|
+
export interface ToolCallArgsEvent {
|
|
79
|
+
id: string;
|
|
80
|
+
messageId: string;
|
|
81
|
+
name: string;
|
|
82
|
+
argsBuffer: string;
|
|
83
|
+
partialArgs?: Record<string, unknown>;
|
|
84
|
+
}
|
|
85
|
+
export interface ToolCallEndEvent {
|
|
86
|
+
id: string;
|
|
87
|
+
messageId: string;
|
|
88
|
+
name: string;
|
|
89
|
+
args: Record<string, unknown>;
|
|
90
|
+
}
|
|
91
|
+
export interface ToolResultEvent {
|
|
92
|
+
toolCallId: string;
|
|
93
|
+
result: unknown;
|
|
94
|
+
message: ChatMessage;
|
|
95
|
+
}
|
|
96
|
+
export type StreamEvent = {
|
|
97
|
+
type: 'message-start';
|
|
98
|
+
timestamp: number;
|
|
99
|
+
data: MessageStartEvent;
|
|
100
|
+
rawEvent?: unknown;
|
|
101
|
+
} | {
|
|
102
|
+
type: 'message-delta';
|
|
103
|
+
timestamp: number;
|
|
104
|
+
data: MessageDeltaEvent;
|
|
105
|
+
rawEvent?: unknown;
|
|
106
|
+
} | {
|
|
107
|
+
type: 'message-end';
|
|
108
|
+
timestamp: number;
|
|
109
|
+
data: MessageEndEvent;
|
|
110
|
+
rawEvent?: unknown;
|
|
111
|
+
} | {
|
|
112
|
+
type: 'tool-call-start';
|
|
113
|
+
timestamp: number;
|
|
114
|
+
data: ToolCallStartEvent;
|
|
115
|
+
rawEvent?: unknown;
|
|
116
|
+
} | {
|
|
117
|
+
type: 'tool-call-args';
|
|
118
|
+
timestamp: number;
|
|
119
|
+
data: ToolCallArgsEvent;
|
|
120
|
+
rawEvent?: unknown;
|
|
121
|
+
} | {
|
|
122
|
+
type: 'tool-call-end';
|
|
123
|
+
timestamp: number;
|
|
124
|
+
data: ToolCallEndEvent;
|
|
125
|
+
rawEvent?: unknown;
|
|
126
|
+
} | {
|
|
127
|
+
type: 'tool-result';
|
|
128
|
+
timestamp: number;
|
|
129
|
+
data: ToolResultEvent;
|
|
130
|
+
rawEvent?: unknown;
|
|
131
|
+
};
|
|
132
|
+
export interface ChatMessage {
|
|
133
|
+
id: string;
|
|
134
|
+
role: 'user' | 'assistant' | 'system' | 'tool';
|
|
135
|
+
content: string;
|
|
136
|
+
timestamp: number;
|
|
137
|
+
status: 'pending' | 'streaming' | 'complete' | 'error';
|
|
138
|
+
toolCalls?: ToolCall[];
|
|
139
|
+
toolCallId?: string;
|
|
140
|
+
eventStream?: StreamEvent[];
|
|
141
|
+
}
|
|
142
|
+
export interface ToolCall<TArgs = Record<string, unknown>> {
|
|
143
|
+
id: string;
|
|
144
|
+
messageId: string;
|
|
145
|
+
name: string;
|
|
146
|
+
args: TArgs;
|
|
147
|
+
argsBuffer?: string;
|
|
148
|
+
result?: unknown;
|
|
149
|
+
status: 'pending' | 'parsing' | 'executing' | 'complete' | 'error';
|
|
150
|
+
type: ToolType;
|
|
151
|
+
eventStream?: StreamEvent[];
|
|
152
|
+
}
|
|
153
|
+
export interface FileAttachment {
|
|
154
|
+
id: string;
|
|
155
|
+
filename: string;
|
|
156
|
+
size: number;
|
|
157
|
+
mimeType: string;
|
|
158
|
+
timestamp: number;
|
|
159
|
+
uploading?: boolean;
|
|
160
|
+
progress?: number;
|
|
161
|
+
status?: 'pending' | 'uploading' | 'success' | 'error';
|
|
162
|
+
error?: string;
|
|
163
|
+
fileId?: string;
|
|
164
|
+
}
|
|
165
|
+
export interface UploadedFileMetadata {
|
|
166
|
+
fileId: string;
|
|
167
|
+
fileName: string;
|
|
168
|
+
fileType: string;
|
|
169
|
+
fileSize: number;
|
|
170
|
+
uploadedAt: string;
|
|
171
|
+
}
|
|
172
|
+
export interface FileUploadCallbacks {
|
|
173
|
+
updateProgress: (progress: number) => void;
|
|
174
|
+
markComplete: (metadata: UploadedFileMetadata) => void;
|
|
175
|
+
markError: (error: string) => void;
|
|
176
|
+
onAbort: (callback: () => void) => void;
|
|
177
|
+
}
|
|
178
|
+
export type FileUploadHandler = (file: File, callbacks: FileUploadCallbacks) => Promise<void> | void;
|
|
179
|
+
export interface FileRemoveCallbacks {
|
|
180
|
+
onSuccess: () => void;
|
|
181
|
+
onError: (error: string) => void;
|
|
182
|
+
}
|
|
183
|
+
export interface FileRemoveEvent extends FileRemoveCallbacks {
|
|
184
|
+
fileId: string;
|
|
185
|
+
}
|
|
186
|
+
export interface ForgeAiChatbotFileSelectEventData {
|
|
187
|
+
fileId: string;
|
|
188
|
+
file: File;
|
|
189
|
+
filename: string;
|
|
190
|
+
size: number;
|
|
191
|
+
mimeType: string;
|
|
192
|
+
timestamp: number;
|
|
193
|
+
updateProgress: (progress: number) => void;
|
|
194
|
+
markComplete: (metadata: UploadedFileMetadata) => void;
|
|
195
|
+
markError: (error: string) => void;
|
|
196
|
+
onAbort: (callback: () => void) => void;
|
|
197
|
+
}
|
|
198
|
+
export type MessageItem = {
|
|
199
|
+
type: 'message';
|
|
200
|
+
data: ChatMessage;
|
|
201
|
+
} | {
|
|
202
|
+
type: 'toolCall';
|
|
203
|
+
data: ToolCall;
|
|
204
|
+
};
|
|
205
|
+
export interface ThreadState {
|
|
206
|
+
threadId?: string;
|
|
207
|
+
messages: ChatMessage[];
|
|
208
|
+
timestamp?: number;
|
|
209
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generates a unique ID using UUID v4
|
|
3
|
+
*/
|
|
4
|
+
export declare function generateId(): string;
|
|
5
|
+
/**
|
|
6
|
+
* Renders markdown content to sanitized HTML
|
|
7
|
+
*/
|
|
8
|
+
export declare function renderMarkdown(content: string): string;
|
|
9
|
+
/**
|
|
10
|
+
* Downloads content as a file with specified MIME type
|
|
11
|
+
*/
|
|
12
|
+
export declare function downloadFile(content: string, filename: string, mimeType?: string): void;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { marked } from "marked";
|
|
2
|
+
import DOMPurify from "dompurify";
|
|
3
|
+
import remend from "remend";
|
|
4
|
+
import { v4 } from "uuid";
|
|
5
|
+
const DOMPURIFY_CONFIG = {
|
|
6
|
+
FORBID_TAGS: ["script", "style", "iframe", "object", "embed"],
|
|
7
|
+
FORBID_ATTR: ["onerror", "onload", "onclick", "onmouseover"]
|
|
8
|
+
};
|
|
9
|
+
function generateId() {
|
|
10
|
+
return v4();
|
|
11
|
+
}
|
|
12
|
+
function renderMarkdown(content) {
|
|
13
|
+
const completedMarkdown = remend(content);
|
|
14
|
+
const rawHtml = marked.parse(completedMarkdown, { async: false, gfm: true, breaks: true });
|
|
15
|
+
return DOMPurify.sanitize(rawHtml, DOMPURIFY_CONFIG);
|
|
16
|
+
}
|
|
17
|
+
function downloadFile(content, filename, mimeType = "text/plain") {
|
|
18
|
+
const blob = new Blob([content], { type: mimeType });
|
|
19
|
+
const url = URL.createObjectURL(blob);
|
|
20
|
+
const link = document.createElement("a");
|
|
21
|
+
link.href = url;
|
|
22
|
+
link.download = filename;
|
|
23
|
+
document.body.appendChild(link);
|
|
24
|
+
link.click();
|
|
25
|
+
document.body.removeChild(link);
|
|
26
|
+
URL.revokeObjectURL(url);
|
|
27
|
+
}
|
|
28
|
+
export {
|
|
29
|
+
downloadFile,
|
|
30
|
+
generateId,
|
|
31
|
+
renderMarkdown
|
|
32
|
+
};
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { LitElement, TemplateResult } from 'lit';
|
|
2
|
+
declare global {
|
|
3
|
+
interface HTMLElementTagNameMap {
|
|
4
|
+
'forge-ai-confirmation-prompt': AiConfirmationPromptComponent;
|
|
5
|
+
}
|
|
6
|
+
interface HTMLElementEventMap {
|
|
7
|
+
'forge-ai-confirmation-prompt-confirm': CustomEvent<void>;
|
|
8
|
+
'forge-ai-confirmation-prompt-deny': CustomEvent<void>;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
export declare const AiConfirmationPromptComponentTagName: keyof HTMLElementTagNameMap;
|
|
12
|
+
/**
|
|
13
|
+
* @tag forge-ai-confirmation-prompt
|
|
14
|
+
*
|
|
15
|
+
* @summary Displays a confirmation UI for requiring human approval.
|
|
16
|
+
*
|
|
17
|
+
* @event {CustomEvent<void>} forge-ai-confirmation-prompt-confirm - Fired when user confirms the prompt
|
|
18
|
+
* @event {CustomEvent<void>} forge-ai-confirmation-prompt-deny - Fired when user denies the prompt
|
|
19
|
+
*/
|
|
20
|
+
export declare class AiConfirmationPromptComponent extends LitElement {
|
|
21
|
+
#private;
|
|
22
|
+
static styles: import('lit').CSSResult;
|
|
23
|
+
text: string;
|
|
24
|
+
confirmText: string;
|
|
25
|
+
denyText: string;
|
|
26
|
+
disabled: boolean;
|
|
27
|
+
render(): TemplateResult;
|
|
28
|
+
}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { unsafeCSS, LitElement, html } from "lit";
|
|
2
|
+
import { property, customElement } from "lit/decorators.js";
|
|
3
|
+
import styles from "./ai-confirmation-prompt.scss.mjs";
|
|
4
|
+
var __defProp = Object.defineProperty;
|
|
5
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
6
|
+
var __typeError = (msg) => {
|
|
7
|
+
throw TypeError(msg);
|
|
8
|
+
};
|
|
9
|
+
var __decorateClass = (decorators, target, key, kind) => {
|
|
10
|
+
var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
|
|
11
|
+
for (var i = decorators.length - 1, decorator; i >= 0; i--)
|
|
12
|
+
if (decorator = decorators[i])
|
|
13
|
+
result = (kind ? decorator(target, key, result) : decorator(result)) || result;
|
|
14
|
+
if (kind && result) __defProp(target, key, result);
|
|
15
|
+
return result;
|
|
16
|
+
};
|
|
17
|
+
var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
|
|
18
|
+
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);
|
|
19
|
+
var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "access private method"), method);
|
|
20
|
+
var _AiConfirmationPromptComponent_instances, handleConfirm_fn, handleDeny_fn;
|
|
21
|
+
const AiConfirmationPromptComponentTagName = "forge-ai-confirmation-prompt";
|
|
22
|
+
let AiConfirmationPromptComponent = class extends LitElement {
|
|
23
|
+
constructor() {
|
|
24
|
+
super(...arguments);
|
|
25
|
+
__privateAdd(this, _AiConfirmationPromptComponent_instances);
|
|
26
|
+
this.text = "";
|
|
27
|
+
this.confirmText = "Confirm";
|
|
28
|
+
this.denyText = "Deny";
|
|
29
|
+
this.disabled = false;
|
|
30
|
+
}
|
|
31
|
+
render() {
|
|
32
|
+
return html`
|
|
33
|
+
<div class="container" role="alertdialog" aria-labelledby="confirmation-text" aria-modal="false">
|
|
34
|
+
<div id="confirmation-text" class="text">${this.text}</div>
|
|
35
|
+
<div class="actions">
|
|
36
|
+
<button
|
|
37
|
+
class="deny-button forge-button forge-button--outlined"
|
|
38
|
+
?disabled=${this.disabled}
|
|
39
|
+
aria-label="Deny"
|
|
40
|
+
@click=${__privateMethod(this, _AiConfirmationPromptComponent_instances, handleDeny_fn)}>
|
|
41
|
+
${this.denyText}
|
|
42
|
+
</button>
|
|
43
|
+
<button
|
|
44
|
+
class="confirm-button forge-button forge-button--raised"
|
|
45
|
+
?disabled=${this.disabled}
|
|
46
|
+
aria-label="Confirm"
|
|
47
|
+
@click=${__privateMethod(this, _AiConfirmationPromptComponent_instances, handleConfirm_fn)}>
|
|
48
|
+
${this.confirmText}
|
|
49
|
+
</button>
|
|
50
|
+
</div>
|
|
51
|
+
</div>
|
|
52
|
+
`;
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
_AiConfirmationPromptComponent_instances = /* @__PURE__ */ new WeakSet();
|
|
56
|
+
handleConfirm_fn = function() {
|
|
57
|
+
const event = new CustomEvent("forge-ai-confirmation-prompt-confirm", {
|
|
58
|
+
bubbles: true,
|
|
59
|
+
composed: true
|
|
60
|
+
});
|
|
61
|
+
this.dispatchEvent(event);
|
|
62
|
+
};
|
|
63
|
+
handleDeny_fn = function() {
|
|
64
|
+
const event = new CustomEvent("forge-ai-confirmation-prompt-deny", {
|
|
65
|
+
bubbles: true,
|
|
66
|
+
composed: true
|
|
67
|
+
});
|
|
68
|
+
this.dispatchEvent(event);
|
|
69
|
+
};
|
|
70
|
+
AiConfirmationPromptComponent.styles = unsafeCSS(styles);
|
|
71
|
+
__decorateClass([
|
|
72
|
+
property()
|
|
73
|
+
], AiConfirmationPromptComponent.prototype, "text", 2);
|
|
74
|
+
__decorateClass([
|
|
75
|
+
property({ attribute: "confirm-text" })
|
|
76
|
+
], AiConfirmationPromptComponent.prototype, "confirmText", 2);
|
|
77
|
+
__decorateClass([
|
|
78
|
+
property({ attribute: "deny-text" })
|
|
79
|
+
], AiConfirmationPromptComponent.prototype, "denyText", 2);
|
|
80
|
+
__decorateClass([
|
|
81
|
+
property({ type: Boolean })
|
|
82
|
+
], AiConfirmationPromptComponent.prototype, "disabled", 2);
|
|
83
|
+
AiConfirmationPromptComponent = __decorateClass([
|
|
84
|
+
customElement(AiConfirmationPromptComponentTagName)
|
|
85
|
+
], AiConfirmationPromptComponent);
|
|
86
|
+
export {
|
|
87
|
+
AiConfirmationPromptComponent,
|
|
88
|
+
AiConfirmationPromptComponentTagName
|
|
89
|
+
};
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
const styles = '/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/* prettier-ignore */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/* prettier-ignore */\n.forge-button {\n --_button-primary-color: var(--forge-button-primary-color, var(--forge-theme-primary, #3f51b5));\n --_button-text-color: var(--forge-button-text-color, var(--_button-primary-color));\n --_button-disabled-color: var(--forge-button-disabled-color, var(--forge-theme-surface-container, #e0e0e0));\n --_button-padding: var(--forge-button-padding, var(--forge-spacing-medium, 16px));\n --_button-display: var(--forge-button-display, inline-grid);\n --_button-justify: var(--forge-button-justify, center);\n --_button-shape: var(--forge-button-shape, calc(var(--forge-shape-medium, 4px) * var(--forge-shape-factor, 1)));\n --_button-height: var(--forge-button-height, 36px);\n --_button-min-width: var(--forge-button-min-width, 64px);\n --_button-spacing: var(--forge-button-spacing, var(--forge-spacing-xsmall, 8px));\n --_button-border-width: var(--forge-button-border-width, medium);\n --_button-border-style: var(--forge-button-border-style, none);\n --_button-border-color: var(--forge-button-border-color, currentColor);\n --_button-shape-start-start-radius: var(--forge-button-shape-start-start-radius, var(--_button-shape));\n --_button-shape-start-end-radius: var(--forge-button-shape-start-end-radius, var(--_button-shape));\n --_button-shape-end-start-radius: var(--forge-button-shape-end-start-radius, var(--_button-shape));\n --_button-shape-end-end-radius: var(--forge-button-shape-end-end-radius, var(--_button-shape));\n --_button-padding-block: var(--forge-button-padding-block, var(--_button-0));\n --_button-padding-inline: var(--forge-button-padding-inline, var(--_button-padding));\n --_button-background: var(--forge-button-background, transparent);\n --_button-hover-background: var(--forge-button-hover-background, var(--_button-background));\n --_button-active-background: var(--forge-button-active-background, var(--_button-background));\n --_button-color: var(--forge-button-color, var(--_button-text-color));\n --_button-icon-size: var(--forge-button-icon-size, calc(var(--forge-typography-font-size, 1rem) * 1.125));\n --_button-shadow: var(--forge-button-shadow, none);\n --_button-hover-shadow: var(--forge-button-hover-shadow, none);\n --_button-active-shadow: var(--forge-button-active-shadow, none);\n --_button-cursor: var(--forge-button-cursor, pointer);\n --_button-transition-duration: var(--forge-button-transition-duration, var(--forge-animation-duration-short3, 150ms));\n --_button-transition-timing: var(--forge-button-transition-timing, var(--forge-animation-easing-standard, cubic-bezier(0.2, 0, 0, 1)));\n --_button-text-padding-inline: var(--forge-button-text-padding-inline, var(--forge-spacing-xsmall, 8px));\n --_button-outlined-background: var(--forge-button-outlined-background, transparent);\n --_button-outlined-color: var(--forge-button-outlined-color, var(--_button-primary-color));\n --_button-outlined-border-width: var(--forge-button-outlined-border-width, var(--forge-border-thin, 1px));\n --_button-outlined-border-style: var(--forge-button-outlined-border-style, solid);\n --_button-outlined-border-color: var(--forge-button-outlined-border-color, var(--_button-primary-color));\n --_button-tonal-background: var(--forge-button-tonal-background, var(--forge-theme-primary-container, #d1d5ed));\n --_button-tonal-disabled-background: var(--forge-button-tonal-disabled-background, var(--_button-disabled-color));\n --_button-tonal-color: var(--forge-button-tonal-color, var(--forge-theme-on-primary-container, #222c62));\n --_button-tonal-disabled-color: var(--forge-button-tonal-disabled-color, var(--_button-disabled-text-color));\n --_button-filled-background: var(--forge-button-filled-background, var(--_button-primary-color));\n --_button-filled-disabled-background: var(--forge-button-filled-disabled-background, var(--_button-disabled-color));\n --_button-filled-color: var(--forge-button-filled-color, var(--forge-theme-on-primary, #ffffff));\n --_button-filled-disabled-color: var(--forge-button-filled-disabled-color, var(--_button-disabled-text-color));\n --_button-raised-background: var(--forge-button-raised-background, var(--_button-primary-color));\n --_button-raised-disabled-background: var(--forge-button-raised-disabled-background, var(--_button-disabled-color));\n --_button-raised-color: var(--forge-button-raised-color, var(--forge-theme-on-primary, #ffffff));\n --_button-raised-disabled-color: var(--forge-button-raised-disabled-color, var(--_button-disabled-text-color));\n --_button-raised-shadow: var(--forge-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 --_button-raised-hover-shadow: var(--forge-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 --_button-raised-active-shadow: var(--forge-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 --_button-raised-disabled-shadow: var(--forge-button-raised-disabled-shadow, none);\n --_button-link-color: var(--forge-button-link-color, var(--_button-primary-color));\n --_button-link-text-decoration: var(--forge-button-link-text-decoration, underline);\n --_button-link-height: var(--forge-button-link-height, auto);\n --_button-link-padding: var(--forge-button-link-padding, 0);\n --_button-link-line-height: var(--forge-button-link-line-height, normal);\n --_button-link-width: var(--forge-button-link-width, auto);\n --_button-link-hover-text-decoration: var(--forge-button-link-hover-text-decoration, none);\n --_button-link-active-opacity: var(--forge-button-link-active-opacity, 0.65);\n --_button-link-transition-duration: var(--forge-button-link-transition-duration, var(--forge-animation-duration-short3, 150ms));\n --_button-link-transition-timing: var(--forge-button-link-transition-timing, var(--forge-animation-easing-standard, cubic-bezier(0.2, 0, 0, 1)));\n --_button-disabled-cursor: var(--forge-button-disabled-cursor, not-allowed);\n --_button-disabled-text-color: var(--forge-button-disabled-text-color, var(--forge-theme-text-low, rgba(0, 0, 0, 0.38)));\n --_button-disabled-background: var(--forge-button-disabled-background, transparent);\n --_button-disabled-border-color: var(--forge-button-disabled-border-color, var(--_button-disabled-color));\n --_button-disabled-shadow: var(--forge-button-disabled-shadow, none);\n --_button-dense-height: var(--forge-button-dense-height, 24px);\n --_button-pill-shape: var(--forge-button-pill-shape, calc(var(--forge-shape-full, 9999px) * var(--forge-shape-factor, 1)));\n --_button-pill-padding-inline: var(--forge-button-pill-padding-inline, var(--forge-spacing-small, 12px));\n --_button-focus-indicator-offset: var(--forge-button-focus-indicator-offset, 4px);\n --_button-text-focus-indicator-offset: var(--forge-button-text-focus-indicator-offset, 0px);\n --_button-link-focus-indicator-offset: var(--forge-button-link-focus-indicator-offset, 2px);\n --_button-popover-icon-transition-duration: var(--forge-button-popover-icon-transition-duration, var(--forge-animation-duration-short3, 150ms));\n --_button-popover-icon-transition-timing: var(--forge-button-popover-icon-transition-timing, var(--forge-animation-easing-standard, cubic-bezier(0.2, 0, 0, 1)));\n --_button-popover-icon-open-rotation: var(--forge-button-popover-icon-open-rotation, 180deg);\n}\n\n.forge-button {\n display: var(--_button-display);\n position: relative;\n outline: none;\n vertical-align: middle;\n -webkit-tap-highlight-color: transparent;\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: var(--_button-display);\n grid-auto-flow: column;\n align-items: center;\n justify-content: var(--_button-justify);\n gap: var(--_button-spacing);\n z-index: 0;\n box-sizing: border-box;\n min-inline-size: var(--_button-min-width);\n height: var(--_button-height);\n inline-size: 100%;\n border-width: var(--_button-border-width);\n border-style: var(--_button-border-style);\n border-color: var(--_button-border-color);\n border-start-start-radius: var(--_button-shape-start-start-radius);\n border-start-end-radius: var(--_button-shape-start-end-radius);\n border-end-start-radius: var(--_button-shape-end-start-radius);\n border-end-end-radius: var(--_button-shape-end-end-radius);\n padding-block: var(--_button-padding-block);\n padding-inline: var(--_button-padding-inline);\n box-shadow: var(--_button-shadow);\n outline: none;\n user-select: none;\n -webkit-appearance: none;\n vertical-align: middle;\n text-decoration: none;\n white-space: nowrap;\n background: var(--_button-background);\n color: var(--_button-color);\n cursor: var(--_button-cursor);\n transition-property: box-shadow, background;\n transition-duration: var(--_button-transition-duration);\n transition-timing-function: var(--_button-transition-timing);\n}\n\n.forge-button::-moz-focus-inner {\n padding: 0;\n border: 0;\n}\n\n.forge-button:hover {\n --_button-shadow: var(--_button-hover-shadow);\n background: var(--_button-hover-background);\n}\n\n.forge-button:active {\n --_button-shadow: var(--_button-active-shadow);\n background: var(--_button-active-background);\n}\n\n.forge-button {\n position: relative;\n inline-size: auto;\n}\n\n.forge-button:not(:disabled):not(.forge-button--link) {\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-button:not(:disabled):not(.forge-button--link)::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-button:not(:disabled):not(.forge-button--link):hover::before {\n background-color: var(--_state-layer-hover-color);\n opacity: var(--_state-layer-hover-opacity);\n}\n\n.forge-button:not(:disabled):not(.forge-button--link):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-button:not(:disabled) {\n outline: none;\n}\n\n.forge-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-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-button:not(:disabled) {\n --forge-focus-indicator-color: var(--_button-primary-color);\n}\n\n.forge-button:disabled {\n cursor: var(--_button-disabled-cursor);\n --_button-background: var(--_button-disabled-background);\n --_button-color: var(--_button-disabled-text-color);\n --_button-shadow: var(--_button-disabled-shadow);\n pointer-events: none;\n pointer-events: initial;\n}\n\n.forge-button:where(:not(.forge-button--outlined, .forge-button--tonal, .forge-button--filled, .forge-button--raised, .forge-button--link)), .forge-button--text {\n --_button-padding-inline: var(--_button-text-padding-inline);\n}\n\n.forge-button--outlined {\n --_button-background: var(--_button-outlined-background);\n --_button-color: var(--_button-outlined-color);\n --_button-border-width: var(--_button-outlined-border-width);\n --_button-border-style: var(--_button-outlined-border-style);\n --_button-border-color: var(--_button-outlined-border-color);\n}\n\n.forge-button--outlined:disabled {\n --_button-border-color: var(--_button-disabled-border-color);\n}\n\n.forge-button--tonal {\n --_button-background: var(--_button-tonal-background);\n --_button-color: var(--_button-tonal-color);\n}\n\n.forge-button--tonal:disabled {\n --_button-background: var(--_button-tonal-disabled-background);\n --_button-color: var(--_button-tonal-disabled-color);\n}\n\n.forge-button--filled, .forge-button--raised {\n --_button-background: var(--_button-filled-background);\n --_button-color: var(--_button-filled-color);\n --forge-state-layer-color: var(--_button-filled-color);\n}\n\n.forge-button--filled:disabled, .forge-button--raised:disabled {\n --_button-background: var(--_button-filled-disabled-background);\n --_button-color: var(--_button-filled-disabled-color);\n}\n\n.forge-button--raised {\n --_button-background: var(--_button-raised-background);\n --_button-color: var(--_button-raised-color);\n --_button-shadow: var(--_button-raised-shadow);\n}\n\n.forge-button--raised:hover {\n --_button-shadow: var(--_button-raised-hover-shadow);\n}\n\n.forge-button--raised:active {\n --_button-shadow: var(--_button-raised-active-shadow);\n}\n\n.forge-button--raised:disabled {\n --_button-background: var(--_button-raised-disabled-background);\n --_button-color: var(--_button-raised-disabled-color);\n --_button-shadow: var(--_button-raised-disabled-shadow);\n}\n\n.forge-button--link {\n --_button-color: var(--_button-link-color);\n --_button-height: var(--_button-link-height);\n --_button-padding: var(--_button-link-padding);\n --_button-focus-indicator-offset: var(--_button-link-focus-indicator-offset);\n text-decoration: var(--_button-link-text-decoration);\n line-height: var(--_button-link-line-height);\n transition: opacity var(--_button-link-transition-duration) var(--_button-link-transition-timing);\n inline-size: var(--_button-link-width);\n}\n\n.forge-button--link:hover {\n text-decoration: var(--_button-link-hover-text-decoration);\n}\n\n.forge-button--link:active {\n opacity: var(--_button-link-active-opacity);\n}\n\n.forge-button--pill {\n --_button-shape: var(--_button-pill-shape);\n --_button-padding-inline: var(--_button-pill-padding-inline);\n --forge-focus-indicator-shape: var(--_button-pill-shape);\n}\n\n.forge-button {\n --forge-icon-font-size: var(--_button-icon-size);\n}\n\n.forge-button--dense {\n --_button-height: var(--_button-dense-height);\n}\n\n:host {\n display: contents;\n}\n\n.container {\n position: absolute;\n inset: auto var(--forge-spacing-medium, 16px) var(--forge-spacing-medium, 16px);\n z-index: 10;\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--forge-spacing-medium, 16px);\n padding: var(--forge-spacing-medium, 16px);\n background-color: var(--forge-theme-surface, #ffffff);\n border: 1px solid var(--forge-theme-outline, #e0e0e0);\n border-radius: var(--forge-spacing-medium, 16px);\n box-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 animation: slide-up-fade-in 300ms cubic-bezier(0, 0, 0, 1);\n}\n\n.text {\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 flex: 1;\n color: var(--forge-theme-on-surface, #000000);\n}\n\n.actions {\n display: flex;\n gap: var(--forge-spacing-small, 12px);\n}\n\n@keyframes slide-up-fade-in {\n from {\n opacity: 0;\n transform: translateY(16px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}';
|
|
2
|
+
export {
|
|
3
|
+
styles as default
|
|
4
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './ai-confirmation-prompt';
|