@agiflowai/agent-cli 0.2.9 → 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 CHANGED
@@ -1,5 +1,9 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.2.10
4
+ Fix:
5
+ - Fix environment parsing.
6
+
3
7
  ## 0.2.9
4
8
  Fix:
5
9
  - Fix headless mode.
@@ -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.7",
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.7",
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.7",
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
@@ -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.7",
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
@@ -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.7",
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.7",
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
@@ -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.7",
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 { bw as z, bm as H, bx as P, bn as M } from "./index-ajJXjmHz.mjs";
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 { bi as b, bj as V, bk as Y, bl as $, bm as S, bn as D, bo as X, bp as H, bq as J, br as Z, bs as ee, bt as re, bu as ne, bv as oe } from "./index-ajJXjmHz.mjs";
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 } = b(), c = de(), d = u((h) => h.daemonStatus.status), l = u((h) => h.daemonStatus.error), s = L(!1);
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 } = b(), h = ie(), [g, G] = C(null), [k, N] = C(null), [y, Q] = C([]), [p, O] = C(0), [f, m] = C("checking"), [j, A] = C(""), I = L(null), x = S.get(D.DeviceCodeAuthService), q = S.get(D.CredentialsService), { data: w, isLoading: B } = te({
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"), A(o instanceof Error ? o.message : "Failed to request device code");
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"), A("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");
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"), A(o instanceof Error ? o.message : "Failed to poll for token");
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"), A(o instanceof Error ? o.message : "Failed to exchange for agent API key");
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
- f === "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());
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: f === "selecting_org" }
77
+ { isActive: b === "selecting_org" }
78
78
  ), _(() => () => {
79
79
  I.current?.abort();
80
80
  }, []), _(() => {
81
- w && !w.authenticated && f === "checking" && !B && v.mutate();
82
- }, [w, f, B, v]), w?.authenticated)
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 (f === "selecting_org")
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 (f === "exchanging")
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 (f === "error" || v.isError || E.isError) {
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 } = b(), r = u(
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 } = b(), d = u((h) => h.agentTabs.tabs.find((g) => g.id === t)?.label), l = u((h) => h.agentTabs.activeTabId === t), s = `^F${n + 1}`;
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 } = b(), r = u((l) => l.agentTabs.tabs.map((s) => s.id), ae), c = u((l) => l.agentTabs.activeTabId), d = he(() => {
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 } = b(), n = u((r) => r.agentTabs.activeTabId);
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 } = b();
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 } = b(), r = u((c) => c.agentTabs.tabs).length > 0;
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, {}), {
@@ -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":"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"}
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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"}