@agent-native/core 0.12.25 → 0.12.27
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent/production-agent.d.ts.map +1 -1
- package/dist/agent/production-agent.js +20 -2
- package/dist/agent/production-agent.js.map +1 -1
- package/dist/client/AgentTaskCard.d.ts.map +1 -1
- package/dist/client/AgentTaskCard.js +16 -3
- package/dist/client/AgentTaskCard.js.map +1 -1
- package/dist/client/AssistantChat.d.ts.map +1 -1
- package/dist/client/AssistantChat.js +22 -12
- package/dist/client/AssistantChat.js.map +1 -1
- package/dist/client/IframeEmbed.d.ts.map +1 -1
- package/dist/client/IframeEmbed.js +2 -2
- package/dist/client/IframeEmbed.js.map +1 -1
- package/dist/client/agent-chat-adapter.d.ts.map +1 -1
- package/dist/client/agent-chat-adapter.js +62 -9
- package/dist/client/agent-chat-adapter.js.map +1 -1
- package/dist/client/composer/ComposerPlusMenu.d.ts.map +1 -1
- package/dist/client/composer/ComposerPlusMenu.js +1 -1
- package/dist/client/composer/ComposerPlusMenu.js.map +1 -1
- package/dist/client/composer/PromptComposer.d.ts.map +1 -1
- package/dist/client/composer/PromptComposer.js +8 -7
- package/dist/client/composer/PromptComposer.js.map +1 -1
- package/dist/client/composer/attachment-accept.d.ts +7 -0
- package/dist/client/composer/attachment-accept.d.ts.map +1 -0
- package/dist/client/composer/attachment-accept.js +36 -0
- package/dist/client/composer/attachment-accept.js.map +1 -0
- package/dist/client/sse-event-processor.d.ts.map +1 -1
- package/dist/client/sse-event-processor.js +8 -0
- package/dist/client/sse-event-processor.js.map +1 -1
- package/dist/db/client.d.ts +3 -0
- package/dist/db/client.d.ts.map +1 -1
- package/dist/db/client.js +70 -34
- package/dist/db/client.js.map +1 -1
- package/dist/db/create-get-db.d.ts.map +1 -1
- package/dist/db/create-get-db.js +30 -7
- package/dist/db/create-get-db.js.map +1 -1
- package/dist/deploy/build.js +64 -0
- package/dist/deploy/build.js.map +1 -1
- package/dist/scripts/db/exec.d.ts.map +1 -1
- package/dist/scripts/db/exec.js +3 -6
- package/dist/scripts/db/exec.js.map +1 -1
- package/dist/scripts/db/patch.d.ts.map +1 -1
- package/dist/scripts/db/patch.js +3 -6
- package/dist/scripts/db/patch.js.map +1 -1
- package/dist/scripts/db/query.d.ts.map +1 -1
- package/dist/scripts/db/query.js +3 -6
- package/dist/scripts/db/query.js.map +1 -1
- package/dist/scripts/db/schema.d.ts.map +1 -1
- package/dist/scripts/db/schema.js +3 -6
- package/dist/scripts/db/schema.js.map +1 -1
- package/dist/scripts/db/sqlite-client.d.ts +15 -0
- package/dist/scripts/db/sqlite-client.d.ts.map +1 -0
- package/dist/scripts/db/sqlite-client.js +51 -0
- package/dist/scripts/db/sqlite-client.js.map +1 -0
- package/dist/server/better-auth-instance.js +4 -3
- package/dist/server/better-auth-instance.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AgentTaskCard.d.ts","sourceRoot":"","sources":["../../src/client/AgentTaskCard.tsx"],"names":[],"mappings":"AAcA,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;CACrC;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,EAC5B,MAAM,EACN,QAAQ,EACR,WAAW,EACX,MAAM,GACP,EAAE,kBAAkB,
|
|
1
|
+
{"version":3,"file":"AgentTaskCard.d.ts","sourceRoot":"","sources":["../../src/client/AgentTaskCard.tsx"],"names":[],"mappings":"AAcA,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;CACrC;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,EAC5B,MAAM,EACN,QAAQ,EACR,WAAW,EACX,MAAM,GACP,EAAE,kBAAkB,2CAiPpB"}
|
|
@@ -136,14 +136,27 @@ export function AgentTaskCard({ taskId, threadId, description, onOpen, }) {
|
|
|
136
136
|
const isRunning = status === "running";
|
|
137
137
|
const isComplete = status === "completed";
|
|
138
138
|
const isError = status === "errored";
|
|
139
|
+
const taskTitle = description.trim() || "Task";
|
|
140
|
+
const currentStepText = currentStep.trim();
|
|
141
|
+
const statusLabel = isRunning ? "Running" : isError ? "Error" : "Done";
|
|
142
|
+
const statusClassName = cn("inline-flex h-5 shrink-0 items-center gap-1 rounded-md px-1.5 text-[10px] font-medium", isError
|
|
143
|
+
? "bg-destructive/10 text-destructive"
|
|
144
|
+
: isComplete
|
|
145
|
+
? "bg-emerald-500/10 text-emerald-600 dark:text-emerald-400"
|
|
146
|
+
: "bg-muted text-muted-foreground");
|
|
139
147
|
const displayText = isComplete && summary ? summary : preview;
|
|
140
148
|
const hasContent = displayText.length > 0;
|
|
141
|
-
|
|
149
|
+
const emptyMessage = isRunning
|
|
150
|
+
? "Waiting for updates"
|
|
151
|
+
: isError
|
|
152
|
+
? "No error details yet"
|
|
153
|
+
: "No summary available";
|
|
154
|
+
return (_jsxs("div", { className: cn("my-2 overflow-hidden rounded-lg border bg-background/50 transition-colors", isError
|
|
142
155
|
? "border-destructive/30"
|
|
143
156
|
: isComplete
|
|
144
157
|
? "border-emerald-500/20"
|
|
145
|
-
: "border-border"), children: [_jsxs("
|
|
158
|
+
: "border-border"), children: [_jsxs("button", { type: "button", "aria-expanded": expanded, className: "flex w-full items-center gap-2 px-3 py-2 text-left transition-colors hover:bg-muted/45", onClick: () => setExpanded(!expanded), children: [_jsxs("span", { className: "inline-flex h-5 shrink-0 items-center gap-1 rounded-md border border-border/60 bg-background/70 px-1.5 text-[10px] font-medium text-muted-foreground", children: [_jsx(IconSubtask, { className: "h-3 w-3" }), "Sub-agent"] }), _jsx("span", { className: "min-w-0 flex-1 truncate text-xs font-medium text-foreground", children: taskTitle }), _jsxs("span", { className: statusClassName, children: [isRunning ? (_jsx(IconLoader2, { className: "h-3 w-3 animate-spin" })) : isError ? (_jsx(IconAlertCircle, { className: "h-3 w-3" })) : (_jsx(IconCheck, { className: "h-3 w-3" })), statusLabel] }), _jsx(IconChevronRight, { className: cn("h-3 w-3 shrink-0 text-muted-foreground/40 transition-transform duration-150", expanded && "rotate-90") })] }), expanded && isRunning && currentStepText && (_jsxs("div", { className: "flex gap-1.5 border-t border-border/60 px-3 py-1.5 text-[11px] text-muted-foreground", children: [_jsx("span", { className: "shrink-0 font-medium text-foreground/70", children: "Now:" }), _jsx("span", { className: "min-w-0 break-words", children: currentStepText })] })), expanded && hasContent && (_jsx("div", { className: "px-3 pb-2 pt-1", children: _jsx("div", { ref: previewRef, className: "agent-markdown prose prose-sm prose-invert max-h-48 max-w-none overflow-y-auto break-words rounded-md border border-border/50 bg-muted/25 px-3 py-2 text-xs text-muted-foreground", children: _jsx(ReactMarkdown, { remarkPlugins: [remarkGfm], children: displayText.length > 800
|
|
146
159
|
? "..." + displayText.slice(-800)
|
|
147
|
-
: displayText }) }) })), expanded && (_jsxs("div", { className: "flex items-center justify-between px-3 pb-2", children: [
|
|
160
|
+
: displayText }) }) })), expanded && (_jsxs("div", { className: "flex items-center justify-between gap-2 px-3 pb-2", children: [_jsx("span", { className: "min-w-0 flex-1 truncate text-[10px] text-muted-foreground/60", children: !hasContent ? emptyMessage : "" }), _jsxs("button", { onClick: handleOpen, className: "inline-flex shrink-0 items-center gap-1 rounded-md px-2 py-1 text-[11px] font-medium text-muted-foreground hover:bg-muted hover:text-foreground", children: ["Open thread", _jsx(IconExternalLink, { className: "h-3 w-3" })] })] }))] }));
|
|
148
161
|
}
|
|
149
162
|
//# sourceMappingURL=AgentTaskCard.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AgentTaskCard.js","sourceRoot":"","sources":["../../src/client/AgentTaskCard.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useState, useEffect, useRef, useCallback } from \"react\";\nimport ReactMarkdown from \"react-markdown\";\nimport remarkGfm from \"remark-gfm\";\nimport {\n IconLoader2,\n IconCheck,\n IconChevronRight,\n IconExternalLink,\n IconAlertCircle,\n IconSubtask,\n} from \"@tabler/icons-react\";\nimport { cn } from \"./utils.js\";\nimport { agentNativePath } from \"./api-path.js\";\n\nexport interface AgentTaskCardProps {\n taskId: string;\n threadId: string;\n description: string;\n onOpen?: (threadId: string) => void;\n}\n\n/**\n * Rich preview card for a sub-agent task. Listens for agent-task-event\n * CustomEvents to update its state in real-time.\n */\nexport function AgentTaskCard({\n taskId,\n threadId,\n description,\n onOpen,\n}: AgentTaskCardProps) {\n const [expanded, setExpanded] = useState(true);\n const [status, setStatus] = useState<\"running\" | \"completed\" | \"errored\">(\n \"running\",\n );\n const [preview, setPreview] = useState(\"\");\n const [currentStep, setCurrentStep] = useState(\"\");\n const [summary, setSummary] = useState(\"\");\n const previewRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n function handleEvent(e: Event) {\n const detail = (e as CustomEvent).detail;\n if (!detail?.taskId || detail.taskId !== taskId) return;\n\n if (detail.type === \"agent_task_update\") {\n if (detail.preview != null) setPreview(detail.preview);\n if (detail.currentStep != null) setCurrentStep(detail.currentStep);\n } else if (detail.type === \"agent_task_complete\") {\n setStatus(\"completed\");\n if (detail.summary) setSummary(detail.summary);\n setCurrentStep(\"\");\n } else if (detail.type === \"agent_task\" && detail.status === \"errored\") {\n setStatus(\"errored\");\n setCurrentStep(\"\");\n }\n }\n\n window.addEventListener(\"agent-task-event\", handleEvent);\n return () => window.removeEventListener(\"agent-task-event\", handleEvent);\n }, [taskId]);\n\n // Poll for task status when running — the main chat's SSE stream may close\n // before the sub-agent completes, so SSE events alone aren't reliable.\n useEffect(() => {\n if (status !== \"running\") return;\n let stopped = false;\n let pollCount = 0;\n const poll = async () => {\n while (!stopped) {\n await new Promise((r) => setTimeout(r, 3000));\n if (stopped) break;\n pollCount++;\n try {\n const res = await fetch(\n agentNativePath(\n `/_agent-native/application-state/agent-task:${taskId}`,\n ),\n );\n if (!res.ok) continue;\n const data = await res.json();\n // The HTTP handler returns the value directly (not wrapped)\n const task = data?.value ?? data;\n if (!task || !task.status) continue;\n if (task.status === \"completed\") {\n setStatus(\"completed\");\n if (task.summary) setSummary(task.summary);\n if (task.preview) setPreview(task.preview);\n setCurrentStep(\"\");\n break;\n } else if (task.status === \"errored\") {\n setStatus(\"errored\");\n if (task.summary) setSummary(task.summary);\n setCurrentStep(\"\");\n break;\n } else {\n // Still running — update preview from persisted state\n if (task.preview) setPreview(task.preview);\n if (task.currentStep) setCurrentStep(task.currentStep);\n }\n\n // Fallback: every 5th poll, check if the sub-agent's run is still\n // active. If it's gone (completed without updating app-state), mark\n // the task as completed so the card doesn't spin forever.\n if (pollCount % 5 === 0) {\n try {\n const runRes = await fetch(\n agentNativePath(\n `/_agent-native/agent-chat/runs/active?threadId=${encodeURIComponent(threadId)}`,\n ),\n );\n if (runRes.ok) {\n const runData = await runRes.json();\n // null or non-running status means the run finished\n if (\n !runData ||\n runData.active === false ||\n (runData.status && runData.status !== \"running\") ||\n runData.status === \"completed\" ||\n runData.status === \"errored\"\n ) {\n const finalStatus =\n runData?.status === \"errored\" ? \"errored\" : \"completed\";\n setStatus(finalStatus);\n setCurrentStep(\"\");\n setSummary(\n (prev) => prev || task?.preview || \"Task completed.\",\n );\n break;\n }\n }\n } catch {\n // Fallback check failed — continue normal polling\n }\n }\n } catch {\n // Polling error — continue\n }\n }\n };\n poll();\n return () => {\n stopped = true;\n };\n }, [status, taskId, threadId]);\n\n // Auto-scroll preview to bottom\n useEffect(() => {\n if (previewRef.current && status === \"running\") {\n previewRef.current.scrollTop = previewRef.current.scrollHeight;\n }\n }, [preview, status]);\n\n const handleOpen = useCallback(\n (e: React.MouseEvent) => {\n e.stopPropagation();\n onOpen?.(threadId);\n },\n [onOpen, threadId],\n );\n\n const isRunning = status === \"running\";\n const isComplete = status === \"completed\";\n const isError = status === \"errored\";\n\n const displayText = isComplete && summary ? summary : preview;\n const hasContent = displayText.length > 0;\n\n return (\n <div\n className={cn(\n \"my-2 rounded-lg border overflow-hidden transition-colors\",\n isError\n ? \"border-destructive/30\"\n : isComplete\n ? \"border-emerald-500/20\"\n : \"border-border\",\n )}\n >\n {/* Header */}\n <div\n className=\"flex items-center gap-2 px-3 py-2.5 cursor-pointer select-none hover:bg-muted/50\"\n onClick={() => setExpanded(!expanded)}\n >\n <span className=\"shrink-0\">\n {isRunning ? (\n <IconLoader2 className=\"h-3.5 w-3.5 animate-spin text-muted-foreground\" />\n ) : isError ? (\n <IconAlertCircle className=\"h-3.5 w-3.5 text-destructive\" />\n ) : (\n <IconCheck className=\"h-3.5 w-3.5 text-emerald-500\" />\n )}\n </span>\n\n <IconSubtask className=\"h-3.5 w-3.5 text-muted-foreground/60 shrink-0\" />\n\n <span className=\"text-xs font-medium truncate min-w-0 flex-1\">\n {description}\n </span>\n\n {currentStep && isRunning && (\n <span className=\"text-[10px] text-muted-foreground/70 truncate max-w-[180px] shrink-0\">\n {currentStep}\n </span>\n )}\n\n {isComplete && (\n <span className=\"text-[10px] text-emerald-500/70 shrink-0\">Done</span>\n )}\n\n <IconChevronRight\n className={cn(\n \"h-3 w-3 shrink-0 text-muted-foreground/40 transition-transform duration-150\",\n expanded && \"rotate-90\",\n )}\n />\n </div>\n\n {/* Preview content */}\n {expanded && hasContent && (\n <div className=\"px-3 pb-2\">\n <div\n ref={previewRef}\n className=\"rounded-md bg-muted/30 px-3 py-2 text-xs text-muted-foreground break-words max-h-48 overflow-y-auto agent-markdown prose prose-sm prose-invert max-w-none\"\n >\n <ReactMarkdown remarkPlugins={[remarkGfm]}>\n {displayText.length > 800\n ? \"...\" + displayText.slice(-800)\n : displayText}\n </ReactMarkdown>\n </div>\n </div>\n )}\n\n {/* Footer with Open button */}\n {expanded && (\n <div className=\"flex items-center justify-between px-3 pb-2\">\n {isRunning && !hasContent && (\n <span className=\"text-[10px] text-muted-foreground/50\">\n Working...\n </span>\n )}\n {!isRunning && !hasContent && <span />}\n {hasContent && <span />}\n <button\n onClick={handleOpen}\n className=\"inline-flex items-center gap-1 rounded-md px-2 py-1 text-[11px] font-medium text-muted-foreground hover:text-foreground hover:bg-muted\"\n >\n Open\n <IconExternalLink className=\"h-3 w-3\" />\n </button>\n </div>\n )}\n </div>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"file":"AgentTaskCard.js","sourceRoot":"","sources":["../../src/client/AgentTaskCard.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useState, useEffect, useRef, useCallback } from \"react\";\nimport ReactMarkdown from \"react-markdown\";\nimport remarkGfm from \"remark-gfm\";\nimport {\n IconLoader2,\n IconCheck,\n IconChevronRight,\n IconExternalLink,\n IconAlertCircle,\n IconSubtask,\n} from \"@tabler/icons-react\";\nimport { cn } from \"./utils.js\";\nimport { agentNativePath } from \"./api-path.js\";\n\nexport interface AgentTaskCardProps {\n taskId: string;\n threadId: string;\n description: string;\n onOpen?: (threadId: string) => void;\n}\n\n/**\n * Rich preview card for a sub-agent task. Listens for agent-task-event\n * CustomEvents to update its state in real-time.\n */\nexport function AgentTaskCard({\n taskId,\n threadId,\n description,\n onOpen,\n}: AgentTaskCardProps) {\n const [expanded, setExpanded] = useState(true);\n const [status, setStatus] = useState<\"running\" | \"completed\" | \"errored\">(\n \"running\",\n );\n const [preview, setPreview] = useState(\"\");\n const [currentStep, setCurrentStep] = useState(\"\");\n const [summary, setSummary] = useState(\"\");\n const previewRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n function handleEvent(e: Event) {\n const detail = (e as CustomEvent).detail;\n if (!detail?.taskId || detail.taskId !== taskId) return;\n\n if (detail.type === \"agent_task_update\") {\n if (detail.preview != null) setPreview(detail.preview);\n if (detail.currentStep != null) setCurrentStep(detail.currentStep);\n } else if (detail.type === \"agent_task_complete\") {\n setStatus(\"completed\");\n if (detail.summary) setSummary(detail.summary);\n setCurrentStep(\"\");\n } else if (detail.type === \"agent_task\" && detail.status === \"errored\") {\n setStatus(\"errored\");\n setCurrentStep(\"\");\n }\n }\n\n window.addEventListener(\"agent-task-event\", handleEvent);\n return () => window.removeEventListener(\"agent-task-event\", handleEvent);\n }, [taskId]);\n\n // Poll for task status when running — the main chat's SSE stream may close\n // before the sub-agent completes, so SSE events alone aren't reliable.\n useEffect(() => {\n if (status !== \"running\") return;\n let stopped = false;\n let pollCount = 0;\n const poll = async () => {\n while (!stopped) {\n await new Promise((r) => setTimeout(r, 3000));\n if (stopped) break;\n pollCount++;\n try {\n const res = await fetch(\n agentNativePath(\n `/_agent-native/application-state/agent-task:${taskId}`,\n ),\n );\n if (!res.ok) continue;\n const data = await res.json();\n // The HTTP handler returns the value directly (not wrapped)\n const task = data?.value ?? data;\n if (!task || !task.status) continue;\n if (task.status === \"completed\") {\n setStatus(\"completed\");\n if (task.summary) setSummary(task.summary);\n if (task.preview) setPreview(task.preview);\n setCurrentStep(\"\");\n break;\n } else if (task.status === \"errored\") {\n setStatus(\"errored\");\n if (task.summary) setSummary(task.summary);\n setCurrentStep(\"\");\n break;\n } else {\n // Still running — update preview from persisted state\n if (task.preview) setPreview(task.preview);\n if (task.currentStep) setCurrentStep(task.currentStep);\n }\n\n // Fallback: every 5th poll, check if the sub-agent's run is still\n // active. If it's gone (completed without updating app-state), mark\n // the task as completed so the card doesn't spin forever.\n if (pollCount % 5 === 0) {\n try {\n const runRes = await fetch(\n agentNativePath(\n `/_agent-native/agent-chat/runs/active?threadId=${encodeURIComponent(threadId)}`,\n ),\n );\n if (runRes.ok) {\n const runData = await runRes.json();\n // null or non-running status means the run finished\n if (\n !runData ||\n runData.active === false ||\n (runData.status && runData.status !== \"running\") ||\n runData.status === \"completed\" ||\n runData.status === \"errored\"\n ) {\n const finalStatus =\n runData?.status === \"errored\" ? \"errored\" : \"completed\";\n setStatus(finalStatus);\n setCurrentStep(\"\");\n setSummary(\n (prev) => prev || task?.preview || \"Task completed.\",\n );\n break;\n }\n }\n } catch {\n // Fallback check failed — continue normal polling\n }\n }\n } catch {\n // Polling error — continue\n }\n }\n };\n poll();\n return () => {\n stopped = true;\n };\n }, [status, taskId, threadId]);\n\n // Auto-scroll preview to bottom\n useEffect(() => {\n if (previewRef.current && status === \"running\") {\n previewRef.current.scrollTop = previewRef.current.scrollHeight;\n }\n }, [preview, status]);\n\n const handleOpen = useCallback(\n (e: React.MouseEvent) => {\n e.stopPropagation();\n onOpen?.(threadId);\n },\n [onOpen, threadId],\n );\n\n const isRunning = status === \"running\";\n const isComplete = status === \"completed\";\n const isError = status === \"errored\";\n\n const taskTitle = description.trim() || \"Task\";\n const currentStepText = currentStep.trim();\n const statusLabel = isRunning ? \"Running\" : isError ? \"Error\" : \"Done\";\n const statusClassName = cn(\n \"inline-flex h-5 shrink-0 items-center gap-1 rounded-md px-1.5 text-[10px] font-medium\",\n isError\n ? \"bg-destructive/10 text-destructive\"\n : isComplete\n ? \"bg-emerald-500/10 text-emerald-600 dark:text-emerald-400\"\n : \"bg-muted text-muted-foreground\",\n );\n\n const displayText = isComplete && summary ? summary : preview;\n const hasContent = displayText.length > 0;\n const emptyMessage = isRunning\n ? \"Waiting for updates\"\n : isError\n ? \"No error details yet\"\n : \"No summary available\";\n\n return (\n <div\n className={cn(\n \"my-2 overflow-hidden rounded-lg border bg-background/50 transition-colors\",\n isError\n ? \"border-destructive/30\"\n : isComplete\n ? \"border-emerald-500/20\"\n : \"border-border\",\n )}\n >\n {/* Header */}\n <button\n type=\"button\"\n aria-expanded={expanded}\n className=\"flex w-full items-center gap-2 px-3 py-2 text-left transition-colors hover:bg-muted/45\"\n onClick={() => setExpanded(!expanded)}\n >\n <span className=\"inline-flex h-5 shrink-0 items-center gap-1 rounded-md border border-border/60 bg-background/70 px-1.5 text-[10px] font-medium text-muted-foreground\">\n <IconSubtask className=\"h-3 w-3\" />\n Sub-agent\n </span>\n\n <span className=\"min-w-0 flex-1 truncate text-xs font-medium text-foreground\">\n {taskTitle}\n </span>\n\n <span className={statusClassName}>\n {isRunning ? (\n <IconLoader2 className=\"h-3 w-3 animate-spin\" />\n ) : isError ? (\n <IconAlertCircle className=\"h-3 w-3\" />\n ) : (\n <IconCheck className=\"h-3 w-3\" />\n )}\n {statusLabel}\n </span>\n\n <IconChevronRight\n className={cn(\n \"h-3 w-3 shrink-0 text-muted-foreground/40 transition-transform duration-150\",\n expanded && \"rotate-90\",\n )}\n />\n </button>\n\n {expanded && isRunning && currentStepText && (\n <div className=\"flex gap-1.5 border-t border-border/60 px-3 py-1.5 text-[11px] text-muted-foreground\">\n <span className=\"shrink-0 font-medium text-foreground/70\">Now:</span>\n <span className=\"min-w-0 break-words\">{currentStepText}</span>\n </div>\n )}\n\n {/* Preview content */}\n {expanded && hasContent && (\n <div className=\"px-3 pb-2 pt-1\">\n <div\n ref={previewRef}\n className=\"agent-markdown prose prose-sm prose-invert max-h-48 max-w-none overflow-y-auto break-words rounded-md border border-border/50 bg-muted/25 px-3 py-2 text-xs text-muted-foreground\"\n >\n <ReactMarkdown remarkPlugins={[remarkGfm]}>\n {displayText.length > 800\n ? \"...\" + displayText.slice(-800)\n : displayText}\n </ReactMarkdown>\n </div>\n </div>\n )}\n\n {/* Footer with Open button */}\n {expanded && (\n <div className=\"flex items-center justify-between gap-2 px-3 pb-2\">\n <span className=\"min-w-0 flex-1 truncate text-[10px] text-muted-foreground/60\">\n {!hasContent ? emptyMessage : \"\"}\n </span>\n <button\n onClick={handleOpen}\n className=\"inline-flex shrink-0 items-center gap-1 rounded-md px-2 py-1 text-[11px] font-medium text-muted-foreground hover:bg-muted hover:text-foreground\"\n >\n Open thread\n <IconExternalLink className=\"h-3 w-3\" />\n </button>\n </div>\n )}\n </div>\n );\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AssistantChat.d.ts","sourceRoot":"","sources":["../../src/client/AssistantChat.tsx"],"names":[],"mappings":"AAAA,OAAO,KAQN,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"AssistantChat.d.ts","sourceRoot":"","sources":["../../src/client/AssistantChat.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
2
|
import React, { useState, useRef, useEffect, useCallback, useMemo, forwardRef, useImperativeHandle, } from "react";
|
|
3
3
|
import { AssistantRuntimeProvider, useLocalRuntime, useThreadRuntime, useThread, useAui, useComposer, useMessageRuntime, ThreadPrimitive, ComposerPrimitive, MessagePrimitive, } from "@assistant-ui/react";
|
|
4
|
-
import { SimpleImageAttachmentAdapter,
|
|
4
|
+
import { SimpleImageAttachmentAdapter, CompositeAttachmentAdapter, } from "@assistant-ui/react";
|
|
5
5
|
import { MarkdownTextPrimitive } from "@assistant-ui/react-markdown";
|
|
6
6
|
import ReactMarkdown from "react-markdown";
|
|
7
7
|
import remarkGfm from "remark-gfm";
|
|
@@ -9,6 +9,7 @@ import { createAgentChatAdapter } from "./agent-chat-adapter.js";
|
|
|
9
9
|
import { getActiveRun } from "./active-run-state.js";
|
|
10
10
|
import { AgentAutoContinueSignal, readSSEStreamRaw, } from "./sse-event-processor.js";
|
|
11
11
|
import { cn } from "./utils.js";
|
|
12
|
+
import { TextAttachmentAdapter } from "./composer/attachment-accept.js";
|
|
12
13
|
import { AgentTaskCard } from "./AgentTaskCard.js";
|
|
13
14
|
import { ConnectBuilderCard } from "./ConnectBuilderCard.js";
|
|
14
15
|
import { useBuilderConnectFlow } from "./settings/useBuilderStatus.js";
|
|
@@ -18,13 +19,11 @@ import { IframeEmbed, parseEmbedBody } from "./IframeEmbed.js";
|
|
|
18
19
|
import { useDevMode } from "./use-dev-mode.js";
|
|
19
20
|
import { agentNativePath } from "./api-path.js";
|
|
20
21
|
import { BUILDER_SPACE_SETTINGS_URL } from "./error-format.js";
|
|
22
|
+
import { ThumbsFeedback } from "./observability/ThumbsFeedback.js";
|
|
21
23
|
import { TiptapComposer, } from "./composer/TiptapComposer.js";
|
|
22
24
|
import { isPastedTextAttachmentName } from "./composer/pasted-text.js";
|
|
23
25
|
import { PastedTextChip } from "./composer/PastedTextChip.js";
|
|
24
26
|
import { IconMessage, IconX, IconPlayerStop, IconCheck, IconChevronDown, IconCopy, IconTerminal, IconLoader2, IconCircleX, IconSquareFilled, IconClock, IconFile, IconFolder, IconFileText, IconCheckbox, IconMail, IconUser, IconPresentation, IconStack2, IconMessageChatbot, IconLock, IconArrowBackUp, IconExternalLink, IconDots, IconGitFork, IconId, IconQuote, IconGauge, IconArrowRight, IconSettings, IconAlertTriangle, IconRefresh, IconPlayerPlay, } from "@tabler/icons-react";
|
|
25
|
-
const ThumbsFeedbackLazy = React.lazy(() => import("./observability/ThumbsFeedback.js").then((m) => ({
|
|
26
|
-
default: m.ThumbsFeedback,
|
|
27
|
-
})));
|
|
28
27
|
class BinaryDocumentAttachmentAdapter {
|
|
29
28
|
accept = "application/pdf,.pdf";
|
|
30
29
|
async add(state) {
|
|
@@ -912,13 +911,13 @@ function AssistantMessage() {
|
|
|
912
911
|
tools: {
|
|
913
912
|
Fallback: ToolCallFallback,
|
|
914
913
|
},
|
|
915
|
-
} }) }), isComplete && (_jsxs("div", { className: "mt-1 flex items-center justify-between", children: [_jsxs("div", { className: "flex min-w-0 items-center gap-2", children: [_jsx(MessageActionsMenu, { showRevert: showRestore && restoreState === "idle", onRevert: handleRestore }), timestamp && (_jsx(MessageTimestamp, { timestamp: timestamp, className: "opacity-0 transition-opacity duration-150 group-hover:opacity-100 group-focus-within:opacity-100" }))] }), showRestore && restoreState === "confirming" ? (_jsxs("div", { className: "flex items-center gap-1 text-xs", children: [_jsx("button", { onClick: handleRestore, className: "rounded-md bg-destructive px-1.5 py-0.5 text-destructive-foreground hover:bg-destructive/90", children: "Restore to here?" }), _jsx("button", { onClick: cancelRestore, className: "rounded-md px-1.5 py-0.5 text-muted-foreground hover:bg-accent", children: "Cancel" })] })) : showRestore && restoreState === "restoring" ? (_jsxs("span", { className: "flex items-center gap-1 text-xs text-muted-foreground", children: [_jsx(IconLoader2, { className: "h-3 w-3 animate-spin" }), "Restoring..."] })) : (_jsx(
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
|
|
914
|
+
} }) }), isComplete && (_jsxs("div", { className: "mt-1 flex items-center justify-between", children: [_jsxs("div", { className: "flex min-w-0 items-center gap-2", children: [_jsx(MessageActionsMenu, { showRevert: showRestore && restoreState === "idle", onRevert: handleRestore }), timestamp && (_jsx(MessageTimestamp, { timestamp: timestamp, className: "opacity-0 transition-opacity duration-150 group-hover:opacity-100 group-focus-within:opacity-100" }))] }), showRestore && restoreState === "confirming" ? (_jsxs("div", { className: "flex items-center gap-1 text-xs", children: [_jsx("button", { onClick: handleRestore, className: "rounded-md bg-destructive px-1.5 py-0.5 text-destructive-foreground hover:bg-destructive/90", children: "Restore to here?" }), _jsx("button", { onClick: cancelRestore, className: "rounded-md px-1.5 py-0.5 text-muted-foreground hover:bg-accent", children: "Cancel" })] })) : showRestore && restoreState === "restoring" ? (_jsxs("span", { className: "flex items-center gap-1 text-xs text-muted-foreground", children: [_jsx(IconLoader2, { className: "h-3 w-3 animate-spin" }), "Restoring..."] })) : (_jsx(ThumbsFeedback, { threadId: cpCtx?.threadId ?? "", runId: (() => {
|
|
915
|
+
const meta = messageRuntime.getState().metadata;
|
|
916
|
+
return ((typeof meta?.custom?.runId === "string" &&
|
|
917
|
+
meta.custom.runId) ||
|
|
918
|
+
(typeof meta?.runId === "string" && meta.runId) ||
|
|
919
|
+
"");
|
|
920
|
+
})(), messageSeq: thread.messages.findIndex((m) => m.id === msg.id) }))] }))] }));
|
|
922
921
|
}
|
|
923
922
|
function ActivitySteps({ steps }) {
|
|
924
923
|
if (steps.length === 0)
|
|
@@ -1819,6 +1818,17 @@ const AssistantChatInner = forwardRef(function AssistantChatInner({ emptyStateTe
|
|
|
1819
1818
|
window.addEventListener("agent-chat:activity", handler);
|
|
1820
1819
|
return () => window.removeEventListener("agent-chat:activity", handler);
|
|
1821
1820
|
}, [tabId]);
|
|
1821
|
+
useEffect(() => {
|
|
1822
|
+
const handler = (e) => {
|
|
1823
|
+
const detail = e.detail;
|
|
1824
|
+
if (tabId && detail?.tabId && detail.tabId !== tabId)
|
|
1825
|
+
return;
|
|
1826
|
+
setActivityLabel(null);
|
|
1827
|
+
setActivitySteps([]);
|
|
1828
|
+
};
|
|
1829
|
+
window.addEventListener("agent-chat:activity-clear", handler);
|
|
1830
|
+
return () => window.removeEventListener("agent-chat:activity-clear", handler);
|
|
1831
|
+
}, [tabId]);
|
|
1822
1832
|
useEffect(() => {
|
|
1823
1833
|
if (!showRunningInUI) {
|
|
1824
1834
|
setActivityLabel(null);
|
|
@@ -2200,7 +2210,7 @@ export const AssistantChat = forwardRef(function AssistantChat({ apiUrl = agentN
|
|
|
2200
2210
|
const attachmentAdapter = useMemo(() => new CompositeAttachmentAdapter([
|
|
2201
2211
|
new SimpleImageAttachmentAdapter(),
|
|
2202
2212
|
new BinaryDocumentAttachmentAdapter(),
|
|
2203
|
-
new
|
|
2213
|
+
new TextAttachmentAdapter(),
|
|
2204
2214
|
]), []);
|
|
2205
2215
|
const runtime = useLocalRuntime(adapter, {
|
|
2206
2216
|
adapters: { attachments: attachmentAdapter },
|