@elizaos/plugin-task-coordinator 2.0.3-beta.2 → 2.0.3-beta.4
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/assets/hero.png +0 -0
- package/dist/AgentTabsSection.d.ts +16 -0
- package/dist/AgentTabsSection.d.ts.map +1 -0
- package/dist/AgentTabsSection.js +169 -0
- package/dist/AgentTabsSection.js.map +1 -0
- package/dist/CodingAgentControlChip.d.ts +2 -0
- package/dist/CodingAgentControlChip.d.ts.map +1 -0
- package/dist/CodingAgentControlChip.js +73 -0
- package/dist/CodingAgentControlChip.js.map +1 -0
- package/dist/CodingAgentSettingsSection.d.ts +2 -0
- package/dist/CodingAgentSettingsSection.d.ts.map +1 -0
- package/dist/CodingAgentSettingsSection.js +379 -0
- package/dist/CodingAgentSettingsSection.js.map +1 -0
- package/dist/CodingAgentTasksPanel.d.ts +4 -0
- package/dist/CodingAgentTasksPanel.d.ts.map +1 -0
- package/dist/CodingAgentTasksPanel.interact.d.ts +2 -0
- package/dist/CodingAgentTasksPanel.interact.d.ts.map +1 -0
- package/dist/CodingAgentTasksPanel.interact.js +46 -0
- package/dist/CodingAgentTasksPanel.interact.js.map +1 -0
- package/dist/CodingAgentTasksPanel.js +740 -0
- package/dist/CodingAgentTasksPanel.js.map +1 -0
- package/dist/GitHubConnectionCard.d.ts +2 -0
- package/dist/GitHubConnectionCard.d.ts.map +1 -0
- package/dist/GitHubConnectionCard.js +172 -0
- package/dist/GitHubConnectionCard.js.map +1 -0
- package/dist/GlobalPrefsSection.d.ts +10 -0
- package/dist/GlobalPrefsSection.d.ts.map +1 -0
- package/dist/GlobalPrefsSection.js +166 -0
- package/dist/GlobalPrefsSection.js.map +1 -0
- package/dist/LlmProviderSection.d.ts +10 -0
- package/dist/LlmProviderSection.d.ts.map +1 -0
- package/dist/LlmProviderSection.js +161 -0
- package/dist/LlmProviderSection.js.map +1 -0
- package/dist/ModelConfigSection.d.ts +15 -0
- package/dist/ModelConfigSection.d.ts.map +1 -0
- package/dist/ModelConfigSection.js +86 -0
- package/dist/ModelConfigSection.js.map +1 -0
- package/dist/OrchestratorView.d.ts +20 -0
- package/dist/OrchestratorView.d.ts.map +1 -0
- package/dist/OrchestratorView.js +231 -0
- package/dist/OrchestratorView.js.map +1 -0
- package/dist/OrchestratorWorkbench.d.ts +32 -0
- package/dist/OrchestratorWorkbench.d.ts.map +1 -0
- package/dist/OrchestratorWorkbench.js +3200 -0
- package/dist/OrchestratorWorkbench.js.map +1 -0
- package/dist/PtyConsoleBase.d.ts +9 -0
- package/dist/PtyConsoleBase.d.ts.map +1 -0
- package/dist/PtyConsoleBase.js +174 -0
- package/dist/PtyConsoleBase.js.map +1 -0
- package/dist/PtyConsoleDrawer.d.ts +10 -0
- package/dist/PtyConsoleDrawer.d.ts.map +1 -0
- package/dist/PtyConsoleDrawer.js +77 -0
- package/dist/PtyConsoleDrawer.js.map +1 -0
- package/dist/PtyConsoleSidePanel.d.ts +8 -0
- package/dist/PtyConsoleSidePanel.d.ts.map +1 -0
- package/dist/PtyConsoleSidePanel.js +9 -0
- package/dist/PtyConsoleSidePanel.js.map +1 -0
- package/dist/PtyTerminalPane.d.ts +10 -0
- package/dist/PtyTerminalPane.d.ts.map +1 -0
- package/dist/PtyTerminalPane.js +147 -0
- package/dist/PtyTerminalPane.js.map +1 -0
- package/dist/TaskCardList.d.ts +76 -0
- package/dist/TaskCardList.d.ts.map +1 -0
- package/dist/TaskCardList.js +327 -0
- package/dist/TaskCardList.js.map +1 -0
- package/dist/TaskCoordinatorView.d.ts +20 -0
- package/dist/TaskCoordinatorView.d.ts.map +1 -0
- package/dist/TaskCoordinatorView.js +146 -0
- package/dist/TaskCoordinatorView.js.map +1 -0
- package/dist/__e2e__/dashboard-fixture.d.ts +9 -0
- package/dist/__e2e__/dashboard-fixture.d.ts.map +1 -0
- package/dist/__e2e__/dashboard-fixture.js +123 -0
- package/dist/__e2e__/dashboard-fixture.js.map +1 -0
- package/dist/api/coding-agents-auth-sanitize.d.ts +23 -0
- package/dist/api/coding-agents-auth-sanitize.d.ts.map +1 -0
- package/dist/api/coding-agents-auth-sanitize.js +22 -0
- package/dist/api/coding-agents-auth-sanitize.js.map +1 -0
- package/dist/api/coding-agents-preflight-normalize.d.ts +29 -0
- package/dist/api/coding-agents-preflight-normalize.d.ts.map +1 -0
- package/dist/api/coding-agents-preflight-normalize.js +20 -0
- package/dist/api/coding-agents-preflight-normalize.js.map +1 -0
- package/dist/coding-agent-settings-shared.d.ts +42 -0
- package/dist/coding-agent-settings-shared.d.ts.map +1 -0
- package/dist/coding-agent-settings-shared.js +121 -0
- package/dist/coding-agent-settings-shared.js.map +1 -0
- package/dist/components/OrchestratorSpatialView.d.ts +56 -0
- package/dist/components/OrchestratorSpatialView.d.ts.map +1 -0
- package/dist/components/OrchestratorSpatialView.js +501 -0
- package/dist/components/OrchestratorSpatialView.js.map +1 -0
- package/dist/components/TaskCoordinatorSpatialView.d.ts +59 -0
- package/dist/components/TaskCoordinatorSpatialView.d.ts.map +1 -0
- package/dist/components/TaskCoordinatorSpatialView.js +294 -0
- package/dist/components/TaskCoordinatorSpatialView.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +286 -0
- package/dist/index.js.map +1 -0
- package/dist/orchestrator-capabilities.d.ts +3 -0
- package/dist/orchestrator-capabilities.d.ts.map +1 -0
- package/dist/orchestrator-capabilities.js +136 -0
- package/dist/orchestrator-capabilities.js.map +1 -0
- package/dist/orchestrator-command.d.ts +39 -0
- package/dist/orchestrator-command.d.ts.map +1 -0
- package/dist/orchestrator-command.js +52 -0
- package/dist/orchestrator-command.js.map +1 -0
- package/dist/orchestrator-diff.d.ts +19 -0
- package/dist/orchestrator-diff.d.ts.map +1 -0
- package/dist/orchestrator-diff.helpers.d.ts +18 -0
- package/dist/orchestrator-diff.helpers.d.ts.map +1 -0
- package/dist/orchestrator-diff.helpers.js +76 -0
- package/dist/orchestrator-diff.helpers.js.map +1 -0
- package/dist/orchestrator-diff.js +119 -0
- package/dist/orchestrator-diff.js.map +1 -0
- package/dist/orchestrator-markdown.d.ts +5 -0
- package/dist/orchestrator-markdown.d.ts.map +1 -0
- package/dist/orchestrator-markdown.helpers.d.ts +2 -0
- package/dist/orchestrator-markdown.helpers.d.ts.map +1 -0
- package/dist/orchestrator-markdown.helpers.js +21 -0
- package/dist/orchestrator-markdown.helpers.js.map +1 -0
- package/dist/orchestrator-markdown.js +199 -0
- package/dist/orchestrator-markdown.js.map +1 -0
- package/dist/orchestrator-params.d.ts +8 -0
- package/dist/orchestrator-params.d.ts.map +1 -0
- package/dist/orchestrator-params.js +27 -0
- package/dist/orchestrator-params.js.map +1 -0
- package/dist/orchestrator-plan.d.ts +5 -0
- package/dist/orchestrator-plan.d.ts.map +1 -0
- package/dist/orchestrator-plan.js +95 -0
- package/dist/orchestrator-plan.js.map +1 -0
- package/dist/orchestrator-reasoning.d.ts +21 -0
- package/dist/orchestrator-reasoning.d.ts.map +1 -0
- package/dist/orchestrator-reasoning.js +105 -0
- package/dist/orchestrator-reasoning.js.map +1 -0
- package/dist/orchestrator-stream.d.ts +15 -0
- package/dist/orchestrator-stream.d.ts.map +1 -0
- package/dist/orchestrator-stream.helpers.d.ts +89 -0
- package/dist/orchestrator-stream.helpers.d.ts.map +1 -0
- package/dist/orchestrator-stream.helpers.js +361 -0
- package/dist/orchestrator-stream.helpers.js.map +1 -0
- package/dist/orchestrator-stream.js +307 -0
- package/dist/orchestrator-stream.js.map +1 -0
- package/dist/pty-status-dots.d.ts +2 -0
- package/dist/pty-status-dots.d.ts.map +1 -0
- package/dist/pty-status-dots.js +6 -0
- package/dist/pty-status-dots.js.map +1 -0
- package/dist/register-slots.d.ts +20 -0
- package/dist/register-slots.d.ts.map +1 -0
- package/dist/register-slots.js +50 -0
- package/dist/register-slots.js.map +1 -0
- package/dist/register-terminal-view.d.ts +21 -0
- package/dist/register-terminal-view.d.ts.map +1 -0
- package/dist/register-terminal-view.js +46 -0
- package/dist/register-terminal-view.js.map +1 -0
- package/dist/register.d.ts +2 -0
- package/dist/register.d.ts.map +1 -0
- package/dist/register.js +23 -0
- package/dist/register.js.map +1 -0
- package/dist/session-hydration.d.ts +2 -0
- package/dist/session-hydration.d.ts.map +1 -0
- package/dist/session-hydration.js +9 -0
- package/dist/session-hydration.js.map +1 -0
- package/dist/task-coordinator-view-bundle.d.ts +4 -0
- package/dist/task-coordinator-view-bundle.d.ts.map +1 -0
- package/dist/task-coordinator-view-bundle.js +9 -0
- package/dist/task-coordinator-view-bundle.js.map +1 -0
- package/dist/ui.d.ts +2 -0
- package/dist/ui.d.ts.map +1 -0
- package/dist/ui.js +13 -0
- package/dist/ui.js.map +1 -0
- package/dist/view-format.d.ts +25 -0
- package/dist/view-format.d.ts.map +1 -0
- package/dist/view-format.js +64 -0
- package/dist/view-format.js.map +1 -0
- package/dist/views/bundle.js +1383 -0
- package/dist/views/bundle.js.map +1 -0
- package/package.json +7 -6
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/CodingAgentTasksPanel.tsx"],"sourcesContent":["import {\n ApiError,\n Button,\n type CodingAgentTaskThread,\n type CodingAgentTaskThreadDetail,\n client,\n useAppSelectorShallow,\n} from \"@elizaos/ui\";\nimport { useAgentElement } from \"@elizaos/ui/agent-surface\";\nimport { Archive, Bot, ListChecks, Terminal } from \"lucide-react\";\nimport {\n type ReactNode,\n useDeferredValue,\n useEffect,\n useMemo,\n useState,\n} from \"react\";\nimport {\n BackChip,\n SparseWatermark,\n TaskCard,\n TaskCountChip,\n TaskEmptyState,\n TaskListHeader,\n TaskMetaChip,\n TaskSearchInput,\n TaskStatusMedallion,\n} from \"./TaskCardList.js\";\n\nconst ANSI_ESCAPE_PATTERN = new RegExp(\n [\n \"\\\\u001b(?:\",\n \"\\\\[[0-9;?]*[A-Za-z]|\\\\][^\\\\u0007]*\\\\u0007|[()][0-9A-Za-z])\",\n ].join(\"\"),\n \"g\",\n);\nconst fallbackTranslate = (\n key: string,\n vars?: Record<string, unknown>,\n): string => String(vars?.defaultValue ?? key);\n\nfunction formatRelativeTime(ts: number, locale?: string): string {\n const delta = Math.max(0, Math.floor((Date.now() - ts) / 1000));\n const formatter = new Intl.RelativeTimeFormat(locale, { numeric: \"auto\" });\n if (delta < 5) return formatter.format(0, \"second\");\n if (delta < 60) return formatter.format(-delta, \"second\");\n const minutes = Math.floor(delta / 60);\n if (minutes < 60) return formatter.format(-minutes, \"minute\");\n const hours = Math.floor(minutes / 60);\n if (hours < 24) return formatter.format(-hours, \"hour\");\n return formatter.format(-Math.floor(hours / 24), \"day\");\n}\n\nfunction stripAnsi(str: string): string {\n return str.replace(ANSI_ESCAPE_PATTERN, \"\").trim();\n}\n\nfunction formatIsoTime(\n value: string | null | undefined,\n locale: string | undefined,\n t: typeof fallbackTranslate,\n): string {\n if (!value) {\n return t(\"codingagenttaskspanel.unknown\", {\n defaultValue: \"Unknown\",\n });\n }\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) {\n return t(\"codingagenttaskspanel.unknown\", {\n defaultValue: \"Unknown\",\n });\n }\n return formatRelativeTime(date.getTime(), locale);\n}\n\nfunction formatThreadStatus(\n status: string,\n t: typeof fallbackTranslate,\n): string {\n const mapped: Record<string, string> = {\n open: \"codingagenttaskspanel.status.open\",\n active: \"codingagenttaskspanel.status.active\",\n waiting_on_user: \"codingagenttaskspanel.status.waitingOnUser\",\n blocked: \"codingagenttaskspanel.status.blocked\",\n validating: \"codingagenttaskspanel.status.validating\",\n done: \"codingagenttaskspanel.status.done\",\n failed: \"codingagenttaskspanel.status.failed\",\n archived: \"codingagenttaskspanel.status.archived\",\n interrupted: \"codingagenttaskspanel.status.interrupted\",\n };\n return t(mapped[status] ?? \"codingagenttaskspanel.status.unknown\", {\n defaultValue: status.replace(/_/g, \" \"),\n });\n}\n\n// Only meaningful kinds get a label; generic/unknown kinds (e.g. \"task\") carry\n// no signal and must not render a chip.\nconst THREAD_KIND_LABELS: Record<string, string> = {\n coding: \"codingagenttaskspanel.kind.coding\",\n};\n\nfunction formatThreadKind(\n kind: string,\n t: typeof fallbackTranslate,\n): string | null {\n const key = THREAD_KIND_LABELS[kind];\n if (!key) return null;\n return t(key, { defaultValue: kind });\n}\n\nfunction getWorkspaceChangesSummary(\n metadata: Record<string, unknown>,\n): { files: string[]; total: number } | null {\n const raw = metadata.workspaceChanges;\n if (!raw || typeof raw !== \"object\" || Array.isArray(raw)) {\n return null;\n }\n const workspaceChanges = raw as {\n changedFiles?: unknown;\n totalChangedFiles?: unknown;\n };\n const changedFiles = Array.isArray(workspaceChanges.changedFiles)\n ? workspaceChanges.changedFiles.filter(\n (value): value is string => typeof value === \"string\",\n )\n : [];\n const total =\n typeof workspaceChanges.totalChangedFiles === \"number\"\n ? workspaceChanges.totalChangedFiles\n : changedFiles.length;\n if (total <= 0 || changedFiles.length === 0) {\n return null;\n }\n return {\n files: changedFiles,\n total,\n };\n}\n\nfunction getClientErrorMessage(error: unknown, fallback: string): string {\n return error instanceof Error ? error.message : fallback;\n}\n\nfunction DetailList({\n title,\n children,\n}: {\n title: string;\n children: ReactNode;\n}) {\n return (\n <div className=\"space-y-1.5\">\n <div className=\"text-2xs font-semibold uppercase tracking-[0.08em] text-muted/70\">\n {title}\n </div>\n {children}\n </div>\n );\n}\n\nfunction ThreadActionButton({\n agentId,\n label,\n description,\n variant,\n disabled,\n onClick,\n className,\n}: {\n agentId: string;\n label: string;\n description: string;\n variant: \"secondary\";\n disabled: boolean;\n onClick: () => void;\n className: string;\n}) {\n const { ref, agentProps } = useAgentElement<HTMLButtonElement>({\n id: agentId,\n role: \"button\",\n label,\n group: \"thread-actions\",\n description,\n });\n return (\n <Button\n ref={ref}\n variant={variant}\n size=\"sm\"\n disabled={disabled}\n onClick={onClick}\n className={className}\n aria-label={label}\n {...agentProps}\n >\n {label}\n </Button>\n );\n}\n\nfunction ThreadDetailContent({\n detail,\n busy,\n onDelete,\n onReopen,\n t,\n locale,\n}: {\n detail: CodingAgentTaskThreadDetail;\n busy: boolean;\n onDelete: () => void;\n onReopen: () => void;\n t: typeof fallbackTranslate;\n locale?: string;\n}) {\n const latestTranscripts = (detail.transcripts ?? [])\n .filter(\n (entry) => entry.direction === \"stdin\" || entry.direction === \"system\",\n )\n .slice(-8)\n .reverse();\n const latestEvents = (detail.events ?? []).slice(-6).reverse();\n const latestDecisions = (detail.decisions ?? []).slice(-6).reverse();\n const latestArtifacts = (detail.artifacts ?? []).slice(-6).reverse();\n const pendingDecisions = (detail.pendingDecisions ?? []).slice(-4).reverse();\n\n return (\n <div className=\"flex flex-col gap-4\">\n <div className=\"flex flex-wrap gap-3 text-2xs text-muted\">\n <span>\n {t(\"codingagenttaskspanel.sessionsCount\", {\n defaultValue: \"{{count}} sessions\",\n count: (detail.sessions ?? []).length,\n })}\n </span>\n <span>\n {t(\"codingagenttaskspanel.artifactsCount\", {\n defaultValue: \"{{count}} artifacts\",\n count: (detail.artifacts ?? []).length,\n })}\n </span>\n <span>\n {t(\"codingagenttaskspanel.transcriptEntriesCount\", {\n defaultValue: \"{{count}} transcript entries\",\n count: (detail.transcripts ?? []).length,\n })}\n </span>\n </div>\n\n {detail.acceptanceCriteria && detail.acceptanceCriteria.length > 0 ? (\n <div>\n <div className=\"mb-1 text-2xs font-semibold uppercase tracking-[0.08em] text-muted\">\n {t(\"codingagenttaskspanel.acceptance\", {\n defaultValue: \"Acceptance\",\n })}\n </div>\n <div className=\"space-y-0.5\">\n {detail.acceptanceCriteria.map((criterion) => (\n <div\n key={`${detail.id}-criterion-${criterion}`}\n className=\"text-xs-tight text-txt\"\n >\n {criterion}\n </div>\n ))}\n </div>\n </div>\n ) : null}\n\n <DetailList\n title={t(\"codingagenttaskspanel.sessions\", {\n defaultValue: \"Sessions\",\n })}\n >\n {(detail.sessions ?? []).length === 0 ? (\n <div className=\"text-xs-tight text-muted\">\n {t(\"codingagenttaskspanel.noSessionsRecorded\", {\n defaultValue: \"None\",\n })}\n </div>\n ) : (\n <div className=\"space-y-1.5\">\n {(detail.sessions ?? [])\n .slice(-4)\n .reverse()\n .map((session) => (\n <div key={session.id} className=\"text-xs-tight text-txt\">\n <div className=\"font-medium\">{session.label}</div>\n <div className=\"text-muted\">\n {session.framework}\n {session.providerSource\n ? ` (${session.providerSource})`\n : \"\"}\n {\" · \"}\n {formatThreadStatus(session.status, t)} ·{\" \"}\n {session.workdir ||\n session.repo ||\n t(\"codingagenttaskspanel.noWorkspace\", {\n defaultValue: \"None\",\n })}\n </div>\n {getWorkspaceChangesSummary(session.metadata) ? (\n <div className=\"text-muted\">\n {(() => {\n const summary = getWorkspaceChangesSummary(\n session.metadata,\n );\n if (!summary) return null;\n const preview = summary.files.slice(0, 3).join(\", \");\n return summary.total > 3\n ? t(\"codingagenttaskspanel.changedFilesMore\", {\n defaultValue:\n \"{{count}} changed files: {{preview}}, +{{remaining}} more\",\n count: summary.total,\n preview,\n remaining: summary.total - 3,\n })\n : t(\"codingagenttaskspanel.changedFiles\", {\n defaultValue:\n \"{{count}} changed files: {{preview}}\",\n count: summary.total,\n preview,\n });\n })()}\n </div>\n ) : null}\n </div>\n ))}\n </div>\n )}\n </DetailList>\n\n {pendingDecisions.length > 0 ? (\n <DetailList\n title={t(\"codingagenttaskspanel.pendingUserInput\", {\n defaultValue: \"Pending User Input\",\n })}\n >\n <div className=\"space-y-1.5\">\n {pendingDecisions.map((decision) => (\n <div\n key={`${decision.threadId}-${decision.sessionId}`}\n className=\"text-xs-tight text-txt\"\n >\n <div className=\"font-medium\">{decision.promptText}</div>\n <div className=\"line-clamp-2 text-muted\">\n {typeof decision.llmDecision.reasoning === \"string\"\n ? decision.llmDecision.reasoning\n : decision.recentOutput ||\n t(\"codingagenttaskspanel.waitingForNextUserResponse\", {\n defaultValue:\n \"Coordinator is waiting for the next user response.\",\n })}\n </div>\n </div>\n ))}\n </div>\n </DetailList>\n ) : null}\n\n {latestArtifacts.length > 0 ? (\n <DetailList\n title={t(\"codingagenttaskspanel.artifacts\", {\n defaultValue: \"Artifacts\",\n })}\n >\n <div className=\"space-y-1.5\">\n {latestArtifacts.map((artifact) => (\n <div key={artifact.id} className=\"text-xs-tight text-txt\">\n <div className=\"font-medium\">{artifact.title}</div>\n <div className=\"break-all text-muted\">\n {artifact.artifactType} ·{\" \"}\n {artifact.path ??\n artifact.uri ??\n t(\"codingagenttaskspanel.inline\", {\n defaultValue: \"inline\",\n })}\n </div>\n </div>\n ))}\n </div>\n </DetailList>\n ) : null}\n\n {latestDecisions.length > 0 ? (\n <DetailList\n title={t(\"codingagenttaskspanel.coordinatorDecisions\", {\n defaultValue: \"Coordinator Decisions\",\n })}\n >\n <div className=\"space-y-1.5\">\n {latestDecisions.map((decision) => (\n <div key={decision.id} className=\"text-xs-tight text-txt\">\n <div className=\"font-medium\">\n {decision.decision} ·{\" \"}\n {formatRelativeTime(decision.timestamp, locale)}\n </div>\n <div className=\"line-clamp-3 text-muted\">\n {decision.reasoning}\n </div>\n </div>\n ))}\n </div>\n </DetailList>\n ) : null}\n\n {latestEvents.length > 0 ? (\n <DetailList\n title={t(\"codingagenttaskspanel.events\", {\n defaultValue: \"Events\",\n })}\n >\n <div className=\"space-y-1.5\">\n {latestEvents.map((event) => (\n <div key={event.id} className=\"text-xs-tight text-txt\">\n <div className=\"font-medium\">\n {event.eventType.replace(/_/g, \" \")} ·{\" \"}\n {formatRelativeTime(event.timestamp, locale)}\n </div>\n <div className=\"line-clamp-2 text-muted\">{event.summary}</div>\n </div>\n ))}\n </div>\n </DetailList>\n ) : null}\n\n {latestTranscripts.length > 0 ? (\n <DetailList\n title={t(\"codingagenttaskspanel.messages\", {\n defaultValue: \"Messages\",\n })}\n >\n <div className=\"max-h-40 space-y-2 overflow-y-auto pr-1\">\n {latestTranscripts.map((entry) => {\n const text = stripAnsi(entry.content);\n if (!text) return null;\n return (\n <div\n key={entry.id}\n className=\"rounded border border-border/40 bg-bg-hover/40 p-2\"\n >\n <div className=\"mb-1 text-2xs uppercase tracking-[0.08em] text-muted\">\n {entry.direction === \"stdin\"\n ? t(\"codingagenttaskspanel.prompt\", {\n defaultValue: \"prompt\",\n })\n : t(\"codingagenttaskspanel.system\", {\n defaultValue: \"system\",\n })}{\" \"}\n · {formatRelativeTime(entry.timestamp, locale)}\n </div>\n <pre className=\"whitespace-pre-wrap break-words font-mono text-2xs text-txt\">\n {text}\n </pre>\n </div>\n );\n })}\n </div>\n </DetailList>\n ) : null}\n\n <div className=\"flex gap-2 pt-1\">\n {detail.status === \"archived\" ? (\n <ThreadActionButton\n agentId=\"action-reopen-thread\"\n label={t(\"codingagenttaskspanel.reopen\", {\n defaultValue: \"Reopen\",\n })}\n description=\"Reopen the selected archived task thread\"\n variant=\"secondary\"\n disabled={busy}\n onClick={onReopen}\n className=\"h-7 px-2 text-xs-tight\"\n />\n ) : (\n <ThreadActionButton\n agentId=\"action-delete-thread\"\n label={t(\"codingagenttaskspanel.delete\", {\n defaultValue: \"Delete\",\n })}\n description=\"Delete (archive) the selected task thread\"\n variant=\"secondary\"\n disabled={busy}\n onClick={onDelete}\n className=\"h-7 px-2 text-xs-tight text-danger hover:bg-danger/10\"\n />\n )}\n </div>\n </div>\n );\n}\n\n/** Visual chips summarizing a thread for the card list. Zero-value and unknown\n * metadata is omitted so a fresh task never shows bare \"0\" / \"unknown\" chips. */\nfunction threadChips(\n thread: CodingAgentTaskThread,\n t: typeof fallbackTranslate,\n locale?: string,\n): ReactNode {\n const kindLabel = thread.kind ? formatThreadKind(thread.kind, t) : null;\n return (\n <>\n {thread.sessionCount > 0 ? (\n <TaskMetaChip icon={<Bot className=\"h-3 w-3\" />}>\n {t(\"codingagenttaskspanel.sessionsCount\", {\n defaultValue: \"{{count}} sessions\",\n count: thread.sessionCount,\n })}\n </TaskMetaChip>\n ) : null}\n {thread.decisionCount > 0 ? (\n <TaskMetaChip icon={<ListChecks className=\"h-3 w-3\" />}>\n {t(\"codingagenttaskspanel.decisionsCount\", {\n defaultValue: \"{{count}} decisions\",\n count: thread.decisionCount,\n })}\n </TaskMetaChip>\n ) : null}\n {kindLabel ? (\n <TaskMetaChip icon={<Terminal className=\"h-3 w-3\" />}>\n {kindLabel}\n </TaskMetaChip>\n ) : null}\n <span className=\"text-2xs text-muted/80\">\n {formatIsoTime(thread.updatedAt, locale, t)}\n </span>\n </>\n );\n}\n\n/** Full-pane task detail entered by clicking a card. Header medallion + back. */\nfunction ThreadDetailPane({\n thread,\n detail,\n detailLoading,\n busy,\n onBack,\n onDelete,\n onReopen,\n t,\n locale,\n}: {\n thread: CodingAgentTaskThread;\n detail: CodingAgentTaskThreadDetail | null;\n detailLoading: boolean;\n busy: boolean;\n onBack: () => void;\n onDelete: () => void;\n onReopen: () => void;\n t: typeof fallbackTranslate;\n locale?: string;\n}) {\n return (\n <div className=\"flex flex-col gap-3\" data-testid=\"task-detail-pane\">\n <BackChip\n label={t(\"codingagenttaskspanel.backToTasks\", {\n defaultValue: \"Tasks\",\n })}\n onClick={onBack}\n testId=\"task-detail-back\"\n />\n <div className=\"flex items-start gap-3 rounded-2xl bg-bg-accent/20 p-3\">\n <TaskStatusMedallion status={thread.status} />\n <div className=\"min-w-0 flex-1\">\n <div className=\"truncate text-sm font-semibold text-txt-strong\">\n {thread.title}\n </div>\n {thread.originalRequest ? (\n <div className=\"mt-0.5 line-clamp-2 text-xs text-muted\">\n {thread.originalRequest}\n </div>\n ) : null}\n </div>\n </div>\n {!detail && detailLoading ? (\n <div className=\"text-xs-tight text-muted\">\n {t(\"common.loading\", { defaultValue: \"Loading…\" })}\n </div>\n ) : detail ? (\n <ThreadDetailContent\n detail={detail}\n busy={busy}\n onDelete={onDelete}\n onReopen={onReopen}\n t={t}\n locale={locale}\n />\n ) : null}\n </div>\n );\n}\n\nexport function CodingAgentTasksPanel(_props: { fullPage?: boolean } = {}) {\n const { t: appT, uiLanguage: appUiLanguage } = useAppSelectorShallow((s) => ({\n t: s.t,\n uiLanguage: s.uiLanguage,\n }));\n const t = appT ?? fallbackTranslate;\n const uiLanguage =\n typeof appUiLanguage === \"string\" ? appUiLanguage : undefined;\n const [threads, setThreads] = useState<CodingAgentTaskThread[]>([]);\n const [selectedThreadId, setSelectedThreadId] = useState<string | null>(null);\n const [selectedThread, setSelectedThread] =\n useState<CodingAgentTaskThreadDetail | null>(null);\n const [showArchived, setShowArchived] = useState(false);\n const [search, setSearch] = useState(\"\");\n const [loading, setLoading] = useState(true);\n const [mutating, setMutating] = useState(false);\n const [loadError, setLoadError] = useState<string | null>(null);\n const [detailError, setDetailError] = useState<string | null>(null);\n const [mutationError, setMutationError] = useState<string | null>(null);\n const deferredSearch = useDeferredValue(search.trim());\n const selectedThreadSummary = useMemo(\n () => threads.find((thread) => thread.id === selectedThreadId) ?? null,\n [selectedThreadId, threads],\n );\n const searchLabel = t(\"codingagenttaskspanel.searchPlaceholder\", {\n defaultValue: \"Search tasks\",\n });\n const showArchivedLabel = t(\"codingagenttaskspanel.showArchived\", {\n defaultValue: \"Show archived\",\n });\n const { ref: searchRef, agentProps: searchAgentProps } =\n useAgentElement<HTMLInputElement>({\n id: \"input-search-tasks\",\n role: \"text-input\",\n label: searchLabel,\n group: \"task-filters\",\n description: \"Filter task threads by title or request text\",\n });\n const { ref: archivedRef, agentProps: archivedAgentProps } =\n useAgentElement<HTMLButtonElement>({\n id: \"toggle-show-archived\",\n role: \"toggle\",\n label: showArchivedLabel,\n group: \"task-filters\",\n status: showArchived ? \"active\" : \"inactive\",\n description: \"Toggle showing archived tasks\",\n onActivate: () => setShowArchived((value) => !value),\n });\n\n useEffect(() => {\n let cancelled = false;\n\n const refreshThreads = async (silent = false) => {\n if (!silent) {\n setLoading(true);\n }\n try {\n const nextThreads = await client.listCodingAgentTaskThreads({\n includeArchived: showArchived,\n search: deferredSearch || undefined,\n limit: 30,\n });\n if (cancelled) return;\n setLoadError(null);\n setMutationError(null);\n setThreads(nextThreads);\n setSelectedThreadId((current) => {\n if (current === null) return null;\n if (nextThreads.some((thread) => thread.id === current)) {\n return current;\n }\n return null;\n });\n } catch (error) {\n if (cancelled) return;\n // The task-thread endpoint is owned by the Node-only\n // @elizaos/plugin-agent-orchestrator and is absent on mobile/web\n // surfaces. A 404 there means \"no coding tasks\", not a load failure —\n // render the empty state instead of the red error banner.\n if (error instanceof ApiError && error.status === 404) {\n setLoadError(null);\n setThreads([]);\n setSelectedThreadId(null);\n setSelectedThread(null);\n return;\n }\n if (!silent) {\n setLoadError(\n getClientErrorMessage(\n error,\n t(\"codingagenttaskspanel.unknown\", {\n defaultValue: \"Unknown\",\n }),\n ),\n );\n }\n if (!silent) {\n setThreads([]);\n setSelectedThreadId(null);\n setSelectedThread(null);\n }\n } finally {\n if (!cancelled && !silent) {\n setLoading(false);\n }\n }\n };\n\n void refreshThreads(false);\n const timer = setInterval(() => {\n // Poll in the background without toggling loading UI to avoid flicker.\n void refreshThreads(true);\n }, 5_000);\n\n return () => {\n cancelled = true;\n clearInterval(timer);\n };\n }, [deferredSearch, showArchived, t]);\n\n useEffect(() => {\n let cancelled = false;\n if (!selectedThreadId) {\n setDetailError(null);\n setSelectedThread(null);\n return;\n }\n\n const loadDetail = async () => {\n try {\n const expectedUpdatedAt = selectedThreadSummary?.updatedAt ?? null;\n const detail = await client.getCodingAgentTaskThread(selectedThreadId);\n if (cancelled) return;\n setDetailError(null);\n setSelectedThread((current) => {\n if (\n current &&\n detail &&\n expectedUpdatedAt &&\n current.updatedAt === expectedUpdatedAt &&\n current.id === detail.id\n ) {\n return current;\n }\n return detail;\n });\n } catch (error) {\n if (cancelled) return;\n setDetailError(\n getClientErrorMessage(\n error,\n t(\"codingagenttaskspanel.unknown\", {\n defaultValue: \"Unknown\",\n }),\n ),\n );\n setSelectedThread(null);\n }\n };\n void loadDetail();\n\n return () => {\n cancelled = true;\n };\n }, [selectedThreadId, selectedThreadSummary?.updatedAt, t]);\n\n const handleDelete = async () => {\n if (!selectedThread) return;\n setMutating(true);\n setMutationError(null);\n try {\n await client.archiveCodingAgentTaskThread(selectedThread.id);\n const nextThreads = await client.listCodingAgentTaskThreads({\n includeArchived: showArchived,\n search: deferredSearch || undefined,\n limit: 30,\n });\n setLoadError(null);\n setDetailError(null);\n setMutationError(null);\n setThreads(nextThreads);\n setSelectedThreadId(nextThreads[0]?.id ?? null);\n } catch (error) {\n setMutationError(\n t(\"codingagenttaskspanel.deleteFailed\", {\n defaultValue:\n error instanceof Error\n ? \"Failed to delete task: {{error}}\"\n : \"Failed to delete task.\",\n error: error instanceof Error ? error.message : undefined,\n }),\n );\n } finally {\n setMutating(false);\n }\n };\n\n const handleReopen = async () => {\n if (!selectedThread) return;\n setMutating(true);\n setMutationError(null);\n try {\n await client.reopenCodingAgentTaskThread(selectedThread.id);\n const nextThreads = await client.listCodingAgentTaskThreads({\n includeArchived: false,\n search: deferredSearch || undefined,\n limit: 30,\n });\n setLoadError(null);\n setDetailError(null);\n setMutationError(null);\n setThreads(nextThreads);\n setShowArchived(false);\n setSelectedThreadId(nextThreads[0]?.id ?? null);\n } catch (error) {\n setMutationError(\n t(\"codingagenttaskspanel.reopenFailed\", {\n defaultValue:\n error instanceof Error\n ? \"Failed to reopen task: {{error}}\"\n : \"Failed to reopen task.\",\n error: error instanceof Error ? error.message : undefined,\n }),\n );\n } finally {\n setMutating(false);\n }\n };\n\n const activeCount = threads.filter((t) => t.status === \"active\").length;\n const doneCount = threads.filter((t) => t.status === \"done\").length;\n\n // Full-pane detail state — clicking a card swaps the list for its detail.\n if (selectedThreadId && selectedThreadSummary) {\n return (\n <div\n className=\"flex h-full min-h-0 w-full flex-col gap-3 overflow-y-auto bg-bg px-4 pb-28 pt-4 text-txt\"\n data-testid=\"task-coordinator-panel\"\n >\n {detailError ? (\n <div className=\"rounded-md border border-danger/30 bg-danger/10 px-2 py-1.5 text-xs text-danger\">\n {t(\"codingagenttaskspanel.loadTaskDetailFailed\", {\n defaultValue: \"Failed to load task detail: {{error}}\",\n error: detailError,\n })}\n </div>\n ) : null}\n {mutationError ? (\n <div className=\"rounded-md border border-danger/30 bg-danger/10 px-2 py-1.5 text-xs text-danger\">\n {mutationError}\n </div>\n ) : null}\n <ThreadDetailPane\n thread={selectedThreadSummary}\n detail={selectedThread}\n detailLoading={loading}\n busy={mutating}\n onBack={() => setSelectedThreadId(null)}\n onDelete={handleDelete}\n onReopen={handleReopen}\n t={t}\n locale={uiLanguage}\n />\n </div>\n );\n }\n\n return (\n <div\n className=\"relative flex h-full min-h-0 w-full flex-col gap-3 overflow-y-auto bg-bg px-4 pb-28 pt-4 text-txt\"\n data-testid=\"task-coordinator-panel\"\n >\n <TaskListHeader\n icon={<ListChecks className=\"h-5 w-5\" />}\n title={t(\"taskseventspanel.Tasks\", { defaultValue: \"Coding Tasks\" })}\n counts={\n <>\n <TaskCountChip value={threads.length} label=\"total\" />\n {activeCount > 0 ? (\n <TaskCountChip value={activeCount} label=\"active\" tone=\"active\" />\n ) : null}\n {doneCount > 0 ? (\n <TaskCountChip value={doneCount} label=\"done\" tone=\"accent\" />\n ) : null}\n </>\n }\n />\n\n <div className=\"flex items-center gap-2\">\n <TaskSearchInput\n value={search}\n onChange={setSearch}\n placeholder={searchLabel}\n inputRef={searchRef}\n agentProps={searchAgentProps}\n />\n <button\n ref={archivedRef}\n type=\"button\"\n onClick={() => setShowArchived((value) => !value)}\n aria-pressed={showArchived}\n data-testid=\"task-show-archived\"\n className={`inline-flex h-9 items-center gap-2 rounded-xl border px-3 text-xs font-medium transition-colors ${\n showArchived\n ? \"border-accent/40 bg-accent-subtle text-accent\"\n : \"border-border/50 bg-bg-accent/30 text-muted hover:text-txt\"\n }`}\n {...archivedAgentProps}\n >\n <Archive className=\"h-3.5 w-3.5\" />\n {showArchivedLabel}\n </button>\n </div>\n\n {loadError ? (\n <div className=\"rounded-md border border-danger/30 bg-danger/10 px-2 py-1.5 text-xs text-danger\">\n {t(\"codingagenttaskspanel.loadThreadsFailed\", {\n defaultValue: \"Failed to load task threads: {{error}}\",\n error: loadError,\n })}\n </div>\n ) : null}\n {mutationError ? (\n <div className=\"rounded-md border border-danger/30 bg-danger/10 px-2 py-1.5 text-xs text-danger\">\n {mutationError}\n </div>\n ) : null}\n\n {threads.length > 0 ? (\n <>\n <div className=\"flex flex-col gap-2.5\">\n {threads.map((thread) => (\n <TaskCard\n key={thread.id}\n id={thread.id}\n title={thread.title}\n subtitle={thread.summary || thread.originalRequest}\n status={thread.status}\n chips={threadChips(thread, t, uiLanguage)}\n onOpen={setSelectedThreadId}\n t={t}\n />\n ))}\n </div>\n {threads.length < 4 ? <SparseWatermark icon={ListChecks} /> : null}\n </>\n ) : loading ? (\n <div className=\"text-sm text-muted\">\n {t(\"codingagenttaskspanel.loadingTasks\", {\n defaultValue: \"Loading\",\n })}\n </div>\n ) : (\n <TaskEmptyState\n title={t(\"codingagenttaskspanel.empty.title\", {\n defaultValue: \"None\",\n })}\n hint={t(\"codingagenttaskspanel.empty.hint\", {\n defaultValue:\n \"Coding agents you dispatch will appear here with their sessions, decisions, and live console output.\",\n })}\n />\n )}\n </div>\n );\n}\n"],"mappings":"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","names":["t"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GitHubConnectionCard.d.ts","sourceRoot":"","sources":["../src/GitHubConnectionCard.tsx"],"names":[],"mappings":"AAuCA,wBAAgB,oBAAoB,4CAqKnC"}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Button, client, openExternalUrl, SettingsControls } from "@elizaos/ui";
|
|
3
|
+
import {
|
|
4
|
+
CheckCircle2,
|
|
5
|
+
ExternalLink,
|
|
6
|
+
GitPullRequest,
|
|
7
|
+
Unplug
|
|
8
|
+
} from "lucide-react";
|
|
9
|
+
import { useCallback, useEffect, useState } from "react";
|
|
10
|
+
const TOKEN_GENERATE_URL = "https://github.com/settings/tokens/new?description=eliza-coding-agents&scopes=repo,read:user";
|
|
11
|
+
function GitHubConnectionCard() {
|
|
12
|
+
const [status, setStatus] = useState(null);
|
|
13
|
+
const [draft, setDraft] = useState("");
|
|
14
|
+
const [submitState, setSubmitState] = useState({ kind: "idle" });
|
|
15
|
+
const refreshStatus = useCallback(async () => {
|
|
16
|
+
const next = await client.fetch("/api/github/token");
|
|
17
|
+
setStatus(next);
|
|
18
|
+
}, []);
|
|
19
|
+
useEffect(() => {
|
|
20
|
+
void refreshStatus();
|
|
21
|
+
}, [refreshStatus]);
|
|
22
|
+
const handleConnect = useCallback(async () => {
|
|
23
|
+
const token = draft.trim();
|
|
24
|
+
if (token.length === 0) return;
|
|
25
|
+
setSubmitState({ kind: "submitting" });
|
|
26
|
+
try {
|
|
27
|
+
const res = await client.fetch(
|
|
28
|
+
"/api/github/token",
|
|
29
|
+
{
|
|
30
|
+
method: "POST",
|
|
31
|
+
headers: { "Content-Type": "application/json" },
|
|
32
|
+
body: JSON.stringify({ token })
|
|
33
|
+
}
|
|
34
|
+
);
|
|
35
|
+
if ("error" in res) {
|
|
36
|
+
setSubmitState({ kind: "error", message: res.error });
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
setStatus(res);
|
|
40
|
+
setDraft("");
|
|
41
|
+
setSubmitState({ kind: "idle" });
|
|
42
|
+
} catch (err) {
|
|
43
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
44
|
+
setSubmitState({ kind: "error", message });
|
|
45
|
+
}
|
|
46
|
+
}, [draft]);
|
|
47
|
+
const handleDisconnect = useCallback(async () => {
|
|
48
|
+
setSubmitState({ kind: "submitting" });
|
|
49
|
+
try {
|
|
50
|
+
await client.fetch("/api/github/token", { method: "DELETE" });
|
|
51
|
+
setStatus({ connected: false });
|
|
52
|
+
setSubmitState({ kind: "idle" });
|
|
53
|
+
} catch (err) {
|
|
54
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
55
|
+
setSubmitState({ kind: "error", message });
|
|
56
|
+
}
|
|
57
|
+
}, []);
|
|
58
|
+
const submitting = submitState.kind === "submitting";
|
|
59
|
+
const errorMessage = submitState.kind === "error" ? submitState.message : null;
|
|
60
|
+
return /* @__PURE__ */ jsxs("div", { className: "space-y-3 px-1 py-1", children: [
|
|
61
|
+
/* @__PURE__ */ jsx("div", { className: "flex items-center justify-between gap-3", children: /* @__PURE__ */ jsxs("div", { className: "flex min-w-0 items-center gap-2.5", children: [
|
|
62
|
+
/* @__PURE__ */ jsx(GitPullRequest, { className: "h-4 w-4 text-muted", "aria-hidden": true }),
|
|
63
|
+
/* @__PURE__ */ jsx("span", { className: "text-sm font-medium text-txt", children: "GitHub" }),
|
|
64
|
+
status?.connected ? /* @__PURE__ */ jsx(
|
|
65
|
+
"span",
|
|
66
|
+
{
|
|
67
|
+
className: "inline-block h-1.5 w-1.5 rounded-full bg-emerald-500",
|
|
68
|
+
title: `Connected as @${status.username}`,
|
|
69
|
+
"aria-label": `Connected as @${status.username}`,
|
|
70
|
+
role: "img"
|
|
71
|
+
}
|
|
72
|
+
) : /* @__PURE__ */ jsx(
|
|
73
|
+
"span",
|
|
74
|
+
{
|
|
75
|
+
className: "inline-block h-1.5 w-1.5 rounded-full bg-muted/40",
|
|
76
|
+
title: "Not connected",
|
|
77
|
+
"aria-label": "Not connected",
|
|
78
|
+
role: "img"
|
|
79
|
+
}
|
|
80
|
+
)
|
|
81
|
+
] }) }),
|
|
82
|
+
status?.connected ? /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-2 text-xs", children: [
|
|
83
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 text-muted", children: [
|
|
84
|
+
/* @__PURE__ */ jsx(
|
|
85
|
+
CheckCircle2,
|
|
86
|
+
{
|
|
87
|
+
className: "h-3.5 w-3.5 text-emerald-500",
|
|
88
|
+
"aria-hidden": true
|
|
89
|
+
}
|
|
90
|
+
),
|
|
91
|
+
/* @__PURE__ */ jsxs("span", { children: [
|
|
92
|
+
"Connected as",
|
|
93
|
+
" ",
|
|
94
|
+
/* @__PURE__ */ jsxs("span", { className: "font-medium text-txt", children: [
|
|
95
|
+
"@",
|
|
96
|
+
status.username
|
|
97
|
+
] })
|
|
98
|
+
] })
|
|
99
|
+
] }),
|
|
100
|
+
status.scopes && status.scopes.length > 0 ? /* @__PURE__ */ jsxs("div", { className: "text-muted", children: [
|
|
101
|
+
"Scopes:",
|
|
102
|
+
" ",
|
|
103
|
+
/* @__PURE__ */ jsx("span", { className: "font-mono text-txt", children: status.scopes.join(", ") })
|
|
104
|
+
] }) : /* @__PURE__ */ jsxs("div", { className: "text-muted", children: [
|
|
105
|
+
"Scopes: ",
|
|
106
|
+
/* @__PURE__ */ jsx("span", { className: "text-amber-500", children: "none" })
|
|
107
|
+
] }),
|
|
108
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between pt-1", children: [
|
|
109
|
+
/* @__PURE__ */ jsx("span", { className: "sr-only", children: "Coding sub-agents will use this token for git/gh operations." }),
|
|
110
|
+
/* @__PURE__ */ jsxs(
|
|
111
|
+
Button,
|
|
112
|
+
{
|
|
113
|
+
variant: "secondary",
|
|
114
|
+
size: "sm",
|
|
115
|
+
onClick: handleDisconnect,
|
|
116
|
+
disabled: submitting,
|
|
117
|
+
children: [
|
|
118
|
+
/* @__PURE__ */ jsx(Unplug, { className: "mr-1.5 h-3.5 w-3.5", "aria-hidden": true }),
|
|
119
|
+
"Disconnect"
|
|
120
|
+
]
|
|
121
|
+
}
|
|
122
|
+
)
|
|
123
|
+
] })
|
|
124
|
+
] }) : /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-2 text-xs", children: [
|
|
125
|
+
/* @__PURE__ */ jsx("p", { className: "sr-only", children: "Paste a personal access token so coding sub-agents can clone private repos, push commits, and open pull requests." }),
|
|
126
|
+
/* @__PURE__ */ jsxs(
|
|
127
|
+
"button",
|
|
128
|
+
{
|
|
129
|
+
type: "button",
|
|
130
|
+
className: "inline-flex w-fit items-center gap-1 text-xs text-blue-500 hover:underline",
|
|
131
|
+
onClick: () => openExternalUrl(TOKEN_GENERATE_URL),
|
|
132
|
+
children: [
|
|
133
|
+
/* @__PURE__ */ jsx(ExternalLink, { className: "h-3 w-3", "aria-hidden": true }),
|
|
134
|
+
"Generate a token on github.com (scopes: repo, read:user)"
|
|
135
|
+
]
|
|
136
|
+
}
|
|
137
|
+
),
|
|
138
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
|
|
139
|
+
/* @__PURE__ */ jsx(
|
|
140
|
+
SettingsControls.Input,
|
|
141
|
+
{
|
|
142
|
+
className: "w-full",
|
|
143
|
+
variant: "compact",
|
|
144
|
+
type: "password",
|
|
145
|
+
placeholder: "ghp_\u2026",
|
|
146
|
+
value: draft,
|
|
147
|
+
onChange: (e) => setDraft(e.target.value),
|
|
148
|
+
onKeyDown: (e) => {
|
|
149
|
+
if (e.key === "Enter") void handleConnect();
|
|
150
|
+
},
|
|
151
|
+
autoComplete: "off"
|
|
152
|
+
}
|
|
153
|
+
),
|
|
154
|
+
/* @__PURE__ */ jsx(
|
|
155
|
+
Button,
|
|
156
|
+
{
|
|
157
|
+
variant: "default",
|
|
158
|
+
size: "sm",
|
|
159
|
+
onClick: () => void handleConnect(),
|
|
160
|
+
disabled: submitting || draft.trim().length === 0,
|
|
161
|
+
children: submitting ? "Connecting\u2026" : "Connect"
|
|
162
|
+
}
|
|
163
|
+
)
|
|
164
|
+
] })
|
|
165
|
+
] }),
|
|
166
|
+
errorMessage ? /* @__PURE__ */ jsx("div", { className: "rounded-md border border-rose-500/40 bg-rose-500/10 px-2 py-1.5 text-xs text-rose-500", children: errorMessage }) : null
|
|
167
|
+
] });
|
|
168
|
+
}
|
|
169
|
+
export {
|
|
170
|
+
GitHubConnectionCard
|
|
171
|
+
};
|
|
172
|
+
//# sourceMappingURL=GitHubConnectionCard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/GitHubConnectionCard.tsx"],"sourcesContent":["import { Button, client, openExternalUrl, SettingsControls } from \"@elizaos/ui\";\nimport {\n CheckCircle2,\n ExternalLink,\n GitPullRequest,\n Unplug,\n} from \"lucide-react\";\nimport { useCallback, useEffect, useState } from \"react\";\n\n/**\n * GitHub PAT connection card for the Coding Agents settings page.\n *\n * Persists a single per-user token to `<state-dir>/credentials/github.json`\n * via `/api/github/token`. The same token is exposed to spawned coding\n * sub-agents (orchestrator's existing `runtime.getSetting(\"GITHUB_TOKEN\")`\n * resolution + `process.env.GITHUB_TOKEN` inheritance into ACP sessions),\n * so once it's set here `git clone` of private repos / `gh auth status`\n * / push + PR flows all work without the user having to wire env vars.\n *\n * The token itself is write-only from the UI side: the API never returns\n * it after save. State here is just the metadata (username, scopes,\n * savedAt) plus an in-memory draft input while the user types a new PAT.\n */\n\ninterface TokenStatus {\n connected: boolean;\n username?: string;\n scopes?: string[];\n savedAt?: number;\n}\n\nconst TOKEN_GENERATE_URL =\n \"https://github.com/settings/tokens/new?description=eliza-coding-agents&scopes=repo,read:user\";\n\ntype SubmitState =\n | { kind: \"idle\" }\n | { kind: \"submitting\" }\n | { kind: \"error\"; message: string };\n\nexport function GitHubConnectionCard() {\n const [status, setStatus] = useState<TokenStatus | null>(null);\n const [draft, setDraft] = useState(\"\");\n const [submitState, setSubmitState] = useState<SubmitState>({ kind: \"idle\" });\n\n const refreshStatus = useCallback(async () => {\n const next = await client.fetch<TokenStatus>(\"/api/github/token\");\n setStatus(next);\n }, []);\n\n useEffect(() => {\n void refreshStatus();\n }, [refreshStatus]);\n\n const handleConnect = useCallback(async () => {\n const token = draft.trim();\n if (token.length === 0) return;\n setSubmitState({ kind: \"submitting\" });\n try {\n const res = await client.fetch<TokenStatus | { error: string }>(\n \"/api/github/token\",\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ token }),\n },\n );\n if (\"error\" in res) {\n setSubmitState({ kind: \"error\", message: res.error });\n return;\n }\n setStatus(res);\n setDraft(\"\");\n setSubmitState({ kind: \"idle\" });\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n setSubmitState({ kind: \"error\", message });\n }\n }, [draft]);\n\n const handleDisconnect = useCallback(async () => {\n setSubmitState({ kind: \"submitting\" });\n try {\n await client.fetch(\"/api/github/token\", { method: \"DELETE\" });\n setStatus({ connected: false });\n setSubmitState({ kind: \"idle\" });\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n setSubmitState({ kind: \"error\", message });\n }\n }, []);\n\n const submitting = submitState.kind === \"submitting\";\n const errorMessage =\n submitState.kind === \"error\" ? submitState.message : null;\n\n return (\n <div className=\"space-y-3 px-1 py-1\">\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"flex min-w-0 items-center gap-2.5\">\n <GitPullRequest className=\"h-4 w-4 text-muted\" aria-hidden />\n <span className=\"text-sm font-medium text-txt\">GitHub</span>\n {status?.connected ? (\n <span\n className=\"inline-block h-1.5 w-1.5 rounded-full bg-emerald-500\"\n title={`Connected as @${status.username}`}\n aria-label={`Connected as @${status.username}`}\n role=\"img\"\n />\n ) : (\n <span\n className=\"inline-block h-1.5 w-1.5 rounded-full bg-muted/40\"\n title=\"Not connected\"\n aria-label=\"Not connected\"\n role=\"img\"\n />\n )}\n </div>\n </div>\n\n {status?.connected ? (\n <div className=\"flex flex-col gap-2 text-xs\">\n <div className=\"flex items-center gap-2 text-muted\">\n <CheckCircle2\n className=\"h-3.5 w-3.5 text-emerald-500\"\n aria-hidden\n />\n <span>\n Connected as{\" \"}\n <span className=\"font-medium text-txt\">@{status.username}</span>\n </span>\n </div>\n {status.scopes && status.scopes.length > 0 ? (\n <div className=\"text-muted\">\n Scopes:{\" \"}\n <span className=\"font-mono text-txt\">\n {status.scopes.join(\", \")}\n </span>\n </div>\n ) : (\n <div className=\"text-muted\">\n Scopes: <span className=\"text-amber-500\">none</span>\n </div>\n )}\n <div className=\"flex items-center justify-between pt-1\">\n <span className=\"sr-only\">\n Coding sub-agents will use this token for git/gh operations.\n </span>\n <Button\n variant=\"secondary\"\n size=\"sm\"\n onClick={handleDisconnect}\n disabled={submitting}\n >\n <Unplug className=\"mr-1.5 h-3.5 w-3.5\" aria-hidden />\n Disconnect\n </Button>\n </div>\n </div>\n ) : (\n <div className=\"flex flex-col gap-2 text-xs\">\n <p className=\"sr-only\">\n Paste a personal access token so coding sub-agents can clone private\n repos, push commits, and open pull requests.\n </p>\n <button\n type=\"button\"\n className=\"inline-flex w-fit items-center gap-1 text-xs text-blue-500 hover:underline\"\n onClick={() => openExternalUrl(TOKEN_GENERATE_URL)}\n >\n <ExternalLink className=\"h-3 w-3\" aria-hidden />\n Generate a token on github.com (scopes: repo, read:user)\n </button>\n <div className=\"flex items-center gap-2\">\n <SettingsControls.Input\n className=\"w-full\"\n variant=\"compact\"\n type=\"password\"\n placeholder=\"ghp_…\"\n value={draft}\n onChange={(e) => setDraft(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") void handleConnect();\n }}\n autoComplete=\"off\"\n />\n <Button\n variant=\"default\"\n size=\"sm\"\n onClick={() => void handleConnect()}\n disabled={submitting || draft.trim().length === 0}\n >\n {submitting ? \"Connecting…\" : \"Connect\"}\n </Button>\n </div>\n </div>\n )}\n\n {errorMessage ? (\n <div className=\"rounded-md border border-rose-500/40 bg-rose-500/10 px-2 py-1.5 text-xs text-rose-500\">\n {errorMessage}\n </div>\n ) : null}\n </div>\n );\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type AgentSelectionStrategy, type ApprovalPreset } from "./coding-agent-settings-shared";
|
|
2
|
+
interface GlobalPrefsSectionProps {
|
|
3
|
+
prefs: Record<string, string>;
|
|
4
|
+
selectionStrategy: AgentSelectionStrategy;
|
|
5
|
+
approvalPreset: ApprovalPreset;
|
|
6
|
+
setPref: (key: string, value: string) => void;
|
|
7
|
+
}
|
|
8
|
+
export declare function GlobalPrefsSection({ prefs, selectionStrategy, approvalPreset, setPref, }: GlobalPrefsSectionProps): import("react/jsx-runtime").JSX.Element;
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=GlobalPrefsSection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GlobalPrefsSection.d.ts","sourceRoot":"","sources":["../src/GlobalPrefsSection.tsx"],"names":[],"mappings":"AASA,OAAO,EACL,KAAK,sBAAsB,EAE3B,KAAK,cAAc,EAIpB,MAAM,gCAAgC,CAAC;AA0BxC,UAAU,uBAAuB;IAC/B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,iBAAiB,EAAE,sBAAsB,CAAC;IAC1C,cAAc,EAAE,cAAc,CAAC;IAC/B,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CAC/C;AAED,wBAAgB,kBAAkB,CAAC,EACjC,KAAK,EACL,iBAAiB,EACjB,cAAc,EACd,OAAO,GACR,EAAE,uBAAuB,2CA0KzB"}
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import {
|
|
3
|
+
Select,
|
|
4
|
+
SelectContent,
|
|
5
|
+
SelectItem,
|
|
6
|
+
SelectValue,
|
|
7
|
+
SettingsControls,
|
|
8
|
+
useAppSelector
|
|
9
|
+
} from "@elizaos/ui";
|
|
10
|
+
import { useState } from "react";
|
|
11
|
+
import {
|
|
12
|
+
APPROVAL_PRESETS,
|
|
13
|
+
CODING_ACCOUNT_STRATEGY_OPTIONS,
|
|
14
|
+
isCodingAccountStrategy
|
|
15
|
+
} from "./coding-agent-settings-shared.js";
|
|
16
|
+
function CodingDirInput({
|
|
17
|
+
initial,
|
|
18
|
+
onCommit
|
|
19
|
+
}) {
|
|
20
|
+
const [val, setVal] = useState(initial);
|
|
21
|
+
return /* @__PURE__ */ jsx(
|
|
22
|
+
SettingsControls.Input,
|
|
23
|
+
{
|
|
24
|
+
className: "w-full",
|
|
25
|
+
variant: "compact",
|
|
26
|
+
type: "text",
|
|
27
|
+
placeholder: "~/Projects",
|
|
28
|
+
value: val,
|
|
29
|
+
onChange: (e) => setVal(e.target.value),
|
|
30
|
+
onBlur: () => onCommit(val),
|
|
31
|
+
onKeyDown: (e) => {
|
|
32
|
+
if (e.key === "Enter") onCommit(val);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
);
|
|
36
|
+
}
|
|
37
|
+
function GlobalPrefsSection({
|
|
38
|
+
prefs,
|
|
39
|
+
selectionStrategy,
|
|
40
|
+
approvalPreset,
|
|
41
|
+
setPref
|
|
42
|
+
}) {
|
|
43
|
+
const t = useAppSelector((s) => s.t);
|
|
44
|
+
const accountStrategy = isCodingAccountStrategy(
|
|
45
|
+
prefs.ELIZA_CODING_ACCOUNT_STRATEGY
|
|
46
|
+
) ? prefs.ELIZA_CODING_ACCOUNT_STRATEGY : "least-used";
|
|
47
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
48
|
+
/* @__PURE__ */ jsxs(SettingsControls.Field, { children: [
|
|
49
|
+
/* @__PURE__ */ jsx(SettingsControls.FieldLabel, { children: t("codingagentsettingssection.AgentSelectionStra") }),
|
|
50
|
+
/* @__PURE__ */ jsxs(
|
|
51
|
+
Select,
|
|
52
|
+
{
|
|
53
|
+
value: selectionStrategy,
|
|
54
|
+
onValueChange: (value) => setPref("ELIZA_AGENT_SELECTION_STRATEGY", value),
|
|
55
|
+
children: [
|
|
56
|
+
/* @__PURE__ */ jsx(SettingsControls.SelectTrigger, { variant: "compact", children: /* @__PURE__ */ jsx(SelectValue, {}) }),
|
|
57
|
+
/* @__PURE__ */ jsxs(SelectContent, { children: [
|
|
58
|
+
/* @__PURE__ */ jsx(SelectItem, { value: "fixed", children: t("codingagentsettingssection.Fixed") }),
|
|
59
|
+
/* @__PURE__ */ jsx(SelectItem, { value: "ranked", children: t("codingagentsettingssection.RankedAutoSelect") })
|
|
60
|
+
] })
|
|
61
|
+
]
|
|
62
|
+
}
|
|
63
|
+
),
|
|
64
|
+
/* @__PURE__ */ jsx(SettingsControls.FieldDescription, { className: "sr-only", children: selectionStrategy === "fixed" ? t("codingagentsettingssection.AgentUsedWhenNoEStrategyFixed") : t("codingagentsettingssection.AgentUsedWhenNoEStrategyRanked") })
|
|
65
|
+
] }),
|
|
66
|
+
/* @__PURE__ */ jsxs(SettingsControls.Field, { children: [
|
|
67
|
+
/* @__PURE__ */ jsx(SettingsControls.FieldLabel, { children: t("codingagentsettingssection.AccountPoolStrategy", {
|
|
68
|
+
defaultValue: "Account Pool Strategy"
|
|
69
|
+
}) }),
|
|
70
|
+
/* @__PURE__ */ jsxs(
|
|
71
|
+
Select,
|
|
72
|
+
{
|
|
73
|
+
value: accountStrategy,
|
|
74
|
+
onValueChange: (value) => {
|
|
75
|
+
if (isCodingAccountStrategy(value)) {
|
|
76
|
+
setPref("ELIZA_CODING_ACCOUNT_STRATEGY", value);
|
|
77
|
+
}
|
|
78
|
+
},
|
|
79
|
+
children: [
|
|
80
|
+
/* @__PURE__ */ jsx(SettingsControls.SelectTrigger, { variant: "compact", children: /* @__PURE__ */ jsx(SelectValue, {}) }),
|
|
81
|
+
/* @__PURE__ */ jsx(SelectContent, { children: CODING_ACCOUNT_STRATEGY_OPTIONS.map((strategy) => /* @__PURE__ */ jsx(SelectItem, { value: strategy.value, children: t(strategy.labelKey, {
|
|
82
|
+
defaultValue: strategy.defaultLabel
|
|
83
|
+
}) }, strategy.value)) })
|
|
84
|
+
]
|
|
85
|
+
}
|
|
86
|
+
),
|
|
87
|
+
/* @__PURE__ */ jsx(SettingsControls.FieldDescription, { className: "sr-only", children: t("codingagentsettingssection.AccountPoolStrategyDesc", {
|
|
88
|
+
defaultValue: "How to select between multiple accounts for the same coding agent. This sets ELIZA_CODING_ACCOUNT_STRATEGY for spawned agents."
|
|
89
|
+
}) })
|
|
90
|
+
] }),
|
|
91
|
+
/* @__PURE__ */ jsxs(SettingsControls.Field, { children: [
|
|
92
|
+
/* @__PURE__ */ jsx(SettingsControls.FieldLabel, { children: t("codingagentsettingssection.DefaultPermissionL") }),
|
|
93
|
+
/* @__PURE__ */ jsxs(
|
|
94
|
+
Select,
|
|
95
|
+
{
|
|
96
|
+
value: approvalPreset,
|
|
97
|
+
onValueChange: (value) => setPref("ELIZA_DEFAULT_APPROVAL_PRESET", value),
|
|
98
|
+
children: [
|
|
99
|
+
/* @__PURE__ */ jsx(SettingsControls.SelectTrigger, { variant: "compact", children: /* @__PURE__ */ jsx(SelectValue, {}) }),
|
|
100
|
+
/* @__PURE__ */ jsx(SelectContent, { children: APPROVAL_PRESETS.map((preset) => /* @__PURE__ */ jsx(SelectItem, { value: preset.value, children: t(preset.labelKey) }, preset.value)) })
|
|
101
|
+
]
|
|
102
|
+
}
|
|
103
|
+
),
|
|
104
|
+
/* @__PURE__ */ jsxs(SettingsControls.FieldDescription, { className: "sr-only", children: [
|
|
105
|
+
APPROVAL_PRESETS.find((preset) => preset.value === approvalPreset)?.descKey ? t(
|
|
106
|
+
APPROVAL_PRESETS.find(
|
|
107
|
+
(preset) => preset.value === approvalPreset
|
|
108
|
+
)?.descKey ?? ""
|
|
109
|
+
) : "",
|
|
110
|
+
t("codingagentsettingssection.AppliesToAllNewlySpawned")
|
|
111
|
+
] })
|
|
112
|
+
] }),
|
|
113
|
+
/* @__PURE__ */ jsxs(SettingsControls.Field, { children: [
|
|
114
|
+
/* @__PURE__ */ jsx(SettingsControls.FieldLabel, { children: t("codingagentsettingssection.ScratchRetention", {
|
|
115
|
+
defaultValue: "Scratch Retention"
|
|
116
|
+
}) }),
|
|
117
|
+
/* @__PURE__ */ jsxs(
|
|
118
|
+
Select,
|
|
119
|
+
{
|
|
120
|
+
value: prefs.ELIZA_SCRATCH_RETENTION || "pending_decision",
|
|
121
|
+
onValueChange: (value) => {
|
|
122
|
+
if (!prefs.ELIZA_SCRATCH_RETENTION && value === "pending_decision")
|
|
123
|
+
return;
|
|
124
|
+
setPref("ELIZA_SCRATCH_RETENTION", value);
|
|
125
|
+
},
|
|
126
|
+
children: [
|
|
127
|
+
/* @__PURE__ */ jsx(SettingsControls.SelectTrigger, { variant: "compact", children: /* @__PURE__ */ jsx(SelectValue, {}) }),
|
|
128
|
+
/* @__PURE__ */ jsxs(SelectContent, { children: [
|
|
129
|
+
/* @__PURE__ */ jsx(SelectItem, { value: "ephemeral", children: t("codingagentsettingssection.RetentionEphemeral", {
|
|
130
|
+
defaultValue: "Auto-delete"
|
|
131
|
+
}) }),
|
|
132
|
+
/* @__PURE__ */ jsx(SelectItem, { value: "pending_decision", children: t("codingagentsettingssection.RetentionAskMe", {
|
|
133
|
+
defaultValue: "Ask me (default)"
|
|
134
|
+
}) }),
|
|
135
|
+
/* @__PURE__ */ jsx(SelectItem, { value: "persistent", children: t("codingagentsettingssection.RetentionAlwaysKeep", {
|
|
136
|
+
defaultValue: "Always keep"
|
|
137
|
+
}) })
|
|
138
|
+
] })
|
|
139
|
+
]
|
|
140
|
+
}
|
|
141
|
+
),
|
|
142
|
+
/* @__PURE__ */ jsx(SettingsControls.FieldDescription, { className: "sr-only", children: t("codingagentsettingssection.ScratchRetentionDesc", {
|
|
143
|
+
defaultValue: "What happens to scratch workspace code when a task finishes."
|
|
144
|
+
}) })
|
|
145
|
+
] }),
|
|
146
|
+
/* @__PURE__ */ jsxs(SettingsControls.Field, { children: [
|
|
147
|
+
/* @__PURE__ */ jsx(SettingsControls.FieldLabel, { children: t("codingagentsettingssection.CodingDirectory", {
|
|
148
|
+
defaultValue: "Coding Directory"
|
|
149
|
+
}) }),
|
|
150
|
+
/* @__PURE__ */ jsx(
|
|
151
|
+
CodingDirInput,
|
|
152
|
+
{
|
|
153
|
+
initial: prefs.ELIZA_CODING_DIRECTORY || "",
|
|
154
|
+
onCommit: (val) => setPref("ELIZA_CODING_DIRECTORY", val)
|
|
155
|
+
}
|
|
156
|
+
),
|
|
157
|
+
/* @__PURE__ */ jsx(SettingsControls.FieldDescription, { className: "sr-only", children: t("codingagentsettingssection.CodingDirectoryDesc", {
|
|
158
|
+
defaultValue: "Where scratch task code is saved. Leave empty for default (~/.eliza/workspaces/)."
|
|
159
|
+
}) })
|
|
160
|
+
] })
|
|
161
|
+
] });
|
|
162
|
+
}
|
|
163
|
+
export {
|
|
164
|
+
GlobalPrefsSection
|
|
165
|
+
};
|
|
166
|
+
//# sourceMappingURL=GlobalPrefsSection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/GlobalPrefsSection.tsx"],"sourcesContent":["import {\n Select,\n SelectContent,\n SelectItem,\n SelectValue,\n SettingsControls,\n useAppSelector,\n} from \"@elizaos/ui\";\nimport { useState } from \"react\";\nimport {\n type AgentSelectionStrategy,\n APPROVAL_PRESETS,\n type ApprovalPreset,\n CODING_ACCOUNT_STRATEGY_OPTIONS,\n type CodingAccountStrategy,\n isCodingAccountStrategy,\n} from \"./coding-agent-settings-shared.js\";\n\nfunction CodingDirInput({\n initial,\n onCommit,\n}: {\n initial: string;\n onCommit: (val: string) => void;\n}) {\n const [val, setVal] = useState(initial);\n return (\n <SettingsControls.Input\n className=\"w-full\"\n variant=\"compact\"\n type=\"text\"\n placeholder=\"~/Projects\"\n value={val}\n onChange={(e) => setVal(e.target.value)}\n onBlur={() => onCommit(val)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") onCommit(val);\n }}\n />\n );\n}\n\ninterface GlobalPrefsSectionProps {\n prefs: Record<string, string>;\n selectionStrategy: AgentSelectionStrategy;\n approvalPreset: ApprovalPreset;\n setPref: (key: string, value: string) => void;\n}\n\nexport function GlobalPrefsSection({\n prefs,\n selectionStrategy,\n approvalPreset,\n setPref,\n}: GlobalPrefsSectionProps) {\n const t = useAppSelector((s) => s.t);\n const accountStrategy: CodingAccountStrategy = isCodingAccountStrategy(\n prefs.ELIZA_CODING_ACCOUNT_STRATEGY,\n )\n ? prefs.ELIZA_CODING_ACCOUNT_STRATEGY\n : \"least-used\";\n\n return (\n <>\n <SettingsControls.Field>\n <SettingsControls.FieldLabel>\n {t(\"codingagentsettingssection.AgentSelectionStra\")}\n </SettingsControls.FieldLabel>\n <Select\n value={selectionStrategy}\n onValueChange={(value: string) =>\n setPref(\"ELIZA_AGENT_SELECTION_STRATEGY\", value)\n }\n >\n <SettingsControls.SelectTrigger variant=\"compact\">\n <SelectValue />\n </SettingsControls.SelectTrigger>\n <SelectContent>\n <SelectItem value=\"fixed\">\n {t(\"codingagentsettingssection.Fixed\")}\n </SelectItem>\n <SelectItem value=\"ranked\">\n {t(\"codingagentsettingssection.RankedAutoSelect\")}\n </SelectItem>\n </SelectContent>\n </Select>\n <SettingsControls.FieldDescription className=\"sr-only\">\n {selectionStrategy === \"fixed\"\n ? t(\"codingagentsettingssection.AgentUsedWhenNoEStrategyFixed\")\n : t(\"codingagentsettingssection.AgentUsedWhenNoEStrategyRanked\")}\n </SettingsControls.FieldDescription>\n </SettingsControls.Field>\n\n <SettingsControls.Field>\n <SettingsControls.FieldLabel>\n {t(\"codingagentsettingssection.AccountPoolStrategy\", {\n defaultValue: \"Account Pool Strategy\",\n })}\n </SettingsControls.FieldLabel>\n <Select\n value={accountStrategy}\n onValueChange={(value: string) => {\n if (isCodingAccountStrategy(value)) {\n setPref(\"ELIZA_CODING_ACCOUNT_STRATEGY\", value);\n }\n }}\n >\n <SettingsControls.SelectTrigger variant=\"compact\">\n <SelectValue />\n </SettingsControls.SelectTrigger>\n <SelectContent>\n {CODING_ACCOUNT_STRATEGY_OPTIONS.map((strategy) => (\n <SelectItem key={strategy.value} value={strategy.value}>\n {t(strategy.labelKey, {\n defaultValue: strategy.defaultLabel,\n })}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n <SettingsControls.FieldDescription className=\"sr-only\">\n {t(\"codingagentsettingssection.AccountPoolStrategyDesc\", {\n defaultValue:\n \"How to select between multiple accounts for the same coding agent. This sets ELIZA_CODING_ACCOUNT_STRATEGY for spawned agents.\",\n })}\n </SettingsControls.FieldDescription>\n </SettingsControls.Field>\n\n <SettingsControls.Field>\n <SettingsControls.FieldLabel>\n {t(\"codingagentsettingssection.DefaultPermissionL\")}\n </SettingsControls.FieldLabel>\n <Select\n value={approvalPreset}\n onValueChange={(value: string) =>\n setPref(\"ELIZA_DEFAULT_APPROVAL_PRESET\", value)\n }\n >\n <SettingsControls.SelectTrigger variant=\"compact\">\n <SelectValue />\n </SettingsControls.SelectTrigger>\n <SelectContent>\n {APPROVAL_PRESETS.map((preset) => (\n <SelectItem key={preset.value} value={preset.value}>\n {t(preset.labelKey)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n <SettingsControls.FieldDescription className=\"sr-only\">\n {APPROVAL_PRESETS.find((preset) => preset.value === approvalPreset)\n ?.descKey\n ? t(\n APPROVAL_PRESETS.find(\n (preset) => preset.value === approvalPreset,\n )?.descKey ?? \"\",\n )\n : \"\"}\n {t(\"codingagentsettingssection.AppliesToAllNewlySpawned\")}\n </SettingsControls.FieldDescription>\n </SettingsControls.Field>\n\n <SettingsControls.Field>\n <SettingsControls.FieldLabel>\n {t(\"codingagentsettingssection.ScratchRetention\", {\n defaultValue: \"Scratch Retention\",\n })}\n </SettingsControls.FieldLabel>\n <Select\n value={prefs.ELIZA_SCRATCH_RETENTION || \"pending_decision\"}\n onValueChange={(value: string) => {\n if (!prefs.ELIZA_SCRATCH_RETENTION && value === \"pending_decision\")\n return;\n setPref(\"ELIZA_SCRATCH_RETENTION\", value);\n }}\n >\n <SettingsControls.SelectTrigger variant=\"compact\">\n <SelectValue />\n </SettingsControls.SelectTrigger>\n <SelectContent>\n <SelectItem value=\"ephemeral\">\n {t(\"codingagentsettingssection.RetentionEphemeral\", {\n defaultValue: \"Auto-delete\",\n })}\n </SelectItem>\n <SelectItem value=\"pending_decision\">\n {t(\"codingagentsettingssection.RetentionAskMe\", {\n defaultValue: \"Ask me (default)\",\n })}\n </SelectItem>\n <SelectItem value=\"persistent\">\n {t(\"codingagentsettingssection.RetentionAlwaysKeep\", {\n defaultValue: \"Always keep\",\n })}\n </SelectItem>\n </SelectContent>\n </Select>\n <SettingsControls.FieldDescription className=\"sr-only\">\n {t(\"codingagentsettingssection.ScratchRetentionDesc\", {\n defaultValue:\n \"What happens to scratch workspace code when a task finishes.\",\n })}\n </SettingsControls.FieldDescription>\n </SettingsControls.Field>\n\n <SettingsControls.Field>\n <SettingsControls.FieldLabel>\n {t(\"codingagentsettingssection.CodingDirectory\", {\n defaultValue: \"Coding Directory\",\n })}\n </SettingsControls.FieldLabel>\n <CodingDirInput\n initial={prefs.ELIZA_CODING_DIRECTORY || \"\"}\n onCommit={(val) => setPref(\"ELIZA_CODING_DIRECTORY\", val)}\n />\n <SettingsControls.FieldDescription className=\"sr-only\">\n {t(\"codingagentsettingssection.CodingDirectoryDesc\", {\n defaultValue:\n \"Where scratch task code is saved. Leave empty for default (~/.eliza/workspaces/).\",\n })}\n </SettingsControls.FieldDescription>\n </SettingsControls.Field>\n </>\n );\n}\n"],"mappings":"AA2BI,SAoCA,UApCA,KAkDM,YAlDN;AA3BJ;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,gBAAgB;AACzB;AAAA,EAEE;AAAA,EAEA;AAAA,EAEA;AAAA,OACK;AAEP,SAAS,eAAe;AAAA,EACtB;AAAA,EACA;AACF,GAGG;AACD,QAAM,CAAC,KAAK,MAAM,IAAI,SAAS,OAAO;AACtC,SACE;AAAA,IAAC,iBAAiB;AAAA,IAAjB;AAAA,MACC,WAAU;AAAA,MACV,SAAQ;AAAA,MACR,MAAK;AAAA,MACL,aAAY;AAAA,MACZ,OAAO;AAAA,MACP,UAAU,CAAC,MAAM,OAAO,EAAE,OAAO,KAAK;AAAA,MACtC,QAAQ,MAAM,SAAS,GAAG;AAAA,MAC1B,WAAW,CAAC,MAAM;AAChB,YAAI,EAAE,QAAQ,QAAS,UAAS,GAAG;AAAA,MACrC;AAAA;AAAA,EACF;AAEJ;AASO,SAAS,mBAAmB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA4B;AAC1B,QAAM,IAAI,eAAe,CAAC,MAAM,EAAE,CAAC;AACnC,QAAM,kBAAyC;AAAA,IAC7C,MAAM;AAAA,EACR,IACI,MAAM,gCACN;AAEJ,SACE,iCACE;AAAA,yBAAC,iBAAiB,OAAjB,EACC;AAAA,0BAAC,iBAAiB,YAAjB,EACE,YAAE,+CAA+C,GACpD;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC,OAAO;AAAA,UACP,eAAe,CAAC,UACd,QAAQ,kCAAkC,KAAK;AAAA,UAGjD;AAAA,gCAAC,iBAAiB,eAAjB,EAA+B,SAAQ,WACtC,8BAAC,eAAY,GACf;AAAA,YACA,qBAAC,iBACC;AAAA,kCAAC,cAAW,OAAM,SACf,YAAE,kCAAkC,GACvC;AAAA,cACA,oBAAC,cAAW,OAAM,UACf,YAAE,6CAA6C,GAClD;AAAA,eACF;AAAA;AAAA;AAAA,MACF;AAAA,MACA,oBAAC,iBAAiB,kBAAjB,EAAkC,WAAU,WAC1C,gCAAsB,UACnB,EAAE,0DAA0D,IAC5D,EAAE,2DAA2D,GACnE;AAAA,OACF;AAAA,IAEA,qBAAC,iBAAiB,OAAjB,EACC;AAAA,0BAAC,iBAAiB,YAAjB,EACE,YAAE,kDAAkD;AAAA,QACnD,cAAc;AAAA,MAChB,CAAC,GACH;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC,OAAO;AAAA,UACP,eAAe,CAAC,UAAkB;AAChC,gBAAI,wBAAwB,KAAK,GAAG;AAClC,sBAAQ,iCAAiC,KAAK;AAAA,YAChD;AAAA,UACF;AAAA,UAEA;AAAA,gCAAC,iBAAiB,eAAjB,EAA+B,SAAQ,WACtC,8BAAC,eAAY,GACf;AAAA,YACA,oBAAC,iBACE,0CAAgC,IAAI,CAAC,aACpC,oBAAC,cAAgC,OAAO,SAAS,OAC9C,YAAE,SAAS,UAAU;AAAA,cACpB,cAAc,SAAS;AAAA,YACzB,CAAC,KAHc,SAAS,KAI1B,CACD,GACH;AAAA;AAAA;AAAA,MACF;AAAA,MACA,oBAAC,iBAAiB,kBAAjB,EAAkC,WAAU,WAC1C,YAAE,sDAAsD;AAAA,QACvD,cACE;AAAA,MACJ,CAAC,GACH;AAAA,OACF;AAAA,IAEA,qBAAC,iBAAiB,OAAjB,EACC;AAAA,0BAAC,iBAAiB,YAAjB,EACE,YAAE,+CAA+C,GACpD;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC,OAAO;AAAA,UACP,eAAe,CAAC,UACd,QAAQ,iCAAiC,KAAK;AAAA,UAGhD;AAAA,gCAAC,iBAAiB,eAAjB,EAA+B,SAAQ,WACtC,8BAAC,eAAY,GACf;AAAA,YACA,oBAAC,iBACE,2BAAiB,IAAI,CAAC,WACrB,oBAAC,cAA8B,OAAO,OAAO,OAC1C,YAAE,OAAO,QAAQ,KADH,OAAO,KAExB,CACD,GACH;AAAA;AAAA;AAAA,MACF;AAAA,MACA,qBAAC,iBAAiB,kBAAjB,EAAkC,WAAU,WAC1C;AAAA,yBAAiB,KAAK,CAAC,WAAW,OAAO,UAAU,cAAc,GAC9D,UACA;AAAA,UACE,iBAAiB;AAAA,YACf,CAAC,WAAW,OAAO,UAAU;AAAA,UAC/B,GAAG,WAAW;AAAA,QAChB,IACA;AAAA,QACH,EAAE,qDAAqD;AAAA,SAC1D;AAAA,OACF;AAAA,IAEA,qBAAC,iBAAiB,OAAjB,EACC;AAAA,0BAAC,iBAAiB,YAAjB,EACE,YAAE,+CAA+C;AAAA,QAChD,cAAc;AAAA,MAChB,CAAC,GACH;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC,OAAO,MAAM,2BAA2B;AAAA,UACxC,eAAe,CAAC,UAAkB;AAChC,gBAAI,CAAC,MAAM,2BAA2B,UAAU;AAC9C;AACF,oBAAQ,2BAA2B,KAAK;AAAA,UAC1C;AAAA,UAEA;AAAA,gCAAC,iBAAiB,eAAjB,EAA+B,SAAQ,WACtC,8BAAC,eAAY,GACf;AAAA,YACA,qBAAC,iBACC;AAAA,kCAAC,cAAW,OAAM,aACf,YAAE,iDAAiD;AAAA,gBAClD,cAAc;AAAA,cAChB,CAAC,GACH;AAAA,cACA,oBAAC,cAAW,OAAM,oBACf,YAAE,6CAA6C;AAAA,gBAC9C,cAAc;AAAA,cAChB,CAAC,GACH;AAAA,cACA,oBAAC,cAAW,OAAM,cACf,YAAE,kDAAkD;AAAA,gBACnD,cAAc;AAAA,cAChB,CAAC,GACH;AAAA,eACF;AAAA;AAAA;AAAA,MACF;AAAA,MACA,oBAAC,iBAAiB,kBAAjB,EAAkC,WAAU,WAC1C,YAAE,mDAAmD;AAAA,QACpD,cACE;AAAA,MACJ,CAAC,GACH;AAAA,OACF;AAAA,IAEA,qBAAC,iBAAiB,OAAjB,EACC;AAAA,0BAAC,iBAAiB,YAAjB,EACE,YAAE,8CAA8C;AAAA,QAC/C,cAAc;AAAA,MAChB,CAAC,GACH;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC,SAAS,MAAM,0BAA0B;AAAA,UACzC,UAAU,CAAC,QAAQ,QAAQ,0BAA0B,GAAG;AAAA;AAAA,MAC1D;AAAA,MACA,oBAAC,iBAAiB,kBAAjB,EAAkC,WAAU,WAC1C,YAAE,kDAAkD;AAAA,QACnD,cACE;AAAA,MACJ,CAAC,GACH;AAAA,OACF;AAAA,KACF;AAEJ;","names":[]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { LlmProvider } from "./coding-agent-settings-shared";
|
|
2
|
+
interface LlmProviderSectionProps {
|
|
3
|
+
llmProvider: LlmProvider;
|
|
4
|
+
isCloud: boolean;
|
|
5
|
+
prefs: Record<string, string>;
|
|
6
|
+
setPref: (key: string, value: string) => void;
|
|
7
|
+
}
|
|
8
|
+
export declare function LlmProviderSection({ llmProvider, isCloud, prefs, setPref, }: LlmProviderSectionProps): import("react/jsx-runtime").JSX.Element;
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=LlmProviderSection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LlmProviderSection.d.ts","sourceRoot":"","sources":["../src/LlmProviderSection.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAElE,UAAU,uBAAuB;IAC/B,WAAW,EAAE,WAAW,CAAC;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CAC/C;AAED,wBAAgB,kBAAkB,CAAC,EACjC,WAAW,EACX,OAAO,EACP,KAAK,EACL,OAAO,GACR,EAAE,uBAAuB,2CAiKzB"}
|