@agent-native/core 0.12.25 → 0.12.29
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/engine/builder-engine.d.ts +1 -1
- package/dist/agent/engine/builder-engine.d.ts.map +1 -1
- package/dist/agent/model-config.d.ts +3 -3
- package/dist/agent/model-config.d.ts.map +1 -1
- package/dist/agent/model-config.js +5 -4
- package/dist/agent/model-config.js.map +1 -1
- 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/application-state/emitter.d.ts +3 -2
- package/dist/application-state/emitter.d.ts.map +1 -1
- package/dist/application-state/emitter.js +4 -2
- package/dist/application-state/emitter.js.map +1 -1
- package/dist/application-state/store.js +3 -3
- package/dist/application-state/store.js.map +1 -1
- package/dist/client/AgentPanel.d.ts.map +1 -1
- package/dist/client/AgentPanel.js +0 -1
- package/dist/client/AgentPanel.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 +67 -19
- 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/MultiTabAssistantChat.js.map +1 -1
- package/dist/client/agent-chat-adapter.d.ts.map +1 -1
- package/dist/client/agent-chat-adapter.js +74 -14
- 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/client/use-chat-models.js.map +1 -1
- package/dist/client/use-db-sync.d.ts +4 -0
- package/dist/client/use-db-sync.d.ts.map +1 -1
- package/dist/client/use-db-sync.js +38 -13
- package/dist/client/use-db-sync.js.map +1 -1
- package/dist/client/use-pausing-interval.d.ts.map +1 -1
- package/dist/client/use-pausing-interval.js +5 -2
- package/dist/client/use-pausing-interval.js.map +1 -1
- package/dist/collab/client.d.ts +2 -0
- package/dist/collab/client.d.ts.map +1 -1
- package/dist/collab/client.js +37 -4
- package/dist/collab/client.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/auth.d.ts.map +1 -1
- package/dist/server/auth.js +83 -2
- package/dist/server/auth.js.map +1 -1
- package/dist/server/better-auth-instance.js +4 -3
- package/dist/server/better-auth-instance.js.map +1 -1
- package/dist/server/google-auth-plugin.d.ts.map +1 -1
- package/dist/server/google-auth-plugin.js +50 -3
- package/dist/server/google-auth-plugin.js.map +1 -1
- package/dist/server/google-oauth.d.ts.map +1 -1
- package/dist/server/google-oauth.js +10 -4
- package/dist/server/google-oauth.js.map +1 -1
- package/dist/server/onboarding-html.d.ts.map +1 -1
- package/dist/server/onboarding-html.js +50 -3
- package/dist/server/onboarding-html.js.map +1 -1
- package/dist/server/poll.d.ts.map +1 -1
- package/dist/server/poll.js +15 -0
- package/dist/server/poll.js.map +1 -1
- package/dist/templates/default/app/hooks/use-navigation-state.ts +0 -1
- package/package.json +1 -1
- package/src/templates/default/app/hooks/use-navigation-state.ts +0 -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
|
-
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
|
-
})));
|
|
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, IconClipboardList, } from "@tabler/icons-react";
|
|
28
27
|
class BinaryDocumentAttachmentAdapter {
|
|
29
28
|
accept = "application/pdf,.pdf";
|
|
30
29
|
async add(state) {
|
|
@@ -70,6 +69,16 @@ function getFileDataURL(file) {
|
|
|
70
69
|
reader.readAsDataURL(file);
|
|
71
70
|
});
|
|
72
71
|
}
|
|
72
|
+
function createUserMessageRunConfig(references, requestMode) {
|
|
73
|
+
const custom = {};
|
|
74
|
+
if (references && references.length > 0) {
|
|
75
|
+
custom.references = references;
|
|
76
|
+
}
|
|
77
|
+
if (requestMode) {
|
|
78
|
+
custom.requestMode = requestMode;
|
|
79
|
+
}
|
|
80
|
+
return Object.keys(custom).length > 0 ? { runConfig: { custom } } : {};
|
|
81
|
+
}
|
|
73
82
|
function escapeQueuedAttachmentAttribute(value) {
|
|
74
83
|
return value.replace(/&/g, "&").replace(/"/g, """);
|
|
75
84
|
}
|
|
@@ -912,13 +921,13 @@ function AssistantMessage() {
|
|
|
912
921
|
tools: {
|
|
913
922
|
Fallback: ToolCallFallback,
|
|
914
923
|
},
|
|
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
|
-
|
|
924
|
+
} }) }), 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: (() => {
|
|
925
|
+
const meta = messageRuntime.getState().metadata;
|
|
926
|
+
return ((typeof meta?.custom?.runId === "string" &&
|
|
927
|
+
meta.custom.runId) ||
|
|
928
|
+
(typeof meta?.runId === "string" && meta.runId) ||
|
|
929
|
+
"");
|
|
930
|
+
})(), messageSeq: thread.messages.findIndex((m) => m.id === msg.id) }))] }))] }));
|
|
922
931
|
}
|
|
923
932
|
function ActivitySteps({ steps }) {
|
|
924
933
|
if (steps.length === 0)
|
|
@@ -1161,6 +1170,11 @@ function LoopLimitContinueCard({ info, onContinue, }) {
|
|
|
1161
1170
|
setError(null);
|
|
1162
1171
|
}, className: "h-8 w-full rounded-md border border-border bg-background px-2 text-xs text-foreground outline-none focus:ring-1 focus:ring-ring disabled:opacity-60" })] }), _jsx("button", { type: "button", onClick: saveLimit, disabled: !hasPendingChange || saving, className: "inline-flex h-8 items-center gap-1 rounded-md border border-border px-2.5 text-xs font-medium text-foreground hover:bg-accent disabled:opacity-50", children: saving ? (_jsx(IconLoader2, { size: 12, className: "animate-spin" })) : saved ? (_jsx(IconCheck, { size: 12 })) : ("Save") }), _jsxs("button", { type: "button", onClick: openSettings, className: "inline-flex h-8 items-center gap-1 rounded-md border border-border px-2.5 text-xs font-medium text-muted-foreground hover:bg-accent hover:text-foreground", children: [_jsx(IconSettings, { size: 12 }), "Settings"] }), _jsxs("button", { type: "button", onClick: handleContinue, disabled: saving, className: "ml-auto inline-flex h-8 items-center gap-1 rounded-md bg-foreground px-3 text-xs font-medium text-background hover:opacity-90 disabled:opacity-60", children: [hasPendingChange ? "Save and keep going" : "Keep going", _jsx(IconArrowRight, { size: 12 })] })] }), settings && !settings.canUpdate && (_jsx("p", { className: "mt-2 text-[11px] text-muted-foreground", children: "Only organization owners and admins can change this limit." })), error && _jsx("p", { className: "mt-2 text-[11px] text-destructive", children: error })] }));
|
|
1163
1172
|
}
|
|
1173
|
+
function PlanModeCallout({ canImplementPlan, onImplementPlan, onSwitchToAct, }) {
|
|
1174
|
+
return (_jsx("div", { className: "shrink-0 px-3 pt-2", children: _jsx("div", { className: "rounded-lg border border-blue-500/25 bg-blue-500/[0.06] px-3 py-2.5 shadow-sm", children: _jsxs("div", { className: "flex items-center gap-2.5", children: [_jsx("span", { className: "flex h-7 w-7 shrink-0 items-center justify-center rounded-md bg-blue-500/10 text-blue-600 dark:text-blue-300", children: _jsx(IconClipboardList, { size: 15 }) }), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsx("p", { className: "text-sm font-medium text-foreground", children: canImplementPlan ? "Plan ready" : "Plan mode is on" }), _jsx("p", { className: "mt-0.5 text-xs leading-relaxed text-muted-foreground", children: canImplementPlan
|
|
1175
|
+
? "Switch to Act and run the proposed plan."
|
|
1176
|
+
: "The next turn will stay read-only until you switch to Act." })] }), canImplementPlan ? (_jsxs("button", { type: "button", onClick: onImplementPlan, className: "inline-flex h-8 shrink-0 items-center gap-1.5 rounded-md bg-foreground px-3 text-xs font-medium text-background hover:opacity-90", children: [_jsx(IconPlayerPlay, { size: 13 }), "Implement Plan"] })) : (_jsxs("button", { type: "button", onClick: onSwitchToAct, className: "inline-flex h-8 shrink-0 items-center gap-1.5 rounded-md border border-border bg-background px-3 text-xs font-medium text-foreground hover:bg-accent", children: ["Act", _jsx(IconArrowRight, { size: 13 })] }))] }) }) }));
|
|
1177
|
+
}
|
|
1164
1178
|
export const CHAT_STORAGE_PREFIX = "agent-chat:";
|
|
1165
1179
|
/** Remove persisted chat for a given tabId (or "default"). */
|
|
1166
1180
|
export function clearChatStorage(tabId) {
|
|
@@ -1819,6 +1833,17 @@ const AssistantChatInner = forwardRef(function AssistantChatInner({ emptyStateTe
|
|
|
1819
1833
|
window.addEventListener("agent-chat:activity", handler);
|
|
1820
1834
|
return () => window.removeEventListener("agent-chat:activity", handler);
|
|
1821
1835
|
}, [tabId]);
|
|
1836
|
+
useEffect(() => {
|
|
1837
|
+
const handler = (e) => {
|
|
1838
|
+
const detail = e.detail;
|
|
1839
|
+
if (tabId && detail?.tabId && detail.tabId !== tabId)
|
|
1840
|
+
return;
|
|
1841
|
+
setActivityLabel(null);
|
|
1842
|
+
setActivitySteps([]);
|
|
1843
|
+
};
|
|
1844
|
+
window.addEventListener("agent-chat:activity-clear", handler);
|
|
1845
|
+
return () => window.removeEventListener("agent-chat:activity-clear", handler);
|
|
1846
|
+
}, [tabId]);
|
|
1822
1847
|
useEffect(() => {
|
|
1823
1848
|
if (!showRunningInUI) {
|
|
1824
1849
|
setActivityLabel(null);
|
|
@@ -1850,9 +1875,7 @@ const AssistantChatInner = forwardRef(function AssistantChatInner({ emptyStateTe
|
|
|
1850
1875
|
...(next.attachments && next.attachments.length > 0
|
|
1851
1876
|
? { attachments: next.attachments }
|
|
1852
1877
|
: {}),
|
|
1853
|
-
...(next.references
|
|
1854
|
-
? { runConfig: { custom: { references: next.references } } }
|
|
1855
|
-
: {}),
|
|
1878
|
+
...createUserMessageRunConfig(next.references, next.requestMode),
|
|
1856
1879
|
});
|
|
1857
1880
|
})();
|
|
1858
1881
|
}, 100);
|
|
@@ -1888,7 +1911,7 @@ const AssistantChatInner = forwardRef(function AssistantChatInner({ emptyStateTe
|
|
|
1888
1911
|
setForceStopped(false);
|
|
1889
1912
|
}
|
|
1890
1913
|
}, [isReconnecting, forceStopped]);
|
|
1891
|
-
const addToQueue = useCallback(async (text, images, references, attachments) => {
|
|
1914
|
+
const addToQueue = useCallback(async (text, images, references, attachments, requestMode) => {
|
|
1892
1915
|
setShowContinue(false);
|
|
1893
1916
|
setLoopLimitInfo(null);
|
|
1894
1917
|
setRunErrorInfo(null);
|
|
@@ -1900,6 +1923,16 @@ const AssistantChatInner = forwardRef(function AssistantChatInner({ emptyStateTe
|
|
|
1900
1923
|
// as the user actually sends a message so it can't be re-used.
|
|
1901
1924
|
clearPendingSelection();
|
|
1902
1925
|
const queuedAttachments = await serializeQueuedAttachments(attachments);
|
|
1926
|
+
// Snapshot the exec mode at enqueue time when the caller didn't
|
|
1927
|
+
// pass an explicit override. Without this, a plan-mode message that
|
|
1928
|
+
// sits in the queue runs as 'act' if the user flips the global toggle
|
|
1929
|
+
// before the queue flushes — turning a read-only message into a write.
|
|
1930
|
+
const effectiveRequestMode = requestMode ??
|
|
1931
|
+
(execMode === "plan"
|
|
1932
|
+
? "plan"
|
|
1933
|
+
: execMode === "build"
|
|
1934
|
+
? "act"
|
|
1935
|
+
: undefined);
|
|
1903
1936
|
if (isRunning) {
|
|
1904
1937
|
setQueuedMessages((prev) => [
|
|
1905
1938
|
...prev,
|
|
@@ -1911,6 +1944,7 @@ const AssistantChatInner = forwardRef(function AssistantChatInner({ emptyStateTe
|
|
|
1911
1944
|
images,
|
|
1912
1945
|
attachments: queuedAttachments,
|
|
1913
1946
|
references,
|
|
1947
|
+
requestMode: effectiveRequestMode,
|
|
1914
1948
|
},
|
|
1915
1949
|
]);
|
|
1916
1950
|
}
|
|
@@ -1927,9 +1961,10 @@ const AssistantChatInner = forwardRef(function AssistantChatInner({ emptyStateTe
|
|
|
1927
1961
|
...(queuedAttachments && queuedAttachments.length > 0
|
|
1928
1962
|
? { attachments: queuedAttachments }
|
|
1929
1963
|
: {}),
|
|
1964
|
+
...createUserMessageRunConfig(references, effectiveRequestMode),
|
|
1930
1965
|
});
|
|
1931
1966
|
}
|
|
1932
|
-
}, [isRunning, threadRuntime]);
|
|
1967
|
+
}, [execMode, isRunning, threadRuntime]);
|
|
1933
1968
|
// Expose imperative handle
|
|
1934
1969
|
useImperativeHandle(ref, () => ({
|
|
1935
1970
|
sendMessage(text) {
|
|
@@ -2058,6 +2093,19 @@ const AssistantChatInner = forwardRef(function AssistantChatInner({ emptyStateTe
|
|
|
2058
2093
|
}
|
|
2059
2094
|
return "";
|
|
2060
2095
|
}, [messages]);
|
|
2096
|
+
const latestMessageRole = messages[messages.length - 1]?.role;
|
|
2097
|
+
const showPlanModeCallout = execMode === "plan" &&
|
|
2098
|
+
!planModeDisabled &&
|
|
2099
|
+
!isComposerDisabled &&
|
|
2100
|
+
!showRunningInUI;
|
|
2101
|
+
const canImplementPlan = showPlanModeCallout && latestMessageRole === "assistant";
|
|
2102
|
+
const handleImplementPlan = useCallback(() => {
|
|
2103
|
+
onExecModeChange?.("build");
|
|
2104
|
+
void addToQueue("Implement the plan.", undefined, undefined, undefined, "act");
|
|
2105
|
+
}, [addToQueue, onExecModeChange]);
|
|
2106
|
+
const handleSwitchToAct = useCallback(() => {
|
|
2107
|
+
onExecModeChange?.("build");
|
|
2108
|
+
}, [onExecModeChange]);
|
|
2061
2109
|
const visibleLoopLimit = showContinue
|
|
2062
2110
|
? (loopLimitInfo ?? lastMessageLoopLimit ?? {})
|
|
2063
2111
|
: lastMessageLoopLimit;
|
|
@@ -2132,7 +2180,7 @@ const AssistantChatInner = forwardRef(function AssistantChatInner({ emptyStateTe
|
|
|
2132
2180
|
.replace(/<context>[\s\S]*?<\/context>\n?/g, "")
|
|
2133
2181
|
.trim();
|
|
2134
2182
|
return (_jsx("div", { className: "flex justify-end group", children: _jsxs("div", { className: "relative max-w-[85%] rounded-lg bg-accent/50 text-foreground/60 px-3 py-2 text-sm leading-relaxed whitespace-pre-wrap break-words", children: [_jsxs("div", { className: "flex items-center gap-1.5 text-[10px] text-muted-foreground mb-1 font-medium uppercase tracking-wide", children: [_jsx(IconClock, { className: "h-3 w-3" }), "Queued"] }), displayText, msg.images && msg.images.length > 0 && (_jsx("div", { className: "flex flex-wrap gap-1.5 mt-1.5", children: msg.images.map((img, j) => (_jsx("img", { src: img, alt: "", className: "h-12 w-12 rounded object-cover border border-border/50" }, j))) })), _jsx("button", { type: "button", onClick: () => setQueuedMessages((prev) => prev.filter((m) => m.id !== msg.id)), "aria-label": "Remove from queue", className: "absolute -top-2 -right-2 flex h-5 w-5 items-center justify-center rounded-full border border-border bg-background text-muted-foreground opacity-0 group-hover:opacity-100 focus-visible:opacity-100 hover:text-foreground hover:bg-accent shadow-sm", children: _jsx(IconX, { className: "h-3 w-3" }) })] }) }, msg.id));
|
|
2135
|
-
})] })) }), showScrollToBottom && (_jsx("div", { className: "shrink-0 flex justify-center -mb-1", children: _jsx("button", { type: "button", onClick: scrollToBottom, className: "flex h-7 w-7 items-center justify-center rounded-full border border-border bg-background shadow-sm hover:bg-accent", "aria-label": "Scroll to bottom", children: _jsx(IconChevronDown, { className: "h-3.5 w-3.5 text-muted-foreground" }) }) })), composerSlot, _jsx(SelectionAttachedPill, {}), _jsx("div", { className: cn("agent-composer-area shrink-0 px-3 py-2", missingApiKey && "cursor-pointer", isComposerDisabled && "opacity-70"), onClick: missingApiKey
|
|
2183
|
+
})] })) }), showScrollToBottom && (_jsx("div", { className: "shrink-0 flex justify-center -mb-1", children: _jsx("button", { type: "button", onClick: scrollToBottom, className: "flex h-7 w-7 items-center justify-center rounded-full border border-border bg-background shadow-sm hover:bg-accent", "aria-label": "Scroll to bottom", children: _jsx(IconChevronDown, { className: "h-3.5 w-3.5 text-muted-foreground" }) }) })), composerSlot, showPlanModeCallout && (_jsx(PlanModeCallout, { canImplementPlan: canImplementPlan, onImplementPlan: handleImplementPlan, onSwitchToAct: handleSwitchToAct })), _jsx(SelectionAttachedPill, {}), _jsx("div", { className: cn("agent-composer-area shrink-0 px-3 py-2", missingApiKey && "cursor-pointer", isComposerDisabled && "opacity-70"), onClick: missingApiKey
|
|
2136
2184
|
? () => setMissingKeyBouncePulse((p) => p + 1)
|
|
2137
2185
|
: undefined, children: _jsxs(ComposerPrimitive.Root, { className: "flex flex-col rounded-lg border border-input bg-background focus-within:ring-1 focus-within:ring-ring", children: [_jsx(ComposerAttachmentPreviewStrip, {}), _jsx(TiptapComposer, { focusRef: tiptapRef, disabled: isComposerDisabled, placeholder: missingApiKey
|
|
2138
2186
|
? "Connect an AI engine above to start chatting…"
|
|
@@ -2200,7 +2248,7 @@ export const AssistantChat = forwardRef(function AssistantChat({ apiUrl = agentN
|
|
|
2200
2248
|
const attachmentAdapter = useMemo(() => new CompositeAttachmentAdapter([
|
|
2201
2249
|
new SimpleImageAttachmentAdapter(),
|
|
2202
2250
|
new BinaryDocumentAttachmentAdapter(),
|
|
2203
|
-
new
|
|
2251
|
+
new TextAttachmentAdapter(),
|
|
2204
2252
|
]), []);
|
|
2205
2253
|
const runtime = useLocalRuntime(adapter, {
|
|
2206
2254
|
adapters: { attachments: attachmentAdapter },
|