@elizaos/plugin-task-coordinator 2.0.3-beta.2 → 2.0.3-beta.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.
Files changed (176) hide show
  1. package/assets/hero.png +0 -0
  2. package/dist/AgentTabsSection.d.ts +16 -0
  3. package/dist/AgentTabsSection.d.ts.map +1 -0
  4. package/dist/AgentTabsSection.js +169 -0
  5. package/dist/AgentTabsSection.js.map +1 -0
  6. package/dist/CodingAgentControlChip.d.ts +2 -0
  7. package/dist/CodingAgentControlChip.d.ts.map +1 -0
  8. package/dist/CodingAgentControlChip.js +73 -0
  9. package/dist/CodingAgentControlChip.js.map +1 -0
  10. package/dist/CodingAgentSettingsSection.d.ts +2 -0
  11. package/dist/CodingAgentSettingsSection.d.ts.map +1 -0
  12. package/dist/CodingAgentSettingsSection.js +379 -0
  13. package/dist/CodingAgentSettingsSection.js.map +1 -0
  14. package/dist/CodingAgentTasksPanel.d.ts +4 -0
  15. package/dist/CodingAgentTasksPanel.d.ts.map +1 -0
  16. package/dist/CodingAgentTasksPanel.interact.d.ts +2 -0
  17. package/dist/CodingAgentTasksPanel.interact.d.ts.map +1 -0
  18. package/dist/CodingAgentTasksPanel.interact.js +46 -0
  19. package/dist/CodingAgentTasksPanel.interact.js.map +1 -0
  20. package/dist/CodingAgentTasksPanel.js +740 -0
  21. package/dist/CodingAgentTasksPanel.js.map +1 -0
  22. package/dist/GitHubConnectionCard.d.ts +2 -0
  23. package/dist/GitHubConnectionCard.d.ts.map +1 -0
  24. package/dist/GitHubConnectionCard.js +172 -0
  25. package/dist/GitHubConnectionCard.js.map +1 -0
  26. package/dist/GlobalPrefsSection.d.ts +10 -0
  27. package/dist/GlobalPrefsSection.d.ts.map +1 -0
  28. package/dist/GlobalPrefsSection.js +166 -0
  29. package/dist/GlobalPrefsSection.js.map +1 -0
  30. package/dist/LlmProviderSection.d.ts +10 -0
  31. package/dist/LlmProviderSection.d.ts.map +1 -0
  32. package/dist/LlmProviderSection.js +161 -0
  33. package/dist/LlmProviderSection.js.map +1 -0
  34. package/dist/ModelConfigSection.d.ts +15 -0
  35. package/dist/ModelConfigSection.d.ts.map +1 -0
  36. package/dist/ModelConfigSection.js +86 -0
  37. package/dist/ModelConfigSection.js.map +1 -0
  38. package/dist/OrchestratorView.d.ts +20 -0
  39. package/dist/OrchestratorView.d.ts.map +1 -0
  40. package/dist/OrchestratorView.js +231 -0
  41. package/dist/OrchestratorView.js.map +1 -0
  42. package/dist/OrchestratorWorkbench.d.ts +32 -0
  43. package/dist/OrchestratorWorkbench.d.ts.map +1 -0
  44. package/dist/OrchestratorWorkbench.js +3200 -0
  45. package/dist/OrchestratorWorkbench.js.map +1 -0
  46. package/dist/PtyConsoleBase.d.ts +9 -0
  47. package/dist/PtyConsoleBase.d.ts.map +1 -0
  48. package/dist/PtyConsoleBase.js +174 -0
  49. package/dist/PtyConsoleBase.js.map +1 -0
  50. package/dist/PtyConsoleDrawer.d.ts +10 -0
  51. package/dist/PtyConsoleDrawer.d.ts.map +1 -0
  52. package/dist/PtyConsoleDrawer.js +77 -0
  53. package/dist/PtyConsoleDrawer.js.map +1 -0
  54. package/dist/PtyConsoleSidePanel.d.ts +8 -0
  55. package/dist/PtyConsoleSidePanel.d.ts.map +1 -0
  56. package/dist/PtyConsoleSidePanel.js +9 -0
  57. package/dist/PtyConsoleSidePanel.js.map +1 -0
  58. package/dist/PtyTerminalPane.d.ts +10 -0
  59. package/dist/PtyTerminalPane.d.ts.map +1 -0
  60. package/dist/PtyTerminalPane.js +147 -0
  61. package/dist/PtyTerminalPane.js.map +1 -0
  62. package/dist/TaskCardList.d.ts +76 -0
  63. package/dist/TaskCardList.d.ts.map +1 -0
  64. package/dist/TaskCardList.js +327 -0
  65. package/dist/TaskCardList.js.map +1 -0
  66. package/dist/TaskCoordinatorView.d.ts +20 -0
  67. package/dist/TaskCoordinatorView.d.ts.map +1 -0
  68. package/dist/TaskCoordinatorView.js +146 -0
  69. package/dist/TaskCoordinatorView.js.map +1 -0
  70. package/dist/__e2e__/dashboard-fixture.d.ts +9 -0
  71. package/dist/__e2e__/dashboard-fixture.d.ts.map +1 -0
  72. package/dist/__e2e__/dashboard-fixture.js +123 -0
  73. package/dist/__e2e__/dashboard-fixture.js.map +1 -0
  74. package/dist/api/coding-agents-auth-sanitize.d.ts +23 -0
  75. package/dist/api/coding-agents-auth-sanitize.d.ts.map +1 -0
  76. package/dist/api/coding-agents-auth-sanitize.js +22 -0
  77. package/dist/api/coding-agents-auth-sanitize.js.map +1 -0
  78. package/dist/api/coding-agents-preflight-normalize.d.ts +29 -0
  79. package/dist/api/coding-agents-preflight-normalize.d.ts.map +1 -0
  80. package/dist/api/coding-agents-preflight-normalize.js +20 -0
  81. package/dist/api/coding-agents-preflight-normalize.js.map +1 -0
  82. package/dist/coding-agent-settings-shared.d.ts +42 -0
  83. package/dist/coding-agent-settings-shared.d.ts.map +1 -0
  84. package/dist/coding-agent-settings-shared.js +121 -0
  85. package/dist/coding-agent-settings-shared.js.map +1 -0
  86. package/dist/components/OrchestratorSpatialView.d.ts +56 -0
  87. package/dist/components/OrchestratorSpatialView.d.ts.map +1 -0
  88. package/dist/components/OrchestratorSpatialView.js +501 -0
  89. package/dist/components/OrchestratorSpatialView.js.map +1 -0
  90. package/dist/components/TaskCoordinatorSpatialView.d.ts +59 -0
  91. package/dist/components/TaskCoordinatorSpatialView.d.ts.map +1 -0
  92. package/dist/components/TaskCoordinatorSpatialView.js +294 -0
  93. package/dist/components/TaskCoordinatorSpatialView.js.map +1 -0
  94. package/dist/index.d.ts +5 -0
  95. package/dist/index.d.ts.map +1 -0
  96. package/dist/index.js +286 -0
  97. package/dist/index.js.map +1 -0
  98. package/dist/orchestrator-capabilities.d.ts +3 -0
  99. package/dist/orchestrator-capabilities.d.ts.map +1 -0
  100. package/dist/orchestrator-capabilities.js +136 -0
  101. package/dist/orchestrator-capabilities.js.map +1 -0
  102. package/dist/orchestrator-command.d.ts +39 -0
  103. package/dist/orchestrator-command.d.ts.map +1 -0
  104. package/dist/orchestrator-command.js +52 -0
  105. package/dist/orchestrator-command.js.map +1 -0
  106. package/dist/orchestrator-diff.d.ts +19 -0
  107. package/dist/orchestrator-diff.d.ts.map +1 -0
  108. package/dist/orchestrator-diff.helpers.d.ts +18 -0
  109. package/dist/orchestrator-diff.helpers.d.ts.map +1 -0
  110. package/dist/orchestrator-diff.helpers.js +76 -0
  111. package/dist/orchestrator-diff.helpers.js.map +1 -0
  112. package/dist/orchestrator-diff.js +119 -0
  113. package/dist/orchestrator-diff.js.map +1 -0
  114. package/dist/orchestrator-markdown.d.ts +5 -0
  115. package/dist/orchestrator-markdown.d.ts.map +1 -0
  116. package/dist/orchestrator-markdown.helpers.d.ts +2 -0
  117. package/dist/orchestrator-markdown.helpers.d.ts.map +1 -0
  118. package/dist/orchestrator-markdown.helpers.js +21 -0
  119. package/dist/orchestrator-markdown.helpers.js.map +1 -0
  120. package/dist/orchestrator-markdown.js +199 -0
  121. package/dist/orchestrator-markdown.js.map +1 -0
  122. package/dist/orchestrator-params.d.ts +8 -0
  123. package/dist/orchestrator-params.d.ts.map +1 -0
  124. package/dist/orchestrator-params.js +27 -0
  125. package/dist/orchestrator-params.js.map +1 -0
  126. package/dist/orchestrator-plan.d.ts +5 -0
  127. package/dist/orchestrator-plan.d.ts.map +1 -0
  128. package/dist/orchestrator-plan.js +95 -0
  129. package/dist/orchestrator-plan.js.map +1 -0
  130. package/dist/orchestrator-reasoning.d.ts +21 -0
  131. package/dist/orchestrator-reasoning.d.ts.map +1 -0
  132. package/dist/orchestrator-reasoning.js +105 -0
  133. package/dist/orchestrator-reasoning.js.map +1 -0
  134. package/dist/orchestrator-stream.d.ts +15 -0
  135. package/dist/orchestrator-stream.d.ts.map +1 -0
  136. package/dist/orchestrator-stream.helpers.d.ts +89 -0
  137. package/dist/orchestrator-stream.helpers.d.ts.map +1 -0
  138. package/dist/orchestrator-stream.helpers.js +361 -0
  139. package/dist/orchestrator-stream.helpers.js.map +1 -0
  140. package/dist/orchestrator-stream.js +307 -0
  141. package/dist/orchestrator-stream.js.map +1 -0
  142. package/dist/pty-status-dots.d.ts +2 -0
  143. package/dist/pty-status-dots.d.ts.map +1 -0
  144. package/dist/pty-status-dots.js +6 -0
  145. package/dist/pty-status-dots.js.map +1 -0
  146. package/dist/register-slots.d.ts +20 -0
  147. package/dist/register-slots.d.ts.map +1 -0
  148. package/dist/register-slots.js +50 -0
  149. package/dist/register-slots.js.map +1 -0
  150. package/dist/register-terminal-view.d.ts +21 -0
  151. package/dist/register-terminal-view.d.ts.map +1 -0
  152. package/dist/register-terminal-view.js +46 -0
  153. package/dist/register-terminal-view.js.map +1 -0
  154. package/dist/register.d.ts +2 -0
  155. package/dist/register.d.ts.map +1 -0
  156. package/dist/register.js +23 -0
  157. package/dist/register.js.map +1 -0
  158. package/dist/session-hydration.d.ts +2 -0
  159. package/dist/session-hydration.d.ts.map +1 -0
  160. package/dist/session-hydration.js +9 -0
  161. package/dist/session-hydration.js.map +1 -0
  162. package/dist/task-coordinator-view-bundle.d.ts +4 -0
  163. package/dist/task-coordinator-view-bundle.d.ts.map +1 -0
  164. package/dist/task-coordinator-view-bundle.js +9 -0
  165. package/dist/task-coordinator-view-bundle.js.map +1 -0
  166. package/dist/ui.d.ts +2 -0
  167. package/dist/ui.d.ts.map +1 -0
  168. package/dist/ui.js +13 -0
  169. package/dist/ui.js.map +1 -0
  170. package/dist/view-format.d.ts +25 -0
  171. package/dist/view-format.d.ts.map +1 -0
  172. package/dist/view-format.js +64 -0
  173. package/dist/view-format.js.map +1 -0
  174. package/dist/views/bundle.js +1383 -0
  175. package/dist/views/bundle.js.map +1 -0
  176. package/package.json +7 -6
