@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.
Files changed (166) hide show
  1. package/custom-elements.json +6894 -2090
  2. package/dist/ai-actions-toolbar/ai-actions-toolbar.d.ts +24 -1
  3. package/dist/ai-actions-toolbar/ai-actions-toolbar.mjs +171 -42
  4. package/dist/ai-actions-toolbar/ai-actions-toolbar.scss.mjs +1 -1
  5. package/dist/ai-agent-info/ai-agent-info.d.ts +29 -0
  6. package/dist/ai-agent-info/ai-agent-info.mjs +123 -0
  7. package/dist/ai-agent-info/ai-agent-info.scss.mjs +4 -0
  8. package/dist/ai-agent-info/index.d.ts +1 -0
  9. package/dist/ai-agent-info/index.mjs +5 -0
  10. package/dist/ai-artifact/ai-artifact.scss.mjs +1 -1
  11. package/dist/ai-attachment/ai-attachment.d.ts +39 -0
  12. package/dist/ai-attachment/ai-attachment.mjs +130 -0
  13. package/dist/ai-attachment/ai-attachment.scss.mjs +4 -0
  14. package/dist/ai-attachment/index.d.ts +1 -0
  15. package/dist/ai-attachment/index.mjs +5 -0
  16. package/dist/ai-button/ai-button.mjs +1 -0
  17. package/dist/ai-button/ai-button.scss.mjs +1 -1
  18. package/dist/ai-chain-of-thought/thought-base/thought-base.scss.mjs +1 -1
  19. package/dist/ai-chat-header/ai-chat-header.d.ts +39 -17
  20. package/dist/ai-chat-header/ai-chat-header.mjs +136 -30
  21. package/dist/ai-chat-header/ai-chat-header.scss.mjs +1 -1
  22. package/dist/ai-chat-header/index.d.ts +1 -0
  23. package/dist/ai-chat-interface/ai-chat-interface.d.ts +2 -4
  24. package/dist/ai-chat-interface/ai-chat-interface.mjs +24 -28
  25. package/dist/ai-chat-interface/ai-chat-interface.scss.mjs +1 -1
  26. package/dist/ai-chatbot/ag-ui-adapter.d.ts +22 -0
  27. package/dist/ai-chatbot/ag-ui-adapter.mjs +340 -0
  28. package/dist/ai-chatbot/agent-adapter.d.ts +133 -0
  29. package/dist/ai-chatbot/agent-adapter.mjs +136 -0
  30. package/dist/ai-chatbot/agent-runner.d.ts +41 -0
  31. package/dist/ai-chatbot/agent-runner.mjs +264 -0
  32. package/dist/ai-chatbot/ai-chatbot-tool-call.d.ts +24 -0
  33. package/dist/ai-chatbot/ai-chatbot-tool-call.mjs +252 -0
  34. package/dist/ai-chatbot/ai-chatbot-tool-call.scss.mjs +4 -0
  35. package/dist/ai-chatbot/ai-chatbot.d.ts +134 -0
  36. package/dist/ai-chatbot/ai-chatbot.mjs +816 -0
  37. package/dist/ai-chatbot/ai-chatbot.scss.mjs +4 -0
  38. package/dist/ai-chatbot/create-tool-renderer.d.ts +9 -0
  39. package/dist/ai-chatbot/create-tool-renderer.mjs +16 -0
  40. package/dist/ai-chatbot/event-emitter.d.ts +43 -0
  41. package/dist/ai-chatbot/event-emitter.mjs +81 -0
  42. package/dist/ai-chatbot/file-upload-manager.d.ts +27 -0
  43. package/dist/ai-chatbot/file-upload-manager.mjs +106 -0
  44. package/dist/ai-chatbot/http-agent-with-credentials.d.ts +8 -0
  45. package/dist/ai-chatbot/http-agent-with-credentials.mjs +14 -0
  46. package/dist/ai-chatbot/index.d.ts +15 -0
  47. package/dist/ai-chatbot/index.mjs +30 -0
  48. package/dist/ai-chatbot/markdown-stream-controller.d.ts +13 -0
  49. package/dist/ai-chatbot/markdown-stream-controller.mjs +49 -0
  50. package/dist/ai-chatbot/message-state-controller.d.ts +49 -0
  51. package/dist/ai-chatbot/message-state-controller.mjs +257 -0
  52. package/dist/ai-chatbot/types.d.ts +209 -0
  53. package/dist/ai-chatbot/utils.d.ts +12 -0
  54. package/dist/ai-chatbot/utils.mjs +32 -0
  55. package/dist/ai-confirmation-prompt/ai-confirmation-prompt.d.ts +28 -0
  56. package/dist/ai-confirmation-prompt/ai-confirmation-prompt.mjs +89 -0
  57. package/dist/ai-confirmation-prompt/ai-confirmation-prompt.scss.mjs +4 -0
  58. package/dist/ai-confirmation-prompt/index.d.ts +1 -0
  59. package/dist/ai-confirmation-prompt/index.mjs +5 -0
  60. package/dist/ai-dialog/ai-dialog.scss.mjs +1 -1
  61. package/dist/ai-dropdown-menu/ai-dropdown-menu-item.d.ts +1 -9
  62. package/dist/ai-dropdown-menu/ai-dropdown-menu-item.mjs +3 -16
  63. package/dist/ai-dropdown-menu/ai-dropdown-menu-item.scss.mjs +1 -1
  64. package/dist/ai-dropdown-menu/ai-dropdown-menu.d.ts +11 -6
  65. package/dist/ai-dropdown-menu/ai-dropdown-menu.mjs +13 -3
  66. package/dist/ai-dropdown-menu/ai-dropdown-menu.scss.mjs +1 -1
  67. package/dist/ai-dropdown-menu/selection-manager.mjs +3 -3
  68. package/dist/ai-embedded-chat/ai-embedded-chat.d.ts +18 -5
  69. package/dist/ai-embedded-chat/ai-embedded-chat.mjs +44 -18
  70. package/dist/ai-empty-state/ai-empty-state.d.ts +4 -2
  71. package/dist/ai-empty-state/ai-empty-state.mjs +237 -57
  72. package/dist/ai-empty-state/ai-empty-state.scss.mjs +1 -1
  73. package/dist/ai-error-message/ai-error-message.d.ts +19 -0
  74. package/dist/ai-error-message/ai-error-message.mjs +44 -0
  75. package/dist/ai-error-message/ai-error-message.scss.mjs +4 -0
  76. package/dist/ai-error-message/index.d.ts +1 -0
  77. package/dist/ai-error-message/index.mjs +5 -0
  78. package/dist/ai-event-stream-viewer/ai-event-stream-viewer.d.ts +19 -0
  79. package/dist/ai-event-stream-viewer/ai-event-stream-viewer.mjs +164 -0
  80. package/dist/ai-event-stream-viewer/ai-event-stream-viewer.scss.mjs +4 -0
  81. package/dist/ai-event-stream-viewer/index.d.ts +1 -0
  82. package/dist/ai-event-stream-viewer/index.mjs +5 -0
  83. package/dist/ai-fab/ai-fab.scss.mjs +1 -1
  84. package/dist/ai-file-picker/ai-file-picker.d.ts +20 -14
  85. package/dist/ai-file-picker/ai-file-picker.mjs +67 -20
  86. package/dist/ai-file-picker/ai-file-picker.scss.mjs +1 -1
  87. package/dist/ai-file-picker/index.d.ts +1 -1
  88. package/dist/ai-floating-chat/ai-floating-chat.d.ts +5 -30
  89. package/dist/ai-floating-chat/ai-floating-chat.mjs +19 -42
  90. package/dist/ai-gradient-container/ai-gradient-container.scss.mjs +1 -1
  91. package/dist/ai-icon/ai-icon.scss.mjs +1 -1
  92. package/dist/ai-icon-button/ai-icon-button.d.ts +19 -0
  93. package/dist/ai-icon-button/ai-icon-button.mjs +63 -0
  94. package/dist/ai-icon-button/ai-icon-button.scss.mjs +4 -0
  95. package/dist/ai-icon-button/index.d.ts +1 -0
  96. package/dist/ai-icon-button/index.mjs +5 -0
  97. package/dist/ai-message-thread/ai-message-thread.d.ts +59 -0
  98. package/dist/ai-message-thread/ai-message-thread.mjs +238 -0
  99. package/dist/ai-message-thread/ai-message-thread.scss.mjs +4 -0
  100. package/dist/ai-message-thread/index.d.ts +2 -0
  101. package/dist/ai-message-thread/index.mjs +5 -0
  102. package/dist/ai-modal/ai-modal.d.ts +6 -0
  103. package/dist/ai-modal/ai-modal.mjs +31 -14
  104. package/dist/ai-modal/ai-modal.scss.mjs +1 -1
  105. package/dist/ai-prompt/ai-prompt.d.ts +21 -0
  106. package/dist/ai-prompt/ai-prompt.mjs +135 -15
  107. package/dist/ai-prompt/ai-prompt.scss.mjs +1 -1
  108. package/dist/ai-prompt/prompt-button/prompt-button.scss.mjs +1 -1
  109. package/dist/ai-response-message/ai-response-message.d.ts +17 -21
  110. package/dist/ai-response-message/ai-response-message.mjs +86 -85
  111. package/dist/ai-response-message/ai-response-message.scss.mjs +1 -1
  112. package/dist/ai-sidebar/ai-sidebar.mjs +1 -1
  113. package/dist/ai-sidebar-chat/ai-sidebar-chat.d.ts +5 -29
  114. package/dist/ai-sidebar-chat/ai-sidebar-chat.mjs +23 -43
  115. package/dist/ai-slash-command-menu/ai-slash-command-menu.d.ts +33 -0
  116. package/dist/ai-slash-command-menu/ai-slash-command-menu.mjs +200 -0
  117. package/dist/ai-slash-command-menu/ai-slash-command-menu.scss.mjs +4 -0
  118. package/dist/ai-slash-command-menu/index.d.ts +1 -0
  119. package/dist/ai-slash-command-menu/index.mjs +5 -0
  120. package/dist/ai-spinner/ai-spinner.d.ts +24 -0
  121. package/dist/ai-spinner/ai-spinner.mjs +41 -0
  122. package/dist/ai-spinner/ai-spinner.scss.mjs +4 -0
  123. package/dist/ai-spinner/index.d.ts +1 -0
  124. package/dist/ai-spinner/index.mjs +5 -0
  125. package/dist/ai-suggestions/ai-suggestions.d.ts +4 -0
  126. package/dist/ai-suggestions/ai-suggestions.mjs +66 -7
  127. package/dist/ai-suggestions/ai-suggestions.scss.mjs +1 -1
  128. package/dist/ai-suggestions/index.d.ts +2 -1
  129. package/dist/ai-thinking-indicator/ai-thinking-indicator.d.ts +6 -1
  130. package/dist/ai-thinking-indicator/ai-thinking-indicator.mjs +94 -5
  131. package/dist/ai-thinking-indicator/ai-thinking-indicator.scss.mjs +320 -1
  132. package/dist/ai-threads/ai-threads.d.ts +9 -4
  133. package/dist/ai-threads/ai-threads.mjs +21 -41
  134. package/dist/ai-threads/ai-threads.scss.mjs +1 -1
  135. package/dist/ai-user-message/ai-user-message.scss.mjs +1 -1
  136. package/dist/ai-voice-input/ai-voice-input.scss.mjs +1 -1
  137. package/dist/core/drag-controller.mjs +3 -0
  138. package/dist/core/overlay/index.d.ts +1 -1
  139. package/dist/core/overlay/overlay.d.ts +20 -5
  140. package/dist/core/overlay/overlay.mjs +29 -4
  141. package/dist/core/popover/index.d.ts +1 -1
  142. package/dist/core/popover/popover.d.ts +24 -13
  143. package/dist/core/popover/popover.mjs +22 -3
  144. package/dist/core/popover/popover.scss.mjs +1 -1
  145. package/dist/core/tooltip/tooltip.d.ts +10 -9
  146. package/dist/core/tooltip/tooltip.mjs +45 -16
  147. package/dist/core/tooltip/tooltip.scss.mjs +1 -1
  148. package/dist/index.d.ts +12 -4
  149. package/dist/index.mjs +58 -9
  150. package/dist/tools/ai-data-table/ai-data-table-definition.d.ts +2 -0
  151. package/dist/tools/ai-data-table/ai-data-table-definition.mjs +43 -0
  152. package/dist/tools/ai-data-table/ai-data-table.d.ts +33 -0
  153. package/dist/tools/ai-data-table/ai-data-table.mjs +206 -0
  154. package/dist/tools/ai-data-table/ai-data-table.scss.mjs +4 -0
  155. package/dist/tools/ai-data-table/index.d.ts +2 -0
  156. package/dist/tools/ai-data-table/index.mjs +6 -0
  157. package/dist/tools/ai-paginator/ai-paginator.d.ts +17 -0
  158. package/dist/tools/ai-paginator/ai-paginator.mjs +110 -0
  159. package/dist/tools/ai-paginator/ai-paginator.scss.mjs +4 -0
  160. package/dist/tools/ai-paginator/index.d.ts +1 -0
  161. package/dist/tools/ai-paginator/index.mjs +4 -0
  162. package/dist/tools/index.d.ts +2 -0
  163. package/dist/tools/index.mjs +8 -0
  164. package/dist/utils/keyboard-navigation-controller.d.ts +13 -0
  165. package/dist/utils/keyboard-navigation-controller.mjs +71 -0
  166. 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';