@devicai/ui 0.10.3 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (30) hide show
  1. package/dist/cjs/api/client.js +48 -3
  2. package/dist/cjs/api/client.js.map +1 -1
  3. package/dist/cjs/components/ChatDrawer/ChatDrawer.js +47 -5
  4. package/dist/cjs/components/ChatDrawer/ChatDrawer.js.map +1 -1
  5. package/dist/cjs/components/ChatDrawer/ChatInput.js +2 -24
  6. package/dist/cjs/components/ChatDrawer/ChatInput.js.map +1 -1
  7. package/dist/cjs/components/ChatDrawer/ConversationSelector.js +33 -7
  8. package/dist/cjs/components/ChatDrawer/ConversationSelector.js.map +1 -1
  9. package/dist/cjs/components/ThreadStateTag/ThreadStateTag.js +1 -1
  10. package/dist/cjs/components/ThreadStateTag/ThreadStateTag.js.map +1 -1
  11. package/dist/cjs/hooks/useDevicChat.js +39 -5
  12. package/dist/cjs/hooks/useDevicChat.js.map +1 -1
  13. package/dist/cjs/styles.css +1 -1
  14. package/dist/esm/api/client.d.ts +12 -2
  15. package/dist/esm/api/client.js +48 -3
  16. package/dist/esm/api/client.js.map +1 -1
  17. package/dist/esm/components/ChatDrawer/ChatDrawer.js +48 -6
  18. package/dist/esm/components/ChatDrawer/ChatDrawer.js.map +1 -1
  19. package/dist/esm/components/ChatDrawer/ChatDrawer.types.d.ts +14 -1
  20. package/dist/esm/components/ChatDrawer/ChatInput.js +2 -24
  21. package/dist/esm/components/ChatDrawer/ChatInput.js.map +1 -1
  22. package/dist/esm/components/ChatDrawer/ConversationSelector.js +33 -7
  23. package/dist/esm/components/ChatDrawer/ConversationSelector.js.map +1 -1
  24. package/dist/esm/components/ThreadStateTag/ThreadStateTag.js +1 -1
  25. package/dist/esm/components/ThreadStateTag/ThreadStateTag.js.map +1 -1
  26. package/dist/esm/hooks/useDevicChat.d.ts +7 -1
  27. package/dist/esm/hooks/useDevicChat.js +39 -5
  28. package/dist/esm/hooks/useDevicChat.js.map +1 -1
  29. package/dist/esm/styles.css +1 -1
  30. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"ThreadStateTag.js","sources":["../../../../src/components/ThreadStateTag/ThreadStateTag.tsx"],"sourcesContent":["import React, { useState, useRef, useEffect, useCallback } from 'react';\nimport { createPortal } from 'react-dom';\nimport { useOptionalDevicContext } from '../../provider';\nimport { DevicApiClient } from '../../api/client';\nimport { AgentThreadState } from '../../api/types';\nimport type { ThreadStateTagProps, StateConfig } from './ThreadStateTag.types';\nimport './ThreadStateTag.css';\n\n/* ── State configuration map ── */\n\nfunction getStateConfig(state: string, subthreadCount?: number): StateConfig {\n const configs: Record<string, StateConfig> = {\n [AgentThreadState.QUEUED]: {\n color: 'gold', bgColor: '#fffbe6', borderColor: '#ffe58f',\n text: 'Queued', iconType: null,\n },\n [AgentThreadState.PROCESSING]: {\n color: 'processing', bgColor: '#e6f4ff', borderColor: '#91caff',\n text: 'Processing', iconType: 'spinner',\n },\n [AgentThreadState.COMPLETED]: {\n color: 'success', bgColor: '#f6ffed', borderColor: '#b7eb8f',\n text: 'Completed', iconType: null,\n },\n [AgentThreadState.FAILED]: {\n color: 'error', bgColor: '#fff2f0', borderColor: '#ffa39e',\n text: 'Failed', iconType: null,\n },\n [AgentThreadState.TERMINATED]: {\n color: 'default', bgColor: '#fafafa', borderColor: '#d9d9d9',\n text: 'Terminated', iconType: null,\n },\n [AgentThreadState.GUARDRAIL_TRIGGER]: {\n color: 'error', bgColor: '#fff2f0', borderColor: '#ffa39e',\n text: 'Guardrail Triggered', iconType: 'shield',\n },\n [AgentThreadState.PAUSED]: {\n color: 'purple', bgColor: '#f9f0ff', borderColor: '#d3adf7',\n text: 'Paused', iconType: 'pause',\n },\n [AgentThreadState.PAUSED_FOR_APPROVAL]: {\n color: 'gold', bgColor: '#fffbe6', borderColor: '#ffe58f',\n text: 'Waiting for approval', iconType: 'warning',\n },\n [AgentThreadState.APPROVAL_REJECTED]: {\n color: 'error', bgColor: '#fff2f0', borderColor: '#ffa39e',\n text: 'Approval rejected', iconType: null,\n },\n [AgentThreadState.WAITING_FOR_RESPONSE]: {\n color: 'gold', bgColor: '#fffbe6', borderColor: '#ffe58f',\n text: 'Waiting for response', iconType: 'envelope',\n },\n [AgentThreadState.PAUSED_FOR_RESUME]: {\n color: 'blue', bgColor: '#e6f4ff', borderColor: '#91caff',\n text: 'Resume scheduled', iconType: 'clock',\n },\n [AgentThreadState.HANDED_OFF]: {\n color: 'blue', bgColor: '#e6f4ff', borderColor: '#91caff',\n text: subthreadCount && subthreadCount > 1 ? `Handed off (${subthreadCount})` : 'Handed off',\n iconType: 'handoff',\n },\n };\n\n return configs[state] || { color: 'default', bgColor: '#fafafa', borderColor: '#d9d9d9', text: 'Unknown', iconType: null };\n}\n\n/* ── SVG Icons ── */\n\nfunction SpinnerIcon(): JSX.Element {\n return (\n <svg className=\"devic-state-spinner\" width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\">\n <path d=\"M12 2v4M12 18v4M4.93 4.93l2.83 2.83M16.24 16.24l2.83 2.83M2 12h4M18 12h4M4.93 19.07l2.83-2.83M16.24 7.76l2.83-2.83\" />\n </svg>\n );\n}\n\nfunction PauseIcon(): JSX.Element {\n return (\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <rect x=\"6\" y=\"4\" width=\"4\" height=\"16\" rx=\"1\" />\n <rect x=\"14\" y=\"4\" width=\"4\" height=\"16\" rx=\"1\" />\n </svg>\n );\n}\n\nfunction PlayIcon(): JSX.Element {\n return (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M8 5v14l11-7z\" />\n </svg>\n );\n}\n\nfunction WarningIcon(): JSX.Element {\n return (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M1 21h22L12 2 1 21zm12-3h-2v-2h2v2zm0-4h-2v-4h2v4z\" />\n </svg>\n );\n}\n\nfunction EnvelopeIcon(): JSX.Element {\n return (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <rect x=\"2\" y=\"4\" width=\"20\" height=\"16\" rx=\"2\" />\n <path d=\"M22 7l-10 7L2 7\" />\n </svg>\n );\n}\n\nfunction ClockIcon(): JSX.Element {\n return (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <polyline points=\"12,6 12,12 16,14\" />\n </svg>\n );\n}\n\nfunction ShieldIcon(): JSX.Element {\n return (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z\" />\n <line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\" />\n <line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\" />\n </svg>\n );\n}\n\nfunction HandoffIcon(): JSX.Element {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M12 2a2 2 0 1 1 0 4 2 2 0 0 1 0-4zm-1 6h2a3 3 0 0 1 3 3v3h-2v-3a1 1 0 0 0-1-1h-2a1 1 0 0 0-1 1v3H8v-3a3 3 0 0 1 3-3z\" />\n <path d=\"M16 16l4-2-4-2v4z\" opacity=\"0.8\" />\n </svg>\n );\n}\n\nfunction CaretDownIcon(): JSX.Element {\n return (\n <svg width=\"12\" height=\"12\" viewBox=\"5 8 14 9\" fill=\"currentColor\">\n <path d=\"M7 10l5 5 5-5z\" />\n </svg>\n );\n}\n\nfunction WrenchIcon(): JSX.Element {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.77-3.77a6 6 0 0 1-7.94 7.94l-6.91 6.91a2.12 2.12 0 0 1-3-3l6.91-6.91a6 6 0 0 1 7.94-7.94l-3.76 3.76z\" />\n </svg>\n );\n}\n\nfunction EyeIcon(): JSX.Element {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z\" />\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\n </svg>\n );\n}\n\nfunction LightbulbIcon(): JSX.Element {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"#FFC000\" stroke=\"#FFC000\" strokeWidth=\"1\">\n <path d=\"M9 21h6M12 3a6 6 0 0 0-4 10.5V17h8v-3.5A6 6 0 0 0 12 3z\" fill=\"#FFC000\" stroke=\"none\" />\n </svg>\n );\n}\n\nfunction RobotIcon(): JSX.Element {\n return (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <rect x=\"4\" y=\"8\" width=\"16\" height=\"12\" rx=\"2\" />\n <circle cx=\"9\" cy=\"14\" r=\"2\" fill=\"#fff\" />\n <circle cx=\"15\" cy=\"14\" r=\"2\" fill=\"#fff\" />\n <line x1=\"12\" y1=\"2\" x2=\"12\" y2=\"8\" stroke=\"currentColor\" strokeWidth=\"2\" />\n <circle cx=\"12\" cy=\"2\" r=\"1.5\" />\n </svg>\n );\n}\n\nfunction UserIcon(): JSX.Element {\n return (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M12 12c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm0 2c-2.67 0-8 1.34-8 4v2h16v-2c0-2.66-5.33-4-8-4z\" />\n </svg>\n );\n}\n\nfunction CloseIcon(): JSX.Element {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\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\nfunction InfoIcon(): JSX.Element {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-6h2v6zm0-8h-2V7h2v2z\" />\n </svg>\n );\n}\n\n/* ── Helper: render icon by type ── */\n\nfunction StateIcon({ iconType }: { iconType: string | null }): JSX.Element | null {\n switch (iconType) {\n case 'spinner': return <SpinnerIcon />;\n case 'pause': return <PauseIcon />;\n case 'warning': return <WarningIcon />;\n case 'envelope': return <EnvelopeIcon />;\n case 'clock': return <ClockIcon />;\n case 'shield': return <ShieldIcon />;\n case 'handoff': return <HandoffIcon />;\n default: return null;\n }\n}\n\n/* ── Modal component ── */\n\nfunction Modal({\n open,\n onClose,\n title,\n titleIcon,\n children,\n footer,\n}: {\n open: boolean;\n onClose: () => void;\n title: string;\n titleIcon?: React.ReactNode;\n children: React.ReactNode;\n footer?: React.ReactNode;\n}): JSX.Element | null {\n if (!open) return null;\n\n return (\n <div className=\"devic-state-modal-overlay\" onClick={onClose}>\n <div className=\"devic-state-modal\" onClick={(e) => e.stopPropagation()}>\n <div className=\"devic-state-modal-header\">\n <h3 className=\"devic-state-modal-title\">\n {titleIcon}\n {title}\n </h3>\n <button className=\"devic-state-modal-close\" onClick={onClose} type=\"button\">\n <CloseIcon />\n </button>\n </div>\n <div className=\"devic-state-modal-body\">\n {children}\n </div>\n {footer && (\n <div className=\"devic-state-modal-footer\">\n {footer}\n </div>\n )}\n </div>\n </div>\n );\n}\n\n/* ── Explain Modal with typing effect ── */\n\nfunction ExplainModal({\n open,\n onClose,\n explanation,\n isLoading,\n agentName,\n}: {\n open: boolean;\n onClose: () => void;\n explanation: string | null;\n isLoading: boolean;\n agentName: string;\n}): JSX.Element | null {\n const [displayedText, setDisplayedText] = useState('');\n const [fullTextDisplayed, setFullTextDisplayed] = useState(false);\n const charIndexRef = useRef(0);\n\n useEffect(() => {\n if (!explanation || isLoading) {\n setDisplayedText('');\n charIndexRef.current = 0;\n setFullTextDisplayed(false);\n return;\n }\n\n if (charIndexRef.current < explanation.length) {\n const timer = setTimeout(() => {\n charIndexRef.current++;\n setDisplayedText(explanation.slice(0, charIndexRef.current));\n if (charIndexRef.current >= explanation.length) {\n setFullTextDisplayed(true);\n }\n }, 20);\n return () => clearTimeout(timer);\n }\n }, [explanation, isLoading, displayedText]);\n\n const handleClose = () => {\n setDisplayedText('');\n charIndexRef.current = 0;\n setFullTextDisplayed(false);\n onClose();\n };\n\n return (\n <Modal\n open={open}\n onClose={handleClose}\n title={`Thread execution description of \"${agentName}\"`}\n titleIcon={<LightbulbIcon />}\n >\n {isLoading ? (\n <div className=\"devic-state-loading\">\n <div className=\"devic-state-loading-spinner\" />\n </div>\n ) : (\n <div className=\"devic-explain-content\">\n {displayedText}\n {!fullTextDisplayed && <span className=\"devic-typing-cursor\">|</span>}\n </div>\n )}\n </Modal>\n );\n}\n\n/* ── Approval Modal ── */\n\nfunction ApprovalModal({\n open,\n onClose,\n onApprove,\n isLoading,\n pausedReason,\n}: {\n open: boolean;\n onClose: () => void;\n onApprove: (action: 'approved' | 'rejected', retry: boolean, message?: string) => void;\n isLoading: boolean;\n pausedReason?: string;\n}): JSX.Element | null {\n const [feedback, setFeedback] = useState('');\n\n const handleClose = () => {\n setFeedback('');\n onClose();\n };\n\n return (\n <Modal\n open={open}\n onClose={handleClose}\n title=\"Review Agent Request\"\n titleIcon={<EyeIcon />}\n >\n <div className=\"devic-approval-layout\">\n <div className=\"devic-approval-request\">\n <div style={{ fontWeight: 600, marginBottom: 8, fontSize: 13 }}>Agent's request:</div>\n <div style={{ whiteSpace: 'pre-wrap' }}>{pausedReason || 'Agent is waiting for approval to resume execution.'}</div>\n </div>\n <div className=\"devic-approval-actions\">\n <div style={{ fontWeight: 600, fontSize: 13 }}>Your feedback:</div>\n <textarea\n className=\"devic-approval-textarea\"\n value={feedback}\n onChange={(e) => setFeedback(e.target.value)}\n placeholder=\"Optional feedback for the agent...\"\n />\n <div className=\"devic-approval-buttons\">\n <button\n className=\"devic-state-btn devic-state-btn-danger\"\n onClick={() => onApprove('rejected', false, feedback)}\n disabled={isLoading}\n type=\"button\"\n >\n Reject and finish\n </button>\n <button\n className=\"devic-state-btn devic-state-btn-primary\"\n onClick={() => onApprove('rejected', true, feedback)}\n disabled={isLoading || !feedback.trim()}\n type=\"button\"\n >\n Continue with feedback\n </button>\n <button\n className=\"devic-state-btn devic-state-btn-success\"\n onClick={() => onApprove('approved', false)}\n disabled={isLoading}\n type=\"button\"\n >\n Approve\n </button>\n </div>\n </div>\n </div>\n </Modal>\n );\n}\n\n/* ── Complete Thread Modal ── */\n\nfunction CompleteModal({\n open,\n onClose,\n onComplete,\n}: {\n open: boolean;\n onClose: () => void;\n onComplete: (state: string) => void;\n}): JSX.Element | null {\n const [completionState, setCompletionState] = useState('terminated');\n\n return (\n <Modal\n open={open}\n onClose={onClose}\n title=\"Complete Execution Manually\"\n titleIcon={<WrenchIcon />}\n footer={\n <>\n <button className=\"devic-state-btn\" onClick={onClose} type=\"button\">Cancel</button>\n <button className=\"devic-state-btn devic-state-btn-danger\" onClick={() => onComplete(completionState)} type=\"button\">\n Complete\n </button>\n </>\n }\n >\n <div style={{ marginBottom: 12 }}>\n <div style={{ fontWeight: 600, marginBottom: 4 }}>Confirm Manual Completion</div>\n <p style={{ margin: '4px 0 12px', color: '#666', fontSize: 13 }}>\n You are about to manually complete this agent's execution.\n </p>\n <div style={{ marginBottom: 12 }}>\n <div style={{ fontWeight: 500, marginBottom: 6, fontSize: 13 }}>Complete as:</div>\n <select\n className=\"devic-completion-select\"\n value={completionState}\n onChange={(e) => setCompletionState(e.target.value)}\n >\n <option value=\"terminated\">Terminated - Finish thread as manually terminated</option>\n <option value=\"completed\">Completed - Finish thread as successfully completed</option>\n <option value=\"failed\">Failed - Finish thread as failed or with errors</option>\n </select>\n </div>\n <div className=\"devic-state-warning\">\n <InfoIcon />\n <span>This action will immediately terminate all ongoing processes. The execution cannot be resumed after completion.</span>\n </div>\n </div>\n </Modal>\n );\n}\n\n/* ── Confirm Modal (Pause/Resume) ── */\n\nfunction ConfirmModal({\n open,\n onClose,\n onConfirm,\n title,\n icon,\n message,\n confirmText,\n}: {\n open: boolean;\n onClose: () => void;\n onConfirm: () => void;\n title: string;\n icon: React.ReactNode;\n message: string;\n confirmText: string;\n}): JSX.Element | null {\n return (\n <Modal\n open={open}\n onClose={onClose}\n title={title}\n titleIcon={icon}\n footer={\n <>\n <button className=\"devic-state-btn\" onClick={onClose} type=\"button\">Cancel</button>\n <button className=\"devic-state-btn devic-state-btn-primary\" onClick={onConfirm} type=\"button\">\n {confirmText}\n </button>\n </>\n }\n >\n <p style={{ margin: 0, color: '#666', fontSize: 14 }}>{message}</p>\n </Modal>\n );\n}\n\n/* ── Main ThreadStateTag ── */\n\nexport function ThreadStateTag({\n state,\n threadId,\n agentName,\n showIcon = true,\n customIcon,\n pausedReason,\n approvalRejectedMessage,\n finishReason,\n onActionComplete,\n pauseUntil,\n subthreadCount,\n showAdminActions = false,\n apiKey,\n baseUrl,\n interactive = true,\n}: ThreadStateTagProps): JSX.Element {\n const context = useOptionalDevicContext();\n const resolvedApiKey = apiKey || context?.apiKey;\n const resolvedBaseUrl = baseUrl || context?.baseUrl || 'https://api.devic.ai';\n\n // State\n const [dropdownOpen, setDropdownOpen] = useState(false);\n const [showTooltip, setShowTooltip] = useState(false);\n const [explainModalOpen, setExplainModalOpen] = useState(false);\n const [threadExplanation, setThreadExplanation] = useState<string | null>(null);\n const [isLoadingExplanation, setIsLoadingExplanation] = useState(false);\n const [pauseModalOpen, setPauseModalOpen] = useState(false);\n const [resumeModalOpen, setResumeModalOpen] = useState(false);\n const [reviewModalOpen, setReviewModalOpen] = useState(false);\n const [isLoadingApproval, setIsLoadingApproval] = useState(false);\n const [completeModalOpen, setCompleteModalOpen] = useState(false);\n\n const tagRef = useRef<HTMLDivElement>(null);\n const dropdownRef = useRef<HTMLDivElement>(null);\n const [tooltipStyle, setTooltipStyle] = useState<React.CSSProperties>({});\n const [dropdownStyle, setDropdownStyle] = useState<React.CSSProperties>({});\n\n // Close dropdown on click outside\n useEffect(() => {\n if (!dropdownOpen) return;\n const handleClick = (e: MouseEvent) => {\n const target = e.target as Node;\n if (\n tagRef.current && !tagRef.current.contains(target) &&\n (!dropdownRef.current || !dropdownRef.current.contains(target))\n ) {\n setDropdownOpen(false);\n }\n };\n document.addEventListener('mousedown', handleClick);\n return () => document.removeEventListener('mousedown', handleClick);\n }, [dropdownOpen]);\n\n // API client\n const getClient = useCallback((): DevicApiClient | null => {\n if (!resolvedApiKey) return null;\n return new DevicApiClient({ apiKey: resolvedApiKey, baseUrl: resolvedBaseUrl });\n }, [resolvedApiKey, resolvedBaseUrl]);\n\n // Config\n const config = getStateConfig(state, subthreadCount);\n\n if (!state) {\n return <span className=\"devic-state-tag\" data-color=\"default\">Unknown</span>;\n }\n\n // Icon\n const renderIcon = () => {\n if (!showIcon) return null;\n if (customIcon) return <span className=\"devic-state-tag-icon\">{customIcon}</span>;\n const icon = <StateIcon iconType={config.iconType} />;\n return icon ? <span className=\"devic-state-tag-icon\">{icon}</span> : null;\n };\n\n // Tooltip content\n const getTooltipContent = (): string | null => {\n switch (state) {\n case AgentThreadState.PAUSED_FOR_APPROVAL:\n return 'Agent is waiting for approval to resume execution';\n case AgentThreadState.PAUSED_FOR_RESUME:\n if (pauseUntil) {\n const timeDiff = new Date(pauseUntil).getTime() - Date.now();\n const hours = Math.floor(timeDiff / 3600000);\n const minutes = Math.floor(timeDiff / 60000);\n const timeStr = hours > 0 ? `${hours} hours` : `${minutes} minutes`;\n return `Agent paused, will resume at ${new Date(pauseUntil).toLocaleString()} (${timeStr})`;\n }\n return 'Agent paused, will resume at a scheduled time';\n case AgentThreadState.WAITING_FOR_RESPONSE:\n return pausedReason || 'Agent is waiting for response';\n case AgentThreadState.COMPLETED:\n case AgentThreadState.FAILED:\n case AgentThreadState.TERMINATED:\n return finishReason || 'Manually finished thread';\n case AgentThreadState.APPROVAL_REJECTED:\n return approvalRejectedMessage || 'Approval was rejected';\n case AgentThreadState.GUARDRAIL_TRIGGER:\n return 'Agent execution paused due to guardrail trigger';\n default:\n return null;\n }\n };\n\n // Handlers\n const handleExplain = async () => {\n setDropdownOpen(false);\n setExplainModalOpen(true);\n setIsLoadingExplanation(true);\n setThreadExplanation(null);\n\n const client = getClient();\n if (!client) {\n setThreadExplanation('API key not configured.');\n setIsLoadingExplanation(false);\n return;\n }\n\n try {\n const explanation = await client.explainAgentThread(threadId);\n setThreadExplanation(explanation);\n } catch {\n setThreadExplanation('Could not obtain the thread explanation.');\n } finally {\n setIsLoadingExplanation(false);\n }\n };\n\n const handlePause = async () => {\n const client = getClient();\n if (!client) return;\n try {\n await client.pauseResumeThread(threadId, 'paused');\n setPauseModalOpen(false);\n onActionComplete?.();\n } catch (err) {\n console.error('Error pausing thread:', err);\n }\n };\n\n const handleResume = async () => {\n const client = getClient();\n if (!client) return;\n try {\n await client.pauseResumeThread(threadId, 'queued');\n setResumeModalOpen(false);\n onActionComplete?.();\n } catch (err) {\n console.error('Error resuming thread:', err);\n }\n };\n\n const handleApproval = async (action: 'approved' | 'rejected', retry: boolean, message?: string) => {\n const client = getClient();\n if (!client) return;\n setIsLoadingApproval(true);\n try {\n await client.handleThreadApproval(threadId, action === 'approved', retry, message || '');\n setReviewModalOpen(false);\n onActionComplete?.();\n } catch (err) {\n console.error('Error handling thread approval:', err);\n } finally {\n setIsLoadingApproval(false);\n }\n };\n\n const handleComplete = async (completionState: string) => {\n const client = getClient();\n if (!client) return;\n try {\n await client.completeThread(threadId, completionState);\n setCompleteModalOpen(false);\n onActionComplete?.();\n } catch (err) {\n console.error('Error completing thread:', err);\n }\n };\n\n // Build dropdown items\n const dropdownItems: Array<{ key: string; icon: React.ReactNode; label: string; onClick: () => void }> = [];\n\n if (showAdminActions && [AgentThreadState.PROCESSING, AgentThreadState.QUEUED, AgentThreadState.WAITING_FOR_RESPONSE].includes(state as AgentThreadState)) {\n dropdownItems.push({\n key: 'complete',\n icon: <WrenchIcon />,\n label: 'Complete manually',\n onClick: () => { setDropdownOpen(false); setCompleteModalOpen(true); },\n });\n }\n\n if (state === AgentThreadState.QUEUED) {\n dropdownItems.push({\n key: 'pause',\n icon: <PauseIcon />,\n label: 'Pause',\n onClick: () => { setDropdownOpen(false); setPauseModalOpen(true); },\n });\n }\n\n if (state === AgentThreadState.PAUSED || state === AgentThreadState.PAUSED_FOR_RESUME) {\n dropdownItems.push({\n key: 'resume',\n icon: <PlayIcon />,\n label: 'Resume',\n onClick: () => { setDropdownOpen(false); setResumeModalOpen(true); },\n });\n }\n\n if (state === AgentThreadState.PAUSED_FOR_APPROVAL) {\n dropdownItems.push({\n key: 'review',\n icon: <EyeIcon />,\n label: 'Review',\n onClick: () => { setDropdownOpen(false); setReviewModalOpen(true); },\n });\n }\n\n dropdownItems.push({\n key: 'explain',\n icon: <LightbulbIcon />,\n label: 'Explain thread...',\n onClick: handleExplain,\n });\n\n const canInteract = interactive && threadId;\n const tooltipContent = getTooltipContent();\n\n return (\n <>\n <div\n ref={tagRef}\n className=\"devic-state-tag\"\n data-color={config.color}\n data-interactive={String(!!canInteract)}\n data-dropdown-open={String(dropdownOpen)}\n onClick={canInteract ? () => {\n if (!dropdownOpen) {\n const rect = tagRef.current?.getBoundingClientRect();\n if (rect) {\n setDropdownStyle({\n position: 'fixed',\n top: rect.bottom + 4,\n right: window.innerWidth - rect.right,\n });\n }\n }\n setDropdownOpen(!dropdownOpen);\n } : undefined}\n onMouseEnter={() => {\n if (!dropdownOpen && tooltipContent) {\n const rect = tagRef.current?.getBoundingClientRect();\n if (rect) {\n setTooltipStyle({\n position: 'fixed',\n top: rect.top - 8,\n left: rect.left + rect.width / 2,\n transform: 'translate(-50%, -100%)',\n });\n }\n setShowTooltip(true);\n }\n }}\n onMouseLeave={() => setShowTooltip(false)}\n >\n {renderIcon()}\n {config.text}\n {canInteract && (\n <span className=\"devic-state-tag-caret\">\n <CaretDownIcon />\n </span>\n )}\n\n </div>\n\n {/* Tooltip - portal to escape overflow/transform containers */}\n {showTooltip && tooltipContent && !dropdownOpen && createPortal(\n <div className=\"devic-state-tooltip-portal\" style={tooltipStyle}>{tooltipContent}</div>,\n document.body\n )}\n\n {/* Dropdown - portal to escape overflow/transform containers */}\n {dropdownOpen && canInteract && createPortal(\n <div ref={dropdownRef} className=\"devic-state-dropdown-portal\" style={dropdownStyle}>\n {dropdownItems.map((item) => (\n <button\n key={item.key}\n className=\"devic-state-dropdown-item\"\n onClick={(e) => { e.stopPropagation(); item.onClick(); }}\n type=\"button\"\n >\n <span className=\"devic-state-dropdown-item-icon\">{item.icon}</span>\n {item.label}\n </button>\n ))}\n </div>,\n document.body\n )}\n\n {/* Modals */}\n <ExplainModal\n open={explainModalOpen}\n onClose={() => setExplainModalOpen(false)}\n explanation={threadExplanation}\n isLoading={isLoadingExplanation}\n agentName={agentName}\n />\n\n <CompleteModal\n open={completeModalOpen}\n onClose={() => setCompleteModalOpen(false)}\n onComplete={handleComplete}\n />\n\n <ConfirmModal\n open={pauseModalOpen}\n onClose={() => setPauseModalOpen(false)}\n onConfirm={handlePause}\n title=\"Pause Thread\"\n icon={<PauseIcon />}\n message=\"You are about to pause this queued thread. It can be resumed later.\"\n confirmText=\"Pause\"\n />\n\n <ConfirmModal\n open={resumeModalOpen}\n onClose={() => setResumeModalOpen(false)}\n onConfirm={handleResume}\n title=\"Resume Thread\"\n icon={<PlayIcon />}\n message=\"You are about to resume this thread. It will go back to the queue and be processed when possible.\"\n confirmText=\"Resume\"\n />\n\n <ApprovalModal\n open={reviewModalOpen}\n onClose={() => setReviewModalOpen(false)}\n onApprove={handleApproval}\n isLoading={isLoadingApproval}\n pausedReason={pausedReason}\n />\n </>\n );\n}\n"],"names":["_jsx","_jsxs","_Fragment"],"mappings":"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"}
1
+ {"version":3,"file":"ThreadStateTag.js","sources":["../../../../src/components/ThreadStateTag/ThreadStateTag.tsx"],"sourcesContent":["import React, { useState, useRef, useEffect, useCallback } from 'react';\nimport { createPortal } from 'react-dom';\nimport { useOptionalDevicContext } from '../../provider';\nimport { DevicApiClient } from '../../api/client';\nimport { AgentThreadState } from '../../api/types';\nimport type { ThreadStateTagProps, StateConfig } from './ThreadStateTag.types';\nimport './ThreadStateTag.css';\n\n/* ── State configuration map ── */\n\nfunction getStateConfig(state: string, subthreadCount?: number): StateConfig {\n const configs: Record<string, StateConfig> = {\n [AgentThreadState.QUEUED]: {\n color: 'gold', bgColor: '#fffbe6', borderColor: '#ffe58f',\n text: 'Queued', iconType: null,\n },\n [AgentThreadState.PROCESSING]: {\n color: 'processing', bgColor: '#e6f4ff', borderColor: '#91caff',\n text: 'Processing', iconType: 'spinner',\n },\n [AgentThreadState.COMPLETED]: {\n color: 'success', bgColor: '#f6ffed', borderColor: '#b7eb8f',\n text: 'Completed', iconType: null,\n },\n [AgentThreadState.FAILED]: {\n color: 'error', bgColor: '#fff2f0', borderColor: '#ffa39e',\n text: 'Failed', iconType: null,\n },\n [AgentThreadState.TERMINATED]: {\n color: 'default', bgColor: '#fafafa', borderColor: '#d9d9d9',\n text: 'Terminated', iconType: null,\n },\n [AgentThreadState.GUARDRAIL_TRIGGER]: {\n color: 'error', bgColor: '#fff2f0', borderColor: '#ffa39e',\n text: 'Guardrail Triggered', iconType: 'shield',\n },\n [AgentThreadState.PAUSED]: {\n color: 'purple', bgColor: '#f9f0ff', borderColor: '#d3adf7',\n text: 'Paused', iconType: 'pause',\n },\n [AgentThreadState.PAUSED_FOR_APPROVAL]: {\n color: 'gold', bgColor: '#fffbe6', borderColor: '#ffe58f',\n text: 'Waiting for approval', iconType: 'warning',\n },\n [AgentThreadState.APPROVAL_REJECTED]: {\n color: 'error', bgColor: '#fff2f0', borderColor: '#ffa39e',\n text: 'Approval rejected', iconType: null,\n },\n [AgentThreadState.WAITING_FOR_RESPONSE]: {\n color: 'gold', bgColor: '#fffbe6', borderColor: '#ffe58f',\n text: 'Waiting for response', iconType: 'envelope',\n },\n [AgentThreadState.PAUSED_FOR_RESUME]: {\n color: 'blue', bgColor: '#e6f4ff', borderColor: '#91caff',\n text: 'Resume scheduled', iconType: 'clock',\n },\n [AgentThreadState.HANDED_OFF]: {\n color: 'blue', bgColor: '#e6f4ff', borderColor: '#91caff',\n text: subthreadCount && subthreadCount > 1 ? `Handed off (${subthreadCount})` : 'Handed off',\n iconType: 'handoff',\n },\n };\n\n return configs[state] || { color: 'default', bgColor: '#fafafa', borderColor: '#d9d9d9', text: 'Unknown', iconType: null };\n}\n\n/* ── SVG Icons ── */\n\nfunction SpinnerIcon(): JSX.Element {\n return (\n <svg className=\"devic-state-spinner\" width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\">\n <path d=\"M12 2v4M12 18v4M4.93 4.93l2.83 2.83M16.24 16.24l2.83 2.83M2 12h4M18 12h4M4.93 19.07l2.83-2.83M16.24 7.76l2.83-2.83\" />\n </svg>\n );\n}\n\nfunction PauseIcon(): JSX.Element {\n return (\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <rect x=\"6\" y=\"4\" width=\"4\" height=\"16\" rx=\"1\" />\n <rect x=\"14\" y=\"4\" width=\"4\" height=\"16\" rx=\"1\" />\n </svg>\n );\n}\n\nfunction PlayIcon(): JSX.Element {\n return (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M8 5v14l11-7z\" />\n </svg>\n );\n}\n\nfunction WarningIcon(): JSX.Element {\n return (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M1 21h22L12 2 1 21zm12-3h-2v-2h2v2zm0-4h-2v-4h2v4z\" />\n </svg>\n );\n}\n\nfunction EnvelopeIcon(): JSX.Element {\n return (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <rect x=\"2\" y=\"4\" width=\"20\" height=\"16\" rx=\"2\" />\n <path d=\"M22 7l-10 7L2 7\" />\n </svg>\n );\n}\n\nfunction ClockIcon(): JSX.Element {\n return (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <polyline points=\"12,6 12,12 16,14\" />\n </svg>\n );\n}\n\nfunction ShieldIcon(): JSX.Element {\n return (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z\" />\n <line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\" />\n <line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\" />\n </svg>\n );\n}\n\nfunction HandoffIcon(): JSX.Element {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M12 2a2 2 0 1 1 0 4 2 2 0 0 1 0-4zm-1 6h2a3 3 0 0 1 3 3v3h-2v-3a1 1 0 0 0-1-1h-2a1 1 0 0 0-1 1v3H8v-3a3 3 0 0 1 3-3z\" />\n <path d=\"M16 16l4-2-4-2v4z\" opacity=\"0.8\" />\n </svg>\n );\n}\n\nfunction CaretDownIcon(): JSX.Element {\n return (\n <svg width=\"12\" height=\"12\" viewBox=\"5 8 14 9\" fill=\"currentColor\">\n <path d=\"M7 10l5 5 5-5z\" />\n </svg>\n );\n}\n\nfunction WrenchIcon(): JSX.Element {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.77-3.77a6 6 0 0 1-7.94 7.94l-6.91 6.91a2.12 2.12 0 0 1-3-3l6.91-6.91a6 6 0 0 1 7.94-7.94l-3.76 3.76z\" />\n </svg>\n );\n}\n\nfunction EyeIcon(): JSX.Element {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z\" />\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\n </svg>\n );\n}\n\nfunction LightbulbIcon(): JSX.Element {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"#FFC000\" stroke=\"#FFC000\" strokeWidth=\"1\">\n <path d=\"M9 21h6M12 3a6 6 0 0 0-4 10.5V17h8v-3.5A6 6 0 0 0 12 3z\" fill=\"#FFC000\" stroke=\"none\" />\n </svg>\n );\n}\n\nfunction RobotIcon(): JSX.Element {\n return (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <rect x=\"4\" y=\"8\" width=\"16\" height=\"12\" rx=\"2\" />\n <circle cx=\"9\" cy=\"14\" r=\"2\" fill=\"#fff\" />\n <circle cx=\"15\" cy=\"14\" r=\"2\" fill=\"#fff\" />\n <line x1=\"12\" y1=\"2\" x2=\"12\" y2=\"8\" stroke=\"currentColor\" strokeWidth=\"2\" />\n <circle cx=\"12\" cy=\"2\" r=\"1.5\" />\n </svg>\n );\n}\n\nfunction UserIcon(): JSX.Element {\n return (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M12 12c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm0 2c-2.67 0-8 1.34-8 4v2h16v-2c0-2.66-5.33-4-8-4z\" />\n </svg>\n );\n}\n\nfunction CloseIcon(): JSX.Element {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\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\nfunction InfoIcon(): JSX.Element {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-6h2v6zm0-8h-2V7h2v2z\" />\n </svg>\n );\n}\n\n/* ── Helper: render icon by type ── */\n\nfunction StateIcon({ iconType }: { iconType: string | null }): JSX.Element | null {\n switch (iconType) {\n case 'spinner': return <SpinnerIcon />;\n case 'pause': return <PauseIcon />;\n case 'warning': return <WarningIcon />;\n case 'envelope': return <EnvelopeIcon />;\n case 'clock': return <ClockIcon />;\n case 'shield': return <ShieldIcon />;\n case 'handoff': return <HandoffIcon />;\n default: return null;\n }\n}\n\n/* ── Modal component ── */\n\nfunction Modal({\n open,\n onClose,\n title,\n titleIcon,\n children,\n footer,\n}: {\n open: boolean;\n onClose: () => void;\n title: string;\n titleIcon?: React.ReactNode;\n children: React.ReactNode;\n footer?: React.ReactNode;\n}): JSX.Element | null {\n if (!open) return null;\n\n return createPortal(\n <div className=\"devic-state-modal-overlay\" onClick={onClose}>\n <div className=\"devic-state-modal\" onClick={(e) => e.stopPropagation()}>\n <div className=\"devic-state-modal-header\">\n <h3 className=\"devic-state-modal-title\">\n {titleIcon}\n {title}\n </h3>\n <button className=\"devic-state-modal-close\" onClick={onClose} type=\"button\">\n <CloseIcon />\n </button>\n </div>\n <div className=\"devic-state-modal-body\">\n {children}\n </div>\n {footer && (\n <div className=\"devic-state-modal-footer\">\n {footer}\n </div>\n )}\n </div>\n </div>,\n document.body\n );\n}\n\n/* ── Explain Modal with typing effect ── */\n\nfunction ExplainModal({\n open,\n onClose,\n explanation,\n isLoading,\n agentName,\n}: {\n open: boolean;\n onClose: () => void;\n explanation: string | null;\n isLoading: boolean;\n agentName: string;\n}): JSX.Element | null {\n const [displayedText, setDisplayedText] = useState('');\n const [fullTextDisplayed, setFullTextDisplayed] = useState(false);\n const charIndexRef = useRef(0);\n\n useEffect(() => {\n if (!explanation || isLoading) {\n setDisplayedText('');\n charIndexRef.current = 0;\n setFullTextDisplayed(false);\n return;\n }\n\n if (charIndexRef.current < explanation.length) {\n const timer = setTimeout(() => {\n charIndexRef.current++;\n setDisplayedText(explanation.slice(0, charIndexRef.current));\n if (charIndexRef.current >= explanation.length) {\n setFullTextDisplayed(true);\n }\n }, 20);\n return () => clearTimeout(timer);\n }\n }, [explanation, isLoading, displayedText]);\n\n const handleClose = () => {\n setDisplayedText('');\n charIndexRef.current = 0;\n setFullTextDisplayed(false);\n onClose();\n };\n\n return (\n <Modal\n open={open}\n onClose={handleClose}\n title={`Thread execution description of \"${agentName}\"`}\n titleIcon={<LightbulbIcon />}\n >\n {isLoading ? (\n <div className=\"devic-state-loading\">\n <div className=\"devic-state-loading-spinner\" />\n </div>\n ) : (\n <div className=\"devic-explain-content\">\n {displayedText}\n {!fullTextDisplayed && <span className=\"devic-typing-cursor\">|</span>}\n </div>\n )}\n </Modal>\n );\n}\n\n/* ── Approval Modal ── */\n\nfunction ApprovalModal({\n open,\n onClose,\n onApprove,\n isLoading,\n pausedReason,\n}: {\n open: boolean;\n onClose: () => void;\n onApprove: (action: 'approved' | 'rejected', retry: boolean, message?: string) => void;\n isLoading: boolean;\n pausedReason?: string;\n}): JSX.Element | null {\n const [feedback, setFeedback] = useState('');\n\n const handleClose = () => {\n setFeedback('');\n onClose();\n };\n\n return (\n <Modal\n open={open}\n onClose={handleClose}\n title=\"Review Agent Request\"\n titleIcon={<EyeIcon />}\n >\n <div className=\"devic-approval-layout\">\n <div className=\"devic-approval-request\">\n <div style={{ fontWeight: 600, marginBottom: 8, fontSize: 13 }}>Agent's request:</div>\n <div style={{ whiteSpace: 'pre-wrap' }}>{pausedReason || 'Agent is waiting for approval to resume execution.'}</div>\n </div>\n <div className=\"devic-approval-actions\">\n <div style={{ fontWeight: 600, fontSize: 13 }}>Your feedback:</div>\n <textarea\n className=\"devic-approval-textarea\"\n value={feedback}\n onChange={(e) => setFeedback(e.target.value)}\n placeholder=\"Optional feedback for the agent...\"\n />\n <div className=\"devic-approval-buttons\">\n <button\n className=\"devic-state-btn devic-state-btn-danger\"\n onClick={() => onApprove('rejected', false, feedback)}\n disabled={isLoading}\n type=\"button\"\n >\n Reject and finish\n </button>\n <button\n className=\"devic-state-btn devic-state-btn-primary\"\n onClick={() => onApprove('rejected', true, feedback)}\n disabled={isLoading || !feedback.trim()}\n type=\"button\"\n >\n Continue with feedback\n </button>\n <button\n className=\"devic-state-btn devic-state-btn-success\"\n onClick={() => onApprove('approved', false)}\n disabled={isLoading}\n type=\"button\"\n >\n Approve\n </button>\n </div>\n </div>\n </div>\n </Modal>\n );\n}\n\n/* ── Complete Thread Modal ── */\n\nfunction CompleteModal({\n open,\n onClose,\n onComplete,\n}: {\n open: boolean;\n onClose: () => void;\n onComplete: (state: string) => void;\n}): JSX.Element | null {\n const [completionState, setCompletionState] = useState('terminated');\n\n return (\n <Modal\n open={open}\n onClose={onClose}\n title=\"Complete Execution Manually\"\n titleIcon={<WrenchIcon />}\n footer={\n <>\n <button className=\"devic-state-btn\" onClick={onClose} type=\"button\">Cancel</button>\n <button className=\"devic-state-btn devic-state-btn-danger\" onClick={() => onComplete(completionState)} type=\"button\">\n Complete\n </button>\n </>\n }\n >\n <div style={{ marginBottom: 12 }}>\n <div style={{ fontWeight: 600, marginBottom: 4 }}>Confirm Manual Completion</div>\n <p style={{ margin: '4px 0 12px', color: '#666', fontSize: 13 }}>\n You are about to manually complete this agent's execution.\n </p>\n <div style={{ marginBottom: 12 }}>\n <div style={{ fontWeight: 500, marginBottom: 6, fontSize: 13 }}>Complete as:</div>\n <select\n className=\"devic-completion-select\"\n value={completionState}\n onChange={(e) => setCompletionState(e.target.value)}\n >\n <option value=\"terminated\">Terminated - Finish thread as manually terminated</option>\n <option value=\"completed\">Completed - Finish thread as successfully completed</option>\n <option value=\"failed\">Failed - Finish thread as failed or with errors</option>\n </select>\n </div>\n <div className=\"devic-state-warning\">\n <InfoIcon />\n <span>This action will immediately terminate all ongoing processes. The execution cannot be resumed after completion.</span>\n </div>\n </div>\n </Modal>\n );\n}\n\n/* ── Confirm Modal (Pause/Resume) ── */\n\nfunction ConfirmModal({\n open,\n onClose,\n onConfirm,\n title,\n icon,\n message,\n confirmText,\n}: {\n open: boolean;\n onClose: () => void;\n onConfirm: () => void;\n title: string;\n icon: React.ReactNode;\n message: string;\n confirmText: string;\n}): JSX.Element | null {\n return (\n <Modal\n open={open}\n onClose={onClose}\n title={title}\n titleIcon={icon}\n footer={\n <>\n <button className=\"devic-state-btn\" onClick={onClose} type=\"button\">Cancel</button>\n <button className=\"devic-state-btn devic-state-btn-primary\" onClick={onConfirm} type=\"button\">\n {confirmText}\n </button>\n </>\n }\n >\n <p style={{ margin: 0, color: '#666', fontSize: 14 }}>{message}</p>\n </Modal>\n );\n}\n\n/* ── Main ThreadStateTag ── */\n\nexport function ThreadStateTag({\n state,\n threadId,\n agentName,\n showIcon = true,\n customIcon,\n pausedReason,\n approvalRejectedMessage,\n finishReason,\n onActionComplete,\n pauseUntil,\n subthreadCount,\n showAdminActions = false,\n apiKey,\n baseUrl,\n interactive = true,\n}: ThreadStateTagProps): JSX.Element {\n const context = useOptionalDevicContext();\n const resolvedApiKey = apiKey || context?.apiKey;\n const resolvedBaseUrl = baseUrl || context?.baseUrl || 'https://api.devic.ai';\n\n // State\n const [dropdownOpen, setDropdownOpen] = useState(false);\n const [showTooltip, setShowTooltip] = useState(false);\n const [explainModalOpen, setExplainModalOpen] = useState(false);\n const [threadExplanation, setThreadExplanation] = useState<string | null>(null);\n const [isLoadingExplanation, setIsLoadingExplanation] = useState(false);\n const [pauseModalOpen, setPauseModalOpen] = useState(false);\n const [resumeModalOpen, setResumeModalOpen] = useState(false);\n const [reviewModalOpen, setReviewModalOpen] = useState(false);\n const [isLoadingApproval, setIsLoadingApproval] = useState(false);\n const [completeModalOpen, setCompleteModalOpen] = useState(false);\n\n const tagRef = useRef<HTMLDivElement>(null);\n const dropdownRef = useRef<HTMLDivElement>(null);\n const [tooltipStyle, setTooltipStyle] = useState<React.CSSProperties>({});\n const [dropdownStyle, setDropdownStyle] = useState<React.CSSProperties>({});\n\n // Close dropdown on click outside\n useEffect(() => {\n if (!dropdownOpen) return;\n const handleClick = (e: MouseEvent) => {\n const target = e.target as Node;\n if (\n tagRef.current && !tagRef.current.contains(target) &&\n (!dropdownRef.current || !dropdownRef.current.contains(target))\n ) {\n setDropdownOpen(false);\n }\n };\n document.addEventListener('mousedown', handleClick);\n return () => document.removeEventListener('mousedown', handleClick);\n }, [dropdownOpen]);\n\n // API client\n const getClient = useCallback((): DevicApiClient | null => {\n if (!resolvedApiKey) return null;\n return new DevicApiClient({ apiKey: resolvedApiKey, baseUrl: resolvedBaseUrl });\n }, [resolvedApiKey, resolvedBaseUrl]);\n\n // Config\n const config = getStateConfig(state, subthreadCount);\n\n if (!state) {\n return <span className=\"devic-state-tag\" data-color=\"default\">Unknown</span>;\n }\n\n // Icon\n const renderIcon = () => {\n if (!showIcon) return null;\n if (customIcon) return <span className=\"devic-state-tag-icon\">{customIcon}</span>;\n const icon = <StateIcon iconType={config.iconType} />;\n return icon ? <span className=\"devic-state-tag-icon\">{icon}</span> : null;\n };\n\n // Tooltip content\n const getTooltipContent = (): string | null => {\n switch (state) {\n case AgentThreadState.PAUSED_FOR_APPROVAL:\n return 'Agent is waiting for approval to resume execution';\n case AgentThreadState.PAUSED_FOR_RESUME:\n if (pauseUntil) {\n const timeDiff = new Date(pauseUntil).getTime() - Date.now();\n const hours = Math.floor(timeDiff / 3600000);\n const minutes = Math.floor(timeDiff / 60000);\n const timeStr = hours > 0 ? `${hours} hours` : `${minutes} minutes`;\n return `Agent paused, will resume at ${new Date(pauseUntil).toLocaleString()} (${timeStr})`;\n }\n return 'Agent paused, will resume at a scheduled time';\n case AgentThreadState.WAITING_FOR_RESPONSE:\n return pausedReason || 'Agent is waiting for response';\n case AgentThreadState.COMPLETED:\n case AgentThreadState.FAILED:\n case AgentThreadState.TERMINATED:\n return finishReason || 'Manually finished thread';\n case AgentThreadState.APPROVAL_REJECTED:\n return approvalRejectedMessage || 'Approval was rejected';\n case AgentThreadState.GUARDRAIL_TRIGGER:\n return 'Agent execution paused due to guardrail trigger';\n default:\n return null;\n }\n };\n\n // Handlers\n const handleExplain = async () => {\n setDropdownOpen(false);\n setExplainModalOpen(true);\n setIsLoadingExplanation(true);\n setThreadExplanation(null);\n\n const client = getClient();\n if (!client) {\n setThreadExplanation('API key not configured.');\n setIsLoadingExplanation(false);\n return;\n }\n\n try {\n const explanation = await client.explainAgentThread(threadId);\n setThreadExplanation(explanation);\n } catch {\n setThreadExplanation('Could not obtain the thread explanation.');\n } finally {\n setIsLoadingExplanation(false);\n }\n };\n\n const handlePause = async () => {\n const client = getClient();\n if (!client) return;\n try {\n await client.pauseResumeThread(threadId, 'paused');\n setPauseModalOpen(false);\n onActionComplete?.();\n } catch (err) {\n console.error('Error pausing thread:', err);\n }\n };\n\n const handleResume = async () => {\n const client = getClient();\n if (!client) return;\n try {\n await client.pauseResumeThread(threadId, 'queued');\n setResumeModalOpen(false);\n onActionComplete?.();\n } catch (err) {\n console.error('Error resuming thread:', err);\n }\n };\n\n const handleApproval = async (action: 'approved' | 'rejected', retry: boolean, message?: string) => {\n const client = getClient();\n if (!client) return;\n setIsLoadingApproval(true);\n try {\n await client.handleThreadApproval(threadId, action === 'approved', retry, message || '');\n setReviewModalOpen(false);\n onActionComplete?.();\n } catch (err) {\n console.error('Error handling thread approval:', err);\n } finally {\n setIsLoadingApproval(false);\n }\n };\n\n const handleComplete = async (completionState: string) => {\n const client = getClient();\n if (!client) return;\n try {\n await client.completeThread(threadId, completionState);\n setCompleteModalOpen(false);\n onActionComplete?.();\n } catch (err) {\n console.error('Error completing thread:', err);\n }\n };\n\n // Build dropdown items\n const dropdownItems: Array<{ key: string; icon: React.ReactNode; label: string; onClick: () => void }> = [];\n\n if (showAdminActions && [AgentThreadState.PROCESSING, AgentThreadState.QUEUED, AgentThreadState.WAITING_FOR_RESPONSE].includes(state as AgentThreadState)) {\n dropdownItems.push({\n key: 'complete',\n icon: <WrenchIcon />,\n label: 'Complete manually',\n onClick: () => { setDropdownOpen(false); setCompleteModalOpen(true); },\n });\n }\n\n if (state === AgentThreadState.QUEUED) {\n dropdownItems.push({\n key: 'pause',\n icon: <PauseIcon />,\n label: 'Pause',\n onClick: () => { setDropdownOpen(false); setPauseModalOpen(true); },\n });\n }\n\n if (state === AgentThreadState.PAUSED || state === AgentThreadState.PAUSED_FOR_RESUME) {\n dropdownItems.push({\n key: 'resume',\n icon: <PlayIcon />,\n label: 'Resume',\n onClick: () => { setDropdownOpen(false); setResumeModalOpen(true); },\n });\n }\n\n if (state === AgentThreadState.PAUSED_FOR_APPROVAL) {\n dropdownItems.push({\n key: 'review',\n icon: <EyeIcon />,\n label: 'Review',\n onClick: () => { setDropdownOpen(false); setReviewModalOpen(true); },\n });\n }\n\n dropdownItems.push({\n key: 'explain',\n icon: <LightbulbIcon />,\n label: 'Explain thread...',\n onClick: handleExplain,\n });\n\n const canInteract = interactive && threadId;\n const tooltipContent = getTooltipContent();\n\n return (\n <>\n <div\n ref={tagRef}\n className=\"devic-state-tag\"\n data-color={config.color}\n data-interactive={String(!!canInteract)}\n data-dropdown-open={String(dropdownOpen)}\n onClick={canInteract ? () => {\n if (!dropdownOpen) {\n const rect = tagRef.current?.getBoundingClientRect();\n if (rect) {\n setDropdownStyle({\n position: 'fixed',\n top: rect.bottom + 4,\n right: window.innerWidth - rect.right,\n });\n }\n }\n setDropdownOpen(!dropdownOpen);\n } : undefined}\n onMouseEnter={() => {\n if (!dropdownOpen && tooltipContent) {\n const rect = tagRef.current?.getBoundingClientRect();\n if (rect) {\n setTooltipStyle({\n position: 'fixed',\n top: rect.top - 8,\n left: rect.left + rect.width / 2,\n transform: 'translate(-50%, -100%)',\n });\n }\n setShowTooltip(true);\n }\n }}\n onMouseLeave={() => setShowTooltip(false)}\n >\n {renderIcon()}\n {config.text}\n {canInteract && (\n <span className=\"devic-state-tag-caret\">\n <CaretDownIcon />\n </span>\n )}\n\n </div>\n\n {/* Tooltip - portal to escape overflow/transform containers */}\n {showTooltip && tooltipContent && !dropdownOpen && createPortal(\n <div className=\"devic-state-tooltip-portal\" style={tooltipStyle}>{tooltipContent}</div>,\n document.body\n )}\n\n {/* Dropdown - portal to escape overflow/transform containers */}\n {dropdownOpen && canInteract && createPortal(\n <div ref={dropdownRef} className=\"devic-state-dropdown-portal\" style={dropdownStyle}>\n {dropdownItems.map((item) => (\n <button\n key={item.key}\n className=\"devic-state-dropdown-item\"\n onClick={(e) => { e.stopPropagation(); item.onClick(); }}\n type=\"button\"\n >\n <span className=\"devic-state-dropdown-item-icon\">{item.icon}</span>\n {item.label}\n </button>\n ))}\n </div>,\n document.body\n )}\n\n {/* Modals */}\n <ExplainModal\n open={explainModalOpen}\n onClose={() => setExplainModalOpen(false)}\n explanation={threadExplanation}\n isLoading={isLoadingExplanation}\n agentName={agentName}\n />\n\n <CompleteModal\n open={completeModalOpen}\n onClose={() => setCompleteModalOpen(false)}\n onComplete={handleComplete}\n />\n\n <ConfirmModal\n open={pauseModalOpen}\n onClose={() => setPauseModalOpen(false)}\n onConfirm={handlePause}\n title=\"Pause Thread\"\n icon={<PauseIcon />}\n message=\"You are about to pause this queued thread. It can be resumed later.\"\n confirmText=\"Pause\"\n />\n\n <ConfirmModal\n open={resumeModalOpen}\n onClose={() => setResumeModalOpen(false)}\n onConfirm={handleResume}\n title=\"Resume Thread\"\n icon={<PlayIcon />}\n message=\"You are about to resume this thread. It will go back to the queue and be processed when possible.\"\n confirmText=\"Resume\"\n />\n\n <ApprovalModal\n open={reviewModalOpen}\n onClose={() => setReviewModalOpen(false)}\n onApprove={handleApproval}\n isLoading={isLoadingApproval}\n pausedReason={pausedReason}\n />\n </>\n );\n}\n"],"names":["_jsx","_jsxs","_Fragment"],"mappings":"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"}
@@ -57,6 +57,12 @@ export interface UseDevicChatOptions {
57
57
  * Callback when a new chat is created
58
58
  */
59
59
  onChatCreated?: (chatUid: string) => void;
60
+ /**
61
+ * Custom file upload handler. When provided, replaces the default
62
+ * upload to Devic API. Receives the raw File objects and must return
63
+ * an array of ChatFile with downloadUrl set.
64
+ */
65
+ onFileUpload?: (files: File[]) => Promise<ChatFile[]>;
60
66
  /**
61
67
  * Enable debug logging to the browser console.
62
68
  * Overrides the provider-level debug setting when provided.
@@ -97,7 +103,7 @@ export interface UseDevicChatResult {
97
103
  * Send a message
98
104
  */
99
105
  sendMessage: (message: string, options?: {
100
- files?: ChatFile[];
106
+ files?: File[];
101
107
  metadata?: Record<string, any>;
102
108
  }) => Promise<void>;
103
109
  /**
@@ -29,7 +29,7 @@ import { createLogger } from '../utils/logger.js';
29
29
  * ```
30
30
  */
31
31
  function useDevicChat(options) {
32
- const { assistantId, chatUid: initialChatUid, apiKey: propsApiKey, baseUrl: propsBaseUrl, tenantId, tenantMetadata, enabledTools, modelInterfaceTools = [], pollingInterval = 1000, onMessageSent, onMessageReceived, onToolCall, onError, onChatCreated, debug: propsDebug, } = options;
32
+ const { assistantId, chatUid: initialChatUid, apiKey: propsApiKey, baseUrl: propsBaseUrl, tenantId, tenantMetadata, enabledTools, modelInterfaceTools = [], pollingInterval = 1000, onMessageSent, onMessageReceived, onToolCall, onError, onChatCreated, onFileUpload, debug: propsDebug, } = options;
33
33
  // Get context (may be null if not wrapped in provider)
34
34
  const context = useOptionalDevicContext();
35
35
  // Resolve configuration
@@ -263,7 +263,7 @@ function useDevicChat(options) {
263
263
  setIsLoading(true);
264
264
  setError(null);
265
265
  setStatus('processing');
266
- // Add user message optimistically
266
+ // Add user message optimistically (show file names before upload)
267
267
  const userMessage = {
268
268
  uid: `temp-${Date.now()}`,
269
269
  role: 'user',
@@ -271,8 +271,8 @@ function useDevicChat(options) {
271
271
  message,
272
272
  files: sendOptions?.files?.map((f) => ({
273
273
  name: f.name,
274
- url: f.downloadUrl || '',
275
- type: f.fileType || 'other',
274
+ url: '',
275
+ type: f.type.split('/')[0] || 'other',
276
276
  })),
277
277
  },
278
278
  timestamp: Date.now(),
@@ -280,11 +280,44 @@ function useDevicChat(options) {
280
280
  setMessages((prev) => [...prev, userMessage]);
281
281
  onMessageSent?.(userMessage);
282
282
  try {
283
+ // Upload files if provided
284
+ let uploadedFiles;
285
+ if (sendOptions?.files && sendOptions.files.length > 0) {
286
+ logRef.current.log('[useDevicChat] Uploading files...');
287
+ if (onFileUpload) {
288
+ // Use custom upload handler
289
+ uploadedFiles = await onFileUpload(sendOptions.files);
290
+ }
291
+ else {
292
+ // Default: upload via Devic API
293
+ const uploadResults = await Promise.all(sendOptions.files.map((file) => clientRef.current.uploadFile(file)));
294
+ uploadedFiles = uploadResults.map((r) => ({
295
+ name: r.name,
296
+ downloadUrl: r.downloadUrl,
297
+ fileType: r.fileType,
298
+ }));
299
+ }
300
+ logRef.current.log('[useDevicChat] Files uploaded:', uploadedFiles);
301
+ // Update optimistic message with download URLs
302
+ setMessages((prev) => prev.map((m) => m.uid === userMessage.uid
303
+ ? {
304
+ ...m,
305
+ content: {
306
+ ...m.content,
307
+ files: uploadedFiles.map((f) => ({
308
+ name: f.name,
309
+ url: f.downloadUrl || '',
310
+ type: f.fileType || 'other',
311
+ })),
312
+ },
313
+ }
314
+ : m));
315
+ }
283
316
  // Build request DTO
284
317
  const dto = {
285
318
  message,
286
319
  chatUid: chatUid || undefined,
287
- files: sendOptions?.files,
320
+ files: uploadedFiles,
288
321
  metadata: {
289
322
  ...resolvedTenantMetadata,
290
323
  ...sendOptions?.metadata,
@@ -325,6 +358,7 @@ function useDevicChat(options) {
325
358
  resolvedTenantMetadata,
326
359
  toolSchemas,
327
360
  onMessageSent,
361
+ onFileUpload,
328
362
  ]);
329
363
  // Clear chat
330
364
  const clearChat = useCallback(() => {
@@ -1 +1 @@
1
- {"version":3,"file":"useDevicChat.js","sources":["../../../src/hooks/useDevicChat.ts"],"sourcesContent":["import { useState, useCallback, useEffect, useRef, useMemo } from 'react';\nimport { useOptionalDevicContext } from '../provider';\nimport { DevicApiClient } from '../api/client';\nimport { usePolling } from './usePolling';\nimport { useModelInterface } from './useModelInterface';\nimport { createLogger } from '../utils/logger';\nimport type {\n ChatMessage,\n ChatFile,\n ModelInterfaceTool,\n RealtimeChatHistory,\n RealtimeStatus,\n} from '../api/types';\n\nexport interface UseDevicChatOptions {\n /**\n * Assistant identifier\n */\n assistantId: string;\n\n /**\n * Existing chat UID to continue a conversation\n */\n chatUid?: string;\n\n /**\n * API key (overrides provider context)\n */\n apiKey?: string;\n\n /**\n * Base URL (overrides provider context)\n */\n baseUrl?: string;\n\n /**\n * Tenant ID for multi-tenant environments\n */\n tenantId?: string;\n\n /**\n * Tenant metadata\n */\n tenantMetadata?: Record<string, any>;\n\n /**\n * Tools enabled from the assistant's configured tool groups\n */\n enabledTools?: string[];\n\n /**\n * Client-side tools for model interface protocol\n */\n modelInterfaceTools?: ModelInterfaceTool[];\n\n /**\n * Polling interval for async mode (ms)\n * @default 1000\n */\n pollingInterval?: number;\n\n /**\n * Callback when a message is sent\n */\n onMessageSent?: (message: ChatMessage) => void;\n\n /**\n * Callback when a message is received\n */\n onMessageReceived?: (message: ChatMessage) => void;\n\n /**\n * Callback when a tool is called\n */\n onToolCall?: (toolName: string, params: any) => void;\n\n /**\n * Callback when an error occurs\n */\n onError?: (error: Error) => void;\n\n /**\n * Callback when a new chat is created\n */\n onChatCreated?: (chatUid: string) => void;\n\n /**\n * Enable debug logging to the browser console.\n * Overrides the provider-level debug setting when provided.\n * @default false\n */\n debug?: boolean;\n}\n\nexport interface UseDevicChatResult {\n /**\n * Current chat messages\n */\n messages: ChatMessage[];\n\n /**\n * Current chat UID\n */\n chatUid: string | null;\n\n /**\n * Whether a message is being processed\n */\n isLoading: boolean;\n\n /**\n * Current status\n */\n status: RealtimeStatus | 'idle';\n\n /**\n * Last error\n */\n error: Error | null;\n\n /**\n * Whether the assistant has handed off to a subagent\n */\n handedOff: boolean;\n\n /**\n * The subthread ID when a handoff is active\n */\n handedOffSubThreadId: string | null;\n\n /**\n * Send a message\n */\n sendMessage: (\n message: string,\n options?: {\n files?: ChatFile[];\n metadata?: Record<string, any>;\n }\n ) => Promise<void>;\n\n /**\n * Clear the chat and start a new conversation\n */\n clearChat: () => void;\n\n /**\n * Load an existing chat\n */\n loadChat: (chatUid: string) => Promise<void>;\n\n /**\n * Called when the handoff subagent completes.\n * Triggers reload of full chat content.\n */\n onHandoffCompleted: () => void;\n\n /**\n * Stop the current conversation processing (client-side only).\n * Stops polling and resets loading state.\n */\n stopChat: () => void;\n}\n\n/**\n * Main hook for managing chat with a Devic assistant\n *\n * @example\n * ```tsx\n * const {\n * messages,\n * isLoading,\n * sendMessage,\n * } = useDevicChat({\n * assistantId: 'my-assistant',\n * modelInterfaceTools: [\n * {\n * toolName: 'get_user_location',\n * schema: { ... },\n * callback: async () => ({ lat: 40.7, lng: -74.0 })\n * }\n * ],\n * onMessageReceived: (msg) => console.log('Received:', msg),\n * });\n * ```\n */\nexport function useDevicChat(options: UseDevicChatOptions): UseDevicChatResult {\n const {\n assistantId,\n chatUid: initialChatUid,\n apiKey: propsApiKey,\n baseUrl: propsBaseUrl,\n tenantId,\n tenantMetadata,\n enabledTools,\n modelInterfaceTools = [],\n pollingInterval = 1000,\n onMessageSent,\n onMessageReceived,\n onToolCall,\n onError,\n onChatCreated,\n debug: propsDebug,\n } = options;\n\n // Get context (may be null if not wrapped in provider)\n const context = useOptionalDevicContext();\n\n // Resolve configuration\n const apiKey = propsApiKey || context?.apiKey;\n const baseUrl = propsBaseUrl || context?.baseUrl || 'https://api.devic.ai';\n const resolvedTenantId = tenantId || context?.tenantId;\n const resolvedTenantMetadata = { ...context?.tenantMetadata, ...tenantMetadata };\n const debug = propsDebug ?? context?.debug ?? false;\n const log = useMemo(() => createLogger(debug), [debug]);\n const logRef = useRef(log);\n logRef.current = log;\n\n // State\n const [messages, setMessages] = useState<ChatMessage[]>([]);\n const [chatUid, setChatUid] = useState<string | null>(initialChatUid || null);\n const [isLoading, setIsLoading] = useState(false);\n const [status, setStatus] = useState<RealtimeStatus | 'idle'>('idle');\n const [error, setError] = useState<Error | null>(null);\n\n // Handoff state\n const [handedOff, setHandedOff] = useState(false);\n const [handedOffSubThreadId, setHandedOffSubThreadId] = useState<string | null>(null);\n const handoffPollRef = useRef<ReturnType<typeof setInterval> | null>(null);\n\n // Polling state\n const [shouldPoll, setShouldPoll] = useState(false);\n\n // Keep a ref to chatUid so async callbacks always read the latest value\n const chatUidRef = useRef(chatUid);\n chatUidRef.current = chatUid;\n\n // Refs for callbacks\n const onMessageReceivedRef = useRef(onMessageReceived);\n const onErrorRef = useRef(onError);\n const onChatCreatedRef = useRef(onChatCreated);\n\n useEffect(() => {\n onMessageReceivedRef.current = onMessageReceived;\n onErrorRef.current = onError;\n onChatCreatedRef.current = onChatCreated;\n });\n\n // Create API client\n const clientRef = useRef<DevicApiClient | null>(null);\n if (!clientRef.current && apiKey) {\n clientRef.current = new DevicApiClient({ apiKey, baseUrl });\n }\n\n // Update client config if it changes\n useEffect(() => {\n if (clientRef.current && apiKey) {\n clientRef.current.setConfig({ apiKey, baseUrl });\n }\n }, [apiKey, baseUrl]);\n\n // Resume chat state based on realtime status.\n // Called after loading chat history to detect in-progress conversations.\n const resumeFromRealtimeStatus = useCallback(\n async (targetChatUid: string) => {\n if (!clientRef.current) return;\n try {\n const realtime = await clientRef.current.getRealtimeHistory(assistantId, targetChatUid);\n logRef.current.log('[useDevicChat] resumeFromRealtimeStatus:', realtime.status);\n\n // Update messages with realtime data (may be fresher than static history)\n if (realtime.chatHistory?.length) {\n setMessages(realtime.chatHistory);\n }\n setStatus(realtime.status);\n\n if (realtime.status === 'processing') {\n // Chat is still processing — resume polling\n setIsLoading(true);\n setShouldPoll(true);\n } else if (realtime.status === 'waiting_for_tool_response') {\n // Chat is waiting for tool response — resume polling to trigger tool handling\n setIsLoading(true);\n setShouldPoll(true);\n } else if (realtime.status === 'handed_off') {\n // Chat has an active handoff\n setIsLoading(true);\n setHandedOff(true);\n const subThreadId = realtime.handedOffSubThreadId || null;\n logRef.current.log('[useDevicChat] Resuming handoff state:', { subThreadId });\n if (subThreadId) {\n setHandedOffSubThreadId(subThreadId);\n }\n } else {\n // completed or error — just stop\n setIsLoading(false);\n }\n } catch (err) {\n // If realtime fetch fails (e.g. chat has no realtime entry), just stay idle\n logRef.current.warn('[useDevicChat] resumeFromRealtimeStatus failed:', err);\n setIsLoading(false);\n }\n },\n [assistantId]\n );\n\n // Load initial chat history if chatUid prop is provided\n // This runs once on mount (or when initialChatUid changes) to fetch existing conversation\n const initialChatLoadedRef = useRef(false);\n useEffect(() => {\n if (initialChatUid && clientRef.current && !initialChatLoadedRef.current) {\n initialChatLoadedRef.current = true;\n\n const loadInitialChat = async () => {\n setIsLoading(true);\n setError(null);\n try {\n const history = await clientRef.current!.getChatHistory(\n assistantId,\n initialChatUid,\n { tenantId: resolvedTenantId }\n );\n setMessages(history.chatContent);\n setChatUid(initialChatUid);\n\n // Check realtime status to resume in-progress conversations\n await resumeFromRealtimeStatus(initialChatUid);\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n onErrorRef.current?.(error);\n setIsLoading(false);\n }\n };\n\n loadInitialChat();\n }\n }, [initialChatUid, assistantId, resolvedTenantId, resumeFromRealtimeStatus]);\n\n // Model interface hook\n const {\n toolSchemas,\n handleToolCalls,\n extractPendingToolCalls,\n } = useModelInterface({\n tools: modelInterfaceTools,\n onToolExecute: onToolCall,\n });\n\n // Polling hook - uses callbacks for side effects, return value not needed\n logRef.current.log('[useDevicChat] Render - shouldPoll:', shouldPoll, 'chatUid:', chatUid);\n usePolling(\n shouldPoll ? chatUid : null,\n async () => {\n logRef.current.log('[useDevicChat] fetchFn called, chatUid:', chatUid);\n if (!clientRef.current || !chatUid) {\n throw new Error('Cannot poll without client or chatUid');\n }\n const result = await clientRef.current.getRealtimeHistory(assistantId, chatUid);\n logRef.current.log('[useDevicChat] getRealtimeHistory result:', result);\n return result;\n },\n {\n interval: pollingInterval,\n enabled: shouldPoll,\n stopStatuses: ['completed', 'error', 'waiting_for_tool_response', 'handed_off'],\n onUpdate: async (data: RealtimeChatHistory) => {\n logRef.current.log('[useDevicChat] onUpdate called, status:', data.status);\n\n // Merge realtime data with optimistic messages\n setMessages((prev) => {\n const realtimeUIDs = new Set(data.chatHistory.map((m) => m.uid));\n const realtimeUserMessages = new Set(\n data.chatHistory\n .filter((m) => m.role === 'user')\n .map((m) => m.content?.message)\n );\n\n // Keep optimistic messages not yet in realtime data\n const optimistic = prev.filter((m) => {\n if (realtimeUIDs.has(m.uid)) return false;\n if (m.role === 'user' && realtimeUserMessages.has(m.content?.message)) return false;\n return true;\n });\n\n return [...data.chatHistory, ...optimistic];\n });\n setStatus(data.status);\n\n // Notify about new messages\n const lastMessage = data.chatHistory[data.chatHistory.length - 1];\n if (lastMessage && lastMessage.role === 'assistant') {\n onMessageReceivedRef.current?.(lastMessage);\n }\n\n // Handle model interface - check for pending tool calls\n if (data.status === 'waiting_for_tool_response' || data.pendingToolCalls?.length) {\n await handlePendingToolCalls(data);\n }\n },\n onStop: (data) => {\n logRef.current.log('[useDevicChat] onStop called, status:', data?.status);\n setShouldPoll(false);\n\n if (data?.status === 'error') {\n setIsLoading(false);\n const err = new Error('Chat processing failed');\n setError(err);\n onErrorRef.current?.(err);\n } else if (data?.status === 'completed') {\n setIsLoading(false);\n } else if (data?.status === 'handed_off') {\n // Subagent is working — keep isLoading true so the UI stays in loading state.\n // Set handoff state directly from the realtime status.\n setHandedOff(true);\n\n const subThreadId = data.handedOffSubThreadId || null;\n logRef.current.log('[useDevicChat] Handoff state set:', { handedOff: true, subThreadId });\n if (subThreadId) {\n setHandedOffSubThreadId(subThreadId);\n }\n }\n // Note: waiting_for_tool_response is handled in onUpdate to avoid double execution\n },\n onError: (err) => {\n logRef.current.error('[useDevicChat] onError called:', err);\n setError(err);\n setIsLoading(false);\n setShouldPoll(false);\n onErrorRef.current?.(err);\n },\n debug,\n }\n );\n\n // Handle pending tool calls from model interface\n const handlePendingToolCalls = useCallback(\n async (data: RealtimeChatHistory) => {\n if (!clientRef.current || !chatUid) return;\n\n // Get pending tool calls\n const pendingCalls = data.pendingToolCalls || extractPendingToolCalls(data.chatHistory);\n\n if (pendingCalls.length === 0) return;\n\n try {\n // Execute client-side tools\n const responses = await handleToolCalls(pendingCalls);\n\n if (responses.length > 0) {\n // Send tool responses back to the API\n await clientRef.current.sendToolResponses(assistantId, chatUid, responses);\n\n // Resume polling\n setShouldPoll(true);\n setIsLoading(true);\n }\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n onErrorRef.current?.(error);\n }\n },\n [chatUid, assistantId, handleToolCalls, extractPendingToolCalls]\n );\n\n // Send a message\n const sendMessage = useCallback(\n async (\n message: string,\n sendOptions?: {\n files?: ChatFile[];\n metadata?: Record<string, any>;\n }\n ) => {\n if (!clientRef.current) {\n const err = new Error(\n 'API client not configured. Please provide an API key.'\n );\n setError(err);\n onErrorRef.current?.(err);\n return;\n }\n\n setIsLoading(true);\n setError(null);\n setStatus('processing');\n\n // Add user message optimistically\n const userMessage: ChatMessage = {\n uid: `temp-${Date.now()}`,\n role: 'user',\n content: {\n message,\n files: sendOptions?.files?.map((f) => ({\n name: f.name,\n url: f.downloadUrl || '',\n type: f.fileType || 'other',\n })),\n },\n timestamp: Date.now(),\n };\n\n setMessages((prev) => [...prev, userMessage]);\n onMessageSent?.(userMessage);\n\n try {\n // Build request DTO\n const dto = {\n message,\n chatUid: chatUid || undefined,\n files: sendOptions?.files,\n metadata: {\n ...resolvedTenantMetadata,\n ...sendOptions?.metadata,\n },\n tenantId: resolvedTenantId,\n enabledTools,\n // Include model interface tools if any\n ...(toolSchemas.length > 0 && { tools: toolSchemas }),\n };\n\n // Send message in async mode\n logRef.current.log('[useDevicChat] Sending message async...');\n const response = await clientRef.current.sendMessageAsync(assistantId, dto);\n logRef.current.log('[useDevicChat] sendMessageAsync response:', response);\n\n // Update chat UID if this is a new chat\n if (response.chatUid && response.chatUid !== chatUid) {\n logRef.current.log('[useDevicChat] Setting chatUid:', response.chatUid);\n setChatUid(response.chatUid);\n onChatCreatedRef.current?.(response.chatUid);\n }\n\n // Start polling for results\n logRef.current.log('[useDevicChat] Setting shouldPoll to true');\n setShouldPoll(true);\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n setIsLoading(false);\n setStatus('error');\n onErrorRef.current?.(error);\n\n // Remove optimistic user message on error\n setMessages((prev) => prev.filter((m) => m.uid !== userMessage.uid));\n }\n },\n [\n chatUid,\n assistantId,\n enabledTools,\n resolvedTenantId,\n resolvedTenantMetadata,\n toolSchemas,\n onMessageSent,\n ]\n );\n\n // Clear chat\n const clearChat = useCallback(() => {\n setShouldPoll(false);\n setHandedOff(false);\n setHandedOffSubThreadId(null);\n if (handoffPollRef.current) {\n clearInterval(handoffPollRef.current);\n handoffPollRef.current = null;\n }\n setMessages([]);\n setChatUid(null);\n setIsLoading(false);\n setStatus('idle');\n setError(null);\n }, []);\n\n // Load existing chat\n const loadChat = useCallback(\n async (loadChatUid: string) => {\n if (!clientRef.current) {\n const err = new Error('API client not configured');\n setError(err);\n onErrorRef.current?.(err);\n return;\n }\n\n // Reset any active polling/handoff state from previous conversation\n setShouldPoll(false);\n setHandedOff(false);\n setHandedOffSubThreadId(null);\n if (handoffPollRef.current) {\n clearInterval(handoffPollRef.current);\n handoffPollRef.current = null;\n }\n\n setIsLoading(true);\n setError(null);\n\n try {\n const history = await clientRef.current.getChatHistory(\n assistantId,\n loadChatUid,\n { tenantId: resolvedTenantId }\n );\n\n setMessages(history.chatContent);\n setChatUid(loadChatUid);\n\n // Check realtime status to resume in-progress conversations\n await resumeFromRealtimeStatus(loadChatUid);\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n onErrorRef.current?.(error);\n setIsLoading(false);\n }\n },\n [assistantId, resolvedTenantId, resumeFromRealtimeStatus]\n );\n\n // Handoff polling: while handedOff is true, poll the realtime endpoint every 5s\n // to detect when the parent thread is no longer in handed_off state.\n useEffect(() => {\n if (!handedOff || !chatUid || !clientRef.current) return;\n\n const pollHandoff = async () => {\n try {\n const realtime = await clientRef.current!.getRealtimeHistory(assistantId, chatUid!);\n logRef.current.log('[useDevicChat] Handoff poll - realtime status:', realtime.status);\n if (realtime.status !== 'handed_off') {\n // Handoff completed — clear handoff state and resume main polling\n if (handoffPollRef.current) {\n clearInterval(handoffPollRef.current);\n handoffPollRef.current = null;\n }\n setHandedOff(false);\n setHandedOffSubThreadId(null);\n // Resume main polling to pick up the parent thread's continuation\n setShouldPoll(true);\n }\n } catch {}\n };\n\n handoffPollRef.current = setInterval(pollHandoff, 5000);\n return () => {\n if (handoffPollRef.current) {\n clearInterval(handoffPollRef.current);\n handoffPollRef.current = null;\n }\n };\n }, [handedOff, chatUid, assistantId]);\n\n // Called by HandoffSubagentWidget when the subthread reaches a terminal state\n const onHandoffCompleted = useCallback(() => {\n logRef.current.log('[useDevicChat] onHandoffCompleted called');\n // Clear the handoff polling\n if (handoffPollRef.current) {\n clearInterval(handoffPollRef.current);\n handoffPollRef.current = null;\n }\n // Clear handoff state and resume main polling\n setHandedOff(false);\n setHandedOffSubThreadId(null);\n setShouldPoll(true);\n }, []);\n\n // Stop current conversation — calls the server-side stop endpoint\n // then stops polling and resets loading state.\n const stopChat = useCallback(async () => {\n const uid = chatUidRef.current;\n logRef.current.log('[useDevicChat] stopChat called, chatUid:', uid);\n if (clientRef.current && uid) {\n try {\n await clientRef.current.stopChat(assistantId, uid);\n logRef.current.log('[useDevicChat] stopChat API call succeeded');\n } catch (err) {\n logRef.current.warn('[useDevicChat] stopChat API call failed:', err);\n }\n }\n setShouldPoll(false);\n setIsLoading(false);\n setStatus('idle');\n }, [assistantId]);\n\n return {\n messages,\n chatUid,\n isLoading,\n status,\n error,\n handedOff,\n handedOffSubThreadId,\n sendMessage,\n clearChat,\n loadChat,\n onHandoffCompleted,\n stopChat,\n };\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useDevicChat.js","sources":["../../../src/hooks/useDevicChat.ts"],"sourcesContent":["import { useState, useCallback, useEffect, useRef, useMemo } from 'react';\nimport { useOptionalDevicContext } from '../provider';\nimport { DevicApiClient } from '../api/client';\nimport { usePolling } from './usePolling';\nimport { useModelInterface } from './useModelInterface';\nimport { createLogger } from '../utils/logger';\nimport type {\n ChatMessage,\n ChatFile,\n ModelInterfaceTool,\n RealtimeChatHistory,\n RealtimeStatus,\n} from '../api/types';\n\nexport interface UseDevicChatOptions {\n /**\n * Assistant identifier\n */\n assistantId: string;\n\n /**\n * Existing chat UID to continue a conversation\n */\n chatUid?: string;\n\n /**\n * API key (overrides provider context)\n */\n apiKey?: string;\n\n /**\n * Base URL (overrides provider context)\n */\n baseUrl?: string;\n\n /**\n * Tenant ID for multi-tenant environments\n */\n tenantId?: string;\n\n /**\n * Tenant metadata\n */\n tenantMetadata?: Record<string, any>;\n\n /**\n * Tools enabled from the assistant's configured tool groups\n */\n enabledTools?: string[];\n\n /**\n * Client-side tools for model interface protocol\n */\n modelInterfaceTools?: ModelInterfaceTool[];\n\n /**\n * Polling interval for async mode (ms)\n * @default 1000\n */\n pollingInterval?: number;\n\n /**\n * Callback when a message is sent\n */\n onMessageSent?: (message: ChatMessage) => void;\n\n /**\n * Callback when a message is received\n */\n onMessageReceived?: (message: ChatMessage) => void;\n\n /**\n * Callback when a tool is called\n */\n onToolCall?: (toolName: string, params: any) => void;\n\n /**\n * Callback when an error occurs\n */\n onError?: (error: Error) => void;\n\n /**\n * Callback when a new chat is created\n */\n onChatCreated?: (chatUid: string) => void;\n\n /**\n * Custom file upload handler. When provided, replaces the default\n * upload to Devic API. Receives the raw File objects and must return\n * an array of ChatFile with downloadUrl set.\n */\n onFileUpload?: (files: File[]) => Promise<ChatFile[]>;\n\n /**\n * Enable debug logging to the browser console.\n * Overrides the provider-level debug setting when provided.\n * @default false\n */\n debug?: boolean;\n}\n\nexport interface UseDevicChatResult {\n /**\n * Current chat messages\n */\n messages: ChatMessage[];\n\n /**\n * Current chat UID\n */\n chatUid: string | null;\n\n /**\n * Whether a message is being processed\n */\n isLoading: boolean;\n\n /**\n * Current status\n */\n status: RealtimeStatus | 'idle';\n\n /**\n * Last error\n */\n error: Error | null;\n\n /**\n * Whether the assistant has handed off to a subagent\n */\n handedOff: boolean;\n\n /**\n * The subthread ID when a handoff is active\n */\n handedOffSubThreadId: string | null;\n\n /**\n * Send a message\n */\n sendMessage: (\n message: string,\n options?: {\n files?: File[];\n metadata?: Record<string, any>;\n }\n ) => Promise<void>;\n\n /**\n * Clear the chat and start a new conversation\n */\n clearChat: () => void;\n\n /**\n * Load an existing chat\n */\n loadChat: (chatUid: string) => Promise<void>;\n\n /**\n * Called when the handoff subagent completes.\n * Triggers reload of full chat content.\n */\n onHandoffCompleted: () => void;\n\n /**\n * Stop the current conversation processing (client-side only).\n * Stops polling and resets loading state.\n */\n stopChat: () => void;\n}\n\n/**\n * Main hook for managing chat with a Devic assistant\n *\n * @example\n * ```tsx\n * const {\n * messages,\n * isLoading,\n * sendMessage,\n * } = useDevicChat({\n * assistantId: 'my-assistant',\n * modelInterfaceTools: [\n * {\n * toolName: 'get_user_location',\n * schema: { ... },\n * callback: async () => ({ lat: 40.7, lng: -74.0 })\n * }\n * ],\n * onMessageReceived: (msg) => console.log('Received:', msg),\n * });\n * ```\n */\nexport function useDevicChat(options: UseDevicChatOptions): UseDevicChatResult {\n const {\n assistantId,\n chatUid: initialChatUid,\n apiKey: propsApiKey,\n baseUrl: propsBaseUrl,\n tenantId,\n tenantMetadata,\n enabledTools,\n modelInterfaceTools = [],\n pollingInterval = 1000,\n onMessageSent,\n onMessageReceived,\n onToolCall,\n onError,\n onChatCreated,\n onFileUpload,\n debug: propsDebug,\n } = options;\n\n // Get context (may be null if not wrapped in provider)\n const context = useOptionalDevicContext();\n\n // Resolve configuration\n const apiKey = propsApiKey || context?.apiKey;\n const baseUrl = propsBaseUrl || context?.baseUrl || 'https://api.devic.ai';\n const resolvedTenantId = tenantId || context?.tenantId;\n const resolvedTenantMetadata = { ...context?.tenantMetadata, ...tenantMetadata };\n const debug = propsDebug ?? context?.debug ?? false;\n const log = useMemo(() => createLogger(debug), [debug]);\n const logRef = useRef(log);\n logRef.current = log;\n\n // State\n const [messages, setMessages] = useState<ChatMessage[]>([]);\n const [chatUid, setChatUid] = useState<string | null>(initialChatUid || null);\n const [isLoading, setIsLoading] = useState(false);\n const [status, setStatus] = useState<RealtimeStatus | 'idle'>('idle');\n const [error, setError] = useState<Error | null>(null);\n\n // Handoff state\n const [handedOff, setHandedOff] = useState(false);\n const [handedOffSubThreadId, setHandedOffSubThreadId] = useState<string | null>(null);\n const handoffPollRef = useRef<ReturnType<typeof setInterval> | null>(null);\n\n // Polling state\n const [shouldPoll, setShouldPoll] = useState(false);\n\n // Keep a ref to chatUid so async callbacks always read the latest value\n const chatUidRef = useRef(chatUid);\n chatUidRef.current = chatUid;\n\n // Refs for callbacks\n const onMessageReceivedRef = useRef(onMessageReceived);\n const onErrorRef = useRef(onError);\n const onChatCreatedRef = useRef(onChatCreated);\n\n useEffect(() => {\n onMessageReceivedRef.current = onMessageReceived;\n onErrorRef.current = onError;\n onChatCreatedRef.current = onChatCreated;\n });\n\n // Create API client\n const clientRef = useRef<DevicApiClient | null>(null);\n if (!clientRef.current && apiKey) {\n clientRef.current = new DevicApiClient({ apiKey, baseUrl });\n }\n\n // Update client config if it changes\n useEffect(() => {\n if (clientRef.current && apiKey) {\n clientRef.current.setConfig({ apiKey, baseUrl });\n }\n }, [apiKey, baseUrl]);\n\n // Resume chat state based on realtime status.\n // Called after loading chat history to detect in-progress conversations.\n const resumeFromRealtimeStatus = useCallback(\n async (targetChatUid: string) => {\n if (!clientRef.current) return;\n try {\n const realtime = await clientRef.current.getRealtimeHistory(assistantId, targetChatUid);\n logRef.current.log('[useDevicChat] resumeFromRealtimeStatus:', realtime.status);\n\n // Update messages with realtime data (may be fresher than static history)\n if (realtime.chatHistory?.length) {\n setMessages(realtime.chatHistory);\n }\n setStatus(realtime.status);\n\n if (realtime.status === 'processing') {\n // Chat is still processing — resume polling\n setIsLoading(true);\n setShouldPoll(true);\n } else if (realtime.status === 'waiting_for_tool_response') {\n // Chat is waiting for tool response — resume polling to trigger tool handling\n setIsLoading(true);\n setShouldPoll(true);\n } else if (realtime.status === 'handed_off') {\n // Chat has an active handoff\n setIsLoading(true);\n setHandedOff(true);\n const subThreadId = realtime.handedOffSubThreadId || null;\n logRef.current.log('[useDevicChat] Resuming handoff state:', { subThreadId });\n if (subThreadId) {\n setHandedOffSubThreadId(subThreadId);\n }\n } else {\n // completed or error — just stop\n setIsLoading(false);\n }\n } catch (err) {\n // If realtime fetch fails (e.g. chat has no realtime entry), just stay idle\n logRef.current.warn('[useDevicChat] resumeFromRealtimeStatus failed:', err);\n setIsLoading(false);\n }\n },\n [assistantId]\n );\n\n // Load initial chat history if chatUid prop is provided\n // This runs once on mount (or when initialChatUid changes) to fetch existing conversation\n const initialChatLoadedRef = useRef(false);\n useEffect(() => {\n if (initialChatUid && clientRef.current && !initialChatLoadedRef.current) {\n initialChatLoadedRef.current = true;\n\n const loadInitialChat = async () => {\n setIsLoading(true);\n setError(null);\n try {\n const history = await clientRef.current!.getChatHistory(\n assistantId,\n initialChatUid,\n { tenantId: resolvedTenantId }\n );\n setMessages(history.chatContent);\n setChatUid(initialChatUid);\n\n // Check realtime status to resume in-progress conversations\n await resumeFromRealtimeStatus(initialChatUid);\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n onErrorRef.current?.(error);\n setIsLoading(false);\n }\n };\n\n loadInitialChat();\n }\n }, [initialChatUid, assistantId, resolvedTenantId, resumeFromRealtimeStatus]);\n\n // Model interface hook\n const {\n toolSchemas,\n handleToolCalls,\n extractPendingToolCalls,\n } = useModelInterface({\n tools: modelInterfaceTools,\n onToolExecute: onToolCall,\n });\n\n // Polling hook - uses callbacks for side effects, return value not needed\n logRef.current.log('[useDevicChat] Render - shouldPoll:', shouldPoll, 'chatUid:', chatUid);\n usePolling(\n shouldPoll ? chatUid : null,\n async () => {\n logRef.current.log('[useDevicChat] fetchFn called, chatUid:', chatUid);\n if (!clientRef.current || !chatUid) {\n throw new Error('Cannot poll without client or chatUid');\n }\n const result = await clientRef.current.getRealtimeHistory(assistantId, chatUid);\n logRef.current.log('[useDevicChat] getRealtimeHistory result:', result);\n return result;\n },\n {\n interval: pollingInterval,\n enabled: shouldPoll,\n stopStatuses: ['completed', 'error', 'waiting_for_tool_response', 'handed_off'],\n onUpdate: async (data: RealtimeChatHistory) => {\n logRef.current.log('[useDevicChat] onUpdate called, status:', data.status);\n\n // Merge realtime data with optimistic messages\n setMessages((prev) => {\n const realtimeUIDs = new Set(data.chatHistory.map((m) => m.uid));\n const realtimeUserMessages = new Set(\n data.chatHistory\n .filter((m) => m.role === 'user')\n .map((m) => m.content?.message)\n );\n\n // Keep optimistic messages not yet in realtime data\n const optimistic = prev.filter((m) => {\n if (realtimeUIDs.has(m.uid)) return false;\n if (m.role === 'user' && realtimeUserMessages.has(m.content?.message)) return false;\n return true;\n });\n\n return [...data.chatHistory, ...optimistic];\n });\n setStatus(data.status);\n\n // Notify about new messages\n const lastMessage = data.chatHistory[data.chatHistory.length - 1];\n if (lastMessage && lastMessage.role === 'assistant') {\n onMessageReceivedRef.current?.(lastMessage);\n }\n\n // Handle model interface - check for pending tool calls\n if (data.status === 'waiting_for_tool_response' || data.pendingToolCalls?.length) {\n await handlePendingToolCalls(data);\n }\n },\n onStop: (data) => {\n logRef.current.log('[useDevicChat] onStop called, status:', data?.status);\n setShouldPoll(false);\n\n if (data?.status === 'error') {\n setIsLoading(false);\n const err = new Error('Chat processing failed');\n setError(err);\n onErrorRef.current?.(err);\n } else if (data?.status === 'completed') {\n setIsLoading(false);\n } else if (data?.status === 'handed_off') {\n // Subagent is working — keep isLoading true so the UI stays in loading state.\n // Set handoff state directly from the realtime status.\n setHandedOff(true);\n\n const subThreadId = data.handedOffSubThreadId || null;\n logRef.current.log('[useDevicChat] Handoff state set:', { handedOff: true, subThreadId });\n if (subThreadId) {\n setHandedOffSubThreadId(subThreadId);\n }\n }\n // Note: waiting_for_tool_response is handled in onUpdate to avoid double execution\n },\n onError: (err) => {\n logRef.current.error('[useDevicChat] onError called:', err);\n setError(err);\n setIsLoading(false);\n setShouldPoll(false);\n onErrorRef.current?.(err);\n },\n debug,\n }\n );\n\n // Handle pending tool calls from model interface\n const handlePendingToolCalls = useCallback(\n async (data: RealtimeChatHistory) => {\n if (!clientRef.current || !chatUid) return;\n\n // Get pending tool calls\n const pendingCalls = data.pendingToolCalls || extractPendingToolCalls(data.chatHistory);\n\n if (pendingCalls.length === 0) return;\n\n try {\n // Execute client-side tools\n const responses = await handleToolCalls(pendingCalls);\n\n if (responses.length > 0) {\n // Send tool responses back to the API\n await clientRef.current.sendToolResponses(assistantId, chatUid, responses);\n\n // Resume polling\n setShouldPoll(true);\n setIsLoading(true);\n }\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n onErrorRef.current?.(error);\n }\n },\n [chatUid, assistantId, handleToolCalls, extractPendingToolCalls]\n );\n\n // Send a message\n const sendMessage = useCallback(\n async (\n message: string,\n sendOptions?: {\n files?: File[];\n metadata?: Record<string, any>;\n }\n ) => {\n if (!clientRef.current) {\n const err = new Error(\n 'API client not configured. Please provide an API key.'\n );\n setError(err);\n onErrorRef.current?.(err);\n return;\n }\n\n setIsLoading(true);\n setError(null);\n setStatus('processing');\n\n // Add user message optimistically (show file names before upload)\n const userMessage: ChatMessage = {\n uid: `temp-${Date.now()}`,\n role: 'user',\n content: {\n message,\n files: sendOptions?.files?.map((f) => ({\n name: f.name,\n url: '',\n type: f.type.split('/')[0] || 'other',\n })),\n },\n timestamp: Date.now(),\n };\n\n setMessages((prev) => [...prev, userMessage]);\n onMessageSent?.(userMessage);\n\n try {\n // Upload files if provided\n let uploadedFiles: ChatFile[] | undefined;\n if (sendOptions?.files && sendOptions.files.length > 0) {\n logRef.current.log('[useDevicChat] Uploading files...');\n if (onFileUpload) {\n // Use custom upload handler\n uploadedFiles = await onFileUpload(sendOptions.files);\n } else {\n // Default: upload via Devic API\n const uploadResults = await Promise.all(\n sendOptions.files.map((file) => clientRef.current!.uploadFile(file))\n );\n uploadedFiles = uploadResults.map((r) => ({\n name: r.name,\n downloadUrl: r.downloadUrl,\n fileType: r.fileType as ChatFile['fileType'],\n }));\n }\n logRef.current.log('[useDevicChat] Files uploaded:', uploadedFiles);\n\n // Update optimistic message with download URLs\n setMessages((prev) =>\n prev.map((m) =>\n m.uid === userMessage.uid\n ? {\n ...m,\n content: {\n ...m.content,\n files: uploadedFiles!.map((f) => ({\n name: f.name,\n url: f.downloadUrl || '',\n type: f.fileType || 'other',\n })),\n },\n }\n : m\n )\n );\n }\n\n // Build request DTO\n const dto = {\n message,\n chatUid: chatUid || undefined,\n files: uploadedFiles,\n metadata: {\n ...resolvedTenantMetadata,\n ...sendOptions?.metadata,\n },\n tenantId: resolvedTenantId,\n enabledTools,\n // Include model interface tools if any\n ...(toolSchemas.length > 0 && { tools: toolSchemas }),\n };\n\n // Send message in async mode\n logRef.current.log('[useDevicChat] Sending message async...');\n const response = await clientRef.current.sendMessageAsync(assistantId, dto);\n logRef.current.log('[useDevicChat] sendMessageAsync response:', response);\n\n // Update chat UID if this is a new chat\n if (response.chatUid && response.chatUid !== chatUid) {\n logRef.current.log('[useDevicChat] Setting chatUid:', response.chatUid);\n setChatUid(response.chatUid);\n onChatCreatedRef.current?.(response.chatUid);\n }\n\n // Start polling for results\n logRef.current.log('[useDevicChat] Setting shouldPoll to true');\n setShouldPoll(true);\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n setIsLoading(false);\n setStatus('error');\n onErrorRef.current?.(error);\n\n // Remove optimistic user message on error\n setMessages((prev) => prev.filter((m) => m.uid !== userMessage.uid));\n }\n },\n [\n chatUid,\n assistantId,\n enabledTools,\n resolvedTenantId,\n resolvedTenantMetadata,\n toolSchemas,\n onMessageSent,\n onFileUpload,\n ]\n );\n\n // Clear chat\n const clearChat = useCallback(() => {\n setShouldPoll(false);\n setHandedOff(false);\n setHandedOffSubThreadId(null);\n if (handoffPollRef.current) {\n clearInterval(handoffPollRef.current);\n handoffPollRef.current = null;\n }\n setMessages([]);\n setChatUid(null);\n setIsLoading(false);\n setStatus('idle');\n setError(null);\n }, []);\n\n // Load existing chat\n const loadChat = useCallback(\n async (loadChatUid: string) => {\n if (!clientRef.current) {\n const err = new Error('API client not configured');\n setError(err);\n onErrorRef.current?.(err);\n return;\n }\n\n // Reset any active polling/handoff state from previous conversation\n setShouldPoll(false);\n setHandedOff(false);\n setHandedOffSubThreadId(null);\n if (handoffPollRef.current) {\n clearInterval(handoffPollRef.current);\n handoffPollRef.current = null;\n }\n\n setIsLoading(true);\n setError(null);\n\n try {\n const history = await clientRef.current.getChatHistory(\n assistantId,\n loadChatUid,\n { tenantId: resolvedTenantId }\n );\n\n setMessages(history.chatContent);\n setChatUid(loadChatUid);\n\n // Check realtime status to resume in-progress conversations\n await resumeFromRealtimeStatus(loadChatUid);\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n onErrorRef.current?.(error);\n setIsLoading(false);\n }\n },\n [assistantId, resolvedTenantId, resumeFromRealtimeStatus]\n );\n\n // Handoff polling: while handedOff is true, poll the realtime endpoint every 5s\n // to detect when the parent thread is no longer in handed_off state.\n useEffect(() => {\n if (!handedOff || !chatUid || !clientRef.current) return;\n\n const pollHandoff = async () => {\n try {\n const realtime = await clientRef.current!.getRealtimeHistory(assistantId, chatUid!);\n logRef.current.log('[useDevicChat] Handoff poll - realtime status:', realtime.status);\n if (realtime.status !== 'handed_off') {\n // Handoff completed — clear handoff state and resume main polling\n if (handoffPollRef.current) {\n clearInterval(handoffPollRef.current);\n handoffPollRef.current = null;\n }\n setHandedOff(false);\n setHandedOffSubThreadId(null);\n // Resume main polling to pick up the parent thread's continuation\n setShouldPoll(true);\n }\n } catch {}\n };\n\n handoffPollRef.current = setInterval(pollHandoff, 5000);\n return () => {\n if (handoffPollRef.current) {\n clearInterval(handoffPollRef.current);\n handoffPollRef.current = null;\n }\n };\n }, [handedOff, chatUid, assistantId]);\n\n // Called by HandoffSubagentWidget when the subthread reaches a terminal state\n const onHandoffCompleted = useCallback(() => {\n logRef.current.log('[useDevicChat] onHandoffCompleted called');\n // Clear the handoff polling\n if (handoffPollRef.current) {\n clearInterval(handoffPollRef.current);\n handoffPollRef.current = null;\n }\n // Clear handoff state and resume main polling\n setHandedOff(false);\n setHandedOffSubThreadId(null);\n setShouldPoll(true);\n }, []);\n\n // Stop current conversation — calls the server-side stop endpoint\n // then stops polling and resets loading state.\n const stopChat = useCallback(async () => {\n const uid = chatUidRef.current;\n logRef.current.log('[useDevicChat] stopChat called, chatUid:', uid);\n if (clientRef.current && uid) {\n try {\n await clientRef.current.stopChat(assistantId, uid);\n logRef.current.log('[useDevicChat] stopChat API call succeeded');\n } catch (err) {\n logRef.current.warn('[useDevicChat] stopChat API call failed:', err);\n }\n }\n setShouldPoll(false);\n setIsLoading(false);\n setStatus('idle');\n }, [assistantId]);\n\n return {\n messages,\n chatUid,\n isLoading,\n status,\n error,\n handedOff,\n handedOffSubThreadId,\n sendMessage,\n clearChat,\n loadChat,\n onHandoffCompleted,\n stopChat,\n };\n}\n"],"names":[],"mappings":";;;;;;;;AA2KA;;;;;;;;;;;;;;;;;;;;;AAqBG;AACG,SAAU,YAAY,CAAC,OAA4B,EAAA;IACvD,MAAM,EACJ,WAAW,EACX,OAAO,EAAE,cAAc,EACvB,MAAM,EAAE,WAAW,EACnB,OAAO,EAAE,YAAY,EACrB,QAAQ,EACR,cAAc,EACd,YAAY,EACZ,mBAAmB,GAAG,EAAE,EACxB,eAAe,GAAG,IAAI,EACtB,aAAa,EACb,iBAAiB,EACjB,UAAU,EACV,OAAO,EACP,aAAa,EACb,YAAY,EACZ,KAAK,EAAE,UAAU,GAClB,GAAG,OAAO;;AAGX,IAAA,MAAM,OAAO,GAAG,uBAAuB,EAAE;;AAGzC,IAAA,MAAM,MAAM,GAAG,WAAW,IAAI,OAAO,EAAE,MAAM;IAC7C,MAAM,OAAO,GAAG,YAAY,IAAI,OAAO,EAAE,OAAO,IAAI,sBAAsB;AAC1E,IAAA,MAAM,gBAAgB,GAAG,QAAQ,IAAI,OAAO,EAAE,QAAQ;IACtD,MAAM,sBAAsB,GAAG,EAAE,GAAG,OAAO,EAAE,cAAc,EAAE,GAAG,cAAc,EAAE;IAChF,MAAM,KAAK,GAAG,UAAU,IAAI,OAAO,EAAE,KAAK,IAAI,KAAK;AACnD,IAAA,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;AACvD,IAAA,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC;AAC1B,IAAA,MAAM,CAAC,OAAO,GAAG,GAAG;;IAGpB,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAgB,EAAE,CAAC;AAC3D,IAAA,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAgB,cAAc,IAAI,IAAI,CAAC;IAC7E,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC;IACjD,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAA0B,MAAM,CAAC;IACrE,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAe,IAAI,CAAC;;IAGtD,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC;IACjD,MAAM,CAAC,oBAAoB,EAAE,uBAAuB,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC;AACrF,IAAA,MAAM,cAAc,GAAG,MAAM,CAAwC,IAAI,CAAC;;IAG1E,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC;;AAGnD,IAAA,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC;AAClC,IAAA,UAAU,CAAC,OAAO,GAAG,OAAO;;AAG5B,IAAA,MAAM,oBAAoB,GAAG,MAAM,CAAC,iBAAiB,CAAC;AACtD,IAAA,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC;AAClC,IAAA,MAAM,gBAAgB,GAAG,MAAM,CAAC,aAAa,CAAC;IAE9C,SAAS,CAAC,MAAK;AACb,QAAA,oBAAoB,CAAC,OAAO,GAAG,iBAAiB;AAChD,QAAA,UAAU,CAAC,OAAO,GAAG,OAAO;AAC5B,QAAA,gBAAgB,CAAC,OAAO,GAAG,aAAa;AAC1C,IAAA,CAAC,CAAC;;AAGF,IAAA,MAAM,SAAS,GAAG,MAAM,CAAwB,IAAI,CAAC;AACrD,IAAA,IAAI,CAAC,SAAS,CAAC,OAAO,IAAI,MAAM,EAAE;AAChC,QAAA,SAAS,CAAC,OAAO,GAAG,IAAI,cAAc,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;IAC7D;;IAGA,SAAS,CAAC,MAAK;AACb,QAAA,IAAI,SAAS,CAAC,OAAO,IAAI,MAAM,EAAE;YAC/B,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;QAClD;AACF,IAAA,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;;;IAIrB,MAAM,wBAAwB,GAAG,WAAW,CAC1C,OAAO,aAAqB,KAAI;QAC9B,IAAI,CAAC,SAAS,CAAC,OAAO;YAAE;AACxB,QAAA,IAAI;AACF,YAAA,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,kBAAkB,CAAC,WAAW,EAAE,aAAa,CAAC;YACvF,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,0CAA0C,EAAE,QAAQ,CAAC,MAAM,CAAC;;AAG/E,YAAA,IAAI,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE;AAChC,gBAAA,WAAW,CAAC,QAAQ,CAAC,WAAW,CAAC;YACnC;AACA,YAAA,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC;AAE1B,YAAA,IAAI,QAAQ,CAAC,MAAM,KAAK,YAAY,EAAE;;gBAEpC,YAAY,CAAC,IAAI,CAAC;gBAClB,aAAa,CAAC,IAAI,CAAC;YACrB;AAAO,iBAAA,IAAI,QAAQ,CAAC,MAAM,KAAK,2BAA2B,EAAE;;gBAE1D,YAAY,CAAC,IAAI,CAAC;gBAClB,aAAa,CAAC,IAAI,CAAC;YACrB;AAAO,iBAAA,IAAI,QAAQ,CAAC,MAAM,KAAK,YAAY,EAAE;;gBAE3C,YAAY,CAAC,IAAI,CAAC;gBAClB,YAAY,CAAC,IAAI,CAAC;AAClB,gBAAA,MAAM,WAAW,GAAG,QAAQ,CAAC,oBAAoB,IAAI,IAAI;gBACzD,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,wCAAwC,EAAE,EAAE,WAAW,EAAE,CAAC;gBAC7E,IAAI,WAAW,EAAE;oBACf,uBAAuB,CAAC,WAAW,CAAC;gBACtC;YACF;iBAAO;;gBAEL,YAAY,CAAC,KAAK,CAAC;YACrB;QACF;QAAE,OAAO,GAAG,EAAE;;YAEZ,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,iDAAiD,EAAE,GAAG,CAAC;YAC3E,YAAY,CAAC,KAAK,CAAC;QACrB;AACF,IAAA,CAAC,EACD,CAAC,WAAW,CAAC,CACd;;;AAID,IAAA,MAAM,oBAAoB,GAAG,MAAM,CAAC,KAAK,CAAC;IAC1C,SAAS,CAAC,MAAK;QACb,IAAI,cAAc,IAAI,SAAS,CAAC,OAAO,IAAI,CAAC,oBAAoB,CAAC,OAAO,EAAE;AACxE,YAAA,oBAAoB,CAAC,OAAO,GAAG,IAAI;AAEnC,YAAA,MAAM,eAAe,GAAG,YAAW;gBACjC,YAAY,CAAC,IAAI,CAAC;gBAClB,QAAQ,CAAC,IAAI,CAAC;AACd,gBAAA,IAAI;AACF,oBAAA,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,OAAQ,CAAC,cAAc,CACrD,WAAW,EACX,cAAc,EACd,EAAE,QAAQ,EAAE,gBAAgB,EAAE,CAC/B;AACD,oBAAA,WAAW,CAAC,OAAO,CAAC,WAAW,CAAC;oBAChC,UAAU,CAAC,cAAc,CAAC;;AAG1B,oBAAA,MAAM,wBAAwB,CAAC,cAAc,CAAC;gBAChD;gBAAE,OAAO,GAAG,EAAE;oBACZ,MAAM,KAAK,GAAG,GAAG,YAAY,KAAK,GAAG,GAAG,GAAG,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;oBACjE,QAAQ,CAAC,KAAK,CAAC;AACf,oBAAA,UAAU,CAAC,OAAO,GAAG,KAAK,CAAC;oBAC3B,YAAY,CAAC,KAAK,CAAC;gBACrB;AACF,YAAA,CAAC;AAED,YAAA,eAAe,EAAE;QACnB;IACF,CAAC,EAAE,CAAC,cAAc,EAAE,WAAW,EAAE,gBAAgB,EAAE,wBAAwB,CAAC,CAAC;;IAG7E,MAAM,EACJ,WAAW,EACX,eAAe,EACf,uBAAuB,GACxB,GAAG,iBAAiB,CAAC;AACpB,QAAA,KAAK,EAAE,mBAAmB;AAC1B,QAAA,aAAa,EAAE,UAAU;AAC1B,KAAA,CAAC;;AAGF,IAAA,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,qCAAqC,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,CAAC;AAC1F,IAAA,UAAU,CACR,UAAU,GAAG,OAAO,GAAG,IAAI,EAC3B,YAAW;QACT,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,yCAAyC,EAAE,OAAO,CAAC;QACtE,IAAI,CAAC,SAAS,CAAC,OAAO,IAAI,CAAC,OAAO,EAAE;AAClC,YAAA,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC;QAC1D;AACA,QAAA,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,kBAAkB,CAAC,WAAW,EAAE,OAAO,CAAC;QAC/E,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,2CAA2C,EAAE,MAAM,CAAC;AACvE,QAAA,OAAO,MAAM;AACf,IAAA,CAAC,EACD;AACE,QAAA,QAAQ,EAAE,eAAe;AACzB,QAAA,OAAO,EAAE,UAAU;QACnB,YAAY,EAAE,CAAC,WAAW,EAAE,OAAO,EAAE,2BAA2B,EAAE,YAAY,CAAC;AAC/E,QAAA,QAAQ,EAAE,OAAO,IAAyB,KAAI;YAC5C,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,yCAAyC,EAAE,IAAI,CAAC,MAAM,CAAC;;AAG1E,YAAA,WAAW,CAAC,CAAC,IAAI,KAAI;gBACnB,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC;AAChE,gBAAA,MAAM,oBAAoB,GAAG,IAAI,GAAG,CAClC,IAAI,CAAC;qBACF,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,MAAM;AAC/B,qBAAA,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,CAClC;;gBAGD,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAI;AACnC,oBAAA,IAAI,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;AAAE,wBAAA,OAAO,KAAK;AACzC,oBAAA,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,oBAAoB,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC;AAAE,wBAAA,OAAO,KAAK;AACnF,oBAAA,OAAO,IAAI;AACb,gBAAA,CAAC,CAAC;gBAEF,OAAO,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE,GAAG,UAAU,CAAC;AAC7C,YAAA,CAAC,CAAC;AACF,YAAA,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC;;AAGtB,YAAA,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC;YACjE,IAAI,WAAW,IAAI,WAAW,CAAC,IAAI,KAAK,WAAW,EAAE;AACnD,gBAAA,oBAAoB,CAAC,OAAO,GAAG,WAAW,CAAC;YAC7C;;AAGA,YAAA,IAAI,IAAI,CAAC,MAAM,KAAK,2BAA2B,IAAI,IAAI,CAAC,gBAAgB,EAAE,MAAM,EAAE;AAChF,gBAAA,MAAM,sBAAsB,CAAC,IAAI,CAAC;YACpC;QACF,CAAC;AACD,QAAA,MAAM,EAAE,CAAC,IAAI,KAAI;YACf,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,uCAAuC,EAAE,IAAI,EAAE,MAAM,CAAC;YACzE,aAAa,CAAC,KAAK,CAAC;AAEpB,YAAA,IAAI,IAAI,EAAE,MAAM,KAAK,OAAO,EAAE;gBAC5B,YAAY,CAAC,KAAK,CAAC;AACnB,gBAAA,MAAM,GAAG,GAAG,IAAI,KAAK,CAAC,wBAAwB,CAAC;gBAC/C,QAAQ,CAAC,GAAG,CAAC;AACb,gBAAA,UAAU,CAAC,OAAO,GAAG,GAAG,CAAC;YAC3B;AAAO,iBAAA,IAAI,IAAI,EAAE,MAAM,KAAK,WAAW,EAAE;gBACvC,YAAY,CAAC,KAAK,CAAC;YACrB;AAAO,iBAAA,IAAI,IAAI,EAAE,MAAM,KAAK,YAAY,EAAE;;;gBAGxC,YAAY,CAAC,IAAI,CAAC;AAElB,gBAAA,MAAM,WAAW,GAAG,IAAI,CAAC,oBAAoB,IAAI,IAAI;AACrD,gBAAA,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,mCAAmC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;gBACzF,IAAI,WAAW,EAAE;oBACf,uBAAuB,CAAC,WAAW,CAAC;gBACtC;YACF;;QAEF,CAAC;AACD,QAAA,OAAO,EAAE,CAAC,GAAG,KAAI;YACf,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,gCAAgC,EAAE,GAAG,CAAC;YAC3D,QAAQ,CAAC,GAAG,CAAC;YACb,YAAY,CAAC,KAAK,CAAC;YACnB,aAAa,CAAC,KAAK,CAAC;AACpB,YAAA,UAAU,CAAC,OAAO,GAAG,GAAG,CAAC;QAC3B,CAAC;QACD,KAAK;AACN,KAAA,CACF;;IAGD,MAAM,sBAAsB,GAAG,WAAW,CACxC,OAAO,IAAyB,KAAI;AAClC,QAAA,IAAI,CAAC,SAAS,CAAC,OAAO,IAAI,CAAC,OAAO;YAAE;;AAGpC,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,gBAAgB,IAAI,uBAAuB,CAAC,IAAI,CAAC,WAAW,CAAC;AAEvF,QAAA,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC;YAAE;AAE/B,QAAA,IAAI;;AAEF,YAAA,MAAM,SAAS,GAAG,MAAM,eAAe,CAAC,YAAY,CAAC;AAErD,YAAA,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;;AAExB,gBAAA,MAAM,SAAS,CAAC,OAAO,CAAC,iBAAiB,CAAC,WAAW,EAAE,OAAO,EAAE,SAAS,CAAC;;gBAG1E,aAAa,CAAC,IAAI,CAAC;gBACnB,YAAY,CAAC,IAAI,CAAC;YACpB;QACF;QAAE,OAAO,GAAG,EAAE;YACZ,MAAM,KAAK,GAAG,GAAG,YAAY,KAAK,GAAG,GAAG,GAAG,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACjE,QAAQ,CAAC,KAAK,CAAC;AACf,YAAA,UAAU,CAAC,OAAO,GAAG,KAAK,CAAC;QAC7B;IACF,CAAC,EACD,CAAC,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,uBAAuB,CAAC,CACjE;;IAGD,MAAM,WAAW,GAAG,WAAW,CAC7B,OACE,OAAe,EACf,WAGC,KACC;AACF,QAAA,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE;AACtB,YAAA,MAAM,GAAG,GAAG,IAAI,KAAK,CACnB,uDAAuD,CACxD;YACD,QAAQ,CAAC,GAAG,CAAC;AACb,YAAA,UAAU,CAAC,OAAO,GAAG,GAAG,CAAC;YACzB;QACF;QAEA,YAAY,CAAC,IAAI,CAAC;QAClB,QAAQ,CAAC,IAAI,CAAC;QACd,SAAS,CAAC,YAAY,CAAC;;AAGvB,QAAA,MAAM,WAAW,GAAgB;AAC/B,YAAA,GAAG,EAAE,CAAA,KAAA,EAAQ,IAAI,CAAC,GAAG,EAAE,CAAA,CAAE;AACzB,YAAA,IAAI,EAAE,MAAM;AACZ,YAAA,OAAO,EAAE;gBACP,OAAO;AACP,gBAAA,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,MAAM;oBACrC,IAAI,EAAE,CAAC,CAAC,IAAI;AACZ,oBAAA,GAAG,EAAE,EAAE;AACP,oBAAA,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,OAAO;AACtC,iBAAA,CAAC,CAAC;AACJ,aAAA;AACD,YAAA,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB;AAED,QAAA,WAAW,CAAC,CAAC,IAAI,KAAK,CAAC,GAAG,IAAI,EAAE,WAAW,CAAC,CAAC;AAC7C,QAAA,aAAa,GAAG,WAAW,CAAC;AAE5B,QAAA,IAAI;;AAEF,YAAA,IAAI,aAAqC;AACzC,YAAA,IAAI,WAAW,EAAE,KAAK,IAAI,WAAW,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;AACtD,gBAAA,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC;gBACvD,IAAI,YAAY,EAAE;;oBAEhB,aAAa,GAAG,MAAM,YAAY,CAAC,WAAW,CAAC,KAAK,CAAC;gBACvD;qBAAO;;AAEL,oBAAA,MAAM,aAAa,GAAG,MAAM,OAAO,CAAC,GAAG,CACrC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,OAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CACrE;oBACD,aAAa,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM;wBACxC,IAAI,EAAE,CAAC,CAAC,IAAI;wBACZ,WAAW,EAAE,CAAC,CAAC,WAAW;wBAC1B,QAAQ,EAAE,CAAC,CAAC,QAAgC;AAC7C,qBAAA,CAAC,CAAC;gBACL;gBACA,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,gCAAgC,EAAE,aAAa,CAAC;;gBAGnE,WAAW,CAAC,CAAC,IAAI,KACf,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KACT,CAAC,CAAC,GAAG,KAAK,WAAW,CAAC;AACpB,sBAAE;AACE,wBAAA,GAAG,CAAC;AACJ,wBAAA,OAAO,EAAE;4BACP,GAAG,CAAC,CAAC,OAAO;4BACZ,KAAK,EAAE,aAAc,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM;gCAChC,IAAI,EAAE,CAAC,CAAC,IAAI;AACZ,gCAAA,GAAG,EAAE,CAAC,CAAC,WAAW,IAAI,EAAE;AACxB,gCAAA,IAAI,EAAE,CAAC,CAAC,QAAQ,IAAI,OAAO;AAC5B,6BAAA,CAAC,CAAC;AACJ,yBAAA;AACF;AACH,sBAAE,CAAC,CACN,CACF;YACH;;AAGA,YAAA,MAAM,GAAG,GAAG;gBACV,OAAO;gBACP,OAAO,EAAE,OAAO,IAAI,SAAS;AAC7B,gBAAA,KAAK,EAAE,aAAa;AACpB,gBAAA,QAAQ,EAAE;AACR,oBAAA,GAAG,sBAAsB;oBACzB,GAAG,WAAW,EAAE,QAAQ;AACzB,iBAAA;AACD,gBAAA,QAAQ,EAAE,gBAAgB;gBAC1B,YAAY;;AAEZ,gBAAA,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC;aACtD;;AAGD,YAAA,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC;AAC7D,YAAA,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,gBAAgB,CAAC,WAAW,EAAE,GAAG,CAAC;YAC3E,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,2CAA2C,EAAE,QAAQ,CAAC;;YAGzE,IAAI,QAAQ,CAAC,OAAO,IAAI,QAAQ,CAAC,OAAO,KAAK,OAAO,EAAE;gBACpD,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,iCAAiC,EAAE,QAAQ,CAAC,OAAO,CAAC;AACvE,gBAAA,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC;gBAC5B,gBAAgB,CAAC,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC;YAC9C;;AAGA,YAAA,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,2CAA2C,CAAC;YAC/D,aAAa,CAAC,IAAI,CAAC;QACrB;QAAE,OAAO,GAAG,EAAE;YACZ,MAAM,KAAK,GAAG,GAAG,YAAY,KAAK,GAAG,GAAG,GAAG,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACjE,QAAQ,CAAC,KAAK,CAAC;YACf,YAAY,CAAC,KAAK,CAAC;YACnB,SAAS,CAAC,OAAO,CAAC;AAClB,YAAA,UAAU,CAAC,OAAO,GAAG,KAAK,CAAC;;YAG3B,WAAW,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,KAAK,WAAW,CAAC,GAAG,CAAC,CAAC;QACtE;AACF,IAAA,CAAC,EACD;QACE,OAAO;QACP,WAAW;QACX,YAAY;QACZ,gBAAgB;QAChB,sBAAsB;QACtB,WAAW;QACX,aAAa;QACb,YAAY;AACb,KAAA,CACF;;AAGD,IAAA,MAAM,SAAS,GAAG,WAAW,CAAC,MAAK;QACjC,aAAa,CAAC,KAAK,CAAC;QACpB,YAAY,CAAC,KAAK,CAAC;QACnB,uBAAuB,CAAC,IAAI,CAAC;AAC7B,QAAA,IAAI,cAAc,CAAC,OAAO,EAAE;AAC1B,YAAA,aAAa,CAAC,cAAc,CAAC,OAAO,CAAC;AACrC,YAAA,cAAc,CAAC,OAAO,GAAG,IAAI;QAC/B;QACA,WAAW,CAAC,EAAE,CAAC;QACf,UAAU,CAAC,IAAI,CAAC;QAChB,YAAY,CAAC,KAAK,CAAC;QACnB,SAAS,CAAC,MAAM,CAAC;QACjB,QAAQ,CAAC,IAAI,CAAC;IAChB,CAAC,EAAE,EAAE,CAAC;;IAGN,MAAM,QAAQ,GAAG,WAAW,CAC1B,OAAO,WAAmB,KAAI;AAC5B,QAAA,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE;AACtB,YAAA,MAAM,GAAG,GAAG,IAAI,KAAK,CAAC,2BAA2B,CAAC;YAClD,QAAQ,CAAC,GAAG,CAAC;AACb,YAAA,UAAU,CAAC,OAAO,GAAG,GAAG,CAAC;YACzB;QACF;;QAGA,aAAa,CAAC,KAAK,CAAC;QACpB,YAAY,CAAC,KAAK,CAAC;QACnB,uBAAuB,CAAC,IAAI,CAAC;AAC7B,QAAA,IAAI,cAAc,CAAC,OAAO,EAAE;AAC1B,YAAA,aAAa,CAAC,cAAc,CAAC,OAAO,CAAC;AACrC,YAAA,cAAc,CAAC,OAAO,GAAG,IAAI;QAC/B;QAEA,YAAY,CAAC,IAAI,CAAC;QAClB,QAAQ,CAAC,IAAI,CAAC;AAEd,QAAA,IAAI;AACF,YAAA,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,cAAc,CACpD,WAAW,EACX,WAAW,EACX,EAAE,QAAQ,EAAE,gBAAgB,EAAE,CAC/B;AAED,YAAA,WAAW,CAAC,OAAO,CAAC,WAAW,CAAC;YAChC,UAAU,CAAC,WAAW,CAAC;;AAGvB,YAAA,MAAM,wBAAwB,CAAC,WAAW,CAAC;QAC7C;QAAE,OAAO,GAAG,EAAE;YACZ,MAAM,KAAK,GAAG,GAAG,YAAY,KAAK,GAAG,GAAG,GAAG,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACjE,QAAQ,CAAC,KAAK,CAAC;AACf,YAAA,UAAU,CAAC,OAAO,GAAG,KAAK,CAAC;YAC3B,YAAY,CAAC,KAAK,CAAC;QACrB;IACF,CAAC,EACD,CAAC,WAAW,EAAE,gBAAgB,EAAE,wBAAwB,CAAC,CAC1D;;;IAID,SAAS,CAAC,MAAK;QACb,IAAI,CAAC,SAAS,IAAI,CAAC,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO;YAAE;AAElD,QAAA,MAAM,WAAW,GAAG,YAAW;AAC7B,YAAA,IAAI;AACF,gBAAA,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,OAAQ,CAAC,kBAAkB,CAAC,WAAW,EAAE,OAAQ,CAAC;gBACnF,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,gDAAgD,EAAE,QAAQ,CAAC,MAAM,CAAC;AACrF,gBAAA,IAAI,QAAQ,CAAC,MAAM,KAAK,YAAY,EAAE;;AAEpC,oBAAA,IAAI,cAAc,CAAC,OAAO,EAAE;AAC1B,wBAAA,aAAa,CAAC,cAAc,CAAC,OAAO,CAAC;AACrC,wBAAA,cAAc,CAAC,OAAO,GAAG,IAAI;oBAC/B;oBACA,YAAY,CAAC,KAAK,CAAC;oBACnB,uBAAuB,CAAC,IAAI,CAAC;;oBAE7B,aAAa,CAAC,IAAI,CAAC;gBACrB;YACF;YAAE,MAAM,EAAC;AACX,QAAA,CAAC;QAED,cAAc,CAAC,OAAO,GAAG,WAAW,CAAC,WAAW,EAAE,IAAI,CAAC;AACvD,QAAA,OAAO,MAAK;AACV,YAAA,IAAI,cAAc,CAAC,OAAO,EAAE;AAC1B,gBAAA,aAAa,CAAC,cAAc,CAAC,OAAO,CAAC;AACrC,gBAAA,cAAc,CAAC,OAAO,GAAG,IAAI;YAC/B;AACF,QAAA,CAAC;IACH,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;;AAGrC,IAAA,MAAM,kBAAkB,GAAG,WAAW,CAAC,MAAK;AAC1C,QAAA,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC;;AAE9D,QAAA,IAAI,cAAc,CAAC,OAAO,EAAE;AAC1B,YAAA,aAAa,CAAC,cAAc,CAAC,OAAO,CAAC;AACrC,YAAA,cAAc,CAAC,OAAO,GAAG,IAAI;QAC/B;;QAEA,YAAY,CAAC,KAAK,CAAC;QACnB,uBAAuB,CAAC,IAAI,CAAC;QAC7B,aAAa,CAAC,IAAI,CAAC;IACrB,CAAC,EAAE,EAAE,CAAC;;;AAIN,IAAA,MAAM,QAAQ,GAAG,WAAW,CAAC,YAAW;AACtC,QAAA,MAAM,GAAG,GAAG,UAAU,CAAC,OAAO;QAC9B,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,0CAA0C,EAAE,GAAG,CAAC;AACnE,QAAA,IAAI,SAAS,CAAC,OAAO,IAAI,GAAG,EAAE;AAC5B,YAAA,IAAI;gBACF,MAAM,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,WAAW,EAAE,GAAG,CAAC;AAClD,gBAAA,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC;YAClE;YAAE,OAAO,GAAG,EAAE;gBACZ,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,0CAA0C,EAAE,GAAG,CAAC;YACtE;QACF;QACA,aAAa,CAAC,KAAK,CAAC;QACpB,YAAY,CAAC,KAAK,CAAC;QACnB,SAAS,CAAC,MAAM,CAAC;AACnB,IAAA,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC;IAEjB,OAAO;QACL,QAAQ;QACR,OAAO;QACP,SAAS;QACT,MAAM;QACN,KAAK;QACL,SAAS;QACT,oBAAoB;QACpB,WAAW;QACX,SAAS;QACT,QAAQ;QACR,kBAAkB;QAClB,QAAQ;KACT;AACH;;;;"}