diff --git a/src/components/DevBar.tsx b/src/components/DevBar.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..fd4c5ea145075052237a05a2014592bbb8d080e5
--- /dev/null
+++ b/src/components/DevBar.tsx
@@ -0,0 +1,49 @@
+import { c as _c } from "react/compiler-runtime";
+import * as React from 'react';
+import { useState } from 'react';
+import { getSlowOperations } from '../bootstrap/state.js';
+import { Text, useInterval } from '../ink.js';
+
+// Show DevBar for dev builds or all ants
+function shouldShowDevBar(): boolean {
+ return "production" === 'development' || "external" === 'ant';
+}
+export function DevBar() {
+ const $ = _c(5);
+ const [slowOps, setSlowOps] = useState(getSlowOperations);
+ let t0;
+ if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
+ t0 = () => {
+ setSlowOps(getSlowOperations());
+ };
+ $[0] = t0;
+ } else {
+ t0 = $[0];
+ }
+ useInterval(t0, shouldShowDevBar() ? 500 : null);
+ if (!shouldShowDevBar() || slowOps.length === 0) {
+ return null;
+ }
+ let t1;
+ if ($[1] !== slowOps) {
+ t1 = slowOps.slice(-3).map(_temp).join(" \xB7 ");
+ $[1] = slowOps;
+ $[2] = t1;
+ } else {
+ t1 = $[2];
+ }
+ const recentOps = t1;
+ let t2;
+ if ($[3] !== recentOps) {
+ t2 = [ANT-ONLY] slow sync: {recentOps};
+ $[3] = recentOps;
+ $[4] = t2;
+ } else {
+ t2 = $[4];
+ }
+ return t2;
+}
+function _temp(op) {
+ return `${op.operation} (${Math.round(op.durationMs)}ms)`;
+}
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsInVzZVN0YXRlIiwiZ2V0U2xvd09wZXJhdGlvbnMiLCJUZXh0IiwidXNlSW50ZXJ2YWwiLCJzaG91bGRTaG93RGV2QmFyIiwiRGV2QmFyIiwiJCIsIl9jIiwic2xvd09wcyIsInNldFNsb3dPcHMiLCJ0MCIsIlN5bWJvbCIsImZvciIsImxlbmd0aCIsInQxIiwic2xpY2UiLCJtYXAiLCJfdGVtcCIsImpvaW4iLCJyZWNlbnRPcHMiLCJ0MiIsIm9wIiwib3BlcmF0aW9uIiwiTWF0aCIsInJvdW5kIiwiZHVyYXRpb25NcyJdLCJzb3VyY2VzIjpbIkRldkJhci50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgeyB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgZ2V0U2xvd09wZXJhdGlvbnMgfSBmcm9tICcuLi9ib290c3RyYXAvc3RhdGUuanMnXG5pbXBvcnQgeyBUZXh0LCB1c2VJbnRlcnZhbCB9IGZyb20gJy4uL2luay5qcydcblxuLy8gU2hvdyBEZXZCYXIgZm9yIGRldiBidWlsZHMgb3IgYWxsIGFudHNcbmZ1bmN0aW9uIHNob3VsZFNob3dEZXZCYXIoKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgXCJwcm9kdWN0aW9uXCIgPT09ICdkZXZlbG9wbWVudCcgfHwgXCJleHRlcm5hbFwiID09PSAnYW50J1xuICApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBEZXZCYXIoKTogUmVhY3QuUmVhY3ROb2RlIHtcbiAgY29uc3QgW3Nsb3dPcHMsIHNldFNsb3dPcHNdID1cbiAgICB1c2VTdGF0ZTxcbiAgICAgIFJlYWRvbmx5QXJyYXk8e1xuICAgICAgICBvcGVyYXRpb246IHN0cmluZ1xuICAgICAgICBkdXJhdGlvbk1zOiBudW1iZXJcbiAgICAgICAgdGltZXN0YW1wOiBudW1iZXJcbiAgICAgIH0+XG4gICAgPihnZXRTbG93T3BlcmF0aW9ucylcblxuICB1c2VJbnRlcnZhbChcbiAgICAoKSA9PiB7XG4gICAgICBzZXRTbG93T3BzKGdldFNsb3dPcGVyYXRpb25zKCkpXG4gICAgfSxcbiAgICBzaG91bGRTaG93RGV2QmFyKCkgPyA1MDAgOiBudWxsLFxuICApXG5cbiAgLy8gT25seSBzaG93IHdoZW4gdGhlcmUncyBzb21ldGhpbmcgdG8gZGlzcGxheVxuICBpZiAoIXNob3VsZFNob3dEZXZCYXIoKSB8fCBzbG93T3BzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICAvLyBTaW5nbGUtbGluZSBmb3JtYXQgc28gc2hvcnQgdGVybWluYWxzIGRvbid0IGxvc2Ugcm93cyB0byBkZXYgbm9pc2UuXG4gIGNvbnN0IHJlY2VudE9wcyA9IHNsb3dPcHNcbiAgICAuc2xpY2UoLTMpXG4gICAgLm1hcChvcCA9PiBgJHtvcC5vcGVyYXRpb259ICgke01hdGgucm91bmQob3AuZHVyYXRpb25Ncyl9bXMpYClcbiAgICAuam9pbignIMK3ICcpXG5cbiAgcmV0dXJuIChcbiAgICA8VGV4dCB3cmFwPVwidHJ1bmNhdGUtZW5kXCIgY29sb3I9XCJ3YXJuaW5nXCI+XG4gICAgICBbQU5ULU9OTFldIHNsb3cgc3luYzoge3JlY2VudE9wc31cbiAgICA8L1RleHQ+XG4gIClcbn1cbiJdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sS0FBS0EsS0FBSyxNQUFNLE9BQU87QUFDOUIsU0FBU0MsUUFBUSxRQUFRLE9BQU87QUFDaEMsU0FBU0MsaUJBQWlCLFFBQVEsdUJBQXVCO0FBQ3pELFNBQVNDLElBQUksRUFBRUMsV0FBVyxRQUFRLFdBQVc7O0FBRTdDO0FBQ0EsU0FBU0MsZ0JBQWdCQSxDQUFBLENBQUUsRUFBRSxPQUFPLENBQUM7RUFDbkMsT0FDRSxZQUFZLEtBQUssYUFBYSxJQUFJLFVBQVUsS0FBSyxLQUFLO0FBRTFEO0FBRUEsT0FBTyxTQUFBQyxPQUFBO0VBQUEsTUFBQUMsQ0FBQSxHQUFBQyxFQUFBO0VBQ0wsT0FBQUMsT0FBQSxFQUFBQyxVQUFBLElBQ0VULFFBQVEsQ0FNTkMsaUJBQWlCLENBQUM7RUFBQSxJQUFBUyxFQUFBO0VBQUEsSUFBQUosQ0FBQSxRQUFBSyxNQUFBLENBQUFDLEdBQUE7SUFHcEJGLEVBQUEsR0FBQUEsQ0FBQTtNQUNFRCxVQUFVLENBQUNSLGlCQUFpQixDQUFDLENBQUMsQ0FBQztJQUFBLENBQ2hDO0lBQUFLLENBQUEsTUFBQUksRUFBQTtFQUFBO0lBQUFBLEVBQUEsR0FBQUosQ0FBQTtFQUFBO0VBSEhILFdBQVcsQ0FDVE8sRUFFQyxFQUNETixnQkFBZ0IsQ0FBYyxDQUFDLEdBQS9CLEdBQStCLEdBQS9CLElBQ0YsQ0FBQztFQUdELElBQUksQ0FBQ0EsZ0JBQWdCLENBQUMsQ0FBeUIsSUFBcEJJLE9BQU8sQ0FBQUssTUFBTyxLQUFLLENBQUM7SUFBQSxPQUN0QyxJQUFJO0VBQUE7RUFDWixJQUFBQyxFQUFBO0VBQUEsSUFBQVIsQ0FBQSxRQUFBRSxPQUFBO0lBR2lCTSxFQUFBLEdBQUFOLE9BQU8sQ0FBQU8sS0FDakIsQ0FBQyxFQUFFLENBQUMsQ0FBQUMsR0FDTixDQUFDQyxLQUF3RCxDQUFDLENBQUFDLElBQ3pELENBQUMsUUFBSyxDQUFDO0lBQUFaLENBQUEsTUFBQUUsT0FBQTtJQUFBRixDQUFBLE1BQUFRLEVBQUE7RUFBQTtJQUFBQSxFQUFBLEdBQUFSLENBQUE7RUFBQTtFQUhkLE1BQUFhLFNBQUEsR0FBa0JMLEVBR0o7RUFBQSxJQUFBTSxFQUFBO0VBQUEsSUFBQWQsQ0FBQSxRQUFBYSxTQUFBO0lBR1pDLEVBQUEsSUFBQyxJQUFJLENBQU0sSUFBYyxDQUFkLGNBQWMsQ0FBTyxLQUFTLENBQVQsU0FBUyxDQUFDLHNCQUNqQkQsVUFBUSxDQUNqQyxFQUZDLElBQUksQ0FFRTtJQUFBYixDQUFBLE1BQUFhLFNBQUE7SUFBQWIsQ0FBQSxNQUFBYyxFQUFBO0VBQUE7SUFBQUEsRUFBQSxHQUFBZCxDQUFBO0VBQUE7RUFBQSxPQUZQYyxFQUVPO0FBQUE7QUEvQkosU0FBQUgsTUFBQUksRUFBQTtFQUFBLE9BeUJRLEdBQUdBLEVBQUUsQ0FBQUMsU0FBVSxLQUFLQyxJQUFJLENBQUFDLEtBQU0sQ0FBQ0gsRUFBRSxDQUFBSSxVQUFXLENBQUMsS0FBSztBQUFBIiwiaWdub3JlTGlzdCI6W119
\ No newline at end of file
diff --git a/src/components/TaskListV2.tsx b/src/components/TaskListV2.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..addc083d1506c084c29896c8cf1bcca29f2c4fcc
--- /dev/null
+++ b/src/components/TaskListV2.tsx
@@ -0,0 +1,378 @@
+import { c as _c } from "react/compiler-runtime";
+import figures from 'figures';
+import * as React from 'react';
+import { useTerminalSize } from '../hooks/useTerminalSize.js';
+import { stringWidth } from '../ink/stringWidth.js';
+import { Box, Text } from '../ink.js';
+import { useAppState } from '../state/AppState.js';
+import { isInProcessTeammateTask } from '../tasks/InProcessTeammateTask/types.js';
+import { AGENT_COLOR_TO_THEME_COLOR, type AgentColorName } from '../tools/AgentTool/agentColorManager.js';
+import { isAgentSwarmsEnabled } from '../utils/agentSwarmsEnabled.js';
+import { count } from '../utils/array.js';
+import { summarizeRecentActivities } from '../utils/collapseReadSearch.js';
+import { truncateToWidth } from '../utils/format.js';
+import { isTodoV2Enabled, type Task } from '../utils/tasks.js';
+import type { Theme } from '../utils/theme.js';
+import ThemedText from './design-system/ThemedText.js';
+type Props = {
+ tasks: Task[];
+ isStandalone?: boolean;
+};
+const RECENT_COMPLETED_TTL_MS = 30_000;
+function byIdAsc(a: Task, b: Task): number {
+ const aNum = parseInt(a.id, 10);
+ const bNum = parseInt(b.id, 10);
+ if (!isNaN(aNum) && !isNaN(bNum)) {
+ return aNum - bNum;
+ }
+ return a.id.localeCompare(b.id);
+}
+export function TaskListV2({
+ tasks,
+ isStandalone = false
+}: Props): React.ReactNode {
+ const teamContext = useAppState(s => s.teamContext);
+ const appStateTasks = useAppState(s_0 => s_0.tasks);
+ const [, forceUpdate] = React.useState(0);
+ const {
+ rows,
+ columns
+ } = useTerminalSize();
+
+ // Track when each task was last observed transitioning to completed
+ const completionTimestampsRef = React.useRef(new Map());
+ const previousCompletedIdsRef = React.useRef | null>(null);
+ if (previousCompletedIdsRef.current === null) {
+ previousCompletedIdsRef.current = new Set(tasks.filter(t => t.status === 'completed').map(t_0 => t_0.id));
+ }
+ const maxDisplay = rows <= 10 ? 0 : Math.min(10, Math.max(3, rows - 14));
+
+ // Update completion timestamps: reset when a task transitions to completed
+ const currentCompletedIds = new Set(tasks.filter(t_1 => t_1.status === 'completed').map(t_2 => t_2.id));
+ const now = Date.now();
+ for (const id of currentCompletedIds) {
+ if (!previousCompletedIdsRef.current.has(id)) {
+ completionTimestampsRef.current.set(id, now);
+ }
+ }
+ for (const id_0 of completionTimestampsRef.current.keys()) {
+ if (!currentCompletedIds.has(id_0)) {
+ completionTimestampsRef.current.delete(id_0);
+ }
+ }
+ previousCompletedIdsRef.current = currentCompletedIds;
+
+ // Schedule re-render when the next recent completion expires.
+ // Depend on `tasks` so the timer is only reset when the task list changes,
+ // not on every render (which was causing unnecessary work).
+ React.useEffect(() => {
+ if (completionTimestampsRef.current.size === 0) {
+ return;
+ }
+ const currentNow = Date.now();
+ let earliestExpiry = Infinity;
+ for (const ts of completionTimestampsRef.current.values()) {
+ const expiry = ts + RECENT_COMPLETED_TTL_MS;
+ if (expiry > currentNow && expiry < earliestExpiry) {
+ earliestExpiry = expiry;
+ }
+ }
+ if (earliestExpiry === Infinity) {
+ return;
+ }
+ const timer = setTimeout(forceUpdate_0 => forceUpdate_0((n: number) => n + 1), earliestExpiry - currentNow, forceUpdate);
+ return () => clearTimeout(timer);
+ }, [tasks]);
+ if (!isTodoV2Enabled()) {
+ return null;
+ }
+ if (tasks.length === 0) {
+ return null;
+ }
+
+ // Build a map of teammate name -> theme color
+ const teammateColors: Record = {};
+ if (isAgentSwarmsEnabled() && teamContext?.teammates) {
+ for (const teammate of Object.values(teamContext.teammates)) {
+ if (teammate.color) {
+ const themeColor = AGENT_COLOR_TO_THEME_COLOR[teammate.color as AgentColorName];
+ if (themeColor) {
+ teammateColors[teammate.name] = themeColor;
+ }
+ }
+ }
+ }
+
+ // Build a map of teammate name -> current activity description
+ // Map both agentName ("researcher") and agentId ("researcher@team") so
+ // task owners match regardless of which format the model used.
+ // Rolls up consecutive search/read tool uses into a compact summary.
+ // Also track which teammates are still running (not shut down).
+ const teammateActivity: Record = {};
+ const activeTeammates = new Set();
+ if (isAgentSwarmsEnabled()) {
+ for (const bgTask of Object.values(appStateTasks)) {
+ if (isInProcessTeammateTask(bgTask) && bgTask.status === 'running') {
+ activeTeammates.add(bgTask.identity.agentName);
+ activeTeammates.add(bgTask.identity.agentId);
+ const activities = bgTask.progress?.recentActivities;
+ const desc = (activities && summarizeRecentActivities(activities)) ?? bgTask.progress?.lastActivity?.activityDescription;
+ if (desc) {
+ teammateActivity[bgTask.identity.agentName] = desc;
+ teammateActivity[bgTask.identity.agentId] = desc;
+ }
+ }
+ }
+ }
+
+ // Get task counts for display
+ const completedCount = count(tasks, t_3 => t_3.status === 'completed');
+ const pendingCount = count(tasks, t_4 => t_4.status === 'pending');
+ const inProgressCount = tasks.length - completedCount - pendingCount;
+ // Unresolved tasks (open or in_progress) block dependent tasks
+ const unresolvedTaskIds = new Set(tasks.filter(t_5 => t_5.status !== 'completed').map(t_6 => t_6.id));
+
+ // Check if we need to truncate
+ const needsTruncation = tasks.length > maxDisplay;
+ let visibleTasks: Task[];
+ let hiddenTasks: Task[];
+ if (needsTruncation) {
+ // Prioritize: recently completed (within 30s), in-progress, pending, older completed
+ const recentCompleted: Task[] = [];
+ const olderCompleted: Task[] = [];
+ for (const task of tasks.filter(t_7 => t_7.status === 'completed')) {
+ const ts_0 = completionTimestampsRef.current.get(task.id);
+ if (ts_0 && now - ts_0 < RECENT_COMPLETED_TTL_MS) {
+ recentCompleted.push(task);
+ } else {
+ olderCompleted.push(task);
+ }
+ }
+ recentCompleted.sort(byIdAsc);
+ olderCompleted.sort(byIdAsc);
+ const inProgress = tasks.filter(t_8 => t_8.status === 'in_progress').sort(byIdAsc);
+ const pending = tasks.filter(t_9 => t_9.status === 'pending').sort((a, b) => {
+ const aBlocked = a.blockedBy.some(id_1 => unresolvedTaskIds.has(id_1));
+ const bBlocked = b.blockedBy.some(id_2 => unresolvedTaskIds.has(id_2));
+ if (aBlocked !== bBlocked) {
+ return aBlocked ? 1 : -1;
+ }
+ return byIdAsc(a, b);
+ });
+ const prioritized = [...recentCompleted, ...inProgress, ...pending, ...olderCompleted];
+ visibleTasks = prioritized.slice(0, maxDisplay);
+ hiddenTasks = prioritized.slice(maxDisplay);
+ } else {
+ // No truncation needed — sort by ID for stable ordering
+ visibleTasks = [...tasks].sort(byIdAsc);
+ hiddenTasks = [];
+ }
+ let hiddenSummary = '';
+ if (hiddenTasks.length > 0) {
+ const parts: string[] = [];
+ const hiddenPending = count(hiddenTasks, t_10 => t_10.status === 'pending');
+ const hiddenInProgress = count(hiddenTasks, t_11 => t_11.status === 'in_progress');
+ const hiddenCompleted = count(hiddenTasks, t_12 => t_12.status === 'completed');
+ if (hiddenInProgress > 0) {
+ parts.push(`${hiddenInProgress} in progress`);
+ }
+ if (hiddenPending > 0) {
+ parts.push(`${hiddenPending} pending`);
+ }
+ if (hiddenCompleted > 0) {
+ parts.push(`${hiddenCompleted} completed`);
+ }
+ hiddenSummary = ` … +${parts.join(', ')}`;
+ }
+ const content = <>
+ {visibleTasks.map(task_0 => unresolvedTaskIds.has(id_3))} activity={task_0.owner ? teammateActivity[task_0.owner] : undefined} ownerActive={task_0.owner ? activeTeammates.has(task_0.owner) : false} columns={columns} />)}
+ {maxDisplay > 0 && hiddenSummary && {hiddenSummary}}
+ >;
+ if (isStandalone) {
+ return
+
+
+ {tasks.length}
+ {' tasks ('}
+ {completedCount}
+ {' done, '}
+ {inProgressCount > 0 && <>
+ {inProgressCount}
+ {' in progress, '}
+ >}
+ {pendingCount}
+ {' open)'}
+
+
+ {content}
+ ;
+ }
+ return {content};
+}
+type TaskItemProps = {
+ task: Task;
+ ownerColor?: keyof Theme;
+ openBlockers: string[];
+ activity?: string;
+ ownerActive: boolean;
+ columns: number;
+};
+function getTaskIcon(status: Task['status']): {
+ icon: string;
+ color: keyof Theme | undefined;
+} {
+ switch (status) {
+ case 'completed':
+ return {
+ icon: figures.tick,
+ color: 'success'
+ };
+ case 'in_progress':
+ return {
+ icon: figures.squareSmallFilled,
+ color: 'claude'
+ };
+ case 'pending':
+ return {
+ icon: figures.squareSmall,
+ color: undefined
+ };
+ }
+}
+function TaskItem(t0) {
+ const $ = _c(37);
+ const {
+ task,
+ ownerColor,
+ openBlockers,
+ activity,
+ ownerActive,
+ columns
+ } = t0;
+ const isCompleted = task.status === "completed";
+ const isInProgress = task.status === "in_progress";
+ const isBlocked = openBlockers.length > 0;
+ let t1;
+ if ($[0] !== task.status) {
+ t1 = getTaskIcon(task.status);
+ $[0] = task.status;
+ $[1] = t1;
+ } else {
+ t1 = $[1];
+ }
+ const {
+ icon,
+ color
+ } = t1;
+ const showActivity = isInProgress && !isBlocked && activity;
+ const showOwner = columns >= 60 && task.owner && ownerActive;
+ let t2;
+ if ($[2] !== showOwner || $[3] !== task.owner) {
+ t2 = showOwner ? stringWidth(` (@${task.owner})`) : 0;
+ $[2] = showOwner;
+ $[3] = task.owner;
+ $[4] = t2;
+ } else {
+ t2 = $[4];
+ }
+ const ownerWidth = t2;
+ const maxSubjectWidth = Math.max(15, columns - 15 - ownerWidth);
+ let t3;
+ if ($[5] !== maxSubjectWidth || $[6] !== task.subject) {
+ t3 = truncateToWidth(task.subject, maxSubjectWidth);
+ $[5] = maxSubjectWidth;
+ $[6] = task.subject;
+ $[7] = t3;
+ } else {
+ t3 = $[7];
+ }
+ const displaySubject = t3;
+ const maxActivityWidth = Math.max(15, columns - 15);
+ let t4;
+ if ($[8] !== activity || $[9] !== maxActivityWidth) {
+ t4 = activity ? truncateToWidth(activity, maxActivityWidth) : undefined;
+ $[8] = activity;
+ $[9] = maxActivityWidth;
+ $[10] = t4;
+ } else {
+ t4 = $[10];
+ }
+ const displayActivity = t4;
+ let t5;
+ if ($[11] !== color || $[12] !== icon) {
+ t5 = {icon} ;
+ $[11] = color;
+ $[12] = icon;
+ $[13] = t5;
+ } else {
+ t5 = $[13];
+ }
+ const t6 = isCompleted || isBlocked;
+ let t7;
+ if ($[14] !== displaySubject || $[15] !== isCompleted || $[16] !== isInProgress || $[17] !== t6) {
+ t7 = {displaySubject};
+ $[14] = displaySubject;
+ $[15] = isCompleted;
+ $[16] = isInProgress;
+ $[17] = t6;
+ $[18] = t7;
+ } else {
+ t7 = $[18];
+ }
+ let t8;
+ if ($[19] !== ownerColor || $[20] !== showOwner || $[21] !== task.owner) {
+ t8 = showOwner && {" ("}{ownerColor ? @{task.owner} : `@${task.owner}`}{")"};
+ $[19] = ownerColor;
+ $[20] = showOwner;
+ $[21] = task.owner;
+ $[22] = t8;
+ } else {
+ t8 = $[22];
+ }
+ let t9;
+ if ($[23] !== isBlocked || $[24] !== openBlockers) {
+ t9 = isBlocked && {" "}{figures.pointerSmall} blocked by{" "}{[...openBlockers].sort(_temp).map(_temp2).join(", ")};
+ $[23] = isBlocked;
+ $[24] = openBlockers;
+ $[25] = t9;
+ } else {
+ t9 = $[25];
+ }
+ let t10;
+ if ($[26] !== t5 || $[27] !== t7 || $[28] !== t8 || $[29] !== t9) {
+ t10 = {t5}{t7}{t8}{t9};
+ $[26] = t5;
+ $[27] = t7;
+ $[28] = t8;
+ $[29] = t9;
+ $[30] = t10;
+ } else {
+ t10 = $[30];
+ }
+ let t11;
+ if ($[31] !== displayActivity || $[32] !== showActivity) {
+ t11 = showActivity && displayActivity && {" "}{displayActivity}{figures.ellipsis};
+ $[31] = displayActivity;
+ $[32] = showActivity;
+ $[33] = t11;
+ } else {
+ t11 = $[33];
+ }
+ let t12;
+ if ($[34] !== t10 || $[35] !== t11) {
+ t12 = {t10}{t11};
+ $[34] = t10;
+ $[35] = t11;
+ $[36] = t12;
+ } else {
+ t12 = $[36];
+ }
+ return t12;
+}
+function _temp2(id) {
+ return `#${id}`;
+}
+function _temp(a, b) {
+ return parseInt(a, 10) - parseInt(b, 10);
+}
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJmaWd1cmVzIiwiUmVhY3QiLCJ1c2VUZXJtaW5hbFNpemUiLCJzdHJpbmdXaWR0aCIsIkJveCIsIlRleHQiLCJ1c2VBcHBTdGF0ZSIsImlzSW5Qcm9jZXNzVGVhbW1hdGVUYXNrIiwiQUdFTlRfQ09MT1JfVE9fVEhFTUVfQ09MT1IiLCJBZ2VudENvbG9yTmFtZSIsImlzQWdlbnRTd2FybXNFbmFibGVkIiwiY291bnQiLCJzdW1tYXJpemVSZWNlbnRBY3Rpdml0aWVzIiwidHJ1bmNhdGVUb1dpZHRoIiwiaXNUb2RvVjJFbmFibGVkIiwiVGFzayIsIlRoZW1lIiwiVGhlbWVkVGV4dCIsIlByb3BzIiwidGFza3MiLCJpc1N0YW5kYWxvbmUiLCJSRUNFTlRfQ09NUExFVEVEX1RUTF9NUyIsImJ5SWRBc2MiLCJhIiwiYiIsImFOdW0iLCJwYXJzZUludCIsImlkIiwiYk51bSIsImlzTmFOIiwibG9jYWxlQ29tcGFyZSIsIlRhc2tMaXN0VjIiLCJSZWFjdE5vZGUiLCJ0ZWFtQ29udGV4dCIsInMiLCJhcHBTdGF0ZVRhc2tzIiwiZm9yY2VVcGRhdGUiLCJ1c2VTdGF0ZSIsInJvd3MiLCJjb2x1bW5zIiwiY29tcGxldGlvblRpbWVzdGFtcHNSZWYiLCJ1c2VSZWYiLCJNYXAiLCJwcmV2aW91c0NvbXBsZXRlZElkc1JlZiIsIlNldCIsImN1cnJlbnQiLCJmaWx0ZXIiLCJ0Iiwic3RhdHVzIiwibWFwIiwibWF4RGlzcGxheSIsIk1hdGgiLCJtaW4iLCJtYXgiLCJjdXJyZW50Q29tcGxldGVkSWRzIiwibm93IiwiRGF0ZSIsImhhcyIsInNldCIsImtleXMiLCJkZWxldGUiLCJ1c2VFZmZlY3QiLCJzaXplIiwiY3VycmVudE5vdyIsImVhcmxpZXN0RXhwaXJ5IiwiSW5maW5pdHkiLCJ0cyIsInZhbHVlcyIsImV4cGlyeSIsInRpbWVyIiwic2V0VGltZW91dCIsIm4iLCJjbGVhclRpbWVvdXQiLCJsZW5ndGgiLCJ0ZWFtbWF0ZUNvbG9ycyIsIlJlY29yZCIsInRlYW1tYXRlcyIsInRlYW1tYXRlIiwiT2JqZWN0IiwiY29sb3IiLCJ0aGVtZUNvbG9yIiwibmFtZSIsInRlYW1tYXRlQWN0aXZpdHkiLCJhY3RpdmVUZWFtbWF0ZXMiLCJiZ1Rhc2siLCJhZGQiLCJpZGVudGl0eSIsImFnZW50TmFtZSIsImFnZW50SWQiLCJhY3Rpdml0aWVzIiwicHJvZ3Jlc3MiLCJyZWNlbnRBY3Rpdml0aWVzIiwiZGVzYyIsImxhc3RBY3Rpdml0eSIsImFjdGl2aXR5RGVzY3JpcHRpb24iLCJjb21wbGV0ZWRDb3VudCIsInBlbmRpbmdDb3VudCIsImluUHJvZ3Jlc3NDb3VudCIsInVucmVzb2x2ZWRUYXNrSWRzIiwibmVlZHNUcnVuY2F0aW9uIiwidmlzaWJsZVRhc2tzIiwiaGlkZGVuVGFza3MiLCJyZWNlbnRDb21wbGV0ZWQiLCJvbGRlckNvbXBsZXRlZCIsInRhc2siLCJnZXQiLCJwdXNoIiwic29ydCIsImluUHJvZ3Jlc3MiLCJwZW5kaW5nIiwiYUJsb2NrZWQiLCJibG9ja2VkQnkiLCJzb21lIiwiYkJsb2NrZWQiLCJwcmlvcml0aXplZCIsInNsaWNlIiwiaGlkZGVuU3VtbWFyeSIsInBhcnRzIiwiaGlkZGVuUGVuZGluZyIsImhpZGRlbkluUHJvZ3Jlc3MiLCJoaWRkZW5Db21wbGV0ZWQiLCJqb2luIiwiY29udGVudCIsIm93bmVyIiwidW5kZWZpbmVkIiwiVGFza0l0ZW1Qcm9wcyIsIm93bmVyQ29sb3IiLCJvcGVuQmxvY2tlcnMiLCJhY3Rpdml0eSIsIm93bmVyQWN0aXZlIiwiZ2V0VGFza0ljb24iLCJpY29uIiwidGljayIsInNxdWFyZVNtYWxsRmlsbGVkIiwic3F1YXJlU21hbGwiLCJUYXNrSXRlbSIsInQwIiwiJCIsIl9jIiwiaXNDb21wbGV0ZWQiLCJpc0luUHJvZ3Jlc3MiLCJpc0Jsb2NrZWQiLCJ0MSIsInNob3dBY3Rpdml0eSIsInNob3dPd25lciIsInQyIiwib3duZXJXaWR0aCIsIm1heFN1YmplY3RXaWR0aCIsInQzIiwic3ViamVjdCIsImRpc3BsYXlTdWJqZWN0IiwibWF4QWN0aXZpdHlXaWR0aCIsInQ0IiwiZGlzcGxheUFjdGl2aXR5IiwidDUiLCJ0NiIsInQ3IiwidDgiLCJ0OSIsInBvaW50ZXJTbWFsbCIsIl90ZW1wIiwiX3RlbXAyIiwidDEwIiwidDExIiwiZWxsaXBzaXMiLCJ0MTIiXSwic291cmNlcyI6WyJUYXNrTGlzdFYyLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZmlndXJlcyBmcm9tICdmaWd1cmVzJ1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgeyB1c2VUZXJtaW5hbFNpemUgfSBmcm9tICcuLi9ob29rcy91c2VUZXJtaW5hbFNpemUuanMnXG5pbXBvcnQgeyBzdHJpbmdXaWR0aCB9IGZyb20gJy4uL2luay9zdHJpbmdXaWR0aC5qcydcbmltcG9ydCB7IEJveCwgVGV4dCB9IGZyb20gJy4uL2luay5qcydcbmltcG9ydCB7IHVzZUFwcFN0YXRlIH0gZnJvbSAnLi4vc3RhdGUvQXBwU3RhdGUuanMnXG5pbXBvcnQgeyBpc0luUHJvY2Vzc1RlYW1tYXRlVGFzayB9IGZyb20gJy4uL3Rhc2tzL0luUHJvY2Vzc1RlYW1tYXRlVGFzay90eXBlcy5qcydcbmltcG9ydCB7XG4gIEFHRU5UX0NPTE9SX1RPX1RIRU1FX0NPTE9SLFxuICB0eXBlIEFnZW50Q29sb3JOYW1lLFxufSBmcm9tICcuLi90b29scy9BZ2VudFRvb2wvYWdlbnRDb2xvck1hbmFnZXIuanMnXG5pbXBvcnQgeyBpc0FnZW50U3dhcm1zRW5hYmxlZCB9IGZyb20gJy4uL3V0aWxzL2FnZW50U3dhcm1zRW5hYmxlZC5qcydcbmltcG9ydCB7IGNvdW50IH0gZnJvbSAnLi4vdXRpbHMvYXJyYXkuanMnXG5pbXBvcnQgeyBzdW1tYXJpemVSZWNlbnRBY3Rpdml0aWVzIH0gZnJvbSAnLi4vdXRpbHMvY29sbGFwc2VSZWFkU2VhcmNoLmpzJ1xuaW1wb3J0IHsgdHJ1bmNhdGVUb1dpZHRoIH0gZnJvbSAnLi4vdXRpbHMvZm9ybWF0LmpzJ1xuaW1wb3J0IHsgaXNUb2RvVjJFbmFibGVkLCB0eXBlIFRhc2sgfSBmcm9tICcuLi91dGlscy90YXNrcy5qcydcbmltcG9ydCB0eXBlIHsgVGhlbWUgfSBmcm9tICcuLi91dGlscy90aGVtZS5qcydcbmltcG9ydCBUaGVtZWRUZXh0IGZyb20gJy4vZGVzaWduLXN5c3RlbS9UaGVtZWRUZXh0LmpzJ1xuXG50eXBlIFByb3BzID0ge1xuICB0YXNrczogVGFza1tdXG4gIGlzU3RhbmRhbG9uZT86IGJvb2xlYW5cbn1cblxuY29uc3QgUkVDRU5UX0NPTVBMRVRFRF9UVExfTVMgPSAzMF8wMDBcblxuZnVuY3Rpb24gYnlJZEFzYyhhOiBUYXNrLCBiOiBUYXNrKTogbnVtYmVyIHtcbiAgY29uc3QgYU51bSA9IHBhcnNlSW50KGEuaWQsIDEwKVxuICBjb25zdCBiTnVtID0gcGFyc2VJbnQoYi5pZCwgMTApXG4gIGlmICghaXNOYU4oYU51bSkgJiYgIWlzTmFOKGJOdW0pKSB7XG4gICAgcmV0dXJuIGFOdW0gLSBiTnVtXG4gIH1cbiAgcmV0dXJuIGEuaWQubG9jYWxlQ29tcGFyZShiLmlkKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gVGFza0xpc3RWMih7XG4gIHRhc2tzLFxuICBpc1N0YW5kYWxvbmUgPSBmYWxzZSxcbn06IFByb3BzKTogUmVhY3QuUmVhY3ROb2RlIHtcbiAgY29uc3QgdGVhbUNvbnRleHQgPSB1c2VBcHBTdGF0ZShzID0+IHMudGVhbUNvbnRleHQpXG4gIGNvbnN0IGFwcFN0YXRlVGFza3MgPSB1c2VBcHBTdGF0ZShzID0+IHMudGFza3MpXG4gIGNvbnN0IFssIGZvcmNlVXBkYXRlXSA9IFJlYWN0LnVzZVN0YXRlKDApXG4gIGNvbnN0IHsgcm93cywgY29sdW1ucyB9ID0gdXNlVGVybWluYWxTaXplKClcblxuICAvLyBUcmFjayB3aGVuIGVhY2ggdGFzayB3YXMgbGFzdCBvYnNlcnZlZCB0cmFuc2l0aW9uaW5nIHRvIGNvbXBsZXRlZFxuICBjb25zdCBjb21wbGV0aW9uVGltZXN0YW1wc1JlZiA9IFJlYWN0LnVzZVJlZihuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpKVxuICBjb25zdCBwcmV2aW91c0NvbXBsZXRlZElkc1JlZiA9IFJlYWN0LnVzZVJlZjxTZXQ8c3RyaW5nPiB8IG51bGw+KG51bGwpXG4gIGlmIChwcmV2aW91c0NvbXBsZXRlZElkc1JlZi5jdXJyZW50ID09PSBudWxsKSB7XG4gICAgcHJldmlvdXNDb21wbGV0ZWRJZHNSZWYuY3VycmVudCA9IG5ldyBTZXQoXG4gICAgICB0YXNrcy5maWx0ZXIodCA9PiB0LnN0YXR1cyA9PT0gJ2NvbXBsZXRlZCcpLm1hcCh0ID0+IHQuaWQpLFxuICAgIClcbiAgfVxuICBjb25zdCBtYXhEaXNwbGF5ID0gcm93cyA8PSAxMCA/IDAgOiBNYXRoLm1pbigxMCwgTWF0aC5tYXgoMywgcm93cyAtIDE0KSlcblxuICAvLyBVcGRhdGUgY29tcGxldGlvbiB0aW1lc3RhbXBzOiByZXNldCB3aGVuIGEgdGFzayB0cmFuc2l0aW9ucyB0byBjb21wbGV0ZWRcbiAgY29uc3QgY3VycmVudENvbXBsZXRlZElkcyA9IG5ldyBTZXQoXG4gICAgdGFza3MuZmlsdGVyKHQgPT4gdC5zdGF0dXMgPT09ICdjb21wbGV0ZWQnKS5tYXAodCA9PiB0LmlkKSxcbiAgKVxuICBjb25zdCBub3cgPSBEYXRlLm5vdygpXG4gIGZvciAoY29uc3QgaWQgb2YgY3VycmVudENvbXBsZXRlZElkcykge1xuICAgIGlmICghcHJldmlvdXNDb21wbGV0ZWRJZHNSZWYuY3VycmVudC5oYXMoaWQpKSB7XG4gICAgICBjb21wbGV0aW9uVGltZXN0YW1wc1JlZi5jdXJyZW50LnNldChpZCwgbm93KVxuICAgIH1cbiAgfVxuICBmb3IgKGNvbnN0IGlkIG9mIGNvbXBsZXRpb25UaW1lc3RhbXBzUmVmLmN1cnJlbnQua2V5cygpKSB7XG4gICAgaWYgKCFjdXJyZW50Q29tcGxldGVkSWRzLmhhcyhpZCkpIHtcbiAgICAgIGNvbXBsZXRpb25UaW1lc3RhbXBzUmVmLmN1cnJlbnQuZGVsZXRlKGlkKVxuICAgIH1cbiAgfVxuICBwcmV2aW91c0NvbXBsZXRlZElkc1JlZi5jdXJyZW50ID0gY3VycmVudENvbXBsZXRlZElkc1xuXG4gIC8vIFNjaGVkdWxlIHJlLXJlbmRlciB3aGVuIHRoZSBuZXh0IHJlY2VudCBjb21wbGV0aW9uIGV4cGlyZXMuXG4gIC8vIERlcGVuZCBvbiBgdGFza3NgIHNvIHRoZSB0aW1lciBpcyBvbmx5IHJlc2V0IHdoZW4gdGhlIHRhc2sgbGlzdCBjaGFuZ2VzLFxuICAvLyBub3Qgb24gZXZlcnkgcmVuZGVyICh3aGljaCB3YXMgY2F1c2luZyB1bm5lY2Vzc2FyeSB3b3JrKS5cbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoY29tcGxldGlvblRpbWVzdGFtcHNSZWYuY3VycmVudC5zaXplID09PSAwKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgY29uc3QgY3VycmVudE5vdyA9IERhdGUubm93KClcbiAgICBsZXQgZWFybGllc3RFeHBpcnkgPSBJbmZpbml0eVxuICAgIGZvciAoY29uc3QgdHMgb2YgY29tcGxldGlvblRpbWVzdGFtcHNSZWYuY3VycmVudC52YWx1ZXMoKSkge1xuICAgICAgY29uc3QgZXhwaXJ5ID0gdHMgKyBSRUNFTlRfQ09NUExFVEVEX1RUTF9NU1xuICAgICAgaWYgKGV4cGlyeSA+IGN1cnJlbnROb3cgJiYgZXhwaXJ5IDwgZWFybGllc3RFeHBpcnkpIHtcbiAgICAgICAgZWFybGllc3RFeHBpcnkgPSBleHBpcnlcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGVhcmxpZXN0RXhwaXJ5ID09PSBJbmZpbml0eSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGNvbnN0IHRpbWVyID0gc2V0VGltZW91dChcbiAgICAgIGZvcmNlVXBkYXRlID0+IGZvcmNlVXBkYXRlKChuOiBudW1iZXIpID0+IG4gKyAxKSxcbiAgICAgIGVhcmxpZXN0RXhwaXJ5IC0gY3VycmVudE5vdyxcbiAgICAgIGZvcmNlVXBkYXRlLFxuICAgIClcbiAgICByZXR1cm4gKCkgPT4gY2xlYXJUaW1lb3V0KHRpbWVyKVxuICB9LCBbdGFza3NdKVxuXG4gIGlmICghaXNUb2RvVjJFbmFibGVkKCkpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgaWYgKHRhc2tzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICAvLyBCdWlsZCBhIG1hcCBvZiB0ZWFtbWF0ZSBuYW1lIC0+IHRoZW1lIGNvbG9yXG4gIGNvbnN0IHRlYW1tYXRlQ29sb3JzOiBSZWNvcmQ8c3RyaW5nLCBrZXlvZiBUaGVtZT4gPSB7fVxuICBpZiAoaXNBZ2VudFN3YXJtc0VuYWJsZWQoKSAmJiB0ZWFtQ29udGV4dD8udGVhbW1hdGVzKSB7XG4gICAgZm9yIChjb25zdCB0ZWFtbWF0ZSBvZiBPYmplY3QudmFsdWVzKHRlYW1Db250ZXh0LnRlYW1tYXRlcykpIHtcbiAgICAgIGlmICh0ZWFtbWF0ZS5jb2xvcikge1xuICAgICAgICBjb25zdCB0aGVtZUNvbG9yID1cbiAgICAgICAgICBBR0VOVF9DT0xPUl9UT19USEVNRV9DT0xPUlt0ZWFtbWF0ZS5jb2xvciBhcyBBZ2VudENvbG9yTmFtZV1cbiAgICAgICAgaWYgKHRoZW1lQ29sb3IpIHtcbiAgICAgICAgICB0ZWFtbWF0ZUNvbG9yc1t0ZWFtbWF0ZS5uYW1lXSA9IHRoZW1lQ29sb3JcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIEJ1aWxkIGEgbWFwIG9mIHRlYW1tYXRlIG5hbWUgLT4gY3VycmVudCBhY3Rpdml0eSBkZXNjcmlwdGlvblxuICAvLyBNYXAgYm90aCBhZ2VudE5hbWUgKFwicmVzZWFyY2hlclwiKSBhbmQgYWdlbnRJZCAoXCJyZXNlYXJjaGVyQHRlYW1cIikgc29cbiAgLy8gdGFzayBvd25lcnMgbWF0Y2ggcmVnYXJkbGVzcyBvZiB3aGljaCBmb3JtYXQgdGhlIG1vZGVsIHVzZWQuXG4gIC8vIFJvbGxzIHVwIGNvbnNlY3V0aXZlIHNlYXJjaC9yZWFkIHRvb2wgdXNlcyBpbnRvIGEgY29tcGFjdCBzdW1tYXJ5LlxuICAvLyBBbHNvIHRyYWNrIHdoaWNoIHRlYW1tYXRlcyBhcmUgc3RpbGwgcnVubmluZyAobm90IHNodXQgZG93bikuXG4gIGNvbnN0IHRlYW1tYXRlQWN0aXZpdHk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fVxuICBjb25zdCBhY3RpdmVUZWFtbWF0ZXMgPSBuZXcgU2V0PHN0cmluZz4oKVxuICBpZiAoaXNBZ2VudFN3YXJtc0VuYWJsZWQoKSkge1xuICAgIGZvciAoY29uc3QgYmdUYXNrIG9mIE9iamVjdC52YWx1ZXMoYXBwU3RhdGVUYXNrcykpIHtcbiAgICAgIGlmIChpc0luUHJvY2Vzc1RlYW1tYXRlVGFzayhiZ1Rhc2spICYmIGJnVGFzay5zdGF0dXMgPT09ICdydW5uaW5nJykge1xuICAgICAgICBhY3RpdmVUZWFtbWF0ZXMuYWRkKGJnVGFzay5pZGVudGl0eS5hZ2VudE5hbWUpXG4gICAgICAgIGFjdGl2ZVRlYW1tYXRlcy5hZGQoYmdUYXNrLmlkZW50aXR5LmFnZW50SWQpXG4gICAgICAgIGNvbnN0IGFjdGl2aXRpZXMgPSBiZ1Rhc2sucHJvZ3Jlc3M/LnJlY2VudEFjdGl2aXRpZXNcbiAgICAgICAgY29uc3QgZGVzYyA9XG4gICAgICAgICAgKGFjdGl2aXRpZXMgJiYgc3VtbWFyaXplUmVjZW50QWN0aXZpdGllcyhhY3Rpdml0aWVzKSkgPz9cbiAgICAgICAgICBiZ1Rhc2sucHJvZ3Jlc3M/Lmxhc3RBY3Rpdml0eT8uYWN0aXZpdHlEZXNjcmlwdGlvblxuICAgICAgICBpZiAoZGVzYykge1xuICAgICAgICAgIHRlYW1tYXRlQWN0aXZpdHlbYmdUYXNrLmlkZW50aXR5LmFnZW50TmFtZV0gPSBkZXNjXG4gICAgICAgICAgdGVhbW1hdGVBY3Rpdml0eVtiZ1Rhc2suaWRlbnRpdHkuYWdlbnRJZF0gPSBkZXNjXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBHZXQgdGFzayBjb3VudHMgZm9yIGRpc3BsYXlcbiAgY29uc3QgY29tcGxldGVkQ291bnQgPSBjb3VudCh0YXNrcywgdCA9PiB0LnN0YXR1cyA9PT0gJ2NvbXBsZXRlZCcpXG4gIGNvbnN0IHBlbmRpbmdDb3VudCA9IGNvdW50KHRhc2tzLCB0ID0+IHQuc3RhdHVzID09PSAncGVuZGluZycpXG4gIGNvbnN0IGluUHJvZ3Jlc3NDb3VudCA9IHRhc2tzLmxlbmd0aCAtIGNvbXBsZXRlZENvdW50IC0gcGVuZGluZ0NvdW50XG4gIC8vIFVucmVzb2x2ZWQgdGFza3MgKG9wZW4gb3IgaW5fcHJvZ3Jlc3MpIGJsb2NrIGRlcGVuZGVudCB0YXNrc1xuICBjb25zdCB1bnJlc29sdmVkVGFza0lkcyA9IG5ldyBTZXQoXG4gICAgdGFza3MuZmlsdGVyKHQgPT4gdC5zdGF0dXMgIT09ICdjb21wbGV0ZWQnKS5tYXAodCA9PiB0LmlkKSxcbiAgKVxuXG4gIC8vIENoZWNrIGlmIHdlIG5lZWQgdG8gdHJ1bmNhdGVcbiAgY29uc3QgbmVlZHNUcnVuY2F0aW9uID0gdGFza3MubGVuZ3RoID4gbWF4RGlzcGxheVxuXG4gIGxldCB2aXNpYmxlVGFza3M6IFRhc2tbXVxuICBsZXQgaGlkZGVuVGFza3M6IFRhc2tbXVxuXG4gIGlmIChuZWVkc1RydW5jYXRpb24pIHtcbiAgICAvLyBQcmlvcml0aXplOiByZWNlbnRseSBjb21wbGV0ZWQgKHdpdGhpbiAzMHMpLCBpbi1wcm9ncmVzcywgcGVuZGluZywgb2xkZXIgY29tcGxldGVkXG4gICAgY29uc3QgcmVjZW50Q29tcGxldGVkOiBUYXNrW10gPSBbXVxuICAgIGNvbnN0IG9sZGVyQ29tcGxldGVkOiBUYXNrW10gPSBbXVxuICAgIGZvciAoY29uc3QgdGFzayBvZiB0YXNrcy5maWx0ZXIodCA9PiB0LnN0YXR1cyA9PT0gJ2NvbXBsZXRlZCcpKSB7XG4gICAgICBjb25zdCB0cyA9IGNvbXBsZXRpb25UaW1lc3RhbXBzUmVmLmN1cnJlbnQuZ2V0KHRhc2suaWQpXG4gICAgICBpZiAodHMgJiYgbm93IC0gdHMgPCBSRUNFTlRfQ09NUExFVEVEX1RUTF9NUykge1xuICAgICAgICByZWNlbnRDb21wbGV0ZWQucHVzaCh0YXNrKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb2xkZXJDb21wbGV0ZWQucHVzaCh0YXNrKVxuICAgICAgfVxuICAgIH1cbiAgICByZWNlbnRDb21wbGV0ZWQuc29ydChieUlkQXNjKVxuICAgIG9sZGVyQ29tcGxldGVkLnNvcnQoYnlJZEFzYylcbiAgICBjb25zdCBpblByb2dyZXNzID0gdGFza3NcbiAgICAgIC5maWx0ZXIodCA9PiB0LnN0YXR1cyA9PT0gJ2luX3Byb2dyZXNzJylcbiAgICAgIC5zb3J0KGJ5SWRBc2MpXG4gICAgY29uc3QgcGVuZGluZyA9IHRhc2tzXG4gICAgICAuZmlsdGVyKHQgPT4gdC5zdGF0dXMgPT09ICdwZW5kaW5nJylcbiAgICAgIC5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgIGNvbnN0IGFCbG9ja2VkID0gYS5ibG9ja2VkQnkuc29tZShpZCA9PiB1bnJlc29sdmVkVGFza0lkcy5oYXMoaWQpKVxuICAgICAgICBjb25zdCBiQmxvY2tlZCA9IGIuYmxvY2tlZEJ5LnNvbWUoaWQgPT4gdW5yZXNvbHZlZFRhc2tJZHMuaGFzKGlkKSlcbiAgICAgICAgaWYgKGFCbG9ja2VkICE9PSBiQmxvY2tlZCkge1xuICAgICAgICAgIHJldHVybiBhQmxvY2tlZCA/IDEgOiAtMVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBieUlkQXNjKGEsIGIpXG4gICAgICB9KVxuXG4gICAgY29uc3QgcHJpb3JpdGl6ZWQgPSBbXG4gICAgICAuLi5yZWNlbnRDb21wbGV0ZWQsXG4gICAgICAuLi5pblByb2dyZXNzLFxuICAgICAgLi4ucGVuZGluZyxcbiAgICAgIC4uLm9sZGVyQ29tcGxldGVkLFxuICAgIF1cbiAgICB2aXNpYmxlVGFza3MgPSBwcmlvcml0aXplZC5zbGljZSgwLCBtYXhEaXNwbGF5KVxuICAgIGhpZGRlblRhc2tzID0gcHJpb3JpdGl6ZWQuc2xpY2UobWF4RGlzcGxheSlcbiAgfSBlbHNlIHtcbiAgICAvLyBObyB0cnVuY2F0aW9uIG5lZWRlZCDigJQgc29ydCBieSBJRCBmb3Igc3RhYmxlIG9yZGVyaW5nXG4gICAgdmlzaWJsZVRhc2tzID0gWy4uLnRhc2tzXS5zb3J0KGJ5SWRBc2MpXG4gICAgaGlkZGVuVGFza3MgPSBbXVxuICB9XG5cbiAgbGV0IGhpZGRlblN1bW1hcnkgPSAnJ1xuICBpZiAoaGlkZGVuVGFza3MubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IHBhcnRzOiBzdHJpbmdbXSA9IFtdXG4gICAgY29uc3QgaGlkZGVuUGVuZGluZyA9IGNvdW50KGhpZGRlblRhc2tzLCB0ID0+IHQuc3RhdHVzID09PSAncGVuZGluZycpXG4gICAgY29uc3QgaGlkZGVuSW5Qcm9ncmVzcyA9IGNvdW50KGhpZGRlblRhc2tzLCB0ID0+IHQuc3RhdHVzID09PSAnaW5fcHJvZ3Jlc3MnKVxuICAgIGNvbnN0IGhpZGRlbkNvbXBsZXRlZCA9IGNvdW50KGhpZGRlblRhc2tzLCB0ID0+IHQuc3RhdHVzID09PSAnY29tcGxldGVkJylcbiAgICBpZiAoaGlkZGVuSW5Qcm9ncmVzcyA+IDApIHtcbiAgICAgIHBhcnRzLnB1c2goYCR7aGlkZGVuSW5Qcm9ncmVzc30gaW4gcHJvZ3Jlc3NgKVxuICAgIH1cbiAgICBpZiAoaGlkZGVuUGVuZGluZyA+IDApIHtcbiAgICAgIHBhcnRzLnB1c2goYCR7aGlkZGVuUGVuZGluZ30gcGVuZGluZ2ApXG4gICAgfVxuICAgIGlmIChoaWRkZW5Db21wbGV0ZWQgPiAwKSB7XG4gICAgICBwYXJ0cy5wdXNoKGAke2hpZGRlbkNvbXBsZXRlZH0gY29tcGxldGVkYClcbiAgICB9XG4gICAgaGlkZGVuU3VtbWFyeSA9IGAg4oCmICske3BhcnRzLmpvaW4oJywgJyl9YFxuICB9XG5cbiAgY29uc3QgY29udGVudCA9IChcbiAgICA8PlxuICAgICAge3Zpc2libGVUYXNrcy5tYXAodGFzayA9PiAoXG4gICAgICAgIDxUYXNrSXRlbVxuICAgICAgICAgIGtleT17dGFzay5pZH1cbiAgICAgICAgICB0YXNrPXt0YXNrfVxuICAgICAgICAgIG93bmVyQ29sb3I9e3Rhc2sub3duZXIgPyB0ZWFtbWF0ZUNvbG9yc1t0YXNrLm93bmVyXSA6IHVuZGVmaW5lZH1cbiAgICAgICAgICBvcGVuQmxvY2tlcnM9e3Rhc2suYmxvY2tlZEJ5LmZpbHRlcihpZCA9PiB1bnJlc29sdmVkVGFza0lkcy5oYXMoaWQpKX1cbiAgICAgICAgICBhY3Rpdml0eT17dGFzay5vd25lciA/IHRlYW1tYXRlQWN0aXZpdHlbdGFzay5vd25lcl0gOiB1bmRlZmluZWR9XG4gICAgICAgICAgb3duZXJBY3RpdmU9e3Rhc2sub3duZXIgPyBhY3RpdmVUZWFtbWF0ZXMuaGFzKHRhc2sub3duZXIpIDogZmFsc2V9XG4gICAgICAgICAgY29sdW1ucz17Y29sdW1uc31cbiAgICAgICAgLz5cbiAgICAgICkpfVxuICAgICAge21heERpc3BsYXkgPiAwICYmIGhpZGRlblN1bW1hcnkgJiYgPFRleHQgZGltQ29sb3I+e2hpZGRlblN1bW1hcnl9PC9UZXh0Pn1cbiAgICA8Lz5cbiAgKVxuXG4gIGlmIChpc1N0YW5kYWxvbmUpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPEJveCBmbGV4RGlyZWN0aW9uPVwiY29sdW1uXCIgbWFyZ2luVG9wPXsxfSBtYXJnaW5MZWZ0PXsyfT5cbiAgICAgICAgPEJveD5cbiAgICAgICAgICA8VGV4dCBkaW1Db2xvcj5cbiAgICAgICAgICAgIDxUZXh0IGJvbGQ+e3Rhc2tzLmxlbmd0aH08L1RleHQ+XG4gICAgICAgICAgICB7JyB0YXNrcyAoJ31cbiAgICAgICAgICAgIDxUZXh0IGJvbGQ+e2NvbXBsZXRlZENvdW50fTwvVGV4dD5cbiAgICAgICAgICAgIHsnIGRvbmUsICd9XG4gICAgICAgICAgICB7aW5Qcm9ncmVzc0NvdW50ID4gMCAmJiAoXG4gICAgICAgICAgICAgIDw+XG4gICAgICAgICAgICAgICAgPFRleHQgYm9sZD57aW5Qcm9ncmVzc0NvdW50fTwvVGV4dD5cbiAgICAgICAgICAgICAgICB7JyBpbiBwcm9ncmVzcywgJ31cbiAgICAgICAgICAgICAgPC8+XG4gICAgICAgICAgICApfVxuICAgICAgICAgICAgPFRleHQgYm9sZD57cGVuZGluZ0NvdW50fTwvVGV4dD5cbiAgICAgICAgICAgIHsnIG9wZW4pJ31cbiAgICAgICAgICA8L1RleHQ+XG4gICAgICAgIDwvQm94PlxuICAgICAgICB7Y29udGVudH1cbiAgICAgIDwvQm94PlxuICAgIClcbiAgfVxuXG4gIHJldHVybiA8Qm94IGZsZXhEaXJlY3Rpb249XCJjb2x1bW5cIj57Y29udGVudH08L0JveD5cbn1cblxudHlwZSBUYXNrSXRlbVByb3BzID0ge1xuICB0YXNrOiBUYXNrXG4gIG93bmVyQ29sb3I/OiBrZXlvZiBUaGVtZVxuICBvcGVuQmxvY2tlcnM6IHN0cmluZ1tdXG4gIGFjdGl2aXR5Pzogc3RyaW5nXG4gIG93bmVyQWN0aXZlOiBib29sZWFuXG4gIGNvbHVtbnM6IG51bWJlclxufVxuXG5mdW5jdGlvbiBnZXRUYXNrSWNvbihzdGF0dXM6IFRhc2tbJ3N0YXR1cyddKToge1xuICBpY29uOiBzdHJpbmdcbiAgY29sb3I6IGtleW9mIFRoZW1lIHwgdW5kZWZpbmVkXG59IHtcbiAgc3dpdGNoIChzdGF0dXMpIHtcbiAgICBjYXNlICdjb21wbGV0ZWQnOlxuICAgICAgcmV0dXJuIHsgaWNvbjogZmlndXJlcy50aWNrLCBjb2xvcjogJ3N1Y2Nlc3MnIH1cbiAgICBjYXNlICdpbl9wcm9ncmVzcyc6XG4gICAgICByZXR1cm4geyBpY29uOiBmaWd1cmVzLnNxdWFyZVNtYWxsRmlsbGVkLCBjb2xvcjogJ2NsYXVkZScgfVxuICAgIGNhc2UgJ3BlbmRpbmcnOlxuICAgICAgcmV0dXJuIHsgaWNvbjogZmlndXJlcy5zcXVhcmVTbWFsbCwgY29sb3I6IHVuZGVmaW5lZCB9XG4gIH1cbn1cblxuZnVuY3Rpb24gVGFza0l0ZW0oe1xuICB0YXNrLFxuICBvd25lckNvbG9yLFxuICBvcGVuQmxvY2tlcnMsXG4gIGFjdGl2aXR5LFxuICBvd25lckFjdGl2ZSxcbiAgY29sdW1ucyxcbn06IFRhc2tJdGVtUHJvcHMpOiBSZWFjdC5SZWFjdE5vZGUge1xuICBjb25zdCBpc0NvbXBsZXRlZCA9IHRhc2suc3RhdHVzID09PSAnY29tcGxldGVkJ1xuICBjb25zdCBpc0luUHJvZ3Jlc3MgPSB0YXNrLnN0YXR1cyA9PT0gJ2luX3Byb2dyZXNzJ1xuICBjb25zdCBpc0Jsb2NrZWQgPSBvcGVuQmxvY2tlcnMubGVuZ3RoID4gMFxuXG4gIGNvbnN0IHsgaWNvbiwgY29sb3IgfSA9IGdldFRhc2tJY29uKHRhc2suc3RhdHVzKVxuXG4gIGNvbnN0IHNob3dBY3Rpdml0eSA9IGlzSW5Qcm9ncmVzcyAmJiAhaXNCbG9ja2VkICYmIGFjdGl2aXR5XG5cbiAgLy8gUmVzcG9uc2l2ZSBsYXlvdXQ6IGhpZGUgb3duZXIgb24gbmFycm93IHNjcmVlbnMgKDw2MCBjb2xzKVxuICAvLyBUcnVuY2F0ZSBzdWJqZWN0IGJhc2VkIG9uIGF2YWlsYWJsZSBzcGFjZVxuICBjb25zdCBzaG93T3duZXIgPSBjb2x1bW5zID49IDYwICYmIHRhc2sub3duZXIgJiYgb3duZXJBY3RpdmVcbiAgY29uc3Qgb3duZXJXaWR0aCA9IHNob3dPd25lciA/IHN0cmluZ1dpZHRoKGAgKEAke3Rhc2sub3duZXJ9KWApIDogMFxuICAvLyBBY2NvdW50IGZvcjogaWNvbigyKSArIGluZGVudGF0aW9uKH44IHdoZW4gbmVzdGVkIHVuZGVyIHNwaW5uZXIpICsgb3duZXIgKyBzYWZldHlcbiAgLy8gVXNlIGNvbHVtbnMgLSAxNSBhcyBhIGNvbnNlcnZhdGl2ZSBlc3RpbWF0ZSBmb3IgbmVzdGVkIGxheW91dHNcbiAgY29uc3QgbWF4U3ViamVjdFdpZHRoID0gTWF0aC5tYXgoMTUsIGNvbHVtbnMgLSAxNSAtIG93bmVyV2lkdGgpXG4gIGNvbnN0IGRpc3BsYXlTdWJqZWN0ID0gdHJ1bmNhdGVUb1dpZHRoKHRhc2suc3ViamVjdCwgbWF4U3ViamVjdFdpZHRoKVxuXG4gIC8vIFRydW5jYXRlIGFjdGl2aXR5IGZvciBuYXJyb3cgc2NyZWVuc1xuICBjb25zdCBtYXhBY3Rpdml0eVdpZHRoID0gTWF0aC5tYXgoMTUsIGNvbHVtbnMgLSAxNSlcbiAgY29uc3QgZGlzcGxheUFjdGl2aXR5ID0gYWN0aXZpdHlcbiAgICA/IHRydW5jYXRlVG9XaWR0aChhY3Rpdml0eSwgbWF4QWN0aXZpdHlXaWR0aClcbiAgICA6IHVuZGVmaW5lZFxuXG4gIHJldHVybiAoXG4gICAgPEJveCBmbGV4RGlyZWN0aW9uPVwiY29sdW1uXCI+XG4gICAgICA8Qm94PlxuICAgICAgICA8VGV4dCBjb2xvcj17Y29sb3J9PntpY29ufSA8L1RleHQ+XG4gICAgICAgIDxUZXh0XG4gICAgICAgICAgYm9sZD17aXNJblByb2dyZXNzfVxuICAgICAgICAgIHN0cmlrZXRocm91Z2g9e2lzQ29tcGxldGVkfVxuICAgICAgICAgIGRpbUNvbG9yPXtpc0NvbXBsZXRlZCB8fCBpc0Jsb2NrZWR9XG4gICAgICAgID5cbiAgICAgICAgICB7ZGlzcGxheVN1YmplY3R9XG4gICAgICAgIDwvVGV4dD5cbiAgICAgICAge3Nob3dPd25lciAmJiAoXG4gICAgICAgICAgPFRleHQgZGltQ29sb3I+XG4gICAgICAgICAgICB7JyAoJ31cbiAgICAgICAgICAgIHtvd25lckNvbG9yID8gKFxuICAgICAgICAgICAgICA8VGhlbWVkVGV4dCBjb2xvcj17b3duZXJDb2xvcn0+QHt0YXNrLm93bmVyfTwvVGhlbWVkVGV4dD5cbiAgICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICAgIGBAJHt0YXNrLm93bmVyfWBcbiAgICAgICAgICAgICl9XG4gICAgICAgICAgICB7JyknfVxuICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgKX1cbiAgICAgICAge2lzQmxvY2tlZCAmJiAoXG4gICAgICAgICAgPFRleHQgZGltQ29sb3I+XG4gICAgICAgICAgICB7JyAnfVxuICAgICAgICAgICAge2ZpZ3VyZXMucG9pbnRlclNtYWxsfSBibG9ja2VkIGJ5eycgJ31cbiAgICAgICAgICAgIHtbLi4ub3BlbkJsb2NrZXJzXVxuICAgICAgICAgICAgICAuc29ydCgoYSwgYikgPT4gcGFyc2VJbnQoYSwgMTApIC0gcGFyc2VJbnQoYiwgMTApKVxuICAgICAgICAgICAgICAubWFwKGlkID0+IGAjJHtpZH1gKVxuICAgICAgICAgICAgICAuam9pbignLCAnKX1cbiAgICAgICAgICA8L1RleHQ+XG4gICAgICAgICl9XG4gICAgICA8L0JveD5cbiAgICAgIHtzaG93QWN0aXZpdHkgJiYgZGlzcGxheUFjdGl2aXR5ICYmIChcbiAgICAgICAgPEJveD5cbiAgICAgICAgICA8VGV4dCBkaW1Db2xvcj5cbiAgICAgICAgICAgIHsnICAnfVxuICAgICAgICAgICAge2Rpc3BsYXlBY3Rpdml0eX1cbiAgICAgICAgICAgIHtmaWd1cmVzLmVsbGlwc2lzfVxuICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgPC9Cb3g+XG4gICAgICApfVxuICAgIDwvQm94PlxuICApXG59XG4iXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPQSxPQUFPLE1BQU0sU0FBUztBQUM3QixPQUFPLEtBQUtDLEtBQUssTUFBTSxPQUFPO0FBQzlCLFNBQVNDLGVBQWUsUUFBUSw2QkFBNkI7QUFDN0QsU0FBU0MsV0FBVyxRQUFRLHVCQUF1QjtBQUNuRCxTQUFTQyxHQUFHLEVBQUVDLElBQUksUUFBUSxXQUFXO0FBQ3JDLFNBQVNDLFdBQVcsUUFBUSxzQkFBc0I7QUFDbEQsU0FBU0MsdUJBQXVCLFFBQVEseUNBQXlDO0FBQ2pGLFNBQ0VDLDBCQUEwQixFQUMxQixLQUFLQyxjQUFjLFFBQ2QseUNBQXlDO0FBQ2hELFNBQVNDLG9CQUFvQixRQUFRLGdDQUFnQztBQUNyRSxTQUFTQyxLQUFLLFFBQVEsbUJBQW1CO0FBQ3pDLFNBQVNDLHlCQUF5QixRQUFRLGdDQUFnQztBQUMxRSxTQUFTQyxlQUFlLFFBQVEsb0JBQW9CO0FBQ3BELFNBQVNDLGVBQWUsRUFBRSxLQUFLQyxJQUFJLFFBQVEsbUJBQW1CO0FBQzlELGNBQWNDLEtBQUssUUFBUSxtQkFBbUI7QUFDOUMsT0FBT0MsVUFBVSxNQUFNLCtC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
\ No newline at end of file
diff --git a/src/components/agents/new-agent-creation/wizard-steps/GenerateStep.tsx b/src/components/agents/new-agent-creation/wizard-steps/GenerateStep.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..d17ee6980d9bef3298ab6b3a8dd4d2d5489b88a8
--- /dev/null
+++ b/src/components/agents/new-agent-creation/wizard-steps/GenerateStep.tsx
@@ -0,0 +1,143 @@
+import { APIUserAbortError } from '@anthropic-ai/sdk';
+import React, { type ReactNode, useCallback, useRef, useState } from 'react';
+import { useMainLoopModel } from '../../../../hooks/useMainLoopModel.js';
+import { Box, Text } from '../../../../ink.js';
+import { useKeybinding } from '../../../../keybindings/useKeybinding.js';
+import { createAbortController } from '../../../../utils/abortController.js';
+import { editPromptInEditor } from '../../../../utils/promptEditor.js';
+import { ConfigurableShortcutHint } from '../../../ConfigurableShortcutHint.js';
+import { Byline } from '../../../design-system/Byline.js';
+import { Spinner } from '../../../Spinner.js';
+import TextInput from '../../../TextInput.js';
+import { useWizard } from '../../../wizard/index.js';
+import { WizardDialogLayout } from '../../../wizard/WizardDialogLayout.js';
+import { generateAgent } from '../../generateAgent.js';
+import type { AgentWizardData } from '../types.js';
+export function GenerateStep(): ReactNode {
+ const {
+ updateWizardData,
+ goBack,
+ goToStep,
+ wizardData
+ } = useWizard();
+ const [prompt, setPrompt] = useState(wizardData.generationPrompt || '');
+ const [isGenerating, setIsGenerating] = useState(false);
+ const [error, setError] = useState(null);
+ const [cursorOffset, setCursorOffset] = useState(prompt.length);
+ const model = useMainLoopModel();
+ const abortControllerRef = useRef(null);
+
+ // Cancel generation when escape pressed during generation
+ const handleCancelGeneration = useCallback(() => {
+ if (abortControllerRef.current) {
+ abortControllerRef.current.abort();
+ abortControllerRef.current = null;
+ setIsGenerating(false);
+ setError('Generation cancelled');
+ }
+ }, []);
+
+ // Use Settings context so 'n' key doesn't cancel (allows typing 'n' in prompt input)
+ useKeybinding('confirm:no', handleCancelGeneration, {
+ context: 'Settings',
+ isActive: isGenerating
+ });
+ const handleExternalEditor = useCallback(async () => {
+ const result = await editPromptInEditor(prompt);
+ if (result.content !== null) {
+ setPrompt(result.content);
+ setCursorOffset(result.content.length);
+ }
+ }, [prompt]);
+ useKeybinding('chat:externalEditor', handleExternalEditor, {
+ context: 'Chat',
+ isActive: !isGenerating
+ });
+
+ // Go back when escape pressed while not generating
+ const handleGoBack = useCallback(() => {
+ updateWizardData({
+ generationPrompt: '',
+ agentType: '',
+ systemPrompt: '',
+ whenToUse: '',
+ generatedAgent: undefined,
+ wasGenerated: false
+ });
+ setPrompt('');
+ setError(null);
+ goBack();
+ }, [updateWizardData, goBack]);
+
+ // Use Settings context so 'n' key doesn't cancel (allows typing 'n' in prompt input)
+ useKeybinding('confirm:no', handleGoBack, {
+ context: 'Settings',
+ isActive: !isGenerating
+ });
+ const handleGenerate = async (): Promise => {
+ const trimmedPrompt = prompt.trim();
+ if (!trimmedPrompt) {
+ setError('Please describe what the agent should do');
+ return;
+ }
+ setError(null);
+ setIsGenerating(true);
+ updateWizardData({
+ generationPrompt: trimmedPrompt,
+ isGenerating: true
+ });
+
+ // Create abort controller for this generation
+ const controller = createAbortController();
+ abortControllerRef.current = controller;
+ try {
+ const generated = await generateAgent(trimmedPrompt, model, [], controller.signal);
+ updateWizardData({
+ agentType: generated.identifier,
+ whenToUse: generated.whenToUse,
+ systemPrompt: generated.systemPrompt,
+ generatedAgent: generated,
+ isGenerating: false,
+ wasGenerated: true
+ });
+
+ // Skip directly to ToolsStep (index 6) - matching original flow
+ goToStep(6);
+ } catch (err) {
+ // Don't show error if it was cancelled (already set in escape handler)
+ if (err instanceof APIUserAbortError) {
+ // User cancelled - no error to show
+ } else if (err instanceof Error && !err.message.includes('No assistant message found')) {
+ setError(err.message || 'Failed to generate agent');
+ }
+ updateWizardData({
+ isGenerating: false
+ });
+ } finally {
+ setIsGenerating(false);
+ abortControllerRef.current = null;
+ }
+ };
+ const subtitle = 'Describe what this agent should do and when it should be used (be comprehensive for best results)';
+ if (isGenerating) {
+ return }>
+
+
+ Generating agent from description...
+
+ ;
+ }
+ return
+
+
+
+ }>
+
+ {error &&
+ {error}
+ }
+
+
+ ;
+}
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJBUElVc2VyQWJvcnRFcnJvciIsIlJlYWN0IiwiUmVhY3ROb2RlIiwidXNlQ2FsbGJhY2siLCJ1c2VSZWYiLCJ1c2VTdGF0ZSIsInVzZU1haW5Mb29wTW9kZWwiLCJCb3giLCJUZXh0IiwidXNlS2V5YmluZGluZyIsImNyZWF0ZUFib3J0Q29udHJvbGxlciIsImVkaXRQcm9tcHRJbkVkaXRvciIsIkNvbmZpZ3VyYWJsZVNob3J0Y3V0SGludCIsIkJ5bGluZSIsIlNwaW5uZXIiLCJUZXh0SW5wdXQiLCJ1c2VXaXphcmQiLCJXaXphcmREaWFsb2dMYXlvdXQiLCJnZW5lcmF0ZUFnZW50IiwiQWdlbnRXaXphcmREYXRhIiwiR2VuZXJhdGVTdGVwIiwidXBkYXRlV2l6YXJkRGF0YSIsImdvQmFjayIsImdvVG9TdGVwIiwid2l6YXJkRGF0YSIsInByb21wdCIsInNldFByb21wdCIsImdlbmVyYXRpb25Qcm9tcHQiLCJpc0dlbmVyYXRpbmciLCJzZXRJc0dlbmVyYXRpbmciLCJlcnJvciIsInNldEVycm9yIiwiY3Vyc29yT2Zmc2V0Iiwic2V0Q3Vyc29yT2Zmc2V0IiwibGVuZ3RoIiwibW9kZWwiLCJhYm9ydENvbnRyb2xsZXJSZWYiLCJBYm9ydENvbnRyb2xsZXIiLCJoYW5kbGVDYW5jZWxHZW5lcmF0aW9uIiwiY3VycmVudCIsImFib3J0IiwiY29udGV4dCIsImlzQWN0aXZlIiwiaGFuZGxlRXh0ZXJuYWxFZGl0b3IiLCJyZXN1bHQiLCJjb250ZW50IiwiaGFuZGxlR29CYWNrIiwiYWdlbnRUeXBlIiwic3lzdGVtUHJvbXB0Iiwid2hlblRvVXNlIiwiZ2VuZXJhdGVkQWdlbnQiLCJ1bmRlZmluZWQiLCJ3YXNHZW5lcmF0ZWQiLCJoYW5kbGVHZW5lcmF0ZSIsIlByb21pc2UiLCJ0cmltbWVkUHJvbXB0IiwidHJpbSIsImNvbnRyb2xsZXIiLCJnZW5lcmF0ZWQiLCJzaWduYWwiLCJpZGVudGlmaWVyIiwiZXJyIiwiRXJyb3IiLCJtZXNzYWdlIiwiaW5jbHVkZXMiLCJzdWJ0aXRsZSJdLCJzb3VyY2VzIjpbIkdlbmVyYXRlU3RlcC50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQVBJVXNlckFib3J0RXJyb3IgfSBmcm9tICdAYW50aHJvcGljLWFpL3NkaydcbmltcG9ydCBSZWFjdCwgeyB0eXBlIFJlYWN0Tm9kZSwgdXNlQ2FsbGJhY2ssIHVzZVJlZiwgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCdcbmltcG9ydCB7IHVzZU1haW5Mb29wTW9kZWwgfSBmcm9tICcuLi8uLi8uLi8uLi9ob29rcy91c2VNYWluTG9vcE1vZGVsLmpzJ1xuaW1wb3J0IHsgQm94LCBUZXh0IH0gZnJvbSAnLi4vLi4vLi4vLi4vaW5rLmpzJ1xuaW1wb3J0IHsgdXNlS2V5YmluZGluZyB9IGZyb20gJy4uLy4uLy4uLy4uL2tleWJpbmRpbmdzL3VzZUtleWJpbmRpbmcuanMnXG5pbXBvcnQgeyBjcmVhdGVBYm9ydENvbnRyb2xsZXIgfSBmcm9tICcuLi8uLi8uLi8uLi91dGlscy9hYm9ydENvbnRyb2xsZXIuanMnXG5pbXBvcnQgeyBlZGl0UHJvbXB0SW5FZGl0b3IgfSBmcm9tICcuLi8uLi8uLi8uLi91dGlscy9wcm9tcHRFZGl0b3IuanMnXG5pbXBvcnQgeyBDb25maWd1cmFibGVTaG9ydGN1dEhpbnQgfSBmcm9tICcuLi8uLi8uLi9Db25maWd1cmFibGVTaG9ydGN1dEhpbnQuanMnXG5pbXBvcnQgeyBCeWxpbmUgfSBmcm9tICcuLi8uLi8uLi9kZXNpZ24tc3lzdGVtL0J5bGluZS5qcydcbmltcG9ydCB7IFNwaW5uZXIgfSBmcm9tICcuLi8uLi8uLi9TcGlubmVyLmpzJ1xuaW1wb3J0IFRleHRJbnB1dCBmcm9tICcuLi8uLi8uLi9UZXh0SW5wdXQuanMnXG5pbXBvcnQgeyB1c2VXaXphcmQgfSBmcm9tICcuLi8uLi8uLi93aXphcmQvaW5kZXguanMnXG5pbXBvcnQgeyBXaXphcmREaWFsb2dMYXlvdXQgfSBmcm9tICcuLi8uLi8uLi93aXphcmQvV2l6YXJkRGlhbG9nTGF5b3V0LmpzJ1xuaW1wb3J0IHsgZ2VuZXJhdGVBZ2VudCB9IGZyb20gJy4uLy4uL2dlbmVyYXRlQWdlbnQuanMnXG5pbXBvcnQgdHlwZSB7IEFnZW50V2l6YXJkRGF0YSB9IGZyb20gJy4uL3R5cGVzLmpzJ1xuXG5leHBvcnQgZnVuY3Rpb24gR2VuZXJhdGVTdGVwKCk6IFJlYWN0Tm9kZSB7XG4gIGNvbnN0IHsgdXBkYXRlV2l6YXJkRGF0YSwgZ29CYWNrLCBnb1RvU3RlcCwgd2l6YXJkRGF0YSB9ID1cbiAgICB1c2VXaXphcmQ8QWdlbnRXaXphcmREYXRhPigpXG4gIGNvbnN0IFtwcm9tcHQsIHNldFByb21wdF0gPSB1c2VTdGF0ZSh3aXphcmREYXRhLmdlbmVyYXRpb25Qcm9tcHQgfHwgJycpXG4gIGNvbnN0IFtpc0dlbmVyYXRpbmcsIHNldElzR2VuZXJhdGluZ10gPSB1c2VTdGF0ZShmYWxzZSlcbiAgY29uc3QgW2Vycm9yLCBzZXRFcnJvcl0gPSB1c2VTdGF0ZTxzdHJpbmcgfCBudWxsPihudWxsKVxuICBjb25zdCBbY3Vyc29yT2Zmc2V0LCBzZXRDdXJzb3JPZmZzZXRdID0gdXNlU3RhdGUocHJvbXB0Lmxlbmd0aClcbiAgY29uc3QgbW9kZWwgPSB1c2VNYWluTG9vcE1vZGVsKClcbiAgY29uc3QgYWJvcnRDb250cm9sbGVyUmVmID0gdXNlUmVmPEFib3J0Q29udHJvbGxlciB8IG51bGw+KG51bGwpXG5cbiAgLy8gQ2FuY2VsIGdlbmVyYXRpb24gd2hlbiBlc2NhcGUgcHJlc3NlZCBkdXJpbmcgZ2VuZXJhdGlvblxuICBjb25zdCBoYW5kbGVDYW5jZWxHZW5lcmF0aW9uID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGlmIChhYm9ydENvbnRyb2xsZXJSZWYuY3VycmVudCkge1xuICAgICAgYWJvcnRDb250cm9sbGVyUmVmLmN1cnJlbnQuYWJvcnQoKVxuICAgICAgYWJvcnRDb250cm9sbGVyUmVmLmN1cnJlbnQgPSBudWxsXG4gICAgICBzZXRJc0dlbmVyYXRpbmcoZmFsc2UpXG4gICAgICBzZXRFcnJvcignR2VuZXJhdGlvbiBjYW5jZWxsZWQnKVxuICAgIH1cbiAgfSwgW10pXG5cbiAgLy8gVXNlIFNldHRpbmdzIGNvbnRleHQgc28gJ24nIGtleSBkb2Vzbid0IGNhbmNlbCAoYWxsb3dzIHR5cGluZyAnbicgaW4gcHJvbXB0IGlucHV0KVxuICB1c2VLZXliaW5kaW5nKCdjb25maXJtOm5vJywgaGFuZGxlQ2FuY2VsR2VuZXJhdGlvbiwge1xuICAgIGNvbnRleHQ6ICdTZXR0aW5ncycsXG4gICAgaXNBY3RpdmU6IGlzR2VuZXJhdGluZyxcbiAgfSlcblxuICBjb25zdCBoYW5kbGVFeHRlcm5hbEVkaXRvciA9IHVzZUNhbGxiYWNrKGFzeW5jICgpID0+IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBlZGl0UHJvbXB0SW5FZGl0b3IocHJvbXB0KVxuICAgIGlmIChyZXN1bHQuY29udGVudCAhPT0gbnVsbCkge1xuICAgICAgc2V0UHJvbXB0KHJlc3VsdC5jb250ZW50KVxuICAgICAgc2V0Q3Vyc29yT2Zmc2V0KHJlc3VsdC5jb250ZW50Lmxlbmd0aClcbiAgICB9XG4gIH0sIFtwcm9tcHRdKVxuXG4gIHVzZUtleWJpbmRpbmcoJ2NoYXQ6ZXh0ZXJuYWxFZGl0b3InLCBoYW5kbGVFeHRlcm5hbEVkaXRvciwge1xuICAgIGNvbnRleHQ6ICdDaGF0JyxcbiAgICBpc0FjdGl2ZTogIWlzR2VuZXJhdGluZyxcbiAgfSlcblxuICAvLyBHbyBiYWNrIHdoZW4gZXNjYXBlIHByZXNzZWQgd2hpbGUgbm90IGdlbmVyYXRpbmdcbiAgY29uc3QgaGFuZGxlR29CYWNrID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIHVwZGF0ZVdpemFyZERhdGEoe1xuICAgICAgZ2VuZXJhdGlvblByb21wdDogJycsXG4gICAgICBhZ2VudFR5cGU6ICcnLFxuICAgICAgc3lzdGVtUHJvbXB0OiAnJyxcbiAgICAgIHdoZW5Ub1VzZTogJycsXG4gICAgICBnZW5lcmF0ZWRBZ2VudDogdW5kZWZpbmVkLFxuICAgICAgd2FzR2VuZXJhdGVkOiBmYWxzZSxcbiAgICB9KVxuICAgIHNldFByb21wdCgnJylcbiAgICBzZXRFcnJvcihudWxsKVxuICAgIGdvQmFjaygpXG4gIH0sIFt1cGRhdGVXaXphcmREYXRhLCBnb0JhY2tdKVxuXG4gIC8vIFVzZSBTZXR0aW5ncyBjb250ZXh0IHNvICduJyBrZXkgZG9lc24ndCBjYW5jZWwgKGFsbG93cyB0eXBpbmcgJ24nIGluIHByb21wdCBpbnB1dClcbiAgdXNlS2V5YmluZGluZygnY29uZmlybTpubycsIGhhbmRsZUdvQmFjaywge1xuICAgIGNvbnRleHQ6ICdTZXR0aW5ncycsXG4gICAgaXNBY3RpdmU6ICFpc0dlbmVyYXRpbmcsXG4gIH0pXG5cbiAgY29uc3QgaGFuZGxlR2VuZXJhdGUgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgY29uc3QgdHJpbW1lZFByb21wdCA9IHByb21wdC50cmltKClcbiAgICBpZiAoIXRyaW1tZWRQcm9tcHQpIHtcbiAgICAgIHNldEVycm9yKCdQbGVhc2UgZGVzY3JpYmUgd2hhdCB0aGUgYWdlbnQgc2hvdWxkIGRvJylcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHNldEVycm9yKG51bGwpXG4gICAgc2V0SXNHZW5lcmF0aW5nKHRydWUpXG4gICAgdXBkYXRlV2l6YXJkRGF0YSh7XG4gICAgICBnZW5lcmF0aW9uUHJvbXB0OiB0cmltbWVkUHJvbXB0LFxuICAgICAgaXNHZW5lcmF0aW5nOiB0cnVlLFxuICAgIH0pXG5cbiAgICAvLyBDcmVhdGUgYWJvcnQgY29udHJvbGxlciBmb3IgdGhpcyBnZW5lcmF0aW9uXG4gICAgY29uc3QgY29udHJvbGxlciA9IGNyZWF0ZUFib3J0Q29udHJvbGxlcigpXG4gICAgYWJvcnRDb250cm9sbGVyUmVmLmN1cnJlbnQgPSBjb250cm9sbGVyXG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgZ2VuZXJhdGVkID0gYXdhaXQgZ2VuZXJhdGVBZ2VudChcbiAgICAgICAgdHJpbW1lZFByb21wdCxcbiAgICAgICAgbW9kZWwsXG4gICAgICAgIFtdLFxuICAgICAgICBjb250cm9sbGVyLnNpZ25hbCxcbiAgICAgIClcblxuICAgICAgdXBkYXRlV2l6YXJkRGF0YSh7XG4gICAgICAgIGFnZW50VHlwZTogZ2VuZXJhdGVkLmlkZW50aWZpZXIsXG4gICAgICAgIHdoZW5Ub1VzZTogZ2VuZXJhdGVkLndoZW5Ub1VzZSxcbiAgICAgICAgc3lzdGVtUHJvbXB0OiBnZW5lcmF0ZWQuc3lzdGVtUHJvbXB0LFxuICAgICAgICBnZW5lcmF0ZWRBZ2VudDogZ2VuZXJhdGVkLFxuICAgICAgICBpc0dlbmVyYXRpbmc6IGZhbHNlLFxuICAgICAgICB3YXNHZW5lcmF0ZWQ6IHRydWUsXG4gICAgICB9KVxuXG4gICAgICAvLyBTa2lwIGRpcmVjdGx5IHRvIFRvb2xzU3RlcCAoaW5kZXggNikgLSBtYXRjaGluZyBvcmlnaW5hbCBmbG93XG4gICAgICBnb1RvU3RlcCg2KVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgLy8gRG9uJ3Qgc2hvdyBlcnJvciBpZiBpdCB3YXMgY2FuY2VsbGVkIChhbHJlYWR5IHNldCBpbiBlc2NhcGUgaGFuZGxlcilcbiAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBBUElVc2VyQWJvcnRFcnJvcikge1xuICAgICAgICAvLyBVc2VyIGNhbmNlbGxlZCAtIG5vIGVycm9yIHRvIHNob3dcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIGVyciBpbnN0YW5jZW9mIEVycm9yICYmXG4gICAgICAgICFlcnIubWVzc2FnZS5pbmNsdWRlcygnTm8gYXNzaXN0YW50IG1lc3NhZ2UgZm91bmQnKVxuICAgICAgKSB7XG4gICAgICAgIHNldEVycm9yKGVyci5tZXNzYWdlIHx8ICdGYWlsZWQgdG8gZ2VuZXJhdGUgYWdlbnQnKVxuICAgICAgfVxuICAgICAgdXBkYXRlV2l6YXJkRGF0YSh7IGlzR2VuZXJhdGluZzogZmFsc2UgfSlcbiAgICB9IGZpbmFsbHkge1xuICAgICAgc2V0SXNHZW5lcmF0aW5nKGZhbHNlKVxuICAgICAgYWJvcnRDb250cm9sbGVyUmVmLmN1cnJlbnQgPSBudWxsXG4gICAgfVxuICB9XG5cbiAgY29uc3Qgc3VidGl0bGUgPVxuICAgICdEZXNjcmliZSB3aGF0IHRoaXMgYWdlbnQgc2hvdWxkIGRvIGFuZCB3aGVuIGl0IHNob3VsZCBiZSB1c2VkIChiZSBjb21wcmVoZW5zaXZlIGZvciBiZXN0IHJlc3VsdHMpJ1xuXG4gIGlmIChpc0dlbmVyYXRpbmcpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPFdpemFyZERpYWxvZ0xheW91dFxuICAgICAgICBzdWJ0aXRsZT17c3VidGl0bGV9XG4gICAgICAgIGZvb3RlclRleHQ9e1xuICAgICAgICAgIDxDb25maWd1cmFibGVTaG9ydGN1dEhpbnRcbiAgICAgICAgICAgIGFjdGlvbj1cImNvbmZpcm06bm9cIlxuICAgICAgICAgICAgY29udGV4dD1cIlNldHRpbmdzXCJcbiAgICAgICAgICAgIGZhbGxiYWNrPVwiRXNjXCJcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uPVwiY2FuY2VsXCJcbiAgICAgICAgICAvPlxuICAgICAgICB9XG4gICAgICA+XG4gICAgICAgIDxCb3ggZmxleERpcmVjdGlvbj1cInJvd1wiIGFsaWduSXRlbXM9XCJjZW50ZXJcIj5cbiAgICAgICAgICA8U3Bpbm5lciAvPlxuICAgICAgICAgIDxUZXh0IGNvbG9yPVwic3VnZ2VzdGlvblwiPiBHZW5lcmF0aW5nIGFnZW50IGZyb20gZGVzY3JpcHRpb24uLi48L1RleHQ+XG4gICAgICAgIDwvQm94PlxuICAgICAgPC9XaXphcmREaWFsb2dMYXlvdXQ+XG4gICAgKVxuICB9XG5cbiAgcmV0dXJuIChcbiAgICA8V2l6YXJkRGlhbG9nTGF5b3V0XG4gICAgICBzdWJ0aXRsZT17c3VidGl0bGV9XG4gICAgICBmb290ZXJUZXh0PXtcbiAgICAgICAgPEJ5bGluZT5cbiAgICAgICAgICA8Q29uZmlndXJhYmxlU2hvcnRjdXRIaW50XG4gICAgICAgICAgICBhY3Rpb249XCJjb25maXJtOnllc1wiXG4gICAgICAgICAgICBjb250ZXh0PVwiQ29uZmlybWF0aW9uXCJcbiAgICAgICAgICAgIGZhbGxiYWNrPVwiRW50ZXJcIlxuICAgICAgICAgICAgZGVzY3JpcHRpb249XCJzdWJtaXRcIlxuICAgICAgICAgIC8+XG4gICAgICAgICAgPENvbmZpZ3VyYWJsZVNob3J0Y3V0SGludFxuICAgICAgICAgICAgYWN0aW9uPVwiY2hhdDpleHRlcm5hbEVkaXRvclwiXG4gICAgICAgICAgICBjb250ZXh0PVwiQ2hhdFwiXG4gICAgICAgICAgICBmYWxsYmFjaz1cImN0cmwrZ1wiXG4gICAgICAgICAgICBkZXNjcmlwdGlvbj1cIm9wZW4gaW4gZWRpdG9yXCJcbiAgICAgICAgICAvPlxuICAgICAgICAgIDxDb25maWd1cmFibGVTaG9ydGN1dEhpbnRcbiAgICAgICAgICAgIGFjdGlvbj1cImNvbmZpcm06bm9cIlxuICAgICAgICAgICAgY29udGV4dD1cIlNldHRpbmdzXCJcbiAgICAgICAgICAgIGZhbGxiYWNrPVwiRXNjXCJcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uPVwiZ28gYmFja1wiXG4gICAgICAgICAgLz5cbiAgICAgICAgPC9CeWxpbmU+XG4gICAgICB9XG4gICAgPlxuICAgICAgPEJveCBmbGV4RGlyZWN0aW9uPVwiY29sdW1uXCI+XG4gICAgICAgIHtlcnJvciAmJiAoXG4gICAgICAgICAgPEJveCBtYXJnaW5Cb3R0b209ezF9PlxuICAgICAgICAgICAgPFRleHQgY29sb3I9XCJlcnJvclwiPntlcnJvcn08L1RleHQ+XG4gICAgICAgICAgPC9Cb3g+XG4gICAgICAgICl9XG4gICAgICAgIDxUZXh0SW5wdXRcbiAgICAgICAgICB2YWx1ZT17cHJvbXB0fVxuICAgICAgICAgIG9uQ2hhbmdlPXtzZXRQcm9tcHR9XG4gICAgICAgICAgb25TdWJtaXQ9e2hhbmRsZUdlbmVyYXRlfVxuICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiwgSGVscCBtZSB3cml0ZSB1bml0IHRlc3RzIGZvciBteSBjb2RlLi4uXCJcbiAgICAgICAgICBjb2x1bW5zPXs4MH1cbiAgICAgICAgICBjdXJzb3JPZmZzZXQ9e2N1cnNvck9mZnNldH1cbiAgICAgICAgICBvbkNoYW5nZUN1cnNvck9mZnNldD17c2V0Q3Vyc29yT2Zmc2V0fVxuICAgICAgICAgIGZvY3VzXG4gICAgICAgICAgc2hvd0N1cnNvclxuICAgICAgICAvPlxuICAgICAgPC9Cb3g+XG4gICAgPC9XaXphcmREaWFsb2dMYXlvdXQ+XG4gIClcbn1cbiJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBU0EsaUJBQWlCLFFBQVEsbUJBQW1CO0FBQ3JELE9BQU9DLEtBQUssSUFBSSxLQUFLQyxTQUFTLEVBQUVDLFdBQVcsRUFBRUMsTUFBTSxFQUFFQyxRQUFRLFFBQVEsT0FBTztBQUM1RSxTQUFTQyxnQkFBZ0IsUUFBUSx1Q0FBdUM7QUFDeEUsU0FBU0MsR0FBRyxFQUFFQyxJQUFJLFFBQVEsb0JBQW9CO0FBQzlDLFNBQVNDLGFBQWEsUUFBUSwwQ0FBMEM7QUFDeEUsU0FBU0MscUJBQXFCLFFBQVEsc0NBQXNDO0FBQzVFLFNBQVNDLGtCQUFrQixRQUFRLG1DQUFtQztBQUN0RSxTQUFTQyx3QkFBd0IsUUFBUSxzQ0FBc0M7QUFDL0UsU0FBU0MsTUFBTSxRQUFRLGtDQUFrQztBQUN6RCxTQUFTQyxPQUFPLFFBQVEscUJBQXFCO0FBQzdDLE9BQU9DLFNBQVMsTUFBTSx1QkFBdUI7QUFDN0MsU0FBU0MsU0FBUyxRQUFRLDBCQUEwQjtBQUNwRCxTQUFTQyxrQkFBa0IsUUFBUSx1Q0FBdUM7QUFDMUUsU0FBU0MsYUFBYSxRQUFRLHdCQUF3QjtBQUN0RCxjQUFjQyxlQUFlLFFBQVEsYUFBYTtBQUVsRCxPQUFPLFNBQVNDLFlBQVlBLENBQUEsQ0FBRSxFQUFFbEIsU0FBUyxDQUFDO0VBQ3hDLE1BQU07SUFBRW1CLGdCQUFnQjtJQUFFQyxNQUFNO0lBQUVDLFFBQVE7SUFBRUM7RUFBVyxDQUFDLEdBQ3REUixTQUFTLENBQUNHLGVBQWUsQ0FBQyxDQUFDLENBQUM7RUFDOUIsTUFBTSxDQUFD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
\ No newline at end of file
diff --git a/src/components/agents/new-agent-creation/wizard-steps/LocationStep.tsx b/src/components/agents/new-agent-creation/wizard-steps/LocationStep.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..d64c165665517461d2f6c6f41d4cda081f9a843c
--- /dev/null
+++ b/src/components/agents/new-agent-creation/wizard-steps/LocationStep.tsx
@@ -0,0 +1,80 @@
+import { c as _c } from "react/compiler-runtime";
+import React, { type ReactNode } from 'react';
+import { Box } from '../../../../ink.js';
+import type { SettingSource } from '../../../../utils/settings/constants.js';
+import { ConfigurableShortcutHint } from '../../../ConfigurableShortcutHint.js';
+import { Select } from '../../../CustomSelect/select.js';
+import { Byline } from '../../../design-system/Byline.js';
+import { KeyboardShortcutHint } from '../../../design-system/KeyboardShortcutHint.js';
+import { useWizard } from '../../../wizard/index.js';
+import { WizardDialogLayout } from '../../../wizard/WizardDialogLayout.js';
+import type { AgentWizardData } from '../types.js';
+export function LocationStep() {
+ const $ = _c(11);
+ const {
+ goNext,
+ updateWizardData,
+ cancel
+ } = useWizard();
+ let t0;
+ if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
+ t0 = {
+ label: "Project (.claude/agents/)",
+ value: "projectSettings" as SettingSource
+ };
+ $[0] = t0;
+ } else {
+ t0 = $[0];
+ }
+ let t1;
+ if ($[1] === Symbol.for("react.memo_cache_sentinel")) {
+ t1 = [t0, {
+ label: "Personal (~/.claude/agents/)",
+ value: "userSettings" as SettingSource
+ }];
+ $[1] = t1;
+ } else {
+ t1 = $[1];
+ }
+ const locationOptions = t1;
+ let t2;
+ if ($[2] === Symbol.for("react.memo_cache_sentinel")) {
+ t2 = ;
+ $[2] = t2;
+ } else {
+ t2 = $[2];
+ }
+ let t3;
+ if ($[3] !== goNext || $[4] !== updateWizardData) {
+ t3 = value => {
+ updateWizardData({
+ location: value as SettingSource
+ });
+ goNext();
+ };
+ $[3] = goNext;
+ $[4] = updateWizardData;
+ $[5] = t3;
+ } else {
+ t3 = $[5];
+ }
+ let t4;
+ if ($[6] !== cancel) {
+ t4 = () => cancel();
+ $[6] = cancel;
+ $[7] = t4;
+ } else {
+ t4 = $[7];
+ }
+ let t5;
+ if ($[8] !== t3 || $[9] !== t4) {
+ t5 = ;
+ $[8] = t3;
+ $[9] = t4;
+ $[10] = t5;
+ } else {
+ t5 = $[10];
+ }
+ return t5;
+}
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsIlJlYWN0Tm9kZSIsIkJveCIsIlNldHRpbmdTb3VyY2UiLCJDb25maWd1cmFibGVTaG9ydGN1dEhpbnQiLCJTZWxlY3QiLCJCeWxpbmUiLCJLZXlib2FyZFNob3J0Y3V0SGludCIsInVzZVdpemFyZCIsIldpemFyZERpYWxvZ0xheW91dCIsIkFnZW50V2l6YXJkRGF0YSIsIkxvY2F0aW9uU3RlcCIsIiQiLCJfYyIsImdvTmV4dCIsInVwZGF0ZVdpemFyZERhdGEiLCJjYW5jZWwiLCJ0MCIsIlN5bWJvbCIsImZvciIsImxhYmVsIiwidmFsdWUiLCJ0MSIsImxvY2F0aW9uT3B0aW9ucyIsInQyIiwidDMiLCJsb2NhdGlvbiIsInQ0IiwidDUiXSwic291cmNlcyI6WyJMb2NhdGlvblN0ZXAudHN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCwgeyB0eXBlIFJlYWN0Tm9kZSB9IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgQm94IH0gZnJvbSAnLi4vLi4vLi4vLi4vaW5rLmpzJ1xuaW1wb3J0IHR5cGUgeyBTZXR0aW5nU291cmNlIH0gZnJvbSAnLi4vLi4vLi4vLi4vdXRpbHMvc2V0dGluZ3MvY29uc3RhbnRzLmpzJ1xuaW1wb3J0IHsgQ29uZmlndXJhYmxlU2hvcnRjdXRIaW50IH0gZnJvbSAnLi4vLi4vLi4vQ29uZmlndXJhYmxlU2hvcnRjdXRIaW50LmpzJ1xuaW1wb3J0IHsgU2VsZWN0IH0gZnJvbSAnLi4vLi4vLi4vQ3VzdG9tU2VsZWN0L3NlbGVjdC5qcydcbmltcG9ydCB7IEJ5bGluZSB9IGZyb20gJy4uLy4uLy4uL2Rlc2lnbi1zeXN0ZW0vQnlsaW5lLmpzJ1xuaW1wb3J0IHsgS2V5Ym9hcmRTaG9ydGN1dEhpbnQgfSBmcm9tICcuLi8uLi8uLi9kZXNpZ24tc3lzdGVtL0tleWJvYXJkU2hvcnRjdXRIaW50LmpzJ1xuaW1wb3J0IHsgdXNlV2l6YXJkIH0gZnJvbSAnLi4vLi4vLi4vd2l6YXJkL2luZGV4LmpzJ1xuaW1wb3J0IHsgV2l6YXJkRGlhbG9nTGF5b3V0IH0gZnJvbSAnLi4vLi4vLi4vd2l6YXJkL1dpemFyZERpYWxvZ0xheW91dC5qcydcbmltcG9ydCB0eXBlIHsgQWdlbnRXaXphcmREYXRhIH0gZnJvbSAnLi4vdHlwZXMuanMnXG5cbmV4cG9ydCBmdW5jdGlvbiBMb2NhdGlvblN0ZXAoKTogUmVhY3ROb2RlIHtcbiAgY29uc3QgeyBnb05leHQsIHVwZGF0ZVdpemFyZERhdGEsIGNhbmNlbCB9ID0gdXNlV2l6YXJkPEFnZW50V2l6YXJkRGF0YT4oKVxuXG4gIGNvbnN0IGxvY2F0aW9uT3B0aW9ucyA9IFtcbiAgICB7XG4gICAgICBsYWJlbDogJ1Byb2plY3QgKC5jbGF1ZGUvYWdlbnRzLyknLFxuICAgICAgdmFsdWU6ICdwcm9qZWN0U2V0dGluZ3MnIGFzIFNldHRpbmdTb3VyY2UsXG4gICAgfSxcbiAgICB7XG4gICAgICBsYWJlbDogJ1BlcnNvbmFsICh+Ly5jbGF1ZGUvYWdlbnRzLyknLFxuICAgICAgdmFsdWU6ICd1c2VyU2V0dGluZ3MnIGFzIFNldHRpbmdTb3VyY2UsXG4gICAgfSxcbiAgXVxuXG4gIHJldHVybiAoXG4gICAgPFdpemFyZERpYWxvZ0xheW91dFxuICAgICAgc3VidGl0bGU9XCJDaG9vc2UgbG9jYXRpb25cIlxuICAgICAgZm9vdGVyVGV4dD17XG4gICAgICAgIDxCeWxpbmU+XG4gICAgICAgICAgPEtleWJvYXJkU2hvcnRjdXRIaW50IHNob3J0Y3V0PVwi4oaR4oaTXCIgYWN0aW9uPVwibmF2aWdhdGVcIiAvPlxuICAgICAgICAgIDxLZXlib2FyZFNob3J0Y3V0SGludCBzaG9ydGN1dD1cIkVudGVyXCIgYWN0aW9uPVwic2VsZWN0XCIgLz5cbiAgICAgICAgICA8Q29uZmlndXJhYmxlU2hvcnRjdXRIaW50XG4gICAgICAgICAgICBhY3Rpb249XCJjb25maXJtOm5vXCJcbiAgICAgICAgICAgIGNvbnRleHQ9XCJDb25maXJtYXRpb25cIlxuICAgICAgICAgICAgZmFsbGJhY2s9XCJFc2NcIlxuICAgICAgICAgICAgZGVzY3JpcHRpb249XCJjYW5jZWxcIlxuICAgICAgICAgIC8+XG4gICAgICAgIDwvQnlsaW5lPlxuICAgICAgfVxuICAgID5cbiAgICAgIDxCb3g+XG4gICAgICAgIDxTZWxlY3RcbiAgICAgICAgICBrZXk9XCJsb2NhdGlvbi1zZWxlY3RcIlxuICAgICAgICAgIG9wdGlvbnM9e2xvY2F0aW9uT3B0aW9uc31cbiAgICAgICAgICBvbkNoYW5nZT17KHZhbHVlOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIHVwZGF0ZVdpemFyZERhdGEoeyBsb2NhdGlvbjogdmFsdWUgYXMgU2V0dGluZ1NvdXJjZSB9KVxuICAgICAgICAgICAgZ29OZXh0KClcbiAgICAgICAgICB9fVxuICAgICAgICAgIG9uQ2FuY2VsPXsoKSA9PiBjYW5jZWwoKX1cbiAgICAgICAgLz5cbiAgICAgIDwvQm94PlxuICAgIDwvV2l6YXJkRGlhbG9nTGF5b3V0PlxuICApXG59XG4iXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPQSxLQUFLLElBQUksS0FBS0MsU0FBUyxRQUFRLE9BQU87QUFDN0MsU0FBU0MsR0FBRyxRQUFRLG9CQUFvQjtBQUN4QyxjQUFjQyxhQUFhLFFBQVEseUNBQXlDO0FBQzVFLFNBQVNDLHdCQUF3QixRQUFRLHNDQUFzQztBQUMvRSxTQUFTQyxNQUFNLFFBQVEsaUNBQWlDO0FBQ3hELFNBQVNDLE1BQU0sUUFBUSxrQ0FBa0M7QUFDekQsU0FBU0Msb0JBQW9CLFFBQVEsZ0RBQWdEO0FBQ3JGLFNBQVNDLFNBQVMsUUFBUSwwQkFBMEI7QUFDcEQsU0FBU0Msa0JBQWtCLFFBQVEsdUNBQXVDO0FBQzFFLGNBQWNDLGVBQWUsUUFBUSxhQUFhO0FBRWxELE9BQU8sU0FBQUMsYUFBQTtFQUFBLE1BQUFDLENBQUEsR0FBQUMsRUFBQTtFQUNMO0lBQUFDLE1BQUE7SUFBQUMsZ0JBQUE7SUFBQUM7RUFBQSxJQUE2Q1IsU0FBUyxDQUFrQixDQUFDO0VBQUEsSUFBQVMsRUFBQTtFQUFBLElBQUFMLENBQUEsUUFBQU0s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
\ No newline at end of file
diff --git a/src/components/agents/new-agent-creation/wizard-steps/PromptStep.tsx b/src/components/agents/new-agent-creation/wizard-steps/PromptStep.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..fee0039ed231f6b61876feb0b0b16877c0e10f1e
--- /dev/null
+++ b/src/components/agents/new-agent-creation/wizard-steps/PromptStep.tsx
@@ -0,0 +1,128 @@
+import { c as _c } from "react/compiler-runtime";
+import React, { type ReactNode, useCallback, useState } from 'react';
+import { Box, Text } from '../../../../ink.js';
+import { useKeybinding } from '../../../../keybindings/useKeybinding.js';
+import { editPromptInEditor } from '../../../../utils/promptEditor.js';
+import { ConfigurableShortcutHint } from '../../../ConfigurableShortcutHint.js';
+import { Byline } from '../../../design-system/Byline.js';
+import { KeyboardShortcutHint } from '../../../design-system/KeyboardShortcutHint.js';
+import TextInput from '../../../TextInput.js';
+import { useWizard } from '../../../wizard/index.js';
+import { WizardDialogLayout } from '../../../wizard/WizardDialogLayout.js';
+import type { AgentWizardData } from '../types.js';
+export function PromptStep() {
+ const $ = _c(20);
+ const {
+ goNext,
+ goBack,
+ updateWizardData,
+ wizardData
+ } = useWizard();
+ const [systemPrompt, setSystemPrompt] = useState(wizardData.systemPrompt || "");
+ const [cursorOffset, setCursorOffset] = useState(systemPrompt.length);
+ const [error, setError] = useState(null);
+ let t0;
+ if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
+ t0 = {
+ context: "Settings"
+ };
+ $[0] = t0;
+ } else {
+ t0 = $[0];
+ }
+ useKeybinding("confirm:no", goBack, t0);
+ let t1;
+ if ($[1] !== systemPrompt) {
+ t1 = async () => {
+ const result = await editPromptInEditor(systemPrompt);
+ if (result.content !== null) {
+ setSystemPrompt(result.content);
+ setCursorOffset(result.content.length);
+ }
+ };
+ $[1] = systemPrompt;
+ $[2] = t1;
+ } else {
+ t1 = $[2];
+ }
+ const handleExternalEditor = t1;
+ let t2;
+ if ($[3] === Symbol.for("react.memo_cache_sentinel")) {
+ t2 = {
+ context: "Chat"
+ };
+ $[3] = t2;
+ } else {
+ t2 = $[3];
+ }
+ useKeybinding("chat:externalEditor", handleExternalEditor, t2);
+ let t3;
+ if ($[4] !== goNext || $[5] !== systemPrompt || $[6] !== updateWizardData) {
+ t3 = () => {
+ const trimmedPrompt = systemPrompt.trim();
+ if (!trimmedPrompt) {
+ setError("System prompt is required");
+ return;
+ }
+ setError(null);
+ updateWizardData({
+ systemPrompt: trimmedPrompt
+ });
+ goNext();
+ };
+ $[4] = goNext;
+ $[5] = systemPrompt;
+ $[6] = updateWizardData;
+ $[7] = t3;
+ } else {
+ t3 = $[7];
+ }
+ const handleSubmit = t3;
+ let t4;
+ if ($[8] === Symbol.for("react.memo_cache_sentinel")) {
+ t4 = ;
+ $[8] = t4;
+ } else {
+ t4 = $[8];
+ }
+ let t5;
+ let t6;
+ if ($[9] === Symbol.for("react.memo_cache_sentinel")) {
+ t5 = Enter the system prompt for your agent:;
+ t6 = Be comprehensive for best results;
+ $[9] = t5;
+ $[10] = t6;
+ } else {
+ t5 = $[9];
+ t6 = $[10];
+ }
+ let t7;
+ if ($[11] !== cursorOffset || $[12] !== handleSubmit || $[13] !== systemPrompt) {
+ t7 = ;
+ $[11] = cursorOffset;
+ $[12] = handleSubmit;
+ $[13] = systemPrompt;
+ $[14] = t7;
+ } else {
+ t7 = $[14];
+ }
+ let t8;
+ if ($[15] !== error) {
+ t8 = error && {error};
+ $[15] = error;
+ $[16] = t8;
+ } else {
+ t8 = $[16];
+ }
+ let t9;
+ if ($[17] !== t7 || $[18] !== t8) {
+ t9 = {t5}{t6}{t7}{t8};
+ $[17] = t7;
+ $[18] = t8;
+ $[19] = t9;
+ } else {
+ t9 = $[19];
+ }
+ return t9;
+}
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsIlJlYWN0Tm9kZSIsInVzZUNhbGxiYWNrIiwidXNlU3RhdGUiLCJCb3giLCJUZXh0IiwidXNlS2V5YmluZGluZyIsImVkaXRQcm9tcHRJbkVkaXRvciIsIkNvbmZpZ3VyYWJsZVNob3J0Y3V0SGludCIsIkJ5bGluZSIsIktleWJvYXJkU2hvcnRjdXRIaW50IiwiVGV4dElucHV0IiwidXNlV2l6YXJkIiwiV2l6YXJkRGlhbG9nTGF5b3V0IiwiQWdlbnRXaXphcmREYXRhIiwiUHJvbXB0U3RlcCIsIiQiLCJfYyIsImdvTmV4dCIsImdvQmFjayIsInVwZGF0ZVdpemFyZERhdGEiLCJ3aXphcmREYXRhIiwic3lzdGVtUHJvbXB0Iiwic2V0U3lzdGVtUHJvbXB0IiwiY3Vyc29yT2Zmc2V0Iiwic2V0Q3Vyc29yT2Zmc2V0IiwibGVuZ3RoIiwiZXJyb3IiLCJzZXRFcnJvciIsInQwIiwiU3ltYm9sIiwiZm9yIiwiY29udGV4dCIsInQxIiwicmVzdWx0IiwiY29udGVudCIsImhhbmRsZUV4dGVybmFsRWRpdG9yIiwidDIiLCJ0MyIsInRyaW1tZWRQcm9tcHQiLCJ0cmltIiwiaGFuZGxlU3VibWl0IiwidDQiLCJ0NSIsInQ2IiwidDciLCJ0OCIsInQ5Il0sInNvdXJjZXMiOlsiUHJvbXB0U3RlcC50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0LCB7IHR5cGUgUmVhY3ROb2RlLCB1c2VDYWxsYmFjaywgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCdcbmltcG9ydCB7IEJveCwgVGV4dCB9IGZyb20gJy4uLy4uLy4uLy4uL2luay5qcydcbmltcG9ydCB7IHVzZUtleWJpbmRpbmcgfSBmcm9tICcuLi8uLi8uLi8uLi9rZXliaW5kaW5ncy91c2VLZXliaW5kaW5nLmpzJ1xuaW1wb3J0IHsgZWRpdFByb21wdEluRWRpdG9yIH0gZnJvbSAnLi4vLi4vLi4vLi4vdXRpbHMvcHJvbXB0RWRpdG9yLmpzJ1xuaW1wb3J0IHsgQ29uZmlndXJhYmxlU2hvcnRjdXRIaW50IH0gZnJvbSAnLi4vLi4vLi4vQ29uZmlndXJhYmxlU2hvcnRjdXRIaW50LmpzJ1xuaW1wb3J0IHsgQnlsaW5lIH0gZnJvbSAnLi4vLi4vLi4vZGVzaWduLXN5c3RlbS9CeWxpbmUuanMnXG5pbXBvcnQgeyBLZXlib2FyZFNob3J0Y3V0SGludCB9IGZyb20gJy4uLy4uLy4uL2Rlc2lnbi1zeXN0ZW0vS2V5Ym9hcmRTaG9ydGN1dEhpbnQuanMnXG5pbXBvcnQgVGV4dElucHV0IGZyb20gJy4uLy4uLy4uL1RleHRJbnB1dC5qcydcbmltcG9ydCB7IHVzZVdpemFyZCB9IGZyb20gJy4uLy4uLy4uL3dpemFyZC9pbmRleC5qcydcbmltcG9ydCB7IFdpemFyZERpYWxvZ0xheW91dCB9IGZyb20gJy4uLy4uLy4uL3dpemFyZC9XaXphcmREaWFsb2dMYXlvdXQuanMnXG5pbXBvcnQgdHlwZSB7IEFnZW50V2l6YXJkRGF0YSB9IGZyb20gJy4uL3R5cGVzLmpzJ1xuXG5leHBvcnQgZnVuY3Rpb24gUHJvbXB0U3RlcCgpOiBSZWFjdE5vZGUge1xuICBjb25zdCB7IGdvTmV4dCwgZ29CYWNrLCB1cGRhdGVXaXphcmREYXRhLCB3aXphcmREYXRhIH0gPVxuICAgIHVzZVdpemFyZDxBZ2VudFdpemFyZERhdGE+KClcbiAgY29uc3QgW3N5c3RlbVByb21wdCwgc2V0U3lzdGVtUHJvbXB0XSA9IHVzZVN0YXRlKFxuICAgIHdpemFyZERhdGEuc3lzdGVtUHJvbXB0IHx8ICcnLFxuICApXG4gIGNvbnN0IFtjdXJzb3JPZmZzZXQsIHNldEN1cnNvck9mZnNldF0gPSB1c2VTdGF0ZShzeXN0ZW1Qcm9tcHQubGVuZ3RoKVxuICBjb25zdCBbZXJyb3IsIHNldEVycm9yXSA9IHVzZVN0YXRlPHN0cmluZyB8IG51bGw+KG51bGwpXG5cbiAgLy8gSGFuZGxlIGVzY2FwZSBrZXkgLSB1c2UgU2V0dGluZ3MgY29udGV4dCBzbyAnbicga2V5IGRvZXNuJ3QgY2FuY2VsIChhbGxvd3MgdHlwaW5nICduJyBpbiBpbnB1dClcbiAgdXNlS2V5YmluZGluZygnY29uZmlybTpubycsIGdvQmFjaywgeyBjb250ZXh0OiAnU2V0dGluZ3MnIH0pXG5cbiAgY29uc3QgaGFuZGxlRXh0ZXJuYWxFZGl0b3IgPSB1c2VDYWxsYmFjayhhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZWRpdFByb21wdEluRWRpdG9yKHN5c3RlbVByb21wdClcbiAgICBpZiAocmVzdWx0LmNvbnRlbnQgIT09IG51bGwpIHtcbiAgICAgIHNldFN5c3RlbVByb21wdChyZXN1bHQuY29udGVudClcbiAgICAgIHNldEN1cnNvck9mZnNldChyZXN1bHQuY29udGVudC5sZW5ndGgpXG4gICAgfVxuICB9LCBbc3lzdGVtUHJvbXB0XSlcblxuICB1c2VLZXliaW5kaW5nKCdjaGF0OmV4dGVybmFsRWRpdG9yJywgaGFuZGxlRXh0ZXJuYWxFZGl0b3IsIHtcbiAgICBjb250ZXh0OiAnQ2hhdCcsXG4gIH0pXG5cbiAgY29uc3QgaGFuZGxlU3VibWl0ID0gKCk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IHRyaW1tZWRQcm9tcHQgPSBzeXN0ZW1Qcm9tcHQudHJpbSgpXG4gICAgaWYgKCF0cmltbWVkUHJvbXB0KSB7XG4gICAgICBzZXRFcnJvcignU3lzdGVtIHByb21wdCBpcyByZXF1aXJlZCcpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBzZXRFcnJvcihudWxsKVxuICAgIHVwZGF0ZVdpemFyZERhdGEoeyBzeXN0ZW1Qcm9tcHQ6IHRyaW1tZWRQcm9tcHQgfSlcbiAgICBnb05leHQoKVxuICB9XG5cbiAgcmV0dXJuIChcbiAgICA8V2l6YXJkRGlhbG9nTGF5b3V0XG4gICAgICBzdWJ0aXRsZT1cIlN5c3RlbSBwcm9tcHRcIlxuICAgICAgZm9vdGVyVGV4dD17XG4gICAgICAgIDxCeWxpbmU+XG4gICAgICAgICAgPEtleWJvYXJkU2hvcnRjdXRIaW50IHNob3J0Y3V0PVwiVHlwZVwiIGFjdGlvbj1cImVudGVyIHRleHRcIiAvPlxuICAgICAgICAgIDxLZXlib2FyZFNob3J0Y3V0SGludCBzaG9ydGN1dD1cIkVudGVyXCIgYWN0aW9uPVwiY29udGludWVcIiAvPlxuICAgICAgICAgIDxDb25maWd1cmFibGVTaG9ydGN1dEhpbnRcbiAgICAgICAgICAgIGFjdGlvbj1cImNoYXQ6ZXh0ZXJuYWxFZGl0b3JcIlxuICAgICAgICAgICAgY29udGV4dD1cIkNoYXRcIlxuICAgICAgICAgICAgZmFsbGJhY2s9XCJjdHJsK2dcIlxuICAgICAgICAgICAgZGVzY3JpcHRpb249XCJvcGVuIGluIGVkaXRvclwiXG4gICAgICAgICAgLz5cbiAgICAgICAgICA8Q29uZmlndXJhYmxlU2hvcnRjdXRIaW50XG4gICAgICAgICAgICBhY3Rpb249XCJjb25maXJtOm5vXCJcbiAgICAgICAgICAgIGNvbnRleHQ9XCJTZXR0aW5nc1wiXG4gICAgICAgICAgICBmYWxsYmFjaz1cIkVzY1wiXG4gICAgICAgICAgICBkZXNjcmlwdGlvbj1cImdvIGJhY2tcIlxuICAgICAgICAgIC8+XG4gICAgICAgIDwvQnlsaW5lPlxuICAgICAgfVxuICAgID5cbiAgICAgIDxCb3ggZmxleERpcmVjdGlvbj1cImNvbHVtblwiPlxuICAgICAgICA8VGV4dD5FbnRlciB0aGUgc3lzdGVtIHByb21wdCBmb3IgeW91ciBhZ2VudDo8L1RleHQ+XG4gICAgICAgIDxUZXh0IGRpbUNvbG9yPkJlIGNvbXByZWhlbnNpdmUgZm9yIGJlc3QgcmVzdWx0czwvVGV4dD5cblxuICAgICAgICA8Qm94IG1hcmdpblRvcD17MX0+XG4gICAgICAgICAgPFRleHRJbnB1dFxuICAgICAgICAgICAgdmFsdWU9e3N5c3RlbVByb21wdH1cbiAgICAgICAgICAgIG9uQ2hhbmdlPXtzZXRTeXN0ZW1Qcm9tcHR9XG4gICAgICAgICAgICBvblN1Ym1pdD17aGFuZGxlU3VibWl0fVxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJZb3UgYXJlIGEgaGVscGZ1bCBjb2RlIHJldmlld2VyIHdoby4uLlwiXG4gICAgICAgICAgICBjb2x1bW5zPXs4MH1cbiAgICAgICAgICAgIGN1cnNvck9mZnNldD17Y3Vyc29yT2Zmc2V0fVxuICAgICAgICAgICAgb25DaGFuZ2VDdXJzb3JPZmZzZXQ9e3NldEN1cnNvck9mZnNldH1cbiAgICAgICAgICAgIGZvY3VzXG4gICAgICAgICAgICBzaG93Q3Vyc29yXG4gICAgICAgICAgLz5cbiAgICAgICAgPC9Cb3g+XG5cbiAgICAgICAge2Vycm9yICYmIChcbiAgICAgICAgICA8Qm94IG1hcmdpblRvcD17MX0+XG4gICAgICAgICAgICA8VGV4dCBjb2xvcj1cImVycm9yXCI+e2Vycm9yfTwvVGV4dD5cbiAgICAgICAgICA8L0JveD5cbiAgICAgICAgKX1cbiAgICAgIDwvQm94PlxuICAgIDwvV2l6YXJkRGlhbG9nTGF5b3V0PlxuICApXG59XG4iXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPQSxLQUFLLElBQUksS0FBS0MsU0FBUyxFQUFFQyxXQUFXLEVBQUVDLFFBQVEsUUFBUSxPQUFPO0FBQ3BFLFNBQVNDLEdBQUcsRUFBRUMsSUFBSSxRQUFRLG9CQUFvQjtBQUM5QyxTQUFTQyxhQUFhLFFBQVEsMENBQTBDO0FBQ3hFLFNBQVNDLGtCQUFrQixRQUFRLG1DQUFtQztBQUN0RSxTQUFTQyx3QkFBd0IsUUFBUSxzQ0FBc0M7QUFDL0UsU0FBU0MsTUFBTSxRQUFRLGtDQUFrQztBQUN6RCxTQUFTQyxvQkFBb0IsUUFBUSxnREFBZ0Q7QUFDckYsT0FBT0MsU0FBUyxNQUFNLHVCQUF1QjtBQUM3QyxTQUFTQyxTQUFTLFFBQVEsMEJBQTBCO0FBQ3BELFNBQVNDLGtCQUFrQixRQUFRLHVDQUF1QztBQUMxRSxjQUFjQyxlQUFlLFFBQVEsYUFBYTtBQUVsRCxPQUFPLFNBQUFDLFdBQUE7RUFBQSxNQUFBQyxDQUFBLEdBQUFDLEVBQUE7RUFDTDtJQUFBQyxNQUFBO0lBQUFDLE1BQUE7SUFBQUMsZ0JBQUE7SUFBQUM7RUFBQSxJQUNFVCxTQUFTLENBQWtCLENBQUM7RUFDOUIsT0FBQVUsWUFBQSxFQUFBQyxlQUFBLElBQXdD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
\ No newline at end of file
diff --git a/src/components/design-system/Byline.tsx b/src/components/design-system/Byline.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..52f83da0fb946d28e8f547b8339c3e90a32e3766
--- /dev/null
+++ b/src/components/design-system/Byline.tsx
@@ -0,0 +1,77 @@
+import { c as _c } from "react/compiler-runtime";
+import React, { Children, isValidElement } from 'react';
+import { Text } from '../../ink.js';
+type Props = {
+ /** The items to join with a middot separator */
+ children: React.ReactNode;
+};
+
+/**
+ * Joins children with a middot separator (" · ") for inline metadata display.
+ *
+ * Named after the publishing term "byline" - the line of metadata typically
+ * shown below a title (e.g., "John Doe · 5 min read · Mar 12").
+ *
+ * Automatically filters out null/undefined/false children and only renders
+ * separators between valid elements.
+ *
+ * @example
+ * // Basic usage: "Enter to confirm · Esc to cancel"
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ * @example
+ * // With conditional children: "Esc to cancel" (only one item shown)
+ *
+ *
+ * {showEnter && }
+ *
+ *
+ *
+ *
+ */
+export function Byline(t0) {
+ const $ = _c(5);
+ const {
+ children
+ } = t0;
+ let t1;
+ let t2;
+ if ($[0] !== children) {
+ t2 = Symbol.for("react.early_return_sentinel");
+ bb0: {
+ const validChildren = Children.toArray(children);
+ if (validChildren.length === 0) {
+ t2 = null;
+ break bb0;
+ }
+ t1 = validChildren.map(_temp);
+ }
+ $[0] = children;
+ $[1] = t1;
+ $[2] = t2;
+ } else {
+ t1 = $[1];
+ t2 = $[2];
+ }
+ if (t2 !== Symbol.for("react.early_return_sentinel")) {
+ return t2;
+ }
+ let t3;
+ if ($[3] !== t1) {
+ t3 = <>{t1}>;
+ $[3] = t1;
+ $[4] = t3;
+ } else {
+ t3 = $[4];
+ }
+ return t3;
+}
+function _temp(child, index) {
+ return {index > 0 && · }{child};
+}
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsIkNoaWxkcmVuIiwiaXNWYWxpZEVsZW1lbnQiLCJUZXh0IiwiUHJvcHMiLCJjaGlsZHJlbiIsIlJlYWN0Tm9kZSIsIkJ5bGluZSIsInQwIiwiJCIsIl9jIiwidDEiLCJ0MiIsIlN5bWJvbCIsImZvciIsImJiMCIsInZhbGlkQ2hpbGRyZW4iLCJ0b0FycmF5IiwibGVuZ3RoIiwibWFwIiwiX3RlbXAiLCJ0MyIsImNoaWxkIiwiaW5kZXgiLCJrZXkiXSwic291cmNlcyI6WyJCeWxpbmUudHN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCwgeyBDaGlsZHJlbiwgaXNWYWxpZEVsZW1lbnQgfSBmcm9tICdyZWFjdCdcbmltcG9ydCB7IFRleHQgfSBmcm9tICcuLi8uLi9pbmsuanMnXG5cbnR5cGUgUHJvcHMgPSB7XG4gIC8qKiBUaGUgaXRlbXMgdG8gam9pbiB3aXRoIGEgbWlkZG90IHNlcGFyYXRvciAqL1xuICBjaGlsZHJlbjogUmVhY3QuUmVhY3ROb2RlXG59XG5cbi8qKlxuICogSm9pbnMgY2hpbGRyZW4gd2l0aCBhIG1pZGRvdCBzZXBhcmF0b3IgKFwiIMK3IFwiKSBmb3IgaW5saW5lIG1ldGFkYXRhIGRpc3BsYXkuXG4gKlxuICogTmFtZWQgYWZ0ZXIgdGhlIHB1Ymxpc2hpbmcgdGVybSBcImJ5bGluZVwiIC0gdGhlIGxpbmUgb2YgbWV0YWRhdGEgdHlwaWNhbGx5XG4gKiBzaG93biBiZWxvdyBhIHRpdGxlIChlLmcuLCBcIkpvaG4gRG9lIMK3IDUgbWluIHJlYWQgwrcgTWFyIDEyXCIpLlxuICpcbiAqIEF1dG9tYXRpY2FsbHkgZmlsdGVycyBvdXQgbnVsbC91bmRlZmluZWQvZmFsc2UgY2hpbGRyZW4gYW5kIG9ubHkgcmVuZGVyc1xuICogc2VwYXJhdG9ycyBiZXR3ZWVuIHZhbGlkIGVsZW1lbnRzLlxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBCYXNpYyB1c2FnZTogXCJFbnRlciB0byBjb25maXJtIMK3IEVzYyB0byBjYW5jZWxcIlxuICogPFRleHQgZGltQ29sb3I+XG4gKiAgIDxCeWxpbmU+XG4gKiAgICAgPEtleWJvYXJkU2hvcnRjdXRIaW50IHNob3J0Y3V0PVwiRW50ZXJcIiBhY3Rpb249XCJjb25maXJtXCIgLz5cbiAqICAgICA8S2V5Ym9hcmRTaG9ydGN1dEhpbnQgc2hvcnRjdXQ9XCJFc2NcIiBhY3Rpb249XCJjYW5jZWxcIiAvPlxuICogICA8L0J5bGluZT5cbiAqIDwvVGV4dD5cbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gV2l0aCBjb25kaXRpb25hbCBjaGlsZHJlbjogXCJFc2MgdG8gY2FuY2VsXCIgKG9ubHkgb25lIGl0ZW0gc2hvd24pXG4gKiA8VGV4dCBkaW1Db2xvcj5cbiAqICAgPEJ5bGluZT5cbiAqICAgICB7c2hvd0VudGVyICYmIDxLZXlib2FyZFNob3J0Y3V0SGludCBzaG9ydGN1dD1cIkVudGVyXCIgYWN0aW9uPVwiY29uZmlybVwiIC8+fVxuICogICAgIDxLZXlib2FyZFNob3J0Y3V0SGludCBzaG9ydGN1dD1cIkVzY1wiIGFjdGlvbj1cImNhbmNlbFwiIC8+XG4gKiAgIDwvQnlsaW5lPlxuICogPC9UZXh0PlxuICpcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEJ5bGluZSh7IGNoaWxkcmVuIH06IFByb3BzKTogUmVhY3QuUmVhY3ROb2RlIHtcbiAgLy8gQ2hpbGRyZW4udG9BcnJheSBhbHJlYWR5IGZpbHRlcnMgb3V0IG51bGwsIHVuZGVmaW5lZCwgYW5kIGJvb2xlYW5zXG4gIGNvbnN0IHZhbGlkQ2hpbGRyZW4gPSBDaGlsZHJlbi50b0FycmF5KGNoaWxkcmVuKVxuXG4gIGlmICh2YWxpZENoaWxkcmVuLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICByZXR1cm4gKFxuICAgIDw+XG4gICAgICB7dmFsaWRDaGlsZHJlbi5tYXAoKGNoaWxkLCBpbmRleCkgPT4gKFxuICAgICAgICA8UmVhY3QuRnJhZ21lbnRcbiAgICAgICAgICBrZXk9e2lzVmFsaWRFbGVtZW50KGNoaWxkKSA/IChjaGlsZC5rZXkgPz8gaW5kZXgpIDogaW5kZXh9XG4gICAgICAgID5cbiAgICAgICAgICB7aW5kZXggPiAwICYmIDxUZXh0IGRpbUNvbG9yPiDCtyA8L1RleHQ+fVxuICAgICAgICAgIHtjaGlsZH1cbiAgICAgICAgPC9SZWFjdC5GcmFnbWVudD5cbiAgICAgICkpfVxuICAgIDwvPlxuICApXG59XG4iXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPQSxLQUFLLElBQUlDLFFBQVEsRUFBRUMsY0FBYyxRQUFRLE9BQU87QUFDdkQsU0FBU0MsSUFBSSxRQUFRLGNBQWM7QUFFbkMsS0FBS0MsS0FBSyxHQUFHO0VBQ1g7RUFDQUMsUUFBUSxFQUFFTCxLQUFLLENBQUNNLFNBQVM7QUFDM0IsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU8sU0FBQUMsT0FBQUMsRUFBQTtFQUFBLE1BQUFDLENBQUEsR0FBQUMsRUFBQTtFQUFnQjtJQUFBTDtFQUFBLElBQUFHLEVBQW1CO0VBQUEsSUFBQUcsRUFBQTtFQUFBLElBQUFDLEVBQUE7RUFBQSxJQUFBSCxDQUFBLFFBQUFKLFFBQUE7SUFLL0JPLEVBQUEsR0FBQUMsTUFBSSxDQUFBQyxHQUFBLENBQUosNkJBQUcsQ0FBQztJQUFBQyxHQUFBO01BSGIsTUFBQUMsYUFBQSxHQUFzQmYsUUFBUSxDQUFBZ0IsT0FBUSxDQUFDWixRQUFRLENBQUM7TUFFaEQsSUFBSVcsYUFBYSxDQUFBRSxNQUFPLEtBQUssQ0FBQztRQUNyQk4sRUFBQSxPQUFJO1FBQUosTUFBQUcsR0FBQTtNQUFJO01BS1JKLEVBQUEsR0FBQUssYUFBYSxDQUFBRyxHQUFJLENBQUNDLEtBT2xCLENBQUM7SUFBQTtJQUFBWCxDQUFBLE1BQUFKLFFBQUE7SUFBQUksQ0FBQSxNQUFBRSxFQUFBO0lBQUFGLENBQUEsTUFBQUcsRUFBQTtFQUFBO0lBQUFELEVBQUEsR0FBQUYsQ0FBQTtJQUFBRyxFQUFBLEdBQUFILENBQUE7RUFBQTtFQUFBLElBQUFHLEVBQUEsS0FBQUMsTUFBQSxDQUFBQyxHQUFBO0lBQUEsT0FBQUYsRUFBQTtFQUFBO0VBQUEsSUFBQVMsRUFBQTtFQUFBLElBQUFaLENBQUEsUUFBQUUsRUFBQTtJQVJKVSxFQUFBLEtBQ0csQ0FBQVYsRUFPQSxDQUFDLEdBQ0Q7SUFBQUYsQ0FBQSxNQUFBRSxFQUFBO0lBQUFGLENBQUEsTUFBQVksRUFBQTtFQUFBO0lBQUFBLEVBQUEsR0FBQVosQ0FBQTtFQUFBO0VBQUEsT0FUSFksRUFTRztBQUFBO0FBbEJBLFNBQUFELE1BQUFFLEtBQUEsRUFBQUMsS0FBQTtFQUFBLE9BV0MsZ0JBQ08sR0FBb0QsQ0FBcEQsQ0FBQXJCLGNBQWMsQ0FBQ29CLEtBQW9DLENBQUMsR0FBM0JBLEtBQUssQ0FBQUUsR0FBYSxJQUFsQkQsS0FBMkIsR0FBcERBLEtBQW1ELENBQUMsQ0FFeEQsQ0FBQUEsS0FBSyxHQUFHLENBQThCLElBQXpCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBUixLQUFPLENBQUMsQ0FBQyxHQUFHLEVBQWpCLElBQUksQ0FBbUIsQ0FDckNELE1BQUksQ0FDUCxpQkFBaUI7QUFBQSIsImlnbm9yZUxpc3QiOltdfQ==
\ No newline at end of file
diff --git a/src/components/design-system/Dialog.tsx b/src/components/design-system/Dialog.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..7d0dae106a24b756905462bdb655cedacd0725d8
--- /dev/null
+++ b/src/components/design-system/Dialog.tsx
@@ -0,0 +1,138 @@
+import { c as _c } from "react/compiler-runtime";
+import React from 'react';
+import { type ExitState, useExitOnCtrlCDWithKeybindings } from '../../hooks/useExitOnCtrlCDWithKeybindings.js';
+import { Box, Text } from '../../ink.js';
+import { useKeybinding } from '../../keybindings/useKeybinding.js';
+import type { Theme } from '../../utils/theme.js';
+import { ConfigurableShortcutHint } from '../ConfigurableShortcutHint.js';
+import { Byline } from './Byline.js';
+import { KeyboardShortcutHint } from './KeyboardShortcutHint.js';
+import { Pane } from './Pane.js';
+type DialogProps = {
+ title: React.ReactNode;
+ subtitle?: React.ReactNode;
+ children: React.ReactNode;
+ onCancel: () => void;
+ color?: keyof Theme;
+ hideInputGuide?: boolean;
+ hideBorder?: boolean;
+ /** Custom input guide content. Receives exitState for Ctrl+C/D pending display. */
+ inputGuide?: (exitState: ExitState) => React.ReactNode;
+ /**
+ * Controls whether Dialog's built-in confirm:no (Esc/n) and app:exit/interrupt
+ * (Ctrl-C/D) keybindings are active. Set to `false` while an embedded text
+ * field is being edited so those keys reach the field instead of being
+ * consumed by Dialog. TextInput has its own ctrl+c/d handlers (cancel on
+ * press, delete-forward on ctrl+d with text). Defaults to `true`.
+ */
+ isCancelActive?: boolean;
+};
+export function Dialog(t0) {
+ const $ = _c(27);
+ const {
+ title,
+ subtitle,
+ children,
+ onCancel,
+ color: t1,
+ hideInputGuide,
+ hideBorder,
+ inputGuide,
+ isCancelActive: t2
+ } = t0;
+ const color = t1 === undefined ? "permission" : t1;
+ const isCancelActive = t2 === undefined ? true : t2;
+ const exitState = useExitOnCtrlCDWithKeybindings(undefined, undefined, isCancelActive);
+ let t3;
+ if ($[0] !== isCancelActive) {
+ t3 = {
+ context: "Confirmation",
+ isActive: isCancelActive
+ };
+ $[0] = isCancelActive;
+ $[1] = t3;
+ } else {
+ t3 = $[1];
+ }
+ useKeybinding("confirm:no", onCancel, t3);
+ let t4;
+ if ($[2] !== exitState.keyName || $[3] !== exitState.pending) {
+ t4 = exitState.pending ? Press {exitState.keyName} again to exit : ;
+ $[2] = exitState.keyName;
+ $[3] = exitState.pending;
+ $[4] = t4;
+ } else {
+ t4 = $[4];
+ }
+ const defaultInputGuide = t4;
+ let t5;
+ if ($[5] !== color || $[6] !== title) {
+ t5 = {title};
+ $[5] = color;
+ $[6] = title;
+ $[7] = t5;
+ } else {
+ t5 = $[7];
+ }
+ let t6;
+ if ($[8] !== subtitle) {
+ t6 = subtitle && {subtitle};
+ $[8] = subtitle;
+ $[9] = t6;
+ } else {
+ t6 = $[9];
+ }
+ let t7;
+ if ($[10] !== t5 || $[11] !== t6) {
+ t7 = {t5}{t6};
+ $[10] = t5;
+ $[11] = t6;
+ $[12] = t7;
+ } else {
+ t7 = $[12];
+ }
+ let t8;
+ if ($[13] !== children || $[14] !== t7) {
+ t8 = {t7}{children};
+ $[13] = children;
+ $[14] = t7;
+ $[15] = t8;
+ } else {
+ t8 = $[15];
+ }
+ let t9;
+ if ($[16] !== defaultInputGuide || $[17] !== exitState || $[18] !== hideInputGuide || $[19] !== inputGuide) {
+ t9 = !hideInputGuide && {inputGuide ? inputGuide(exitState) : defaultInputGuide};
+ $[16] = defaultInputGuide;
+ $[17] = exitState;
+ $[18] = hideInputGuide;
+ $[19] = inputGuide;
+ $[20] = t9;
+ } else {
+ t9 = $[20];
+ }
+ let t10;
+ if ($[21] !== t8 || $[22] !== t9) {
+ t10 = <>{t8}{t9}>;
+ $[21] = t8;
+ $[22] = t9;
+ $[23] = t10;
+ } else {
+ t10 = $[23];
+ }
+ const content = t10;
+ if (hideBorder) {
+ return content;
+ }
+ let t11;
+ if ($[24] !== color || $[25] !== content) {
+ t11 = {content};
+ $[24] = color;
+ $[25] = content;
+ $[26] = t11;
+ } else {
+ t11 = $[26];
+ }
+ return t11;
+}
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsIkV4aXRTdGF0ZSIsInVzZUV4aXRPbkN0cmxDRFdpdGhLZXliaW5kaW5ncyIsIkJveCIsIlRleHQiLCJ1c2VLZXliaW5kaW5nIiwiVGhlbWUiLCJDb25maWd1cmFibGVTaG9ydGN1dEhpbnQiLCJCeWxpbmUiLCJLZXlib2FyZFNob3J0Y3V0SGludCIsIlBhbmUiLCJEaWFsb2dQcm9wcyIsInRpdGxlIiwiUmVhY3ROb2RlIiwic3VidGl0bGUiLCJjaGlsZHJlbiIsIm9uQ2FuY2VsIiwiY29sb3IiLCJoaWRlSW5wdXRHdWlkZSIsImhpZGVCb3JkZXIiLCJpbnB1dEd1aWRlIiwiZXhpdFN0YXRlIiwiaXNDYW5jZWxBY3RpdmUiLCJEaWFsb2ciLCJ0MCIsIiQiLCJfYyIsInQxIiwidDIiLCJ1bmRlZmluZWQiLCJ0MyIsImNvbnRleHQiLCJpc0FjdGl2ZSIsInQ0Iiwia2V5TmFtZSIsInBlbmRpbmciLCJkZWZhdWx0SW5wdXRHdWlkZSIsInQ1IiwidDYiLCJ0NyIsInQ4IiwidDkiLCJ0MTAiLCJjb250ZW50IiwidDExIl0sInNvdXJjZXMiOlsiRGlhbG9nLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQge1xuICB0eXBlIEV4aXRTdGF0ZSxcbiAgdXNlRXhpdE9uQ3RybENEV2l0aEtleWJpbmRpbmdzLFxufSBmcm9tICcuLi8uLi9ob29rcy91c2VFeGl0T25DdHJsQ0RXaXRoS2V5YmluZGluZ3MuanMnXG5pbXBvcnQgeyBCb3gsIFRleHQgfSBmcm9tICcuLi8uLi9pbmsuanMnXG5pbXBvcnQgeyB1c2VLZXliaW5kaW5nIH0gZnJvbSAnLi4vLi4va2V5YmluZGluZ3MvdXNlS2V5YmluZGluZy5qcydcbmltcG9ydCB0eXBlIHsgVGhlbWUgfSBmcm9tICcuLi8uLi91dGlscy90aGVtZS5qcydcbmltcG9ydCB7IENvbmZpZ3VyYWJsZVNob3J0Y3V0SGludCB9IGZyb20gJy4uL0NvbmZpZ3VyYWJsZVNob3J0Y3V0SGludC5qcydcbmltcG9ydCB7IEJ5bGluZSB9IGZyb20gJy4vQnlsaW5lLmpzJ1xuaW1wb3J0IHsgS2V5Ym9hcmRTaG9ydGN1dEhpbnQgfSBmcm9tICcuL0tleWJvYXJkU2hvcnRjdXRIaW50LmpzJ1xuaW1wb3J0IHsgUGFuZSB9IGZyb20gJy4vUGFuZS5qcydcblxudHlwZSBEaWFsb2dQcm9wcyA9IHtcbiAgdGl0bGU6IFJlYWN0LlJlYWN0Tm9kZVxuICBzdWJ0aXRsZT86IFJlYWN0LlJlYWN0Tm9kZVxuICBjaGlsZHJlbjogUmVhY3QuUmVhY3ROb2RlXG4gIG9uQ2FuY2VsOiAoKSA9PiB2b2lkXG4gIGNvbG9yPzoga2V5b2YgVGhlbWVcbiAgaGlkZUlucHV0R3VpZGU/OiBib29sZWFuXG4gIGhpZGVCb3JkZXI/OiBib29sZWFuXG4gIC8qKiBDdXN0b20gaW5wdXQgZ3VpZGUgY29udGVudC4gUmVjZWl2ZXMgZXhpdFN0YXRlIGZvciBDdHJsK0MvRCBwZW5kaW5nIGRpc3BsYXkuICovXG4gIGlucHV0R3VpZGU/OiAoZXhpdFN0YXRlOiBFeGl0U3RhdGUpID0+IFJlYWN0LlJlYWN0Tm9kZVxuICAvKipcbiAgICogQ29udHJvbHMgd2hldGhlciBEaWFsb2cncyBidWlsdC1pbiBjb25maXJtOm5vIChFc2MvbikgYW5kIGFwcDpleGl0L2ludGVycnVwdFxuICAgKiAoQ3RybC1DL0QpIGtleWJpbmRpbmdzIGFyZSBhY3RpdmUuIFNldCB0byBgZmFsc2VgIHdoaWxlIGFuIGVtYmVkZGVkIHRleHRcbiAgICogZmllbGQgaXMgYmVpbmcgZWRpdGVkIHNvIHRob3NlIGtleXMgcmVhY2ggdGhlIGZpZWxkIGluc3RlYWQgb2YgYmVpbmdcbiAgICogY29uc3VtZWQgYnkgRGlhbG9nLiBUZXh0SW5wdXQgaGFzIGl0cyBvd24gY3RybCtjL2QgaGFuZGxlcnMgKGNhbmNlbCBvblxuICAgKiBwcmVzcywgZGVsZXRlLWZvcndhcmQgb24gY3RybCtkIHdpdGggdGV4dCkuIERlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICovXG4gIGlzQ2FuY2VsQWN0aXZlPzogYm9vbGVhblxufVxuXG5leHBvcnQgZnVuY3Rpb24gRGlhbG9nKHtcbiAgdGl0bGUsXG4gIHN1YnRpdGxlLFxuICBjaGlsZHJlbixcbiAgb25DYW5jZWwsXG4gIGNvbG9yID0gJ3Blcm1pc3Npb24nLFxuICBoaWRlSW5wdXRHdWlkZSxcbiAgaGlkZUJvcmRlcixcbiAgaW5wdXRHdWlkZSxcbiAgaXNDYW5jZWxBY3RpdmUgPSB0cnVlLFxufTogRGlhbG9nUHJvcHMpOiBSZWFjdC5SZWFjdE5vZGUge1xuICBjb25zdCBleGl0U3RhdGUgPSB1c2VFeGl0T25DdHJsQ0RXaXRoS2V5YmluZGluZ3MoXG4gICAgdW5kZWZpbmVkLFxuICAgIHVuZGVmaW5lZCxcbiAgICBpc0NhbmNlbEFjdGl2ZSxcbiAgKVxuXG4gIC8vIFVzZSBjb25maWd1cmFibGUga2V5YmluZGluZyBmb3IgRVNDIHRvIGNhbmNlbC5cbiAgLy8gaXNDYW5jZWxBY3RpdmUgbGV0cyBjb25zdW1lcnMgKGUuZy4gRWxpY2l0YXRpb25EaWFsb2cpIGRpc2FibGUgdGhpcyB3aGlsZVxuICAvLyBhbiBlbWJlZGRlZCBUZXh0SW5wdXQgaXMgZm9jdXNlZCwgc28gdGhhdCBrZXlzIGxpa2UgJ24nIHJlYWNoIHRoZSBmaWVsZFxuICAvLyBpbnN0ZWFkIG9mIGJlaW5nIGNvbnN1bWVkIGhlcmUuXG4gIHVzZUtleWJpbmRpbmcoJ2NvbmZpcm06bm8nLCBvbkNhbmNlbCwge1xuICAgIGNvbnRleHQ6ICdDb25maXJtYXRpb24nLFxuICAgIGlzQWN0aXZlOiBpc0NhbmNlbEFjdGl2ZSxcbiAgfSlcblxuICBjb25zdCBkZWZhdWx0SW5wdXRHdWlkZSA9IGV4aXRTdGF0ZS5wZW5kaW5nID8gKFxuICAgIDxUZXh0PlByZXNzIHtleGl0U3RhdGUua2V5TmFtZX0gYWdhaW4gdG8gZXhpdDwvVGV4dD5cbiAgKSA6IChcbiAgICA8QnlsaW5lPlxuICAgICAgPEtleWJvYXJkU2hvcnRjdXRIaW50IHNob3J0Y3V0PVwiRW50ZXJcIiBhY3Rpb249XCJjb25maXJtXCIgLz5cbiAgICAgIDxDb25maWd1cmFibGVTaG9ydGN1dEhpbnRcbiAgICAgICAgYWN0aW9uPVwiY29uZmlybTpub1wiXG4gICAgICAgIGNvbnRleHQ9XCJDb25maXJtYXRpb25cIlxuICAgICAgICBmYWxsYmFjaz1cIkVzY1wiXG4gICAgICAgIGRlc2NyaXB0aW9uPVwiY2FuY2VsXCJcbiAgICAgIC8+XG4gICAgPC9CeWxpbmU+XG4gIClcblxuICBjb25zdCBjb250ZW50ID0gKFxuICAgIDw+XG4gICAgICA8Qm94IGZsZXhEaXJlY3Rpb249XCJjb2x1bW5cIiBnYXA9ezF9PlxuICAgICAgICA8Qm94IGZsZXhEaXJlY3Rpb249XCJjb2x1bW5cIj5cbiAgICAgICAgICA8VGV4dCBib2xkIGNvbG9yPXtjb2xvcn0+XG4gICAgICAgICAgICB7dGl0bGV9XG4gICAgICAgICAgPC9UZXh0PlxuICAgICAgICAgIHtzdWJ0aXRsZSAmJiA8VGV4dCBkaW1Db2xvcj57c3VidGl0bGV9PC9UZXh0Pn1cbiAgICAgICAgPC9Cb3g+XG4gICAgICAgIHtjaGlsZHJlbn1cbiAgICAgIDwvQm94PlxuICAgICAgeyFoaWRlSW5wdXRHdWlkZSAmJiAoXG4gICAgICAgIDxCb3ggbWFyZ2luVG9wPXsxfT5cbiAgICAgICAgICA8VGV4dCBkaW1Db2xvciBpdGFsaWM+XG4gICAgICAgICAgICB7aW5wdXRHdWlkZSA/IGlucHV0R3VpZGUoZXhpdFN0YXRlKSA6IGRlZmF1bHRJbnB1dEd1aWRlfVxuICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgPC9Cb3g+XG4gICAgICApfVxuICAgIDwvPlxuICApXG5cbiAgaWYgKGhpZGVCb3JkZXIpIHtcbiAgICByZXR1cm4gY29udGVudFxuICB9XG5cbiAgcmV0dXJuIDxQYW5lIGNvbG9yPXtjb2xvcn0+e2NvbnRlbnR9PC9QYW5lPlxufVxuIl0sIm1hcHBpbmdzIjoiO0FBQUEsT0FBT0EsS0FBSyxNQUFNLE9BQU87QUFDekIsU0FDRSxLQUFLQyxTQUFTLEVB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
\ No newline at end of file
diff --git a/src/components/design-system/FuzzyPicker.tsx b/src/components/design-system/FuzzyPicker.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..1d33088afc73670a0ff2e0ee2ef3398904030eab
--- /dev/null
+++ b/src/components/design-system/FuzzyPicker.tsx
@@ -0,0 +1,312 @@
+import { c as _c } from "react/compiler-runtime";
+import * as React from 'react';
+import { useEffect, useState } from 'react';
+import { useSearchInput } from '../../hooks/useSearchInput.js';
+import { useTerminalSize } from '../../hooks/useTerminalSize.js';
+import type { KeyboardEvent } from '../../ink/events/keyboard-event.js';
+import { clamp } from '../../ink/layout/geometry.js';
+import { Box, Text, useTerminalFocus } from '../../ink.js';
+import { SearchBox } from '../SearchBox.js';
+import { Byline } from './Byline.js';
+import { KeyboardShortcutHint } from './KeyboardShortcutHint.js';
+import { ListItem } from './ListItem.js';
+import { Pane } from './Pane.js';
+type PickerAction = {
+ /** Hint label shown in the byline, e.g. "mention" → "Tab to mention". */
+ action: string;
+ handler: (item: T) => void;
+};
+type Props = {
+ title: string;
+ placeholder?: string;
+ initialQuery?: string;
+ items: readonly T[];
+ getKey: (item: T) => string;
+ /** Keep to one line — preview handles overflow. */
+ renderItem: (item: T, isFocused: boolean) => React.ReactNode;
+ renderPreview?: (item: T) => React.ReactNode;
+ /** 'right' keeps hints stable (no bounce), but needs width. */
+ previewPosition?: 'bottom' | 'right';
+ visibleCount?: number;
+ /**
+ * 'up' puts items[0] at the bottom next to the input (atuin-style). Arrows
+ * always match screen direction — ↑ walks visually up regardless.
+ */
+ direction?: 'down' | 'up';
+ /** Caller owns filtering: re-filter on each call and pass new items. */
+ onQueryChange: (query: string) => void;
+ /** Enter key. Primary action. */
+ onSelect: (item: T) => void;
+ /**
+ * Tab key. If provided, Tab no longer aliases Enter — it gets its own
+ * handler and hint. Shift+Tab falls through to this if onShiftTab is unset.
+ */
+ onTab?: PickerAction;
+ /** Shift+Tab key. Gets its own hint. */
+ onShiftTab?: PickerAction;
+ /**
+ * Fires when the focused item changes (via arrows or when items reset).
+ * Useful for async preview loading — keeps I/O out of renderPreview.
+ */
+ onFocus?: (item: T | undefined) => void;
+ onCancel: () => void;
+ /** Shown when items is empty. Caller bakes loading/searching state into this. */
+ emptyMessage?: string | ((query: string) => string);
+ /**
+ * Status line below the list, e.g. "500+ matches" or "42 matches…".
+ * Caller decides when to show it — pass undefined to hide.
+ */
+ matchLabel?: string;
+ selectAction?: string;
+ extraHints?: React.ReactNode;
+};
+const DEFAULT_VISIBLE = 8;
+// Pane (paddingTop + Divider) + title + 3 gaps + SearchBox (rounded border = 3
+// rows) + hints. matchLabel adds +1 when present, accounted for separately.
+const CHROME_ROWS = 10;
+const MIN_VISIBLE = 2;
+export function FuzzyPicker({
+ title,
+ placeholder = 'Type to search…',
+ initialQuery,
+ items,
+ getKey,
+ renderItem,
+ renderPreview,
+ previewPosition = 'bottom',
+ visibleCount: requestedVisible = DEFAULT_VISIBLE,
+ direction = 'down',
+ onQueryChange,
+ onSelect,
+ onTab,
+ onShiftTab,
+ onFocus,
+ onCancel,
+ emptyMessage = 'No results',
+ matchLabel,
+ selectAction = 'select',
+ extraHints
+}: Props): React.ReactNode {
+ const isTerminalFocused = useTerminalFocus();
+ const {
+ rows,
+ columns
+ } = useTerminalSize();
+ const [focusedIndex, setFocusedIndex] = useState(0);
+
+ // Cap visibleCount so the picker never exceeds the terminal height. When it
+ // overflows, each re-render (arrow key, ctrl+p) mis-positions the cursor-up
+ // by the overflow amount and a previously-drawn line flashes blank.
+ const visibleCount = Math.max(MIN_VISIBLE, Math.min(requestedVisible, rows - CHROME_ROWS - (matchLabel ? 1 : 0)));
+
+ // Full hint row with onTab+onShiftTab is ~100 chars and wraps inconsistently
+ // below that. Compact mode drops shift+tab and shortens labels.
+ const compact = columns < 120;
+ const step = (delta: 1 | -1) => {
+ setFocusedIndex(i => clamp(i + delta, 0, items.length - 1));
+ };
+
+ // onKeyDown fires after useSearchInput's useInput, so onExit must be a
+ // no-op — return/downArrow are handled by handleKeyDown below. onCancel
+ // still covers escape/ctrl+c/ctrl+d. Backspace-on-empty is disabled so
+ // a held backspace doesn't eject the user from the dialog.
+ const {
+ query,
+ cursorOffset
+ } = useSearchInput({
+ isActive: true,
+ onExit: () => {},
+ onCancel,
+ initialQuery,
+ backspaceExitsOnEmpty: false
+ });
+ const handleKeyDown = (e: KeyboardEvent) => {
+ if (e.key === 'up' || e.ctrl && e.key === 'p') {
+ e.preventDefault();
+ e.stopImmediatePropagation();
+ step(direction === 'up' ? 1 : -1);
+ return;
+ }
+ if (e.key === 'down' || e.ctrl && e.key === 'n') {
+ e.preventDefault();
+ e.stopImmediatePropagation();
+ step(direction === 'up' ? -1 : 1);
+ return;
+ }
+ if (e.key === 'return') {
+ e.preventDefault();
+ e.stopImmediatePropagation();
+ const selected = items[focusedIndex];
+ if (selected) onSelect(selected);
+ return;
+ }
+ if (e.key === 'tab') {
+ e.preventDefault();
+ e.stopImmediatePropagation();
+ const selected = items[focusedIndex];
+ if (!selected) return;
+ const tabAction = e.shift ? onShiftTab ?? onTab : onTab;
+ if (tabAction) {
+ tabAction.handler(selected);
+ } else {
+ onSelect(selected);
+ }
+ }
+ };
+ useEffect(() => {
+ onQueryChange(query);
+ setFocusedIndex(0);
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [query]);
+ useEffect(() => {
+ setFocusedIndex(i => clamp(i, 0, items.length - 1));
+ }, [items.length]);
+ const focused = items[focusedIndex];
+ useEffect(() => {
+ onFocus?.(focused);
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [focused]);
+ const windowStart = clamp(focusedIndex - visibleCount + 1, 0, items.length - visibleCount);
+ const visible = items.slice(windowStart, windowStart + visibleCount);
+ const emptyText = typeof emptyMessage === 'function' ? emptyMessage(query) : emptyMessage;
+ const searchBox = ;
+ const listBlock =
;
+ const preview = renderPreview && focused ?
+ {renderPreview(focused)}
+ : null;
+
+ // Structure must not depend on preview truthiness — when focused goes
+ // undefined (e.g. delete clears matches), switching row→fragment would
+ // change both layout AND gap count, bouncing the searchBox below.
+ const listGroup = renderPreview && previewPosition === 'right' ?
+
+ {listBlock}
+ {matchLabel && {matchLabel}}
+
+ {preview ?? }
+ :
+ // Box (not fragment) so the outer gap={1} doesn't insert a blank line
+ // between list/matchLabel/preview — that read as extra space above the
+ // prompt in direction='up'.
+
+ {listBlock}
+ {matchLabel && {matchLabel}}
+ {preview}
+ ;
+ const inputAbove = direction !== 'up';
+ return
+
+
+ {title}
+
+ {inputAbove && searchBox}
+ {listGroup}
+ {!inputAbove && searchBox}
+
+
+
+
+ {onTab && }
+ {onShiftTab && !compact && }
+
+ {extraHints}
+
+
+
+ ;
+}
+type ListProps = Pick, 'visibleCount' | 'direction' | 'getKey' | 'renderItem'> & {
+ visible: readonly T[];
+ windowStart: number;
+ total: number;
+ focusedIndex: number;
+ emptyText: string;
+};
+function List(t0) {
+ const $ = _c(27);
+ const {
+ visible,
+ windowStart,
+ visibleCount,
+ total,
+ focusedIndex,
+ direction,
+ getKey,
+ renderItem,
+ emptyText
+ } = t0;
+ if (visible.length === 0) {
+ let t1;
+ if ($[0] !== emptyText) {
+ t1 = {emptyText};
+ $[0] = emptyText;
+ $[1] = t1;
+ } else {
+ t1 = $[1];
+ }
+ let t2;
+ if ($[2] !== t1 || $[3] !== visibleCount) {
+ t2 = {t1};
+ $[2] = t1;
+ $[3] = visibleCount;
+ $[4] = t2;
+ } else {
+ t2 = $[4];
+ }
+ return t2;
+ }
+ let t1;
+ if ($[5] !== direction || $[6] !== focusedIndex || $[7] !== getKey || $[8] !== renderItem || $[9] !== total || $[10] !== visible || $[11] !== visibleCount || $[12] !== windowStart) {
+ let t2;
+ if ($[14] !== direction || $[15] !== focusedIndex || $[16] !== getKey || $[17] !== renderItem || $[18] !== total || $[19] !== visible.length || $[20] !== visibleCount || $[21] !== windowStart) {
+ t2 = (item, i) => {
+ const actualIndex = windowStart + i;
+ const isFocused = actualIndex === focusedIndex;
+ const atLowEdge = i === 0 && windowStart > 0;
+ const atHighEdge = i === visible.length - 1 && windowStart + visibleCount < total;
+ return {renderItem(item, isFocused)};
+ };
+ $[14] = direction;
+ $[15] = focusedIndex;
+ $[16] = getKey;
+ $[17] = renderItem;
+ $[18] = total;
+ $[19] = visible.length;
+ $[20] = visibleCount;
+ $[21] = windowStart;
+ $[22] = t2;
+ } else {
+ t2 = $[22];
+ }
+ t1 = visible.map(t2);
+ $[5] = direction;
+ $[6] = focusedIndex;
+ $[7] = getKey;
+ $[8] = renderItem;
+ $[9] = total;
+ $[10] = visible;
+ $[11] = visibleCount;
+ $[12] = windowStart;
+ $[13] = t1;
+ } else {
+ t1 = $[13];
+ }
+ const rows = t1;
+ const t2 = direction === "up" ? "column-reverse" : "column";
+ let t3;
+ if ($[23] !== rows || $[24] !== t2 || $[25] !== visibleCount) {
+ t3 = {rows};
+ $[23] = rows;
+ $[24] = t2;
+ $[25] = visibleCount;
+ $[26] = t3;
+ } else {
+ t3 = $[26];
+ }
+ return t3;
+}
+function firstWord(s: string): string {
+ const i = s.indexOf(' ');
+ return i === -1 ? s : s.slice(0, i);
+}
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsInVzZUVmZmVjdCIsInVzZVN0YXRlIiwidXNlU2VhcmNoSW5wdXQiLCJ1c2VUZXJtaW5hbFNpemUiLCJLZXlib2FyZEV2ZW50IiwiY2xhbXAiLCJCb3giLCJUZXh0IiwidXNlVGVybWluYWxGb2N1cyIsIlNlYXJjaEJveCIsIkJ5bGluZSIsIktleWJvYXJkU2hvcnRjdXRIaW50IiwiTGlzdEl0ZW0iLCJQYW5lIiwiUGlja2VyQWN0aW9uIiwiYWN0aW9uIiwiaGFuZGxlciIsIml0ZW0iLCJUIiwiUHJvcHMiLCJ0aXRsZSIsInBsYWNlaG9sZGVyIiwiaW5pdGlhbFF1ZXJ5IiwiaXRlbXMiLCJnZXRLZXkiLCJyZW5kZXJJdGVtIiwiaXNGb2N1c2VkIiwiUmVhY3ROb2RlIiwicmVuZGVyUHJldmlldyIsInByZXZpZXdQb3NpdGlvbiIsInZpc2libGVDb3VudCIsImRpcmVjdGlvbiIsIm9uUXVlcnlDaGFuZ2UiLCJxdWVyeSIsIm9uU2VsZWN0Iiwib25UYWIiLCJvblNoaWZ0VGFiIiwib25Gb2N1cyIsIm9uQ2FuY2VsIiwiZW1wdHlNZXNzYWdlIiwibWF0Y2hMYWJlbCIsInNlbGVjdEFjdGlvbiIsImV4dHJhSGludHMiLCJERUZBVUxUX1ZJU0lCTEUiLCJDSFJPTUVfUk9XUyIsIk1JTl9WSVNJQkxFIiwiRnV6enlQaWNrZXIiLCJyZXF1ZXN0ZWRWaXNpYmxlIiwiaXNUZXJtaW5hbEZvY3VzZWQiLCJyb3dzIiwiY29sdW1ucyIsImZvY3VzZWRJbmRleCIsInNldEZvY3VzZWRJbmRleCIsIk1hdGgiLCJtYXgiLCJtaW4iLCJjb21wYWN0Iiwic3RlcCIsImRlbHRhIiwiaSIsImxlbmd0aCIsImN1cnNvck9mZnNldCIsImlzQWN0aXZlIiwib25FeGl0IiwiYmFja3NwYWNlRXhpdHNPbkVtcHR5IiwiaGFuZGxlS2V5RG93biIsImUiLCJrZXkiLCJjdHJsIiwicHJldmVudERlZmF1bHQiLCJzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24iLCJzZWxlY3RlZCIsInRhYkFjdGlvbiIsInNoaWZ0IiwiZm9jdXNlZCIsIndpbmRvd1N0YXJ0IiwidmlzaWJsZSIsInNsaWNlIiwiZW1wdHlUZXh0Iiwic2VhcmNoQm94IiwibGlzdEJsb2NrIiwicHJldmlldyIsImxpc3RHcm91cCIsImlucHV0QWJvdmUiLCJmaXJzdFdvcmQiLCJMaXN0UHJvcHMiLCJQaWNrIiwidG90YWwiLCJMaXN0IiwidDAiLCIkIiwiX2MiLCJ0MSIsInQyIiwiYWN0dWFsSW5kZXgiLCJhdExvd0VkZ2UiLCJhdEhpZ2hFZGdlIiwibWFwIiwidDMiLCJzIiwiaW5kZXhPZiJdLCJzb3VyY2VzIjpbIkZ1enp5UGlja2VyLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7IHVzZUVmZmVjdCwgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCdcbmltcG9ydCB7IHVzZVNlYXJjaElucHV0IH0gZnJvbSAnLi4vLi4vaG9va3MvdXNlU2VhcmNoSW5wdXQuanMnXG5pbXBvcnQgeyB1c2VUZXJtaW5hbFNpemUgfSBmcm9tICcuLi8uLi9ob29rcy91c2VUZXJtaW5hbFNpemUuanMnXG5pbXBvcnQgdHlwZSB7IEtleWJvYXJkRXZlbnQgfSBmcm9tICcuLi8uLi9pbmsvZXZlbnRzL2tleWJvYXJkLWV2ZW50LmpzJ1xuaW1wb3J0IHsgY2xhbXAgfSBmcm9tICcuLi8uLi9pbmsvbGF5b3V0L2dlb21ldHJ5LmpzJ1xuaW1wb3J0IHsgQm94LCBUZXh0LCB1c2VUZXJtaW5hbEZvY3VzIH0gZnJvbSAnLi4vLi4vaW5rLmpzJ1xuaW1wb3J0IHsgU2VhcmNoQm94IH0gZnJvbSAnLi4vU2VhcmNoQm94LmpzJ1xuaW1wb3J0IHsgQnlsaW5lIH0gZnJvbSAnLi9CeWxpbmUuanMnXG5pbXBvcnQgeyBLZXlib2FyZFNob3J0Y3V0SGludCB9IGZyb20gJy4vS2V5Ym9hcmRTaG9ydGN1dEhpbnQuanMnXG5pbXBvcnQgeyBMaXN0SXRlbSB9IGZyb20gJy4vTGlzdEl0ZW0uanMnXG5pbXBvcnQgeyBQYW5lIH0gZnJvbSAnLi9QYW5lLmpzJ1xuXG50eXBlIFBpY2tlckFjdGlvbjxUPiA9IHtcbiAgLyoqIEhpbnQgbGFiZWwgc2hvd24gaW4gdGhlIGJ5bGluZSwgZS5nLiBcIm1lbnRpb25cIiDihpIgXCJUYWIgdG8gbWVudGlvblwiLiAqL1xuICBhY3Rpb246IHN0cmluZ1xuICBoYW5kbGVyOiAoaXRlbTogVCkgPT4gdm9pZFxufVxuXG50eXBlIFByb3BzPFQ+ID0ge1xuICB0aXRsZTogc3RyaW5nXG4gIHBsYWNlaG9sZGVyPzogc3RyaW5nXG4gIGluaXRpYWxRdWVyeT86IHN0cmluZ1xuICBpdGVtczogcmVhZG9ubHkgVFtdXG4gIGdldEtleTogKGl0ZW06IFQpID0+IHN0cmluZ1xuICAvKiogS2VlcCB0byBvbmUgbGluZSDigJQgcHJldmlldyBoYW5kbGVzIG92ZXJmbG93LiAqL1xuICByZW5kZXJJdGVtOiAoaXRlbTogVCwgaXNGb2N1c2VkOiBib29sZWFuKSA9PiBSZWFjdC5SZWFjdE5vZGVcbiAgcmVuZGVyUHJldmlldz86IChpdGVtOiBUKSA9PiBSZWFjdC5SZWFjdE5vZGVcbiAgLyoqICdyaWdodCcga2VlcHMgaGludHMgc3RhYmxlIChubyBib3VuY2UpLCBidXQgbmVlZHMgd2lkdGguICovXG4gIHByZXZpZXdQb3NpdGlvbj86ICdib3R0b20nIHwgJ3JpZ2h0J1xuICB2aXNpYmxlQ291bnQ/OiBudW1iZXJcbiAgLyoqXG4gICAqICd1cCcgcHV0cyBpdGVtc1swXSBhdCB0aGUgYm90dG9tIG5leHQgdG8gdGhlIGlucHV0IChhdHVpbi1zdHlsZSkuIEFycm93c1xuICAgKiBhbHdheXMgbWF0Y2ggc2NyZWVuIGRpcmVjdGlvbiDigJQg4oaRIHdhbGtzIHZpc3VhbGx5IHVwIHJlZ2FyZGxlc3MuXG4gICAqL1xuICBkaXJlY3Rpb24/OiAnZG93bicgfCAndXAnXG4gIC8qKiBDYWxsZXIgb3ducyBmaWx0ZXJpbmc6IHJlLWZpbHRlciBvbiBlYWNoIGNhbGwgYW5kIHBhc3MgbmV3IGl0ZW1zLiAqL1xuICBvblF1ZXJ5Q2hhbmdlOiAocXVlcnk6IHN0cmluZykgPT4gdm9pZFxuICAvKiogRW50ZXIga2V5LiBQcmltYXJ5IGFjdGlvbi4gKi9cbiAgb25TZWxlY3Q6IChpdGVtOiBUKSA9PiB2b2lkXG4gIC8qKlxuICAgKiBUYWIga2V5LiBJZiBwcm92aWRlZCwgVGFiIG5vIGxvbmdlciBhbGlhc2VzIEVudGVyIOKAlCBpdCBnZXRzIGl0cyBvd25cbiAgICogaGFuZGxlciBhbmQgaGludC4gU2hpZnQrVGFiIGZhbGxzIHRocm91Z2ggdG8gdGhpcyBpZiBvblNoaWZ0VGFiIGlzIHVuc2V0LlxuICAgKi9cbiAgb25UYWI/OiBQaWNrZXJBY3Rpb248VD5cbiAgLyoqIFNoaWZ0K1RhYiBrZXkuIEdldHMgaXRzIG93biBoaW50LiAqL1xuICBvblNoaWZ0VGFiPzogUGlja2VyQWN0aW9uPFQ+XG4gIC8qKlxuICAgKiBGaXJlcyB3aGVuIHRoZSBmb2N1c2VkIGl0ZW0gY2hhbmdlcyAodmlhIGFycm93cyBvciB3aGVuIGl0ZW1zIHJlc2V0KS5cbiAgICogVXNlZnVsIGZvciBhc3luYyBwcmV2aWV3IGxvYWRpbmcg4oCUIGtlZXBzIEkvTyBvdXQgb2YgcmVuZGVyUHJldmlldy5cbiAgICovXG4gIG9uRm9jdXM/OiAoaXRlbTogVCB8IHVuZGVmaW5lZCkgPT4gdm9pZFxuICBvbkNhbmNlbDogKCkgPT4gdm9pZFxuICAvKiogU2hvd24gd2hlbiBpdGVtcyBpcyBlbXB0eS4gQ2FsbGVyIGJha2VzIGxvYWRpbmcvc2VhcmNoaW5nIHN0YXRlIGludG8gdGhpcy4gKi9cbiAgZW1wdHlNZXNzYWdlPzogc3RyaW5nIHwgKChxdWVyeTogc3RyaW5nKSA9PiBzdHJpbmcpXG4gIC8qKlxuICAgKiBTdGF0dXMgbGluZSBiZWxvdyB0aGUgbGlzdCwgZS5nLiBcIjUwMCsgbWF0Y2hlc1wiIG9yIFwiNDIgbWF0Y2hlc+KAplwiLlxuICAgKiBDYWxsZXIgZGVjaWRlcyB3aGVuIHRvIHNob3cgaXQg4oCUIHBhc3MgdW5kZWZpbmVkIHRvIGhpZGUuXG4gICAqL1xuICBtYXRjaExhYmVsPzogc3RyaW5nXG4gIHNlbGVjdEFjdGlvbj86IHN0cmluZ1xuICBleHRyYUhpbnRzPzogUmVhY3QuUmVhY3ROb2RlXG59XG5cbmNvbnN0IERFRkFVTFRfVklTSUJMRSA9IDhcbi8vIFBhbmUgKHBhZGRpbmdUb3AgKyBEaXZpZGVyKSArIHRpdGxlICsgMyBnYXBzICsgU2VhcmNoQm94IChyb3VuZGVkIGJvcmRlciA9IDNcbi8vIHJvd3MpICsgaGludHMuIG1hdGNoTGFiZWwgYWRkcyArMSB3aGVuIHByZXNlbnQsIGFjY291bnRlZCBmb3Igc2VwYXJhdGVseS5cbmNvbnN0IENIUk9NRV9ST1dTID0gMTBcbmNvbnN0IE1JTl9WSVNJQkxFID0gMlxuXG5leHBvcnQgZnVuY3Rpb24gRnV6enlQaWNrZXI8VD4oe1xuICB0aXRsZSxcbiAgcGxhY2Vob2xkZXIgPSAnVHlwZSB0byBzZWFyY2jigKYnLFxuICBpbml0aWFsUXVlcnksXG4gIGl0ZW1zLFxuICBnZXRLZXksXG4gIHJlbmRlckl0ZW0sXG4gIHJlbmRlclByZXZpZXcsXG4gIHByZXZpZXdQb3NpdGlvbiA9ICdib3R0b20nLFxuICB2aXNpYmxlQ291bnQ6IHJlcXVlc3RlZFZpc2libGUgPSBERUZBVUxUX1ZJU0lCTEUsXG4gIGRpcmVjdGlvbiA9ICdkb3duJyxcbiAgb25RdWVyeUNoYW5nZSxcbiAgb25TZWxlY3QsXG4gIG9uVGFiLFxuICBvblNoaWZ0VGFiLFxuICBvbkZvY3VzLFxuICBvbkNhbmNlbCxcbiAgZW1wdHlNZXNzYWdlID0gJ05vIHJlc3VsdHMnLFxuICBtYXRjaExhYmVsLFxuICBzZWxlY3RBY3Rpb24gPSAnc2VsZWN0JyxcbiAgZXh0cmFIaW50cyxcbn06IFByb3BzPFQ+KTogUmVhY3QuUmVhY3ROb2RlIHtcbiAgY29uc3QgaXNUZXJtaW5hbEZvY3VzZWQgPSB1c2VUZXJtaW5hbEZvY3VzKClcbiAgY29uc3QgeyByb3dzLCBjb2x1bW5zIH0gPSB1c2VUZXJtaW5hbFNpemUoKVxuICBjb25zdCBbZm9jdXNlZEluZGV4LCBzZXRGb2N1c2VkSW5kZXhdID0gdXNlU3RhdGUoMClcblxuICAvLyBDYXAgdmlzaWJsZUNvdW50IHNvIHRoZSBwaWNrZXIgbmV2ZXIgZXhjZWVkcyB0aGUgdGVybWluYWwgaGVpZ2h0LiBXaGVuIGl0XG4gIC8vIG92ZXJmbG93cywgZWFjaCByZS1yZW5kZXIgKGFycm93IGtleSwgY3RybCtwKSBtaXMtcG9zaXRpb25zIHRoZSBjdXJzb3ItdXBcbiAgLy8gYnkgdGhlIG92ZXJmbG93IGFtb3VudCBhbmQgYSBwcmV2aW91c2x5LWRyYXduIGxpbmUgZmxhc2hlcyBibGFuay5cbiAgY29uc3QgdmlzaWJsZUNvdW50ID0gTWF0aC5tYXgoXG4gICAgTUlOX1ZJU0lCTEUsXG4gICAgTWF0aC5taW4ocmVxdWVzdGVkVmlzaWJsZSwgcm93cyAtIENIUk9NRV9ST1dTIC0gKG1hdGNoTGFiZWwgPyAxIDogMCkpLFxuICApXG5cbiAgLy8gRnVsbCBoaW50IHJvdyB3aXRoIG9uVGFiK29uU2hpZnRUYWIgaXMgfjEwMCBjaGFycyBhbmQgd3JhcHMgaW5jb25zaXN0ZW50bHlcbiAgLy8gYmVsb3cgdGhhdC4gQ29tcGFjdCBtb2RlIGRyb3BzIHNoaWZ0K3RhYiBhbmQgc2hvcnRlbnMgbGFiZWxzLlxuICBjb25zdCBjb21wYWN0ID0gY29sdW1ucyA8IDEyMFxuXG4gIGNvbnN0IHN0ZXAgPSAoZGVsdGE6IDEgfCAtMSkgPT4ge1xuICAgIHNldEZvY3VzZWRJbmRleChpID0+IGNsYW1wKGkgKyBkZWx0YSwgMCwgaXRlbXMubGVuZ3RoIC0gMSkpXG4gIH1cblxuICAvLyBvbktleURvd24gZmlyZXMgYWZ0ZXIgdXNlU2VhcmNoSW5wdXQncyB1c2VJbnB1dCwgc28gb25FeGl0IG11c3QgYmUgYVxuICAvLyBuby1vcCDigJQgcmV0dXJuL2Rvd25BcnJvdyBhcmUgaGFuZGxlZCBieSBoYW5kbGVLZXlEb3duIGJlbG93LiBvbkNhbmNlbFxuICAvLyBzdGlsbCBjb3ZlcnMgZXNjYXBlL2N0cmwrYy9jdHJsK2QuIEJhY2tzcGFjZS1vbi1lbXB0eSBpcyBkaXNhYmxlZCBzb1xuICAvLyBhIGhlbGQgYmFja3NwYWNlIGRvZXNuJ3QgZWplY3QgdGhlIHVzZXIgZnJvbSB0aGUgZGlhbG9nLlxuICBjb25zdCB7IHF1ZXJ5LCBjdXJzb3JPZmZzZXQgfSA9IHVzZVNlYXJjaElucHV0KHtcbiAgICBpc0FjdGl2ZTogdHJ1ZSxcbiAgICBvbkV4aXQ6ICgpID0+IHt9LFxuICAgIG9uQ2FuY2VsLFxuICAgIGluaXRpYWxRdWVyeSxcbiAgICBiYWNrc3BhY2VFeGl0c09uRW1wdHk6IGZhbHNlLFxuICB9KVxuXG4gIGNvbnN0IGhhbmRsZUtleURvd24gPSAoZTogS2V5Ym9hcmRFdmVudCkgPT4ge1xuICAgIGlmIChlLmtleSA9PT0gJ3VwJyB8fCAoZS5jdHJsICYmIGUua2V5ID09PSAncCcpKSB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KClcbiAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKClcbiAgICAgIHN0ZXAoZGlyZWN0aW9uID09PSAndXAnID8gMSA6IC0xKVxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmIChlLmtleSA9PT0gJ2Rvd24nIHx8IChlLmN0cmwgJiYgZS5rZXkgPT09ICduJykpIHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKVxuICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKVxuICAgICAgc3RlcChkaXJlY3Rpb24gPT09ICd1cCcgPyAtMSA6IDEpXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgaWYgKGUua2V5ID09PSAncmV0dXJuJykge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpXG4gICAgICBjb25zdCBzZWxlY3RlZCA9IGl0ZW1zW2ZvY3VzZWRJbmRleF1cbiAgICAgIGlmIChzZWxlY3RlZCkgb25TZWxlY3Qoc2VsZWN0ZWQpXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgaWYgKGUua2V5ID09PSAndGFiJykge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpXG4gICAgICBjb25zdCBzZWxlY3RlZCA9IGl0ZW1zW2ZvY3VzZWRJbmRleF1cbiAgICAgIGlmICghc2VsZWN0ZWQpIHJldHVyblxuICAgICAgY29uc3QgdGFiQWN0aW9uID0gZS5zaGlmdCA/IChvblNoaWZ0VGFiID8/IG9uVGFiKSA6IG9uVGFiXG4gICAgICBpZiAodGFiQWN0aW9uKSB7XG4gICAgICAgIHRhYkFjdGlvbi5oYW5kbGVyKHNlbGVjdGVkKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb25TZWxlY3Qoc2VsZWN0ZWQpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBvblF1ZXJ5Q2hhbmdlKHF1ZXJ5KVxuICAgIHNldEZvY3VzZWRJbmRleCgwKVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHNcbiAgfSwgW3F1ZXJ5XSlcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIHNldEZvY3VzZWRJbmRleChpID0+IGNsYW1wKGksIDAsIGl0ZW1zLmxlbmd0aCAtIDEpKVxuICB9LCBbaXRlbXMubGVuZ3RoXSlcblxuICBjb25zdCBmb2N1c2VkID0gaXRlbXNbZm9jdXNlZEluZGV4XVxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIG9uRm9jdXM/Lihmb2N1c2VkKVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHNcbiAgfSwgW2ZvY3VzZWRdKVxuXG4gIGNvbnN0IHdpbmRvd1N0YXJ0ID0gY2xhbXAoXG4gICAgZm9jdXNlZEluZGV4IC0gdmlzaWJsZUNvdW50ICsgMSxcbiAgICAwLFxuICAgIGl0ZW1zLmxlbmd0aCAtIHZpc2libGVDb3VudCxcbiAgKVxuICBjb25zdCB2aXNpYmxlID0gaXRlbXMuc2xpY2Uod2luZG93U3RhcnQsIHdpbmRvd1N0YXJ0ICsgdmlzaWJsZUNvdW50KVxuXG4gIGNvbnN0IGVtcHR5VGV4dCA9XG4gICAgdHlwZW9mIGVtcHR5TWVzc2FnZSA9PT0gJ2Z1bmN0aW9uJyA/IGVtcHR5TWVzc2FnZShxdWVyeSkgOiBlbXB0eU1lc3NhZ2VcblxuICBjb25zdCBzZWFyY2hCb3ggPSAoXG4gICAgPFNlYXJjaEJveFxuICAgICAgcXVlcnk9e3F1ZXJ5fVxuICAgICAgY3Vyc29yT2Zmc2V0PXtjdXJzb3JPZmZzZXR9XG4gICAgICBwbGFjZWhvbGRlcj17cGxhY2Vob2xkZXJ9XG4gICAgICBpc0ZvY3VzZWRcbiAgICAgIGlzVGVybWluYWxGb2N1c2VkPXtpc1Rlcm1pbmFsRm9jdXNlZH1cbiAgICAvPlxuICApXG5cbiAgY29uc3QgbGlzdEJsb2NrID0gKFxuICAgIDxMaXN0XG4gICAgICB2aXNpYmxlPXt2aXNpYmxlfVxuICAgICAgd2luZG93U3RhcnQ9e3dpbmRvd1N0YXJ0fVxuICAgICAgdmlzaWJsZUNvdW50PXt2aXNpYmxlQ291bnR9XG4gICAgICB0b3RhbD17aXRlbXMubGVuZ3RofVxuICAgICAgZm9jdXNlZEluZGV4PXtmb2N1c2VkSW5kZXh9XG4gICAgICBkaXJlY3Rpb249e2RpcmVjdGlvbn1cbiAgICAgIGdldEtleT17Z2V0S2V5fVxuICAgICAgcmVuZGVySXRlbT17cmVuZGVySXRlbX1cbiAgICAgIGVtcHR5VGV4dD17ZW1wdHlUZXh0fVxuICAgIC8+XG4gIClcblxuICBjb25zdCBwcmV2aWV3ID1cbiAgICByZW5kZXJQcmV2aWV3ICYmIGZvY3VzZWQgPyAoXG4gICAgICA8Qm94IGZsZXhEaXJlY3Rpb249XCJjb2x1bW5cIiBmbGV4R3Jvdz17MX0+XG4gICAgICAgIHtyZW5kZXJQcmV2aWV3KGZvY3VzZWQpfVxuICAgICAgPC9Cb3g+XG4gICAgKSA6IG51bGxcblxuICAvLyBTdHJ1Y3R1cmUgbXVzdCBub3QgZGVwZW5kIG9uIHByZXZpZXcgdHJ1dGhpbmVzcyDigJQgd2hlbiBmb2N1c2VkIGdvZXNcbiAgLy8gdW5kZWZpbmVkIChlLmcuIGRlbGV0ZSBjbGVhcnMgbWF0Y2hlcyksIHN3aXRjaGluZyByb3fihpJmcmFnbWVudCB3b3VsZFxuICAvLyBjaGFuZ2UgYm90aCBsYXlvdXQgQU5EIGdhcCBjb3VudCwgYm91bmNpbmcgdGhlIHNlYXJjaEJveCBiZWxvdy5cbiAgY29uc3QgbGlzdEdyb3VwID1cbiAgICByZW5kZXJQcmV2aWV3ICYmIHByZXZpZXdQb3NpdGlvbiA9PT0gJ3JpZ2h0JyA/IChcbiAgICAgIDxCb3hcbiAgICAgICAgZmxleERpcmVjdGlvbj1cInJvd1wiXG4gICAgICAgIGdhcD17Mn1cbiAgICAgICAgaGVpZ2h0PXt2aXNpYmxlQ291bnQgKyAobWF0Y2hMYWJlbCA/IDEgOiAwKX1cbiAgICAgID5cbiAgICAgICAgPEJveCBmbGV4RGlyZWN0aW9uPVwiY29sdW1uXCIgZmxleFNocmluaz17MH0+XG4gICAgICAgICAge2xpc3RCbG9ja31cbiAgICAgICAgICB7bWF0Y2hMYWJlbCAmJiA8VGV4dCBkaW1Db2xvcj57bWF0Y2hMYWJlbH08L1RleHQ+fVxuICAgICAgICA8L0JveD5cbiAgICAgICAge3ByZXZpZXcgPz8gPEJveCBmbGV4R3Jvdz17MX0gLz59XG4gICAgICA8L0JveD5cbiAgICApIDogKFxuICAgICAgLy8gQm94IChub3QgZnJhZ21lbnQpIHNvIHRoZSBvdXRlciBnYXA9ezF9IGRvZXNuJ3QgaW5zZXJ0IGEgYmxhbmsgbGluZVxuICAgICAgLy8gYmV0d2VlbiBsaXN0L21hdGNoTGFiZWwvcHJldmlldyDigJQgdGhhdCByZWFkIGFzIGV4dHJhIHNwYWNlIGFib3ZlIHRoZVxuICAgICAgLy8gcHJvbXB0IGluIGRpcmVjdGlvbj0ndXAnLlxuICAgICAgPEJveCBmbGV4RGlyZWN0aW9uPVwiY29sdW1uXCI+XG4gICAgICAgIHtsaXN0QmxvY2t9XG4gICAgICAgIHttYXRjaExhYmVsICYmIDxUZXh0IGRpbUNvbG9yPnttYXRjaExhYmVsfTwvVGV4dD59XG4gICAgICAgIHtwcmV2aWV3fVxuICAgICAgPC9Cb3g+XG4gICAgKVxuXG4gIGNvbnN0IGlucHV0QWJvdmUgPSBkaXJlY3Rpb24gIT09ICd1cCdcbiAgcmV0dXJuIChcbiAgICA8UGFuZSBjb2xvcj1cInBlcm1pc3Npb25cIj5cbiAgICAgIDxCb3hcbiAgICAgICAgZmxleERpcmVjdGlvbj1cImNvbHVtblwiXG4gICAgICAgIGdhcD17MX1cbiAgICAgICAgdGFiSW5kZXg9ezB9XG4gICAgICAgIGF1dG9Gb2N1c1xuICAgICAgICBvbktleURvd249e2hhbmRsZUtleURvd259XG4gICAgICA+XG4gICAgICAgIDxUZXh0IGJvbGQgY29sb3I9XCJwZXJtaXNzaW9uXCI+XG4gICAgICAgICAge3RpdGxlfVxuICAgICAgICA8L1RleHQ+XG4gICAgICAgIHtpbnB1dEFib3ZlICYmIHNlYXJjaEJveH1cbiAgICAgICAge2xpc3RHcm91cH1cbiAgICAgICAgeyFpbnB1dEFib3ZlICYmIHNlYXJjaEJveH1cbiAgICAgICAgPFRleHQgZGltQ29sb3I+XG4gICAgICAgICAgPEJ5bGluZT5cbiAgICAgICAgICAgIDxLZXlib2FyZFNob3J0Y3V0SGludFxuICAgICAgICAgICAgICBzaG9ydGN1dD1cIuKGkS/ihpNcIlxuICAgICAgICAgICAgICBhY3Rpb249e2NvbXBhY3QgPyAnbmF2JyA6ICduYXZpZ2F0ZSd9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPEtleWJvYXJkU2hvcnRjdXRIaW50XG4gICAgICAgICAgICAgIHNob3J0Y3V0PVwiRW50ZXJcIlxuICAgICAgICAgICAgICBhY3Rpb249e2NvbXBhY3QgPyBmaXJzdFdvcmQoc2VsZWN0QWN0aW9uKSA6IHNlbGVjdEFjdGlvbn1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICB7b25UYWIgJiYgKFxuICAgICAgICAgICAgICA8S2V5Ym9hcmRTaG9ydGN1dEhpbnQgc2hvcnRjdXQ9XCJUYWJcIiBhY3Rpb249e29uVGFiLmFjdGlvbn0gLz5cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgICB7b25TaGlmdFRhYiAmJiAhY29tcGFjdCAmJiAoXG4gICAgICAgICAgICAgIDxLZXlib2FyZFNob3J0Y3V0SGludFxuICAgICAgICAgICAgICAgIHNob3J0Y3V0PVwic2hpZnQrdGFiXCJcbiAgICAgICAgICAgICAgICBhY3Rpb249e29uU2hpZnRUYWIuYWN0aW9ufVxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgKX1cbiAgICAgICAgICAgIDxLZXlib2FyZFNob3J0Y3V0SGludCBzaG9ydGN1dD1cIkVzY1wiIGFjdGlvbj1cImNhbmNlbFwiIC8+XG4gICAgICAgICAgICB7ZXh0cmFIaW50c31cbiAgICAgICAgICA8L0J5bGluZT5cbiAgICAgICAgPC9UZXh0PlxuICAgICAgPC9Cb3g+XG4gICAgPC9QYW5lPlxuICApXG59XG5cbnR5cGUgTGlzdFByb3BzPFQ+ID0gUGljazxcbiAgUHJvcHM8VD4sXG4gICd2aXNpYmxlQ291bnQnIHwgJ2RpcmVjdGlvbicgfCAnZ2V0S2V5JyB8ICdyZW5kZXJJdGVtJ1xuPiAmIHtcbiAgdmlzaWJsZTogcmVhZG9ubHkgVFtdXG4gIHdpbmRvd1N0YXJ0OiBudW1iZXJcbiAgdG90YWw6IG51bWJlclxuICBmb2N1c2VkSW5kZXg6IG51bWJlclxuICBlbXB0eVRleHQ6IHN0cmluZ1xufVxuXG5mdW5jdGlvbiBMaXN0PFQ+KHtcbiAgdmlzaWJsZSxcbiAgd2luZG93U3RhcnQsXG4gIHZpc2libGVDb3VudCxcbiAgdG90YWwsXG4gIGZvY3VzZWRJbmRleCxcbiAgZGlyZWN0aW9uLFxuICBnZXRLZXksXG4gIHJlbmRlckl0ZW0sXG4gIGVtcHR5VGV4dCxcbn06IExpc3RQcm9wczxUPik6IFJlYWN0LlJlYWN0Tm9kZSB7XG4gIGlmICh2aXNpYmxlLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiAoXG4gICAgICA8Qm94IGhlaWdodD17dmlzaWJsZUNvdW50fSBmbGV4U2hyaW5rPXswfT5cbiAgICAgICAgPFRleHQgZGltQ29sb3I+e2VtcHR5VGV4dH08L1RleHQ+XG4gICAgICA8L0JveD5cbiAgICApXG4gIH1cblxuICBjb25zdCByb3dzID0gdmlzaWJsZS5tYXAoKGl0ZW0sIGkpID0+IHtcbiAgICBjb25zdCBhY3R1YWxJbmRleCA9IHdpbmRvd1N0YXJ0ICsgaVxuICAgIGNvbnN0IGlzRm9jdXNlZCA9IGFjdHVhbEluZGV4ID09PSBmb2N1c2VkSW5kZXhcbiAgICBjb25zdCBhdExvd0VkZ2UgPSBpID09PSAwICYmIHdpbmRvd1N0YXJ0ID4gMFxuICAgIGNvbnN0IGF0SGlnaEVkZ2UgPVxuICAgICAgaSA9PT0gdmlzaWJsZS5sZW5ndGggLSAxICYmIHdpbmRvd1N0YXJ0ICsgdmlzaWJsZUNvdW50ISA8IHRvdGFsXG4gICAgcmV0dXJuIChcbiAgICAgIDxMaXN0SXRlbVxuICAgICAgICBrZXk9e2dldEtleShpdGVtKX1cbiAgICAgICAgaXNGb2N1c2VkPXtpc0ZvY3VzZWR9XG4gICAgICAgIHNob3dTY3JvbGxVcD17ZGlyZWN0aW9uID09PSAndXAnID8gYXRIaWdoRWRnZSA6IGF0TG93RWRnZX1cbiAgICAgICAgc2hvd1Njcm9sbERvd249e2RpcmVjdGlvbiA9PT0gJ3VwJyA/IGF0TG93RWRnZSA6IGF0SGlnaEVkZ2V9XG4gICAgICAgIHN0eWxlZD17ZmFsc2V9XG4gICAgICA+XG4gICAgICAgIHtyZW5kZXJJdGVtKGl0ZW0sIGlzRm9jdXNlZCl9XG4gICAgICA8L0xpc3RJdGVtPlxuICAgIClcbiAgfSlcblxuICByZXR1cm4gKFxuICAgIDxCb3hcbiAgICAgIGhlaWdodD17dmlzaWJsZUNvdW50fVxuICAgICAgZmxleFNocmluaz17MH1cbiAgICAgIGZsZXhEaXJlY3Rpb249e2RpcmVjdGlvbiA9PT0gJ3VwJyA/ICdjb2x1bW4tcmV2ZXJzZScgOiAnY29sdW1uJ31cbiAgICA+XG4gICAgICB7cm93c31cbiAgICA8L0JveD5cbiAgKVxufVxuXG5mdW5jdGlvbiBmaXJzdFdvcmQoczogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgaSA9IHMuaW5kZXhPZignICcpXG4gIHJldHVybiBpID09PSAtMSA/IHMgOiBzLnNsaWNlKDAsIGkpXG59XG4iXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEtBQUtBLEtBQUssTUFBTSxPQUFPO0FBQzlCLFNBQVNDLFNBQVMsRUFBRUMsUUFBUSxRQUFRLE9BQU87QUFDM0MsU0FBU0MsY0FBYyxRQUFRLCtCQUErQjtBQUM5RCxTQUFTQyxlQUFlLFFBQVEsZ0NBQWdDO0FBQ2hFLGNBQWNDLGFBQWEsUUFBUSxvQ0FBb0M7QUFDdkUsU0FBU0MsS0FBSyxRQUFRLDhCQUE4QjtBQUNwRCxTQUFTQyxHQUFHLEVBQUVDLElBQUksRUFBRUMsZ0JBQWdCLFFBQVEsY0FBYztBQUMxRCxTQUFTQyxTQUFTLFFBQVEsaUJBQWlCO0FBQzNDLFNBQVNDLE1BQU0sUUFBUSxhQUFhO0FBQ3BDLFNBQVNDLG9CQUFvQixRQUFRLDJCQUEyQjtBQUNoRSxTQUFTQyxRQUFRLFFBQVEsZUFBZTtBQUN4QyxTQUFTQyxJQUFJLFFBQVEsV0FBVztBQUVoQyxLQUFLQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEdBQUc7RUFDckI7RUFDQUMsTUFBTSxFQUFFLE1BQU07RUFDZEMsT0FBTyxFQUFFLENBQUNDLElBQUksRUFBRUMsQ0FBQyxFQUFFLEdBQUcsSUFBSTtBQUM1QixDQUFDO0FBRUQsS0FBS0MsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHO0VBQ2RDLEtBQUssRUFBRSxNQUFNO0VBQ2JDLFdBQVcsQ0FBQyxFQUFFLE1BQU07RUFDcEJDLFlBQVksQ0FBQyxFQUFFLE1BQU07RUFDckJDLEtBQUssRUFBRSxTQUFTTCxDQUFDLEVBQUU7RUFDbkJNLE1BQU0sRUFBRSxDQUFDUCxJQUFJLEVBQUVDLENBQUMsRUFBRSxHQUFHLE1BQU07RUFDM0I7RUFDQU8sVUFBVSxFQUFFLENBQUNSLElBQUksRUFBRUMsQ0FBQyxFQUFFUSxTQUFTLEVBQUUsT0FBTyxFQUFFLEdBQUczQixLQUFLLENBQUM0QixTQUFTO0VBQzVEQyxhQUFhLENBQUMsRUFBRSxDQUFD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
\ No newline at end of file
diff --git a/src/components/design-system/LoadingState.tsx b/src/components/design-system/LoadingState.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..b5f33b7f9c5b0af26a616c5db2869748a69cbfd4
--- /dev/null
+++ b/src/components/design-system/LoadingState.tsx
@@ -0,0 +1,94 @@
+import { c as _c } from "react/compiler-runtime";
+import React from 'react';
+import { Box, Text } from '../../ink.js';
+import { Spinner } from '../Spinner.js';
+type LoadingStateProps = {
+ /**
+ * The loading message to display next to the spinner.
+ */
+ message: string;
+
+ /**
+ * Display the message in bold.
+ * @default false
+ */
+ bold?: boolean;
+
+ /**
+ * Display the message in dimmed color.
+ * @default false
+ */
+ dimColor?: boolean;
+
+ /**
+ * Optional subtitle displayed below the main message.
+ */
+ subtitle?: string;
+};
+
+/**
+ * A spinner with loading message for async operations.
+ *
+ * @example
+ * // Basic loading
+ *
+ *
+ * @example
+ * // Bold loading message
+ *
+ *
+ * @example
+ * // With subtitle
+ *
+ */
+export function LoadingState(t0) {
+ const $ = _c(10);
+ const {
+ message,
+ bold: t1,
+ dimColor: t2,
+ subtitle
+ } = t0;
+ const bold = t1 === undefined ? false : t1;
+ const dimColor = t2 === undefined ? false : t2;
+ let t3;
+ if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
+ t3 = ;
+ $[0] = t3;
+ } else {
+ t3 = $[0];
+ }
+ let t4;
+ if ($[1] !== bold || $[2] !== dimColor || $[3] !== message) {
+ t4 = {t3}{" "}{message};
+ $[1] = bold;
+ $[2] = dimColor;
+ $[3] = message;
+ $[4] = t4;
+ } else {
+ t4 = $[4];
+ }
+ let t5;
+ if ($[5] !== subtitle) {
+ t5 = subtitle && {subtitle};
+ $[5] = subtitle;
+ $[6] = t5;
+ } else {
+ t5 = $[6];
+ }
+ let t6;
+ if ($[7] !== t4 || $[8] !== t5) {
+ t6 = {t4}{t5};
+ $[7] = t4;
+ $[8] = t5;
+ $[9] = t6;
+ } else {
+ t6 = $[9];
+ }
+ return t6;
+}
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsIkJveCIsIlRleHQiLCJTcGlubmVyIiwiTG9hZGluZ1N0YXRlUHJvcHMiLCJtZXNzYWdlIiwiYm9sZCIsImRpbUNvbG9yIiwic3VidGl0bGUiLCJMb2FkaW5nU3RhdGUiLCJ0MCIsIiQiLCJfYyIsInQxIiwidDIiLCJ1bmRlZmluZWQiLCJ0MyIsIlN5bWJvbCIsImZvciIsInQ0IiwidDUiLCJ0NiJdLCJzb3VyY2VzIjpbIkxvYWRpbmdTdGF0ZS50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgQm94LCBUZXh0IH0gZnJvbSAnLi4vLi4vaW5rLmpzJ1xuaW1wb3J0IHsgU3Bpbm5lciB9IGZyb20gJy4uL1NwaW5uZXIuanMnXG5cbnR5cGUgTG9hZGluZ1N0YXRlUHJvcHMgPSB7XG4gIC8qKlxuICAgKiBUaGUgbG9hZGluZyBtZXNzYWdlIHRvIGRpc3BsYXkgbmV4dCB0byB0aGUgc3Bpbm5lci5cbiAgICovXG4gIG1lc3NhZ2U6IHN0cmluZ1xuXG4gIC8qKlxuICAgKiBEaXNwbGF5IHRoZSBtZXNzYWdlIGluIGJvbGQuXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBib2xkPzogYm9vbGVhblxuXG4gIC8qKlxuICAgKiBEaXNwbGF5IHRoZSBtZXNzYWdlIGluIGRpbW1lZCBjb2xvci5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIGRpbUNvbG9yPzogYm9vbGVhblxuXG4gIC8qKlxuICAgKiBPcHRpb25hbCBzdWJ0aXRsZSBkaXNwbGF5ZWQgYmVsb3cgdGhlIG1haW4gbWVzc2FnZS5cbiAgICovXG4gIHN1YnRpdGxlPzogc3RyaW5nXG59XG5cbi8qKlxuICogQSBzcGlubmVyIHdpdGggbG9hZGluZyBtZXNzYWdlIGZvciBhc3luYyBvcGVyYXRpb25zLlxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBCYXNpYyBsb2FkaW5nXG4gKiA8TG9hZGluZ1N0YXRlIG1lc3NhZ2U9XCJMb2FkaW5nLi4uXCIgLz5cbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQm9sZCBsb2FkaW5nIG1lc3NhZ2VcbiAqIDxMb2FkaW5nU3RhdGUgbWVzc2FnZT1cIkxvYWRpbmcgc2Vzc2lvbnNcIiBib2xkIC8+XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFdpdGggc3VidGl0bGVcbiAqIDxMb2FkaW5nU3RhdGVcbiAqICAgbWVzc2FnZT1cIkxvYWRpbmcgc2Vzc2lvbnNcIlxuICogICBib2xkXG4gKiAgIHN1YnRpdGxlPVwiRmV0Y2hpbmcgeW91ciBDbGF1ZGUgQ29kZSBzZXNzaW9ucy4uLlwiXG4gKiAvPlxuICovXG5leHBvcnQgZnVuY3Rpb24gTG9hZGluZ1N0YXRlKHtcbiAgbWVzc2FnZSxcbiAgYm9sZCA9IGZhbHNlLFxuICBkaW1Db2xvciA9IGZhbHNlLFxuICBzdWJ0aXRsZSxcbn06IExvYWRpbmdTdGF0ZVByb3BzKTogUmVhY3QuUmVhY3ROb2RlIHtcbiAgcmV0dXJuIChcbiAgICA8Qm94IGZsZXhEaXJlY3Rpb249XCJjb2x1bW5cIj5cbiAgICAgIDxCb3ggZmxleERpcmVjdGlvbj1cInJvd1wiPlxuICAgICAgICA8U3Bpbm5lciAvPlxuICAgICAgICA8VGV4dCBib2xkPXtib2xkfSBkaW1Db2xvcj17ZGltQ29sb3J9PlxuICAgICAgICAgIHsnICd9XG4gICAgICAgICAge21lc3NhZ2V9XG4gICAgICAgIDwvVGV4dD5cbiAgICAgIDwvQm94PlxuICAgICAge3N1YnRpdGxlICYmIDxUZXh0IGRpbUNvbG9yPntzdWJ0aXRsZX08L1RleHQ+fVxuICAgIDwvQm94PlxuICApXG59XG4iXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPQSxLQUFLLE1BQU0sT0FBTztBQUN6QixTQUFTQyxHQUFHLEVBQUVDLElBQUksUUFBUSxjQUFjO0FBQ3hDLFNBQVNDLE9BQU8sUUFBUSxlQUFlO0FBRXZDLEtBQUtDLGlCQUFpQixHQUFHO0VBQ3ZCO0FBQ0Y7QUFDQTtFQUNFQyxPQUFPLEVBQUUsTUFBTTs7RUFFZjtBQUNGO0FB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
\ No newline at end of file
diff --git a/src/components/design-system/StatusIcon.tsx b/src/components/design-system/StatusIcon.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..17f03de1625a596bfc871e0431bac44e9346960b
--- /dev/null
+++ b/src/components/design-system/StatusIcon.tsx
@@ -0,0 +1,95 @@
+import { c as _c } from "react/compiler-runtime";
+import figures from 'figures';
+import React from 'react';
+import { Text } from '../../ink.js';
+type Status = 'success' | 'error' | 'warning' | 'info' | 'pending' | 'loading';
+type Props = {
+ /**
+ * The status to display. Determines both the icon and color.
+ *
+ * - `success`: Green checkmark (✓)
+ * - `error`: Red cross (✗)
+ * - `warning`: Yellow warning symbol (⚠)
+ * - `info`: Blue info symbol (ℹ)
+ * - `pending`: Dimmed circle (○)
+ * - `loading`: Dimmed ellipsis (…)
+ */
+ status: Status;
+ /**
+ * Include a trailing space after the icon. Useful when followed by text.
+ * @default false
+ */
+ withSpace?: boolean;
+};
+const STATUS_CONFIG: Record = {
+ success: {
+ icon: figures.tick,
+ color: 'success'
+ },
+ error: {
+ icon: figures.cross,
+ color: 'error'
+ },
+ warning: {
+ icon: figures.warning,
+ color: 'warning'
+ },
+ info: {
+ icon: figures.info,
+ color: 'suggestion'
+ },
+ pending: {
+ icon: figures.circle,
+ color: undefined
+ },
+ loading: {
+ icon: '…',
+ color: undefined
+ }
+};
+
+/**
+ * Renders a status indicator icon with appropriate color.
+ *
+ * @example
+ * // Success indicator
+ *
+ *
+ * @example
+ * // Error with trailing space for text
+ * Failed to connect
+ *
+ * @example
+ * // Status line pattern
+ *
+ *
+ * Waiting for response
+ *
+ */
+export function StatusIcon(t0) {
+ const $ = _c(5);
+ const {
+ status,
+ withSpace: t1
+ } = t0;
+ const withSpace = t1 === undefined ? false : t1;
+ const config = STATUS_CONFIG[status];
+ const t2 = !config.color;
+ const t3 = withSpace && " ";
+ let t4;
+ if ($[0] !== config.color || $[1] !== config.icon || $[2] !== t2 || $[3] !== t3) {
+ t4 = {config.icon}{t3};
+ $[0] = config.color;
+ $[1] = config.icon;
+ $[2] = t2;
+ $[3] = t3;
+ $[4] = t4;
+ } else {
+ t4 = $[4];
+ }
+ return t4;
+}
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJmaWd1cmVzIiwiUmVhY3QiLCJUZXh0IiwiU3RhdHVzIiwiUHJvcHMiLCJzdGF0dXMiLCJ3aXRoU3BhY2UiLCJTVEFUVVNfQ09ORklHIiwiUmVjb3JkIiwiaWNvbiIsImNvbG9yIiwic3VjY2VzcyIsInRpY2siLCJlcnJvciIsImNyb3NzIiwid2FybmluZyIsImluZm8iLCJwZW5kaW5nIiwiY2lyY2xlIiwidW5kZWZpbmVkIiwibG9hZGluZyIsIlN0YXR1c0ljb24iLCJ0MCIsIiQiLCJfYyIsInQxIiwiY29uZmlnIiwidDIiLCJ0MyIsInQ0Il0sInNvdXJjZXMiOlsiU3RhdHVzSWNvbi50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGZpZ3VyZXMgZnJvbSAnZmlndXJlcydcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7IFRleHQgfSBmcm9tICcuLi8uLi9pbmsuanMnXG5cbnR5cGUgU3RhdHVzID0gJ3N1Y2Nlc3MnIHwgJ2Vycm9yJyB8ICd3YXJuaW5nJyB8ICdpbmZvJyB8ICdwZW5kaW5nJyB8ICdsb2FkaW5nJ1xuXG50eXBlIFByb3BzID0ge1xuICAvKipcbiAgICogVGhlIHN0YXR1cyB0byBkaXNwbGF5LiBEZXRlcm1pbmVzIGJvdGggdGhlIGljb24gYW5kIGNvbG9yLlxuICAgKlxuICAgKiAtIGBzdWNjZXNzYDogR3JlZW4gY2hlY2ttYXJrICjinJMpXG4gICAqIC0gYGVycm9yYDogUmVkIGNyb3NzICjinJcpXG4gICAqIC0gYHdhcm5pbmdgOiBZZWxsb3cgd2FybmluZyBzeW1ib2wgKOKaoClcbiAgICogLSBgaW5mb2A6IEJsdWUgaW5mbyBzeW1ib2wgKOKEuSlcbiAgICogLSBgcGVuZGluZ2A6IERpbW1lZCBjaXJjbGUgKOKXiylcbiAgICogLSBgbG9hZGluZ2A6IERpbW1lZCBlbGxpcHNpcyAo4oCmKVxuICAgKi9cbiAgc3RhdHVzOiBTdGF0dXNcbiAgLyoqXG4gICAqIEluY2x1ZGUgYSB0cmFpbGluZyBzcGFjZSBhZnRlciB0aGUgaWNvbi4gVXNlZnVsIHdoZW4gZm9sbG93ZWQgYnkgdGV4dC5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHdpdGhTcGFjZT86IGJvb2xlYW5cbn1cblxuY29uc3QgU1RBVFVTX0NPTkZJRzogUmVjb3JkPFxuICBTdGF0dXMsXG4gIHtcbiAgICBpY29uOiBzdHJpbmdcbiAgICBjb2xvcjogJ3N1Y2Nlc3MnIHwgJ2Vycm9yJyB8ICd3YXJuaW5nJyB8ICdzdWdnZXN0aW9uJyB8IHVuZGVmaW5lZFxuICB9XG4+ID0ge1xuICBzdWNjZXNzOiB7IGljb246IGZpZ3VyZXMudGljaywgY29sb3I6ICdzdWNjZXNzJyB9LFxuICBlcnJvcjogeyBpY29uOiBmaWd1cmVzLmNyb3NzLCBjb2xvcjogJ2Vycm9yJyB9LFxuICB3YXJuaW5nOiB7IGljb246IGZpZ3VyZXMud2FybmluZywgY29sb3I6ICd3YXJuaW5nJyB9LFxuICBpbmZvOiB7IGljb246IGZpZ3VyZXMuaW5mbywgY29sb3I6ICdzdWdnZXN0aW9uJyB9LFxuICBwZW5kaW5nOiB7IGljb246IGZpZ3VyZXMuY2lyY2xlLCBjb2xvcjogdW5kZWZpbmVkIH0sXG4gIGxvYWRpbmc6IHsgaWNvbjogJ+KApicsIGNvbG9yOiB1bmRlZmluZWQgfSxcbn1cblxuLyoqXG4gKiBSZW5kZXJzIGEgc3RhdHVzIGluZGljYXRvciBpY29uIHdpdGggYXBwcm9wcmlhdGUgY29sb3IuXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFN1Y2Nlc3MgaW5kaWNhdG9yXG4gKiA8U3RhdHVzSWNvbiBzdGF0dXM9XCJzdWNjZXNzXCIgLz5cbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gRXJyb3Igd2l0aCB0cmFpbGluZyBzcGFjZSBmb3IgdGV4dFxuICogPFRleHQ+PFN0YXR1c0ljb24gc3RhdHVzPVwiZXJyb3JcIiB3aXRoU3BhY2UgLz5GYWlsZWQgdG8gY29ubmVjdDwvVGV4dD5cbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gU3RhdHVzIGxpbmUgcGF0dGVyblxuICogPFRleHQ+XG4gKiAgIDxTdGF0dXNJY29uIHN0YXR1cz1cInBlbmRpbmdcIiB3aXRoU3BhY2UgLz5cbiAqICAgV2FpdGluZyBmb3IgcmVzcG9uc2VcbiAqIDwvVGV4dD5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFN0YXR1c0ljb24oe1xuICBzdGF0dXMsXG4gIHdpdGhTcGFjZSA9IGZhbHNlLFxufTogUHJvcHMpOiBSZWFjdC5SZWFjdE5vZGUge1xuICBjb25zdCBjb25maWcgPSBTVEFUVVNfQ09ORklHW3N0YXR1c11cblxuICByZXR1cm4gKFxuICAgIDxUZXh0IGNvbG9yPXtjb25maWcuY29sb3J9IGRpbUNvbG9yPXshY29uZmlnLmNvbG9yfT5cbiAgICAgIHtjb25maWcuaWNvbn1cbiAgICAgIHt3aXRoU3BhY2UgJiYgJyAnfVxuICAgIDwvVGV4dD5cbiAgKVxufVxuIl0sIm1hcHBpbmdzIjoiO0FBQUEsT0FBT0EsT0FBTyxNQUFNLFNBQVM7QUFDN0IsT0FBT0MsS0FBSyxNQUFNLE9BQU87QUFDekIsU0FBU0MsSUFBSSxRQUFRLGNBQWM7QUFFbkMsS0FBS0MsTUFBTSxHQUFHLFNBQVMsR0FBRyxPQUFPLEdBQUcsU0FBUyxHQUFHLE1BQU0sR0FBRyxTQUFTLEdBQUcsU0FBUztBQUU5RSxLQUFLQyxLQUFLLEdBQUc7RUFDWDtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNFQyxNQUFNLEVBQUVGLE1BQU07RUFDZDtBQUNGO0FBQ0E7QUFDQTtFQUNFRyxTQUFTLENBQUMsRUFBRSxPQUFPO0FBQ3JCLENBQUM7QUFFRCxNQUFNQyxhQUFhLEVBQUVDLE1BQU0sQ0FDekJMLE1BQU0sRUFDTjtFQUNFTSxJQUFJLEVBQUUsTUFBTTtFQUNaQyxLQUFLLEVBQUUsU0FBUyxHQUFHLE9BQU8sR0FBRyxTQUFTLEdBQUcsWUFBWSxHQUFHLFNBQVM7QUFDbkUsQ0FBQyxDQUNGLEdBQUc7RUFDRkMsT0FBTyxFQUFFO0lBQUVGLElBQUksRUFBRVQsT0FBTyxDQUFDWSxJQUFJO0lBQUVGLEtBQUssRUFBRTtFQUFVLENBQUM7RUFDakRHLEtBQUssRUFBRTtJQUFFSixJQUFJLEVBQUVULE9BQU8sQ0FBQ2MsS0FBSztJQUFFSixLQUFLLEVBQUU7RUFBUSxDQUFDO0VBQzlDSyxPQUFPLEVBQUU7SUFBRU4sSUFBSSxFQUFFVCxPQUFPLENBQUNlLE9BQU87SUFBRUwsS0FBSyxFQUFFO0VBQVUsQ0FBQztFQUNwRE0sSUFBSSxFQUFFO0lBQUVQLElBQUksRUFBRVQsT0FBTyxDQUFDZ0IsSUFBSTtJQUFFTixLQUFLLEVBQUU7RUFBYSxDQUFDO0VBQ2pETyxPQUFPLEVBQUU7SUFBRVIsSUFBSSxFQUFFVCxPQUFPLENBQUNrQixNQUFNO0lBQUVSLEtBQUssRUFBRVM7RUFBVSxDQUFDO0VBQ25EQyxPQUFPLEVBQUU7SUFBRVgsSUFBSSxFQUFFLEdBQUc7SUFBRUMsS0FBSyxFQUFFUztFQUFVO0FBQ3pDLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTyxTQUFBRSxXQUFBQyxFQUFBO0VBQUEsTUFBQUMsQ0FBQSxHQUFBQyxFQUFBO0VBQW9CO0lBQUFuQixNQUFBO0lBQUFDLFNBQUEsRUFBQW1CO0VBQUEsSUFBQUgsRUFHbkI7RUFETixNQUFBaEIsU0FBQSxHQUFBbUIsRUFBaUIsS0FBakJOLFNBQWlCLEdBQWpCLEtBQWlCLEdBQWpCTSxFQUFpQjtFQUVqQixNQUFBQyxNQUFBLEdBQWVuQixhQUFhLENBQUNGLE1BQU0sQ0FBQztFQUdHLE1BQUFzQixFQUFBLElBQUNELE1BQU0sQ0FBQWhCLEtBQU07RUFFL0MsTUFBQWtCLEVBQUEsR0FBQXRCLFNBQWdCLElBQWhCLEdBQWdCO0VBQUEsSUFBQXVCLEVBQUE7RUFBQSxJQUFBTixDQUFBLFFBQUFHLE1BQUEsQ0FBQWhCLEtBQUEsSUFBQWEsQ0FBQSxRQUFBRyxNQUFBLENBQUFqQixJQUFBLElBQUFjLENBQUEsUUFBQUksRUFBQSxJQUFBSixDQUFBLFFBQUFLLEVBQUE7SUFGbkJDLEVBQUEsSUFBQyxJQUFJLENBQVEsS0FBWSxDQUFaLENBQUFILE1BQU0sQ0FBQWhCLEtBQUssQ0FBQyxDQUFZLFFBQWEsQ0FBYixDQUFBaUIsRUFBWSxDQUFDLENBQy9DLENBQUFELE1BQU0sQ0FBQWpCLElBQUksQ0FDVixDQUFBbUIsRUFBZSxDQUNsQixFQUhDLElBQUksQ0FHRTtJQUFBTCxDQUFBLE1BQUFHLE1BQUEsQ0FBQWhCLEtBQUE7SUFBQWEsQ0FBQSxNQUFBRyxNQUFBLENBQUFqQixJQUFBO0lBQUFjLENBQUEsTUFBQUksRUFBQTtJQUFBSixDQUFBLE1BQUFLLEVBQUE7SUFBQUwsQ0FBQSxNQUFBTSxFQUFBO0VBQUE7SUFBQUEsRUFBQSxHQUFBTixDQUFBO0VBQUE7RUFBQSxPQUhQTSxFQUdPO0FBQUEiLCJpZ25vcmVMaXN0IjpbXX0=
\ No newline at end of file
diff --git a/src/components/design-system/Tabs.tsx b/src/components/design-system/Tabs.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..e1618368d3e32946fda9e8050b94fa32ece3e8de
--- /dev/null
+++ b/src/components/design-system/Tabs.tsx
@@ -0,0 +1,340 @@
+import { c as _c } from "react/compiler-runtime";
+import React, { createContext, useCallback, useContext, useEffect, useState } from 'react';
+import { useIsInsideModal, useModalScrollRef } from '../../context/modalContext.js';
+import { useTerminalSize } from '../../hooks/useTerminalSize.js';
+import ScrollBox from '../../ink/components/ScrollBox.js';
+import type { KeyboardEvent } from '../../ink/events/keyboard-event.js';
+import { stringWidth } from '../../ink/stringWidth.js';
+import { Box, Text } from '../../ink.js';
+import { useKeybindings } from '../../keybindings/useKeybinding.js';
+import type { Theme } from '../../utils/theme.js';
+type TabsProps = {
+ children: Array>;
+ title?: string;
+ color?: keyof Theme;
+ defaultTab?: string;
+ hidden?: boolean;
+ useFullWidth?: boolean;
+ /** Controlled mode: current selected tab id/title */
+ selectedTab?: string;
+ /** Controlled mode: callback when tab changes */
+ onTabChange?: (tabId: string) => void;
+ /** Optional banner to display below tabs header */
+ banner?: React.ReactNode;
+ /** Disable keyboard navigation (e.g. when a child component handles arrow keys) */
+ disableNavigation?: boolean;
+ /**
+ * Initial focus state for the tab header row. Defaults to true (header
+ * focused, nav always works). Keep the default for Select/list content —
+ * those only use up/down so there's no conflict; pass
+ * isDisabled={headerFocused} to the Select instead. Only set false when
+ * content actually binds left/right/tab (e.g. enum cycling), and show a
+ * "↑ tabs" footer hint — without it tabs look broken.
+ */
+ initialHeaderFocused?: boolean;
+ /**
+ * Fixed height for the content area. When set, all tabs render within the
+ * same height (overflow hidden) so switching tabs doesn't cause layout
+ * shifts. Shorter tabs get whitespace; taller tabs are clipped.
+ */
+ contentHeight?: number;
+ /**
+ * Let Tab/←/→ switch tabs from focused content. Opt-in since some
+ * content uses those keys; pass a reactive boolean to cede them when
+ * needed. Switching from content focuses the header.
+ */
+ navFromContent?: boolean;
+};
+type TabsContextValue = {
+ selectedTab: string | undefined;
+ width: number | undefined;
+ headerFocused: boolean;
+ focusHeader: () => void;
+ blurHeader: () => void;
+ registerOptIn: () => () => void;
+};
+const TabsContext = createContext({
+ selectedTab: undefined,
+ width: undefined,
+ // Default for components rendered outside a Tabs (tests, standalone):
+ // content has focus, focusHeader is a no-op.
+ headerFocused: false,
+ focusHeader: () => {},
+ blurHeader: () => {},
+ registerOptIn: () => () => {}
+});
+export function Tabs(t0) {
+ const $ = _c(25);
+ const {
+ title,
+ color,
+ defaultTab,
+ children,
+ hidden,
+ useFullWidth,
+ selectedTab: controlledSelectedTab,
+ onTabChange,
+ banner,
+ disableNavigation,
+ initialHeaderFocused: t1,
+ contentHeight,
+ navFromContent: t2
+ } = t0;
+ const initialHeaderFocused = t1 === undefined ? true : t1;
+ const navFromContent = t2 === undefined ? false : t2;
+ const {
+ columns: terminalWidth
+ } = useTerminalSize();
+ const tabs = children.map(_temp);
+ const defaultTabIndex = defaultTab ? tabs.findIndex(tab => defaultTab === tab[0]) : 0;
+ const isControlled = controlledSelectedTab !== undefined;
+ const [internalSelectedTab, setInternalSelectedTab] = useState(defaultTabIndex !== -1 ? defaultTabIndex : 0);
+ const controlledTabIndex = isControlled ? tabs.findIndex(tab_0 => tab_0[0] === controlledSelectedTab) : -1;
+ const selectedTabIndex = isControlled ? controlledTabIndex !== -1 ? controlledTabIndex : 0 : internalSelectedTab;
+ const modalScrollRef = useModalScrollRef();
+ const [headerFocused, setHeaderFocused] = useState(initialHeaderFocused);
+ let t3;
+ if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
+ t3 = () => setHeaderFocused(true);
+ $[0] = t3;
+ } else {
+ t3 = $[0];
+ }
+ const focusHeader = t3;
+ let t4;
+ if ($[1] === Symbol.for("react.memo_cache_sentinel")) {
+ t4 = () => setHeaderFocused(false);
+ $[1] = t4;
+ } else {
+ t4 = $[1];
+ }
+ const blurHeader = t4;
+ const [optInCount, setOptInCount] = useState(0);
+ let t5;
+ if ($[2] === Symbol.for("react.memo_cache_sentinel")) {
+ t5 = () => {
+ setOptInCount(_temp2);
+ return () => setOptInCount(_temp3);
+ };
+ $[2] = t5;
+ } else {
+ t5 = $[2];
+ }
+ const registerOptIn = t5;
+ const optedIn = optInCount > 0;
+ const handleTabChange = offset => {
+ const newIndex = (selectedTabIndex + tabs.length + offset) % tabs.length;
+ const newTabId = tabs[newIndex]?.[0];
+ if (isControlled && onTabChange && newTabId) {
+ onTabChange(newTabId);
+ } else {
+ setInternalSelectedTab(newIndex);
+ }
+ setHeaderFocused(true);
+ };
+ const t6 = !hidden && !disableNavigation && headerFocused;
+ let t7;
+ if ($[3] !== t6) {
+ t7 = {
+ context: "Tabs",
+ isActive: t6
+ };
+ $[3] = t6;
+ $[4] = t7;
+ } else {
+ t7 = $[4];
+ }
+ useKeybindings({
+ "tabs:next": () => handleTabChange(1),
+ "tabs:previous": () => handleTabChange(-1)
+ }, t7);
+ let t8;
+ if ($[5] !== headerFocused || $[6] !== hidden || $[7] !== optedIn) {
+ t8 = e => {
+ if (!headerFocused || !optedIn || hidden) {
+ return;
+ }
+ if (e.key === "down") {
+ e.preventDefault();
+ setHeaderFocused(false);
+ }
+ };
+ $[5] = headerFocused;
+ $[6] = hidden;
+ $[7] = optedIn;
+ $[8] = t8;
+ } else {
+ t8 = $[8];
+ }
+ const handleKeyDown = t8;
+ const t9 = navFromContent && !headerFocused && optedIn && !hidden && !disableNavigation;
+ let t10;
+ if ($[9] !== t9) {
+ t10 = {
+ context: "Tabs",
+ isActive: t9
+ };
+ $[9] = t9;
+ $[10] = t10;
+ } else {
+ t10 = $[10];
+ }
+ useKeybindings({
+ "tabs:next": () => {
+ handleTabChange(1);
+ setHeaderFocused(true);
+ },
+ "tabs:previous": () => {
+ handleTabChange(-1);
+ setHeaderFocused(true);
+ }
+ }, t10);
+ const titleWidth = title ? stringWidth(title) + 1 : 0;
+ const tabsWidth = tabs.reduce(_temp4, 0);
+ const usedWidth = titleWidth + tabsWidth;
+ const spacerWidth = useFullWidth ? Math.max(0, terminalWidth - usedWidth) : 0;
+ const contentWidth = useFullWidth ? terminalWidth : undefined;
+ const T0 = Box;
+ const t11 = "column";
+ const t12 = 0;
+ const t13 = true;
+ const t14 = modalScrollRef ? 0 : undefined;
+ const t15 = !hidden && {title !== undefined && {title}}{tabs.map((t16, i) => {
+ const [id, title_0] = t16;
+ const isCurrent = selectedTabIndex === i;
+ const hasColorCursor = color && isCurrent && headerFocused;
+ return {" "}{title_0}{" "};
+ })}{spacerWidth > 0 && {" ".repeat(spacerWidth)}};
+ let t17;
+ if ($[11] !== children || $[12] !== contentHeight || $[13] !== contentWidth || $[14] !== hidden || $[15] !== modalScrollRef || $[16] !== selectedTabIndex) {
+ t17 = modalScrollRef ? {children} : {children};
+ $[11] = children;
+ $[12] = contentHeight;
+ $[13] = contentWidth;
+ $[14] = hidden;
+ $[15] = modalScrollRef;
+ $[16] = selectedTabIndex;
+ $[17] = t17;
+ } else {
+ t17 = $[17];
+ }
+ let t18;
+ if ($[18] !== T0 || $[19] !== banner || $[20] !== handleKeyDown || $[21] !== t14 || $[22] !== t15 || $[23] !== t17) {
+ t18 = {t15}{banner}{t17};
+ $[18] = T0;
+ $[19] = banner;
+ $[20] = handleKeyDown;
+ $[21] = t14;
+ $[22] = t15;
+ $[23] = t17;
+ $[24] = t18;
+ } else {
+ t18 = $[24];
+ }
+ return {t18};
+}
+function _temp4(sum, t0) {
+ const [, tabTitle] = t0;
+ return sum + (tabTitle ? stringWidth(tabTitle) : 0) + 2 + 1;
+}
+function _temp3(n_0) {
+ return n_0 - 1;
+}
+function _temp2(n) {
+ return n + 1;
+}
+function _temp(child) {
+ return [child.props.id ?? child.props.title, child.props.title];
+}
+type TabProps = {
+ title: string;
+ id?: string;
+ children: React.ReactNode;
+};
+export function Tab(t0) {
+ const $ = _c(4);
+ const {
+ title,
+ id,
+ children
+ } = t0;
+ const {
+ selectedTab,
+ width
+ } = useContext(TabsContext);
+ const insideModal = useIsInsideModal();
+ if (selectedTab !== (id ?? title)) {
+ return null;
+ }
+ const t1 = insideModal ? 0 : undefined;
+ let t2;
+ if ($[0] !== children || $[1] !== t1 || $[2] !== width) {
+ t2 = {children};
+ $[0] = children;
+ $[1] = t1;
+ $[2] = width;
+ $[3] = t2;
+ } else {
+ t2 = $[3];
+ }
+ return t2;
+}
+export function useTabsWidth() {
+ const {
+ width
+ } = useContext(TabsContext);
+ return width;
+}
+
+/**
+ * Opt into header-focus gating. Returns the current header focus state and a
+ * callback to hand focus back to the tab row. For a Select, pass
+ * `isDisabled={headerFocused}` and `onUpFromFirstItem={focusHeader}`; keep the
+ * parent Tabs' initialHeaderFocused at its default so tab/←/→ work on mount.
+ *
+ * Calling this hook registers a ↓-blurs-header opt-in on mount. Don't call it
+ * above an early return that renders static text — ↓ will blur the header with
+ * no onUpFromFirstItem to recover. Split the component so the hook only runs
+ * when the Select renders.
+ */
+export function useTabHeaderFocus() {
+ const $ = _c(6);
+ const {
+ headerFocused,
+ focusHeader,
+ blurHeader,
+ registerOptIn
+ } = useContext(TabsContext);
+ let t0;
+ if ($[0] !== registerOptIn) {
+ t0 = [registerOptIn];
+ $[0] = registerOptIn;
+ $[1] = t0;
+ } else {
+ t0 = $[1];
+ }
+ useEffect(registerOptIn, t0);
+ let t1;
+ if ($[2] !== blurHeader || $[3] !== focusHeader || $[4] !== headerFocused) {
+ t1 = {
+ headerFocused,
+ focusHeader,
+ blurHeader
+ };
+ $[2] = blurHeader;
+ $[3] = focusHeader;
+ $[4] = headerFocused;
+ $[5] = t1;
+ } else {
+ t1 = $[5];
+ }
+ return t1;
+}
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsImNyZWF0ZUNvbnRleHQiLCJ1c2VDYWxsYmFjayIsInVzZUNvbnRleHQiLCJ1c2VFZmZlY3QiLCJ1c2VTdGF0ZSIsInVzZUlzSW5zaWRlTW9kYWwiLCJ1c2VNb2RhbFNjcm9sbFJlZiIsInVzZVRlcm1pbmFsU2l6ZSIsIlNjcm9sbEJveCIsIktleWJvYXJkRXZlbnQiLCJzdHJpbmdXaWR0aCIsIkJveCIsIlRleHQiLCJ1c2VLZXliaW5kaW5ncyIsIlRoZW1lIiwiVGFic1Byb3BzIiwiY2hpbGRyZW4iLCJBcnJheSIsIlJlYWN0RWxlbWVudCIsIlRhYlByb3BzIiwidGl0bGUiLCJjb2xvciIsImRlZmF1bHRUYWIiLCJoaWRkZW4iLCJ1c2VGdWxsV2lkdGgiLCJzZWxlY3RlZFRhYiIsIm9uVGFiQ2hhbmdlIiwidGFiSWQiLCJiYW5uZXIiLCJSZWFjdE5vZGUiLCJkaXNhYmxlTmF2aWdhdGlvbiIsImluaXRpYWxIZWFkZXJGb2N1c2VkIiwiY29udGVudEhlaWdodCIsIm5hdkZyb21Db250ZW50IiwiVGFic0NvbnRleHRWYWx1ZSIsIndpZHRoIiwiaGVhZGVyRm9jdXNlZCIsImZvY3VzSGVhZGVyIiwiYmx1ckhlYWRlciIsInJlZ2lzdGVyT3B0SW4iLCJUYWJzQ29udGV4dCIsInVuZGVmaW5lZCIsIlRhYnMiLCJ0MCIsIiQiLCJfYyIsImNvbnRyb2xsZWRTZWxlY3RlZFRhYiIsInQxIiwidDIiLCJjb2x1bW5zIiwidGVybWluYWxXaWR0aCIsInRhYnMiLCJtYXAiLCJfdGVtcCIsImRlZmF1bHRUYWJJbmRleCIsImZpbmRJbmRleCIsInRhYiIsImlzQ29udHJvbGxlZCIsImludGVybmFsU2VsZWN0ZWRUYWIiLCJzZXRJbnRlcm5hbFNlbGVjdGVkVGFiIiwiY29udHJvbGxlZFRhYkluZGV4IiwidGFiXzAiLCJzZWxlY3RlZFRhYkluZGV4IiwibW9kYWxTY3JvbGxSZWYiLCJzZXRIZWFkZXJGb2N1c2VkIiwidDMiLCJTeW1ib2wiLCJmb3IiLCJ0NCIsIm9wdEluQ291bnQiLCJzZXRPcHRJbkNvdW50IiwidDUiLCJfdGVtcDIiLCJfdGVtcDMiLCJvcHRlZEluIiwiaGFuZGxlVGFiQ2hhbmdlIiwib2Zmc2V0IiwibmV3SW5kZXgiLCJsZW5ndGgiLCJuZXdUYWJJZCIsInQ2IiwidDciLCJjb250ZXh0IiwiaXNBY3RpdmUiLCJ0YWJzOm5leHQiLCJ0YWJzOnByZXZpb3VzIiwidDgiLCJlIiwia2V5IiwicHJldmVudERlZmF1bHQiLCJoYW5kbGVLZXlEb3duIiwidDkiLCJ0MTAiLCJ0aXRsZVdpZHRoIiwidGFic1dpZHRoIiwicmVkdWNlIiwiX3RlbXA0IiwidXNlZFdpZHRoIiwic3BhY2VyV2lkdGgiLCJNYXRoIiwibWF4IiwiY29udGVudFdpZHRoIiwiVDAiLCJ0MTEiLCJ0MTIiLCJ0MTMiLCJ0MTQiLCJ0MTUiLCJ0MTYiLCJpIiwiaWQiLCJ0aXRsZV8wIiwiaXNDdXJyZW50IiwiaGFzQ29sb3JDdXJzb3IiLCJyZXBlYXQiLCJ0MTciLCJ0MTgiLCJzdW0iLCJ0YWJUaXRsZSIsIm5fMCIsIm4iLCJjaGlsZCIsInByb3BzIiwiVGFiIiwiaW5zaWRlTW9kYWwiLCJ1c2VUYWJzV2lkdGgiLCJ1c2VUYWJIZWFkZXJGb2N1cyJdLCJzb3VyY2VzIjpbIlRhYnMudHN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCwge1xuICBjcmVhdGVDb250ZXh0LFxuICB1c2VDYWxsYmFjayxcbiAgdXNlQ29udGV4dCxcbiAgdXNlRWZmZWN0LFxuICB1c2VTdGF0ZSxcbn0gZnJvbSAncmVhY3QnXG5pbXBvcnQge1xuICB1c2VJc0luc2lkZU1vZGFsLFxuICB1c2VNb2RhbFNjcm9sbFJlZixcbn0gZnJvbSAnLi4vLi4vY29udGV4dC9tb2RhbENvbnRleHQuanMnXG5pbXBvcnQgeyB1c2VUZXJtaW5hbFNpemUgfSBmcm9tICcuLi8uLi9ob29rcy91c2VUZXJtaW5hbFNpemUuanMnXG5pbXBvcnQgU2Nyb2xsQm94IGZyb20gJy4uLy4uL2luay9jb21wb25lbnRzL1Njcm9sbEJveC5qcydcbmltcG9ydCB0eXBlIHsgS2V5Ym9hcmRFdmVudCB9IGZyb20gJy4uLy4uL2luay9ldmVudHMva2V5Ym9hcmQtZXZlbnQuanMnXG5pbXBvcnQgeyBzdHJpbmdXaWR0aCB9IGZyb20gJy4uLy4uL2luay9zdHJpbmdXaWR0aC5qcydcbmltcG9ydCB7IEJveCwgVGV4dCB9IGZyb20gJy4uLy4uL2luay5qcydcbmltcG9ydCB7IHVzZUtleWJpbmRpbmdzIH0gZnJvbSAnLi4vLi4va2V5YmluZGluZ3MvdXNlS2V5YmluZGluZy5qcydcbmltcG9ydCB0eXBlIHsgVGhlbWUgfSBmcm9tICcuLi8uLi91dGlscy90aGVtZS5qcydcblxudHlwZSBUYWJzUHJvcHMgPSB7XG4gIGNoaWxkcmVuOiBBcnJheTxSZWFjdC5SZWFjdEVsZW1lbnQ8VGFiUHJvcHM+PlxuICB0aXRsZT86IHN0cmluZ1xuICBjb2xvcj86IGtleW9mIFRoZW1lXG4gIGRlZmF1bHRUYWI/OiBzdHJpbmdcbiAgaGlkZGVuPzogYm9vbGVhblxuICB1c2VGdWxsV2lkdGg/OiBib29sZWFuXG4gIC8qKiBDb250cm9sbGVkIG1vZGU6IGN1cnJlbnQgc2VsZWN0ZWQgdGFiIGlkL3RpdGxlICovXG4gIHNlbGVjdGVkVGFiPzogc3RyaW5nXG4gIC8qKiBDb250cm9sbGVkIG1vZGU6IGNhbGxiYWNrIHdoZW4gdGFiIGNoYW5nZXMgKi9cbiAgb25UYWJDaGFuZ2U/OiAodGFiSWQ6IHN0cmluZykgPT4gdm9pZFxuICAvKiogT3B0aW9uYWwgYmFubmVyIHRvIGRpc3BsYXkgYmVsb3cgdGFicyBoZWFkZXIgKi9cbiAgYmFubmVyPzogUmVhY3QuUmVhY3ROb2RlXG4gIC8qKiBEaXNhYmxlIGtleWJvYXJkIG5hdmlnYXRpb24gKGUuZy4gd2hlbiBhIGNoaWxkIGNvbXBvbmVudCBoYW5kbGVzIGFycm93IGtleXMpICovXG4gIGRpc2FibGVOYXZpZ2F0aW9uPzogYm9vbGVhblxuICAvKipcbiAgICogSW5pdGlhbCBmb2N1cyBzdGF0ZSBmb3IgdGhlIHRhYiBoZWFkZXIgcm93LiBEZWZhdWx0cyB0byB0cnVlIChoZWFkZXJcbiAgICogZm9jdXNlZCwgbmF2IGFsd2F5cyB3b3JrcykuIEtlZXAgdGhlIGRlZmF1bHQgZm9yIFNlbGVjdC9saXN0IGNvbnRlbnQg4oCUXG4gICAqIHRob3NlIG9ubHkgdXNlIHVwL2Rvd24gc28gdGhlcmUncyBubyBjb25mbGljdDsgcGFzc1xuICAgKiBpc0Rpc2FibGVkPXtoZWFkZXJGb2N1c2VkfSB0byB0aGUgU2VsZWN0IGluc3RlYWQuIE9ubHkgc2V0IGZhbHNlIHdoZW5cbiAgICogY29udGVudCBhY3R1YWxseSBiaW5kcyBsZWZ0L3JpZ2h0L3RhYiAoZS5nLiBlbnVtIGN5Y2xpbmcpLCBhbmQgc2hvdyBhXG4gICAqIFwi4oaRIHRhYnNcIiBmb290ZXIgaGludCDigJQgd2l0aG91dCBpdCB0YWJzIGxvb2sgYnJva2VuLlxuICAgKi9cbiAgaW5pdGlhbEhlYWRlckZvY3VzZWQ/OiBib29sZWFuXG4gIC8qKlxuICAgKiBGaXhlZCBoZWlnaHQgZm9yIHRoZSBjb250ZW50IGFyZWEuIFdoZW4gc2V0LCBhbGwgdGFicyByZW5kZXIgd2l0aGluIHRoZVxuICAgKiBzYW1lIGhlaWdodCAob3ZlcmZsb3cgaGlkZGVuKSBzbyBzd2l0Y2hpbmcgdGFicyBkb2Vzbid0IGNhdXNlIGxheW91dFxuICAgKiBzaGlmdHMuIFNob3J0ZXIgdGFicyBnZXQgd2hpdGVzcGFjZTsgdGFsbGVyIHRhYnMgYXJlIGNsaXBwZWQuXG4gICAqL1xuICBjb250ZW50SGVpZ2h0PzogbnVtYmVyXG4gIC8qKlxuICAgKiBMZXQgVGFiL+KGkC/ihpIgc3dpdGNoIHRhYnMgZnJvbSBmb2N1c2VkIGNvbnRlbnQuIE9wdC1pbiBzaW5jZSBzb21lXG4gICAqIGNvbnRlbnQgdXNlcyB0aG9zZSBrZXlzOyBwYXNzIGEgcmVhY3RpdmUgYm9vbGVhbiB0byBjZWRlIHRoZW0gd2hlblxuICAgKiBuZWVkZWQuIFN3aXRjaGluZyBmcm9tIGNvbnRlbnQgZm9jdXNlcyB0aGUgaGVhZGVyLlxuICAgKi9cbiAgbmF2RnJvbUNvbnRlbnQ/OiBib29sZWFuXG59XG5cbnR5cGUgVGFic0NvbnRleHRWYWx1ZSA9IHtcbiAgc2VsZWN0ZWRUYWI6IHN0cmluZyB8IHVuZGVmaW5lZFxuICB3aWR0aDogbnVtYmVyIHwgdW5kZWZpbmVkXG4gIGhlYWRlckZvY3VzZWQ6IGJvb2xlYW5cbiAgZm9jdXNIZWFkZXI6ICgpID0+IHZvaWRcbiAgYmx1ckhlYWRlcjogKCkgPT4gdm9pZFxuICByZWdpc3Rlck9wdEluOiAoKSA9PiAoKSA9PiB2b2lkXG59XG5cbmNvbnN0IFRhYnNDb250ZXh0ID0gY3JlYXRlQ29udGV4dDxUYWJzQ29udGV4dFZhbHVlPih7XG4gIHNlbGVjdGVkVGFiOiB1bmRlZmluZWQsXG4gIHdpZHRoOiB1bmRlZmluZWQsXG4gIC8vIERlZmF1bHQgZm9yIGNvbXBvbmVudHMgcmVuZGVyZWQgb3V0c2lkZSBhIFRhYnMgKHRlc3RzLCBzdGFuZGFsb25lKTpcbiAgLy8gY29udGVudCBoYXMgZm9jdXMsIGZvY3VzSGVhZGVyIGlzIGEgbm8tb3AuXG4gIGhlYWRlckZvY3VzZWQ6IGZhbHNlLFxuICBmb2N1c0hlYWRlcjogKCkgPT4ge30sXG4gIGJsdXJIZWFkZXI6ICgpID0+IHt9LFxuICByZWdpc3Rlck9wdEluOiAoKSA9PiAoKSA9PiB7fSxcbn0pXG5cbmV4cG9ydCBmdW5jdGlvbiBUYWJzKHtcbiAgdGl0bGUsXG4gIGNvbG9yLFxuICBkZWZhdWx0VGFiLFxuICBjaGlsZHJlbixcbiAgaGlkZGVuLFxuICB1c2VGdWxsV2lkdGgsXG4gIHNlbGVjdGVkVGFiOiBjb250cm9sbGVkU2VsZWN0ZWRUYWIsXG4gIG9uVGFiQ2hhbmdlLFxuICBiYW5uZXIsXG4gIGRpc2FibGVOYXZpZ2F0aW9uLFxuICBpbml0aWFsSGVhZGVyRm9jdXNlZCA9IHRydWUsXG4gIGNvbnRlbnRIZWlnaHQsXG4gIG5hdkZyb21Db250ZW50ID0gZmFsc2UsXG59OiBUYWJzUHJvcHMpOiBSZWFjdC5SZWFjdE5vZGUge1xuICBjb25zdCB7IGNvbHVtbnM6IHRlcm1pbmFsV2lkdGggfSA9IHVzZVRlcm1pbmFsU2l6ZSgpXG4gIGNvbnN0IHRhYnMgPSBjaGlsZHJlbi5tYXAoY2hpbGQgPT4gW1xuICAgIGNoaWxkLnByb3BzLmlkID8/IGNoaWxkLnByb3BzLnRpdGxlLFxuICAgIGNoaWxkLnByb3BzLnRpdGxlLFxuICBdKVxuICBjb25zdCBkZWZhdWx0VGFiSW5kZXggPSBkZWZhdWx0VGFiXG4gICAgPyB0YWJzLmZpbmRJbmRleCh0YWIgPT4gZGVmYXVsdFRhYiA9PT0gdGFiWzBdKVxuICAgIDogMFxuXG4gIC8vIFN1cHBvcnQgYm90aCBjb250cm9sbGVkIGFuZCB1bmNvbnRyb2xsZWQgbW9kZXNcbiAgY29uc3QgaXNDb250cm9sbGVkID0gY29udHJvbGxlZFNlbGVjdGVkVGFiICE9PSB1bmRlZmluZWRcbiAgY29uc3QgW2ludGVybmFsU2VsZWN0ZWRUYWIsIHNldEludGVybmFsU2VsZWN0ZWRUYWJdID0gdXNlU3RhdGUoXG4gICAgZGVmYXVsdFRhYkluZGV4ICE9PSAtMSA/IGRlZmF1bHRUYWJJbmRleCA6IDAsXG4gIClcblxuICAvLyBJbiBjb250cm9sbGVkIG1vZGUsIGZpbmQgdGhlIGluZGV4IG9mIHRoZSBjb250cm9sbGVkIHRhYlxuICBjb25zdCBjb250cm9sbGVkVGFiSW5kZXggPSBpc0NvbnRyb2xsZWRcbiAgICA/IHRhYnMuZmluZEluZGV4KHRhYiA9PiB0YWJbMF0gPT09IGNvbnRyb2xsZWRTZWxlY3RlZFRhYilcbiAgICA6IC0xXG4gIGNvbnN0IHNlbGVjdGVkVGFiSW5kZXggPSBpc0NvbnRyb2xsZWRcbiAgICA/IGNvbnRyb2xsZWRUYWJJbmRleCAhPT0gLTFcbiAgICAgID8gY29udHJvbGxlZFRhYkluZGV4XG4gICAgICA6IDBcbiAgICA6IGludGVybmFsU2VsZWN0ZWRUYWJcblxuICBjb25zdCBtb2RhbFNjcm9sbFJlZiA9IHVzZU1vZGFsU2Nyb2xsUmVmKClcblxuICAvLyBIZWFkZXIgZm9jdXM6IGxlZnQvcmlnaHQvdGFiIG9ubHkgc3dpdGNoIHRhYnMgd2hlbiB0aGUgaGVhZGVyIHJvdyBpc1xuICAvLyBmb2N1c2VkLiBDaGlsZHJlbiB3aXRoIGludGVyYWN0aXZlIGNvbnRlbnQgY2FsbCBmb2N1c0hlYWRlcigpICh2aWFcbiAgLy8gdXNlVGFiSGVhZGVyRm9jdXMpIG9uIHVwLWFycm93IHRvIGhhbmQgZm9jdXMgYmFjayBoZXJlOyBkb3duLWFycm93XG4gIC8vIHJldHVybnMgaXQuIFRhYnMgdGhhdCBuZXZlciBjYWxsIHRoZSBob29rIHNlZSBubyBiZWhhdmlvciBjaGFuZ2Ug4oCUXG4gIC8vIGluaXRpYWxIZWFkZXJGb2N1c2VkIGRlZmF1bHRzIHRvIHRydWUgc28gbmF2IGFsd2F5cyB3b3Jrcy5cbiAgY29uc3QgW2hlYWRlckZvY3VzZWQsIHNldEhlYWRlckZvY3VzZWRdID0gdXNlU3RhdGUoaW5pdGlhbEhlYWRlckZvY3VzZWQpXG4gIGNvbnN0IGZvY3VzSGVhZGVyID0gdXNlQ2FsbGJhY2soKCkgPT4gc2V0SGVhZGVyRm9jdXNlZCh0cnVlKSwgW10pXG4gIGNvbnN0IGJsdXJIZWFkZXIgPSB1c2VDYWxsYmFjaygoKSA9PiBzZXRIZWFkZXJGb2N1c2VkKGZhbHNlKSwgW10pXG4gIC8vIENvdW50IG9mIG1vdW50ZWQgY2hpbGRyZW4gdXNpbmcgdXNlVGFiSGVhZGVyRm9jdXMoKS4gRG93bi1hcnJvdyBibHVyIGFuZFxuICAvLyB0aGUg4oaTIGhpbnQgb25seSBlbmdhZ2Ugd2hlbiBhdCBsZWFzdCBvbmUgY2hpbGQgaGFzIG9wdGVkIGluIOKAlCBvdGhlcndpc2VcbiAgLy8gcHJlc3NpbmcgZG93biBvbiBhIGxlZ2FjeSB0YWIgd291bGQgc3RyYW5kIHRoZSB1c2VyIHdpdGggbmF2IGRpc2FibGVkLlxuICBjb25zdCBbb3B0SW5Db3VudCwgc2V0T3B0SW5Db3VudF0gPSB1c2VTdGF0ZSgwKVxuICBjb25zdCByZWdpc3Rlck9wdEluID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIHNldE9wdEluQ291bnQobiA9PiBuICsgMSlcbiAgICByZXR1cm4gKCkgPT4gc2V0T3B0SW5Db3VudChuID0+IG4gLSAxKVxuICB9LCBbXSlcbiAgY29uc3Qgb3B0ZWRJbiA9IG9wdEluQ291bnQgPiAwXG5cbiAgY29uc3QgaGFuZGxlVGFiQ2hhbmdlID0gKG9mZnNldDogbnVtYmVyKSA9PiB7XG4gICAgY29uc3QgbmV3SW5kZXggPSAoc2VsZWN0ZWRUYWJJbmRleCArIHRhYnMubGVuZ3RoICsgb2Zmc2V0KSAlIHRhYnMubGVuZ3RoXG4gICAgY29uc3QgbmV3VGFiSWQgPSB0YWJzW25ld0luZGV4XT8uWzBdXG5cbiAgICBpZiAoaXNDb250cm9sbGVkICYmIG9uVGFiQ2hhbmdlICYmIG5ld1RhYklkKSB7XG4gICAgICBvblRhYkNoYW5nZShuZXdUYWJJZClcbiAgICB9IGVsc2Uge1xuICAgICAgc2V0SW50ZXJuYWxTZWxlY3RlZFRhYihuZXdJbmRleClcbiAgICB9XG4gICAgLy8gVGFiIHN3aXRjaGluZyBpcyBhIGhlYWRlciBhY3Rpb24g4oCUIHN0YXkgZm9jdXNlZCBzbyB0aGUgdXNlciBjYW4ga2VlcFxuICAgIC8vIGN5Y2xpbmcuIFRoZSBuZXdseSBtb3VudGVkIHRhYiBjYW4gYmx1ciB2aWEgaXRzIG93biBpbnRlcmFjdGlvbi5cbiAgICBzZXRIZWFkZXJGb2N1c2VkKHRydWUpXG4gIH1cblxuICB1c2VLZXliaW5kaW5ncyhcbiAgICB7XG4gICAgICAndGFiczpuZXh0JzogKCkgPT4gaGFuZGxlVGFiQ2hhbmdlKDEpLFxuICAgICAgJ3RhYnM6cHJldmlvdXMnOiAoKSA9PiBoYW5kbGVUYWJDaGFuZ2UoLTEpLFxuICAgIH0sXG4gICAge1xuICAgICAgY29udGV4dDogJ1RhYnMnLFxuICAgICAgaXNBY3RpdmU6ICFoaWRkZW4gJiYgIWRpc2FibGVOYXZpZ2F0aW9uICYmIGhlYWRlckZvY3VzZWQsXG4gICAgfSxcbiAgKVxuXG4gIC8vIFdoZW4gdGhlIGhlYWRlciBpcyBmb2N1c2VkLCBkb3duLWFycm93IHJldHVybnMgZm9jdXMgdG8gY29udGVudC4gT25seVxuICAvLyBhY3RpdmUgd2hlbiB0aGUgc2VsZWN0ZWQgdGFiIGhhcyBvcHRlZCBpbiB2aWEgdXNlVGFiSGVhZGVyRm9jdXMoKSDigJRcbiAgLy8gbGVnYWN5IHRhYnMgaGF2ZSBub3doZXJlIHRvIHJldHVybiBmb2N1cyB0by5cbiAgY29uc3QgaGFuZGxlS2V5RG93biA9IChlOiBLZXlib2FyZEV2ZW50KSA9PiB7XG4gICAgaWYgKCFoZWFkZXJGb2N1c2VkIHx8ICFvcHRlZEluIHx8IGhpZGRlbikgcmV0dXJuXG4gICAgaWYgKGUua2V5ID09PSAnZG93bicpIHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKVxuICAgICAgc2V0SGVhZGVyRm9jdXNlZChmYWxzZSlcbiAgICB9XG4gIH1cblxuICAvLyBPcHQtaW46IHNhbWUgdGFiczpuZXh0L3ByZXZpb3VzIGFjdGlvbnMsIGFjdGl2ZSBmcm9tIGNvbnRlbnQuIEZvY3VzZXNcbiAgLy8gdGhlIGhlYWRlciBzbyBzdWJzZXF1ZW50IHByZXNzZXMgY3ljbGUgdmlhIHRoZSBoYW5kbGVyIGFib3ZlLlxuICB1c2VLZXliaW5kaW5ncyhcbiAgICB7XG4gICAgICAndGFiczpuZXh0JzogKCkgPT4ge1xuICAgICAgICBoYW5kbGVUYWJDaGFuZ2UoMSlcbiAgICAgICAgc2V0SGVhZGVyRm9jdXNlZCh0cnVlKVxuICAgICAgfSxcbiAgICAgICd0YWJzOnByZXZpb3VzJzogKCkgPT4ge1xuICAgICAgICBoYW5kbGVUYWJDaGFuZ2UoLTEpXG4gICAgICAgIHNldEhlYWRlckZvY3VzZWQodHJ1ZSlcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBjb250ZXh0OiAnVGFicycsXG4gICAgICBpc0FjdGl2ZTpcbiAgICAgICAgbmF2RnJvbUNvbnRlbnQgJiZcbiAgICAgICAgIWhlYWRlckZvY3VzZWQgJiZcbiAgICAgICAgb3B0ZWRJbiAmJlxuICAgICAgICAhaGlkZGVuICYmXG4gICAgICAgICFkaXNhYmxlTmF2aWdhdGlvbixcbiAgICB9LFxuICApXG5cbiAgLy8gQ2FsY3VsYXRlIHNwYWNpbmcgdG8gZmlsbCB0aGUgYXZhaWxhYmxlIHdpZHRoLiBObyBrZXlib2FyZCBoaW50IGluIHRoZVxuICAvLyBoZWFkZXIgcm93IOKAlCBjb250ZW50IGZvb3RlcnMgb3duIGhpbnRzIChzZWUgdXNlVGFiSGVhZGVyRm9jdXMgZG9jcykuXG4gIGNvbnN0IHRpdGxlV2lkdGggPSB0aXRsZSA/IHN0cmluZ1dpZHRoKHRpdGxlKSArIDEgOiAwIC8vICsxIGZvciBnYXBcbiAgY29uc3QgdGFic1dpZHRoID0gdGFicy5yZWR1Y2UoXG4gICAgKHN1bSwgWywgdGFiVGl0bGVdKSA9PiBzdW0gKyAodGFiVGl0bGUgPyBzdHJpbmdXaWR0aCh0YWJUaXRsZSkgOiAwKSArIDIgKyAxLCAvLyArMiBmb3IgcGFkZGluZywgKzEgZm9yIGdhcFxuICAgIDAsXG4gIClcbiAgY29uc3QgdXNlZFdpZHRoID0gdGl0bGVXaWR0aCArIHRhYnNXaWR0aFxuICBjb25zdCBzcGFjZXJXaWR0aCA9IHVzZUZ1bGxXaWR0aCA/IE1hdGgubWF4KDAsIHRlcm1pbmFsV2lkdGggLSB1c2VkV2lkdGgpIDogMFxuXG4gIGNvbnN0IGNvbnRlbnRXaWR0aCA9IHVzZUZ1bGxXaWR0aCA/IHRlcm1pbmFsV2lkdGggOiB1bmRlZmluZWRcblxuICByZXR1cm4gKFxuICAgIDxUYWJzQ29udGV4dC5Qcm92aWRlclxuICAgICAgdmFsdWU9e3tcbiAgICAgICAgc2VsZWN0ZWRUYWI6IHRhYnNbc2VsZWN0ZWRUYWJJbmRleF0hWzBdLFxuICAgICAgICB3aWR0aDogY29udGVudFdpZHRoLFxuICAgICAgICBoZWFkZXJGb2N1c2VkLFxuICAgICAgICBmb2N1c0hlYWRlcixcbiAgICAgICAgYmx1ckhlYWRlcixcbiAgICAgICAgcmVnaXN0ZXJPcHRJbixcbiAgICAgIH19XG4gICAgPlxuICAgICAgPEJveFxuICAgICAgICBmbGV4RGlyZWN0aW9uPVwiY29sdW1uXCJcbiAgICAgICAgdGFiSW5kZXg9ezB9XG4gICAgICAgIGF1dG9Gb2N1c1xuICAgICAgICBvbktleURvd249e2hhbmRsZUtleURvd259XG4gICAgICAgIC8vIGZsZXhTaHJpbms9MCBpbnNpZGUgbW9kYWwgc2xvdCDigJQgdGhlIG1vZGFsJ3MgYWJzb2x1dGUgQm94IGhhcyBub1xuICAgICAgICAvLyBleHBsaWNpdCBoZWlnaHQgKGdyb3dzIHRvIGZpdCwgbWF4SGVpZ2h0IGNhcCksIHNvIGZsZXhHcm93PTEgaGVyZVxuICAgICAgICAvLyByZXNvbHZlcyB0byAwIG9uIHJlLXJlbmRlciBhbmQgdGhlIGJvZHkgYmxhbmtzIG9uIERvd24gYXJyb3cuXG4gICAgICAgIC8vIFNlZSAjMjM1OTIuIE91dHNpZGUgbW9kYWwsIGxlYXZlIGxheW91dCBhbG9uZS5cbiAgICAgICAgZmxleFNocmluaz17bW9kYWxTY3JvbGxSZWYgPyAwIDogdW5kZWZpbmVkfVxuICAgICAgPlxuICAgICAgICB7IWhpZGRlbiAmJiAoXG4gICAgICAgICAgPEJveFxuICAgICAgICAgICAgZmxleERpcmVjdGlvbj1cInJvd1wiXG4gICAgICAgICAgICBnYXA9ezF9XG4gICAgICAgICAgICBmbGV4U2hyaW5rPXttb2RhbFNjcm9sbFJlZiA/IDAgOiB1bmRlZmluZWR9XG4gICAgICAgICAgPlxuICAgICAgICAgICAge3RpdGxlICE9PSB1bmRlZmluZWQgJiYgKFxuICAgICAgICAgICAgICA8VGV4dCBib2xkIGNvbG9yPXtjb2xvcn0+XG4gICAgICAgICAgICAgICAge3RpdGxlfVxuICAgICAgICAgICAgICA8L1RleHQ+XG4gICAgICAgICAgICApfVxuICAgICAgICAgICAge3RhYnMubWFwKChbaWQsIHRpdGxlXSwgaSkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBpc0N1cnJlbnQgPSBzZWxlY3RlZFRhYkluZGV4ID09PSBpXG4gICAgICAgICAgICAgIGNvbnN0IGhhc0NvbG9yQ3Vyc29yID0gY29sb3IgJiYgaXNDdXJyZW50ICYmIGhlYWRlckZvY3VzZWRcbiAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICA8VGV4dFxuICAgICAgICAgICAgICAgICAga2V5PXtpZH1cbiAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcj17aGFzQ29sb3JDdXJzb3IgPyBjb2xvciA6IHVuZGVmaW5lZH1cbiAgICAgICAgICAgICAgICAgIGNvbG9yPXtoYXNDb2xvckN1cnNvciA/ICdpbnZlcnNlVGV4dCcgOiB1bmRlZmluZWR9XG4gICAgICAgICAgICAgICAgICBpbnZlcnNlPXtpc0N1cnJlbnQgJiYgIWhhc0NvbG9yQ3Vyc29yfVxuICAgICAgICAgICAgICAgICAgYm9sZD17aXNDdXJyZW50fVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIHsnICd9XG4gICAgICAgICAgICAgICAgICB7dGl0bGV9eycgJ31cbiAgICAgICAgICAgICAgICA8L1RleHQ+XG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAge3NwYWNlcldpZHRoID4gMCAmJiA8VGV4dD57JyAnLnJlcGVhdChzcGFjZXJXaWR0aCl9PC9UZXh0Pn1cbiAgICAgICAgICA8L0JveD5cbiAgICAgICAgKX1cbiAgICAgICAge2Jhbm5lcn1cbiAgICAgICAge21vZGFsU2Nyb2xsUmVmID8gKFxuICAgICAgICAgIC8vIEluc2lkZSB0aGUgbW9kYWwgc2xvdDogb3duIHRoZSBTY3JvbGxCb3ggaGVyZSBzbyB0aGUgdGFic1xuICAgICAgICAgIC8vIGhlYWRlciByb3cgYWJvdmUgc2l0cyBPVVRTSURFIHRoZSBzY3JvbGwgYXJlYSDigJQgaXQgY2FuIG5ldmVyXG4gICAgICAgICAgLy8gc2Nyb2xsIG9mZi4gVGhlIHJlZiByZWFjaGVzIFJFUEwncyBTY3JvbGxLZXliaW5kaW5nSGFuZGxlciB2aWFcbiAgICAgICAgICAvLyBNb2RhbENvbnRleHQuIEtleWVkIGJ5IHNlbGVjdGVkVGFiSW5kZXgg4oaSIHJlbW91bnRzIG9uIHRhYlxuICAgICAgICAgIC8vIHN3aXRjaCwgcmVzZXR0aW5nIHNjcm9sbFRvcCB0byAwIHdpdGhvdXQgc2Nyb2xsVG8oKSB0aW1pbmcgZ2FtZXMuXG4gICAgICAgICAgPEJveCB3aWR0aD17Y29udGVudFdpZHRofSBtYXJnaW5Ub3A9e2hpZGRlbiA/IDAgOiAxfSBmbGV4U2hyaW5rPXswfT5cbiAgICAgICAgICAgIDxTY3JvbGxCb3hcbiAgICAgICAgICAgICAga2V5PXtzZWxlY3RlZFRhYkluZGV4fVxuICAgICAgICAgICAgICByZWY9e21vZGFsU2Nyb2xsUmVmfVxuICAgICAgICAgICAgICBmbGV4RGlyZWN0aW9uPVwiY29sdW1uXCJcbiAgICAgICAgICAgICAgZmxleFNocmluaz17MH1cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAge2NoaWxkcmVufVxuICAgICAgICAgICAgPC9TY3JvbGxCb3g+XG4gICAgICAgICAgPC9Cb3g+XG4gICAgICAgICkgOiAoXG4gICAgICAgICAgPEJveFxuICAgICAgICAgICAgd2lkdGg9e2NvbnRlbnRXaWR0aH1cbiAgICAgICAgICAgIG1hcmdpblRvcD17aGlkZGVuID8gMCA6IDF9XG4gICAgICAgICAgICBoZWlnaHQ9e2NvbnRlbnRIZWlnaHR9XG4gICAgICAgICAgICBvdmVyZmxvd1k9e2NvbnRlbnRIZWlnaHQgIT09IHVuZGVmaW5lZCA/ICdoaWRkZW4nIDogdW5kZWZpbmVkfVxuICAgICAgICAgID5cbiAgICAgICAgICAgIHtjaGlsZHJlbn1cbiAgICAgICAgICA8L0JveD5cbiAgICAgICAgKX1cbiAgICAgIDwvQm94PlxuICAgIDwvVGFic0NvbnRleHQuUHJvdmlkZXI+XG4gIClcbn1cblxudHlwZSBUYWJQcm9wcyA9IHtcbiAgdGl0bGU6IHN0cmluZ1xuICBpZD86IHN0cmluZ1xuICBjaGlsZHJlbjogUmVhY3QuUmVhY3ROb2RlXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBUYWIoeyB0aXRsZSwgaWQsIGNoaWxkcmVuIH06IFRhYlByb3BzKTogUmVhY3QuUmVhY3ROb2RlIHtcbiAgY29uc3QgeyBzZWxlY3RlZFRhYiwgd2lkdGggfSA9IHVzZUNvbnRleHQoVGFic0NvbnRleHQpXG4gIGNvbnN0IGluc2lkZU1vZGFsID0gdXNlSXNJbnNpZGVNb2RhbCgpXG4gIGlmIChzZWxlY3RlZFRhYiAhPT0gKGlkID8/IHRpdGxlKSkge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICByZXR1cm4gKFxuICAgIDxCb3ggd2lkdGg9e3dpZHRofSBmbGV4U2hyaW5rPXtpbnNpZGVNb2RhbCA/IDAgOiB1bmRlZmluZWR9PlxuICAgICAge2NoaWxkcmVufVxuICAgIDwvQm94PlxuICApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VUYWJzV2lkdGgoKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgeyB3aWR0aCB9ID0gdXNlQ29udGV4dChUYWJzQ29udGV4dClcbiAgcmV0dXJuIHdpZHRoXG59XG5cbi8qKlxuICogT3B0IGludG8gaGVhZGVyLWZvY3VzIGdhdGluZy4gUmV0dXJucyB0aGUgY3VycmVudCBoZWFkZXIgZm9jdXMgc3RhdGUgYW5kIGFcbiAqIGNhbGxiYWNrIHRvIGhhbmQgZm9jdXMgYmFjayB0byB0aGUgdGFiIHJvdy4gRm9yIGEgU2VsZWN0LCBwYXNzXG4gKiBgaXNEaXNhYmxlZD17aGVhZGVyRm9jdXNlZH1gIGFuZCBgb25VcEZyb21GaXJzdEl0ZW09e2ZvY3VzSGVhZGVyfWA7IGtlZXAgdGhlXG4gKiBwYXJlbnQgVGFicycgaW5pdGlhbEhlYWRlckZvY3VzZWQgYXQgaXRzIGRlZmF1bHQgc28gdGFiL+KGkC/ihpIgd29yayBvbiBtb3VudC5cbiAqXG4gKiBDYWxsaW5nIHRoaXMgaG9vayByZWdpc3RlcnMgYSDihpMtYmx1cnMtaGVhZGVyIG9wdC1pbiBvbiBtb3VudC4gRG9uJ3QgY2FsbCBpdFxuICogYWJvdmUgYW4gZWFybHkgcmV0dXJuIHRoYXQgcmVuZGVycyBzdGF0aWMgdGV4dCDigJQg4oaTIHdpbGwgYmx1ciB0aGUgaGVhZGVyIHdpdGhcbiAqIG5vIG9uVXBGcm9tRmlyc3RJdGVtIHRvIHJlY292ZXIuIFNwbGl0IHRoZSBjb21wb25lbnQgc28gdGhlIGhvb2sgb25seSBydW5zXG4gKiB3aGVuIHRoZSBTZWxlY3QgcmVuZGVycy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZVRhYkhlYWRlckZvY3VzKCk6IHtcbiAgaGVhZGVyRm9jdXNlZDogYm9vbGVhblxuICBmb2N1c0hlYWRlcjogKCkgPT4gdm9pZFxuICBibHVySGVhZGVyOiAoKSA9PiB2b2lkXG59IHtcbiAgY29uc3QgeyBoZWFkZXJGb2N1c2VkLCBmb2N1c0hlYWRlciwgYmx1ckhlYWRlciwgcmVnaXN0ZXJPcHRJbiB9ID1cbiAgICB1c2VDb250ZXh0KFRhYnNDb250ZXh0KVxuICB1c2VFZmZlY3QocmVnaXN0ZXJPcHRJbiwgW3JlZ2lzdGVyT3B0SW5dKVxuICByZXR1cm4geyBoZWFkZXJGb2N1c2VkLCBmb2N1c0hlYWRlciwgYmx1ckhlYWRlciB9XG59XG4iXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPQSxLQUFLLElBQ1ZDLGFBQWEsRUFDYkMsV0FBVyxFQUNYQyxVQUFVLEVBQ1ZDLFNBQVMsRUFDVEMsUUFBUSxRQUNILE9BQU87QUFDZCxTQUNFQyxnQkFBZ0IsRUFDaEJDLGlCQUFpQixRQUNaLCtCQUErQjtBQUN0QyxTQUFTQyxlQUFlLFFBQVEsZ0NBQWdDO0FBQ2hFLE9BQU9DLFNBQVMsTUFBTSxtQ0FBbUM7QUFDekQsY0FBY0MsYUFBYSxRQUFRLG9DQUFvQztBQUN2RSxTQUFTQyxXQUFXLFFBQVEsMEJBQTBCO0FBQ3RELFNBQVNDLEdBQUcsRUFBRUMsSUFBSSxRQUFRLGNBQWM7QUFDeEMsU0FBU0MsY0FBYyxRQUFRLG9DQUFvQztBQUNuRSxjQUFjQyxLQUFLLFFBQVEsc0JBQXNCO0FBRWpELEtBQUtDLFNBQVMsR0FBRztFQUNmQyxRQUFRLEVBQUVDLEtBQUssQ0FBQ2xCLEtBQUssQ0FBQ21CLFlBQVksQ0FBQ0MsUUFBUSxDQUFDLENBQUM7RUFDN0NDLEtBQUssQ0FBQyxFQUFFLE1BQU07RUFDZEMs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
\ No newline at end of file
diff --git a/src/components/design-system/ThemedText.tsx b/src/components/design-system/ThemedText.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..1c65b5c4d6e429d49b8c012408585d9a17c20ba9
--- /dev/null
+++ b/src/components/design-system/ThemedText.tsx
@@ -0,0 +1,124 @@
+import { c as _c } from "react/compiler-runtime";
+import type { ReactNode } from 'react';
+import React, { useContext } from 'react';
+import Text from '../../ink/components/Text.js';
+import type { Color, Styles } from '../../ink/styles.js';
+import { getTheme, type Theme } from '../../utils/theme.js';
+import { useTheme } from './ThemeProvider.js';
+
+/** Colors uncolored ThemedText in the subtree. Precedence: explicit `color` >
+ * this > dimColor. Crosses Box boundaries (Ink's style cascade doesn't). */
+export const TextHoverColorContext = React.createContext(undefined);
+export type Props = {
+ /**
+ * Change text color. Accepts a theme key or raw color value.
+ */
+ readonly color?: keyof Theme | Color;
+
+ /**
+ * Same as `color`, but for background. Must be a theme key.
+ */
+ readonly backgroundColor?: keyof Theme;
+
+ /**
+ * Dim the color using the theme's inactive color.
+ * This is compatible with bold (unlike ANSI dim).
+ */
+ readonly dimColor?: boolean;
+
+ /**
+ * Make the text bold.
+ */
+ readonly bold?: boolean;
+
+ /**
+ * Make the text italic.
+ */
+ readonly italic?: boolean;
+
+ /**
+ * Make the text underlined.
+ */
+ readonly underline?: boolean;
+
+ /**
+ * Make the text crossed with a line.
+ */
+ readonly strikethrough?: boolean;
+
+ /**
+ * Inverse background and foreground colors.
+ */
+ readonly inverse?: boolean;
+
+ /**
+ * This property tells Ink to wrap or truncate text if its width is larger than container.
+ * If `wrap` is passed (by default), Ink will wrap text and split it into multiple lines.
+ * If `truncate-*` is passed, Ink will truncate text instead, which will result in one line of text with the rest cut off.
+ */
+ readonly wrap?: Styles['textWrap'];
+ readonly children?: ReactNode;
+};
+
+/**
+ * Resolves a color value that may be a theme key to a raw Color.
+ */
+function resolveColor(color: keyof Theme | Color | undefined, theme: Theme): Color | undefined {
+ if (!color) return undefined;
+ // Check if it's a raw color (starts with rgb(, #, ansi256(, or ansi:)
+ if (color.startsWith('rgb(') || color.startsWith('#') || color.startsWith('ansi256(') || color.startsWith('ansi:')) {
+ return color as Color;
+ }
+ // It's a theme key - resolve it
+ return theme[color as keyof Theme] as Color;
+}
+
+/**
+ * Theme-aware Text component that resolves theme color keys to raw colors.
+ * This wraps the base Text component with theme resolution.
+ */
+export default function ThemedText(t0) {
+ const $ = _c(10);
+ const {
+ color,
+ backgroundColor,
+ dimColor: t1,
+ bold: t2,
+ italic: t3,
+ underline: t4,
+ strikethrough: t5,
+ inverse: t6,
+ wrap: t7,
+ children
+ } = t0;
+ const dimColor = t1 === undefined ? false : t1;
+ const bold = t2 === undefined ? false : t2;
+ const italic = t3 === undefined ? false : t3;
+ const underline = t4 === undefined ? false : t4;
+ const strikethrough = t5 === undefined ? false : t5;
+ const inverse = t6 === undefined ? false : t6;
+ const wrap = t7 === undefined ? "wrap" : t7;
+ const [themeName] = useTheme();
+ const theme = getTheme(themeName);
+ const hoverColor = useContext(TextHoverColorContext);
+ const resolvedColor = !color && hoverColor ? resolveColor(hoverColor, theme) : dimColor ? theme.inactive as Color : resolveColor(color, theme);
+ const resolvedBackgroundColor = backgroundColor ? theme[backgroundColor] as Color : undefined;
+ let t8;
+ if ($[0] !== bold || $[1] !== children || $[2] !== inverse || $[3] !== italic || $[4] !== resolvedBackgroundColor || $[5] !== resolvedColor || $[6] !== strikethrough || $[7] !== underline || $[8] !== wrap) {
+ t8 = {children};
+ $[0] = bold;
+ $[1] = children;
+ $[2] = inverse;
+ $[3] = italic;
+ $[4] = resolvedBackgroundColor;
+ $[5] = resolvedColor;
+ $[6] = strikethrough;
+ $[7] = underline;
+ $[8] = wrap;
+ $[9] = t8;
+ } else {
+ t8 = $[9];
+ }
+ return t8;
+}
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdE5vZGUiLCJSZWFjdCIsInVzZUNvbnRleHQiLCJUZXh0IiwiQ29sb3IiLCJTdHlsZXMiLCJnZXRUaGVtZSIsIlRoZW1lIiwidXNlVGhlbWUiLCJUZXh0SG92ZXJDb2xvckNvbnRleHQiLCJjcmVhdGVDb250ZXh0IiwidW5kZWZpbmVkIiwiUHJvcHMiLCJjb2xvciIsImJhY2tncm91bmRDb2xvciIsImRpbUNvbG9yIiwiYm9sZCIsIml0YWxpYyIsInVuZGVybGluZSIsInN0cmlrZXRocm91Z2giLCJpbnZlcnNlIiwid3JhcCIsImNoaWxkcmVuIiwicmVzb2x2ZUNvbG9yIiwidGhlbWUiLCJzdGFydHNXaXRoIiwiVGhlbWVkVGV4dCIsInQwIiwiJCIsIl9jIiwidDEiLCJ0MiIsInQzIiwidDQiLCJ0NSIsInQ2IiwidDciLCJ0aGVtZU5hbWUiLCJob3ZlckNvbG9yIiwicmVzb2x2ZWRDb2xvciIsImluYWN0aXZlIiwicmVzb2x2ZWRCYWNrZ3JvdW5kQ29sb3IiLCJ0OCJdLCJzb3VyY2VzIjpbIlRoZW1lZFRleHQudHN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgUmVhY3ROb2RlIH0gZnJvbSAncmVhY3QnXG5pbXBvcnQgUmVhY3QsIHsgdXNlQ29udGV4dCB9IGZyb20gJ3JlYWN0J1xuaW1wb3J0IFRleHQgZnJvbSAnLi4vLi4vaW5rL2NvbXBvbmVudHMvVGV4dC5qcydcbmltcG9ydCB0eXBlIHsgQ29sb3IsIFN0eWxlcyB9IGZyb20gJy4uLy4uL2luay9zdHlsZXMuanMnXG5pbXBvcnQgeyBnZXRUaGVtZSwgdHlwZSBUaGVtZSB9IGZyb20gJy4uLy4uL3V0aWxzL3RoZW1lLmpzJ1xuaW1wb3J0IHsgdXNlVGhlbWUgfSBmcm9tICcuL1RoZW1lUHJvdmlkZXIuanMnXG5cbi8qKiBDb2xvcnMgdW5jb2xvcmVkIFRoZW1lZFRleHQgaW4gdGhlIHN1YnRyZWUuIFByZWNlZGVuY2U6IGV4cGxpY2l0IGBjb2xvcmAgPlxuICogIHRoaXMgPiBkaW1Db2xvci4gQ3Jvc3NlcyBCb3ggYm91bmRhcmllcyAoSW5rJ3Mgc3R5bGUgY2FzY2FkZSBkb2Vzbid0KS4gKi9cbmV4cG9ydCBjb25zdCBUZXh0SG92ZXJDb2xvckNvbnRleHQgPSBSZWFjdC5jcmVhdGVDb250ZXh0PFxuICBrZXlvZiBUaGVtZSB8IHVuZGVmaW5lZFxuPih1bmRlZmluZWQpXG5cbmV4cG9ydCB0eXBlIFByb3BzID0ge1xuICAvKipcbiAgICogQ2hhbmdlIHRleHQgY29sb3IuIEFjY2VwdHMgYSB0aGVtZSBrZXkgb3IgcmF3IGNvbG9yIHZhbHVlLlxuICAgKi9cbiAgcmVhZG9ubHkgY29sb3I/OiBrZXlvZiBUaGVtZSB8IENvbG9yXG5cbiAgLyoqXG4gICAqIFNhbWUgYXMgYGNvbG9yYCwgYnV0IGZvciBiYWNrZ3JvdW5kLiBNdXN0IGJlIGEgdGhlbWUga2V5LlxuICAgKi9cbiAgcmVhZG9ubHkgYmFja2dyb3VuZENvbG9yPzoga2V5b2YgVGhlbWVcblxuICAvKipcbiAgICogRGltIHRoZSBjb2xvciB1c2luZyB0aGUgdGhlbWUncyBpbmFjdGl2ZSBjb2xvci5cbiAgICogVGhpcyBpcyBjb21wYXRpYmxlIHdpdGggYm9sZCAodW5saWtlIEFOU0kgZGltKS5cbiAgICovXG4gIHJlYWRvbmx5IGRpbUNvbG9yPzogYm9vbGVhblxuXG4gIC8qKlxuICAgKiBNYWtlIHRoZSB0ZXh0IGJvbGQuXG4gICAqL1xuICByZWFkb25seSBib2xkPzogYm9vbGVhblxuXG4gIC8qKlxuICAgKiBNYWtlIHRoZSB0ZXh0IGl0YWxpYy5cbiAgICovXG4gIHJlYWRvbmx5IGl0YWxpYz86IGJvb2xlYW5cblxuICAvKipcbiAgICogTWFrZSB0aGUgdGV4dCB1bmRlcmxpbmVkLlxuICAgKi9cbiAgcmVhZG9ubHkgdW5kZXJsaW5lPzogYm9vbGVhblxuXG4gIC8qKlxuICAgKiBNYWtlIHRoZSB0ZXh0IGNyb3NzZWQgd2l0aCBhIGxpbmUuXG4gICAqL1xuICByZWFkb25seSBzdHJpa2V0aHJvdWdoPzogYm9vbGVhblxuXG4gIC8qKlxuICAgKiBJbnZlcnNlIGJhY2tncm91bmQgYW5kIGZvcmVncm91bmQgY29sb3JzLlxuICAgKi9cbiAgcmVhZG9ubHkgaW52ZXJzZT86IGJvb2xlYW5cblxuICAvKipcbiAgICogVGhpcyBwcm9wZXJ0eSB0ZWxscyBJbmsgdG8gd3JhcCBvciB0cnVuY2F0ZSB0ZXh0IGlmIGl0cyB3aWR0aCBpcyBsYXJnZXIgdGhhbiBjb250YWluZXIuXG4gICAqIElmIGB3cmFwYCBpcyBwYXNzZWQgKGJ5IGRlZmF1bHQpLCBJbmsgd2lsbCB3cmFwIHRleHQgYW5kIHNwbGl0IGl0IGludG8gbXVsdGlwbGUgbGluZXMuXG4gICAqIElmIGB0cnVuY2F0ZS0qYCBpcyBwYXNzZWQsIEluayB3aWxsIHRydW5jYXRlIHRleHQgaW5zdGVhZCwgd2hpY2ggd2lsbCByZXN1bHQgaW4gb25lIGxpbmUgb2YgdGV4dCB3aXRoIHRoZSByZXN0IGN1dCBvZmYuXG4gICAqL1xuICByZWFkb25seSB3cmFwPzogU3R5bGVzWyd0ZXh0V3JhcCddXG5cbiAgcmVhZG9ubHkgY2hpbGRyZW4/OiBSZWFjdE5vZGVcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyBhIGNvbG9yIHZhbHVlIHRoYXQgbWF5IGJlIGEgdGhlbWUga2V5IHRvIGEgcmF3IENvbG9yLlxuICovXG5mdW5jdGlvbiByZXNvbHZlQ29sb3IoXG4gIGNvbG9yOiBrZXlvZiBUaGVtZSB8IENvbG9yIHwgdW5kZWZpbmVkLFxuICB0aGVtZTogVGhlbWUsXG4pOiBDb2xvciB8IHVuZGVmaW5lZCB7XG4gIGlmICghY29sb3IpIHJldHVybiB1bmRlZmluZWRcbiAgLy8gQ2hlY2sgaWYgaXQncyBhIHJhdyBjb2xvciAoc3RhcnRzIHdpdGggcmdiKCwgIywgYW5zaTI1NigsIG9yIGFuc2k6KVxuICBpZiAoXG4gICAgY29sb3Iuc3RhcnRzV2l0aCgncmdiKCcpIHx8XG4gICAgY29sb3Iuc3RhcnRzV2l0aCgnIycpIHx8XG4gICAgY29sb3Iuc3RhcnRzV2l0aCgnYW5zaTI1NignKSB8fFxuICAgIGNvbG9yLnN0YXJ0c1dpdGgoJ2Fuc2k6JylcbiAgKSB7XG4gICAgcmV0dXJuIGNvbG9yIGFzIENvbG9yXG4gIH1cbiAgLy8gSXQncyBhIHRoZW1lIGtleSAtIHJlc29sdmUgaXRcbiAgcmV0dXJuIHRoZW1lW2NvbG9yIGFzIGtleW9mIFRoZW1lXSBhcyBDb2xvclxufVxuXG4vKipcbiAqIFRoZW1lLWF3YXJlIFRleHQgY29tcG9uZW50IHRoYXQgcmVzb2x2ZXMgdGhlbWUgY29sb3Iga2V5cyB0byByYXcgY29sb3JzLlxuICogVGhpcyB3cmFwcyB0aGUgYmFzZSBUZXh0IGNvbXBvbmVudCB3aXRoIHRoZW1lIHJlc29sdXRpb24uXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIFRoZW1lZFRleHQoe1xuICBjb2xvcixcbiAgYmFja2dyb3VuZENvbG9yLFxuICBkaW1Db2xvciA9IGZhbHNlLFxuICBib2xkID0gZmFsc2UsXG4gIGl0YWxpYyA9IGZhbHNlLFxuICB1bmRlcmxpbmUgPSBmYWxzZSxcbiAgc3RyaWtldGhyb3VnaCA9IGZhbHNlLFxuICBpbnZlcnNlID0gZmFsc2UsXG4gIHdyYXAgPSAnd3JhcCcsXG4gIGNoaWxkcmVuLFxufTogUHJvcHMpOiBSZWFjdC5SZWFjdE5vZGUge1xuICBjb25zdCBbdGhlbWVOYW1lXSA9IHVzZVRoZW1lKClcbiAgY29uc3QgdGhlbWUgPSBnZXRUaGVtZSh0aGVtZU5hbWUpXG4gIGNvbnN0IGhvdmVyQ29sb3IgPSB1c2VDb250ZXh0KFRleHRIb3ZlckNvbG9yQ29udGV4dClcblxuICAvLyBSZXNvbHZlIHRoZW1lIGtleXMgdG8gcmF3IGNvbG9yc1xuICBjb25zdCByZXNvbHZlZENvbG9yID1cbiAgICAhY29sb3IgJiYgaG92ZXJDb2xvclxuICAgICAgPyByZXNvbHZlQ29sb3IoaG92ZXJDb2xvciwgdGhlbWUpXG4gICAgICA6IGRpbUNvbG9yXG4gICAgICAgID8gKHRoZW1lLmluYWN0aXZlIGFzIENvbG9yKVxuICAgICAgICA6IHJlc29sdmVDb2xvcihjb2xvciwgdGhlbWUpXG4gIGNvbnN0IHJlc29sdmVkQmFja2dyb3VuZENvbG9yID0gYmFja2dyb3VuZENvbG9yXG4gICAgPyAodGhlbWVbYmFja2dyb3VuZENvbG9yXSBhcyBDb2xvcilcbiAgICA6IHVuZGVmaW5lZFxuXG4gIHJldHVybiAoXG4gICAgPFRleHRcbiAgICAgIGNvbG9yPXtyZXNvbHZlZENvbG9yfVxuICAgICAgYmFja2dyb3VuZENvbG9yPXtyZXNvbHZlZEJhY2tncm91bmRDb2xvcn1cbiAgICAgIGJvbGQ9e2JvbGR9XG4gICAgICBpdGFsaWM9e2l0YWxpY31cbiAgICAgIHVuZGVybGluZT17dW5kZXJsaW5lfVxuICAgICAgc3RyaWtldGhyb3VnaD17c3RyaWtldGhyb3VnaH1cbiAgICAgIGludmVyc2U9e2ludmVyc2V9XG4gICAgICB3cmFwPXt3cmFwfVxuICAgID5cbiAgICAgIHtjaGlsZHJlbn1cbiAgICA8L1RleHQ+XG4gIClcbn1cbiJdLCJtYXBwaW5ncyI6IjtBQUFBLGNBQWNBLFNBQVMsUUFBUSxPQUFPO0FBQ3RDLE9BQU9DLEtBQUssSUFBSUMsVUFBVSxRQUFRLE9BQU87QUFDekMsT0FBT0MsSUFBSSxNQUFNLDhCQUE4QjtBQUMvQyxjQUFjQyxLQUFLLEVBQUVDLE1BQU0sUUFBUSxxQkFBcUI7QUFDeEQsU0FBU0MsUUFBUSxFQUFFLEtBQUtDLEtBQUssUUFBUSxzQkFBc0I7QUFDM0QsU0FBU0MsUUFBUSxRQUFRLG9CQUFvQjs7QUFFN0M7QUFDQTtBQUNBLE9BQU8sTUFBTUMscUJBQXFCLEdBQUdSLEtBQUssQ0FBQ1MsYUFBYSxDQUN0RCxNQUFNSCxLQUFLLEdBQUcsU0FBUyxDQUN4QixDQUFDSSxTQUFTLENBQUM7QUFFWixPQUFPLEtBQUtDLEtBQUssR0FBRztFQUNsQjtBQUNGO0FBQ0E7RUFDRSxTQUFTQyxLQUFLLENBQUMsRUFBRSxNQUFNTixLQUFLLEdBQUdILEtBQUs7O0VBRXBDO0FBQ0Y7QUFDQTtFQUNFLFNBQVNVLGVBQWUsQ0FBQyxFQUFFLE1BQU1QLEtBQUs7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
\ No newline at end of file
diff --git a/src/components/hooks/HooksConfigMenu.tsx b/src/components/hooks/HooksConfigMenu.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..ea39f8280fcd0bec18562cea9f7b91683588887f
--- /dev/null
+++ b/src/components/hooks/HooksConfigMenu.tsx
@@ -0,0 +1,578 @@
+import { c as _c } from "react/compiler-runtime";
+/**
+ * HooksConfigMenu is a read-only browser for configured hooks.
+ *
+ * Users can drill into each hook event, see configured matchers and hooks
+ * (of any type: command, prompt, agent, http), and view individual hook
+ * details. To add or modify hooks, users should edit settings.json directly
+ * or ask Claude — the menu directs them there.
+ *
+ * The menu is read-only because the old editing UI only supported
+ * command-type hooks and duplicating the settings.json editing surface
+ * in-menu for all four types would be a maintenance burden.
+ */
+import * as React from 'react';
+import { useCallback, useMemo, useState } from 'react';
+import type { HookEvent } from 'src/entrypoints/agentSdkTypes.js';
+import { useAppState, useAppStateStore } from 'src/state/AppState.js';
+import type { CommandResultDisplay } from '../../commands.js';
+import { useSettingsChange } from '../../hooks/useSettingsChange.js';
+import { Box, Text } from '../../ink.js';
+import { useKeybinding } from '../../keybindings/useKeybinding.js';
+import { getHookEventMetadata, getHooksForMatcher, getMatcherMetadata, getSortedMatchersForEvent, groupHooksByEventAndMatcher } from '../../utils/hooks/hooksConfigManager.js';
+import type { IndividualHookConfig } from '../../utils/hooks/hooksSettings.js';
+import { getSettings_DEPRECATED, getSettingsForSource } from '../../utils/settings/settings.js';
+import { plural } from '../../utils/stringUtils.js';
+import { Dialog } from '../design-system/Dialog.js';
+import { SelectEventMode } from './SelectEventMode.js';
+import { SelectHookMode } from './SelectHookMode.js';
+import { SelectMatcherMode } from './SelectMatcherMode.js';
+import { ViewHookMode } from './ViewHookMode.js';
+type Props = {
+ toolNames: string[];
+ onExit: (result?: string, options?: {
+ display?: CommandResultDisplay;
+ }) => void;
+};
+type ModeState = {
+ mode: 'select-event';
+} | {
+ mode: 'select-matcher';
+ event: HookEvent;
+} | {
+ mode: 'select-hook';
+ event: HookEvent;
+ matcher: string;
+} | {
+ mode: 'view-hook';
+ event: HookEvent;
+ hook: IndividualHookConfig;
+};
+export function HooksConfigMenu(t0) {
+ const $ = _c(100);
+ const {
+ toolNames,
+ onExit
+ } = t0;
+ let t1;
+ if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
+ t1 = {
+ mode: "select-event"
+ };
+ $[0] = t1;
+ } else {
+ t1 = $[0];
+ }
+ const [modeState, setModeState] = useState(t1);
+ const [disabledByPolicy, setDisabledByPolicy] = useState(_temp);
+ const [restrictedByPolicy, setRestrictedByPolicy] = useState(_temp2);
+ let t2;
+ if ($[1] === Symbol.for("react.memo_cache_sentinel")) {
+ t2 = source => {
+ if (source === "policySettings") {
+ const settings_0 = getSettings_DEPRECATED();
+ const hooksDisabled_0 = settings_0?.disableAllHooks === true;
+ setDisabledByPolicy(hooksDisabled_0 && getSettingsForSource("policySettings")?.disableAllHooks === true);
+ setRestrictedByPolicy(getSettingsForSource("policySettings")?.allowManagedHooksOnly === true);
+ }
+ };
+ $[1] = t2;
+ } else {
+ t2 = $[1];
+ }
+ useSettingsChange(t2);
+ const mode = modeState.mode;
+ const selectedEvent = "event" in modeState ? modeState.event : "PreToolUse";
+ const selectedMatcher = "matcher" in modeState ? modeState.matcher : null;
+ const mcp = useAppState(_temp3);
+ const appStateStore = useAppStateStore();
+ let t3;
+ if ($[2] !== mcp.tools || $[3] !== toolNames) {
+ t3 = [...toolNames, ...mcp.tools.map(_temp4)];
+ $[2] = mcp.tools;
+ $[3] = toolNames;
+ $[4] = t3;
+ } else {
+ t3 = $[4];
+ }
+ const combinedToolNames = t3;
+ let t4;
+ if ($[5] !== appStateStore || $[6] !== combinedToolNames) {
+ t4 = groupHooksByEventAndMatcher(appStateStore.getState(), combinedToolNames);
+ $[5] = appStateStore;
+ $[6] = combinedToolNames;
+ $[7] = t4;
+ } else {
+ t4 = $[7];
+ }
+ const hooksByEventAndMatcher = t4;
+ let t5;
+ if ($[8] !== hooksByEventAndMatcher || $[9] !== selectedEvent) {
+ t5 = getSortedMatchersForEvent(hooksByEventAndMatcher, selectedEvent);
+ $[8] = hooksByEventAndMatcher;
+ $[9] = selectedEvent;
+ $[10] = t5;
+ } else {
+ t5 = $[10];
+ }
+ const sortedMatchersForSelectedEvent = t5;
+ let t6;
+ if ($[11] !== hooksByEventAndMatcher || $[12] !== selectedEvent || $[13] !== selectedMatcher) {
+ t6 = getHooksForMatcher(hooksByEventAndMatcher, selectedEvent, selectedMatcher);
+ $[11] = hooksByEventAndMatcher;
+ $[12] = selectedEvent;
+ $[13] = selectedMatcher;
+ $[14] = t6;
+ } else {
+ t6 = $[14];
+ }
+ const hooksForSelectedMatcher = t6;
+ let t7;
+ if ($[15] !== onExit) {
+ t7 = () => {
+ onExit("Hooks dialog dismissed", {
+ display: "system"
+ });
+ };
+ $[15] = onExit;
+ $[16] = t7;
+ } else {
+ t7 = $[16];
+ }
+ const handleExit = t7;
+ const t8 = mode === "select-event";
+ let t9;
+ if ($[17] !== t8) {
+ t9 = {
+ context: "Confirmation",
+ isActive: t8
+ };
+ $[17] = t8;
+ $[18] = t9;
+ } else {
+ t9 = $[18];
+ }
+ useKeybinding("confirm:no", handleExit, t9);
+ let t10;
+ if ($[19] === Symbol.for("react.memo_cache_sentinel")) {
+ t10 = () => {
+ setModeState({
+ mode: "select-event"
+ });
+ };
+ $[19] = t10;
+ } else {
+ t10 = $[19];
+ }
+ const t11 = mode === "select-matcher";
+ let t12;
+ if ($[20] !== t11) {
+ t12 = {
+ context: "Confirmation",
+ isActive: t11
+ };
+ $[20] = t11;
+ $[21] = t12;
+ } else {
+ t12 = $[21];
+ }
+ useKeybinding("confirm:no", t10, t12);
+ let t13;
+ if ($[22] !== combinedToolNames || $[23] !== modeState) {
+ t13 = () => {
+ if ("event" in modeState) {
+ if (getMatcherMetadata(modeState.event, combinedToolNames) !== undefined) {
+ setModeState({
+ mode: "select-matcher",
+ event: modeState.event
+ });
+ } else {
+ setModeState({
+ mode: "select-event"
+ });
+ }
+ }
+ };
+ $[22] = combinedToolNames;
+ $[23] = modeState;
+ $[24] = t13;
+ } else {
+ t13 = $[24];
+ }
+ const t14 = mode === "select-hook";
+ let t15;
+ if ($[25] !== t14) {
+ t15 = {
+ context: "Confirmation",
+ isActive: t14
+ };
+ $[25] = t14;
+ $[26] = t15;
+ } else {
+ t15 = $[26];
+ }
+ useKeybinding("confirm:no", t13, t15);
+ let t16;
+ if ($[27] !== modeState) {
+ t16 = () => {
+ if (modeState.mode === "view-hook") {
+ const {
+ event,
+ hook
+ } = modeState;
+ setModeState({
+ mode: "select-hook",
+ event,
+ matcher: hook.matcher || ""
+ });
+ }
+ };
+ $[27] = modeState;
+ $[28] = t16;
+ } else {
+ t16 = $[28];
+ }
+ const t17 = mode === "view-hook";
+ let t18;
+ if ($[29] !== t17) {
+ t18 = {
+ context: "Confirmation",
+ isActive: t17
+ };
+ $[29] = t17;
+ $[30] = t18;
+ } else {
+ t18 = $[30];
+ }
+ useKeybinding("confirm:no", t16, t18);
+ let t19;
+ if ($[31] !== combinedToolNames) {
+ t19 = getHookEventMetadata(combinedToolNames);
+ $[31] = combinedToolNames;
+ $[32] = t19;
+ } else {
+ t19 = $[32];
+ }
+ const hookEventMetadata = t19;
+ const settings_1 = getSettings_DEPRECATED();
+ const hooksDisabled_1 = settings_1?.disableAllHooks === true;
+ let t20;
+ if ($[33] !== hooksByEventAndMatcher) {
+ const byEvent = {};
+ let total = 0;
+ for (const [event_0, matchers] of Object.entries(hooksByEventAndMatcher)) {
+ const eventCount = Object.values(matchers).reduce(_temp5, 0);
+ byEvent[event_0 as HookEvent] = eventCount;
+ total = total + eventCount;
+ }
+ t20 = {
+ hooksByEvent: byEvent,
+ totalHooksCount: total
+ };
+ $[33] = hooksByEventAndMatcher;
+ $[34] = t20;
+ } else {
+ t20 = $[34];
+ }
+ const {
+ hooksByEvent,
+ totalHooksCount
+ } = t20;
+ if (hooksDisabled_1) {
+ let t21;
+ if ($[35] === Symbol.for("react.memo_cache_sentinel")) {
+ t21 = disabled;
+ $[35] = t21;
+ } else {
+ t21 = $[35];
+ }
+ const t22 = disabledByPolicy && " by a managed settings file";
+ let t23;
+ if ($[36] !== totalHooksCount) {
+ t23 = {totalHooksCount};
+ $[36] = totalHooksCount;
+ $[37] = t23;
+ } else {
+ t23 = $[37];
+ }
+ let t24;
+ if ($[38] !== totalHooksCount) {
+ t24 = plural(totalHooksCount, "hook");
+ $[38] = totalHooksCount;
+ $[39] = t24;
+ } else {
+ t24 = $[39];
+ }
+ let t25;
+ if ($[40] !== totalHooksCount) {
+ t25 = plural(totalHooksCount, "is", "are");
+ $[40] = totalHooksCount;
+ $[41] = t25;
+ } else {
+ t25 = $[41];
+ }
+ let t26;
+ if ($[42] !== t22 || $[43] !== t23 || $[44] !== t24 || $[45] !== t25) {
+ t26 = All hooks are currently {t21}{t22}. You have{" "}{t23} configured{" "}{t24} that{" "}{t25} not running.;
+ $[42] = t22;
+ $[43] = t23;
+ $[44] = t24;
+ $[45] = t25;
+ $[46] = t26;
+ } else {
+ t26 = $[46];
+ }
+ let t27;
+ let t28;
+ let t29;
+ let t30;
+ if ($[47] === Symbol.for("react.memo_cache_sentinel")) {
+ t27 = When hooks are disabled:;
+ t28 = · No hook commands will execute;
+ t29 = · StatusLine will not be displayed;
+ t30 = · Tool operations will proceed without hook validation;
+ $[47] = t27;
+ $[48] = t28;
+ $[49] = t29;
+ $[50] = t30;
+ } else {
+ t27 = $[47];
+ t28 = $[48];
+ t29 = $[49];
+ t30 = $[50];
+ }
+ let t31;
+ if ($[51] !== t26) {
+ t31 = {t26}{t27}{t28}{t29}{t30};
+ $[51] = t26;
+ $[52] = t31;
+ } else {
+ t31 = $[52];
+ }
+ let t32;
+ if ($[53] !== disabledByPolicy) {
+ t32 = !disabledByPolicy && To re-enable hooks, remove "disableAllHooks" from settings.json or ask Claude.;
+ $[53] = disabledByPolicy;
+ $[54] = t32;
+ } else {
+ t32 = $[54];
+ }
+ let t33;
+ if ($[55] !== t31 || $[56] !== t32) {
+ t33 = {t31}{t32};
+ $[55] = t31;
+ $[56] = t32;
+ $[57] = t33;
+ } else {
+ t33 = $[57];
+ }
+ let t34;
+ if ($[58] !== handleExit || $[59] !== t33) {
+ t34 = ;
+ $[58] = handleExit;
+ $[59] = t33;
+ $[60] = t34;
+ } else {
+ t34 = $[60];
+ }
+ return t34;
+ }
+ switch (modeState.mode) {
+ case "select-event":
+ {
+ let t21;
+ if ($[61] !== combinedToolNames) {
+ t21 = event_2 => {
+ if (getMatcherMetadata(event_2, combinedToolNames) !== undefined) {
+ setModeState({
+ mode: "select-matcher",
+ event: event_2
+ });
+ } else {
+ setModeState({
+ mode: "select-hook",
+ event: event_2,
+ matcher: ""
+ });
+ }
+ };
+ $[61] = combinedToolNames;
+ $[62] = t21;
+ } else {
+ t21 = $[62];
+ }
+ let t22;
+ if ($[63] !== handleExit || $[64] !== hookEventMetadata || $[65] !== hooksByEvent || $[66] !== restrictedByPolicy || $[67] !== t21 || $[68] !== totalHooksCount) {
+ t22 = ;
+ $[63] = handleExit;
+ $[64] = hookEventMetadata;
+ $[65] = hooksByEvent;
+ $[66] = restrictedByPolicy;
+ $[67] = t21;
+ $[68] = totalHooksCount;
+ $[69] = t22;
+ } else {
+ t22 = $[69];
+ }
+ return t22;
+ }
+ case "select-matcher":
+ {
+ const t21 = hookEventMetadata[modeState.event];
+ let t22;
+ if ($[70] !== modeState.event) {
+ t22 = matcher => {
+ setModeState({
+ mode: "select-hook",
+ event: modeState.event,
+ matcher
+ });
+ };
+ $[70] = modeState.event;
+ $[71] = t22;
+ } else {
+ t22 = $[71];
+ }
+ let t23;
+ if ($[72] === Symbol.for("react.memo_cache_sentinel")) {
+ t23 = () => {
+ setModeState({
+ mode: "select-event"
+ });
+ };
+ $[72] = t23;
+ } else {
+ t23 = $[72];
+ }
+ let t24;
+ if ($[73] !== hooksByEventAndMatcher || $[74] !== modeState.event || $[75] !== sortedMatchersForSelectedEvent || $[76] !== t21.description || $[77] !== t22) {
+ t24 = ;
+ $[73] = hooksByEventAndMatcher;
+ $[74] = modeState.event;
+ $[75] = sortedMatchersForSelectedEvent;
+ $[76] = t21.description;
+ $[77] = t22;
+ $[78] = t24;
+ } else {
+ t24 = $[78];
+ }
+ return t24;
+ }
+ case "select-hook":
+ {
+ const t21 = hookEventMetadata[modeState.event];
+ let t22;
+ if ($[79] !== modeState.event) {
+ t22 = hook_1 => {
+ setModeState({
+ mode: "view-hook",
+ event: modeState.event,
+ hook: hook_1
+ });
+ };
+ $[79] = modeState.event;
+ $[80] = t22;
+ } else {
+ t22 = $[80];
+ }
+ let t23;
+ if ($[81] !== combinedToolNames || $[82] !== modeState.event) {
+ t23 = () => {
+ if (getMatcherMetadata(modeState.event, combinedToolNames) !== undefined) {
+ setModeState({
+ mode: "select-matcher",
+ event: modeState.event
+ });
+ } else {
+ setModeState({
+ mode: "select-event"
+ });
+ }
+ };
+ $[81] = combinedToolNames;
+ $[82] = modeState.event;
+ $[83] = t23;
+ } else {
+ t23 = $[83];
+ }
+ let t24;
+ if ($[84] !== hooksForSelectedMatcher || $[85] !== modeState.event || $[86] !== modeState.matcher || $[87] !== t21 || $[88] !== t22 || $[89] !== t23) {
+ t24 = ;
+ $[84] = hooksForSelectedMatcher;
+ $[85] = modeState.event;
+ $[86] = modeState.matcher;
+ $[87] = t21;
+ $[88] = t22;
+ $[89] = t23;
+ $[90] = t24;
+ } else {
+ t24 = $[90];
+ }
+ return t24;
+ }
+ case "view-hook":
+ {
+ const t21 = modeState.hook;
+ let t22;
+ if ($[91] !== combinedToolNames || $[92] !== modeState.event) {
+ t22 = getMatcherMetadata(modeState.event, combinedToolNames);
+ $[91] = combinedToolNames;
+ $[92] = modeState.event;
+ $[93] = t22;
+ } else {
+ t22 = $[93];
+ }
+ const t23 = t22 !== undefined;
+ let t24;
+ if ($[94] !== modeState) {
+ t24 = () => {
+ const {
+ event: event_1,
+ hook: hook_0
+ } = modeState;
+ setModeState({
+ mode: "select-hook",
+ event: event_1,
+ matcher: hook_0.matcher || ""
+ });
+ };
+ $[94] = modeState;
+ $[95] = t24;
+ } else {
+ t24 = $[95];
+ }
+ let t25;
+ if ($[96] !== modeState.hook || $[97] !== t23 || $[98] !== t24) {
+ t25 = ;
+ $[96] = modeState.hook;
+ $[97] = t23;
+ $[98] = t24;
+ $[99] = t25;
+ } else {
+ t25 = $[99];
+ }
+ return t25;
+ }
+ }
+}
+function _temp6() {
+ return Esc to close;
+}
+function _temp5(sum, hooks) {
+ return sum + hooks.length;
+}
+function _temp4(tool) {
+ return tool.name;
+}
+function _temp3(s) {
+ return s.mcp;
+}
+function _temp2() {
+ return getSettingsForSource("policySettings")?.allowManagedHooksOnly === true;
+}
+function _temp() {
+ const settings = getSettings_DEPRECATED();
+ const hooksDisabled = settings?.disableAllHooks === true;
+ return hooksDisabled && getSettingsForSource("policySettings")?.disableAllHooks === true;
+}
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsInVzZUNhbGxiYWNrIiwidXNlTWVtbyIsInVzZVN0YXRlIiwiSG9va0V2ZW50IiwidXNlQXBwU3RhdGUiLCJ1c2VBcHBTdGF0ZVN0b3JlIiwiQ29tbWFuZFJlc3VsdERpc3BsYXkiLCJ1c2VTZXR0aW5nc0NoYW5nZSIsIkJveCIsIlRleHQiLCJ1c2VLZXliaW5kaW5nIiwiZ2V0SG9va0V2ZW50TWV0YWRhdGEiLCJnZXRIb29rc0Zvck1hdGNoZXIiLCJnZXRNYXRjaGVyTWV0YWRhdGEiLCJnZXRTb3J0ZWRNYXRjaGVyc0ZvckV2ZW50IiwiZ3JvdXBIb29rc0J5RXZlbnRBbmRNYXRjaGVyIiwiSW5kaXZpZHVhbEhvb2tDb25maWciLCJnZXRTZXR0aW5nc19ERVBSRUNBVEVEIiwiZ2V0U2V0dGluZ3NGb3JTb3VyY2UiLCJwbHVyYWwiLCJEaWFsb2ciLCJTZWxlY3RFdmVudE1vZGUiLCJTZWxlY3RIb29rTW9kZSIsIlNlbGVjdE1hdGNoZXJNb2RlIiwiVmlld0hvb2tNb2RlIiwiUHJvcHMiLCJ0b29sTmFtZXMiLCJvbkV4aXQiLCJyZXN1bHQiLCJvcHRpb25zIiwiZGlzcGxheSIsIk1vZGVTdGF0ZSIsIm1vZGUiLCJldmVudCIsIm1hdGNoZXIiLCJob29rIiwiSG9va3NDb25maWdNZW51IiwidDAiLCIkIiwiX2MiLCJ0MSIsIlN5bWJvbCIsImZvciIsIm1vZGVTdGF0ZSIsInNldE1vZGVTdGF0ZSIsImRpc2FibGVkQnlQb2xpY3kiLCJzZXREaXNhYmxlZEJ5UG9saWN5IiwiX3RlbXAiLCJyZXN0cmljdGVkQnlQb2xpY3kiLCJzZXRSZXN0cmljdGVkQnlQb2xpY3kiLCJfdGVtcDIiLCJ0MiIsInNvdXJjZSIsInNldHRpbmdzXzAiLCJob29rc0Rpc2FibGVkXzAiLCJzZXR0aW5ncyIsImRpc2FibGVBbGxIb29rcyIsImFsbG93TWFuYWdlZEhvb2tzT25seSIsInNlbGVjdGVkRXZlbnQiLCJzZWxlY3RlZE1hdGNoZXIiLCJtY3AiLCJfdGVtcDMiLCJhcHBTdGF0ZVN0b3JlIiwidDMiLCJ0b29scyIsIm1hcCIsIl90ZW1wNCIsImNvbWJpbmVkVG9vbE5hbWVzIiwidDQiLCJnZXRTdGF0ZSIsImhvb2tzQnlFdmVudEFuZE1hdGNoZXIiLCJ0NSIsInNvcnRlZE1hdGNoZXJzRm9yU2VsZWN0ZWRFdmVudCIsInQ2IiwiaG9va3NGb3JTZWxlY3RlZE1hdGNoZXIiLCJ0NyIsImhhbmRsZUV4aXQiLCJ0OCIsInQ5IiwiY29udGV4dCIsImlzQWN0aXZlIiwidDEwIiwidDExIiwidDEyIiwidDEzIiwidW5kZWZpbmVkIiwidDE0IiwidDE1IiwidDE2IiwidDE3IiwidDE4IiwidDE5IiwiaG9va0V2ZW50TWV0YWRhdGEiLCJzZXR0aW5nc18xIiwiaG9va3NEaXNhYmxlZF8xIiwidDIwIiwiYnlFdmVudCIsInRvdGFsIiwiZXZlbnRfMCIsIm1hdGNoZXJzIiwiT2JqZWN0IiwiZW50cmllcyIsImV2ZW50Q291bnQiLCJ2YWx1ZXMiLCJyZWR1Y2UiLCJfdGVtcDUiLCJob29rc0J5RXZlbnQiLCJ0b3RhbEhvb2tzQ291bnQiLCJob29rc0Rpc2FibGVkIiwidDIxIiwidDIyIiwidDIzIiwidDI0IiwidDI1IiwidDI2IiwidDI3IiwidDI4IiwidDI5IiwidDMwIiwidDMxIiwidDMyIiwidDMzIiwidDM0IiwiX3RlbXA2IiwiZXZlbnRfMiIsImRlc2NyaXB0aW9uIiwiaG9va18xIiwiZXZlbnRfMSIsImhvb2tfMCIsInN1bSIsImhvb2tzIiwibGVuZ3RoIiwidG9vbCIsIm5hbWUiLCJzIl0sInNvdXJjZXMiOlsiSG9va3NDb25maWdNZW51LnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEhvb2tzQ29uZmlnTWVudSBpcyBhIHJlYWQtb25seSBicm93c2VyIGZvciBjb25maWd1cmVkIGhvb2tzLlxuICpcbiAqIFVzZXJzIGNhbiBkcmlsbCBpbnRvIGVhY2ggaG9vayBldmVudCwgc2VlIGNvbmZpZ3VyZWQgbWF0Y2hlcnMgYW5kIGhvb2tzXG4gKiAob2YgYW55IHR5cGU6IGNvbW1hbmQsIHByb21wdCwgYWdlbnQsIGh0dHApLCBhbmQgdmlldyBpbmRpdmlkdWFsIGhvb2tcbiAqIGRldGFpbHMuIFRvIGFkZCBvciBtb2RpZnkgaG9va3MsIHVzZXJzIHNob3VsZCBlZGl0IHNldHRpbmdzLmpzb24gZGlyZWN0bHlcbiAqIG9yIGFzayBDbGF1ZGUg4oCUIHRoZSBtZW51IGRpcmVjdHMgdGhlbSB0aGVyZS5cbiAqXG4gKiBUaGUgbWVudSBpcyByZWFkLW9ubHkgYmVjYXVzZSB0aGUgb2xkIGVkaXRpbmcgVUkgb25seSBzdXBwb3J0ZWRcbiAqIGNvbW1hbmQtdHlwZSBob29rcyBhbmQgZHVwbGljYXRpbmcgdGhlIHNldHRpbmdzLmpzb24gZWRpdGluZyBzdXJmYWNlXG4gKiBpbi1tZW51IGZvciBhbGwgZm91ciB0eXBlcyB3b3VsZCBiZSBhIG1haW50ZW5hbmNlIGJ1cmRlbi5cbiAqL1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgeyB1c2VDYWxsYmFjaywgdXNlTWVtbywgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCdcbmltcG9ydCB0eXBlIHsgSG9va0V2ZW50IH0gZnJvbSAnc3JjL2VudHJ5cG9pbnRzL2FnZW50U2RrVHlwZXMuanMnXG5pbXBvcnQgeyB1c2VBcHBTdGF0ZSwgdXNlQXBwU3RhdGVTdG9yZSB9IGZyb20gJ3NyYy9zdGF0ZS9BcHBTdGF0ZS5qcydcbmltcG9ydCB0eXBlIHsgQ29tbWFuZFJlc3VsdERpc3BsYXkgfSBmcm9tICcuLi8uLi9jb21tYW5kcy5qcydcbmltcG9ydCB7IHVzZVNldHRpbmdzQ2hhbmdlIH0gZnJvbSAnLi4vLi4vaG9va3MvdXNlU2V0dGluZ3NDaGFuZ2UuanMnXG5pbXBvcnQgeyBCb3gsIFRleHQgfSBmcm9tICcuLi8uLi9pbmsuanMnXG5pbXBvcnQgeyB1c2VLZXliaW5kaW5nIH0gZnJvbSAnLi4vLi4va2V5YmluZGluZ3MvdXNlS2V5YmluZGluZy5qcydcbmltcG9ydCB7XG4gIGdldEhvb2tFdmVudE1ldGFkYXRhLFxuICBnZXRIb29rc0Zvck1hdGNoZXIsXG4gIGdldE1hdGNoZXJNZXRhZGF0YSxcbiAgZ2V0U29ydGVkTWF0Y2hlcnNGb3JFdmVudCxcbiAgZ3JvdXBIb29rc0J5RXZlbnRBbmRNYXRjaGVyLFxufSBmcm9tICcuLi8uLi91dGlscy9ob29rcy9ob29rc0NvbmZpZ01hbmFnZXIuanMnXG5pbXBvcnQgdHlwZSB7IEluZGl2aWR1YWxIb29rQ29uZmlnIH0gZnJvbSAnLi4vLi4vdXRpbHMvaG9va3MvaG9va3NTZXR0aW5ncy5qcydcbmltcG9ydCB7XG4gIGdldFNldHRpbmdzX0RFUFJFQ0FURUQsXG4gIGdldFNldHRpbmdzRm9yU291cmNlLFxufSBmcm9tICcuLi8uLi91dGlscy9zZXR0aW5ncy9zZXR0aW5ncy5qcydcbmltcG9ydCB7IHBsdXJhbCB9IGZyb20gJy4uLy4uL3V0aWxzL3N0cmluZ1V0aWxzLmpzJ1xuaW1wb3J0IHsgRGlhbG9nIH0gZnJvbSAnLi4vZGVzaWduLXN5c3RlbS9EaWFsb2cuanMnXG5pbXBvcnQgeyBTZWxlY3RFdmVudE1vZGUgfSBmcm9tICcuL1NlbGVjdEV2ZW50TW9kZS5qcydcbmltcG9ydCB7IFNlbGVjdEhvb2tNb2RlIH0gZnJvbSAnLi9TZWxlY3RIb29rTW9kZS5qcydcbmltcG9ydCB7IFNlbGVjdE1hdGNoZXJNb2RlIH0gZnJvbSAnLi9TZWxlY3RNYXRjaGVyTW9kZS5qcydcbmltcG9ydCB7IFZpZXdIb29rTW9kZSB9IGZyb20gJy4vVmlld0hvb2tNb2RlLmpzJ1xuXG50eXBlIFByb3BzID0ge1xuICB0b29sTmFtZXM6IHN0cmluZ1tdXG4gIG9uRXhpdDogKFxuICAgIHJlc3VsdD86IHN0cmluZyxcbiAgICBvcHRpb25zPzogeyBkaXNwbGF5PzogQ29tbWFuZFJlc3VsdERpc3BsYXkgfSxcbiAgKSA9PiB2b2lkXG59XG5cbnR5cGUgTW9kZVN0YXRlID1cbiAgfCB7IG1vZGU6ICdzZWxlY3QtZXZlbnQnIH1cbiAgfCB7IG1vZGU6ICdzZWxlY3QtbWF0Y2hlcic7IGV2ZW50OiBIb29rRXZlbnQgfVxuICB8IHsgbW9kZTogJ3NlbGVjdC1ob29rJzsgZXZlbnQ6IEhvb2tFdmVudDsgbWF0Y2hlcjogc3RyaW5nIH1cbiAgfCB7IG1vZGU6ICd2aWV3LWhvb2snOyBldmVudDogSG9va0V2ZW50OyBob29rOiBJbmRpdmlkdWFsSG9va0NvbmZpZyB9XG5cbmV4cG9ydCBmdW5jdGlvbiBIb29rc0NvbmZpZ01lbnUoeyB0b29sTmFtZXMsIG9uRXhpdCB9OiBQcm9wcyk6IFJlYWN0LlJlYWN0Tm9kZSB7XG4gIGNvbnN0IFttb2RlU3RhdGUsIHNldE1vZGVTdGF0ZV0gPSB1c2VTdGF0ZTxNb2RlU3RhdGU+KHtcbiAgICBtb2RlOiAnc2VsZWN0LWV2ZW50JyxcbiAgfSlcbiAgLy8gQ2FjaGUgd2hldGhlciBob29rcyBhcmUgZGlzYWJsZWQgYnkgcG9saWN5IHNldHRpbmdzLlxuICAvLyBnZXRTZXR0aW5nc0ZvclNvdXJjZSgpIGlzIGV4cGVuc2l2ZSAoZmlsZSByZWFkICsgSlNPTiBwYXJzZSArIHZhbGlkYXRpb24pLFxuICAvLyBzbyB3ZSBjb21wdXRlIGl0IG9uY2Ugb24gbW91bnQgYW5kIG9ubHkgcmUtY29tcHV0ZSB3aGVuIHBvbGljeSBzZXR0aW5ncyBjaGFuZ2UuXG4gIC8vIFNob3J0LWNpcmN1aXQgZXZhbHVhdGlvbiBlbnN1cmVzIHdlIHNraXAgdGhlIGV4cGVuc2l2ZSBjaGVjayB3aGVuIGhvb2tzIGFyZW4ndCBkaXNhYmxlZC5cbiAgY29uc3QgW2Rpc2FibGVkQnlQb2xpY3ksIHNldERpc2FibGVkQnlQb2xpY3ldID0gdXNlU3RhdGUoKCkgPT4ge1xuICAgIGNvbnN0IHNldHRpbmdzID0gZ2V0U2V0dGluZ3NfREVQUkVDQVRFRCgpXG4gICAgY29uc3QgaG9va3NEaXNhYmxlZCA9IHNldHRpbmdzPy5kaXNhYmxlQWxsSG9va3MgPT09IHRydWVcbiAgICByZXR1cm4gKFxuICAgICAgaG9va3NEaXNhYmxlZCAmJlxuICAgICAgZ2V0U2V0dGluZ3NGb3JTb3VyY2UoJ3BvbGljeVNldHRpbmdzJyk/LmRpc2FibGVBbGxIb29rcyA9PT0gdHJ1ZVxuICAgIClcbiAgfSlcblxuICAvLyBDaGVjayBpZiBob29rcyBhcmUgcmVzdHJpY3RlZCB0byBtYW5hZ2VkLW9ubHkgYnkgcG9saWN5XG4gIGNvbnN0IFtyZXN0cmljdGVkQnlQb2xpY3ksIHNldFJlc3RyaWN0ZWRCeVBvbGljeV0gPSB1c2VTdGF0ZSgoKSA9PiB7XG4gICAgcmV0dXJuIChcbiAgICAgIGdldFNldHRpbmdzRm9yU291cmNlKCdwb2xpY3lTZXR0aW5ncycpPy5hbGxvd01hbmFnZWRIb29rc09ubHkgPT09IHRydWVcbiAgICApXG4gIH0pXG5cbiAgLy8gVXBkYXRlIGNhY2hlZCB2YWx1ZXMgd2hlbiBwb2xpY3kgc2V0dGluZ3MgY2hhbmdlXG4gIHVzZVNldHRpbmdzQ2hhbmdlKHNvdXJjZSA9PiB7XG4gICAgaWYgKHNvdXJjZSA9PT0gJ3BvbGljeVNldHRpbmdzJykge1xuICAgICAgY29uc3Qgc2V0dGluZ3MgPSBnZXRTZXR0aW5nc19ERVBSRUNBVEVEKClcbiAgICAgIGNvbnN0IGhvb2tzRGlzYWJsZWQgPSBzZXR0aW5ncz8uZGlzYWJsZUFsbEhvb2tzID09PSB0cnVlXG4gICAgICBzZXREaXNhYmxlZEJ5UG9saWN5KFxuICAgICAgICBob29rc0Rpc2FibGVkICYmXG4gICAgICAgICAgZ2V0U2V0dGluZ3NGb3JTb3VyY2UoJ3BvbGljeVNldHRpbmdzJyk/LmRpc2FibGVBbGxIb29rcyA9PT0gdHJ1ZSxcbiAgICAgIClcbiAgICAgIHNldFJlc3RyaWN0ZWRCeVBvbGljeShcbiAgICAgICAgZ2V0U2V0dGluZ3NGb3JTb3VyY2UoJ3BvbGljeVNldHRpbmdzJyk/LmFsbG93TWFuYWdlZEhvb2tzT25seSA9PT0gdHJ1ZSxcbiAgICAgIClcbiAgICB9XG4gIH0pXG5cbiAgLy8gRXh0cmFjdCBjb21tb25seSB1c2VkIHZhbHVlcyBmcm9tIG1vZGVTdGF0ZSBmb3IgY29udmVuaWVuY2VcbiAgY29uc3QgbW9kZSA9IG1vZGVTdGF0ZS5tb2RlXG4gIGNvbnN0IHNlbGVjdGVkRXZlbnQgPSAnZXZlbnQnIGluIG1vZGVTdGF0ZSA/IG1vZGVTdGF0ZS5ldmVudCA6ICdQcmVUb29sVXNlJ1xuICBjb25zdCBzZWxlY3RlZE1hdGNoZXIgPSAnbWF0Y2hlcicgaW4gbW9kZVN0YXRlID8gbW9kZVN0YXRlLm1hdGNoZXIgOiBudWxsXG5cbiAgY29uc3QgbWNwID0gdXNlQXBwU3RhdGUocyA9PiBzLm1jcClcbiAgY29uc3QgYXBwU3RhdGVTdG9yZSA9IHVzZUFwcFN0YXRlU3RvcmUoKVxuICBjb25zdCBjb21iaW5lZFRvb2xOYW1lcyA9IHVzZU1lbW8oXG4gICAgKCkgPT4gWy4uLnRvb2xOYW1lcywgLi4ubWNwLnRvb2xzLm1hcCh0b29sID0+IHRvb2wubmFtZSldLFxuICAgIFt0b29sTmFtZXMsIG1jcC50b29sc10sXG4gIClcblxuICBjb25zdCBob29rc0J5RXZlbnRBbmRNYXRjaGVyID0gdXNlTWVtbyhcbiAgICAoKSA9PlxuICAgICAgZ3JvdXBIb29rc0J5RXZlbnRBbmRNYXRjaGVyKGFwcFN0YXRlU3RvcmUuZ2V0U3RhdGUoKSwgY29tYmluZWRUb29sTmFtZXMpLFxuICAgIFtjb21iaW5lZFRvb2xOYW1lcywgYXBwU3RhdGVTdG9yZV0sXG4gIClcblxuICBjb25zdCBzb3J0ZWRNYXRjaGVyc0ZvclNlbGVjdGVkRXZlbnQgPSB1c2VNZW1vKFxuICAgICgpID0+IGdldFNvcnRlZE1hdGNoZXJzRm9yRXZlbnQoaG9va3NCeUV2ZW50QW5kTWF0Y2hlciwgc2VsZWN0ZWRFdmVudCksXG4gICAgW2hvb2tzQnlFdmVudEFuZE1hdGNoZXIsIHNlbGVjdGVkRXZlbnRdLFxuICApXG5cbiAgY29uc3QgaG9va3NGb3JTZWxlY3RlZE1hdGNoZXIgPSB1c2VNZW1vKFxuICAgICgpID0+XG4gICAgICBnZXRIb29rc0Zvck1hdGNoZXIoXG4gICAgICAgIGhvb2tzQnlFdmVudEFuZE1hdGNoZXIsXG4gICAgICAgIHNlbGVjdGVkRXZlbnQsXG4gICAgICAgIHNlbGVjdGVkTWF0Y2hlcixcbiAgICAgICksXG4gICAgW2hvb2tzQnlFdmVudEFuZE1hdGNoZXIsIHNlbGVjdGVkRXZlbnQsIHNlbGVjdGVkTWF0Y2hlcl0sXG4gIClcblxuICAvLyBIYW5kbGVyIGZvciBleGl0aW5nIHRoZSBkaWFsb2dcbiAgY29uc3QgaGFuZGxlRXhpdCA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBvbkV4aXQoJ0hvb2tzIGRpYWxvZyBkaXNtaXNzZWQnLCB7IGRpc3BsYXk6ICdzeXN0ZW0nIH0pXG4gIH0sIFtvbkV4aXRdKVxuXG4gIC8vIEVzY2FwZSBoYW5kbGluZyBmb3Igc2VsZWN0LWV2ZW50IG1vZGUgLSBleGl0IHRoZSBtZW51XG4gIHVzZUtleWJpbmRpbmcoJ2NvbmZpcm06bm8nLCBoYW5kbGVFeGl0LCB7XG4gICAgY29udGV4dDogJ0NvbmZpcm1hdGlvbicsXG4gICAgaXNBY3RpdmU6IG1vZGUgPT09ICdzZWxlY3QtZXZlbnQnLFxuICB9KVxuXG4gIC8vIEVzY2FwZSBoYW5kbGluZyBmb3Igc2VsZWN0LW1hdGNoZXIgbW9kZSAtIGdvIHRvIHNlbGVjdC1ldmVudFxuICB1c2VLZXliaW5kaW5nKFxuICAgICdjb25maXJtOm5vJyxcbiAgICAoKSA9PiB7XG4gICAgICBzZXRNb2RlU3RhdGUoeyBtb2RlOiAnc2VsZWN0LWV2ZW50JyB9KVxuICAgIH0sXG4gICAge1xuICAgICAgY29udGV4dDogJ0NvbmZpcm1hdGlvbicsXG4gICAgICBpc0FjdGl2ZTogbW9kZSA9PT0gJ3NlbGVjdC1tYXRjaGVyJyxcbiAgICB9LFxuICApXG5cbiAgLy8gRXNjYXBlIGhhbmRsaW5nIGZvciBzZWxlY3QtaG9vayBtb2RlIC0gZ28gdG8gc2VsZWN0LW1hdGNoZXIgb3Igc2VsZWN0LWV2ZW50XG4gIHVzZUtleWJpbmRpbmcoXG4gICAgJ2NvbmZpcm06bm8nLFxuICAgICgpID0+IHtcbiAgICAgIGlmICgnZXZlbnQnIGluIG1vZGVTdGF0ZSkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgZ2V0TWF0Y2hlck1ldGFkYXRhKG1vZGVTdGF0ZS5ldmVudCwgY29tYmluZWRUb29sTmFtZXMpICE9PSB1bmRlZmluZWRcbiAgICAgICAgKSB7XG4gICAgICAgICAgc2V0TW9kZVN0YXRlKHsgbW9kZTogJ3NlbGVjdC1tYXRjaGVyJywgZXZlbnQ6IG1vZGVTdGF0ZS5ldmVudCB9KVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNldE1vZGVTdGF0ZSh7IG1vZGU6ICdzZWxlY3QtZXZlbnQnIH0pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIHtcbiAgICAgIGNvbnRleHQ6ICdDb25maXJtYXRpb24nLFxuICAgICAgaXNBY3RpdmU6IG1vZGUgPT09ICdzZWxlY3QtaG9vaycsXG4gICAgfSxcbiAgKVxuXG4gIC8vIEVzY2FwZSBoYW5kbGluZyBmb3Igdmlldy1ob29rIG1vZGUgLSBnbyB0byBzZWxlY3QtaG9va1xuICB1c2VLZXliaW5kaW5nKFxuICAgICdjb25maXJtOm5vJyxcbiAgICAoKSA9PiB7XG4gICAgICBpZiAobW9kZVN0YXRlLm1vZGUgPT09ICd2aWV3LWhvb2snKSB7XG4gICAgICAgIGNvbnN0IHsgZXZlbnQsIGhvb2sgfSA9IG1vZGVTdGF0ZVxuICAgICAgICBzZXRNb2RlU3RhdGUoe1xuICAgICAgICAgIG1vZGU6ICdzZWxlY3QtaG9vaycsXG4gICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgbWF0Y2hlcjogaG9vay5tYXRjaGVyIHx8ICcnLFxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0sXG4gICAge1xuICAgICAgY29udGV4dDogJ0NvbmZpcm1hdGlvbicsXG4gICAgICBpc0FjdGl2ZTogbW9kZSA9PT0gJ3ZpZXctaG9vaycsXG4gICAgfSxcbiAgKVxuXG4gIGNvbnN0IGhvb2tFdmVudE1ldGFkYXRhID0gZ2V0SG9va0V2ZW50TWV0YWRhdGEoY29tYmluZWRUb29sTmFtZXMpXG5cbiAgLy8gQ2hlY2sgaWYgaG9va3MgYXJlIGRpc2FibGVkXG4gIGNvbnN0IHNldHRpbmdzID0gZ2V0U2V0dGluZ3NfREVQUkVDQVRFRCgpXG4gIGNvbnN0IGhvb2tzRGlzYWJsZWQgPSBzZXR0aW5ncz8uZGlzYWJsZUFsbEhvb2tzID09PSB0cnVlXG5cbiAgLy8gQ291bnQgaG9va3MgcGVyIGV2ZW50IGZvciB0aGUgZXZlbnQtc2VsZWN0aW9uIHZpZXcsIGFuZCB0aGUgdG90YWwuXG4gIGNvbnN0IHsgaG9va3NCeUV2ZW50LCB0b3RhbEhvb2tzQ291bnQgfSA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGNvbnN0IGJ5RXZlbnQ6IFBhcnRpYWw8UmVjb3JkPEhvb2tFdmVudCwgbnVtYmVyPj4gPSB7fVxuICAgIGxldCB0b3RhbCA9IDBcbiAgICBmb3IgKGNvbnN0IFtldmVudCwgbWF0Y2hlcnNdIG9mIE9iamVjdC5lbnRyaWVzKGhvb2tzQnlFdmVudEFuZE1hdGNoZXIpKSB7XG4gICAgICBjb25zdCBldmVudENvdW50ID0gT2JqZWN0LnZhbHVlcyhtYXRjaGVycykucmVkdWNlKFxuICAgICAgICAoc3VtLCBob29rcykgPT4gc3VtICsgaG9va3MubGVuZ3RoLFxuICAgICAgICAwLFxuICAgICAgKVxuICAgICAgYnlFdmVudFtldmVudCBhcyBIb29rRXZlbnRdID0gZXZlbnRDb3VudFxuICAgICAgdG90YWwgKz0gZXZlbnRDb3VudFxuICAgIH1cbiAgICByZXR1cm4geyBob29rc0J5RXZlbnQ6IGJ5RXZlbnQsIHRvdGFsSG9va3NDb3VudDogdG90YWwgfVxuICB9LCBbaG9va3NCeUV2ZW50QW5kTWF0Y2hlcl0pXG5cbiAgLy8gSWYgaG9va3MgYXJlIGRpc2FibGVkLCBzaG93IGFuIGluZm9ybWF0aW9uYWwgc2NyZWVuLlxuICAvLyBUaGUgbWVudSBpcyByZWFkLW9ubHksIHNvIHdlIGRvbid0IG9mZmVyIGEgcmUtZW5hYmxlIGJ1dHRvbiDigJRcbiAgLy8gdXNlcnMgY2FuIGVkaXQgc2V0dGluZ3MuanNvbiBvciBhc2sgQ2xhdWRlIGluc3RlYWQuXG4gIGlmIChob29rc0Rpc2FibGVkKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxEaWFsb2dcbiAgICAgICAgdGl0bGU9XCJIb29rIENvbmZpZ3VyYXRpb24gLSBEaXNhYmxlZFwiXG4gICAgICAgIG9uQ2FuY2VsPXtoYW5kbGVFeGl0fVxuICAgICAgICBpbnB1dEd1aWRlPXsoKSA9PiA8VGV4dD5Fc2MgdG8gY2xvc2U8L1RleHQ+fVxuICAgICAgPlxuICAgICAgICA8Qm94IGZsZXhEaXJlY3Rpb249XCJjb2x1bW5cIiBnYXA9ezF9PlxuICAgICAgICAgIDxCb3ggZmxleERpcmVjdGlvbj1cImNvbHVtblwiPlxuICAgICAgICAgICAgPFRleHQ+XG4gICAgICAgICAgICAgIEFsbCBob29rcyBhcmUgY3VycmVudGx5IDxUZXh0IGJvbGQ+ZGlzYWJsZWQ8L1RleHQ+XG4gICAgICAgICAgICAgIHtkaXNhYmxlZEJ5UG9saWN5ICYmICcgYnkgYSBtYW5hZ2VkIHNldHRpbmdzIGZpbGUnfS4gWW91IGhhdmV7JyAnfVxuICAgICAgICAgICAgICA8VGV4dCBib2xkPnt0b3RhbEhvb2tzQ291bnR9PC9UZXh0PiBjb25maWd1cmVkeycgJ31cbiAgICAgICAgICAgICAge3BsdXJhbCh0b3RhbEhvb2tzQ291bnQsICdob29rJyl9IHRoYXR7JyAnfVxuICAgICAgICAgICAgICB7cGx1cmFsKHRvdGFsSG9va3NDb3VudCwgJ2lzJywgJ2FyZScpfSBub3QgcnVubmluZy5cbiAgICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgICAgIDxCb3ggbWFyZ2luVG9wPXsxfT5cbiAgICAgICAgICAgICAgPFRleHQgZGltQ29sb3I+V2hlbiBob29rcyBhcmUgZGlzYWJsZWQ6PC9UZXh0PlxuICAgICAgICAgICAgPC9Cb3g+XG4gICAgICAgICAgICA8VGV4dCBkaW1Db2xvcj7CtyBObyBob29rIGNvbW1hbmRzIHdpbGwgZXhlY3V0ZTwvVGV4dD5cbiAgICAgICAgICAgIDxUZXh0IGRpbUNvbG9yPsK3IFN0YXR1c0xpbmUgd2lsbCBub3QgYmUgZGlzcGxheWVkPC9UZXh0PlxuICAgICAgICAgICAgPFRleHQgZGltQ29sb3I+XG4gICAgICAgICAgICAgIMK3IFRvb2wgb3BlcmF0aW9ucyB3aWxsIHByb2NlZWQgd2l0aG91dCBob29rIHZhbGlkYXRpb25cbiAgICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgICA8L0JveD5cbiAgICAgICAgICB7IWRpc2FibGVkQnlQb2xpY3kgJiYgKFxuICAgICAgICAgICAgPFRleHQgZGltQ29sb3I+XG4gICAgICAgICAgICAgIFRvIHJlLWVuYWJsZSBob29rcywgcmVtb3ZlICZxdW90O2Rpc2FibGVBbGxIb29rcyZxdW90OyBmcm9tXG4gICAgICAgICAgICAgIHNldHRpbmdzLmpzb24gb3IgYXNrIENsYXVkZS5cbiAgICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgICApfVxuICAgICAgICA8L0JveD5cbiAgICAgIDwvRGlhbG9nPlxuICAgIClcbiAgfVxuXG4gIHN3aXRjaCAobW9kZVN0YXRlLm1vZGUpIHtcbiAgICBjYXNlICdzZWxlY3QtZXZlbnQnOlxuICAgICAgcmV0dXJuIChcbiAgICAgICAgPFNlbGVjdEV2ZW50TW9kZVxuICAgICAgICAgIGhvb2tFdmVudE1ldGFkYXRhPXtob29rRXZlbnRNZXRhZGF0YX1cbiAgICAgICAgICBob29rc0J5RXZlbnQ9e2hvb2tzQnlFdmVudH1cbiAgICAgICAgICB0b3RhbEhvb2tzQ291bnQ9e3RvdGFsSG9va3NDb3VudH1cbiAgICAgICAgICByZXN0cmljdGVkQnlQb2xpY3k9e3Jlc3RyaWN0ZWRCeVBvbGljeX1cbiAgICAgICAgICBvblNlbGVjdEV2ZW50PXtldmVudCA9PiB7XG4gICAgICAgICAgICBpZiAoZ2V0TWF0Y2hlck1ldGFkYXRhKGV2ZW50LCBjb21iaW5lZFRvb2xOYW1lcykgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICBzZXRNb2RlU3RhdGUoeyBtb2RlOiAnc2VsZWN0LW1hdGNoZXInLCBldmVudCB9KVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgc2V0TW9kZVN0YXRlKHsgbW9kZTogJ3NlbGVjdC1ob29rJywgZXZlbnQsIG1hdGNoZXI6ICcnIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfX1cbiAgICAgICAgICBvbkNhbmNlbD17aGFuZGxlRXhpdH1cbiAgICAgICAgLz5cbiAgICAgIClcbiAgICBjYXNlICdzZWxlY3QtbWF0Y2hlcic6XG4gICAgICByZXR1cm4gKFxuICAgICAgICA8U2VsZWN0TWF0Y2hlck1vZGVcbiAgICAgICAgICBzZWxlY3RlZEV2ZW50PXttb2RlU3RhdGUuZXZlbnR9XG4gICAgICAgICAgbWF0Y2hlcnNGb3JTZWxlY3RlZEV2ZW50PXtzb3J0ZWRNYXRjaGVyc0ZvclNlbGVjdGVkRXZlbnR9XG4gICAgICAgICAgaG9va3NCeUV2ZW50QW5kTWF0Y2hlcj17aG9va3NCeUV2ZW50QW5kTWF0Y2hlcn1cbiAgICAgICAgICBldmVudERlc2NyaXB0aW9uPXtob29rRXZlbnRNZXRhZGF0YVttb2RlU3RhdGUuZXZlbnRdLmRlc2NyaXB0aW9ufVxuICAgICAgICAgIG9uU2VsZWN0PXttYXRjaGVyID0+IHtcbiAgICAgICAgICAgIHNldE1vZGVTdGF0ZSh7XG4gICAgICAgICAgICAgIG1vZGU6ICdzZWxlY3QtaG9vaycsXG4gICAgICAgICAgICAgIGV2ZW50OiBtb2RlU3RhdGUuZXZlbnQsXG4gICAgICAgICAgICAgIG1hdGNoZXIsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH19XG4gICAgICAgICAgb25DYW5jZWw9eygpID0+IHtcbiAgICAgICAgICAgIHNldE1vZGVTdGF0ZSh7IG1vZGU6ICdzZWxlY3QtZXZlbnQnIH0pXG4gICAgICAgICAgfX1cbiAgICAgICAgLz5cbiAgICAgIClcbiAgICBjYXNlICdzZWxlY3QtaG9vayc6XG4gICAgICByZXR1cm4gKFxuICAgICAgICA8U2VsZWN0SG9va01vZGVcbiAgICAgICAgICBzZWxlY3RlZEV2ZW50PXttb2RlU3RhdGUuZXZlbnR9XG4gICAgICAgICAgc2VsZWN0ZWRNYXRjaGVyPXttb2RlU3RhdGUubWF0Y2hlcn1cbiAgICAgICAgICBob29rc0ZvclNlbGVjdGVkTWF0Y2hlcj17aG9va3NGb3JTZWxlY3RlZE1hdGNoZXJ9XG4gICAgICAgICAgaG9va0V2ZW50TWV0YWRhdGE9e2hvb2tFdmVudE1ldGFkYXRhW21vZGVTdGF0ZS5ldmVudF19XG4gICAgICAgICAgb25TZWxlY3Q9e2hvb2sgPT4ge1xuICAgICAgICAgICAgc2V0TW9kZVN0YXRlKHtcbiAgICAgICAgICAgICAgbW9kZTogJ3ZpZXctaG9vaycsXG4gICAgICAgICAgICAgIGV2ZW50OiBtb2RlU3RhdGUuZXZlbnQsXG4gICAgICAgICAgICAgIGhvb2ssXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH19XG4gICAgICAgICAgb25DYW5jZWw9eygpID0+IHtcbiAgICAgICAgICAgIC8vIEdvIGJhY2sgdG8gbWF0Y2hlciBzZWxlY3Rpb24gb3IgZXZlbnQgc2VsZWN0aW9uXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIGdldE1hdGNoZXJNZXRhZGF0YShtb2RlU3RhdGUuZXZlbnQsIGNvbWJpbmVkVG9vbE5hbWVzKSAhPT1cbiAgICAgICAgICAgICAgdW5kZWZpbmVkXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgc2V0TW9kZVN0YXRlKHtcbiAgICAgICAgICAgICAgICBtb2RlOiAnc2VsZWN0LW1hdGNoZXInLFxuICAgICAgICAgICAgICAgIGV2ZW50OiBtb2RlU3RhdGUuZXZlbnQsXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzZXRNb2RlU3RhdGUoeyBtb2RlOiAnc2VsZWN0LWV2ZW50JyB9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH19XG4gICAgICAgIC8+XG4gICAgICApXG4gICAgY2FzZSAndmlldy1ob29rJzpcbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxWaWV3SG9va01vZGVcbiAgICAgICAgICBzZWxlY3RlZEhvb2s9e21vZGVTdGF0ZS5ob29rfVxuICAgICAgICAgIGV2ZW50U3VwcG9ydHNNYXRjaGVyPXtcbiAgICAgICAgICAgIGdldE1hdGNoZXJNZXRhZGF0YShtb2RlU3RhdGUuZXZlbnQsIGNvbWJpbmVkVG9vbE5hbWVzKSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgfVxuICAgICAgICAgIG9uQ2FuY2VsPXsoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7IGV2ZW50LCBob29rIH0gPSBtb2RlU3RhdGVcbiAgICAgICAgICAgIHNldE1vZGVTdGF0ZSh7XG4gICAgICAgICAgICAgIG1vZGU6ICdzZWxlY3QtaG9vaycsXG4gICAgICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgICAgICBtYXRjaGVyOiBob29rLm1hdGNoZXIgfHwgJycsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH19XG4gICAgICAgIC8+XG4gICAgICApXG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU8sS0FBS0EsS0FBSyxNQUFNLE9BQU87QUFDOUIsU0FBU0MsV0FBVyxFQUFFQyxPQUFPLEVBQUVDLFFBQVEsUUFBUSxPQUFPO0FBQ3RELGNBQWNDLFNBQVMsUUFBUSxrQ0FBa0M7QUFDakUsU0FBU0MsV0FBVyxFQUFFQyxnQkFBZ0IsUUFBUSx1QkFBdUI7QUFDckUsY0FBY0Msb0JBQW9CLFFBQVEsbUJBQW1CO0FBQzdELFNBQVNDLGlCQUFpQixRQUFRLGtDQUFrQztBQUNwRSxTQUFTQyxHQUFHLEVBQUVDLElBQUksUUFBUSxjQUFjO0FBQ3hDLFNBQVNDLGFBQWEsUUFBUSxvQ0FBb0M7QUFDbEUsU0FDRUMsb0JBQW9CLEVBQ3BCQyxrQkFBa0IsRUFDbEJDLGtCQUFrQixFQUNsQkMseUJBQXlCLEVBQ3pCQywyQkFBMkIsUUFDdEIseUNBQXlDO0FBQ2hELGNBQWNDLG9CQUFvQixRQUFRLG9DQUFvQztBQUM5RSxTQUNFQyxzQkFB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
\ No newline at end of file
diff --git a/src/components/hooks/SelectHookMode.tsx b/src/components/hooks/SelectHookMode.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..cec6c6a278896210e7b377f75454f96e974103ae
--- /dev/null
+++ b/src/components/hooks/SelectHookMode.tsx
@@ -0,0 +1,112 @@
+import { c as _c } from "react/compiler-runtime";
+/**
+ * SelectHookMode shows all hooks configured for a given event+matcher pair.
+ *
+ * The /hooks menu is read-only: this view no longer offers "add new hook"
+ * and selecting a hook shows its read-only details instead of a delete
+ * confirmation.
+ */
+import * as React from 'react';
+import type { HookEvent } from 'src/entrypoints/agentSdkTypes.js';
+import type { HookEventMetadata } from 'src/utils/hooks/hooksConfigManager.js';
+import { Box, Text } from '../../ink.js';
+import { getHookDisplayText, hookSourceHeaderDisplayString, type IndividualHookConfig } from '../../utils/hooks/hooksSettings.js';
+import { Select } from '../CustomSelect/select.js';
+import { Dialog } from '../design-system/Dialog.js';
+type Props = {
+ selectedEvent: HookEvent;
+ selectedMatcher: string | null;
+ hooksForSelectedMatcher: IndividualHookConfig[];
+ hookEventMetadata: HookEventMetadata;
+ onSelect: (hook: IndividualHookConfig) => void;
+ onCancel: () => void;
+};
+export function SelectHookMode(t0) {
+ const $ = _c(19);
+ const {
+ selectedEvent,
+ selectedMatcher,
+ hooksForSelectedMatcher,
+ hookEventMetadata,
+ onSelect,
+ onCancel
+ } = t0;
+ const title = hookEventMetadata.matcherMetadata !== undefined ? `${selectedEvent} - Matcher: ${selectedMatcher || "(all)"}` : selectedEvent;
+ if (hooksForSelectedMatcher.length === 0) {
+ let t1;
+ if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
+ t1 = No hooks configured for this event.To add hooks, edit settings.json directly or ask Claude.;
+ $[0] = t1;
+ } else {
+ t1 = $[0];
+ }
+ let t2;
+ if ($[1] !== hookEventMetadata.description || $[2] !== onCancel || $[3] !== title) {
+ t2 = ;
+ $[1] = hookEventMetadata.description;
+ $[2] = onCancel;
+ $[3] = title;
+ $[4] = t2;
+ } else {
+ t2 = $[4];
+ }
+ return t2;
+ }
+ const t1 = hookEventMetadata.description;
+ let t2;
+ if ($[5] !== hooksForSelectedMatcher) {
+ t2 = hooksForSelectedMatcher.map(_temp2);
+ $[5] = hooksForSelectedMatcher;
+ $[6] = t2;
+ } else {
+ t2 = $[6];
+ }
+ let t3;
+ if ($[7] !== hooksForSelectedMatcher || $[8] !== onSelect) {
+ t3 = value => {
+ const index_0 = parseInt(value, 10);
+ const hook_0 = hooksForSelectedMatcher[index_0];
+ if (hook_0) {
+ onSelect(hook_0);
+ }
+ };
+ $[7] = hooksForSelectedMatcher;
+ $[8] = onSelect;
+ $[9] = t3;
+ } else {
+ t3 = $[9];
+ }
+ let t4;
+ if ($[10] !== onCancel || $[11] !== t2 || $[12] !== t3) {
+ t4 = ;
+ $[10] = onCancel;
+ $[11] = t2;
+ $[12] = t3;
+ $[13] = t4;
+ } else {
+ t4 = $[13];
+ }
+ let t5;
+ if ($[14] !== hookEventMetadata.description || $[15] !== onCancel || $[16] !== t4 || $[17] !== title) {
+ t5 = ;
+ $[14] = hookEventMetadata.description;
+ $[15] = onCancel;
+ $[16] = t4;
+ $[17] = title;
+ $[18] = t5;
+ } else {
+ t5 = $[18];
+ }
+ return t5;
+}
+function _temp2(hook, index) {
+ return {
+ label: `[${hook.config.type}] ${getHookDisplayText(hook.config)}`,
+ value: index.toString(),
+ description: hook.source === "pluginHook" && hook.pluginName ? `${hookSourceHeaderDisplayString(hook.source)} (${hook.pluginName})` : hookSourceHeaderDisplayString(hook.source)
+ };
+}
+function _temp() {
+ return Esc to go back;
+}
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsIkhvb2tFdmVudCIsIkhvb2tFdmVudE1ldGFkYXRhIiwiQm94IiwiVGV4dCIsImdldEhvb2tEaXNwbGF5VGV4dCIsImhvb2tTb3VyY2VIZWFkZXJEaXNwbGF5U3RyaW5nIiwiSW5kaXZpZHVhbEhvb2tDb25maWciLCJTZWxlY3QiLCJEaWFsb2ciLCJQcm9wcyIsInNlbGVjdGVkRXZlbnQiLCJzZWxlY3RlZE1hdGNoZXIiLCJob29rc0ZvclNlbGVjdGVkTWF0Y2hlciIsImhvb2tFdmVudE1ldGFkYXRhIiwib25TZWxlY3QiLCJob29rIiwib25DYW5jZWwiLCJTZWxlY3RIb29rTW9kZSIsInQwIiwiJCIsIl9jIiwidGl0bGUiLCJtYXRjaGVyTWV0YWRhdGEiLCJ1bmRlZmluZWQiLCJsZW5ndGgiLCJ0MSIsIlN5bWJvbCIsImZvciIsInQyIiwiZGVzY3JpcHRpb24iLCJfdGVtcCIsIm1hcCIsIl90ZW1wMiIsInQzIiwidmFsdWUiLCJpbmRleF8wIiwicGFyc2VJbnQiLCJob29rXzAiLCJpbmRleCIsInQ0IiwidDUiLCJsYWJlbCIsImNvbmZpZyIsInR5cGUiLCJ0b1N0cmluZyIsInNvdXJjZSIsInBsdWdpbk5hbWUiXSwic291cmNlcyI6WyJTZWxlY3RIb29rTW9kZS50c3giXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBTZWxlY3RIb29rTW9kZSBzaG93cyBhbGwgaG9va3MgY29uZmlndXJlZCBmb3IgYSBnaXZlbiBldmVudCttYXRjaGVyIHBhaXIuXG4gKlxuICogVGhlIC9ob29rcyBtZW51IGlzIHJlYWQtb25seTogdGhpcyB2aWV3IG5vIGxvbmdlciBvZmZlcnMgXCJhZGQgbmV3IGhvb2tcIlxuICogYW5kIHNlbGVjdGluZyBhIGhvb2sgc2hvd3MgaXRzIHJlYWQtb25seSBkZXRhaWxzIGluc3RlYWQgb2YgYSBkZWxldGVcbiAqIGNvbmZpcm1hdGlvbi5cbiAqL1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgdHlwZSB7IEhvb2tFdmVudCB9IGZyb20gJ3NyYy9lbnRyeXBvaW50cy9hZ2VudFNka1R5cGVzLmpzJ1xuaW1wb3J0IHR5cGUgeyBIb29rRXZlbnRNZXRhZGF0YSB9IGZyb20gJ3NyYy91dGlscy9ob29rcy9ob29rc0NvbmZpZ01hbmFnZXIuanMnXG5pbXBvcnQgeyBCb3gsIFRleHQgfSBmcm9tICcuLi8uLi9pbmsuanMnXG5pbXBvcnQge1xuICBnZXRIb29rRGlzcGxheVRleHQsXG4gIGhvb2tTb3VyY2VIZWFkZXJEaXNwbGF5U3RyaW5nLFxuICB0eXBlIEluZGl2aWR1YWxIb29rQ29uZmlnLFxufSBmcm9tICcuLi8uLi91dGlscy9ob29rcy9ob29rc1NldHRpbmdzLmpzJ1xuaW1wb3J0IHsgU2VsZWN0IH0gZnJvbSAnLi4vQ3VzdG9tU2VsZWN0L3NlbGVjdC5qcydcbmltcG9ydCB7IERpYWxvZyB9IGZyb20gJy4uL2Rlc2lnbi1zeXN0ZW0vRGlhbG9nLmpzJ1xuXG50eXBlIFByb3BzID0ge1xuICBzZWxlY3RlZEV2ZW50OiBIb29rRXZlbnRcbiAgc2VsZWN0ZWRNYXRjaGVyOiBzdHJpbmcgfCBudWxsXG4gIGhvb2tzRm9yU2VsZWN0ZWRNYXRjaGVyOiBJbmRpdmlkdWFsSG9va0NvbmZpZ1tdXG4gIGhvb2tFdmVudE1ldGFkYXRhOiBIb29rRXZlbnRNZXRhZGF0YVxuICBvblNlbGVjdDogKGhvb2s6IEluZGl2aWR1YWxIb29rQ29uZmlnKSA9PiB2b2lkXG4gIG9uQ2FuY2VsOiAoKSA9PiB2b2lkXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBTZWxlY3RIb29rTW9kZSh7XG4gIHNlbGVjdGVkRXZlbnQsXG4gIHNlbGVjdGVkTWF0Y2hlcixcbiAgaG9va3NGb3JTZWxlY3RlZE1hdGNoZXIsXG4gIGhvb2tFdmVudE1ldGFkYXRhLFxuICBvblNlbGVjdCxcbiAgb25DYW5jZWwsXG59OiBQcm9wcyk6IFJlYWN0LlJlYWN0Tm9kZSB7XG4gIGNvbnN0IHRpdGxlID1cbiAgICBob29rRXZlbnRNZXRhZGF0YS5tYXRjaGVyTWV0YWRhdGEgIT09IHVuZGVmaW5lZFxuICAgICAgPyBgJHtzZWxlY3RlZEV2ZW50fSAtIE1hdGNoZXI6ICR7c2VsZWN0ZWRNYXRjaGVyIHx8ICcoYWxsKSd9YFxuICAgICAgOiBzZWxlY3RlZEV2ZW50XG5cbiAgaWYgKGhvb2tzRm9yU2VsZWN0ZWRNYXRjaGVyLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiAoXG4gICAgICA8RGlhbG9nXG4gICAgICAgIHRpdGxlPXt0aXRsZX1cbiAgICAgICAgc3VidGl0bGU9e2hvb2tFdmVudE1ldGFkYXRhLmRlc2NyaXB0aW9ufVxuICAgICAgICBvbkNhbmNlbD17b25DYW5jZWx9XG4gICAgICAgIGlucHV0R3VpZGU9eygpID0+IDxUZXh0PkVzYyB0byBnbyBiYWNrPC9UZXh0Pn1cbiAgICAgID5cbiAgICAgICAgPEJveCBmbGV4RGlyZWN0aW9uPVwiY29sdW1uXCIgZ2FwPXsxfT5cbiAgICAgICAgICA8VGV4dCBkaW1Db2xvcj5ObyBob29rcyBjb25maWd1cmVkIGZvciB0aGlzIGV2ZW50LjwvVGV4dD5cbiAgICAgICAgICA8VGV4dCBkaW1Db2xvcj5cbiAgICAgICAgICAgIFRvIGFkZCBob29rcywgZWRpdCBzZXR0aW5ncy5qc29uIGRpcmVjdGx5IG9yIGFzayBDbGF1ZGUuXG4gICAgICAgICAgPC9UZXh0PlxuICAgICAgICA8L0JveD5cbiAgICAgIDwvRGlhbG9nPlxuICAgIClcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPERpYWxvZ1xuICAgICAgdGl0bGU9e3RpdGxlfVxuICAgICAgc3VidGl0bGU9e2hvb2tFdmVudE1ldGFkYXRhLmRlc2NyaXB0aW9ufVxuICAgICAgb25DYW5jZWw9e29uQ2FuY2VsfVxuICAgID5cbiAgICAgIDxCb3ggZmxleERpcmVjdGlvbj1cImNvbHVtblwiPlxuICAgICAgICA8U2VsZWN0XG4gICAgICAgICAgb3B0aW9ucz17aG9va3NGb3JTZWxlY3RlZE1hdGNoZXIubWFwKChob29rLCBpbmRleCkgPT4gKHtcbiAgICAgICAgICAgIGxhYmVsOiBgWyR7aG9vay5jb25maWcudHlwZX1dICR7Z2V0SG9va0Rpc3BsYXlUZXh0KGhvb2suY29uZmlnKX1gLFxuICAgICAgICAgICAgdmFsdWU6IGluZGV4LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICAgICAgaG9vay5zb3VyY2UgPT09ICdwbHVnaW5Ib29rJyAmJiBob29rLnBsdWdpbk5hbWVcbiAgICAgICAgICAgICAgICA/IGAke2hvb2tTb3VyY2VIZWFkZXJEaXNwbGF5U3RyaW5nKGhvb2suc291cmNlKX0gKCR7aG9vay5wbHVnaW5OYW1lfSlgXG4gICAgICAgICAgICAgICAgOiBob29rU291cmNlSGVhZGVyRGlzcGxheVN0cmluZyhob29rLnNvdXJjZSksXG4gICAgICAgICAgfSkpfVxuICAgICAgICAgIG9uQ2hhbmdlPXt2YWx1ZSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IHBhcnNlSW50KHZhbHVlLCAxMClcbiAgICAgICAgICAgIGNvbnN0IGhvb2sgPSBob29rc0ZvclNlbGVjdGVkTWF0Y2hlcltpbmRleF1cbiAgICAgICAgICAgIGlmIChob29rKSB7XG4gICAgICAgICAgICAgIG9uU2VsZWN0KGhvb2spXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfX1cbiAgICAgICAgICBvbkNhbmNlbD17b25DYW5jZWx9XG4gICAgICAgIC8+XG4gICAgICA8L0JveD5cbiAgICA8L0RpYWxvZz5cbiAgKVxufVxuIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPLEtBQUtBLEtBQUssTUFBTSxPQUFPO0FBQzlCLGNBQWNDLFNBQVMsUUFBUSxrQ0FBa0M7QUFDakUsY0FBY0MsaUJBQWlCLFFBQVEsdUNBQXVDO0FBQzlFLFNBQVNDLEdBQUcsRUFBRUMsSUFBSSxRQUFRLGNBQWM7QUFDeEMsU0FDRUMsa0JBQWtCLEVBQ2xCQyw2QkFBNkIsRUFDN0IsS0FBS0Msb0JBQW9CLFFB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
\ No newline at end of file
diff --git a/src/components/hooks/ViewHookMode.tsx b/src/components/hooks/ViewHookMode.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..b84d4b0f0af0bfd510934ed7e8e28266bbd6908b
--- /dev/null
+++ b/src/components/hooks/ViewHookMode.tsx
@@ -0,0 +1,199 @@
+import { c as _c } from "react/compiler-runtime";
+/**
+ * ViewHookMode shows read-only details for a single configured hook.
+ *
+ * The /hooks menu is read-only; this view replaces the former delete-hook
+ * confirmation screen and directs users to settings.json or Claude for edits.
+ */
+import * as React from 'react';
+import { Box, Text } from '../../ink.js';
+import { hookSourceDescriptionDisplayString, type IndividualHookConfig } from '../../utils/hooks/hooksSettings.js';
+import { Dialog } from '../design-system/Dialog.js';
+type Props = {
+ selectedHook: IndividualHookConfig;
+ eventSupportsMatcher: boolean;
+ onCancel: () => void;
+};
+export function ViewHookMode(t0) {
+ const $ = _c(40);
+ const {
+ selectedHook,
+ eventSupportsMatcher,
+ onCancel
+ } = t0;
+ let t1;
+ if ($[0] !== selectedHook.event) {
+ t1 = Event: {selectedHook.event};
+ $[0] = selectedHook.event;
+ $[1] = t1;
+ } else {
+ t1 = $[1];
+ }
+ let t2;
+ if ($[2] !== eventSupportsMatcher || $[3] !== selectedHook.matcher) {
+ t2 = eventSupportsMatcher && Matcher: {selectedHook.matcher || "(all)"};
+ $[2] = eventSupportsMatcher;
+ $[3] = selectedHook.matcher;
+ $[4] = t2;
+ } else {
+ t2 = $[4];
+ }
+ let t3;
+ if ($[5] !== selectedHook.config.type) {
+ t3 = Type: {selectedHook.config.type};
+ $[5] = selectedHook.config.type;
+ $[6] = t3;
+ } else {
+ t3 = $[6];
+ }
+ let t4;
+ if ($[7] !== selectedHook.source) {
+ t4 = hookSourceDescriptionDisplayString(selectedHook.source);
+ $[7] = selectedHook.source;
+ $[8] = t4;
+ } else {
+ t4 = $[8];
+ }
+ let t5;
+ if ($[9] !== t4) {
+ t5 = Source:{" "}{t4};
+ $[9] = t4;
+ $[10] = t5;
+ } else {
+ t5 = $[10];
+ }
+ let t6;
+ if ($[11] !== selectedHook.pluginName) {
+ t6 = selectedHook.pluginName && Plugin: {selectedHook.pluginName};
+ $[11] = selectedHook.pluginName;
+ $[12] = t6;
+ } else {
+ t6 = $[12];
+ }
+ let t7;
+ if ($[13] !== t1 || $[14] !== t2 || $[15] !== t3 || $[16] !== t5 || $[17] !== t6) {
+ t7 = {t1}{t2}{t3}{t5}{t6};
+ $[13] = t1;
+ $[14] = t2;
+ $[15] = t3;
+ $[16] = t5;
+ $[17] = t6;
+ $[18] = t7;
+ } else {
+ t7 = $[18];
+ }
+ let t8;
+ if ($[19] !== selectedHook.config) {
+ t8 = getContentFieldLabel(selectedHook.config);
+ $[19] = selectedHook.config;
+ $[20] = t8;
+ } else {
+ t8 = $[20];
+ }
+ let t9;
+ if ($[21] !== t8) {
+ t9 = {t8}:;
+ $[21] = t8;
+ $[22] = t9;
+ } else {
+ t9 = $[22];
+ }
+ let t10;
+ if ($[23] !== selectedHook.config) {
+ t10 = getContentFieldValue(selectedHook.config);
+ $[23] = selectedHook.config;
+ $[24] = t10;
+ } else {
+ t10 = $[24];
+ }
+ let t11;
+ if ($[25] !== t10) {
+ t11 = {t10};
+ $[25] = t10;
+ $[26] = t11;
+ } else {
+ t11 = $[26];
+ }
+ let t12;
+ if ($[27] !== t11 || $[28] !== t9) {
+ t12 = {t9}{t11};
+ $[27] = t11;
+ $[28] = t9;
+ $[29] = t12;
+ } else {
+ t12 = $[29];
+ }
+ let t13;
+ if ($[30] !== selectedHook.config) {
+ t13 = "statusMessage" in selectedHook.config && selectedHook.config.statusMessage && Status message:{" "}{selectedHook.config.statusMessage};
+ $[30] = selectedHook.config;
+ $[31] = t13;
+ } else {
+ t13 = $[31];
+ }
+ let t14;
+ if ($[32] === Symbol.for("react.memo_cache_sentinel")) {
+ t14 = To modify or remove this hook, edit settings.json directly or ask Claude to help.;
+ $[32] = t14;
+ } else {
+ t14 = $[32];
+ }
+ let t15;
+ if ($[33] !== t12 || $[34] !== t13 || $[35] !== t7) {
+ t15 = {t7}{t12}{t13}{t14};
+ $[33] = t12;
+ $[34] = t13;
+ $[35] = t7;
+ $[36] = t15;
+ } else {
+ t15 = $[36];
+ }
+ let t16;
+ if ($[37] !== onCancel || $[38] !== t15) {
+ t16 = ;
+ $[37] = onCancel;
+ $[38] = t15;
+ $[39] = t16;
+ } else {
+ t16 = $[39];
+ }
+ return t16;
+}
+
+/**
+ * Get a human-readable label for the primary content field of a hook
+ * based on its type.
+ */
+function _temp() {
+ return Esc to go back;
+}
+function getContentFieldLabel(config: IndividualHookConfig['config']): string {
+ switch (config.type) {
+ case 'command':
+ return 'Command';
+ case 'prompt':
+ return 'Prompt';
+ case 'agent':
+ return 'Prompt';
+ case 'http':
+ return 'URL';
+ }
+}
+
+/**
+ * Get the actual content value for a hook's primary field, bypassing
+ * statusMessage so the detail view always shows the real command/prompt/URL.
+ */
+function getContentFieldValue(config: IndividualHookConfig['config']): string {
+ switch (config.type) {
+ case 'command':
+ return config.command;
+ case 'prompt':
+ return config.prompt;
+ case 'agent':
+ return config.prompt;
+ case 'http':
+ return config.url;
+ }
+}
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsIkJveCIsIlRleHQiLCJob29rU291cmNlRGVzY3JpcHRpb25EaXNwbGF5U3RyaW5nIiwiSW5kaXZpZHVhbEhvb2tDb25maWciLCJEaWFsb2ciLCJQcm9wcyIsInNlbGVjdGVkSG9vayIsImV2ZW50U3VwcG9ydHNNYXRjaGVyIiwib25DYW5jZWwiLCJWaWV3SG9va01vZGUiLCJ0MCIsIiQiLCJfYyIsInQxIiwiZXZlbnQiLCJ0MiIsIm1hdGNoZXIiLCJ0MyIsImNvbmZpZyIsInR5cGUiLCJ0NCIsInNvdXJjZSIsInQ1IiwidDYiLCJwbHVnaW5OYW1lIiwidDciLCJ0OCIsImdldENvbnRlbnRGaWVsZExhYmVsIiwidDkiLCJ0MTAiLCJnZXRDb250ZW50RmllbGRWYWx1ZSIsInQxMSIsInQxMiIsInQxMyIsInN0YXR1c01lc3NhZ2UiLCJ0MTQiLCJTeW1ib2wiLCJmb3IiLCJ0MTUiLCJ0MTYiLCJfdGVtcCIsImNvbW1hbmQiLCJwcm9tcHQiLCJ1cmwiXSwic291cmNlcyI6WyJWaWV3SG9va01vZGUudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVmlld0hvb2tNb2RlIHNob3dzIHJlYWQtb25seSBkZXRhaWxzIGZvciBhIHNpbmdsZSBjb25maWd1cmVkIGhvb2suXG4gKlxuICogVGhlIC9ob29rcyBtZW51IGlzIHJlYWQtb25seTsgdGhpcyB2aWV3IHJlcGxhY2VzIHRoZSBmb3JtZXIgZGVsZXRlLWhvb2tcbiAqIGNvbmZpcm1hdGlvbiBzY3JlZW4gYW5kIGRpcmVjdHMgdXNlcnMgdG8gc2V0dGluZ3MuanNvbiBvciBDbGF1ZGUgZm9yIGVkaXRzLlxuICovXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7IEJveCwgVGV4dCB9IGZyb20gJy4uLy4uL2luay5qcydcbmltcG9ydCB7XG4gIGhvb2tTb3VyY2VEZXNjcmlwdGlvbkRpc3BsYXlTdHJpbmcsXG4gIHR5cGUgSW5kaXZpZHVhbEhvb2tDb25maWcsXG59IGZyb20gJy4uLy4uL3V0aWxzL2hvb2tzL2hvb2tzU2V0dGluZ3MuanMnXG5pbXBvcnQgeyBEaWFsb2cgfSBmcm9tICcuLi9kZXNpZ24tc3lzdGVtL0RpYWxvZy5qcydcblxudHlwZSBQcm9wcyA9IHtcbiAgc2VsZWN0ZWRIb29rOiBJbmRpdmlkdWFsSG9va0NvbmZpZ1xuICBldmVudFN1cHBvcnRzTWF0Y2hlcjogYm9vbGVhblxuICBvbkNhbmNlbDogKCkgPT4gdm9pZFxufVxuXG5leHBvcnQgZnVuY3Rpb24gVmlld0hvb2tNb2RlKHtcbiAgc2VsZWN0ZWRIb29rLFxuICBldmVudFN1cHBvcnRzTWF0Y2hlcixcbiAgb25DYW5jZWwsXG59OiBQcm9wcyk6IFJlYWN0LlJlYWN0Tm9kZSB7XG4gIHJldHVybiAoXG4gICAgPERpYWxvZ1xuICAgICAgdGl0bGU9XCJIb29rIGRldGFpbHNcIlxuICAgICAgb25DYW5jZWw9e29uQ2FuY2VsfVxuICAgICAgaW5wdXRHdWlkZT17KCkgPT4gPFRleHQ+RXNjIHRvIGdvIGJhY2s8L1RleHQ+fVxuICAgID5cbiAgICAgIDxCb3ggZmxleERpcmVjdGlvbj1cImNvbHVtblwiIGdhcD17MX0+XG4gICAgICAgIDxCb3ggZmxleERpcmVjdGlvbj1cImNvbHVtblwiPlxuICAgICAgICAgIDxUZXh0PlxuICAgICAgICAgICAgRXZlbnQ6IDxUZXh0IGJvbGQ+e3NlbGVjdGVkSG9vay5ldmVudH08L1RleHQ+XG4gICAgICAgICAgPC9UZXh0PlxuICAgICAgICAgIHtldmVudFN1cHBvcnRzTWF0Y2hlciAmJiAoXG4gICAgICAgICAgICA8VGV4dD5cbiAgICAgICAgICAgICAgTWF0Y2hlcjogPFRleHQgYm9sZD57c2VsZWN0ZWRIb29rLm1hdGNoZXIgfHwgJyhhbGwpJ308L1RleHQ+XG4gICAgICAgICAgICA8L1RleHQ+XG4gICAgICAgICAgKX1cbiAgICAgICAgICA8VGV4dD5cbiAgICAgICAgICAgIFR5cGU6IDxUZXh0IGJvbGQ+e3NlbGVjdGVkSG9vay5jb25maWcudHlwZX08L1RleHQ+XG4gICAgICAgICAgPC9UZXh0PlxuICAgICAgICAgIDxUZXh0PlxuICAgICAgICAgICAgU291cmNlOnsnICd9XG4gICAgICAgICAgICA8VGV4dCBkaW1Db2xvcj5cbiAgICAgICAgICAgICAge2hvb2tTb3VyY2VEZXNjcmlwdGlvbkRpc3BsYXlTdHJpbmcoc2VsZWN0ZWRIb29rLnNvdXJjZSl9XG4gICAgICAgICAgICA8L1RleHQ+XG4gICAgICAgICAgPC9UZXh0PlxuICAgICAgICAgIHtzZWxlY3RlZEhvb2sucGx1Z2luTmFtZSAmJiAoXG4gICAgICAgICAgICA8VGV4dD5cbiAgICAgICAgICAgICAgUGx1Z2luOiA8VGV4dCBkaW1Db2xvcj57c2VsZWN0ZWRIb29rLnBsdWdpbk5hbWV9PC9UZXh0PlxuICAgICAgICAgICAgPC9UZXh0PlxuICAgICAgICAgICl9XG4gICAgICAgIDwvQm94PlxuICAgICAgICA8Qm94IGZsZXhEaXJlY3Rpb249XCJjb2x1bW5cIj5cbiAgICAgICAgICA8VGV4dCBkaW1Db2xvcj57Z2V0Q29udGVudEZpZWxkTGFiZWwoc2VsZWN0ZWRIb29rLmNvbmZpZyl9OjwvVGV4dD5cbiAgICAgICAgICA8Qm94XG4gICAgICAgICAgICBib3JkZXJTdHlsZT1cInJvdW5kXCJcbiAgICAgICAgICAgIGJvcmRlckRpbUNvbG9yXG4gICAgICAgICAgICBwYWRkaW5nTGVmdD17MX1cbiAgICAgICAgICAgIHBhZGRpbmdSaWdodD17MX1cbiAgICAgICAgICA+XG4gICAgICAgICAgICA8VGV4dD57Z2V0Q29udGVudEZpZWxkVmFsdWUoc2VsZWN0ZWRIb29rLmNvbmZpZyl9PC9UZXh0PlxuICAgICAgICAgIDwvQm94PlxuICAgICAgICA8L0JveD5cbiAgICAgICAgeydzdGF0dXNNZXNzYWdlJyBpbiBzZWxlY3RlZEhvb2suY29uZmlnICYmXG4gICAgICAgICAgc2VsZWN0ZWRIb29rLmNvbmZpZy5zdGF0dXNNZXNzYWdlICYmIChcbiAgICAgICAgICAgIDxUZXh0PlxuICAgICAgICAgICAgICBTdGF0dXMgbWVzc2FnZTp7JyAnfVxuICAgICAgICAgICAgICA8VGV4dCBkaW1Db2xvcj57c2VsZWN0ZWRIb29rLmNvbmZpZy5zdGF0dXNNZXNzYWdlfTwvVGV4dD5cbiAgICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgICApfVxuICAgICAgICA8VGV4dCBkaW1Db2xvcj5cbiAgICAgICAgICBUbyBtb2RpZnkgb3IgcmVtb3ZlIHRoaXMgaG9vaywgZWRpdCBzZXR0aW5ncy5qc29uIGRpcmVjdGx5IG9yIGFza1xuICAgICAgICAgIENsYXVkZSB0byBoZWxwLlxuICAgICAgICA8L1RleHQ+XG4gICAgICA8L0JveD5cbiAgICA8L0RpYWxvZz5cbiAgKVxufVxuXG4vKipcbiAqIEdldCBhIGh1bWFuLXJlYWRhYmxlIGxhYmVsIGZvciB0aGUgcHJpbWFyeSBjb250ZW50IGZpZWxkIG9mIGEgaG9va1xuICogYmFzZWQgb24gaXRzIHR5cGUuXG4gKi9cbmZ1bmN0aW9uIGdldENvbnRlbnRGaWVsZExhYmVsKGNvbmZpZzogSW5kaXZpZHVhbEhvb2tDb25maWdbJ2NvbmZpZyddKTogc3RyaW5nIHtcbiAgc3dpdGNoIChjb25maWcudHlwZSkge1xuICAgIGNhc2UgJ2NvbW1hbmQnOlxuICAgICAgcmV0dXJuICdDb21tYW5kJ1xuICAgIGNhc2UgJ3Byb21wdCc6XG4gICAgICByZXR1cm4gJ1Byb21wdCdcbiAgICBjYXNlICdhZ2VudCc6XG4gICAgICByZXR1cm4gJ1Byb21wdCdcbiAgICBjYXNlICdodHRwJzpcbiAgICAgIHJldHVybiAnVVJMJ1xuICB9XG59XG5cbi8qKlxuICogR2V0IHRoZSBhY3R1YWwgY29udGVudCB2YWx1ZSBmb3IgYSBob29rJ3MgcHJpbWFyeSBmaWVsZCwgYnlwYXNzaW5nXG4gKiBzdGF0dXNNZXNzYWdlIHNvIHRoZSBkZXRhaWwgdmlldyBhbHdheXMgc2hvd3MgdGhlIHJlYWwgY29tbWFuZC9wcm9tcHQvVVJMLlxuICovXG5mdW5jdGlvbiBnZXRDb250ZW50RmllbGRWYWx1ZShjb25maWc6IEluZGl2aWR1YWxIb29rQ29uZmlnWydjb25maWcnXSk6IHN0cmluZyB7XG4gIHN3aXRjaCAoY29uZmlnLnR5cGUpIHtcbiAgICBjYXNlICdjb21tYW5kJzpcbiAgICAgIHJldHVybiBjb25maWcuY29tbWFuZFxuICAgIGNhc2UgJ3Byb21wdCc6XG4gICAgICByZXR1cm4gY29uZmlnLnByb21wdFxuICAgIGNhc2UgJ2FnZW50JzpcbiAgICAgIHJldHVybiBjb25maWcucHJvbXB0XG4gICAgY2FzZSAnaHR0cCc6XG4gICAgICByZXR1cm4gY29uZmlnLnVybFxuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPLEtBQUtBLEtBQUssTUFBTSxPQUFPO0FBQzlCLFNBQVNDLEdBQUcsRUFBRUMsSUFBSSxRQUFRLGNBQWM7QUFDeEMsU0FDRUMsa0NBQWtDLEVBQ2xDLEtBQUtDLG9CQUFvQixRQUNwQixvQ0FBb0M7QUFDM0MsU0FBU0MsTUFBTSxRQUFRLDRCQUE0QjtBQUVuRCxLQUFLQyxLQUFLLEdBQUc7RUFDWEMsWUFBWSxFQUFFSCxvQkFBb0I7RUFDbENJLG9CQUFvQixFQUFFLE9BQU87RUFDN0JDLFFBQVEsRUFBRSxHQUFHLEdBQUcsSUFBSTtBQUN0QixDQUFDO0FBRUQsT0FBTyxTQUFBQyxhQUFBQyxFQUFBO0VBQUEsTUFBQUMsQ0FBQSxHQUFBQyxFQUFBO0VBQXNCO0lBQUFOLFlBQUE7SUFBQUMsb0JBQUE7SUFBQUM7RUFBQSxJQUFBRSxFQUlyQjtFQUFBLElBQUFHLEVBQUE7RUFBQSxJQUFBRixDQUFBLFFBQUFMLFlBQUEsQ0FBQVEsS0FBQTtJQVNFRCxFQUFBLElBQUMsSUFBSSxDQUFDLE9BQ0csQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFKLEtBQUcsQ0FBQyxDQUFFLENBQUFQLFlBQVksQ0FBQVEsS0FBSyxDQUFFLEVBQTlCLElBQUksQ0FDZCxFQUZDLElBQUksQ0FFRTtJQUFBSCxDQUFBLE1BQUFMLFlBQUEsQ0FBQVEsS0FBQTtJ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
\ No newline at end of file
diff --git a/src/components/mcp/CapabilitiesSection.tsx b/src/components/mcp/CapabilitiesSection.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..7d136f5679f193b708538ff64e5b6a9657ceaaa9
--- /dev/null
+++ b/src/components/mcp/CapabilitiesSection.tsx
@@ -0,0 +1,61 @@
+import { c as _c } from "react/compiler-runtime";
+import React from 'react';
+import { Box, Text } from '../../ink.js';
+import { Byline } from '../design-system/Byline.js';
+type Props = {
+ serverToolsCount: number;
+ serverPromptsCount: number;
+ serverResourcesCount: number;
+};
+export function CapabilitiesSection(t0) {
+ const $ = _c(9);
+ const {
+ serverToolsCount,
+ serverPromptsCount,
+ serverResourcesCount
+ } = t0;
+ let capabilities;
+ if ($[0] !== serverPromptsCount || $[1] !== serverResourcesCount || $[2] !== serverToolsCount) {
+ capabilities = [];
+ if (serverToolsCount > 0) {
+ capabilities.push("tools");
+ }
+ if (serverResourcesCount > 0) {
+ capabilities.push("resources");
+ }
+ if (serverPromptsCount > 0) {
+ capabilities.push("prompts");
+ }
+ $[0] = serverPromptsCount;
+ $[1] = serverResourcesCount;
+ $[2] = serverToolsCount;
+ $[3] = capabilities;
+ } else {
+ capabilities = $[3];
+ }
+ let t1;
+ if ($[4] === Symbol.for("react.memo_cache_sentinel")) {
+ t1 = Capabilities: ;
+ $[4] = t1;
+ } else {
+ t1 = $[4];
+ }
+ let t2;
+ if ($[5] !== capabilities) {
+ t2 = capabilities.length > 0 ? {capabilities} : "none";
+ $[5] = capabilities;
+ $[6] = t2;
+ } else {
+ t2 = $[6];
+ }
+ let t3;
+ if ($[7] !== t2) {
+ t3 = {t1}{t2};
+ $[7] = t2;
+ $[8] = t3;
+ } else {
+ t3 = $[8];
+ }
+ return t3;
+}
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsIkJveCIsIlRleHQiLCJCeWxpbmUiLCJQcm9wcyIsInNlcnZlclRvb2xzQ291bnQiLCJzZXJ2ZXJQcm9tcHRzQ291bnQiLCJzZXJ2ZXJSZXNvdXJjZXNDb3VudCIsIkNhcGFiaWxpdGllc1NlY3Rpb24iLCJ0MCIsIiQiLCJfYyIsImNhcGFiaWxpdGllcyIsInB1c2giLCJ0MSIsIlN5bWJvbCIsImZvciIsInQyIiwibGVuZ3RoIiwidDMiXSwic291cmNlcyI6WyJDYXBhYmlsaXRpZXNTZWN0aW9uLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBCb3gsIFRleHQgfSBmcm9tICcuLi8uLi9pbmsuanMnXG5pbXBvcnQgeyBCeWxpbmUgfSBmcm9tICcuLi9kZXNpZ24tc3lzdGVtL0J5bGluZS5qcydcblxudHlwZSBQcm9wcyA9IHtcbiAgc2VydmVyVG9vbHNDb3VudDogbnVtYmVyXG4gIHNlcnZlclByb21wdHNDb3VudDogbnVtYmVyXG4gIHNlcnZlclJlc291cmNlc0NvdW50OiBudW1iZXJcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIENhcGFiaWxpdGllc1NlY3Rpb24oe1xuICBzZXJ2ZXJUb29sc0NvdW50LFxuICBzZXJ2ZXJQcm9tcHRzQ291bnQsXG4gIHNlcnZlclJlc291cmNlc0NvdW50LFxufTogUHJvcHMpOiBSZWFjdC5SZWFjdE5vZGUge1xuICBjb25zdCBjYXBhYmlsaXRpZXMgPSBbXVxuICBpZiAoc2VydmVyVG9vbHNDb3VudCA+IDApIHtcbiAgICBjYXBhYmlsaXRpZXMucHVzaCgndG9vbHMnKVxuICB9XG4gIGlmIChzZXJ2ZXJSZXNvdXJjZXNDb3VudCA+IDApIHtcbiAgICBjYXBhYmlsaXRpZXMucHVzaCgncmVzb3VyY2VzJylcbiAgfVxuICBpZiAoc2VydmVyUHJvbXB0c0NvdW50ID4gMCkge1xuICAgIGNhcGFiaWxpdGllcy5wdXNoKCdwcm9tcHRzJylcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPEJveD5cbiAgICAgIDxUZXh0IGJvbGQ+Q2FwYWJpbGl0aWVzOiA8L1RleHQ+XG4gICAgICA8VGV4dCBjb2xvcj1cInRleHRcIj5cbiAgICAgICAge2NhcGFiaWxpdGllcy5sZW5ndGggPiAwID8gPEJ5bGluZT57Y2FwYWJpbGl0aWVzfTwvQnlsaW5lPiA6ICdub25lJ31cbiAgICAgIDwvVGV4dD5cbiAgICA8L0JveD5cbiAgKVxufVxuIl0sIm1hcHBpbmdzIjoiO0FBQUEsT0FBT0EsS0FBSyxNQUFNLE9BQU87QUFDekIsU0FBU0MsR0FBRyxFQUFFQyxJQUFJLFFBQVEsY0FBYztBQUN4QyxTQUFTQyxNQUFNLFFBQVEsNEJBQTRCO0FBRW5ELEtBQUtDLEtBQUssR0FBRztFQUNYQyxnQkFBZ0IsRUFBRSxNQUFNO0VBQ3hCQyxrQkFBa0IsRUFBRSxNQUFNO0VBQzFCQyxvQkFBb0IsRUFBRSxNQUFNO0FBQzlCLENBQUM7QUFFRCxPQUFPLFNBQUFDLG9CQUFBQyxFQUFBO0VBQUEsTUFBQUMsQ0FBQSxHQUFBQyxFQUFBO0VBQTZCO0lBQUFOLGdCQUFBO0lBQUFDLGtCQUFBO0lBQUFDO0VBQUEsSUFBQUUsRUFJNUI7RUFBQSxJQUFBRyxZQUFBO0VBQUEsSUFBQUYsQ0FBQSxRQUFBSixrQkFBQSxJQUFBSSxDQUFBLFFBQUFILG9CQUFBLElBQUFHLENBQUEsUUFBQUwsZ0JBQUE7SUFDTk8sWUFBQSxHQUFxQixFQUFFO0lBQ3ZCLElBQUlQLGdCQUFnQixHQUFHLENBQUM7TUFDdEJPLFlBQVksQ0FBQUMsSUFBSyxDQUFDLE9BQU8sQ0FBQztJQUFBO0lBRTVCLElBQUlOLG9CQUFvQixHQUFHLENBQUM7TUFDMUJLLFlBQVksQ0FBQUMsSUFBSyxDQUFDLFdBQVcsQ0FBQztJQUFBO0lBRWhDLElBQUlQLGtCQUFrQixHQUFHLENBQUM7TUFDeEJNLFlBQVksQ0FBQUMsSUFBSyxDQUFDLFNBQVMsQ0FBQztJQUFBO0lBQzdCSCxDQUFBLE1BQUFKLGtCQUFBO0lBQUFJLENBQUEsTUFBQUgsb0JBQUE7SUFBQUcsQ0FBQSxNQUFBTCxnQkFBQTtJQUFBSyxDQUFBLE1BQUFFLFlBQUE7RUFBQTtJQUFBQSxZQUFBLEdBQUFGLENBQUE7RUFBQTtFQUFBLElBQUFJLEVBQUE7RUFBQSxJQUFBSixDQUFBLFFBQUFLLE1BQUEsQ0FBQUMsR0FBQTtJQUlHRixFQUFBLElBQUMsSUFBSSxDQUFDLElBQUksQ0FBSixLQUFHLENBQUMsQ0FBQyxjQUFjLEVBQXhCLElBQUksQ0FBMkI7SUFBQUosQ0FBQSxNQUFBSSxFQUFBO0VBQUE7SUFBQUEsRUFBQSxHQUFBSixDQUFBO0VBQUE7RUFBQSxJQUFBTyxFQUFBO0VBQUEsSUFBQVAsQ0FBQSxRQUFBRSxZQUFBO0lBRTdCSyxFQUFBLEdBQUFMLFlBQVksQ0FBQU0sTUFBTyxHQUFHLENBQTRDLEdBQXhDLENBQUMsTUFBTSxDQUFFTixhQUFXLENBQUUsRUFBckIsTUFBTSxDQUFpQyxHQUFsRSxNQUFrRTtJQUFBRixDQUFBLE1BQUFFLFlBQUE7SUFBQUYsQ0FBQSxNQUFBTyxFQUFBO0VBQUE7SUFBQUEsRUFBQSxHQUFBUCxDQUFBO0VBQUE7RUFBQSxJQUFBUyxFQUFBO0VBQUEsSUFBQVQsQ0FBQSxRQUFBTyxFQUFBO0lBSHZFRSxFQUFBLElBQUMsR0FBRyxDQUNGLENBQUFMLEVBQStCLENBQy9CLENBQUMsSUFBSSxDQUFPLEtBQU0sQ0FBTixNQUFNLENBQ2YsQ0FBQUcsRUFBaUUsQ0FDcEUsRUFGQyxJQUFJLENBR1AsRUFMQyxHQUFHLENBS0U7SUFBQVAsQ0FBQSxNQUFBTyxFQUFBO0lBQUFQLENBQUEsTUFBQVMsRUFBQTtFQUFBO0lBQUFBLEVBQUEsR0FBQVQsQ0FBQTtFQUFBO0VBQUEsT0FMTlMsRUFLTTtBQUFBIiwiaWdub3JlTGlzdCI6W119
\ No newline at end of file
diff --git a/src/components/mcp/MCPRemoteServerMenu.tsx b/src/components/mcp/MCPRemoteServerMenu.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..954c6f30b72fb1ead33cbf13936c0e7f1e56d104
--- /dev/null
+++ b/src/components/mcp/MCPRemoteServerMenu.tsx
@@ -0,0 +1,649 @@
+import figures from 'figures';
+import React, { useEffect, useRef, useState } from 'react';
+import { type AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS, logEvent } from 'src/services/analytics/index.js';
+import type { CommandResultDisplay } from '../../commands.js';
+import { getOauthConfig } from '../../constants/oauth.js';
+import { useExitOnCtrlCDWithKeybindings } from '../../hooks/useExitOnCtrlCDWithKeybindings.js';
+import { useTerminalSize } from '../../hooks/useTerminalSize.js';
+import { setClipboard } from '../../ink/termio/osc.js';
+// eslint-disable-next-line custom-rules/prefer-use-keybindings -- raw j/k/arrow menu navigation
+import { Box, color, Link, Text, useInput, useTheme } from '../../ink.js';
+import { useKeybinding } from '../../keybindings/useKeybinding.js';
+import { AuthenticationCancelledError, performMCPOAuthFlow, revokeServerTokens } from '../../services/mcp/auth.js';
+import { clearServerCache } from '../../services/mcp/client.js';
+import { useMcpReconnect, useMcpToggleEnabled } from '../../services/mcp/MCPConnectionManager.js';
+import { describeMcpConfigFilePath, excludeCommandsByServer, excludeResourcesByServer, excludeToolsByServer, filterMcpPromptsByServer } from '../../services/mcp/utils.js';
+import { useAppState, useSetAppState } from '../../state/AppState.js';
+import { getOauthAccountInfo } from '../../utils/auth.js';
+import { openBrowser } from '../../utils/browser.js';
+import { errorMessage } from '../../utils/errors.js';
+import { logMCPDebug } from '../../utils/log.js';
+import { capitalize } from '../../utils/stringUtils.js';
+import { ConfigurableShortcutHint } from '../ConfigurableShortcutHint.js';
+import { Select } from '../CustomSelect/index.js';
+import { Byline } from '../design-system/Byline.js';
+import { KeyboardShortcutHint } from '../design-system/KeyboardShortcutHint.js';
+import { Spinner } from '../Spinner.js';
+import TextInput from '../TextInput.js';
+import { CapabilitiesSection } from './CapabilitiesSection.js';
+import type { ClaudeAIServerInfo, HTTPServerInfo, SSEServerInfo } from './types.js';
+import { handleReconnectError, handleReconnectResult } from './utils/reconnectHelpers.js';
+type Props = {
+ server: SSEServerInfo | HTTPServerInfo | ClaudeAIServerInfo;
+ serverToolsCount: number;
+ onViewTools: () => void;
+ onCancel: () => void;
+ onComplete?: (result?: string, options?: {
+ display?: CommandResultDisplay;
+ }) => void;
+ borderless?: boolean;
+};
+export function MCPRemoteServerMenu({
+ server,
+ serverToolsCount,
+ onViewTools,
+ onCancel,
+ onComplete,
+ borderless = false
+}: Props): React.ReactNode {
+ const [theme] = useTheme();
+ const exitState = useExitOnCtrlCDWithKeybindings();
+ const {
+ columns: terminalColumns
+ } = useTerminalSize();
+ const [isAuthenticating, setIsAuthenticating] = React.useState(false);
+ const [error, setError] = React.useState(null);
+ const mcp = useAppState(s => s.mcp);
+ const setAppState = useSetAppState();
+ const [authorizationUrl, setAuthorizationUrl] = React.useState(null);
+ const [isReconnecting, setIsReconnecting] = useState(false);
+ const authAbortControllerRef = useRef(null);
+ const [isClaudeAIAuthenticating, setIsClaudeAIAuthenticating] = useState(false);
+ const [claudeAIAuthUrl, setClaudeAIAuthUrl] = useState(null);
+ const [isClaudeAIClearingAuth, setIsClaudeAIClearingAuth] = useState(false);
+ const [claudeAIClearAuthUrl, setClaudeAIClearAuthUrl] = useState(null);
+ const [claudeAIClearAuthBrowserOpened, setClaudeAIClearAuthBrowserOpened] = useState(false);
+ const [urlCopied, setUrlCopied] = useState(false);
+ const copyTimeoutRef = useRef | undefined>(undefined);
+ const unmountedRef = useRef(false);
+ const [callbackUrlInput, setCallbackUrlInput] = useState('');
+ const [callbackUrlCursorOffset, setCallbackUrlCursorOffset] = useState(0);
+ const [manualCallbackSubmit, setManualCallbackSubmit] = useState<((url: string) => void) | null>(null);
+
+ // If the component unmounts mid-auth (e.g. a parent component's Esc handler
+ // navigates away before ours fires), abort the OAuth flow so the callback
+ // server is closed. Without this, the server stays bound and the process
+ // can outlive the terminal. Also clear the copy-feedback timer and mark
+ // unmounted so the async setClipboard callback doesn't setUrlCopied /
+ // schedule a new timer after unmount.
+ useEffect(() => () => {
+ unmountedRef.current = true;
+ authAbortControllerRef.current?.abort();
+ if (copyTimeoutRef.current !== undefined) {
+ clearTimeout(copyTimeoutRef.current);
+ }
+ }, []);
+
+ // A server is effectively authenticated if:
+ // 1. It has OAuth tokens (server.isAuthenticated), OR
+ // 2. It's connected and has tools (meaning it's working via some auth mechanism)
+ const isEffectivelyAuthenticated = server.isAuthenticated || server.client.type === 'connected' && serverToolsCount > 0;
+ const reconnectMcpServer = useMcpReconnect();
+ const handleClaudeAIAuthComplete = React.useCallback(async () => {
+ setIsClaudeAIAuthenticating(false);
+ setClaudeAIAuthUrl(null);
+ setIsReconnecting(true);
+ try {
+ const result = await reconnectMcpServer(server.name);
+ const success = result.client.type === 'connected';
+ logEvent('tengu_claudeai_mcp_auth_completed', {
+ success
+ });
+ if (success) {
+ onComplete?.(`Authentication successful. Connected to ${server.name}.`);
+ } else if (result.client.type === 'needs-auth') {
+ onComplete?.('Authentication successful, but server still requires authentication. You may need to manually restart Claude Code.');
+ } else {
+ onComplete?.('Authentication successful, but server reconnection failed. You may need to manually restart Claude Code for the changes to take effect.');
+ }
+ } catch (err) {
+ logEvent('tengu_claudeai_mcp_auth_completed', {
+ success: false
+ });
+ onComplete?.(handleReconnectError(err, server.name));
+ } finally {
+ setIsReconnecting(false);
+ }
+ }, [reconnectMcpServer, server.name, onComplete]);
+ const handleClaudeAIClearAuthComplete = React.useCallback(async () => {
+ await clearServerCache(server.name, {
+ ...server.config,
+ scope: server.scope
+ });
+ setAppState(prev => {
+ const newClients = prev.mcp.clients.map(c => c.name === server.name ? {
+ ...c,
+ type: 'needs-auth' as const
+ } : c);
+ const newTools = excludeToolsByServer(prev.mcp.tools, server.name);
+ const newCommands = excludeCommandsByServer(prev.mcp.commands, server.name);
+ const newResources = excludeResourcesByServer(prev.mcp.resources, server.name);
+ return {
+ ...prev,
+ mcp: {
+ ...prev.mcp,
+ clients: newClients,
+ tools: newTools,
+ commands: newCommands,
+ resources: newResources
+ }
+ };
+ });
+ logEvent('tengu_claudeai_mcp_clear_auth_completed', {});
+ onComplete?.(`Disconnected from ${server.name}.`);
+ setIsClaudeAIClearingAuth(false);
+ setClaudeAIClearAuthUrl(null);
+ setClaudeAIClearAuthBrowserOpened(false);
+ }, [server.name, server.config, server.scope, setAppState, onComplete]);
+
+ // Escape to cancel authentication flow
+ useKeybinding('confirm:no', () => {
+ authAbortControllerRef.current?.abort();
+ authAbortControllerRef.current = null;
+ setIsAuthenticating(false);
+ setAuthorizationUrl(null);
+ }, {
+ context: 'Confirmation',
+ isActive: isAuthenticating
+ });
+
+ // Escape to cancel Claude AI authentication
+ useKeybinding('confirm:no', () => {
+ setIsClaudeAIAuthenticating(false);
+ setClaudeAIAuthUrl(null);
+ }, {
+ context: 'Confirmation',
+ isActive: isClaudeAIAuthenticating
+ });
+
+ // Escape to cancel Claude AI clear auth
+ useKeybinding('confirm:no', () => {
+ setIsClaudeAIClearingAuth(false);
+ setClaudeAIClearAuthUrl(null);
+ setClaudeAIClearAuthBrowserOpened(false);
+ }, {
+ context: 'Confirmation',
+ isActive: isClaudeAIClearingAuth
+ });
+
+ // Return key handling for authentication flows and 'c' to copy URL
+ useInput((input, key) => {
+ if (key.return && isClaudeAIAuthenticating) {
+ void handleClaudeAIAuthComplete();
+ }
+ if (key.return && isClaudeAIClearingAuth) {
+ if (claudeAIClearAuthBrowserOpened) {
+ void handleClaudeAIClearAuthComplete();
+ } else {
+ // First Enter: open the browser
+ const connectorsUrl = `${getOauthConfig().CLAUDE_AI_ORIGIN}/settings/connectors`;
+ setClaudeAIClearAuthUrl(connectorsUrl);
+ setClaudeAIClearAuthBrowserOpened(true);
+ void openBrowser(connectorsUrl);
+ }
+ }
+ if (input === 'c' && !urlCopied) {
+ const urlToCopy = authorizationUrl || claudeAIAuthUrl || claudeAIClearAuthUrl;
+ if (urlToCopy) {
+ void setClipboard(urlToCopy).then(raw => {
+ if (unmountedRef.current) return;
+ if (raw) process.stdout.write(raw);
+ setUrlCopied(true);
+ if (copyTimeoutRef.current !== undefined) {
+ clearTimeout(copyTimeoutRef.current);
+ }
+ copyTimeoutRef.current = setTimeout(setUrlCopied, 2000, false);
+ });
+ }
+ }
+ });
+ const capitalizedServerName = capitalize(String(server.name));
+
+ // Count MCP prompts for this server (skills are shown in /skills, not here)
+ const serverCommandsCount = filterMcpPromptsByServer(mcp.commands, server.name).length;
+ const toggleMcpServer = useMcpToggleEnabled();
+ const handleClaudeAIAuth = React.useCallback(async () => {
+ const claudeAiBaseUrl = getOauthConfig().CLAUDE_AI_ORIGIN;
+ const accountInfo = getOauthAccountInfo();
+ const orgUuid = accountInfo?.organizationUuid;
+ let authUrl: string;
+ if (orgUuid && server.config.type === 'claudeai-proxy' && server.config.id) {
+ // Use the direct auth URL with org and server IDs
+ // Replace 'mcprs' prefix with 'mcpsrv' if present
+ const serverId = server.config.id.startsWith('mcprs') ? 'mcpsrv' + server.config.id.slice(5) : server.config.id;
+ const productSurface = encodeURIComponent(process.env.CLAUDE_CODE_ENTRYPOINT || 'cli');
+ authUrl = `${claudeAiBaseUrl}/api/organizations/${orgUuid}/mcp/start-auth/${serverId}?product_surface=${productSurface}`;
+ } else {
+ // Fall back to settings/connectors if we don't have the required IDs
+ authUrl = `${claudeAiBaseUrl}/settings/connectors`;
+ }
+ setClaudeAIAuthUrl(authUrl);
+ setIsClaudeAIAuthenticating(true);
+ logEvent('tengu_claudeai_mcp_auth_started', {});
+ await openBrowser(authUrl);
+ }, [server.config]);
+ const handleClaudeAIClearAuth = React.useCallback(() => {
+ setIsClaudeAIClearingAuth(true);
+ logEvent('tengu_claudeai_mcp_clear_auth_started', {});
+ }, []);
+ const handleToggleEnabled = React.useCallback(async () => {
+ const wasEnabled = server.client.type !== 'disabled';
+ try {
+ await toggleMcpServer(server.name);
+ if (server.config.type === 'claudeai-proxy') {
+ logEvent('tengu_claudeai_mcp_toggle', {
+ new_state: (wasEnabled ? 'disabled' : 'enabled') as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS
+ });
+ }
+
+ // Return to the server list so user can continue managing other servers
+ onCancel();
+ } catch (err_0) {
+ const action = wasEnabled ? 'disable' : 'enable';
+ onComplete?.(`Failed to ${action} MCP server '${server.name}': ${errorMessage(err_0)}`);
+ }
+ }, [server.client.type, server.config.type, server.name, toggleMcpServer, onCancel, onComplete]);
+ const handleAuthenticate = React.useCallback(async () => {
+ if (server.config.type === 'claudeai-proxy') return;
+ setIsAuthenticating(true);
+ setError(null);
+ const controller = new AbortController();
+ authAbortControllerRef.current = controller;
+ try {
+ // Revoke existing tokens if re-authenticating, but preserve step-up
+ // auth state so the next OAuth flow can reuse cached scope/discovery.
+ if (server.isAuthenticated && server.config) {
+ await revokeServerTokens(server.name, server.config, {
+ preserveStepUpState: true
+ });
+ }
+ if (server.config) {
+ await performMCPOAuthFlow(server.name, server.config, setAuthorizationUrl, controller.signal, {
+ onWaitingForCallback: submit => {
+ setManualCallbackSubmit(() => submit);
+ }
+ });
+ logEvent('tengu_mcp_auth_config_authenticate', {
+ wasAuthenticated: server.isAuthenticated
+ });
+ const result_0 = await reconnectMcpServer(server.name);
+ if (result_0.client.type === 'connected') {
+ const message = isEffectivelyAuthenticated ? `Authentication successful. Reconnected to ${server.name}.` : `Authentication successful. Connected to ${server.name}.`;
+ onComplete?.(message);
+ } else if (result_0.client.type === 'needs-auth') {
+ onComplete?.('Authentication successful, but server still requires authentication. You may need to manually restart Claude Code.');
+ } else {
+ // result.client.type === 'failed'
+ logMCPDebug(server.name, `Reconnection failed after authentication`);
+ onComplete?.('Authentication successful, but server reconnection failed. You may need to manually restart Claude Code for the changes to take effect.');
+ }
+ }
+ } catch (err_1) {
+ // Don't show error if it was a cancellation
+ if (err_1 instanceof Error && !(err_1 instanceof AuthenticationCancelledError)) {
+ setError(err_1.message);
+ }
+ } finally {
+ setIsAuthenticating(false);
+ authAbortControllerRef.current = null;
+ setManualCallbackSubmit(null);
+ setCallbackUrlInput('');
+ }
+ }, [server.isAuthenticated, server.config, server.name, onComplete, reconnectMcpServer, isEffectivelyAuthenticated]);
+ const handleClearAuth = async () => {
+ if (server.config.type === 'claudeai-proxy') return;
+ if (server.config) {
+ // First revoke the authentication tokens and clear all auth state
+ await revokeServerTokens(server.name, server.config);
+ logEvent('tengu_mcp_auth_config_clear', {});
+
+ // Disconnect the client and clear the cache
+ await clearServerCache(server.name, {
+ ...server.config,
+ scope: server.scope
+ });
+
+ // Update app state to remove the disconnected server's tools, commands, and resources
+ setAppState(prev_0 => {
+ const newClients_0 = prev_0.mcp.clients.map(c_0 =>
+ // 'failed' is a misnomer here, but we don't really differentiate between "not connected" and "failed" at the moment
+ c_0.name === server.name ? {
+ ...c_0,
+ type: 'failed' as const
+ } : c_0);
+ const newTools_0 = excludeToolsByServer(prev_0.mcp.tools, server.name);
+ const newCommands_0 = excludeCommandsByServer(prev_0.mcp.commands, server.name);
+ const newResources_0 = excludeResourcesByServer(prev_0.mcp.resources, server.name);
+ return {
+ ...prev_0,
+ mcp: {
+ ...prev_0.mcp,
+ clients: newClients_0,
+ tools: newTools_0,
+ commands: newCommands_0,
+ resources: newResources_0
+ }
+ };
+ });
+ onComplete?.(`Authentication cleared for ${server.name}.`);
+ }
+ };
+ if (isAuthenticating) {
+ // XAA: silent exchange (cached id_token → no browser), so don't claim
+ // one will open. If IdP login IS needed, authorizationUrl populates and
+ // the URL fallback block below still renders.
+ const authCopy = server.config.type !== 'claudeai-proxy' && server.config.oauth?.xaa ? ' Authenticating via your identity provider' : ' A browser window will open for authentication';
+ return
+ Authenticating with {server.name}…
+
+
+ {authCopy}
+
+ {authorizationUrl &&
+
+
+ If your browser doesn't open automatically, copy this URL
+ manually{' '}
+
+ {urlCopied ? (Copied!) :
+
+ }
+
+
+ }
+ {isAuthenticating && authorizationUrl && manualCallbackSubmit &&
+
+ If the redirect page shows a connection error, paste the URL from
+ your browser's address bar:
+
+
+ URL {'>'}
+ {
+ manualCallbackSubmit(value.trim());
+ setCallbackUrlInput('');
+ }} cursorOffset={callbackUrlCursorOffset} onChangeCursorOffset={setCallbackUrlCursorOffset} columns={terminalColumns - 8} />
+
+ }
+
+
+ Return here after authenticating in your browser. Press Esc to go
+ back.
+
+
+ ;
+ }
+ if (isClaudeAIAuthenticating) {
+ return
+ Authenticating with {server.name}…
+
+
+ A browser window will open for authentication
+
+ {claudeAIAuthUrl &&
+
+
+ If your browser doesn't open automatically, copy this URL
+ manually{' '}
+
+ {urlCopied ? (Copied!) :
+
+ }
+
+
+ }
+
+
+ Press Enter after authenticating in your browser.
+
+
+
+
+
+ ;
+ }
+ if (isClaudeAIClearingAuth) {
+ return
+ Clear authentication for {server.name}
+ {claudeAIClearAuthBrowserOpened ? <>
+
+ Find the MCP server in the browser and click
+ "Disconnect".
+
+ {claudeAIClearAuthUrl &&
+
+
+ If your browser didn't open automatically, copy this
+ URL manually{' '}
+
+ {urlCopied ? (Copied!) :
+
+ }
+
+
+ }
+
+
+ Press Enter when done.
+
+
+
+
+
+ > : <>
+
+ This will open claude.ai in the browser. Find the MCP server in
+ the list and click "Disconnect".
+
+
+
+ Press Enter to open the browser.
+
+
+
+
+
+ >}
+ ;
+ }
+ if (isReconnecting) {
+ return
+
+ Connecting to {server.name}…
+
+
+
+ Establishing connection to MCP server
+
+ This may take a few moments.
+ ;
+ }
+ const menuOptions = [];
+
+ // If server is disabled, show Enable first as the primary action
+ if (server.client.type === 'disabled') {
+ menuOptions.push({
+ label: 'Enable',
+ value: 'toggle-enabled'
+ });
+ }
+ if (server.client.type === 'connected' && serverToolsCount > 0) {
+ menuOptions.push({
+ label: 'View tools',
+ value: 'tools'
+ });
+ }
+ if (server.config.type === 'claudeai-proxy') {
+ if (server.client.type === 'connected') {
+ menuOptions.push({
+ label: 'Clear authentication',
+ value: 'claudeai-clear-auth'
+ });
+ } else if (server.client.type !== 'disabled') {
+ menuOptions.push({
+ label: 'Authenticate',
+ value: 'claudeai-auth'
+ });
+ }
+ } else {
+ if (isEffectivelyAuthenticated) {
+ menuOptions.push({
+ label: 'Re-authenticate',
+ value: 'reauth'
+ });
+ menuOptions.push({
+ label: 'Clear authentication',
+ value: 'clear-auth'
+ });
+ }
+ if (!isEffectivelyAuthenticated) {
+ menuOptions.push({
+ label: 'Authenticate',
+ value: 'auth'
+ });
+ }
+ }
+ if (server.client.type !== 'disabled') {
+ if (server.client.type !== 'needs-auth') {
+ menuOptions.push({
+ label: 'Reconnect',
+ value: 'reconnectMcpServer'
+ });
+ }
+ menuOptions.push({
+ label: 'Disable',
+ value: 'toggle-enabled'
+ });
+ }
+
+ // If there are no other options, add a back option so Select handles escape
+ if (menuOptions.length === 0) {
+ menuOptions.push({
+ label: 'Back',
+ value: 'back'
+ });
+ }
+ return
+
+
+ {capitalizedServerName} MCP Server
+
+
+
+
+ Status:
+ {server.client.type === 'disabled' ? {color('inactive', theme)(figures.radioOff)} disabled : server.client.type === 'connected' ? {color('success', theme)(figures.tick)} connected : server.client.type === 'pending' ? <>
+ {figures.radioOff}
+ connecting…
+ > : server.client.type === 'needs-auth' ?
+ {color('warning', theme)(figures.triangleUpOutline)} needs
+ authentication
+ : {color('error', theme)(figures.cross)} failed}
+
+
+ {server.transport !== 'claudeai-proxy' &&
+ Auth:
+ {isEffectivelyAuthenticated ?
+ {color('success', theme)(figures.tick)} authenticated
+ :
+ {color('error', theme)(figures.cross)} not authenticated
+ }
+ }
+
+
+ URL:
+ {server.config.url}
+
+
+
+ Config location:
+ {describeMcpConfigFilePath(server.scope)}
+
+
+ {server.client.type === 'connected' && }
+
+ {server.client.type === 'connected' && serverToolsCount > 0 &&
+ Tools:
+ {serverToolsCount} tools
+ }
+
+
+ {error &&
+ Error: {error}
+ }
+
+ {menuOptions.length > 0 &&
+ }
+
+
+
+
+ {exitState.pending ? <>Press {exitState.keyName} again to exit> :
+
+
+
+ }
+
+
+ ;
+}
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJmaWd1cmVzIiwiUmVhY3QiLCJ1c2VFZmZlY3QiLCJ1c2VSZWYiLCJ1c2VTdGF0ZSIsIkFuYWx5dGljc01ldGFkYXRhX0lfVkVSSUZJRURfVEhJU19JU19OT1RfQ09ERV9PUl9GSUxFUEFUSFMiLCJsb2dFdmVudCIsIkNvbW1hbmRSZXN1bHREaXNwbGF5IiwiZ2V0T2F1dGhDb25maWciLCJ1c2VFeGl0T25DdHJsQ0RXaXRoS2V5YmluZGluZ3MiLCJ1c2VUZXJtaW5hbFNpemUiLCJzZXRDbGlwYm9hcmQiLCJCb3giLCJjb2xvciIsIkxpbmsiLCJUZXh0IiwidXNlSW5wdXQiLCJ1c2VUaGVtZSIsInVzZUtleWJpbmRpbmciLCJBdXRoZW50aWNhdGlvbkNhbmNlbGxlZEVycm9yIiwicGVyZm9ybU1DUE9BdXRoRmxvdyIsInJldm9rZVNlcnZlclRva2VucyIsImNsZWFyU2VydmVyQ2FjaGUiLCJ1c2VNY3BSZWNvbm5lY3QiLCJ1c2VNY3BUb2dnbGVFbmFibGVkIiwiZGVzY3JpYmVNY3BDb25maWdGaWxlUGF0aCIsImV4Y2x1ZGVDb21tYW5kc0J5U2VydmVyIiwiZXhjbHVkZVJlc291cmNlc0J5U2VydmVyIiwiZXhjbHVkZVRvb2xzQnlTZXJ2ZXIiLCJmaWx0ZXJNY3BQcm9tcHRzQnlTZXJ2ZXIiLCJ1c2VBcHBTdGF0ZSIsInVzZVNldEFwcFN0YXRlIiwiZ2V0T2F1dGhBY2NvdW50SW5mbyIsIm9wZW5Ccm93c2VyIiwiZXJyb3JNZXNzYWdlIiwibG9nTUNQRGVidWciLCJjYXBpdGFsaXplIiwiQ29uZmlndXJhYmxlU2hvcnRjdXRIaW50IiwiU2VsZWN0IiwiQnlsaW5lIiwiS2V5Ym9hcmRTaG9ydGN1dEhpbnQiLCJTcGlubmVyIiwiVGV4dElucHV0IiwiQ2FwYWJpbGl0aWVzU2VjdGlvbiIsIkNsYXVkZUFJU2VydmVySW5mbyIsIkhUVFBTZXJ2ZXJJbmZvIiwiU1NFU2VydmVySW5mbyIsImhhbmRsZVJlY29ubmVjdEVycm9yIiwiaGFuZGxlUmVjb25uZWN0UmVzdWx0IiwiUHJvcHMiLCJzZXJ2ZXIiLCJzZXJ2ZXJUb29sc0NvdW50Iiwib25WaWV3VG9vbHMiLCJvbkNhbmNlbCIsIm9uQ29tcGxldGUiLCJyZXN1bHQiLCJvcHRpb25zIiwiZGlzcGxheSIsImJvcmRlcmxlc3MiLCJNQ1BSZW1vdGVTZXJ2ZXJNZW51IiwiUmVhY3ROb2RlIiwidGhlbWUiLCJleGl0U3RhdGUiLCJjb2x1bW5zIiwidGVybWluYWxDb2x1bW5zIiwiaXNBdXRoZW50aWNhdGluZyIsInNldElzQXV0aGVudGljYXRpbmciLCJlcnJvciIsInNldEVycm9yIiwibWNwIiwicyIsInNldEFwcFN0YXRlIiwiYXV0aG9yaXphdGlvblVybCIsInNldEF1dGhvcml6YXRpb25VcmwiLCJpc1JlY29ubmVjdGluZyIsInNldElzUmVjb25uZWN0aW5nIiwiYXV0aEFib3J0Q29udHJvbGxlclJlZiIsIkFib3J0Q29udHJvbGxlciIsImlzQ2xhdWRlQUlBdXRoZW50aWNhdGluZyIsInNldElzQ2xhdWRlQUlBdXRoZW50aWNhdGluZyIsImNsYXVkZUFJQXV0aFVybCIsInNldENsYXVkZUFJQXV0aFVybCIsImlzQ2xhdWRlQUlDbGVhcmluZ0F1dGgiLCJzZXRJc0NsYXVkZUFJQ2xlYXJpbmdBdXRoIiwiY2xhdWRlQUlDbGVhckF1dGhVcmwiLCJzZXRDbGF1ZGVBSUNsZWFyQXV0aFVybCIsImNsYXVkZUFJQ2xlYXJBdXRoQnJvd3Nlck9wZW5lZCIsInNldENsYXVkZUFJQ2xlYXJBdXRoQnJvd3Nlck9wZW5lZCIsInVybENvcGllZCIsInNldFVybENvcGllZCIsImNvcHlUaW1lb3V0UmVmIiwiUmV0dXJuVHlwZSIsInNldFRpbWVvdXQiLCJ1bmRlZmluZWQiLCJ1bm1vdW50ZWRSZWYiLCJjYWxsYmFja1VybElucHV0Iiwic2V0Q2FsbGJhY2tVcmxJbnB1dCIsImNhbGxiYWNrVXJsQ3Vyc29yT2Zmc2V0Iiwic2V0Q2FsbGJhY2tVcmxDdXJzb3JPZmZzZXQiLCJtYW51YWxDYWxsYmFja1N1Ym1pdCIsInNldE1hbnVhbENhbGxiYWNrU3VibWl0IiwidXJsIiwiY3VycmVudCIsImFib3J0IiwiY2xlYXJUaW1lb3V0IiwiaXNFZmZlY3RpdmVseUF1dGhlbnRpY2F0ZWQiLCJpc0F1dGhlbnRpY2F0ZWQiLCJjbGllbnQiLCJ0eXBlIiwicmVjb25uZWN0TWNwU2VydmVyIiwiaGFuZGxlQ2xhdWRlQUlBdXRoQ29tcGxldGUiLCJ1c2VDYWxsYmFjayIsIm5hbWUiLCJzdWNjZXNzIiwiZXJyIiwiaGFuZGxlQ2xhdWRlQUlDbGVhckF1dGhDb21wbGV0ZSIsImNvbmZpZyIsInNjb3BlIiwicHJldiIsIm5ld0NsaWVudHMiLCJjbGllbnRzIiwibWFwIiwiYyIsImNvbnN0IiwibmV3VG9vbHMiLCJ0b29scyIsIm5ld0NvbW1hbmRzIiwiY29tbWFuZHMiLCJuZXdSZXNvdXJjZXMiLCJyZXNvdXJjZXMiLCJjb250ZXh0IiwiaXNBY3RpdmUiLCJpbnB1dCIsImtleSIsInJldHVybiIsImNvbm5lY3RvcnNVcmwiLCJDTEFVREVfQUlfT1JJR0lOIiwidXJsVG9Db3B5IiwidGhlbiIsInJhdyIsInByb2Nlc3MiLCJzdGRvdXQiLCJ3cml0ZSIsImNhcGl0YWxpemVkU2VydmVyTmFtZSIsIlN0cmluZyIsInNlcnZlckNvbW1hbmRzQ291bnQiLCJsZW5ndGgiLCJ0b2dnbGVNY3BTZXJ2ZXIiLCJoYW5kbGVDbGF1ZGVBSUF1dGgiLCJjbGF1ZGVBaUJhc2VVcmwiLCJhY2NvdW50SW5mbyIsIm9yZ1V1aWQiLCJvcmdhbml6YXRpb25VdWlkIiwiYXV0aFVybCIsImlkIiwic2VydmVySWQiLCJzdGFydHNXaXRoIiwic2xpY2UiLCJwcm9kdWN0U3VyZmFjZSIsImVuY29kZVVSSUNvbXBvbmVudCIsImVudiIsIkNMQVVERV9DT0RFX0VOVFJZUE9JTlQiLCJoYW5kbGVDbGF1ZGVBSUNsZWFyQXV0aCIsImhhbmRsZVRvZ2dsZUVuYWJsZWQiLCJ3YXNFbmFibGVkIiwibmV3X3N0YXRlIiwiYWN0aW9uIiwiaGFuZGxlQXV0aGVudGljYXRlIiwiY29udHJvbGxlciIsInByZXNlcnZlU3RlcFVwU3RhdGUiLCJzaWduYWwiLCJvbldhaXRpbmdGb3JDYWxsYmFjayIsInN1Ym1pdCIsIndhc0F1dGhlbnRpY2F0ZWQiLCJtZXNzYWdlIiwiRXJyb3IiLCJoYW5kbGVDbGVhckF1dGgiLCJhdXRoQ29weSIsIm9hdXRoIiwieGFhIiwidmFsdWUiLCJ0cmltIiwibWVudU9wdGlvbnMiLCJwdXNoIiwibGFiZWwiLCJyYWRpb09mZiIsInRpY2siLCJ0cmlhbmdsZVVwT3V0bGluZSIsImNyb3NzIiwidHJhbnNwb3J0IiwicGVuZGluZyIsImtleU5hbWUiXSwic291cmNlcyI6WyJNQ1BSZW1vdGVTZXJ2ZXJNZW51LnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZmlndXJlcyBmcm9tICdmaWd1cmVzJ1xuaW1wb3J0IFJlYWN0LCB7IHVzZUVmZmVjdCwgdXNlUmVmLCB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHtcbiAgdHlwZSBBbmFseXRpY3NNZXRhZGF0YV9JX1ZFUklGSUVEX1RISVNfSVNfTk9UX0NPREVfT1JfRklMRVBBVEhTLFxuICBsb2dFdmVudCxcbn0gZnJvbSAnc3JjL3NlcnZpY2VzL2FuYWx5dGljcy9pbmRleC5qcydcbmltcG9ydCB0eXBlIHsgQ29tbWFuZFJlc3VsdERpc3BsYXkgfSBmcm9tICcuLi8uLi9jb21tYW5kcy5qcydcbmltcG9ydCB7IGdldE9hdXRoQ29uZmlnIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzL29hdXRoLmpzJ1xuaW1wb3J0IHsgdXNlRXhpdE9uQ3RybENEV2l0aEtleWJpbmRpbmdzIH0gZnJvbSAnLi4vLi4vaG9va3MvdXNlRXhpdE9uQ3RybENEV2l0aEtleWJpbmRpbmdzLmpzJ1xuaW1wb3J0IHsgdXNlVGVybWluYWxTaXplIH0gZnJvbSAnLi4vLi4vaG9va3MvdXNlVGVybWluYWxTaXplLmpzJ1xuaW1wb3J0IHsgc2V0Q2xpcGJvYXJkIH0gZnJvbSAnLi4vLi4vaW5rL3Rlcm1pby9vc2MuanMnXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY3VzdG9tLXJ1bGVzL3ByZWZlci11c2Uta2V5YmluZGluZ3MgLS0gcmF3IGovay9hcnJvdyBtZW51IG5hdmlnYXRpb25cbmltcG9ydCB7IEJveCwgY29sb3IsIExpbmssIFRleHQsIHVzZUlucHV0LCB1c2VUaGVtZSB9IGZyb20gJy4uLy4uL2luay5qcydcbmltcG9ydCB7IHVzZUtleWJpbmRpbmcgfSBmcm9tICcuLi8uLi9rZXliaW5kaW5ncy91c2VLZXliaW5kaW5nLmpzJ1xuaW1wb3J0IHtcbiAgQXV0aGVudGljYXRpb25DYW5jZWxsZWRFcnJvcixcbiAgcGVyZm9ybU1DUE9BdXRoRmxvdyxcbiAgcmV2b2tlU2VydmVyVG9rZW5zLFxufSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9tY3AvYXV0aC5qcydcbmltcG9ydCB7IGNsZWFyU2VydmVyQ2FjaGUgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9tY3AvY2xpZW50LmpzJ1xuaW1wb3J0IHtcbiAgdXNlTWNwUmVjb25uZWN0LFxuICB1c2VNY3BUb2dnbGVFbmFibGVkLFxufSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9tY3AvTUNQQ29ubmVjdGlvbk1hbmFnZXIuanMnXG5pbXBvcnQge1xuICBkZXNjcmliZU1jcENvbmZpZ0ZpbGVQYXRoLFxuICBleGNsdWRlQ29tbWFuZHNCeVNlcnZlcixcbiAgZXhjbHVkZVJlc291cmNlc0J5U2VydmVyLFxuICBleGNsdWRlVG9vbHNCeVNlcnZlcixcbiAgZmlsdGVyTWNwUHJvbXB0c0J5U2VydmVyLFxufSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9tY3AvdXRpbHMuanMnXG5pbXBvcnQgeyB1c2VBcHBTdGF0ZSwgdXNlU2V0QXBwU3RhdGUgfSBmcm9tICcuLi8uLi9zdGF0ZS9BcHBTdGF0ZS5qcydcbmltcG9ydCB7IGdldE9hdXRoQWNjb3VudEluZm8gfSBmcm9tICcuLi8uLi91dGlscy9hdXRoLmpzJ1xuaW1wb3J0IHsgb3BlbkJyb3dzZXIgfSBmcm9tICcuLi8uLi91dGlscy9icm93c2VyLmpzJ1xuaW1wb3J0IHsgZXJyb3JNZXNzYWdlIH0gZnJvbSAnLi4vLi4vdXRpbHMvZXJyb3JzLmpzJ1xuaW1wb3J0IHsgbG9nTUNQRGVidWcgfSBmcm9tICcuLi8uLi91dGlscy9sb2cuanMnXG5pbXBvcnQgeyBjYXBpdGFsaXplIH0gZnJvbSAnLi4vLi4vdXRpbHMvc3RyaW5nVXRpbHMuanMnXG5pbXBvcnQgeyBDb25maWd1cmFibGVTaG9ydGN1dEhpbnQgfSBmcm9tICcuLi9Db25maWd1cmFibGVTaG9ydGN1dEhpbnQuanMnXG5pbXBvcnQgeyBTZWxlY3QgfSBmcm9tICcuLi9DdXN0b21TZWxlY3QvaW5kZXguanMnXG5pbXBvcnQgeyBCeWxpbmUgfSBmcm9tICcuLi9kZXNpZ24tc3lzdGVtL0J5bGluZS5qcydcbmltcG9ydCB7IEtleWJvYXJkU2hvcnRjdXRIaW50IH0gZnJvbSAnLi4vZGVzaWduLXN5c3RlbS9LZXlib2FyZFNob3J0Y3V0SGludC5qcydcbmltcG9ydCB7IFNwaW5uZXIgfSBmcm9tICcuLi9TcGlubmVyLmpzJ1xuaW1wb3J0IFRleHRJbnB1dCBmcm9tICcuLi9UZXh0SW5wdXQuanMnXG5pbXBvcnQgeyBDYXBhYmlsaXRpZXNTZWN0aW9uIH0gZnJvbSAnLi9DYXBhYmlsaXRpZXNTZWN0aW9uLmpzJ1xuaW1wb3J0IHR5cGUge1xuICBDbGF1ZGVBSVNlcnZlckluZm8sXG4gIEhUVFBTZXJ2ZXJJbmZvLFxuICBTU0VTZXJ2ZXJJbmZvLFxufSBmcm9tICcuL3R5cGVzLmpzJ1xuaW1wb3J0IHtcbiAgaGFuZGxlUmVjb25uZWN0RXJyb3IsXG4gIGhhbmRsZVJlY29ubmVjdFJlc3VsdCxcbn0gZnJvbSAnLi91dGlscy9yZWNvbm5lY3RIZWxwZXJzLmpzJ1xuXG50eXBlIFByb3BzID0ge1xuICBzZXJ2ZXI6IFNTRVNlcnZlckluZm8gfCBIVFRQU2VydmVySW5mbyB8IENsYXVkZUFJU2VydmVySW5mb1xuICBzZXJ2ZXJUb29sc0NvdW50OiBudW1iZXJcbiAgb25WaWV3VG9vbHM6ICgpID0+IHZvaWRcbiAgb25DYW5jZWw6ICgpID0+IHZvaWRcbiAgb25Db21wbGV0ZT86IChcbiAgICByZXN1bHQ/OiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IHsgZGlzcGxheT86IENvbW1hbmRSZXN1bHREaXNwbGF5IH0sXG4gICkgPT4gdm9pZFxuICBib3JkZXJsZXNzPzogYm9vbGVhblxufVxuXG5leHBvcnQgZnVuY3Rpb24gTUNQUmVtb3RlU2VydmVyTWVudSh7XG4gIHNlcnZlcixcbiAgc2VydmVyVG9vbHNDb3VudCxcbiAgb25WaWV3VG9vbHMsXG4gIG9uQ2FuY2VsLFxuICBvbkNvbXBsZXRlLFxuICBib3JkZXJsZXNzID0gZmFsc2UsXG59OiBQcm9wcyk6IFJlYWN0LlJlYWN0Tm9kZSB7XG4gIGNvbnN0IFt0aGVtZV0gPSB1c2VUaGVtZSgpXG4gIGNvbnN0IGV4aXRTdGF0ZSA9IHVzZUV4aXRPbkN0cmxDRFdpdGhLZXliaW5kaW5ncygpXG4gIGNvbnN0IHsgY29sdW1uczogdGVybWluYWxDb2x1bW5zIH0gPSB1c2VUZXJtaW5hbFNpemUoKVxuICBjb25zdCBbaXNBdXRoZW50aWNhdGluZywgc2V0SXNBdXRoZW50aWNhdGluZ10gPSBSZWFjdC51c2VTdGF0ZShmYWxzZSlcbiAgY29uc3QgW2Vycm9yLCBzZXRFcnJvcl0gPSBSZWFjdC51c2VTdGF0ZTxzdHJpbmcgfCBudWxsPihudWxsKVxuICBjb25zdCBtY3AgPSB1c2VBcHBTdGF0ZShzID0+IHMubWNwKVxuICBjb25zdCBzZXRBcHBTdGF0ZSA9IHVzZVNldEFwcFN0YXRlKClcbiAgY29uc3QgW2F1dGhvcml6YXRpb25VcmwsIHNldEF1dGhvcml6YXRpb25VcmxdID0gUmVhY3QudXNlU3RhdGU8c3RyaW5nIHwgbnVsbD4oXG4gICAgbnVsbCxcbiAgKVxuICBjb25zdCBbaXNSZWNvbm5lY3RpbmcsIHNldElzUmVjb25uZWN0aW5nXSA9IHVzZVN0YXRlKGZhbHNlKVxuICBjb25zdCBhdXRoQWJvcnRDb250cm9sbGVyUmVmID0gdXNlUmVmPEFib3J0Q29udHJvbGxlciB8IG51bGw+KG51bGwpXG4gIGNvbnN0IFtpc0NsYXVkZUFJQXV0aGVudGljYXRpbmcsIHNldElzQ2xhdWRlQUlBdXRoZW50aWNhdGluZ10gPVxuICAgIHVzZVN0YXRlKGZhbHNlKVxuICBjb25zdCBbY2xhdWRlQUlBdXRoVXJsLCBzZXRDbGF1ZGVBSUF1dGhVcmxdID0gdXNlU3RhdGU8c3RyaW5nIHwgbnVsbD4obnVsbClcbiAgY29uc3QgW2lzQ2xhdWRlQUlDbGVhcmluZ0F1dGgsIHNldElzQ2xhdWRlQUlDbGVhcmluZ0F1dGhdID0gdXNlU3RhdGUoZmFsc2UpXG4gIGNvbnN0IFtjbGF1ZGVBSUNsZWFyQXV0aFVybCwgc2V0Q2xhdWRlQUlDbGVhckF1dGhVcmxdID0gdXNlU3RhdGU8XG4gICAgc3RyaW5nIHwgbnVsbFxuICA+KG51bGwpXG4gIGNvbnN0IFtjbGF1ZGVBSUNsZWFyQXV0aEJyb3dzZXJPcGVuZWQsIHNldENsYXVkZUFJQ2xlYXJBdXRoQnJvd3Nlck9wZW5lZF0gPVxuICAgIHVzZVN0YXRlKGZhbHNlKVxuICBjb25zdCBbdXJsQ29waWVkLCBzZXRVcmxDb3BpZWRdID0gdXNlU3RhdGUoZmFsc2UpXG4gIGNvbnN0IGNvcHlUaW1lb3V0UmVmID0gdXNlUmVmPFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgdW5kZWZpbmVkPihcbiAgICB1bmRlZmluZWQsXG4gIClcbiAgY29uc3QgdW5tb3VudGVkUmVmID0gdXNlUmVmKGZhbHNlKVxuICBjb25zdCBbY2FsbGJhY2tVcmxJbnB1dCwgc2V0Q2FsbGJhY2tVcmxJbnB1dF0gPSB1c2VTdGF0ZSgnJylcbiAgY29uc3QgW2NhbGxiYWNrVXJsQ3Vyc29yT2Zmc2V0LCBzZXRDYWxsYmFja1VybEN1cnNvck9mZnNldF0gPSB1c2VTdGF0ZSgwKVxuICBjb25zdCBbbWFudWFsQ2FsbGJhY2tTdWJtaXQsIHNldE1hbnVhbENhbGxiYWNrU3VibWl0XSA9IHVzZVN0YXRlPFxuICAgICgodXJsOiBzdHJpbmcpID0+IHZvaWQpIHwgbnVsbFxuICA+KG51bGwpXG5cbiAgLy8gSWYgdGhlIGNvbXBvbmVudCB1bm1vdW50cyBtaWQtYXV0aCAoZS5nLiBhIHBhcmVudCBjb21wb25lbnQncyBFc2MgaGFuZGxlclxuICAvLyBuYXZpZ2F0ZXMgYXdheSBiZWZvcmUgb3VycyBmaXJlcyksIGFib3J0IHRoZSBPQXV0aCBmbG93IHNvIHRoZSBjYWxsYmFja1xuICAvLyBzZXJ2ZXIgaXMgY2xvc2VkLiBXaXRob3V0IHRoaXMsIHRoZSBzZXJ2ZXIgc3RheXMgYm91bmQgYW5kIHRoZSBwcm9jZXNzXG4gIC8vIGNhbiBvdXRsaXZlIHRoZSB0ZXJtaW5hbC4gQWxzbyBjbGVhciB0aGUgY29weS1mZWVkYmFjayB0aW1lciBhbmQgbWFya1xuICAvLyB1bm1vdW50ZWQgc28gdGhlIGFzeW5jIHNldENsaXBib2FyZCBjYWxsYmFjayBkb2Vzbid0IHNldFVybENvcGllZCAvXG4gIC8vIHNjaGVkdWxlIGEgbmV3IHRpbWVyIGFmdGVyIHVubW91bnQuXG4gIHVzZUVmZmVjdChcbiAgICAoKSA9PiAoKSA9PiB7XG4gICAgICB1bm1vdW50ZWRSZWYuY3VycmVudCA9IHRydWVcbiAgICAgIGF1dGhBYm9ydENvbnRyb2xsZXJSZWYuY3VycmVudD8uYWJvcnQoKVxuICAgICAgaWYgKGNvcHlUaW1lb3V0UmVmLmN1cnJlbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjbGVhclRpbWVvdXQoY29weVRpbWVvdXRSZWYuY3VycmVudClcbiAgICAgIH1cbiAgICB9LFxuICAgIFtdLFxuICApXG5cbiAgLy8gQSBzZXJ2ZXIgaXMgZWZmZWN0aXZlbHkgYXV0aGVudGljYXRlZCBpZjpcbiAgLy8gMS4gSXQgaGFzIE9BdXRoIHRva2VucyAoc2VydmVyLmlzQXV0aGVudGljYXRlZCksIE9SXG4gIC8vIDIuIEl0J3MgY29ubmVjdGVkIGFuZCBoYXMgdG9vbHMgKG1lYW5pbmcgaXQncyB3b3JraW5nIHZpYSBzb21lIGF1dGggbWVjaGFuaXNtKVxuICBjb25zdCBpc0VmZmVjdGl2ZWx5QXV0aGVudGljYXRlZCA9XG4gICAgc2VydmVyLmlzQXV0aGVudGljYXRlZCB8fFxuICAgIChzZXJ2ZXIuY2xpZW50LnR5cGUgPT09ICdjb25uZWN0ZWQnICYmIHNlcnZlclRvb2xzQ291bnQgPiAwKVxuXG4gIGNvbnN0IHJlY29ubmVjdE1jcFNlcnZlciA9IHVzZU1jcFJlY29ubmVjdCgpXG5cbiAgY29uc3QgaGFuZGxlQ2xhdWRlQUlBdXRoQ29tcGxldGUgPSBSZWFjdC51c2VDYWxsYmFjayhhc3luYyAoKSA9PiB7XG4gICAgc2V0SXNDbGF1ZGVBSUF1dGhlbnRpY2F0aW5nKGZhbHNlKVxuICAgIHNldENsYXVkZUFJQXV0aFVybChudWxsKVxuICAgIHNldElzUmVjb25uZWN0aW5nKHRydWUpXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlY29ubmVjdE1jcFNlcnZlcihzZXJ2ZXIubmFtZSlcbiAgICAgIGNvbnN0IHN1Y2Nlc3MgPSByZXN1bHQuY2xpZW50LnR5cGUgPT09ICdjb25uZWN0ZWQnXG4gICAgICBsb2dFdmVudCgndGVuZ3VfY2xhdWRlYWlfbWNwX2F1dGhfY29tcGxldGVkJywgeyBzdWNjZXNzIH0pXG4gICAgICBpZiAoc3VjY2Vzcykge1xuICAgICAgICBvbkNvbXBsZXRlPy4oYEF1dGhlbnRpY2F0aW9uIHN1Y2Nlc3NmdWwuIENvbm5lY3RlZCB0byAke3NlcnZlci5uYW1lfS5gKVxuICAgICAgfSBlbHNlIGlmIChyZXN1bHQuY2xpZW50LnR5cGUgPT09ICduZWVkcy1hdXRoJykge1xuICAgICAgICBvbkNvbXBsZXRlPy4oXG4gICAgICAgICAgJ0F1dGhlbnRpY2F0aW9uIHN1Y2Nlc3NmdWwsIGJ1dCBzZXJ2ZXIgc3RpbGwgcmVxdWlyZXMgYXV0aGVudGljYXRpb24uIFlvdSBtYXkgbmVlZCB0byBtYW51YWxseSByZXN0YXJ0IENsYXVkZSBDb2RlLicsXG4gICAgICAgIClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9uQ29tcGxldGU/LihcbiAgICAgICAgICAnQXV0aGVudGljYXRpb24gc3VjY2Vzc2Z1bCwgYnV0IHNlcnZlciByZWNvbm5lY3Rpb24gZmFpbGVkLiBZb3UgbWF5IG5lZWQgdG8gbWFudWFsbHkgcmVzdGFydCBDbGF1ZGUgQ29kZSBmb3IgdGhlIGNoYW5nZXMgdG8gdGFrZSBlZmZlY3QuJyxcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgbG9nRXZlbnQoJ3Rlbmd1X2NsYXVkZWFpX21jcF9hdXRoX2NvbXBsZXRlZCcsIHsgc3VjY2VzczogZmFsc2UgfSlcbiAgICAgIG9uQ29tcGxldGU/LihoYW5kbGVSZWNvbm5lY3RFcnJvcihlcnIsIHNlcnZlci5uYW1lKSlcbiAgICB9IGZpbmFsbHkge1xuICAgICAgc2V0SXNSZWNvbm5lY3RpbmcoZmFsc2UpXG4gICAgfVxuICB9LCBbcmVjb25uZWN0TWNwU2VydmVyLCBzZXJ2ZXIubmFtZSwgb25Db21wbGV0ZV0pXG5cbiAgY29uc3QgaGFuZGxlQ2xhdWRlQUlDbGVhckF1dGhDb21wbGV0ZSA9IFJlYWN0LnVzZUNhbGxiYWNrKGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBjbGVhclNlcnZlckNhY2hlKHNlcnZlci5uYW1lLCB7XG4gICAgICAuLi5zZXJ2ZXIuY29uZmlnLFxuICAgICAgc2NvcGU6IHNlcnZlci5zY29wZSxcbiAgICB9KVxuXG4gICAgc2V0QXBwU3RhdGUocHJldiA9PiB7XG4gICAgICBjb25zdCBuZXdDbGllbnRzID0gcHJldi5tY3AuY2xpZW50cy5tYXAoYyA9PlxuICAgICAgICBjLm5hbWUgPT09IHNlcnZlci5uYW1lID8geyAuLi5jLCB0eXBlOiAnbmVlZHMtYXV0aCcgYXMgY29uc3QgfSA6IGMsXG4gICAgICApXG4gICAgICBjb25zdCBuZXdUb29scyA9IGV4Y2x1ZGVUb29sc0J5U2VydmVyKHByZXYubWNwLnRvb2xzLCBzZXJ2ZXIubmFtZSlcbiAgICAgIGNvbnN0IG5ld0NvbW1hbmRzID0gZXhjbHVkZUNvbW1hbmRzQnlTZXJ2ZXIoXG4gICAgICAgIHByZXYubWNwLmNvbW1hbmRzLFxuICAgICAgICBzZXJ2ZXIubmFtZSxcbiAgICAgIClcbiAgICAgIGNvbnN0IG5ld1Jlc291cmNlcyA9IGV4Y2x1ZGVSZXNvdXJjZXNCeVNlcnZlcihcbiAgICAgICAgcHJldi5tY3AucmVzb3VyY2VzLFxuICAgICAgICBzZXJ2ZXIubmFtZSxcbiAgICAgIClcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4ucHJldixcbiAgICAgICAgbWNwOiB7XG4gICAgICAgICAgLi4ucHJldi5tY3AsXG4gICAgICAgICAgY2xpZW50czogbmV3Q2xpZW50cyxcbiAgICAgICAgICB0b29sczogbmV3VG9vbHMsXG4gICAgICAgICAgY29tbWFuZHM6IG5ld0NvbW1hbmRzLFxuICAgICAgICAgIHJlc291cmNlczogbmV3UmVzb3VyY2VzLFxuICAgICAgICB9LFxuICAgICAgfVxuICAgIH0pXG5cbiAgICBsb2dFdmVudCgndGVuZ3VfY2xhdWRlYWlfbWNwX2NsZWFyX2F1dGhfY29tcGxldGVkJywge30pXG4gICAgb25Db21wbGV0ZT8uKGBEaXNjb25uZWN0ZWQgZnJvbSAke3NlcnZlci5uYW1lfS5gKVxuICAgIHNldElzQ2xhdWRlQUlDbGVhcmluZ0F1dGgoZmFsc2UpXG4gICAgc2V0Q2xhdWRlQUlDbGVhckF1dGhVcmwobnVsbClcbiAgICBzZXRDbGF1ZGVBSUNsZWFyQXV0aEJyb3dzZXJPcGVuZWQoZmFsc2UpXG4gIH0sIFtzZXJ2ZXIubmFtZSwgc2VydmVyLmNvbmZpZywgc2VydmVyLnNjb3BlLCBzZXRBcHBTdGF0ZSwgb25Db21wbGV0ZV0pXG5cbiAgLy8gRXNjYXBlIHRvIGNhbmNlbCBhdXRoZW50aWNhdGlvbiBmbG93XG4gIHVzZUtleWJpbmRpbmcoXG4gICAgJ2NvbmZpcm06bm8nLFxuICAgICgpID0+IHtcbiAgICAgIGF1dGhBYm9ydENvbnRyb2xsZXJSZWYuY3VycmVudD8uYWJvcnQoKVxuICAgICAgYXV0aEFib3J0Q29udHJvbGxlclJlZi5jdXJyZW50ID0gbnVsbFxuICAgICAgc2V0SXNBdXRoZW50aWNhdGluZyhmYWxzZSlcbiAgICAgIHNldEF1dGhvcml6YXRpb25VcmwobnVsbClcbiAgICB9LFxuICAgIHtcbiAgICAgIGNvbnRleHQ6ICdDb25maXJtYXRpb24nLFxuICAgICAgaXNBY3RpdmU6IGlzQXV0aGVudGljYXRpbmcsXG4gICAgfSxcbiAgKVxuXG4gIC8vIEVzY2FwZSB0byBjYW5jZWwgQ2xhdWRlIEFJIGF1dGhlbnRpY2F0aW9uXG4gIHVzZUtleWJpbmRpbmcoXG4gICAgJ2NvbmZpcm06bm8nLFxuICAgICgpID0+IHtcbiAgICAgIHNldElzQ2xhdWRlQUlBdXRoZW50aWNhdGluZyhmYWxzZSlcbiAgICAgIHNldENsYXVkZUFJQXV0aFVybChudWxsKVxuICAgIH0sXG4gICAge1xuICAgICAgY29udGV4dDogJ0NvbmZpcm1hdGlvbicsXG4gICAgICBpc0FjdGl2ZTogaXNDbGF1ZGVBSUF1dGhlbnRpY2F0aW5nLFxuICAgIH0sXG4gIClcblxuICAvLyBFc2NhcGUgdG8gY2FuY2VsIENsYXVkZSBBSSBjbGVhciBhdXRoXG4gIHVzZUtleWJpbmRpbmcoXG4gICAgJ2NvbmZpcm06bm8nLFxuICAgICgpID0+IHtcbiAgICAgIHNldElzQ2xhdWRlQUlDbGVhcmluZ0F1dGgoZmFsc2UpXG4gICAgICBzZXRDbGF1ZGVBSUNsZWFyQXV0aFVybChudWxsKVxuICAgICAgc2V0Q2xhdWRlQUlDbGVhckF1dGhCcm93c2VyT3BlbmVkKGZhbHNlKVxuICAgIH0sXG4gICAge1xuICAgICAgY29udGV4dDogJ0NvbmZpcm1hdGlvbicsXG4gICAgICBpc0FjdGl2ZTogaXNDbGF1ZGVBSUNsZWFyaW5nQXV0aCxcbiAgICB9LFxuICApXG5cbiAgLy8gUmV0dXJuIGtleSBoYW5kbGluZyBmb3IgYXV0aGVudGljYXRpb24gZmxvd3MgYW5kICdjJyB0byBjb3B5IFVSTFxuICB1c2VJbnB1dCgoaW5wdXQsIGtleSkgPT4ge1xuICAgIGlmIChrZXkucmV0dXJuICYmIGlzQ2xhdWRlQUlBdXRoZW50aWNhdGluZykge1xuICAgICAgdm9pZCBoYW5kbGVDbGF1ZGVBSUF1dGhDb21wbGV0ZSgpXG4gICAgfVxuICAgIGlmIChrZXkucmV0dXJuICYmIGlzQ2xhdWRlQUlDbGVhcmluZ0F1dGgpIHtcbiAgICAgIGlmIChjbGF1ZGVBSUNsZWFyQXV0aEJyb3dzZXJPcGVuZWQpIHtcbiAgICAgICAgdm9pZCBoYW5kbGVDbGF1ZGVBSUNsZWFyQXV0aENvbXBsZXRlKClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEZpcnN0IEVudGVyOiBvcGVuIHRoZSBicm93c2VyXG4gICAgICAgIGNvbnN0IGNvbm5lY3RvcnNVcmwgPSBgJHtnZXRPYXV0aENvbmZpZygpLkNMQVVERV9BSV9PUklHSU59L3NldHRpbmdzL2Nvbm5lY3RvcnNgXG4gICAgICAgIHNldENsYXVkZUFJQ2xlYXJBdXRoVXJsKGNvbm5lY3RvcnNVcmwpXG4gICAgICAgIHNldENsYXVkZUFJQ2xlYXJBdXRoQnJvd3Nlck9wZW5lZCh0cnVlKVxuICAgICAgICB2b2lkIG9wZW5Ccm93c2VyKGNvbm5lY3RvcnNVcmwpXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpbnB1dCA9PT0gJ2MnICYmICF1cmxDb3BpZWQpIHtcbiAgICAgIGNvbnN0IHVybFRvQ29weSA9XG4gICAgICAgIGF1dGhvcml6YXRpb25VcmwgfHwgY2xhdWRlQUlBdXRoVXJsIHx8IGNsYXVkZUFJQ2xlYXJBdXRoVXJsXG4gICAgICBpZiAodXJsVG9Db3B5KSB7XG4gICAgICAgIHZvaWQgc2V0Q2xpcGJvYXJkKHVybFRvQ29weSkudGhlbihyYXcgPT4ge1xuICAgICAgICAgIGlmICh1bm1vdW50ZWRSZWYuY3VycmVudCkgcmV0dXJuXG4gICAgICAgICAgaWYgKHJhdykgcHJvY2Vzcy5zdGRvdXQud3JpdGUocmF3KVxuICAgICAgICAgIHNldFVybENvcGllZCh0cnVlKVxuICAgICAgICAgIGlmIChjb3B5VGltZW91dFJlZi5jdXJyZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChjb3B5VGltZW91dFJlZi5jdXJyZW50KVxuICAgICAgICAgIH1cbiAgICAgICAgICBjb3B5VGltZW91dFJlZi5jdXJyZW50ID0gc2V0VGltZW91dChzZXRVcmxDb3BpZWQsIDIwMDAsIGZhbHNlKVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH1cbiAgfSlcblxuICBjb25zdCBjYXBpdGFsaXplZFNlcnZlck5hbWUgPSBjYXBpdGFsaXplKFN0cmluZyhzZXJ2ZXIubmFtZSkpXG5cbiAgLy8gQ291bnQgTUNQIHByb21wdHMgZm9yIHRoaXMgc2VydmVyIChza2lsbHMgYXJlIHNob3duIGluIC9za2lsbHMsIG5vdCBoZXJlKVxuICBjb25zdCBzZXJ2ZXJDb21tYW5kc0NvdW50ID0gZmlsdGVyTWNwUHJvbXB0c0J5U2VydmVyKFxuICAgIG1jcC5jb21tYW5kcyxcbiAgICBzZXJ2ZXIubmFtZSxcbiAgKS5sZW5ndGhcblxuICBjb25zdCB0b2dnbGVNY3BTZXJ2ZXIgPSB1c2VNY3BUb2dnbGVFbmFibGVkKClcblxuICBjb25zdCBoYW5kbGVDbGF1ZGVBSUF1dGggPSBSZWFjdC51c2VDYWxsYmFjayhhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgY2xhdWRlQWlCYXNlVXJsID0gZ2V0T2F1dGhDb25maWcoKS5DTEFVREVfQUlfT1JJR0lOXG4gICAgY29uc3QgYWNjb3VudEluZm8gPSBnZXRPYXV0aEFjY291bnRJbmZvKClcbiAgICBjb25zdCBvcmdVdWlkID0gYWNjb3VudEluZm8/Lm9yZ2FuaXphdGlvblV1aWRcblxuICAgIGxldCBhdXRoVXJsOiBzdHJpbmdcbiAgICBpZiAoXG4gICAgICBvcmdVdWlkICYmXG4gICAgICBzZXJ2ZXIuY29uZmlnLnR5cGUgPT09ICdjbGF1ZGVhaS1wcm94eScgJiZcbiAgICAgIHNlcnZlci5jb25maWcuaWRcbiAgICApIHtcbiAgICAgIC8vIFVzZSB0aGUgZGlyZWN0IGF1dGggVVJMIHdpdGggb3JnIGFuZCBzZXJ2ZXIgSURzXG4gICAgICAvLyBSZXBsYWNlICdtY3BycycgcHJlZml4IHdpdGggJ21jcHNydicgaWYgcHJlc2VudFxuICAgICAgY29uc3Qgc2VydmVySWQgPSBzZXJ2ZXIuY29uZmlnLmlkLnN0YXJ0c1dpdGgoJ21jcHJzJylcbiAgICAgICAgPyAnbWNwc3J2JyArIHNlcnZlci5jb25maWcuaWQuc2xpY2UoNSlcbiAgICAgICAgOiBzZXJ2ZXIuY29uZmlnLmlkXG4gICAgICBjb25zdCBwcm9kdWN0U3VyZmFjZSA9IGVuY29kZVVSSUNvbXBvbmVudChcbiAgICAgICAgcHJvY2Vzcy5lbnYuQ0xBVURFX0NPREVfRU5UUllQT0lOVCB8fCAnY2xpJyxcbiAgICAgIClcbiAgICAgIGF1dGhVcmwgPSBgJHtjbGF1ZGVBaUJhc2VVcmx9L2FwaS9vcmdhbml6YXRpb25zLyR7b3JnVXVpZH0vbWNwL3N0YXJ0LWF1dGgvJHtzZXJ2ZXJJZH0/cHJvZHVjdF9zdXJmYWNlPSR7cHJvZHVjdFN1cmZhY2V9YFxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBGYWxsIGJhY2sgdG8gc2V0dGluZ3MvY29ubmVjdG9ycyBpZiB3ZSBkb24ndCBoYXZlIHRoZSByZXF1aXJlZCBJRHNcbiAgICAgIGF1dGhVcmwgPSBgJHtjbGF1ZGVBaUJhc2VVcmx9L3NldHRpbmdzL2Nvbm5lY3RvcnNgXG4gICAgfVxuXG4gICAgc2V0Q2xhdWRlQUlBdXRoVXJsKGF1dGhVcmwpXG4gICAgc2V0SXNDbGF1ZGVBSUF1dGhlbnRpY2F0aW5nKHRydWUpXG4gICAgbG9nRXZlbnQoJ3Rlbmd1X2NsYXVkZWFpX21jcF9hdXRoX3N0YXJ0ZWQnLCB7fSlcbiAgICBhd2FpdCBvcGVuQnJvd3NlcihhdXRoVXJsKVxuICB9LCBbc2VydmVyLmNvbmZpZ10pXG5cbiAgY29uc3QgaGFuZGxlQ2xhdWRlQUlDbGVhckF1dGggPSBSZWFjdC51c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgc2V0SXNDbGF1ZGVBSUNsZWFyaW5nQXV0aCh0cnVlKVxuICAgIGxvZ0V2ZW50KCd0ZW5ndV9jbGF1ZGVhaV9tY3BfY2xlYXJfYXV0aF9zdGFydGVkJywge30pXG4gIH0sIFtdKVxuXG4gIGNvbnN0IGhhbmRsZVRvZ2dsZUVuYWJsZWQgPSBSZWFjdC51c2VDYWxsYmFjayhhc3luYyAoKSA9PiB7XG4gICAgY29uc3Qgd2FzRW5hYmxlZCA9IHNlcnZlci5jbGllbnQudHlwZSAhPT0gJ2Rpc2FibGVkJ1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRvZ2dsZU1jcFNlcnZlcihzZXJ2ZXIubmFtZSlcblxuICAgICAgaWYgKHNlcnZlci5jb25maWcudHlwZSA9PT0gJ2NsYXVkZWFpLXByb3h5Jykge1xuICAgICAgICBsb2dFdmVudCgndGVuZ3VfY2xhdWRlYWlfbWNwX3RvZ2dsZScsIHtcbiAgICAgICAgICBuZXdfc3RhdGU6ICh3YXNFbmFibGVkXG4gICAgICAgICAgICA/ICdkaXNhYmxlZCdcbiAgICAgICAgICAgIDogJ2VuYWJsZWQnKSBhcyBBbmFseXRpY3NNZXRhZGF0YV9JX1ZFUklGSUVEX1RISVNfSVNfTk9UX0NPREVfT1JfRklMRVBBVEhTLFxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICAvLyBSZXR1cm4gdG8gdGhlIHNlcnZlciBsaXN0IHNvIHVzZXIgY2FuIGNvbnRpbnVlIG1hbmFnaW5nIG90aGVyIHNlcnZlcnNcbiAgICAgIG9uQ2FuY2VsKClcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnN0IGFjdGlvbiA9IHdhc0VuYWJsZWQgPyAnZGlzYWJsZScgOiAnZW5hYmxlJ1xuICAgICAgb25Db21wbGV0ZT8uKFxuICAgICAgICBgRmFpbGVkIHRvICR7YWN0aW9ufSBNQ1Agc2VydmVyICcke3NlcnZlci5uYW1lfSc6ICR7ZXJyb3JNZXNzYWdlKGVycil9YCxcbiAgICAgIClcbiAgICB9XG4gIH0sIFtcbiAgICBzZXJ2ZXIuY2xpZW50LnR5cGUsXG4gICAgc2VydmVyLmNvbmZpZy50eXBlLFxuICAgIHNlcnZlci5uYW1lLFxuICAgIHRvZ2dsZU1jcFNlcnZlcixcbiAgICBvbkNhbmNlbCxcbiAgICBvbkNvbXBsZXRlLFxuICBdKVxuXG4gIGNvbnN0IGhhbmRsZUF1dGhlbnRpY2F0ZSA9IFJlYWN0LnVzZUNhbGxiYWNrKGFzeW5jICgpID0+IHtcbiAgICBpZiAoc2VydmVyLmNvbmZpZy50eXBlID09PSAnY2xhdWRlYWktcHJveHknKSByZXR1cm5cblxuICAgIHNldElzQXV0aGVudGljYXRpbmcodHJ1ZSlcbiAgICBzZXRFcnJvcihudWxsKVxuXG4gICAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKVxuICAgIGF1dGhBYm9ydENvbnRyb2xsZXJSZWYuY3VycmVudCA9IGNvbnRyb2xsZXJcblxuICAgIHRyeSB7XG4gICAgICAvLyBSZXZva2UgZXhpc3RpbmcgdG9rZW5zIGlmIHJlLWF1dGhlbnRpY2F0aW5nLCBidXQgcHJlc2VydmUgc3RlcC11cFxuICAgICAgLy8gYXV0aCBzdGF0ZSBzbyB0aGUgbmV4dCBPQXV0aCBmbG93IGNhbiByZXVzZSBjYWNoZWQgc2NvcGUvZGlzY292ZXJ5LlxuICAgICAgaWYgKHNlcnZlci5pc0F1dGhlbnRpY2F0ZWQgJiYgc2VydmVyLmNvbmZpZykge1xuICAgICAgICBhd2FpdCByZXZva2VTZXJ2ZXJUb2tlbnMoc2VydmVyLm5hbWUsIHNlcnZlci5jb25maWcsIHtcbiAgICAgICAgICBwcmVzZXJ2ZVN0ZXBVcFN0YXRlOiB0cnVlLFxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICBpZiAoc2VydmVyLmNvbmZpZykge1xuICAgICAgICBhd2FpdCBwZXJmb3JtTUNQT0F1dGhGbG93KFxuICAgICAgICAgIHNlcnZlci5uYW1lLFxuICAgICAgICAgIHNlcnZlci5jb25maWcsXG4gICAgICAgICAgc2V0QXV0aG9yaXphdGlvblVybCxcbiAgICAgICAgICBjb250cm9sbGVyLnNpZ25hbCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBvbldhaXRpbmdGb3JDYWxsYmFjazogc3VibWl0ID0+IHtcbiAgICAgICAgICAgICAgc2V0TWFudWFsQ2FsbGJhY2tTdWJtaXQoKCkgPT4gc3VibWl0KVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICApXG5cbiAgICAgICAgbG9nRXZlbnQoJ3Rlbmd1X21jcF9hdXRoX2NvbmZpZ19hdXRoZW50aWNhdGUnLCB7XG4gICAgICAgICAgd2FzQXV0aGVudGljYXRlZDogc2VydmVyLmlzQXV0aGVudGljYXRlZCxcbiAgICAgICAgfSlcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZWNvbm5lY3RNY3BTZXJ2ZXIoc2VydmVyLm5hbWUpXG5cbiAgICAgICAgaWYgKHJlc3VsdC5jbGllbnQudHlwZSA9PT0gJ2Nvbm5lY3RlZCcpIHtcbiAgICAgICAgICBjb25zdCBtZXNzYWdlID0gaXNFZmZlY3RpdmVseUF1dGhlbnRpY2F0ZWRcbiAgICAgICAgICAgID8gYEF1dGhlbnRpY2F0aW9uIHN1Y2Nlc3NmdWwuIFJlY29ubmVjdGVkIHRvICR7c2VydmVyLm5hbWV9LmBcbiAgICAgICAgICAgIDogYEF1dGhlbnRpY2F0aW9uIHN1Y2Nlc3NmdWwuIENvbm5lY3RlZCB0byAke3NlcnZlci5uYW1lfS5gXG4gICAgICAgICAgb25Db21wbGV0ZT8uKG1lc3NhZ2UpXG4gICAgICAgIH0gZWxzZSBpZiAocmVzdWx0LmNsaWVudC50eXBlID09PSAnbmVlZHMtYXV0aCcpIHtcbiAgICAgICAgICBvbkNvbXBsZXRlPy4oXG4gICAgICAgICAgICAnQXV0aGVudGljYXRpb24gc3VjY2Vzc2Z1bCwgYnV0IHNlcnZlciBzdGlsbCByZXF1aXJlcyBhdXRoZW50aWNhdGlvbi4gWW91IG1heSBuZWVkIHRvIG1hbnVhbGx5IHJlc3RhcnQgQ2xhdWRlIENvZGUuJyxcbiAgICAgICAgICApXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gcmVzdWx0LmNsaWVudC50eXBlID09PSAnZmFpbGVkJ1xuICAgICAgICAgIGxvZ01DUERlYnVnKHNlcnZlci5uYW1lLCBgUmVjb25uZWN0aW9uIGZhaWxlZCBhZnRlciBhdXRoZW50aWNhdGlvbmApXG4gICAgICAgICAgb25Db21wbGV0ZT8uKFxuICAgICAgICAgICAgJ0F1dGhlbnRpY2F0aW9uIHN1Y2Nlc3NmdWwsIGJ1dCBzZXJ2ZXIgcmVjb25uZWN0aW9uIGZhaWxlZC4gWW91IG1heSBuZWVkIHRvIG1hbnVhbGx5IHJlc3RhcnQgQ2xhdWRlIENvZGUgZm9yIHRoZSBjaGFuZ2VzIHRvIHRha2UgZWZmZWN0LicsXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAvLyBEb24ndCBzaG93IGVycm9yIGlmIGl0IHdhcyBhIGNhbmNlbGxhdGlvblxuICAgICAgaWYgKFxuICAgICAgICBlcnIgaW5zdGFuY2VvZiBFcnJvciAmJlxuICAgICAgICAhKGVyciBpbnN0YW5jZW9mIEF1dGhlbnRpY2F0aW9uQ2FuY2VsbGVkRXJyb3IpXG4gICAgICApIHtcbiAgICAgICAgc2V0RXJyb3IoZXJyLm1lc3NhZ2UpXG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHNldElzQXV0aGVudGljYXRpbmcoZmFsc2UpXG4gICAgICBhdXRoQWJvcnRDb250cm9sbGVyUmVmLmN1cnJlbnQgPSBudWxsXG4gICAgICBzZXRNYW51YWxDYWxsYmFja1N1Ym1pdChudWxsKVxuICAgICAgc2V0Q2FsbGJhY2tVcmxJbnB1dCgnJylcbiAgICB9XG4gIH0sIFtcbiAgICBzZXJ2ZXIuaXNBdXRoZW50aWNhdGVkLFxuICAgIHNlcnZlci5jb25maWcsXG4gICAgc2VydmVyLm5hbWUsXG4gICAgb25Db21wbGV0ZSxcbiAgICByZWNvbm5lY3RNY3BTZXJ2ZXIsXG4gICAgaXNFZmZlY3RpdmVseUF1dGhlbnRpY2F0ZWQsXG4gIF0pXG5cbiAgY29uc3QgaGFuZGxlQ2xlYXJBdXRoID0gYXN5bmMgKCkgPT4ge1xuICAgIGlmIChzZXJ2ZXIuY29uZmlnLnR5cGUgPT09ICdjbGF1ZGVhaS1wcm94eScpIHJldHVyblxuXG4gICAgaWYgKHNlcnZlci5jb25maWcpIHtcbiAgICAgIC8vIEZpcnN0IHJldm9rZSB0aGUgYXV0aGVudGljYXRpb24gdG9rZW5zIGFuZCBjbGVhciBhbGwgYXV0aCBzdGF0ZVxuICAgICAgYXdhaXQgcmV2b2tlU2VydmVyVG9rZW5zKHNlcnZlci5uYW1lLCBzZXJ2ZXIuY29uZmlnKVxuICAgICAgbG9nRXZlbnQoJ3Rlbmd1X21jcF9hdXRoX2NvbmZpZ19jbGVhcicsIHt9KVxuXG4gICAgICAvLyBEaXNjb25uZWN0IHRoZSBjbGllbnQgYW5kIGNsZWFyIHRoZSBjYWNoZVxuICAgICAgYXdhaXQgY2xlYXJTZXJ2ZXJDYWNoZShzZXJ2ZXIubmFtZSwge1xuICAgICAgICAuLi5zZXJ2ZXIuY29uZmlnLFxuICAgICAgICBzY29wZTogc2VydmVyLnNjb3BlLFxuICAgICAgfSlcblxuICAgICAgLy8gVXBkYXRlIGFwcCBzdGF0ZSB0byByZW1vdmUgdGhlIGRpc2Nvbm5lY3RlZCBzZXJ2ZXIncyB0b29scywgY29tbWFuZHMsIGFuZCByZXNvdXJjZXNcbiAgICAgIHNldEFwcFN0YXRlKHByZXYgPT4ge1xuICAgICAgICBjb25zdCBuZXdDbGllbnRzID0gcHJldi5tY3AuY2xpZW50cy5tYXAoYyA9PlxuICAgICAgICAgIC8vICdmYWlsZWQnIGlzIGEgbWlzbm9tZXIgaGVyZSwgYnV0IHdlIGRvbid0IHJlYWxseSBkaWZmZXJlbnRpYXRlIGJldHdlZW4gXCJub3QgY29ubmVjdGVkXCIgYW5kIFwiZmFpbGVkXCIgYXQgdGhlIG1vbWVudFxuICAgICAgICAgIGMubmFtZSA9PT0gc2VydmVyLm5hbWUgPyB7IC4uLmMsIHR5cGU6ICdmYWlsZWQnIGFzIGNvbnN0IH0gOiBjLFxuICAgICAgICApXG4gICAgICAgIGNvbnN0IG5ld1Rvb2xzID0gZXhjbHVkZVRvb2xzQnlTZXJ2ZXIocHJldi5tY3AudG9vbHMsIHNlcnZlci5uYW1lKVxuICAgICAgICBjb25zdCBuZXdDb21tYW5kcyA9IGV4Y2x1ZGVDb21tYW5kc0J5U2VydmVyKFxuICAgICAgICAgIHByZXYubWNwLmNvbW1hbmRzLFxuICAgICAgICAgIHNlcnZlci5uYW1lLFxuICAgICAgICApXG4gICAgICAgIGNvbnN0IG5ld1Jlc291cmNlcyA9IGV4Y2x1ZGVSZXNvdXJjZXNCeVNlcnZlcihcbiAgICAgICAgICBwcmV2Lm1jcC5yZXNvdXJjZXMsXG4gICAgICAgICAgc2VydmVyLm5hbWUsXG4gICAgICAgIClcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLnByZXYsXG4gICAgICAgICAgbWNwOiB7XG4gICAgICAgICAgICAuLi5wcmV2Lm1jcCxcbiAgICAgICAgICAgIGNsaWVudHM6IG5ld0NsaWVudHMsXG4gICAgICAgICAgICB0b29sczogbmV3VG9vbHMsXG4gICAgICAgICAgICBjb21tYW5kczogbmV3Q29tbWFuZHMsXG4gICAgICAgICAgICByZXNvdXJjZXM6IG5ld1Jlc291cmNlcyxcbiAgICAgICAgICB9LFxuICAgICAgICB9XG4gICAgICB9KVxuXG4gICAgICBvbkNvbXBsZXRlPy4oYEF1dGhlbnRpY2F0aW9uIGNsZWFyZWQgZm9yICR7c2VydmVyLm5hbWV9LmApXG4gICAgfVxuICB9XG5cbiAgaWYgKGlzQXV0aGVudGljYXRpbmcpIHtcbiAgICAvLyBYQUE6IHNpbGVudCBleGNoYW5nZSAoY2FjaGVkIGlkX3Rva2VuIOKGkiBubyBicm93c2VyKSwgc28gZG9uJ3QgY2xhaW1cbiAgICAvLyBvbmUgd2lsbCBvcGVuLiBJZiBJZFAgbG9naW4gSVMgbmVlZGVkLCBhdXRob3JpemF0aW9uVXJsIHBvcHVsYXRlcyBhbmRcbiAgICAvLyB0aGUgVVJMIGZhbGxiYWNrIGJsb2NrIGJlbG93IHN0aWxsIHJlbmRlcnMuXG4gICAgY29uc3QgYXV0aENvcHkgPVxuICAgICAgc2VydmVyLmNvbmZpZy50eXBlICE9PSAnY2xhdWRlYWktcHJveHknICYmIHNlcnZlci5jb25maWcub2F1dGg/LnhhYVxuICAgICAgICA/ICcgQXV0aGVudGljYXRpbmcgdmlhIHlvdXIgaWRlbnRpdHkgcHJvdmlkZXInXG4gICAgICAgIDogJyBBIGJyb3dzZXIgd2luZG93IHdpbGwgb3BlbiBmb3IgYXV0aGVudGljYXRpb24nXG4gICAgcmV0dXJuIChcbiAgICAgIDxCb3ggZmxleERpcmVjdGlvbj1cImNvbHVtblwiIGdhcD17MX0gcGFkZGluZz17MX0+XG4gICAgICAgIDxUZXh0IGNvbG9yPVwiY2xhdWRlXCI+QXV0aGVudGljYXRpbmcgd2l0aCB7c2VydmVyLm5hbWV94oCmPC9UZXh0PlxuICAgICAgICA8Qm94PlxuICAgICAgICAgIDxTcGlubmVyIC8+XG4gICAgICAgICAgPFRleHQ+e2F1dGhDb3B5fTwvVGV4dD5cbiAgICAgICAgPC9Cb3g+XG4gICAgICAgIHthdXRob3JpemF0aW9uVXJsICYmIChcbiAgICAgICAgICA8Qm94IGZsZXhEaXJlY3Rpb249XCJjb2x1bW5cIj5cbiAgICAgICAgICAgIDxCb3g+XG4gICAgICAgICAgICAgIDxUZXh0IGRpbUNvbG9yPlxuICAgICAgICAgICAgICAgIElmIHlvdXIgYnJvd3NlciBkb2VzbiZhcG9zO3Qgb3BlbiBhdXRvbWF0aWNhbGx5LCBjb3B5IHRoaXMgVVJMXG4gICAgICAgICAgICAgICAgbWFudWFsbHl7JyAnfVxuICAgICAgICAgICAgICA8L1RleHQ+XG4gICAgICAgICAgICAgIHt1cmxDb3BpZWQgPyAoXG4gICAgICAgICAgICAgICAgPFRleHQgY29sb3I9XCJzdWNjZXNzXCI+KENvcGllZCEpPC9UZXh0PlxuICAgICAgICAgICAgICApIDogKFxuICAgICAgICAgICAgICAgIDxUZXh0IGRpbUNvbG9yPlxuICAgICAgICAgICAgICAgICAgPEtleWJvYXJkU2hvcnRjdXRIaW50IHNob3J0Y3V0PVwiY1wiIGFjdGlvbj1cImNvcHlcIiBwYXJlbnMgLz5cbiAgICAgICAgICAgICAgICA8L1RleHQ+XG4gICAgICAgICAgICAgICl9XG4gICAgICAgICAgICA8L0JveD5cbiAgICAgICAgICAgIDxMaW5rIHVybD17YXV0aG9yaXphdGlvblVybH0gLz5cbiAgICAgICAgICA8L0JveD5cbiAgICAgICAgKX1cbiAgICAgICAge2lzQXV0aGVudGljYXRpbmcgJiYgYXV0aG9yaXphdGlvblVybCAmJiBtYW51YWxDYWxsYmFja1N1Ym1pdCAmJiAoXG4gICAgICAgICAgPEJveCBmbGV4RGlyZWN0aW9uPVwiY29sdW1uXCIgbWFyZ2luVG9wPXsxfT5cbiAgICAgICAgICAgIDxUZXh0IGRpbUNvbG9yPlxuICAgICAgICAgICAgICBJZiB0aGUgcmVkaXJlY3QgcGFnZSBzaG93cyBhIGNvbm5lY3Rpb24gZXJyb3IsIHBhc3RlIHRoZSBVUkwgZnJvbVxuICAgICAgICAgICAgICB5b3VyIGJyb3dzZXImYXBvcztzIGFkZHJlc3MgYmFyOlxuICAgICAgICAgICAgPC9UZXh0PlxuICAgICAgICAgICAgPEJveD5cbiAgICAgICAgICAgICAgPFRleHQgZGltQ29sb3I+VVJMIHsnPid9IDwvVGV4dD5cbiAgICAgICAgICAgICAgPFRleHRJbnB1dFxuICAgICAgICAgICAgICAgIHZhbHVlPXtjYWxsYmFja1VybElucHV0fVxuICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXtzZXRDYWxsYmFja1VybElucHV0fVxuICAgICAgICAgICAgICAgIG9uU3VibWl0PXsodmFsdWU6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgICAgbWFudWFsQ2FsbGJhY2tTdWJtaXQodmFsdWUudHJpbSgpKVxuICAgICAgICAgICAgICAgICAgc2V0Q2FsbGJhY2tVcmxJbnB1dCgnJylcbiAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgIGN1cnNvck9mZnNldD17Y2FsbGJhY2tVcmxDdXJzb3JPZmZzZXR9XG4gICAgICAgICAgICAgICAgb25DaGFuZ2VDdXJzb3JPZmZzZXQ9e3NldENhbGxiYWNrVXJsQ3Vyc29yT2Zmc2V0fVxuICAgICAgICAgICAgICAgIGNvbHVtbnM9e3Rlcm1pbmFsQ29sdW1ucyAtIDh9XG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8L0JveD5cbiAgICAgICAgICA8L0JveD5cbiAgICAgICAgKX1cbiAgICAgICAgPEJveCBtYXJnaW5MZWZ0PXszfT5cbiAgICAgICAgICA8VGV4dCBkaW1Db2xvcj5cbiAgICAgICAgICAgIFJldHVybiBoZXJlIGFmdGVyIGF1dGhlbnRpY2F0aW5nIGluIHlvdXIgYnJvd3Nlci4gUHJlc3MgRXNjIHRvIGdvXG4gICAgICAgICAgICBiYWNrLlxuICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgPC9Cb3g+XG4gICAgICA8L0JveD5cbiAgICApXG4gIH1cblxuICBpZiAoaXNDbGF1ZGVBSUF1dGhlbnRpY2F0aW5nKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxCb3ggZmxleERpcmVjdGlvbj1cImNvbHVtblwiIGdhcD17MX0gcGFkZGluZz17MX0+XG4gICAgICAgIDxUZXh0IGNvbG9yPVwiY2xhdWRlXCI+QXV0aGVudGljYXRpbmcgd2l0aCB7c2VydmVyLm5hbWV94oCmPC9UZXh0PlxuICAgICAgICA8Qm94PlxuICAgICAgICAgIDxTcGlubmVyIC8+XG4gICAgICAgICAgPFRleHQ+IEEgYnJvd3NlciB3aW5kb3cgd2lsbCBvcGVuIGZvciBhdXRoZW50aWNhdGlvbjwvVGV4dD5cbiAgICAgICAgPC9Cb3g+XG4gICAgICAgIHtjbGF1ZGVBSUF1dGhVcmwgJiYgKFxuICAgICAgICAgIDxCb3ggZmxleERpcmVjdGlvbj1cImNvbHVtblwiPlxuICAgICAgICAgICAgPEJveD5cbiAgICAgICAgICAgICAgPFRleHQgZGltQ29sb3I+XG4gICAgICAgICAgICAgICAgSWYgeW91ciBicm93c2VyIGRvZXNuJmFwb3M7dCBvcGVuIGF1dG9tYXRpY2FsbHksIGNvcHkgdGhpcyBVUkxcbiAgICAgICAgICAgICAgICBtYW51YWxseXsnICd9XG4gICAgICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgICAgICAge3VybENvcGllZCA/IChcbiAgICAgICAgICAgICAgICA8VGV4dCBjb2xvcj1cInN1Y2Nlc3NcIj4oQ29waWVkISk8L1RleHQ+XG4gICAgICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICAgICAgPFRleHQgZGltQ29sb3I+XG4gICAgICAgICAgICAgICAgICA8S2V5Ym9hcmRTaG9ydGN1dEhpbnQgc2hvcnRjdXQ9XCJjXCIgYWN0aW9uPVwiY29weVwiIHBhcmVucyAvPlxuICAgICAgICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgIDwvQm94PlxuICAgICAgICAgICAgPExpbmsgdXJsPXtjbGF1ZGVBSUF1dGhVcmx9IC8+XG4gICAgICAgICAgPC9Cb3g+XG4gICAgICAgICl9XG4gICAgICAgIDxCb3ggbWFyZ2luTGVmdD17M30gZmxleERpcmVjdGlvbj1cImNvbHVtblwiPlxuICAgICAgICAgIDxUZXh0IGNvbG9yPVwicGVybWlzc2lvblwiPlxuICAgICAgICAgICAgUHJlc3MgPFRleHQgYm9sZD5FbnRlcjwvVGV4dD4gYWZ0ZXIgYXV0aGVudGljYXRpbmcgaW4geW91ciBicm93c2VyLlxuICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgICA8VGV4dCBkaW1Db2xvciBpdGFsaWM+XG4gICAgICAgICAgICA8Q29uZmlndXJhYmxlU2hvcnRjdXRIaW50XG4gICAgICAgICAgICAgIGFjdGlvbj1cImNvbmZpcm06bm9cIlxuICAgICAgICAgICAgICBjb250ZXh0PVwiQ29uZmlybWF0aW9uXCJcbiAgICAgICAgICAgICAgZmFsbGJhY2s9XCJFc2NcIlxuICAgICAgICAgICAgICBkZXNjcmlwdGlvbj1cImJhY2tcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L1RleHQ+XG4gICAgICAgIDwvQm94PlxuICAgICAgPC9Cb3g+XG4gICAgKVxuICB9XG5cbiAgaWYgKGlzQ2xhdWRlQUlDbGVhcmluZ0F1dGgpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPEJveCBmbGV4RGlyZWN0aW9uPVwiY29sdW1uXCIgZ2FwPXsxfSBwYWRkaW5nPXsxfT5cbiAgICAgICAgPFRleHQgY29sb3I9XCJjbGF1ZGVcIj5DbGVhciBhdXRoZW50aWNhdGlvbiBmb3Ige3NlcnZlci5uYW1lfTwvVGV4dD5cbiAgICAgICAge2NsYXVkZUFJQ2xlYXJBdXRoQnJvd3Nlck9wZW5lZCA/IChcbiAgICAgICAgICA8PlxuICAgICAgICAgICAgPFRleHQ+XG4gICAgICAgICAgICAgIEZpbmQgdGhlIE1DUCBzZXJ2ZXIgaW4gdGhlIGJyb3dzZXIgYW5kIGNsaWNrXG4gICAgICAgICAgICAgICZxdW90O0Rpc2Nvbm5lY3QmcXVvdDsuXG4gICAgICAgICAgICA8L1RleHQ+XG4gICAgICAgICAgICB7Y2xhdWRlQUlDbGVhckF1dGhVcmwgJiYgKFxuICAgICAgICAgICAgICA8Qm94IGZsZXhEaXJlY3Rpb249XCJjb2x1bW5cIj5cbiAgICAgICAgICAgICAgICA8Qm94PlxuICAgICAgICAgICAgICAgICAgPFRleHQgZGltQ29sb3I+XG4gICAgICAgICAgICAgICAgICAgIElmIHlvdXIgYnJvd3NlciBkaWRuJmFwb3M7dCBvcGVuIGF1dG9tYXRpY2FsbHksIGNvcHkgdGhpc1xuICAgICAgICAgICAgICAgICAgICBVUkwgbWFudWFsbHl7JyAnfVxuICAgICAgICAgICAgICAgICAgPC9UZXh0PlxuICAgICAgICAgICAgICAgICAge3VybENvcGllZCA/IChcbiAgICAgICAgICAgICAgICAgICAgPFRleHQgY29sb3I9XCJzdWNjZXNzXCI+KENvcGllZCEpPC9UZXh0PlxuICAgICAgICAgICAgICAgICAgKSA6IChcbiAgICAgICAgICAgICAgICAgICAgPFRleHQgZGltQ29sb3I+XG4gICAgICAgICAgICAgICAgICAgICAgPEtleWJvYXJkU2hvcnRjdXRIaW50IHNob3J0Y3V0PVwiY1wiIGFjdGlvbj1cImNvcHlcIiBwYXJlbnMgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9UZXh0PlxuICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICA8L0JveD5cbiAgICAgICAgICAgICAgICA8TGluayB1cmw9e2NsYXVkZUFJQ2xlYXJBdXRoVXJsfSAvPlxuICAgICAgICAgICAgICA8L0JveD5cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgICA8Qm94IG1hcmdpbkxlZnQ9ezN9IGZsZXhEaXJlY3Rpb249XCJjb2x1bW5cIj5cbiAgICAgICAgICAgICAgPFRleHQgY29sb3I9XCJwZXJtaXNzaW9uXCI+XG4gICAgICAgICAgICAgICAgUHJlc3MgPFRleHQgYm9sZD5FbnRlcjwvVGV4dD4gd2hlbiBkb25lLlxuICAgICAgICAgICAgICA8L1RleHQ+XG4gICAgICAgICAgICAgIDxUZXh0IGRpbUNvbG9yIGl0YWxpYz5cbiAgICAgICAgICAgICAgICA8Q29uZmlndXJhYmxlU2hvcnRjdXRIaW50XG4gICAgICAgICAgICAgICAgICBhY3Rpb249XCJjb25maXJtOm5vXCJcbiAgICAgICAgICAgICAgICAgIGNvbnRleHQ9XCJDb25maXJtYXRpb25cIlxuICAgICAgICAgICAgICAgICAgZmFsbGJhY2s9XCJFc2NcIlxuICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb249XCJiYWNrXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8L1RleHQ+XG4gICAgICAgICAgICA8L0JveD5cbiAgICAgICAgICA8Lz5cbiAgICAgICAgKSA6IChcbiAgICAgICAgICA8PlxuICAgICAgICAgICAgPFRleHQ+XG4gICAgICAgICAgICAgIFRoaXMgd2lsbCBvcGVuIGNsYXVkZS5haSBpbiB0aGUgYnJvd3Nlci4gRmluZCB0aGUgTUNQIHNlcnZlciBpblxuICAgICAgICAgICAgICB0aGUgbGlzdCBhbmQgY2xpY2sgJnF1b3Q7RGlzY29ubmVjdCZxdW90Oy5cbiAgICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgICAgIDxCb3ggbWFyZ2luTGVmdD17M30gZmxleERpcmVjdGlvbj1cImNvbHVtblwiPlxuICAgICAgICAgICAgICA8VGV4dCBjb2xvcj1cInBlcm1pc3Npb25cIj5cbiAgICAgICAgICAgICAgICBQcmVzcyA8VGV4dCBib2xkPkVudGVyPC9UZXh0PiB0byBvcGVuIHRoZSBicm93c2VyLlxuICAgICAgICAgICAgICA8L1RleHQ+XG4gICAgICAgICAgICAgIDxUZXh0IGRpbUNvbG9yIGl0YWxpYz5cbiAgICAgICAgICAgICAgICA8Q29uZmlndXJhYmxlU2hvcnRjdXRIaW50XG4gICAgICAgICAgICAgICAgICBhY3Rpb249XCJjb25maXJtOm5vXCJcbiAgICAgICAgICAgICAgICAgIGNvbnRleHQ9XCJDb25maXJtYXRpb25cIlxuICAgICAgICAgICAgICAgICAgZmFsbGJhY2s9XCJFc2NcIlxuICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb249XCJiYWNrXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8L1RleHQ+XG4gICAgICAgICAgICA8L0JveD5cbiAgICAgICAgICA8Lz5cbiAgICAgICAgKX1cbiAgICAgIDwvQm94PlxuICAgIClcbiAgfVxuXG4gIGlmIChpc1JlY29ubmVjdGluZykge1xuICAgIHJldHVybiAoXG4gICAgICA8Qm94IGZsZXhEaXJlY3Rpb249XCJjb2x1bW5cIiBnYXA9ezF9IHBhZGRpbmc9ezF9PlxuICAgICAgICA8VGV4dCBjb2xvcj1cInRleHRcIj5cbiAgICAgICAgICBDb25uZWN0aW5nIHRvIDxUZXh0IGJvbGQ+e3NlcnZlci5uYW1lfTwvVGV4dD7igKZcbiAgICAgICAgPC9UZXh0PlxuICAgICAgICA8Qm94PlxuICAgICAgICAgIDxTcGlubmVyIC8+XG4gICAgICAgICAgPFRleHQ+IEVzdGFibGlzaGluZyBjb25uZWN0aW9uIHRvIE1DUCBzZXJ2ZXI8L1RleHQ+XG4gICAgICAgIDwvQm94PlxuICAgICAgICA8VGV4dCBkaW1Db2xvcj5UaGlzIG1heSB0YWtlIGEgZmV3IG1vbWVudHMuPC9UZXh0PlxuICAgICAgPC9Cb3g+XG4gICAgKVxuICB9XG5cbiAgY29uc3QgbWVudU9wdGlvbnMgPSBbXVxuXG4gIC8vIElmIHNlcnZlciBpcyBkaXNhYmxlZCwgc2hvdyBFbmFibGUgZmlyc3QgYXMgdGhlIHByaW1hcnkgYWN0aW9uXG4gIGlmIChzZXJ2ZXIuY2xpZW50LnR5cGUgPT09ICdkaXNhYmxlZCcpIHtcbiAgICBtZW51T3B0aW9ucy5wdXNoKHtcbiAgICAgIGxhYmVsOiAnRW5hYmxlJyxcbiAgICAgIHZhbHVlOiAndG9nZ2xlLWVuYWJsZWQnLFxuICAgIH0pXG4gIH1cblxuICBpZiAoc2VydmVyLmNsaWVudC50eXBlID09PSAnY29ubmVjdGVkJyAmJiBzZXJ2ZXJUb29sc0NvdW50ID4gMCkge1xuICAgIG1lbnVPcHRpb25zLnB1c2goe1xuICAgICAgbGFiZWw6ICdWaWV3IHRvb2xzJyxcbiAgICAgIHZhbHVlOiAndG9vbHMnLFxuICAgIH0pXG4gIH1cblxuICBpZiAoc2VydmVyLmNvbmZpZy50eXBlID09PSAnY2xhdWRlYWktcHJveHknKSB7XG4gICAgaWYgKHNlcnZlci5jbGllbnQudHlwZSA9PT0gJ2Nvbm5lY3RlZCcpIHtcbiAgICAgIG1lbnVPcHRpb25zLnB1c2goe1xuICAgICAgICBsYWJlbDogJ0NsZWFyIGF1dGhlbnRpY2F0aW9uJyxcbiAgICAgICAgdmFsdWU6ICdjbGF1ZGVhaS1jbGVhci1hdXRoJyxcbiAgICAgIH0pXG4gICAgfSBlbHNlIGlmIChzZXJ2ZXIuY2xpZW50LnR5cGUgIT09ICdkaXNhYmxlZCcpIHtcbiAgICAgIG1lbnVPcHRpb25zLnB1c2goe1xuICAgICAgICBsYWJlbDogJ0F1dGhlbnRpY2F0ZScsXG4gICAgICAgIHZhbHVlOiAnY2xhdWRlYWktYXV0aCcsXG4gICAgICB9KVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoaXNFZmZlY3RpdmVseUF1dGhlbnRpY2F0ZWQpIHtcbiAgICAgIG1lbnVPcHRpb25zLnB1c2goe1xuICAgICAgICBsYWJlbDogJ1JlLWF1dGhlbnRpY2F0ZScsXG4gICAgICAgIHZhbHVlOiAncmVhdXRoJyxcbiAgICAgIH0pXG4gICAgICBtZW51T3B0aW9ucy5wdXNoKHtcbiAgICAgICAgbGFiZWw6ICdDbGVhciBhdXRoZW50aWNhdGlvbicsXG4gICAgICAgIHZhbHVlOiAnY2xlYXItYXV0aCcsXG4gICAgICB9KVxuICAgIH1cblxuICAgIGlmICghaXNFZmZlY3RpdmVseUF1dGhlbnRpY2F0ZWQpIHtcbiAgICAgIG1lbnVPcHRpb25zLnB1c2goe1xuICAgICAgICBsYWJlbDogJ0F1dGhlbnRpY2F0ZScsXG4gICAgICAgIHZhbHVlOiAnYXV0aCcsXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIGlmIChzZXJ2ZXIuY2xpZW50LnR5cGUgIT09ICdkaXNhYmxlZCcpIHtcbiAgICBpZiAoc2VydmVyLmNsaWVudC50eXBlICE9PSAnbmVlZHMtYXV0aCcpIHtcbiAgICAgIG1lbnVPcHRpb25zLnB1c2goe1xuICAgICAgICBsYWJlbDogJ1JlY29ubmVjdCcsXG4gICAgICAgIHZhbHVlOiAncmVjb25uZWN0TWNwU2VydmVyJyxcbiAgICAgIH0pXG4gICAgfVxuICAgIG1lbnVPcHRpb25zLnB1c2goe1xuICAgICAgbGFiZWw6ICdEaXNhYmxlJyxcbiAgICAgIHZhbHVlOiAndG9nZ2xlLWVuYWJsZWQnLFxuICAgIH0pXG4gIH1cblxuICAvLyBJZiB0aGVyZSBhcmUgbm8gb3RoZXIgb3B0aW9ucywgYWRkIGEgYmFjayBvcHRpb24gc28gU2VsZWN0IGhhbmRsZXMgZXNjYXBlXG4gIGlmIChtZW51T3B0aW9ucy5sZW5ndGggPT09IDApIHtcbiAgICBtZW51T3B0aW9ucy5wdXNoKHtcbiAgICAgIGxhYmVsOiAnQmFjaycsXG4gICAgICB2YWx1ZTogJ2JhY2snLFxuICAgIH0pXG4gIH1cblxuICByZXR1cm4gKFxuICAgIDxCb3ggZmxleERpcmVjdGlvbj1cImNvbHVtblwiPlxuICAgICAgPEJveFxuICAgICAgICBmbGV4RGlyZWN0aW9uPVwiY29sdW1uXCJcbiAgICAgICAgcGFkZGluZ1g9ezF9XG4gICAgICAgIGJvcmRlclN0eWxlPXtib3JkZXJsZXNzID8gdW5kZWZpbmVkIDogJ3JvdW5kJ31cbiAgICAgID5cbiAgICAgICAgPEJveCBtYXJnaW5Cb3R0b209ezF9PlxuICAgICAgICAgIDxUZXh0IGJvbGQ+e2NhcGl0YWxpemVkU2VydmVyTmFtZX0gTUNQIFNlcnZlcjwvVGV4dD5cbiAgICAgICAgPC9Cb3g+XG5cbiAgICAgICAgPEJveCBmbGV4RGlyZWN0aW9uPVwiY29sdW1uXCIgZ2FwPXswfT5cbiAgICAgICAgICA8Qm94PlxuICAgICAgICAgICAgPFRleHQgYm9sZD5TdGF0dXM6IDwvVGV4dD5cbiAgICAgICAgICAgIHtzZXJ2ZXIuY2xpZW50LnR5cGUgPT09ICdkaXNhYmxlZCcgPyAoXG4gICAgICAgICAgICAgIDxUZXh0Pntjb2xvcignaW5hY3RpdmUnLCB0aGVtZSkoZmlndXJlcy5yYWRpb09mZil9IGRpc2FibGVkPC9UZXh0PlxuICAgICAgICAgICAgKSA6IHNlcnZlci5jbGllbnQudHlwZSA9PT0gJ2Nvbm5lY3RlZCcgPyAoXG4gICAgICAgICAgICAgIDxUZXh0Pntjb2xvcignc3VjY2VzcycsIHRoZW1lKShmaWd1cmVzLnRpY2spfSBjb25uZWN0ZWQ8L1RleHQ+XG4gICAgICAgICAgICApIDogc2VydmVyLmNsaWVudC50eXBlID09PSAncGVuZGluZycgPyAoXG4gICAgICAgICAgICAgIDw+XG4gICAgICAgICAgICAgICAgPFRleHQgZGltQ29sb3I+e2ZpZ3VyZXMucmFkaW9PZmZ9PC9UZXh0PlxuICAgICAgICAgICAgICAgIDxUZXh0PiBjb25uZWN0aW5n4oCmPC9UZXh0PlxuICAgICAgICAgICAgICA8Lz5cbiAgICAgICAgICAgICkgOiBzZXJ2ZXIuY2xpZW50LnR5cGUgPT09ICduZWVkcy1hdXRoJyA/IChcbiAgICAgICAgICAgICAgPFRleHQ+XG4gICAgICAgICAgICAgICAge2NvbG9yKCd3YXJuaW5nJywgdGhlbWUpKGZpZ3VyZXMudHJpYW5nbGVVcE91dGxpbmUpfSBuZWVkc1xuICAgICAgICAgICAgICAgIGF1dGhlbnRpY2F0aW9uXG4gICAgICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICAgIDxUZXh0Pntjb2xvcignZXJyb3InLCB0aGVtZSkoZmlndXJlcy5jcm9zcyl9IGZhaWxlZDwvVGV4dD5cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgPC9Cb3g+XG5cbiAgICAgICAgICB7c2VydmVyLnRyYW5zcG9ydCAhPT0gJ2NsYXVkZWFpLXByb3h5JyAmJiAoXG4gICAgICAgICAgICA8Qm94PlxuICAgICAgICAgICAgICA8VGV4dCBib2xkPkF1dGg6IDwvVGV4dD5cbiAgICAgICAgICAgICAge2lzRWZmZWN0aXZlbHlBdXRoZW50aWNhdGVkID8gKFxuICAgICAgICAgICAgICAgIDxUZXh0PlxuICAgICAgICAgICAgICAgICAge2NvbG9yKCdzdWNjZXNzJywgdGhlbWUpKGZpZ3VyZXMudGljayl9IGF1dGhlbnRpY2F0ZWRcbiAgICAgICAgICAgICAgICA8L1RleHQ+XG4gICAgICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICAgICAgPFRleHQ+XG4gICAgICAgICAgICAgICAgICB7Y29sb3IoJ2Vycm9yJywgdGhlbWUpKGZpZ3VyZXMuY3Jvc3MpfSBub3QgYXV0aGVudGljYXRlZFxuICAgICAgICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgIDwvQm94PlxuICAgICAgICAgICl9XG5cbiAgICAgICAgICA8Qm94PlxuICAgICAgICAgICAgPFRleHQgYm9sZD5VUkw6IDwvVGV4dD5cbiAgICAgICAgICAgIDxUZXh0IGRpbUNvbG9yPntzZXJ2ZXIuY29uZmlnLnVybH08L1RleHQ+XG4gICAgICAgICAgPC9Cb3g+XG5cbiAgICAgICAgICA8Qm94PlxuICAgICAgICAgICAgPFRleHQgYm9sZD5Db25maWcgbG9jYXRpb246IDwvVGV4dD5cbiAgICAgICAgICAgIDxUZXh0IGRpbUNvbG9yPntkZXNjcmliZU1jcENvbmZpZ0ZpbGVQYXRoKHNlcnZlci5zY29wZSl9PC9UZXh0PlxuICAgICAgICAgIDwvQm94PlxuXG4gICAgICAgICAge3NlcnZlci5jbGllbnQudHlwZSA9PT0gJ2Nvbm5lY3RlZCcgJiYgKFxuICAgICAgICAgICAgPENhcGFiaWxpdGllc1NlY3Rpb25cbiAgICAgICAgICAgICAgc2VydmVyVG9vbHNDb3VudD17c2VydmVyVG9vbHNDb3VudH1cbiAgICAgICAgICAgICAgc2VydmVyUHJvbXB0c0NvdW50PXtzZXJ2ZXJDb21tYW5kc0NvdW50fVxuICAgICAgICAgICAgICBzZXJ2ZXJSZXNvdXJjZXNDb3VudD17bWNwLnJlc291cmNlc1tzZXJ2ZXIubmFtZV0/Lmxlbmd0aCB8fCAwfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICApfVxuXG4gICAgICAgICAge3NlcnZlci5jbGllbnQudHlwZSA9PT0gJ2Nvbm5lY3RlZCcgJiYgc2VydmVyVG9vbHNDb3VudCA+IDAgJiYgKFxuICAgICAgICAgICAgPEJveD5cbiAgICAgICAgICAgICAgPFRleHQgYm9sZD5Ub29sczogPC9UZXh0PlxuICAgICAgICAgICAgICA8VGV4dCBkaW1Db2xvcj57c2VydmVyVG9vbHNDb3VudH0gdG9vbHM8L1RleHQ+XG4gICAgICAgICAgICA8L0JveD5cbiAgICAgICAgICApfVxuICAgICAgICA8L0JveD5cblxuICAgICAgICB7ZXJyb3IgJiYgKFxuICAgICAgICAgIDxCb3ggbWFyZ2luVG9wPXsxfT5cbiAgICAgICAgICAgIDxUZXh0IGNvbG9yPVwiZXJyb3JcIj5FcnJvcjoge2Vycm9yfTwvVGV4dD5cbiAgICAgICAgICA8L0JveD5cbiAgICAgICAgKX1cblxuICAgICAgICB7bWVudU9wdGlvbnMubGVuZ3RoID4gMCAmJiAoXG4gICAgICAgICAgPEJveCBtYXJnaW5Ub3A9ezF9PlxuICAgICAgICAgICAgPFNlbGVjdFxuICAgICAgICAgICAgICBvcHRpb25zPXttZW51T3B0aW9uc31cbiAgICAgICAgICAgICAgb25DaGFuZ2U9e2FzeW5jIHZhbHVlID0+IHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICBjYXNlICd0b29scyc6XG4gICAgICAgICAgICAgICAgICAgIG9uVmlld1Rvb2xzKClcbiAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICAgIGNhc2UgJ2F1dGgnOlxuICAgICAgICAgICAgICAgICAgY2FzZSAncmVhdXRoJzpcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgaGFuZGxlQXV0aGVudGljYXRlKClcbiAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICAgIGNhc2UgJ2NsZWFyLWF1dGgnOlxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBoYW5kbGVDbGVhckF1dGgoKVxuICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgICAgY2FzZSAnY2xhdWRlYWktYXV0aCc6XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGhhbmRsZUNsYXVkZUFJQXV0aCgpXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgICBjYXNlICdjbGF1ZGVhaS1jbGVhci1hdXRoJzpcbiAgICAgICAgICAgICAgICAgICAgaGFuZGxlQ2xhdWRlQUlDbGVhckF1dGgoKVxuICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgICAgY2FzZSAncmVjb25uZWN0TWNwU2VydmVyJzpcbiAgICAgICAgICAgICAgICAgICAgc2V0SXNSZWNvbm5lY3RpbmcodHJ1ZSlcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZWNvbm5lY3RNY3BTZXJ2ZXIoc2VydmVyLm5hbWUpXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKHNlcnZlci5jb25maWcudHlwZSA9PT0gJ2NsYXVkZWFpLXByb3h5Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nRXZlbnQoJ3Rlbmd1X2NsYXVkZWFpX21jcF9yZWNvbm5lY3QnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IHJlc3VsdC5jbGllbnQudHlwZSA9PT0gJ2Nvbm5lY3RlZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7IG1lc3NhZ2UgfSA9IGhhbmRsZVJlY29ubmVjdFJlc3VsdChcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlci5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICBvbkNvbXBsZXRlPy4obWVzc2FnZSlcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKHNlcnZlci5jb25maWcudHlwZSA9PT0gJ2NsYXVkZWFpLXByb3h5Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nRXZlbnQoJ3Rlbmd1X2NsYXVkZWFpX21jcF9yZWNvbm5lY3QnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgb25Db21wbGV0ZT8uKGhhbmRsZVJlY29ubmVjdEVycm9yKGVyciwgc2VydmVyLm5hbWUpKVxuICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICAgIHNldElzUmVjb25uZWN0aW5nKGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgICBjYXNlICd0b2dnbGUtZW5hYmxlZCc6XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGhhbmRsZVRvZ2dsZUVuYWJsZWQoKVxuICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgICAgY2FzZSAnYmFjayc6XG4gICAgICAgICAgICAgICAgICAgIG9uQ2FuY2VsKClcbiAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgIG9uQ2FuY2VsPXtvbkNhbmNlbH1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9Cb3g+XG4gICAgICAgICl9XG4gICAgICA8L0JveD5cblxuICAgICAgPEJveCBtYXJnaW5Ub3A9ezF9PlxuICAgICAgICA8VGV4dCBkaW1Db2xvciBpdGFsaWM+XG4gICAgICAgICAge2V4aXRTdGF0ZS5wZW5kaW5nID8gKFxuICAgICAgICAgICAgPD5QcmVzcyB7ZXhpdFN0YXRlLmtleU5hbWV9IGFnYWluIHRvIGV4aXQ8Lz5cbiAgICAgICAgICApIDogKFxuICAgICAgICAgICAgPEJ5bGluZT5cbiAgICAgICAgICAgICAgPEtleWJvYXJkU2hvcnRjdXRIaW50IHNob3J0Y3V0PVwi4oaR4oaTXCIgYWN0aW9uPVwibmF2aWdhdGVcIiAvPlxuICAgICAgICAgICAgICA8S2V5Ym9hcmRTaG9ydGN1dEhpbnQgc2hvcnRjdXQ9XCJFbnRlclwiIGFjdGlvbj1cInNlbGVjdFwiIC8+XG4gICAgICAgICAgICAgIDxDb25maWd1cmFibGVTaG9ydGN1dEhpbnRcbiAgICAgICAgICAgICAgICBhY3Rpb249XCJjb25maXJtOm5vXCJcbiAgICAgICAgICAgICAgICBjb250ZXh0PVwiQ29uZmlybWF0aW9uXCJcbiAgICAgICAgICAgICAgICBmYWxsYmFjaz1cIkVzY1wiXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb249XCJiYWNrXCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvQnlsaW5lPlxuICAgICAgICAgICl9XG4gICAgICAgIDwvVGV4dD5cbiAgICAgIDwvQm94PlxuICAgIDwvQm94PlxuICApXG59XG4iXSwibWFwcGluZ3MiOiJBQUFBLE9BQU9BLE9BQU8sTUFBTSxTQUFTO0FB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
\ No newline at end of file
diff --git a/src/components/mcp/MCPStdioServerMenu.tsx b/src/components/mcp/MCPStdioServerMenu.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..b595103167404aaa9869073beab178bb480c5fdf
--- /dev/null
+++ b/src/components/mcp/MCPStdioServerMenu.tsx
@@ -0,0 +1,177 @@
+import figures from 'figures';
+import React, { useState } from 'react';
+import type { CommandResultDisplay } from '../../commands.js';
+import { useExitOnCtrlCDWithKeybindings } from '../../hooks/useExitOnCtrlCDWithKeybindings.js';
+import { Box, color, Text, useTheme } from '../../ink.js';
+import { getMcpConfigByName } from '../../services/mcp/config.js';
+import { useMcpReconnect, useMcpToggleEnabled } from '../../services/mcp/MCPConnectionManager.js';
+import { describeMcpConfigFilePath, filterMcpPromptsByServer } from '../../services/mcp/utils.js';
+import { useAppState } from '../../state/AppState.js';
+import { errorMessage } from '../../utils/errors.js';
+import { capitalize } from '../../utils/stringUtils.js';
+import { ConfigurableShortcutHint } from '../ConfigurableShortcutHint.js';
+import { Select } from '../CustomSelect/index.js';
+import { Byline } from '../design-system/Byline.js';
+import { KeyboardShortcutHint } from '../design-system/KeyboardShortcutHint.js';
+import { Spinner } from '../Spinner.js';
+import { CapabilitiesSection } from './CapabilitiesSection.js';
+import type { StdioServerInfo } from './types.js';
+import { handleReconnectError, handleReconnectResult } from './utils/reconnectHelpers.js';
+type Props = {
+ server: StdioServerInfo;
+ serverToolsCount: number;
+ onViewTools: () => void;
+ onCancel: () => void;
+ onComplete: (result?: string, options?: {
+ display?: CommandResultDisplay;
+ }) => void;
+ borderless?: boolean;
+};
+export function MCPStdioServerMenu({
+ server,
+ serverToolsCount,
+ onViewTools,
+ onCancel,
+ onComplete,
+ borderless = false
+}: Props): React.ReactNode {
+ const [theme] = useTheme();
+ const exitState = useExitOnCtrlCDWithKeybindings();
+ const mcp = useAppState(s => s.mcp);
+ const reconnectMcpServer = useMcpReconnect();
+ const toggleMcpServer = useMcpToggleEnabled();
+ const [isReconnecting, setIsReconnecting] = useState(false);
+ const handleToggleEnabled = React.useCallback(async () => {
+ const wasEnabled = server.client.type !== 'disabled';
+ try {
+ await toggleMcpServer(server.name);
+ // Return to the server list so user can continue managing other servers
+ onCancel();
+ } catch (err) {
+ const action = wasEnabled ? 'disable' : 'enable';
+ onComplete(`Failed to ${action} MCP server '${server.name}': ${errorMessage(err)}`);
+ }
+ }, [server.client.type, server.name, toggleMcpServer, onCancel, onComplete]);
+ const capitalizedServerName = capitalize(String(server.name));
+
+ // Count MCP prompts for this server (skills are shown in /skills, not here)
+ const serverCommandsCount = filterMcpPromptsByServer(mcp.commands, server.name).length;
+ const menuOptions = [];
+
+ // Only show "View tools" if server is not disabled and has tools
+ if (server.client.type !== 'disabled' && serverToolsCount > 0) {
+ menuOptions.push({
+ label: 'View tools',
+ value: 'tools'
+ });
+ }
+
+ // Only show reconnect option if the server is not disabled
+ if (server.client.type !== 'disabled') {
+ menuOptions.push({
+ label: 'Reconnect',
+ value: 'reconnectMcpServer'
+ });
+ }
+ menuOptions.push({
+ label: server.client.type !== 'disabled' ? 'Disable' : 'Enable',
+ value: 'toggle-enabled'
+ });
+
+ // If there are no other options, add a back option so Select handles escape
+ if (menuOptions.length === 0) {
+ menuOptions.push({
+ label: 'Back',
+ value: 'back'
+ });
+ }
+ if (isReconnecting) {
+ return
+
+ Reconnecting to {server.name}
+
+
+
+ Restarting MCP server process
+
+ This may take a few moments.
+ ;
+ }
+ return
+
+
+ {capitalizedServerName} MCP Server
+
+
+
+
+ Status:
+ {server.client.type === 'disabled' ? {color('inactive', theme)(figures.radioOff)} disabled : server.client.type === 'connected' ? {color('success', theme)(figures.tick)} connected : server.client.type === 'pending' ? <>
+ {figures.radioOff}
+ connecting…
+ > : {color('error', theme)(figures.cross)} failed}
+
+
+
+ Command:
+ {server.config.command}
+
+
+ {server.config.args && server.config.args.length > 0 &&
+ Args:
+ {server.config.args.join(' ')}
+ }
+
+
+ Config location:
+
+ {describeMcpConfigFilePath(getMcpConfigByName(server.name)?.scope ?? 'dynamic')}
+
+
+
+ {server.client.type === 'connected' && }
+
+ {server.client.type === 'connected' && serverToolsCount > 0 &&
+ Tools:
+ {serverToolsCount} tools
+ }
+
+
+ {menuOptions.length > 0 &&
+ }
+
+
+
+
+ {exitState.pending ? <>Press {exitState.keyName} again to exit> :
+
+
+
+ }
+
+
+ ;
+}
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJmaWd1cmVzIiwiUmVhY3QiLCJ1c2VTdGF0ZSIsIkNvbW1hbmRSZXN1bHREaXNwbGF5IiwidXNlRXhpdE9uQ3RybENEV2l0aEtleWJpbmRpbmdzIiwiQm94IiwiY29sb3IiLCJUZXh0IiwidXNlVGhlbWUiLCJnZXRNY3BDb25maWdCeU5hbWUiLCJ1c2VNY3BSZWNvbm5lY3QiLCJ1c2VNY3BUb2dnbGVFbmFibGVkIiwiZGVzY3JpYmVNY3BDb25maWdGaWxlUGF0aCIsImZpbHRlck1jcFByb21wdHNCeVNlcnZlciIsInVzZUFwcFN0YXRlIiwiZXJyb3JNZXNzYWdlIiwiY2FwaXRhbGl6ZSIsIkNvbmZpZ3VyYWJsZVNob3J0Y3V0SGludCIsIlNlbGVjdCIsIkJ5bGluZSIsIktleWJvYXJkU2hvcnRjdXRIaW50IiwiU3Bpbm5lciIsIkNhcGFiaWxpdGllc1NlY3Rpb24iLCJTdGRpb1NlcnZlckluZm8iLCJoYW5kbGVSZWNvbm5lY3RFcnJvciIsImhhbmRsZVJlY29ubmVjdFJlc3VsdCIsIlByb3BzIiwic2VydmVyIiwic2VydmVyVG9vbHNDb3VudCIsIm9uVmlld1Rvb2xzIiwib25DYW5jZWwiLCJvbkNvbXBsZXRlIiwicmVzdWx0Iiwib3B0aW9ucyIsImRpc3BsYXkiLCJib3JkZXJsZXNzIiwiTUNQU3RkaW9TZXJ2ZXJNZW51IiwiUmVhY3ROb2RlIiwidGhlbWUiLCJleGl0U3RhdGUiLCJtY3AiLCJzIiwicmVjb25uZWN0TWNwU2VydmVyIiwidG9nZ2xlTWNwU2VydmVyIiwiaXNSZWNvbm5lY3RpbmciLCJzZXRJc1JlY29ubmVjdGluZyIsImhhbmRsZVRvZ2dsZUVuYWJsZWQiLCJ1c2VDYWxsYmFjayIsIndhc0VuYWJsZWQiLCJjbGllbnQiLCJ0eXBlIiwibmFtZSIsImVyciIsImFjdGlvbiIsImNhcGl0YWxpemVkU2VydmVyTmFtZSIsIlN0cmluZyIsInNlcnZlckNvbW1hbmRzQ291bnQiLCJjb21tYW5kcyIsImxlbmd0aCIsIm1lbnVPcHRpb25zIiwicHVzaCIsImxhYmVsIiwidmFsdWUiLCJ1bmRlZmluZWQiLCJyYWRpb09mZiIsInRpY2siLCJjcm9zcyIsImNvbmZpZyIsImNvbW1hbmQiLCJhcmdzIiwiam9pbiIsInNjb3BlIiwicmVzb3VyY2VzIiwibWVzc2FnZSIsInBlbmRpbmciLCJrZXlOYW1lIl0sInNvdXJjZXMiOlsiTUNQU3RkaW9TZXJ2ZXJNZW51LnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZmlndXJlcyBmcm9tICdmaWd1cmVzJ1xuaW1wb3J0IFJlYWN0LCB7IHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnXG5pbXBvcnQgdHlwZSB7IENvbW1hbmRSZXN1bHREaXNwbGF5IH0gZnJvbSAnLi4vLi4vY29tbWFuZHMuanMnXG5pbXBvcnQgeyB1c2VFeGl0T25DdHJsQ0RXaXRoS2V5YmluZGluZ3MgfSBmcm9tICcuLi8uLi9ob29rcy91c2VFeGl0T25DdHJsQ0RXaXRoS2V5YmluZGluZ3MuanMnXG5pbXBvcnQgeyBCb3gsIGNvbG9yLCBUZXh0LCB1c2VUaGVtZSB9IGZyb20gJy4uLy4uL2luay5qcydcbmltcG9ydCB7IGdldE1jcENvbmZpZ0J5TmFtZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL21jcC9jb25maWcuanMnXG5pbXBvcnQge1xuICB1c2VNY3BSZWNvbm5lY3QsXG4gIHVzZU1jcFRvZ2dsZUVuYWJsZWQsXG59IGZyb20gJy4uLy4uL3NlcnZpY2VzL21jcC9NQ1BDb25uZWN0aW9uTWFuYWdlci5qcydcbmltcG9ydCB7XG4gIGRlc2NyaWJlTWNwQ29uZmlnRmlsZVBhdGgsXG4gIGZpbHRlck1jcFByb21wdHNCeVNlcnZlcixcbn0gZnJvbSAnLi4vLi4vc2VydmljZXMvbWNwL3V0aWxzLmpzJ1xuaW1wb3J0IHsgdXNlQXBwU3RhdGUgfSBmcm9tICcuLi8uLi9zdGF0ZS9BcHBTdGF0ZS5qcydcbmltcG9ydCB7IGVycm9yTWVzc2FnZSB9IGZyb20gJy4uLy4uL3V0aWxzL2Vycm9ycy5qcydcbmltcG9ydCB7IGNhcGl0YWxpemUgfSBmcm9tICcuLi8uLi91dGlscy9zdHJpbmdVdGlscy5qcydcbmltcG9ydCB7IENvbmZpZ3VyYWJsZVNob3J0Y3V0SGludCB9IGZyb20gJy4uL0NvbmZpZ3VyYWJsZVNob3J0Y3V0SGludC5qcydcbmltcG9ydCB7IFNlbGVjdCB9IGZyb20gJy4uL0N1c3RvbVNlbGVjdC9pbmRleC5qcydcbmltcG9ydCB7IEJ5bGluZSB9IGZyb20gJy4uL2Rlc2lnbi1zeXN0ZW0vQnlsaW5lLmpzJ1xuaW1wb3J0IHsgS2V5Ym9hcmRTaG9ydGN1dEhpbnQgfSBmcm9tICcuLi9kZXNpZ24tc3lzdGVtL0tleWJvYXJkU2hvcnRjdXRIaW50LmpzJ1xuaW1wb3J0IHsgU3Bpbm5lciB9IGZyb20gJy4uL1NwaW5uZXIuanMnXG5pbXBvcnQgeyBDYXBhYmlsaXRpZXNTZWN0aW9uIH0gZnJvbSAnLi9DYXBhYmlsaXRpZXNTZWN0aW9uLmpzJ1xuaW1wb3J0IHR5cGUgeyBTdGRpb1NlcnZlckluZm8gfSBmcm9tICcuL3R5cGVzLmpzJ1xuaW1wb3J0IHtcbiAgaGFuZGxlUmVjb25uZWN0RXJyb3IsXG4gIGhhbmRsZVJlY29ubmVjdFJlc3VsdCxcbn0gZnJvbSAnLi91dGlscy9yZWNvbm5lY3RIZWxwZXJzLmpzJ1xuXG50eXBlIFByb3BzID0ge1xuICBzZXJ2ZXI6IFN0ZGlvU2VydmVySW5mb1xuICBzZXJ2ZXJUb29sc0NvdW50OiBudW1iZXJcbiAgb25WaWV3VG9vbHM6ICgpID0+IHZvaWRcbiAgb25DYW5jZWw6ICgpID0+IHZvaWRcbiAgb25Db21wbGV0ZTogKFxuICAgIHJlc3VsdD86IHN0cmluZyxcbiAgICBvcHRpb25zPzogeyBkaXNwbGF5PzogQ29tbWFuZFJlc3VsdERpc3BsYXkgfSxcbiAgKSA9PiB2b2lkXG4gIGJvcmRlcmxlc3M/OiBib29sZWFuXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBNQ1BTdGRpb1NlcnZlck1lbnUoe1xuICBzZXJ2ZXIsXG4gIHNlcnZlclRvb2xzQ291bnQsXG4gIG9uVmlld1Rvb2xzLFxuICBvbkNhbmNlbCxcbiAgb25Db21wbGV0ZSxcbiAgYm9yZGVybGVzcyA9IGZhbHNlLFxufTogUHJvcHMpOiBSZWFjdC5SZWFjdE5vZGUge1xuICBjb25zdCBbdGhlbWVdID0gdXNlVGhlbWUoKVxuICBjb25zdCBleGl0U3RhdGUgPSB1c2VFeGl0T25DdHJsQ0RXaXRoS2V5YmluZGluZ3MoKVxuICBjb25zdCBtY3AgPSB1c2VBcHBTdGF0ZShzID0+IHMubWNwKVxuICBjb25zdCByZWNvbm5lY3RNY3BTZXJ2ZXIgPSB1c2VNY3BSZWNvbm5lY3QoKVxuICBjb25zdCB0b2dnbGVNY3BTZXJ2ZXIgPSB1c2VNY3BUb2dnbGVFbmFibGVkKClcbiAgY29uc3QgW2lzUmVjb25uZWN0aW5nLCBzZXRJc1JlY29ubmVjdGluZ10gPSB1c2VTdGF0ZShmYWxzZSlcblxuICBjb25zdCBoYW5kbGVUb2dnbGVFbmFibGVkID0gUmVhY3QudXNlQ2FsbGJhY2soYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHdhc0VuYWJsZWQgPSBzZXJ2ZXIuY2xpZW50LnR5cGUgIT09ICdkaXNhYmxlZCdcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0b2dnbGVNY3BTZXJ2ZXIoc2VydmVyLm5hbWUpXG4gICAgICAvLyBSZXR1cm4gdG8gdGhlIHNlcnZlciBsaXN0IHNvIHVzZXIgY2FuIGNvbnRpbnVlIG1hbmFnaW5nIG90aGVyIHNlcnZlcnNcbiAgICAgIG9uQ2FuY2VsKClcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnN0IGFjdGlvbiA9IHdhc0VuYWJsZWQgPyAnZGlzYWJsZScgOiAnZW5hYmxlJ1xuICAgICAgb25Db21wbGV0ZShcbiAgICAgICAgYEZhaWxlZCB0byAke2FjdGlvbn0gTUNQIHNlcnZlciAnJHtzZXJ2ZXIubmFtZX0nOiAke2Vycm9yTWVzc2FnZShlcnIpfWAsXG4gICAgICApXG4gICAgfVxuICB9LCBbc2VydmVyLmNsaWVudC50eXBlLCBzZXJ2ZXIubmFtZSwgdG9nZ2xlTWNwU2VydmVyLCBvbkNhbmNlbCwgb25Db21wbGV0ZV0pXG5cbiAgY29uc3QgY2FwaXRhbGl6ZWRTZXJ2ZXJOYW1lID0gY2FwaXRhbGl6ZShTdHJpbmcoc2VydmVyLm5hbWUpKVxuXG4gIC8vIENvdW50IE1DUCBwcm9tcHRzIGZvciB0aGlzIHNlcnZlciAoc2tpbGxzIGFyZSBzaG93biBpbiAvc2tpbGxzLCBub3QgaGVyZSlcbiAgY29uc3Qgc2VydmVyQ29tbWFuZHNDb3VudCA9IGZpbHRlck1jcFByb21wdHNCeVNlcnZlcihcbiAgICBtY3AuY29tbWFuZHMsXG4gICAgc2VydmVyLm5hbWUsXG4gICkubGVuZ3RoXG5cbiAgY29uc3QgbWVudU9wdGlvbnMgPSBbXVxuXG4gIC8vIE9ubHkgc2hvdyBcIlZpZXcgdG9vbHNcIiBpZiBzZXJ2ZXIgaXMgbm90IGRpc2FibGVkIGFuZCBoYXMgdG9vbHNcbiAgaWYgKHNlcnZlci5jbGllbnQudHlwZSAhPT0gJ2Rpc2FibGVkJyAmJiBzZXJ2ZXJUb29sc0NvdW50ID4gMCkge1xuICAgIG1lbnVPcHRpb25zLnB1c2goe1xuICAgICAgbGFiZWw6ICdWaWV3IHRvb2xzJyxcbiAgICAgIHZhbHVlOiAndG9vbHMnLFxuICAgIH0pXG4gIH1cblxuICAvLyBPbmx5IHNob3cgcmVjb25uZWN0IG9wdGlvbiBpZiB0aGUgc2VydmVyIGlzIG5vdCBkaXNhYmxlZFxuICBpZiAoc2VydmVyLmNsaWVudC50eXBlICE9PSAnZGlzYWJsZWQnKSB7XG4gICAgbWVudU9wdGlvbnMucHVzaCh7XG4gICAgICBsYWJlbDogJ1JlY29ubmVjdCcsXG4gICAgICB2YWx1ZTogJ3JlY29ubmVjdE1jcFNlcnZlcicsXG4gICAgfSlcbiAgfVxuXG4gIG1lbnVPcHRpb25zLnB1c2goe1xuICAgIGxhYmVsOiBzZXJ2ZXIuY2xpZW50LnR5cGUgIT09ICdkaXNhYmxlZCcgPyAnRGlzYWJsZScgOiAnRW5hYmxlJyxcbiAgICB2YWx1ZTogJ3RvZ2dsZS1lbmFibGVkJyxcbiAgfSlcblxuICAvLyBJZiB0aGVyZSBhcmUgbm8gb3RoZXIgb3B0aW9ucywgYWRkIGEgYmFjayBvcHRpb24gc28gU2VsZWN0IGhhbmRsZXMgZXNjYXBlXG4gIGlmIChtZW51T3B0aW9ucy5sZW5ndGggPT09IDApIHtcbiAgICBtZW51T3B0aW9ucy5wdXNoKHtcbiAgICAgIGxhYmVsOiAnQmFjaycsXG4gICAgICB2YWx1ZTogJ2JhY2snLFxuICAgIH0pXG4gIH1cblxuICBpZiAoaXNSZWNvbm5lY3RpbmcpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPEJveCBmbGV4RGlyZWN0aW9uPVwiY29sdW1uXCIgZ2FwPXsxfSBwYWRkaW5nPXsxfT5cbiAgICAgICAgPFRleHQgY29sb3I9XCJ0ZXh0XCI+XG4gICAgICAgICAgUmVjb25uZWN0aW5nIHRvIDxUZXh0IGJvbGQ+e3NlcnZlci5uYW1lfTwvVGV4dD5cbiAgICAgICAgPC9UZXh0PlxuICAgICAgICA8Qm94PlxuICAgICAgICAgIDxTcGlubmVyIC8+XG4gICAgICAgICAgPFRleHQ+IFJlc3RhcnRpbmcgTUNQIHNlcnZlciBwcm9jZXNzPC9UZXh0PlxuICAgICAgICA8L0JveD5cbiAgICAgICAgPFRleHQgZGltQ29sb3I+VGhpcyBtYXkgdGFrZSBhIGZldyBtb21lbnRzLjwvVGV4dD5cbiAgICAgIDwvQm94PlxuICAgIClcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPEJveCBmbGV4RGlyZWN0aW9uPVwiY29sdW1uXCI+XG4gICAgICA8Qm94XG4gICAgICAgIGZsZXhEaXJlY3Rpb249XCJjb2x1bW5cIlxuICAgICAgICBwYWRkaW5nWD17MX1cbiAgICAgICAgYm9yZGVyU3R5bGU9e2JvcmRlcmxlc3MgPyB1bmRlZmluZWQgOiAncm91bmQnfVxuICAgICAgPlxuICAgICAgICA8Qm94IG1hcmdpbkJvdHRvbT17MX0+XG4gICAgICAgICAgPFRleHQgYm9sZD57Y2FwaXRhbGl6ZWRTZXJ2ZXJOYW1lfSBNQ1AgU2VydmVyPC9UZXh0PlxuICAgICAgICA8L0JveD5cblxuICAgICAgICA8Qm94IGZsZXhEaXJlY3Rpb249XCJjb2x1bW5cIiBnYXA9ezB9PlxuICAgICAgICAgIDxCb3g+XG4gICAgICAgICAgICA8VGV4dCBib2xkPlN0YXR1czogPC9UZXh0PlxuICAgICAgICAgICAge3NlcnZlci5jbGllbnQudHlwZSA9PT0gJ2Rpc2FibGVkJyA/IChcbiAgICAgICAgICAgICAgPFRleHQ+e2NvbG9yKCdpbmFjdGl2ZScsIHRoZW1lKShmaWd1cmVzLnJhZGlvT2ZmKX0gZGlzYWJsZWQ8L1RleHQ+XG4gICAgICAgICAgICApIDogc2VydmVyLmNsaWVudC50eXBlID09PSAnY29ubmVjdGVkJyA/IChcbiAgICAgICAgICAgICAgPFRleHQ+e2NvbG9yKCdzdWNjZXNzJywgdGhlbWUpKGZpZ3VyZXMudGljayl9IGNvbm5lY3RlZDwvVGV4dD5cbiAgICAgICAgICAgICkgOiBzZXJ2ZXIuY2xpZW50LnR5cGUgPT09ICdwZW5kaW5nJyA/IChcbiAgICAgICAgICAgICAgPD5cbiAgICAgICAgICAgICAgICA8VGV4dCBkaW1Db2xvcj57ZmlndXJlcy5yYWRpb09mZn08L1RleHQ+XG4gICAgICAgICAgICAgICAgPFRleHQ+IGNvbm5lY3RpbmfigKY8L1RleHQ+XG4gICAgICAgICAgICAgIDwvPlxuICAgICAgICAgICAgKSA6IChcbiAgICAgICAgICAgICAgPFRleHQ+e2NvbG9yKCdlcnJvcicsIHRoZW1lKShmaWd1cmVzLmNyb3NzKX0gZmFpbGVkPC9UZXh0PlxuICAgICAgICAgICAgKX1cbiAgICAgICAgICA8L0JveD5cblxuICAgICAgICAgIDxCb3g+XG4gICAgICAgICAgICA8VGV4dCBib2xkPkNvbW1hbmQ6IDwvVGV4dD5cbiAgICAgICAgICAgIDxUZXh0IGRpbUNvbG9yPntzZXJ2ZXIuY29uZmlnLmNvbW1hbmR9PC9UZXh0PlxuICAgICAgICAgIDwvQm94PlxuXG4gICAgICAgICAge3NlcnZlci5jb25maWcuYXJncyAmJiBzZXJ2ZXIuY29uZmlnLmFyZ3MubGVuZ3RoID4gMCAmJiAoXG4gICAgICAgICAgICA8Qm94PlxuICAgICAgICAgICAgICA8VGV4dCBib2xkPkFyZ3M6IDwvVGV4dD5cbiAgICAgICAgICAgICAgPFRleHQgZGltQ29sb3I+e3NlcnZlci5jb25maWcuYXJncy5qb2luKCcgJyl9PC9UZXh0PlxuICAgICAgICAgICAgPC9Cb3g+XG4gICAgICAgICAgKX1cblxuICAgICAgICAgIDxCb3g+XG4gICAgICAgICAgICA8VGV4dCBib2xkPkNvbmZpZyBsb2NhdGlvbjogPC9UZXh0PlxuICAgICAgICAgICAgPFRleHQgZGltQ29sb3I+XG4gICAgICAgICAgICAgIHtkZXNjcmliZU1jcENvbmZpZ0ZpbGVQYXRoKFxuICAgICAgICAgICAgICAgIGdldE1jcENvbmZpZ0J5TmFtZShzZXJ2ZXIubmFtZSk/LnNjb3BlID8/ICdkeW5hbWljJyxcbiAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgICA8L0JveD5cblxuICAgICAgICAgIHtzZXJ2ZXIuY2xpZW50LnR5cGUgPT09ICdjb25uZWN0ZWQnICYmIChcbiAgICAgICAgICAgIDxDYXBhYmlsaXRpZXNTZWN0aW9uXG4gICAgICAgICAgICAgIHNlcnZlclRvb2xzQ291bnQ9e3NlcnZlclRvb2xzQ291bnR9XG4gICAgICAgICAgICAgIHNlcnZlclByb21wdHNDb3VudD17c2VydmVyQ29tbWFuZHNDb3VudH1cbiAgICAgICAgICAgICAgc2VydmVyUmVzb3VyY2VzQ291bnQ9e21jcC5yZXNvdXJjZXNbc2VydmVyLm5hbWVdPy5sZW5ndGggfHwgMH1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgKX1cblxuICAgICAgICAgIHtzZXJ2ZXIuY2xpZW50LnR5cGUgPT09ICdjb25uZWN0ZWQnICYmIHNlcnZlclRvb2xzQ291bnQgPiAwICYmIChcbiAgICAgICAgICAgIDxCb3g+XG4gICAgICAgICAgICAgIDxUZXh0IGJvbGQ+VG9vbHM6IDwvVGV4dD5cbiAgICAgICAgICAgICAgPFRleHQgZGltQ29sb3I+e3NlcnZlclRvb2xzQ291bnR9IHRvb2xzPC9UZXh0PlxuICAgICAgICAgICAgPC9Cb3g+XG4gICAgICAgICAgKX1cbiAgICAgICAgPC9Cb3g+XG5cbiAgICAgICAge21lbnVPcHRpb25zLmxlbmd0aCA+IDAgJiYgKFxuICAgICAgICAgIDxCb3ggbWFyZ2luVG9wPXsxfT5cbiAgICAgICAgICAgIDxTZWxlY3RcbiAgICAgICAgICAgICAgb3B0aW9ucz17bWVudU9wdGlvbnN9XG4gICAgICAgICAgICAgIG9uQ2hhbmdlPXthc3luYyB2YWx1ZSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlID09PSAndG9vbHMnKSB7XG4gICAgICAgICAgICAgICAgICBvblZpZXdUb29scygpXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gJ3JlY29ubmVjdE1jcFNlcnZlcicpIHtcbiAgICAgICAgICAgICAgICAgIHNldElzUmVjb25uZWN0aW5nKHRydWUpXG4gICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZWNvbm5lY3RNY3BTZXJ2ZXIoc2VydmVyLm5hbWUpXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgbWVzc2FnZSB9ID0gaGFuZGxlUmVjb25uZWN0UmVzdWx0KFxuICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCxcbiAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXIubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICBvbkNvbXBsZXRlPy4obWVzc2FnZSlcbiAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICBvbkNvbXBsZXRlPy4oaGFuZGxlUmVjb25uZWN0RXJyb3IoZXJyLCBzZXJ2ZXIubmFtZSkpXG4gICAgICAgICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICBzZXRJc1JlY29ubmVjdGluZyhmYWxzZSlcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID09PSAndG9nZ2xlLWVuYWJsZWQnKSB7XG4gICAgICAgICAgICAgICAgICBhd2FpdCBoYW5kbGVUb2dnbGVFbmFibGVkKClcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID09PSAnYmFjaycpIHtcbiAgICAgICAgICAgICAgICAgIG9uQ2FuY2VsKClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgIG9uQ2FuY2VsPXtvbkNhbmNlbH1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9Cb3g+XG4gICAgICAgICl9XG4gICAgICA8L0JveD5cblxuICAgICAgPEJveCBtYXJnaW5Ub3A9ezF9PlxuICAgICAgICA8VGV4dCBkaW1Db2xvciBpdGFsaWM+XG4gICAgICAgICAge2V4aXRTdGF0ZS5wZW5kaW5nID8gKFxuICAgICAgICAgICAgPD5QcmVzcyB7ZXhpdFN0YXRlLmtleU5hbWV9IGFnYWluIHRvIGV4aXQ8Lz5cbiAgICAgICAgICApIDogKFxuICAgICAgICAgICAgPEJ5bGluZT5cbiAgICAgICAgICAgICAgPEtleWJvYXJkU2hvcnRjdXRIaW50IHNob3J0Y3V0PVwi4oaR4oaTXCIgYWN0aW9uPVwibmF2aWdhdGVcIiAvPlxuICAgICAgICAgICAgICA8S2V5Ym9hcmRTaG9ydGN1dEhpbnQgc2hvcnRjdXQ9XCJFbnRlclwiIGFjdGlvbj1cInNlbGVjdFwiIC8+XG4gICAgICAgICAgICAgIDxDb25maWd1cmFibGVTaG9ydGN1dEhpbnRcbiAgICAgICAgICAgICAgICBhY3Rpb249XCJjb25maXJtOm5vXCJcbiAgICAgICAgICAgICAgICBjb250ZXh0PVwiQ29uZmlybWF0aW9uXCJcbiAgICAgICAgICAgICAgICBmYWxsYmFjaz1cIkVzY1wiXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb249XCJiYWNrXCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvQnlsaW5lPlxuICAgICAgICAgICl9XG4g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
\ No newline at end of file
diff --git a/src/components/mcp/MCPToolListView.tsx b/src/components/mcp/MCPToolListView.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..0e1e8bee6c6fd52cd22a05e50b880a42c03c844c
--- /dev/null
+++ b/src/components/mcp/MCPToolListView.tsx
@@ -0,0 +1,141 @@
+import { c as _c } from "react/compiler-runtime";
+import React from 'react';
+import { Text } from '../../ink.js';
+import { extractMcpToolDisplayName, getMcpDisplayName } from '../../services/mcp/mcpStringUtils.js';
+import { filterToolsByServer } from '../../services/mcp/utils.js';
+import { useAppState } from '../../state/AppState.js';
+import type { Tool } from '../../Tool.js';
+import { plural } from '../../utils/stringUtils.js';
+import { ConfigurableShortcutHint } from '../ConfigurableShortcutHint.js';
+import { Select } from '../CustomSelect/index.js';
+import { Byline } from '../design-system/Byline.js';
+import { Dialog } from '../design-system/Dialog.js';
+import { KeyboardShortcutHint } from '../design-system/KeyboardShortcutHint.js';
+import type { ServerInfo } from './types.js';
+type Props = {
+ server: ServerInfo;
+ onSelectTool: (tool: Tool, index: number) => void;
+ onBack: () => void;
+};
+export function MCPToolListView(t0) {
+ const $ = _c(21);
+ const {
+ server,
+ onSelectTool,
+ onBack
+ } = t0;
+ const mcpTools = useAppState(_temp);
+ let t1;
+ bb0: {
+ if (server.client.type !== "connected") {
+ let t2;
+ if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
+ t2 = [];
+ $[0] = t2;
+ } else {
+ t2 = $[0];
+ }
+ t1 = t2;
+ break bb0;
+ }
+ let t2;
+ if ($[1] !== mcpTools || $[2] !== server.name) {
+ t2 = filterToolsByServer(mcpTools, server.name);
+ $[1] = mcpTools;
+ $[2] = server.name;
+ $[3] = t2;
+ } else {
+ t2 = $[3];
+ }
+ t1 = t2;
+ }
+ const serverTools = t1;
+ let t2;
+ if ($[4] !== server.name || $[5] !== serverTools) {
+ let t3;
+ if ($[7] !== server.name) {
+ t3 = (tool, index) => {
+ const toolName = getMcpDisplayName(tool.name, server.name);
+ const fullDisplayName = tool.userFacingName ? tool.userFacingName({}) : toolName;
+ const displayName = extractMcpToolDisplayName(fullDisplayName);
+ const isReadOnly = tool.isReadOnly?.({}) ?? false;
+ const isDestructive = tool.isDestructive?.({}) ?? false;
+ const isOpenWorld = tool.isOpenWorld?.({}) ?? false;
+ const annotations = [];
+ if (isReadOnly) {
+ annotations.push("read-only");
+ }
+ if (isDestructive) {
+ annotations.push("destructive");
+ }
+ if (isOpenWorld) {
+ annotations.push("open-world");
+ }
+ return {
+ label: displayName,
+ value: index.toString(),
+ description: annotations.length > 0 ? annotations.join(", ") : undefined,
+ descriptionColor: isDestructive ? "error" : isReadOnly ? "success" : undefined
+ };
+ };
+ $[7] = server.name;
+ $[8] = t3;
+ } else {
+ t3 = $[8];
+ }
+ t2 = serverTools.map(t3);
+ $[4] = server.name;
+ $[5] = serverTools;
+ $[6] = t2;
+ } else {
+ t2 = $[6];
+ }
+ const toolOptions = t2;
+ const t3 = `Tools for ${server.name}`;
+ const t4 = serverTools.length;
+ let t5;
+ if ($[9] !== serverTools.length) {
+ t5 = plural(serverTools.length, "tool");
+ $[9] = serverTools.length;
+ $[10] = t5;
+ } else {
+ t5 = $[10];
+ }
+ const t6 = `${t4} ${t5}`;
+ let t7;
+ if ($[11] !== onBack || $[12] !== onSelectTool || $[13] !== serverTools || $[14] !== toolOptions) {
+ t7 = serverTools.length === 0 ? No tools available :