@agiflowai/agent-cli 0.2.8 → 0.2.10
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/CHANGELOG.md +9 -1
- package/dist/claudeNotification.js +1 -1
- package/dist/claudePermissionRequest.js +1 -1
- package/dist/claudePostToolUse.js +1 -1
- package/dist/claudePreToolUse.js +1 -1
- package/dist/claudeSessionEnd.js +1 -1
- package/dist/claudeSessionStart.js +1 -1
- package/dist/claudeStop.js +1 -1
- package/dist/cli.js +1 -1
- package/dist/daemon.js +21 -21
- package/dist/daemon.js.map +1 -1
- package/dist/{index-B_WqaHDe.mjs → index-4NpVf50m.mjs} +5258 -5132
- package/dist/index-4NpVf50m.mjs.map +1 -0
- package/dist/index-BXH_tUXE.mjs +62 -0
- package/dist/index-BXH_tUXE.mjs.map +1 -0
- package/dist/{index-C3DrOR0R.mjs → index-CW0Nc5eK.mjs} +2 -2
- package/dist/index-CW0Nc5eK.mjs.map +1 -0
- package/dist/index.js +2 -2
- package/dist/package.json +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +17 -4
- package/dist/index-B_WqaHDe.mjs.map +0 -1
- package/dist/index-BoyNKd-d.mjs +0 -61
- package/dist/index-BoyNKd-d.mjs.map +0 -1
- package/dist/index-C3DrOR0R.mjs.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -12491,7 +12491,7 @@ let er = class {
|
|
|
12491
12491
|
this.runtimeConfig = vh.parse(e), this.appConfig = ph.parse({
|
|
12492
12492
|
VITE_INJECT_AGIFLOW_APP_ENDPOINT: "https://agiflow.io",
|
|
12493
12493
|
VITE_INJECT_AGIFLOW_APP_DOCKER_ENDPOINT: "https://agiflow.io",
|
|
12494
|
-
VITE_AGENT_CLI_DOCKER_IMAGE: "agiflowai/agent-cli:v0.2.
|
|
12494
|
+
VITE_AGENT_CLI_DOCKER_IMAGE: "agiflowai/agent-cli:v0.2.8",
|
|
12495
12495
|
VITE_AGENT_CLI_DOCKER_NETWORK: "",
|
|
12496
12496
|
VITE_SAVE_RAW: "",
|
|
12497
12497
|
VITE_MULTIPLEX_SOCKET_PATH: process.env.VITE_MULTIPLEX_SOCKET_PATH
|
|
@@ -12490,7 +12490,7 @@ let er = class {
|
|
|
12490
12490
|
this.runtimeConfig = ph.parse(e), this.appConfig = hh.parse({
|
|
12491
12491
|
VITE_INJECT_AGIFLOW_APP_ENDPOINT: "https://agiflow.io",
|
|
12492
12492
|
VITE_INJECT_AGIFLOW_APP_DOCKER_ENDPOINT: "https://agiflow.io",
|
|
12493
|
-
VITE_AGENT_CLI_DOCKER_IMAGE: "agiflowai/agent-cli:v0.2.
|
|
12493
|
+
VITE_AGENT_CLI_DOCKER_IMAGE: "agiflowai/agent-cli:v0.2.8",
|
|
12494
12494
|
VITE_AGENT_CLI_DOCKER_NETWORK: "",
|
|
12495
12495
|
VITE_SAVE_RAW: "",
|
|
12496
12496
|
VITE_MULTIPLEX_SOCKET_PATH: process.env.VITE_MULTIPLEX_SOCKET_PATH
|
|
@@ -12482,7 +12482,7 @@ let er = class {
|
|
|
12482
12482
|
this.runtimeConfig = vh.parse(e), this.appConfig = ph.parse({
|
|
12483
12483
|
VITE_INJECT_AGIFLOW_APP_ENDPOINT: "https://agiflow.io",
|
|
12484
12484
|
VITE_INJECT_AGIFLOW_APP_DOCKER_ENDPOINT: "https://agiflow.io",
|
|
12485
|
-
VITE_AGENT_CLI_DOCKER_IMAGE: "agiflowai/agent-cli:v0.2.
|
|
12485
|
+
VITE_AGENT_CLI_DOCKER_IMAGE: "agiflowai/agent-cli:v0.2.8",
|
|
12486
12486
|
VITE_AGENT_CLI_DOCKER_NETWORK: "",
|
|
12487
12487
|
VITE_SAVE_RAW: "",
|
|
12488
12488
|
VITE_MULTIPLEX_SOCKET_PATH: process.env.VITE_MULTIPLEX_SOCKET_PATH
|
package/dist/claudePreToolUse.js
CHANGED
|
@@ -12410,7 +12410,7 @@ let Kn = class {
|
|
|
12410
12410
|
this.runtimeConfig = dh.parse(e), this.appConfig = fh.parse({
|
|
12411
12411
|
VITE_INJECT_AGIFLOW_APP_ENDPOINT: "https://agiflow.io",
|
|
12412
12412
|
VITE_INJECT_AGIFLOW_APP_DOCKER_ENDPOINT: "https://agiflow.io",
|
|
12413
|
-
VITE_AGENT_CLI_DOCKER_IMAGE: "agiflowai/agent-cli:v0.2.
|
|
12413
|
+
VITE_AGENT_CLI_DOCKER_IMAGE: "agiflowai/agent-cli:v0.2.8",
|
|
12414
12414
|
VITE_AGENT_CLI_DOCKER_NETWORK: "",
|
|
12415
12415
|
VITE_SAVE_RAW: "",
|
|
12416
12416
|
VITE_MULTIPLEX_SOCKET_PATH: process.env.VITE_MULTIPLEX_SOCKET_PATH
|
package/dist/claudeSessionEnd.js
CHANGED
|
@@ -12410,7 +12410,7 @@ let Wn = class {
|
|
|
12410
12410
|
this.runtimeConfig = ch.parse(e), this.appConfig = lh.parse({
|
|
12411
12411
|
VITE_INJECT_AGIFLOW_APP_ENDPOINT: "https://agiflow.io",
|
|
12412
12412
|
VITE_INJECT_AGIFLOW_APP_DOCKER_ENDPOINT: "https://agiflow.io",
|
|
12413
|
-
VITE_AGENT_CLI_DOCKER_IMAGE: "agiflowai/agent-cli:v0.2.
|
|
12413
|
+
VITE_AGENT_CLI_DOCKER_IMAGE: "agiflowai/agent-cli:v0.2.8",
|
|
12414
12414
|
VITE_AGENT_CLI_DOCKER_NETWORK: "",
|
|
12415
12415
|
VITE_SAVE_RAW: "",
|
|
12416
12416
|
VITE_MULTIPLEX_SOCKET_PATH: process.env.VITE_MULTIPLEX_SOCKET_PATH
|
|
@@ -12490,7 +12490,7 @@ let er = class {
|
|
|
12490
12490
|
this.runtimeConfig = ph.parse(e), this.appConfig = hh.parse({
|
|
12491
12491
|
VITE_INJECT_AGIFLOW_APP_ENDPOINT: "https://agiflow.io",
|
|
12492
12492
|
VITE_INJECT_AGIFLOW_APP_DOCKER_ENDPOINT: "https://agiflow.io",
|
|
12493
|
-
VITE_AGENT_CLI_DOCKER_IMAGE: "agiflowai/agent-cli:v0.2.
|
|
12493
|
+
VITE_AGENT_CLI_DOCKER_IMAGE: "agiflowai/agent-cli:v0.2.8",
|
|
12494
12494
|
VITE_AGENT_CLI_DOCKER_NETWORK: "",
|
|
12495
12495
|
VITE_SAVE_RAW: "",
|
|
12496
12496
|
VITE_MULTIPLEX_SOCKET_PATH: process.env.VITE_MULTIPLEX_SOCKET_PATH
|
package/dist/claudeStop.js
CHANGED
|
@@ -12484,7 +12484,7 @@ let er = class {
|
|
|
12484
12484
|
this.runtimeConfig = fh.parse(e), this.appConfig = mh.parse({
|
|
12485
12485
|
VITE_INJECT_AGIFLOW_APP_ENDPOINT: "https://agiflow.io",
|
|
12486
12486
|
VITE_INJECT_AGIFLOW_APP_DOCKER_ENDPOINT: "https://agiflow.io",
|
|
12487
|
-
VITE_AGENT_CLI_DOCKER_IMAGE: "agiflowai/agent-cli:v0.2.
|
|
12487
|
+
VITE_AGENT_CLI_DOCKER_IMAGE: "agiflowai/agent-cli:v0.2.8",
|
|
12488
12488
|
VITE_AGENT_CLI_DOCKER_NETWORK: "",
|
|
12489
12489
|
VITE_SAVE_RAW: "",
|
|
12490
12490
|
VITE_MULTIPLEX_SOCKET_PATH: process.env.VITE_MULTIPLEX_SOCKET_PATH
|
package/dist/cli.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import {
|
|
2
|
+
import { bx as z, bn as H, by as P, bo as M } from "./index-4NpVf50m.mjs";
|
|
3
3
|
import Q from "node:events";
|
|
4
4
|
import X from "node:child_process";
|
|
5
5
|
import Z from "node:path";
|
package/dist/daemon.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { jsx as e, jsxs as i, Fragment as F } from "react/jsx-runtime";
|
|
2
|
-
import {
|
|
2
|
+
import { bj as f, bk as V, bl as Y, bm as $, bn as S, bo as D, bp as X, bq as H, br as J, bs as Z, bt as ee, bu as re, bv as ne, bw as oe } from "./index-4NpVf50m.mjs";
|
|
3
3
|
import { useQueryClient as ie, useQuery as te, useMutation as M, QueryClientProvider as ce, QueryClient as le } from "@tanstack/react-query";
|
|
4
4
|
import { useDispatch as de, useSelector as u, shallowEqual as ae, Provider as se } from "react-redux";
|
|
5
5
|
import P, { useRef as L, useEffect as _, useState as C, useCallback as ue, useMemo as he } from "react";
|
|
6
6
|
const ge = ({ children: t }) => {
|
|
7
|
-
const { Box: n, Text: r } =
|
|
7
|
+
const { Box: n, Text: r } = f(), c = de(), d = u((h) => h.daemonStatus.status), l = u((h) => h.daemonStatus.error), s = L(!1);
|
|
8
8
|
return _(() => (c(V()), Y(async () => {
|
|
9
9
|
if (!s.current) {
|
|
10
10
|
s.current = !0;
|
|
@@ -22,7 +22,7 @@ const ge = ({ children: t }) => {
|
|
|
22
22
|
/* @__PURE__ */ e(r, { dimColor: !0, children: "Retrying in background..." })
|
|
23
23
|
] }) : d === "connected" ? /* @__PURE__ */ e(F, { children: t }) : null;
|
|
24
24
|
}, me = ({ children: t }) => {
|
|
25
|
-
const { Box: n, Text: r, Newline: c, Static: d, Link: l, useInput: s } =
|
|
25
|
+
const { Box: n, Text: r, Newline: c, Static: d, Link: l, useInput: s } = f(), h = ie(), [g, G] = C(null), [k, N] = C(null), [y, Q] = C([]), [p, O] = C(0), [b, m] = C("checking"), [j, w] = C(""), I = L(null), x = S.get(D.DeviceCodeAuthService), q = S.get(D.CredentialsService), { data: A, isLoading: B } = te({
|
|
26
26
|
queryKey: ["auth", "check"],
|
|
27
27
|
queryFn: async () => {
|
|
28
28
|
const o = await q.load();
|
|
@@ -35,7 +35,7 @@ const ge = ({ children: t }) => {
|
|
|
35
35
|
G(o), m("polling"), E.mutate(o);
|
|
36
36
|
},
|
|
37
37
|
onError: (o) => {
|
|
38
|
-
m("error"),
|
|
38
|
+
m("error"), w(o instanceof Error ? o.message : "Failed to request device code");
|
|
39
39
|
}
|
|
40
40
|
}), E = M({
|
|
41
41
|
mutationFn: async (o) => {
|
|
@@ -46,10 +46,10 @@ const ge = ({ children: t }) => {
|
|
|
46
46
|
return { accessToken: a.access_token, organizations: T };
|
|
47
47
|
},
|
|
48
48
|
onSuccess: (o) => {
|
|
49
|
-
N(o.accessToken), Q(o.organizations), o.organizations.length === 0 ? (m("error"),
|
|
49
|
+
N(o.accessToken), Q(o.organizations), o.organizations.length === 0 ? (m("error"), w("You have no organizations. Please create one first.")) : o.organizations.length === 1 ? z.mutate({ accessToken: o.accessToken, organizationId: o.organizations[0].id }) : m("selecting_org");
|
|
50
50
|
},
|
|
51
51
|
onError: (o) => {
|
|
52
|
-
m("error"),
|
|
52
|
+
m("error"), w(o instanceof Error ? o.message : "Failed to poll for token");
|
|
53
53
|
}
|
|
54
54
|
}), z = M({
|
|
55
55
|
mutationFn: async ({ accessToken: o, organizationId: a }) => (m("exchanging"), x.exchangeForAgentApiKey(o, a)),
|
|
@@ -62,7 +62,7 @@ const ge = ({ children: t }) => {
|
|
|
62
62
|
}), m("authenticated"), h.invalidateQueries({ queryKey: ["auth", "check"] });
|
|
63
63
|
},
|
|
64
64
|
onError: (o) => {
|
|
65
|
-
m("error"),
|
|
65
|
+
m("error"), w(o instanceof Error ? o.message : "Failed to exchange for agent API key");
|
|
66
66
|
}
|
|
67
67
|
}), K = ue(() => {
|
|
68
68
|
k && y[p] && z.mutate({
|
|
@@ -72,14 +72,14 @@ const ge = ({ children: t }) => {
|
|
|
72
72
|
}, [k, y, p, z]);
|
|
73
73
|
if (s(
|
|
74
74
|
(o, a) => {
|
|
75
|
-
|
|
75
|
+
b === "selecting_org" && (a.upArrow ? O((T) => Math.max(0, T - 1)) : a.downArrow ? O((T) => Math.min(y.length - 1, T + 1)) : a.return && K());
|
|
76
76
|
},
|
|
77
|
-
{ isActive:
|
|
77
|
+
{ isActive: b === "selecting_org" }
|
|
78
78
|
), _(() => () => {
|
|
79
79
|
I.current?.abort();
|
|
80
80
|
}, []), _(() => {
|
|
81
|
-
|
|
82
|
-
}, [
|
|
81
|
+
A && !A.authenticated && b === "checking" && !B && v.mutate();
|
|
82
|
+
}, [A, b, B, v]), A?.authenticated)
|
|
83
83
|
return /* @__PURE__ */ e(F, { children: t({ isAuthenticated: !0 }) });
|
|
84
84
|
if (B)
|
|
85
85
|
return /* @__PURE__ */ i(n, { flexDirection: "column", padding: 1, children: [
|
|
@@ -103,7 +103,7 @@ const ge = ({ children: t }) => {
|
|
|
103
103
|
] })
|
|
104
104
|
] }) })
|
|
105
105
|
] });
|
|
106
|
-
if (g) {
|
|
106
|
+
if (g && b === "polling") {
|
|
107
107
|
const o = `${g.verification_uri}?code=${encodeURIComponent(g.user_code)}`;
|
|
108
108
|
return /* @__PURE__ */ e(d, { items: [1], children: () => /* @__PURE__ */ i(n, { flexDirection: "column", padding: 1, children: [
|
|
109
109
|
/* @__PURE__ */ e(n, { marginBottom: 1, children: /* @__PURE__ */ e(r, { bold: !0, color: "cyan", children: "🔐 Agiflow Authentication" }) }),
|
|
@@ -160,7 +160,7 @@ const ge = ({ children: t }) => {
|
|
|
160
160
|
] }) })
|
|
161
161
|
] }) });
|
|
162
162
|
}
|
|
163
|
-
if (
|
|
163
|
+
if (b === "selecting_org")
|
|
164
164
|
return /* @__PURE__ */ i(n, { flexDirection: "column", padding: 1, children: [
|
|
165
165
|
/* @__PURE__ */ e(n, { marginBottom: 1, children: /* @__PURE__ */ e(r, { bold: !0, color: "cyan", children: "🔐 Agiflow Authentication" }) }),
|
|
166
166
|
/* @__PURE__ */ e(n, { borderStyle: "round", borderColor: "green", padding: 1, marginBottom: 1, children: /* @__PURE__ */ i(n, { flexDirection: "column", children: [
|
|
@@ -189,7 +189,7 @@ const ge = ({ children: t }) => {
|
|
|
189
189
|
/* @__PURE__ */ e(r, { dimColor: !0, children: "Use ↑/↓ arrows to navigate, Enter to select" })
|
|
190
190
|
] }) })
|
|
191
191
|
] });
|
|
192
|
-
if (
|
|
192
|
+
if (b === "exchanging")
|
|
193
193
|
return /* @__PURE__ */ i(n, { flexDirection: "column", padding: 1, children: [
|
|
194
194
|
/* @__PURE__ */ e(n, { marginBottom: 1, children: /* @__PURE__ */ e(r, { bold: !0, color: "cyan", children: "🔐 Agiflow Authentication" }) }),
|
|
195
195
|
/* @__PURE__ */ e(n, { borderStyle: "round", borderColor: "cyan", padding: 1, children: /* @__PURE__ */ i(n, { flexDirection: "column", children: [
|
|
@@ -207,7 +207,7 @@ const ge = ({ children: t }) => {
|
|
|
207
207
|
] })
|
|
208
208
|
] }) })
|
|
209
209
|
] });
|
|
210
|
-
if (
|
|
210
|
+
if (b === "error" || v.isError || E.isError) {
|
|
211
211
|
const o = v.error || E.error, a = j || o?.message || "Unknown error occurred";
|
|
212
212
|
return /* @__PURE__ */ i(n, { flexDirection: "column", padding: 1, children: [
|
|
213
213
|
/* @__PURE__ */ e(n, { marginBottom: 1, children: /* @__PURE__ */ e(r, { bold: !0, color: "red", children: "❌ Authentication Error" }) }),
|
|
@@ -234,14 +234,14 @@ const ge = ({ children: t }) => {
|
|
|
234
234
|
});
|
|
235
235
|
U.displayName = "UnreadCount";
|
|
236
236
|
const R = P.memo(({ tabId: t }) => {
|
|
237
|
-
const { Text: n } =
|
|
237
|
+
const { Text: n } = f(), r = u(
|
|
238
238
|
(d) => d.agentTabs.tabs.find((l) => l.id === t)?.waitingInput
|
|
239
239
|
), c = u((d) => d.agentTabs.activeTabId === t);
|
|
240
240
|
return !r || c ? null : /* @__PURE__ */ e(n, { color: "red", children: "● " });
|
|
241
241
|
});
|
|
242
242
|
R.displayName = "WaitingInputIndicator";
|
|
243
243
|
const W = P.memo(({ tabId: t, index: n }) => {
|
|
244
|
-
const { Box: r, Text: c } =
|
|
244
|
+
const { Box: r, Text: c } = f(), d = u((h) => h.agentTabs.tabs.find((g) => g.id === t)?.label), l = u((h) => h.agentTabs.activeTabId === t), s = `^F${n + 1}`;
|
|
245
245
|
return /* @__PURE__ */ i(r, { marginRight: 2, borderStyle: l ? "round" : void 0, children: [
|
|
246
246
|
/* @__PURE__ */ e(R, { tabId: t }),
|
|
247
247
|
/* @__PURE__ */ i(c, { color: "#d1d5db", bold: l, dimColor: !l, children: [
|
|
@@ -256,7 +256,7 @@ const W = P.memo(({ tabId: t, index: n }) => {
|
|
|
256
256
|
});
|
|
257
257
|
W.displayName = "TabItem";
|
|
258
258
|
const fe = () => {
|
|
259
|
-
const { Box: t, Text: n } =
|
|
259
|
+
const { Box: t, Text: n } = f(), r = u((l) => l.agentTabs.tabs.map((s) => s.id), ae), c = u((l) => l.agentTabs.activeTabId), d = he(() => {
|
|
260
260
|
if (!c) return null;
|
|
261
261
|
try {
|
|
262
262
|
const s = S.get(D.AgentManager).getAgentContainer(c);
|
|
@@ -272,14 +272,14 @@ const fe = () => {
|
|
|
272
272
|
be && /* @__PURE__ */ e(n, { dimColor: !0, children: "Press fn + Shift + F[num] to switch tabs" })
|
|
273
273
|
] });
|
|
274
274
|
}, pe = () => {
|
|
275
|
-
const { Box: t } =
|
|
275
|
+
const { Box: t } = f(), n = u((r) => r.agentTabs.activeTabId);
|
|
276
276
|
return /* @__PURE__ */ i(t, { flexDirection: "column", flexGrow: 1, children: [
|
|
277
277
|
/* @__PURE__ */ e(J, { children: /* @__PURE__ */ e(Z, {}, n) }),
|
|
278
278
|
/* @__PURE__ */ e(ee, { children: /* @__PURE__ */ e(fe, {}) }),
|
|
279
279
|
/* @__PURE__ */ e(re, {})
|
|
280
280
|
] });
|
|
281
281
|
}, Ce = () => {
|
|
282
|
-
const { Box: t, Text: n } =
|
|
282
|
+
const { Box: t, Text: n } = f();
|
|
283
283
|
return /* @__PURE__ */ i(t, { flexDirection: "column", borderStyle: "round", borderColor: "green", padding: 1, flexGrow: 1, children: [
|
|
284
284
|
/* @__PURE__ */ e(n, { bold: !0, color: "green", children: "Welcome to Agent CLI Daemon!" }),
|
|
285
285
|
/* @__PURE__ */ e(t, { marginTop: 1, children: /* @__PURE__ */ e(n, { children: "It looks like you don't have any active agent sessions." }) }),
|
|
@@ -310,7 +310,7 @@ const fe = () => {
|
|
|
310
310
|
}
|
|
311
311
|
}
|
|
312
312
|
}), xe = () => {
|
|
313
|
-
const { Box: t } =
|
|
313
|
+
const { Box: t } = f(), r = u((c) => c.agentTabs.tabs).length > 0;
|
|
314
314
|
return /* @__PURE__ */ e(me, { children: ({ isAuthenticated: c }) => /* @__PURE__ */ e(ge, { children: /* @__PURE__ */ e(t, { flexGrow: 1, flexDirection: "column", children: c && !r ? /* @__PURE__ */ e(Ce, {}) : /* @__PURE__ */ e(pe, {}) }) }) });
|
|
315
315
|
}, ve = () => /* @__PURE__ */ e(ne, { children: /* @__PURE__ */ e(se, { store: oe, children: /* @__PURE__ */ e(ce, { client: ye, children: /* @__PURE__ */ e(xe, {}) }) }) }), ke = async () => {
|
|
316
316
|
const { render: t } = await import("ink"), { waitUntilExit: n } = t(/* @__PURE__ */ e(ve, {}), {
|
package/dist/daemon.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"daemon.js","sources":["../src/systems/cli/apps/daemon/components/DaemonConnectionManager.tsx","../src/systems/cli/apps/daemon/guards/OauthSetup.tsx","../src/systems/cli/apps/daemon/components/AgentTabs.tsx","../src/systems/cli/apps/daemon/screens/Agents/index.tsx","../src/systems/cli/apps/daemon/screens/Onboarding/index.tsx","../src/systems/cli/apps/daemon/index.tsx"],"sourcesContent":["import { cliContainer } from '@cli/container';\nimport React, { useEffect, useRef } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport type { DaemonManager } from '@/services';\nimport type { AppDispatch } from '@/store';\nimport { RootState } from '@/store';\nimport { launchDaemon } from '@/store/slices/daemonStatusSlice';\nimport { GLOBAL_TYPES } from '@/types';\nimport { useInk } from '../../../contexts/InkContext';\nimport { clearShutdownCallback, setShutdownCallback } from '../../../services/StdinManager';\n\ninterface DaemonConnectionManagerProps {\n children: React.ReactNode;\n}\n\nexport const DaemonConnectionManager: React.FC<DaemonConnectionManagerProps> = ({ children }) => {\n const { Box, Text } = useInk();\n const dispatch = useDispatch<AppDispatch>();\n const status = useSelector((state: RootState) => state.daemonStatus.status);\n const error = useSelector((state: RootState) => state.daemonStatus.error);\n const isShuttingDown = useRef(false);\n\n useEffect(() => {\n dispatch(launchDaemon());\n\n // Register shutdown callback for Ctrl+C handling\n const handleShutdown = async () => {\n if (isShuttingDown.current) return;\n isShuttingDown.current = true;\n\n try {\n const daemonManager = cliContainer.get<DaemonManager>(GLOBAL_TYPES.DaemonManager);\n if (daemonManager.isRunning()) {\n await daemonManager.stop();\n }\n } catch {\n // Ignore errors during shutdown\n }\n // daemonManager.stop() calls process.exit() at the end\n };\n\n setShutdownCallback(handleShutdown);\n\n return () => {\n clearShutdownCallback();\n };\n }, [dispatch]);\n\n if (status === 'starting') {\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Text color=\"yellow\">Connecting to Agiflow...</Text>\n </Box>\n );\n }\n\n if (status === 'error') {\n return (\n <Box flexDirection=\"column\" padding={1} borderStyle=\"round\" borderColor=\"red\">\n <Text color=\"red\" bold>\n Connection Error\n </Text>\n <Text>{error}</Text>\n <Text dimColor>Retrying in background...</Text>\n </Box>\n );\n }\n\n if (status === 'connected') {\n return <>{children}</>;\n }\n\n return null;\n};\n","import { cliContainer } from '@cli/container';\nimport { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';\nimport React, { useCallback, useEffect, useRef, useState } from 'react';\nimport { CredentialsService, DeviceCodeAuthService, type DeviceCodeResponse, type OrganizationInfo } from '@/services';\nimport { GLOBAL_TYPES } from '@/types';\nimport { useInk } from '../../../contexts/InkContext';\n\ninterface OauthSetupProps {\n children: (props: { isAuthenticated: boolean }) => React.ReactNode;\n}\n\ntype AuthStatus =\n | 'checking'\n | 'requesting_code'\n | 'polling'\n | 'selecting_org'\n | 'exchanging'\n | 'authenticated'\n | 'error';\n\nexport const OauthSetup: React.FC<OauthSetupProps> = ({ children }) => {\n const { Box, Text, Newline, Static, Link, useInput } = useInk();\n const queryClient = useQueryClient();\n const [deviceCode, setDeviceCode] = useState<DeviceCodeResponse | null>(null);\n const [accessToken, setAccessToken] = useState<string | null>(null);\n const [organizations, setOrganizations] = useState<OrganizationInfo[]>([]);\n const [selectedOrgIndex, setSelectedOrgIndex] = useState(0);\n const [status, setStatus] = useState<AuthStatus>('checking');\n const [errorMessage, setErrorMessage] = useState<string>('');\n const abortControllerRef = useRef<AbortController | null>(null);\n\n // Get services from DI container\n const authService = cliContainer.get<DeviceCodeAuthService>(GLOBAL_TYPES.DeviceCodeAuthService);\n const credentialsService = cliContainer.get<CredentialsService>(GLOBAL_TYPES.CredentialsService);\n\n // Check existing authentication\n const { data: existingAuth, isLoading: isCheckingAuth } = useQuery({\n queryKey: ['auth', 'check'],\n queryFn: async () => {\n const creds = await credentialsService.load();\n if (creds && creds.apiKey && creds.expiresAt && authService.isTokenValid(creds.expiresAt)) {\n return { authenticated: true };\n }\n return { authenticated: false };\n },\n retry: false,\n });\n\n // Request device code\n const deviceCodeMutation = useMutation({\n mutationFn: async () => {\n setStatus('requesting_code');\n return authService.requestDeviceCode('openid profile email');\n },\n onSuccess: (data) => {\n setDeviceCode(data);\n setStatus('polling');\n pollTokenMutation.mutate(data);\n },\n onError: (error) => {\n setStatus('error');\n setErrorMessage(error instanceof Error ? error.message : 'Failed to request device code');\n },\n });\n\n // Poll for token - now just gets token and organizations, doesn't exchange yet\n const pollTokenMutation = useMutation({\n mutationFn: async (codeResponse: DeviceCodeResponse) => {\n abortControllerRef.current = new AbortController();\n\n // Poll for the access token\n const tokenResponse = await authService.pollForToken(codeResponse.device_code, codeResponse.interval || 5, {\n signal: abortControllerRef.current.signal,\n });\n\n // Get user's organizations\n const orgs = await authService.listOrganizations(tokenResponse.access_token);\n\n return { accessToken: tokenResponse.access_token, organizations: orgs };\n },\n onSuccess: (data) => {\n setAccessToken(data.accessToken);\n setOrganizations(data.organizations);\n\n if (data.organizations.length === 0) {\n setStatus('error');\n setErrorMessage('You have no organizations. Please create one first.');\n } else if (data.organizations.length === 1) {\n // Auto-select single org\n exchangeForAgentMutation.mutate({ accessToken: data.accessToken, organizationId: data.organizations[0].id });\n } else {\n // Show organization selection\n setStatus('selecting_org');\n }\n },\n onError: (error) => {\n setStatus('error');\n setErrorMessage(error instanceof Error ? error.message : 'Failed to poll for token');\n },\n });\n\n // Exchange token for agent API key\n const exchangeForAgentMutation = useMutation({\n mutationFn: async ({ accessToken, organizationId }: { accessToken: string; organizationId: string }) => {\n setStatus('exchanging');\n return authService.exchangeForAgentApiKey(accessToken, organizationId);\n },\n onSuccess: async (apiKeyToken) => {\n // Save to credentials.json\n await credentialsService.setApiKey({\n apiKey: apiKeyToken.api_key,\n organizationId: apiKeyToken.organization_id,\n expiresAt: apiKeyToken.expires_at,\n deviceId: apiKeyToken.device_id,\n });\n\n setStatus('authenticated');\n queryClient.invalidateQueries({ queryKey: ['auth', 'check'] });\n },\n onError: (error) => {\n setStatus('error');\n setErrorMessage(error instanceof Error ? error.message : 'Failed to exchange for agent API key');\n },\n });\n\n // Handle organization selection input\n const handleSelectOrg = useCallback(() => {\n if (accessToken && organizations[selectedOrgIndex]) {\n exchangeForAgentMutation.mutate({\n accessToken,\n organizationId: organizations[selectedOrgIndex].id,\n });\n }\n }, [accessToken, organizations, selectedOrgIndex, exchangeForAgentMutation]);\n\n // Keyboard input for organization selection\n useInput(\n (_input, key) => {\n if (status !== 'selecting_org') return;\n\n if (key.upArrow) {\n setSelectedOrgIndex((prev) => Math.max(0, prev - 1));\n } else if (key.downArrow) {\n setSelectedOrgIndex((prev) => Math.min(organizations.length - 1, prev + 1));\n } else if (key.return) {\n handleSelectOrg();\n }\n },\n { isActive: status === 'selecting_org' },\n );\n\n // Cleanup abort controller on unmount\n useEffect(() => {\n return () => {\n abortControllerRef.current?.abort();\n };\n }, []);\n\n // Trigger device code request when not authenticated\n useEffect(() => {\n if (existingAuth && !existingAuth.authenticated && status === 'checking' && !isCheckingAuth) {\n deviceCodeMutation.mutate();\n }\n }, [existingAuth, status, isCheckingAuth, deviceCodeMutation]);\n\n // Authenticated - render children\n if (existingAuth?.authenticated) {\n return <>{children({ isAuthenticated: true })}</>;\n }\n\n // Checking authentication\n if (isCheckingAuth) {\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">\n 🔐 Agiflow Authentication\n </Text>\n </Box>\n <Box borderStyle=\"round\" borderColor=\"cyan\" padding={1}>\n <Box flexDirection=\"column\">\n <Text>\n <Text color=\"cyan\">◉ </Text>\n <Text>Checking existing credentials...</Text>\n </Text>\n </Box>\n </Box>\n </Box>\n );\n }\n\n // Requesting device code\n if (deviceCodeMutation.isPending) {\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">\n 🔐 Agiflow Authentication\n </Text>\n </Box>\n <Box borderStyle=\"round\" borderColor=\"cyan\" padding={1}>\n <Box flexDirection=\"column\">\n <Text>\n <Text color=\"green\">✓ </Text>\n <Text dimColor>Checked existing credentials</Text>\n </Text>\n <Text>\n <Text color=\"cyan\">◉ </Text>\n <Text>Requesting device authorization...</Text>\n </Text>\n </Box>\n </Box>\n </Box>\n );\n }\n\n // Show authentication instructions with automatic polling\n if (deviceCode) {\n const verificationUrl = `${deviceCode.verification_uri}?code=${encodeURIComponent(deviceCode.user_code)}`;\n\n return (\n <Static items={[1]}>\n {() => (\n <Box flexDirection=\"column\" padding={1}>\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">\n 🔐 Agiflow Authentication\n </Text>\n </Box>\n\n <Box borderStyle=\"round\" borderColor=\"green\" padding={1} marginBottom={1}>\n <Box flexDirection=\"column\">\n <Text>\n <Text color=\"green\">✓ </Text>\n <Text dimColor>Checked existing credentials</Text>\n </Text>\n <Text>\n <Text color=\"green\">✓ </Text>\n <Text dimColor>Device authorization requested</Text>\n </Text>\n <Text>\n <Text color=\"cyan\">◉ </Text>\n <Text bold>Polling for authorization...</Text>\n </Text>\n </Box>\n </Box>\n\n <Box borderStyle=\"double\" borderColor=\"yellow\" padding={1} marginBottom={1}>\n <Box flexDirection=\"column\">\n <Text bold color=\"yellow\">\n 📋 Authentication Steps:\n </Text>\n <Newline />\n\n <Text>\n <Text bold color=\"cyan\">\n 1.{' '}\n </Text>\n <Text>Open this URL in your browser:</Text>\n </Text>\n <Box paddingLeft={3} marginBottom={1}>\n <Link url={verificationUrl}>\n <Text color=\"blue\" bold>\n {verificationUrl}\n </Text>\n </Link>\n </Box>\n\n <Text>\n <Text bold color=\"cyan\">\n 2.{' '}\n </Text>\n <Text>Enter this verification code:</Text>\n </Text>\n <Box paddingLeft={3} marginBottom={1} borderStyle=\"single\" borderColor=\"green\" paddingX={2}>\n <Text color=\"green\" bold>\n {deviceCode.user_code}\n </Text>\n </Box>\n\n <Text>\n <Text bold color=\"cyan\">\n 3.{' '}\n </Text>\n <Text>Sign in and approve the device</Text>\n </Text>\n <Newline />\n\n <Text dimColor>The CLI will automatically detect when you approve the device.</Text>\n </Box>\n </Box>\n\n <Box borderStyle=\"round\" borderColor=\"gray\" padding={1} marginBottom={1}>\n <Box flexDirection=\"column\">\n <Text dimColor>⏱️ Expires in: {Math.floor(deviceCode.expires_in / 60)} minutes</Text>\n <Text dimColor>💡 Tip: The URL includes your verification code for convenience</Text>\n </Box>\n </Box>\n </Box>\n )}\n </Static>\n );\n }\n\n // Organization selection state\n if (status === 'selecting_org') {\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">\n 🔐 Agiflow Authentication\n </Text>\n </Box>\n\n <Box borderStyle=\"round\" borderColor=\"green\" padding={1} marginBottom={1}>\n <Box flexDirection=\"column\">\n <Text>\n <Text color=\"green\">✓ </Text>\n <Text dimColor>Device authorized successfully</Text>\n </Text>\n <Text>\n <Text color=\"cyan\">◉ </Text>\n <Text bold>Select an organization</Text>\n </Text>\n </Box>\n </Box>\n\n <Box borderStyle=\"double\" borderColor=\"yellow\" padding={1} marginBottom={1}>\n <Box flexDirection=\"column\">\n <Text bold color=\"yellow\">\n 📋 Select Organization:\n </Text>\n <Newline />\n {organizations.map((org, index) => (\n <Text key={org.id}>\n <Text color={index === selectedOrgIndex ? 'green' : 'gray'}>\n {index === selectedOrgIndex ? '❯ ' : ' '}\n </Text>\n <Text bold={index === selectedOrgIndex}>{org.name}</Text>\n <Text dimColor> ({org.slug})</Text>\n </Text>\n ))}\n <Newline />\n <Text dimColor>Use ↑/↓ arrows to navigate, Enter to select</Text>\n </Box>\n </Box>\n </Box>\n );\n }\n\n // Exchanging token state\n if (status === 'exchanging') {\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">\n 🔐 Agiflow Authentication\n </Text>\n </Box>\n <Box borderStyle=\"round\" borderColor=\"cyan\" padding={1}>\n <Box flexDirection=\"column\">\n <Text>\n <Text color=\"green\">✓ </Text>\n <Text dimColor>Device authorized</Text>\n </Text>\n <Text>\n <Text color=\"green\">✓ </Text>\n <Text dimColor>Organization selected</Text>\n </Text>\n <Text>\n <Text color=\"cyan\">◉ </Text>\n <Text>Creating agent credentials...</Text>\n </Text>\n </Box>\n </Box>\n </Box>\n );\n }\n\n // Error state\n if (status === 'error' || deviceCodeMutation.isError || pollTokenMutation.isError) {\n const mutationError = deviceCodeMutation.error || pollTokenMutation.error;\n const displayMessage = errorMessage || mutationError?.message || 'Unknown error occurred';\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Box marginBottom={1}>\n <Text bold color=\"red\">\n ❌ Authentication Error\n </Text>\n </Box>\n <Box borderStyle=\"round\" borderColor=\"red\" padding={1} marginBottom={1}>\n <Text color=\"red\">{displayMessage}</Text>\n </Box>\n <Box borderStyle=\"single\" borderColor=\"gray\" padding={1}>\n <Box flexDirection=\"column\">\n <Text dimColor>💡 Troubleshooting:</Text>\n <Text dimColor> • Check your internet connection</Text>\n <Text dimColor> • Verify the server URL is correct</Text>\n <Text dimColor> • Ensure the token is valid and not expired</Text>\n <Text dimColor> • Try running the daemon again</Text>\n <Newline />\n <Text dimColor>⌨️ Press Ctrl+C to exit</Text>\n </Box>\n </Box>\n </Box>\n );\n }\n\n // Default loading state\n return null;\n};\n","import React, { useMemo } from 'react';\nimport { shallowEqual, useSelector } from 'react-redux';\nimport type { AgentManager } from '@/services';\nimport { RootState } from '@/store';\nimport { GLOBAL_TYPES } from '@/types';\nimport { LaunchAgent } from '../../../components/LaunchAgent';\nimport { cliContainer } from '../../../container';\nimport { useInk } from '../../../contexts/InkContext';\nimport { AgentConfigService } from '../../../services/agent/AgentConfigService';\nimport { AGENT_TYPES } from '../../../types';\n\nconst isMacOS = process.platform === 'darwin';\n\ninterface TabIndicatorProps {\n tabId: string;\n}\n\ninterface TabItemProps {\n tabId: string;\n index: number;\n}\n\n/**\n * Memoized component to display unread count badge\n * Only re-renders when unreadCount or activeTabId changes for this specific tab\n */\nconst UnreadCount: React.FC<TabIndicatorProps> = React.memo(({ tabId }) => {\n const unreadCount = useSelector((state: RootState) => state.agentTabs.tabs.find((t) => t.id === tabId)?.unreadCount);\n const isActive = useSelector((state: RootState) => state.agentTabs.activeTabId === tabId);\n\n if (!unreadCount || unreadCount <= 0 || isActive) {\n return null;\n }\n\n return <> ({unreadCount})</>;\n});\n\nUnreadCount.displayName = 'UnreadCount';\n\n/**\n * Memoized component to display waiting input indicator (red dot)\n * Only re-renders when waitingInput or activeTabId changes for this specific tab\n */\nconst WaitingInputIndicator: React.FC<TabIndicatorProps> = React.memo(({ tabId }) => {\n const { Text } = useInk();\n const waitingInput = useSelector(\n (state: RootState) => state.agentTabs.tabs.find((t) => t.id === tabId)?.waitingInput,\n );\n const isActive = useSelector((state: RootState) => state.agentTabs.activeTabId === tabId);\n\n if (!waitingInput || isActive) {\n return null;\n }\n\n return <Text color=\"red\">● </Text>;\n});\n\nWaitingInputIndicator.displayName = 'WaitingInputIndicator';\n\n/**\n * Memoized component for individual tab rendering\n * Selects only the data it needs (id, label) to minimize re-renders\n */\nconst TabItem: React.FC<TabItemProps> = React.memo(({ tabId, index }) => {\n const { Box, Text } = useInk();\n const label = useSelector((state: RootState) => state.agentTabs.tabs.find((t) => t.id === tabId)?.label);\n const isActive = useSelector((state: RootState) => state.agentTabs.activeTabId === tabId);\n\n const fKeyLabel = `^F${index + 1}`;\n\n return (\n <Box marginRight={2} borderStyle={isActive ? 'round' : undefined}>\n <WaitingInputIndicator tabId={tabId} />\n <Text color={'#d1d5db'} bold={isActive} dimColor={!isActive}>\n [{fKeyLabel}] {label}\n <UnreadCount tabId={tabId} />\n </Text>\n <LaunchAgent tabId={tabId} />\n </Box>\n );\n});\n\nTabItem.displayName = 'TabItem';\n\nexport const AgentTabs: React.FC = () => {\n const { Box, Text } = useInk();\n // Only select tab IDs - won't re-render when other tab properties change\n const tabIds = useSelector((state: RootState) => state.agentTabs.tabs.map((t) => t.id), shallowEqual);\n const activeTabId = useSelector((state: RootState) => state.agentTabs.activeTabId);\n\n // Get the effective working directory for the active tab\n const activeWorkingDir = useMemo(() => {\n if (!activeTabId) return null;\n\n try {\n const agentManager = cliContainer.get<AgentManager>(GLOBAL_TYPES.AgentManager);\n const agentContainer = agentManager.getAgentContainer(activeTabId);\n\n if (agentContainer) {\n const agentConfigService = agentContainer.get<AgentConfigService>(AGENT_TYPES.AgentConfigService);\n return agentConfigService.getEffectiveWorkingDir();\n }\n } catch {\n // Container or service not available yet\n }\n\n return process.cwd();\n }, [activeTabId]);\n\n return (\n <Box flexDirection=\"column\" marginTop={1}>\n <Box alignItems=\"center\" borderTop borderTopColor={'#d1d5db'} borderDimColor>\n {tabIds.map((tabId, index) => (\n <TabItem key={tabId} tabId={tabId} index={index} />\n ))}\n </Box>\n {activeWorkingDir && <Text dimColor>{activeWorkingDir}</Text>}\n {isMacOS && <Text dimColor>Press fn + Shift + F[num] to switch tabs</Text>}\n </Box>\n );\n};\n","import React from 'react';\nimport { useSelector } from 'react-redux';\nimport { RootState } from '@/store';\nimport { StdinForwarder } from '@/systems/cli/components/StdinForwarder';\nimport { AgentView } from '../../../../components/AgentView';\nimport { BoxSizeMeasure } from '../../../../components/BoxSizeMeasure';\nimport { CAPermissionGuard } from '../../../../components/CAPermissionGuard';\nimport { useInk } from '../../../../contexts/InkContext';\nimport { AgentTabs } from '../../components/AgentTabs';\n\nexport const Agents: React.FC = () => {\n const { Box } = useInk();\n const activeTabId = useSelector((state: RootState) => state.agentTabs.activeTabId);\n // F-key tab switching is handled by StdinForwarder via escape sequences\n\n return (\n <Box flexDirection=\"column\" flexGrow={1}>\n <CAPermissionGuard>\n <AgentView key={activeTabId} />\n </CAPermissionGuard>\n <BoxSizeMeasure>\n <AgentTabs />\n </BoxSizeMeasure>\n <StdinForwarder />\n </Box>\n );\n};\n","import React from 'react';\nimport { useInk } from '../../../../contexts/InkContext';\n\nexport const Onboarding: React.FC = () => {\n const { Box, Text } = useInk();\n\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"green\" padding={1} flexGrow={1}>\n <Text bold color=\"green\">\n Welcome to Agent CLI Daemon!\n </Text>\n <Box marginTop={1}>\n <Text>It looks like you don't have any active agent sessions.</Text>\n </Box>\n <Box marginTop={1}>\n <Text>\n Please use the Agiflow UI Dashboard to start a{' '}\n <Text bold color=\"blue\">\n Project Plan\n </Text>\n ,{' '}\n <Text bold color=\"blue\">\n Work Unit\n </Text>\n , or{' '}\n <Text bold color=\"blue\">\n Task Chat\n </Text>{' '}\n to begin.\n </Text>\n </Box>\n <Box marginTop={1}>\n <Text dimColor>The Agiflow UI Dashboard can be accessed in your browser.</Text>\n </Box>\n </Box>\n );\n};\n","import 'reflect-metadata'; // Must be first import for InversifyJS\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query';\nimport React from 'react';\nimport { Provider, useSelector } from 'react-redux';\nimport { RootState, store } from '@/store';\nimport { InkProvider, useInk } from '../../contexts/InkContext';\nimport { DaemonConnectionManager } from './components/DaemonConnectionManager';\nimport { OauthSetup } from './guards/OauthSetup';\nimport { Agents } from './screens/Agents';\nimport { Onboarding } from './screens/Onboarding';\n\n// Create a client with memory management\nconst queryClient = new QueryClient({\n defaultOptions: {\n queries: {\n retry: false,\n refetchOnWindowFocus: false,\n gcTime: 5 * 60 * 1000, // Garbage collect unused queries after 5 minutes\n staleTime: 30 * 1000, // Consider data stale after 30 seconds\n },\n },\n});\n\nconst DaemonAppContent: React.FC = () => {\n const { Box } = useInk();\n\n const tabs = useSelector((state: RootState) => state.agentTabs.tabs);\n const hasAgentTabs = tabs.length > 0; // No dashboard, so any tab is an agent\n\n return (\n <OauthSetup>\n {({ isAuthenticated }) => (\n <DaemonConnectionManager>\n <Box flexGrow={1} flexDirection=\"column\">\n {isAuthenticated && !hasAgentTabs ? <Onboarding /> : <Agents />}\n </Box>\n </DaemonConnectionManager>\n )}\n </OauthSetup>\n );\n};\n\nconst DaemonApp: React.FC = () => {\n return (\n <InkProvider>\n <Provider store={store}>\n <QueryClientProvider client={queryClient}>\n <DaemonAppContent />\n </QueryClientProvider>\n </Provider>\n </InkProvider>\n );\n};\n\nexport const startDaemonApp = async () => {\n // Dynamically import Ink's render function to avoid top-level yoga-layout import\n const { render } = await import('ink');\n // Disable Ink's stdin handling - we use StdinManager instead\n const { waitUntilExit } = render(<DaemonApp />, {\n stdin: process.stdin,\n stdout: process.stdout,\n stderr: process.stderr,\n });\n return waitUntilExit();\n};\n"],"names":["DaemonConnectionManager","children","Box","Text","useInk","dispatch","useDispatch","status","useSelector","state","error","isShuttingDown","useRef","useEffect","launchDaemon","setShutdownCallback","daemonManager","cliContainer","GLOBAL_TYPES","clearShutdownCallback","jsx","jsxs","OauthSetup","Newline","Static","Link","useInput","queryClient","useQueryClient","deviceCode","setDeviceCode","useState","accessToken","setAccessToken","organizations","setOrganizations","selectedOrgIndex","setSelectedOrgIndex","setStatus","errorMessage","setErrorMessage","abortControllerRef","authService","credentialsService","existingAuth","isCheckingAuth","useQuery","creds","deviceCodeMutation","useMutation","data","pollTokenMutation","codeResponse","tokenResponse","orgs","exchangeForAgentMutation","organizationId","apiKeyToken","handleSelectOrg","useCallback","_input","key","prev","verificationUrl","org","index","mutationError","displayMessage","isMacOS","UnreadCount","React","tabId","unreadCount","t","isActive","Fragment","WaitingInputIndicator","waitingInput","TabItem","label","fKeyLabel","LaunchAgent","AgentTabs","tabIds","shallowEqual","activeTabId","activeWorkingDir","useMemo","agentContainer","AGENT_TYPES","Agents","CAPermissionGuard","AgentView","BoxSizeMeasure","StdinForwarder","Onboarding","QueryClient","DaemonAppContent","hasAgentTabs","isAuthenticated","DaemonApp","InkProvider","Provider","store","QueryClientProvider","startDaemonApp","render","waitUntilExit"],"mappings":";;;;;AAeO,MAAMA,KAAkE,CAAC,EAAE,UAAAC,QAAe;AAC/F,QAAM,EAAE,KAAAC,GAAK,MAAAC,EAAA,IAASC,EAAA,GAChBC,IAAWC,GAAA,GACXC,IAASC,EAAY,CAACC,MAAqBA,EAAM,aAAa,MAAM,GACpEC,IAAQF,EAAY,CAACC,MAAqBA,EAAM,aAAa,KAAK,GAClEE,IAAiBC,EAAO,EAAK;AA4BnC,SA1BAC,EAAU,OACRR,EAASS,GAAc,GAkBvBC,EAfuB,YAAY;AACjC,QAAI,CAAAJ,EAAe,SACnB;AAAA,MAAAA,EAAe,UAAU;AAEzB,UAAI;AACF,cAAMK,IAAgBC,EAAa,IAAmBC,EAAa,aAAa;AAChF,QAAIF,EAAc,eAChB,MAAMA,EAAc,KAAA;AAAA,MAExB,QAAQ;AAAA,MAER;AAAA;AAAA,EAEF,CAEkC,GAE3B,MAAM;AACX,IAAAG,EAAA;AAAA,EACF,IACC,CAACd,CAAQ,CAAC,GAETE,MAAW,aAEX,gBAAAa,EAAClB,GAAA,EAAI,eAAc,UAAS,SAAS,GACnC,UAAA,gBAAAkB,EAACjB,GAAA,EAAK,OAAM,UAAS,UAAA,2BAAA,CAAwB,GAC/C,IAIAI,MAAW,UAEX,gBAAAc,EAACnB,KAAI,eAAc,UAAS,SAAS,GAAG,aAAY,SAAQ,aAAY,OACtE,UAAA;AAAA,IAAA,gBAAAkB,EAACjB,GAAA,EAAK,OAAM,OAAM,MAAI,IAAC,UAAA,oBAEvB;AAAA,IACA,gBAAAiB,EAACjB,KAAM,UAAAO,EAAA,CAAM;AAAA,IACb,gBAAAU,EAACjB,GAAA,EAAK,UAAQ,IAAC,UAAA,4BAAA,CAAyB;AAAA,EAAA,GAC1C,IAIAI,MAAW,qCACH,UAAAN,GAAS,IAGd;AACT,GCrDaqB,KAAwC,CAAC,EAAE,UAAArB,QAAe;AACrE,QAAM,EAAE,KAAAC,GAAK,MAAAC,GAAM,SAAAoB,GAAS,QAAAC,GAAQ,MAAAC,GAAM,UAAAC,EAAA,IAAatB,EAAA,GACjDuB,IAAcC,GAAA,GACd,CAACC,GAAYC,CAAa,IAAIC,EAAoC,IAAI,GACtE,CAACC,GAAaC,CAAc,IAAIF,EAAwB,IAAI,GAC5D,CAACG,GAAeC,CAAgB,IAAIJ,EAA6B,CAAA,CAAE,GACnE,CAACK,GAAkBC,CAAmB,IAAIN,EAAS,CAAC,GACpD,CAACxB,GAAQ+B,CAAS,IAAIP,EAAqB,UAAU,GACrD,CAACQ,GAAcC,CAAe,IAAIT,EAAiB,EAAE,GACrDU,IAAqB7B,EAA+B,IAAI,GAGxD8B,IAAczB,EAAa,IAA2BC,EAAa,qBAAqB,GACxFyB,IAAqB1B,EAAa,IAAwBC,EAAa,kBAAkB,GAGzF,EAAE,MAAM0B,GAAc,WAAWC,EAAA,IAAmBC,GAAS;AAAA,IACjE,UAAU,CAAC,QAAQ,OAAO;AAAA,IAC1B,SAAS,YAAY;AACnB,YAAMC,IAAQ,MAAMJ,EAAmB,KAAA;AACvC,aAAII,KAASA,EAAM,UAAUA,EAAM,aAAaL,EAAY,aAAaK,EAAM,SAAS,IAC/E,EAAE,eAAe,GAAA,IAEnB,EAAE,eAAe,GAAA;AAAA,IAC1B;AAAA,IACA,OAAO;AAAA,EAAA,CACR,GAGKC,IAAqBC,EAAY;AAAA,IACrC,YAAY,aACVX,EAAU,iBAAiB,GACpBI,EAAY,kBAAkB,sBAAsB;AAAA,IAE7D,WAAW,CAACQ,MAAS;AACnB,MAAApB,EAAcoB,CAAI,GAClBZ,EAAU,SAAS,GACnBa,EAAkB,OAAOD,CAAI;AAAA,IAC/B;AAAA,IACA,SAAS,CAACxC,MAAU;AAClB,MAAA4B,EAAU,OAAO,GACjBE,EAAgB9B,aAAiB,QAAQA,EAAM,UAAU,+BAA+B;AAAA,IAC1F;AAAA,EAAA,CACD,GAGKyC,IAAoBF,EAAY;AAAA,IACpC,YAAY,OAAOG,MAAqC;AACtD,MAAAX,EAAmB,UAAU,IAAI,gBAAA;AAGjC,YAAMY,IAAgB,MAAMX,EAAY,aAAaU,EAAa,aAAaA,EAAa,YAAY,GAAG;AAAA,QACzG,QAAQX,EAAmB,QAAQ;AAAA,MAAA,CACpC,GAGKa,IAAO,MAAMZ,EAAY,kBAAkBW,EAAc,YAAY;AAE3E,aAAO,EAAE,aAAaA,EAAc,cAAc,eAAeC,EAAA;AAAA,IACnE;AAAA,IACA,WAAW,CAACJ,MAAS;AACnB,MAAAjB,EAAeiB,EAAK,WAAW,GAC/Bf,EAAiBe,EAAK,aAAa,GAE/BA,EAAK,cAAc,WAAW,KAChCZ,EAAU,OAAO,GACjBE,EAAgB,qDAAqD,KAC5DU,EAAK,cAAc,WAAW,IAEvCK,EAAyB,OAAO,EAAE,aAAaL,EAAK,aAAa,gBAAgBA,EAAK,cAAc,CAAC,EAAE,GAAA,CAAI,IAG3GZ,EAAU,eAAe;AAAA,IAE7B;AAAA,IACA,SAAS,CAAC5B,MAAU;AAClB,MAAA4B,EAAU,OAAO,GACjBE,EAAgB9B,aAAiB,QAAQA,EAAM,UAAU,0BAA0B;AAAA,IACrF;AAAA,EAAA,CACD,GAGK6C,IAA2BN,EAAY;AAAA,IAC3C,YAAY,OAAO,EAAE,aAAAjB,GAAa,gBAAAwB,SAChClB,EAAU,YAAY,GACfI,EAAY,uBAAuBV,GAAawB,CAAc;AAAA,IAEvE,WAAW,OAAOC,MAAgB;AAEhC,YAAMd,EAAmB,UAAU;AAAA,QACjC,QAAQc,EAAY;AAAA,QACpB,gBAAgBA,EAAY;AAAA,QAC5B,WAAWA,EAAY;AAAA,QACvB,UAAUA,EAAY;AAAA,MAAA,CACvB,GAEDnB,EAAU,eAAe,GACzBX,EAAY,kBAAkB,EAAE,UAAU,CAAC,QAAQ,OAAO,GAAG;AAAA,IAC/D;AAAA,IACA,SAAS,CAACjB,MAAU;AAClB,MAAA4B,EAAU,OAAO,GACjBE,EAAgB9B,aAAiB,QAAQA,EAAM,UAAU,sCAAsC;AAAA,IACjG;AAAA,EAAA,CACD,GAGKgD,IAAkBC,GAAY,MAAM;AACxC,IAAI3B,KAAeE,EAAcE,CAAgB,KAC/CmB,EAAyB,OAAO;AAAA,MAC9B,aAAAvB;AAAA,MACA,gBAAgBE,EAAcE,CAAgB,EAAE;AAAA,IAAA,CACjD;AAAA,EAEL,GAAG,CAACJ,GAAaE,GAAeE,GAAkBmB,CAAwB,CAAC;AAiC3E,MA9BA7B;AAAA,IACE,CAACkC,GAAQC,MAAQ;AACf,MAAItD,MAAW,oBAEXsD,EAAI,UACNxB,EAAoB,CAACyB,MAAS,KAAK,IAAI,GAAGA,IAAO,CAAC,CAAC,IAC1CD,EAAI,YACbxB,EAAoB,CAACyB,MAAS,KAAK,IAAI5B,EAAc,SAAS,GAAG4B,IAAO,CAAC,CAAC,IACjED,EAAI,UACbH,EAAA;AAAA,IAEJ;AAAA,IACA,EAAE,UAAUnD,MAAW,gBAAA;AAAA,EAAgB,GAIzCM,EAAU,MACD,MAAM;AACX,IAAA4B,EAAmB,SAAS,MAAA;AAAA,EAC9B,GACC,CAAA,CAAE,GAGL5B,EAAU,MAAM;AACd,IAAI+B,KAAgB,CAACA,EAAa,iBAAiBrC,MAAW,cAAc,CAACsC,KAC3EG,EAAmB,OAAA;AAAA,EAEvB,GAAG,CAACJ,GAAcrC,GAAQsC,GAAgBG,CAAkB,CAAC,GAGzDJ,GAAc;AAChB,kCAAU,UAAA3C,EAAS,EAAE,iBAAiB,GAAA,CAAM,GAAE;AAIhD,MAAI4C;AACF,WACE,gBAAAxB,EAACnB,GAAA,EAAI,eAAc,UAAS,SAAS,GACnC,UAAA;AAAA,MAAA,gBAAAkB,EAAClB,GAAA,EAAI,cAAc,GACjB,UAAA,gBAAAkB,EAACjB,GAAA,EAAK,MAAI,IAAC,OAAM,QAAO,UAAA,4BAAA,CAExB,GACF;AAAA,MACA,gBAAAiB,EAAClB,GAAA,EAAI,aAAY,SAAQ,aAAY,QAAO,SAAS,GACnD,UAAA,gBAAAkB,EAAClB,GAAA,EAAI,eAAc,UACjB,4BAACC,GAAA,EACC,UAAA;AAAA,QAAA,gBAAAiB,EAACjB,GAAA,EAAK,OAAM,QAAO,UAAA,MAAE;AAAA,QACrB,gBAAAiB,EAACjB,KAAK,UAAA,mCAAA,CAAgC;AAAA,MAAA,EAAA,CACxC,GACF,EAAA,CACF;AAAA,IAAA,GACF;AAKJ,MAAI6C,EAAmB;AACrB,WACE,gBAAA3B,EAACnB,GAAA,EAAI,eAAc,UAAS,SAAS,GACnC,UAAA;AAAA,MAAA,gBAAAkB,EAAClB,GAAA,EAAI,cAAc,GACjB,UAAA,gBAAAkB,EAACjB,GAAA,EAAK,MAAI,IAAC,OAAM,QAAO,UAAA,4BAAA,CAExB,GACF;AAAA,MACA,gBAAAiB,EAAClB,GAAA,EAAI,aAAY,SAAQ,aAAY,QAAO,SAAS,GACnD,UAAA,gBAAAmB,EAACnB,GAAA,EAAI,eAAc,UACjB,UAAA;AAAA,QAAA,gBAAAmB,EAAClB,GAAA,EACC,UAAA;AAAA,UAAA,gBAAAiB,EAACjB,GAAA,EAAK,OAAM,SAAQ,UAAA,MAAE;AAAA,UACtB,gBAAAiB,EAACjB,GAAA,EAAK,UAAQ,IAAC,UAAA,+BAAA,CAA4B;AAAA,QAAA,GAC7C;AAAA,0BACCA,GAAA,EACC,UAAA;AAAA,UAAA,gBAAAiB,EAACjB,GAAA,EAAK,OAAM,QAAO,UAAA,MAAE;AAAA,UACrB,gBAAAiB,EAACjB,KAAK,UAAA,qCAAA,CAAkC;AAAA,QAAA,EAAA,CAC1C;AAAA,MAAA,EAAA,CACF,EAAA,CACF;AAAA,IAAA,GACF;AAKJ,MAAI0B,GAAY;AACd,UAAMkC,IAAkB,GAAGlC,EAAW,gBAAgB,SAAS,mBAAmBA,EAAW,SAAS,CAAC;AAEvG,WACE,gBAAAT,EAACI,GAAA,EAAO,OAAO,CAAC,CAAC,GACd,UAAA,MACC,gBAAAH,EAACnB,GAAA,EAAI,eAAc,UAAS,SAAS,GACnC,UAAA;AAAA,MAAA,gBAAAkB,EAAClB,GAAA,EAAI,cAAc,GACjB,UAAA,gBAAAkB,EAACjB,GAAA,EAAK,MAAI,IAAC,OAAM,QAAO,UAAA,4BAAA,CAExB,GACF;AAAA,MAEA,gBAAAiB,EAAClB,GAAA,EAAI,aAAY,SAAQ,aAAY,SAAQ,SAAS,GAAG,cAAc,GACrE,UAAA,gBAAAmB,EAACnB,GAAA,EAAI,eAAc,UACjB,UAAA;AAAA,QAAA,gBAAAmB,EAAClB,GAAA,EACC,UAAA;AAAA,UAAA,gBAAAiB,EAACjB,GAAA,EAAK,OAAM,SAAQ,UAAA,MAAE;AAAA,UACtB,gBAAAiB,EAACjB,GAAA,EAAK,UAAQ,IAAC,UAAA,+BAAA,CAA4B;AAAA,QAAA,GAC7C;AAAA,0BACCA,GAAA,EACC,UAAA;AAAA,UAAA,gBAAAiB,EAACjB,GAAA,EAAK,OAAM,SAAQ,UAAA,MAAE;AAAA,UACtB,gBAAAiB,EAACjB,GAAA,EAAK,UAAQ,IAAC,UAAA,iCAAA,CAA8B;AAAA,QAAA,GAC/C;AAAA,0BACCA,GAAA,EACC,UAAA;AAAA,UAAA,gBAAAiB,EAACjB,GAAA,EAAK,OAAM,QAAO,UAAA,MAAE;AAAA,UACrB,gBAAAiB,EAACjB,GAAA,EAAK,MAAI,IAAC,UAAA,+BAAA,CAA4B;AAAA,QAAA,EAAA,CACzC;AAAA,MAAA,EAAA,CACF,EAAA,CACF;AAAA,MAEA,gBAAAiB,EAAClB,GAAA,EAAI,aAAY,UAAS,aAAY,UAAS,SAAS,GAAG,cAAc,GACvE,UAAA,gBAAAmB,EAACnB,GAAA,EAAI,eAAc,UACjB,UAAA;AAAA,QAAA,gBAAAkB,EAACjB,GAAA,EAAK,MAAI,IAAC,OAAM,UAAS,UAAA,4BAE1B;AAAA,0BACCoB,GAAA,EAAQ;AAAA,0BAERpB,GAAA,EACC,UAAA;AAAA,UAAA,gBAAAkB,EAAClB,GAAA,EAAK,MAAI,IAAC,OAAM,QAAO,UAAA;AAAA,YAAA;AAAA,YACnB;AAAA,UAAA,GACL;AAAA,UACA,gBAAAiB,EAACjB,KAAK,UAAA,iCAAA,CAA8B;AAAA,QAAA,GACtC;AAAA,0BACCD,GAAA,EAAI,aAAa,GAAG,cAAc,GACjC,4BAACuB,GAAA,EAAK,KAAKsC,GACT,UAAA,gBAAA3C,EAACjB,KAAK,OAAM,QAAO,MAAI,IACpB,UAAA4D,GACH,GACF,EAAA,CACF;AAAA,0BAEC5D,GAAA,EACC,UAAA;AAAA,UAAA,gBAAAkB,EAAClB,GAAA,EAAK,MAAI,IAAC,OAAM,QAAO,UAAA;AAAA,YAAA;AAAA,YACnB;AAAA,UAAA,GACL;AAAA,UACA,gBAAAiB,EAACjB,KAAK,UAAA,gCAAA,CAA6B;AAAA,QAAA,GACrC;AAAA,QACA,gBAAAiB,EAAClB,KAAI,aAAa,GAAG,cAAc,GAAG,aAAY,UAAS,aAAY,SAAQ,UAAU,GACvF,UAAA,gBAAAkB,EAACjB,KAAK,OAAM,SAAQ,MAAI,IACrB,UAAA0B,EAAW,WACd,EAAA,CACF;AAAA,0BAEC1B,GAAA,EACC,UAAA;AAAA,UAAA,gBAAAkB,EAAClB,GAAA,EAAK,MAAI,IAAC,OAAM,QAAO,UAAA;AAAA,YAAA;AAAA,YACnB;AAAA,UAAA,GACL;AAAA,UACA,gBAAAiB,EAACjB,KAAK,UAAA,iCAAA,CAA8B;AAAA,QAAA,GACtC;AAAA,0BACCoB,GAAA,EAAQ;AAAA,QAET,gBAAAH,EAACjB,GAAA,EAAK,UAAQ,IAAC,UAAA,iEAAA,CAA8D;AAAA,MAAA,EAAA,CAC/E,EAAA,CACF;AAAA,MAEA,gBAAAiB,EAAClB,GAAA,EAAI,aAAY,SAAQ,aAAY,QAAO,SAAS,GAAG,cAAc,GACpE,UAAA,gBAAAmB,EAACnB,GAAA,EAAI,eAAc,UACjB,UAAA;AAAA,QAAA,gBAAAmB,EAAClB,GAAA,EAAK,UAAQ,IAAC,UAAA;AAAA,UAAA;AAAA,UAAgB,KAAK,MAAM0B,EAAW,aAAa,EAAE;AAAA,UAAE;AAAA,QAAA,GAAQ;AAAA,QAC9E,gBAAAT,EAACjB,GAAA,EAAK,UAAQ,IAAC,UAAA,kEAAA,CAA+D;AAAA,MAAA,EAAA,CAChF,EAAA,CACF;AAAA,IAAA,EAAA,CACF,EAAA,CAEJ;AAAA,EAEJ;AAGA,MAAII,MAAW;AACb,WACE,gBAAAc,EAACnB,GAAA,EAAI,eAAc,UAAS,SAAS,GACnC,UAAA;AAAA,MAAA,gBAAAkB,EAAClB,GAAA,EAAI,cAAc,GACjB,UAAA,gBAAAkB,EAACjB,GAAA,EAAK,MAAI,IAAC,OAAM,QAAO,UAAA,4BAAA,CAExB,GACF;AAAA,MAEA,gBAAAiB,EAAClB,GAAA,EAAI,aAAY,SAAQ,aAAY,SAAQ,SAAS,GAAG,cAAc,GACrE,UAAA,gBAAAmB,EAACnB,GAAA,EAAI,eAAc,UACjB,UAAA;AAAA,QAAA,gBAAAmB,EAAClB,GAAA,EACC,UAAA;AAAA,UAAA,gBAAAiB,EAACjB,GAAA,EAAK,OAAM,SAAQ,UAAA,MAAE;AAAA,UACtB,gBAAAiB,EAACjB,GAAA,EAAK,UAAQ,IAAC,UAAA,iCAAA,CAA8B;AAAA,QAAA,GAC/C;AAAA,0BACCA,GAAA,EACC,UAAA;AAAA,UAAA,gBAAAiB,EAACjB,GAAA,EAAK,OAAM,QAAO,UAAA,MAAE;AAAA,UACrB,gBAAAiB,EAACjB,GAAA,EAAK,MAAI,IAAC,UAAA,yBAAA,CAAsB;AAAA,QAAA,EAAA,CACnC;AAAA,MAAA,EAAA,CACF,EAAA,CACF;AAAA,MAEA,gBAAAiB,EAAClB,GAAA,EAAI,aAAY,UAAS,aAAY,UAAS,SAAS,GAAG,cAAc,GACvE,UAAA,gBAAAmB,EAACnB,GAAA,EAAI,eAAc,UACjB,UAAA;AAAA,QAAA,gBAAAkB,EAACjB,GAAA,EAAK,MAAI,IAAC,OAAM,UAAS,UAAA,2BAE1B;AAAA,0BACCoB,GAAA,EAAQ;AAAA,QACRW,EAAc,IAAI,CAAC8B,GAAKC,wBACtB9D,GAAA,EACC,UAAA;AAAA,UAAA,gBAAAiB,EAACjB,GAAA,EAAK,OAAO8D,MAAU7B,IAAmB,UAAU,QACjD,UAAA6B,MAAU7B,IAAmB,OAAO,KAAA,CACvC;AAAA,4BACCjC,GAAA,EAAK,MAAM8D,MAAU7B,GAAmB,YAAI,MAAK;AAAA,UAClD,gBAAAf,EAAClB,GAAA,EAAK,UAAQ,IAAC,UAAA;AAAA,YAAA;AAAA,YAAG6D,EAAI;AAAA,YAAK;AAAA,UAAA,EAAA,CAAC;AAAA,QAAA,KALnBA,EAAI,EAMf,CACD;AAAA,0BACAzC,GAAA,EAAQ;AAAA,QACT,gBAAAH,EAACjB,GAAA,EAAK,UAAQ,IAAC,UAAA,8CAAA,CAA2C;AAAA,MAAA,EAAA,CAC5D,EAAA,CACF;AAAA,IAAA,GACF;AAKJ,MAAII,MAAW;AACb,WACE,gBAAAc,EAACnB,GAAA,EAAI,eAAc,UAAS,SAAS,GACnC,UAAA;AAAA,MAAA,gBAAAkB,EAAClB,GAAA,EAAI,cAAc,GACjB,UAAA,gBAAAkB,EAACjB,GAAA,EAAK,MAAI,IAAC,OAAM,QAAO,UAAA,4BAAA,CAExB,GACF;AAAA,MACA,gBAAAiB,EAAClB,GAAA,EAAI,aAAY,SAAQ,aAAY,QAAO,SAAS,GACnD,UAAA,gBAAAmB,EAACnB,GAAA,EAAI,eAAc,UACjB,UAAA;AAAA,QAAA,gBAAAmB,EAAClB,GAAA,EACC,UAAA;AAAA,UAAA,gBAAAiB,EAACjB,GAAA,EAAK,OAAM,SAAQ,UAAA,MAAE;AAAA,UACtB,gBAAAiB,EAACjB,GAAA,EAAK,UAAQ,IAAC,UAAA,oBAAA,CAAiB;AAAA,QAAA,GAClC;AAAA,0BACCA,GAAA,EACC,UAAA;AAAA,UAAA,gBAAAiB,EAACjB,GAAA,EAAK,OAAM,SAAQ,UAAA,MAAE;AAAA,UACtB,gBAAAiB,EAACjB,GAAA,EAAK,UAAQ,IAAC,UAAA,wBAAA,CAAqB;AAAA,QAAA,GACtC;AAAA,0BACCA,GAAA,EACC,UAAA;AAAA,UAAA,gBAAAiB,EAACjB,GAAA,EAAK,OAAM,QAAO,UAAA,MAAE;AAAA,UACrB,gBAAAiB,EAACjB,KAAK,UAAA,gCAAA,CAA6B;AAAA,QAAA,EAAA,CACrC;AAAA,MAAA,EAAA,CACF,EAAA,CACF;AAAA,IAAA,GACF;AAKJ,MAAII,MAAW,WAAWyC,EAAmB,WAAWG,EAAkB,SAAS;AACjF,UAAMe,IAAgBlB,EAAmB,SAASG,EAAkB,OAC9DgB,IAAiB5B,KAAgB2B,GAAe,WAAW;AACjE,WACE,gBAAA7C,EAACnB,GAAA,EAAI,eAAc,UAAS,SAAS,GACnC,UAAA;AAAA,MAAA,gBAAAkB,EAAClB,GAAA,EAAI,cAAc,GACjB,UAAA,gBAAAkB,EAACjB,GAAA,EAAK,MAAI,IAAC,OAAM,OAAM,UAAA,yBAAA,CAEvB,GACF;AAAA,MACA,gBAAAiB,EAAClB,GAAA,EAAI,aAAY,SAAQ,aAAY,OAAM,SAAS,GAAG,cAAc,GACnE,UAAA,gBAAAkB,EAACjB,GAAA,EAAK,OAAM,OAAO,aAAe,GACpC;AAAA,MACA,gBAAAiB,EAAClB,GAAA,EAAI,aAAY,UAAS,aAAY,QAAO,SAAS,GACpD,UAAA,gBAAAmB,EAACnB,GAAA,EAAI,eAAc,UACjB,UAAA;AAAA,QAAA,gBAAAkB,EAACjB,GAAA,EAAK,UAAQ,IAAC,UAAA,uBAAmB;AAAA,QAClC,gBAAAiB,EAACjB,GAAA,EAAK,UAAQ,IAAC,UAAA,qCAAiC;AAAA,QAChD,gBAAAiB,EAACjB,GAAA,EAAK,UAAQ,IAAC,UAAA,uCAAmC;AAAA,QAClD,gBAAAiB,EAACjB,GAAA,EAAK,UAAQ,IAAC,UAAA,gDAA4C;AAAA,QAC3D,gBAAAiB,EAACjB,GAAA,EAAK,UAAQ,IAAC,UAAA,mCAA+B;AAAA,0BAC7CoB,GAAA,EAAQ;AAAA,QACT,gBAAAH,EAACjB,GAAA,EAAK,UAAQ,IAAC,UAAA,0BAAA,CAAuB;AAAA,MAAA,EAAA,CACxC,EAAA,CACF;AAAA,IAAA,GACF;AAAA,EAEJ;AAGA,SAAO;AACT,GC/YMiE,KAAU,QAAQ,aAAa,UAe/BC,IAA2CC,EAAM,KAAK,CAAC,EAAE,OAAAC,QAAY;AACzE,QAAMC,IAAchE,EAAY,CAACC,MAAqBA,EAAM,UAAU,KAAK,KAAK,CAACgE,MAAMA,EAAE,OAAOF,CAAK,GAAG,WAAW,GAC7GG,IAAWlE,EAAY,CAACC,MAAqBA,EAAM,UAAU,gBAAgB8D,CAAK;AAExF,SAAI,CAACC,KAAeA,KAAe,KAAKE,IAC/B,OAGF,gBAAArD,EAAAsD,GAAA,EAAE,UAAA;AAAA,IAAA;AAAA,IAAGH;AAAA,IAAY;AAAA,EAAA,GAAC;AAC3B,CAAC;AAEDH,EAAY,cAAc;AAM1B,MAAMO,IAAqDN,EAAM,KAAK,CAAC,EAAE,OAAAC,QAAY;AACnF,QAAM,EAAE,MAAApE,EAAA,IAASC,EAAA,GACXyE,IAAerE;AAAA,IACnB,CAACC,MAAqBA,EAAM,UAAU,KAAK,KAAK,CAACgE,MAAMA,EAAE,OAAOF,CAAK,GAAG;AAAA,EAAA,GAEpEG,IAAWlE,EAAY,CAACC,MAAqBA,EAAM,UAAU,gBAAgB8D,CAAK;AAExF,SAAI,CAACM,KAAgBH,IACZ,OAGF,gBAAAtD,EAACjB,GAAA,EAAK,OAAM,OAAM,UAAA,MAAE;AAC7B,CAAC;AAEDyE,EAAsB,cAAc;AAMpC,MAAME,IAAkCR,EAAM,KAAK,CAAC,EAAE,OAAAC,GAAO,OAAAN,QAAY;AACvE,QAAM,EAAE,KAAA/D,GAAK,MAAAC,EAAA,IAASC,EAAA,GAChB2E,IAAQvE,EAAY,CAACC,MAAqBA,EAAM,UAAU,KAAK,KAAK,CAACgE,MAAMA,EAAE,OAAOF,CAAK,GAAG,KAAK,GACjGG,IAAWlE,EAAY,CAACC,MAAqBA,EAAM,UAAU,gBAAgB8D,CAAK,GAElFS,IAAY,KAAKf,IAAQ,CAAC;AAEhC,2BACG/D,GAAA,EAAI,aAAa,GAAG,aAAawE,IAAW,UAAU,QACrD,UAAA;AAAA,IAAA,gBAAAtD,EAACwD,KAAsB,OAAAL,GAAc;AAAA,IACrC,gBAAAlD,EAAClB,KAAK,OAAO,WAAW,MAAMuE,GAAU,UAAU,CAACA,GAAU,UAAA;AAAA,MAAA;AAAA,MACzDM;AAAA,MAAU;AAAA,MAAGD;AAAA,MACf,gBAAA3D,EAACiD,KAAY,OAAAE,EAAA,CAAc;AAAA,IAAA,GAC7B;AAAA,IACA,gBAAAnD,EAAC6D,KAAY,OAAAV,EAAA,CAAc;AAAA,EAAA,GAC7B;AAEJ,CAAC;AAEDO,EAAQ,cAAc;AAEf,MAAMI,KAAsB,MAAM;AACvC,QAAM,EAAE,KAAAhF,GAAK,MAAAC,EAAA,IAASC,EAAA,GAEhB+E,IAAS3E,EAAY,CAACC,MAAqBA,EAAM,UAAU,KAAK,IAAI,CAACgE,MAAMA,EAAE,EAAE,GAAGW,EAAY,GAC9FC,IAAc7E,EAAY,CAACC,MAAqBA,EAAM,UAAU,WAAW,GAG3E6E,IAAmBC,GAAQ,MAAM;AACrC,QAAI,CAACF,EAAa,QAAO;AAEzB,QAAI;AAEF,YAAMG,IADevE,EAAa,IAAkBC,EAAa,YAAY,EACzC,kBAAkBmE,CAAW;AAEjE,UAAIG;AAEF,eAD2BA,EAAe,IAAwBC,EAAY,kBAAkB,EACtE,uBAAA;AAAA,IAE9B,QAAQ;AAAA,IAER;AAEA,WAAO,QAAQ,IAAA;AAAA,EACjB,GAAG,CAACJ,CAAW,CAAC;AAEhB,SACE,gBAAAhE,EAACnB,GAAA,EAAI,eAAc,UAAS,WAAW,GACrC,UAAA;AAAA,IAAA,gBAAAkB,EAAClB,GAAA,EAAI,YAAW,UAAS,WAAS,IAAC,gBAAgB,WAAW,gBAAc,IACzE,UAAAiF,EAAO,IAAI,CAACZ,GAAON,MAClB,gBAAA7C,EAAC0D,GAAA,EAAoB,OAAAP,GAAc,OAAAN,EAAA,GAArBM,CAAmC,CAClD,EAAA,CACH;AAAA,IACCe,KAAoB,gBAAAlE,EAACjB,GAAA,EAAK,UAAQ,IAAE,UAAAmF,GAAiB;AAAA,IACrDlB,MAAW,gBAAAhD,EAACjB,GAAA,EAAK,UAAQ,IAAC,UAAA,2CAAA,CAAwC;AAAA,EAAA,GACrE;AAEJ,GC9GauF,KAAmB,MAAM;AACpC,QAAM,EAAE,KAAAxF,EAAA,IAAQE,EAAA,GACViF,IAAc7E,EAAY,CAACC,MAAqBA,EAAM,UAAU,WAAW;AAGjF,SACE,gBAAAY,EAACnB,GAAA,EAAI,eAAc,UAAS,UAAU,GACpC,UAAA;AAAA,IAAA,gBAAAkB,EAACuE,GAAA,EACC,UAAA,gBAAAvE,EAACwE,GAAA,CAAA,GAAeP,CAAa,GAC/B;AAAA,IACA,gBAAAjE,EAACyE,IAAA,EACC,UAAA,gBAAAzE,EAAC8D,IAAA,CAAA,CAAU,GACb;AAAA,sBACCY,IAAA,CAAA,CAAe;AAAA,EAAA,GAClB;AAEJ,GCvBaC,KAAuB,MAAM;AACxC,QAAM,EAAE,KAAA7F,GAAK,MAAAC,EAAA,IAASC,EAAA;AAEtB,SACE,gBAAAiB,EAACnB,GAAA,EAAI,eAAc,UAAS,aAAY,SAAQ,aAAY,SAAQ,SAAS,GAAG,UAAU,GACxF,UAAA;AAAA,IAAA,gBAAAkB,EAACjB,GAAA,EAAK,MAAI,IAAC,OAAM,SAAQ,UAAA,gCAEzB;AAAA,sBACCD,GAAA,EAAI,WAAW,GACd,UAAA,gBAAAkB,EAACjB,GAAA,EAAK,qEAAuD,EAAA,CAC/D;AAAA,IACA,gBAAAiB,EAAClB,GAAA,EAAI,WAAW,GACd,4BAACC,GAAA,EAAK,UAAA;AAAA,MAAA;AAAA,MAC2C;AAAA,wBAC9CA,GAAA,EAAK,MAAI,IAAC,OAAM,QAAO,UAAA,gBAExB;AAAA,MAAO;AAAA,MACL;AAAA,wBACDA,GAAA,EAAK,MAAI,IAAC,OAAM,QAAO,UAAA,aAExB;AAAA,MAAO;AAAA,MACF;AAAA,wBACJA,GAAA,EAAK,MAAI,IAAC,OAAM,QAAO,UAAA,aAExB;AAAA,MAAQ;AAAA,MAAI;AAAA,IAAA,EAAA,CAEd,EAAA,CACF;AAAA,IACA,gBAAAiB,EAAClB,KAAI,WAAW,GACd,4BAACC,GAAA,EAAK,UAAQ,IAAC,UAAA,4DAAA,CAAyD,EAAA,CAC1E;AAAA,EAAA,GACF;AAEJ,GCxBMwB,KAAc,IAAIqE,GAAY;AAAA,EAClC,gBAAgB;AAAA,IACd,SAAS;AAAA,MACP,OAAO;AAAA,MACP,sBAAsB;AAAA,MACtB,QAAQ,MAAS;AAAA;AAAA,MACjB,WAAW,KAAK;AAAA;AAAA,IAAA;AAAA,EAClB;AAEJ,CAAC,GAEKC,KAA6B,MAAM;AACvC,QAAM,EAAE,KAAA/F,EAAA,IAAQE,EAAA,GAGV8F,IADO1F,EAAY,CAACC,MAAqBA,EAAM,UAAU,IAAI,EACzC,SAAS;AAEnC,SACE,gBAAAW,EAACE,IAAA,EACE,UAAA,CAAC,EAAE,iBAAA6E,EAAA,MACF,gBAAA/E,EAACpB,IAAA,EACC,UAAA,gBAAAoB,EAAClB,GAAA,EAAI,UAAU,GAAG,eAAc,UAC7B,UAAAiG,KAAmB,CAACD,IAAe,gBAAA9E,EAAC2E,IAAA,CAAA,CAAW,IAAK,gBAAA3E,EAACsE,IAAA,CAAA,CAAO,EAAA,CAC/D,EAAA,CACF,EAAA,CAEJ;AAEJ,GAEMU,KAAsB,MAExB,gBAAAhF,EAACiF,IAAA,EACC,UAAA,gBAAAjF,EAACkF,IAAA,EAAS,OAAAC,IACR,UAAA,gBAAAnF,EAACoF,IAAA,EAAoB,QAAQ7E,IAC3B,UAAA,gBAAAP,EAAC6E,IAAA,EAAiB,EAAA,CACpB,GACF,GACF,GAISQ,KAAiB,YAAY;AAExC,QAAM,EAAE,QAAAC,EAAA,IAAW,MAAM,OAAO,KAAK,GAE/B,EAAE,eAAAC,EAAA,IAAkBD,EAAO,gBAAAtF,EAACgF,MAAU,GAAI;AAAA,IAC9C,OAAO,QAAQ;AAAA,IACf,QAAQ,QAAQ;AAAA,IAChB,QAAQ,QAAQ;AAAA,EAAA,CACjB;AACD,SAAOO,EAAA;AACT;"}
|
|
1
|
+
{"version":3,"file":"daemon.js","sources":["../src/systems/cli/apps/daemon/components/DaemonConnectionManager.tsx","../src/systems/cli/apps/daemon/guards/OauthSetup.tsx","../src/systems/cli/apps/daemon/components/AgentTabs.tsx","../src/systems/cli/apps/daemon/screens/Agents/index.tsx","../src/systems/cli/apps/daemon/screens/Onboarding/index.tsx","../src/systems/cli/apps/daemon/index.tsx"],"sourcesContent":["import { cliContainer } from '@cli/container';\nimport React, { useEffect, useRef } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport type { DaemonManager } from '@/services';\nimport type { AppDispatch } from '@/store';\nimport { RootState } from '@/store';\nimport { launchDaemon } from '@/store/slices/daemonStatusSlice';\nimport { GLOBAL_TYPES } from '@/types';\nimport { useInk } from '../../../contexts/InkContext';\nimport { clearShutdownCallback, setShutdownCallback } from '../../../services/StdinManager';\n\ninterface DaemonConnectionManagerProps {\n children: React.ReactNode;\n}\n\nexport const DaemonConnectionManager: React.FC<DaemonConnectionManagerProps> = ({ children }) => {\n const { Box, Text } = useInk();\n const dispatch = useDispatch<AppDispatch>();\n const status = useSelector((state: RootState) => state.daemonStatus.status);\n const error = useSelector((state: RootState) => state.daemonStatus.error);\n const isShuttingDown = useRef(false);\n\n useEffect(() => {\n dispatch(launchDaemon());\n\n // Register shutdown callback for Ctrl+C handling\n const handleShutdown = async () => {\n if (isShuttingDown.current) return;\n isShuttingDown.current = true;\n\n try {\n const daemonManager = cliContainer.get<DaemonManager>(GLOBAL_TYPES.DaemonManager);\n if (daemonManager.isRunning()) {\n await daemonManager.stop();\n }\n } catch {\n // Ignore errors during shutdown\n }\n // daemonManager.stop() calls process.exit() at the end\n };\n\n setShutdownCallback(handleShutdown);\n\n return () => {\n clearShutdownCallback();\n };\n }, [dispatch]);\n\n if (status === 'starting') {\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Text color=\"yellow\">Connecting to Agiflow...</Text>\n </Box>\n );\n }\n\n if (status === 'error') {\n return (\n <Box flexDirection=\"column\" padding={1} borderStyle=\"round\" borderColor=\"red\">\n <Text color=\"red\" bold>\n Connection Error\n </Text>\n <Text>{error}</Text>\n <Text dimColor>Retrying in background...</Text>\n </Box>\n );\n }\n\n if (status === 'connected') {\n return <>{children}</>;\n }\n\n return null;\n};\n","import { cliContainer } from '@cli/container';\nimport { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';\nimport React, { useCallback, useEffect, useRef, useState } from 'react';\nimport { CredentialsService, DeviceCodeAuthService, type DeviceCodeResponse, type OrganizationInfo } from '@/services';\nimport { GLOBAL_TYPES } from '@/types';\nimport { useInk } from '../../../contexts/InkContext';\n\ninterface OauthSetupProps {\n children: (props: { isAuthenticated: boolean }) => React.ReactNode;\n}\n\ntype AuthStatus =\n | 'checking'\n | 'requesting_code'\n | 'polling'\n | 'selecting_org'\n | 'exchanging'\n | 'authenticated'\n | 'error';\n\nexport const OauthSetup: React.FC<OauthSetupProps> = ({ children }) => {\n const { Box, Text, Newline, Static, Link, useInput } = useInk();\n const queryClient = useQueryClient();\n const [deviceCode, setDeviceCode] = useState<DeviceCodeResponse | null>(null);\n const [accessToken, setAccessToken] = useState<string | null>(null);\n const [organizations, setOrganizations] = useState<OrganizationInfo[]>([]);\n const [selectedOrgIndex, setSelectedOrgIndex] = useState(0);\n const [status, setStatus] = useState<AuthStatus>('checking');\n const [errorMessage, setErrorMessage] = useState<string>('');\n const abortControllerRef = useRef<AbortController | null>(null);\n\n // Get services from DI container\n const authService = cliContainer.get<DeviceCodeAuthService>(GLOBAL_TYPES.DeviceCodeAuthService);\n const credentialsService = cliContainer.get<CredentialsService>(GLOBAL_TYPES.CredentialsService);\n\n // Check existing authentication\n const { data: existingAuth, isLoading: isCheckingAuth } = useQuery({\n queryKey: ['auth', 'check'],\n queryFn: async () => {\n const creds = await credentialsService.load();\n if (creds && creds.apiKey && creds.expiresAt && authService.isTokenValid(creds.expiresAt)) {\n return { authenticated: true };\n }\n return { authenticated: false };\n },\n retry: false,\n });\n\n // Request device code\n const deviceCodeMutation = useMutation({\n mutationFn: async () => {\n setStatus('requesting_code');\n return authService.requestDeviceCode('openid profile email');\n },\n onSuccess: (data) => {\n setDeviceCode(data);\n setStatus('polling');\n pollTokenMutation.mutate(data);\n },\n onError: (error) => {\n setStatus('error');\n setErrorMessage(error instanceof Error ? error.message : 'Failed to request device code');\n },\n });\n\n // Poll for token - now just gets token and organizations, doesn't exchange yet\n const pollTokenMutation = useMutation({\n mutationFn: async (codeResponse: DeviceCodeResponse) => {\n abortControllerRef.current = new AbortController();\n\n // Poll for the access token\n const tokenResponse = await authService.pollForToken(codeResponse.device_code, codeResponse.interval || 5, {\n signal: abortControllerRef.current.signal,\n });\n\n // Get user's organizations\n const orgs = await authService.listOrganizations(tokenResponse.access_token);\n\n return { accessToken: tokenResponse.access_token, organizations: orgs };\n },\n onSuccess: (data) => {\n setAccessToken(data.accessToken);\n setOrganizations(data.organizations);\n\n if (data.organizations.length === 0) {\n setStatus('error');\n setErrorMessage('You have no organizations. Please create one first.');\n } else if (data.organizations.length === 1) {\n // Auto-select single org\n exchangeForAgentMutation.mutate({ accessToken: data.accessToken, organizationId: data.organizations[0].id });\n } else {\n // Show organization selection\n setStatus('selecting_org');\n }\n },\n onError: (error) => {\n setStatus('error');\n setErrorMessage(error instanceof Error ? error.message : 'Failed to poll for token');\n },\n });\n\n // Exchange token for agent API key\n const exchangeForAgentMutation = useMutation({\n mutationFn: async ({ accessToken, organizationId }: { accessToken: string; organizationId: string }) => {\n setStatus('exchanging');\n return authService.exchangeForAgentApiKey(accessToken, organizationId);\n },\n onSuccess: async (apiKeyToken) => {\n // Save to credentials.json\n await credentialsService.setApiKey({\n apiKey: apiKeyToken.api_key,\n organizationId: apiKeyToken.organization_id,\n expiresAt: apiKeyToken.expires_at,\n deviceId: apiKeyToken.device_id,\n });\n\n setStatus('authenticated');\n queryClient.invalidateQueries({ queryKey: ['auth', 'check'] });\n },\n onError: (error) => {\n setStatus('error');\n setErrorMessage(error instanceof Error ? error.message : 'Failed to exchange for agent API key');\n },\n });\n\n // Handle organization selection input\n const handleSelectOrg = useCallback(() => {\n if (accessToken && organizations[selectedOrgIndex]) {\n exchangeForAgentMutation.mutate({\n accessToken,\n organizationId: organizations[selectedOrgIndex].id,\n });\n }\n }, [accessToken, organizations, selectedOrgIndex, exchangeForAgentMutation]);\n\n // Keyboard input for organization selection\n useInput(\n (_input, key) => {\n if (status !== 'selecting_org') return;\n\n if (key.upArrow) {\n setSelectedOrgIndex((prev) => Math.max(0, prev - 1));\n } else if (key.downArrow) {\n setSelectedOrgIndex((prev) => Math.min(organizations.length - 1, prev + 1));\n } else if (key.return) {\n handleSelectOrg();\n }\n },\n { isActive: status === 'selecting_org' },\n );\n\n // Cleanup abort controller on unmount\n useEffect(() => {\n return () => {\n abortControllerRef.current?.abort();\n };\n }, []);\n\n // Trigger device code request when not authenticated\n useEffect(() => {\n if (existingAuth && !existingAuth.authenticated && status === 'checking' && !isCheckingAuth) {\n deviceCodeMutation.mutate();\n }\n }, [existingAuth, status, isCheckingAuth, deviceCodeMutation]);\n\n // Authenticated - render children\n if (existingAuth?.authenticated) {\n return <>{children({ isAuthenticated: true })}</>;\n }\n\n // Checking authentication\n if (isCheckingAuth) {\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">\n 🔐 Agiflow Authentication\n </Text>\n </Box>\n <Box borderStyle=\"round\" borderColor=\"cyan\" padding={1}>\n <Box flexDirection=\"column\">\n <Text>\n <Text color=\"cyan\">◉ </Text>\n <Text>Checking existing credentials...</Text>\n </Text>\n </Box>\n </Box>\n </Box>\n );\n }\n\n // Requesting device code\n if (deviceCodeMutation.isPending) {\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">\n 🔐 Agiflow Authentication\n </Text>\n </Box>\n <Box borderStyle=\"round\" borderColor=\"cyan\" padding={1}>\n <Box flexDirection=\"column\">\n <Text>\n <Text color=\"green\">✓ </Text>\n <Text dimColor>Checked existing credentials</Text>\n </Text>\n <Text>\n <Text color=\"cyan\">◉ </Text>\n <Text>Requesting device authorization...</Text>\n </Text>\n </Box>\n </Box>\n </Box>\n );\n }\n\n // Show authentication instructions with automatic polling\n // Only show this if we're still in polling status (not selecting_org or exchanging)\n if (deviceCode && status === 'polling') {\n const verificationUrl = `${deviceCode.verification_uri}?code=${encodeURIComponent(deviceCode.user_code)}`;\n\n return (\n <Static items={[1]}>\n {() => (\n <Box flexDirection=\"column\" padding={1}>\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">\n 🔐 Agiflow Authentication\n </Text>\n </Box>\n\n <Box borderStyle=\"round\" borderColor=\"green\" padding={1} marginBottom={1}>\n <Box flexDirection=\"column\">\n <Text>\n <Text color=\"green\">✓ </Text>\n <Text dimColor>Checked existing credentials</Text>\n </Text>\n <Text>\n <Text color=\"green\">✓ </Text>\n <Text dimColor>Device authorization requested</Text>\n </Text>\n <Text>\n <Text color=\"cyan\">◉ </Text>\n <Text bold>Polling for authorization...</Text>\n </Text>\n </Box>\n </Box>\n\n <Box borderStyle=\"double\" borderColor=\"yellow\" padding={1} marginBottom={1}>\n <Box flexDirection=\"column\">\n <Text bold color=\"yellow\">\n 📋 Authentication Steps:\n </Text>\n <Newline />\n\n <Text>\n <Text bold color=\"cyan\">\n 1.{' '}\n </Text>\n <Text>Open this URL in your browser:</Text>\n </Text>\n <Box paddingLeft={3} marginBottom={1}>\n <Link url={verificationUrl}>\n <Text color=\"blue\" bold>\n {verificationUrl}\n </Text>\n </Link>\n </Box>\n\n <Text>\n <Text bold color=\"cyan\">\n 2.{' '}\n </Text>\n <Text>Enter this verification code:</Text>\n </Text>\n <Box paddingLeft={3} marginBottom={1} borderStyle=\"single\" borderColor=\"green\" paddingX={2}>\n <Text color=\"green\" bold>\n {deviceCode.user_code}\n </Text>\n </Box>\n\n <Text>\n <Text bold color=\"cyan\">\n 3.{' '}\n </Text>\n <Text>Sign in and approve the device</Text>\n </Text>\n <Newline />\n\n <Text dimColor>The CLI will automatically detect when you approve the device.</Text>\n </Box>\n </Box>\n\n <Box borderStyle=\"round\" borderColor=\"gray\" padding={1} marginBottom={1}>\n <Box flexDirection=\"column\">\n <Text dimColor>⏱️ Expires in: {Math.floor(deviceCode.expires_in / 60)} minutes</Text>\n <Text dimColor>💡 Tip: The URL includes your verification code for convenience</Text>\n </Box>\n </Box>\n </Box>\n )}\n </Static>\n );\n }\n\n // Organization selection state\n if (status === 'selecting_org') {\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">\n 🔐 Agiflow Authentication\n </Text>\n </Box>\n\n <Box borderStyle=\"round\" borderColor=\"green\" padding={1} marginBottom={1}>\n <Box flexDirection=\"column\">\n <Text>\n <Text color=\"green\">✓ </Text>\n <Text dimColor>Device authorized successfully</Text>\n </Text>\n <Text>\n <Text color=\"cyan\">◉ </Text>\n <Text bold>Select an organization</Text>\n </Text>\n </Box>\n </Box>\n\n <Box borderStyle=\"double\" borderColor=\"yellow\" padding={1} marginBottom={1}>\n <Box flexDirection=\"column\">\n <Text bold color=\"yellow\">\n 📋 Select Organization:\n </Text>\n <Newline />\n {organizations.map((org, index) => (\n <Text key={org.id}>\n <Text color={index === selectedOrgIndex ? 'green' : 'gray'}>\n {index === selectedOrgIndex ? '❯ ' : ' '}\n </Text>\n <Text bold={index === selectedOrgIndex}>{org.name}</Text>\n <Text dimColor> ({org.slug})</Text>\n </Text>\n ))}\n <Newline />\n <Text dimColor>Use ↑/↓ arrows to navigate, Enter to select</Text>\n </Box>\n </Box>\n </Box>\n );\n }\n\n // Exchanging token state\n if (status === 'exchanging') {\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">\n 🔐 Agiflow Authentication\n </Text>\n </Box>\n <Box borderStyle=\"round\" borderColor=\"cyan\" padding={1}>\n <Box flexDirection=\"column\">\n <Text>\n <Text color=\"green\">✓ </Text>\n <Text dimColor>Device authorized</Text>\n </Text>\n <Text>\n <Text color=\"green\">✓ </Text>\n <Text dimColor>Organization selected</Text>\n </Text>\n <Text>\n <Text color=\"cyan\">◉ </Text>\n <Text>Creating agent credentials...</Text>\n </Text>\n </Box>\n </Box>\n </Box>\n );\n }\n\n // Error state\n if (status === 'error' || deviceCodeMutation.isError || pollTokenMutation.isError) {\n const mutationError = deviceCodeMutation.error || pollTokenMutation.error;\n const displayMessage = errorMessage || mutationError?.message || 'Unknown error occurred';\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Box marginBottom={1}>\n <Text bold color=\"red\">\n ❌ Authentication Error\n </Text>\n </Box>\n <Box borderStyle=\"round\" borderColor=\"red\" padding={1} marginBottom={1}>\n <Text color=\"red\">{displayMessage}</Text>\n </Box>\n <Box borderStyle=\"single\" borderColor=\"gray\" padding={1}>\n <Box flexDirection=\"column\">\n <Text dimColor>💡 Troubleshooting:</Text>\n <Text dimColor> • Check your internet connection</Text>\n <Text dimColor> • Verify the server URL is correct</Text>\n <Text dimColor> • Ensure the token is valid and not expired</Text>\n <Text dimColor> • Try running the daemon again</Text>\n <Newline />\n <Text dimColor>⌨️ Press Ctrl+C to exit</Text>\n </Box>\n </Box>\n </Box>\n );\n }\n\n // Default loading state\n return null;\n};\n","import React, { useMemo } from 'react';\nimport { shallowEqual, useSelector } from 'react-redux';\nimport type { AgentManager } from '@/services';\nimport { RootState } from '@/store';\nimport { GLOBAL_TYPES } from '@/types';\nimport { LaunchAgent } from '../../../components/LaunchAgent';\nimport { cliContainer } from '../../../container';\nimport { useInk } from '../../../contexts/InkContext';\nimport { AgentConfigService } from '../../../services/agent/AgentConfigService';\nimport { AGENT_TYPES } from '../../../types';\n\nconst isMacOS = process.platform === 'darwin';\n\ninterface TabIndicatorProps {\n tabId: string;\n}\n\ninterface TabItemProps {\n tabId: string;\n index: number;\n}\n\n/**\n * Memoized component to display unread count badge\n * Only re-renders when unreadCount or activeTabId changes for this specific tab\n */\nconst UnreadCount: React.FC<TabIndicatorProps> = React.memo(({ tabId }) => {\n const unreadCount = useSelector((state: RootState) => state.agentTabs.tabs.find((t) => t.id === tabId)?.unreadCount);\n const isActive = useSelector((state: RootState) => state.agentTabs.activeTabId === tabId);\n\n if (!unreadCount || unreadCount <= 0 || isActive) {\n return null;\n }\n\n return <> ({unreadCount})</>;\n});\n\nUnreadCount.displayName = 'UnreadCount';\n\n/**\n * Memoized component to display waiting input indicator (red dot)\n * Only re-renders when waitingInput or activeTabId changes for this specific tab\n */\nconst WaitingInputIndicator: React.FC<TabIndicatorProps> = React.memo(({ tabId }) => {\n const { Text } = useInk();\n const waitingInput = useSelector(\n (state: RootState) => state.agentTabs.tabs.find((t) => t.id === tabId)?.waitingInput,\n );\n const isActive = useSelector((state: RootState) => state.agentTabs.activeTabId === tabId);\n\n if (!waitingInput || isActive) {\n return null;\n }\n\n return <Text color=\"red\">● </Text>;\n});\n\nWaitingInputIndicator.displayName = 'WaitingInputIndicator';\n\n/**\n * Memoized component for individual tab rendering\n * Selects only the data it needs (id, label) to minimize re-renders\n */\nconst TabItem: React.FC<TabItemProps> = React.memo(({ tabId, index }) => {\n const { Box, Text } = useInk();\n const label = useSelector((state: RootState) => state.agentTabs.tabs.find((t) => t.id === tabId)?.label);\n const isActive = useSelector((state: RootState) => state.agentTabs.activeTabId === tabId);\n\n const fKeyLabel = `^F${index + 1}`;\n\n return (\n <Box marginRight={2} borderStyle={isActive ? 'round' : undefined}>\n <WaitingInputIndicator tabId={tabId} />\n <Text color={'#d1d5db'} bold={isActive} dimColor={!isActive}>\n [{fKeyLabel}] {label}\n <UnreadCount tabId={tabId} />\n </Text>\n <LaunchAgent tabId={tabId} />\n </Box>\n );\n});\n\nTabItem.displayName = 'TabItem';\n\nexport const AgentTabs: React.FC = () => {\n const { Box, Text } = useInk();\n // Only select tab IDs - won't re-render when other tab properties change\n const tabIds = useSelector((state: RootState) => state.agentTabs.tabs.map((t) => t.id), shallowEqual);\n const activeTabId = useSelector((state: RootState) => state.agentTabs.activeTabId);\n\n // Get the effective working directory for the active tab\n const activeWorkingDir = useMemo(() => {\n if (!activeTabId) return null;\n\n try {\n const agentManager = cliContainer.get<AgentManager>(GLOBAL_TYPES.AgentManager);\n const agentContainer = agentManager.getAgentContainer(activeTabId);\n\n if (agentContainer) {\n const agentConfigService = agentContainer.get<AgentConfigService>(AGENT_TYPES.AgentConfigService);\n return agentConfigService.getEffectiveWorkingDir();\n }\n } catch {\n // Container or service not available yet\n }\n\n return process.cwd();\n }, [activeTabId]);\n\n return (\n <Box flexDirection=\"column\" marginTop={1}>\n <Box alignItems=\"center\" borderTop borderTopColor={'#d1d5db'} borderDimColor>\n {tabIds.map((tabId, index) => (\n <TabItem key={tabId} tabId={tabId} index={index} />\n ))}\n </Box>\n {activeWorkingDir && <Text dimColor>{activeWorkingDir}</Text>}\n {isMacOS && <Text dimColor>Press fn + Shift + F[num] to switch tabs</Text>}\n </Box>\n );\n};\n","import React from 'react';\nimport { useSelector } from 'react-redux';\nimport { RootState } from '@/store';\nimport { StdinForwarder } from '@/systems/cli/components/StdinForwarder';\nimport { AgentView } from '../../../../components/AgentView';\nimport { BoxSizeMeasure } from '../../../../components/BoxSizeMeasure';\nimport { CAPermissionGuard } from '../../../../components/CAPermissionGuard';\nimport { useInk } from '../../../../contexts/InkContext';\nimport { AgentTabs } from '../../components/AgentTabs';\n\nexport const Agents: React.FC = () => {\n const { Box } = useInk();\n const activeTabId = useSelector((state: RootState) => state.agentTabs.activeTabId);\n // F-key tab switching is handled by StdinForwarder via escape sequences\n\n return (\n <Box flexDirection=\"column\" flexGrow={1}>\n <CAPermissionGuard>\n <AgentView key={activeTabId} />\n </CAPermissionGuard>\n <BoxSizeMeasure>\n <AgentTabs />\n </BoxSizeMeasure>\n <StdinForwarder />\n </Box>\n );\n};\n","import React from 'react';\nimport { useInk } from '../../../../contexts/InkContext';\n\nexport const Onboarding: React.FC = () => {\n const { Box, Text } = useInk();\n\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"green\" padding={1} flexGrow={1}>\n <Text bold color=\"green\">\n Welcome to Agent CLI Daemon!\n </Text>\n <Box marginTop={1}>\n <Text>It looks like you don't have any active agent sessions.</Text>\n </Box>\n <Box marginTop={1}>\n <Text>\n Please use the Agiflow UI Dashboard to start a{' '}\n <Text bold color=\"blue\">\n Project Plan\n </Text>\n ,{' '}\n <Text bold color=\"blue\">\n Work Unit\n </Text>\n , or{' '}\n <Text bold color=\"blue\">\n Task Chat\n </Text>{' '}\n to begin.\n </Text>\n </Box>\n <Box marginTop={1}>\n <Text dimColor>The Agiflow UI Dashboard can be accessed in your browser.</Text>\n </Box>\n </Box>\n );\n};\n","import 'reflect-metadata'; // Must be first import for InversifyJS\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query';\nimport React from 'react';\nimport { Provider, useSelector } from 'react-redux';\nimport { RootState, store } from '@/store';\nimport { InkProvider, useInk } from '../../contexts/InkContext';\nimport { DaemonConnectionManager } from './components/DaemonConnectionManager';\nimport { OauthSetup } from './guards/OauthSetup';\nimport { Agents } from './screens/Agents';\nimport { Onboarding } from './screens/Onboarding';\n\n// Create a client with memory management\nconst queryClient = new QueryClient({\n defaultOptions: {\n queries: {\n retry: false,\n refetchOnWindowFocus: false,\n gcTime: 5 * 60 * 1000, // Garbage collect unused queries after 5 minutes\n staleTime: 30 * 1000, // Consider data stale after 30 seconds\n },\n },\n});\n\nconst DaemonAppContent: React.FC = () => {\n const { Box } = useInk();\n\n const tabs = useSelector((state: RootState) => state.agentTabs.tabs);\n const hasAgentTabs = tabs.length > 0; // No dashboard, so any tab is an agent\n\n return (\n <OauthSetup>\n {({ isAuthenticated }) => (\n <DaemonConnectionManager>\n <Box flexGrow={1} flexDirection=\"column\">\n {isAuthenticated && !hasAgentTabs ? <Onboarding /> : <Agents />}\n </Box>\n </DaemonConnectionManager>\n )}\n </OauthSetup>\n );\n};\n\nconst DaemonApp: React.FC = () => {\n return (\n <InkProvider>\n <Provider store={store}>\n <QueryClientProvider client={queryClient}>\n <DaemonAppContent />\n </QueryClientProvider>\n </Provider>\n </InkProvider>\n );\n};\n\nexport const startDaemonApp = async () => {\n // Dynamically import Ink's render function to avoid top-level yoga-layout import\n const { render } = await import('ink');\n // Disable Ink's stdin handling - we use StdinManager instead\n const { waitUntilExit } = render(<DaemonApp />, {\n stdin: process.stdin,\n stdout: process.stdout,\n stderr: process.stderr,\n });\n return waitUntilExit();\n};\n"],"names":["DaemonConnectionManager","children","Box","Text","useInk","dispatch","useDispatch","status","useSelector","state","error","isShuttingDown","useRef","useEffect","launchDaemon","setShutdownCallback","daemonManager","cliContainer","GLOBAL_TYPES","clearShutdownCallback","jsx","jsxs","OauthSetup","Newline","Static","Link","useInput","queryClient","useQueryClient","deviceCode","setDeviceCode","useState","accessToken","setAccessToken","organizations","setOrganizations","selectedOrgIndex","setSelectedOrgIndex","setStatus","errorMessage","setErrorMessage","abortControllerRef","authService","credentialsService","existingAuth","isCheckingAuth","useQuery","creds","deviceCodeMutation","useMutation","data","pollTokenMutation","codeResponse","tokenResponse","orgs","exchangeForAgentMutation","organizationId","apiKeyToken","handleSelectOrg","useCallback","_input","key","prev","verificationUrl","org","index","mutationError","displayMessage","isMacOS","UnreadCount","React","tabId","unreadCount","t","isActive","Fragment","WaitingInputIndicator","waitingInput","TabItem","label","fKeyLabel","LaunchAgent","AgentTabs","tabIds","shallowEqual","activeTabId","activeWorkingDir","useMemo","agentContainer","AGENT_TYPES","Agents","CAPermissionGuard","AgentView","BoxSizeMeasure","StdinForwarder","Onboarding","QueryClient","DaemonAppContent","hasAgentTabs","isAuthenticated","DaemonApp","InkProvider","Provider","store","QueryClientProvider","startDaemonApp","render","waitUntilExit"],"mappings":"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"}
|