@burdenoff/microfe-vibecontrols 2026.530.2 → 2026.530.3
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/components/agent-manager/AgentManagerBookmarksDrawer.js +1 -1
- package/dist/components/agent-manager/AgentManagerBookmarksDrawer.js.map +1 -1
- package/dist/components/agent-manager/AgentManagerInputArea.js +82 -84
- package/dist/components/agent-manager/AgentManagerInputArea.js.map +1 -1
- package/dist/components/agents/AgentForm.js +264 -278
- package/dist/components/agents/AgentForm.js.map +1 -1
- package/dist/components/agents/ConnectionLogPanel.js +18 -18
- package/dist/components/agents/ConnectionLogPanel.js.map +1 -1
- package/dist/components/docs/DocsEditPanel.js +1 -1
- package/dist/components/docs/DocsEditPanel.js.map +1 -1
- package/dist/components/docs/DocsFullScreenViewer.js +1 -1
- package/dist/components/docs/DocsFullScreenViewer.js.map +1 -1
- package/dist/components/docs/DocsPreviewPanel.js +2 -2
- package/dist/components/docs/DocsPreviewPanel.js.map +1 -1
- package/dist/components/docs/DocsRevisionHistory.js +2 -2
- package/dist/components/docs/DocsRevisionHistory.js.map +1 -1
- package/dist/components/docs/DocsSettingsPanel.js +5 -5
- package/dist/components/docs/DocsSettingsPanel.js.map +1 -1
- package/dist/components/docs/DocsTabPanel.js +1 -1
- package/dist/components/docs/DocsTabPanel.js.map +1 -1
- package/dist/components/plugins/AddTabDialog.js +2 -2
- package/dist/components/plugins/AddTabDialog.js.map +1 -1
- package/dist/components/plugins/PluginIframeMount.js +1 -1
- package/dist/components/plugins/PluginIframeMount.js.map +1 -1
- package/dist/components/sessions/TerminalPanel.js +424 -378
- package/dist/components/sessions/TerminalPanel.js.map +1 -1
- package/dist/components/shared/EntityTagPicker.js +1 -1
- package/dist/components/shared/EntityTagPicker.js.map +1 -1
- package/dist/pages/PluginStandalonePage.js +2 -2
- package/dist/pages/PluginStandalonePage.js.map +1 -1
- package/dist/pages/SharedSessionPage.js +8 -8
- package/dist/pages/SharedSessionPage.js.map +1 -1
- package/dist/pages/ai/AIBookmarksPage.js +1 -1
- package/dist/pages/ai/AIBookmarksPage.js.map +1 -1
- package/dist/pages/tunnels/DomainsTab.js +2 -2
- package/dist/pages/tunnels/DomainsTab.js.map +1 -1
- package/dist/pages/tunnels/tabs/TunnelDomainsTab.js +1 -1
- package/dist/pages/tunnels/tabs/TunnelDomainsTab.js.map +1 -1
- package/dist/services/schedulerApi.js +15 -37
- package/dist/services/schedulerApi.js.map +1 -1
- package/package.json +1 -1
|
@@ -143,7 +143,7 @@ var v = ({ open: g, onClose: v, sessionId: y, messages: b, onJump: x }) => {
|
|
|
143
143
|
onClick: () => void I(e.id),
|
|
144
144
|
className: "p-1 rounded hover:bg-bg-sunken transition-colors",
|
|
145
145
|
"aria-label": C("vibecontrols.agentManager.messageItem.removeBookmark", "Remove bookmark"),
|
|
146
|
-
children: /* @__PURE__ */ m(d, { className: "size-3.5 text-status-
|
|
146
|
+
children: /* @__PURE__ */ m(d, { className: "size-3.5 text-status-error-text" })
|
|
147
147
|
})
|
|
148
148
|
]
|
|
149
149
|
})]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AgentManagerBookmarksDrawer.js","names":[],"sources":["../../../src/components/agent-manager/AgentManagerBookmarksDrawer.tsx"],"sourcesContent":["/**\n * Side drawer listing the current user's bookmarks for ONE chat session.\n *\n * Each row resolves its message body from the currently-loaded session\n * messages. When the bookmarked message is no longer in the session\n * (agent log pruning / rotation), the row degrades to a \"Message no\n * longer available\" affordance with a remove-only action.\n */\n\nimport { useState, type FC } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { Bookmark, X, ChevronRight, Pencil, Trash2, Check, ExternalLink } from 'lucide-react';\nimport { relativeTime } from '@/utils/relativeTime';\nimport {\n useDeleteAgentMessageBookmarkMutation,\n useMyAgentMessageBookmarksQuery,\n useUpdateAgentMessageBookmarkMutation,\n type AgentMessageBookmarkFieldsFragment,\n} from '../../generated/wspace-operations';\nimport type { AgentManagerMessage } from '@/types/agentManager';\nimport { useTr } from '../../shared/hooks/useTr';\n\ninterface AgentManagerBookmarksDrawerProps {\n open: boolean;\n onClose: () => void;\n sessionId: string;\n messages: AgentManagerMessage[];\n onJump: (messageId: string) => void;\n}\n\nconst PREVIEW_LEN = 80;\n\nfunction snippet(content: string): string {\n if (!content) return '';\n const trimmed = content.trim().replace(/\\s+/g, ' ');\n return trimmed.length > PREVIEW_LEN ? `${trimmed.slice(0, PREVIEW_LEN)}…` : trimmed;\n}\n\nexport const AgentManagerBookmarksDrawer: FC<AgentManagerBookmarksDrawerProps> = ({\n open,\n onClose,\n sessionId,\n messages,\n onJump,\n}) => {\n const navigate = useNavigate();\n const tr = useTr();\n const [editingId, setEditingId] = useState<string | null>(null);\n const [labelDraft, setLabelDraft] = useState('');\n\n const { data, loading } = useMyAgentMessageBookmarksQuery({\n variables: { filter: { sessionId } },\n skip: !open,\n fetchPolicy: 'cache-and-network',\n });\n\n const [updateMutation] = useUpdateAgentMessageBookmarkMutation({\n refetchQueries: ['MyAgentMessageBookmarks'],\n });\n const [deleteMutation] = useDeleteAgentMessageBookmarkMutation({\n refetchQueries: ['MyAgentMessageBookmarks'],\n });\n\n const bookmarks = data?.myAgentMessageBookmarks.items ?? [];\n const messageById = new Map(messages.map((m) => [m.id, m]));\n\n const startEdit = (id: string, current: string | null | undefined) => {\n setEditingId(id);\n setLabelDraft(current ?? '');\n };\n\n const saveEdit = async (id: string) => {\n await updateMutation({ variables: { id, input: { label: labelDraft || null } } });\n setEditingId(null);\n setLabelDraft('');\n };\n\n const removeBookmark = async (id: string) => {\n await deleteMutation({ variables: { id } });\n };\n\n if (!open) return null;\n\n return (\n <div className=\"fixed inset-0 z-40 flex\">\n <div className=\"flex-1 bg-bg-overlay/40\" onClick={onClose} aria-hidden />\n <aside\n className=\"w-full max-w-md h-full bg-bg-surface border-l border-border-default shadow-xl flex flex-col\"\n role=\"dialog\"\n aria-label={tr(\n 'vibecontrols.agentManager.bookmarksDrawer.title',\n 'Bookmarks in this session'\n )}\n data-testid=\"agent-manager-bookmarks-drawer\"\n >\n <header className=\"flex items-center justify-between px-4 py-3 border-b border-border-default flex-shrink-0\">\n <div className=\"flex items-center gap-2\">\n <Bookmark className=\"size-4 text-text-secondary\" />\n <h3 className=\"text-sm font-semibold text-text-primary\">\n {tr('vibecontrols.agentManager.bookmarksDrawer.title', 'Bookmarks in this session')}\n </h3>\n </div>\n <button\n type=\"button\"\n onClick={onClose}\n className=\"p-1 rounded hover:bg-bg-sunken transition-colors\"\n aria-label={tr('vibecontrols.common.close', 'Close')}\n >\n <X className=\"size-4 text-text-secondary\" />\n </button>\n </header>\n\n <div className=\"flex-1 min-h-0 overflow-y-auto\">\n {loading && bookmarks.length === 0 && (\n <div className=\"px-4 py-6 text-xs text-text-tertiary\">\n {tr('vibecontrols.common.loading', 'Loading...')}\n </div>\n )}\n\n {!loading && bookmarks.length === 0 && (\n <div className=\"px-4 py-10 flex flex-col items-center text-center gap-2\">\n <Bookmark className=\"size-8 text-text-muted\" />\n <p className=\"text-sm font-medium text-text-primary\">\n {tr(\n 'vibecontrols.agentManager.bookmarksDrawer.empty',\n 'No bookmarks in this session yet'\n )}\n </p>\n <p className=\"text-xs text-text-secondary max-w-xs\">\n {tr(\n 'vibecontrols.agentManager.bookmarksDrawer.emptyHint',\n 'Click the bookmark icon on any message to save it for later.'\n )}\n </p>\n </div>\n )}\n\n <ul className=\"divide-y divide-border-subtle\">\n {bookmarks.map((bm: AgentMessageBookmarkFieldsFragment) => {\n const msg = messageById.get(bm.messageId);\n const isStale = !msg;\n const isEditing = editingId === bm.id;\n\n return (\n <li key={bm.id} className=\"px-4 py-3 hover:bg-bg-elevated/40 transition-colors\">\n <div className=\"flex items-start gap-2\">\n <div className=\"flex-1 min-w-0\">\n {isEditing ? (\n <input\n aria-label=\"control\"\n value={labelDraft}\n onChange={(e) => setLabelDraft(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') void saveEdit(bm.id);\n if (e.key === 'Escape') {\n setEditingId(null);\n setLabelDraft('');\n }\n }}\n placeholder={tr(\n 'vibecontrols.agentManager.bookmarksDrawer.labelPlaceholder',\n 'Add a label (optional)'\n )}\n className=\"w-full bg-bg-sunken border border-border-subtle rounded px-2 py-1 text-xs text-text-primary placeholder:text-text-tertiary focus:outline-none focus:border-action-primary-bg\"\n />\n ) : (\n <p className=\"text-sm font-medium text-text-primary truncate\">\n {bm.label ||\n (msg?.role === 'user'\n ? tr('vibecontrols.agentManager.bookmarksDrawer.fromUser', 'From you')\n : tr(\n 'vibecontrols.agentManager.bookmarksDrawer.fromAssistant',\n 'Assistant reply'\n ))}\n </p>\n )}\n\n {isStale ? (\n <p className=\"text-xs text-text-tertiary italic mt-1\">\n {tr(\n 'vibecontrols.agentManager.bookmarksDrawer.stale',\n 'Message no longer available'\n )}\n </p>\n ) : (\n <p className=\"text-xs text-text-secondary mt-1 line-clamp-2\">\n {snippet(msg.content)}\n </p>\n )}\n\n <p className=\"text-[10px] text-text-tertiary mt-1\">\n {relativeTime(bm.createdAt)}\n </p>\n </div>\n\n <div className=\"flex items-center gap-0.5 shrink-0\">\n {!isStale && !isEditing && (\n <button\n type=\"button\"\n onClick={() => {\n onJump(bm.messageId);\n onClose();\n }}\n className=\"p-1 rounded hover:bg-bg-sunken transition-colors\"\n title={tr(\n 'vibecontrols.agentManager.bookmarksDrawer.jump',\n 'Jump to message'\n )}\n aria-label={tr(\n 'vibecontrols.agentManager.bookmarksDrawer.jump',\n 'Jump to message'\n )}\n >\n <ChevronRight className=\"size-3.5 text-text-secondary\" />\n </button>\n )}\n\n {isEditing ? (\n <button\n type=\"button\"\n onClick={() => void saveEdit(bm.id)}\n className=\"p-1 rounded hover:bg-bg-sunken transition-colors\"\n aria-label={tr('vibecontrols.common.save', 'Save')}\n >\n <Check className=\"size-3.5 text-status-success-text\" />\n </button>\n ) : (\n <button\n type=\"button\"\n onClick={() => startEdit(bm.id, bm.label)}\n className=\"p-1 rounded hover:bg-bg-sunken transition-colors\"\n aria-label={tr(\n 'vibecontrols.agentManager.bookmarksDrawer.editLabel',\n 'Edit label'\n )}\n >\n <Pencil className=\"size-3.5 text-text-secondary\" />\n </button>\n )}\n\n <button\n type=\"button\"\n onClick={() => void removeBookmark(bm.id)}\n className=\"p-1 rounded hover:bg-bg-sunken transition-colors\"\n aria-label={tr(\n 'vibecontrols.agentManager.messageItem.removeBookmark',\n 'Remove bookmark'\n )}\n >\n <Trash2 className=\"size-3.5 text-status-danger-text\" />\n </button>\n </div>\n </div>\n </li>\n );\n })}\n </ul>\n </div>\n\n <footer className=\"px-4 py-3 border-t border-border-default flex-shrink-0\">\n <button\n type=\"button\"\n onClick={() => {\n onClose();\n navigate('/vibecontrols/ai/bookmarks');\n }}\n className=\"inline-flex items-center gap-1.5 text-xs font-medium text-action-primary-text hover:underline\"\n >\n <ExternalLink className=\"size-3\" />\n {tr(\n 'vibecontrols.agentManager.bookmarksDrawer.seeAll',\n 'See all bookmarks across sessions'\n )}\n </button>\n </footer>\n </aside>\n </div>\n );\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AgentManagerBookmarksDrawer.js","names":[],"sources":["../../../src/components/agent-manager/AgentManagerBookmarksDrawer.tsx"],"sourcesContent":["/**\n * Side drawer listing the current user's bookmarks for ONE chat session.\n *\n * Each row resolves its message body from the currently-loaded session\n * messages. When the bookmarked message is no longer in the session\n * (agent log pruning / rotation), the row degrades to a \"Message no\n * longer available\" affordance with a remove-only action.\n */\n\nimport { useState, type FC } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { Bookmark, X, ChevronRight, Pencil, Trash2, Check, ExternalLink } from 'lucide-react';\nimport { relativeTime } from '@/utils/relativeTime';\nimport {\n useDeleteAgentMessageBookmarkMutation,\n useMyAgentMessageBookmarksQuery,\n useUpdateAgentMessageBookmarkMutation,\n type AgentMessageBookmarkFieldsFragment,\n} from '../../generated/wspace-operations';\nimport type { AgentManagerMessage } from '@/types/agentManager';\nimport { useTr } from '../../shared/hooks/useTr';\n\ninterface AgentManagerBookmarksDrawerProps {\n open: boolean;\n onClose: () => void;\n sessionId: string;\n messages: AgentManagerMessage[];\n onJump: (messageId: string) => void;\n}\n\nconst PREVIEW_LEN = 80;\n\nfunction snippet(content: string): string {\n if (!content) return '';\n const trimmed = content.trim().replace(/\\s+/g, ' ');\n return trimmed.length > PREVIEW_LEN ? `${trimmed.slice(0, PREVIEW_LEN)}…` : trimmed;\n}\n\nexport const AgentManagerBookmarksDrawer: FC<AgentManagerBookmarksDrawerProps> = ({\n open,\n onClose,\n sessionId,\n messages,\n onJump,\n}) => {\n const navigate = useNavigate();\n const tr = useTr();\n const [editingId, setEditingId] = useState<string | null>(null);\n const [labelDraft, setLabelDraft] = useState('');\n\n const { data, loading } = useMyAgentMessageBookmarksQuery({\n variables: { filter: { sessionId } },\n skip: !open,\n fetchPolicy: 'cache-and-network',\n });\n\n const [updateMutation] = useUpdateAgentMessageBookmarkMutation({\n refetchQueries: ['MyAgentMessageBookmarks'],\n });\n const [deleteMutation] = useDeleteAgentMessageBookmarkMutation({\n refetchQueries: ['MyAgentMessageBookmarks'],\n });\n\n const bookmarks = data?.myAgentMessageBookmarks.items ?? [];\n const messageById = new Map(messages.map((m) => [m.id, m]));\n\n const startEdit = (id: string, current: string | null | undefined) => {\n setEditingId(id);\n setLabelDraft(current ?? '');\n };\n\n const saveEdit = async (id: string) => {\n await updateMutation({ variables: { id, input: { label: labelDraft || null } } });\n setEditingId(null);\n setLabelDraft('');\n };\n\n const removeBookmark = async (id: string) => {\n await deleteMutation({ variables: { id } });\n };\n\n if (!open) return null;\n\n return (\n <div className=\"fixed inset-0 z-40 flex\">\n <div className=\"flex-1 bg-bg-overlay/40\" onClick={onClose} aria-hidden />\n <aside\n className=\"w-full max-w-md h-full bg-bg-surface border-l border-border-default shadow-xl flex flex-col\"\n role=\"dialog\"\n aria-label={tr(\n 'vibecontrols.agentManager.bookmarksDrawer.title',\n 'Bookmarks in this session'\n )}\n data-testid=\"agent-manager-bookmarks-drawer\"\n >\n <header className=\"flex items-center justify-between px-4 py-3 border-b border-border-default flex-shrink-0\">\n <div className=\"flex items-center gap-2\">\n <Bookmark className=\"size-4 text-text-secondary\" />\n <h3 className=\"text-sm font-semibold text-text-primary\">\n {tr('vibecontrols.agentManager.bookmarksDrawer.title', 'Bookmarks in this session')}\n </h3>\n </div>\n <button\n type=\"button\"\n onClick={onClose}\n className=\"p-1 rounded hover:bg-bg-sunken transition-colors\"\n aria-label={tr('vibecontrols.common.close', 'Close')}\n >\n <X className=\"size-4 text-text-secondary\" />\n </button>\n </header>\n\n <div className=\"flex-1 min-h-0 overflow-y-auto\">\n {loading && bookmarks.length === 0 && (\n <div className=\"px-4 py-6 text-xs text-text-tertiary\">\n {tr('vibecontrols.common.loading', 'Loading...')}\n </div>\n )}\n\n {!loading && bookmarks.length === 0 && (\n <div className=\"px-4 py-10 flex flex-col items-center text-center gap-2\">\n <Bookmark className=\"size-8 text-text-muted\" />\n <p className=\"text-sm font-medium text-text-primary\">\n {tr(\n 'vibecontrols.agentManager.bookmarksDrawer.empty',\n 'No bookmarks in this session yet'\n )}\n </p>\n <p className=\"text-xs text-text-secondary max-w-xs\">\n {tr(\n 'vibecontrols.agentManager.bookmarksDrawer.emptyHint',\n 'Click the bookmark icon on any message to save it for later.'\n )}\n </p>\n </div>\n )}\n\n <ul className=\"divide-y divide-border-subtle\">\n {bookmarks.map((bm: AgentMessageBookmarkFieldsFragment) => {\n const msg = messageById.get(bm.messageId);\n const isStale = !msg;\n const isEditing = editingId === bm.id;\n\n return (\n <li key={bm.id} className=\"px-4 py-3 hover:bg-bg-elevated/40 transition-colors\">\n <div className=\"flex items-start gap-2\">\n <div className=\"flex-1 min-w-0\">\n {isEditing ? (\n <input\n aria-label=\"control\"\n value={labelDraft}\n onChange={(e) => setLabelDraft(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') void saveEdit(bm.id);\n if (e.key === 'Escape') {\n setEditingId(null);\n setLabelDraft('');\n }\n }}\n placeholder={tr(\n 'vibecontrols.agentManager.bookmarksDrawer.labelPlaceholder',\n 'Add a label (optional)'\n )}\n className=\"w-full bg-bg-sunken border border-border-subtle rounded px-2 py-1 text-xs text-text-primary placeholder:text-text-tertiary focus:outline-none focus:border-action-primary-bg\"\n />\n ) : (\n <p className=\"text-sm font-medium text-text-primary truncate\">\n {bm.label ||\n (msg?.role === 'user'\n ? tr('vibecontrols.agentManager.bookmarksDrawer.fromUser', 'From you')\n : tr(\n 'vibecontrols.agentManager.bookmarksDrawer.fromAssistant',\n 'Assistant reply'\n ))}\n </p>\n )}\n\n {isStale ? (\n <p className=\"text-xs text-text-tertiary italic mt-1\">\n {tr(\n 'vibecontrols.agentManager.bookmarksDrawer.stale',\n 'Message no longer available'\n )}\n </p>\n ) : (\n <p className=\"text-xs text-text-secondary mt-1 line-clamp-2\">\n {snippet(msg.content)}\n </p>\n )}\n\n <p className=\"text-[10px] text-text-tertiary mt-1\">\n {relativeTime(bm.createdAt)}\n </p>\n </div>\n\n <div className=\"flex items-center gap-0.5 shrink-0\">\n {!isStale && !isEditing && (\n <button\n type=\"button\"\n onClick={() => {\n onJump(bm.messageId);\n onClose();\n }}\n className=\"p-1 rounded hover:bg-bg-sunken transition-colors\"\n title={tr(\n 'vibecontrols.agentManager.bookmarksDrawer.jump',\n 'Jump to message'\n )}\n aria-label={tr(\n 'vibecontrols.agentManager.bookmarksDrawer.jump',\n 'Jump to message'\n )}\n >\n <ChevronRight className=\"size-3.5 text-text-secondary\" />\n </button>\n )}\n\n {isEditing ? (\n <button\n type=\"button\"\n onClick={() => void saveEdit(bm.id)}\n className=\"p-1 rounded hover:bg-bg-sunken transition-colors\"\n aria-label={tr('vibecontrols.common.save', 'Save')}\n >\n <Check className=\"size-3.5 text-status-success-text\" />\n </button>\n ) : (\n <button\n type=\"button\"\n onClick={() => startEdit(bm.id, bm.label)}\n className=\"p-1 rounded hover:bg-bg-sunken transition-colors\"\n aria-label={tr(\n 'vibecontrols.agentManager.bookmarksDrawer.editLabel',\n 'Edit label'\n )}\n >\n <Pencil className=\"size-3.5 text-text-secondary\" />\n </button>\n )}\n\n <button\n type=\"button\"\n onClick={() => void removeBookmark(bm.id)}\n className=\"p-1 rounded hover:bg-bg-sunken transition-colors\"\n aria-label={tr(\n 'vibecontrols.agentManager.messageItem.removeBookmark',\n 'Remove bookmark'\n )}\n >\n <Trash2 className=\"size-3.5 text-status-error-text\" />\n </button>\n </div>\n </div>\n </li>\n );\n })}\n </ul>\n </div>\n\n <footer className=\"px-4 py-3 border-t border-border-default flex-shrink-0\">\n <button\n type=\"button\"\n onClick={() => {\n onClose();\n navigate('/vibecontrols/ai/bookmarks');\n }}\n className=\"inline-flex items-center gap-1.5 text-xs font-medium text-action-primary-text hover:underline\"\n >\n <ExternalLink className=\"size-3\" />\n {tr(\n 'vibecontrols.agentManager.bookmarksDrawer.seeAll',\n 'See all bookmarks across sessions'\n )}\n </button>\n </footer>\n </aside>\n </div>\n );\n};\n"],"mappings":"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"}
|
|
@@ -14,11 +14,11 @@ import { VoiceToggle as ae } from "./controls/VoiceToggle.js";
|
|
|
14
14
|
import { FileAttachButton as oe } from "./controls/FileAttachButton.js";
|
|
15
15
|
import { createDropHandlers as se } from "./controls/createDropHandlers.js";
|
|
16
16
|
import { ContextLevelToggle as ce } from "./controls/ContextLevelToggle.js";
|
|
17
|
-
import { useCallback as s, useEffect as c, useMemo as l, useRef as
|
|
18
|
-
import { ArrowUp as
|
|
19
|
-
import { jsx as
|
|
17
|
+
import { useCallback as s, useEffect as c, useMemo as l, useRef as u, useState as d } from "react";
|
|
18
|
+
import { ArrowUp as le, ChevronDown as ue, Clock as de, Square as fe, X as pe } from "lucide-react";
|
|
19
|
+
import { jsx as f, jsxs as p } from "react/jsx-runtime";
|
|
20
20
|
//#region src/components/agent-manager/AgentManagerInputArea.tsx
|
|
21
|
-
var
|
|
21
|
+
var m = [
|
|
22
22
|
{
|
|
23
23
|
command: "/new",
|
|
24
24
|
description: "Create new session"
|
|
@@ -56,7 +56,7 @@ var p = [
|
|
|
56
56
|
command: "/help",
|
|
57
57
|
description: "Show available commands"
|
|
58
58
|
}
|
|
59
|
-
],
|
|
59
|
+
], h = [
|
|
60
60
|
"claude",
|
|
61
61
|
"codex",
|
|
62
62
|
"gemini",
|
|
@@ -73,16 +73,16 @@ var p = [
|
|
|
73
73
|
"pi",
|
|
74
74
|
"aider",
|
|
75
75
|
"plandex"
|
|
76
|
-
],
|
|
77
|
-
function
|
|
78
|
-
let [x, S] =
|
|
76
|
+
], g = ["sdk", "cli"];
|
|
77
|
+
function _({ agentId: _, sessionId: v, onSend: y, onCancel: b, mcpServers: me = [], agentTunnelUrl: he }) {
|
|
78
|
+
let [x, S] = d(""), [C, w] = d([]), [ge, T] = d(!1), [E, _e] = d(""), [D, O] = d(!1), [k, A] = d(!1), [j, M] = d(""), [ve, N] = d([]), P = e(), F = u(null), I = u(null);
|
|
79
79
|
c(() => {
|
|
80
80
|
F.current?.focus({ preventScroll: !0 });
|
|
81
81
|
}, []);
|
|
82
|
-
let L = i((e) => e.sessionStates[
|
|
83
|
-
id:
|
|
82
|
+
let L = i((e) => e.sessionStates[v]), R = i((e) => e.setSessionModel), z = i((e) => e.setSessionSdk), B = i((e) => e.setSessionMode), ye = i((e) => e.setSessionPermissionMode), be = i((e) => e.toggleVoice), xe = i((e) => e.toggleThinking), Se = i((e) => e.setSessionContextLevel), Ce = i((e) => e.setSessionVibe), we = i((e) => e.setSessionRootPath), V = i((e) => e.openSession), H = i((e) => e.addMessage), { vibes: Te, agents: U } = t(), { active: W } = n(l(() => U.find((e) => e.id === _) ?? null, [U, _])?.id ?? null), G = l(() => ({
|
|
83
|
+
id: _,
|
|
84
84
|
profile: W
|
|
85
|
-
}), [
|
|
85
|
+
}), [_, W]), { isListening: K, transcript: q, startListening: Ee, stopListening: De } = te(), J = L?.status === "streaming", Y = x.trim().length > 0 && !J;
|
|
86
86
|
c(() => {
|
|
87
87
|
q && K && S((e) => e + (e ? " " : "") + q);
|
|
88
88
|
}, [q, K]), c(() => {
|
|
@@ -97,7 +97,7 @@ function g({ agentId: g, sessionId: _, onSend: v, onCancel: y, mcpServers: he =
|
|
|
97
97
|
}, [G]), c(() => {
|
|
98
98
|
x.startsWith("/") && !x.includes(" ") ? (T(!0), _e(x.slice(1))) : T(!1);
|
|
99
99
|
}, [x]);
|
|
100
|
-
let Oe = l(() =>
|
|
100
|
+
let Oe = l(() => m.filter((e) => e.command.toLowerCase().includes(`/${E.toLowerCase()}`)), [E]);
|
|
101
101
|
c(() => {
|
|
102
102
|
let e = F.current;
|
|
103
103
|
e && (e.style.height = "auto", e.style.height = `${Math.min(e.scrollHeight, 200)}px`);
|
|
@@ -109,19 +109,18 @@ function g({ agentId: g, sessionId: _, onSend: v, onCancel: y, mcpServers: he =
|
|
|
109
109
|
return document.addEventListener("mousedown", e), () => document.removeEventListener("mousedown", e);
|
|
110
110
|
}, [D, k]);
|
|
111
111
|
let X = s((e) => {
|
|
112
|
-
H(
|
|
112
|
+
H(v, {
|
|
113
113
|
id: `sys-${Date.now()}-${Math.random().toString(36).slice(2, 7)}`,
|
|
114
114
|
role: "system",
|
|
115
115
|
content: e,
|
|
116
116
|
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
117
117
|
});
|
|
118
|
-
}, [H,
|
|
119
|
-
if (!(!x.trim() || !j || !
|
|
118
|
+
}, [H, v]), ke = s(async () => {
|
|
119
|
+
if (!(!x.trim() || !j || !_)) try {
|
|
120
120
|
let e = await ne({
|
|
121
|
-
sessionId:
|
|
122
|
-
agentTunnelUrl: b,
|
|
121
|
+
sessionId: v,
|
|
123
122
|
agentRef: {
|
|
124
|
-
agentId:
|
|
123
|
+
agentId: _,
|
|
125
124
|
profile: W ?? "default"
|
|
126
125
|
},
|
|
127
126
|
prompt: x.trim(),
|
|
@@ -134,9 +133,8 @@ function g({ agentId: g, sessionId: _, onSend: v, onCancel: y, mcpServers: he =
|
|
|
134
133
|
}, [
|
|
135
134
|
x,
|
|
136
135
|
j,
|
|
137
|
-
|
|
136
|
+
v,
|
|
138
137
|
_,
|
|
139
|
-
g,
|
|
140
138
|
W,
|
|
141
139
|
X
|
|
142
140
|
]), Z = s((e) => {
|
|
@@ -149,32 +147,32 @@ function g({ agentId: g, sessionId: _, onSend: v, onCancel: y, mcpServers: he =
|
|
|
149
147
|
X(r ? `Session renamed to "${r}".` : "Usage: /rename <name>");
|
|
150
148
|
break;
|
|
151
149
|
case "/model":
|
|
152
|
-
r ? (R(
|
|
150
|
+
r ? (R(v, r), X(`Model switched to "${r}".`)) : X("Usage: /model <model-name>");
|
|
153
151
|
break;
|
|
154
152
|
case "/sdk":
|
|
155
|
-
if (r &&
|
|
153
|
+
if (r && h.includes(r)) {
|
|
156
154
|
let e = r;
|
|
157
|
-
z(
|
|
158
|
-
} else X(`Usage: /sdk <${
|
|
155
|
+
z(v, e), ee(G, e, L?.model ?? "default").then((e) => R(v, e)).catch(() => R(v, L?.model ?? "default")), X(`SDK switched to "${r}".`);
|
|
156
|
+
} else X(`Usage: /sdk <${h.join("|")}>`);
|
|
159
157
|
break;
|
|
160
158
|
case "/mode":
|
|
161
|
-
r &&
|
|
159
|
+
r && g.includes(r) ? (B(v, r), X(`Mode switched to "${r}".`)) : X(`Usage: /mode <${g.join("|")}>`);
|
|
162
160
|
break;
|
|
163
161
|
case "/export": {
|
|
164
162
|
let e = r === "md" ? "md" : "json", t = L?.messages ?? [], n = e === "json" ? JSON.stringify(t, null, 2) : t.map((e) => `**${e.role}** (${e.timestamp ?? ""}):\n${e.content ?? ""}`).join("\n\n---\n\n"), i = new Blob([n], { type: e === "json" ? "application/json" : "text/markdown" }), a = URL.createObjectURL(i), o = document.createElement("a");
|
|
165
|
-
o.href = a, o.download = `conversation-${
|
|
163
|
+
o.href = a, o.download = `conversation-${v}.${e}`, o.click(), URL.revokeObjectURL(a), X(`Conversation exported as ${e}.`);
|
|
166
164
|
break;
|
|
167
165
|
}
|
|
168
166
|
case "/clear":
|
|
169
167
|
X("Conversation cleared.");
|
|
170
168
|
break;
|
|
171
169
|
case "/help":
|
|
172
|
-
X(`Available commands:\n${
|
|
170
|
+
X(`Available commands:\n${m.map((e) => ` ${e.command}${e.args ? " " + e.args : ""} - ${e.description}`).join("\n")}`);
|
|
173
171
|
break;
|
|
174
172
|
default: X(`Unknown command: ${n}. Type /help for available commands.`);
|
|
175
173
|
}
|
|
176
174
|
}, [
|
|
177
|
-
|
|
175
|
+
v,
|
|
178
176
|
L?.messages,
|
|
179
177
|
L?.model,
|
|
180
178
|
V,
|
|
@@ -192,98 +190,98 @@ function g({ agentId: g, sessionId: _, onSend: v, onCancel: y, mcpServers: he =
|
|
|
192
190
|
Z(e), S(""), w([]);
|
|
193
191
|
return;
|
|
194
192
|
}
|
|
195
|
-
|
|
193
|
+
y(e, C.length > 0 ? C : void 0), S(""), w([]);
|
|
196
194
|
}, [
|
|
197
195
|
Y,
|
|
198
196
|
x,
|
|
199
197
|
C,
|
|
200
|
-
|
|
198
|
+
y,
|
|
201
199
|
Z
|
|
202
200
|
]), je = s((e) => {
|
|
203
201
|
e.key === "Enter" && !e.shiftKey && (e.preventDefault(), Q());
|
|
204
202
|
}, [Q]), Me = s(() => {
|
|
205
|
-
|
|
206
|
-
}, [
|
|
203
|
+
b?.();
|
|
204
|
+
}, [b]), $ = s((e) => {
|
|
207
205
|
w((t) => [...t, ...e]);
|
|
208
206
|
}, []), Ne = s((e) => {
|
|
209
207
|
w((t) => t.filter((t, n) => n !== e));
|
|
210
208
|
}, []), Pe = se($);
|
|
211
|
-
return L ? /* @__PURE__ */
|
|
209
|
+
return L ? /* @__PURE__ */ p("div", {
|
|
212
210
|
className: "relative z-30 border-t border-border-default bg-bg-surface",
|
|
213
211
|
...Pe,
|
|
214
212
|
children: [
|
|
215
|
-
ge && Oe.length > 0 && /* @__PURE__ */
|
|
213
|
+
ge && Oe.length > 0 && /* @__PURE__ */ f("div", {
|
|
216
214
|
className: "absolute bottom-full left-0 right-0 mb-1 mx-3 bg-bg-elevated border border-border-default rounded-lg shadow-lg max-h-48 overflow-y-auto z-50",
|
|
217
|
-
children: Oe.map((e) => /* @__PURE__ */
|
|
215
|
+
children: Oe.map((e) => /* @__PURE__ */ p("button", {
|
|
218
216
|
type: "button",
|
|
219
217
|
onClick: () => Ae(e),
|
|
220
218
|
className: "flex items-center gap-2 w-full px-3 py-2 text-left hover:bg-bg-sunken transition-colors",
|
|
221
219
|
children: [
|
|
222
|
-
/* @__PURE__ */
|
|
220
|
+
/* @__PURE__ */ f("span", {
|
|
223
221
|
className: "font-mono text-xs text-text-primary",
|
|
224
222
|
children: e.command
|
|
225
223
|
}),
|
|
226
|
-
e.args && /* @__PURE__ */
|
|
224
|
+
e.args && /* @__PURE__ */ f("span", {
|
|
227
225
|
className: "text-text-tertiary text-xs",
|
|
228
226
|
children: e.args
|
|
229
227
|
}),
|
|
230
|
-
/* @__PURE__ */
|
|
228
|
+
/* @__PURE__ */ f("span", {
|
|
231
229
|
className: "text-text-secondary text-xs ml-auto",
|
|
232
230
|
children: e.description
|
|
233
231
|
})
|
|
234
232
|
]
|
|
235
233
|
}, e.command))
|
|
236
234
|
}),
|
|
237
|
-
C.length > 0 && /* @__PURE__ */
|
|
235
|
+
C.length > 0 && /* @__PURE__ */ f("div", {
|
|
238
236
|
className: "flex items-center gap-2 px-3 pt-2 overflow-x-auto",
|
|
239
|
-
children: C.map((e, t) => /* @__PURE__ */
|
|
237
|
+
children: C.map((e, t) => /* @__PURE__ */ p("div", {
|
|
240
238
|
className: "flex items-center gap-1.5 px-2 py-1 rounded-md bg-bg-elevated border border-border-default text-xs text-text-secondary",
|
|
241
|
-
children: [/* @__PURE__ */
|
|
239
|
+
children: [/* @__PURE__ */ f("span", {
|
|
242
240
|
className: "truncate max-w-[120px]",
|
|
243
241
|
children: e.name
|
|
244
|
-
}), /* @__PURE__ */
|
|
242
|
+
}), /* @__PURE__ */ f("button", {
|
|
245
243
|
type: "button",
|
|
246
244
|
onClick: () => Ne(t),
|
|
247
245
|
className: "p-0.5 rounded hover:bg-bg-sunken transition-colors flex-shrink-0",
|
|
248
|
-
children: /* @__PURE__ */
|
|
246
|
+
children: /* @__PURE__ */ f(pe, { className: "size-3" })
|
|
249
247
|
})]
|
|
250
248
|
}, `${e.name}-${t}`))
|
|
251
249
|
}),
|
|
252
|
-
/* @__PURE__ */
|
|
250
|
+
/* @__PURE__ */ p("div", {
|
|
253
251
|
className: "flex flex-wrap items-center gap-1 px-3 pt-2 pb-1 overflow-x-auto",
|
|
254
252
|
children: [
|
|
255
|
-
/* @__PURE__ */
|
|
253
|
+
/* @__PURE__ */ f(o, {
|
|
256
254
|
sdk: L.sdk,
|
|
257
255
|
mode: L.mode,
|
|
258
256
|
providers: ve,
|
|
259
257
|
onSdkChange: (e) => {
|
|
260
|
-
z(
|
|
258
|
+
z(v, e), ee(G, e, L.model ?? "default").then((e) => R(v, e)).catch(() => R(v, L.model ?? "default"));
|
|
261
259
|
},
|
|
262
|
-
onModeChange: (e) => B(
|
|
260
|
+
onModeChange: (e) => B(v, e)
|
|
263
261
|
}),
|
|
264
|
-
/* @__PURE__ */
|
|
262
|
+
/* @__PURE__ */ f(a, {
|
|
265
263
|
value: L.model,
|
|
266
|
-
onChange: (e) => R(
|
|
264
|
+
onChange: (e) => R(v, e),
|
|
267
265
|
provider: L.sdk,
|
|
268
|
-
agentId:
|
|
266
|
+
agentId: _
|
|
269
267
|
}),
|
|
270
|
-
/* @__PURE__ */
|
|
268
|
+
/* @__PURE__ */ f(re, {
|
|
271
269
|
value: L.permissionMode,
|
|
272
270
|
mode: L.mode,
|
|
273
|
-
onChange: (e) => ye(
|
|
271
|
+
onChange: (e) => ye(v, e)
|
|
274
272
|
}),
|
|
275
|
-
/* @__PURE__ */
|
|
273
|
+
/* @__PURE__ */ f(ie, {
|
|
276
274
|
selected: L.mcpServers,
|
|
277
|
-
available:
|
|
275
|
+
available: me,
|
|
278
276
|
onChange: () => {}
|
|
279
277
|
}),
|
|
280
|
-
/* @__PURE__ */
|
|
278
|
+
/* @__PURE__ */ f(ce, {
|
|
281
279
|
agentId: "",
|
|
282
|
-
sessionId:
|
|
280
|
+
sessionId: v,
|
|
283
281
|
contextLevel: L.contextLevel,
|
|
284
282
|
rootPath: L.rootPath,
|
|
285
283
|
onChange: (e, t, n) => {
|
|
286
|
-
Se(
|
|
284
|
+
Se(v, e), we(v, t ?? null), Ce(v, n ?? null, t ?? null);
|
|
287
285
|
},
|
|
288
286
|
vibes: Te.map((e) => ({
|
|
289
287
|
id: e.id,
|
|
@@ -291,25 +289,25 @@ function g({ agentId: g, sessionId: _, onSend: v, onCancel: y, mcpServers: he =
|
|
|
291
289
|
path: e.path
|
|
292
290
|
}))
|
|
293
291
|
}),
|
|
294
|
-
/* @__PURE__ */
|
|
295
|
-
/* @__PURE__ */
|
|
292
|
+
/* @__PURE__ */ f("div", { className: "flex-1" }),
|
|
293
|
+
/* @__PURE__ */ f("button", {
|
|
296
294
|
type: "button",
|
|
297
|
-
onClick: () => xe(
|
|
295
|
+
onClick: () => xe(v),
|
|
298
296
|
className: `p-1.5 rounded text-xs font-medium transition-colors ${L.showThinking ? "bg-action-primary-bg/10 text-action-primary-text" : "text-text-tertiary hover:text-text-secondary"}`,
|
|
299
297
|
title: L.showThinking ? P("vibecontrols.agentManager.inputArea.hideThinking", "Hide thinking") : P("vibecontrols.agentManager.inputArea.showThinking", "Show thinking"),
|
|
300
298
|
children: "Think"
|
|
301
299
|
}),
|
|
302
|
-
/* @__PURE__ */
|
|
300
|
+
/* @__PURE__ */ p("button", {
|
|
303
301
|
type: "button",
|
|
304
302
|
onClick: () => {
|
|
305
303
|
let e = window.prompt("Context history limit (messages sent with each prompt):", String(L.contextHistoryLimit));
|
|
306
304
|
if (e !== null) {
|
|
307
305
|
let t = parseInt(e, 10);
|
|
308
306
|
if (!isNaN(t) && t >= 0) {
|
|
309
|
-
let e = i.getState().sessionStates[
|
|
307
|
+
let e = i.getState().sessionStates[v];
|
|
310
308
|
e && i.setState((n) => ({ sessionStates: {
|
|
311
309
|
...n.sessionStates,
|
|
312
|
-
[
|
|
310
|
+
[v]: {
|
|
313
311
|
...e,
|
|
314
312
|
contextHistoryLimit: t
|
|
315
313
|
}
|
|
@@ -321,19 +319,19 @@ function g({ agentId: g, sessionId: _, onSend: v, onCancel: y, mcpServers: he =
|
|
|
321
319
|
title: `Context history: last ${L.contextHistoryLimit} messages sent with each prompt`,
|
|
322
320
|
children: ["H:", L.contextHistoryLimit]
|
|
323
321
|
}),
|
|
324
|
-
/* @__PURE__ */
|
|
322
|
+
/* @__PURE__ */ f(ae, {
|
|
325
323
|
enabled: L.voiceEnabled,
|
|
326
324
|
onToggle: () => {
|
|
327
|
-
be(
|
|
325
|
+
be(v), L.voiceEnabled ? De() : Ee();
|
|
328
326
|
},
|
|
329
327
|
isListening: K
|
|
330
328
|
}),
|
|
331
|
-
/* @__PURE__ */
|
|
329
|
+
/* @__PURE__ */ f(oe, { onFileSelect: $ })
|
|
332
330
|
]
|
|
333
331
|
}),
|
|
334
|
-
/* @__PURE__ */
|
|
332
|
+
/* @__PURE__ */ p("div", {
|
|
335
333
|
className: "flex items-end gap-2 px-3 pb-3 pt-1",
|
|
336
|
-
children: [/* @__PURE__ */
|
|
334
|
+
children: [/* @__PURE__ */ f("textarea", {
|
|
337
335
|
"aria-label": "control",
|
|
338
336
|
ref: F,
|
|
339
337
|
value: x,
|
|
@@ -343,61 +341,61 @@ function g({ agentId: g, sessionId: _, onSend: v, onCancel: y, mcpServers: he =
|
|
|
343
341
|
rows: 1,
|
|
344
342
|
className: "flex-1 resize-none rounded-lg border border-border-default bg-bg-primary px-3 py-2 text-sm text-text-primary placeholder:text-text-tertiary focus:outline-none focus:border-border-strong transition-colors",
|
|
345
343
|
disabled: J
|
|
346
|
-
}), J ? /* @__PURE__ */
|
|
344
|
+
}), J ? /* @__PURE__ */ f("button", {
|
|
347
345
|
type: "button",
|
|
348
346
|
onClick: Me,
|
|
349
347
|
className: "flex-shrink-0 p-2 rounded-lg bg-status-error-bg text-status-error-text hover:opacity-90 transition-opacity",
|
|
350
348
|
title: P("vibecontrols.agentManager.inputArea.cancel", "Cancel"),
|
|
351
|
-
children: /* @__PURE__ */
|
|
352
|
-
}) : /* @__PURE__ */
|
|
349
|
+
children: /* @__PURE__ */ f(fe, { className: "size-4" })
|
|
350
|
+
}) : /* @__PURE__ */ p("div", {
|
|
353
351
|
className: "flex items-end flex-shrink-0 relative",
|
|
354
352
|
ref: I,
|
|
355
353
|
children: [
|
|
356
|
-
/* @__PURE__ */
|
|
354
|
+
/* @__PURE__ */ f("button", {
|
|
357
355
|
type: "button",
|
|
358
356
|
onClick: Q,
|
|
359
357
|
disabled: !Y,
|
|
360
358
|
className: "p-2 rounded-l-lg bg-action-primary-bg text-action-primary-text hover:bg-action-primary-bg-hover disabled:opacity-40 disabled:cursor-not-allowed transition-colors",
|
|
361
359
|
title: P("vibecontrols.agentManager.inputArea.send", "Send (Enter)"),
|
|
362
|
-
children: /* @__PURE__ */
|
|
360
|
+
children: /* @__PURE__ */ f(le, { className: "size-4" })
|
|
363
361
|
}),
|
|
364
|
-
/* @__PURE__ */
|
|
362
|
+
/* @__PURE__ */ f("button", {
|
|
365
363
|
type: "button",
|
|
366
364
|
onClick: () => O(!D),
|
|
367
365
|
disabled: !Y,
|
|
368
366
|
className: "ml-1 p-2 rounded-r-lg border-l border-action-primary-text/20 bg-action-primary-bg text-action-primary-text hover:bg-action-primary-bg-hover disabled:opacity-40 disabled:cursor-not-allowed transition-colors",
|
|
369
367
|
title: P("vibecontrols.agentManager.inputArea.scheduleSend", "Schedule send"),
|
|
370
|
-
children: /* @__PURE__ */
|
|
368
|
+
children: /* @__PURE__ */ f(ue, { className: "size-3" })
|
|
371
369
|
}),
|
|
372
|
-
D && /* @__PURE__ */
|
|
370
|
+
D && /* @__PURE__ */ f("div", {
|
|
373
371
|
className: "absolute bottom-full right-0 mb-1 w-56 bg-bg-surface border border-border-default rounded-md shadow-lg py-1 z-50",
|
|
374
|
-
children: k ? /* @__PURE__ */
|
|
372
|
+
children: k ? /* @__PURE__ */ p("div", {
|
|
375
373
|
className: "px-3 py-2 space-y-2",
|
|
376
374
|
children: [
|
|
377
|
-
/* @__PURE__ */
|
|
375
|
+
/* @__PURE__ */ f("label", {
|
|
378
376
|
className: "block text-[11px] font-medium text-text-secondary",
|
|
379
377
|
children: P("vibecontrols.agentManager.inputArea.sendAt", "Send at:")
|
|
380
378
|
}),
|
|
381
|
-
/* @__PURE__ */
|
|
379
|
+
/* @__PURE__ */ f("input", {
|
|
382
380
|
"aria-label": "control",
|
|
383
381
|
type: "datetime-local",
|
|
384
382
|
value: j,
|
|
385
383
|
onChange: (e) => M(e.target.value),
|
|
386
384
|
className: "w-full px-2 py-1 text-xs rounded border border-border-default bg-bg-primary text-text-primary focus:outline-none focus:border-border-strong"
|
|
387
385
|
}),
|
|
388
|
-
/* @__PURE__ */
|
|
386
|
+
/* @__PURE__ */ f("button", {
|
|
389
387
|
type: "button",
|
|
390
388
|
onClick: () => void ke(),
|
|
391
|
-
disabled: !j || !
|
|
389
|
+
disabled: !j || !_,
|
|
392
390
|
className: "w-full px-2 py-1.5 text-xs font-medium rounded bg-action-primary-bg text-action-primary-text hover:bg-action-primary-bg-hover disabled:opacity-40 disabled:cursor-not-allowed transition-colors",
|
|
393
391
|
children: P("vibecontrols.agentManager.inputArea.schedule", "Schedule")
|
|
394
392
|
})
|
|
395
393
|
]
|
|
396
|
-
}) : /* @__PURE__ */
|
|
394
|
+
}) : /* @__PURE__ */ p("button", {
|
|
397
395
|
type: "button",
|
|
398
396
|
onClick: () => A(!0),
|
|
399
397
|
className: "flex items-center gap-2 w-full px-3 py-2 text-left text-xs text-text-primary hover:bg-bg-sunken transition-colors",
|
|
400
|
-
children: [/* @__PURE__ */
|
|
398
|
+
children: [/* @__PURE__ */ f(de, { className: "size-3.5 text-text-secondary" }), P("vibecontrols.agentManager.inputArea.scheduleSendEllipsis", "Schedule Send...")]
|
|
401
399
|
})
|
|
402
400
|
})
|
|
403
401
|
]
|
|
@@ -407,6 +405,6 @@ function g({ agentId: g, sessionId: _, onSend: v, onCancel: y, mcpServers: he =
|
|
|
407
405
|
}) : null;
|
|
408
406
|
}
|
|
409
407
|
//#endregion
|
|
410
|
-
export {
|
|
408
|
+
export { _ as AgentManagerInputArea };
|
|
411
409
|
|
|
412
410
|
//# sourceMappingURL=AgentManagerInputArea.js.map
|