@@ -0,0 +1,379 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { client, useAppSelector } from "@elizaos/ui";
3
+ import { ExternalLink, Terminal } from "lucide-react";
4
+ import {
5
+ useCallback,
6
+ useEffect,
7
+ useRef,
8
+ useState
9
+ } from "react";
10
+ import { AgentTabsSection } from "./AgentTabsSection.js";
11
+ import {
12
+ ADAPTER_NAME_TO_TAB,
13
+ AGENT_LABELS,
14
+ AGENT_PROVIDER_MAP,
15
+ AGENT_TABS,
16
+ ENV_PREFIX,
17
+ FALLBACK_MODELS
18
+ } from "./coding-agent-settings-shared.js";
19
+ import { GitHubConnectionCard } from "./GitHubConnectionCard.js";
20
+ import { GlobalPrefsSection } from "./GlobalPrefsSection.js";
21
+ import { LlmProviderSection } from "./LlmProviderSection.js";
22
+ import { ModelConfigSection } from "./ModelConfigSection.js";
23
+ function AgentAdvancedSettingsDisclosure({
24
+ children
25
+ }) {
26
+ return /* @__PURE__ */ jsxs("details", { className: "group px-1 py-1", children: [
27
+ /* @__PURE__ */ jsx("summary", { className: "cursor-pointer select-none list-none text-xs font-medium text-muted transition-colors hover:text-txt", children: "Defaults and workspace" }),
28
+ /* @__PURE__ */ jsx("div", { className: "mt-3 flex flex-col gap-4", children })
29
+ ] });
30
+ }
31
+ function CodingAgentSettingsSection() {
32
+ const t = useAppSelector((s) => s.t);
33
+ const elizaCloudConnected = useAppSelector((s) => s.elizaCloudConnected);
34
+ const [activeTab, setActiveTab] = useState(null);
35
+ const [loading, setLoading] = useState(true);
36
+ const [prefs, setPrefs] = useState({});
37
+ const [providerModels, setProviderModels] = useState({});
38
+ const [preflightLoaded, setPreflightLoaded] = useState(false);
39
+ const [preflightByAgent, setPreflightByAgent] = useState({});
40
+ const [authInProgress, setAuthInProgress] = useState(null);
41
+ const [authResult, setAuthResult] = useState(null);
42
+ useEffect(() => {
43
+ const controller = new AbortController();
44
+ void (async () => {
45
+ setLoading(true);
46
+ try {
47
+ const [cfg, anthropicRes, openaiRes, preflightRes] = await Promise.all([
48
+ client.getConfig(),
49
+ client.fetchModels("anthropic", false).catch(() => null),
50
+ client.fetchModels("openai", false).catch(() => null),
51
+ fetch("/api/coding-agents/preflight", {
52
+ signal: controller.signal
53
+ }).then((response) => response.ok ? response.json() : null).catch(() => null)
54
+ ]);
55
+ if (controller.signal.aborted) return;
56
+ const env = cfg.env ?? {};
57
+ const cloud = cfg.cloud ?? {};
58
+ const loaded = {};
59
+ if (cloud.apiKey) {
60
+ loaded._CLOUD_API_KEY = cloud.apiKey;
61
+ }
62
+ for (const agent of ["CLAUDE", "CODEX", "OPENCODE"]) {
63
+ const prefix2 = `ELIZA_${agent}`;
64
+ if (env[`${prefix2}_MODEL_POWERFUL`]) {
65
+ loaded[`${prefix2}_MODEL_POWERFUL`] = env[`${prefix2}_MODEL_POWERFUL`];
66
+ }
67
+ if (env[`${prefix2}_MODEL_FAST`]) {
68
+ loaded[`${prefix2}_MODEL_FAST`] = env[`${prefix2}_MODEL_FAST`];
69
+ }
70
+ }
71
+ for (const k of [
72
+ "ELIZA_DEFAULT_APPROVAL_PRESET",
73
+ "ELIZA_AGENT_SELECTION_STRATEGY",
74
+ "ELIZA_DEFAULT_AGENT_TYPE",
75
+ "ELIZA_SCRATCH_RETENTION",
76
+ "ELIZA_CODING_DIRECTORY",
77
+ "ELIZA_LLM_PROVIDER"
78
+ ]) {
79
+ if (env[k]) loaded[k] = env[k];
80
+ }
81
+ for (const key of [
82
+ "ANTHROPIC_API_KEY",
83
+ "OPENAI_API_KEY",
84
+ "ANTHROPIC_BASE_URL",
85
+ "OPENAI_BASE_URL",
86
+ "ELIZA_OPENCODE_API_KEY",
87
+ "ELIZA_OPENCODE_BASE_URL",
88
+ "ELIZA_OPENCODE_LOCAL"
89
+ ]) {
90
+ if (env[key]) loaded[key] = env[key];
91
+ }
92
+ setPrefs(loaded);
93
+ const models = {};
94
+ for (const [providerId2, response] of [
95
+ ["anthropic", anthropicRes],
96
+ ["openai", openaiRes]
97
+ ]) {
98
+ if (response?.models && Array.isArray(response.models) && response.models.length > 0) {
99
+ const chatModels = response.models.filter((model) => model.category === "chat").map((model) => ({
100
+ value: model.id,
101
+ label: model.name || model.id
102
+ }));
103
+ if (chatModels.length > 0) {
104
+ models[providerId2] = chatModels;
105
+ }
106
+ }
107
+ }
108
+ setProviderModels(models);
109
+ if (Array.isArray(preflightRes)) {
110
+ const mapped = {};
111
+ for (const item of preflightRes) {
112
+ const raw = item.adapter?.toLowerCase();
113
+ const key = raw ? ADAPTER_NAME_TO_TAB[raw] : void 0;
114
+ if (key) {
115
+ mapped[key] = item;
116
+ }
117
+ }
118
+ setPreflightByAgent(mapped);
119
+ setPreflightLoaded(true);
120
+ }
121
+ } catch (err) {
122
+ console.warn(
123
+ "[coding-agents] Failed to load config/models on mount",
124
+ err
125
+ );
126
+ }
127
+ if (!controller.signal.aborted) setLoading(false);
128
+ })();
129
+ return () => controller.abort();
130
+ }, []);
131
+ const rawLlmProvider = prefs.ELIZA_LLM_PROVIDER || "subscription";
132
+ const llmProvider = rawLlmProvider === "cloud" && !elizaCloudConnected ? "subscription" : rawLlmProvider;
133
+ const isCloud = llmProvider === "cloud";
134
+ const installedAgents = AGENT_TABS.filter(
135
+ (agent) => preflightByAgent[agent]?.installed === true
136
+ );
137
+ const providerFilteredAgents = AGENT_TABS;
138
+ const availableAgents = preflightLoaded && installedAgents.length > 0 ? installedAgents.filter((a) => providerFilteredAgents.includes(a)) : providerFilteredAgents;
139
+ const getInstallState = (agent) => {
140
+ if (!preflightLoaded) {
141
+ return "unknown";
142
+ }
143
+ return preflightByAgent[agent]?.installed ? "installed" : "missing";
144
+ };
145
+ useEffect(() => {
146
+ if (loading || availableAgents.length === 0) return;
147
+ if (activeTab === null) {
148
+ const saved = prefs.ELIZA_DEFAULT_AGENT_TYPE;
149
+ setActiveTab(
150
+ saved && availableAgents.includes(saved) ? saved : availableAgents[0]
151
+ );
152
+ } else if (!availableAgents.includes(activeTab)) {
153
+ setActiveTab(availableAgents[0]);
154
+ }
155
+ }, [loading, activeTab, availableAgents, prefs.ELIZA_DEFAULT_AGENT_TYPE]);
156
+ const setPref = useCallback((key, value) => {
157
+ setPrefs((previous) => ({ ...previous, [key]: value }));
158
+ }, []);
159
+ const [autoSaveError, setAutoSaveError] = useState(null);
160
+ const autoSaveArmedRef = useRef(false);
161
+ useEffect(() => {
162
+ if (loading) return;
163
+ if (!autoSaveArmedRef.current) {
164
+ autoSaveArmedRef.current = true;
165
+ return;
166
+ }
167
+ const envPatch = {};
168
+ for (const [k, v] of Object.entries(prefs)) {
169
+ if (k.startsWith("_")) continue;
170
+ if (typeof v === "string") {
171
+ envPatch[k] = v;
172
+ } else if (typeof v === "number" || typeof v === "boolean") {
173
+ envPatch[k] = String(v);
174
+ }
175
+ }
176
+ const timer = setTimeout(() => {
177
+ client.updateConfig({ env: envPatch }).then(() => setAutoSaveError(null)).catch((err) => {
178
+ setAutoSaveError(
179
+ err instanceof Error ? err.message : "Failed to save settings"
180
+ );
181
+ });
182
+ }, 400);
183
+ return () => clearTimeout(timer);
184
+ }, [prefs, loading]);
185
+ const refreshPreflight = useCallback(async () => {
186
+ try {
187
+ const preflightRes = await fetch("/api/coding-agents/preflight");
188
+ if (!preflightRes.ok) return null;
189
+ const results = await preflightRes.json();
190
+ if (!Array.isArray(results)) return null;
191
+ const mapped = {};
192
+ for (const item of results) {
193
+ const raw = item.adapter?.toLowerCase();
194
+ const key = raw ? ADAPTER_NAME_TO_TAB[raw] : void 0;
195
+ if (key) mapped[key] = item;
196
+ }
197
+ setPreflightByAgent(mapped);
198
+ return mapped;
199
+ } catch (err) {
200
+ console.warn("[coding-agents] Failed to refresh preflight", err);
201
+ return null;
202
+ }
203
+ }, []);
204
+ const authPollRef = useRef(null);
205
+ useEffect(() => {
206
+ return () => {
207
+ if (authPollRef.current !== null) {
208
+ clearInterval(authPollRef.current);
209
+ authPollRef.current = null;
210
+ }
211
+ };
212
+ }, []);
213
+ const handleAuth = useCallback(
214
+ async (agent) => {
215
+ if (authPollRef.current !== null) {
216
+ clearInterval(authPollRef.current);
217
+ authPollRef.current = null;
218
+ }
219
+ setAuthInProgress(agent);
220
+ setAuthResult(null);
221
+ try {
222
+ const res = await fetch(`/api/coding-agents/auth/${agent}`, {
223
+ method: "POST"
224
+ });
225
+ if (!res.ok) {
226
+ setAuthResult({
227
+ agent,
228
+ launched: false,
229
+ instructions: `Failed to start auth (${res.status}). Try again, or run the CLI's login command directly.`
230
+ });
231
+ setAuthInProgress(null);
232
+ return;
233
+ }
234
+ const data = await res.json();
235
+ setAuthResult({ agent, ...data });
236
+ let attempts = 0;
237
+ const maxAttempts = 40;
238
+ const poll = setInterval(async () => {
239
+ attempts++;
240
+ const mapped = await refreshPreflight();
241
+ const authed = mapped?.[agent]?.auth?.status === "authenticated";
242
+ if (authed || attempts >= maxAttempts) {
243
+ clearInterval(poll);
244
+ if (authPollRef.current === poll) authPollRef.current = null;
245
+ setAuthInProgress(null);
246
+ if (authed) setAuthResult(null);
247
+ }
248
+ }, 3e3);
249
+ authPollRef.current = poll;
250
+ } catch (err) {
251
+ setAuthResult({
252
+ agent,
253
+ launched: false,
254
+ instructions: err instanceof Error ? `Auth request failed: ${err.message}` : "Auth request failed. Try again, or run the CLI's login command directly."
255
+ });
256
+ setAuthInProgress(null);
257
+ }
258
+ },
259
+ [refreshPreflight]
260
+ );
261
+ const getProviderId = (tab) => AGENT_PROVIDER_MAP[tab];
262
+ const getModelOptions = (providerId2) => {
263
+ return providerModels[providerId2] ?? FALLBACK_MODELS[providerId2] ?? [];
264
+ };
265
+ if (loading || !activeTab) {
266
+ return /* @__PURE__ */ jsx("div", { className: "py-4 text-center text-muted text-xs", children: t("codingagentsettingssection.LoadingCodingAgent") });
267
+ }
268
+ const prefix = ENV_PREFIX[activeTab];
269
+ const providerId = getProviderId(activeTab);
270
+ const modelOptions = getModelOptions(providerId);
271
+ const powerfulValue = prefs[`${prefix}_MODEL_POWERFUL`] ?? "";
272
+ const fastValue = prefs[`${prefix}_MODEL_FAST`] ?? "";
273
+ const isDynamic = Boolean(providerModels[providerId]);
274
+ const selectionStrategy = prefs.ELIZA_AGENT_SELECTION_STRATEGY || "fixed";
275
+ const approvalPreset = prefs.ELIZA_DEFAULT_APPROVAL_PRESET || "permissive";
276
+ if (preflightLoaded && installedAgents.length === 0) {
277
+ return /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-2 text-xs text-muted", children: [
278
+ /* @__PURE__ */ jsx("div", { children: t("codingagentsettingssection.NoSupportedCLIs") }),
279
+ /* @__PURE__ */ jsx("div", { className: "grid gap-2", children: AGENT_TABS.map((agent) => {
280
+ const preflight = preflightByAgent[agent];
281
+ return /* @__PURE__ */ jsxs(
282
+ "div",
283
+ {
284
+ className: "flex items-center justify-between gap-3 px-1 py-1.5",
285
+ children: [
286
+ /* @__PURE__ */ jsxs("div", { className: "min-w-0", children: [
287
+ /* @__PURE__ */ jsx("div", { className: "font-semibold text-txt", children: AGENT_LABELS[agent] }),
288
+ preflight?.installCommand ? /* @__PURE__ */ jsxs("code", { className: "inline-flex max-w-full items-center gap-1 truncate text-2xs text-muted-strong", children: [
289
+ /* @__PURE__ */ jsx(Terminal, { className: "h-3 w-3 shrink-0", "aria-hidden": true }),
290
+ /* @__PURE__ */ jsx("span", { className: "truncate", children: preflight.installCommand })
291
+ ] }) : null
292
+ ] }),
293
+ preflight?.docsUrl ? /* @__PURE__ */ jsx(
294
+ "a",
295
+ {
296
+ href: preflight.docsUrl,
297
+ target: "_blank",
298
+ rel: "noreferrer",
299
+ className: "inline-flex h-8 w-8 shrink-0 items-center justify-center rounded-lg text-muted hover:bg-bg-hover hover:text-txt",
300
+ "aria-label": `${AGENT_LABELS[agent]} docs`,
301
+ title: `${AGENT_LABELS[agent]} docs`,
302
+ children: /* @__PURE__ */ jsx(ExternalLink, { className: "h-3.5 w-3.5", "aria-hidden": true })
303
+ }
304
+ ) : null
305
+ ]
306
+ },
307
+ agent
308
+ );
309
+ }) })
310
+ ] });
311
+ }
312
+ return /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-4", children: [
313
+ autoSaveError && /* @__PURE__ */ jsx(
314
+ "div",
315
+ {
316
+ role: "alert",
317
+ className: "rounded-md border border-danger/30 bg-danger/10 px-3 py-2 text-xs text-danger",
318
+ children: t("codingagentsettingssection.AutoSaveFailed", {
319
+ defaultValue: "Failed to save settings: {{error}}",
320
+ error: autoSaveError
321
+ })
322
+ }
323
+ ),
324
+ /* @__PURE__ */ jsx(
325
+ AgentTabsSection,
326
+ {
327
+ activeTab,
328
+ availableAgents,
329
+ llmProvider,
330
+ preflightByAgent,
331
+ authInProgress,
332
+ authResult,
333
+ getInstallState,
334
+ onSelectAgent: (agent) => {
335
+ setActiveTab(agent);
336
+ setPref("ELIZA_DEFAULT_AGENT_TYPE", agent);
337
+ },
338
+ onAuth: handleAuth
339
+ }
340
+ ),
341
+ /* @__PURE__ */ jsx(
342
+ LlmProviderSection,
343
+ {
344
+ llmProvider,
345
+ isCloud,
346
+ prefs,
347
+ setPref
348
+ }
349
+ ),
350
+ /* @__PURE__ */ jsx(
351
+ ModelConfigSection,
352
+ {
353
+ activeTab,
354
+ llmProvider,
355
+ isCloud,
356
+ prefix,
357
+ powerfulValue,
358
+ fastValue,
359
+ modelOptions,
360
+ isDynamic,
361
+ setPref
362
+ }
363
+ ),
364
+ /* @__PURE__ */ jsx(GitHubConnectionCard, {}),
365
+ /* @__PURE__ */ jsx(AgentAdvancedSettingsDisclosure, { children: /* @__PURE__ */ jsx(
366
+ GlobalPrefsSection,
367
+ {
368
+ prefs,
369
+ selectionStrategy,
370
+ approvalPreset,
371
+ setPref
372
+ }
373
+ ) })
374
+ ] });
375
+ }
376
+ export {
377
+ CodingAgentSettingsSection
378
+ };
379
+ //# sourceMappingURL=CodingAgentSettingsSection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/CodingAgentSettingsSection.tsx"],"sourcesContent":["import { type AgentPreflightResult, client, useAppSelector } from \"@elizaos/ui\";\nimport { ExternalLink, Terminal } from \"lucide-react\";\nimport {\n type ReactNode,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport { AgentTabsSection } from \"./AgentTabsSection.js\";\nimport {\n ADAPTER_NAME_TO_TAB,\n AGENT_LABELS,\n AGENT_PROVIDER_MAP,\n AGENT_TABS,\n type AgentSelectionStrategy,\n type AgentTab,\n type ApprovalPreset,\n type AuthResult,\n ENV_PREFIX,\n FALLBACK_MODELS,\n type LlmProvider,\n type ModelOption,\n} from \"./coding-agent-settings-shared.js\";\nimport { GitHubConnectionCard } from \"./GitHubConnectionCard.js\";\nimport { GlobalPrefsSection } from \"./GlobalPrefsSection.js\";\nimport { LlmProviderSection } from \"./LlmProviderSection.js\";\nimport { ModelConfigSection } from \"./ModelConfigSection.js\";\n\nfunction AgentAdvancedSettingsDisclosure({\n children,\n}: {\n children: ReactNode;\n}) {\n return (\n <details className=\"group px-1 py-1\">\n <summary className=\"cursor-pointer select-none list-none text-xs font-medium text-muted transition-colors hover:text-txt\">\n Defaults and workspace\n </summary>\n <div className=\"mt-3 flex flex-col gap-4\">{children}</div>\n </details>\n );\n}\n\nexport function CodingAgentSettingsSection() {\n const t = useAppSelector((s) => s.t);\n const elizaCloudConnected = useAppSelector((s) => s.elizaCloudConnected);\n\n const [activeTab, setActiveTab] = useState<AgentTab | null>(null);\n const [loading, setLoading] = useState(true);\n const [prefs, setPrefs] = useState<Record<string, string>>({});\n const [providerModels, setProviderModels] = useState<\n Record<string, ModelOption[]>\n >({});\n const [preflightLoaded, setPreflightLoaded] = useState(false);\n const [preflightByAgent, setPreflightByAgent] = useState<\n Partial<Record<AgentTab, AgentPreflightResult>>\n >({});\n const [authInProgress, setAuthInProgress] = useState<AgentTab | null>(null);\n const [authResult, setAuthResult] = useState<AuthResult | null>(null);\n\n useEffect(() => {\n const controller = new AbortController();\n void (async () => {\n setLoading(true);\n try {\n const [cfg, anthropicRes, openaiRes, preflightRes] = await Promise.all([\n client.getConfig(),\n client.fetchModels(\"anthropic\", false).catch(() => null),\n client.fetchModels(\"openai\", false).catch(() => null),\n fetch(\"/api/coding-agents/preflight\", {\n signal: controller.signal,\n })\n .then((response) => (response.ok ? response.json() : null))\n .catch(() => null),\n ]);\n\n if (controller.signal.aborted) return;\n\n const env = (cfg.env ?? {}) as Record<string, string>;\n const cloud = (cfg.cloud ?? {}) as Record<string, string>;\n const loaded: Record<string, string> = {};\n // Store cloud API key for reference in cloud mode\n if (cloud.apiKey) {\n loaded._CLOUD_API_KEY = cloud.apiKey;\n }\n for (const agent of [\"CLAUDE\", \"CODEX\", \"OPENCODE\"] as const) {\n const prefix = `ELIZA_${agent}`;\n if (env[`${prefix}_MODEL_POWERFUL`]) {\n loaded[`${prefix}_MODEL_POWERFUL`] =\n env[`${prefix}_MODEL_POWERFUL`];\n }\n if (env[`${prefix}_MODEL_FAST`]) {\n loaded[`${prefix}_MODEL_FAST`] = env[`${prefix}_MODEL_FAST`];\n }\n }\n for (const k of [\n \"ELIZA_DEFAULT_APPROVAL_PRESET\",\n \"ELIZA_AGENT_SELECTION_STRATEGY\",\n \"ELIZA_DEFAULT_AGENT_TYPE\",\n \"ELIZA_SCRATCH_RETENTION\",\n \"ELIZA_CODING_DIRECTORY\",\n \"ELIZA_LLM_PROVIDER\",\n ] as const) {\n if (env[k]) loaded[k] = env[k];\n }\n // API keys — load presence indicators (masked)\n for (const key of [\n \"ANTHROPIC_API_KEY\",\n \"OPENAI_API_KEY\",\n \"ANTHROPIC_BASE_URL\",\n \"OPENAI_BASE_URL\",\n \"ELIZA_OPENCODE_API_KEY\",\n \"ELIZA_OPENCODE_BASE_URL\",\n \"ELIZA_OPENCODE_LOCAL\",\n ] as const) {\n if (env[key]) loaded[key] = env[key];\n }\n setPrefs(loaded);\n\n const models: Record<string, ModelOption[]> = {};\n for (const [providerId, response] of [\n [\"anthropic\", anthropicRes],\n [\"openai\", openaiRes],\n ] as const) {\n if (\n response?.models &&\n Array.isArray(response.models) &&\n response.models.length > 0\n ) {\n const chatModels = response.models\n .filter((model) => model.category === \"chat\")\n .map((model) => ({\n value: model.id,\n label: model.name || model.id,\n }));\n if (chatModels.length > 0) {\n models[providerId] = chatModels;\n }\n }\n }\n setProviderModels(models);\n\n if (Array.isArray(preflightRes)) {\n const mapped: Partial<Record<AgentTab, AgentPreflightResult>> = {};\n for (const item of preflightRes) {\n const raw = item.adapter?.toLowerCase();\n const key = raw ? ADAPTER_NAME_TO_TAB[raw] : undefined;\n if (key) {\n mapped[key] = item;\n }\n }\n setPreflightByAgent(mapped);\n setPreflightLoaded(true);\n }\n } catch (err) {\n // Fall back to built-in defaults when config or model fetches fail —\n // the panel still renders with FALLBACK_MODELS so the user isn't\n // blocked. Log so a real failure isn't completely silent.\n console.warn(\n \"[coding-agents] Failed to load config/models on mount\",\n err,\n );\n }\n if (!controller.signal.aborted) setLoading(false);\n })();\n return () => controller.abort();\n }, []);\n\n // If the user previously chose \"cloud\" but Eliza Cloud has since been\n // disconnected, fall back to \"subscription\" rather than leaving the\n // selector pointed at an unusable provider.\n const rawLlmProvider = (prefs.ELIZA_LLM_PROVIDER ||\n \"subscription\") as LlmProvider;\n const llmProvider: LlmProvider =\n rawLlmProvider === \"cloud\" && !elizaCloudConnected\n ? \"subscription\"\n : rawLlmProvider;\n const isCloud = llmProvider === \"cloud\";\n\n const installedAgents = AGENT_TABS.filter(\n (agent) => preflightByAgent[agent]?.installed === true,\n );\n const providerFilteredAgents = AGENT_TABS;\n const availableAgents =\n preflightLoaded && installedAgents.length > 0\n ? installedAgents.filter((a) => providerFilteredAgents.includes(a))\n : providerFilteredAgents;\n\n const getInstallState = (\n agent: AgentTab,\n ): \"installed\" | \"missing\" | \"unknown\" => {\n if (!preflightLoaded) {\n return \"unknown\";\n }\n return preflightByAgent[agent]?.installed ? \"installed\" : \"missing\";\n };\n\n useEffect(() => {\n if (loading || availableAgents.length === 0) return;\n if (activeTab === null) {\n const saved = prefs.ELIZA_DEFAULT_AGENT_TYPE as AgentTab | undefined;\n setActiveTab(\n saved && availableAgents.includes(saved) ? saved : availableAgents[0],\n );\n } else if (!availableAgents.includes(activeTab)) {\n setActiveTab(availableAgents[0]);\n }\n }, [loading, activeTab, availableAgents, prefs.ELIZA_DEFAULT_AGENT_TYPE]);\n\n // `setPref` is a pure state updater. It must NOT perform network I/O\n // inside `setPrefs((prev) => ...)` — React may invoke state updaters\n // twice in Strict Mode, which would double every auto-save write.\n // The actual persist is handled by the debounced effect below.\n const setPref = useCallback((key: string, value: string) => {\n setPrefs((previous) => ({ ...previous, [key]: value }));\n }, []);\n\n // Debounced auto-save. Coalesces rapid keystrokes (e.g. typing an\n // API key character-by-character) into a single POST so we don't\n // persist 40+ partial-key snapshots to `eliza.json` and don't\n // leave the config in a half-written state if one request fails\n // mid-flight.\n //\n // Filter out `_`-prefixed synthetic keys that we load from non-env\n // sources (e.g. `_CLOUD_API_KEY` is loaded from `config.cloud.apiKey`)\n // — writing them back into `config.env` would leak the cloud API key\n // into the env surface, duplicating it and creating a second read\n // path that bypasses the `cloud.apiKey` contract.\n //\n // `.catch()` surfaces failed saves in an inline error banner so a\n // failed POST no longer silently drops the user's typed API key on\n // restart. (SaveFooter used to own this surface; we replaced it with\n // debounced auto-save and lost the error-feedback path until now.)\n const [autoSaveError, setAutoSaveError] = useState<string | null>(null);\n const autoSaveArmedRef = useRef(false);\n useEffect(() => {\n if (loading) return;\n if (!autoSaveArmedRef.current) {\n autoSaveArmedRef.current = true;\n return;\n }\n const envPatch: Record<string, string> = {};\n for (const [k, v] of Object.entries(prefs)) {\n if (k.startsWith(\"_\")) continue;\n if (typeof v === \"string\") {\n envPatch[k] = v;\n } else if (typeof v === \"number\" || typeof v === \"boolean\") {\n envPatch[k] = String(v);\n }\n }\n const timer = setTimeout(() => {\n client\n .updateConfig({ env: envPatch })\n .then(() => setAutoSaveError(null))\n .catch((err: unknown) => {\n setAutoSaveError(\n err instanceof Error ? err.message : \"Failed to save settings\",\n );\n });\n }, 400);\n return () => clearTimeout(timer);\n }, [prefs, loading]);\n\n const refreshPreflight = useCallback(async () => {\n try {\n const preflightRes = await fetch(\"/api/coding-agents/preflight\");\n if (!preflightRes.ok) return null;\n const results = await preflightRes.json();\n if (!Array.isArray(results)) return null;\n const mapped: Partial<Record<AgentTab, AgentPreflightResult>> = {};\n for (const item of results as AgentPreflightResult[]) {\n const raw = item.adapter?.toLowerCase();\n const key = raw ? ADAPTER_NAME_TO_TAB[raw] : undefined;\n if (key) mapped[key] = item;\n }\n setPreflightByAgent(mapped);\n return mapped;\n } catch (err) {\n console.warn(\"[coding-agents] Failed to refresh preflight\", err);\n return null;\n }\n }, []);\n\n // Ref to any in-flight auth-polling interval so we can cancel it on\n // unmount or when a new auth flow starts. Without this, closing the\n // settings panel while a poll is active leaks a network-request loop.\n const authPollRef = useRef<ReturnType<typeof setInterval> | null>(null);\n\n useEffect(() => {\n return () => {\n if (authPollRef.current !== null) {\n clearInterval(authPollRef.current);\n authPollRef.current = null;\n }\n };\n }, []);\n\n const handleAuth = useCallback(\n async (agent: AgentTab) => {\n if (authPollRef.current !== null) {\n clearInterval(authPollRef.current);\n authPollRef.current = null;\n }\n setAuthInProgress(agent);\n setAuthResult(null);\n try {\n const res = await fetch(`/api/coding-agents/auth/${agent}`, {\n method: \"POST\",\n });\n if (!res.ok) {\n setAuthResult({\n agent,\n launched: false,\n instructions: `Failed to start auth (${res.status}). Try again, or run the CLI's login command directly.`,\n });\n setAuthInProgress(null);\n return;\n }\n const data = await res.json();\n setAuthResult({ agent, ...data });\n let attempts = 0;\n const maxAttempts = 40;\n const poll = setInterval(async () => {\n attempts++;\n const mapped = await refreshPreflight();\n const authed = mapped?.[agent]?.auth?.status === \"authenticated\";\n if (authed || attempts >= maxAttempts) {\n clearInterval(poll);\n if (authPollRef.current === poll) authPollRef.current = null;\n setAuthInProgress(null);\n if (authed) setAuthResult(null);\n }\n }, 3000);\n authPollRef.current = poll;\n } catch (err) {\n setAuthResult({\n agent,\n launched: false,\n instructions:\n err instanceof Error\n ? `Auth request failed: ${err.message}`\n : \"Auth request failed. Try again, or run the CLI's login command directly.\",\n });\n setAuthInProgress(null);\n }\n },\n [refreshPreflight],\n );\n\n const getProviderId = (tab: AgentTab): string => AGENT_PROVIDER_MAP[tab];\n\n const getModelOptions = (providerId: string): ModelOption[] => {\n return providerModels[providerId] ?? FALLBACK_MODELS[providerId] ?? [];\n };\n\n if (loading || !activeTab) {\n return (\n <div className=\"py-4 text-center text-muted text-xs\">\n {t(\"codingagentsettingssection.LoadingCodingAgent\")}\n </div>\n );\n }\n\n const prefix = ENV_PREFIX[activeTab];\n const providerId = getProviderId(activeTab);\n const modelOptions = getModelOptions(providerId);\n const powerfulValue = prefs[`${prefix}_MODEL_POWERFUL`] ?? \"\";\n const fastValue = prefs[`${prefix}_MODEL_FAST`] ?? \"\";\n const isDynamic = Boolean(providerModels[providerId]);\n const selectionStrategy = (prefs.ELIZA_AGENT_SELECTION_STRATEGY ||\n \"fixed\") as AgentSelectionStrategy;\n const approvalPreset = (prefs.ELIZA_DEFAULT_APPROVAL_PRESET ||\n \"permissive\") as ApprovalPreset;\n\n if (preflightLoaded && installedAgents.length === 0) {\n return (\n <div className=\"flex flex-col gap-2 text-xs text-muted\">\n <div>{t(\"codingagentsettingssection.NoSupportedCLIs\")}</div>\n <div className=\"grid gap-2\">\n {AGENT_TABS.map((agent) => {\n const preflight = preflightByAgent[agent];\n return (\n <div\n key={agent}\n className=\"flex items-center justify-between gap-3 px-1 py-1.5\"\n >\n <div className=\"min-w-0\">\n <div className=\"font-semibold text-txt\">\n {AGENT_LABELS[agent]}\n </div>\n {preflight?.installCommand ? (\n <code className=\"inline-flex max-w-full items-center gap-1 truncate text-2xs text-muted-strong\">\n <Terminal className=\"h-3 w-3 shrink-0\" aria-hidden />\n <span className=\"truncate\">\n {preflight.installCommand}\n </span>\n </code>\n ) : null}\n </div>\n {preflight?.docsUrl ? (\n <a\n href={preflight.docsUrl}\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"inline-flex h-8 w-8 shrink-0 items-center justify-center rounded-lg text-muted hover:bg-bg-hover hover:text-txt\"\n aria-label={`${AGENT_LABELS[agent]} docs`}\n title={`${AGENT_LABELS[agent]} docs`}\n >\n <ExternalLink className=\"h-3.5 w-3.5\" aria-hidden />\n </a>\n ) : null}\n </div>\n );\n })}\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"flex flex-col gap-4\">\n {autoSaveError && (\n <div\n role=\"alert\"\n className=\"rounded-md border border-danger/30 bg-danger/10 px-3 py-2 text-xs text-danger\"\n >\n {t(\"codingagentsettingssection.AutoSaveFailed\", {\n defaultValue: \"Failed to save settings: {{error}}\",\n error: autoSaveError,\n })}\n </div>\n )}\n\n <AgentTabsSection\n activeTab={activeTab}\n availableAgents={availableAgents}\n llmProvider={llmProvider}\n preflightByAgent={preflightByAgent}\n authInProgress={authInProgress}\n authResult={authResult}\n getInstallState={getInstallState}\n onSelectAgent={(agent) => {\n setActiveTab(agent);\n setPref(\"ELIZA_DEFAULT_AGENT_TYPE\", agent);\n }}\n onAuth={handleAuth}\n />\n\n <LlmProviderSection\n llmProvider={llmProvider}\n isCloud={isCloud}\n prefs={prefs}\n setPref={setPref}\n />\n\n <ModelConfigSection\n activeTab={activeTab}\n llmProvider={llmProvider}\n isCloud={isCloud}\n prefix={prefix}\n powerfulValue={powerfulValue}\n fastValue={fastValue}\n modelOptions={modelOptions}\n isDynamic={isDynamic}\n setPref={setPref}\n />\n\n <GitHubConnectionCard />\n\n <AgentAdvancedSettingsDisclosure>\n <GlobalPrefsSection\n prefs={prefs}\n selectionStrategy={selectionStrategy}\n approvalPreset={approvalPreset}\n setPref={setPref}\n />\n </AgentAdvancedSettingsDisclosure>\n </div>\n );\n}\n"],"mappings":"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","names":["prefix","providerId"]}
@@ -0,0 +1,4 @@
1
+ export declare function CodingAgentTasksPanel(_props?: {
2
+ fullPage?: boolean;
3
+ }): import("react/jsx-runtime").JSX.Element;
4
+ //# sourceMappingURL=CodingAgentTasksPanel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CodingAgentTasksPanel.d.ts","sourceRoot":"","sources":["../src/CodingAgentTasksPanel.tsx"],"names":[],"mappings":"AAilBA,wBAAgB,qBAAqB,CAAC,MAAM,GAAE;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAO,2CA6WxE"}
@@ -0,0 +1,2 @@
1
+ export declare function interact(capability: string, params?: Record<string, unknown>): Promise<unknown>;
2
+ //# sourceMappingURL=CodingAgentTasksPanel.interact.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CodingAgentTasksPanel.interact.d.ts","sourceRoot":"","sources":["../src/CodingAgentTasksPanel.interact.ts"],"names":[],"mappings":"AAYA,wBAAsB,QAAQ,CAC5B,UAAU,EAAE,MAAM,EAClB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,OAAO,CAAC,OAAO,CAAC,CA2ClB"}
@@ -0,0 +1,46 @@
1
+ import { client } from "@elizaos/ui";
2
+ import {
3
+ ORCHESTRATOR_CAPABILITY_IDS,
4
+ runOrchestratorCapability
5
+ } from "./orchestrator-capabilities.js";
6
+ async function interact(capability, params) {
7
+ if (ORCHESTRATOR_CAPABILITY_IDS.has(capability)) {
8
+ return runOrchestratorCapability(capability, params);
9
+ }
10
+ if (capability === "list-sessions" || capability === "refresh") {
11
+ return client.getCodingAgentStatus();
12
+ }
13
+ if (capability === "list-task-threads") {
14
+ return client.listCodingAgentTaskThreads({
15
+ includeArchived: params?.includeArchived === true,
16
+ search: typeof params?.search === "string" ? params.search : void 0,
17
+ limit: typeof params?.limit === "number" ? params.limit : 30
18
+ });
19
+ }
20
+ if (capability === "open-thread") {
21
+ const threadId = typeof params?.threadId === "string" ? params.threadId.trim() : "";
22
+ if (threadId) {
23
+ return client.getCodingAgentTaskThread(threadId);
24
+ }
25
+ const [firstThread] = await client.listCodingAgentTaskThreads({
26
+ includeArchived: false,
27
+ limit: 1
28
+ });
29
+ return firstThread ? client.getCodingAgentTaskThread(firstThread.id) : null;
30
+ }
31
+ if (capability === "stop-session") {
32
+ const sessionId = typeof params?.sessionId === "string" ? params.sessionId.trim() : "";
33
+ if (!sessionId) {
34
+ return {
35
+ stopped: false,
36
+ reason: "sessionId is required to stop a coding agent session"
37
+ };
38
+ }
39
+ return client.stopCodingAgent(sessionId);
40
+ }
41
+ throw new Error(`Task Coordinator TUI does not support "${capability}".`);
42
+ }
43
+ export {
44
+ interact
45
+ };
46
+ //# sourceMappingURL=CodingAgentTasksPanel.interact.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/CodingAgentTasksPanel.interact.ts"],"sourcesContent":["// View-bundle `interact` capability handler, split out of\n// CodingAgentTasksPanel.tsx so that file exports only React components and\n// stays Fast-Refresh-compatible (Vite would full-reload a component file that\n// also exports a plain function). The view bundle re-exports `interact` via\n// ./task-coordinator-view-bundle.ts. Orchestrator capabilities are delegated to\n// runOrchestratorCapability; the remaining ids drive the task-coordinator view.\nimport { client } from \"@elizaos/ui\";\nimport {\n ORCHESTRATOR_CAPABILITY_IDS,\n runOrchestratorCapability,\n} from \"./orchestrator-capabilities.js\";\n\nexport async function interact(\n capability: string,\n params?: Record<string, unknown>,\n): Promise<unknown> {\n if (ORCHESTRATOR_CAPABILITY_IDS.has(capability)) {\n return runOrchestratorCapability(capability, params);\n }\n\n if (capability === \"list-sessions\" || capability === \"refresh\") {\n return client.getCodingAgentStatus();\n }\n\n if (capability === \"list-task-threads\") {\n return client.listCodingAgentTaskThreads({\n includeArchived: params?.includeArchived === true,\n search: typeof params?.search === \"string\" ? params.search : undefined,\n limit: typeof params?.limit === \"number\" ? params.limit : 30,\n });\n }\n\n if (capability === \"open-thread\") {\n const threadId =\n typeof params?.threadId === \"string\" ? params.threadId.trim() : \"\";\n if (threadId) {\n return client.getCodingAgentTaskThread(threadId);\n }\n const [firstThread] = await client.listCodingAgentTaskThreads({\n includeArchived: false,\n limit: 1,\n });\n return firstThread ? client.getCodingAgentTaskThread(firstThread.id) : null;\n }\n\n if (capability === \"stop-session\") {\n const sessionId =\n typeof params?.sessionId === \"string\" ? params.sessionId.trim() : \"\";\n if (!sessionId) {\n return {\n stopped: false,\n reason: \"sessionId is required to stop a coding agent session\",\n };\n }\n return client.stopCodingAgent(sessionId);\n }\n\n throw new Error(`Task Coordinator TUI does not support \"${capability}\".`);\n}\n"],"mappings":"AAMA,SAAS,cAAc;AACvB;AAAA,EACE;AAAA,EACA;AAAA,OACK;AAEP,eAAsB,SACpB,YACA,QACkB;AAClB,MAAI,4BAA4B,IAAI,UAAU,GAAG;AAC/C,WAAO,0BAA0B,YAAY,MAAM;AAAA,EACrD;AAEA,MAAI,eAAe,mBAAmB,eAAe,WAAW;AAC9D,WAAO,OAAO,qBAAqB;AAAA,EACrC;AAEA,MAAI,eAAe,qBAAqB;AACtC,WAAO,OAAO,2BAA2B;AAAA,MACvC,iBAAiB,QAAQ,oBAAoB;AAAA,MAC7C,QAAQ,OAAO,QAAQ,WAAW,WAAW,OAAO,SAAS;AAAA,MAC7D,OAAO,OAAO,QAAQ,UAAU,WAAW,OAAO,QAAQ;AAAA,IAC5D,CAAC;AAAA,EACH;AAEA,MAAI,eAAe,eAAe;AAChC,UAAM,WACJ,OAAO,QAAQ,aAAa,WAAW,OAAO,SAAS,KAAK,IAAI;AAClE,QAAI,UAAU;AACZ,aAAO,OAAO,yBAAyB,QAAQ;AAAA,IACjD;AACA,UAAM,CAAC,WAAW,IAAI,MAAM,OAAO,2BAA2B;AAAA,MAC5D,iBAAiB;AAAA,MACjB,OAAO;AAAA,IACT,CAAC;AACD,WAAO,cAAc,OAAO,yBAAyB,YAAY,EAAE,IAAI;AAAA,EACzE;AAEA,MAAI,eAAe,gBAAgB;AACjC,UAAM,YACJ,OAAO,QAAQ,cAAc,WAAW,OAAO,UAAU,KAAK,IAAI;AACpE,QAAI,CAAC,WAAW;AACd,aAAO;AAAA,QACL,SAAS;AAAA,QACT,QAAQ;AAAA,MACV;AAAA,IACF;AACA,WAAO,OAAO,gBAAgB,SAAS;AAAA,EACzC;AAEA,QAAM,IAAI,MAAM,0CAA0C,UAAU,IAAI;AAC1E;","names":[]}