@devicai/ui 0.8.0 → 0.9.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/dist/cjs/api/types.js.map +1 -1
- package/dist/cjs/components/AICommandBar/AICommandBar.js +46 -10
- package/dist/cjs/components/AICommandBar/AICommandBar.js.map +1 -1
- package/dist/cjs/components/AIGenerationButton/AIGenerationButton.js +41 -10
- package/dist/cjs/components/AIGenerationButton/AIGenerationButton.js.map +1 -1
- package/dist/cjs/components/ChatDrawer/ChatDrawer.js +2 -1
- package/dist/cjs/components/ChatDrawer/ChatDrawer.js.map +1 -1
- package/dist/cjs/components/ChatDrawer/ChatMessages.js +58 -8
- package/dist/cjs/components/ChatDrawer/ChatMessages.js.map +1 -1
- package/dist/cjs/index.js +2 -0
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/utils/index.js.map +1 -1
- package/dist/cjs/utils/toolGroups.js +47 -0
- package/dist/cjs/utils/toolGroups.js.map +1 -0
- package/dist/esm/api/types.d.ts +17 -0
- package/dist/esm/api/types.js.map +1 -1
- package/dist/esm/components/AICommandBar/AICommandBar.js +46 -10
- package/dist/esm/components/AICommandBar/AICommandBar.js.map +1 -1
- package/dist/esm/components/AICommandBar/AICommandBar.types.d.ts +5 -1
- package/dist/esm/components/AIGenerationButton/AIGenerationButton.js +41 -10
- package/dist/esm/components/AIGenerationButton/AIGenerationButton.js.map +1 -1
- package/dist/esm/components/AIGenerationButton/AIGenerationButton.types.d.ts +5 -1
- package/dist/esm/components/ChatDrawer/ChatDrawer.js +2 -1
- package/dist/esm/components/ChatDrawer/ChatDrawer.js.map +1 -1
- package/dist/esm/components/ChatDrawer/ChatDrawer.types.d.ts +9 -1
- package/dist/esm/components/ChatDrawer/ChatMessages.d.ts +1 -1
- package/dist/esm/components/ChatDrawer/ChatMessages.js +58 -8
- package/dist/esm/components/ChatDrawer/ChatMessages.js.map +1 -1
- package/dist/esm/index.d.ts +3 -2
- package/dist/esm/index.js +1 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/utils/index.d.ts +2 -0
- package/dist/esm/utils/index.js.map +1 -1
- package/dist/esm/utils/toolGroups.d.ts +18 -0
- package/dist/esm/utils/toolGroups.js +45 -0
- package/dist/esm/utils/toolGroups.js.map +1 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sources":["../../../../src/api/types.ts"],"sourcesContent":["/**\n * File attachment for messages\n */\nexport interface ChatFile {\n name: string;\n downloadUrl?: string;\n fileType?: 'image' | 'document' | 'audio' | 'video' | 'other';\n}\n\n/**\n * Message content structure\n */\nexport interface MessageContent {\n message?: string;\n data?: any;\n files?: Array<{\n name: string;\n url: string;\n type: string;\n }>;\n}\n\n/**\n * Tool call from the model\n */\nexport interface ToolCall {\n id: string;\n type: 'function';\n function: {\n name: string;\n arguments: string;\n };\n}\n\n/**\n * Chat message structure\n */\nexport interface ChatMessage {\n uid: string;\n role: 'user' | 'assistant' | 'developer' | 'tool';\n content: MessageContent;\n timestamp: number;\n chatUid?: string;\n tool_calls?: ToolCall[];\n tool_call_id?: string;\n summary?: string;\n}\n\n/**\n * Previous conversation message for initialization\n */\nexport interface PreviousMessage {\n message: string;\n role: 'user' | 'assistant';\n}\n\n/**\n * Model interface tool schema following OpenAI function calling format\n */\nexport interface ModelInterfaceToolSchema {\n type: 'function';\n function: {\n name: string;\n description: string;\n parameters: {\n type: 'object';\n properties: Record<string, any>;\n required?: string[];\n };\n };\n}\n\n/**\n * Model interface tool definition for client-side tools\n */\nexport interface ModelInterfaceTool {\n toolName: string;\n schema: ModelInterfaceToolSchema;\n callback: (params: any) => Promise<any> | any;\n}\n\n/**\n * Tool call response to send back to the API\n */\nexport interface ToolCallResponse {\n tool_call_id: string;\n content: any;\n role: 'tool';\n}\n\n/**\n * DTO for sending messages to the assistant\n */\nexport interface ProcessMessageDto {\n message: string;\n chatUid?: string;\n userName?: string;\n files?: ChatFile[];\n metadata?: {\n promptTemplateParams?: Record<string, any>;\n tenantToken?: string;\n [key: string]: any;\n };\n tenantId?: string;\n previousConversation?: PreviousMessage[];\n enabledTools?: string[];\n provider?: string;\n model?: string;\n // Model interface protocol fields\n tools?: ModelInterfaceToolSchema[];\n applicationState?: Record<string, any>;\n skipSummarization?: boolean;\n}\n\n/**\n * Response from the assistant\n */\nexport interface AssistantResponse {\n messages: ChatMessage[];\n chatUid: string;\n inputTokens?: number;\n outputTokens?: number;\n}\n\n/**\n * Async mode response\n */\nexport interface AsyncResponse {\n chatUid: string;\n message?: string;\n error?: string;\n}\n\n/**\n * Real-time chat history status\n */\nexport type RealtimeStatus = 'processing' | 'completed' | 'error' | 'waiting_for_tool_response' | 'handed_off';\n\n/**\n * Real-time chat history response\n */\nexport interface RealtimeChatHistory {\n chatUID: string;\n clientUID: string;\n chatHistory: ChatMessage[];\n status: RealtimeStatus;\n lastUpdatedAt: number;\n pendingToolCalls?: ToolCall[];\n handedOffSubThreadId?: string;\n}\n\n/**\n * Chat history structure\n */\nexport interface ChatHistory {\n chatUID: string;\n clientUID: string;\n userUID: string;\n chatContent: ChatMessage[];\n name?: string;\n assistantSpecializationIdentifier: string;\n creationTimestampMs: number;\n lastEditTimestampMs?: number;\n llm?: string;\n inputTokens?: number;\n outputTokens?: number;\n metadata?: Record<string, any>;\n tenantId?: string;\n handedOff?: boolean;\n handedOffSubThreadId?: string;\n handedOffToolCallId?: string;\n}\n\n/**\n * Assistant specialization info\n */\nexport interface AssistantSpecialization {\n identifier: string;\n name: string;\n description: string;\n state: 'active' | 'inactive' | 'coming_soon';\n imgUrl?: string;\n availableToolsGroups?: Array<{\n name: string;\n description?: string;\n uid?: string;\n iconUrl?: string;\n tools?: Array<{\n name: string;\n description: string;\n }>;\n }>;\n model?: string;\n isCustom?: boolean;\n creationTimestampMs?: number;\n}\n\n/**\n * Summary of a conversation for listing\n */\nexport interface ConversationSummary {\n chatUID: string;\n name?: string;\n creationTimestampMs: number;\n lastEditTimestampMs?: number;\n}\n\nexport interface ListConversationsResponse {\n histories: ConversationSummary[];\n total: number;\n offset: number;\n limit: number;\n}\n\n/**\n * API error response\n */\nexport interface ApiError {\n statusCode: number;\n message: string;\n error?: string;\n}\n\n/**\n * Feedback submission request\n */\nexport interface FeedbackSubmission {\n messageId: string;\n feedback?: boolean;\n feedbackComment?: string;\n feedbackData?: Record<string, any>;\n}\n\n/**\n * Feedback entry response\n */\nexport interface FeedbackEntry {\n _id: string;\n requestId: string;\n chatUID?: string;\n threadId?: string;\n agentId?: string;\n feedback?: boolean;\n feedbackComment?: string;\n feedbackData?: Record<string, any>;\n creationTimestamp: string;\n lastEditTimestamp?: string;\n}\n\n/**\n * Agent thread states\n */\nexport enum AgentThreadState {\n QUEUED = 'queued',\n PROCESSING = 'processing',\n COMPLETED = 'completed',\n FAILED = 'failed',\n TERMINATED = 'terminated',\n PAUSED = 'paused',\n PAUSED_FOR_APPROVAL = 'paused_for_approval',\n APPROVAL_REJECTED = 'approval_rejected',\n WAITING_FOR_RESPONSE = 'waiting_for_response',\n PAUSED_FOR_RESUME = 'paused_for_resume',\n HANDED_OFF = 'handed_off',\n GUARDRAIL_TRIGGER = 'guardrail_trigger',\n}\n\n/**\n * Task within an agent thread\n */\nexport interface AgentTaskDto {\n _id?: string;\n title?: string;\n description?: string;\n completed: boolean;\n}\n\n/**\n * Agent thread DTO\n */\nexport interface AgentThreadDto {\n _id?: string;\n agentId: string;\n state: AgentThreadState;\n threadContent: ChatMessage[];\n tasks?: AgentTaskDto[];\n finishReason?: string;\n pausedReason?: string;\n name?: string;\n creationTimestampMs?: number;\n lastEditTimestampMs?: number;\n pauseUntil?: number;\n isSubthread?: boolean;\n parentThreadId?: string;\n subThreadToolCallId?: string;\n parentAgentId?: string;\n}\n\n/**\n * Agent details\n */\nexport interface AgentDto {\n _id?: string;\n name: string;\n description?: string;\n imgUrl?: string;\n agentId?: string;\n}\n\n/**\n * Hand-off tool response content\n */\nexport interface HandOffToolResponse {\n response: string;\n subthreadId: string;\n}\n"],"names":["AgentThreadState"],"mappings":";;
|
|
1
|
+
{"version":3,"file":"types.js","sources":["../../../../src/api/types.ts"],"sourcesContent":["import type React from 'react';\n\n/**\n * File attachment for messages\n */\nexport interface ChatFile {\n name: string;\n downloadUrl?: string;\n fileType?: 'image' | 'document' | 'audio' | 'video' | 'other';\n}\n\n/**\n * Message content structure\n */\nexport interface MessageContent {\n message?: string;\n data?: any;\n files?: Array<{\n name: string;\n url: string;\n type: string;\n }>;\n}\n\n/**\n * Tool call from the model\n */\nexport interface ToolCall {\n id: string;\n type: 'function';\n function: {\n name: string;\n arguments: string;\n };\n}\n\n/**\n * Chat message structure\n */\nexport interface ChatMessage {\n uid: string;\n role: 'user' | 'assistant' | 'developer' | 'tool';\n content: MessageContent;\n timestamp: number;\n chatUid?: string;\n tool_calls?: ToolCall[];\n tool_call_id?: string;\n summary?: string;\n}\n\n/**\n * Previous conversation message for initialization\n */\nexport interface PreviousMessage {\n message: string;\n role: 'user' | 'assistant';\n}\n\n/**\n * Model interface tool schema following OpenAI function calling format\n */\nexport interface ModelInterfaceToolSchema {\n type: 'function';\n function: {\n name: string;\n description: string;\n parameters: {\n type: 'object';\n properties: Record<string, any>;\n required?: string[];\n };\n };\n}\n\n/**\n * Model interface tool definition for client-side tools\n */\nexport interface ModelInterfaceTool {\n toolName: string;\n schema: ModelInterfaceToolSchema;\n callback: (params: any) => Promise<any> | any;\n}\n\n/**\n * Tool call response to send back to the API\n */\nexport interface ToolCallResponse {\n tool_call_id: string;\n content: any;\n role: 'tool';\n}\n\n/**\n * DTO for sending messages to the assistant\n */\nexport interface ProcessMessageDto {\n message: string;\n chatUid?: string;\n userName?: string;\n files?: ChatFile[];\n metadata?: {\n promptTemplateParams?: Record<string, any>;\n tenantToken?: string;\n [key: string]: any;\n };\n tenantId?: string;\n previousConversation?: PreviousMessage[];\n enabledTools?: string[];\n provider?: string;\n model?: string;\n // Model interface protocol fields\n tools?: ModelInterfaceToolSchema[];\n applicationState?: Record<string, any>;\n skipSummarization?: boolean;\n}\n\n/**\n * Response from the assistant\n */\nexport interface AssistantResponse {\n messages: ChatMessage[];\n chatUid: string;\n inputTokens?: number;\n outputTokens?: number;\n}\n\n/**\n * Async mode response\n */\nexport interface AsyncResponse {\n chatUid: string;\n message?: string;\n error?: string;\n}\n\n/**\n * Real-time chat history status\n */\nexport type RealtimeStatus = 'processing' | 'completed' | 'error' | 'waiting_for_tool_response' | 'handed_off';\n\n/**\n * Real-time chat history response\n */\nexport interface RealtimeChatHistory {\n chatUID: string;\n clientUID: string;\n chatHistory: ChatMessage[];\n status: RealtimeStatus;\n lastUpdatedAt: number;\n pendingToolCalls?: ToolCall[];\n handedOffSubThreadId?: string;\n}\n\n/**\n * Chat history structure\n */\nexport interface ChatHistory {\n chatUID: string;\n clientUID: string;\n userUID: string;\n chatContent: ChatMessage[];\n name?: string;\n assistantSpecializationIdentifier: string;\n creationTimestampMs: number;\n lastEditTimestampMs?: number;\n llm?: string;\n inputTokens?: number;\n outputTokens?: number;\n metadata?: Record<string, any>;\n tenantId?: string;\n handedOff?: boolean;\n handedOffSubThreadId?: string;\n handedOffToolCallId?: string;\n}\n\n/**\n * Assistant specialization info\n */\nexport interface AssistantSpecialization {\n identifier: string;\n name: string;\n description: string;\n state: 'active' | 'inactive' | 'coming_soon';\n imgUrl?: string;\n availableToolsGroups?: Array<{\n name: string;\n description?: string;\n uid?: string;\n iconUrl?: string;\n tools?: Array<{\n name: string;\n description: string;\n }>;\n }>;\n model?: string;\n isCustom?: boolean;\n creationTimestampMs?: number;\n}\n\n/**\n * Summary of a conversation for listing\n */\nexport interface ConversationSummary {\n chatUID: string;\n name?: string;\n creationTimestampMs: number;\n lastEditTimestampMs?: number;\n}\n\nexport interface ListConversationsResponse {\n histories: ConversationSummary[];\n total: number;\n offset: number;\n limit: number;\n}\n\n/**\n * API error response\n */\nexport interface ApiError {\n statusCode: number;\n message: string;\n error?: string;\n}\n\n/**\n * Feedback submission request\n */\nexport interface FeedbackSubmission {\n messageId: string;\n feedback?: boolean;\n feedbackComment?: string;\n feedbackData?: Record<string, any>;\n}\n\n/**\n * Feedback entry response\n */\nexport interface FeedbackEntry {\n _id: string;\n requestId: string;\n chatUID?: string;\n threadId?: string;\n agentId?: string;\n feedback?: boolean;\n feedbackComment?: string;\n feedbackData?: Record<string, any>;\n creationTimestamp: string;\n lastEditTimestamp?: string;\n}\n\n/**\n * Agent thread states\n */\nexport enum AgentThreadState {\n QUEUED = 'queued',\n PROCESSING = 'processing',\n COMPLETED = 'completed',\n FAILED = 'failed',\n TERMINATED = 'terminated',\n PAUSED = 'paused',\n PAUSED_FOR_APPROVAL = 'paused_for_approval',\n APPROVAL_REJECTED = 'approval_rejected',\n WAITING_FOR_RESPONSE = 'waiting_for_response',\n PAUSED_FOR_RESUME = 'paused_for_resume',\n HANDED_OFF = 'handed_off',\n GUARDRAIL_TRIGGER = 'guardrail_trigger',\n}\n\n/**\n * Task within an agent thread\n */\nexport interface AgentTaskDto {\n _id?: string;\n title?: string;\n description?: string;\n completed: boolean;\n}\n\n/**\n * Agent thread DTO\n */\nexport interface AgentThreadDto {\n _id?: string;\n agentId: string;\n state: AgentThreadState;\n threadContent: ChatMessage[];\n tasks?: AgentTaskDto[];\n finishReason?: string;\n pausedReason?: string;\n name?: string;\n creationTimestampMs?: number;\n lastEditTimestampMs?: number;\n pauseUntil?: number;\n isSubthread?: boolean;\n parentThreadId?: string;\n subThreadToolCallId?: string;\n parentAgentId?: string;\n}\n\n/**\n * Agent details\n */\nexport interface AgentDto {\n _id?: string;\n name: string;\n description?: string;\n imgUrl?: string;\n agentId?: string;\n}\n\n/**\n * Hand-off tool response content\n */\nexport interface HandOffToolResponse {\n response: string;\n subthreadId: string;\n}\n\n/**\n * Represents a single tool call within a tool group\n */\nexport interface ToolGroupCall {\n name: string;\n input: any;\n output: any;\n toolCallId: string;\n}\n\n/**\n * Configuration for grouping consecutive tool calls under a single renderer\n */\nexport interface ToolGroupConfig {\n tools: string[];\n renderer: (calls: ToolGroupCall[]) => React.ReactNode;\n}\n"],"names":["AgentThreadState"],"mappings":";;AA2PA;;AAEG;AACSA;AAAZ,CAAA,UAAY,gBAAgB,EAAA;AAC1B,IAAA,gBAAA,CAAA,QAAA,CAAA,GAAA,QAAiB;AACjB,IAAA,gBAAA,CAAA,YAAA,CAAA,GAAA,YAAyB;AACzB,IAAA,gBAAA,CAAA,WAAA,CAAA,GAAA,WAAuB;AACvB,IAAA,gBAAA,CAAA,QAAA,CAAA,GAAA,QAAiB;AACjB,IAAA,gBAAA,CAAA,YAAA,CAAA,GAAA,YAAyB;AACzB,IAAA,gBAAA,CAAA,QAAA,CAAA,GAAA,QAAiB;AACjB,IAAA,gBAAA,CAAA,qBAAA,CAAA,GAAA,qBAA2C;AAC3C,IAAA,gBAAA,CAAA,mBAAA,CAAA,GAAA,mBAAuC;AACvC,IAAA,gBAAA,CAAA,sBAAA,CAAA,GAAA,sBAA6C;AAC7C,IAAA,gBAAA,CAAA,mBAAA,CAAA,GAAA,mBAAuC;AACvC,IAAA,gBAAA,CAAA,YAAA,CAAA,GAAA,YAAyB;AACzB,IAAA,gBAAA,CAAA,mBAAA,CAAA,GAAA,mBAAuC;AACzC,CAAC,EAbWA,wBAAgB,KAAhBA,wBAAgB,GAAA,EAAA,CAAA,CAAA;;"}
|
|
@@ -6,6 +6,7 @@ var useAICommandBar = require('./useAICommandBar.js');
|
|
|
6
6
|
var MessageActions = require('../Feedback/MessageActions.js');
|
|
7
7
|
var DevicContext = require('../../provider/DevicContext.js');
|
|
8
8
|
var client = require('../../api/client.js');
|
|
9
|
+
var toolGroups = require('../../utils/toolGroups.js');
|
|
9
10
|
|
|
10
11
|
/**
|
|
11
12
|
* Detect if a color is dark based on perceived brightness
|
|
@@ -72,6 +73,7 @@ const DEFAULT_OPTIONS = {
|
|
|
72
73
|
historyStorageKey: 'devic-command-bar-history',
|
|
73
74
|
commands: undefined,
|
|
74
75
|
showHistoryCommand: true,
|
|
76
|
+
toolGroups: undefined,
|
|
75
77
|
};
|
|
76
78
|
/**
|
|
77
79
|
* AI Command Bar component - a floating input for quick AI interactions
|
|
@@ -267,6 +269,49 @@ const AICommandBar = React.forwardRef(function AICommandBar(props, ref) {
|
|
|
267
269
|
: mergedOptions.resultCardMaxHeight,
|
|
268
270
|
};
|
|
269
271
|
}, [mergedOptions.resultCardMaxHeight]);
|
|
272
|
+
// Render tool call items with optional toolGroups segmentation
|
|
273
|
+
const renderToolCallItems = (toolCalls, opts) => {
|
|
274
|
+
if (opts.toolGroups && opts.toolGroups.length > 0) {
|
|
275
|
+
const calls = toolCalls.map((tc) => ({
|
|
276
|
+
name: tc.name,
|
|
277
|
+
input: tc.input,
|
|
278
|
+
output: tc.output,
|
|
279
|
+
toolCallId: tc.id,
|
|
280
|
+
}));
|
|
281
|
+
const segments = toolGroups.segmentToolCalls(calls, opts.toolGroups);
|
|
282
|
+
const elements = [];
|
|
283
|
+
let callIdx = 0;
|
|
284
|
+
for (const segment of segments) {
|
|
285
|
+
if (segment.type === 'group') {
|
|
286
|
+
const groupKey = segment.calls.map((c) => c.toolCallId).join('-');
|
|
287
|
+
elements.push(jsxRuntime.jsx("div", { className: "devic-command-bar-result-tool-item devic-command-bar-result-tool-custom", children: segment.config.renderer(segment.calls) }, `cmd-group-${groupKey}`));
|
|
288
|
+
callIdx += segment.calls.length;
|
|
289
|
+
}
|
|
290
|
+
else {
|
|
291
|
+
const tc = toolCalls[callIdx];
|
|
292
|
+
const customRenderer = opts.toolRenderers?.[tc.name];
|
|
293
|
+
if (customRenderer) {
|
|
294
|
+
elements.push(jsxRuntime.jsx("div", { className: "devic-command-bar-result-tool-item devic-command-bar-result-tool-custom", children: customRenderer(tc.input, tc.output) }, tc.id));
|
|
295
|
+
}
|
|
296
|
+
else {
|
|
297
|
+
const customIcon = opts.toolIcons?.[tc.name];
|
|
298
|
+
elements.push(jsxRuntime.jsxs("div", { className: "devic-command-bar-result-tool-item", children: [customIcon ? (jsxRuntime.jsx("span", { className: "devic-command-bar-result-tool-icon", children: customIcon })) : (jsxRuntime.jsx(CheckIcon, { className: "devic-command-bar-result-tool-icon" })), jsxRuntime.jsx("span", { className: "devic-command-bar-result-tool-name", children: tc.summary || tc.name })] }, tc.id));
|
|
299
|
+
}
|
|
300
|
+
callIdx += 1;
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
return elements;
|
|
304
|
+
}
|
|
305
|
+
// Default: no toolGroups, render individually
|
|
306
|
+
return toolCalls.map((tc) => {
|
|
307
|
+
const customRenderer = opts.toolRenderers?.[tc.name];
|
|
308
|
+
if (customRenderer) {
|
|
309
|
+
return (jsxRuntime.jsx("div", { className: "devic-command-bar-result-tool-item devic-command-bar-result-tool-custom", children: customRenderer(tc.input, tc.output) }, tc.id));
|
|
310
|
+
}
|
|
311
|
+
const customIcon = opts.toolIcons?.[tc.name];
|
|
312
|
+
return (jsxRuntime.jsxs("div", { className: "devic-command-bar-result-tool-item", children: [customIcon ? (jsxRuntime.jsx("span", { className: "devic-command-bar-result-tool-icon", children: customIcon })) : (jsxRuntime.jsx(CheckIcon, { className: "devic-command-bar-result-tool-icon" })), jsxRuntime.jsx("span", { className: "devic-command-bar-result-tool-name", children: tc.summary || tc.name })] }, tc.id));
|
|
313
|
+
});
|
|
314
|
+
};
|
|
270
315
|
return (jsxRuntime.jsxs("div", { ref: containerRef, className: `devic-command-bar-container ${className || ''}`, "data-position": mergedOptions.position, "data-visible": hook.isVisible, style: containerStyle, children: [hook.showingCommands && hook.filteredCommands.length > 0 && (jsxRuntime.jsxs("div", { className: "devic-command-bar-dropdown", children: [jsxRuntime.jsxs("div", { className: "devic-command-bar-dropdown-header", children: [jsxRuntime.jsx("span", { children: "Commands" }), jsxRuntime.jsxs("span", { className: "devic-command-bar-dropdown-hint", children: [jsxRuntime.jsx("kbd", { children: "\u2191" }), jsxRuntime.jsx("kbd", { children: "\u2193" }), " to navigate, ", jsxRuntime.jsx("kbd", { children: "Enter" }), " to select"] })] }), jsxRuntime.jsx("div", { className: "devic-command-bar-dropdown-list", children: hook.filteredCommands.map((cmd, index) => (jsxRuntime.jsxs("div", { className: "devic-command-bar-dropdown-item", "data-selected": index === hook.selectedCommandIndex, onClick: () => hook.selectCommand(cmd), onMouseEnter: () => { }, children: [cmd.icon && (jsxRuntime.jsx("span", { className: "devic-command-bar-dropdown-icon", children: cmd.icon })), jsxRuntime.jsxs("span", { className: "devic-command-bar-dropdown-keyword", children: ["/", cmd.keyword] }), jsxRuntime.jsx("span", { className: "devic-command-bar-dropdown-desc", children: cmd.description })] }, cmd.keyword))) })] })), hook.showingHistory && (jsxRuntime.jsxs("div", { className: "devic-command-bar-dropdown", children: [jsxRuntime.jsxs("div", { className: "devic-command-bar-dropdown-header", children: [jsxRuntime.jsx("span", { children: "Command History" }), hook.history.length > 0 && (jsxRuntime.jsx("button", { className: "devic-command-bar-dropdown-clear", onClick: () => {
|
|
271
316
|
hook.clearHistory();
|
|
272
317
|
hook.setShowingHistory(false);
|
|
@@ -274,16 +319,7 @@ const AICommandBar = React.forwardRef(function AICommandBar(props, ref) {
|
|
|
274
319
|
hook.setShowingHistory(false);
|
|
275
320
|
hook.setInputValue(item);
|
|
276
321
|
hook.focus();
|
|
277
|
-
}, children: [jsxRuntime.jsx(HistoryIcon, { className: "devic-command-bar-dropdown-icon" }), jsxRuntime.jsx("span", { className: "devic-command-bar-history-text", children: item })] }, `${item}-${index}`)))) })] })), mergedOptions.showResultCard && hook.result && !hook.showingHistory && !hook.showingCommands && (jsxRuntime.jsxs("div", { className: "devic-command-bar-result", children: [hook.result.toolCalls.length > 0 && (jsxRuntime.jsxs("div", { className: "devic-command-bar-result-tools", children: [jsxRuntime.jsxs("div", { className: "devic-command-bar-result-tools-header", "data-expanded": toolsExpanded, onClick: () => setToolsExpanded(!toolsExpanded), children: [jsxRuntime.jsx(ChevronIcon, { className: "devic-command-bar-result-tools-chevron" }), jsxRuntime.jsx("span", { children: "Tool calls" }), jsxRuntime.jsx("span", { className: "devic-command-bar-result-tools-count", children: hook.result.toolCalls.length })] }), jsxRuntime.jsx("div", { className: "devic-command-bar-result-tools-list", "data-expanded": toolsExpanded, children: hook.result.toolCalls.
|
|
278
|
-
// Check for custom renderer
|
|
279
|
-
const customRenderer = mergedOptions.toolRenderers?.[tc.name];
|
|
280
|
-
if (customRenderer) {
|
|
281
|
-
return (jsxRuntime.jsx("div", { className: "devic-command-bar-result-tool-item devic-command-bar-result-tool-custom", children: customRenderer(tc.input, tc.output) }, tc.id));
|
|
282
|
-
}
|
|
283
|
-
// Use custom icon or default check icon
|
|
284
|
-
const customIcon = mergedOptions.toolIcons?.[tc.name];
|
|
285
|
-
return (jsxRuntime.jsxs("div", { className: "devic-command-bar-result-tool-item", children: [customIcon ? (jsxRuntime.jsx("span", { className: "devic-command-bar-result-tool-icon", children: customIcon })) : (jsxRuntime.jsx(CheckIcon, { className: "devic-command-bar-result-tool-icon" })), jsxRuntime.jsx("span", { className: "devic-command-bar-result-tool-name", children: tc.summary || tc.name })] }, tc.id));
|
|
286
|
-
}) })] })), jsxRuntime.jsx("div", { className: "devic-command-bar-result-message", style: resultMessageStyle, children: hook.result.message.content?.message || (jsxRuntime.jsx("span", { className: "devic-command-bar-result-empty", children: "No response" })) }), jsxRuntime.jsx("div", { className: "devic-cmd-result-actions", children: jsxRuntime.jsx(MessageActions.MessageActions, { messageId: hook.result.message.uid, messageContent: hook.result.message.content?.message, currentFeedback: feedbackState, onFeedback: handleFeedback, showCopy: true, showFeedback: true, theme: feedbackTheme }) })] })), hook.error && !hook.isProcessing && (jsxRuntime.jsx("div", { className: "devic-command-bar-error", children: hook.error.message })), jsxRuntime.jsxs("div", { className: "devic-command-bar", style: barStyle, children: [jsxRuntime.jsx("div", { className: "devic-command-bar-icon", children: hook.isProcessing ? (jsxRuntime.jsx("div", { className: "devic-command-bar-spinner" })) : (mergedOptions.icon || jsxRuntime.jsx(SparklesIcon, {})) }), hook.isProcessing ? (jsxRuntime.jsxs("div", { className: "devic-command-bar-summary", children: [hook.currentToolSummary || mergedOptions.processingMessage, "..."] })) : (jsxRuntime.jsx("input", { ref: hook.inputRef, type: "text", className: "devic-command-bar-input", placeholder: mergedOptions.placeholder, value: hook.inputValue, onChange: (e) => hook.setInputValue(e.target.value), onKeyDown: hook.handleKeyDown })), mergedOptions.showShortcutHint && mergedOptions.shortcut && !hook.isProcessing && (jsxRuntime.jsx("div", { className: "devic-command-bar-shortcut", children: useAICommandBar.formatShortcut(mergedOptions.shortcut) }))] })] }));
|
|
322
|
+
}, children: [jsxRuntime.jsx(HistoryIcon, { className: "devic-command-bar-dropdown-icon" }), jsxRuntime.jsx("span", { className: "devic-command-bar-history-text", children: item })] }, `${item}-${index}`)))) })] })), mergedOptions.showResultCard && hook.result && !hook.showingHistory && !hook.showingCommands && (jsxRuntime.jsxs("div", { className: "devic-command-bar-result", children: [hook.result.toolCalls.length > 0 && (jsxRuntime.jsxs("div", { className: "devic-command-bar-result-tools", children: [jsxRuntime.jsxs("div", { className: "devic-command-bar-result-tools-header", "data-expanded": toolsExpanded, onClick: () => setToolsExpanded(!toolsExpanded), children: [jsxRuntime.jsx(ChevronIcon, { className: "devic-command-bar-result-tools-chevron" }), jsxRuntime.jsx("span", { children: "Tool calls" }), jsxRuntime.jsx("span", { className: "devic-command-bar-result-tools-count", children: hook.result.toolCalls.length })] }), jsxRuntime.jsx("div", { className: "devic-command-bar-result-tools-list", "data-expanded": toolsExpanded, children: renderToolCallItems(hook.result.toolCalls, mergedOptions) })] })), jsxRuntime.jsx("div", { className: "devic-command-bar-result-message", style: resultMessageStyle, children: hook.result.message.content?.message || (jsxRuntime.jsx("span", { className: "devic-command-bar-result-empty", children: "No response" })) }), jsxRuntime.jsx("div", { className: "devic-cmd-result-actions", children: jsxRuntime.jsx(MessageActions.MessageActions, { messageId: hook.result.message.uid, messageContent: hook.result.message.content?.message, currentFeedback: feedbackState, onFeedback: handleFeedback, showCopy: true, showFeedback: true, theme: feedbackTheme }) })] })), hook.error && !hook.isProcessing && (jsxRuntime.jsx("div", { className: "devic-command-bar-error", children: hook.error.message })), jsxRuntime.jsxs("div", { className: "devic-command-bar", style: barStyle, children: [jsxRuntime.jsx("div", { className: "devic-command-bar-icon", children: hook.isProcessing ? (jsxRuntime.jsx("div", { className: "devic-command-bar-spinner" })) : (mergedOptions.icon || jsxRuntime.jsx(SparklesIcon, {})) }), hook.isProcessing ? (jsxRuntime.jsxs("div", { className: "devic-command-bar-summary", children: [hook.currentToolSummary || mergedOptions.processingMessage, "..."] })) : (jsxRuntime.jsx("input", { ref: hook.inputRef, type: "text", className: "devic-command-bar-input", placeholder: mergedOptions.placeholder, value: hook.inputValue, onChange: (e) => hook.setInputValue(e.target.value), onKeyDown: hook.handleKeyDown })), mergedOptions.showShortcutHint && mergedOptions.shortcut && !hook.isProcessing && (jsxRuntime.jsx("div", { className: "devic-command-bar-shortcut", children: useAICommandBar.formatShortcut(mergedOptions.shortcut) }))] })] }));
|
|
287
323
|
});
|
|
288
324
|
/**
|
|
289
325
|
* Sparkles icon (default)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AICommandBar.js","sources":["../../../../../src/components/AICommandBar/AICommandBar.tsx"],"sourcesContent":["import React, { forwardRef, useImperativeHandle, useState, useMemo, useEffect, useRef, useCallback } from 'react';\nimport { useAICommandBar, formatShortcut } from './useAICommandBar';\nimport { MessageActions } from '../Feedback';\nimport { useOptionalDevicContext } from '../../provider';\nimport { DevicApiClient } from '../../api/client';\nimport type { AICommandBarProps, AICommandBarHandle, AICommandBarOptions } from './AICommandBar.types';\nimport type { FeedbackState, FeedbackTheme } from '../Feedback';\nimport './AICommandBar.css';\nimport '../Feedback/Feedback.css';\n\n/**\n * Detect if a color is dark based on perceived brightness\n */\nfunction isColorDark(color: string): boolean {\n // Handle hex colors\n const hex = color.replace('#', '');\n if (hex.length === 3 || hex.length === 6) {\n const r = parseInt(hex.length === 3 ? hex[0] + hex[0] : hex.slice(0, 2), 16);\n const g = parseInt(hex.length === 3 ? hex[1] + hex[1] : hex.slice(2, 4), 16);\n const b = parseInt(hex.length === 3 ? hex[2] + hex[2] : hex.slice(4, 6), 16);\n // Perceived brightness formula\n const brightness = (r * 299 + g * 587 + b * 114) / 1000;\n return brightness < 128;\n }\n // Handle rgb/rgba\n const rgbMatch = color.match(/rgba?\\((\\d+),\\s*(\\d+),\\s*(\\d+)/);\n if (rgbMatch) {\n const r = parseInt(rgbMatch[1], 10);\n const g = parseInt(rgbMatch[2], 10);\n const b = parseInt(rgbMatch[3], 10);\n const brightness = (r * 299 + g * 587 + b * 114) / 1000;\n return brightness < 128;\n }\n return false;\n}\n\n/**\n * Lighten or darken a hex color\n */\nfunction adjustColor(color: string, amount: number): string {\n const hex = color.replace('#', '');\n const r = Math.min(255, Math.max(0, parseInt(hex.slice(0, 2), 16) + amount));\n const g = Math.min(255, Math.max(0, parseInt(hex.slice(2, 4), 16) + amount));\n const b = Math.min(255, Math.max(0, parseInt(hex.slice(4, 6), 16) + amount));\n return `#${r.toString(16).padStart(2, '0')}${g.toString(16).padStart(2, '0')}${b.toString(16).padStart(2, '0')}`;\n}\n\nconst DEFAULT_OPTIONS: Required<AICommandBarOptions> = {\n position: 'inline',\n fixedPlacement: {},\n shortcut: '',\n showShortcutHint: true,\n placeholder: 'Ask AI...',\n icon: undefined as any,\n width: 400,\n maxWidth: '100%',\n zIndex: 9999,\n showResultCard: true,\n resultCardMaxHeight: 300,\n color: '#3b82f6',\n backgroundColor: '#ffffff',\n textColor: '#1f2937',\n borderColor: '#e5e7eb',\n borderRadius: 12,\n fontFamily: \"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif\",\n fontSize: 14,\n padding: '12px 16px',\n boxShadow: '0 4px 20px rgba(0, 0, 0, 0.1)',\n animationDuration: 200,\n toolRenderers: undefined as any,\n toolIcons: undefined as any,\n processingMessage: 'Processing...',\n enableHistory: true,\n maxHistoryItems: 50,\n historyStorageKey: 'devic-command-bar-history',\n commands: undefined as any,\n showHistoryCommand: true,\n};\n\n/**\n * AI Command Bar component - a floating input for quick AI interactions\n *\n * @example\n * ```tsx\n * <AICommandBar\n * assistantId=\"support-assistant\"\n * options={{\n * position: 'fixed',\n * fixedPlacement: { bottom: 20, right: 20 },\n * shortcut: 'cmd+j',\n * placeholder: 'Ask AI...',\n * }}\n * onResponse={({ message }) => console.log('Response:', message.content)}\n * />\n * ```\n */\nexport const AICommandBar = forwardRef<AICommandBarHandle, AICommandBarProps>(\n function AICommandBar(props, ref) {\n const {\n assistantId,\n apiKey,\n baseUrl,\n tenantId,\n tenantMetadata,\n options = {},\n isVisible: controlledVisible,\n onVisibilityChange,\n onExecute = 'callback',\n chatDrawerRef,\n onResponse,\n modelInterfaceTools,\n onSubmit,\n onToolCall,\n onError,\n onOpen,\n onClose,\n className,\n } = props;\n\n const mergedOptions = useMemo(\n () => ({ ...DEFAULT_OPTIONS, ...options }),\n [options]\n );\n\n const hook = useAICommandBar({\n assistantId,\n apiKey,\n baseUrl,\n tenantId,\n tenantMetadata,\n options: mergedOptions,\n isVisible: controlledVisible,\n onVisibilityChange,\n onExecute,\n chatDrawerRef,\n onResponse,\n modelInterfaceTools,\n onSubmit,\n onToolCall,\n onError,\n onOpen,\n onClose,\n });\n\n // Expose handle\n useImperativeHandle(ref, () => ({\n open: hook.open,\n close: hook.close,\n toggle: hook.toggle,\n focus: hook.focus,\n submit: hook.submit,\n reset: hook.reset,\n }));\n\n // Tool list expansion state\n const [toolsExpanded, setToolsExpanded] = useState(false);\n\n // Feedback state\n const [feedbackState, setFeedbackState] = useState<FeedbackState>('none');\n const feedbackClientRef = useRef<DevicApiClient | null>(null);\n\n // Get context for API client\n const context = useOptionalDevicContext();\n const resolvedApiKey = apiKey || context?.apiKey;\n const resolvedBaseUrl = baseUrl || context?.baseUrl || 'https://api.devic.ai';\n\n // Initialize feedback client\n useEffect(() => {\n if (resolvedApiKey && !feedbackClientRef.current) {\n feedbackClientRef.current = new DevicApiClient({\n apiKey: resolvedApiKey,\n baseUrl: resolvedBaseUrl,\n });\n }\n }, [resolvedApiKey, resolvedBaseUrl]);\n\n // Reset feedback state when result changes\n useEffect(() => {\n if (hook.result) {\n setFeedbackState('none');\n }\n }, [hook.result?.chatUid, hook.result?.message.uid]);\n\n // Handle feedback submission\n const handleFeedback = useCallback(\n async (messageId: string, positive: boolean, comment?: string) => {\n if (!hook.result?.chatUid || !feedbackClientRef.current) return;\n\n try {\n await feedbackClientRef.current.submitChatFeedback(assistantId, hook.result.chatUid, {\n messageId,\n feedback: positive,\n feedbackComment: comment,\n });\n\n setFeedbackState(positive ? 'positive' : 'negative');\n } catch (err) {\n console.error('Failed to submit feedback:', err);\n throw err;\n }\n },\n [hook.result?.chatUid, assistantId]\n );\n\n // Container ref for theming\n const containerRef = useRef<HTMLDivElement>(null);\n\n // Apply CSS variables for theming\n useEffect(() => {\n const el = containerRef.current;\n if (!el) return;\n\n const vars: [string, string | undefined][] = [\n ['--devic-cmd-bg-override', mergedOptions.backgroundColor],\n ['--devic-cmd-text-override', mergedOptions.textColor],\n ['--devic-cmd-border-override', mergedOptions.borderColor],\n ['--devic-cmd-primary-override', mergedOptions.color],\n ['--devic-cmd-font-family-override', mergedOptions.fontFamily],\n ['--devic-cmd-font-size-override', typeof mergedOptions.fontSize === 'number' ? `${mergedOptions.fontSize}px` : mergedOptions.fontSize],\n ['--devic-cmd-radius-override', typeof mergedOptions.borderRadius === 'number' ? `${mergedOptions.borderRadius}px` : mergedOptions.borderRadius],\n ['--devic-cmd-shadow-override', mergedOptions.boxShadow],\n ['--devic-cmd-animation-duration-override', `${mergedOptions.animationDuration}ms`],\n ];\n\n for (const [name, value] of vars) {\n if (value) {\n el.style.setProperty(name, value);\n } else {\n el.style.removeProperty(name);\n }\n }\n }, [mergedOptions]);\n\n // Click-outside detection to close the bar\n useEffect(() => {\n if (!hook.isVisible) return;\n\n const handleClickOutside = (e: MouseEvent) => {\n const container = containerRef.current;\n if (container && !container.contains(e.target as Node)) {\n // Reset if there's a result, otherwise just close\n if (hook.result) {\n hook.reset();\n }\n hook.close();\n }\n };\n\n // Use mousedown instead of click to prevent race conditions\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, [hook.isVisible, hook.result, hook.reset, hook.close]);\n\n // Feedback theme derived from command bar options\n const feedbackTheme = useMemo((): FeedbackTheme | undefined => {\n const bg = mergedOptions.backgroundColor;\n const text = mergedOptions.textColor;\n const border = mergedOptions.borderColor;\n const primary = mergedOptions.color;\n\n // Only create theme if we have some custom colors\n if (!bg && !text) return undefined;\n\n const isDark = bg ? isColorDark(bg) : false;\n\n return {\n backgroundColor: bg,\n textColor: text,\n textMutedColor: text && bg ? (isDark ? adjustColor(text, -60) : adjustColor(text, 60)) : undefined,\n secondaryBackgroundColor: bg ? (isDark ? adjustColor(bg, 20) : adjustColor(bg, -15)) : undefined,\n borderColor: border,\n primaryColor: primary,\n primaryHoverColor: primary ? (isDark ? adjustColor(primary, 20) : adjustColor(primary, -20)) : undefined,\n };\n }, [mergedOptions.backgroundColor, mergedOptions.textColor, mergedOptions.borderColor, mergedOptions.color]);\n\n // Container styles\n const containerStyle = useMemo(() => {\n const style: React.CSSProperties = {\n width: typeof mergedOptions.width === 'number' ? `${mergedOptions.width}px` : mergedOptions.width,\n maxWidth: typeof mergedOptions.maxWidth === 'number' ? `${mergedOptions.maxWidth}px` : mergedOptions.maxWidth,\n zIndex: mergedOptions.zIndex,\n };\n\n if (mergedOptions.position === 'fixed') {\n const { top, right, bottom, left } = mergedOptions.fixedPlacement || {};\n if (top !== undefined) style.top = typeof top === 'number' ? `${top}px` : top;\n if (right !== undefined) style.right = typeof right === 'number' ? `${right}px` : right;\n if (bottom !== undefined) style.bottom = typeof bottom === 'number' ? `${bottom}px` : bottom;\n if (left !== undefined) style.left = typeof left === 'number' ? `${left}px` : left;\n }\n\n return style;\n }, [mergedOptions]);\n\n // Bar padding style\n const barStyle = useMemo(() => {\n if (!mergedOptions.padding || mergedOptions.padding === DEFAULT_OPTIONS.padding) {\n return undefined;\n }\n return {\n padding: typeof mergedOptions.padding === 'number' ? `${mergedOptions.padding}px` : mergedOptions.padding,\n };\n }, [mergedOptions.padding]);\n\n // Result card max height style\n const resultMessageStyle = useMemo(() => {\n if (!mergedOptions.resultCardMaxHeight || mergedOptions.resultCardMaxHeight === DEFAULT_OPTIONS.resultCardMaxHeight) {\n return undefined;\n }\n return {\n maxHeight: typeof mergedOptions.resultCardMaxHeight === 'number'\n ? `${mergedOptions.resultCardMaxHeight}px`\n : mergedOptions.resultCardMaxHeight,\n };\n }, [mergedOptions.resultCardMaxHeight]);\n\n return (\n <div\n ref={containerRef}\n className={`devic-command-bar-container ${className || ''}`}\n data-position={mergedOptions.position}\n data-visible={hook.isVisible}\n style={containerStyle}\n >\n {/* Commands dropdown */}\n {hook.showingCommands && hook.filteredCommands.length > 0 && (\n <div className=\"devic-command-bar-dropdown\">\n <div className=\"devic-command-bar-dropdown-header\">\n <span>Commands</span>\n <span className=\"devic-command-bar-dropdown-hint\">\n <kbd>↑</kbd><kbd>↓</kbd> to navigate, <kbd>Enter</kbd> to select\n </span>\n </div>\n <div className=\"devic-command-bar-dropdown-list\">\n {hook.filteredCommands.map((cmd, index) => (\n <div\n key={cmd.keyword}\n className=\"devic-command-bar-dropdown-item\"\n data-selected={index === hook.selectedCommandIndex}\n onClick={() => hook.selectCommand(cmd)}\n onMouseEnter={() => {/* Could update selectedCommandIndex on hover */}}\n >\n {cmd.icon && (\n <span className=\"devic-command-bar-dropdown-icon\">{cmd.icon}</span>\n )}\n <span className=\"devic-command-bar-dropdown-keyword\">/{cmd.keyword}</span>\n <span className=\"devic-command-bar-dropdown-desc\">{cmd.description}</span>\n </div>\n ))}\n </div>\n </div>\n )}\n\n {/* History list */}\n {hook.showingHistory && (\n <div className=\"devic-command-bar-dropdown\">\n <div className=\"devic-command-bar-dropdown-header\">\n <span>Command History</span>\n {hook.history.length > 0 && (\n <button\n className=\"devic-command-bar-dropdown-clear\"\n onClick={() => {\n hook.clearHistory();\n hook.setShowingHistory(false);\n }}\n type=\"button\"\n >\n Clear\n </button>\n )}\n </div>\n <div className=\"devic-command-bar-dropdown-list\" style={resultMessageStyle}>\n {hook.history.length === 0 ? (\n <div className=\"devic-command-bar-dropdown-empty\">No history yet</div>\n ) : (\n hook.history.map((item, index) => (\n <div\n key={`${item}-${index}`}\n className=\"devic-command-bar-dropdown-item devic-command-bar-history-item\"\n onClick={() => {\n hook.setShowingHistory(false);\n hook.setInputValue(item);\n hook.focus();\n }}\n >\n <HistoryIcon className=\"devic-command-bar-dropdown-icon\" />\n <span className=\"devic-command-bar-history-text\">{item}</span>\n </div>\n ))\n )}\n </div>\n </div>\n )}\n\n {/* Result card (above bar when completed) */}\n {mergedOptions.showResultCard && hook.result && !hook.showingHistory && !hook.showingCommands && (\n <div className=\"devic-command-bar-result\">\n {/* Tool calls section */}\n {hook.result.toolCalls.length > 0 && (\n <div className=\"devic-command-bar-result-tools\">\n <div\n className=\"devic-command-bar-result-tools-header\"\n data-expanded={toolsExpanded}\n onClick={() => setToolsExpanded(!toolsExpanded)}\n >\n <ChevronIcon className=\"devic-command-bar-result-tools-chevron\" />\n <span>Tool calls</span>\n <span className=\"devic-command-bar-result-tools-count\">\n {hook.result.toolCalls.length}\n </span>\n </div>\n <div\n className=\"devic-command-bar-result-tools-list\"\n data-expanded={toolsExpanded}\n >\n {hook.result.toolCalls.map((tc) => {\n // Check for custom renderer\n const customRenderer = mergedOptions.toolRenderers?.[tc.name];\n if (customRenderer) {\n return (\n <div key={tc.id} className=\"devic-command-bar-result-tool-item devic-command-bar-result-tool-custom\">\n {customRenderer(tc.input, tc.output)}\n </div>\n );\n }\n\n // Use custom icon or default check icon\n const customIcon = mergedOptions.toolIcons?.[tc.name];\n\n return (\n <div key={tc.id} className=\"devic-command-bar-result-tool-item\">\n {customIcon ? (\n <span className=\"devic-command-bar-result-tool-icon\">{customIcon}</span>\n ) : (\n <CheckIcon className=\"devic-command-bar-result-tool-icon\" />\n )}\n <span className=\"devic-command-bar-result-tool-name\">{tc.summary || tc.name}</span>\n </div>\n );\n })}\n </div>\n </div>\n )}\n\n {/* Message section */}\n <div className=\"devic-command-bar-result-message\" style={resultMessageStyle}>\n {hook.result.message.content?.message || (\n <span className=\"devic-command-bar-result-empty\">No response</span>\n )}\n </div>\n\n {/* Feedback actions */}\n <div className=\"devic-cmd-result-actions\">\n <MessageActions\n messageId={hook.result.message.uid}\n messageContent={hook.result.message.content?.message}\n currentFeedback={feedbackState}\n onFeedback={handleFeedback}\n showCopy={true}\n showFeedback={true}\n theme={feedbackTheme}\n />\n </div>\n </div>\n )}\n\n {/* Error display */}\n {hook.error && !hook.isProcessing && (\n <div className=\"devic-command-bar-error\">\n {hook.error.message}\n </div>\n )}\n\n {/* Main bar */}\n <div className=\"devic-command-bar\" style={barStyle}>\n {/* Left: Icon or Loader */}\n <div className=\"devic-command-bar-icon\">\n {hook.isProcessing ? (\n <div className=\"devic-command-bar-spinner\" />\n ) : (\n mergedOptions.icon || <SparklesIcon />\n )}\n </div>\n\n {/* Center: Input or Processing Summary */}\n {hook.isProcessing ? (\n <div className=\"devic-command-bar-summary\">\n {hook.currentToolSummary || mergedOptions.processingMessage}...\n </div>\n ) : (\n <input\n ref={hook.inputRef}\n type=\"text\"\n className=\"devic-command-bar-input\"\n placeholder={mergedOptions.placeholder}\n value={hook.inputValue}\n onChange={(e) => hook.setInputValue(e.target.value)}\n onKeyDown={hook.handleKeyDown}\n />\n )}\n\n {/* Right: Shortcut hint */}\n {mergedOptions.showShortcutHint && mergedOptions.shortcut && !hook.isProcessing && (\n <div className=\"devic-command-bar-shortcut\">\n {formatShortcut(mergedOptions.shortcut)}\n </div>\n )}\n </div>\n </div>\n );\n }\n);\n\n/**\n * Sparkles icon (default)\n */\nfunction SparklesIcon(): JSX.Element {\n return (\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n {/* Main star - 4-point diamond */}\n <path\n d=\"M10 2L11.5 8.5L18 10L11.5 11.5L10 18L8.5 11.5L2 10L8.5 8.5L10 2Z\"\n fill=\"currentColor\"\n opacity=\"0.9\"\n />\n {/* Small accent star - top right */}\n <path\n d=\"M16 3L16.5 5L18.5 5.5L16.5 6L16 8L15.5 6L13.5 5.5L15.5 5L16 3Z\"\n fill=\"currentColor\"\n opacity=\"0.6\"\n />\n {/* Tiny accent dot - bottom left */}\n <circle cx=\"4\" cy=\"15\" r=\"1\" fill=\"currentColor\" opacity=\"0.4\" />\n </svg>\n );\n}\n\n/**\n * Chevron right icon\n */\nfunction ChevronIcon({ className }: { className?: string }): JSX.Element {\n return (\n <svg\n className={className}\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <polyline points=\"9 18 15 12 9 6\" />\n </svg>\n );\n}\n\n/**\n * Check icon\n */\nfunction CheckIcon({ className }: { className?: string }): JSX.Element {\n return (\n <svg\n className={className}\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n );\n}\n\n/**\n * History icon\n */\nfunction HistoryIcon({ className }: { className?: string }): JSX.Element {\n return (\n <svg\n className={className}\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M3 3v5h5\" />\n <path d=\"M3.05 13A9 9 0 1 0 6 5.3L3 8\" />\n <path d=\"M12 7v5l4 2\" />\n </svg>\n );\n}\n"],"names":["forwardRef","useMemo","useAICommandBar","useImperativeHandle","useState","useRef","useOptionalDevicContext","useEffect","DevicApiClient","useCallback","_jsxs","_jsx","MessageActions","formatShortcut"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AICommandBar.js","sources":["../../../../../src/components/AICommandBar/AICommandBar.tsx"],"sourcesContent":["import React, { forwardRef, useImperativeHandle, useState, useMemo, useEffect, useRef, useCallback } from 'react';\nimport { useAICommandBar, formatShortcut } from './useAICommandBar';\nimport { MessageActions } from '../Feedback';\nimport { useOptionalDevicContext } from '../../provider';\nimport { DevicApiClient } from '../../api/client';\nimport type { AICommandBarProps, AICommandBarHandle, AICommandBarOptions, ToolCallSummary } from './AICommandBar.types';\nimport type { ToolGroupCall } from '../../api/types';\nimport { segmentToolCalls } from '../../utils/toolGroups';\nimport type { FeedbackState, FeedbackTheme } from '../Feedback';\nimport './AICommandBar.css';\nimport '../Feedback/Feedback.css';\n\n/**\n * Detect if a color is dark based on perceived brightness\n */\nfunction isColorDark(color: string): boolean {\n // Handle hex colors\n const hex = color.replace('#', '');\n if (hex.length === 3 || hex.length === 6) {\n const r = parseInt(hex.length === 3 ? hex[0] + hex[0] : hex.slice(0, 2), 16);\n const g = parseInt(hex.length === 3 ? hex[1] + hex[1] : hex.slice(2, 4), 16);\n const b = parseInt(hex.length === 3 ? hex[2] + hex[2] : hex.slice(4, 6), 16);\n // Perceived brightness formula\n const brightness = (r * 299 + g * 587 + b * 114) / 1000;\n return brightness < 128;\n }\n // Handle rgb/rgba\n const rgbMatch = color.match(/rgba?\\((\\d+),\\s*(\\d+),\\s*(\\d+)/);\n if (rgbMatch) {\n const r = parseInt(rgbMatch[1], 10);\n const g = parseInt(rgbMatch[2], 10);\n const b = parseInt(rgbMatch[3], 10);\n const brightness = (r * 299 + g * 587 + b * 114) / 1000;\n return brightness < 128;\n }\n return false;\n}\n\n/**\n * Lighten or darken a hex color\n */\nfunction adjustColor(color: string, amount: number): string {\n const hex = color.replace('#', '');\n const r = Math.min(255, Math.max(0, parseInt(hex.slice(0, 2), 16) + amount));\n const g = Math.min(255, Math.max(0, parseInt(hex.slice(2, 4), 16) + amount));\n const b = Math.min(255, Math.max(0, parseInt(hex.slice(4, 6), 16) + amount));\n return `#${r.toString(16).padStart(2, '0')}${g.toString(16).padStart(2, '0')}${b.toString(16).padStart(2, '0')}`;\n}\n\nconst DEFAULT_OPTIONS: Required<AICommandBarOptions> = {\n position: 'inline',\n fixedPlacement: {},\n shortcut: '',\n showShortcutHint: true,\n placeholder: 'Ask AI...',\n icon: undefined as any,\n width: 400,\n maxWidth: '100%',\n zIndex: 9999,\n showResultCard: true,\n resultCardMaxHeight: 300,\n color: '#3b82f6',\n backgroundColor: '#ffffff',\n textColor: '#1f2937',\n borderColor: '#e5e7eb',\n borderRadius: 12,\n fontFamily: \"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif\",\n fontSize: 14,\n padding: '12px 16px',\n boxShadow: '0 4px 20px rgba(0, 0, 0, 0.1)',\n animationDuration: 200,\n toolRenderers: undefined as any,\n toolIcons: undefined as any,\n processingMessage: 'Processing...',\n enableHistory: true,\n maxHistoryItems: 50,\n historyStorageKey: 'devic-command-bar-history',\n commands: undefined as any,\n showHistoryCommand: true,\n toolGroups: undefined as any,\n};\n\n/**\n * AI Command Bar component - a floating input for quick AI interactions\n *\n * @example\n * ```tsx\n * <AICommandBar\n * assistantId=\"support-assistant\"\n * options={{\n * position: 'fixed',\n * fixedPlacement: { bottom: 20, right: 20 },\n * shortcut: 'cmd+j',\n * placeholder: 'Ask AI...',\n * }}\n * onResponse={({ message }) => console.log('Response:', message.content)}\n * />\n * ```\n */\nexport const AICommandBar = forwardRef<AICommandBarHandle, AICommandBarProps>(\n function AICommandBar(props, ref) {\n const {\n assistantId,\n apiKey,\n baseUrl,\n tenantId,\n tenantMetadata,\n options = {},\n isVisible: controlledVisible,\n onVisibilityChange,\n onExecute = 'callback',\n chatDrawerRef,\n onResponse,\n modelInterfaceTools,\n onSubmit,\n onToolCall,\n onError,\n onOpen,\n onClose,\n className,\n } = props;\n\n const mergedOptions = useMemo(\n () => ({ ...DEFAULT_OPTIONS, ...options }),\n [options]\n );\n\n const hook = useAICommandBar({\n assistantId,\n apiKey,\n baseUrl,\n tenantId,\n tenantMetadata,\n options: mergedOptions,\n isVisible: controlledVisible,\n onVisibilityChange,\n onExecute,\n chatDrawerRef,\n onResponse,\n modelInterfaceTools,\n onSubmit,\n onToolCall,\n onError,\n onOpen,\n onClose,\n });\n\n // Expose handle\n useImperativeHandle(ref, () => ({\n open: hook.open,\n close: hook.close,\n toggle: hook.toggle,\n focus: hook.focus,\n submit: hook.submit,\n reset: hook.reset,\n }));\n\n // Tool list expansion state\n const [toolsExpanded, setToolsExpanded] = useState(false);\n\n // Feedback state\n const [feedbackState, setFeedbackState] = useState<FeedbackState>('none');\n const feedbackClientRef = useRef<DevicApiClient | null>(null);\n\n // Get context for API client\n const context = useOptionalDevicContext();\n const resolvedApiKey = apiKey || context?.apiKey;\n const resolvedBaseUrl = baseUrl || context?.baseUrl || 'https://api.devic.ai';\n\n // Initialize feedback client\n useEffect(() => {\n if (resolvedApiKey && !feedbackClientRef.current) {\n feedbackClientRef.current = new DevicApiClient({\n apiKey: resolvedApiKey,\n baseUrl: resolvedBaseUrl,\n });\n }\n }, [resolvedApiKey, resolvedBaseUrl]);\n\n // Reset feedback state when result changes\n useEffect(() => {\n if (hook.result) {\n setFeedbackState('none');\n }\n }, [hook.result?.chatUid, hook.result?.message.uid]);\n\n // Handle feedback submission\n const handleFeedback = useCallback(\n async (messageId: string, positive: boolean, comment?: string) => {\n if (!hook.result?.chatUid || !feedbackClientRef.current) return;\n\n try {\n await feedbackClientRef.current.submitChatFeedback(assistantId, hook.result.chatUid, {\n messageId,\n feedback: positive,\n feedbackComment: comment,\n });\n\n setFeedbackState(positive ? 'positive' : 'negative');\n } catch (err) {\n console.error('Failed to submit feedback:', err);\n throw err;\n }\n },\n [hook.result?.chatUid, assistantId]\n );\n\n // Container ref for theming\n const containerRef = useRef<HTMLDivElement>(null);\n\n // Apply CSS variables for theming\n useEffect(() => {\n const el = containerRef.current;\n if (!el) return;\n\n const vars: [string, string | undefined][] = [\n ['--devic-cmd-bg-override', mergedOptions.backgroundColor],\n ['--devic-cmd-text-override', mergedOptions.textColor],\n ['--devic-cmd-border-override', mergedOptions.borderColor],\n ['--devic-cmd-primary-override', mergedOptions.color],\n ['--devic-cmd-font-family-override', mergedOptions.fontFamily],\n ['--devic-cmd-font-size-override', typeof mergedOptions.fontSize === 'number' ? `${mergedOptions.fontSize}px` : mergedOptions.fontSize],\n ['--devic-cmd-radius-override', typeof mergedOptions.borderRadius === 'number' ? `${mergedOptions.borderRadius}px` : mergedOptions.borderRadius],\n ['--devic-cmd-shadow-override', mergedOptions.boxShadow],\n ['--devic-cmd-animation-duration-override', `${mergedOptions.animationDuration}ms`],\n ];\n\n for (const [name, value] of vars) {\n if (value) {\n el.style.setProperty(name, value);\n } else {\n el.style.removeProperty(name);\n }\n }\n }, [mergedOptions]);\n\n // Click-outside detection to close the bar\n useEffect(() => {\n if (!hook.isVisible) return;\n\n const handleClickOutside = (e: MouseEvent) => {\n const container = containerRef.current;\n if (container && !container.contains(e.target as Node)) {\n // Reset if there's a result, otherwise just close\n if (hook.result) {\n hook.reset();\n }\n hook.close();\n }\n };\n\n // Use mousedown instead of click to prevent race conditions\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, [hook.isVisible, hook.result, hook.reset, hook.close]);\n\n // Feedback theme derived from command bar options\n const feedbackTheme = useMemo((): FeedbackTheme | undefined => {\n const bg = mergedOptions.backgroundColor;\n const text = mergedOptions.textColor;\n const border = mergedOptions.borderColor;\n const primary = mergedOptions.color;\n\n // Only create theme if we have some custom colors\n if (!bg && !text) return undefined;\n\n const isDark = bg ? isColorDark(bg) : false;\n\n return {\n backgroundColor: bg,\n textColor: text,\n textMutedColor: text && bg ? (isDark ? adjustColor(text, -60) : adjustColor(text, 60)) : undefined,\n secondaryBackgroundColor: bg ? (isDark ? adjustColor(bg, 20) : adjustColor(bg, -15)) : undefined,\n borderColor: border,\n primaryColor: primary,\n primaryHoverColor: primary ? (isDark ? adjustColor(primary, 20) : adjustColor(primary, -20)) : undefined,\n };\n }, [mergedOptions.backgroundColor, mergedOptions.textColor, mergedOptions.borderColor, mergedOptions.color]);\n\n // Container styles\n const containerStyle = useMemo(() => {\n const style: React.CSSProperties = {\n width: typeof mergedOptions.width === 'number' ? `${mergedOptions.width}px` : mergedOptions.width,\n maxWidth: typeof mergedOptions.maxWidth === 'number' ? `${mergedOptions.maxWidth}px` : mergedOptions.maxWidth,\n zIndex: mergedOptions.zIndex,\n };\n\n if (mergedOptions.position === 'fixed') {\n const { top, right, bottom, left } = mergedOptions.fixedPlacement || {};\n if (top !== undefined) style.top = typeof top === 'number' ? `${top}px` : top;\n if (right !== undefined) style.right = typeof right === 'number' ? `${right}px` : right;\n if (bottom !== undefined) style.bottom = typeof bottom === 'number' ? `${bottom}px` : bottom;\n if (left !== undefined) style.left = typeof left === 'number' ? `${left}px` : left;\n }\n\n return style;\n }, [mergedOptions]);\n\n // Bar padding style\n const barStyle = useMemo(() => {\n if (!mergedOptions.padding || mergedOptions.padding === DEFAULT_OPTIONS.padding) {\n return undefined;\n }\n return {\n padding: typeof mergedOptions.padding === 'number' ? `${mergedOptions.padding}px` : mergedOptions.padding,\n };\n }, [mergedOptions.padding]);\n\n // Result card max height style\n const resultMessageStyle = useMemo(() => {\n if (!mergedOptions.resultCardMaxHeight || mergedOptions.resultCardMaxHeight === DEFAULT_OPTIONS.resultCardMaxHeight) {\n return undefined;\n }\n return {\n maxHeight: typeof mergedOptions.resultCardMaxHeight === 'number'\n ? `${mergedOptions.resultCardMaxHeight}px`\n : mergedOptions.resultCardMaxHeight,\n };\n }, [mergedOptions.resultCardMaxHeight]);\n\n // Render tool call items with optional toolGroups segmentation\n const renderToolCallItems = (toolCalls: ToolCallSummary[], opts: Required<AICommandBarOptions>) => {\n if (opts.toolGroups && opts.toolGroups.length > 0) {\n const calls: ToolGroupCall[] = toolCalls.map((tc) => ({\n name: tc.name,\n input: tc.input,\n output: tc.output,\n toolCallId: tc.id,\n }));\n const segments = segmentToolCalls(calls, opts.toolGroups);\n const elements: React.ReactNode[] = [];\n let callIdx = 0;\n\n for (const segment of segments) {\n if (segment.type === 'group') {\n const groupKey = segment.calls.map((c) => c.toolCallId).join('-');\n elements.push(\n <div key={`cmd-group-${groupKey}`} className=\"devic-command-bar-result-tool-item devic-command-bar-result-tool-custom\">\n {segment.config.renderer(segment.calls)}\n </div>,\n );\n callIdx += segment.calls.length;\n } else {\n const tc = toolCalls[callIdx];\n const customRenderer = opts.toolRenderers?.[tc.name];\n if (customRenderer) {\n elements.push(\n <div key={tc.id} className=\"devic-command-bar-result-tool-item devic-command-bar-result-tool-custom\">\n {customRenderer(tc.input, tc.output)}\n </div>,\n );\n } else {\n const customIcon = opts.toolIcons?.[tc.name];\n elements.push(\n <div key={tc.id} className=\"devic-command-bar-result-tool-item\">\n {customIcon ? (\n <span className=\"devic-command-bar-result-tool-icon\">{customIcon}</span>\n ) : (\n <CheckIcon className=\"devic-command-bar-result-tool-icon\" />\n )}\n <span className=\"devic-command-bar-result-tool-name\">{tc.summary || tc.name}</span>\n </div>,\n );\n }\n callIdx += 1;\n }\n }\n\n return elements;\n }\n\n // Default: no toolGroups, render individually\n return toolCalls.map((tc) => {\n const customRenderer = opts.toolRenderers?.[tc.name];\n if (customRenderer) {\n return (\n <div key={tc.id} className=\"devic-command-bar-result-tool-item devic-command-bar-result-tool-custom\">\n {customRenderer(tc.input, tc.output)}\n </div>\n );\n }\n const customIcon = opts.toolIcons?.[tc.name];\n return (\n <div key={tc.id} className=\"devic-command-bar-result-tool-item\">\n {customIcon ? (\n <span className=\"devic-command-bar-result-tool-icon\">{customIcon}</span>\n ) : (\n <CheckIcon className=\"devic-command-bar-result-tool-icon\" />\n )}\n <span className=\"devic-command-bar-result-tool-name\">{tc.summary || tc.name}</span>\n </div>\n );\n });\n };\n\n return (\n <div\n ref={containerRef}\n className={`devic-command-bar-container ${className || ''}`}\n data-position={mergedOptions.position}\n data-visible={hook.isVisible}\n style={containerStyle}\n >\n {/* Commands dropdown */}\n {hook.showingCommands && hook.filteredCommands.length > 0 && (\n <div className=\"devic-command-bar-dropdown\">\n <div className=\"devic-command-bar-dropdown-header\">\n <span>Commands</span>\n <span className=\"devic-command-bar-dropdown-hint\">\n <kbd>↑</kbd><kbd>↓</kbd> to navigate, <kbd>Enter</kbd> to select\n </span>\n </div>\n <div className=\"devic-command-bar-dropdown-list\">\n {hook.filteredCommands.map((cmd, index) => (\n <div\n key={cmd.keyword}\n className=\"devic-command-bar-dropdown-item\"\n data-selected={index === hook.selectedCommandIndex}\n onClick={() => hook.selectCommand(cmd)}\n onMouseEnter={() => {/* Could update selectedCommandIndex on hover */}}\n >\n {cmd.icon && (\n <span className=\"devic-command-bar-dropdown-icon\">{cmd.icon}</span>\n )}\n <span className=\"devic-command-bar-dropdown-keyword\">/{cmd.keyword}</span>\n <span className=\"devic-command-bar-dropdown-desc\">{cmd.description}</span>\n </div>\n ))}\n </div>\n </div>\n )}\n\n {/* History list */}\n {hook.showingHistory && (\n <div className=\"devic-command-bar-dropdown\">\n <div className=\"devic-command-bar-dropdown-header\">\n <span>Command History</span>\n {hook.history.length > 0 && (\n <button\n className=\"devic-command-bar-dropdown-clear\"\n onClick={() => {\n hook.clearHistory();\n hook.setShowingHistory(false);\n }}\n type=\"button\"\n >\n Clear\n </button>\n )}\n </div>\n <div className=\"devic-command-bar-dropdown-list\" style={resultMessageStyle}>\n {hook.history.length === 0 ? (\n <div className=\"devic-command-bar-dropdown-empty\">No history yet</div>\n ) : (\n hook.history.map((item, index) => (\n <div\n key={`${item}-${index}`}\n className=\"devic-command-bar-dropdown-item devic-command-bar-history-item\"\n onClick={() => {\n hook.setShowingHistory(false);\n hook.setInputValue(item);\n hook.focus();\n }}\n >\n <HistoryIcon className=\"devic-command-bar-dropdown-icon\" />\n <span className=\"devic-command-bar-history-text\">{item}</span>\n </div>\n ))\n )}\n </div>\n </div>\n )}\n\n {/* Result card (above bar when completed) */}\n {mergedOptions.showResultCard && hook.result && !hook.showingHistory && !hook.showingCommands && (\n <div className=\"devic-command-bar-result\">\n {/* Tool calls section */}\n {hook.result.toolCalls.length > 0 && (\n <div className=\"devic-command-bar-result-tools\">\n <div\n className=\"devic-command-bar-result-tools-header\"\n data-expanded={toolsExpanded}\n onClick={() => setToolsExpanded(!toolsExpanded)}\n >\n <ChevronIcon className=\"devic-command-bar-result-tools-chevron\" />\n <span>Tool calls</span>\n <span className=\"devic-command-bar-result-tools-count\">\n {hook.result.toolCalls.length}\n </span>\n </div>\n <div\n className=\"devic-command-bar-result-tools-list\"\n data-expanded={toolsExpanded}\n >\n {renderToolCallItems(hook.result.toolCalls, mergedOptions)}\n </div>\n </div>\n )}\n\n {/* Message section */}\n <div className=\"devic-command-bar-result-message\" style={resultMessageStyle}>\n {hook.result.message.content?.message || (\n <span className=\"devic-command-bar-result-empty\">No response</span>\n )}\n </div>\n\n {/* Feedback actions */}\n <div className=\"devic-cmd-result-actions\">\n <MessageActions\n messageId={hook.result.message.uid}\n messageContent={hook.result.message.content?.message}\n currentFeedback={feedbackState}\n onFeedback={handleFeedback}\n showCopy={true}\n showFeedback={true}\n theme={feedbackTheme}\n />\n </div>\n </div>\n )}\n\n {/* Error display */}\n {hook.error && !hook.isProcessing && (\n <div className=\"devic-command-bar-error\">\n {hook.error.message}\n </div>\n )}\n\n {/* Main bar */}\n <div className=\"devic-command-bar\" style={barStyle}>\n {/* Left: Icon or Loader */}\n <div className=\"devic-command-bar-icon\">\n {hook.isProcessing ? (\n <div className=\"devic-command-bar-spinner\" />\n ) : (\n mergedOptions.icon || <SparklesIcon />\n )}\n </div>\n\n {/* Center: Input or Processing Summary */}\n {hook.isProcessing ? (\n <div className=\"devic-command-bar-summary\">\n {hook.currentToolSummary || mergedOptions.processingMessage}...\n </div>\n ) : (\n <input\n ref={hook.inputRef}\n type=\"text\"\n className=\"devic-command-bar-input\"\n placeholder={mergedOptions.placeholder}\n value={hook.inputValue}\n onChange={(e) => hook.setInputValue(e.target.value)}\n onKeyDown={hook.handleKeyDown}\n />\n )}\n\n {/* Right: Shortcut hint */}\n {mergedOptions.showShortcutHint && mergedOptions.shortcut && !hook.isProcessing && (\n <div className=\"devic-command-bar-shortcut\">\n {formatShortcut(mergedOptions.shortcut)}\n </div>\n )}\n </div>\n </div>\n );\n }\n);\n\n/**\n * Sparkles icon (default)\n */\nfunction SparklesIcon(): JSX.Element {\n return (\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n {/* Main star - 4-point diamond */}\n <path\n d=\"M10 2L11.5 8.5L18 10L11.5 11.5L10 18L8.5 11.5L2 10L8.5 8.5L10 2Z\"\n fill=\"currentColor\"\n opacity=\"0.9\"\n />\n {/* Small accent star - top right */}\n <path\n d=\"M16 3L16.5 5L18.5 5.5L16.5 6L16 8L15.5 6L13.5 5.5L15.5 5L16 3Z\"\n fill=\"currentColor\"\n opacity=\"0.6\"\n />\n {/* Tiny accent dot - bottom left */}\n <circle cx=\"4\" cy=\"15\" r=\"1\" fill=\"currentColor\" opacity=\"0.4\" />\n </svg>\n );\n}\n\n/**\n * Chevron right icon\n */\nfunction ChevronIcon({ className }: { className?: string }): JSX.Element {\n return (\n <svg\n className={className}\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <polyline points=\"9 18 15 12 9 6\" />\n </svg>\n );\n}\n\n/**\n * Check icon\n */\nfunction CheckIcon({ className }: { className?: string }): JSX.Element {\n return (\n <svg\n className={className}\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n );\n}\n\n/**\n * History icon\n */\nfunction HistoryIcon({ className }: { className?: string }): JSX.Element {\n return (\n <svg\n className={className}\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M3 3v5h5\" />\n <path d=\"M3.05 13A9 9 0 1 0 6 5.3L3 8\" />\n <path d=\"M12 7v5l4 2\" />\n </svg>\n );\n}\n"],"names":["forwardRef","useMemo","useAICommandBar","useImperativeHandle","useState","useRef","useOptionalDevicContext","useEffect","DevicApiClient","useCallback","segmentToolCalls","_jsx","_jsxs","MessageActions","formatShortcut"],"mappings":"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"}
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
var jsxRuntime = require('react/jsx-runtime');
|
|
4
4
|
var React = require('react');
|
|
5
5
|
var useAIGenerationButton = require('./useAIGenerationButton.js');
|
|
6
|
+
var toolGroups = require('../../utils/toolGroups.js');
|
|
6
7
|
|
|
7
8
|
const DEFAULT_OPTIONS = {
|
|
8
9
|
mode: 'modal',
|
|
@@ -33,6 +34,7 @@ const DEFAULT_OPTIONS = {
|
|
|
33
34
|
toolRenderers: undefined,
|
|
34
35
|
toolIcons: undefined,
|
|
35
36
|
processingMessage: 'Processing...',
|
|
37
|
+
toolGroups: undefined,
|
|
36
38
|
};
|
|
37
39
|
/**
|
|
38
40
|
* AIGenerationButton component - a button that triggers AI generation with configurable interaction modes
|
|
@@ -203,22 +205,51 @@ const AIGenerationButton = React.forwardRef(function AIGenerationButton(props, r
|
|
|
203
205
|
}
|
|
204
206
|
return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [!mergedOptions.hideIcon && (jsxRuntime.jsx("span", { className: "devic-gen-button-icon", children: showButtonLoading ? (jsxRuntime.jsx("span", { className: "devic-gen-spinner" })) : (mergedOptions.icon || jsxRuntime.jsx(SparklesIcon, {})) })), !mergedOptions.hideLabel && (jsxRuntime.jsx("span", { className: "devic-gen-button-label", children: showButtonLoading ? mergedOptions.loadingLabel : mergedOptions.label }))] }));
|
|
205
207
|
};
|
|
208
|
+
// Render a single tool call item (default rendering)
|
|
209
|
+
const renderSingleToolCall = (tc) => {
|
|
210
|
+
const customRenderer = mergedOptions.toolRenderers?.[tc.name];
|
|
211
|
+
if (customRenderer && tc.status === 'completed') {
|
|
212
|
+
return (jsxRuntime.jsx("div", { className: "devic-gen-tool-item devic-gen-tool-custom", children: customRenderer(tc.input, tc.output) }, tc.id));
|
|
213
|
+
}
|
|
214
|
+
const customIcon = mergedOptions.toolIcons?.[tc.name];
|
|
215
|
+
const isExecuting = tc.status === 'executing';
|
|
216
|
+
return (jsxRuntime.jsxs("div", { className: "devic-gen-tool-item", "data-status": tc.status, children: [jsxRuntime.jsx("span", { className: "devic-gen-tool-icon", children: isExecuting ? (jsxRuntime.jsx("span", { className: "devic-gen-spinner devic-gen-spinner-small" })) : customIcon ? (customIcon) : (jsxRuntime.jsx(CheckIcon, {})) }), jsxRuntime.jsx("span", { className: "devic-gen-tool-name", children: tc.summary || tc.name })] }, tc.id));
|
|
217
|
+
};
|
|
206
218
|
// Render tool calls display
|
|
207
219
|
const renderToolCalls = () => {
|
|
208
220
|
if (!hook.isProcessing || hook.toolCalls.length === 0) {
|
|
209
221
|
return null;
|
|
210
222
|
}
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
223
|
+
// Separate completed calls (for grouping) from still-active calls
|
|
224
|
+
const completedCalls = hook.toolCalls.filter((tc) => tc.status === 'completed');
|
|
225
|
+
const activeCalls = hook.toolCalls.filter((tc) => tc.status !== 'completed');
|
|
226
|
+
let completedElements;
|
|
227
|
+
if (mergedOptions.toolGroups && mergedOptions.toolGroups.length > 0 && completedCalls.length > 0) {
|
|
228
|
+
const calls = completedCalls.map((tc) => ({
|
|
229
|
+
name: tc.name,
|
|
230
|
+
input: tc.input,
|
|
231
|
+
output: tc.output,
|
|
232
|
+
toolCallId: tc.id,
|
|
233
|
+
}));
|
|
234
|
+
const segments = toolGroups.segmentToolCalls(calls, mergedOptions.toolGroups);
|
|
235
|
+
completedElements = [];
|
|
236
|
+
let callIdx = 0;
|
|
237
|
+
for (const segment of segments) {
|
|
238
|
+
if (segment.type === 'group') {
|
|
239
|
+
const groupKey = segment.calls.map((c) => c.toolCallId).join('-');
|
|
240
|
+
completedElements.push(jsxRuntime.jsx("div", { className: "devic-gen-tool-item devic-gen-tool-custom", children: segment.config.renderer(segment.calls) }, `gen-group-${groupKey}`));
|
|
241
|
+
callIdx += segment.calls.length;
|
|
216
242
|
}
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
}
|
|
243
|
+
else {
|
|
244
|
+
completedElements.push(renderSingleToolCall(completedCalls[callIdx]));
|
|
245
|
+
callIdx += 1;
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
else {
|
|
250
|
+
completedElements = completedCalls.map(renderSingleToolCall);
|
|
251
|
+
}
|
|
252
|
+
return (jsxRuntime.jsxs("div", { className: "devic-gen-tool-calls", children: [completedElements, activeCalls.map(renderSingleToolCall)] }));
|
|
222
253
|
};
|
|
223
254
|
// Render processing status
|
|
224
255
|
const renderProcessingStatus = () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AIGenerationButton.js","sources":["../../../../../src/components/AIGenerationButton/AIGenerationButton.tsx"],"sourcesContent":["import React, { forwardRef, useImperativeHandle, useMemo, useEffect, useRef, useCallback } from 'react';\nimport { useAIGenerationButton } from './useAIGenerationButton';\nimport type {\n AIGenerationButtonProps,\n AIGenerationButtonHandle,\n AIGenerationButtonOptions,\n} from './AIGenerationButton.types';\nimport './AIGenerationButton.css';\n\nconst DEFAULT_OPTIONS: Required<AIGenerationButtonOptions> = {\n mode: 'modal',\n prompt: '',\n placeholder: 'Describe what you want to generate...',\n modalTitle: 'Generate with AI',\n modalDescription: '',\n confirmText: 'Generate',\n cancelText: 'Cancel',\n tooltipPlacement: 'top',\n tooltipWidth: 300,\n variant: 'primary',\n size: 'medium',\n icon: undefined as any,\n hideIcon: false,\n label: 'Generate with AI',\n hideLabel: false,\n loadingLabel: 'Generating...',\n color: '#3b82f6',\n backgroundColor: '',\n textColor: '',\n borderColor: '',\n borderRadius: 8,\n fontFamily: \"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif\",\n fontSize: 14,\n zIndex: 10000,\n animationDuration: 200,\n toolRenderers: undefined as any,\n toolIcons: undefined as any,\n processingMessage: 'Processing...',\n};\n\n/**\n * AIGenerationButton component - a button that triggers AI generation with configurable interaction modes\n *\n * @example\n * ```tsx\n * // Direct mode - sends predefined prompt on click\n * <AIGenerationButton\n * assistantId=\"my-assistant\"\n * options={{\n * mode: 'direct',\n * prompt: 'Generate a summary of the current page',\n * label: 'Summarize',\n * }}\n * onResponse={({ message }) => console.log(message.content)}\n * />\n *\n * // Modal mode - opens modal for user input\n * <AIGenerationButton\n * assistantId=\"my-assistant\"\n * options={{\n * mode: 'modal',\n * modalTitle: 'Generate Content',\n * placeholder: 'Describe what you want...',\n * }}\n * onResponse={({ message }) => setContent(message.content.message)}\n * />\n *\n * // Tooltip mode - quick inline input\n * <AIGenerationButton\n * assistantId=\"my-assistant\"\n * options={{\n * mode: 'tooltip',\n * tooltipPlacement: 'bottom',\n * }}\n * onResponse={handleGeneration}\n * />\n * ```\n */\nexport const AIGenerationButton = forwardRef<AIGenerationButtonHandle, AIGenerationButtonProps>(\n function AIGenerationButton(props, ref) {\n const {\n assistantId,\n apiKey,\n baseUrl,\n tenantId,\n tenantMetadata,\n options = {},\n modelInterfaceTools,\n onResponse,\n onBeforeSend,\n onError,\n onStart,\n onOpen,\n onClose,\n disabled,\n className,\n containerClassName,\n children,\n theme,\n } = props;\n\n const mergedOptions = useMemo(\n () => ({ ...DEFAULT_OPTIONS, ...options }),\n [options]\n );\n\n const hook = useAIGenerationButton({\n assistantId,\n apiKey,\n baseUrl,\n tenantId,\n tenantMetadata,\n options: mergedOptions,\n modelInterfaceTools,\n onResponse,\n onBeforeSend,\n onError,\n onStart,\n onOpen,\n onClose,\n disabled,\n });\n\n // Expose handle\n useImperativeHandle(ref, () => ({\n generate: hook.generate,\n open: hook.open,\n close: hook.close,\n reset: hook.reset,\n isProcessing: hook.isProcessing,\n }));\n\n // Container ref for theming\n const containerRef = useRef<HTMLDivElement>(null);\n const tooltipRef = useRef<HTMLDivElement>(null);\n\n // Apply CSS variables for theming\n useEffect(() => {\n const el = containerRef.current;\n if (!el) return;\n\n const vars: [string, string | undefined][] = [\n ['--devic-gen-primary', mergedOptions.color],\n ['----devic-gen-bg', mergedOptions.backgroundColor || undefined],\n ['--devic-gen-text', mergedOptions.textColor || undefined],\n ['--devic-gen-border', mergedOptions.borderColor || undefined],\n ['--devic-gen-font-family', mergedOptions.fontFamily],\n ['--devic-gen-font-size', typeof mergedOptions.fontSize === 'number' ? `${mergedOptions.fontSize}px` : mergedOptions.fontSize],\n ['--devic-gen-radius', typeof mergedOptions.borderRadius === 'number' ? `${mergedOptions.borderRadius}px` : mergedOptions.borderRadius],\n ['--devic-gen-z-index', String(mergedOptions.zIndex)],\n ['--devic-gen-animation-duration', `${mergedOptions.animationDuration}ms`],\n ];\n\n // Apply theme from parent if provided\n if (theme) {\n if (theme.backgroundColor) vars.push(['--devic-gen-modal-bg', theme.backgroundColor]);\n if (theme.textColor) vars.push(['--devic-gen-modal-text', theme.textColor]);\n if (theme.borderColor) vars.push(['--devic-gen-modal-border', theme.borderColor]);\n if (theme.primaryColor) vars.push(['--devic-gen-primary', theme.primaryColor]);\n }\n\n for (const [name, value] of vars) {\n if (value) {\n el.style.setProperty(name, value);\n } else {\n el.style.removeProperty(name);\n }\n }\n }, [mergedOptions, theme]);\n\n // Click outside to close tooltip\n useEffect(() => {\n if (!hook.isOpen || mergedOptions.mode !== 'tooltip') return;\n\n const handleClickOutside = (e: MouseEvent) => {\n const tooltip = tooltipRef.current;\n const container = containerRef.current;\n if (\n tooltip &&\n container &&\n !tooltip.contains(e.target as Node) &&\n !container.contains(e.target as Node)\n ) {\n hook.close();\n }\n };\n\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, [hook.isOpen, mergedOptions.mode, hook.close]);\n\n // Handle button click\n const handleButtonClick = useCallback(() => {\n if (disabled || hook.isProcessing) return;\n\n if (mergedOptions.mode === 'direct') {\n hook.generate();\n } else {\n hook.open();\n }\n }, [disabled, hook.isProcessing, mergedOptions.mode, hook.generate, hook.open]);\n\n // Handle confirm in modal/tooltip\n const handleConfirm = useCallback(() => {\n hook.generate();\n }, [hook.generate]);\n\n // Tooltip position styles\n const tooltipPositionStyle = useMemo(() => {\n const placement = mergedOptions.tooltipPlacement;\n const width = typeof mergedOptions.tooltipWidth === 'number'\n ? `${mergedOptions.tooltipWidth}px`\n : mergedOptions.tooltipWidth;\n\n const baseStyle: React.CSSProperties = {\n width,\n position: 'absolute',\n zIndex: mergedOptions.zIndex,\n };\n\n switch (placement) {\n case 'top':\n return { ...baseStyle, bottom: '100%', left: '50%', transform: 'translateX(-50%)', marginBottom: '8px' };\n case 'bottom':\n return { ...baseStyle, top: '100%', left: '50%', transform: 'translateX(-50%)', marginTop: '8px' };\n case 'left':\n return { ...baseStyle, right: '100%', top: '50%', transform: 'translateY(-50%)', marginRight: '8px' };\n case 'right':\n return { ...baseStyle, left: '100%', top: '50%', transform: 'translateY(-50%)', marginLeft: '8px' };\n default:\n return baseStyle;\n }\n }, [mergedOptions.tooltipPlacement, mergedOptions.tooltipWidth, mergedOptions.zIndex]);\n\n // Render button content\n // Only show loading state on button for direct mode (modal/tooltip have their own loading)\n const showButtonLoading = hook.isProcessing && mergedOptions.mode === 'direct';\n\n const renderButtonContent = () => {\n if (children) {\n return children;\n }\n\n return (\n <>\n {!mergedOptions.hideIcon && (\n <span className=\"devic-gen-button-icon\">\n {showButtonLoading ? (\n <span className=\"devic-gen-spinner\" />\n ) : (\n mergedOptions.icon || <SparklesIcon />\n )}\n </span>\n )}\n {!mergedOptions.hideLabel && (\n <span className=\"devic-gen-button-label\">\n {showButtonLoading ? mergedOptions.loadingLabel : mergedOptions.label}\n </span>\n )}\n </>\n );\n };\n\n // Render tool calls display\n const renderToolCalls = () => {\n if (!hook.isProcessing || hook.toolCalls.length === 0) {\n return null;\n }\n\n return (\n <div className=\"devic-gen-tool-calls\">\n {hook.toolCalls.map((tc) => {\n // Check for custom renderer\n const customRenderer = mergedOptions.toolRenderers?.[tc.name];\n if (customRenderer && tc.status === 'completed') {\n return (\n <div key={tc.id} className=\"devic-gen-tool-item devic-gen-tool-custom\">\n {customRenderer(tc.input, tc.output)}\n </div>\n );\n }\n\n // Use custom icon or default\n const customIcon = mergedOptions.toolIcons?.[tc.name];\n const isExecuting = tc.status === 'executing';\n\n return (\n <div\n key={tc.id}\n className=\"devic-gen-tool-item\"\n data-status={tc.status}\n >\n <span className=\"devic-gen-tool-icon\">\n {isExecuting ? (\n <span className=\"devic-gen-spinner devic-gen-spinner-small\" />\n ) : customIcon ? (\n customIcon\n ) : (\n <CheckIcon />\n )}\n </span>\n <span className=\"devic-gen-tool-name\">{tc.summary || tc.name}</span>\n </div>\n );\n })}\n </div>\n );\n };\n\n // Render processing status\n const renderProcessingStatus = () => {\n if (!hook.isProcessing) return null;\n\n return (\n <div className=\"devic-gen-processing-status\">\n <span className=\"devic-gen-spinner devic-gen-spinner-small\" />\n <span className=\"devic-gen-processing-text\">\n {hook.currentToolSummary || mergedOptions.processingMessage}\n </span>\n </div>\n );\n };\n\n return (\n <div\n ref={containerRef}\n className={`devic-gen-container ${containerClassName || ''}`}\n style={{ position: 'relative', display: 'inline-block' }}\n >\n {/* Button */}\n <button\n type=\"button\"\n className={`devic-gen-button ${className || ''}`}\n data-variant={mergedOptions.variant}\n data-size={mergedOptions.size}\n data-processing={showButtonLoading}\n onClick={handleButtonClick}\n disabled={disabled || showButtonLoading}\n >\n {renderButtonContent()}\n </button>\n\n {/* Tooltip */}\n {mergedOptions.mode === 'tooltip' && hook.isOpen && (\n <div\n ref={tooltipRef}\n className=\"devic-gen-tooltip\"\n style={tooltipPositionStyle}\n data-placement={mergedOptions.tooltipPlacement}\n >\n {/* Tool calls display */}\n {renderToolCalls()}\n {/* Processing status when no tool calls yet */}\n {hook.isProcessing && hook.toolCalls.length === 0 && renderProcessingStatus()}\n <textarea\n ref={hook.inputRef}\n className=\"devic-gen-input\"\n placeholder={mergedOptions.placeholder}\n value={hook.inputValue}\n onChange={(e) => hook.setInputValue(e.target.value)}\n onKeyDown={hook.handleKeyDown}\n rows={3}\n disabled={hook.isProcessing}\n />\n {hook.error && (\n <div className=\"devic-gen-error\">{hook.error.message}</div>\n )}\n <div className=\"devic-gen-tooltip-actions\">\n <button\n type=\"button\"\n className=\"devic-gen-tooltip-cancel\"\n onClick={hook.close}\n disabled={hook.isProcessing}\n >\n {mergedOptions.cancelText}\n </button>\n <button\n type=\"button\"\n className=\"devic-gen-tooltip-confirm\"\n onClick={handleConfirm}\n disabled={hook.isProcessing || !hook.inputValue.trim()}\n >\n {hook.isProcessing ? (\n <>\n <span className=\"devic-gen-spinner devic-gen-spinner-small\" />\n {mergedOptions.loadingLabel}\n </>\n ) : (\n mergedOptions.confirmText\n )}\n </button>\n </div>\n </div>\n )}\n\n {/* Modal */}\n {mergedOptions.mode === 'modal' && hook.isOpen && (\n <div\n className=\"devic-gen-modal-overlay\"\n onClick={(e) => {\n if (e.target === e.currentTarget && !hook.isProcessing) hook.close();\n }}\n >\n <div className=\"devic-gen-modal\">\n <div className=\"devic-gen-modal-header\">\n <h3 className=\"devic-gen-modal-title\">{mergedOptions.modalTitle}</h3>\n <button\n type=\"button\"\n className=\"devic-gen-modal-close\"\n onClick={hook.close}\n aria-label=\"Close\"\n disabled={hook.isProcessing}\n >\n <CloseIcon />\n </button>\n </div>\n {mergedOptions.modalDescription && (\n <p className=\"devic-gen-modal-description\">{mergedOptions.modalDescription}</p>\n )}\n <div className=\"devic-gen-modal-body\">\n {/* Tool calls display */}\n {renderToolCalls()}\n {/* Processing status when no tool calls yet */}\n {hook.isProcessing && hook.toolCalls.length === 0 && renderProcessingStatus()}\n <textarea\n ref={hook.inputRef}\n className=\"devic-gen-input\"\n placeholder={mergedOptions.placeholder}\n value={hook.inputValue}\n onChange={(e) => hook.setInputValue(e.target.value)}\n onKeyDown={hook.handleKeyDown}\n rows={4}\n disabled={hook.isProcessing}\n />\n {hook.error && (\n <div className=\"devic-gen-error\">{hook.error.message}</div>\n )}\n </div>\n <div className=\"devic-gen-modal-footer\">\n <button\n type=\"button\"\n className=\"devic-gen-modal-cancel\"\n onClick={hook.close}\n disabled={hook.isProcessing}\n >\n {mergedOptions.cancelText}\n </button>\n <button\n type=\"button\"\n className=\"devic-gen-modal-confirm\"\n onClick={handleConfirm}\n disabled={hook.isProcessing || !hook.inputValue.trim()}\n >\n {hook.isProcessing ? (\n <>\n <span className=\"devic-gen-spinner devic-gen-spinner-small\" />\n {mergedOptions.loadingLabel}\n </>\n ) : (\n mergedOptions.confirmText\n )}\n </button>\n </div>\n </div>\n </div>\n )}\n </div>\n );\n }\n);\n\n/**\n * Default sparkles icon\n */\nfunction SparklesIcon(): JSX.Element {\n return (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M10 2L11.5 8.5L18 10L11.5 11.5L10 18L8.5 11.5L2 10L8.5 8.5L10 2Z\"\n fill=\"currentColor\"\n opacity=\"0.9\"\n />\n <path\n d=\"M16 3L16.5 5L18.5 5.5L16.5 6L16 8L15.5 6L13.5 5.5L15.5 5L16 3Z\"\n fill=\"currentColor\"\n opacity=\"0.6\"\n />\n <circle cx=\"4\" cy=\"15\" r=\"1\" fill=\"currentColor\" opacity=\"0.4\" />\n </svg>\n );\n}\n\n/**\n * Close icon\n */\nfunction CloseIcon(): JSX.Element {\n return (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n );\n}\n\n/**\n * Check icon for completed tool calls\n */\nfunction CheckIcon(): JSX.Element {\n return (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n );\n}\n"],"names":["forwardRef","useMemo","useAIGenerationButton","useImperativeHandle","useRef","useEffect","useCallback","_jsxs","_Fragment","_jsx"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AIGenerationButton.js","sources":["../../../../../src/components/AIGenerationButton/AIGenerationButton.tsx"],"sourcesContent":["import React, { forwardRef, useImperativeHandle, useMemo, useEffect, useRef, useCallback } from 'react';\nimport { useAIGenerationButton } from './useAIGenerationButton';\nimport type {\n AIGenerationButtonProps,\n AIGenerationButtonHandle,\n AIGenerationButtonOptions,\n} from './AIGenerationButton.types';\nimport type { ToolGroupCall } from '../../api/types';\nimport type { ToolCallSummary } from '../AICommandBar/AICommandBar.types';\nimport { segmentToolCalls } from '../../utils/toolGroups';\nimport './AIGenerationButton.css';\n\nconst DEFAULT_OPTIONS: Required<AIGenerationButtonOptions> = {\n mode: 'modal',\n prompt: '',\n placeholder: 'Describe what you want to generate...',\n modalTitle: 'Generate with AI',\n modalDescription: '',\n confirmText: 'Generate',\n cancelText: 'Cancel',\n tooltipPlacement: 'top',\n tooltipWidth: 300,\n variant: 'primary',\n size: 'medium',\n icon: undefined as any,\n hideIcon: false,\n label: 'Generate with AI',\n hideLabel: false,\n loadingLabel: 'Generating...',\n color: '#3b82f6',\n backgroundColor: '',\n textColor: '',\n borderColor: '',\n borderRadius: 8,\n fontFamily: \"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif\",\n fontSize: 14,\n zIndex: 10000,\n animationDuration: 200,\n toolRenderers: undefined as any,\n toolIcons: undefined as any,\n processingMessage: 'Processing...',\n toolGroups: undefined as any,\n};\n\n/**\n * AIGenerationButton component - a button that triggers AI generation with configurable interaction modes\n *\n * @example\n * ```tsx\n * // Direct mode - sends predefined prompt on click\n * <AIGenerationButton\n * assistantId=\"my-assistant\"\n * options={{\n * mode: 'direct',\n * prompt: 'Generate a summary of the current page',\n * label: 'Summarize',\n * }}\n * onResponse={({ message }) => console.log(message.content)}\n * />\n *\n * // Modal mode - opens modal for user input\n * <AIGenerationButton\n * assistantId=\"my-assistant\"\n * options={{\n * mode: 'modal',\n * modalTitle: 'Generate Content',\n * placeholder: 'Describe what you want...',\n * }}\n * onResponse={({ message }) => setContent(message.content.message)}\n * />\n *\n * // Tooltip mode - quick inline input\n * <AIGenerationButton\n * assistantId=\"my-assistant\"\n * options={{\n * mode: 'tooltip',\n * tooltipPlacement: 'bottom',\n * }}\n * onResponse={handleGeneration}\n * />\n * ```\n */\nexport const AIGenerationButton = forwardRef<AIGenerationButtonHandle, AIGenerationButtonProps>(\n function AIGenerationButton(props, ref) {\n const {\n assistantId,\n apiKey,\n baseUrl,\n tenantId,\n tenantMetadata,\n options = {},\n modelInterfaceTools,\n onResponse,\n onBeforeSend,\n onError,\n onStart,\n onOpen,\n onClose,\n disabled,\n className,\n containerClassName,\n children,\n theme,\n } = props;\n\n const mergedOptions = useMemo(\n () => ({ ...DEFAULT_OPTIONS, ...options }),\n [options]\n );\n\n const hook = useAIGenerationButton({\n assistantId,\n apiKey,\n baseUrl,\n tenantId,\n tenantMetadata,\n options: mergedOptions,\n modelInterfaceTools,\n onResponse,\n onBeforeSend,\n onError,\n onStart,\n onOpen,\n onClose,\n disabled,\n });\n\n // Expose handle\n useImperativeHandle(ref, () => ({\n generate: hook.generate,\n open: hook.open,\n close: hook.close,\n reset: hook.reset,\n isProcessing: hook.isProcessing,\n }));\n\n // Container ref for theming\n const containerRef = useRef<HTMLDivElement>(null);\n const tooltipRef = useRef<HTMLDivElement>(null);\n\n // Apply CSS variables for theming\n useEffect(() => {\n const el = containerRef.current;\n if (!el) return;\n\n const vars: [string, string | undefined][] = [\n ['--devic-gen-primary', mergedOptions.color],\n ['----devic-gen-bg', mergedOptions.backgroundColor || undefined],\n ['--devic-gen-text', mergedOptions.textColor || undefined],\n ['--devic-gen-border', mergedOptions.borderColor || undefined],\n ['--devic-gen-font-family', mergedOptions.fontFamily],\n ['--devic-gen-font-size', typeof mergedOptions.fontSize === 'number' ? `${mergedOptions.fontSize}px` : mergedOptions.fontSize],\n ['--devic-gen-radius', typeof mergedOptions.borderRadius === 'number' ? `${mergedOptions.borderRadius}px` : mergedOptions.borderRadius],\n ['--devic-gen-z-index', String(mergedOptions.zIndex)],\n ['--devic-gen-animation-duration', `${mergedOptions.animationDuration}ms`],\n ];\n\n // Apply theme from parent if provided\n if (theme) {\n if (theme.backgroundColor) vars.push(['--devic-gen-modal-bg', theme.backgroundColor]);\n if (theme.textColor) vars.push(['--devic-gen-modal-text', theme.textColor]);\n if (theme.borderColor) vars.push(['--devic-gen-modal-border', theme.borderColor]);\n if (theme.primaryColor) vars.push(['--devic-gen-primary', theme.primaryColor]);\n }\n\n for (const [name, value] of vars) {\n if (value) {\n el.style.setProperty(name, value);\n } else {\n el.style.removeProperty(name);\n }\n }\n }, [mergedOptions, theme]);\n\n // Click outside to close tooltip\n useEffect(() => {\n if (!hook.isOpen || mergedOptions.mode !== 'tooltip') return;\n\n const handleClickOutside = (e: MouseEvent) => {\n const tooltip = tooltipRef.current;\n const container = containerRef.current;\n if (\n tooltip &&\n container &&\n !tooltip.contains(e.target as Node) &&\n !container.contains(e.target as Node)\n ) {\n hook.close();\n }\n };\n\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, [hook.isOpen, mergedOptions.mode, hook.close]);\n\n // Handle button click\n const handleButtonClick = useCallback(() => {\n if (disabled || hook.isProcessing) return;\n\n if (mergedOptions.mode === 'direct') {\n hook.generate();\n } else {\n hook.open();\n }\n }, [disabled, hook.isProcessing, mergedOptions.mode, hook.generate, hook.open]);\n\n // Handle confirm in modal/tooltip\n const handleConfirm = useCallback(() => {\n hook.generate();\n }, [hook.generate]);\n\n // Tooltip position styles\n const tooltipPositionStyle = useMemo(() => {\n const placement = mergedOptions.tooltipPlacement;\n const width = typeof mergedOptions.tooltipWidth === 'number'\n ? `${mergedOptions.tooltipWidth}px`\n : mergedOptions.tooltipWidth;\n\n const baseStyle: React.CSSProperties = {\n width,\n position: 'absolute',\n zIndex: mergedOptions.zIndex,\n };\n\n switch (placement) {\n case 'top':\n return { ...baseStyle, bottom: '100%', left: '50%', transform: 'translateX(-50%)', marginBottom: '8px' };\n case 'bottom':\n return { ...baseStyle, top: '100%', left: '50%', transform: 'translateX(-50%)', marginTop: '8px' };\n case 'left':\n return { ...baseStyle, right: '100%', top: '50%', transform: 'translateY(-50%)', marginRight: '8px' };\n case 'right':\n return { ...baseStyle, left: '100%', top: '50%', transform: 'translateY(-50%)', marginLeft: '8px' };\n default:\n return baseStyle;\n }\n }, [mergedOptions.tooltipPlacement, mergedOptions.tooltipWidth, mergedOptions.zIndex]);\n\n // Render button content\n // Only show loading state on button for direct mode (modal/tooltip have their own loading)\n const showButtonLoading = hook.isProcessing && mergedOptions.mode === 'direct';\n\n const renderButtonContent = () => {\n if (children) {\n return children;\n }\n\n return (\n <>\n {!mergedOptions.hideIcon && (\n <span className=\"devic-gen-button-icon\">\n {showButtonLoading ? (\n <span className=\"devic-gen-spinner\" />\n ) : (\n mergedOptions.icon || <SparklesIcon />\n )}\n </span>\n )}\n {!mergedOptions.hideLabel && (\n <span className=\"devic-gen-button-label\">\n {showButtonLoading ? mergedOptions.loadingLabel : mergedOptions.label}\n </span>\n )}\n </>\n );\n };\n\n // Render a single tool call item (default rendering)\n const renderSingleToolCall = (tc: ToolCallSummary) => {\n const customRenderer = mergedOptions.toolRenderers?.[tc.name];\n if (customRenderer && tc.status === 'completed') {\n return (\n <div key={tc.id} className=\"devic-gen-tool-item devic-gen-tool-custom\">\n {customRenderer(tc.input, tc.output)}\n </div>\n );\n }\n\n const customIcon = mergedOptions.toolIcons?.[tc.name];\n const isExecuting = tc.status === 'executing';\n\n return (\n <div\n key={tc.id}\n className=\"devic-gen-tool-item\"\n data-status={tc.status}\n >\n <span className=\"devic-gen-tool-icon\">\n {isExecuting ? (\n <span className=\"devic-gen-spinner devic-gen-spinner-small\" />\n ) : customIcon ? (\n customIcon\n ) : (\n <CheckIcon />\n )}\n </span>\n <span className=\"devic-gen-tool-name\">{tc.summary || tc.name}</span>\n </div>\n );\n };\n\n // Render tool calls display\n const renderToolCalls = () => {\n if (!hook.isProcessing || hook.toolCalls.length === 0) {\n return null;\n }\n\n // Separate completed calls (for grouping) from still-active calls\n const completedCalls = hook.toolCalls.filter((tc) => tc.status === 'completed');\n const activeCalls = hook.toolCalls.filter((tc) => tc.status !== 'completed');\n\n let completedElements: React.ReactNode[];\n\n if (mergedOptions.toolGroups && mergedOptions.toolGroups.length > 0 && completedCalls.length > 0) {\n const calls: ToolGroupCall[] = completedCalls.map((tc) => ({\n name: tc.name,\n input: tc.input,\n output: tc.output,\n toolCallId: tc.id,\n }));\n const segments = segmentToolCalls(calls, mergedOptions.toolGroups);\n completedElements = [];\n let callIdx = 0;\n\n for (const segment of segments) {\n if (segment.type === 'group') {\n const groupKey = segment.calls.map((c) => c.toolCallId).join('-');\n completedElements.push(\n <div key={`gen-group-${groupKey}`} className=\"devic-gen-tool-item devic-gen-tool-custom\">\n {segment.config.renderer(segment.calls)}\n </div>,\n );\n callIdx += segment.calls.length;\n } else {\n completedElements.push(renderSingleToolCall(completedCalls[callIdx]));\n callIdx += 1;\n }\n }\n } else {\n completedElements = completedCalls.map(renderSingleToolCall);\n }\n\n return (\n <div className=\"devic-gen-tool-calls\">\n {completedElements}\n {activeCalls.map(renderSingleToolCall)}\n </div>\n );\n };\n\n // Render processing status\n const renderProcessingStatus = () => {\n if (!hook.isProcessing) return null;\n\n return (\n <div className=\"devic-gen-processing-status\">\n <span className=\"devic-gen-spinner devic-gen-spinner-small\" />\n <span className=\"devic-gen-processing-text\">\n {hook.currentToolSummary || mergedOptions.processingMessage}\n </span>\n </div>\n );\n };\n\n return (\n <div\n ref={containerRef}\n className={`devic-gen-container ${containerClassName || ''}`}\n style={{ position: 'relative', display: 'inline-block' }}\n >\n {/* Button */}\n <button\n type=\"button\"\n className={`devic-gen-button ${className || ''}`}\n data-variant={mergedOptions.variant}\n data-size={mergedOptions.size}\n data-processing={showButtonLoading}\n onClick={handleButtonClick}\n disabled={disabled || showButtonLoading}\n >\n {renderButtonContent()}\n </button>\n\n {/* Tooltip */}\n {mergedOptions.mode === 'tooltip' && hook.isOpen && (\n <div\n ref={tooltipRef}\n className=\"devic-gen-tooltip\"\n style={tooltipPositionStyle}\n data-placement={mergedOptions.tooltipPlacement}\n >\n {/* Tool calls display */}\n {renderToolCalls()}\n {/* Processing status when no tool calls yet */}\n {hook.isProcessing && hook.toolCalls.length === 0 && renderProcessingStatus()}\n <textarea\n ref={hook.inputRef}\n className=\"devic-gen-input\"\n placeholder={mergedOptions.placeholder}\n value={hook.inputValue}\n onChange={(e) => hook.setInputValue(e.target.value)}\n onKeyDown={hook.handleKeyDown}\n rows={3}\n disabled={hook.isProcessing}\n />\n {hook.error && (\n <div className=\"devic-gen-error\">{hook.error.message}</div>\n )}\n <div className=\"devic-gen-tooltip-actions\">\n <button\n type=\"button\"\n className=\"devic-gen-tooltip-cancel\"\n onClick={hook.close}\n disabled={hook.isProcessing}\n >\n {mergedOptions.cancelText}\n </button>\n <button\n type=\"button\"\n className=\"devic-gen-tooltip-confirm\"\n onClick={handleConfirm}\n disabled={hook.isProcessing || !hook.inputValue.trim()}\n >\n {hook.isProcessing ? (\n <>\n <span className=\"devic-gen-spinner devic-gen-spinner-small\" />\n {mergedOptions.loadingLabel}\n </>\n ) : (\n mergedOptions.confirmText\n )}\n </button>\n </div>\n </div>\n )}\n\n {/* Modal */}\n {mergedOptions.mode === 'modal' && hook.isOpen && (\n <div\n className=\"devic-gen-modal-overlay\"\n onClick={(e) => {\n if (e.target === e.currentTarget && !hook.isProcessing) hook.close();\n }}\n >\n <div className=\"devic-gen-modal\">\n <div className=\"devic-gen-modal-header\">\n <h3 className=\"devic-gen-modal-title\">{mergedOptions.modalTitle}</h3>\n <button\n type=\"button\"\n className=\"devic-gen-modal-close\"\n onClick={hook.close}\n aria-label=\"Close\"\n disabled={hook.isProcessing}\n >\n <CloseIcon />\n </button>\n </div>\n {mergedOptions.modalDescription && (\n <p className=\"devic-gen-modal-description\">{mergedOptions.modalDescription}</p>\n )}\n <div className=\"devic-gen-modal-body\">\n {/* Tool calls display */}\n {renderToolCalls()}\n {/* Processing status when no tool calls yet */}\n {hook.isProcessing && hook.toolCalls.length === 0 && renderProcessingStatus()}\n <textarea\n ref={hook.inputRef}\n className=\"devic-gen-input\"\n placeholder={mergedOptions.placeholder}\n value={hook.inputValue}\n onChange={(e) => hook.setInputValue(e.target.value)}\n onKeyDown={hook.handleKeyDown}\n rows={4}\n disabled={hook.isProcessing}\n />\n {hook.error && (\n <div className=\"devic-gen-error\">{hook.error.message}</div>\n )}\n </div>\n <div className=\"devic-gen-modal-footer\">\n <button\n type=\"button\"\n className=\"devic-gen-modal-cancel\"\n onClick={hook.close}\n disabled={hook.isProcessing}\n >\n {mergedOptions.cancelText}\n </button>\n <button\n type=\"button\"\n className=\"devic-gen-modal-confirm\"\n onClick={handleConfirm}\n disabled={hook.isProcessing || !hook.inputValue.trim()}\n >\n {hook.isProcessing ? (\n <>\n <span className=\"devic-gen-spinner devic-gen-spinner-small\" />\n {mergedOptions.loadingLabel}\n </>\n ) : (\n mergedOptions.confirmText\n )}\n </button>\n </div>\n </div>\n </div>\n )}\n </div>\n );\n }\n);\n\n/**\n * Default sparkles icon\n */\nfunction SparklesIcon(): JSX.Element {\n return (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M10 2L11.5 8.5L18 10L11.5 11.5L10 18L8.5 11.5L2 10L8.5 8.5L10 2Z\"\n fill=\"currentColor\"\n opacity=\"0.9\"\n />\n <path\n d=\"M16 3L16.5 5L18.5 5.5L16.5 6L16 8L15.5 6L13.5 5.5L15.5 5L16 3Z\"\n fill=\"currentColor\"\n opacity=\"0.6\"\n />\n <circle cx=\"4\" cy=\"15\" r=\"1\" fill=\"currentColor\" opacity=\"0.4\" />\n </svg>\n );\n}\n\n/**\n * Close icon\n */\nfunction CloseIcon(): JSX.Element {\n return (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n );\n}\n\n/**\n * Check icon for completed tool calls\n */\nfunction CheckIcon(): JSX.Element {\n return (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n );\n}\n"],"names":["forwardRef","useMemo","useAIGenerationButton","useImperativeHandle","useRef","useEffect","useCallback","_jsxs","_Fragment","_jsx","segmentToolCalls"],"mappings":"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"}
|