starpacker52 commited on
Commit
a7d30a3
·
verified ·
1 Parent(s): 127dd9b

Add files using upload-large-folder tool

Browse files
This view is limited to 50 files because it contains too many changes.   See raw diff
Files changed (50) hide show
  1. src/components/DevBar.tsx +49 -0
  2. src/components/TaskListV2.tsx +378 -0
  3. src/components/agents/new-agent-creation/wizard-steps/GenerateStep.tsx +143 -0
  4. src/components/agents/new-agent-creation/wizard-steps/LocationStep.tsx +80 -0
  5. src/components/agents/new-agent-creation/wizard-steps/PromptStep.tsx +128 -0
  6. src/components/design-system/Byline.tsx +77 -0
  7. src/components/design-system/Dialog.tsx +138 -0
  8. src/components/design-system/FuzzyPicker.tsx +312 -0
  9. src/components/design-system/LoadingState.tsx +94 -0
  10. src/components/design-system/StatusIcon.tsx +95 -0
  11. src/components/design-system/Tabs.tsx +340 -0
  12. src/components/design-system/ThemedText.tsx +124 -0
  13. src/components/hooks/HooksConfigMenu.tsx +578 -0
  14. src/components/hooks/SelectHookMode.tsx +112 -0
  15. src/components/hooks/ViewHookMode.tsx +199 -0
  16. src/components/mcp/CapabilitiesSection.tsx +61 -0
  17. src/components/mcp/MCPRemoteServerMenu.tsx +0 -0
  18. src/components/mcp/MCPStdioServerMenu.tsx +177 -0
  19. src/components/mcp/MCPToolListView.tsx +141 -0
  20. src/components/mcp/index.ts +9 -0
  21. src/components/memory/MemoryUpdateNotification.tsx +45 -0
  22. src/components/messages/AdvisorMessage.tsx +158 -0
  23. src/components/messages/CollapsedReadSearchContent.tsx +484 -0
  24. src/components/messages/ShutdownMessage.tsx +132 -0
  25. src/components/messages/TaskAssignmentMessage.tsx +76 -0
  26. src/components/messages/UserChannelMessage.tsx +137 -0
  27. src/components/messages/UserResourceUpdateMessage.tsx +121 -0
  28. src/components/messages/UserToolResultMessage/RejectedToolUseMessage.tsx +16 -0
  29. src/components/messages/UserToolResultMessage/UserToolCanceledMessage.tsx +16 -0
  30. src/components/messages/UserToolResultMessage/UserToolErrorMessage.tsx +103 -0
  31. src/components/messages/UserToolResultMessage/UserToolSuccessMessage.tsx +104 -0
  32. src/components/messages/teamMemSaved.ts +19 -0
  33. src/components/permissions/AskUserQuestionPermissionRequest/PreviewQuestionView.tsx +328 -0
  34. src/components/permissions/AskUserQuestionPermissionRequest/SubmitQuestionsView.tsx +144 -0
  35. src/components/permissions/AskUserQuestionPermissionRequest/use-multiple-choice-state.ts +179 -0
  36. src/components/permissions/ExitPlanModePermissionRequest/ExitPlanModePermissionRequest.tsx +0 -0
  37. src/components/permissions/FilePermissionDialog/permissionOptions.tsx +177 -0
  38. src/components/permissions/FilePermissionDialog/usePermissionHandler.ts +185 -0
  39. src/components/permissions/PermissionDecisionDebugInfo.tsx +460 -0
  40. src/components/permissions/PermissionRuleExplanation.tsx +121 -0
  41. src/components/permissions/SedEditPermissionRequest/SedEditPermissionRequest.tsx +230 -0
  42. src/components/permissions/SkillPermissionRequest/SkillPermissionRequest.tsx +369 -0
  43. src/components/permissions/WorkerBadge.tsx +49 -0
  44. src/components/permissions/rules/PermissionRuleInput.tsx +138 -0
  45. src/components/permissions/rules/PermissionRuleList.tsx +0 -0
  46. src/components/permissions/rules/RecentDenialsTab.tsx +207 -0
  47. src/components/permissions/shellPermissionHelpers.tsx +164 -0
  48. src/constants/cyberRiskInstruction.ts +24 -0
  49. src/constants/oauth.ts +234 -0
  50. src/constants/toolLimits.ts +56 -0
src/components/DevBar.tsx ADDED
@@ -0,0 +1,49 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { c as _c } from "react/compiler-runtime";
2
+ import * as React from 'react';
3
+ import { useState } from 'react';
4
+ import { getSlowOperations } from '../bootstrap/state.js';
5
+ import { Text, useInterval } from '../ink.js';
6
+
7
+ // Show DevBar for dev builds or all ants
8
+ function shouldShowDevBar(): boolean {
9
+ return "production" === 'development' || "external" === 'ant';
10
+ }
11
+ export function DevBar() {
12
+ const $ = _c(5);
13
+ const [slowOps, setSlowOps] = useState(getSlowOperations);
14
+ let t0;
15
+ if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
16
+ t0 = () => {
17
+ setSlowOps(getSlowOperations());
18
+ };
19
+ $[0] = t0;
20
+ } else {
21
+ t0 = $[0];
22
+ }
23
+ useInterval(t0, shouldShowDevBar() ? 500 : null);
24
+ if (!shouldShowDevBar() || slowOps.length === 0) {
25
+ return null;
26
+ }
27
+ let t1;
28
+ if ($[1] !== slowOps) {
29
+ t1 = slowOps.slice(-3).map(_temp).join(" \xB7 ");
30
+ $[1] = slowOps;
31
+ $[2] = t1;
32
+ } else {
33
+ t1 = $[2];
34
+ }
35
+ const recentOps = t1;
36
+ let t2;
37
+ if ($[3] !== recentOps) {
38
+ t2 = <Text wrap="truncate-end" color="warning">[ANT-ONLY] slow sync: {recentOps}</Text>;
39
+ $[3] = recentOps;
40
+ $[4] = t2;
41
+ } else {
42
+ t2 = $[4];
43
+ }
44
+ return t2;
45
+ }
46
+ function _temp(op) {
47
+ return `${op.operation} (${Math.round(op.durationMs)}ms)`;
48
+ }
49
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsInVzZVN0YXRlIiwiZ2V0U2xvd09wZXJhdGlvbnMiLCJUZXh0IiwidXNlSW50ZXJ2YWwiLCJzaG91bGRTaG93RGV2QmFyIiwiRGV2QmFyIiwiJCIsIl9jIiwic2xvd09wcyIsInNldFNsb3dPcHMiLCJ0MCIsIlN5bWJvbCIsImZvciIsImxlbmd0aCIsInQxIiwic2xpY2UiLCJtYXAiLCJfdGVtcCIsImpvaW4iLCJyZWNlbnRPcHMiLCJ0MiIsIm9wIiwib3BlcmF0aW9uIiwiTWF0aCIsInJvdW5kIiwiZHVyYXRpb25NcyJdLCJzb3VyY2VzIjpbIkRldkJhci50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgeyB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgZ2V0U2xvd09wZXJhdGlvbnMgfSBmcm9tICcuLi9ib290c3RyYXAvc3RhdGUuanMnXG5pbXBvcnQgeyBUZXh0LCB1c2VJbnRlcnZhbCB9IGZyb20gJy4uL2luay5qcydcblxuLy8gU2hvdyBEZXZCYXIgZm9yIGRldiBidWlsZHMgb3IgYWxsIGFudHNcbmZ1bmN0aW9uIHNob3VsZFNob3dEZXZCYXIoKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgXCJwcm9kdWN0aW9uXCIgPT09ICdkZXZlbG9wbWVudCcgfHwgXCJleHRlcm5hbFwiID09PSAnYW50J1xuICApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBEZXZCYXIoKTogUmVhY3QuUmVhY3ROb2RlIHtcbiAgY29uc3QgW3Nsb3dPcHMsIHNldFNsb3dPcHNdID1cbiAgICB1c2VTdGF0ZTxcbiAgICAgIFJlYWRvbmx5QXJyYXk8e1xuICAgICAgICBvcGVyYXRpb246IHN0cmluZ1xuICAgICAgICBkdXJhdGlvbk1zOiBudW1iZXJcbiAgICAgICAgdGltZXN0YW1wOiBudW1iZXJcbiAgICAgIH0+XG4gICAgPihnZXRTbG93T3BlcmF0aW9ucylcblxuICB1c2VJbnRlcnZhbChcbiAgICAoKSA9PiB7XG4gICAgICBzZXRTbG93T3BzKGdldFNsb3dPcGVyYXRpb25zKCkpXG4gICAgfSxcbiAgICBzaG91bGRTaG93RGV2QmFyKCkgPyA1MDAgOiBudWxsLFxuICApXG5cbiAgLy8gT25seSBzaG93IHdoZW4gdGhlcmUncyBzb21ldGhpbmcgdG8gZGlzcGxheVxuICBpZiAoIXNob3VsZFNob3dEZXZCYXIoKSB8fCBzbG93T3BzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICAvLyBTaW5nbGUtbGluZSBmb3JtYXQgc28gc2hvcnQgdGVybWluYWxzIGRvbid0IGxvc2Ugcm93cyB0byBkZXYgbm9pc2UuXG4gIGNvbnN0IHJlY2VudE9wcyA9IHNsb3dPcHNcbiAgICAuc2xpY2UoLTMpXG4gICAgLm1hcChvcCA9PiBgJHtvcC5vcGVyYXRpb259ICgke01hdGgucm91bmQob3AuZHVyYXRpb25Ncyl9bXMpYClcbiAgICAuam9pbignIMK3ICcpXG5cbiAgcmV0dXJuIChcbiAgICA8VGV4dCB3cmFwPVwidHJ1bmNhdGUtZW5kXCIgY29sb3I9XCJ3YXJuaW5nXCI+XG4gICAgICBbQU5ULU9OTFldIHNsb3cgc3luYzoge3JlY2VudE9wc31cbiAgICA8L1RleHQ+XG4gIClcbn1cbiJdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sS0FBS0EsS0FBSyxNQUFNLE9BQU87QUFDOUIsU0FBU0MsUUFBUSxRQUFRLE9BQU87QUFDaEMsU0FBU0MsaUJBQWlCLFFBQVEsdUJBQXVCO0FBQ3pELFNBQVNDLElBQUksRUFBRUMsV0FBVyxRQUFRLFdBQVc7O0FBRTdDO0FBQ0EsU0FBU0MsZ0JBQWdCQSxDQUFBLENBQUUsRUFBRSxPQUFPLENBQUM7RUFDbkMsT0FDRSxZQUFZLEtBQUssYUFBYSxJQUFJLFVBQVUsS0FBSyxLQUFLO0FBRTFEO0FBRUEsT0FBTyxTQUFBQyxPQUFBO0VBQUEsTUFBQUMsQ0FBQSxHQUFBQyxFQUFBO0VBQ0wsT0FBQUMsT0FBQSxFQUFBQyxVQUFBLElBQ0VULFFBQVEsQ0FNTkMsaUJBQWlCLENBQUM7RUFBQSxJQUFBUyxFQUFBO0VBQUEsSUFBQUosQ0FBQSxRQUFBSyxNQUFBLENBQUFDLEdBQUE7SUFHcEJGLEVBQUEsR0FBQUEsQ0FBQTtNQUNFRCxVQUFVLENBQUNSLGlCQUFpQixDQUFDLENBQUMsQ0FBQztJQUFBLENBQ2hDO0lBQUFLLENBQUEsTUFBQUksRUFBQTtFQUFBO0lBQUFBLEVBQUEsR0FBQUosQ0FBQTtFQUFBO0VBSEhILFdBQVcsQ0FDVE8sRUFFQyxFQUNETixnQkFBZ0IsQ0FBYyxDQUFDLEdBQS9CLEdBQStCLEdBQS9CLElBQ0YsQ0FBQztFQUdELElBQUksQ0FBQ0EsZ0JBQWdCLENBQUMsQ0FBeUIsSUFBcEJJLE9BQU8sQ0FBQUssTUFBTyxLQUFLLENBQUM7SUFBQSxPQUN0QyxJQUFJO0VBQUE7RUFDWixJQUFBQyxFQUFBO0VBQUEsSUFBQVIsQ0FBQSxRQUFBRSxPQUFBO0lBR2lCTSxFQUFBLEdBQUFOLE9BQU8sQ0FBQU8sS0FDakIsQ0FBQyxFQUFFLENBQUMsQ0FBQUMsR0FDTixDQUFDQyxLQUF3RCxDQUFDLENBQUFDLElBQ3pELENBQUMsUUFBSyxDQUFDO0lBQUFaLENBQUEsTUFBQUUsT0FBQTtJQUFBRixDQUFBLE1BQUFRLEVBQUE7RUFBQTtJQUFBQSxFQUFBLEdBQUFSLENBQUE7RUFBQTtFQUhkLE1BQUFhLFNBQUEsR0FBa0JMLEVBR0o7RUFBQSxJQUFBTSxFQUFBO0VBQUEsSUFBQWQsQ0FBQSxRQUFBYSxTQUFBO0lBR1pDLEVBQUEsSUFBQyxJQUFJLENBQU0sSUFBYyxDQUFkLGNBQWMsQ0FBTyxLQUFTLENBQVQsU0FBUyxDQUFDLHNCQUNqQkQsVUFBUSxDQUNqQyxFQUZDLElBQUksQ0FFRTtJQUFBYixDQUFBLE1BQUFhLFNBQUE7SUFBQWIsQ0FBQSxNQUFBYyxFQUFBO0VBQUE7SUFBQUEsRUFBQSxHQUFBZCxDQUFBO0VBQUE7RUFBQSxPQUZQYyxFQUVPO0FBQUE7QUEvQkosU0FBQUgsTUFBQUksRUFBQTtFQUFBLE9BeUJRLEdBQUdBLEVBQUUsQ0FBQUMsU0FBVSxLQUFLQyxJQUFJLENBQUFDLEtBQU0sQ0FBQ0gsRUFBRSxDQUFBSSxVQUFXLENBQUMsS0FBSztBQUFBIiwiaWdub3JlTGlzdCI6W119
src/components/TaskListV2.tsx ADDED
@@ -0,0 +1,378 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { c as _c } from "react/compiler-runtime";
2
+ import figures from 'figures';
3
+ import * as React from 'react';
4
+ import { useTerminalSize } from '../hooks/useTerminalSize.js';
5
+ import { stringWidth } from '../ink/stringWidth.js';
6
+ import { Box, Text } from '../ink.js';
7
+ import { useAppState } from '../state/AppState.js';
8
+ import { isInProcessTeammateTask } from '../tasks/InProcessTeammateTask/types.js';
9
+ import { AGENT_COLOR_TO_THEME_COLOR, type AgentColorName } from '../tools/AgentTool/agentColorManager.js';
10
+ import { isAgentSwarmsEnabled } from '../utils/agentSwarmsEnabled.js';
11
+ import { count } from '../utils/array.js';
12
+ import { summarizeRecentActivities } from '../utils/collapseReadSearch.js';
13
+ import { truncateToWidth } from '../utils/format.js';
14
+ import { isTodoV2Enabled, type Task } from '../utils/tasks.js';
15
+ import type { Theme } from '../utils/theme.js';
16
+ import ThemedText from './design-system/ThemedText.js';
17
+ type Props = {
18
+ tasks: Task[];
19
+ isStandalone?: boolean;
20
+ };
21
+ const RECENT_COMPLETED_TTL_MS = 30_000;
22
+ function byIdAsc(a: Task, b: Task): number {
23
+ const aNum = parseInt(a.id, 10);
24
+ const bNum = parseInt(b.id, 10);
25
+ if (!isNaN(aNum) && !isNaN(bNum)) {
26
+ return aNum - bNum;
27
+ }
28
+ return a.id.localeCompare(b.id);
29
+ }
30
+ export function TaskListV2({
31
+ tasks,
32
+ isStandalone = false
33
+ }: Props): React.ReactNode {
34
+ const teamContext = useAppState(s => s.teamContext);
35
+ const appStateTasks = useAppState(s_0 => s_0.tasks);
36
+ const [, forceUpdate] = React.useState(0);
37
+ const {
38
+ rows,
39
+ columns
40
+ } = useTerminalSize();
41
+
42
+ // Track when each task was last observed transitioning to completed
43
+ const completionTimestampsRef = React.useRef(new Map<string, number>());
44
+ const previousCompletedIdsRef = React.useRef<Set<string> | null>(null);
45
+ if (previousCompletedIdsRef.current === null) {
46
+ previousCompletedIdsRef.current = new Set(tasks.filter(t => t.status === 'completed').map(t_0 => t_0.id));
47
+ }
48
+ const maxDisplay = rows <= 10 ? 0 : Math.min(10, Math.max(3, rows - 14));
49
+
50
+ // Update completion timestamps: reset when a task transitions to completed
51
+ const currentCompletedIds = new Set(tasks.filter(t_1 => t_1.status === 'completed').map(t_2 => t_2.id));
52
+ const now = Date.now();
53
+ for (const id of currentCompletedIds) {
54
+ if (!previousCompletedIdsRef.current.has(id)) {
55
+ completionTimestampsRef.current.set(id, now);
56
+ }
57
+ }
58
+ for (const id_0 of completionTimestampsRef.current.keys()) {
59
+ if (!currentCompletedIds.has(id_0)) {
60
+ completionTimestampsRef.current.delete(id_0);
61
+ }
62
+ }
63
+ previousCompletedIdsRef.current = currentCompletedIds;
64
+
65
+ // Schedule re-render when the next recent completion expires.
66
+ // Depend on `tasks` so the timer is only reset when the task list changes,
67
+ // not on every render (which was causing unnecessary work).
68
+ React.useEffect(() => {
69
+ if (completionTimestampsRef.current.size === 0) {
70
+ return;
71
+ }
72
+ const currentNow = Date.now();
73
+ let earliestExpiry = Infinity;
74
+ for (const ts of completionTimestampsRef.current.values()) {
75
+ const expiry = ts + RECENT_COMPLETED_TTL_MS;
76
+ if (expiry > currentNow && expiry < earliestExpiry) {
77
+ earliestExpiry = expiry;
78
+ }
79
+ }
80
+ if (earliestExpiry === Infinity) {
81
+ return;
82
+ }
83
+ const timer = setTimeout(forceUpdate_0 => forceUpdate_0((n: number) => n + 1), earliestExpiry - currentNow, forceUpdate);
84
+ return () => clearTimeout(timer);
85
+ }, [tasks]);
86
+ if (!isTodoV2Enabled()) {
87
+ return null;
88
+ }
89
+ if (tasks.length === 0) {
90
+ return null;
91
+ }
92
+
93
+ // Build a map of teammate name -> theme color
94
+ const teammateColors: Record<string, keyof Theme> = {};
95
+ if (isAgentSwarmsEnabled() && teamContext?.teammates) {
96
+ for (const teammate of Object.values(teamContext.teammates)) {
97
+ if (teammate.color) {
98
+ const themeColor = AGENT_COLOR_TO_THEME_COLOR[teammate.color as AgentColorName];
99
+ if (themeColor) {
100
+ teammateColors[teammate.name] = themeColor;
101
+ }
102
+ }
103
+ }
104
+ }
105
+
106
+ // Build a map of teammate name -> current activity description
107
+ // Map both agentName ("researcher") and agentId ("researcher@team") so
108
+ // task owners match regardless of which format the model used.
109
+ // Rolls up consecutive search/read tool uses into a compact summary.
110
+ // Also track which teammates are still running (not shut down).
111
+ const teammateActivity: Record<string, string> = {};
112
+ const activeTeammates = new Set<string>();
113
+ if (isAgentSwarmsEnabled()) {
114
+ for (const bgTask of Object.values(appStateTasks)) {
115
+ if (isInProcessTeammateTask(bgTask) && bgTask.status === 'running') {
116
+ activeTeammates.add(bgTask.identity.agentName);
117
+ activeTeammates.add(bgTask.identity.agentId);
118
+ const activities = bgTask.progress?.recentActivities;
119
+ const desc = (activities && summarizeRecentActivities(activities)) ?? bgTask.progress?.lastActivity?.activityDescription;
120
+ if (desc) {
121
+ teammateActivity[bgTask.identity.agentName] = desc;
122
+ teammateActivity[bgTask.identity.agentId] = desc;
123
+ }
124
+ }
125
+ }
126
+ }
127
+
128
+ // Get task counts for display
129
+ const completedCount = count(tasks, t_3 => t_3.status === 'completed');
130
+ const pendingCount = count(tasks, t_4 => t_4.status === 'pending');
131
+ const inProgressCount = tasks.length - completedCount - pendingCount;
132
+ // Unresolved tasks (open or in_progress) block dependent tasks
133
+ const unresolvedTaskIds = new Set(tasks.filter(t_5 => t_5.status !== 'completed').map(t_6 => t_6.id));
134
+
135
+ // Check if we need to truncate
136
+ const needsTruncation = tasks.length > maxDisplay;
137
+ let visibleTasks: Task[];
138
+ let hiddenTasks: Task[];
139
+ if (needsTruncation) {
140
+ // Prioritize: recently completed (within 30s), in-progress, pending, older completed
141
+ const recentCompleted: Task[] = [];
142
+ const olderCompleted: Task[] = [];
143
+ for (const task of tasks.filter(t_7 => t_7.status === 'completed')) {
144
+ const ts_0 = completionTimestampsRef.current.get(task.id);
145
+ if (ts_0 && now - ts_0 < RECENT_COMPLETED_TTL_MS) {
146
+ recentCompleted.push(task);
147
+ } else {
148
+ olderCompleted.push(task);
149
+ }
150
+ }
151
+ recentCompleted.sort(byIdAsc);
152
+ olderCompleted.sort(byIdAsc);
153
+ const inProgress = tasks.filter(t_8 => t_8.status === 'in_progress').sort(byIdAsc);
154
+ const pending = tasks.filter(t_9 => t_9.status === 'pending').sort((a, b) => {
155
+ const aBlocked = a.blockedBy.some(id_1 => unresolvedTaskIds.has(id_1));
156
+ const bBlocked = b.blockedBy.some(id_2 => unresolvedTaskIds.has(id_2));
157
+ if (aBlocked !== bBlocked) {
158
+ return aBlocked ? 1 : -1;
159
+ }
160
+ return byIdAsc(a, b);
161
+ });
162
+ const prioritized = [...recentCompleted, ...inProgress, ...pending, ...olderCompleted];
163
+ visibleTasks = prioritized.slice(0, maxDisplay);
164
+ hiddenTasks = prioritized.slice(maxDisplay);
165
+ } else {
166
+ // No truncation needed — sort by ID for stable ordering
167
+ visibleTasks = [...tasks].sort(byIdAsc);
168
+ hiddenTasks = [];
169
+ }
170
+ let hiddenSummary = '';
171
+ if (hiddenTasks.length > 0) {
172
+ const parts: string[] = [];
173
+ const hiddenPending = count(hiddenTasks, t_10 => t_10.status === 'pending');
174
+ const hiddenInProgress = count(hiddenTasks, t_11 => t_11.status === 'in_progress');
175
+ const hiddenCompleted = count(hiddenTasks, t_12 => t_12.status === 'completed');
176
+ if (hiddenInProgress > 0) {
177
+ parts.push(`${hiddenInProgress} in progress`);
178
+ }
179
+ if (hiddenPending > 0) {
180
+ parts.push(`${hiddenPending} pending`);
181
+ }
182
+ if (hiddenCompleted > 0) {
183
+ parts.push(`${hiddenCompleted} completed`);
184
+ }
185
+ hiddenSummary = ` … +${parts.join(', ')}`;
186
+ }
187
+ const content = <>
188
+ {visibleTasks.map(task_0 => <TaskItem key={task_0.id} task={task_0} ownerColor={task_0.owner ? teammateColors[task_0.owner] : undefined} openBlockers={task_0.blockedBy.filter(id_3 => 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} />)}
189
+ {maxDisplay > 0 && hiddenSummary && <Text dimColor>{hiddenSummary}</Text>}
190
+ </>;
191
+ if (isStandalone) {
192
+ return <Box flexDirection="column" marginTop={1} marginLeft={2}>
193
+ <Box>
194
+ <Text dimColor>
195
+ <Text bold>{tasks.length}</Text>
196
+ {' tasks ('}
197
+ <Text bold>{completedCount}</Text>
198
+ {' done, '}
199
+ {inProgressCount > 0 && <>
200
+ <Text bold>{inProgressCount}</Text>
201
+ {' in progress, '}
202
+ </>}
203
+ <Text bold>{pendingCount}</Text>
204
+ {' open)'}
205
+ </Text>
206
+ </Box>
207
+ {content}
208
+ </Box>;
209
+ }
210
+ return <Box flexDirection="column">{content}</Box>;
211
+ }
212
+ type TaskItemProps = {
213
+ task: Task;
214
+ ownerColor?: keyof Theme;
215
+ openBlockers: string[];
216
+ activity?: string;
217
+ ownerActive: boolean;
218
+ columns: number;
219
+ };
220
+ function getTaskIcon(status: Task['status']): {
221
+ icon: string;
222
+ color: keyof Theme | undefined;
223
+ } {
224
+ switch (status) {
225
+ case 'completed':
226
+ return {
227
+ icon: figures.tick,
228
+ color: 'success'
229
+ };
230
+ case 'in_progress':
231
+ return {
232
+ icon: figures.squareSmallFilled,
233
+ color: 'claude'
234
+ };
235
+ case 'pending':
236
+ return {
237
+ icon: figures.squareSmall,
238
+ color: undefined
239
+ };
240
+ }
241
+ }
242
+ function TaskItem(t0) {
243
+ const $ = _c(37);
244
+ const {
245
+ task,
246
+ ownerColor,
247
+ openBlockers,
248
+ activity,
249
+ ownerActive,
250
+ columns
251
+ } = t0;
252
+ const isCompleted = task.status === "completed";
253
+ const isInProgress = task.status === "in_progress";
254
+ const isBlocked = openBlockers.length > 0;
255
+ let t1;
256
+ if ($[0] !== task.status) {
257
+ t1 = getTaskIcon(task.status);
258
+ $[0] = task.status;
259
+ $[1] = t1;
260
+ } else {
261
+ t1 = $[1];
262
+ }
263
+ const {
264
+ icon,
265
+ color
266
+ } = t1;
267
+ const showActivity = isInProgress && !isBlocked && activity;
268
+ const showOwner = columns >= 60 && task.owner && ownerActive;
269
+ let t2;
270
+ if ($[2] !== showOwner || $[3] !== task.owner) {
271
+ t2 = showOwner ? stringWidth(` (@${task.owner})`) : 0;
272
+ $[2] = showOwner;
273
+ $[3] = task.owner;
274
+ $[4] = t2;
275
+ } else {
276
+ t2 = $[4];
277
+ }
278
+ const ownerWidth = t2;
279
+ const maxSubjectWidth = Math.max(15, columns - 15 - ownerWidth);
280
+ let t3;
281
+ if ($[5] !== maxSubjectWidth || $[6] !== task.subject) {
282
+ t3 = truncateToWidth(task.subject, maxSubjectWidth);
283
+ $[5] = maxSubjectWidth;
284
+ $[6] = task.subject;
285
+ $[7] = t3;
286
+ } else {
287
+ t3 = $[7];
288
+ }
289
+ const displaySubject = t3;
290
+ const maxActivityWidth = Math.max(15, columns - 15);
291
+ let t4;
292
+ if ($[8] !== activity || $[9] !== maxActivityWidth) {
293
+ t4 = activity ? truncateToWidth(activity, maxActivityWidth) : undefined;
294
+ $[8] = activity;
295
+ $[9] = maxActivityWidth;
296
+ $[10] = t4;
297
+ } else {
298
+ t4 = $[10];
299
+ }
300
+ const displayActivity = t4;
301
+ let t5;
302
+ if ($[11] !== color || $[12] !== icon) {
303
+ t5 = <Text color={color}>{icon} </Text>;
304
+ $[11] = color;
305
+ $[12] = icon;
306
+ $[13] = t5;
307
+ } else {
308
+ t5 = $[13];
309
+ }
310
+ const t6 = isCompleted || isBlocked;
311
+ let t7;
312
+ if ($[14] !== displaySubject || $[15] !== isCompleted || $[16] !== isInProgress || $[17] !== t6) {
313
+ t7 = <Text bold={isInProgress} strikethrough={isCompleted} dimColor={t6}>{displaySubject}</Text>;
314
+ $[14] = displaySubject;
315
+ $[15] = isCompleted;
316
+ $[16] = isInProgress;
317
+ $[17] = t6;
318
+ $[18] = t7;
319
+ } else {
320
+ t7 = $[18];
321
+ }
322
+ let t8;
323
+ if ($[19] !== ownerColor || $[20] !== showOwner || $[21] !== task.owner) {
324
+ t8 = showOwner && <Text dimColor={true}>{" ("}{ownerColor ? <ThemedText color={ownerColor}>@{task.owner}</ThemedText> : `@${task.owner}`}{")"}</Text>;
325
+ $[19] = ownerColor;
326
+ $[20] = showOwner;
327
+ $[21] = task.owner;
328
+ $[22] = t8;
329
+ } else {
330
+ t8 = $[22];
331
+ }
332
+ let t9;
333
+ if ($[23] !== isBlocked || $[24] !== openBlockers) {
334
+ t9 = isBlocked && <Text dimColor={true}>{" "}{figures.pointerSmall} blocked by{" "}{[...openBlockers].sort(_temp).map(_temp2).join(", ")}</Text>;
335
+ $[23] = isBlocked;
336
+ $[24] = openBlockers;
337
+ $[25] = t9;
338
+ } else {
339
+ t9 = $[25];
340
+ }
341
+ let t10;
342
+ if ($[26] !== t5 || $[27] !== t7 || $[28] !== t8 || $[29] !== t9) {
343
+ t10 = <Box>{t5}{t7}{t8}{t9}</Box>;
344
+ $[26] = t5;
345
+ $[27] = t7;
346
+ $[28] = t8;
347
+ $[29] = t9;
348
+ $[30] = t10;
349
+ } else {
350
+ t10 = $[30];
351
+ }
352
+ let t11;
353
+ if ($[31] !== displayActivity || $[32] !== showActivity) {
354
+ t11 = showActivity && displayActivity && <Box><Text dimColor={true}>{" "}{displayActivity}{figures.ellipsis}</Text></Box>;
355
+ $[31] = displayActivity;
356
+ $[32] = showActivity;
357
+ $[33] = t11;
358
+ } else {
359
+ t11 = $[33];
360
+ }
361
+ let t12;
362
+ if ($[34] !== t10 || $[35] !== t11) {
363
+ t12 = <Box flexDirection="column">{t10}{t11}</Box>;
364
+ $[34] = t10;
365
+ $[35] = t11;
366
+ $[36] = t12;
367
+ } else {
368
+ t12 = $[36];
369
+ }
370
+ return t12;
371
+ }
372
+ function _temp2(id) {
373
+ return `#${id}`;
374
+ }
375
+ function _temp(a, b) {
376
+ return parseInt(a, 10) - parseInt(b, 10);
377
+ }
378
+ //# 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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
src/components/agents/new-agent-creation/wizard-steps/GenerateStep.tsx ADDED
@@ -0,0 +1,143 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { APIUserAbortError } from '@anthropic-ai/sdk';
2
+ import React, { type ReactNode, useCallback, useRef, useState } from 'react';
3
+ import { useMainLoopModel } from '../../../../hooks/useMainLoopModel.js';
4
+ import { Box, Text } from '../../../../ink.js';
5
+ import { useKeybinding } from '../../../../keybindings/useKeybinding.js';
6
+ import { createAbortController } from '../../../../utils/abortController.js';
7
+ import { editPromptInEditor } from '../../../../utils/promptEditor.js';
8
+ import { ConfigurableShortcutHint } from '../../../ConfigurableShortcutHint.js';
9
+ import { Byline } from '../../../design-system/Byline.js';
10
+ import { Spinner } from '../../../Spinner.js';
11
+ import TextInput from '../../../TextInput.js';
12
+ import { useWizard } from '../../../wizard/index.js';
13
+ import { WizardDialogLayout } from '../../../wizard/WizardDialogLayout.js';
14
+ import { generateAgent } from '../../generateAgent.js';
15
+ import type { AgentWizardData } from '../types.js';
16
+ export function GenerateStep(): ReactNode {
17
+ const {
18
+ updateWizardData,
19
+ goBack,
20
+ goToStep,
21
+ wizardData
22
+ } = useWizard<AgentWizardData>();
23
+ const [prompt, setPrompt] = useState(wizardData.generationPrompt || '');
24
+ const [isGenerating, setIsGenerating] = useState(false);
25
+ const [error, setError] = useState<string | null>(null);
26
+ const [cursorOffset, setCursorOffset] = useState(prompt.length);
27
+ const model = useMainLoopModel();
28
+ const abortControllerRef = useRef<AbortController | null>(null);
29
+
30
+ // Cancel generation when escape pressed during generation
31
+ const handleCancelGeneration = useCallback(() => {
32
+ if (abortControllerRef.current) {
33
+ abortControllerRef.current.abort();
34
+ abortControllerRef.current = null;
35
+ setIsGenerating(false);
36
+ setError('Generation cancelled');
37
+ }
38
+ }, []);
39
+
40
+ // Use Settings context so 'n' key doesn't cancel (allows typing 'n' in prompt input)
41
+ useKeybinding('confirm:no', handleCancelGeneration, {
42
+ context: 'Settings',
43
+ isActive: isGenerating
44
+ });
45
+ const handleExternalEditor = useCallback(async () => {
46
+ const result = await editPromptInEditor(prompt);
47
+ if (result.content !== null) {
48
+ setPrompt(result.content);
49
+ setCursorOffset(result.content.length);
50
+ }
51
+ }, [prompt]);
52
+ useKeybinding('chat:externalEditor', handleExternalEditor, {
53
+ context: 'Chat',
54
+ isActive: !isGenerating
55
+ });
56
+
57
+ // Go back when escape pressed while not generating
58
+ const handleGoBack = useCallback(() => {
59
+ updateWizardData({
60
+ generationPrompt: '',
61
+ agentType: '',
62
+ systemPrompt: '',
63
+ whenToUse: '',
64
+ generatedAgent: undefined,
65
+ wasGenerated: false
66
+ });
67
+ setPrompt('');
68
+ setError(null);
69
+ goBack();
70
+ }, [updateWizardData, goBack]);
71
+
72
+ // Use Settings context so 'n' key doesn't cancel (allows typing 'n' in prompt input)
73
+ useKeybinding('confirm:no', handleGoBack, {
74
+ context: 'Settings',
75
+ isActive: !isGenerating
76
+ });
77
+ const handleGenerate = async (): Promise<void> => {
78
+ const trimmedPrompt = prompt.trim();
79
+ if (!trimmedPrompt) {
80
+ setError('Please describe what the agent should do');
81
+ return;
82
+ }
83
+ setError(null);
84
+ setIsGenerating(true);
85
+ updateWizardData({
86
+ generationPrompt: trimmedPrompt,
87
+ isGenerating: true
88
+ });
89
+
90
+ // Create abort controller for this generation
91
+ const controller = createAbortController();
92
+ abortControllerRef.current = controller;
93
+ try {
94
+ const generated = await generateAgent(trimmedPrompt, model, [], controller.signal);
95
+ updateWizardData({
96
+ agentType: generated.identifier,
97
+ whenToUse: generated.whenToUse,
98
+ systemPrompt: generated.systemPrompt,
99
+ generatedAgent: generated,
100
+ isGenerating: false,
101
+ wasGenerated: true
102
+ });
103
+
104
+ // Skip directly to ToolsStep (index 6) - matching original flow
105
+ goToStep(6);
106
+ } catch (err) {
107
+ // Don't show error if it was cancelled (already set in escape handler)
108
+ if (err instanceof APIUserAbortError) {
109
+ // User cancelled - no error to show
110
+ } else if (err instanceof Error && !err.message.includes('No assistant message found')) {
111
+ setError(err.message || 'Failed to generate agent');
112
+ }
113
+ updateWizardData({
114
+ isGenerating: false
115
+ });
116
+ } finally {
117
+ setIsGenerating(false);
118
+ abortControllerRef.current = null;
119
+ }
120
+ };
121
+ const subtitle = 'Describe what this agent should do and when it should be used (be comprehensive for best results)';
122
+ if (isGenerating) {
123
+ return <WizardDialogLayout subtitle={subtitle} footerText={<ConfigurableShortcutHint action="confirm:no" context="Settings" fallback="Esc" description="cancel" />}>
124
+ <Box flexDirection="row" alignItems="center">
125
+ <Spinner />
126
+ <Text color="suggestion"> Generating agent from description...</Text>
127
+ </Box>
128
+ </WizardDialogLayout>;
129
+ }
130
+ return <WizardDialogLayout subtitle={subtitle} footerText={<Byline>
131
+ <ConfigurableShortcutHint action="confirm:yes" context="Confirmation" fallback="Enter" description="submit" />
132
+ <ConfigurableShortcutHint action="chat:externalEditor" context="Chat" fallback="ctrl+g" description="open in editor" />
133
+ <ConfigurableShortcutHint action="confirm:no" context="Settings" fallback="Esc" description="go back" />
134
+ </Byline>}>
135
+ <Box flexDirection="column">
136
+ {error && <Box marginBottom={1}>
137
+ <Text color="error">{error}</Text>
138
+ </Box>}
139
+ <TextInput value={prompt} onChange={setPrompt} onSubmit={handleGenerate} placeholder="e.g., Help me write unit tests for my code..." columns={80} cursorOffset={cursorOffset} onChangeCursorOffset={setCursorOffset} focus showCursor />
140
+ </Box>
141
+ </WizardDialogLayout>;
142
+ }
143
+ //# 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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
src/components/agents/new-agent-creation/wizard-steps/LocationStep.tsx ADDED
@@ -0,0 +1,80 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { c as _c } from "react/compiler-runtime";
2
+ import React, { type ReactNode } from 'react';
3
+ import { Box } from '../../../../ink.js';
4
+ import type { SettingSource } from '../../../../utils/settings/constants.js';
5
+ import { ConfigurableShortcutHint } from '../../../ConfigurableShortcutHint.js';
6
+ import { Select } from '../../../CustomSelect/select.js';
7
+ import { Byline } from '../../../design-system/Byline.js';
8
+ import { KeyboardShortcutHint } from '../../../design-system/KeyboardShortcutHint.js';
9
+ import { useWizard } from '../../../wizard/index.js';
10
+ import { WizardDialogLayout } from '../../../wizard/WizardDialogLayout.js';
11
+ import type { AgentWizardData } from '../types.js';
12
+ export function LocationStep() {
13
+ const $ = _c(11);
14
+ const {
15
+ goNext,
16
+ updateWizardData,
17
+ cancel
18
+ } = useWizard();
19
+ let t0;
20
+ if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
21
+ t0 = {
22
+ label: "Project (.claude/agents/)",
23
+ value: "projectSettings" as SettingSource
24
+ };
25
+ $[0] = t0;
26
+ } else {
27
+ t0 = $[0];
28
+ }
29
+ let t1;
30
+ if ($[1] === Symbol.for("react.memo_cache_sentinel")) {
31
+ t1 = [t0, {
32
+ label: "Personal (~/.claude/agents/)",
33
+ value: "userSettings" as SettingSource
34
+ }];
35
+ $[1] = t1;
36
+ } else {
37
+ t1 = $[1];
38
+ }
39
+ const locationOptions = t1;
40
+ let t2;
41
+ if ($[2] === Symbol.for("react.memo_cache_sentinel")) {
42
+ t2 = <Byline><KeyboardShortcutHint shortcut={"\u2191\u2193"} action="navigate" /><KeyboardShortcutHint shortcut="Enter" action="select" /><ConfigurableShortcutHint action="confirm:no" context="Confirmation" fallback="Esc" description="cancel" /></Byline>;
43
+ $[2] = t2;
44
+ } else {
45
+ t2 = $[2];
46
+ }
47
+ let t3;
48
+ if ($[3] !== goNext || $[4] !== updateWizardData) {
49
+ t3 = value => {
50
+ updateWizardData({
51
+ location: value as SettingSource
52
+ });
53
+ goNext();
54
+ };
55
+ $[3] = goNext;
56
+ $[4] = updateWizardData;
57
+ $[5] = t3;
58
+ } else {
59
+ t3 = $[5];
60
+ }
61
+ let t4;
62
+ if ($[6] !== cancel) {
63
+ t4 = () => cancel();
64
+ $[6] = cancel;
65
+ $[7] = t4;
66
+ } else {
67
+ t4 = $[7];
68
+ }
69
+ let t5;
70
+ if ($[8] !== t3 || $[9] !== t4) {
71
+ t5 = <WizardDialogLayout subtitle="Choose location" footerText={t2}><Box><Select key="location-select" options={locationOptions} onChange={t3} onCancel={t4} /></Box></WizardDialogLayout>;
72
+ $[8] = t3;
73
+ $[9] = t4;
74
+ $[10] = t5;
75
+ } else {
76
+ t5 = $[10];
77
+ }
78
+ return t5;
79
+ }
80
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsIlJlYWN0Tm9kZSIsIkJveCIsIlNldHRpbmdTb3VyY2UiLCJDb25maWd1cmFibGVTaG9ydGN1dEhpbnQiLCJTZWxlY3QiLCJCeWxpbmUiLCJLZXlib2FyZFNob3J0Y3V0SGludCIsInVzZVdpemFyZCIsIldpemFyZERpYWxvZ0xheW91dCIsIkFnZW50V2l6YXJkRGF0YSIsIkxvY2F0aW9uU3RlcCIsIiQiLCJfYyIsImdvTmV4dCIsInVwZGF0ZVdpemFyZERhdGEiLCJjYW5jZWwiLCJ0MCIsIlN5bWJvbCIsImZvciIsImxhYmVsIiwidmFsdWUiLCJ0MSIsImxvY2F0aW9uT3B0aW9ucyIsInQyIiwidDMiLCJsb2NhdGlvbiIsInQ0IiwidDUiXSwic291cmNlcyI6WyJMb2NhdGlvblN0ZXAudHN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCwgeyB0eXBlIFJlYWN0Tm9kZSB9IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgQm94IH0gZnJvbSAnLi4vLi4vLi4vLi4vaW5rLmpzJ1xuaW1wb3J0IHR5cGUgeyBTZXR0aW5nU291cmNlIH0gZnJvbSAnLi4vLi4vLi4vLi4vdXRpbHMvc2V0dGluZ3MvY29uc3RhbnRzLmpzJ1xuaW1wb3J0IHsgQ29uZmlndXJhYmxlU2hvcnRjdXRIaW50IH0gZnJvbSAnLi4vLi4vLi4vQ29uZmlndXJhYmxlU2hvcnRjdXRIaW50LmpzJ1xuaW1wb3J0IHsgU2VsZWN0IH0gZnJvbSAnLi4vLi4vLi4vQ3VzdG9tU2VsZWN0L3NlbGVjdC5qcydcbmltcG9ydCB7IEJ5bGluZSB9IGZyb20gJy4uLy4uLy4uL2Rlc2lnbi1zeXN0ZW0vQnlsaW5lLmpzJ1xuaW1wb3J0IHsgS2V5Ym9hcmRTaG9ydGN1dEhpbnQgfSBmcm9tICcuLi8uLi8uLi9kZXNpZ24tc3lzdGVtL0tleWJvYXJkU2hvcnRjdXRIaW50LmpzJ1xuaW1wb3J0IHsgdXNlV2l6YXJkIH0gZnJvbSAnLi4vLi4vLi4vd2l6YXJkL2luZGV4LmpzJ1xuaW1wb3J0IHsgV2l6YXJkRGlhbG9nTGF5b3V0IH0gZnJvbSAnLi4vLi4vLi4vd2l6YXJkL1dpemFyZERpYWxvZ0xheW91dC5qcydcbmltcG9ydCB0eXBlIHsgQWdlbnRXaXphcmREYXRhIH0gZnJvbSAnLi4vdHlwZXMuanMnXG5cbmV4cG9ydCBmdW5jdGlvbiBMb2NhdGlvblN0ZXAoKTogUmVhY3ROb2RlIHtcbiAgY29uc3QgeyBnb05leHQsIHVwZGF0ZVdpemFyZERhdGEsIGNhbmNlbCB9ID0gdXNlV2l6YXJkPEFnZW50V2l6YXJkRGF0YT4oKVxuXG4gIGNvbnN0IGxvY2F0aW9uT3B0aW9ucyA9IFtcbiAgICB7XG4gICAgICBsYWJlbDogJ1Byb2plY3QgKC5jbGF1ZGUvYWdlbnRzLyknLFxuICAgICAgdmFsdWU6ICdwcm9qZWN0U2V0dGluZ3MnIGFzIFNldHRpbmdTb3VyY2UsXG4gICAgfSxcbiAgICB7XG4gICAgICBsYWJlbDogJ1BlcnNvbmFsICh+Ly5jbGF1ZGUvYWdlbnRzLyknLFxuICAgICAgdmFsdWU6ICd1c2VyU2V0dGluZ3MnIGFzIFNldHRpbmdTb3VyY2UsXG4gICAgfSxcbiAgXVxuXG4gIHJldHVybiAoXG4gICAgPFdpemFyZERpYWxvZ0xheW91dFxuICAgICAgc3VidGl0bGU9XCJDaG9vc2UgbG9jYXRpb25cIlxuICAgICAgZm9vdGVyVGV4dD17XG4gICAgICAgIDxCeWxpbmU+XG4gICAgICAgICAgPEtleWJvYXJkU2hvcnRjdXRIaW50IHNob3J0Y3V0PVwi4oaR4oaTXCIgYWN0aW9uPVwibmF2aWdhdGVcIiAvPlxuICAgICAgICAgIDxLZXlib2FyZFNob3J0Y3V0SGludCBzaG9ydGN1dD1cIkVudGVyXCIgYWN0aW9uPVwic2VsZWN0XCIgLz5cbiAgICAgICAgICA8Q29uZmlndXJhYmxlU2hvcnRjdXRIaW50XG4gICAgICAgICAgICBhY3Rpb249XCJjb25maXJtOm5vXCJcbiAgICAgICAgICAgIGNvbnRleHQ9XCJDb25maXJtYXRpb25cIlxuICAgICAgICAgICAgZmFsbGJhY2s9XCJFc2NcIlxuICAgICAgICAgICAgZGVzY3JpcHRpb249XCJjYW5jZWxcIlxuICAgICAgICAgIC8+XG4gICAgICAgIDwvQnlsaW5lPlxuICAgICAgfVxuICAgID5cbiAgICAgIDxCb3g+XG4gICAgICAgIDxTZWxlY3RcbiAgICAgICAgICBrZXk9XCJsb2NhdGlvbi1zZWxlY3RcIlxuICAgICAgICAgIG9wdGlvbnM9e2xvY2F0aW9uT3B0aW9uc31cbiAgICAgICAgICBvbkNoYW5nZT17KHZhbHVlOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIHVwZGF0ZVdpemFyZERhdGEoeyBsb2NhdGlvbjogdmFsdWUgYXMgU2V0dGluZ1NvdXJjZSB9KVxuICAgICAgICAgICAgZ29OZXh0KClcbiAgICAgICAgICB9fVxuICAgICAgICAgIG9uQ2FuY2VsPXsoKSA9PiBjYW5jZWwoKX1cbiAgICAgICAgLz5cbiAgICAgIDwvQm94PlxuICAgIDwvV2l6YXJkRGlhbG9nTGF5b3V0PlxuICApXG59XG4iXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPQSxLQUFLLElBQUksS0FBS0MsU0FBUyxRQUFRLE9BQU87QUFDN0MsU0FBU0MsR0FBRyxRQUFRLG9CQUFvQjtBQUN4QyxjQUFjQyxhQUFhLFFBQVEseUNBQXlDO0FBQzVFLFNBQVNDLHdCQUF3QixRQUFRLHNDQUFzQztBQUMvRSxTQUFTQyxNQUFNLFFBQVEsaUNBQWlDO0FBQ3hELFNBQVNDLE1BQU0sUUFBUSxrQ0FBa0M7QUFDekQsU0FBU0Msb0JBQW9CLFFBQVEsZ0RBQWdEO0FBQ3JGLFNBQVNDLFNBQVMsUUFBUSwwQkFBMEI7QUFDcEQsU0FBU0Msa0JBQWtCLFFBQVEsdUNBQXVDO0FBQzFFLGNBQWNDLGVBQWUsUUFBUSxhQUFhO0FBRWxELE9BQU8sU0FBQUMsYUFBQTtFQUFBLE1BQUFDLENBQUEsR0FBQUMsRUFBQTtFQUNMO0lBQUFDLE1BQUE7SUFBQUMsZ0JBQUE7SUFBQUM7RUFBQSxJQUE2Q1IsU0FBUyxDQUFrQixDQUFDO0VBQUEsSUFBQVMsRUFBQTtFQUFBLElBQUFMLENBQUEsUUFBQU0s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
src/components/agents/new-agent-creation/wizard-steps/PromptStep.tsx ADDED
@@ -0,0 +1,128 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { c as _c } from "react/compiler-runtime";
2
+ import React, { type ReactNode, useCallback, useState } from 'react';
3
+ import { Box, Text } from '../../../../ink.js';
4
+ import { useKeybinding } from '../../../../keybindings/useKeybinding.js';
5
+ import { editPromptInEditor } from '../../../../utils/promptEditor.js';
6
+ import { ConfigurableShortcutHint } from '../../../ConfigurableShortcutHint.js';
7
+ import { Byline } from '../../../design-system/Byline.js';
8
+ import { KeyboardShortcutHint } from '../../../design-system/KeyboardShortcutHint.js';
9
+ import TextInput from '../../../TextInput.js';
10
+ import { useWizard } from '../../../wizard/index.js';
11
+ import { WizardDialogLayout } from '../../../wizard/WizardDialogLayout.js';
12
+ import type { AgentWizardData } from '../types.js';
13
+ export function PromptStep() {
14
+ const $ = _c(20);
15
+ const {
16
+ goNext,
17
+ goBack,
18
+ updateWizardData,
19
+ wizardData
20
+ } = useWizard();
21
+ const [systemPrompt, setSystemPrompt] = useState(wizardData.systemPrompt || "");
22
+ const [cursorOffset, setCursorOffset] = useState(systemPrompt.length);
23
+ const [error, setError] = useState(null);
24
+ let t0;
25
+ if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
26
+ t0 = {
27
+ context: "Settings"
28
+ };
29
+ $[0] = t0;
30
+ } else {
31
+ t0 = $[0];
32
+ }
33
+ useKeybinding("confirm:no", goBack, t0);
34
+ let t1;
35
+ if ($[1] !== systemPrompt) {
36
+ t1 = async () => {
37
+ const result = await editPromptInEditor(systemPrompt);
38
+ if (result.content !== null) {
39
+ setSystemPrompt(result.content);
40
+ setCursorOffset(result.content.length);
41
+ }
42
+ };
43
+ $[1] = systemPrompt;
44
+ $[2] = t1;
45
+ } else {
46
+ t1 = $[2];
47
+ }
48
+ const handleExternalEditor = t1;
49
+ let t2;
50
+ if ($[3] === Symbol.for("react.memo_cache_sentinel")) {
51
+ t2 = {
52
+ context: "Chat"
53
+ };
54
+ $[3] = t2;
55
+ } else {
56
+ t2 = $[3];
57
+ }
58
+ useKeybinding("chat:externalEditor", handleExternalEditor, t2);
59
+ let t3;
60
+ if ($[4] !== goNext || $[5] !== systemPrompt || $[6] !== updateWizardData) {
61
+ t3 = () => {
62
+ const trimmedPrompt = systemPrompt.trim();
63
+ if (!trimmedPrompt) {
64
+ setError("System prompt is required");
65
+ return;
66
+ }
67
+ setError(null);
68
+ updateWizardData({
69
+ systemPrompt: trimmedPrompt
70
+ });
71
+ goNext();
72
+ };
73
+ $[4] = goNext;
74
+ $[5] = systemPrompt;
75
+ $[6] = updateWizardData;
76
+ $[7] = t3;
77
+ } else {
78
+ t3 = $[7];
79
+ }
80
+ const handleSubmit = t3;
81
+ let t4;
82
+ if ($[8] === Symbol.for("react.memo_cache_sentinel")) {
83
+ t4 = <Byline><KeyboardShortcutHint shortcut="Type" action="enter text" /><KeyboardShortcutHint shortcut="Enter" action="continue" /><ConfigurableShortcutHint action="chat:externalEditor" context="Chat" fallback="ctrl+g" description="open in editor" /><ConfigurableShortcutHint action="confirm:no" context="Settings" fallback="Esc" description="go back" /></Byline>;
84
+ $[8] = t4;
85
+ } else {
86
+ t4 = $[8];
87
+ }
88
+ let t5;
89
+ let t6;
90
+ if ($[9] === Symbol.for("react.memo_cache_sentinel")) {
91
+ t5 = <Text>Enter the system prompt for your agent:</Text>;
92
+ t6 = <Text dimColor={true}>Be comprehensive for best results</Text>;
93
+ $[9] = t5;
94
+ $[10] = t6;
95
+ } else {
96
+ t5 = $[9];
97
+ t6 = $[10];
98
+ }
99
+ let t7;
100
+ if ($[11] !== cursorOffset || $[12] !== handleSubmit || $[13] !== systemPrompt) {
101
+ t7 = <Box marginTop={1}><TextInput value={systemPrompt} onChange={setSystemPrompt} onSubmit={handleSubmit} placeholder="You are a helpful code reviewer who..." columns={80} cursorOffset={cursorOffset} onChangeCursorOffset={setCursorOffset} focus={true} showCursor={true} /></Box>;
102
+ $[11] = cursorOffset;
103
+ $[12] = handleSubmit;
104
+ $[13] = systemPrompt;
105
+ $[14] = t7;
106
+ } else {
107
+ t7 = $[14];
108
+ }
109
+ let t8;
110
+ if ($[15] !== error) {
111
+ t8 = error && <Box marginTop={1}><Text color="error">{error}</Text></Box>;
112
+ $[15] = error;
113
+ $[16] = t8;
114
+ } else {
115
+ t8 = $[16];
116
+ }
117
+ let t9;
118
+ if ($[17] !== t7 || $[18] !== t8) {
119
+ t9 = <WizardDialogLayout subtitle="System prompt" footerText={t4}><Box flexDirection="column">{t5}{t6}{t7}{t8}</Box></WizardDialogLayout>;
120
+ $[17] = t7;
121
+ $[18] = t8;
122
+ $[19] = t9;
123
+ } else {
124
+ t9 = $[19];
125
+ }
126
+ return t9;
127
+ }
128
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsIlJlYWN0Tm9kZSIsInVzZUNhbGxiYWNrIiwidXNlU3RhdGUiLCJCb3giLCJUZXh0IiwidXNlS2V5YmluZGluZyIsImVkaXRQcm9tcHRJbkVkaXRvciIsIkNvbmZpZ3VyYWJsZVNob3J0Y3V0SGludCIsIkJ5bGluZSIsIktleWJvYXJkU2hvcnRjdXRIaW50IiwiVGV4dElucHV0IiwidXNlV2l6YXJkIiwiV2l6YXJkRGlhbG9nTGF5b3V0IiwiQWdlbnRXaXphcmREYXRhIiwiUHJvbXB0U3RlcCIsIiQiLCJfYyIsImdvTmV4dCIsImdvQmFjayIsInVwZGF0ZVdpemFyZERhdGEiLCJ3aXphcmREYXRhIiwic3lzdGVtUHJvbXB0Iiwic2V0U3lzdGVtUHJvbXB0IiwiY3Vyc29yT2Zmc2V0Iiwic2V0Q3Vyc29yT2Zmc2V0IiwibGVuZ3RoIiwiZXJyb3IiLCJzZXRFcnJvciIsInQwIiwiU3ltYm9sIiwiZm9yIiwiY29udGV4dCIsInQxIiwicmVzdWx0IiwiY29udGVudCIsImhhbmRsZUV4dGVybmFsRWRpdG9yIiwidDIiLCJ0MyIsInRyaW1tZWRQcm9tcHQiLCJ0cmltIiwiaGFuZGxlU3VibWl0IiwidDQiLCJ0NSIsInQ2IiwidDciLCJ0OCIsInQ5Il0sInNvdXJjZXMiOlsiUHJvbXB0U3RlcC50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0LCB7IHR5cGUgUmVhY3ROb2RlLCB1c2VDYWxsYmFjaywgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCdcbmltcG9ydCB7IEJveCwgVGV4dCB9IGZyb20gJy4uLy4uLy4uLy4uL2luay5qcydcbmltcG9ydCB7IHVzZUtleWJpbmRpbmcgfSBmcm9tICcuLi8uLi8uLi8uLi9rZXliaW5kaW5ncy91c2VLZXliaW5kaW5nLmpzJ1xuaW1wb3J0IHsgZWRpdFByb21wdEluRWRpdG9yIH0gZnJvbSAnLi4vLi4vLi4vLi4vdXRpbHMvcHJvbXB0RWRpdG9yLmpzJ1xuaW1wb3J0IHsgQ29uZmlndXJhYmxlU2hvcnRjdXRIaW50IH0gZnJvbSAnLi4vLi4vLi4vQ29uZmlndXJhYmxlU2hvcnRjdXRIaW50LmpzJ1xuaW1wb3J0IHsgQnlsaW5lIH0gZnJvbSAnLi4vLi4vLi4vZGVzaWduLXN5c3RlbS9CeWxpbmUuanMnXG5pbXBvcnQgeyBLZXlib2FyZFNob3J0Y3V0SGludCB9IGZyb20gJy4uLy4uLy4uL2Rlc2lnbi1zeXN0ZW0vS2V5Ym9hcmRTaG9ydGN1dEhpbnQuanMnXG5pbXBvcnQgVGV4dElucHV0IGZyb20gJy4uLy4uLy4uL1RleHRJbnB1dC5qcydcbmltcG9ydCB7IHVzZVdpemFyZCB9IGZyb20gJy4uLy4uLy4uL3dpemFyZC9pbmRleC5qcydcbmltcG9ydCB7IFdpemFyZERpYWxvZ0xheW91dCB9IGZyb20gJy4uLy4uLy4uL3dpemFyZC9XaXphcmREaWFsb2dMYXlvdXQuanMnXG5pbXBvcnQgdHlwZSB7IEFnZW50V2l6YXJkRGF0YSB9IGZyb20gJy4uL3R5cGVzLmpzJ1xuXG5leHBvcnQgZnVuY3Rpb24gUHJvbXB0U3RlcCgpOiBSZWFjdE5vZGUge1xuICBjb25zdCB7IGdvTmV4dCwgZ29CYWNrLCB1cGRhdGVXaXphcmREYXRhLCB3aXphcmREYXRhIH0gPVxuICAgIHVzZVdpemFyZDxBZ2VudFdpemFyZERhdGE+KClcbiAgY29uc3QgW3N5c3RlbVByb21wdCwgc2V0U3lzdGVtUHJvbXB0XSA9IHVzZVN0YXRlKFxuICAgIHdpemFyZERhdGEuc3lzdGVtUHJvbXB0IHx8ICcnLFxuICApXG4gIGNvbnN0IFtjdXJzb3JPZmZzZXQsIHNldEN1cnNvck9mZnNldF0gPSB1c2VTdGF0ZShzeXN0ZW1Qcm9tcHQubGVuZ3RoKVxuICBjb25zdCBbZXJyb3IsIHNldEVycm9yXSA9IHVzZVN0YXRlPHN0cmluZyB8IG51bGw+KG51bGwpXG5cbiAgLy8gSGFuZGxlIGVzY2FwZSBrZXkgLSB1c2UgU2V0dGluZ3MgY29udGV4dCBzbyAnbicga2V5IGRvZXNuJ3QgY2FuY2VsIChhbGxvd3MgdHlwaW5nICduJyBpbiBpbnB1dClcbiAgdXNlS2V5YmluZGluZygnY29uZmlybTpubycsIGdvQmFjaywgeyBjb250ZXh0OiAnU2V0dGluZ3MnIH0pXG5cbiAgY29uc3QgaGFuZGxlRXh0ZXJuYWxFZGl0b3IgPSB1c2VDYWxsYmFjayhhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZWRpdFByb21wdEluRWRpdG9yKHN5c3RlbVByb21wdClcbiAgICBpZiAocmVzdWx0LmNvbnRlbnQgIT09IG51bGwpIHtcbiAgICAgIHNldFN5c3RlbVByb21wdChyZXN1bHQuY29udGVudClcbiAgICAgIHNldEN1cnNvck9mZnNldChyZXN1bHQuY29udGVudC5sZW5ndGgpXG4gICAgfVxuICB9LCBbc3lzdGVtUHJvbXB0XSlcblxuICB1c2VLZXliaW5kaW5nKCdjaGF0OmV4dGVybmFsRWRpdG9yJywgaGFuZGxlRXh0ZXJuYWxFZGl0b3IsIHtcbiAgICBjb250ZXh0OiAnQ2hhdCcsXG4gIH0pXG5cbiAgY29uc3QgaGFuZGxlU3VibWl0ID0gKCk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IHRyaW1tZWRQcm9tcHQgPSBzeXN0ZW1Qcm9tcHQudHJpbSgpXG4gICAgaWYgKCF0cmltbWVkUHJvbXB0KSB7XG4gICAgICBzZXRFcnJvcignU3lzdGVtIHByb21wdCBpcyByZXF1aXJlZCcpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBzZXRFcnJvcihudWxsKVxuICAgIHVwZGF0ZVdpemFyZERhdGEoeyBzeXN0ZW1Qcm9tcHQ6IHRyaW1tZWRQcm9tcHQgfSlcbiAgICBnb05leHQoKVxuICB9XG5cbiAgcmV0dXJuIChcbiAgICA8V2l6YXJkRGlhbG9nTGF5b3V0XG4gICAgICBzdWJ0aXRsZT1cIlN5c3RlbSBwcm9tcHRcIlxuICAgICAgZm9vdGVyVGV4dD17XG4gICAgICAgIDxCeWxpbmU+XG4gICAgICAgICAgPEtleWJvYXJkU2hvcnRjdXRIaW50IHNob3J0Y3V0PVwiVHlwZVwiIGFjdGlvbj1cImVudGVyIHRleHRcIiAvPlxuICAgICAgICAgIDxLZXlib2FyZFNob3J0Y3V0SGludCBzaG9ydGN1dD1cIkVudGVyXCIgYWN0aW9uPVwiY29udGludWVcIiAvPlxuICAgICAgICAgIDxDb25maWd1cmFibGVTaG9ydGN1dEhpbnRcbiAgICAgICAgICAgIGFjdGlvbj1cImNoYXQ6ZXh0ZXJuYWxFZGl0b3JcIlxuICAgICAgICAgICAgY29udGV4dD1cIkNoYXRcIlxuICAgICAgICAgICAgZmFsbGJhY2s9XCJjdHJsK2dcIlxuICAgICAgICAgICAgZGVzY3JpcHRpb249XCJvcGVuIGluIGVkaXRvclwiXG4gICAgICAgICAgLz5cbiAgICAgICAgICA8Q29uZmlndXJhYmxlU2hvcnRjdXRIaW50XG4gICAgICAgICAgICBhY3Rpb249XCJjb25maXJtOm5vXCJcbiAgICAgICAgICAgIGNvbnRleHQ9XCJTZXR0aW5nc1wiXG4gICAgICAgICAgICBmYWxsYmFjaz1cIkVzY1wiXG4gICAgICAgICAgICBkZXNjcmlwdGlvbj1cImdvIGJhY2tcIlxuICAgICAgICAgIC8+XG4gICAgICAgIDwvQnlsaW5lPlxuICAgICAgfVxuICAgID5cbiAgICAgIDxCb3ggZmxleERpcmVjdGlvbj1cImNvbHVtblwiPlxuICAgICAgICA8VGV4dD5FbnRlciB0aGUgc3lzdGVtIHByb21wdCBmb3IgeW91ciBhZ2VudDo8L1RleHQ+XG4gICAgICAgIDxUZXh0IGRpbUNvbG9yPkJlIGNvbXByZWhlbnNpdmUgZm9yIGJlc3QgcmVzdWx0czwvVGV4dD5cblxuICAgICAgICA8Qm94IG1hcmdpblRvcD17MX0+XG4gICAgICAgICAgPFRleHRJbnB1dFxuICAgICAgICAgICAgdmFsdWU9e3N5c3RlbVByb21wdH1cbiAgICAgICAgICAgIG9uQ2hhbmdlPXtzZXRTeXN0ZW1Qcm9tcHR9XG4gICAgICAgICAgICBvblN1Ym1pdD17aGFuZGxlU3VibWl0fVxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJZb3UgYXJlIGEgaGVscGZ1bCBjb2RlIHJldmlld2VyIHdoby4uLlwiXG4gICAgICAgICAgICBjb2x1bW5zPXs4MH1cbiAgICAgICAgICAgIGN1cnNvck9mZnNldD17Y3Vyc29yT2Zmc2V0fVxuICAgICAgICAgICAgb25DaGFuZ2VDdXJzb3JPZmZzZXQ9e3NldEN1cnNvck9mZnNldH1cbiAgICAgICAgICAgIGZvY3VzXG4gICAgICAgICAgICBzaG93Q3Vyc29yXG4gICAgICAgICAgLz5cbiAgICAgICAgPC9Cb3g+XG5cbiAgICAgICAge2Vycm9yICYmIChcbiAgICAgICAgICA8Qm94IG1hcmdpblRvcD17MX0+XG4gICAgICAgICAgICA8VGV4dCBjb2xvcj1cImVycm9yXCI+e2Vycm9yfTwvVGV4dD5cbiAgICAgICAgICA8L0JveD5cbiAgICAgICAgKX1cbiAgICAgIDwvQm94PlxuICAgIDwvV2l6YXJkRGlhbG9nTGF5b3V0PlxuICApXG59XG4iXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPQSxLQUFLLElBQUksS0FBS0MsU0FBUyxFQUFFQyxXQUFXLEVBQUVDLFFBQVEsUUFBUSxPQUFPO0FBQ3BFLFNBQVNDLEdBQUcsRUFBRUMsSUFBSSxRQUFRLG9CQUFvQjtBQUM5QyxTQUFTQyxhQUFhLFFBQVEsMENBQTBDO0FBQ3hFLFNBQVNDLGtCQUFrQixRQUFRLG1DQUFtQztBQUN0RSxTQUFTQyx3QkFBd0IsUUFBUSxzQ0FBc0M7QUFDL0UsU0FBU0MsTUFBTSxRQUFRLGtDQUFrQztBQUN6RCxTQUFTQyxvQkFBb0IsUUFBUSxnREFBZ0Q7QUFDckYsT0FBT0MsU0FBUyxNQUFNLHVCQUF1QjtBQUM3QyxTQUFTQyxTQUFTLFFBQVEsMEJBQTBCO0FBQ3BELFNBQVNDLGtCQUFrQixRQUFRLHVDQUF1QztBQUMxRSxjQUFjQyxlQUFlLFFBQVEsYUFBYTtBQUVsRCxPQUFPLFNBQUFDLFdBQUE7RUFBQSxNQUFBQyxDQUFBLEdBQUFDLEVBQUE7RUFDTDtJQUFBQyxNQUFBO0lBQUFDLE1BQUE7SUFBQUMsZ0JBQUE7SUFBQUM7RUFBQSxJQUNFVCxTQUFTLENBQWtCLENBQUM7RUFDOUIsT0FBQVUsWUFBQSxFQUFBQyxlQUFBLElBQXdD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
src/components/design-system/Byline.tsx ADDED
@@ -0,0 +1,77 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { c as _c } from "react/compiler-runtime";
2
+ import React, { Children, isValidElement } from 'react';
3
+ import { Text } from '../../ink.js';
4
+ type Props = {
5
+ /** The items to join with a middot separator */
6
+ children: React.ReactNode;
7
+ };
8
+
9
+ /**
10
+ * Joins children with a middot separator (" · ") for inline metadata display.
11
+ *
12
+ * Named after the publishing term "byline" - the line of metadata typically
13
+ * shown below a title (e.g., "John Doe · 5 min read · Mar 12").
14
+ *
15
+ * Automatically filters out null/undefined/false children and only renders
16
+ * separators between valid elements.
17
+ *
18
+ * @example
19
+ * // Basic usage: "Enter to confirm · Esc to cancel"
20
+ * <Text dimColor>
21
+ * <Byline>
22
+ * <KeyboardShortcutHint shortcut="Enter" action="confirm" />
23
+ * <KeyboardShortcutHint shortcut="Esc" action="cancel" />
24
+ * </Byline>
25
+ * </Text>
26
+ *
27
+ * @example
28
+ * // With conditional children: "Esc to cancel" (only one item shown)
29
+ * <Text dimColor>
30
+ * <Byline>
31
+ * {showEnter && <KeyboardShortcutHint shortcut="Enter" action="confirm" />}
32
+ * <KeyboardShortcutHint shortcut="Esc" action="cancel" />
33
+ * </Byline>
34
+ * </Text>
35
+ *
36
+ */
37
+ export function Byline(t0) {
38
+ const $ = _c(5);
39
+ const {
40
+ children
41
+ } = t0;
42
+ let t1;
43
+ let t2;
44
+ if ($[0] !== children) {
45
+ t2 = Symbol.for("react.early_return_sentinel");
46
+ bb0: {
47
+ const validChildren = Children.toArray(children);
48
+ if (validChildren.length === 0) {
49
+ t2 = null;
50
+ break bb0;
51
+ }
52
+ t1 = validChildren.map(_temp);
53
+ }
54
+ $[0] = children;
55
+ $[1] = t1;
56
+ $[2] = t2;
57
+ } else {
58
+ t1 = $[1];
59
+ t2 = $[2];
60
+ }
61
+ if (t2 !== Symbol.for("react.early_return_sentinel")) {
62
+ return t2;
63
+ }
64
+ let t3;
65
+ if ($[3] !== t1) {
66
+ t3 = <>{t1}</>;
67
+ $[3] = t1;
68
+ $[4] = t3;
69
+ } else {
70
+ t3 = $[4];
71
+ }
72
+ return t3;
73
+ }
74
+ function _temp(child, index) {
75
+ return <React.Fragment key={isValidElement(child) ? child.key ?? index : index}>{index > 0 && <Text dimColor={true}> · </Text>}{child}</React.Fragment>;
76
+ }
77
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsIkNoaWxkcmVuIiwiaXNWYWxpZEVsZW1lbnQiLCJUZXh0IiwiUHJvcHMiLCJjaGlsZHJlbiIsIlJlYWN0Tm9kZSIsIkJ5bGluZSIsInQwIiwiJCIsIl9jIiwidDEiLCJ0MiIsIlN5bWJvbCIsImZvciIsImJiMCIsInZhbGlkQ2hpbGRyZW4iLCJ0b0FycmF5IiwibGVuZ3RoIiwibWFwIiwiX3RlbXAiLCJ0MyIsImNoaWxkIiwiaW5kZXgiLCJrZXkiXSwic291cmNlcyI6WyJCeWxpbmUudHN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCwgeyBDaGlsZHJlbiwgaXNWYWxpZEVsZW1lbnQgfSBmcm9tICdyZWFjdCdcbmltcG9ydCB7IFRleHQgfSBmcm9tICcuLi8uLi9pbmsuanMnXG5cbnR5cGUgUHJvcHMgPSB7XG4gIC8qKiBUaGUgaXRlbXMgdG8gam9pbiB3aXRoIGEgbWlkZG90IHNlcGFyYXRvciAqL1xuICBjaGlsZHJlbjogUmVhY3QuUmVhY3ROb2RlXG59XG5cbi8qKlxuICogSm9pbnMgY2hpbGRyZW4gd2l0aCBhIG1pZGRvdCBzZXBhcmF0b3IgKFwiIMK3IFwiKSBmb3IgaW5saW5lIG1ldGFkYXRhIGRpc3BsYXkuXG4gKlxuICogTmFtZWQgYWZ0ZXIgdGhlIHB1Ymxpc2hpbmcgdGVybSBcImJ5bGluZVwiIC0gdGhlIGxpbmUgb2YgbWV0YWRhdGEgdHlwaWNhbGx5XG4gKiBzaG93biBiZWxvdyBhIHRpdGxlIChlLmcuLCBcIkpvaG4gRG9lIMK3IDUgbWluIHJlYWQgwrcgTWFyIDEyXCIpLlxuICpcbiAqIEF1dG9tYXRpY2FsbHkgZmlsdGVycyBvdXQgbnVsbC91bmRlZmluZWQvZmFsc2UgY2hpbGRyZW4gYW5kIG9ubHkgcmVuZGVyc1xuICogc2VwYXJhdG9ycyBiZXR3ZWVuIHZhbGlkIGVsZW1lbnRzLlxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBCYXNpYyB1c2FnZTogXCJFbnRlciB0byBjb25maXJtIMK3IEVzYyB0byBjYW5jZWxcIlxuICogPFRleHQgZGltQ29sb3I+XG4gKiAgIDxCeWxpbmU+XG4gKiAgICAgPEtleWJvYXJkU2hvcnRjdXRIaW50IHNob3J0Y3V0PVwiRW50ZXJcIiBhY3Rpb249XCJjb25maXJtXCIgLz5cbiAqICAgICA8S2V5Ym9hcmRTaG9ydGN1dEhpbnQgc2hvcnRjdXQ9XCJFc2NcIiBhY3Rpb249XCJjYW5jZWxcIiAvPlxuICogICA8L0J5bGluZT5cbiAqIDwvVGV4dD5cbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gV2l0aCBjb25kaXRpb25hbCBjaGlsZHJlbjogXCJFc2MgdG8gY2FuY2VsXCIgKG9ubHkgb25lIGl0ZW0gc2hvd24pXG4gKiA8VGV4dCBkaW1Db2xvcj5cbiAqICAgPEJ5bGluZT5cbiAqICAgICB7c2hvd0VudGVyICYmIDxLZXlib2FyZFNob3J0Y3V0SGludCBzaG9ydGN1dD1cIkVudGVyXCIgYWN0aW9uPVwiY29uZmlybVwiIC8+fVxuICogICAgIDxLZXlib2FyZFNob3J0Y3V0SGludCBzaG9ydGN1dD1cIkVzY1wiIGFjdGlvbj1cImNhbmNlbFwiIC8+XG4gKiAgIDwvQnlsaW5lPlxuICogPC9UZXh0PlxuICpcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEJ5bGluZSh7IGNoaWxkcmVuIH06IFByb3BzKTogUmVhY3QuUmVhY3ROb2RlIHtcbiAgLy8gQ2hpbGRyZW4udG9BcnJheSBhbHJlYWR5IGZpbHRlcnMgb3V0IG51bGwsIHVuZGVmaW5lZCwgYW5kIGJvb2xlYW5zXG4gIGNvbnN0IHZhbGlkQ2hpbGRyZW4gPSBDaGlsZHJlbi50b0FycmF5KGNoaWxkcmVuKVxuXG4gIGlmICh2YWxpZENoaWxkcmVuLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICByZXR1cm4gKFxuICAgIDw+XG4gICAgICB7dmFsaWRDaGlsZHJlbi5tYXAoKGNoaWxkLCBpbmRleCkgPT4gKFxuICAgICAgICA8UmVhY3QuRnJhZ21lbnRcbiAgICAgICAgICBrZXk9e2lzVmFsaWRFbGVtZW50KGNoaWxkKSA/IChjaGlsZC5rZXkgPz8gaW5kZXgpIDogaW5kZXh9XG4gICAgICAgID5cbiAgICAgICAgICB7aW5kZXggPiAwICYmIDxUZXh0IGRpbUNvbG9yPiDCtyA8L1RleHQ+fVxuICAgICAgICAgIHtjaGlsZH1cbiAgICAgICAgPC9SZWFjdC5GcmFnbWVudD5cbiAgICAgICkpfVxuICAgIDwvPlxuICApXG59XG4iXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPQSxLQUFLLElBQUlDLFFBQVEsRUFBRUMsY0FBYyxRQUFRLE9BQU87QUFDdkQsU0FBU0MsSUFBSSxRQUFRLGNBQWM7QUFFbkMsS0FBS0MsS0FBSyxHQUFHO0VBQ1g7RUFDQUMsUUFBUSxFQUFFTCxLQUFLLENBQUNNLFNBQVM7QUFDM0IsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU8sU0FBQUMsT0FBQUMsRUFBQTtFQUFBLE1BQUFDLENBQUEsR0FBQUMsRUFBQTtFQUFnQjtJQUFBTDtFQUFBLElBQUFHLEVBQW1CO0VBQUEsSUFBQUcsRUFBQTtFQUFBLElBQUFDLEVBQUE7RUFBQSxJQUFBSCxDQUFBLFFBQUFKLFFBQUE7SUFLL0JPLEVBQUEsR0FBQUMsTUFBSSxDQUFBQyxHQUFBLENBQUosNkJBQUcsQ0FBQztJQUFBQyxHQUFBO01BSGIsTUFBQUMsYUFBQSxHQUFzQmYsUUFBUSxDQUFBZ0IsT0FBUSxDQUFDWixRQUFRLENBQUM7TUFFaEQsSUFBSVcsYUFBYSxDQUFBRSxNQUFPLEtBQUssQ0FBQztRQUNyQk4sRUFBQSxPQUFJO1FBQUosTUFBQUcsR0FBQTtNQUFJO01BS1JKLEVBQUEsR0FBQUssYUFBYSxDQUFBRyxHQUFJLENBQUNDLEtBT2xCLENBQUM7SUFBQTtJQUFBWCxDQUFBLE1BQUFKLFFBQUE7SUFBQUksQ0FBQSxNQUFBRSxFQUFBO0lBQUFGLENBQUEsTUFBQUcsRUFBQTtFQUFBO0lBQUFELEVBQUEsR0FBQUYsQ0FBQTtJQUFBRyxFQUFBLEdBQUFILENBQUE7RUFBQTtFQUFBLElBQUFHLEVBQUEsS0FBQUMsTUFBQSxDQUFBQyxHQUFBO0lBQUEsT0FBQUYsRUFBQTtFQUFBO0VBQUEsSUFBQVMsRUFBQTtFQUFBLElBQUFaLENBQUEsUUFBQUUsRUFBQTtJQVJKVSxFQUFBLEtBQ0csQ0FBQVYsRUFPQSxDQUFDLEdBQ0Q7SUFBQUYsQ0FBQSxNQUFBRSxFQUFBO0lBQUFGLENBQUEsTUFBQVksRUFBQTtFQUFBO0lBQUFBLEVBQUEsR0FBQVosQ0FBQTtFQUFBO0VBQUEsT0FUSFksRUFTRztBQUFBO0FBbEJBLFNBQUFELE1BQUFFLEtBQUEsRUFBQUMsS0FBQTtFQUFBLE9BV0MsZ0JBQ08sR0FBb0QsQ0FBcEQsQ0FBQXJCLGNBQWMsQ0FBQ29CLEtBQW9DLENBQUMsR0FBM0JBLEtBQUssQ0FBQUUsR0FBYSxJQUFsQkQsS0FBMkIsR0FBcERBLEtBQW1ELENBQUMsQ0FFeEQsQ0FBQUEsS0FBSyxHQUFHLENBQThCLElBQXpCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBUixLQUFPLENBQUMsQ0FBQyxHQUFHLEVBQWpCLElBQUksQ0FBbUIsQ0FDckNELE1BQUksQ0FDUCxpQkFBaUI7QUFBQSIsImlnbm9yZUxpc3QiOltdfQ==
src/components/design-system/Dialog.tsx ADDED
@@ -0,0 +1,138 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { c as _c } from "react/compiler-runtime";
2
+ import React from 'react';
3
+ import { type ExitState, useExitOnCtrlCDWithKeybindings } from '../../hooks/useExitOnCtrlCDWithKeybindings.js';
4
+ import { Box, Text } from '../../ink.js';
5
+ import { useKeybinding } from '../../keybindings/useKeybinding.js';
6
+ import type { Theme } from '../../utils/theme.js';
7
+ import { ConfigurableShortcutHint } from '../ConfigurableShortcutHint.js';
8
+ import { Byline } from './Byline.js';
9
+ import { KeyboardShortcutHint } from './KeyboardShortcutHint.js';
10
+ import { Pane } from './Pane.js';
11
+ type DialogProps = {
12
+ title: React.ReactNode;
13
+ subtitle?: React.ReactNode;
14
+ children: React.ReactNode;
15
+ onCancel: () => void;
16
+ color?: keyof Theme;
17
+ hideInputGuide?: boolean;
18
+ hideBorder?: boolean;
19
+ /** Custom input guide content. Receives exitState for Ctrl+C/D pending display. */
20
+ inputGuide?: (exitState: ExitState) => React.ReactNode;
21
+ /**
22
+ * Controls whether Dialog's built-in confirm:no (Esc/n) and app:exit/interrupt
23
+ * (Ctrl-C/D) keybindings are active. Set to `false` while an embedded text
24
+ * field is being edited so those keys reach the field instead of being
25
+ * consumed by Dialog. TextInput has its own ctrl+c/d handlers (cancel on
26
+ * press, delete-forward on ctrl+d with text). Defaults to `true`.
27
+ */
28
+ isCancelActive?: boolean;
29
+ };
30
+ export function Dialog(t0) {
31
+ const $ = _c(27);
32
+ const {
33
+ title,
34
+ subtitle,
35
+ children,
36
+ onCancel,
37
+ color: t1,
38
+ hideInputGuide,
39
+ hideBorder,
40
+ inputGuide,
41
+ isCancelActive: t2
42
+ } = t0;
43
+ const color = t1 === undefined ? "permission" : t1;
44
+ const isCancelActive = t2 === undefined ? true : t2;
45
+ const exitState = useExitOnCtrlCDWithKeybindings(undefined, undefined, isCancelActive);
46
+ let t3;
47
+ if ($[0] !== isCancelActive) {
48
+ t3 = {
49
+ context: "Confirmation",
50
+ isActive: isCancelActive
51
+ };
52
+ $[0] = isCancelActive;
53
+ $[1] = t3;
54
+ } else {
55
+ t3 = $[1];
56
+ }
57
+ useKeybinding("confirm:no", onCancel, t3);
58
+ let t4;
59
+ if ($[2] !== exitState.keyName || $[3] !== exitState.pending) {
60
+ t4 = exitState.pending ? <Text>Press {exitState.keyName} again to exit</Text> : <Byline><KeyboardShortcutHint shortcut="Enter" action="confirm" /><ConfigurableShortcutHint action="confirm:no" context="Confirmation" fallback="Esc" description="cancel" /></Byline>;
61
+ $[2] = exitState.keyName;
62
+ $[3] = exitState.pending;
63
+ $[4] = t4;
64
+ } else {
65
+ t4 = $[4];
66
+ }
67
+ const defaultInputGuide = t4;
68
+ let t5;
69
+ if ($[5] !== color || $[6] !== title) {
70
+ t5 = <Text bold={true} color={color}>{title}</Text>;
71
+ $[5] = color;
72
+ $[6] = title;
73
+ $[7] = t5;
74
+ } else {
75
+ t5 = $[7];
76
+ }
77
+ let t6;
78
+ if ($[8] !== subtitle) {
79
+ t6 = subtitle && <Text dimColor={true}>{subtitle}</Text>;
80
+ $[8] = subtitle;
81
+ $[9] = t6;
82
+ } else {
83
+ t6 = $[9];
84
+ }
85
+ let t7;
86
+ if ($[10] !== t5 || $[11] !== t6) {
87
+ t7 = <Box flexDirection="column">{t5}{t6}</Box>;
88
+ $[10] = t5;
89
+ $[11] = t6;
90
+ $[12] = t7;
91
+ } else {
92
+ t7 = $[12];
93
+ }
94
+ let t8;
95
+ if ($[13] !== children || $[14] !== t7) {
96
+ t8 = <Box flexDirection="column" gap={1}>{t7}{children}</Box>;
97
+ $[13] = children;
98
+ $[14] = t7;
99
+ $[15] = t8;
100
+ } else {
101
+ t8 = $[15];
102
+ }
103
+ let t9;
104
+ if ($[16] !== defaultInputGuide || $[17] !== exitState || $[18] !== hideInputGuide || $[19] !== inputGuide) {
105
+ t9 = !hideInputGuide && <Box marginTop={1}><Text dimColor={true} italic={true}>{inputGuide ? inputGuide(exitState) : defaultInputGuide}</Text></Box>;
106
+ $[16] = defaultInputGuide;
107
+ $[17] = exitState;
108
+ $[18] = hideInputGuide;
109
+ $[19] = inputGuide;
110
+ $[20] = t9;
111
+ } else {
112
+ t9 = $[20];
113
+ }
114
+ let t10;
115
+ if ($[21] !== t8 || $[22] !== t9) {
116
+ t10 = <>{t8}{t9}</>;
117
+ $[21] = t8;
118
+ $[22] = t9;
119
+ $[23] = t10;
120
+ } else {
121
+ t10 = $[23];
122
+ }
123
+ const content = t10;
124
+ if (hideBorder) {
125
+ return content;
126
+ }
127
+ let t11;
128
+ if ($[24] !== color || $[25] !== content) {
129
+ t11 = <Pane color={color}>{content}</Pane>;
130
+ $[24] = color;
131
+ $[25] = content;
132
+ $[26] = t11;
133
+ } else {
134
+ t11 = $[26];
135
+ }
136
+ return t11;
137
+ }
138
+ //# 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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
src/components/design-system/FuzzyPicker.tsx ADDED
@@ -0,0 +1,312 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { c as _c } from "react/compiler-runtime";
2
+ import * as React from 'react';
3
+ import { useEffect, useState } from 'react';
4
+ import { useSearchInput } from '../../hooks/useSearchInput.js';
5
+ import { useTerminalSize } from '../../hooks/useTerminalSize.js';
6
+ import type { KeyboardEvent } from '../../ink/events/keyboard-event.js';
7
+ import { clamp } from '../../ink/layout/geometry.js';
8
+ import { Box, Text, useTerminalFocus } from '../../ink.js';
9
+ import { SearchBox } from '../SearchBox.js';
10
+ import { Byline } from './Byline.js';
11
+ import { KeyboardShortcutHint } from './KeyboardShortcutHint.js';
12
+ import { ListItem } from './ListItem.js';
13
+ import { Pane } from './Pane.js';
14
+ type PickerAction<T> = {
15
+ /** Hint label shown in the byline, e.g. "mention" → "Tab to mention". */
16
+ action: string;
17
+ handler: (item: T) => void;
18
+ };
19
+ type Props<T> = {
20
+ title: string;
21
+ placeholder?: string;
22
+ initialQuery?: string;
23
+ items: readonly T[];
24
+ getKey: (item: T) => string;
25
+ /** Keep to one line — preview handles overflow. */
26
+ renderItem: (item: T, isFocused: boolean) => React.ReactNode;
27
+ renderPreview?: (item: T) => React.ReactNode;
28
+ /** 'right' keeps hints stable (no bounce), but needs width. */
29
+ previewPosition?: 'bottom' | 'right';
30
+ visibleCount?: number;
31
+ /**
32
+ * 'up' puts items[0] at the bottom next to the input (atuin-style). Arrows
33
+ * always match screen direction — ↑ walks visually up regardless.
34
+ */
35
+ direction?: 'down' | 'up';
36
+ /** Caller owns filtering: re-filter on each call and pass new items. */
37
+ onQueryChange: (query: string) => void;
38
+ /** Enter key. Primary action. */
39
+ onSelect: (item: T) => void;
40
+ /**
41
+ * Tab key. If provided, Tab no longer aliases Enter — it gets its own
42
+ * handler and hint. Shift+Tab falls through to this if onShiftTab is unset.
43
+ */
44
+ onTab?: PickerAction<T>;
45
+ /** Shift+Tab key. Gets its own hint. */
46
+ onShiftTab?: PickerAction<T>;
47
+ /**
48
+ * Fires when the focused item changes (via arrows or when items reset).
49
+ * Useful for async preview loading — keeps I/O out of renderPreview.
50
+ */
51
+ onFocus?: (item: T | undefined) => void;
52
+ onCancel: () => void;
53
+ /** Shown when items is empty. Caller bakes loading/searching state into this. */
54
+ emptyMessage?: string | ((query: string) => string);
55
+ /**
56
+ * Status line below the list, e.g. "500+ matches" or "42 matches…".
57
+ * Caller decides when to show it — pass undefined to hide.
58
+ */
59
+ matchLabel?: string;
60
+ selectAction?: string;
61
+ extraHints?: React.ReactNode;
62
+ };
63
+ const DEFAULT_VISIBLE = 8;
64
+ // Pane (paddingTop + Divider) + title + 3 gaps + SearchBox (rounded border = 3
65
+ // rows) + hints. matchLabel adds +1 when present, accounted for separately.
66
+ const CHROME_ROWS = 10;
67
+ const MIN_VISIBLE = 2;
68
+ export function FuzzyPicker<T>({
69
+ title,
70
+ placeholder = 'Type to search…',
71
+ initialQuery,
72
+ items,
73
+ getKey,
74
+ renderItem,
75
+ renderPreview,
76
+ previewPosition = 'bottom',
77
+ visibleCount: requestedVisible = DEFAULT_VISIBLE,
78
+ direction = 'down',
79
+ onQueryChange,
80
+ onSelect,
81
+ onTab,
82
+ onShiftTab,
83
+ onFocus,
84
+ onCancel,
85
+ emptyMessage = 'No results',
86
+ matchLabel,
87
+ selectAction = 'select',
88
+ extraHints
89
+ }: Props<T>): React.ReactNode {
90
+ const isTerminalFocused = useTerminalFocus();
91
+ const {
92
+ rows,
93
+ columns
94
+ } = useTerminalSize();
95
+ const [focusedIndex, setFocusedIndex] = useState(0);
96
+
97
+ // Cap visibleCount so the picker never exceeds the terminal height. When it
98
+ // overflows, each re-render (arrow key, ctrl+p) mis-positions the cursor-up
99
+ // by the overflow amount and a previously-drawn line flashes blank.
100
+ const visibleCount = Math.max(MIN_VISIBLE, Math.min(requestedVisible, rows - CHROME_ROWS - (matchLabel ? 1 : 0)));
101
+
102
+ // Full hint row with onTab+onShiftTab is ~100 chars and wraps inconsistently
103
+ // below that. Compact mode drops shift+tab and shortens labels.
104
+ const compact = columns < 120;
105
+ const step = (delta: 1 | -1) => {
106
+ setFocusedIndex(i => clamp(i + delta, 0, items.length - 1));
107
+ };
108
+
109
+ // onKeyDown fires after useSearchInput's useInput, so onExit must be a
110
+ // no-op — return/downArrow are handled by handleKeyDown below. onCancel
111
+ // still covers escape/ctrl+c/ctrl+d. Backspace-on-empty is disabled so
112
+ // a held backspace doesn't eject the user from the dialog.
113
+ const {
114
+ query,
115
+ cursorOffset
116
+ } = useSearchInput({
117
+ isActive: true,
118
+ onExit: () => {},
119
+ onCancel,
120
+ initialQuery,
121
+ backspaceExitsOnEmpty: false
122
+ });
123
+ const handleKeyDown = (e: KeyboardEvent) => {
124
+ if (e.key === 'up' || e.ctrl && e.key === 'p') {
125
+ e.preventDefault();
126
+ e.stopImmediatePropagation();
127
+ step(direction === 'up' ? 1 : -1);
128
+ return;
129
+ }
130
+ if (e.key === 'down' || e.ctrl && e.key === 'n') {
131
+ e.preventDefault();
132
+ e.stopImmediatePropagation();
133
+ step(direction === 'up' ? -1 : 1);
134
+ return;
135
+ }
136
+ if (e.key === 'return') {
137
+ e.preventDefault();
138
+ e.stopImmediatePropagation();
139
+ const selected = items[focusedIndex];
140
+ if (selected) onSelect(selected);
141
+ return;
142
+ }
143
+ if (e.key === 'tab') {
144
+ e.preventDefault();
145
+ e.stopImmediatePropagation();
146
+ const selected = items[focusedIndex];
147
+ if (!selected) return;
148
+ const tabAction = e.shift ? onShiftTab ?? onTab : onTab;
149
+ if (tabAction) {
150
+ tabAction.handler(selected);
151
+ } else {
152
+ onSelect(selected);
153
+ }
154
+ }
155
+ };
156
+ useEffect(() => {
157
+ onQueryChange(query);
158
+ setFocusedIndex(0);
159
+ // eslint-disable-next-line react-hooks/exhaustive-deps
160
+ }, [query]);
161
+ useEffect(() => {
162
+ setFocusedIndex(i => clamp(i, 0, items.length - 1));
163
+ }, [items.length]);
164
+ const focused = items[focusedIndex];
165
+ useEffect(() => {
166
+ onFocus?.(focused);
167
+ // eslint-disable-next-line react-hooks/exhaustive-deps
168
+ }, [focused]);
169
+ const windowStart = clamp(focusedIndex - visibleCount + 1, 0, items.length - visibleCount);
170
+ const visible = items.slice(windowStart, windowStart + visibleCount);
171
+ const emptyText = typeof emptyMessage === 'function' ? emptyMessage(query) : emptyMessage;
172
+ const searchBox = <SearchBox query={query} cursorOffset={cursorOffset} placeholder={placeholder} isFocused isTerminalFocused={isTerminalFocused} />;
173
+ const listBlock = <List visible={visible} windowStart={windowStart} visibleCount={visibleCount} total={items.length} focusedIndex={focusedIndex} direction={direction} getKey={getKey} renderItem={renderItem} emptyText={emptyText} />;
174
+ const preview = renderPreview && focused ? <Box flexDirection="column" flexGrow={1}>
175
+ {renderPreview(focused)}
176
+ </Box> : null;
177
+
178
+ // Structure must not depend on preview truthiness — when focused goes
179
+ // undefined (e.g. delete clears matches), switching row→fragment would
180
+ // change both layout AND gap count, bouncing the searchBox below.
181
+ const listGroup = renderPreview && previewPosition === 'right' ? <Box flexDirection="row" gap={2} height={visibleCount + (matchLabel ? 1 : 0)}>
182
+ <Box flexDirection="column" flexShrink={0}>
183
+ {listBlock}
184
+ {matchLabel && <Text dimColor>{matchLabel}</Text>}
185
+ </Box>
186
+ {preview ?? <Box flexGrow={1} />}
187
+ </Box> :
188
+ // Box (not fragment) so the outer gap={1} doesn't insert a blank line
189
+ // between list/matchLabel/preview — that read as extra space above the
190
+ // prompt in direction='up'.
191
+ <Box flexDirection="column">
192
+ {listBlock}
193
+ {matchLabel && <Text dimColor>{matchLabel}</Text>}
194
+ {preview}
195
+ </Box>;
196
+ const inputAbove = direction !== 'up';
197
+ return <Pane color="permission">
198
+ <Box flexDirection="column" gap={1} tabIndex={0} autoFocus onKeyDown={handleKeyDown}>
199
+ <Text bold color="permission">
200
+ {title}
201
+ </Text>
202
+ {inputAbove && searchBox}
203
+ {listGroup}
204
+ {!inputAbove && searchBox}
205
+ <Text dimColor>
206
+ <Byline>
207
+ <KeyboardShortcutHint shortcut="↑/↓" action={compact ? 'nav' : 'navigate'} />
208
+ <KeyboardShortcutHint shortcut="Enter" action={compact ? firstWord(selectAction) : selectAction} />
209
+ {onTab && <KeyboardShortcutHint shortcut="Tab" action={onTab.action} />}
210
+ {onShiftTab && !compact && <KeyboardShortcutHint shortcut="shift+tab" action={onShiftTab.action} />}
211
+ <KeyboardShortcutHint shortcut="Esc" action="cancel" />
212
+ {extraHints}
213
+ </Byline>
214
+ </Text>
215
+ </Box>
216
+ </Pane>;
217
+ }
218
+ type ListProps<T> = Pick<Props<T>, 'visibleCount' | 'direction' | 'getKey' | 'renderItem'> & {
219
+ visible: readonly T[];
220
+ windowStart: number;
221
+ total: number;
222
+ focusedIndex: number;
223
+ emptyText: string;
224
+ };
225
+ function List(t0) {
226
+ const $ = _c(27);
227
+ const {
228
+ visible,
229
+ windowStart,
230
+ visibleCount,
231
+ total,
232
+ focusedIndex,
233
+ direction,
234
+ getKey,
235
+ renderItem,
236
+ emptyText
237
+ } = t0;
238
+ if (visible.length === 0) {
239
+ let t1;
240
+ if ($[0] !== emptyText) {
241
+ t1 = <Text dimColor={true}>{emptyText}</Text>;
242
+ $[0] = emptyText;
243
+ $[1] = t1;
244
+ } else {
245
+ t1 = $[1];
246
+ }
247
+ let t2;
248
+ if ($[2] !== t1 || $[3] !== visibleCount) {
249
+ t2 = <Box height={visibleCount} flexShrink={0}>{t1}</Box>;
250
+ $[2] = t1;
251
+ $[3] = visibleCount;
252
+ $[4] = t2;
253
+ } else {
254
+ t2 = $[4];
255
+ }
256
+ return t2;
257
+ }
258
+ let t1;
259
+ if ($[5] !== direction || $[6] !== focusedIndex || $[7] !== getKey || $[8] !== renderItem || $[9] !== total || $[10] !== visible || $[11] !== visibleCount || $[12] !== windowStart) {
260
+ let t2;
261
+ if ($[14] !== direction || $[15] !== focusedIndex || $[16] !== getKey || $[17] !== renderItem || $[18] !== total || $[19] !== visible.length || $[20] !== visibleCount || $[21] !== windowStart) {
262
+ t2 = (item, i) => {
263
+ const actualIndex = windowStart + i;
264
+ const isFocused = actualIndex === focusedIndex;
265
+ const atLowEdge = i === 0 && windowStart > 0;
266
+ const atHighEdge = i === visible.length - 1 && windowStart + visibleCount < total;
267
+ return <ListItem key={getKey(item)} isFocused={isFocused} showScrollUp={direction === "up" ? atHighEdge : atLowEdge} showScrollDown={direction === "up" ? atLowEdge : atHighEdge} styled={false}>{renderItem(item, isFocused)}</ListItem>;
268
+ };
269
+ $[14] = direction;
270
+ $[15] = focusedIndex;
271
+ $[16] = getKey;
272
+ $[17] = renderItem;
273
+ $[18] = total;
274
+ $[19] = visible.length;
275
+ $[20] = visibleCount;
276
+ $[21] = windowStart;
277
+ $[22] = t2;
278
+ } else {
279
+ t2 = $[22];
280
+ }
281
+ t1 = visible.map(t2);
282
+ $[5] = direction;
283
+ $[6] = focusedIndex;
284
+ $[7] = getKey;
285
+ $[8] = renderItem;
286
+ $[9] = total;
287
+ $[10] = visible;
288
+ $[11] = visibleCount;
289
+ $[12] = windowStart;
290
+ $[13] = t1;
291
+ } else {
292
+ t1 = $[13];
293
+ }
294
+ const rows = t1;
295
+ const t2 = direction === "up" ? "column-reverse" : "column";
296
+ let t3;
297
+ if ($[23] !== rows || $[24] !== t2 || $[25] !== visibleCount) {
298
+ t3 = <Box height={visibleCount} flexShrink={0} flexDirection={t2}>{rows}</Box>;
299
+ $[23] = rows;
300
+ $[24] = t2;
301
+ $[25] = visibleCount;
302
+ $[26] = t3;
303
+ } else {
304
+ t3 = $[26];
305
+ }
306
+ return t3;
307
+ }
308
+ function firstWord(s: string): string {
309
+ const i = s.indexOf(' ');
310
+ return i === -1 ? s : s.slice(0, i);
311
+ }
312
+ //# 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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
src/components/design-system/LoadingState.tsx ADDED
@@ -0,0 +1,94 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { c as _c } from "react/compiler-runtime";
2
+ import React from 'react';
3
+ import { Box, Text } from '../../ink.js';
4
+ import { Spinner } from '../Spinner.js';
5
+ type LoadingStateProps = {
6
+ /**
7
+ * The loading message to display next to the spinner.
8
+ */
9
+ message: string;
10
+
11
+ /**
12
+ * Display the message in bold.
13
+ * @default false
14
+ */
15
+ bold?: boolean;
16
+
17
+ /**
18
+ * Display the message in dimmed color.
19
+ * @default false
20
+ */
21
+ dimColor?: boolean;
22
+
23
+ /**
24
+ * Optional subtitle displayed below the main message.
25
+ */
26
+ subtitle?: string;
27
+ };
28
+
29
+ /**
30
+ * A spinner with loading message for async operations.
31
+ *
32
+ * @example
33
+ * // Basic loading
34
+ * <LoadingState message="Loading..." />
35
+ *
36
+ * @example
37
+ * // Bold loading message
38
+ * <LoadingState message="Loading sessions" bold />
39
+ *
40
+ * @example
41
+ * // With subtitle
42
+ * <LoadingState
43
+ * message="Loading sessions"
44
+ * bold
45
+ * subtitle="Fetching your Claude Code sessions..."
46
+ * />
47
+ */
48
+ export function LoadingState(t0) {
49
+ const $ = _c(10);
50
+ const {
51
+ message,
52
+ bold: t1,
53
+ dimColor: t2,
54
+ subtitle
55
+ } = t0;
56
+ const bold = t1 === undefined ? false : t1;
57
+ const dimColor = t2 === undefined ? false : t2;
58
+ let t3;
59
+ if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
60
+ t3 = <Spinner />;
61
+ $[0] = t3;
62
+ } else {
63
+ t3 = $[0];
64
+ }
65
+ let t4;
66
+ if ($[1] !== bold || $[2] !== dimColor || $[3] !== message) {
67
+ t4 = <Box flexDirection="row">{t3}<Text bold={bold} dimColor={dimColor}>{" "}{message}</Text></Box>;
68
+ $[1] = bold;
69
+ $[2] = dimColor;
70
+ $[3] = message;
71
+ $[4] = t4;
72
+ } else {
73
+ t4 = $[4];
74
+ }
75
+ let t5;
76
+ if ($[5] !== subtitle) {
77
+ t5 = subtitle && <Text dimColor={true}>{subtitle}</Text>;
78
+ $[5] = subtitle;
79
+ $[6] = t5;
80
+ } else {
81
+ t5 = $[6];
82
+ }
83
+ let t6;
84
+ if ($[7] !== t4 || $[8] !== t5) {
85
+ t6 = <Box flexDirection="column">{t4}{t5}</Box>;
86
+ $[7] = t4;
87
+ $[8] = t5;
88
+ $[9] = t6;
89
+ } else {
90
+ t6 = $[9];
91
+ }
92
+ return t6;
93
+ }
94
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsIkJveCIsIlRleHQiLCJTcGlubmVyIiwiTG9hZGluZ1N0YXRlUHJvcHMiLCJtZXNzYWdlIiwiYm9sZCIsImRpbUNvbG9yIiwic3VidGl0bGUiLCJMb2FkaW5nU3RhdGUiLCJ0MCIsIiQiLCJfYyIsInQxIiwidDIiLCJ1bmRlZmluZWQiLCJ0MyIsIlN5bWJvbCIsImZvciIsInQ0IiwidDUiLCJ0NiJdLCJzb3VyY2VzIjpbIkxvYWRpbmdTdGF0ZS50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgQm94LCBUZXh0IH0gZnJvbSAnLi4vLi4vaW5rLmpzJ1xuaW1wb3J0IHsgU3Bpbm5lciB9IGZyb20gJy4uL1NwaW5uZXIuanMnXG5cbnR5cGUgTG9hZGluZ1N0YXRlUHJvcHMgPSB7XG4gIC8qKlxuICAgKiBUaGUgbG9hZGluZyBtZXNzYWdlIHRvIGRpc3BsYXkgbmV4dCB0byB0aGUgc3Bpbm5lci5cbiAgICovXG4gIG1lc3NhZ2U6IHN0cmluZ1xuXG4gIC8qKlxuICAgKiBEaXNwbGF5IHRoZSBtZXNzYWdlIGluIGJvbGQuXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBib2xkPzogYm9vbGVhblxuXG4gIC8qKlxuICAgKiBEaXNwbGF5IHRoZSBtZXNzYWdlIGluIGRpbW1lZCBjb2xvci5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIGRpbUNvbG9yPzogYm9vbGVhblxuXG4gIC8qKlxuICAgKiBPcHRpb25hbCBzdWJ0aXRsZSBkaXNwbGF5ZWQgYmVsb3cgdGhlIG1haW4gbWVzc2FnZS5cbiAgICovXG4gIHN1YnRpdGxlPzogc3RyaW5nXG59XG5cbi8qKlxuICogQSBzcGlubmVyIHdpdGggbG9hZGluZyBtZXNzYWdlIGZvciBhc3luYyBvcGVyYXRpb25zLlxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBCYXNpYyBsb2FkaW5nXG4gKiA8TG9hZGluZ1N0YXRlIG1lc3NhZ2U9XCJMb2FkaW5nLi4uXCIgLz5cbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQm9sZCBsb2FkaW5nIG1lc3NhZ2VcbiAqIDxMb2FkaW5nU3RhdGUgbWVzc2FnZT1cIkxvYWRpbmcgc2Vzc2lvbnNcIiBib2xkIC8+XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFdpdGggc3VidGl0bGVcbiAqIDxMb2FkaW5nU3RhdGVcbiAqICAgbWVzc2FnZT1cIkxvYWRpbmcgc2Vzc2lvbnNcIlxuICogICBib2xkXG4gKiAgIHN1YnRpdGxlPVwiRmV0Y2hpbmcgeW91ciBDbGF1ZGUgQ29kZSBzZXNzaW9ucy4uLlwiXG4gKiAvPlxuICovXG5leHBvcnQgZnVuY3Rpb24gTG9hZGluZ1N0YXRlKHtcbiAgbWVzc2FnZSxcbiAgYm9sZCA9IGZhbHNlLFxuICBkaW1Db2xvciA9IGZhbHNlLFxuICBzdWJ0aXRsZSxcbn06IExvYWRpbmdTdGF0ZVByb3BzKTogUmVhY3QuUmVhY3ROb2RlIHtcbiAgcmV0dXJuIChcbiAgICA8Qm94IGZsZXhEaXJlY3Rpb249XCJjb2x1bW5cIj5cbiAgICAgIDxCb3ggZmxleERpcmVjdGlvbj1cInJvd1wiPlxuICAgICAgICA8U3Bpbm5lciAvPlxuICAgICAgICA8VGV4dCBib2xkPXtib2xkfSBkaW1Db2xvcj17ZGltQ29sb3J9PlxuICAgICAgICAgIHsnICd9XG4gICAgICAgICAge21lc3NhZ2V9XG4gICAgICAgIDwvVGV4dD5cbiAgICAgIDwvQm94PlxuICAgICAge3N1YnRpdGxlICYmIDxUZXh0IGRpbUNvbG9yPntzdWJ0aXRsZX08L1RleHQ+fVxuICAgIDwvQm94PlxuICApXG59XG4iXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPQSxLQUFLLE1BQU0sT0FBTztBQUN6QixTQUFTQyxHQUFHLEVBQUVDLElBQUksUUFBUSxjQUFjO0FBQ3hDLFNBQVNDLE9BQU8sUUFBUSxlQUFlO0FBRXZDLEtBQUtDLGlCQUFpQixHQUFHO0VBQ3ZCO0FBQ0Y7QUFDQTtFQUNFQyxPQUFPLEVBQUUsTUFBTTs7RUFFZjtBQUNGO0FB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
src/components/design-system/StatusIcon.tsx ADDED
@@ -0,0 +1,95 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { c as _c } from "react/compiler-runtime";
2
+ import figures from 'figures';
3
+ import React from 'react';
4
+ import { Text } from '../../ink.js';
5
+ type Status = 'success' | 'error' | 'warning' | 'info' | 'pending' | 'loading';
6
+ type Props = {
7
+ /**
8
+ * The status to display. Determines both the icon and color.
9
+ *
10
+ * - `success`: Green checkmark (✓)
11
+ * - `error`: Red cross (✗)
12
+ * - `warning`: Yellow warning symbol (⚠)
13
+ * - `info`: Blue info symbol (ℹ)
14
+ * - `pending`: Dimmed circle (○)
15
+ * - `loading`: Dimmed ellipsis (…)
16
+ */
17
+ status: Status;
18
+ /**
19
+ * Include a trailing space after the icon. Useful when followed by text.
20
+ * @default false
21
+ */
22
+ withSpace?: boolean;
23
+ };
24
+ const STATUS_CONFIG: Record<Status, {
25
+ icon: string;
26
+ color: 'success' | 'error' | 'warning' | 'suggestion' | undefined;
27
+ }> = {
28
+ success: {
29
+ icon: figures.tick,
30
+ color: 'success'
31
+ },
32
+ error: {
33
+ icon: figures.cross,
34
+ color: 'error'
35
+ },
36
+ warning: {
37
+ icon: figures.warning,
38
+ color: 'warning'
39
+ },
40
+ info: {
41
+ icon: figures.info,
42
+ color: 'suggestion'
43
+ },
44
+ pending: {
45
+ icon: figures.circle,
46
+ color: undefined
47
+ },
48
+ loading: {
49
+ icon: '…',
50
+ color: undefined
51
+ }
52
+ };
53
+
54
+ /**
55
+ * Renders a status indicator icon with appropriate color.
56
+ *
57
+ * @example
58
+ * // Success indicator
59
+ * <StatusIcon status="success" />
60
+ *
61
+ * @example
62
+ * // Error with trailing space for text
63
+ * <Text><StatusIcon status="error" withSpace />Failed to connect</Text>
64
+ *
65
+ * @example
66
+ * // Status line pattern
67
+ * <Text>
68
+ * <StatusIcon status="pending" withSpace />
69
+ * Waiting for response
70
+ * </Text>
71
+ */
72
+ export function StatusIcon(t0) {
73
+ const $ = _c(5);
74
+ const {
75
+ status,
76
+ withSpace: t1
77
+ } = t0;
78
+ const withSpace = t1 === undefined ? false : t1;
79
+ const config = STATUS_CONFIG[status];
80
+ const t2 = !config.color;
81
+ const t3 = withSpace && " ";
82
+ let t4;
83
+ if ($[0] !== config.color || $[1] !== config.icon || $[2] !== t2 || $[3] !== t3) {
84
+ t4 = <Text color={config.color} dimColor={t2}>{config.icon}{t3}</Text>;
85
+ $[0] = config.color;
86
+ $[1] = config.icon;
87
+ $[2] = t2;
88
+ $[3] = t3;
89
+ $[4] = t4;
90
+ } else {
91
+ t4 = $[4];
92
+ }
93
+ return t4;
94
+ }
95
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJmaWd1cmVzIiwiUmVhY3QiLCJUZXh0IiwiU3RhdHVzIiwiUHJvcHMiLCJzdGF0dXMiLCJ3aXRoU3BhY2UiLCJTVEFUVVNfQ09ORklHIiwiUmVjb3JkIiwiaWNvbiIsImNvbG9yIiwic3VjY2VzcyIsInRpY2siLCJlcnJvciIsImNyb3NzIiwid2FybmluZyIsImluZm8iLCJwZW5kaW5nIiwiY2lyY2xlIiwidW5kZWZpbmVkIiwibG9hZGluZyIsIlN0YXR1c0ljb24iLCJ0MCIsIiQiLCJfYyIsInQxIiwiY29uZmlnIiwidDIiLCJ0MyIsInQ0Il0sInNvdXJjZXMiOlsiU3RhdHVzSWNvbi50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGZpZ3VyZXMgZnJvbSAnZmlndXJlcydcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7IFRleHQgfSBmcm9tICcuLi8uLi9pbmsuanMnXG5cbnR5cGUgU3RhdHVzID0gJ3N1Y2Nlc3MnIHwgJ2Vycm9yJyB8ICd3YXJuaW5nJyB8ICdpbmZvJyB8ICdwZW5kaW5nJyB8ICdsb2FkaW5nJ1xuXG50eXBlIFByb3BzID0ge1xuICAvKipcbiAgICogVGhlIHN0YXR1cyB0byBkaXNwbGF5LiBEZXRlcm1pbmVzIGJvdGggdGhlIGljb24gYW5kIGNvbG9yLlxuICAgKlxuICAgKiAtIGBzdWNjZXNzYDogR3JlZW4gY2hlY2ttYXJrICjinJMpXG4gICAqIC0gYGVycm9yYDogUmVkIGNyb3NzICjinJcpXG4gICAqIC0gYHdhcm5pbmdgOiBZZWxsb3cgd2FybmluZyBzeW1ib2wgKOKaoClcbiAgICogLSBgaW5mb2A6IEJsdWUgaW5mbyBzeW1ib2wgKOKEuSlcbiAgICogLSBgcGVuZGluZ2A6IERpbW1lZCBjaXJjbGUgKOKXiylcbiAgICogLSBgbG9hZGluZ2A6IERpbW1lZCBlbGxpcHNpcyAo4oCmKVxuICAgKi9cbiAgc3RhdHVzOiBTdGF0dXNcbiAgLyoqXG4gICAqIEluY2x1ZGUgYSB0cmFpbGluZyBzcGFjZSBhZnRlciB0aGUgaWNvbi4gVXNlZnVsIHdoZW4gZm9sbG93ZWQgYnkgdGV4dC5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHdpdGhTcGFjZT86IGJvb2xlYW5cbn1cblxuY29uc3QgU1RBVFVTX0NPTkZJRzogUmVjb3JkPFxuICBTdGF0dXMsXG4gIHtcbiAgICBpY29uOiBzdHJpbmdcbiAgICBjb2xvcjogJ3N1Y2Nlc3MnIHwgJ2Vycm9yJyB8ICd3YXJuaW5nJyB8ICdzdWdnZXN0aW9uJyB8IHVuZGVmaW5lZFxuICB9XG4+ID0ge1xuICBzdWNjZXNzOiB7IGljb246IGZpZ3VyZXMudGljaywgY29sb3I6ICdzdWNjZXNzJyB9LFxuICBlcnJvcjogeyBpY29uOiBmaWd1cmVzLmNyb3NzLCBjb2xvcjogJ2Vycm9yJyB9LFxuICB3YXJuaW5nOiB7IGljb246IGZpZ3VyZXMud2FybmluZywgY29sb3I6ICd3YXJuaW5nJyB9LFxuICBpbmZvOiB7IGljb246IGZpZ3VyZXMuaW5mbywgY29sb3I6ICdzdWdnZXN0aW9uJyB9LFxuICBwZW5kaW5nOiB7IGljb246IGZpZ3VyZXMuY2lyY2xlLCBjb2xvcjogdW5kZWZpbmVkIH0sXG4gIGxvYWRpbmc6IHsgaWNvbjogJ+KApicsIGNvbG9yOiB1bmRlZmluZWQgfSxcbn1cblxuLyoqXG4gKiBSZW5kZXJzIGEgc3RhdHVzIGluZGljYXRvciBpY29uIHdpdGggYXBwcm9wcmlhdGUgY29sb3IuXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFN1Y2Nlc3MgaW5kaWNhdG9yXG4gKiA8U3RhdHVzSWNvbiBzdGF0dXM9XCJzdWNjZXNzXCIgLz5cbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gRXJyb3Igd2l0aCB0cmFpbGluZyBzcGFjZSBmb3IgdGV4dFxuICogPFRleHQ+PFN0YXR1c0ljb24gc3RhdHVzPVwiZXJyb3JcIiB3aXRoU3BhY2UgLz5GYWlsZWQgdG8gY29ubmVjdDwvVGV4dD5cbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gU3RhdHVzIGxpbmUgcGF0dGVyblxuICogPFRleHQ+XG4gKiAgIDxTdGF0dXNJY29uIHN0YXR1cz1cInBlbmRpbmdcIiB3aXRoU3BhY2UgLz5cbiAqICAgV2FpdGluZyBmb3IgcmVzcG9uc2VcbiAqIDwvVGV4dD5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFN0YXR1c0ljb24oe1xuICBzdGF0dXMsXG4gIHdpdGhTcGFjZSA9IGZhbHNlLFxufTogUHJvcHMpOiBSZWFjdC5SZWFjdE5vZGUge1xuICBjb25zdCBjb25maWcgPSBTVEFUVVNfQ09ORklHW3N0YXR1c11cblxuICByZXR1cm4gKFxuICAgIDxUZXh0IGNvbG9yPXtjb25maWcuY29sb3J9IGRpbUNvbG9yPXshY29uZmlnLmNvbG9yfT5cbiAgICAgIHtjb25maWcuaWNvbn1cbiAgICAgIHt3aXRoU3BhY2UgJiYgJyAnfVxuICAgIDwvVGV4dD5cbiAgKVxufVxuIl0sIm1hcHBpbmdzIjoiO0FBQUEsT0FBT0EsT0FBTyxNQUFNLFNBQVM7QUFDN0IsT0FBT0MsS0FBSyxNQUFNLE9BQU87QUFDekIsU0FBU0MsSUFBSSxRQUFRLGNBQWM7QUFFbkMsS0FBS0MsTUFBTSxHQUFHLFNBQVMsR0FBRyxPQUFPLEdBQUcsU0FBUyxHQUFHLE1BQU0sR0FBRyxTQUFTLEdBQUcsU0FBUztBQUU5RSxLQUFLQyxLQUFLLEdBQUc7RUFDWDtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNFQyxNQUFNLEVBQUVGLE1BQU07RUFDZDtBQUNGO0FBQ0E7QUFDQTtFQUNFRyxTQUFTLENBQUMsRUFBRSxPQUFPO0FBQ3JCLENBQUM7QUFFRCxNQUFNQyxhQUFhLEVBQUVDLE1BQU0sQ0FDekJMLE1BQU0sRUFDTjtFQUNFTSxJQUFJLEVBQUUsTUFBTTtFQUNaQyxLQUFLLEVBQUUsU0FBUyxHQUFHLE9BQU8sR0FBRyxTQUFTLEdBQUcsWUFBWSxHQUFHLFNBQVM7QUFDbkUsQ0FBQyxDQUNGLEdBQUc7RUFDRkMsT0FBTyxFQUFFO0lBQUVGLElBQUksRUFBRVQsT0FBTyxDQUFDWSxJQUFJO0lBQUVGLEtBQUssRUFBRTtFQUFVLENBQUM7RUFDakRHLEtBQUssRUFBRTtJQUFFSixJQUFJLEVBQUVULE9BQU8sQ0FBQ2MsS0FBSztJQUFFSixLQUFLLEVBQUU7RUFBUSxDQUFDO0VBQzlDSyxPQUFPLEVBQUU7SUFBRU4sSUFBSSxFQUFFVCxPQUFPLENBQUNlLE9BQU87SUFBRUwsS0FBSyxFQUFFO0VBQVUsQ0FBQztFQUNwRE0sSUFBSSxFQUFFO0lBQUVQLElBQUksRUFBRVQsT0FBTyxDQUFDZ0IsSUFBSTtJQUFFTixLQUFLLEVBQUU7RUFBYSxDQUFDO0VBQ2pETyxPQUFPLEVBQUU7SUFBRVIsSUFBSSxFQUFFVCxPQUFPLENBQUNrQixNQUFNO0lBQUVSLEtBQUssRUFBRVM7RUFBVSxDQUFDO0VBQ25EQyxPQUFPLEVBQUU7SUFBRVgsSUFBSSxFQUFFLEdBQUc7SUFBRUMsS0FBSyxFQUFFUztFQUFVO0FBQ3pDLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTyxTQUFBRSxXQUFBQyxFQUFBO0VBQUEsTUFBQUMsQ0FBQSxHQUFBQyxFQUFBO0VBQW9CO0lBQUFuQixNQUFBO0lBQUFDLFNBQUEsRUFBQW1CO0VBQUEsSUFBQUgsRUFHbkI7RUFETixNQUFBaEIsU0FBQSxHQUFBbUIsRUFBaUIsS0FBakJOLFNBQWlCLEdBQWpCLEtBQWlCLEdBQWpCTSxFQUFpQjtFQUVqQixNQUFBQyxNQUFBLEdBQWVuQixhQUFhLENBQUNGLE1BQU0sQ0FBQztFQUdHLE1BQUFzQixFQUFBLElBQUNELE1BQU0sQ0FBQWhCLEtBQU07RUFFL0MsTUFBQWtCLEVBQUEsR0FBQXRCLFNBQWdCLElBQWhCLEdBQWdCO0VBQUEsSUFBQXVCLEVBQUE7RUFBQSxJQUFBTixDQUFBLFFBQUFHLE1BQUEsQ0FBQWhCLEtBQUEsSUFBQWEsQ0FBQSxRQUFBRyxNQUFBLENBQUFqQixJQUFBLElBQUFjLENBQUEsUUFBQUksRUFBQSxJQUFBSixDQUFBLFFBQUFLLEVBQUE7SUFGbkJDLEVBQUEsSUFBQyxJQUFJLENBQVEsS0FBWSxDQUFaLENBQUFILE1BQU0sQ0FBQWhCLEtBQUssQ0FBQyxDQUFZLFFBQWEsQ0FBYixDQUFBaUIsRUFBWSxDQUFDLENBQy9DLENBQUFELE1BQU0sQ0FBQWpCLElBQUksQ0FDVixDQUFBbUIsRUFBZSxDQUNsQixFQUhDLElBQUksQ0FHRTtJQUFBTCxDQUFBLE1BQUFHLE1BQUEsQ0FBQWhCLEtBQUE7SUFBQWEsQ0FBQSxNQUFBRyxNQUFBLENBQUFqQixJQUFBO0lBQUFjLENBQUEsTUFBQUksRUFBQTtJQUFBSixDQUFBLE1BQUFLLEVBQUE7SUFBQUwsQ0FBQSxNQUFBTSxFQUFBO0VBQUE7SUFBQUEsRUFBQSxHQUFBTixDQUFBO0VBQUE7RUFBQSxPQUhQTSxFQUdPO0FBQUEiLCJpZ25vcmVMaXN0IjpbXX0=
src/components/design-system/Tabs.tsx ADDED
@@ -0,0 +1,340 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { c as _c } from "react/compiler-runtime";
2
+ import React, { createContext, useCallback, useContext, useEffect, useState } from 'react';
3
+ import { useIsInsideModal, useModalScrollRef } from '../../context/modalContext.js';
4
+ import { useTerminalSize } from '../../hooks/useTerminalSize.js';
5
+ import ScrollBox from '../../ink/components/ScrollBox.js';
6
+ import type { KeyboardEvent } from '../../ink/events/keyboard-event.js';
7
+ import { stringWidth } from '../../ink/stringWidth.js';
8
+ import { Box, Text } from '../../ink.js';
9
+ import { useKeybindings } from '../../keybindings/useKeybinding.js';
10
+ import type { Theme } from '../../utils/theme.js';
11
+ type TabsProps = {
12
+ children: Array<React.ReactElement<TabProps>>;
13
+ title?: string;
14
+ color?: keyof Theme;
15
+ defaultTab?: string;
16
+ hidden?: boolean;
17
+ useFullWidth?: boolean;
18
+ /** Controlled mode: current selected tab id/title */
19
+ selectedTab?: string;
20
+ /** Controlled mode: callback when tab changes */
21
+ onTabChange?: (tabId: string) => void;
22
+ /** Optional banner to display below tabs header */
23
+ banner?: React.ReactNode;
24
+ /** Disable keyboard navigation (e.g. when a child component handles arrow keys) */
25
+ disableNavigation?: boolean;
26
+ /**
27
+ * Initial focus state for the tab header row. Defaults to true (header
28
+ * focused, nav always works). Keep the default for Select/list content —
29
+ * those only use up/down so there's no conflict; pass
30
+ * isDisabled={headerFocused} to the Select instead. Only set false when
31
+ * content actually binds left/right/tab (e.g. enum cycling), and show a
32
+ * "↑ tabs" footer hint — without it tabs look broken.
33
+ */
34
+ initialHeaderFocused?: boolean;
35
+ /**
36
+ * Fixed height for the content area. When set, all tabs render within the
37
+ * same height (overflow hidden) so switching tabs doesn't cause layout
38
+ * shifts. Shorter tabs get whitespace; taller tabs are clipped.
39
+ */
40
+ contentHeight?: number;
41
+ /**
42
+ * Let Tab/←/→ switch tabs from focused content. Opt-in since some
43
+ * content uses those keys; pass a reactive boolean to cede them when
44
+ * needed. Switching from content focuses the header.
45
+ */
46
+ navFromContent?: boolean;
47
+ };
48
+ type TabsContextValue = {
49
+ selectedTab: string | undefined;
50
+ width: number | undefined;
51
+ headerFocused: boolean;
52
+ focusHeader: () => void;
53
+ blurHeader: () => void;
54
+ registerOptIn: () => () => void;
55
+ };
56
+ const TabsContext = createContext<TabsContextValue>({
57
+ selectedTab: undefined,
58
+ width: undefined,
59
+ // Default for components rendered outside a Tabs (tests, standalone):
60
+ // content has focus, focusHeader is a no-op.
61
+ headerFocused: false,
62
+ focusHeader: () => {},
63
+ blurHeader: () => {},
64
+ registerOptIn: () => () => {}
65
+ });
66
+ export function Tabs(t0) {
67
+ const $ = _c(25);
68
+ const {
69
+ title,
70
+ color,
71
+ defaultTab,
72
+ children,
73
+ hidden,
74
+ useFullWidth,
75
+ selectedTab: controlledSelectedTab,
76
+ onTabChange,
77
+ banner,
78
+ disableNavigation,
79
+ initialHeaderFocused: t1,
80
+ contentHeight,
81
+ navFromContent: t2
82
+ } = t0;
83
+ const initialHeaderFocused = t1 === undefined ? true : t1;
84
+ const navFromContent = t2 === undefined ? false : t2;
85
+ const {
86
+ columns: terminalWidth
87
+ } = useTerminalSize();
88
+ const tabs = children.map(_temp);
89
+ const defaultTabIndex = defaultTab ? tabs.findIndex(tab => defaultTab === tab[0]) : 0;
90
+ const isControlled = controlledSelectedTab !== undefined;
91
+ const [internalSelectedTab, setInternalSelectedTab] = useState(defaultTabIndex !== -1 ? defaultTabIndex : 0);
92
+ const controlledTabIndex = isControlled ? tabs.findIndex(tab_0 => tab_0[0] === controlledSelectedTab) : -1;
93
+ const selectedTabIndex = isControlled ? controlledTabIndex !== -1 ? controlledTabIndex : 0 : internalSelectedTab;
94
+ const modalScrollRef = useModalScrollRef();
95
+ const [headerFocused, setHeaderFocused] = useState(initialHeaderFocused);
96
+ let t3;
97
+ if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
98
+ t3 = () => setHeaderFocused(true);
99
+ $[0] = t3;
100
+ } else {
101
+ t3 = $[0];
102
+ }
103
+ const focusHeader = t3;
104
+ let t4;
105
+ if ($[1] === Symbol.for("react.memo_cache_sentinel")) {
106
+ t4 = () => setHeaderFocused(false);
107
+ $[1] = t4;
108
+ } else {
109
+ t4 = $[1];
110
+ }
111
+ const blurHeader = t4;
112
+ const [optInCount, setOptInCount] = useState(0);
113
+ let t5;
114
+ if ($[2] === Symbol.for("react.memo_cache_sentinel")) {
115
+ t5 = () => {
116
+ setOptInCount(_temp2);
117
+ return () => setOptInCount(_temp3);
118
+ };
119
+ $[2] = t5;
120
+ } else {
121
+ t5 = $[2];
122
+ }
123
+ const registerOptIn = t5;
124
+ const optedIn = optInCount > 0;
125
+ const handleTabChange = offset => {
126
+ const newIndex = (selectedTabIndex + tabs.length + offset) % tabs.length;
127
+ const newTabId = tabs[newIndex]?.[0];
128
+ if (isControlled && onTabChange && newTabId) {
129
+ onTabChange(newTabId);
130
+ } else {
131
+ setInternalSelectedTab(newIndex);
132
+ }
133
+ setHeaderFocused(true);
134
+ };
135
+ const t6 = !hidden && !disableNavigation && headerFocused;
136
+ let t7;
137
+ if ($[3] !== t6) {
138
+ t7 = {
139
+ context: "Tabs",
140
+ isActive: t6
141
+ };
142
+ $[3] = t6;
143
+ $[4] = t7;
144
+ } else {
145
+ t7 = $[4];
146
+ }
147
+ useKeybindings({
148
+ "tabs:next": () => handleTabChange(1),
149
+ "tabs:previous": () => handleTabChange(-1)
150
+ }, t7);
151
+ let t8;
152
+ if ($[5] !== headerFocused || $[6] !== hidden || $[7] !== optedIn) {
153
+ t8 = e => {
154
+ if (!headerFocused || !optedIn || hidden) {
155
+ return;
156
+ }
157
+ if (e.key === "down") {
158
+ e.preventDefault();
159
+ setHeaderFocused(false);
160
+ }
161
+ };
162
+ $[5] = headerFocused;
163
+ $[6] = hidden;
164
+ $[7] = optedIn;
165
+ $[8] = t8;
166
+ } else {
167
+ t8 = $[8];
168
+ }
169
+ const handleKeyDown = t8;
170
+ const t9 = navFromContent && !headerFocused && optedIn && !hidden && !disableNavigation;
171
+ let t10;
172
+ if ($[9] !== t9) {
173
+ t10 = {
174
+ context: "Tabs",
175
+ isActive: t9
176
+ };
177
+ $[9] = t9;
178
+ $[10] = t10;
179
+ } else {
180
+ t10 = $[10];
181
+ }
182
+ useKeybindings({
183
+ "tabs:next": () => {
184
+ handleTabChange(1);
185
+ setHeaderFocused(true);
186
+ },
187
+ "tabs:previous": () => {
188
+ handleTabChange(-1);
189
+ setHeaderFocused(true);
190
+ }
191
+ }, t10);
192
+ const titleWidth = title ? stringWidth(title) + 1 : 0;
193
+ const tabsWidth = tabs.reduce(_temp4, 0);
194
+ const usedWidth = titleWidth + tabsWidth;
195
+ const spacerWidth = useFullWidth ? Math.max(0, terminalWidth - usedWidth) : 0;
196
+ const contentWidth = useFullWidth ? terminalWidth : undefined;
197
+ const T0 = Box;
198
+ const t11 = "column";
199
+ const t12 = 0;
200
+ const t13 = true;
201
+ const t14 = modalScrollRef ? 0 : undefined;
202
+ const t15 = !hidden && <Box flexDirection="row" gap={1} flexShrink={modalScrollRef ? 0 : undefined}>{title !== undefined && <Text bold={true} color={color}>{title}</Text>}{tabs.map((t16, i) => {
203
+ const [id, title_0] = t16;
204
+ const isCurrent = selectedTabIndex === i;
205
+ const hasColorCursor = color && isCurrent && headerFocused;
206
+ return <Text key={id} backgroundColor={hasColorCursor ? color : undefined} color={hasColorCursor ? "inverseText" : undefined} inverse={isCurrent && !hasColorCursor} bold={isCurrent}>{" "}{title_0}{" "}</Text>;
207
+ })}{spacerWidth > 0 && <Text>{" ".repeat(spacerWidth)}</Text>}</Box>;
208
+ let t17;
209
+ if ($[11] !== children || $[12] !== contentHeight || $[13] !== contentWidth || $[14] !== hidden || $[15] !== modalScrollRef || $[16] !== selectedTabIndex) {
210
+ t17 = modalScrollRef ? <Box width={contentWidth} marginTop={hidden ? 0 : 1} flexShrink={0}><ScrollBox key={selectedTabIndex} ref={modalScrollRef} flexDirection="column" flexShrink={0}>{children}</ScrollBox></Box> : <Box width={contentWidth} marginTop={hidden ? 0 : 1} height={contentHeight} overflowY={contentHeight !== undefined ? "hidden" : undefined}>{children}</Box>;
211
+ $[11] = children;
212
+ $[12] = contentHeight;
213
+ $[13] = contentWidth;
214
+ $[14] = hidden;
215
+ $[15] = modalScrollRef;
216
+ $[16] = selectedTabIndex;
217
+ $[17] = t17;
218
+ } else {
219
+ t17 = $[17];
220
+ }
221
+ let t18;
222
+ if ($[18] !== T0 || $[19] !== banner || $[20] !== handleKeyDown || $[21] !== t14 || $[22] !== t15 || $[23] !== t17) {
223
+ t18 = <T0 flexDirection={t11} tabIndex={t12} autoFocus={t13} onKeyDown={handleKeyDown} flexShrink={t14}>{t15}{banner}{t17}</T0>;
224
+ $[18] = T0;
225
+ $[19] = banner;
226
+ $[20] = handleKeyDown;
227
+ $[21] = t14;
228
+ $[22] = t15;
229
+ $[23] = t17;
230
+ $[24] = t18;
231
+ } else {
232
+ t18 = $[24];
233
+ }
234
+ return <TabsContext.Provider value={{
235
+ selectedTab: tabs[selectedTabIndex][0],
236
+ width: contentWidth,
237
+ headerFocused,
238
+ focusHeader,
239
+ blurHeader,
240
+ registerOptIn
241
+ }}>{t18}</TabsContext.Provider>;
242
+ }
243
+ function _temp4(sum, t0) {
244
+ const [, tabTitle] = t0;
245
+ return sum + (tabTitle ? stringWidth(tabTitle) : 0) + 2 + 1;
246
+ }
247
+ function _temp3(n_0) {
248
+ return n_0 - 1;
249
+ }
250
+ function _temp2(n) {
251
+ return n + 1;
252
+ }
253
+ function _temp(child) {
254
+ return [child.props.id ?? child.props.title, child.props.title];
255
+ }
256
+ type TabProps = {
257
+ title: string;
258
+ id?: string;
259
+ children: React.ReactNode;
260
+ };
261
+ export function Tab(t0) {
262
+ const $ = _c(4);
263
+ const {
264
+ title,
265
+ id,
266
+ children
267
+ } = t0;
268
+ const {
269
+ selectedTab,
270
+ width
271
+ } = useContext(TabsContext);
272
+ const insideModal = useIsInsideModal();
273
+ if (selectedTab !== (id ?? title)) {
274
+ return null;
275
+ }
276
+ const t1 = insideModal ? 0 : undefined;
277
+ let t2;
278
+ if ($[0] !== children || $[1] !== t1 || $[2] !== width) {
279
+ t2 = <Box width={width} flexShrink={t1}>{children}</Box>;
280
+ $[0] = children;
281
+ $[1] = t1;
282
+ $[2] = width;
283
+ $[3] = t2;
284
+ } else {
285
+ t2 = $[3];
286
+ }
287
+ return t2;
288
+ }
289
+ export function useTabsWidth() {
290
+ const {
291
+ width
292
+ } = useContext(TabsContext);
293
+ return width;
294
+ }
295
+
296
+ /**
297
+ * Opt into header-focus gating. Returns the current header focus state and a
298
+ * callback to hand focus back to the tab row. For a Select, pass
299
+ * `isDisabled={headerFocused}` and `onUpFromFirstItem={focusHeader}`; keep the
300
+ * parent Tabs' initialHeaderFocused at its default so tab/←/→ work on mount.
301
+ *
302
+ * Calling this hook registers a ↓-blurs-header opt-in on mount. Don't call it
303
+ * above an early return that renders static text — ↓ will blur the header with
304
+ * no onUpFromFirstItem to recover. Split the component so the hook only runs
305
+ * when the Select renders.
306
+ */
307
+ export function useTabHeaderFocus() {
308
+ const $ = _c(6);
309
+ const {
310
+ headerFocused,
311
+ focusHeader,
312
+ blurHeader,
313
+ registerOptIn
314
+ } = useContext(TabsContext);
315
+ let t0;
316
+ if ($[0] !== registerOptIn) {
317
+ t0 = [registerOptIn];
318
+ $[0] = registerOptIn;
319
+ $[1] = t0;
320
+ } else {
321
+ t0 = $[1];
322
+ }
323
+ useEffect(registerOptIn, t0);
324
+ let t1;
325
+ if ($[2] !== blurHeader || $[3] !== focusHeader || $[4] !== headerFocused) {
326
+ t1 = {
327
+ headerFocused,
328
+ focusHeader,
329
+ blurHeader
330
+ };
331
+ $[2] = blurHeader;
332
+ $[3] = focusHeader;
333
+ $[4] = headerFocused;
334
+ $[5] = t1;
335
+ } else {
336
+ t1 = $[5];
337
+ }
338
+ return t1;
339
+ }
340
+ //# 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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
src/components/design-system/ThemedText.tsx ADDED
@@ -0,0 +1,124 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { c as _c } from "react/compiler-runtime";
2
+ import type { ReactNode } from 'react';
3
+ import React, { useContext } from 'react';
4
+ import Text from '../../ink/components/Text.js';
5
+ import type { Color, Styles } from '../../ink/styles.js';
6
+ import { getTheme, type Theme } from '../../utils/theme.js';
7
+ import { useTheme } from './ThemeProvider.js';
8
+
9
+ /** Colors uncolored ThemedText in the subtree. Precedence: explicit `color` >
10
+ * this > dimColor. Crosses Box boundaries (Ink's style cascade doesn't). */
11
+ export const TextHoverColorContext = React.createContext<keyof Theme | undefined>(undefined);
12
+ export type Props = {
13
+ /**
14
+ * Change text color. Accepts a theme key or raw color value.
15
+ */
16
+ readonly color?: keyof Theme | Color;
17
+
18
+ /**
19
+ * Same as `color`, but for background. Must be a theme key.
20
+ */
21
+ readonly backgroundColor?: keyof Theme;
22
+
23
+ /**
24
+ * Dim the color using the theme's inactive color.
25
+ * This is compatible with bold (unlike ANSI dim).
26
+ */
27
+ readonly dimColor?: boolean;
28
+
29
+ /**
30
+ * Make the text bold.
31
+ */
32
+ readonly bold?: boolean;
33
+
34
+ /**
35
+ * Make the text italic.
36
+ */
37
+ readonly italic?: boolean;
38
+
39
+ /**
40
+ * Make the text underlined.
41
+ */
42
+ readonly underline?: boolean;
43
+
44
+ /**
45
+ * Make the text crossed with a line.
46
+ */
47
+ readonly strikethrough?: boolean;
48
+
49
+ /**
50
+ * Inverse background and foreground colors.
51
+ */
52
+ readonly inverse?: boolean;
53
+
54
+ /**
55
+ * This property tells Ink to wrap or truncate text if its width is larger than container.
56
+ * If `wrap` is passed (by default), Ink will wrap text and split it into multiple lines.
57
+ * If `truncate-*` is passed, Ink will truncate text instead, which will result in one line of text with the rest cut off.
58
+ */
59
+ readonly wrap?: Styles['textWrap'];
60
+ readonly children?: ReactNode;
61
+ };
62
+
63
+ /**
64
+ * Resolves a color value that may be a theme key to a raw Color.
65
+ */
66
+ function resolveColor(color: keyof Theme | Color | undefined, theme: Theme): Color | undefined {
67
+ if (!color) return undefined;
68
+ // Check if it's a raw color (starts with rgb(, #, ansi256(, or ansi:)
69
+ if (color.startsWith('rgb(') || color.startsWith('#') || color.startsWith('ansi256(') || color.startsWith('ansi:')) {
70
+ return color as Color;
71
+ }
72
+ // It's a theme key - resolve it
73
+ return theme[color as keyof Theme] as Color;
74
+ }
75
+
76
+ /**
77
+ * Theme-aware Text component that resolves theme color keys to raw colors.
78
+ * This wraps the base Text component with theme resolution.
79
+ */
80
+ export default function ThemedText(t0) {
81
+ const $ = _c(10);
82
+ const {
83
+ color,
84
+ backgroundColor,
85
+ dimColor: t1,
86
+ bold: t2,
87
+ italic: t3,
88
+ underline: t4,
89
+ strikethrough: t5,
90
+ inverse: t6,
91
+ wrap: t7,
92
+ children
93
+ } = t0;
94
+ const dimColor = t1 === undefined ? false : t1;
95
+ const bold = t2 === undefined ? false : t2;
96
+ const italic = t3 === undefined ? false : t3;
97
+ const underline = t4 === undefined ? false : t4;
98
+ const strikethrough = t5 === undefined ? false : t5;
99
+ const inverse = t6 === undefined ? false : t6;
100
+ const wrap = t7 === undefined ? "wrap" : t7;
101
+ const [themeName] = useTheme();
102
+ const theme = getTheme(themeName);
103
+ const hoverColor = useContext(TextHoverColorContext);
104
+ const resolvedColor = !color && hoverColor ? resolveColor(hoverColor, theme) : dimColor ? theme.inactive as Color : resolveColor(color, theme);
105
+ const resolvedBackgroundColor = backgroundColor ? theme[backgroundColor] as Color : undefined;
106
+ let t8;
107
+ if ($[0] !== bold || $[1] !== children || $[2] !== inverse || $[3] !== italic || $[4] !== resolvedBackgroundColor || $[5] !== resolvedColor || $[6] !== strikethrough || $[7] !== underline || $[8] !== wrap) {
108
+ t8 = <Text color={resolvedColor} backgroundColor={resolvedBackgroundColor} bold={bold} italic={italic} underline={underline} strikethrough={strikethrough} inverse={inverse} wrap={wrap}>{children}</Text>;
109
+ $[0] = bold;
110
+ $[1] = children;
111
+ $[2] = inverse;
112
+ $[3] = italic;
113
+ $[4] = resolvedBackgroundColor;
114
+ $[5] = resolvedColor;
115
+ $[6] = strikethrough;
116
+ $[7] = underline;
117
+ $[8] = wrap;
118
+ $[9] = t8;
119
+ } else {
120
+ t8 = $[9];
121
+ }
122
+ return t8;
123
+ }
124
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdE5vZGUiLCJSZWFjdCIsInVzZUNvbnRleHQiLCJUZXh0IiwiQ29sb3IiLCJTdHlsZXMiLCJnZXRUaGVtZSIsIlRoZW1lIiwidXNlVGhlbWUiLCJUZXh0SG92ZXJDb2xvckNvbnRleHQiLCJjcmVhdGVDb250ZXh0IiwidW5kZWZpbmVkIiwiUHJvcHMiLCJjb2xvciIsImJhY2tncm91bmRDb2xvciIsImRpbUNvbG9yIiwiYm9sZCIsIml0YWxpYyIsInVuZGVybGluZSIsInN0cmlrZXRocm91Z2giLCJpbnZlcnNlIiwid3JhcCIsImNoaWxkcmVuIiwicmVzb2x2ZUNvbG9yIiwidGhlbWUiLCJzdGFydHNXaXRoIiwiVGhlbWVkVGV4dCIsInQwIiwiJCIsIl9jIiwidDEiLCJ0MiIsInQzIiwidDQiLCJ0NSIsInQ2IiwidDciLCJ0aGVtZU5hbWUiLCJob3ZlckNvbG9yIiwicmVzb2x2ZWRDb2xvciIsImluYWN0aXZlIiwicmVzb2x2ZWRCYWNrZ3JvdW5kQ29sb3IiLCJ0OCJdLCJzb3VyY2VzIjpbIlRoZW1lZFRleHQudHN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgUmVhY3ROb2RlIH0gZnJvbSAncmVhY3QnXG5pbXBvcnQgUmVhY3QsIHsgdXNlQ29udGV4dCB9IGZyb20gJ3JlYWN0J1xuaW1wb3J0IFRleHQgZnJvbSAnLi4vLi4vaW5rL2NvbXBvbmVudHMvVGV4dC5qcydcbmltcG9ydCB0eXBlIHsgQ29sb3IsIFN0eWxlcyB9IGZyb20gJy4uLy4uL2luay9zdHlsZXMuanMnXG5pbXBvcnQgeyBnZXRUaGVtZSwgdHlwZSBUaGVtZSB9IGZyb20gJy4uLy4uL3V0aWxzL3RoZW1lLmpzJ1xuaW1wb3J0IHsgdXNlVGhlbWUgfSBmcm9tICcuL1RoZW1lUHJvdmlkZXIuanMnXG5cbi8qKiBDb2xvcnMgdW5jb2xvcmVkIFRoZW1lZFRleHQgaW4gdGhlIHN1YnRyZWUuIFByZWNlZGVuY2U6IGV4cGxpY2l0IGBjb2xvcmAgPlxuICogIHRoaXMgPiBkaW1Db2xvci4gQ3Jvc3NlcyBCb3ggYm91bmRhcmllcyAoSW5rJ3Mgc3R5bGUgY2FzY2FkZSBkb2Vzbid0KS4gKi9cbmV4cG9ydCBjb25zdCBUZXh0SG92ZXJDb2xvckNvbnRleHQgPSBSZWFjdC5jcmVhdGVDb250ZXh0PFxuICBrZXlvZiBUaGVtZSB8IHVuZGVmaW5lZFxuPih1bmRlZmluZWQpXG5cbmV4cG9ydCB0eXBlIFByb3BzID0ge1xuICAvKipcbiAgICogQ2hhbmdlIHRleHQgY29sb3IuIEFjY2VwdHMgYSB0aGVtZSBrZXkgb3IgcmF3IGNvbG9yIHZhbHVlLlxuICAgKi9cbiAgcmVhZG9ubHkgY29sb3I/OiBrZXlvZiBUaGVtZSB8IENvbG9yXG5cbiAgLyoqXG4gICAqIFNhbWUgYXMgYGNvbG9yYCwgYnV0IGZvciBiYWNrZ3JvdW5kLiBNdXN0IGJlIGEgdGhlbWUga2V5LlxuICAgKi9cbiAgcmVhZG9ubHkgYmFja2dyb3VuZENvbG9yPzoga2V5b2YgVGhlbWVcblxuICAvKipcbiAgICogRGltIHRoZSBjb2xvciB1c2luZyB0aGUgdGhlbWUncyBpbmFjdGl2ZSBjb2xvci5cbiAgICogVGhpcyBpcyBjb21wYXRpYmxlIHdpdGggYm9sZCAodW5saWtlIEFOU0kgZGltKS5cbiAgICovXG4gIHJlYWRvbmx5IGRpbUNvbG9yPzogYm9vbGVhblxuXG4gIC8qKlxuICAgKiBNYWtlIHRoZSB0ZXh0IGJvbGQuXG4gICAqL1xuICByZWFkb25seSBib2xkPzogYm9vbGVhblxuXG4gIC8qKlxuICAgKiBNYWtlIHRoZSB0ZXh0IGl0YWxpYy5cbiAgICovXG4gIHJlYWRvbmx5IGl0YWxpYz86IGJvb2xlYW5cblxuICAvKipcbiAgICogTWFrZSB0aGUgdGV4dCB1bmRlcmxpbmVkLlxuICAgKi9cbiAgcmVhZG9ubHkgdW5kZXJsaW5lPzogYm9vbGVhblxuXG4gIC8qKlxuICAgKiBNYWtlIHRoZSB0ZXh0IGNyb3NzZWQgd2l0aCBhIGxpbmUuXG4gICAqL1xuICByZWFkb25seSBzdHJpa2V0aHJvdWdoPzogYm9vbGVhblxuXG4gIC8qKlxuICAgKiBJbnZlcnNlIGJhY2tncm91bmQgYW5kIGZvcmVncm91bmQgY29sb3JzLlxuICAgKi9cbiAgcmVhZG9ubHkgaW52ZXJzZT86IGJvb2xlYW5cblxuICAvKipcbiAgICogVGhpcyBwcm9wZXJ0eSB0ZWxscyBJbmsgdG8gd3JhcCBvciB0cnVuY2F0ZSB0ZXh0IGlmIGl0cyB3aWR0aCBpcyBsYXJnZXIgdGhhbiBjb250YWluZXIuXG4gICAqIElmIGB3cmFwYCBpcyBwYXNzZWQgKGJ5IGRlZmF1bHQpLCBJbmsgd2lsbCB3cmFwIHRleHQgYW5kIHNwbGl0IGl0IGludG8gbXVsdGlwbGUgbGluZXMuXG4gICAqIElmIGB0cnVuY2F0ZS0qYCBpcyBwYXNzZWQsIEluayB3aWxsIHRydW5jYXRlIHRleHQgaW5zdGVhZCwgd2hpY2ggd2lsbCByZXN1bHQgaW4gb25lIGxpbmUgb2YgdGV4dCB3aXRoIHRoZSByZXN0IGN1dCBvZmYuXG4gICAqL1xuICByZWFkb25seSB3cmFwPzogU3R5bGVzWyd0ZXh0V3JhcCddXG5cbiAgcmVhZG9ubHkgY2hpbGRyZW4/OiBSZWFjdE5vZGVcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyBhIGNvbG9yIHZhbHVlIHRoYXQgbWF5IGJlIGEgdGhlbWUga2V5IHRvIGEgcmF3IENvbG9yLlxuICovXG5mdW5jdGlvbiByZXNvbHZlQ29sb3IoXG4gIGNvbG9yOiBrZXlvZiBUaGVtZSB8IENvbG9yIHwgdW5kZWZpbmVkLFxuICB0aGVtZTogVGhlbWUsXG4pOiBDb2xvciB8IHVuZGVmaW5lZCB7XG4gIGlmICghY29sb3IpIHJldHVybiB1bmRlZmluZWRcbiAgLy8gQ2hlY2sgaWYgaXQncyBhIHJhdyBjb2xvciAoc3RhcnRzIHdpdGggcmdiKCwgIywgYW5zaTI1NigsIG9yIGFuc2k6KVxuICBpZiAoXG4gICAgY29sb3Iuc3RhcnRzV2l0aCgncmdiKCcpIHx8XG4gICAgY29sb3Iuc3RhcnRzV2l0aCgnIycpIHx8XG4gICAgY29sb3Iuc3RhcnRzV2l0aCgnYW5zaTI1NignKSB8fFxuICAgIGNvbG9yLnN0YXJ0c1dpdGgoJ2Fuc2k6JylcbiAgKSB7XG4gICAgcmV0dXJuIGNvbG9yIGFzIENvbG9yXG4gIH1cbiAgLy8gSXQncyBhIHRoZW1lIGtleSAtIHJlc29sdmUgaXRcbiAgcmV0dXJuIHRoZW1lW2NvbG9yIGFzIGtleW9mIFRoZW1lXSBhcyBDb2xvclxufVxuXG4vKipcbiAqIFRoZW1lLWF3YXJlIFRleHQgY29tcG9uZW50IHRoYXQgcmVzb2x2ZXMgdGhlbWUgY29sb3Iga2V5cyB0byByYXcgY29sb3JzLlxuICogVGhpcyB3cmFwcyB0aGUgYmFzZSBUZXh0IGNvbXBvbmVudCB3aXRoIHRoZW1lIHJlc29sdXRpb24uXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIFRoZW1lZFRleHQoe1xuICBjb2xvcixcbiAgYmFja2dyb3VuZENvbG9yLFxuICBkaW1Db2xvciA9IGZhbHNlLFxuICBib2xkID0gZmFsc2UsXG4gIGl0YWxpYyA9IGZhbHNlLFxuICB1bmRlcmxpbmUgPSBmYWxzZSxcbiAgc3RyaWtldGhyb3VnaCA9IGZhbHNlLFxuICBpbnZlcnNlID0gZmFsc2UsXG4gIHdyYXAgPSAnd3JhcCcsXG4gIGNoaWxkcmVuLFxufTogUHJvcHMpOiBSZWFjdC5SZWFjdE5vZGUge1xuICBjb25zdCBbdGhlbWVOYW1lXSA9IHVzZVRoZW1lKClcbiAgY29uc3QgdGhlbWUgPSBnZXRUaGVtZSh0aGVtZU5hbWUpXG4gIGNvbnN0IGhvdmVyQ29sb3IgPSB1c2VDb250ZXh0KFRleHRIb3ZlckNvbG9yQ29udGV4dClcblxuICAvLyBSZXNvbHZlIHRoZW1lIGtleXMgdG8gcmF3IGNvbG9yc1xuICBjb25zdCByZXNvbHZlZENvbG9yID1cbiAgICAhY29sb3IgJiYgaG92ZXJDb2xvclxuICAgICAgPyByZXNvbHZlQ29sb3IoaG92ZXJDb2xvciwgdGhlbWUpXG4gICAgICA6IGRpbUNvbG9yXG4gICAgICAgID8gKHRoZW1lLmluYWN0aXZlIGFzIENvbG9yKVxuICAgICAgICA6IHJlc29sdmVDb2xvcihjb2xvciwgdGhlbWUpXG4gIGNvbnN0IHJlc29sdmVkQmFja2dyb3VuZENvbG9yID0gYmFja2dyb3VuZENvbG9yXG4gICAgPyAodGhlbWVbYmFja2dyb3VuZENvbG9yXSBhcyBDb2xvcilcbiAgICA6IHVuZGVmaW5lZFxuXG4gIHJldHVybiAoXG4gICAgPFRleHRcbiAgICAgIGNvbG9yPXtyZXNvbHZlZENvbG9yfVxuICAgICAgYmFja2dyb3VuZENvbG9yPXtyZXNvbHZlZEJhY2tncm91bmRDb2xvcn1cbiAgICAgIGJvbGQ9e2JvbGR9XG4gICAgICBpdGFsaWM9e2l0YWxpY31cbiAgICAgIHVuZGVybGluZT17dW5kZXJsaW5lfVxuICAgICAgc3RyaWtldGhyb3VnaD17c3RyaWtldGhyb3VnaH1cbiAgICAgIGludmVyc2U9e2ludmVyc2V9XG4gICAgICB3cmFwPXt3cmFwfVxuICAgID5cbiAgICAgIHtjaGlsZHJlbn1cbiAgICA8L1RleHQ+XG4gIClcbn1cbiJdLCJtYXBwaW5ncyI6IjtBQUFBLGNBQWNBLFNBQVMsUUFBUSxPQUFPO0FBQ3RDLE9BQU9DLEtBQUssSUFBSUMsVUFBVSxRQUFRLE9BQU87QUFDekMsT0FBT0MsSUFBSSxNQUFNLDhCQUE4QjtBQUMvQyxjQUFjQyxLQUFLLEVBQUVDLE1BQU0sUUFBUSxxQkFBcUI7QUFDeEQsU0FBU0MsUUFBUSxFQUFFLEtBQUtDLEtBQUssUUFBUSxzQkFBc0I7QUFDM0QsU0FBU0MsUUFBUSxRQUFRLG9CQUFvQjs7QUFFN0M7QUFDQTtBQUNBLE9BQU8sTUFBTUMscUJBQXFCLEdBQUdSLEtBQUssQ0FBQ1MsYUFBYSxDQUN0RCxNQUFNSCxLQUFLLEdBQUcsU0FBUyxDQUN4QixDQUFDSSxTQUFTLENBQUM7QUFFWixPQUFPLEtBQUtDLEtBQUssR0FBRztFQUNsQjtBQUNGO0FBQ0E7RUFDRSxTQUFTQyxLQUFLLENBQUMsRUFBRSxNQUFNTixLQUFLLEdBQUdILEtBQUs7O0VBRXBDO0FBQ0Y7QUFDQTtFQUNFLFNBQVNVLGVBQWUsQ0FBQyxFQUFFLE1BQU1QLEtBQUs7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
src/components/hooks/HooksConfigMenu.tsx ADDED
@@ -0,0 +1,578 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { c as _c } from "react/compiler-runtime";
2
+ /**
3
+ * HooksConfigMenu is a read-only browser for configured hooks.
4
+ *
5
+ * Users can drill into each hook event, see configured matchers and hooks
6
+ * (of any type: command, prompt, agent, http), and view individual hook
7
+ * details. To add or modify hooks, users should edit settings.json directly
8
+ * or ask Claude — the menu directs them there.
9
+ *
10
+ * The menu is read-only because the old editing UI only supported
11
+ * command-type hooks and duplicating the settings.json editing surface
12
+ * in-menu for all four types would be a maintenance burden.
13
+ */
14
+ import * as React from 'react';
15
+ import { useCallback, useMemo, useState } from 'react';
16
+ import type { HookEvent } from 'src/entrypoints/agentSdkTypes.js';
17
+ import { useAppState, useAppStateStore } from 'src/state/AppState.js';
18
+ import type { CommandResultDisplay } from '../../commands.js';
19
+ import { useSettingsChange } from '../../hooks/useSettingsChange.js';
20
+ import { Box, Text } from '../../ink.js';
21
+ import { useKeybinding } from '../../keybindings/useKeybinding.js';
22
+ import { getHookEventMetadata, getHooksForMatcher, getMatcherMetadata, getSortedMatchersForEvent, groupHooksByEventAndMatcher } from '../../utils/hooks/hooksConfigManager.js';
23
+ import type { IndividualHookConfig } from '../../utils/hooks/hooksSettings.js';
24
+ import { getSettings_DEPRECATED, getSettingsForSource } from '../../utils/settings/settings.js';
25
+ import { plural } from '../../utils/stringUtils.js';
26
+ import { Dialog } from '../design-system/Dialog.js';
27
+ import { SelectEventMode } from './SelectEventMode.js';
28
+ import { SelectHookMode } from './SelectHookMode.js';
29
+ import { SelectMatcherMode } from './SelectMatcherMode.js';
30
+ import { ViewHookMode } from './ViewHookMode.js';
31
+ type Props = {
32
+ toolNames: string[];
33
+ onExit: (result?: string, options?: {
34
+ display?: CommandResultDisplay;
35
+ }) => void;
36
+ };
37
+ type ModeState = {
38
+ mode: 'select-event';
39
+ } | {
40
+ mode: 'select-matcher';
41
+ event: HookEvent;
42
+ } | {
43
+ mode: 'select-hook';
44
+ event: HookEvent;
45
+ matcher: string;
46
+ } | {
47
+ mode: 'view-hook';
48
+ event: HookEvent;
49
+ hook: IndividualHookConfig;
50
+ };
51
+ export function HooksConfigMenu(t0) {
52
+ const $ = _c(100);
53
+ const {
54
+ toolNames,
55
+ onExit
56
+ } = t0;
57
+ let t1;
58
+ if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
59
+ t1 = {
60
+ mode: "select-event"
61
+ };
62
+ $[0] = t1;
63
+ } else {
64
+ t1 = $[0];
65
+ }
66
+ const [modeState, setModeState] = useState(t1);
67
+ const [disabledByPolicy, setDisabledByPolicy] = useState(_temp);
68
+ const [restrictedByPolicy, setRestrictedByPolicy] = useState(_temp2);
69
+ let t2;
70
+ if ($[1] === Symbol.for("react.memo_cache_sentinel")) {
71
+ t2 = source => {
72
+ if (source === "policySettings") {
73
+ const settings_0 = getSettings_DEPRECATED();
74
+ const hooksDisabled_0 = settings_0?.disableAllHooks === true;
75
+ setDisabledByPolicy(hooksDisabled_0 && getSettingsForSource("policySettings")?.disableAllHooks === true);
76
+ setRestrictedByPolicy(getSettingsForSource("policySettings")?.allowManagedHooksOnly === true);
77
+ }
78
+ };
79
+ $[1] = t2;
80
+ } else {
81
+ t2 = $[1];
82
+ }
83
+ useSettingsChange(t2);
84
+ const mode = modeState.mode;
85
+ const selectedEvent = "event" in modeState ? modeState.event : "PreToolUse";
86
+ const selectedMatcher = "matcher" in modeState ? modeState.matcher : null;
87
+ const mcp = useAppState(_temp3);
88
+ const appStateStore = useAppStateStore();
89
+ let t3;
90
+ if ($[2] !== mcp.tools || $[3] !== toolNames) {
91
+ t3 = [...toolNames, ...mcp.tools.map(_temp4)];
92
+ $[2] = mcp.tools;
93
+ $[3] = toolNames;
94
+ $[4] = t3;
95
+ } else {
96
+ t3 = $[4];
97
+ }
98
+ const combinedToolNames = t3;
99
+ let t4;
100
+ if ($[5] !== appStateStore || $[6] !== combinedToolNames) {
101
+ t4 = groupHooksByEventAndMatcher(appStateStore.getState(), combinedToolNames);
102
+ $[5] = appStateStore;
103
+ $[6] = combinedToolNames;
104
+ $[7] = t4;
105
+ } else {
106
+ t4 = $[7];
107
+ }
108
+ const hooksByEventAndMatcher = t4;
109
+ let t5;
110
+ if ($[8] !== hooksByEventAndMatcher || $[9] !== selectedEvent) {
111
+ t5 = getSortedMatchersForEvent(hooksByEventAndMatcher, selectedEvent);
112
+ $[8] = hooksByEventAndMatcher;
113
+ $[9] = selectedEvent;
114
+ $[10] = t5;
115
+ } else {
116
+ t5 = $[10];
117
+ }
118
+ const sortedMatchersForSelectedEvent = t5;
119
+ let t6;
120
+ if ($[11] !== hooksByEventAndMatcher || $[12] !== selectedEvent || $[13] !== selectedMatcher) {
121
+ t6 = getHooksForMatcher(hooksByEventAndMatcher, selectedEvent, selectedMatcher);
122
+ $[11] = hooksByEventAndMatcher;
123
+ $[12] = selectedEvent;
124
+ $[13] = selectedMatcher;
125
+ $[14] = t6;
126
+ } else {
127
+ t6 = $[14];
128
+ }
129
+ const hooksForSelectedMatcher = t6;
130
+ let t7;
131
+ if ($[15] !== onExit) {
132
+ t7 = () => {
133
+ onExit("Hooks dialog dismissed", {
134
+ display: "system"
135
+ });
136
+ };
137
+ $[15] = onExit;
138
+ $[16] = t7;
139
+ } else {
140
+ t7 = $[16];
141
+ }
142
+ const handleExit = t7;
143
+ const t8 = mode === "select-event";
144
+ let t9;
145
+ if ($[17] !== t8) {
146
+ t9 = {
147
+ context: "Confirmation",
148
+ isActive: t8
149
+ };
150
+ $[17] = t8;
151
+ $[18] = t9;
152
+ } else {
153
+ t9 = $[18];
154
+ }
155
+ useKeybinding("confirm:no", handleExit, t9);
156
+ let t10;
157
+ if ($[19] === Symbol.for("react.memo_cache_sentinel")) {
158
+ t10 = () => {
159
+ setModeState({
160
+ mode: "select-event"
161
+ });
162
+ };
163
+ $[19] = t10;
164
+ } else {
165
+ t10 = $[19];
166
+ }
167
+ const t11 = mode === "select-matcher";
168
+ let t12;
169
+ if ($[20] !== t11) {
170
+ t12 = {
171
+ context: "Confirmation",
172
+ isActive: t11
173
+ };
174
+ $[20] = t11;
175
+ $[21] = t12;
176
+ } else {
177
+ t12 = $[21];
178
+ }
179
+ useKeybinding("confirm:no", t10, t12);
180
+ let t13;
181
+ if ($[22] !== combinedToolNames || $[23] !== modeState) {
182
+ t13 = () => {
183
+ if ("event" in modeState) {
184
+ if (getMatcherMetadata(modeState.event, combinedToolNames) !== undefined) {
185
+ setModeState({
186
+ mode: "select-matcher",
187
+ event: modeState.event
188
+ });
189
+ } else {
190
+ setModeState({
191
+ mode: "select-event"
192
+ });
193
+ }
194
+ }
195
+ };
196
+ $[22] = combinedToolNames;
197
+ $[23] = modeState;
198
+ $[24] = t13;
199
+ } else {
200
+ t13 = $[24];
201
+ }
202
+ const t14 = mode === "select-hook";
203
+ let t15;
204
+ if ($[25] !== t14) {
205
+ t15 = {
206
+ context: "Confirmation",
207
+ isActive: t14
208
+ };
209
+ $[25] = t14;
210
+ $[26] = t15;
211
+ } else {
212
+ t15 = $[26];
213
+ }
214
+ useKeybinding("confirm:no", t13, t15);
215
+ let t16;
216
+ if ($[27] !== modeState) {
217
+ t16 = () => {
218
+ if (modeState.mode === "view-hook") {
219
+ const {
220
+ event,
221
+ hook
222
+ } = modeState;
223
+ setModeState({
224
+ mode: "select-hook",
225
+ event,
226
+ matcher: hook.matcher || ""
227
+ });
228
+ }
229
+ };
230
+ $[27] = modeState;
231
+ $[28] = t16;
232
+ } else {
233
+ t16 = $[28];
234
+ }
235
+ const t17 = mode === "view-hook";
236
+ let t18;
237
+ if ($[29] !== t17) {
238
+ t18 = {
239
+ context: "Confirmation",
240
+ isActive: t17
241
+ };
242
+ $[29] = t17;
243
+ $[30] = t18;
244
+ } else {
245
+ t18 = $[30];
246
+ }
247
+ useKeybinding("confirm:no", t16, t18);
248
+ let t19;
249
+ if ($[31] !== combinedToolNames) {
250
+ t19 = getHookEventMetadata(combinedToolNames);
251
+ $[31] = combinedToolNames;
252
+ $[32] = t19;
253
+ } else {
254
+ t19 = $[32];
255
+ }
256
+ const hookEventMetadata = t19;
257
+ const settings_1 = getSettings_DEPRECATED();
258
+ const hooksDisabled_1 = settings_1?.disableAllHooks === true;
259
+ let t20;
260
+ if ($[33] !== hooksByEventAndMatcher) {
261
+ const byEvent = {};
262
+ let total = 0;
263
+ for (const [event_0, matchers] of Object.entries(hooksByEventAndMatcher)) {
264
+ const eventCount = Object.values(matchers).reduce(_temp5, 0);
265
+ byEvent[event_0 as HookEvent] = eventCount;
266
+ total = total + eventCount;
267
+ }
268
+ t20 = {
269
+ hooksByEvent: byEvent,
270
+ totalHooksCount: total
271
+ };
272
+ $[33] = hooksByEventAndMatcher;
273
+ $[34] = t20;
274
+ } else {
275
+ t20 = $[34];
276
+ }
277
+ const {
278
+ hooksByEvent,
279
+ totalHooksCount
280
+ } = t20;
281
+ if (hooksDisabled_1) {
282
+ let t21;
283
+ if ($[35] === Symbol.for("react.memo_cache_sentinel")) {
284
+ t21 = <Text bold={true}>disabled</Text>;
285
+ $[35] = t21;
286
+ } else {
287
+ t21 = $[35];
288
+ }
289
+ const t22 = disabledByPolicy && " by a managed settings file";
290
+ let t23;
291
+ if ($[36] !== totalHooksCount) {
292
+ t23 = <Text bold={true}>{totalHooksCount}</Text>;
293
+ $[36] = totalHooksCount;
294
+ $[37] = t23;
295
+ } else {
296
+ t23 = $[37];
297
+ }
298
+ let t24;
299
+ if ($[38] !== totalHooksCount) {
300
+ t24 = plural(totalHooksCount, "hook");
301
+ $[38] = totalHooksCount;
302
+ $[39] = t24;
303
+ } else {
304
+ t24 = $[39];
305
+ }
306
+ let t25;
307
+ if ($[40] !== totalHooksCount) {
308
+ t25 = plural(totalHooksCount, "is", "are");
309
+ $[40] = totalHooksCount;
310
+ $[41] = t25;
311
+ } else {
312
+ t25 = $[41];
313
+ }
314
+ let t26;
315
+ if ($[42] !== t22 || $[43] !== t23 || $[44] !== t24 || $[45] !== t25) {
316
+ t26 = <Text>All hooks are currently {t21}{t22}. You have{" "}{t23} configured{" "}{t24} that{" "}{t25} not running.</Text>;
317
+ $[42] = t22;
318
+ $[43] = t23;
319
+ $[44] = t24;
320
+ $[45] = t25;
321
+ $[46] = t26;
322
+ } else {
323
+ t26 = $[46];
324
+ }
325
+ let t27;
326
+ let t28;
327
+ let t29;
328
+ let t30;
329
+ if ($[47] === Symbol.for("react.memo_cache_sentinel")) {
330
+ t27 = <Box marginTop={1}><Text dimColor={true}>When hooks are disabled:</Text></Box>;
331
+ t28 = <Text dimColor={true}>· No hook commands will execute</Text>;
332
+ t29 = <Text dimColor={true}>· StatusLine will not be displayed</Text>;
333
+ t30 = <Text dimColor={true}>· Tool operations will proceed without hook validation</Text>;
334
+ $[47] = t27;
335
+ $[48] = t28;
336
+ $[49] = t29;
337
+ $[50] = t30;
338
+ } else {
339
+ t27 = $[47];
340
+ t28 = $[48];
341
+ t29 = $[49];
342
+ t30 = $[50];
343
+ }
344
+ let t31;
345
+ if ($[51] !== t26) {
346
+ t31 = <Box flexDirection="column">{t26}{t27}{t28}{t29}{t30}</Box>;
347
+ $[51] = t26;
348
+ $[52] = t31;
349
+ } else {
350
+ t31 = $[52];
351
+ }
352
+ let t32;
353
+ if ($[53] !== disabledByPolicy) {
354
+ t32 = !disabledByPolicy && <Text dimColor={true}>To re-enable hooks, remove "disableAllHooks" from settings.json or ask Claude.</Text>;
355
+ $[53] = disabledByPolicy;
356
+ $[54] = t32;
357
+ } else {
358
+ t32 = $[54];
359
+ }
360
+ let t33;
361
+ if ($[55] !== t31 || $[56] !== t32) {
362
+ t33 = <Box flexDirection="column" gap={1}>{t31}{t32}</Box>;
363
+ $[55] = t31;
364
+ $[56] = t32;
365
+ $[57] = t33;
366
+ } else {
367
+ t33 = $[57];
368
+ }
369
+ let t34;
370
+ if ($[58] !== handleExit || $[59] !== t33) {
371
+ t34 = <Dialog title="Hook Configuration - Disabled" onCancel={handleExit} inputGuide={_temp6}>{t33}</Dialog>;
372
+ $[58] = handleExit;
373
+ $[59] = t33;
374
+ $[60] = t34;
375
+ } else {
376
+ t34 = $[60];
377
+ }
378
+ return t34;
379
+ }
380
+ switch (modeState.mode) {
381
+ case "select-event":
382
+ {
383
+ let t21;
384
+ if ($[61] !== combinedToolNames) {
385
+ t21 = event_2 => {
386
+ if (getMatcherMetadata(event_2, combinedToolNames) !== undefined) {
387
+ setModeState({
388
+ mode: "select-matcher",
389
+ event: event_2
390
+ });
391
+ } else {
392
+ setModeState({
393
+ mode: "select-hook",
394
+ event: event_2,
395
+ matcher: ""
396
+ });
397
+ }
398
+ };
399
+ $[61] = combinedToolNames;
400
+ $[62] = t21;
401
+ } else {
402
+ t21 = $[62];
403
+ }
404
+ let t22;
405
+ if ($[63] !== handleExit || $[64] !== hookEventMetadata || $[65] !== hooksByEvent || $[66] !== restrictedByPolicy || $[67] !== t21 || $[68] !== totalHooksCount) {
406
+ t22 = <SelectEventMode hookEventMetadata={hookEventMetadata} hooksByEvent={hooksByEvent} totalHooksCount={totalHooksCount} restrictedByPolicy={restrictedByPolicy} onSelectEvent={t21} onCancel={handleExit} />;
407
+ $[63] = handleExit;
408
+ $[64] = hookEventMetadata;
409
+ $[65] = hooksByEvent;
410
+ $[66] = restrictedByPolicy;
411
+ $[67] = t21;
412
+ $[68] = totalHooksCount;
413
+ $[69] = t22;
414
+ } else {
415
+ t22 = $[69];
416
+ }
417
+ return t22;
418
+ }
419
+ case "select-matcher":
420
+ {
421
+ const t21 = hookEventMetadata[modeState.event];
422
+ let t22;
423
+ if ($[70] !== modeState.event) {
424
+ t22 = matcher => {
425
+ setModeState({
426
+ mode: "select-hook",
427
+ event: modeState.event,
428
+ matcher
429
+ });
430
+ };
431
+ $[70] = modeState.event;
432
+ $[71] = t22;
433
+ } else {
434
+ t22 = $[71];
435
+ }
436
+ let t23;
437
+ if ($[72] === Symbol.for("react.memo_cache_sentinel")) {
438
+ t23 = () => {
439
+ setModeState({
440
+ mode: "select-event"
441
+ });
442
+ };
443
+ $[72] = t23;
444
+ } else {
445
+ t23 = $[72];
446
+ }
447
+ let t24;
448
+ if ($[73] !== hooksByEventAndMatcher || $[74] !== modeState.event || $[75] !== sortedMatchersForSelectedEvent || $[76] !== t21.description || $[77] !== t22) {
449
+ t24 = <SelectMatcherMode selectedEvent={modeState.event} matchersForSelectedEvent={sortedMatchersForSelectedEvent} hooksByEventAndMatcher={hooksByEventAndMatcher} eventDescription={t21.description} onSelect={t22} onCancel={t23} />;
450
+ $[73] = hooksByEventAndMatcher;
451
+ $[74] = modeState.event;
452
+ $[75] = sortedMatchersForSelectedEvent;
453
+ $[76] = t21.description;
454
+ $[77] = t22;
455
+ $[78] = t24;
456
+ } else {
457
+ t24 = $[78];
458
+ }
459
+ return t24;
460
+ }
461
+ case "select-hook":
462
+ {
463
+ const t21 = hookEventMetadata[modeState.event];
464
+ let t22;
465
+ if ($[79] !== modeState.event) {
466
+ t22 = hook_1 => {
467
+ setModeState({
468
+ mode: "view-hook",
469
+ event: modeState.event,
470
+ hook: hook_1
471
+ });
472
+ };
473
+ $[79] = modeState.event;
474
+ $[80] = t22;
475
+ } else {
476
+ t22 = $[80];
477
+ }
478
+ let t23;
479
+ if ($[81] !== combinedToolNames || $[82] !== modeState.event) {
480
+ t23 = () => {
481
+ if (getMatcherMetadata(modeState.event, combinedToolNames) !== undefined) {
482
+ setModeState({
483
+ mode: "select-matcher",
484
+ event: modeState.event
485
+ });
486
+ } else {
487
+ setModeState({
488
+ mode: "select-event"
489
+ });
490
+ }
491
+ };
492
+ $[81] = combinedToolNames;
493
+ $[82] = modeState.event;
494
+ $[83] = t23;
495
+ } else {
496
+ t23 = $[83];
497
+ }
498
+ let t24;
499
+ if ($[84] !== hooksForSelectedMatcher || $[85] !== modeState.event || $[86] !== modeState.matcher || $[87] !== t21 || $[88] !== t22 || $[89] !== t23) {
500
+ t24 = <SelectHookMode selectedEvent={modeState.event} selectedMatcher={modeState.matcher} hooksForSelectedMatcher={hooksForSelectedMatcher} hookEventMetadata={t21} onSelect={t22} onCancel={t23} />;
501
+ $[84] = hooksForSelectedMatcher;
502
+ $[85] = modeState.event;
503
+ $[86] = modeState.matcher;
504
+ $[87] = t21;
505
+ $[88] = t22;
506
+ $[89] = t23;
507
+ $[90] = t24;
508
+ } else {
509
+ t24 = $[90];
510
+ }
511
+ return t24;
512
+ }
513
+ case "view-hook":
514
+ {
515
+ const t21 = modeState.hook;
516
+ let t22;
517
+ if ($[91] !== combinedToolNames || $[92] !== modeState.event) {
518
+ t22 = getMatcherMetadata(modeState.event, combinedToolNames);
519
+ $[91] = combinedToolNames;
520
+ $[92] = modeState.event;
521
+ $[93] = t22;
522
+ } else {
523
+ t22 = $[93];
524
+ }
525
+ const t23 = t22 !== undefined;
526
+ let t24;
527
+ if ($[94] !== modeState) {
528
+ t24 = () => {
529
+ const {
530
+ event: event_1,
531
+ hook: hook_0
532
+ } = modeState;
533
+ setModeState({
534
+ mode: "select-hook",
535
+ event: event_1,
536
+ matcher: hook_0.matcher || ""
537
+ });
538
+ };
539
+ $[94] = modeState;
540
+ $[95] = t24;
541
+ } else {
542
+ t24 = $[95];
543
+ }
544
+ let t25;
545
+ if ($[96] !== modeState.hook || $[97] !== t23 || $[98] !== t24) {
546
+ t25 = <ViewHookMode selectedHook={t21} eventSupportsMatcher={t23} onCancel={t24} />;
547
+ $[96] = modeState.hook;
548
+ $[97] = t23;
549
+ $[98] = t24;
550
+ $[99] = t25;
551
+ } else {
552
+ t25 = $[99];
553
+ }
554
+ return t25;
555
+ }
556
+ }
557
+ }
558
+ function _temp6() {
559
+ return <Text>Esc to close</Text>;
560
+ }
561
+ function _temp5(sum, hooks) {
562
+ return sum + hooks.length;
563
+ }
564
+ function _temp4(tool) {
565
+ return tool.name;
566
+ }
567
+ function _temp3(s) {
568
+ return s.mcp;
569
+ }
570
+ function _temp2() {
571
+ return getSettingsForSource("policySettings")?.allowManagedHooksOnly === true;
572
+ }
573
+ function _temp() {
574
+ const settings = getSettings_DEPRECATED();
575
+ const hooksDisabled = settings?.disableAllHooks === true;
576
+ return hooksDisabled && getSettingsForSource("policySettings")?.disableAllHooks === true;
577
+ }
578
+ //# 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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
src/components/hooks/SelectHookMode.tsx ADDED
@@ -0,0 +1,112 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { c as _c } from "react/compiler-runtime";
2
+ /**
3
+ * SelectHookMode shows all hooks configured for a given event+matcher pair.
4
+ *
5
+ * The /hooks menu is read-only: this view no longer offers "add new hook"
6
+ * and selecting a hook shows its read-only details instead of a delete
7
+ * confirmation.
8
+ */
9
+ import * as React from 'react';
10
+ import type { HookEvent } from 'src/entrypoints/agentSdkTypes.js';
11
+ import type { HookEventMetadata } from 'src/utils/hooks/hooksConfigManager.js';
12
+ import { Box, Text } from '../../ink.js';
13
+ import { getHookDisplayText, hookSourceHeaderDisplayString, type IndividualHookConfig } from '../../utils/hooks/hooksSettings.js';
14
+ import { Select } from '../CustomSelect/select.js';
15
+ import { Dialog } from '../design-system/Dialog.js';
16
+ type Props = {
17
+ selectedEvent: HookEvent;
18
+ selectedMatcher: string | null;
19
+ hooksForSelectedMatcher: IndividualHookConfig[];
20
+ hookEventMetadata: HookEventMetadata;
21
+ onSelect: (hook: IndividualHookConfig) => void;
22
+ onCancel: () => void;
23
+ };
24
+ export function SelectHookMode(t0) {
25
+ const $ = _c(19);
26
+ const {
27
+ selectedEvent,
28
+ selectedMatcher,
29
+ hooksForSelectedMatcher,
30
+ hookEventMetadata,
31
+ onSelect,
32
+ onCancel
33
+ } = t0;
34
+ const title = hookEventMetadata.matcherMetadata !== undefined ? `${selectedEvent} - Matcher: ${selectedMatcher || "(all)"}` : selectedEvent;
35
+ if (hooksForSelectedMatcher.length === 0) {
36
+ let t1;
37
+ if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
38
+ t1 = <Box flexDirection="column" gap={1}><Text dimColor={true}>No hooks configured for this event.</Text><Text dimColor={true}>To add hooks, edit settings.json directly or ask Claude.</Text></Box>;
39
+ $[0] = t1;
40
+ } else {
41
+ t1 = $[0];
42
+ }
43
+ let t2;
44
+ if ($[1] !== hookEventMetadata.description || $[2] !== onCancel || $[3] !== title) {
45
+ t2 = <Dialog title={title} subtitle={hookEventMetadata.description} onCancel={onCancel} inputGuide={_temp}>{t1}</Dialog>;
46
+ $[1] = hookEventMetadata.description;
47
+ $[2] = onCancel;
48
+ $[3] = title;
49
+ $[4] = t2;
50
+ } else {
51
+ t2 = $[4];
52
+ }
53
+ return t2;
54
+ }
55
+ const t1 = hookEventMetadata.description;
56
+ let t2;
57
+ if ($[5] !== hooksForSelectedMatcher) {
58
+ t2 = hooksForSelectedMatcher.map(_temp2);
59
+ $[5] = hooksForSelectedMatcher;
60
+ $[6] = t2;
61
+ } else {
62
+ t2 = $[6];
63
+ }
64
+ let t3;
65
+ if ($[7] !== hooksForSelectedMatcher || $[8] !== onSelect) {
66
+ t3 = value => {
67
+ const index_0 = parseInt(value, 10);
68
+ const hook_0 = hooksForSelectedMatcher[index_0];
69
+ if (hook_0) {
70
+ onSelect(hook_0);
71
+ }
72
+ };
73
+ $[7] = hooksForSelectedMatcher;
74
+ $[8] = onSelect;
75
+ $[9] = t3;
76
+ } else {
77
+ t3 = $[9];
78
+ }
79
+ let t4;
80
+ if ($[10] !== onCancel || $[11] !== t2 || $[12] !== t3) {
81
+ t4 = <Box flexDirection="column"><Select options={t2} onChange={t3} onCancel={onCancel} /></Box>;
82
+ $[10] = onCancel;
83
+ $[11] = t2;
84
+ $[12] = t3;
85
+ $[13] = t4;
86
+ } else {
87
+ t4 = $[13];
88
+ }
89
+ let t5;
90
+ if ($[14] !== hookEventMetadata.description || $[15] !== onCancel || $[16] !== t4 || $[17] !== title) {
91
+ t5 = <Dialog title={title} subtitle={t1} onCancel={onCancel}>{t4}</Dialog>;
92
+ $[14] = hookEventMetadata.description;
93
+ $[15] = onCancel;
94
+ $[16] = t4;
95
+ $[17] = title;
96
+ $[18] = t5;
97
+ } else {
98
+ t5 = $[18];
99
+ }
100
+ return t5;
101
+ }
102
+ function _temp2(hook, index) {
103
+ return {
104
+ label: `[${hook.config.type}] ${getHookDisplayText(hook.config)}`,
105
+ value: index.toString(),
106
+ description: hook.source === "pluginHook" && hook.pluginName ? `${hookSourceHeaderDisplayString(hook.source)} (${hook.pluginName})` : hookSourceHeaderDisplayString(hook.source)
107
+ };
108
+ }
109
+ function _temp() {
110
+ return <Text>Esc to go back</Text>;
111
+ }
112
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsIkhvb2tFdmVudCIsIkhvb2tFdmVudE1ldGFkYXRhIiwiQm94IiwiVGV4dCIsImdldEhvb2tEaXNwbGF5VGV4dCIsImhvb2tTb3VyY2VIZWFkZXJEaXNwbGF5U3RyaW5nIiwiSW5kaXZpZHVhbEhvb2tDb25maWciLCJTZWxlY3QiLCJEaWFsb2ciLCJQcm9wcyIsInNlbGVjdGVkRXZlbnQiLCJzZWxlY3RlZE1hdGNoZXIiLCJob29rc0ZvclNlbGVjdGVkTWF0Y2hlciIsImhvb2tFdmVudE1ldGFkYXRhIiwib25TZWxlY3QiLCJob29rIiwib25DYW5jZWwiLCJTZWxlY3RIb29rTW9kZSIsInQwIiwiJCIsIl9jIiwidGl0bGUiLCJtYXRjaGVyTWV0YWRhdGEiLCJ1bmRlZmluZWQiLCJsZW5ndGgiLCJ0MSIsIlN5bWJvbCIsImZvciIsInQyIiwiZGVzY3JpcHRpb24iLCJfdGVtcCIsIm1hcCIsIl90ZW1wMiIsInQzIiwidmFsdWUiLCJpbmRleF8wIiwicGFyc2VJbnQiLCJob29rXzAiLCJpbmRleCIsInQ0IiwidDUiLCJsYWJlbCIsImNvbmZpZyIsInR5cGUiLCJ0b1N0cmluZyIsInNvdXJjZSIsInBsdWdpbk5hbWUiXSwic291cmNlcyI6WyJTZWxlY3RIb29rTW9kZS50c3giXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBTZWxlY3RIb29rTW9kZSBzaG93cyBhbGwgaG9va3MgY29uZmlndXJlZCBmb3IgYSBnaXZlbiBldmVudCttYXRjaGVyIHBhaXIuXG4gKlxuICogVGhlIC9ob29rcyBtZW51IGlzIHJlYWQtb25seTogdGhpcyB2aWV3IG5vIGxvbmdlciBvZmZlcnMgXCJhZGQgbmV3IGhvb2tcIlxuICogYW5kIHNlbGVjdGluZyBhIGhvb2sgc2hvd3MgaXRzIHJlYWQtb25seSBkZXRhaWxzIGluc3RlYWQgb2YgYSBkZWxldGVcbiAqIGNvbmZpcm1hdGlvbi5cbiAqL1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgdHlwZSB7IEhvb2tFdmVudCB9IGZyb20gJ3NyYy9lbnRyeXBvaW50cy9hZ2VudFNka1R5cGVzLmpzJ1xuaW1wb3J0IHR5cGUgeyBIb29rRXZlbnRNZXRhZGF0YSB9IGZyb20gJ3NyYy91dGlscy9ob29rcy9ob29rc0NvbmZpZ01hbmFnZXIuanMnXG5pbXBvcnQgeyBCb3gsIFRleHQgfSBmcm9tICcuLi8uLi9pbmsuanMnXG5pbXBvcnQge1xuICBnZXRIb29rRGlzcGxheVRleHQsXG4gIGhvb2tTb3VyY2VIZWFkZXJEaXNwbGF5U3RyaW5nLFxuICB0eXBlIEluZGl2aWR1YWxIb29rQ29uZmlnLFxufSBmcm9tICcuLi8uLi91dGlscy9ob29rcy9ob29rc1NldHRpbmdzLmpzJ1xuaW1wb3J0IHsgU2VsZWN0IH0gZnJvbSAnLi4vQ3VzdG9tU2VsZWN0L3NlbGVjdC5qcydcbmltcG9ydCB7IERpYWxvZyB9IGZyb20gJy4uL2Rlc2lnbi1zeXN0ZW0vRGlhbG9nLmpzJ1xuXG50eXBlIFByb3BzID0ge1xuICBzZWxlY3RlZEV2ZW50OiBIb29rRXZlbnRcbiAgc2VsZWN0ZWRNYXRjaGVyOiBzdHJpbmcgfCBudWxsXG4gIGhvb2tzRm9yU2VsZWN0ZWRNYXRjaGVyOiBJbmRpdmlkdWFsSG9va0NvbmZpZ1tdXG4gIGhvb2tFdmVudE1ldGFkYXRhOiBIb29rRXZlbnRNZXRhZGF0YVxuICBvblNlbGVjdDogKGhvb2s6IEluZGl2aWR1YWxIb29rQ29uZmlnKSA9PiB2b2lkXG4gIG9uQ2FuY2VsOiAoKSA9PiB2b2lkXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBTZWxlY3RIb29rTW9kZSh7XG4gIHNlbGVjdGVkRXZlbnQsXG4gIHNlbGVjdGVkTWF0Y2hlcixcbiAgaG9va3NGb3JTZWxlY3RlZE1hdGNoZXIsXG4gIGhvb2tFdmVudE1ldGFkYXRhLFxuICBvblNlbGVjdCxcbiAgb25DYW5jZWwsXG59OiBQcm9wcyk6IFJlYWN0LlJlYWN0Tm9kZSB7XG4gIGNvbnN0IHRpdGxlID1cbiAgICBob29rRXZlbnRNZXRhZGF0YS5tYXRjaGVyTWV0YWRhdGEgIT09IHVuZGVmaW5lZFxuICAgICAgPyBgJHtzZWxlY3RlZEV2ZW50fSAtIE1hdGNoZXI6ICR7c2VsZWN0ZWRNYXRjaGVyIHx8ICcoYWxsKSd9YFxuICAgICAgOiBzZWxlY3RlZEV2ZW50XG5cbiAgaWYgKGhvb2tzRm9yU2VsZWN0ZWRNYXRjaGVyLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiAoXG4gICAgICA8RGlhbG9nXG4gICAgICAgIHRpdGxlPXt0aXRsZX1cbiAgICAgICAgc3VidGl0bGU9e2hvb2tFdmVudE1ldGFkYXRhLmRlc2NyaXB0aW9ufVxuICAgICAgICBvbkNhbmNlbD17b25DYW5jZWx9XG4gICAgICAgIGlucHV0R3VpZGU9eygpID0+IDxUZXh0PkVzYyB0byBnbyBiYWNrPC9UZXh0Pn1cbiAgICAgID5cbiAgICAgICAgPEJveCBmbGV4RGlyZWN0aW9uPVwiY29sdW1uXCIgZ2FwPXsxfT5cbiAgICAgICAgICA8VGV4dCBkaW1Db2xvcj5ObyBob29rcyBjb25maWd1cmVkIGZvciB0aGlzIGV2ZW50LjwvVGV4dD5cbiAgICAgICAgICA8VGV4dCBkaW1Db2xvcj5cbiAgICAgICAgICAgIFRvIGFkZCBob29rcywgZWRpdCBzZXR0aW5ncy5qc29uIGRpcmVjdGx5IG9yIGFzayBDbGF1ZGUuXG4gICAgICAgICAgPC9UZXh0PlxuICAgICAgICA8L0JveD5cbiAgICAgIDwvRGlhbG9nPlxuICAgIClcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPERpYWxvZ1xuICAgICAgdGl0bGU9e3RpdGxlfVxuICAgICAgc3VidGl0bGU9e2hvb2tFdmVudE1ldGFkYXRhLmRlc2NyaXB0aW9ufVxuICAgICAgb25DYW5jZWw9e29uQ2FuY2VsfVxuICAgID5cbiAgICAgIDxCb3ggZmxleERpcmVjdGlvbj1cImNvbHVtblwiPlxuICAgICAgICA8U2VsZWN0XG4gICAgICAgICAgb3B0aW9ucz17aG9va3NGb3JTZWxlY3RlZE1hdGNoZXIubWFwKChob29rLCBpbmRleCkgPT4gKHtcbiAgICAgICAgICAgIGxhYmVsOiBgWyR7aG9vay5jb25maWcudHlwZX1dICR7Z2V0SG9va0Rpc3BsYXlUZXh0KGhvb2suY29uZmlnKX1gLFxuICAgICAgICAgICAgdmFsdWU6IGluZGV4LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICAgICAgaG9vay5zb3VyY2UgPT09ICdwbHVnaW5Ib29rJyAmJiBob29rLnBsdWdpbk5hbWVcbiAgICAgICAgICAgICAgICA/IGAke2hvb2tTb3VyY2VIZWFkZXJEaXNwbGF5U3RyaW5nKGhvb2suc291cmNlKX0gKCR7aG9vay5wbHVnaW5OYW1lfSlgXG4gICAgICAgICAgICAgICAgOiBob29rU291cmNlSGVhZGVyRGlzcGxheVN0cmluZyhob29rLnNvdXJjZSksXG4gICAgICAgICAgfSkpfVxuICAgICAgICAgIG9uQ2hhbmdlPXt2YWx1ZSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IHBhcnNlSW50KHZhbHVlLCAxMClcbiAgICAgICAgICAgIGNvbnN0IGhvb2sgPSBob29rc0ZvclNlbGVjdGVkTWF0Y2hlcltpbmRleF1cbiAgICAgICAgICAgIGlmIChob29rKSB7XG4gICAgICAgICAgICAgIG9uU2VsZWN0KGhvb2spXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfX1cbiAgICAgICAgICBvbkNhbmNlbD17b25DYW5jZWx9XG4gICAgICAgIC8+XG4gICAgICA8L0JveD5cbiAgICA8L0RpYWxvZz5cbiAgKVxufVxuIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPLEtBQUtBLEtBQUssTUFBTSxPQUFPO0FBQzlCLGNBQWNDLFNBQVMsUUFBUSxrQ0FBa0M7QUFDakUsY0FBY0MsaUJBQWlCLFFBQVEsdUNBQXVDO0FBQzlFLFNBQVNDLEdBQUcsRUFBRUMsSUFBSSxRQUFRLGNBQWM7QUFDeEMsU0FDRUMsa0JBQWtCLEVBQ2xCQyw2QkFBNkIsRUFDN0IsS0FBS0Msb0JBQW9CLFFBQ3BCLG9DQUFvQztBQUMzQyxTQUFTQyxNQUFNLFFBQVEsMkJBQTJCO0FBQ2xELFNBQVNDLE1BQU0sUUFBUSw0QkFBNEI7QUFFbkQsS0FBS0MsS0FBSyxHQUFHO0VBQ1hDLGFBQWEsRUFBRVYsU0FBUztFQUN4QlcsZUFBZSxFQUFFLE1BQU0sR0FBRyxJQUFJO0VBQzlCQyx1QkFBdUIsRUFBRU4sb0JBQW9CLEVBQUU7RUFDL0NPLGlCQUFpQixFQUFFWixpQkFBaUI7RUFDcENhLFFBQVEsRUFBRSxDQUFDQyxJQUFJLEVBQUVULG9CQUFvQixFQUFFLEdBQUcsSUFBSTtFQUM5Q1UsUUFBUSxFQUFFLEdBQUcsR0FBRyxJQUFJO0FBQ3RCLENBQUM7QUFFRCxPQUFPLFNBQUFDLGVBQUFDLEVBQUE7RUFBQSxNQUFBQyxDQUFBLEdBQUFDLEVBQUE7RUFBd0I7SUFBQVYsYUFBQTtJQUFBQyxlQUFBO0lBQUFDLHVCQUFBO0lBQUFDLGlCQUFBO0lBQUFDLFFBQUE7SUFBQUU7RUFBQSxJQUFBRSxFQU92QjtFQUNOLE1BQUFHLEtBQUEsR0FDRVIsaUJBQWlCLENBQUFTLGVBQWdCLEtBQUtDLFNBRXJCLEdBRmpCLEdBQ09iLGFBQWEsZUFBZUMsZUFBMEIsSUFBMUIsT0FBMEIsRUFDNUMsR0FGakJELGFBRWlCO0VBRW5CLElBQUlFLHVCQUF1QixDQUFBWSxNQUFPLEtBQUssQ0FBQztJQUFBLElBQUFDLEVBQUE7SUFBQSxJQUFBTixDQUFBLFFBQUFPLE1BQUEsQ0FBQUMsR0FBQTtNQVFsQ0YsRUFBQSxJQUFDLEdBQUcsQ0FBZSxhQUFRLENBQVIsUUFBUSxDQUFNLEdBQUMsQ0FBRCxHQUFDLENBQ2hDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBUixLQUFPLENBQUMsQ0FBQyxtQ0FBbUMsRUFBakQsSUFBSSxDQUNMLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBUixLQUFPLENBQUMsQ0FBQyx3REFFZixFQUZDLElBQUksQ0FHUCxFQUxDLEdBQUcsQ0FLRTtNQUFBTixDQUFBLE1BQUFNLEVBQUE7SUFBQTtNQUFBQSxFQUFBLEdBQUFOLENBQUE7SUFBQTtJQUFBLElBQUFTLEVBQUE7SUFBQSxJQUFBVCxDQUFBLFFBQUFOLGlCQUFBLENBQUFnQixXQUFBLElBQUFWLENBQUEsUUFBQUgsUUFBQSxJQUFBRyxDQUFBLFFBQUFFLEtBQUE7TUFYUk8sRUFBQSxJQUFDLE1BQU0sQ0FDRVAsS0FBSyxDQUFMQSxNQUFJLENBQUMsQ0FDRixRQUE2QixDQUE3QixDQUFBUixpQkFBaUIsQ0FBQWdCLFdBQVcsQ0FBQyxDQUM3QmIsUUFBUSxDQUFSQSxTQUFPLENBQUMsQ0FDTixVQUFpQyxDQUFqQyxDQUFBYyxLQUFnQyxDQUFDLENBRTdDLENBQUFMLEVBS0ssQ0FDUCxFQVpDLE1BQU0sQ0FZRTtNQUFBTixDQUFBLE1BQUFOLGlCQUFBLENBQUFnQixXQUFBO01BQUFWLENBQUEsTUFBQUgsUUFBQTtNQUFBRyxDQUFBLE1BQUFFLEtBQUE7TUFBQUYsQ0FBQSxNQUFBUyxFQUFBO0lBQUE7TUFBQUEsRUFBQSxHQUFBVCxDQUFBO0lBQUE7SUFBQSxPQVpUUyxFQVlTO0VBQUE7RUFPQyxNQUFBSCxFQUFBLEdBQUFaLGlCQUFpQixDQUFBZ0IsV0FBWTtFQUFBLElBQUFELEVBQUE7RUFBQSxJQUFBVCxDQUFBLFFBQUFQLHVCQUFBO0lBSzFCZ0IsRUFBQSxHQUFBaEIsdUJBQXVCLENBQUFtQixHQUFJLENBQUNDLE1BT25DLENBQUM7SUFBQWIsQ0FBQSxNQUFBUCx1QkFBQTtJQUFBTyxDQUFBLE1BQUFTLEVBQUE7RUFBQTtJQUFBQSxFQUFBLEdBQUFULENBQUE7RUFBQTtFQUFBLElBQUFjLEVBQUE7RUFBQSxJQUFBZCxDQUFBLFFBQUFQLHVCQUFBLElBQUFPLENBQUEsUUFBQUwsUUFBQTtJQUNPbUIsRUFBQSxHQUFBQyxLQUFBO01BQ1IsTUFBQUMsT0FBQSxHQUFjQyxRQUFRLENBQUNGLEtBQUssRUFBRSxFQUFFLENBQUM7TUFDakMsTUFBQUcsTUFBQSxHQUFhekIsdUJBQXVCLENBQUMwQixPQUFLLENBQUM7TUFDM0MsSUFBSXZCLE1BQUk7UUFDTkQsUUFBUSxDQUFDQyxNQUFJLENBQUM7TUFBQTtJQUNmLENBQ0Y7SUFBQUksQ0FBQSxNQUFBUCx1QkFBQTtJQUFBTyxDQUFBLE1BQUFMLFFBQUE7SUFBQUssQ0FBQSxNQUFBYyxFQUFBO0VBQUE7SUFBQUEsRUFBQSxHQUFBZCxDQUFBO0VBQUE7RUFBQSxJQUFBb0IsRUFBQTtFQUFBLElBQUFwQixDQUFBLFNBQUFILFFBQUEsSUFBQUcsQ0FBQSxTQUFBUyxFQUFBLElBQUFULENBQUEsU0FBQWMsRUFBQTtJQWhCTE0sRUFBQSxJQUFDLEdBQUcsQ0FBZSxhQUFRLENBQVIsUUFBUSxDQUN6QixDQUFDLE1BQU0sQ0FDSSxPQU9OLENBUE0sQ0FBQVgsRUFPUCxDQUFDLENBQ08sUUFNVCxDQU5TLENBQUFLLEVBTVYsQ0FBQyxDQUNTakIsUUFBUSxDQUFSQSxTQUFPLENBQUMsR0FFdEIsRUFuQkMsR0FBRyxDQW1CRTtJQUFBRyxDQUFBLE9BQUFILFFBQUE7SUFBQUcsQ0FBQSxPQUFBUyxFQUFBO0lBQUFULENBQUEsT0FBQWMsRUFBQTtJQUFBZCxDQUFBLE9BQUFvQixFQUFBO0VBQUE7SUFBQUEsRUFBQSxHQUFBcEIsQ0FBQTtFQUFBO0VBQUEsSUFBQXFCLEVBQUE7RUFBQSxJQUFBckIsQ0FBQSxTQUFBTixpQkFBQSxDQUFBZ0IsV0FBQSxJQUFBVixDQUFBLFNBQUFILFFBQUEsSUFBQUcsQ0FBQSxTQUFBb0IsRUFBQSxJQUFBcEIsQ0FBQSxTQUFBRSxLQUFBO0lBeEJSbUIsRUFBQSxJQUFDLE1BQU0sQ0FDRW5CLEtBQUssQ0FBTEEsTUFBSSxDQUFDLENBQ0YsUUFBNkIsQ0FBN0IsQ0FBQUksRUFBNEIsQ0FBQyxDQUM3QlQsUUFBUSxDQUFSQSxTQUFPLENBQUMsQ0FFbEIsQ0FBQXVCLEVBbUJLLENBQ1AsRUF6QkMsTUFBTSxDQXlCRTtJQUFBcEIsQ0FBQSxPQUFBTixpQkFBQSxDQUFBZ0IsV0FBQTtJQUFBVixDQUFBLE9BQUFILFFBQUE7SUFBQUcsQ0FBQSxPQUFBb0IsRUFBQTtJQUFBcEIsQ0FBQSxPQUFBRSxLQUFBO0lBQUFGLENBQUEsT0FBQXFCLEVBQUE7RUFBQTtJQUFBQSxFQUFBLEdBQUFyQixDQUFBO0VBQUE7RUFBQSxPQXpCVHFCLEVBeUJTO0FBQUE7QUF6RE4sU0FBQVIsT0FBQWpCLElBQUEsRUFBQXVCLEtBQUE7RUFBQSxPQXVDMEQ7SUFBQUcsS0FBQSxFQUM5QyxJQUFJMUIsSUFBSSxDQUFBMkIsTUFBTyxDQUFBQyxJQUFLLEtBQUt2QyxrQkFBa0IsQ0FBQ1csSUFBSSxDQUFBMkIsTUFBTyxDQUFDLEVBQUU7SUFBQVIsS0FBQSxFQUMxREksS0FBSyxDQUFBTSxRQUFTLENBQUMsQ0FBQztJQUFBZixXQUFBLEVBRXJCZCxJQUFJLENBQUE4QixNQUFPLEtBQUssWUFBK0IsSUFBZjlCLElBQUksQ0FBQStCLFVBRVUsR0FGOUMsR0FDT3pDLDZCQUE2QixDQUFDVSxJQUFJLENBQUE4QixNQUFPLENBQUMsS0FBSzlCLElBQUksQ0FBQStCLFVBQVcsR0FDdkIsR0FBMUN6Qyw2QkFBNkIsQ0FBQ1UsSUFBSSxDQUFBOEIsTUFBTztFQUNqRCxDQUFDO0FBQUE7QUE5Q0osU0FBQWYsTUFBQTtFQUFBLE9BbUJtQixDQUFDLElBQUksQ0FBQyxjQUFjLEVBQW5CLElBQUksQ0FBc0I7QUFBQSIsImlnbm9yZUxpc3QiOltdfQ==
src/components/hooks/ViewHookMode.tsx ADDED
@@ -0,0 +1,199 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { c as _c } from "react/compiler-runtime";
2
+ /**
3
+ * ViewHookMode shows read-only details for a single configured hook.
4
+ *
5
+ * The /hooks menu is read-only; this view replaces the former delete-hook
6
+ * confirmation screen and directs users to settings.json or Claude for edits.
7
+ */
8
+ import * as React from 'react';
9
+ import { Box, Text } from '../../ink.js';
10
+ import { hookSourceDescriptionDisplayString, type IndividualHookConfig } from '../../utils/hooks/hooksSettings.js';
11
+ import { Dialog } from '../design-system/Dialog.js';
12
+ type Props = {
13
+ selectedHook: IndividualHookConfig;
14
+ eventSupportsMatcher: boolean;
15
+ onCancel: () => void;
16
+ };
17
+ export function ViewHookMode(t0) {
18
+ const $ = _c(40);
19
+ const {
20
+ selectedHook,
21
+ eventSupportsMatcher,
22
+ onCancel
23
+ } = t0;
24
+ let t1;
25
+ if ($[0] !== selectedHook.event) {
26
+ t1 = <Text>Event: <Text bold={true}>{selectedHook.event}</Text></Text>;
27
+ $[0] = selectedHook.event;
28
+ $[1] = t1;
29
+ } else {
30
+ t1 = $[1];
31
+ }
32
+ let t2;
33
+ if ($[2] !== eventSupportsMatcher || $[3] !== selectedHook.matcher) {
34
+ t2 = eventSupportsMatcher && <Text>Matcher: <Text bold={true}>{selectedHook.matcher || "(all)"}</Text></Text>;
35
+ $[2] = eventSupportsMatcher;
36
+ $[3] = selectedHook.matcher;
37
+ $[4] = t2;
38
+ } else {
39
+ t2 = $[4];
40
+ }
41
+ let t3;
42
+ if ($[5] !== selectedHook.config.type) {
43
+ t3 = <Text>Type: <Text bold={true}>{selectedHook.config.type}</Text></Text>;
44
+ $[5] = selectedHook.config.type;
45
+ $[6] = t3;
46
+ } else {
47
+ t3 = $[6];
48
+ }
49
+ let t4;
50
+ if ($[7] !== selectedHook.source) {
51
+ t4 = hookSourceDescriptionDisplayString(selectedHook.source);
52
+ $[7] = selectedHook.source;
53
+ $[8] = t4;
54
+ } else {
55
+ t4 = $[8];
56
+ }
57
+ let t5;
58
+ if ($[9] !== t4) {
59
+ t5 = <Text>Source:{" "}<Text dimColor={true}>{t4}</Text></Text>;
60
+ $[9] = t4;
61
+ $[10] = t5;
62
+ } else {
63
+ t5 = $[10];
64
+ }
65
+ let t6;
66
+ if ($[11] !== selectedHook.pluginName) {
67
+ t6 = selectedHook.pluginName && <Text>Plugin: <Text dimColor={true}>{selectedHook.pluginName}</Text></Text>;
68
+ $[11] = selectedHook.pluginName;
69
+ $[12] = t6;
70
+ } else {
71
+ t6 = $[12];
72
+ }
73
+ let t7;
74
+ if ($[13] !== t1 || $[14] !== t2 || $[15] !== t3 || $[16] !== t5 || $[17] !== t6) {
75
+ t7 = <Box flexDirection="column">{t1}{t2}{t3}{t5}{t6}</Box>;
76
+ $[13] = t1;
77
+ $[14] = t2;
78
+ $[15] = t3;
79
+ $[16] = t5;
80
+ $[17] = t6;
81
+ $[18] = t7;
82
+ } else {
83
+ t7 = $[18];
84
+ }
85
+ let t8;
86
+ if ($[19] !== selectedHook.config) {
87
+ t8 = getContentFieldLabel(selectedHook.config);
88
+ $[19] = selectedHook.config;
89
+ $[20] = t8;
90
+ } else {
91
+ t8 = $[20];
92
+ }
93
+ let t9;
94
+ if ($[21] !== t8) {
95
+ t9 = <Text dimColor={true}>{t8}:</Text>;
96
+ $[21] = t8;
97
+ $[22] = t9;
98
+ } else {
99
+ t9 = $[22];
100
+ }
101
+ let t10;
102
+ if ($[23] !== selectedHook.config) {
103
+ t10 = getContentFieldValue(selectedHook.config);
104
+ $[23] = selectedHook.config;
105
+ $[24] = t10;
106
+ } else {
107
+ t10 = $[24];
108
+ }
109
+ let t11;
110
+ if ($[25] !== t10) {
111
+ t11 = <Box borderStyle="round" borderDimColor={true} paddingLeft={1} paddingRight={1}><Text>{t10}</Text></Box>;
112
+ $[25] = t10;
113
+ $[26] = t11;
114
+ } else {
115
+ t11 = $[26];
116
+ }
117
+ let t12;
118
+ if ($[27] !== t11 || $[28] !== t9) {
119
+ t12 = <Box flexDirection="column">{t9}{t11}</Box>;
120
+ $[27] = t11;
121
+ $[28] = t9;
122
+ $[29] = t12;
123
+ } else {
124
+ t12 = $[29];
125
+ }
126
+ let t13;
127
+ if ($[30] !== selectedHook.config) {
128
+ t13 = "statusMessage" in selectedHook.config && selectedHook.config.statusMessage && <Text>Status message:{" "}<Text dimColor={true}>{selectedHook.config.statusMessage}</Text></Text>;
129
+ $[30] = selectedHook.config;
130
+ $[31] = t13;
131
+ } else {
132
+ t13 = $[31];
133
+ }
134
+ let t14;
135
+ if ($[32] === Symbol.for("react.memo_cache_sentinel")) {
136
+ t14 = <Text dimColor={true}>To modify or remove this hook, edit settings.json directly or ask Claude to help.</Text>;
137
+ $[32] = t14;
138
+ } else {
139
+ t14 = $[32];
140
+ }
141
+ let t15;
142
+ if ($[33] !== t12 || $[34] !== t13 || $[35] !== t7) {
143
+ t15 = <Box flexDirection="column" gap={1}>{t7}{t12}{t13}{t14}</Box>;
144
+ $[33] = t12;
145
+ $[34] = t13;
146
+ $[35] = t7;
147
+ $[36] = t15;
148
+ } else {
149
+ t15 = $[36];
150
+ }
151
+ let t16;
152
+ if ($[37] !== onCancel || $[38] !== t15) {
153
+ t16 = <Dialog title="Hook details" onCancel={onCancel} inputGuide={_temp}>{t15}</Dialog>;
154
+ $[37] = onCancel;
155
+ $[38] = t15;
156
+ $[39] = t16;
157
+ } else {
158
+ t16 = $[39];
159
+ }
160
+ return t16;
161
+ }
162
+
163
+ /**
164
+ * Get a human-readable label for the primary content field of a hook
165
+ * based on its type.
166
+ */
167
+ function _temp() {
168
+ return <Text>Esc to go back</Text>;
169
+ }
170
+ function getContentFieldLabel(config: IndividualHookConfig['config']): string {
171
+ switch (config.type) {
172
+ case 'command':
173
+ return 'Command';
174
+ case 'prompt':
175
+ return 'Prompt';
176
+ case 'agent':
177
+ return 'Prompt';
178
+ case 'http':
179
+ return 'URL';
180
+ }
181
+ }
182
+
183
+ /**
184
+ * Get the actual content value for a hook's primary field, bypassing
185
+ * statusMessage so the detail view always shows the real command/prompt/URL.
186
+ */
187
+ function getContentFieldValue(config: IndividualHookConfig['config']): string {
188
+ switch (config.type) {
189
+ case 'command':
190
+ return config.command;
191
+ case 'prompt':
192
+ return config.prompt;
193
+ case 'agent':
194
+ return config.prompt;
195
+ case 'http':
196
+ return config.url;
197
+ }
198
+ }
199
+ //# 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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
src/components/mcp/CapabilitiesSection.tsx ADDED
@@ -0,0 +1,61 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { c as _c } from "react/compiler-runtime";
2
+ import React from 'react';
3
+ import { Box, Text } from '../../ink.js';
4
+ import { Byline } from '../design-system/Byline.js';
5
+ type Props = {
6
+ serverToolsCount: number;
7
+ serverPromptsCount: number;
8
+ serverResourcesCount: number;
9
+ };
10
+ export function CapabilitiesSection(t0) {
11
+ const $ = _c(9);
12
+ const {
13
+ serverToolsCount,
14
+ serverPromptsCount,
15
+ serverResourcesCount
16
+ } = t0;
17
+ let capabilities;
18
+ if ($[0] !== serverPromptsCount || $[1] !== serverResourcesCount || $[2] !== serverToolsCount) {
19
+ capabilities = [];
20
+ if (serverToolsCount > 0) {
21
+ capabilities.push("tools");
22
+ }
23
+ if (serverResourcesCount > 0) {
24
+ capabilities.push("resources");
25
+ }
26
+ if (serverPromptsCount > 0) {
27
+ capabilities.push("prompts");
28
+ }
29
+ $[0] = serverPromptsCount;
30
+ $[1] = serverResourcesCount;
31
+ $[2] = serverToolsCount;
32
+ $[3] = capabilities;
33
+ } else {
34
+ capabilities = $[3];
35
+ }
36
+ let t1;
37
+ if ($[4] === Symbol.for("react.memo_cache_sentinel")) {
38
+ t1 = <Text bold={true}>Capabilities: </Text>;
39
+ $[4] = t1;
40
+ } else {
41
+ t1 = $[4];
42
+ }
43
+ let t2;
44
+ if ($[5] !== capabilities) {
45
+ t2 = capabilities.length > 0 ? <Byline>{capabilities}</Byline> : "none";
46
+ $[5] = capabilities;
47
+ $[6] = t2;
48
+ } else {
49
+ t2 = $[6];
50
+ }
51
+ let t3;
52
+ if ($[7] !== t2) {
53
+ t3 = <Box>{t1}<Text color="text">{t2}</Text></Box>;
54
+ $[7] = t2;
55
+ $[8] = t3;
56
+ } else {
57
+ t3 = $[8];
58
+ }
59
+ return t3;
60
+ }
61
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsIkJveCIsIlRleHQiLCJCeWxpbmUiLCJQcm9wcyIsInNlcnZlclRvb2xzQ291bnQiLCJzZXJ2ZXJQcm9tcHRzQ291bnQiLCJzZXJ2ZXJSZXNvdXJjZXNDb3VudCIsIkNhcGFiaWxpdGllc1NlY3Rpb24iLCJ0MCIsIiQiLCJfYyIsImNhcGFiaWxpdGllcyIsInB1c2giLCJ0MSIsIlN5bWJvbCIsImZvciIsInQyIiwibGVuZ3RoIiwidDMiXSwic291cmNlcyI6WyJDYXBhYmlsaXRpZXNTZWN0aW9uLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBCb3gsIFRleHQgfSBmcm9tICcuLi8uLi9pbmsuanMnXG5pbXBvcnQgeyBCeWxpbmUgfSBmcm9tICcuLi9kZXNpZ24tc3lzdGVtL0J5bGluZS5qcydcblxudHlwZSBQcm9wcyA9IHtcbiAgc2VydmVyVG9vbHNDb3VudDogbnVtYmVyXG4gIHNlcnZlclByb21wdHNDb3VudDogbnVtYmVyXG4gIHNlcnZlclJlc291cmNlc0NvdW50OiBudW1iZXJcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIENhcGFiaWxpdGllc1NlY3Rpb24oe1xuICBzZXJ2ZXJUb29sc0NvdW50LFxuICBzZXJ2ZXJQcm9tcHRzQ291bnQsXG4gIHNlcnZlclJlc291cmNlc0NvdW50LFxufTogUHJvcHMpOiBSZWFjdC5SZWFjdE5vZGUge1xuICBjb25zdCBjYXBhYmlsaXRpZXMgPSBbXVxuICBpZiAoc2VydmVyVG9vbHNDb3VudCA+IDApIHtcbiAgICBjYXBhYmlsaXRpZXMucHVzaCgndG9vbHMnKVxuICB9XG4gIGlmIChzZXJ2ZXJSZXNvdXJjZXNDb3VudCA+IDApIHtcbiAgICBjYXBhYmlsaXRpZXMucHVzaCgncmVzb3VyY2VzJylcbiAgfVxuICBpZiAoc2VydmVyUHJvbXB0c0NvdW50ID4gMCkge1xuICAgIGNhcGFiaWxpdGllcy5wdXNoKCdwcm9tcHRzJylcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPEJveD5cbiAgICAgIDxUZXh0IGJvbGQ+Q2FwYWJpbGl0aWVzOiA8L1RleHQ+XG4gICAgICA8VGV4dCBjb2xvcj1cInRleHRcIj5cbiAgICAgICAge2NhcGFiaWxpdGllcy5sZW5ndGggPiAwID8gPEJ5bGluZT57Y2FwYWJpbGl0aWVzfTwvQnlsaW5lPiA6ICdub25lJ31cbiAgICAgIDwvVGV4dD5cbiAgICA8L0JveD5cbiAgKVxufVxuIl0sIm1hcHBpbmdzIjoiO0FBQUEsT0FBT0EsS0FBSyxNQUFNLE9BQU87QUFDekIsU0FBU0MsR0FBRyxFQUFFQyxJQUFJLFFBQVEsY0FBYztBQUN4QyxTQUFTQyxNQUFNLFFBQVEsNEJBQTRCO0FBRW5ELEtBQUtDLEtBQUssR0FBRztFQUNYQyxnQkFBZ0IsRUFBRSxNQUFNO0VBQ3hCQyxrQkFBa0IsRUFBRSxNQUFNO0VBQzFCQyxvQkFBb0IsRUFBRSxNQUFNO0FBQzlCLENBQUM7QUFFRCxPQUFPLFNBQUFDLG9CQUFBQyxFQUFBO0VBQUEsTUFBQUMsQ0FBQSxHQUFBQyxFQUFBO0VBQTZCO0lBQUFOLGdCQUFBO0lBQUFDLGtCQUFBO0lBQUFDO0VBQUEsSUFBQUUsRUFJNUI7RUFBQSxJQUFBRyxZQUFBO0VBQUEsSUFBQUYsQ0FBQSxRQUFBSixrQkFBQSxJQUFBSSxDQUFBLFFBQUFILG9CQUFBLElBQUFHLENBQUEsUUFBQUwsZ0JBQUE7SUFDTk8sWUFBQSxHQUFxQixFQUFFO0lBQ3ZCLElBQUlQLGdCQUFnQixHQUFHLENBQUM7TUFDdEJPLFlBQVksQ0FBQUMsSUFBSyxDQUFDLE9BQU8sQ0FBQztJQUFBO0lBRTVCLElBQUlOLG9CQUFvQixHQUFHLENBQUM7TUFDMUJLLFlBQVksQ0FBQUMsSUFBSyxDQUFDLFdBQVcsQ0FBQztJQUFBO0lBRWhDLElBQUlQLGtCQUFrQixHQUFHLENBQUM7TUFDeEJNLFlBQVksQ0FBQUMsSUFBSyxDQUFDLFNBQVMsQ0FBQztJQUFBO0lBQzdCSCxDQUFBLE1BQUFKLGtCQUFBO0lBQUFJLENBQUEsTUFBQUgsb0JBQUE7SUFBQUcsQ0FBQSxNQUFBTCxnQkFBQTtJQUFBSyxDQUFBLE1BQUFFLFlBQUE7RUFBQTtJQUFBQSxZQUFBLEdBQUFGLENBQUE7RUFBQTtFQUFBLElBQUFJLEVBQUE7RUFBQSxJQUFBSixDQUFBLFFBQUFLLE1BQUEsQ0FBQUMsR0FBQTtJQUlHRixFQUFBLElBQUMsSUFBSSxDQUFDLElBQUksQ0FBSixLQUFHLENBQUMsQ0FBQyxjQUFjLEVBQXhCLElBQUksQ0FBMkI7SUFBQUosQ0FBQSxNQUFBSSxFQUFBO0VBQUE7SUFBQUEsRUFBQSxHQUFBSixDQUFBO0VBQUE7RUFBQSxJQUFBTyxFQUFBO0VBQUEsSUFBQVAsQ0FBQSxRQUFBRSxZQUFBO0lBRTdCSyxFQUFBLEdBQUFMLFlBQVksQ0FBQU0sTUFBTyxHQUFHLENBQTRDLEdBQXhDLENBQUMsTUFBTSxDQUFFTixhQUFXLENBQUUsRUFBckIsTUFBTSxDQUFpQyxHQUFsRSxNQUFrRTtJQUFBRixDQUFBLE1BQUFFLFlBQUE7SUFBQUYsQ0FBQSxNQUFBTyxFQUFBO0VBQUE7SUFBQUEsRUFBQSxHQUFBUCxDQUFBO0VBQUE7RUFBQSxJQUFBUyxFQUFBO0VBQUEsSUFBQVQsQ0FBQSxRQUFBTyxFQUFBO0lBSHZFRSxFQUFBLElBQUMsR0FBRyxDQUNGLENBQUFMLEVBQStCLENBQy9CLENBQUMsSUFBSSxDQUFPLEtBQU0sQ0FBTixNQUFNLENBQ2YsQ0FBQUcsRUFBaUUsQ0FDcEUsRUFGQyxJQUFJLENBR1AsRUFMQyxHQUFHLENBS0U7SUFBQVAsQ0FBQSxNQUFBTyxFQUFBO0lBQUFQLENBQUEsTUFBQVMsRUFBQTtFQUFBO0lBQUFBLEVBQUEsR0FBQVQsQ0FBQTtFQUFBO0VBQUEsT0FMTlMsRUFLTTtBQUFBIiwiaWdub3JlTGlzdCI6W119
src/components/mcp/MCPRemoteServerMenu.tsx ADDED
The diff for this file is too large to render. See raw diff
 
src/components/mcp/MCPStdioServerMenu.tsx ADDED
@@ -0,0 +1,177 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import figures from 'figures';
2
+ import React, { useState } from 'react';
3
+ import type { CommandResultDisplay } from '../../commands.js';
4
+ import { useExitOnCtrlCDWithKeybindings } from '../../hooks/useExitOnCtrlCDWithKeybindings.js';
5
+ import { Box, color, Text, useTheme } from '../../ink.js';
6
+ import { getMcpConfigByName } from '../../services/mcp/config.js';
7
+ import { useMcpReconnect, useMcpToggleEnabled } from '../../services/mcp/MCPConnectionManager.js';
8
+ import { describeMcpConfigFilePath, filterMcpPromptsByServer } from '../../services/mcp/utils.js';
9
+ import { useAppState } from '../../state/AppState.js';
10
+ import { errorMessage } from '../../utils/errors.js';
11
+ import { capitalize } from '../../utils/stringUtils.js';
12
+ import { ConfigurableShortcutHint } from '../ConfigurableShortcutHint.js';
13
+ import { Select } from '../CustomSelect/index.js';
14
+ import { Byline } from '../design-system/Byline.js';
15
+ import { KeyboardShortcutHint } from '../design-system/KeyboardShortcutHint.js';
16
+ import { Spinner } from '../Spinner.js';
17
+ import { CapabilitiesSection } from './CapabilitiesSection.js';
18
+ import type { StdioServerInfo } from './types.js';
19
+ import { handleReconnectError, handleReconnectResult } from './utils/reconnectHelpers.js';
20
+ type Props = {
21
+ server: StdioServerInfo;
22
+ serverToolsCount: number;
23
+ onViewTools: () => void;
24
+ onCancel: () => void;
25
+ onComplete: (result?: string, options?: {
26
+ display?: CommandResultDisplay;
27
+ }) => void;
28
+ borderless?: boolean;
29
+ };
30
+ export function MCPStdioServerMenu({
31
+ server,
32
+ serverToolsCount,
33
+ onViewTools,
34
+ onCancel,
35
+ onComplete,
36
+ borderless = false
37
+ }: Props): React.ReactNode {
38
+ const [theme] = useTheme();
39
+ const exitState = useExitOnCtrlCDWithKeybindings();
40
+ const mcp = useAppState(s => s.mcp);
41
+ const reconnectMcpServer = useMcpReconnect();
42
+ const toggleMcpServer = useMcpToggleEnabled();
43
+ const [isReconnecting, setIsReconnecting] = useState(false);
44
+ const handleToggleEnabled = React.useCallback(async () => {
45
+ const wasEnabled = server.client.type !== 'disabled';
46
+ try {
47
+ await toggleMcpServer(server.name);
48
+ // Return to the server list so user can continue managing other servers
49
+ onCancel();
50
+ } catch (err) {
51
+ const action = wasEnabled ? 'disable' : 'enable';
52
+ onComplete(`Failed to ${action} MCP server '${server.name}': ${errorMessage(err)}`);
53
+ }
54
+ }, [server.client.type, server.name, toggleMcpServer, onCancel, onComplete]);
55
+ const capitalizedServerName = capitalize(String(server.name));
56
+
57
+ // Count MCP prompts for this server (skills are shown in /skills, not here)
58
+ const serverCommandsCount = filterMcpPromptsByServer(mcp.commands, server.name).length;
59
+ const menuOptions = [];
60
+
61
+ // Only show "View tools" if server is not disabled and has tools
62
+ if (server.client.type !== 'disabled' && serverToolsCount > 0) {
63
+ menuOptions.push({
64
+ label: 'View tools',
65
+ value: 'tools'
66
+ });
67
+ }
68
+
69
+ // Only show reconnect option if the server is not disabled
70
+ if (server.client.type !== 'disabled') {
71
+ menuOptions.push({
72
+ label: 'Reconnect',
73
+ value: 'reconnectMcpServer'
74
+ });
75
+ }
76
+ menuOptions.push({
77
+ label: server.client.type !== 'disabled' ? 'Disable' : 'Enable',
78
+ value: 'toggle-enabled'
79
+ });
80
+
81
+ // If there are no other options, add a back option so Select handles escape
82
+ if (menuOptions.length === 0) {
83
+ menuOptions.push({
84
+ label: 'Back',
85
+ value: 'back'
86
+ });
87
+ }
88
+ if (isReconnecting) {
89
+ return <Box flexDirection="column" gap={1} padding={1}>
90
+ <Text color="text">
91
+ Reconnecting to <Text bold>{server.name}</Text>
92
+ </Text>
93
+ <Box>
94
+ <Spinner />
95
+ <Text> Restarting MCP server process</Text>
96
+ </Box>
97
+ <Text dimColor>This may take a few moments.</Text>
98
+ </Box>;
99
+ }
100
+ return <Box flexDirection="column">
101
+ <Box flexDirection="column" paddingX={1} borderStyle={borderless ? undefined : 'round'}>
102
+ <Box marginBottom={1}>
103
+ <Text bold>{capitalizedServerName} MCP Server</Text>
104
+ </Box>
105
+
106
+ <Box flexDirection="column" gap={0}>
107
+ <Box>
108
+ <Text bold>Status: </Text>
109
+ {server.client.type === 'disabled' ? <Text>{color('inactive', theme)(figures.radioOff)} disabled</Text> : server.client.type === 'connected' ? <Text>{color('success', theme)(figures.tick)} connected</Text> : server.client.type === 'pending' ? <>
110
+ <Text dimColor>{figures.radioOff}</Text>
111
+ <Text> connecting…</Text>
112
+ </> : <Text>{color('error', theme)(figures.cross)} failed</Text>}
113
+ </Box>
114
+
115
+ <Box>
116
+ <Text bold>Command: </Text>
117
+ <Text dimColor>{server.config.command}</Text>
118
+ </Box>
119
+
120
+ {server.config.args && server.config.args.length > 0 && <Box>
121
+ <Text bold>Args: </Text>
122
+ <Text dimColor>{server.config.args.join(' ')}</Text>
123
+ </Box>}
124
+
125
+ <Box>
126
+ <Text bold>Config location: </Text>
127
+ <Text dimColor>
128
+ {describeMcpConfigFilePath(getMcpConfigByName(server.name)?.scope ?? 'dynamic')}
129
+ </Text>
130
+ </Box>
131
+
132
+ {server.client.type === 'connected' && <CapabilitiesSection serverToolsCount={serverToolsCount} serverPromptsCount={serverCommandsCount} serverResourcesCount={mcp.resources[server.name]?.length || 0} />}
133
+
134
+ {server.client.type === 'connected' && serverToolsCount > 0 && <Box>
135
+ <Text bold>Tools: </Text>
136
+ <Text dimColor>{serverToolsCount} tools</Text>
137
+ </Box>}
138
+ </Box>
139
+
140
+ {menuOptions.length > 0 && <Box marginTop={1}>
141
+ <Select options={menuOptions} onChange={async value => {
142
+ if (value === 'tools') {
143
+ onViewTools();
144
+ } else if (value === 'reconnectMcpServer') {
145
+ setIsReconnecting(true);
146
+ try {
147
+ const result = await reconnectMcpServer(server.name);
148
+ const {
149
+ message
150
+ } = handleReconnectResult(result, server.name);
151
+ onComplete?.(message);
152
+ } catch (err_0) {
153
+ onComplete?.(handleReconnectError(err_0, server.name));
154
+ } finally {
155
+ setIsReconnecting(false);
156
+ }
157
+ } else if (value === 'toggle-enabled') {
158
+ await handleToggleEnabled();
159
+ } else if (value === 'back') {
160
+ onCancel();
161
+ }
162
+ }} onCancel={onCancel} />
163
+ </Box>}
164
+ </Box>
165
+
166
+ <Box marginTop={1}>
167
+ <Text dimColor italic>
168
+ {exitState.pending ? <>Press {exitState.keyName} again to exit</> : <Byline>
169
+ <KeyboardShortcutHint shortcut="↑↓" action="navigate" />
170
+ <KeyboardShortcutHint shortcut="Enter" action="select" />
171
+ <ConfigurableShortcutHint action="confirm:no" context="Confirmation" fallback="Esc" description="back" />
172
+ </Byline>}
173
+ </Text>
174
+ </Box>
175
+ </Box>;
176
+ }
177
+ //# 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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
src/components/mcp/MCPToolListView.tsx ADDED
@@ -0,0 +1,141 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { c as _c } from "react/compiler-runtime";
2
+ import React from 'react';
3
+ import { Text } from '../../ink.js';
4
+ import { extractMcpToolDisplayName, getMcpDisplayName } from '../../services/mcp/mcpStringUtils.js';
5
+ import { filterToolsByServer } from '../../services/mcp/utils.js';
6
+ import { useAppState } from '../../state/AppState.js';
7
+ import type { Tool } from '../../Tool.js';
8
+ import { plural } from '../../utils/stringUtils.js';
9
+ import { ConfigurableShortcutHint } from '../ConfigurableShortcutHint.js';
10
+ import { Select } from '../CustomSelect/index.js';
11
+ import { Byline } from '../design-system/Byline.js';
12
+ import { Dialog } from '../design-system/Dialog.js';
13
+ import { KeyboardShortcutHint } from '../design-system/KeyboardShortcutHint.js';
14
+ import type { ServerInfo } from './types.js';
15
+ type Props = {
16
+ server: ServerInfo;
17
+ onSelectTool: (tool: Tool, index: number) => void;
18
+ onBack: () => void;
19
+ };
20
+ export function MCPToolListView(t0) {
21
+ const $ = _c(21);
22
+ const {
23
+ server,
24
+ onSelectTool,
25
+ onBack
26
+ } = t0;
27
+ const mcpTools = useAppState(_temp);
28
+ let t1;
29
+ bb0: {
30
+ if (server.client.type !== "connected") {
31
+ let t2;
32
+ if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
33
+ t2 = [];
34
+ $[0] = t2;
35
+ } else {
36
+ t2 = $[0];
37
+ }
38
+ t1 = t2;
39
+ break bb0;
40
+ }
41
+ let t2;
42
+ if ($[1] !== mcpTools || $[2] !== server.name) {
43
+ t2 = filterToolsByServer(mcpTools, server.name);
44
+ $[1] = mcpTools;
45
+ $[2] = server.name;
46
+ $[3] = t2;
47
+ } else {
48
+ t2 = $[3];
49
+ }
50
+ t1 = t2;
51
+ }
52
+ const serverTools = t1;
53
+ let t2;
54
+ if ($[4] !== server.name || $[5] !== serverTools) {
55
+ let t3;
56
+ if ($[7] !== server.name) {
57
+ t3 = (tool, index) => {
58
+ const toolName = getMcpDisplayName(tool.name, server.name);
59
+ const fullDisplayName = tool.userFacingName ? tool.userFacingName({}) : toolName;
60
+ const displayName = extractMcpToolDisplayName(fullDisplayName);
61
+ const isReadOnly = tool.isReadOnly?.({}) ?? false;
62
+ const isDestructive = tool.isDestructive?.({}) ?? false;
63
+ const isOpenWorld = tool.isOpenWorld?.({}) ?? false;
64
+ const annotations = [];
65
+ if (isReadOnly) {
66
+ annotations.push("read-only");
67
+ }
68
+ if (isDestructive) {
69
+ annotations.push("destructive");
70
+ }
71
+ if (isOpenWorld) {
72
+ annotations.push("open-world");
73
+ }
74
+ return {
75
+ label: displayName,
76
+ value: index.toString(),
77
+ description: annotations.length > 0 ? annotations.join(", ") : undefined,
78
+ descriptionColor: isDestructive ? "error" : isReadOnly ? "success" : undefined
79
+ };
80
+ };
81
+ $[7] = server.name;
82
+ $[8] = t3;
83
+ } else {
84
+ t3 = $[8];
85
+ }
86
+ t2 = serverTools.map(t3);
87
+ $[4] = server.name;
88
+ $[5] = serverTools;
89
+ $[6] = t2;
90
+ } else {
91
+ t2 = $[6];
92
+ }
93
+ const toolOptions = t2;
94
+ const t3 = `Tools for ${server.name}`;
95
+ const t4 = serverTools.length;
96
+ let t5;
97
+ if ($[9] !== serverTools.length) {
98
+ t5 = plural(serverTools.length, "tool");
99
+ $[9] = serverTools.length;
100
+ $[10] = t5;
101
+ } else {
102
+ t5 = $[10];
103
+ }
104
+ const t6 = `${t4} ${t5}`;
105
+ let t7;
106
+ if ($[11] !== onBack || $[12] !== onSelectTool || $[13] !== serverTools || $[14] !== toolOptions) {
107
+ t7 = serverTools.length === 0 ? <Text dimColor={true}>No tools available</Text> : <Select options={toolOptions} onChange={value => {
108
+ const index_0 = parseInt(value);
109
+ const tool_0 = serverTools[index_0];
110
+ if (tool_0) {
111
+ onSelectTool(tool_0, index_0);
112
+ }
113
+ }} onCancel={onBack} />;
114
+ $[11] = onBack;
115
+ $[12] = onSelectTool;
116
+ $[13] = serverTools;
117
+ $[14] = toolOptions;
118
+ $[15] = t7;
119
+ } else {
120
+ t7 = $[15];
121
+ }
122
+ let t8;
123
+ if ($[16] !== onBack || $[17] !== t3 || $[18] !== t6 || $[19] !== t7) {
124
+ t8 = <Dialog title={t3} subtitle={t6} onCancel={onBack} inputGuide={_temp2}>{t7}</Dialog>;
125
+ $[16] = onBack;
126
+ $[17] = t3;
127
+ $[18] = t6;
128
+ $[19] = t7;
129
+ $[20] = t8;
130
+ } else {
131
+ t8 = $[20];
132
+ }
133
+ return t8;
134
+ }
135
+ function _temp2(exitState) {
136
+ return exitState.pending ? <Text>Press {exitState.keyName} again to exit</Text> : <Byline><KeyboardShortcutHint shortcut={"\u2191\u2193"} action="navigate" /><KeyboardShortcutHint shortcut="Enter" action="select" /><ConfigurableShortcutHint action="confirm:no" context="Confirmation" fallback="Esc" description="back" /></Byline>;
137
+ }
138
+ function _temp(s) {
139
+ return s.mcp.tools;
140
+ }
141
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsIlRleHQiLCJleHRyYWN0TWNwVG9vbERpc3BsYXlOYW1lIiwiZ2V0TWNwRGlzcGxheU5hbWUiLCJmaWx0ZXJUb29sc0J5U2VydmVyIiwidXNlQXBwU3RhdGUiLCJUb29sIiwicGx1cmFsIiwiQ29uZmlndXJhYmxlU2hvcnRjdXRIaW50IiwiU2VsZWN0IiwiQnlsaW5lIiwiRGlhbG9nIiwiS2V5Ym9hcmRTaG9ydGN1dEhpbnQiLCJTZXJ2ZXJJbmZvIiwiUHJvcHMiLCJzZXJ2ZXIiLCJvblNlbGVjdFRvb2wiLCJ0b29sIiwiaW5kZXgiLCJvbkJhY2siLCJNQ1BUb29sTGlzdFZpZXciLCJ0MCIsIiQiLCJfYyIsIm1jcFRvb2xzIiwiX3RlbXAiLCJ0MSIsImJiMCIsImNsaWVudCIsInR5cGUiLCJ0MiIsIlN5bWJvbCIsImZvciIsIm5hbWUiLCJzZXJ2ZXJUb29scyIsInQzIiwidG9vbE5hbWUiLCJmdWxsRGlzcGxheU5hbWUiLCJ1c2VyRmFjaW5nTmFtZSIsImRpc3BsYXlOYW1lIiwiaXNSZWFkT25seSIsImlzRGVzdHJ1Y3RpdmUiLCJpc09wZW5Xb3JsZCIsImFubm90YXRpb25zIiwicHVzaCIsImxhYmVsIiwidmFsdWUiLCJ0b1N0cmluZyIsImRlc2NyaXB0aW9uIiwibGVuZ3RoIiwiam9pbiIsInVuZGVmaW5lZCIsImRlc2NyaXB0aW9uQ29sb3IiLCJtYXAiLCJ0b29sT3B0aW9ucyIsInQ0IiwidDUiLCJ0NiIsInQ3IiwiaW5kZXhfMCIsInBhcnNlSW50IiwidG9vbF8wIiwidDgiLCJfdGVtcDIiLCJleGl0U3RhdGUiLCJwZW5kaW5nIiwia2V5TmFtZSIsInMiLCJtY3AiLCJ0b29scyJdLCJzb3VyY2VzIjpbIk1DUFRvb2xMaXN0Vmlldy50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgVGV4dCB9IGZyb20gJy4uLy4uL2luay5qcydcbmltcG9ydCB7XG4gIGV4dHJhY3RNY3BUb29sRGlzcGxheU5hbWUsXG4gIGdldE1jcERpc3BsYXlOYW1lLFxufSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9tY3AvbWNwU3RyaW5nVXRpbHMuanMnXG5pbXBvcnQgeyBmaWx0ZXJUb29sc0J5U2VydmVyIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvbWNwL3V0aWxzLmpzJ1xuaW1wb3J0IHsgdXNlQXBwU3RhdGUgfSBmcm9tICcuLi8uLi9zdGF0ZS9BcHBTdGF0ZS5qcydcbmltcG9ydCB0eXBlIHsgVG9vbCB9IGZyb20gJy4uLy4uL1Rvb2wuanMnXG5pbXBvcnQgeyBwbHVyYWwgfSBmcm9tICcuLi8uLi91dGlscy9zdHJpbmdVdGlscy5qcydcbmltcG9ydCB7IENvbmZpZ3VyYWJsZVNob3J0Y3V0SGludCB9IGZyb20gJy4uL0NvbmZpZ3VyYWJsZVNob3J0Y3V0SGludC5qcydcbmltcG9ydCB7IFNlbGVjdCB9IGZyb20gJy4uL0N1c3RvbVNlbGVjdC9pbmRleC5qcydcbmltcG9ydCB7IEJ5bGluZSB9IGZyb20gJy4uL2Rlc2lnbi1zeXN0ZW0vQnlsaW5lLmpzJ1xuaW1wb3J0IHsgRGlhbG9nIH0gZnJvbSAnLi4vZGVzaWduLXN5c3RlbS9EaWFsb2cuanMnXG5pbXBvcnQgeyBLZXlib2FyZFNob3J0Y3V0SGludCB9IGZyb20gJy4uL2Rlc2lnbi1zeXN0ZW0vS2V5Ym9hcmRTaG9ydGN1dEhpbnQuanMnXG5pbXBvcnQgdHlwZSB7IFNlcnZlckluZm8gfSBmcm9tICcuL3R5cGVzLmpzJ1xuXG50eXBlIFByb3BzID0ge1xuICBzZXJ2ZXI6IFNlcnZlckluZm9cbiAgb25TZWxlY3RUb29sOiAodG9vbDogVG9vbCwgaW5kZXg6IG51bWJlcikgPT4gdm9pZFxuICBvbkJhY2s6ICgpID0+IHZvaWRcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIE1DUFRvb2xMaXN0Vmlldyh7XG4gIHNlcnZlcixcbiAgb25TZWxlY3RUb29sLFxuICBvbkJhY2ssXG59OiBQcm9wcyk6IFJlYWN0LlJlYWN0Tm9kZSB7XG4gIGNvbnN0IG1jcFRvb2xzID0gdXNlQXBwU3RhdGUocyA9PiBzLm1jcC50b29scylcblxuICBjb25zdCBzZXJ2ZXJUb29scyA9IFJlYWN0LnVzZU1lbW8oKCkgPT4ge1xuICAgIGlmIChzZXJ2ZXIuY2xpZW50LnR5cGUgIT09ICdjb25uZWN0ZWQnKSByZXR1cm4gW11cbiAgICByZXR1cm4gZmlsdGVyVG9vbHNCeVNlcnZlcihtY3BUb29scywgc2VydmVyLm5hbWUpXG4gIH0sIFtzZXJ2ZXIsIG1jcFRvb2xzXSlcblxuICBjb25zdCB0b29sT3B0aW9ucyA9IHNlcnZlclRvb2xzLm1hcCgodG9vbCwgaW5kZXgpID0+IHtcbiAgICBjb25zdCB0b29sTmFtZSA9IGdldE1jcERpc3BsYXlOYW1lKHRvb2wubmFtZSwgc2VydmVyLm5hbWUpXG4gICAgY29uc3QgZnVsbERpc3BsYXlOYW1lID0gdG9vbC51c2VyRmFjaW5nTmFtZVxuICAgICAgPyB0b29sLnVzZXJGYWNpbmdOYW1lKHt9KVxuICAgICAgOiB0b29sTmFtZVxuICAgIC8vIEV4dHJhY3QganVzdCB0aGUgdG9vbCBkaXNwbGF5IG5hbWUgd2l0aG91dCBzZXJ2ZXIgcHJlZml4XG4gICAgY29uc3QgZGlzcGxheU5hbWUgPSBleHRyYWN0TWNwVG9vbERpc3BsYXlOYW1lKGZ1bGxEaXNwbGF5TmFtZSlcblxuICAgIGNvbnN0IGlzUmVhZE9ubHkgPSB0b29sLmlzUmVhZE9ubHk/Lih7fSkgPz8gZmFsc2VcbiAgICBjb25zdCBpc0Rlc3RydWN0aXZlID0gdG9vbC5pc0Rlc3RydWN0aXZlPy4oe30pID8/IGZhbHNlXG4gICAgY29uc3QgaXNPcGVuV29ybGQgPSB0b29sLmlzT3BlbldvcmxkPy4oe30pID8/IGZhbHNlXG5cbiAgICBjb25zdCBhbm5vdGF0aW9ucyA9IFtdXG4gICAgaWYgKGlzUmVhZE9ubHkpIGFubm90YXRpb25zLnB1c2goJ3JlYWQtb25seScpXG4gICAgaWYgKGlzRGVzdHJ1Y3RpdmUpIGFubm90YXRpb25zLnB1c2goJ2Rlc3RydWN0aXZlJylcbiAgICBpZiAoaXNPcGVuV29ybGQpIGFubm90YXRpb25zLnB1c2goJ29wZW4td29ybGQnKVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGxhYmVsOiBkaXNwbGF5TmFtZSxcbiAgICAgIHZhbHVlOiBpbmRleC50b1N0cmluZygpLFxuICAgICAgZGVzY3JpcHRpb246IGFubm90YXRpb25zLmxlbmd0aCA+IDAgPyBhbm5vdGF0aW9ucy5qb2luKCcsICcpIDogdW5kZWZpbmVkLFxuICAgICAgZGVzY3JpcHRpb25Db2xvcjogaXNEZXN0cnVjdGl2ZVxuICAgICAgICA/ICdlcnJvcidcbiAgICAgICAgOiBpc1JlYWRPbmx5XG4gICAgICAgICAgPyAnc3VjY2VzcydcbiAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICB9XG4gIH0pXG5cbiAgcmV0dXJuIChcbiAgICA8RGlhbG9nXG4gICAgICB0aXRsZT17YFRvb2xzIGZvciAke3NlcnZlci5uYW1lfWB9XG4gICAgICBzdWJ0aXRsZT17YCR7c2VydmVyVG9vbHMubGVuZ3RofSAke3BsdXJhbChzZXJ2ZXJUb29scy5sZW5ndGgsICd0b29sJyl9YH1cbiAgICAgIG9uQ2FuY2VsPXtvbkJhY2t9XG4gICAgICBpbnB1dEd1aWRlPXtleGl0U3RhdGUgPT5cbiAgICAgICAgZXhpdFN0YXRlLnBlbmRpbmcgPyAoXG4gICAgICAgICAgPFRleHQ+UHJlc3Mge2V4aXRTdGF0ZS5rZXlOYW1lfSBhZ2FpbiB0byBleGl0PC9UZXh0PlxuICAgICAgICApIDogKFxuICAgICAgICAgIDxCeWxpbmU+XG4gICAgICAgICAgICA8S2V5Ym9hcmRTaG9ydGN1dEhpbnQgc2hvcnRjdXQ9XCLihpHihpNcIiBhY3Rpb249XCJuYXZpZ2F0ZVwiIC8+XG4gICAgICAgICAgICA8S2V5Ym9hcmRTaG9ydGN1dEhpbnQgc2hvcnRjdXQ9XCJFbnRlclwiIGFjdGlvbj1cInNlbGVjdFwiIC8+XG4gICAgICAgICAgICA8Q29uZmlndXJhYmxlU2hvcnRjdXRIaW50XG4gICAgICAgICAgICAgIGFjdGlvbj1cImNvbmZpcm06bm9cIlxuICAgICAgICAgICAgICBjb250ZXh0PVwiQ29uZmlybWF0aW9uXCJcbiAgICAgICAgICAgICAgZmFsbGJhY2s9XCJFc2NcIlxuICAgICAgICAgICAgICBkZXNjcmlwdGlvbj1cImJhY2tcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L0J5bGluZT5cbiAgICAgICAgKVxuICAgICAgfVxuICAgID5cbiAgICAgIHtzZXJ2ZXJUb29scy5sZW5ndGggPT09IDAgPyAoXG4gICAgICAgIDxUZXh0IGRpbUNvbG9yPk5vIHRvb2xzIGF2YWlsYWJsZTwvVGV4dD5cbiAgICAgICkgOiAoXG4gICAgICAgIDxTZWxlY3RcbiAgICAgICAgICBvcHRpb25zPXt0b29sT3B0aW9uc31cbiAgICAgICAgICBvbkNoYW5nZT17dmFsdWUgPT4ge1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSBwYXJzZUludCh2YWx1ZSlcbiAgICAgICAgICAgIGNvbnN0IHRvb2wgPSBzZXJ2ZXJUb29sc1tpbmRleF1cbiAgICAgICAgICAgIGlmICh0b29sKSB7XG4gICAgICAgICAgICAgIG9uU2VsZWN0VG9vbCh0b29sLCBpbmRleClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9fVxuICAgICAgICAgIG9uQ2FuY2VsPXtvbkJhY2t9XG4gICAgICAgIC8+XG4gICAgICApfVxuICAgIDwvRGlhbG9nPlxuICApXG59XG4iXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPQSxLQUFLLE1BQU0sT0FBTztBQUN6QixTQUFTQyxJQUFJLFFBQVEsY0FBYztBQUNuQyxTQUNFQyx5QkFBeUIsRUFDekJDLGlCQUFpQixRQUNaLHNDQUFzQztBQUM3QyxTQUFTQyxtQkFBbUIsUUFBUSw2QkFBNkI7QUFDakUsU0FBU0MsV0FBVyxRQUFRLHlCQUF5QjtBQUNyRCxjQUFjQyxJQUFJLFFBQVEsZUFBZTtBQUN6QyxTQUFTQyxNQUFNLFFBQVEsNEJBQTRCO0FBQ25ELFNBQVNDLHdCQUF3QixRQUFRLGdDQUFnQztBQUN6RSxTQUFTQyxNQUFNLFFBQVEsMEJBQTBCO0FB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
src/components/mcp/index.ts ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ export { MCPAgentServerMenu } from './MCPAgentServerMenu.js'
2
+ export { MCPListPanel } from './MCPListPanel.js'
3
+ export { MCPReconnect } from './MCPReconnect.js'
4
+ export { MCPRemoteServerMenu } from './MCPRemoteServerMenu.js'
5
+ export { MCPSettings } from './MCPSettings.js'
6
+ export { MCPStdioServerMenu } from './MCPStdioServerMenu.js'
7
+ export { MCPToolDetailView } from './MCPToolDetailView.js'
8
+ export { MCPToolListView } from './MCPToolListView.js'
9
+ export type { AgentMcpServerInfo, MCPViewState, ServerInfo } from './types.js'
src/components/memory/MemoryUpdateNotification.tsx ADDED
@@ -0,0 +1,45 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { c as _c } from "react/compiler-runtime";
2
+ import { homedir } from 'os';
3
+ import { relative } from 'path';
4
+ import React from 'react';
5
+ import { Box, Text } from '../../ink.js';
6
+ import { getCwd } from '../../utils/cwd.js';
7
+ export function getRelativeMemoryPath(path: string): string {
8
+ const homeDir = homedir();
9
+ const cwd = getCwd();
10
+
11
+ // Calculate relative paths
12
+ const relativeToHome = path.startsWith(homeDir) ? '~' + path.slice(homeDir.length) : null;
13
+ const relativeToCwd = path.startsWith(cwd) ? './' + relative(cwd, path) : null;
14
+
15
+ // Return the shorter path, or absolute if neither is applicable
16
+ if (relativeToHome && relativeToCwd) {
17
+ return relativeToHome.length <= relativeToCwd.length ? relativeToHome : relativeToCwd;
18
+ }
19
+ return relativeToHome || relativeToCwd || path;
20
+ }
21
+ export function MemoryUpdateNotification(t0) {
22
+ const $ = _c(4);
23
+ const {
24
+ memoryPath
25
+ } = t0;
26
+ let t1;
27
+ if ($[0] !== memoryPath) {
28
+ t1 = getRelativeMemoryPath(memoryPath);
29
+ $[0] = memoryPath;
30
+ $[1] = t1;
31
+ } else {
32
+ t1 = $[1];
33
+ }
34
+ const displayPath = t1;
35
+ let t2;
36
+ if ($[2] !== displayPath) {
37
+ t2 = <Box flexDirection="column" flexGrow={1}><Text color="text">Memory updated in {displayPath} · /memory to edit</Text></Box>;
38
+ $[2] = displayPath;
39
+ $[3] = t2;
40
+ } else {
41
+ t2 = $[3];
42
+ }
43
+ return t2;
44
+ }
45
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJob21lZGlyIiwicmVsYXRpdmUiLCJSZWFjdCIsIkJveCIsIlRleHQiLCJnZXRDd2QiLCJnZXRSZWxhdGl2ZU1lbW9yeVBhdGgiLCJwYXRoIiwiaG9tZURpciIsImN3ZCIsInJlbGF0aXZlVG9Ib21lIiwic3RhcnRzV2l0aCIsInNsaWNlIiwibGVuZ3RoIiwicmVsYXRpdmVUb0N3ZCIsIk1lbW9yeVVwZGF0ZU5vdGlmaWNhdGlvbiIsInQwIiwiJCIsIl9jIiwibWVtb3J5UGF0aCIsInQxIiwiZGlzcGxheVBhdGgiLCJ0MiJdLCJzb3VyY2VzIjpbIk1lbW9yeVVwZGF0ZU5vdGlmaWNhdGlvbi50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaG9tZWRpciB9IGZyb20gJ29zJ1xuaW1wb3J0IHsgcmVsYXRpdmUgfSBmcm9tICdwYXRoJ1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgQm94LCBUZXh0IH0gZnJvbSAnLi4vLi4vaW5rLmpzJ1xuaW1wb3J0IHsgZ2V0Q3dkIH0gZnJvbSAnLi4vLi4vdXRpbHMvY3dkLmpzJ1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UmVsYXRpdmVNZW1vcnlQYXRoKHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGhvbWVEaXIgPSBob21lZGlyKClcbiAgY29uc3QgY3dkID0gZ2V0Q3dkKClcblxuICAvLyBDYWxjdWxhdGUgcmVsYXRpdmUgcGF0aHNcbiAgY29uc3QgcmVsYXRpdmVUb0hvbWUgPSBwYXRoLnN0YXJ0c1dpdGgoaG9tZURpcilcbiAgICA/ICd+JyArIHBhdGguc2xpY2UoaG9tZURpci5sZW5ndGgpXG4gICAgOiBudWxsXG5cbiAgY29uc3QgcmVsYXRpdmVUb0N3ZCA9IHBhdGguc3RhcnRzV2l0aChjd2QpID8gJy4vJyArIHJlbGF0aXZlKGN3ZCwgcGF0aCkgOiBudWxsXG5cbiAgLy8gUmV0dXJuIHRoZSBzaG9ydGVyIHBhdGgsIG9yIGFic29sdXRlIGlmIG5laXRoZXIgaXMgYXBwbGljYWJsZVxuICBpZiAocmVsYXRpdmVUb0hvbWUgJiYgcmVsYXRpdmVUb0N3ZCkge1xuICAgIHJldHVybiByZWxhdGl2ZVRvSG9tZS5sZW5ndGggPD0gcmVsYXRpdmVUb0N3ZC5sZW5ndGhcbiAgICAgID8gcmVsYXRpdmVUb0hvbWVcbiAgICAgIDogcmVsYXRpdmVUb0N3ZFxuICB9XG5cbiAgcmV0dXJuIHJlbGF0aXZlVG9Ib21lIHx8IHJlbGF0aXZlVG9Dd2QgfHwgcGF0aFxufVxuXG5leHBvcnQgZnVuY3Rpb24gTWVtb3J5VXBkYXRlTm90aWZpY2F0aW9uKHtcbiAgbWVtb3J5UGF0aCxcbn06IHtcbiAgbWVtb3J5UGF0aDogc3RyaW5nXG59KTogUmVhY3QuUmVhY3ROb2RlIHtcbiAgY29uc3QgZGlzcGxheVBhdGggPSBnZXRSZWxhdGl2ZU1lbW9yeVBhdGgobWVtb3J5UGF0aClcblxuICByZXR1cm4gKFxuICAgIDxCb3ggZmxleERpcmVjdGlvbj1cImNvbHVtblwiIGZsZXhHcm93PXsxfT5cbiAgICAgIDxUZXh0IGNvbG9yPVwidGV4dFwiPlxuICAgICAgICBNZW1vcnkgdXBkYXRlZCBpbiB7ZGlzcGxheVBhdGh9IMK3IC9tZW1vcnkgdG8gZWRpdFxuICAgICAgPC9UZXh0PlxuICAgIDwvQm94PlxuICApXG59XG4iXSwibWFwcGluZ3MiOiI7QUFBQSxTQUFTQSxPQUFPLFFBQVEsSUFBSTtBQUM1QixTQUFTQyxRQUFRLFFBQVEsTUFBTTtBQUMvQixPQUFPQyxLQUFLLE1BQU0sT0FBTztBQUN6QixTQUFTQyxHQUFHLEVBQUVDLElBQUksUUFBUSxjQUFjO0FBQ3hDLFNBQVNDLE1BQU0sUUFBUSxvQkFBb0I7QUFFM0MsT0FBTyxTQUFTQyxxQkFBcUJBLENBQUNDLElBQUksRUFBRSxNQUFNLENBQUMsRUFBRSxNQUFNLENBQUM7RUFDMUQsTUFBTUMsT0FBTyxHQUFHUixPQUFPLENBQUMsQ0FBQztFQUN6QixNQUFNUyxHQUFHLEdBQUdKLE1BQU0sQ0FBQyxDQUFDOztFQUVwQjtFQUNBLE1BQU1LLGNBQWMsR0FBR0gsSUFBSSxDQUFDSSxVQUFVLENBQUNILE9BQU8sQ0FBQyxHQUMzQyxHQUFHLEdBQUdELElBQUksQ0FBQ0ssS0FBSyxDQUFDSixPQUFPLENBQUNLLE1BQU0sQ0FBQyxHQUNoQyxJQUFJO0VBRVIsTUFBTUMsYUFBYSxHQUFHUCxJQUFJLENBQUNJLFVBQVUsQ0FBQ0YsR0FBRyxDQUFDLEdBQUcsSUFBSSxHQUFHUixRQUFRLENBQUNRLEdBQUcsRUFBRUYsSUFBSSxDQUFDLEdBQUcsSUFBSTs7RUFFOUU7RUFDQSxJQUFJRyxjQUFjLElBQUlJLGFBQWEsRUFBRTtJQUNuQyxPQUFPSixjQUFjLENBQUNHLE1BQU0sSUFBSUMsYUFBYSxDQUFDRCxNQUFNLEdBQ2hESCxjQUFjLEdBQ2RJLGFBQWE7RUFDbkI7RUFFQSxPQUFPSixjQUFjLElBQUlJLGFBQWEsSUFBSVAsSUFBSTtBQUNoRDtBQUVBLE9BQU8sU0FBQVEseUJBQUFDLEVBQUE7RUFBQSxNQUFBQyxDQUFBLEdBQUFDLEVBQUE7RUFBa0M7SUFBQUM7RUFBQSxJQUFBSCxFQUl4QztFQUFBLElBQUFJLEVBQUE7RUFBQSxJQUFBSCxDQUFBLFFBQUFFLFVBQUE7SUFDcUJDLEVBQUEsR0FBQWQscUJBQXFCLENBQUNhLFVBQVUsQ0FBQztJQUFBRixDQUFBLE1BQUFFLFVBQUE7SUFBQUYsQ0FBQSxNQUFBRyxFQUFBO0VBQUE7SUFBQUEsRUFBQSxHQUFBSCxDQUFBO0VBQUE7RUFBckQsTUFBQUksV0FBQSxHQUFvQkQsRUFBaUM7RUFBQSxJQUFBRSxFQUFBO0VBQUEsSUFBQUwsQ0FBQSxRQUFBSSxXQUFBO0lBR25EQyxFQUFBLElBQUMsR0FBRyxDQUFlLGFBQVEsQ0FBUixRQUFRLENBQVcsUUFBQyxDQUFELEdBQUMsQ0FDckMsQ0FBQyxJQUFJLENBQU8sS0FBTSxDQUFOLE1BQU0sQ0FBQyxrQkFDRUQsWUFBVSxDQUFFLGtCQUNqQyxFQUZDLElBQUksQ0FHUCxFQUpDLEdBQUcsQ0FJRTtJQUFBSixDQUFBLE1BQUFJLFdBQUE7SUFBQUosQ0FBQSxNQUFBSyxFQUFBO0VBQUE7SUFBQUEsRUFBQSxHQUFBTCxDQUFBO0VBQUE7RUFBQSxPQUpOSyxFQUlNO0FBQUEiLCJpZ25vcmVMaXN0IjpbXX0=
src/components/messages/AdvisorMessage.tsx ADDED
@@ -0,0 +1,158 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { c as _c } from "react/compiler-runtime";
2
+ import figures from 'figures';
3
+ import React from 'react';
4
+ import { Box, Text } from '../../ink.js';
5
+ import type { AdvisorBlock } from '../../utils/advisor.js';
6
+ import { renderModelName } from '../../utils/model/model.js';
7
+ import { jsonStringify } from '../../utils/slowOperations.js';
8
+ import { CtrlOToExpand } from '../CtrlOToExpand.js';
9
+ import { MessageResponse } from '../MessageResponse.js';
10
+ import { ToolUseLoader } from '../ToolUseLoader.js';
11
+ type Props = {
12
+ block: AdvisorBlock;
13
+ addMargin: boolean;
14
+ resolvedToolUseIDs: Set<string>;
15
+ erroredToolUseIDs: Set<string>;
16
+ shouldAnimate: boolean;
17
+ verbose: boolean;
18
+ advisorModel?: string;
19
+ };
20
+ export function AdvisorMessage(t0) {
21
+ const $ = _c(30);
22
+ const {
23
+ block,
24
+ addMargin,
25
+ resolvedToolUseIDs,
26
+ erroredToolUseIDs,
27
+ shouldAnimate,
28
+ verbose,
29
+ advisorModel
30
+ } = t0;
31
+ if (block.type === "server_tool_use") {
32
+ let t1;
33
+ if ($[0] !== block.input) {
34
+ t1 = block.input && Object.keys(block.input).length > 0 ? jsonStringify(block.input) : null;
35
+ $[0] = block.input;
36
+ $[1] = t1;
37
+ } else {
38
+ t1 = $[1];
39
+ }
40
+ const input = t1;
41
+ const t2 = addMargin ? 1 : 0;
42
+ let t3;
43
+ if ($[2] !== block.id || $[3] !== resolvedToolUseIDs) {
44
+ t3 = resolvedToolUseIDs.has(block.id);
45
+ $[2] = block.id;
46
+ $[3] = resolvedToolUseIDs;
47
+ $[4] = t3;
48
+ } else {
49
+ t3 = $[4];
50
+ }
51
+ const t4 = !t3;
52
+ let t5;
53
+ if ($[5] !== block.id || $[6] !== erroredToolUseIDs) {
54
+ t5 = erroredToolUseIDs.has(block.id);
55
+ $[5] = block.id;
56
+ $[6] = erroredToolUseIDs;
57
+ $[7] = t5;
58
+ } else {
59
+ t5 = $[7];
60
+ }
61
+ let t6;
62
+ if ($[8] !== shouldAnimate || $[9] !== t4 || $[10] !== t5) {
63
+ t6 = <ToolUseLoader shouldAnimate={shouldAnimate} isUnresolved={t4} isError={t5} />;
64
+ $[8] = shouldAnimate;
65
+ $[9] = t4;
66
+ $[10] = t5;
67
+ $[11] = t6;
68
+ } else {
69
+ t6 = $[11];
70
+ }
71
+ let t7;
72
+ if ($[12] === Symbol.for("react.memo_cache_sentinel")) {
73
+ t7 = <Text bold={true}>Advising</Text>;
74
+ $[12] = t7;
75
+ } else {
76
+ t7 = $[12];
77
+ }
78
+ let t8;
79
+ if ($[13] !== advisorModel) {
80
+ t8 = advisorModel ? <Text dimColor={true}> using {renderModelName(advisorModel)}</Text> : null;
81
+ $[13] = advisorModel;
82
+ $[14] = t8;
83
+ } else {
84
+ t8 = $[14];
85
+ }
86
+ let t9;
87
+ if ($[15] !== input) {
88
+ t9 = input ? <Text dimColor={true}> · {input}</Text> : null;
89
+ $[15] = input;
90
+ $[16] = t9;
91
+ } else {
92
+ t9 = $[16];
93
+ }
94
+ let t10;
95
+ if ($[17] !== t2 || $[18] !== t6 || $[19] !== t8 || $[20] !== t9) {
96
+ t10 = <Box marginTop={t2} paddingRight={2} flexDirection="row">{t6}{t7}{t8}{t9}</Box>;
97
+ $[17] = t2;
98
+ $[18] = t6;
99
+ $[19] = t8;
100
+ $[20] = t9;
101
+ $[21] = t10;
102
+ } else {
103
+ t10 = $[21];
104
+ }
105
+ return t10;
106
+ }
107
+ let body;
108
+ bb0: switch (block.content.type) {
109
+ case "advisor_tool_result_error":
110
+ {
111
+ let t1;
112
+ if ($[22] !== block.content.error_code) {
113
+ t1 = <Text color="error">Advisor unavailable ({block.content.error_code})</Text>;
114
+ $[22] = block.content.error_code;
115
+ $[23] = t1;
116
+ } else {
117
+ t1 = $[23];
118
+ }
119
+ body = t1;
120
+ break bb0;
121
+ }
122
+ case "advisor_result":
123
+ {
124
+ let t1;
125
+ if ($[24] !== block.content.text || $[25] !== verbose) {
126
+ t1 = verbose ? <Text dimColor={true}>{block.content.text}</Text> : <Text dimColor={true}>{figures.tick} Advisor has reviewed the conversation and will apply the feedback <CtrlOToExpand /></Text>;
127
+ $[24] = block.content.text;
128
+ $[25] = verbose;
129
+ $[26] = t1;
130
+ } else {
131
+ t1 = $[26];
132
+ }
133
+ body = t1;
134
+ break bb0;
135
+ }
136
+ case "advisor_redacted_result":
137
+ {
138
+ let t1;
139
+ if ($[27] === Symbol.for("react.memo_cache_sentinel")) {
140
+ t1 = <Text dimColor={true}>{figures.tick} Advisor has reviewed the conversation and will apply the feedback</Text>;
141
+ $[27] = t1;
142
+ } else {
143
+ t1 = $[27];
144
+ }
145
+ body = t1;
146
+ }
147
+ }
148
+ let t1;
149
+ if ($[28] !== body) {
150
+ t1 = <Box paddingRight={2}><MessageResponse>{body}</MessageResponse></Box>;
151
+ $[28] = body;
152
+ $[29] = t1;
153
+ } else {
154
+ t1 = $[29];
155
+ }
156
+ return t1;
157
+ }
158
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJmaWd1cmVzIiwiUmVhY3QiLCJCb3giLCJUZXh0IiwiQWR2aXNvckJsb2NrIiwicmVuZGVyTW9kZWxOYW1lIiwianNvblN0cmluZ2lmeSIsIkN0cmxPVG9FeHBhbmQiLCJNZXNzYWdlUmVzcG9uc2UiLCJUb29sVXNlTG9hZGVyIiwiUHJvcHMiLCJibG9jayIsImFkZE1hcmdpbiIsInJlc29sdmVkVG9vbFVzZUlEcyIsIlNldCIsImVycm9yZWRUb29sVXNlSURzIiwic2hvdWxkQW5pbWF0ZSIsInZlcmJvc2UiLCJhZHZpc29yTW9kZWwiLCJBZHZpc29yTWVzc2FnZSIsInQwIiwiJCIsIl9jIiwidHlwZSIsInQxIiwiaW5wdXQiLCJPYmplY3QiLCJrZXlzIiwibGVuZ3RoIiwidDIiLCJ0MyIsImlkIiwiaGFzIiwidDQiLCJ0NSIsInQ2IiwidDciLCJTeW1ib2wiLCJmb3IiLCJ0OCIsInQ5IiwidDEwIiwiYm9keSIsImJiMCIsImNvbnRlbnQiLCJlcnJvcl9jb2RlIiwidGV4dCIsInRpY2siXSwic291cmNlcyI6WyJBZHZpc29yTWVzc2FnZS50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGZpZ3VyZXMgZnJvbSAnZmlndXJlcydcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7IEJveCwgVGV4dCB9IGZyb20gJy4uLy4uL2luay5qcydcbmltcG9ydCB0eXBlIHsgQWR2aXNvckJsb2NrIH0gZnJvbSAnLi4vLi4vdXRpbHMvYWR2aXNvci5qcydcbmltcG9ydCB7IHJlbmRlck1vZGVsTmFtZSB9IGZyb20gJy4uLy4uL3V0aWxzL21vZGVsL21vZGVsLmpzJ1xuaW1wb3J0IHsganNvblN0cmluZ2lmeSB9IGZyb20gJy4uLy4uL3V0aWxzL3Nsb3dPcGVyYXRpb25zLmpzJ1xuaW1wb3J0IHsgQ3RybE9Ub0V4cGFuZCB9IGZyb20gJy4uL0N0cmxPVG9FeHBhbmQuanMnXG5pbXBvcnQgeyBNZXNzYWdlUmVzcG9uc2UgfSBmcm9tICcuLi9NZXNzYWdlUmVzcG9uc2UuanMnXG5pbXBvcnQgeyBUb29sVXNlTG9hZGVyIH0gZnJvbSAnLi4vVG9vbFVzZUxvYWRlci5qcydcblxudHlwZSBQcm9wcyA9IHtcbiAgYmxvY2s6IEFkdmlzb3JCbG9ja1xuICBhZGRNYXJnaW46IGJvb2xlYW5cbiAgcmVzb2x2ZWRUb29sVXNlSURzOiBTZXQ8c3RyaW5nPlxuICBlcnJvcmVkVG9vbFVzZUlEczogU2V0PHN0cmluZz5cbiAgc2hvdWxkQW5pbWF0ZTogYm9vbGVhblxuICB2ZXJib3NlOiBib29sZWFuXG4gIGFkdmlzb3JNb2RlbD86IHN0cmluZ1xufVxuXG5leHBvcnQgZnVuY3Rpb24gQWR2aXNvck1lc3NhZ2Uoe1xuICBibG9jayxcbiAgYWRkTWFyZ2luLFxuICByZXNvbHZlZFRvb2xVc2VJRHMsXG4gIGVycm9yZWRUb29sVXNlSURzLFxuICBzaG91bGRBbmltYXRlLFxuICB2ZXJib3NlLFxuICBhZHZpc29yTW9kZWwsXG59OiBQcm9wcyk6IFJlYWN0LlJlYWN0Tm9kZSB7XG4gIGlmIChibG9jay50eXBlID09PSAnc2VydmVyX3Rvb2xfdXNlJykge1xuICAgIGNvbnN0IGlucHV0ID1cbiAgICAgIGJsb2NrLmlucHV0ICYmIE9iamVjdC5rZXlzKGJsb2NrLmlucHV0KS5sZW5ndGggPiAwXG4gICAgICAgID8ganNvblN0cmluZ2lmeShibG9jay5pbnB1dClcbiAgICAgICAgOiBudWxsXG4gICAgcmV0dXJuIChcbiAgICAgIDxCb3ggbWFyZ2luVG9wPXthZGRNYXJnaW4gPyAxIDogMH0gcGFkZGluZ1JpZ2h0PXsyfSBmbGV4RGlyZWN0aW9uPVwicm93XCI+XG4gICAgICAgIDxUb29sVXNlTG9hZGVyXG4gICAgICAgICAgc2hvdWxkQW5pbWF0ZT17c2hvdWxkQW5pbWF0ZX1cbiAgICAgICAgICBpc1VucmVzb2x2ZWQ9eyFyZXNvbHZlZFRvb2xVc2VJRHMuaGFzKGJsb2NrLmlkKX1cbiAgICAgICAgICBpc0Vycm9yPXtlcnJvcmVkVG9vbFVzZUlEcy5oYXMoYmxvY2suaWQpfVxuICAgICAgICAvPlxuICAgICAgICA8VGV4dCBib2xkPkFkdmlzaW5nPC9UZXh0PlxuICAgICAgICB7YWR2aXNvck1vZGVsID8gKFxuICAgICAgICAgIDxUZXh0IGRpbUNvbG9yPiB1c2luZyB7cmVuZGVyTW9kZWxOYW1lKGFkdmlzb3JNb2RlbCl9PC9UZXh0PlxuICAgICAgICApIDogbnVsbH1cbiAgICAgICAge2lucHV0ID8gPFRleHQgZGltQ29sb3I+IMK3IHtpbnB1dH08L1RleHQ+IDogbnVsbH1cbiAgICAgIDwvQm94PlxuICAgIClcbiAgfVxuXG4gIGxldCBib2R5OiBSZWFjdC5SZWFjdE5vZGVcbiAgc3dpdGNoIChibG9jay5jb250ZW50LnR5cGUpIHtcbiAgICBjYXNlICdhZHZpc29yX3Rvb2xfcmVzdWx0X2Vycm9yJzpcbiAgICAgIGJvZHkgPSAoXG4gICAgICAgIDxUZXh0IGNvbG9yPVwiZXJyb3JcIj5cbiAgICAgICAgICBBZHZpc29yIHVuYXZhaWxhYmxlICh7YmxvY2suY29udGVudC5lcnJvcl9jb2RlfSlcbiAgICAgICAgPC9UZXh0PlxuICAgICAgKVxuICAgICAgYnJlYWtcbiAgICBjYXNlICdhZHZpc29yX3Jlc3VsdCc6XG4gICAgICBib2R5ID0gdmVyYm9zZSA/IChcbiAgICAgICAgPFRleHQgZGltQ29sb3I+e2Jsb2NrLmNvbnRlbnQudGV4dH08L1RleHQ+XG4gICAgICApIDogKFxuICAgICAgICA8VGV4dCBkaW1Db2xvcj5cbiAgICAgICAgICB7ZmlndXJlcy50aWNrfSBBZHZpc29yIGhhcyByZXZpZXdlZCB0aGUgY29udmVyc2F0aW9uIGFuZCB3aWxsIGFwcGx5XG4gICAgICAgICAgdGhlIGZlZWRiYWNrIDxDdHJsT1RvRXhwYW5kIC8+XG4gICAgICAgIDwvVGV4dD5cbiAgICAgIClcbiAgICAgIGJyZWFrXG4gICAgY2FzZSAnYWR2aXNvcl9yZWRhY3RlZF9yZXN1bHQnOlxuICAgICAgYm9keSA9IChcbiAgICAgICAgPFRleHQgZGltQ29sb3I+XG4gICAgICAgICAge2ZpZ3VyZXMudGlja30gQWR2aXNvciBoYXMgcmV2aWV3ZWQgdGhlIGNvbnZlcnNhdGlvbiBhbmQgd2lsbCBhcHBseVxuICAgICAgICAgIHRoZSBmZWVkYmFja1xuICAgICAgICA8L1RleHQ+XG4gICAgICApXG4gICAgICBicmVha1xuICB9XG5cbiAgcmV0dXJuIChcbiAgICA8Qm94IHBhZGRpbmdSaWdodD17Mn0+XG4gICAgICA8TWVzc2FnZVJlc3BvbnNlPntib2R5fTwvTWVzc2FnZVJlc3BvbnNlPlxuICAgIDwvQm94PlxuICApXG59XG4iXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPQSxPQUFPLE1BQU0sU0FBUztBQUM3QixPQUFPQyxLQUFLLE1BQU0sT0FBTztBQUN6QixTQUFTQyxHQUFHLEVBQUVDLElBQUksUUFBUSxjQUFjO0FBQ3hDLGNBQWNDLFlBQVksUUFBUSx3QkFBd0I7QUFDMUQsU0FBU0MsZUFBZSxRQUFRLDRCQUE0QjtBQUM1RCxTQUFTQyxhQUFhLFFBQVEsK0JBQStCO0FBQzdELFNBQVNDLGFBQWEsUUFBUSxxQkFBcUI7QUFDbkQsU0FBU0MsZUFBZSxRQUFRLHVCQUF1QjtBQUN2RCxTQUFTQyxhQUFhLFFBQVEscUJBQXFCO0FBRW5ELEtBQUtDLEtBQUssR0FBRztFQUNYQyxLQUFLLEVBQUVQLFlBQVk7RUFDbkJRLFNBQVMsRUFBRSxPQUFPO0VBQ2xCQyxrQkFBa0IsRUFBRUMsR0FBRyxDQUFDLE1BQU0sQ0FBQztFQUMvQkMsaUJBQWlCLEVBQUVELEdBQUcsQ0FBQyxNQUFNLENBQUM7RUFDOUJFLGFBQWEsRUFBRSxPQUFPO0VBQ3RCQyxPQUFPLEVBQUUsT0FBTztFQUNoQkMsWUFBWSxDQUFDLEVBQUUsTUFBTTtBQUN2QixDQUFDO0FBRUQsT0FBTyxTQUFBQyxlQUFBQyxFQUFBO0VBQUEsTUFBQUMsQ0FBQSxHQUFBQyxFQUFBO0VBQXdCO0lBQUFYLEtBQUE7SUFBQUMsU0FBQTtJQUFBQyxrQkFBQTtJQUFBRSxpQkFBQTtJQUFBQyxhQUFBO0lBQUFDLE9BQUE7SUFBQUM7RUFBQSxJQUFBRSxF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
src/components/messages/CollapsedReadSearchContent.tsx ADDED
@@ -0,0 +1,484 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { c as _c } from "react/compiler-runtime";
2
+ import { feature } from 'bun:bundle';
3
+ import { basename } from 'path';
4
+ import React, { useRef } from 'react';
5
+ import { useMinDisplayTime } from '../../hooks/useMinDisplayTime.js';
6
+ import { Ansi, Box, Text, useTheme } from '../../ink.js';
7
+ import { findToolByName, type Tools } from '../../Tool.js';
8
+ import { getReplPrimitiveTools } from '../../tools/REPLTool/primitiveTools.js';
9
+ import type { CollapsedReadSearchGroup, NormalizedAssistantMessage } from '../../types/message.js';
10
+ import { uniq } from '../../utils/array.js';
11
+ import { getToolUseIdsFromCollapsedGroup } from '../../utils/collapseReadSearch.js';
12
+ import { getDisplayPath } from '../../utils/file.js';
13
+ import { formatDuration, formatSecondsShort } from '../../utils/format.js';
14
+ import { isFullscreenEnvEnabled } from '../../utils/fullscreen.js';
15
+ import type { buildMessageLookups } from '../../utils/messages.js';
16
+ import type { ThemeName } from '../../utils/theme.js';
17
+ import { CtrlOToExpand } from '../CtrlOToExpand.js';
18
+ import { useSelectedMessageBg } from '../messageActions.js';
19
+ import { PrBadge } from '../PrBadge.js';
20
+ import { ToolUseLoader } from '../ToolUseLoader.js';
21
+
22
+ /* eslint-disable @typescript-eslint/no-require-imports */
23
+ const teamMemCollapsed = feature('TEAMMEM') ? require('./teamMemCollapsed.js') as typeof import('./teamMemCollapsed.js') : null;
24
+ /* eslint-enable @typescript-eslint/no-require-imports */
25
+
26
+ // Hold each ⤿ hint for a minimum duration so fast-completing tool calls
27
+ // (bash commands, file reads, search patterns) are actually readable instead
28
+ // of flickering past in a single frame.
29
+ const MIN_HINT_DISPLAY_MS = 700;
30
+ type Props = {
31
+ message: CollapsedReadSearchGroup;
32
+ inProgressToolUseIDs: Set<string>;
33
+ shouldAnimate: boolean;
34
+ verbose: boolean;
35
+ tools: Tools;
36
+ lookups: ReturnType<typeof buildMessageLookups>;
37
+ /** True if this is the currently active collapsed group (last one, still loading) */
38
+ isActiveGroup?: boolean;
39
+ };
40
+
41
+ /** Render a single tool use in verbose mode */
42
+ function VerboseToolUse(t0) {
43
+ const $ = _c(24);
44
+ const {
45
+ content,
46
+ tools,
47
+ lookups,
48
+ inProgressToolUseIDs,
49
+ shouldAnimate,
50
+ theme
51
+ } = t0;
52
+ const bg = useSelectedMessageBg();
53
+ let t1;
54
+ let t2;
55
+ if ($[0] !== bg || $[1] !== content.id || $[2] !== content.input || $[3] !== content.name || $[4] !== inProgressToolUseIDs || $[5] !== lookups || $[6] !== shouldAnimate || $[7] !== theme || $[8] !== tools) {
56
+ t2 = Symbol.for("react.early_return_sentinel");
57
+ bb0: {
58
+ const tool = findToolByName(tools, content.name) ?? findToolByName(getReplPrimitiveTools(), content.name);
59
+ if (!tool) {
60
+ t2 = null;
61
+ break bb0;
62
+ }
63
+ let t3;
64
+ if ($[11] !== content.id || $[12] !== lookups.resolvedToolUseIDs) {
65
+ t3 = lookups.resolvedToolUseIDs.has(content.id);
66
+ $[11] = content.id;
67
+ $[12] = lookups.resolvedToolUseIDs;
68
+ $[13] = t3;
69
+ } else {
70
+ t3 = $[13];
71
+ }
72
+ const isResolved = t3;
73
+ let t4;
74
+ if ($[14] !== content.id || $[15] !== lookups.erroredToolUseIDs) {
75
+ t4 = lookups.erroredToolUseIDs.has(content.id);
76
+ $[14] = content.id;
77
+ $[15] = lookups.erroredToolUseIDs;
78
+ $[16] = t4;
79
+ } else {
80
+ t4 = $[16];
81
+ }
82
+ const isError = t4;
83
+ let t5;
84
+ if ($[17] !== content.id || $[18] !== inProgressToolUseIDs) {
85
+ t5 = inProgressToolUseIDs.has(content.id);
86
+ $[17] = content.id;
87
+ $[18] = inProgressToolUseIDs;
88
+ $[19] = t5;
89
+ } else {
90
+ t5 = $[19];
91
+ }
92
+ const isInProgress = t5;
93
+ const resultMsg = lookups.toolResultByToolUseID.get(content.id);
94
+ const rawToolResult = resultMsg?.type === "user" ? resultMsg.toolUseResult : undefined;
95
+ const parsedOutput = tool.outputSchema?.safeParse(rawToolResult);
96
+ const toolResult = parsedOutput?.success ? parsedOutput.data : undefined;
97
+ const parsedInput = tool.inputSchema.safeParse(content.input);
98
+ const input = parsedInput.success ? parsedInput.data : undefined;
99
+ const userFacingName = tool.userFacingName(input);
100
+ const toolUseMessage = input ? tool.renderToolUseMessage(input, {
101
+ theme,
102
+ verbose: true
103
+ }) : null;
104
+ const t6 = shouldAnimate && isInProgress;
105
+ const t7 = !isResolved;
106
+ let t8;
107
+ if ($[20] !== isError || $[21] !== t6 || $[22] !== t7) {
108
+ t8 = <ToolUseLoader shouldAnimate={t6} isUnresolved={t7} isError={isError} />;
109
+ $[20] = isError;
110
+ $[21] = t6;
111
+ $[22] = t7;
112
+ $[23] = t8;
113
+ } else {
114
+ t8 = $[23];
115
+ }
116
+ t1 = <Box key={content.id} flexDirection="column" marginTop={1} backgroundColor={bg}><Box flexDirection="row">{t8}<Text><Text bold={true}>{userFacingName}</Text>{toolUseMessage && <Text>({toolUseMessage})</Text>}</Text>{input && tool.renderToolUseTag?.(input)}</Box>{isResolved && !isError && toolResult !== undefined && <Box>{tool.renderToolResultMessage?.(toolResult, [], {
117
+ verbose: true,
118
+ tools,
119
+ theme
120
+ })}</Box>}</Box>;
121
+ }
122
+ $[0] = bg;
123
+ $[1] = content.id;
124
+ $[2] = content.input;
125
+ $[3] = content.name;
126
+ $[4] = inProgressToolUseIDs;
127
+ $[5] = lookups;
128
+ $[6] = shouldAnimate;
129
+ $[7] = theme;
130
+ $[8] = tools;
131
+ $[9] = t1;
132
+ $[10] = t2;
133
+ } else {
134
+ t1 = $[9];
135
+ t2 = $[10];
136
+ }
137
+ if (t2 !== Symbol.for("react.early_return_sentinel")) {
138
+ return t2;
139
+ }
140
+ return t1;
141
+ }
142
+ export function CollapsedReadSearchContent({
143
+ message,
144
+ inProgressToolUseIDs,
145
+ shouldAnimate,
146
+ verbose,
147
+ tools,
148
+ lookups,
149
+ isActiveGroup
150
+ }: Props): React.ReactNode {
151
+ const bg = useSelectedMessageBg();
152
+ const {
153
+ searchCount: rawSearchCount,
154
+ readCount: rawReadCount,
155
+ listCount: rawListCount,
156
+ replCount,
157
+ memorySearchCount,
158
+ memoryReadCount,
159
+ memoryWriteCount,
160
+ messages: groupMessages
161
+ } = message;
162
+ const [theme] = useTheme();
163
+ const toolUseIds = getToolUseIdsFromCollapsedGroup(message);
164
+ const anyError = toolUseIds.some(id => lookups.erroredToolUseIDs.has(id));
165
+ const hasMemoryOps = memorySearchCount > 0 || memoryReadCount > 0 || memoryWriteCount > 0;
166
+ const hasTeamMemoryOps = feature('TEAMMEM') ? teamMemCollapsed!.checkHasTeamMemOps(message) : false;
167
+
168
+ // Track the max seen counts so they only ever increase. The debounce timer
169
+ // causes extra re-renders at arbitrary times; during a brief "invisible window"
170
+ // in the streaming executor the group count can dip, which causes jitter.
171
+ const maxReadCountRef = useRef(0);
172
+ const maxSearchCountRef = useRef(0);
173
+ const maxListCountRef = useRef(0);
174
+ const maxMcpCountRef = useRef(0);
175
+ const maxBashCountRef = useRef(0);
176
+ maxReadCountRef.current = Math.max(maxReadCountRef.current, rawReadCount);
177
+ maxSearchCountRef.current = Math.max(maxSearchCountRef.current, rawSearchCount);
178
+ maxListCountRef.current = Math.max(maxListCountRef.current, rawListCount);
179
+ maxMcpCountRef.current = Math.max(maxMcpCountRef.current, message.mcpCallCount ?? 0);
180
+ maxBashCountRef.current = Math.max(maxBashCountRef.current, message.bashCount ?? 0);
181
+ const readCount = maxReadCountRef.current;
182
+ const searchCount = maxSearchCountRef.current;
183
+ const listCount = maxListCountRef.current;
184
+ const mcpCallCount = maxMcpCountRef.current;
185
+ // Subtract commands surfaced as "Committed …" / "Created PR …" so the
186
+ // same command isn't counted twice. gitOpBashCount is read live (no max-ref
187
+ // needed — it's 0 until results arrive, then only grows).
188
+ const gitOpBashCount = message.gitOpBashCount ?? 0;
189
+ const bashCount = isFullscreenEnvEnabled() ? Math.max(0, maxBashCountRef.current - gitOpBashCount) : 0;
190
+ const hasNonMemoryOps = searchCount > 0 || readCount > 0 || listCount > 0 || replCount > 0 || mcpCallCount > 0 || bashCount > 0 || gitOpBashCount > 0;
191
+ const readPaths = message.readFilePaths;
192
+ const searchArgs = message.searchArgs;
193
+ let incomingHint = message.latestDisplayHint;
194
+ if (incomingHint === undefined) {
195
+ const lastSearchRaw = searchArgs?.at(-1);
196
+ const lastSearch = lastSearchRaw !== undefined ? `"${lastSearchRaw}"` : undefined;
197
+ const lastRead = readPaths?.at(-1);
198
+ incomingHint = lastRead !== undefined ? getDisplayPath(lastRead) : lastSearch;
199
+ }
200
+
201
+ // Active REPL calls emit repl_tool_call progress with the current inner
202
+ // tool's name+input. Virtual messages don't arrive until REPL completes,
203
+ // so this is the only source of a live hint during execution.
204
+ if (isActiveGroup) {
205
+ for (const id_0 of toolUseIds) {
206
+ if (!inProgressToolUseIDs.has(id_0)) continue;
207
+ const latest = lookups.progressMessagesByToolUseID.get(id_0)?.at(-1)?.data;
208
+ if (latest?.type === 'repl_tool_call' && latest.phase === 'start') {
209
+ const input = latest.toolInput as {
210
+ command?: string;
211
+ pattern?: string;
212
+ file_path?: string;
213
+ };
214
+ incomingHint = input.file_path ?? (input.pattern ? `"${input.pattern}"` : undefined) ?? input.command ?? latest.toolName;
215
+ }
216
+ }
217
+ }
218
+ const displayedHint = useMinDisplayTime(incomingHint, MIN_HINT_DISPLAY_MS);
219
+
220
+ // In verbose mode, render each tool use with its 1-line result summary
221
+ if (verbose) {
222
+ const toolUses: NormalizedAssistantMessage[] = [];
223
+ for (const msg of groupMessages) {
224
+ if (msg.type === 'assistant') {
225
+ toolUses.push(msg);
226
+ } else if (msg.type === 'grouped_tool_use') {
227
+ toolUses.push(...msg.messages);
228
+ }
229
+ }
230
+ return <Box flexDirection="column">
231
+ {toolUses.map(msg_0 => {
232
+ const content = msg_0.message.content[0];
233
+ if (content?.type !== 'tool_use') return null;
234
+ return <VerboseToolUse key={content.id} content={content} tools={tools} lookups={lookups} inProgressToolUseIDs={inProgressToolUseIDs} shouldAnimate={shouldAnimate} theme={theme} />;
235
+ })}
236
+ {message.hookInfos && message.hookInfos.length > 0 && <>
237
+ <Text dimColor>
238
+ {' ⎿ '}Ran {message.hookCount} PreToolUse{' '}
239
+ {message.hookCount === 1 ? 'hook' : 'hooks'} (
240
+ {formatSecondsShort(message.hookTotalMs ?? 0)})
241
+ </Text>
242
+ {message.hookInfos.map((info, idx) => <Text key={`hook-${idx}`} dimColor>
243
+ {' ⎿ '}
244
+ {info.command} ({formatSecondsShort(info.durationMs ?? 0)})
245
+ </Text>)}
246
+ </>}
247
+ {message.relevantMemories?.map(m => <Box key={m.path} flexDirection="column" marginTop={1}>
248
+ <Text dimColor>
249
+ {' ⎿ '}Recalled {basename(m.path)}
250
+ </Text>
251
+ <Box paddingLeft={5}>
252
+ <Text>
253
+ <Ansi>{m.content}</Ansi>
254
+ </Text>
255
+ </Box>
256
+ </Box>)}
257
+ </Box>;
258
+ }
259
+
260
+ // Non-verbose mode: Show counts with blinking grey dot while active, green dot when finalized
261
+ // Use present tense when active, past tense when finalized
262
+
263
+ // Defensive: If all counts are 0, don't render the collapsed group
264
+ // This shouldn't happen in normal operation, but handles edge cases
265
+ if (!hasMemoryOps && !hasTeamMemoryOps && !hasNonMemoryOps) {
266
+ return null;
267
+ }
268
+
269
+ // Find the slowest in-progress shell command in this group. BashTool yields
270
+ // progress every second but the collapsed renderer never showed it — long
271
+ // commands (npm install, tests) looked frozen. Shown after 2s so fast
272
+ // commands stay clean; the ticking counter reassures that slow ones aren't stuck.
273
+ let shellProgressSuffix = '';
274
+ if (isFullscreenEnvEnabled() && isActiveGroup) {
275
+ let elapsed: number | undefined;
276
+ let lines = 0;
277
+ for (const id_1 of toolUseIds) {
278
+ if (!inProgressToolUseIDs.has(id_1)) continue;
279
+ const data = lookups.progressMessagesByToolUseID.get(id_1)?.at(-1)?.data;
280
+ if (data?.type !== 'bash_progress' && data?.type !== 'powershell_progress') {
281
+ continue;
282
+ }
283
+ if (elapsed === undefined || data.elapsedTimeSeconds > elapsed) {
284
+ elapsed = data.elapsedTimeSeconds;
285
+ lines = data.totalLines;
286
+ }
287
+ }
288
+ if (elapsed !== undefined && elapsed >= 2) {
289
+ const time = formatDuration(elapsed * 1000);
290
+ shellProgressSuffix = lines > 0 ? ` (${time} · ${lines} ${lines === 1 ? 'line' : 'lines'})` : ` (${time})`;
291
+ }
292
+ }
293
+
294
+ // Build non-memory parts first (search, read, repl, mcp, bash) — these render
295
+ // before memory so the line reads "Ran 3 bash commands, recalled 1 memory".
296
+ const nonMemParts: React.ReactNode[] = [];
297
+
298
+ // Git operations lead the line — they're the load-bearing outcome.
299
+ function pushPart(key: string, verb: string, body: React.ReactNode): void {
300
+ const isFirst = nonMemParts.length === 0;
301
+ if (!isFirst) nonMemParts.push(<Text key={`comma-${key}`}>, </Text>);
302
+ nonMemParts.push(<Text key={key}>
303
+ {isFirst ? verb[0]!.toUpperCase() + verb.slice(1) : verb} {body}
304
+ </Text>);
305
+ }
306
+ if (isFullscreenEnvEnabled() && message.commits?.length) {
307
+ const byKind = {
308
+ committed: 'committed',
309
+ amended: 'amended commit',
310
+ 'cherry-picked': 'cherry-picked'
311
+ };
312
+ for (const kind of ['committed', 'amended', 'cherry-picked'] as const) {
313
+ const shas = message.commits.filter(c => c.kind === kind).map(c_0 => c_0.sha);
314
+ if (shas.length) {
315
+ pushPart(kind, byKind[kind], <Text bold>{shas.join(', ')}</Text>);
316
+ }
317
+ }
318
+ }
319
+ if (isFullscreenEnvEnabled() && message.pushes?.length) {
320
+ const branches = uniq(message.pushes.map(p => p.branch));
321
+ pushPart('push', 'pushed to', <Text bold>{branches.join(', ')}</Text>);
322
+ }
323
+ if (isFullscreenEnvEnabled() && message.branches?.length) {
324
+ const byAction = {
325
+ merged: 'merged',
326
+ rebased: 'rebased onto'
327
+ };
328
+ for (const b of message.branches) {
329
+ pushPart(`br-${b.action}-${b.ref}`, byAction[b.action], <Text bold>{b.ref}</Text>);
330
+ }
331
+ }
332
+ if (isFullscreenEnvEnabled() && message.prs?.length) {
333
+ const verbs = {
334
+ created: 'created',
335
+ edited: 'edited',
336
+ merged: 'merged',
337
+ commented: 'commented on',
338
+ closed: 'closed',
339
+ ready: 'marked ready'
340
+ };
341
+ for (const pr of message.prs) {
342
+ pushPart(`pr-${pr.action}-${pr.number}`, verbs[pr.action], pr.url ? <PrBadge number={pr.number} url={pr.url} bold /> : <Text bold>PR #{pr.number}</Text>);
343
+ }
344
+ }
345
+ if (searchCount > 0) {
346
+ const isFirst_0 = nonMemParts.length === 0;
347
+ const searchVerb = isActiveGroup ? isFirst_0 ? 'Searching for' : 'searching for' : isFirst_0 ? 'Searched for' : 'searched for';
348
+ if (!isFirst_0) {
349
+ nonMemParts.push(<Text key="comma-s">, </Text>);
350
+ }
351
+ nonMemParts.push(<Text key="search">
352
+ {searchVerb} <Text bold>{searchCount}</Text>{' '}
353
+ {searchCount === 1 ? 'pattern' : 'patterns'}
354
+ </Text>);
355
+ }
356
+ if (readCount > 0) {
357
+ const isFirst_1 = nonMemParts.length === 0;
358
+ const readVerb = isActiveGroup ? isFirst_1 ? 'Reading' : 'reading' : isFirst_1 ? 'Read' : 'read';
359
+ if (!isFirst_1) {
360
+ nonMemParts.push(<Text key="comma-r">, </Text>);
361
+ }
362
+ nonMemParts.push(<Text key="read">
363
+ {readVerb} <Text bold>{readCount}</Text>{' '}
364
+ {readCount === 1 ? 'file' : 'files'}
365
+ </Text>);
366
+ }
367
+ if (listCount > 0) {
368
+ const isFirst_2 = nonMemParts.length === 0;
369
+ const listVerb = isActiveGroup ? isFirst_2 ? 'Listing' : 'listing' : isFirst_2 ? 'Listed' : 'listed';
370
+ if (!isFirst_2) {
371
+ nonMemParts.push(<Text key="comma-l">, </Text>);
372
+ }
373
+ nonMemParts.push(<Text key="list">
374
+ {listVerb} <Text bold>{listCount}</Text>{' '}
375
+ {listCount === 1 ? 'directory' : 'directories'}
376
+ </Text>);
377
+ }
378
+ if (replCount > 0) {
379
+ const replVerb = isActiveGroup ? "REPL'ing" : "REPL'd";
380
+ if (nonMemParts.length > 0) {
381
+ nonMemParts.push(<Text key="comma-repl">, </Text>);
382
+ }
383
+ nonMemParts.push(<Text key="repl">
384
+ {replVerb} <Text bold>{replCount}</Text>{' '}
385
+ {replCount === 1 ? 'time' : 'times'}
386
+ </Text>);
387
+ }
388
+ if (mcpCallCount > 0) {
389
+ const serverLabel = message.mcpServerNames?.map(n => n.replace(/^claude\.ai /, '')).join(', ') || 'MCP';
390
+ const isFirst_3 = nonMemParts.length === 0;
391
+ const verb_0 = isActiveGroup ? isFirst_3 ? 'Querying' : 'querying' : isFirst_3 ? 'Queried' : 'queried';
392
+ if (!isFirst_3) {
393
+ nonMemParts.push(<Text key="comma-mcp">, </Text>);
394
+ }
395
+ nonMemParts.push(<Text key="mcp">
396
+ {verb_0} {serverLabel}
397
+ {mcpCallCount > 1 && <>
398
+ {' '}
399
+ <Text bold>{mcpCallCount}</Text> times
400
+ </>}
401
+ </Text>);
402
+ }
403
+ if (isFullscreenEnvEnabled() && bashCount > 0) {
404
+ const isFirst_4 = nonMemParts.length === 0;
405
+ const verb_1 = isActiveGroup ? isFirst_4 ? 'Running' : 'running' : isFirst_4 ? 'Ran' : 'ran';
406
+ if (!isFirst_4) {
407
+ nonMemParts.push(<Text key="comma-bash">, </Text>);
408
+ }
409
+ nonMemParts.push(<Text key="bash">
410
+ {verb_1} <Text bold>{bashCount}</Text> bash{' '}
411
+ {bashCount === 1 ? 'command' : 'commands'}
412
+ </Text>);
413
+ }
414
+
415
+ // Build memory parts (auto-memory) — rendered after nonMemParts
416
+ const hasPrecedingNonMem = nonMemParts.length > 0;
417
+ const memParts: React.ReactNode[] = [];
418
+ if (memoryReadCount > 0) {
419
+ const isFirst_5 = !hasPrecedingNonMem && memParts.length === 0;
420
+ const verb_2 = isActiveGroup ? isFirst_5 ? 'Recalling' : 'recalling' : isFirst_5 ? 'Recalled' : 'recalled';
421
+ if (!isFirst_5) {
422
+ memParts.push(<Text key="comma-mr">, </Text>);
423
+ }
424
+ memParts.push(<Text key="mem-read">
425
+ {verb_2} <Text bold>{memoryReadCount}</Text>{' '}
426
+ {memoryReadCount === 1 ? 'memory' : 'memories'}
427
+ </Text>);
428
+ }
429
+ if (memorySearchCount > 0) {
430
+ const isFirst_6 = !hasPrecedingNonMem && memParts.length === 0;
431
+ const verb_3 = isActiveGroup ? isFirst_6 ? 'Searching' : 'searching' : isFirst_6 ? 'Searched' : 'searched';
432
+ if (!isFirst_6) {
433
+ memParts.push(<Text key="comma-ms">, </Text>);
434
+ }
435
+ memParts.push(<Text key="mem-search">{`${verb_3} memories`}</Text>);
436
+ }
437
+ if (memoryWriteCount > 0) {
438
+ const isFirst_7 = !hasPrecedingNonMem && memParts.length === 0;
439
+ const verb_4 = isActiveGroup ? isFirst_7 ? 'Writing' : 'writing' : isFirst_7 ? 'Wrote' : 'wrote';
440
+ if (!isFirst_7) {
441
+ memParts.push(<Text key="comma-mw">, </Text>);
442
+ }
443
+ memParts.push(<Text key="mem-write">
444
+ {verb_4} <Text bold>{memoryWriteCount}</Text>{' '}
445
+ {memoryWriteCount === 1 ? 'memory' : 'memories'}
446
+ </Text>);
447
+ }
448
+ return <Box flexDirection="column" marginTop={1} backgroundColor={bg}>
449
+ <Box flexDirection="row">
450
+ {isActiveGroup ? <ToolUseLoader shouldAnimate isUnresolved isError={anyError} /> : <Box minWidth={2} />}
451
+ <Text dimColor={!isActiveGroup}>
452
+ {nonMemParts}
453
+ {memParts}
454
+ {feature('TEAMMEM') ? teamMemCollapsed!.TeamMemCountParts({
455
+ message,
456
+ isActiveGroup,
457
+ hasPrecedingParts: hasPrecedingNonMem || memParts.length > 0
458
+ }) : null}
459
+ {isActiveGroup && <Text key="ellipsis">…</Text>} <CtrlOToExpand />
460
+ </Text>
461
+ </Box>
462
+ {isActiveGroup && displayedHint !== undefined &&
463
+ // Row layout: 5-wide gutter for ⎿, then a flex column for the text.
464
+ // Ink's wrap stays inside the right column so continuation lines
465
+ // indent under ⎿. MAX_HINT_CHARS in commandAsHint caps total at ~5 lines.
466
+ <Box flexDirection="row">
467
+ <Box width={5} flexShrink={0}>
468
+ <Text dimColor>{' ⎿ '}</Text>
469
+ </Box>
470
+ <Box flexDirection="column" flexGrow={1}>
471
+ {displayedHint.split('\n').map((line, i, arr) => <Text key={`hint-${i}`} dimColor>
472
+ {line}
473
+ {i === arr.length - 1 && shellProgressSuffix}
474
+ </Text>)}
475
+ </Box>
476
+ </Box>}
477
+ {message.hookTotalMs !== undefined && message.hookTotalMs > 0 && <Text dimColor>
478
+ {' ⎿ '}Ran {message.hookCount} PreToolUse{' '}
479
+ {message.hookCount === 1 ? 'hook' : 'hooks'} (
480
+ {formatSecondsShort(message.hookTotalMs)})
481
+ </Text>}
482
+ </Box>;
483
+ }
484
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJmZWF0dXJlIiwiYmFzZW5hbWUiLCJSZWFjdCIsInVzZVJlZiIsInVzZU1pbkRpc3BsYXlUaW1lIiwiQW5zaSIsIkJveCIsIlRleHQiLCJ1c2VUaGVtZSIsImZpbmRUb29sQnlOYW1lIiwiVG9vbHMiLCJnZXRSZXBsUHJpbWl0aXZlVG9vbHMiLCJDb2xsYXBzZWRSZWFkU2VhcmNoR3JvdXAiLCJOb3JtYWxpemVkQXNzaXN0YW50TWVzc2FnZSIsInVuaXEiLCJnZXRUb29sVXNlSWRzRnJvbUNvbGxhcHNlZEdyb3VwIiwiZ2V0RGlzcGxheVBhdGgiLCJmb3JtYXREdXJhdGlvbiIsImZvcm1hdFNlY29uZHNTaG9ydCIsImlzRnVsbHNjcmVlbkVudkVuYWJsZWQiLCJidWlsZE1lc3NhZ2VMb29rdXBzIiwiVGhlbWVOYW1lIiwiQ3RybE9Ub0V4cGFuZCIsInVzZVNlbGVjdGVkTWVzc2FnZUJnIiwiUHJCYWRnZSIsIlRvb2xVc2VMb2FkZXIiLCJ0ZWFtTWVtQ29sbGFwc2VkIiwicmVxdWlyZSIsIk1JTl9ISU5UX0RJU1BMQVlfTVMiLCJQcm9wcyIsIm1lc3NhZ2UiLCJpblByb2dyZXNzVG9vbFVzZUlEcyIsIlNldCIsInNob3VsZEFuaW1hdGUiLCJ2ZXJib3NlIiwidG9vbHMiLCJsb29rdXBzIiwiUmV0dXJuVHlwZSIsImlzQWN0aXZlR3JvdXAiLCJWZXJib3NlVG9vbFVzZSIsInQwIiwiJCIsIl9jIiwiY29udGVudCIsInRoZW1lIiwiYmciLCJ0MSIsInQyIiwiaWQiLCJpbnB1dCIsIm5hbWUiLCJTeW1ib2wiLCJmb3IiLCJiYjAiLCJ0b29sIiwidDMiLCJyZXNvbHZlZFRvb2xVc2VJRHMiLCJoYXMiLCJpc1Jlc29sdmVkIiwidDQiLCJlcnJvcmVkVG9vbFVzZUlEcyIsImlzRXJyb3IiLCJ0NSIsImlzSW5Qcm9ncmVzcyIsInJlc3VsdE1zZyIsInRvb2xSZXN1bHRCeVRvb2xVc2VJRCIsImdldCIsInJhd1Rvb2xSZXN1bHQiLCJ0eXBlIiwidG9vbFVzZVJlc3VsdCIsInVuZGVmaW5lZCIsInBhcnNlZE91dHB1dCIsIm91dHB1dFNjaGVtYSIsInNhZmVQYXJzZSIsInRvb2xSZXN1bHQiLCJzdWNjZXNzIiwiZGF0YSIsInBhcnNlZElucHV0IiwiaW5wdXRTY2hlbWEiLCJ1c2VyRmFjaW5nTmFtZSIsInRvb2xVc2VNZXNzYWdlIiwicmVuZGVyVG9vbFVzZU1lc3NhZ2UiLCJ0NiIsInQ3IiwidDgiLCJyZW5kZXJUb29sVXNlVGFnIiwicmVuZGVyVG9vbFJlc3VsdE1lc3NhZ2UiLCJDb2xsYXBzZWRSZWFkU2VhcmNoQ29udGVudCIsIlJlYWN0Tm9kZSIsInNlYXJjaENvdW50IiwicmF3U2VhcmNoQ291bnQiLCJyZWFkQ291bnQiLCJyYXdSZWFkQ291bnQiLCJsaXN0Q291bnQiLCJyYXdMaXN0Q291bnQiLCJyZXBsQ291bnQiLCJtZW1vcnlTZWFyY2hDb3VudCIsIm1lbW9yeVJlYWRDb3VudCIsIm1lbW9yeVdyaXRlQ291bnQiLCJtZXNzYWdlcyIsImdyb3VwTWVzc2FnZXMiLCJ0b29sVXNlSWRzIiwiYW55RXJyb3IiLCJzb21lIiwiaGFzTWVtb3J5T3BzIiwiaGFzVGVhbU1lbW9yeU9wcyIsImNoZWNrSGFzVGVhbU1lbU9wcyIsIm1heFJlYWRDb3VudFJlZiIsIm1heFNlYXJjaENvdW50UmVmIiwibWF4TGlzdENvdW50UmVmIiwibWF4TWNwQ291bnRSZWYiLCJtYXhCYXNoQ291bnRSZWYiLCJjdXJyZW50IiwiTWF0aCIsIm1heCIsIm1jcENhbGxDb3VudCIsImJhc2hDb3VudCIsImdpdE9wQmFzaENvdW50IiwiaGFzTm9uTWVtb3J5T3BzIiwicmVhZFBhdGhzIiwicmVhZEZpbGVQYXRocyIsInNlYXJjaEFyZ3MiLCJpbmNvbWluZ0hpbnQiLCJsYXRlc3REaXNwbGF5SGludCIsImxhc3RTZWFyY2hSYXciLCJhdCIsImxhc3RTZWFyY2giLCJsYXN0UmVhZCIsImxhdGVzdCIsInByb2dyZXNzTWVzc2FnZXNCeVRvb2xVc2VJRCIsInBoYXNlIiwidG9vbElucHV0IiwiY29tbWFuZCIsInBhdHRlcm4iLCJmaWxlX3BhdGgiLCJ0b29sTmFtZSIsImRpc3BsYXllZEhpbnQiLCJ0b29sVXNlcyIsIm1zZyIsInB1c2giLCJtYXAiLCJob29rSW5mb3MiLCJsZW5ndGgiLCJob29rQ291bnQiLCJob29rVG90YWxNcyIsImluZm8iLCJpZHgiLCJkdXJhdGlvbk1zIiwicmVsZXZhbnRNZW1vcmllcyIsIm0iLCJwYXRoIiwic2hlbGxQcm9ncmVzc1N1ZmZpeCIsImVsYXBzZWQiLCJsaW5lcyIsImVsYXBzZWRUaW1lU2Vjb25kcyIsInRvdGFsTGluZXMiLCJ0aW1lIiwibm9uTWVtUGFydHMiLCJwdXNoUGFydCIsImtleSIsInZlcmIiLCJib2R5IiwiaXNGaXJzdCIsInRvVXBwZXJDYXNlIiwic2xpY2UiLCJjb21taXRzIiwiYnlLaW5kIiwiY29tbWl0dGVkIiwiYW1lbmRlZCIsImtpbmQiLCJjb25zdCIsInNoYXMiLCJmaWx0ZXIiLCJjIiwic2hhIiwiam9pbiIsInB1c2hlcyIsImJyYW5jaGVzIiwicCIsImJyYW5jaCIsImJ5QWN0aW9uIiwibWVyZ2VkIiwicmViYXNlZCIsImIiLCJhY3Rpb24iLCJyZWYiLCJwcnMiLCJ2ZXJicyIsImNyZWF0ZWQiLCJlZGl0ZWQiLCJjb21tZW50ZWQiLCJjbG9zZWQiLCJyZWFkeSIsInByIiwibnVtYmVyIiwidXJsIiwic2VhcmNoVmVyYiIsInJlYWRWZXJiIiwibGlzdFZlcmIiLCJyZXBsVmVyYiIsInNlcnZlckxhYmVsIiwibWNwU2VydmVyTmFtZXMiLCJuIiwicmVwbGFjZSIsImhhc1ByZWNlZGluZ05vbk1lbSIsIm1lbVBhcnRzIiwiVGVhbU1lbUNvdW50UGFydHMiLCJoYXNQcmVjZWRpbmdQYXJ0cyIsInNwbGl0IiwibGluZSIsImkiLCJhcnIiXSwic291cmNlcyI6WyJDb2xsYXBzZWRSZWFkU2VhcmNoQ29udGVudC50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZmVhdHVyZSB9IGZyb20gJ2J1bjpidW5kbGUnXG5pbXBvcnQgeyBiYXNlbmFtZSB9IGZyb20gJ3BhdGgnXG5pbXBvcnQgUmVhY3QsIHsgdXNlUmVmIH0gZnJvbSAncmVhY3QnXG5pbXBvcnQgeyB1c2VNaW5EaXNwbGF5VGltZSB9IGZyb20gJy4uLy4uL2hvb2tzL3VzZU1pbkRpc3BsYXlUaW1lLmpzJ1xuaW1wb3J0IHsgQW5zaSwgQm94LCBUZXh0LCB1c2VUaGVtZSB9IGZyb20gJy4uLy4uL2luay5qcydcbmltcG9ydCB7IGZpbmRUb29sQnlOYW1lLCB0eXBlIFRvb2xzIH0gZnJvbSAnLi4vLi4vVG9vbC5qcydcbmltcG9ydCB7IGdldFJlcGxQcmltaXRpdmVUb29scyB9IGZyb20gJy4uLy4uL3Rvb2xzL1JFUExUb29sL3ByaW1pdGl2ZVRvb2xzLmpzJ1xuaW1wb3J0IHR5cGUge1xuICBDb2xsYXBzZWRSZWFkU2VhcmNoR3JvdXAsXG4gIE5vcm1hbGl6ZWRBc3Npc3RhbnRNZXNzYWdlLFxufSBmcm9tICcuLi8uLi90eXBlcy9tZXNzYWdlLmpzJ1xuaW1wb3J0IHsgdW5pcSB9IGZyb20gJy4uLy4uL3V0aWxzL2FycmF5LmpzJ1xuaW1wb3J0IHsgZ2V0VG9vbFVzZUlkc0Zyb21Db2xsYXBzZWRHcm91cCB9IGZyb20gJy4uLy4uL3V0aWxzL2NvbGxhcHNlUmVhZFNlYXJjaC5qcydcbmltcG9ydCB7IGdldERpc3BsYXlQYXRoIH0gZnJvbSAnLi4vLi4vdXRpbHMvZmlsZS5qcydcbmltcG9ydCB7IGZvcm1hdER1cmF0aW9uLCBmb3JtYXRTZWNvbmRzU2hvcnQgfSBmcm9tICcuLi8uLi91dGlscy9mb3JtYXQuanMnXG5pbXBvcnQgeyBpc0Z1bGxzY3JlZW5FbnZFbmFibGVkIH0gZnJvbSAnLi4vLi4vdXRpbHMvZnVsbHNjcmVlbi5qcydcbmltcG9ydCB0eXBlIHsgYnVpbGRNZXNzYWdlTG9va3VwcyB9IGZyb20gJy4uLy4uL3V0aWxzL21lc3NhZ2VzLmpzJ1xuaW1wb3J0IHR5cGUgeyBUaGVtZU5hbWUgfSBmcm9tICcuLi8uLi91dGlscy90aGVtZS5qcydcbmltcG9ydCB7IEN0cmxPVG9FeHBhbmQgfSBmcm9tICcuLi9DdHJsT1RvRXhwYW5kLmpzJ1xuaW1wb3J0IHsgdXNlU2VsZWN0ZWRNZXNzYWdlQmcgfSBmcm9tICcuLi9tZXNzYWdlQWN0aW9ucy5qcydcbmltcG9ydCB7IFByQmFkZ2UgfSBmcm9tICcuLi9QckJhZGdlLmpzJ1xuaW1wb3J0IHsgVG9vbFVzZUxvYWRlciB9IGZyb20gJy4uL1Rvb2xVc2VMb2FkZXIuanMnXG5cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHMgKi9cbmNvbnN0IHRlYW1NZW1Db2xsYXBzZWQgPSBmZWF0dXJlKCdURUFNTUVNJylcbiAgPyAocmVxdWlyZSgnLi90ZWFtTWVtQ29sbGFwc2VkLmpzJykgYXMgdHlwZW9mIGltcG9ydCgnLi90ZWFtTWVtQ29sbGFwc2VkLmpzJykpXG4gIDogbnVsbFxuLyogZXNsaW50LWVuYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzICovXG5cbi8vIEhvbGQgZWFjaCDipL8gaGludCBmb3IgYSBtaW5pbXVtIGR1cmF0aW9uIHNvIGZhc3QtY29tcGxldGluZyB0b29sIGNhbGxzXG4vLyAoYmFzaCBjb21tYW5kcywgZmlsZSByZWFkcywgc2VhcmNoIHBhdHRlcm5zKSBhcmUgYWN0dWFsbHkgcmVhZGFibGUgaW5zdGVhZFxuLy8gb2YgZmxpY2tlcmluZyBwYXN0IGluIGEgc2luZ2xlIGZyYW1lLlxuY29uc3QgTUlOX0hJTlRfRElTUExBWV9NUyA9IDcwMFxuXG50eXBlIFByb3BzID0ge1xuICBtZXNzYWdlOiBDb2xsYXBzZWRSZWFkU2VhcmNoR3JvdXBcbiAgaW5Qcm9ncmVzc1Rvb2xVc2VJRHM6IFNldDxzdHJpbmc+XG4gIHNob3VsZEFuaW1hdGU6IGJvb2xlYW5cbiAgdmVyYm9zZTogYm9vbGVhblxuICB0b29sczogVG9vbHNcbiAgbG9va3VwczogUmV0dXJuVHlwZTx0eXBlb2YgYnVpbGRNZXNzYWdlTG9va3Vwcz5cbiAgLyoqIFRydWUgaWYgdGhpcyBpcyB0aGUgY3VycmVudGx5IGFjdGl2ZSBjb2xsYXBzZWQgZ3JvdXAgKGxhc3Qgb25lLCBzdGlsbCBsb2FkaW5nKSAqL1xuICBpc0FjdGl2ZUdyb3VwPzogYm9vbGVhblxufVxuXG4vKiogUmVuZGVyIGEgc2luZ2xlIHRvb2wgdXNlIGluIHZlcmJvc2UgbW9kZSAqL1xuZnVuY3Rpb24gVmVyYm9zZVRvb2xVc2Uoe1xuICBjb250ZW50LFxuICB0b29scyxcbiAgbG9va3VwcyxcbiAgaW5Qcm9ncmVzc1Rvb2xVc2VJRHMsXG4gIHNob3VsZEFuaW1hdGUsXG4gIHRoZW1lLFxufToge1xuICBjb250ZW50OiB7IHR5cGU6ICd0b29sX3VzZSc7IGlkOiBzdHJpbmc7IG5hbWU6IHN0cmluZzsgaW5wdXQ6IHVua25vd24gfVxuICB0b29sczogVG9vbHNcbiAgbG9va3VwczogUmV0dXJuVHlwZTx0eXBlb2YgYnVpbGRNZXNzYWdlTG9va3Vwcz5cbiAgaW5Qcm9ncmVzc1Rvb2xVc2VJRHM6IFNldDxzdHJpbmc+XG4gIHNob3VsZEFuaW1hdGU6IGJvb2xlYW5cbiAgdGhlbWU6IFRoZW1lTmFtZVxufSk6IFJlYWN0LlJlYWN0Tm9kZSB7XG4gIGNvbnN0IGJnID0gdXNlU2VsZWN0ZWRNZXNzYWdlQmcoKVxuICAvLyBTYW1lIFJFUEwtcHJpbWl0aXZlIGZhbGxiYWNrIGFzIGdldFRvb2xTZWFyY2hPclJlYWRJbmZvIOKAlCBSRVBMIG1vZGUgc3RyaXBzXG4gIC8vIHRoZXNlIGZyb20gdGhlIGV4ZWN1dGlvbiB0b29scyBsaXN0LCBidXQgdmlydHVhbCBtZXNzYWdlcyBzdGlsbCBuZWVkIHRoZW1cbiAgLy8gdG8gcmVuZGVyIGluIHZlcmJvc2UgbW9kZS5cbiAgY29uc3QgdG9vbCA9XG4gICAgZmluZFRvb2xCeU5hbWUodG9vbHMsIGNvbnRlbnQubmFtZSkgPz9cbiAgICBmaW5kVG9vbEJ5TmFtZShnZXRSZXBsUHJpbWl0aXZlVG9vbHMoKSwgY29udGVudC5uYW1lKVxuICBpZiAoIXRvb2wpIHJldHVybiBudWxsXG5cbiAgY29uc3QgaXNSZXNvbHZlZCA9IGxvb2t1cHMucmVzb2x2ZWRUb29sVXNlSURzLmhhcyhjb250ZW50LmlkKVxuICBjb25zdCBpc0Vycm9yID0gbG9va3Vwcy5lcnJvcmVkVG9vbFVzZUlEcy5oYXMoY29udGVudC5pZClcbiAgY29uc3QgaXNJblByb2dyZXNzID0gaW5Qcm9ncmVzc1Rvb2xVc2VJRHMuaGFzKGNvbnRlbnQuaWQpXG5cbiAgY29uc3QgcmVzdWx0TXNnID0gbG9va3Vwcy50b29sUmVzdWx0QnlUb29sVXNlSUQuZ2V0KGNvbnRlbnQuaWQpXG4gIGNvbnN0IHJhd1Rvb2xSZXN1bHQgPVxuICAgIHJlc3VsdE1zZz8udHlwZSA9PT0gJ3VzZXInID8gcmVzdWx0TXNnLnRvb2xVc2VSZXN1bHQgOiB1bmRlZmluZWRcbiAgY29uc3QgcGFyc2VkT3V0cHV0ID0gdG9vbC5vdXRwdXRTY2hlbWE/LnNhZmVQYXJzZShyYXdUb29sUmVzdWx0KVxuICBjb25zdCB0b29sUmVzdWx0ID0gcGFyc2VkT3V0cHV0Py5zdWNjZXNzID8gcGFyc2VkT3V0cHV0LmRhdGEgOiB1bmRlZmluZWRcblxuICBjb25zdCBwYXJzZWRJbnB1dCA9IHRvb2wuaW5wdXRTY2hlbWEuc2FmZVBhcnNlKGNvbnRlbnQuaW5wdXQpXG4gIGNvbnN0IGlucHV0ID0gcGFyc2VkSW5wdXQuc3VjY2VzcyA/IHBhcnNlZElucHV0LmRhdGEgOiB1bmRlZmluZWRcbiAgY29uc3QgdXNlckZhY2luZ05hbWUgPSB0b29sLnVzZXJGYWNpbmdOYW1lKGlucHV0KVxuICBjb25zdCB0b29sVXNlTWVzc2FnZSA9IGlucHV0XG4gICAgPyB0b29sLnJlbmRlclRvb2xVc2VNZXNzYWdlKGlucHV0LCB7IHRoZW1lLCB2ZXJib3NlOiB0cnVlIH0pXG4gICAgOiBudWxsXG5cbiAgcmV0dXJuIChcbiAgICA8Qm94XG4gICAgICBrZXk9e2NvbnRlbnQuaWR9XG4gICAgICBmbGV4RGlyZWN0aW9uPVwiY29sdW1uXCJcbiAgICAgIG1hcmdpblRvcD17MX1cbiAgICAgIGJhY2tncm91bmRDb2xvcj17Ymd9XG4gICAgPlxuICAgICAgPEJveCBmbGV4RGlyZWN0aW9uPVwicm93XCI+XG4gICAgICAgIDxUb29sVXNlTG9hZGVyXG4gICAgICAgICAgc2hvdWxkQW5pbWF0ZT17c2hvdWxkQW5pbWF0ZSAmJiBpc0luUHJvZ3Jlc3N9XG4gICAgICAgICAgaXNVbnJlc29sdmVkPXshaXNSZXNvbHZlZH1cbiAgICAgICAgICBpc0Vycm9yPXtpc0Vycm9yfVxuICAgICAgICAvPlxuICAgICAgICA8VGV4dD5cbiAgICAgICAgICA8VGV4dCBib2xkPnt1c2VyRmFjaW5nTmFtZX08L1RleHQ+XG4gICAgICAgICAge3Rvb2xVc2VNZXNzYWdlICYmIDxUZXh0Pih7dG9vbFVzZU1lc3NhZ2V9KTwvVGV4dD59XG4gICAgICAgIDwvVGV4dD5cbiAgICAgICAge2lucHV0ICYmIHRvb2wucmVuZGVyVG9vbFVzZVRhZz8uKGlucHV0KX1cbiAgICAgIDwvQm94PlxuICAgICAge2lzUmVzb2x2ZWQgJiYgIWlzRXJyb3IgJiYgdG9vbFJlc3VsdCAhPT0gdW5kZWZpbmVkICYmIChcbiAgICAgICAgPEJveD5cbiAgICAgICAgICB7dG9vbC5yZW5kZXJUb29sUmVzdWx0TWVzc2FnZT8uKHRvb2xSZXN1bHQsIFtdLCB7XG4gICAgICAgICAgICB2ZXJib3NlOiB0cnVlLFxuICAgICAgICAgICAgdG9vbHMsXG4gICAgICAgICAgICB0aGVtZSxcbiAgICAgICAgICB9KX1cbiAgICAgICAgPC9Cb3g+XG4gICAgICApfVxuICAgIDwvQm94PlxuICApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBDb2xsYXBzZWRSZWFkU2VhcmNoQ29udGVudCh7XG4gIG1lc3NhZ2UsXG4gIGluUHJvZ3Jlc3NUb29sVXNlSURzLFxuICBzaG91bGRBbmltYXRlLFxuICB2ZXJib3NlLFxuICB0b29scyxcbiAgbG9va3VwcyxcbiAgaXNBY3RpdmVHcm91cCxcbn06IFByb3BzKTogUmVhY3QuUmVhY3ROb2RlIHtcbiAgY29uc3QgYmcgPSB1c2VTZWxlY3RlZE1lc3NhZ2VCZygpXG4gIGNvbnN0IHtcbiAgICBzZWFyY2hDb3VudDogcmF3U2VhcmNoQ291bnQsXG4gICAgcmVhZENvdW50OiByYXdSZWFkQ291bnQsXG4gICAgbGlzdENvdW50OiByYXdMaXN0Q291bnQsXG4gICAgcmVwbENvdW50LFxuICAgIG1lbW9yeVNlYXJjaENvdW50LFxuICAgIG1lbW9yeVJlYWRDb3VudCxcbiAgICBtZW1vcnlXcml0ZUNvdW50LFxuICAgIG1lc3NhZ2VzOiBncm91cE1lc3NhZ2VzLFxuICB9ID0gbWVzc2FnZVxuICBjb25zdCBbdGhlbWVdID0gdXNlVGhlbWUoKVxuICBjb25zdCB0b29sVXNlSWRzID0gZ2V0VG9vbFVzZUlkc0Zyb21Db2xsYXBzZWRHcm91cChtZXNzYWdlKVxuICBjb25zdCBhbnlFcnJvciA9IHRvb2xVc2VJZHMuc29tZShpZCA9PiBsb29rdXBzLmVycm9yZWRUb29sVXNlSURzLmhhcyhpZCkpXG4gIGNvbnN0IGhhc01lbW9yeU9wcyA9XG4gICAgbWVtb3J5U2VhcmNoQ291bnQgPiAwIHx8IG1lbW9yeVJlYWRDb3VudCA+IDAgfHwgbWVtb3J5V3JpdGVDb3VudCA+IDBcbiAgY29uc3QgaGFzVGVhbU1lbW9yeU9wcyA9IGZlYXR1cmUoJ1RFQU1NRU0nKVxuICAgID8gdGVhbU1lbUNvbGxhcHNlZCEuY2hlY2tIYXNUZWFtTWVtT3BzKG1lc3NhZ2UpXG4gICAgOiBmYWxzZVxuXG4gIC8vIFRyYWNrIHRoZSBtYXggc2VlbiBjb3VudHMgc28gdGhleSBvbmx5IGV2ZXIgaW5jcmVhc2UuIFRoZSBkZWJvdW5jZSB0aW1lclxuICAvLyBjYXVzZXMgZXh0cmEgcmUtcmVuZGVycyBhdCBhcmJpdHJhcnkgdGltZXM7IGR1cmluZyBhIGJyaWVmIFwiaW52aXNpYmxlIHdpbmRvd1wiXG4gIC8vIGluIHRoZSBzdHJlYW1pbmcgZXhlY3V0b3IgdGhlIGdyb3VwIGNvdW50IGNhbiBkaXAsIHdoaWNoIGNhdXNlcyBqaXR0ZXIuXG4gIGNvbnN0IG1heFJlYWRDb3VudFJlZiA9IHVzZVJlZigwKVxuICBjb25zdCBtYXhTZWFyY2hDb3VudFJlZiA9IHVzZVJlZigwKVxuICBjb25zdCBtYXhMaXN0Q291bnRSZWYgPSB1c2VSZWYoMClcbiAgY29uc3QgbWF4TWNwQ291bnRSZWYgPSB1c2VSZWYoMClcbiAgY29uc3QgbWF4QmFzaENvdW50UmVmID0gdXNlUmVmKDApXG4gIG1heFJlYWRDb3VudFJlZi5jdXJyZW50ID0gTWF0aC5tYXgobWF4UmVhZENvdW50UmVmLmN1cnJlbnQsIHJhd1JlYWRDb3VudClcbiAgbWF4U2VhcmNoQ291bnRSZWYuY3VycmVudCA9IE1hdGgubWF4KFxuICAgIG1heFNlYXJjaENvdW50UmVmLmN1cnJlbnQsXG4gICAgcmF3U2VhcmNoQ291bnQsXG4gIClcbiAgbWF4TGlzdENvdW50UmVmLmN1cnJlbnQgPSBNYXRoLm1heChtYXhMaXN0Q291bnRSZWYuY3VycmVudCwgcmF3TGlzdENvdW50KVxuICBtYXhNY3BDb3VudFJlZi5jdXJyZW50ID0gTWF0aC5tYXgoXG4gICAgbWF4TWNwQ291bnRSZWYuY3VycmVudCxcbiAgICBtZXNzYWdlLm1jcENhbGxDb3VudCA/PyAwLFxuICApXG4gIG1heEJhc2hDb3VudFJlZi5jdXJyZW50ID0gTWF0aC5tYXgoXG4gICAgbWF4QmFzaENvdW50UmVmLmN1cnJlbnQsXG4gICAgbWVzc2FnZS5iYXNoQ291bnQgPz8gMCxcbiAgKVxuICBjb25zdCByZWFkQ291bnQgPSBtYXhSZWFkQ291bnRSZWYuY3VycmVudFxuICBjb25zdCBzZWFyY2hDb3VudCA9IG1heFNlYXJjaENvdW50UmVmLmN1cnJlbnRcbiAgY29uc3QgbGlzdENvdW50ID0gbWF4TGlzdENvdW50UmVmLmN1cnJlbnRcbiAgY29uc3QgbWNwQ2FsbENvdW50ID0gbWF4TWNwQ291bnRSZWYuY3VycmVudFxuICAvLyBTdWJ0cmFjdCBjb21tYW5kcyBzdXJmYWNlZCBhcyBcIkNvbW1pdHRlZCDigKZcIiAvIFwiQ3JlYXRlZCBQUiDigKZcIiBzbyB0aGVcbiAgLy8gc2FtZSBjb21tYW5kIGlzbid0IGNvdW50ZWQgdHdpY2UuIGdpdE9wQmFzaENvdW50IGlzIHJlYWQgbGl2ZSAobm8gbWF4LXJlZlxuICAvLyBuZWVkZWQg4oCUIGl0J3MgMCB1bnRpbCByZXN1bHRzIGFycml2ZSwgdGhlbiBvbmx5IGdyb3dzKS5cbiAgY29uc3QgZ2l0T3BCYXNoQ291bnQgPSBtZXNzYWdlLmdpdE9wQmFzaENvdW50ID8/IDBcbiAgY29uc3QgYmFzaENvdW50ID0gaXNGdWxsc2NyZWVuRW52RW5hYmxlZCgpXG4gICAgPyBNYXRoLm1heCgwLCBtYXhCYXNoQ291bnRSZWYuY3VycmVudCAtIGdpdE9wQmFzaENvdW50KVxuICAgIDogMFxuXG4gIGNvbnN0IGhhc05vbk1lbW9yeU9wcyA9XG4gICAgc2VhcmNoQ291bnQgPiAwIHx8XG4gICAgcmVhZENvdW50ID4gMCB8fFxuICAgIGxpc3RDb3VudCA+IDAgfHxcbiAgICByZXBsQ291bnQgPiAwIHx8XG4gICAgbWNwQ2FsbENvdW50ID4gMCB8fFxuICAgIGJhc2hDb3VudCA+IDAgfHxcbiAgICBnaXRPcEJhc2hDb3VudCA+IDBcblxuICBjb25zdCByZWFkUGF0aHMgPSBtZXNzYWdlLnJlYWRGaWxlUGF0aHNcbiAgY29uc3Qgc2VhcmNoQXJncyA9IG1lc3NhZ2Uuc2VhcmNoQXJnc1xuICBsZXQgaW5jb21pbmdIaW50ID0gbWVzc2FnZS5sYXRlc3REaXNwbGF5SGludFxuICBpZiAoaW5jb21pbmdIaW50ID09PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBsYXN0U2VhcmNoUmF3ID0gc2VhcmNoQXJncz8uYXQoLTEpXG4gICAgY29uc3QgbGFzdFNlYXJjaCA9XG4gICAgICBsYXN0U2VhcmNoUmF3ICE9PSB1bmRlZmluZWQgPyBgXCIke2xhc3RTZWFyY2hSYXd9XCJgIDogdW5kZWZpbmVkXG4gICAgY29uc3QgbGFzdFJlYWQgPSByZWFkUGF0aHM/LmF0KC0xKVxuICAgIGluY29taW5nSGludCA9XG4gICAgICBsYXN0UmVhZCAhPT0gdW5kZWZpbmVkID8gZ2V0RGlzcGxheVBhdGgobGFzdFJlYWQpIDogbGFzdFNlYXJjaFxuICB9XG5cbiAgLy8gQWN0aXZlIFJFUEwgY2FsbHMgZW1pdCByZXBsX3Rvb2xfY2FsbCBwcm9ncmVzcyB3aXRoIHRoZSBjdXJyZW50IGlubmVyXG4gIC8vIHRvb2wncyBuYW1lK2lucHV0LiBWaXJ0dWFsIG1lc3NhZ2VzIGRvbid0IGFycml2ZSB1bnRpbCBSRVBMIGNvbXBsZXRlcyxcbiAgLy8gc28gdGhpcyBpcyB0aGUgb25seSBzb3VyY2Ugb2YgYSBsaXZlIGhpbnQgZHVyaW5nIGV4ZWN1dGlvbi5cbiAgaWYgKGlzQWN0aXZlR3JvdXApIHtcbiAgICBmb3IgKGNvbnN0IGlkIG9mIHRvb2xVc2VJZHMpIHtcbiAgICAgIGlmICghaW5Qcm9ncmVzc1Rvb2xVc2VJRHMuaGFzKGlkKSkgY29udGludWVcbiAgICAgIGNvbnN0IGxhdGVzdCA9IGxvb2t1cHMucHJvZ3Jlc3NNZXNzYWdlc0J5VG9vbFVzZUlELmdldChpZCk/LmF0KC0xKT8uZGF0YVxuICAgICAgaWYgKGxhdGVzdD8udHlwZSA9PT0gJ3JlcGxfdG9vbF9jYWxsJyAmJiBsYXRlc3QucGhhc2UgPT09ICdzdGFydCcpIHtcbiAgICAgICAgY29uc3QgaW5wdXQgPSBsYXRlc3QudG9vbElucHV0IGFzIHtcbiAgICAgICAgICBjb21tYW5kPzogc3RyaW5nXG4gICAgICAgICAgcGF0dGVybj86IHN0cmluZ1xuICAgICAgICAgIGZpbGVfcGF0aD86IHN0cmluZ1xuICAgICAgICB9XG4gICAgICAgIGluY29taW5nSGludCA9XG4gICAgICAgICAgaW5wdXQuZmlsZV9wYXRoID8/XG4gICAgICAgICAgKGlucHV0LnBhdHRlcm4gPyBgXCIke2lucHV0LnBhdHRlcm59XCJgIDogdW5kZWZpbmVkKSA/P1xuICAgICAgICAgIGlucHV0LmNvbW1hbmQgPz9cbiAgICAgICAgICBsYXRlc3QudG9vbE5hbWVcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCBkaXNwbGF5ZWRIaW50ID0gdXNlTWluRGlzcGxheVRpbWUoaW5jb21pbmdIaW50LCBNSU5fSElOVF9ESVNQTEFZX01TKVxuXG4gIC8vIEluIHZlcmJvc2UgbW9kZSwgcmVuZGVyIGVhY2ggdG9vbCB1c2Ugd2l0aCBpdHMgMS1saW5lIHJlc3VsdCBzdW1tYXJ5XG4gIGlmICh2ZXJib3NlKSB7XG4gICAgY29uc3QgdG9vbFVzZXM6IE5vcm1hbGl6ZWRBc3Npc3RhbnRNZXNzYWdlW10gPSBbXVxuICAgIGZvciAoY29uc3QgbXNnIG9mIGdyb3VwTWVzc2FnZXMpIHtcbiAgICAgIGlmIChtc2cudHlwZSA9PT0gJ2Fzc2lzdGFudCcpIHtcbiAgICAgICAgdG9vbFVzZXMucHVzaChtc2cpXG4gICAgICB9IGVsc2UgaWYgKG1zZy50eXBlID09PSAnZ3JvdXBlZF90b29sX3VzZScpIHtcbiAgICAgICAgdG9vbFVzZXMucHVzaCguLi5tc2cubWVzc2FnZXMpXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIChcbiAgICAgIDxCb3ggZmxleERpcmVjdGlvbj1cImNvbHVtblwiPlxuICAgICAgICB7dG9vbFVzZXMubWFwKG1zZyA9PiB7XG4gICAgICAgICAgY29uc3QgY29udGVudCA9IG1zZy5tZXNzYWdlLmNvbnRlbnRbMF1cbiAgICAgICAgICBpZiAoY29udGVudD8udHlwZSAhPT0gJ3Rvb2xfdXNlJykgcmV0dXJuIG51bGxcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPFZlcmJvc2VUb29sVXNlXG4gICAgICAgICAgICAgIGtleT17Y29udGVudC5pZH1cbiAgICAgICAgICAgICAgY29udGVudD17Y29udGVudH1cbiAgICAgICAgICAgICAgdG9vbHM9e3Rvb2xzfVxuICAgICAgICAgICAgICBsb29rdXBzPXtsb29rdXBzfVxuICAgICAgICAgICAgICBpblByb2dyZXNzVG9vbFVzZUlEcz17aW5Qcm9ncmVzc1Rvb2xVc2VJRHN9XG4gICAgICAgICAgICAgIHNob3VsZEFuaW1hdGU9e3Nob3VsZEFuaW1hdGV9XG4gICAgICAgICAgICAgIHRoZW1lPXt0aGVtZX1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgKVxuICAgICAgICB9KX1cbiAgICAgICAge21lc3NhZ2UuaG9va0luZm9zICYmIG1lc3NhZ2UuaG9va0luZm9zLmxlbmd0aCA+IDAgJiYgKFxuICAgICAgICAgIDw+XG4gICAgICAgICAgICA8VGV4dCBkaW1Db2xvcj5cbiAgICAgICAgICAgICAgeycgIOKOvyAgJ31SYW4ge21lc3NhZ2UuaG9va0NvdW50fSBQcmVUb29sVXNleycgJ31cbiAgICAgICAgICAgICAge21lc3NhZ2UuaG9va0NvdW50ID09PSAxID8gJ2hvb2snIDogJ2hvb2tzJ30gKFxuICAgICAgICAgICAgICB7Zm9ybWF0U2Vjb25kc1Nob3J0KG1lc3NhZ2UuaG9va1RvdGFsTXMgPz8gMCl9KVxuICAgICAgICAgICAgPC9UZXh0PlxuICAgICAgICAgICAge21lc3NhZ2UuaG9va0luZm9zLm1hcCgoaW5mbywgaWR4KSA9PiAoXG4gICAgICAgICAgICAgIDxUZXh0IGtleT17YGhvb2stJHtpZHh9YH0gZGltQ29sb3I+XG4gICAgICAgICAgICAgICAgeycgICAgIOKOvyAnfVxuICAgICAgICAgICAgICAgIHtpbmZvLmNvbW1hbmR9ICh7Zm9ybWF0U2Vjb25kc1Nob3J0KGluZm8uZHVyYXRpb25NcyA/PyAwKX0pXG4gICAgICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgICAgICkpfVxuICAgICAgICAgIDwvPlxuICAgICAgICApfVxuICAgICAgICB7bWVzc2FnZS5yZWxldmFudE1lbW9yaWVzPy5tYXAobSA9PiAoXG4gICAgICAgICAgPEJveCBrZXk9e20ucGF0aH0gZmxleERpcmVjdGlvbj1cImNvbHVtblwiIG1hcmdpblRvcD17MX0+XG4gICAgICAgICAgICA8VGV4dCBkaW1Db2xvcj5cbiAgICAgICAgICAgICAgeycgIOKOvyAgJ31SZWNhbGxlZCB7YmFzZW5hbWUobS5wYXRoKX1cbiAgICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgICAgIDxCb3ggcGFkZGluZ0xlZnQ9ezV9PlxuICAgICAgICAgICAgICA8VGV4dD5cbiAgICAgICAgICAgICAgICA8QW5zaT57bS5jb250ZW50fTwvQW5zaT5cbiAgICAgICAgICAgICAgPC9UZXh0PlxuICAgICAgICAgICAgPC9Cb3g+XG4gICAgICAgICAgPC9Cb3g+XG4gICAgICAgICkpfVxuICAgICAgPC9Cb3g+XG4gICAgKVxuICB9XG5cbiAgLy8gTm9uLXZlcmJvc2UgbW9kZTogU2hvdyBjb3VudHMgd2l0aCBibGlua2luZyBncmV5IGRvdCB3aGlsZSBhY3RpdmUsIGdyZWVuIGRvdCB3aGVuIGZpbmFsaXplZFxuICAvLyBVc2UgcHJlc2VudCB0ZW5zZSB3aGVuIGFjdGl2ZSwgcGFzdCB0ZW5zZSB3aGVuIGZpbmFsaXplZFxuXG4gIC8vIERlZmVuc2l2ZTogSWYgYWxsIGNvdW50cyBhcmUgMCwgZG9uJ3QgcmVuZGVyIHRoZSBjb2xsYXBzZWQgZ3JvdXBcbiAgLy8gVGhpcyBzaG91bGRuJ3QgaGFwcGVuIGluIG5vcm1hbCBvcGVyYXRpb24sIGJ1dCBoYW5kbGVzIGVkZ2UgY2FzZXNcbiAgaWYgKCFoYXNNZW1vcnlPcHMgJiYgIWhhc1RlYW1NZW1vcnlPcHMgJiYgIWhhc05vbk1lbW9yeU9wcykge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICAvLyBGaW5kIHRoZSBzbG93ZXN0IGluLXByb2dyZXNzIHNoZWxsIGNvbW1hbmQgaW4gdGhpcyBncm91cC4gQmFzaFRvb2wgeWllbGRzXG4gIC8vIHByb2dyZXNzIGV2ZXJ5IHNlY29uZCBidXQgdGhlIGNvbGxhcHNlZCByZW5kZXJlciBuZXZlciBzaG93ZWQgaXQg4oCUIGxvbmdcbiAgLy8gY29tbWFuZHMgKG5wbSBpbnN0YWxsLCB0ZXN0cykgbG9va2VkIGZyb3plbi4gU2hvd24gYWZ0ZXIgMnMgc28gZmFzdFxuICAvLyBjb21tYW5kcyBzdGF5IGNsZWFuOyB0aGUgdGlja2luZyBjb3VudGVyIHJlYXNzdXJlcyB0aGF0IHNsb3cgb25lcyBhcmVuJ3Qgc3R1Y2suXG4gIGxldCBzaGVsbFByb2dyZXNzU3VmZml4ID0gJydcbiAgaWYgKGlzRnVsbHNjcmVlbkVudkVuYWJsZWQoKSAmJiBpc0FjdGl2ZUdyb3VwKSB7XG4gICAgbGV0IGVsYXBzZWQ6IG51bWJlciB8IHVuZGVmaW5lZFxuICAgIGxldCBsaW5lcyA9IDBcbiAgICBmb3IgKGNvbnN0IGlkIG9mIHRvb2xVc2VJZHMpIHtcbiAgICAgIGlmICghaW5Qcm9ncmVzc1Rvb2xVc2VJRHMuaGFzKGlkKSkgY29udGludWVcbiAgICAgIGNvbnN0IGRhdGEgPSBsb29rdXBzLnByb2dyZXNzTWVzc2FnZXNCeVRvb2xVc2VJRC5nZXQoaWQpPy5hdCgtMSk/LmRhdGFcbiAgICAgIGlmIChcbiAgICAgICAgZGF0YT8udHlwZSAhPT0gJ2Jhc2hfcHJvZ3Jlc3MnICYmXG4gICAgICAgIGRhdGE/LnR5cGUgIT09ICdwb3dlcnNoZWxsX3Byb2dyZXNzJ1xuICAgICAgKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG4gICAgICBpZiAoZWxhcHNlZCA9PT0gdW5kZWZpbmVkIHx8IGRhdGEuZWxhcHNlZFRpbWVTZWNvbmRzID4gZWxhcHNlZCkge1xuICAgICAgICBlbGFwc2VkID0gZGF0YS5lbGFwc2VkVGltZVNlY29uZHNcbiAgICAgICAgbGluZXMgPSBkYXRhLnRvdGFsTGluZXNcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGVsYXBzZWQgIT09IHVuZGVmaW5lZCAmJiBlbGFwc2VkID49IDIpIHtcbiAgICAgIGNvbnN0IHRpbWUgPSBmb3JtYXREdXJhdGlvbihlbGFwc2VkICogMTAwMClcbiAgICAgIHNoZWxsUHJvZ3Jlc3NTdWZmaXggPVxuICAgICAgICBsaW5lcyA+IDBcbiAgICAgICAgICA/IGAgKCR7dGltZX0gwrcgJHtsaW5lc30gJHtsaW5lcyA9PT0gMSA/ICdsaW5lJyA6ICdsaW5lcyd9KWBcbiAgICAgICAgICA6IGAgKCR7dGltZX0pYFxuICAgIH1cbiAgfVxuXG4gIC8vIEJ1aWxkIG5vbi1tZW1vcnkgcGFydHMgZmlyc3QgKHNlYXJjaCwgcmVhZCwgcmVwbCwgbWNwLCBiYXNoKSDigJQgdGhlc2UgcmVuZGVyXG4gIC8vIGJlZm9yZSBtZW1vcnkgc28gdGhlIGxpbmUgcmVhZHMgXCJSYW4gMyBiYXNoIGNvbW1hbmRzLCByZWNhbGxlZCAxIG1lbW9yeVwiLlxuICBjb25zdCBub25NZW1QYXJ0czogUmVhY3QuUmVhY3ROb2RlW10gPSBbXVxuXG4gIC8vIEdpdCBvcGVyYXRpb25zIGxlYWQgdGhlIGxpbmUg4oCUIHRoZXkncmUgdGhlIGxvYWQtYmVhcmluZyBvdXRjb21lLlxuICBmdW5jdGlvbiBwdXNoUGFydChrZXk6IHN0cmluZywgdmVyYjogc3RyaW5nLCBib2R5OiBSZWFjdC5SZWFjdE5vZGUpOiB2b2lkIHtcbiAgICBjb25zdCBpc0ZpcnN0ID0gbm9uTWVtUGFydHMubGVuZ3RoID09PSAwXG4gICAgaWYgKCFpc0ZpcnN0KSBub25NZW1QYXJ0cy5wdXNoKDxUZXh0IGtleT17YGNvbW1hLSR7a2V5fWB9PiwgPC9UZXh0PilcbiAgICBub25NZW1QYXJ0cy5wdXNoKFxuICAgICAgPFRleHQga2V5PXtrZXl9PlxuICAgICAgICB7aXNGaXJzdCA/IHZlcmJbMF0hLnRvVXBwZXJDYXNlKCkgKyB2ZXJiLnNsaWNlKDEpIDogdmVyYn0ge2JvZHl9XG4gICAgICA8L1RleHQ+LFxuICAgIClcbiAgfVxuICBpZiAoaXNGdWxsc2NyZWVuRW52RW5hYmxlZCgpICYmIG1lc3NhZ2UuY29tbWl0cz8ubGVuZ3RoKSB7XG4gICAgY29uc3QgYnlLaW5kID0ge1xuICAgICAgY29tbWl0dGVkOiAnY29tbWl0dGVkJyxcbiAgICAgIGFtZW5kZWQ6ICdhbWVuZGVkIGNvbW1pdCcsXG4gICAgICAnY2hlcnJ5LXBpY2tlZCc6ICdjaGVycnktcGlja2VkJyxcbiAgICB9XG4gICAgZm9yIChjb25zdCBraW5kIG9mIFsnY29tbWl0dGVkJywgJ2FtZW5kZWQnLCAnY2hlcnJ5LXBpY2tlZCddIGFzIGNvbnN0KSB7XG4gICAgICBjb25zdCBzaGFzID0gbWVzc2FnZS5jb21taXRzLmZpbHRlcihjID0+IGMua2luZCA9PT0ga2luZCkubWFwKGMgPT4gYy5zaGEpXG4gICAgICBpZiAoc2hhcy5sZW5ndGgpIHtcbiAgICAgICAgcHVzaFBhcnQoa2luZCwgYnlLaW5kW2tpbmRdLCA8VGV4dCBib2xkPntzaGFzLmpvaW4oJywgJyl9PC9UZXh0PilcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKGlzRnVsbHNjcmVlbkVudkVuYWJsZWQoKSAmJiBtZXNzYWdlLnB1c2hlcz8ubGVuZ3RoKSB7XG4gICAgY29uc3QgYnJhbmNoZXMgPSB1bmlxKG1lc3NhZ2UucHVzaGVzLm1hcChwID0+IHAuYnJhbmNoKSlcbiAgICBwdXNoUGFydCgncHVzaCcsICdwdXNoZWQgdG8nLCA8VGV4dCBib2xkPnticmFuY2hlcy5qb2luKCcsICcpfTwvVGV4dD4pXG4gIH1cbiAgaWYgKGlzRnVsbHNjcmVlbkVudkVuYWJsZWQoKSAmJiBtZXNzYWdlLmJyYW5jaGVzPy5sZW5ndGgpIHtcbiAgICBjb25zdCBieUFjdGlvbiA9IHsgbWVyZ2VkOiAnbWVyZ2VkJywgcmViYXNlZDogJ3JlYmFzZWQgb250bycgfVxuICAgIGZvciAoY29uc3QgYiBvZiBtZXNzYWdlLmJyYW5jaGVzKSB7XG4gICAgICBwdXNoUGFydChcbiAgICAgICAgYGJyLSR7Yi5hY3Rpb259LSR7Yi5yZWZ9YCxcbiAgICAgICAgYnlBY3Rpb25bYi5hY3Rpb25dLFxuICAgICAgICA8VGV4dCBib2xkPntiLnJlZn08L1RleHQ+LFxuICAgICAgKVxuICAgIH1cbiAgfVxuICBpZiAoaXNGdWxsc2NyZWVuRW52RW5hYmxlZCgpICYmIG1lc3NhZ2UucHJzPy5sZW5ndGgpIHtcbiAgICBjb25zdCB2ZXJicyA9IHtcbiAgICAgIGNyZWF0ZWQ6ICdjcmVhdGVkJyxcbiAgICAgIGVkaXRlZDogJ2VkaXRlZCcsXG4gICAgICBtZXJnZWQ6ICdtZXJnZWQnLFxuICAgICAgY29tbWVudGVkOiAnY29tbWVudGVkIG9uJyxcbiAgICAgIGNsb3NlZDogJ2Nsb3NlZCcsXG4gICAgICByZWFkeTogJ21hcmtlZCByZWFkeScsXG4gICAgfVxuICAgIGZvciAoY29uc3QgcHIgb2YgbWVzc2FnZS5wcnMpIHtcbiAgICAgIHB1c2hQYXJ0KFxuICAgICAgICBgcHItJHtwci5hY3Rpb259LSR7cHIubnVtYmVyfWAsXG4gICAgICAgIHZlcmJzW3ByLmFjdGlvbl0sXG4gICAgICAgIHByLnVybCA/IChcbiAgICAgICAgICA8UHJCYWRnZSBudW1iZXI9e3ByLm51bWJlcn0gdXJsPXtwci51cmx9IGJvbGQgLz5cbiAgICAgICAgKSA6IChcbiAgICAgICAgICA8VGV4dCBib2xkPlBSICN7cHIubnVtYmVyfTwvVGV4dD5cbiAgICAgICAgKSxcbiAgICAgIClcbiAgICB9XG4gIH1cblxuICBpZiAoc2VhcmNoQ291bnQgPiAwKSB7XG4gICAgY29uc3QgaXNGaXJzdCA9IG5vbk1lbVBhcnRzLmxlbmd0aCA9PT0gMFxuICAgIGNvbnN0IHNlYXJjaFZlcmIgPSBpc0FjdGl2ZUdyb3VwXG4gICAgICA/IGlzRmlyc3RcbiAgICAgICAgPyAnU2VhcmNoaW5nIGZvcidcbiAgICAgICAgOiAnc2VhcmNoaW5nIGZvcidcbiAgICAgIDogaXNGaXJzdFxuICAgICAgICA/ICdTZWFyY2hlZCBmb3InXG4gICAgICAgIDogJ3NlYXJjaGVkIGZvcidcbiAgICBpZiAoIWlzRmlyc3QpIHtcbiAgICAgIG5vbk1lbVBhcnRzLnB1c2goPFRleHQga2V5PVwiY29tbWEtc1wiPiwgPC9UZXh0PilcbiAgICB9XG4gICAgbm9uTWVtUGFydHMucHVzaChcbiAgICAgIDxUZXh0IGtleT1cInNlYXJjaFwiPlxuICAgICAgICB7c2VhcmNoVmVyYn0gPFRleHQgYm9sZD57c2VhcmNoQ291bnR9PC9UZXh0PnsnICd9XG4gICAgICAgIHtzZWFyY2hDb3VudCA9PT0gMSA/ICdwYXR0ZXJuJyA6ICdwYXR0ZXJucyd9XG4gICAgICA8L1RleHQ+LFxuICAgIClcbiAgfVxuXG4gIGlmIChyZWFkQ291bnQgPiAwKSB7XG4gICAgY29uc3QgaXNGaXJzdCA9IG5vbk1lbVBhcnRzLmxlbmd0aCA9PT0gMFxuICAgIGNvbnN0IHJlYWRWZXJiID0gaXNBY3RpdmVHcm91cFxuICAgICAgPyBpc0ZpcnN0XG4gICAgICAgID8gJ1JlYWRpbmcnXG4gICAgICAgIDogJ3JlYWRpbmcnXG4gICAgICA6IGlzRmlyc3RcbiAgICAgICAgPyAnUmVhZCdcbiAgICAgICAgOiAncmVhZCdcbiAgICBpZiAoIWlzRmlyc3QpIHtcbiAgICAgIG5vbk1lbVBhcnRzLnB1c2goPFRleHQga2V5PVwiY29tbWEtclwiPiwgPC9UZXh0PilcbiAgICB9XG4gICAgbm9uTWVtUGFydHMucHVzaChcbiAgICAgIDxUZXh0IGtleT1cInJlYWRcIj5cbiAgICAgICAge3JlYWRWZXJifSA8VGV4dCBib2xkPntyZWFkQ291bnR9PC9UZXh0PnsnICd9XG4gICAgICAgIHtyZWFkQ291bnQgPT09IDEgPyAnZmlsZScgOiAnZmlsZXMnfVxuICAgICAgPC9UZXh0PixcbiAgICApXG4gIH1cblxuICBpZiAobGlzdENvdW50ID4gMCkge1xuICAgIGNvbnN0IGlzRmlyc3QgPSBub25NZW1QYXJ0cy5sZW5ndGggPT09IDBcbiAgICBjb25zdCBsaXN0VmVyYiA9IGlzQWN0aXZlR3JvdXBcbiAgICAgID8gaXNGaXJzdFxuICAgICAgICA/ICdMaXN0aW5nJ1xuICAgICAgICA6ICdsaXN0aW5nJ1xuICAgICAgOiBpc0ZpcnN0XG4gICAgICAgID8gJ0xpc3RlZCdcbiAgICAgICAgOiAnbGlzdGVkJ1xuICAgIGlmICghaXNGaXJzdCkge1xuICAgICAgbm9uTWVtUGFydHMucHVzaCg8VGV4dCBrZXk9XCJjb21tYS1sXCI+LCA8L1RleHQ+KVxuICAgIH1cbiAgICBub25NZW1QYXJ0cy5wdXNoKFxuICAgICAgPFRleHQga2V5PVwibGlzdFwiPlxuICAgICAgICB7bGlzdFZlcmJ9IDxUZXh0IGJvbGQ+e2xpc3RDb3VudH08L1RleHQ+eycgJ31cbiAgICAgICAge2xpc3RDb3VudCA9PT0gMSA/ICdkaXJlY3RvcnknIDogJ2RpcmVjdG9yaWVzJ31cbiAgICAgIDwvVGV4dD4sXG4gICAgKVxuICB9XG5cbiAgaWYgKHJlcGxDb3VudCA+IDApIHtcbiAgICBjb25zdCByZXBsVmVyYiA9IGlzQWN0aXZlR3JvdXAgPyBcIlJFUEwnaW5nXCIgOiBcIlJFUEwnZFwiXG4gICAgaWYgKG5vbk1lbVBhcnRzLmxlbmd0aCA+IDApIHtcbiAgICAgIG5vbk1lbVBhcnRzLnB1c2goPFRleHQga2V5PVwiY29tbWEtcmVwbFwiPiwgPC9UZXh0PilcbiAgICB9XG4gICAgbm9uTWVtUGFydHMucHVzaChcbiAgICAgIDxUZXh0IGtleT1cInJlcGxcIj5cbiAgICAgICAge3JlcGxWZXJifSA8VGV4dCBib2xkPntyZXBsQ291bnR9PC9UZXh0PnsnICd9XG4gICAgICAgIHtyZXBsQ291bnQgPT09IDEgPyAndGltZScgOiAndGltZXMnfVxuICAgICAgPC9UZXh0PixcbiAgICApXG4gIH1cblxuICBpZiAobWNwQ2FsbENvdW50ID4gMCkge1xuICAgIGNvbnN0IHNlcnZlckxhYmVsID1cbiAgICAgIG1lc3NhZ2UubWNwU2VydmVyTmFtZXNcbiAgICAgICAgPy5tYXAobiA9PiBuLnJlcGxhY2UoL15jbGF1ZGVcXC5haSAvLCAnJykpXG4gICAgICAgIC5qb2luKCcsICcpIHx8ICdNQ1AnXG4gICAgY29uc3QgaXNGaXJzdCA9IG5vbk1lbVBhcnRzLmxlbmd0aCA9PT0gMFxuICAgIGNvbnN0IHZlcmIgPSBpc0FjdGl2ZUdyb3VwXG4gICAgICA/IGlzRmlyc3RcbiAgICAgICAgPyAnUXVlcnlpbmcnXG4gICAgICAgIDogJ3F1ZXJ5aW5nJ1xuICAgICAgOiBpc0ZpcnN0XG4gICAgICAgID8gJ1F1ZXJpZWQnXG4gICAgICAgIDogJ3F1ZXJpZWQnXG4gICAgaWYgKCFpc0ZpcnN0KSB7XG4gICAgICBub25NZW1QYXJ0cy5wdXNoKDxUZXh0IGtleT1cImNvbW1hLW1jcFwiPiwgPC9UZXh0PilcbiAgICB9XG4gICAgbm9uTWVtUGFydHMucHVzaChcbiAgICAgIDxUZXh0IGtleT1cIm1jcFwiPlxuICAgICAgICB7dmVyYn0ge3NlcnZlckxhYmVsfVxuICAgICAgICB7bWNwQ2FsbENvdW50ID4gMSAmJiAoXG4gICAgICAgICAgPD5cbiAgICAgICAgICAgIHsnICd9XG4gICAgICAgICAgICA8VGV4dCBib2xkPnttY3BDYWxsQ291bnR9PC9UZXh0PiB0aW1lc1xuICAgICAgICAgIDwvPlxuICAgICAgICApfVxuICAgICAgPC9UZXh0PixcbiAgICApXG4gIH1cblxuICBpZiAoaXNGdWxsc2NyZWVuRW52RW5hYmxlZCgpICYmIGJhc2hDb3VudCA+IDApIHtcbiAgICBjb25zdCBpc0ZpcnN0ID0gbm9uTWVtUGFydHMubGVuZ3RoID09PSAwXG4gICAgY29uc3QgdmVyYiA9IGlzQWN0aXZlR3JvdXBcbiAgICAgID8gaXNGaXJzdFxuICAgICAgICA/ICdSdW5uaW5nJ1xuICAgICAgICA6ICdydW5uaW5nJ1xuICAgICAgOiBpc0ZpcnN0XG4gICAgICAgID8gJ1JhbidcbiAgICAgICAgOiAncmFuJ1xuICAgIGlmICghaXNGaXJzdCkge1xuICAgICAgbm9uTWVtUGFydHMucHVzaCg8VGV4dCBrZXk9XCJjb21tYS1iYXNoXCI+LCA8L1RleHQ+KVxuICAgIH1cbiAgICBub25NZW1QYXJ0cy5wdXNoKFxuICAgICAgPFRleHQga2V5PVwiYmFzaFwiPlxuICAgICAgICB7dmVyYn0gPFRleHQgYm9sZD57YmFzaENvdW50fTwvVGV4dD4gYmFzaHsnICd9XG4gICAgICAgIHtiYXNoQ291bnQgPT09IDEgPyAnY29tbWFuZCcgOiAnY29tbWFuZHMnfVxuICAgICAgPC9UZXh0PixcbiAgICApXG4gIH1cblxuICAvLyBCdWlsZCBtZW1vcnkgcGFydHMgKGF1dG8tbWVtb3J5KSDigJQgcmVuZGVyZWQgYWZ0ZXIgbm9uTWVtUGFydHNcbiAgY29uc3QgaGFzUHJlY2VkaW5nTm9uTWVtID0gbm9uTWVtUGFydHMubGVuZ3RoID4gMFxuICBjb25zdCBtZW1QYXJ0czogUmVhY3QuUmVhY3ROb2RlW10gPSBbXVxuXG4gIGlmIChtZW1vcnlSZWFkQ291bnQgPiAwKSB7XG4gICAgY29uc3QgaXNGaXJzdCA9ICFoYXNQcmVjZWRpbmdOb25NZW0gJiYgbWVtUGFydHMubGVuZ3RoID09PSAwXG4gICAgY29uc3QgdmVyYiA9IGlzQWN0aXZlR3JvdXBcbiAgICAgID8gaXNGaXJzdFxuICAgICAgICA/ICdSZWNhbGxpbmcnXG4gICAgICAgIDogJ3JlY2FsbGluZydcbiAgICAgIDogaXNGaXJzdFxuICAgICAgICA/ICdSZWNhbGxlZCdcbiAgICAgICAgOiAncmVjYWxsZWQnXG4gICAgaWYgKCFpc0ZpcnN0KSB7XG4gICAgICBtZW1QYXJ0cy5wdXNoKDxUZXh0IGtleT1cImNvbW1hLW1yXCI+LCA8L1RleHQ+KVxuICAgIH1cbiAgICBtZW1QYXJ0cy5wdXNoKFxuICAgICAgPFRleHQga2V5PVwibWVtLXJlYWRcIj5cbiAgICAgICAge3ZlcmJ9IDxUZXh0IGJvbGQ+e21lbW9yeVJlYWRDb3VudH08L1RleHQ+eycgJ31cbiAgICAgICAge21lbW9yeVJlYWRDb3VudCA9PT0gMSA/ICdtZW1vcnknIDogJ21lbW9yaWVzJ31cbiAgICAgIDwvVGV4dD4sXG4gICAgKVxuICB9XG5cbiAgaWYgKG1lbW9yeVNlYXJjaENvdW50ID4gMCkge1xuICAgIGNvbnN0IGlzRmlyc3QgPSAhaGFzUHJlY2VkaW5nTm9uTWVtICYmIG1lbVBhcnRzLmxlbmd0aCA9PT0gMFxuICAgIGNvbnN0IHZlcmIgPSBpc0FjdGl2ZUdyb3VwXG4gICAgICA/IGlzRmlyc3RcbiAgICAgICAgPyAnU2VhcmNoaW5nJ1xuICAgICAgICA6ICdzZWFyY2hpbmcnXG4gICAgICA6IGlzRmlyc3RcbiAgICAgICAgPyAnU2VhcmNoZWQnXG4gICAgICAgIDogJ3NlYXJjaGVkJ1xuICAgIGlmICghaXNGaXJzdCkge1xuICAgICAgbWVtUGFydHMucHVzaCg8VGV4dCBrZXk9XCJjb21tYS1tc1wiPiwgPC9UZXh0PilcbiAgICB9XG4gICAgbWVtUGFydHMucHVzaCg8VGV4dCBrZXk9XCJtZW0tc2VhcmNoXCI+e2Ake3ZlcmJ9IG1lbW9yaWVzYH08L1RleHQ+KVxuICB9XG5cbiAgaWYgKG1lbW9yeVdyaXRlQ291bnQgPiAwKSB7XG4gICAgY29uc3QgaXNGaXJzdCA9ICFoYXNQcmVjZWRpbmdOb25NZW0gJiYgbWVtUGFydHMubGVuZ3RoID09PSAwXG4gICAgY29uc3QgdmVyYiA9IGlzQWN0aXZlR3JvdXBcbiAgICAgID8gaXNGaXJzdFxuICAgICAgICA/ICdXcml0aW5nJ1xuICAgICAgICA6ICd3cml0aW5nJ1xuICAgICAgOiBpc0ZpcnN0XG4gICAgICAgID8gJ1dyb3RlJ1xuICAgICAgICA6ICd3cm90ZSdcbiAgICBpZiAoIWlzRmlyc3QpIHtcbiAgICAgIG1lbVBhcnRzLnB1c2goPFRleHQga2V5PVwiY29tbWEtbXdcIj4sIDwvVGV4dD4pXG4gICAgfVxuICAgIG1lbVBhcnRzLnB1c2goXG4gICAgICA8VGV4dCBrZXk9XCJtZW0td3JpdGVcIj5cbiAgICAgICAge3ZlcmJ9IDxUZXh0IGJvbGQ+e21lbW9yeVdyaXRlQ291bnR9PC9UZXh0PnsnICd9XG4gICAgICAgIHttZW1vcnlXcml0ZUNvdW50ID09PSAxID8gJ21lbW9yeScgOiAnbWVtb3JpZXMnfVxuICAgICAgPC9UZXh0PixcbiAgICApXG4gIH1cblxuICByZXR1cm4gKFxuICAgIDxCb3ggZmxleERpcmVjdGlvbj1cImNvbHVtblwiIG1hcmdpblRvcD17MX0gYmFja2dyb3VuZENvbG9yPXtiZ30+XG4gICAgICA8Qm94IGZsZXhEaXJlY3Rpb249XCJyb3dcIj5cbiAgICAgICAge2lzQWN0aXZlR3JvdXAgPyAoXG4gICAgICAgICAgPFRvb2xVc2VMb2FkZXIgc2hvdWxkQW5pbWF0ZSBpc1VucmVzb2x2ZWQgaXNFcnJvcj17YW55RXJyb3J9IC8+XG4gICAgICAgICkgOiAoXG4gICAgICAgICAgPEJveCBtaW5XaWR0aD17Mn0gLz5cbiAgICAgICAgKX1cbiAgICAgICAgPFRleHQgZGltQ29sb3I9eyFpc0FjdGl2ZUdyb3VwfT5cbiAgICAgICAgICB7bm9uTWVtUGFydHN9XG4gICAgICAgICAge21lbVBhcnRzfVxuICAgICAgICAgIHtmZWF0dXJlKCdURUFNTUVNJylcbiAgICAgICAgICAgID8gdGVhbU1lbUNvbGxhcHNlZCEuVGVhbU1lbUNvdW50UGFydHMoe1xuICAgICAgICAgICAgICAgIG1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgaXNBY3RpdmVHcm91cCxcbiAgICAgICAgICAgICAgICBoYXNQcmVjZWRpbmdQYXJ0czogaGFzUHJlY2VkaW5nTm9uTWVtIHx8IG1lbVBhcnRzLmxlbmd0aCA+IDAsXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICA6IG51bGx9XG4gICAgICAgICAge2lzQWN0aXZlR3JvdXAgJiYgPFRleHQga2V5PVwiZWxsaXBzaXNcIj7igKY8L1RleHQ+fSA8Q3RybE9Ub0V4cGFuZCAvPlxuICAgICAgICA8L1RleHQ+XG4gICAgICA8L0JveD5cbiAgICAgIHtpc0FjdGl2ZUdyb3VwICYmIGRpc3BsYXllZEhpbnQgIT09IHVuZGVmaW5lZCAmJiAoXG4gICAgICAgIC8vIFJvdyBsYXlvdXQ6IDUtd2lkZSBndXR0ZXIgZm9yIOKOvywgdGhlbiBhIGZsZXggY29sdW1uIGZvciB0aGUgdGV4dC5cbiAgICAgICAgLy8gSW5rJ3Mgd3JhcCBzdGF5cyBpbnNpZGUgdGhlIHJpZ2h0IGNvbHVtbiBzbyBjb250aW51YXRpb24gbGluZXNcbiAgICAgICAgLy8gaW5kZW50IHVuZGVyIOKOvy4gTUFYX0hJTlRfQ0hBUlMgaW4gY29tbWFuZEFzSGludCBjYXBzIHRvdGFsIGF0IH41IGxpbmVzLlxuICAgICAgICA8Qm94IGZsZXhEaXJlY3Rpb249XCJyb3dcIj5cbiAgICAgICAgICA8Qm94IHdpZHRoPXs1fSBmbGV4U2hyaW5rPXswfT5cbiAgICAgICAgICAgIDxUZXh0IGRpbUNvbG9yPnsnICDijr8gICd9PC9UZXh0PlxuICAgICAgICAgIDwvQm94PlxuICAgICAgICAgIDxCb3ggZmxleERpcmVjdGlvbj1cImNvbHVtblwiIGZsZXhHcm93PXsxfT5cbiAgICAgICAgICAgIHtkaXNwbGF5ZWRIaW50LnNwbGl0KCdcXG4nKS5tYXAoKGxpbmUsIGksIGFycikgPT4gKFxuICAgICAgICAgICAgICA8VGV4dCBrZXk9e2BoaW50LSR7aX1gfSBkaW1Db2xvcj5cbiAgICAgICAgICAgICAgICB7bGluZX1cbiAgICAgICAgICAgICAgICB7aSA9PT0gYXJyLmxlbmd0aCAtIDEgJiYgc2hlbGxQcm9ncmVzc1N1ZmZpeH1cbiAgICAgICAgICAgICAgPC9UZXh0PlxuICAgICAgICAgICAgKSl9XG4gICAgICAgICAgPC9Cb3g+XG4gICAgICAgIDwvQm94PlxuICAgICAgKX1cbiAgICAgIHttZXNzYWdlLmhvb2tUb3RhbE1zICE9PSB1bmRlZmluZWQgJiYgbWVzc2FnZS5ob29rVG90YWxNcyA+IDAgJiYgKFxuICAgICAgICA8VGV4dCBkaW1Db2xvcj5cbiAgICAgICAgICB7JyAg4o6/ICAnfVJhbiB7bWVzc2FnZS5ob29rQ291bnR9IFByZVRvb2xVc2V7JyAnfVxuICAgICAgICAgIHttZXNzYWdlLmhvb2tDb3VudCA9PT0gMSA/ICdob29rJyA6ICdob29rcyd9IChcbiAgICAgICAgICB7Zm9ybWF0U2Vjb25kc1Nob3J0KG1lc3NhZ2UuaG9va1RvdGFsTXMpfSlcbiAgICAgICAgPC9UZXh0PlxuICAgICAgKX1cbiAgICA8L0JveD5cbiAgKVxufVxuIl0sIm1hcHBpbmdzIjoiO0FBQUEsU0FBU0EsT0FBTyxRQUFRLFlBQVk7QUFDcEMsU0FBU0MsUUFBUSxRQUFRLE1BQU07QUFDL0IsT0FBT0MsS0FBSyxJQUFJQyxNQUFNLFFBQVEsT0FBTztBQUNyQyxTQUFTQyxpQkFBaUIsUUFBUSxrQ0FBa0M7QUFDcEUsU0FBU0MsSUFBSSxFQUFFQyxHQUFHLEVBQUVDLElBQUksRUFBRUMsUUFBUSxRQUFRLGNBQWM7QUFDeEQsU0FBU0MsY0FBYyxFQUFFLEtBQUtDLEtBQUssUUFBUSxlQUFlO0FBQzFELFNBQVNDLHFCQUFxQixRQUFRLHdDQUF3QztBQUM5RSxjQUNFQyx3QkFBd0IsRUFDeEJDLDBCQUEwQixRQUNyQix3QkFBd0I7QUFDL0IsU0FBU0MsSUFBSSxRQUFRLHNCQUFzQjtBQUMzQyxTQUFTQywrQkFBK0IsUUFBUSxtQ0FBbUM7QUFDbkYsU0FBU0MsY0FBYyxRQUFRLHFCQUFxQjtBQUNwRCxTQUFTQyxjQUFjLEVBQUVDLGtCQUFrQixRQUFRLHVCQUF1QjtBQUMxRSxTQUFTQyxzQkFBc0IsUUFBUSwyQkFBMkI7QUFDbEUsY0FBY0MsbUJBQW1CLFFBQVEseUJBQXlCO0FBQ2xFLGNBQWNDLFNBQVMsUUFBUSxzQkFBc0I7QUFDckQsU0FBU0MsYUFBYSxRQUFRLHFCQUFxQjtBQUNuRCxTQUFTQyxvQkFBb0IsUUFBUSxzQkFBc0I7QUFDM0QsU0FBU0MsT0FBTyxRQUFRLGVBQWU7QUFDdkMsU0FBU0MsYUFBYSxRQUFRLHFCQUFxQjs7QUFFbkQ7QUFDQSxNQUFNQyxnQkFBZ0IsR0FBRzFCLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FDdEMyQixPQUFPLENBQUMsdUJBQXVCLENBQUMsSUFBSSxPQUFPLE9BQU8sdUJBQXVCLENBQUMsR0FDM0UsSUFBSTtBQUNSOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU1DLG1CQUFtQixHQUFHLEdBQUc7QUFFL0IsS0FBS0MsS0FBSyxHQUFHO0VBQ1hDLE9BQU8sRUFBRWxCLHdCQUF3QjtFQUNqQ21CLG9CQUFvQixFQUFFQyxHQUFHLENBQUMsTUFBTSxDQUFDO0VBQ2pDQyxhQUFhLEVBQUUsT0FBTztFQUN0QkMsT0FBTyxFQUFFLE9BQU87RUFDaEJDLEtBQUssRUFBRXpCLEtBQUs7RUFDWjBCLE9BQU8sRUFBRUMsVUFBVSxDQUFDLE9BQU9qQixtQkFBbUIsQ0FBQztFQUMvQztFQUNBa0IsYUFBYSxDQUFDLEVBQUUsT0FBTztBQUN6QixDQUFDOztBQUVEO0FBQ0EsU0FBQUMsZUFBQUMsRUFBQTtFQUFBLE1BQUFDLENBQUEsR0FBQUMsRUFBQTtFQUF3QjtJQUFBQyxPQUFBO0lBQUFSLEtBQUE7SUFBQUMsT0FBQTtJQUFBTCxvQkFBQTtJQUFBRSxhQUFBO0lBQUFXO0VBQUEsSUFBQUosRUFjdkI7RUFDQyxNQUFBSyxFQUFBLEdBQVd0QixvQkFBb0IsQ0FBQyxDQUFDO0VBQUEsSUFBQXVCLEVBQUE7RUFBQSxJQUFBQyxFQUFBO0VBQUEsSUFBQU4sQ0FBQSxRQUFBSSxFQUFBLElBQUFKLENBQUEsUUFBQUUsT0FBQSxDQUFBSyxFQUFBLElBQUFQLENBQUEsUUFBQUUsT0FBQSxDQUFBTSxLQUFBLElBQUFSLENBQUEsUUFBQUUsT0FBQSxDQUFBTyxJQUFBLElBQUFULENBQUEsUUFBQVYsb0JBQUEsSUFBQVUsQ0FBQSxRQUFBTCxPQUFBLElBQUFLLENBQUEsUUFBQVIsYUFBQSxJQUFBUSxDQUFBLFFBQUFHLEtBQUEsSUFBQUgsQ0FBQSxRQUFBTixLQUFBO0lBT2ZZLEVBQUEsR0FBQUksTUFBSSxDQUFBQyxHQUFBLENBQUosNkJBQUcsQ0FBQztJQUFBQyxHQUFBO01BSHRCLE1BQUFDLElBQUEsR0FDRTdDLGNBQWMsQ0FBQzBCLEtBQUssRUFBRVEsT0FBTyxDQUFBTyxJQUN1QixDQUFDLElBQXJEekMsY0FBYyxDQUFDRSxxQkFBcUIsQ0FBQyxDQUFDLEVBQUVnQyxPQUFPLENBQUFPLElBQUssQ0FBQztNQUN2RCxJQUFJLENBQUNJLElBQUk7UUFBU1AsRUFBQSxPQUFJO1FBQUosTUFBQU0sR0FBQTtNQUFJO01BQUEsSUFBQUUsRUFBQTtNQUFBLElBQUFkLENBQUEsU0FBQUUsT0FBQSxDQUFBSyxFQUFBLElBQUFQLENBQUEsU0FBQUwsT0FBQSxDQUFBb0Isa0JBQUE7UUFFSEQsRUFBQSxHQUFBbkIsT0FBTyxDQUFBb0Isa0JBQW1CLENBQUFDLEdBQUksQ0FBQ2QsT0FBTyxDQUFBSyxFQUFHLENBQUM7UUFBQVAsQ0FBQSxPQUFBRSxPQUFBLENBQUFLLEVBQUE7UUFBQVAsQ0FBQSxPQUFBTCxPQUFBLENBQUFvQixrQkFBQTtRQUFBZixDQUFBLE9BQUFjLEVBQUE7TUFBQTtRQUFBQSxFQUFBLEdBQUFkLENBQUE7TUFBQTtNQUE3RCxNQUFBaUIsVUFBQSxHQUFtQkgsRUFBMEM7TUFBQSxJQUFBSSxFQUFBO01BQUEsSUFBQWxCLENBQUEsU0FBQUUsT0FBQSxDQUFBSyxFQUFBLElBQUFQLENBQUEsU0FBQUwsT0FBQSxDQUFBd0IsaUJBQUE7UUFDN0NELEVBQUEsR0FBQXZCLE9BQU8sQ0FBQXdCLGlCQUFrQixDQUFBSCxHQUFJLENBQUNkLE9BQU8sQ0FBQUssRUFBRyxDQUFDO1FBQUFQLENBQUEsT0FBQUUsT0FBQSxDQUFBSyxFQUFBO1FBQUFQLENBQUEsT0FBQUwsT0FBQSxDQUFBd0IsaUJBQUE7UUFBQW5CLENBQUEsT0FBQWtCLEVBQUE7TUFBQTtRQUFBQSxFQUFBLEdBQUFsQixDQUFBO01BQUE7TUFBekQsTUFBQW9CLE9BQUEsR0FBZ0JGLEVBQXlDO01BQUEsSUFBQUcsRUFBQTtNQUFBLElBQUFyQixDQUFBLFNBQUFFLE9BQUEsQ0FBQUssRUFBQSxJQUFBUCxDQUFBLFNBQUFWLG9CQUFBO1FBQ3BDK0IsRUFBQSxHQUFBL0Isb0JBQW9CLENBQUEwQixHQUFJLENBQUNkLE9BQU8sQ0FBQUssRUFBRyxDQUFDO1FBQUFQLENBQUEsT0FBQUUsT0FBQSxDQUFBSyxFQUFBO1FBQUFQLENBQUEsT0FBQVYsb0JBQUE7UUFBQVUsQ0FBQSxPQUFBcUIsRUFBQTtNQUFBO1FBQUFBLEVBQUEsR0FBQXJCLENBQUE7TUFBQTtNQUF6RCxNQUFBc0IsWUFBQSxHQUFxQkQsRUFBb0M7TUFFekQsTUFBQUUsU0FBQSxHQUFrQjVCLE9BQU8sQ0FBQTZCLHFCQUFzQixDQUFBQyxHQUFJLENBQUN2QixPQUFPLENBQUFLLEVBQUcsQ0FBQztNQUMvRCxNQUFBbUIsYUFBQSxHQUNFSCxTQUFTLEVBQUFJLElBQU0sS0FBSyxNQUE0QyxHQUFuQ0osU0FBUyxDQUFBSyxhQUEwQixHQUFoRUMsU0FBZ0U7TUFDbEUsTUFBQUMsWUFBQSxHQUFxQmpCLElBQUksQ0FBQWtCLFlBQXdCLEVBQUFDLFNBQWUsQ0FBZE4sYUFBYSxDQUFDO01BQ2hFLE1BQUFPLFVBQUEsR0FBbUJILFlBQVksRUFBQUksT0FBeUMsR0FBN0JKLFlBQVksQ0FBQUssSUFBaUIsR0FBckROLFNBQXFEO01BRXhFLE1BQUFPLFdBQUEsR0FBb0J2QixJQUFJLENBQUF3QixXQUFZLENBQUFMLFNBQVUsQ0FBQzlCLE9BQU8sQ0FBQU0sS0FBTSxDQUFDO01BQzdELE1BQUFBLEtBQUEsR0FBYzRCLFdBQVcsQ0FBQUYsT0FBdUMsR0FBNUJFLFdBQVcsQ0FBQUQsSUFBaUIsR0FBbEROLFNBQWtEO01BQ2hFLE1BQUFTLGNBQUEsR0FBdUJ6QixJQUFJLENBQUF5QixjQUFlLENBQUM5QixLQUFLLENBQUM7TUFDakQsTUFBQStCLGNBQUEsR0FBdUIvQixLQUFLLEdBQ3hCSyxJQUFJLENBQUEyQixvQkFBcUIsQ0FBQ2hDLEtBQUssRUFBRTtRQUFBTCxLQUFBO1FBQUFWLE9BQUEsRUFBa0I7TUFBSyxDQUNyRCxDQUFDLEdBRmUsSUFFZjtNQVdlLE1BQUFnRCxFQUFBLEdBQUFqRCxhQUE2QixJQUE3QjhCLFlBQTZCO01BQzlCLE1BQUFvQixFQUFBLElBQUN6QixVQUFVO01BQUEsSUFBQTBCLEVBQUE7TUFBQSxJQUFBM0MsQ0FBQSxTQUFBb0IsT0FBQSxJQUFBcEIsQ0FBQSxTQUFBeUMsRUFBQSxJQUFBekMsQ0FBQSxTQUFBMEMsRUFBQTtRQUYzQkMsRUFBQSxJQUFDLGFBQWEsQ0FDRyxhQUE2QixDQUE3QixDQUFBRixFQUE0QixDQUFDLENBQzlCLFlBQVcsQ0FBWCxDQUFBQyxFQUFVLENBQUMsQ0FDaEJ0QixPQUFPLENBQVBBLFFBQU0sQ0FBQyxHQUNoQjtRQUFBcEIsQ0FBQSxPQUFBb0IsT0FBQTtRQUFBcEIsQ0FBQSxPQUFBeUMsRUFBQTtRQUFBekMsQ0FBQSxPQUFBMEMsRUFBQTtRQUFBMUMsQ0FBQSxPQUFBMkMsRUFBQTtNQUFBO1FBQUFBLEVBQUEsR0FBQTNDLENBQUE7TUFBQTtNQVhOSyxFQUFBLElBQUMsR0FBRyxDQUNHLEdBQVUsQ0FBVixDQUFBSCxPQUFPLENBQUFLLEVBQUUsQ0FBQyxDQUNELGFBQVEsQ0FBUixRQUFRLENBQ1gsU0FBQyxDQUFELEdBQUMsQ0FDS0gsZUFBRSxDQUFGQSxHQUFDLENBQUMsQ0FFbkIsQ0FBQyxHQUFHLENBQWUsYUFBSyxDQUFMLEtBQUssQ0FDdEIsQ0FBQXVDLEVBSUMsQ0FDRCxDQUFDLElBQUksQ0FDSCxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUosS0FBRyxDQUFDLENBQUVMLGVBQWEsQ0FBRSxFQUExQixJQUFJLENBQ0osQ0FBQUMsY0FBaUQsSUFBL0IsQ0FBQyxJQUFJLENBQUMsQ0FBRUEsZUFBYSxDQUFFLENBQUMsRUFBdkIsSUFBSSxDQUF5QixDQUNuRCxFQUhDLElBQUksQ0FJSixDQUFBL0IsS0FBdUMsSUFBOUJLLElBQUksQ0FBQStCLGdCQUEwQixHQUFOcEMsS0FBSyxFQUN6QyxFQVhDLEdBQUcsQ0FZSCxDQUFBUyxVQUFzQixJQUF0QixDQUFlRyxPQUFtQyxJQUF4QmEsVUFBVSxLQUFLSixTQVF6QyxJQVBDLENBQUMsR0FBRyxDQUNELENBQUFoQixJQUFJLENBQUFnQyx1QkFJSCxHQUo4QlosVUFBVSxFQUFFLEVBQUUsRUFBRTtZQUFBeEMsT0FBQSxFQUNyQyxJQUFJO1lBQUFDLEtBQUE7WUFBQVM7VUFHZixDQUFDLEVBQ0gsRUFOQyxHQUFHLENBT04sQ0FDRixFQTNCQyxHQUFHLENBMkJFO0lBQUE7SUFBQUgsQ0FBQSxNQUFBSSxFQUFBO0lBQUFKLENBQUEsTUFBQUUsT0FBQSxDQUFBSyxFQUFBO0lBQUFQLENBQUEsTUFBQUUsT0FBQSxDQUFBTSxLQUFBO0lBQUFSLENBQUEsTUFBQUUsT0FBQSxDQUFBTyxJQUFBO0lBQUFULENBQUEsTUFBQVYsb0JBQUE7SUFBQVUsQ0FBQSxNQUFBTCxPQUFBO0lBQUFLLENBQUEsTUFBQVIsYUFBQTtJQUFBUSxDQUFBLE1BQUFHLEtBQUE7SUFBQUgsQ0FBQSxNQUFBTixLQUFBO0lBQUFNLENBQUEsTUFBQUssRUFBQTtJQUFBTCxDQUFBLE9BQUFNLEVBQUE7RUFBQTtJQUFBRCxFQUFBLEdBQUFMLENBQUE7SUFBQU0sRUFBQSxHQUFBTixDQUFBO0VBQUE7RUFBQSxJQUFBTSxFQUFBLEtBQUFJLE1BQUEsQ0FBQUMsR0FBQTtJQUFBLE9BQUFMLEVBQUE7RUFBQTtFQUFBLE9BM0JORCxFQTJCTTtBQUFBO0FBSVYsT0FBTyxTQUFTeUMsMEJBQTBCQSxDQUFDO0VBQ3pDekQsT0FBTztFQUNQQyxvQkFBb0I7RUFDcEJFLGFBQWE7RUFDYkMsT0FBTztFQUNQQyxLQUFLO0VBQ0xDLE9BQU87RUFDUEU7QUFDSyxDQUFOLEVBQUVULEtBQUssQ0FBQyxFQUFFM0IsS0FBSyxDQUFDc0YsU0FBUyxDQUFDO0VBQ3pCLE1BQU0zQyxFQUFFLEdBQUd0QixvQkFBb0IsQ0FBQyxDQUFDO0VBQ2pDLE1BQU07SUFDSmtFLFdBQVcsRUFBRUMsY0FBYztJQUMzQkMsU0FBUyxFQUFFQyxZQUFZO0lBQ3ZCQyxTQUFTLEVBQUVDLFlBQVk7SUFDdkJDLFNBQVM7SUFDVEMsaUJBQWlCO0lBQ2pCQyxlQUFlO0lBQ2ZDLGdCQUFnQjtJQUNoQkMsUUFBUSxFQUFFQztFQUNaLENBQUMsR0FBR3RFLE9BQU87RUFDWCxNQUFNLENBQUNjLEtBQUssQ0FBQyxHQUFHcEMsUUFBUSxDQUFDLENBQUM7RUFDMUIsTUFBTTZGLFVBQVUsR0FBR3RGLCtCQUErQixDQUFDZSxPQUFPLENBQUM7RUFDM0QsTUFBTXdFLFFBQVEsR0FBR0QsVUFBVSxDQUFDRSxJQUFJLENBQUN2RCxFQUFFLElBQUlaLE9BQU8sQ0FBQ3dCLGlCQUFpQixDQUFDSCxHQUFHLENBQUNULEVBQUUsQ0FBQyxDQUFDO0VBQ3pFLE1BQU13RCxZQUFZLEdBQ2hCUixpQkFBaUIsR0FBRyxDQUFDLElBQUlDLGVBQWUsR0FBRyxDQUFDLElBQUlDLGdCQUFnQixHQUFHLENBQUM7RUFDdEUsTUFBTU8sZ0JBQWdCLEdBQUd6RyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQ3ZDMEIsZ0JBQWdCLENBQUMsQ0FBQ2dGLGtCQUFrQixDQUFDNUUsT0FBTyxDQUFDLEdBQzdDLEtBQUs7O0VBRVQ7RUFDQTtFQUNBO0VBQ0EsTUFBTTZFLGVBQWUsR0FBR3hHLE1BQU0sQ0FBQyxDQUFDLENBQUM7RUFDakMsTUFBTXlHLGlCQUFpQixHQUFHekcsTUFBTSxDQUFDLENBQUMsQ0FBQztFQUNuQyxNQUFNMEcsZUFBZSxHQUFHMUcsTUFBTSxDQUFDLENBQUMsQ0FBQztFQUNqQyxNQUFNMkcsY0FBYyxHQUFHM0csTUFBTSxDQUFDLENBQUMsQ0FBQztFQUNoQyxNQUFNNEcsZUFBZSxHQUFHNUcsTUFBTSxDQUFDLENBQUMsQ0FBQztFQUNqQ3dHLGVBQWUsQ0FBQ0ssT0FBTyxHQUFHQyxJQUFJLENBQUNDLEdBQUcsQ0FBQ1AsZUFBZSxDQUFDSyxPQUFPLEVBQUVwQixZQUFZLENBQUM7RUFDekVnQixpQkFBaUIsQ0FBQ0ksT0FBTyxHQUFHQyxJQUFJLENBQUNDLEdBQUcsQ0FDbENOLGlCQUFpQixDQUFDSSxPQUFPLEVBQ3pCdEIsY0FDRixDQUFDO0VBQ0RtQixlQUFlLENBQUNHLE9BQU8sR0FBR0MsSUFBSSxDQUFDQyxHQUFHLENBQUNMLGVBQWUsQ0FBQ0csT0FBTyxFQUFFbEIsWUFBWSxDQUFDO0VBQ3pFZ0IsY0FBYyxDQUFDRSxPQUFPLEdBQUdDLElBQUksQ0FBQ0MsR0FBRyxDQUMvQkosY0FBYyxDQUFDRSxPQUFPLEVBQ3RCbEYsT0FBTyxDQUFDcUYsWUFBWSxJQUFJLENBQzFCLENBQUM7RUFDREosZUFBZSxDQUFDQyxPQUFPLEdBQUdDLElBQUksQ0FBQ0MsR0FBRyxDQUNoQ0gsZUFBZSxDQUFDQyxPQUFPLEVBQ3ZCbEYsT0FBTyxDQUFDc0YsU0FBUyxJQUFJLENBQ3ZCLENBQUM7RUFDRCxNQUFNekIsU0FBUyxHQUFHZ0IsZUFBZSxDQUFDSyxPQUFPO0VBQ3pDLE1BQU12QixXQUFXLEdBQUdtQixpQkFBaUIsQ0FBQ0ksT0FBTztFQUM3QyxNQUFNbkIsU0FBUyxHQUFHZ0IsZUFBZSxDQUFDRyxPQUFPO0VBQ3pDLE1BQU1HLFlBQVksR0FBR0wsY0FBYyxDQUFDRSxPQUFPO0VBQzNDO0VBQ0E7RUFDQTtFQUNBLE1BQU1LLGNBQWMsR0FBR3ZGLE9BQU8sQ0FBQ3VGLGNBQWMsSUFBSSxDQUFDO0VBQ2xELE1BQU1ELFNBQVMsR0FBR2pHLHNCQUFzQixDQUFDLENBQUMsR0FDdEM4RixJQUFJLENBQUNDLEdBQUcsQ0FBQyxDQUFDLEVBQUVILGVBQWUsQ0FBQ0MsT0FBTyxHQUFHSyxjQUFjLENBQUMsR0FDckQsQ0FBQztFQUVMLE1BQU1DLGVBQWUsR0FDbkI3QixXQUFXLEdBQUcsQ0FBQyxJQUNmRSxTQUFTLEdBQUcsQ0FBQyxJQUNiRSxTQUFTLEdBQUcsQ0FBQyxJQUNiRSxTQUFTLEdBQUcsQ0FBQyxJQUNib0IsWUFBWSxHQUFHLENBQUMsSUFDaEJDLFNBQVMsR0FBRyxDQUFDLElBQ2JDLGNBQWMsR0FBRyxDQUFDO0VBRXBCLE1BQU1FLFNBQVMsR0FBR3pGLE9BQU8sQ0FBQzBGLGFBQWE7RUFDdkMsTUFBTUMsVUFBVSxHQUFHM0YsT0FBTyxDQUFDMkYsVUFBVTtFQUNyQyxJQUFJQyxZQUFZLEdBQUc1RixPQUFPLENBQUM2RixpQkFBaUI7RUFDNUMsSUFBSUQsWUFBWSxLQUFLcEQsU0FBUyxFQUFFO0lBQzlCLE1BQU1zRCxhQUFhLEdBQUdILFVBQVUsRUFBRUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3hDLE1BQU1DLFVBQVUsR0FDZEYsYUFBYSxLQUFLdEQsU0FBUyxHQUFHLElBQUlzRCxhQUFhLEdBQUcsR0FBR3RELFNBQVM7SUFDaEUsTUFBTXlELFFBQVEsR0FBR1IsU0FBUyxFQUFFTSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbENILFlBQVksR0FDVkssUUFBUSxLQUFLekQsU0FBUyxHQUFHdEQsY0FBYyxDQUFDK0csUUFBUSxDQUFDLEdBQUdELFVBQVU7RUFDbEU7O0VBRUE7RUFDQTtFQUNBO0VBQ0EsSUFBSXhGLGFBQWEsRUFBRTtJQUNqQixLQUFLLE1BQU1VLElBQUUsSUFBSXFELFVBQVUsRUFBRTtNQUMzQixJQUFJLENBQUN0RSxvQkFBb0IsQ0FBQzBCLEdBQUcsQ0FBQ1QsSUFBRSxDQUFDLEVBQUU7TUFDbkMsTUFBTWdGLE1BQU0sR0FBRzVGLE9BQU8sQ0FBQzZGLDJCQUEyQixDQUFDL0QsR0FBRyxDQUFDbEIsSUFBRSxDQUFDLEVBQUU2RSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRWpELElBQUk7TUFDeEUsSUFBSW9ELE1BQU0sRUFBRTVELElBQUksS0FBSyxnQkFBZ0IsSUFBSTRELE1BQU0sQ0FBQ0UsS0FBSyxLQUFLLE9BQU8sRUFBRTtRQUNqRSxNQUFNakYsS0FBSyxHQUFHK0UsTUFBTSxDQUFDRyxTQUFTLElBQUk7VUFDaENDLE9BQU8sQ0FBQyxFQUFFLE1BQU07VUFDaEJDLE9BQU8sQ0FBQyxFQUFFLE1BQU07VUFDaEJDLFNBQVMsQ0FBQyxFQUFFLE1BQU07UUFDcEIsQ0FBQztRQUNEWixZQUFZLEdBQ1Z6RSxLQUFLLENBQUNxRixTQUFTLEtBQ2RyRixLQUFLLENBQUNvRixPQUFPLEdBQUcsSUFBSXBGLEtBQUssQ0FBQ29GLE9BQU8sR0FBRyxHQUFHL0QsU0FBUyxDQUFDLElBQ2xEckIsS0FBSyxDQUFDbUYsT0FBTyxJQUNiSixNQUFNLENBQUNPLFFBQVE7TUFDbkI7SUFDRjtFQUNGO0VBRUEsTUFBTUMsYUFBYSxHQUFHcEksaUJBQWlCLENBQUNzSCxZQUFZLEVBQUU5RixtQkFBbUIsQ0FBQzs7RUFFMUU7RUFDQSxJQUFJTSxPQUFPLEVBQUU7SUFDWCxNQUFNdUcsUUFBUSxFQUFFNUgsMEJBQTBCLEVBQUUsR0FBRyxFQUFFO0lBQ2pELEtBQUssTUFBTTZILEdBQUcsSUFBSXRDLGFBQWEsRUFBRTtNQUMvQixJQUFJc0MsR0FBRyxDQUFDdEUsSUFBSSxLQUFLLFdBQVcsRUFBRTtRQUM1QnFFLFFBQVEsQ0FBQ0UsSUFBSSxDQUFDRCxHQUFHLENBQUM7TUFDcEIsQ0FBQyxNQUFNLElBQUlBLEdBQUcsQ0FBQ3RFLElBQUksS0FBSyxrQkFBa0IsRUFBRTtRQUMxQ3FFLFFBQVEsQ0FBQ0UsSUFBSSxDQUFDLEdBQUdELEdBQUcsQ0FBQ3ZDLFFBQVEsQ0FBQztNQUNoQztJQUNGO0lBRUEsT0FDRSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsUUFBUTtBQUNqQyxRQUFRLENBQUNzQyxRQUFRLENBQUNHLEdBQUcsQ0FBQ0YsS0FBRyxJQUFJO1FBQ25CLE1BQU0vRixPQUFPLEdBQUcrRixLQUFHLENBQUM1RyxPQUFPLENBQUNhLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDdEMsSUFBSUEsT0FBTyxFQUFFeUIsSUFBSSxLQUFLLFVBQVUsRUFBRSxPQUFPLElBQUk7UUFDN0MsT0FDRSxDQUFDLGNBQWMsQ0FDYixHQUFHLENBQUMsQ0FBQ3pCLE9BQU8sQ0FBQ0ssRUFBRSxDQUFDLENBQ2hCLE9BQU8sQ0FBQyxDQUFDTCxPQUFPLENBQUMsQ0FDakIsS0FBSyxDQUFDLENBQUNSLEtBQUssQ0FBQyxDQUNiLE9BQU8sQ0FBQyxDQUFDQyxPQUFPLENBQUMsQ0FDakIsb0JBQW9CLENBQUMsQ0FBQ0wsb0JBQW9CLENBQUMsQ0FDM0MsYUFBYSxDQUFDLENBQUNFLGFBQWEsQ0FBQyxDQUM3QixLQUFLLENBQUMsQ0FBQ1csS0FBSyxDQUFDLEdBQ2I7TUFFTixDQUFDLENBQUM7QUFDVixRQUFRLENBQUNkLE9BQU8sQ0FBQytHLFNBQVMsSUFBSS9HLE9BQU8sQ0FBQytHLFNBQVMsQ0FBQ0MsTUFBTSxHQUFHLENBQUMsSUFDaEQ7QUFDVixZQUFZLENBQUMsSUFBSSxDQUFDLFFBQVE7QUFDMUIsY0FBYyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUNoSCxPQUFPLENBQUNpSCxTQUFTLENBQUMsV0FBVyxDQUFDLEdBQUc7QUFDN0QsY0FBYyxDQUFDakgsT0FBTyxDQUFDaUgsU0FBUyxLQUFLLENBQUMsR0FBRyxNQUFNLEdBQUcsT0FBTyxDQUFDO0FBQzFELGNBQWMsQ0FBQzdILGtCQUFrQixDQUFDWSxPQUFPLENBQUNrSCxXQUFXLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDNUQsWUFBWSxFQUFFLElBQUk7QUFDbEIsWUFBWSxDQUFDbEgsT0FBTyxDQUFDK0csU0FBUyxDQUFDRCxHQUFHLENBQUMsQ0FBQ0ssSUFBSSxFQUFFQyxHQUFHLEtBQy9CLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVFBLEdBQUcsRUFBRSxDQUFDLENBQUMsUUFBUTtBQUNoRCxnQkFBZ0IsQ0FBQyxTQUFTO0FBQzFCLGdCQUFnQixDQUFDRCxJQUFJLENBQUNiLE9BQU8sQ0FBQyxFQUFFLENBQUNsSCxrQkFBa0IsQ0FBQytILElBQUksQ0FBQ0UsVUFBVSxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBQzFFLGNBQWMsRUFBRSxJQUFJLENBQ1AsQ0FBQztBQUNkLFVBQVUsR0FDRDtBQUNULFFBQVEsQ0FBQ3JILE9BQU8sQ0FBQ3NILGdCQUFnQixFQUFFUixHQUFHLENBQUNTLENBQUMsSUFDOUIsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUNBLENBQUMsQ0FBQ0MsSUFBSSxDQUFDLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEUsWUFBWSxDQUFDLElBQUksQ0FBQyxRQUFRO0FBQzFCLGNBQWMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDckosUUFBUSxDQUFDb0osQ0FBQyxDQUFDQyxJQUFJLENBQUM7QUFDakQsWUFBWSxFQUFFLElBQUk7QUFDbEIsWUFBWSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEMsY0FBYyxDQUFDLElBQUk7QUFDbkIsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUNELENBQUMsQ0FBQzFHLE9BQU8sQ0FBQyxFQUFFLElBQUk7QUFDdkMsY0FBYyxFQUFFLElBQUk7QUFDcEIsWUFBWSxFQUFFLEdBQUc7QUFDakIsVUFBVSxFQUFFLEdBQUcsQ0FDTixDQUFDO0FBQ1YsTUFBTSxFQUFFLEdBQUcsQ0FBQztFQUVWOztFQUVBO0VBQ0E7O0VBRUE7RUFDQTtFQUNBLElBQUksQ0FBQzZELFlBQVksSUFBSSxDQUFDQyxnQkFBZ0IsSUFBSSxDQUFDYSxlQUFlLEVBQUU7SUFDMUQsT0FBTyxJQUFJO0VBQ2I7O0VBRUE7RUFDQTtFQUNBO0VBQ0E7RUFDQSxJQUFJaUMsbUJBQW1CLEdBQUcsRUFBRTtFQUM1QixJQUFJcEksc0JBQXNCLENBQUMsQ0FBQyxJQUFJbUIsYUFBYSxFQUFFO0lBQzdDLElBQUlrSCxPQUFPLEVBQUUsTUFBTSxHQUFHLFNBQVM7SUFDL0IsSUFBSUMsS0FBSyxHQUFHLENBQUM7SUFDYixLQUFLLE1BQU16RyxJQUFFLElBQUlxRCxVQUFVLEVBQUU7TUFDM0IsSUFBSSxDQUFDdEUsb0JBQW9CLENBQUMwQixHQUFHLENBQUNULElBQUUsQ0FBQyxFQUFFO01BQ25DLE1BQU00QixJQUFJLEdBQUd4QyxPQUFPLENBQUM2RiwyQkFBMkIsQ0FBQy9ELEdBQUcsQ0FBQ2xCLElBQUUsQ0FBQyxFQUFFNkUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUVqRCxJQUFJO01BQ3RFLElBQ0VBLElBQUksRUFBRVIsSUFBSSxLQUFLLGVBQWUsSUFDOUJRLElBQUksRUFBRVIsSUFBSSxLQUFLLHFCQUFxQixFQUNwQztRQUNBO01BQ0Y7TUFDQSxJQUFJb0YsT0FBTyxLQUFLbEYsU0FBUyxJQUFJTSxJQUFJLENBQUM4RSxrQkFBa0IsR0FBR0YsT0FBTyxFQUFFO1FBQzlEQSxPQUFPLEdBQUc1RSxJQUFJLENBQUM4RSxrQkFBa0I7UUFDakNELEtBQUssR0FBRzdFLElBQUksQ0FBQytFLFVBQVU7TUFDekI7SUFDRjtJQUNBLElBQUlILE9BQU8sS0FBS2xGLFNBQVMsSUFBSWtGLE9BQU8sSUFBSSxDQUFDLEVBQUU7TUFDekMsTUFBTUksSUFBSSxHQUFHM0ksY0FBYyxDQUFDdUksT0FBTyxHQUFHLElBQUksQ0FBQztNQUMzQ0QsbUJBQW1CLEdBQ2pCRSxLQUFLLEdBQUcsQ0FBQyxHQUNMLEtBQUtHLElBQUksTUFBTUgsS0FBSyxJQUFJQSxLQUFLLEtBQUssQ0FBQyxHQUFHLE1BQU0sR0FBRyxPQUFPLEdBQUcsR0FDekQsS0FBS0csSUFBSSxHQUFHO0lBQ3BCO0VBQ0Y7O0VBRUE7RUFDQTtFQUNBLE1BQU1DLFdBQVcsRUFBRTNKLEtBQUssQ0FBQ3NGLFNBQVMsRUFBRSxHQUFHLEVBQUU7O0VBRXpDO0VBQ0EsU0FBU3NFLFFBQVFBLENBQUNDLEdBQUcsRUFBRSxNQUFNLEVBQUVDLElBQUksRUFBRSxNQUFNLEVBQUVDLElBQUksRUFBRS9KLEtBQUssQ0FBQ3NGLFNBQVMsQ0FBQyxFQUFFLElBQUksQ0FBQztJQUN4RSxNQUFNMEUsT0FBTyxHQUFHTCxXQUFXLENBQUNmLE1BQU0sS0FBSyxDQUFDO0lBQ3hDLElBQUksQ0FBQ29CLE9BQU8sRUFBRUwsV0FBVyxDQUFDbEIsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVNvQixHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNwRUYsV0FBVyxDQUFDbEIsSUFBSSxDQUNkLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDb0IsR0FBRyxDQUFDO0FBQ3JCLFFBQVEsQ0FBQ0csT0FBTyxHQUFHRixJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQ0csV0FBVyxDQUFDLENBQUMsR0FBR0gsSUFBSSxDQUFDSSxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUdKLElBQUksQ0FBQyxDQUFDLENBQUNDLElBQUk7QUFDdkUsTUFBTSxFQUFFLElBQUksQ0FDUixDQUFDO0VBQ0g7RUFDQSxJQUFJOUksc0JBQXNCLENBQUMsQ0FBQyxJQUFJVyxPQUFPLENBQUN1SSxPQUFPLEVBQUV2QixNQUFNLEVBQUU7SUFDdkQsTUFBTXdCLE1BQU0sR0FBRztNQUNiQyxTQUFTLEVBQUUsV0FBVztNQUN0QkMsT0FBTyxFQUFFLGdCQUFnQjtNQUN6QixlQUFlLEVBQUU7SUFDbkIsQ0FBQztJQUNELEtBQUssTUFBTUMsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLFNBQVMsRUFBRSxlQUFlLENBQUMsSUFBSUMsS0FBSyxFQUFFO01BQ3JFLE1BQU1DLElBQUksR0FBRzdJLE9BQU8sQ0FBQ3VJLE9BQU8sQ0FBQ08sTUFBTSxDQUFDQyxDQUFDLElBQUlBLENBQUMsQ0FBQ0osSUFBSSxLQUFLQSxJQUFJLENBQUMsQ0FBQzdCLEdBQUcsQ0FBQ2lDLEdBQUMsSUFBSUEsR0FBQyxDQUFDQyxHQUFHLENBQUM7TUFDekUsSUFBSUgsSUFBSSxDQUFDN0IsTUFBTSxFQUFFO1FBQ2ZnQixRQUFRLENBQUNXLElBQUksRUFBRUgsTUFBTSxDQUFDRyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQ0UsSUFBSSxDQUFDSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztNQUNuRTtJQUNGO0VBQ0Y7RUFDQSxJQUFJNUosc0JBQXNCLENBQUMsQ0FBQyxJQUFJVyxPQUFPLENBQUNrSixNQUFNLEVBQUVsQyxNQUFNLEVBQUU7SUFDdEQsTUFBTW1DLFFBQVEsR0FBR25LLElBQUksQ0FBQ2dCLE9BQU8sQ0FBQ2tKLE1BQU0sQ0FBQ3BDLEdBQUcsQ0FBQ3NDLENBQUMsSUFBSUEsQ0FBQyxDQUFDQyxNQUFNLENBQUMsQ0FBQztJQUN4RHJCLFFBQVEsQ0FBQyxNQUFNLEVBQUUsV0FBVyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDbUIsUUFBUSxDQUFDRixJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztFQUN4RTtFQUNBLElBQUk1SixzQkFBc0IsQ0FBQyxDQUFDLElBQUlXLE9BQU8sQ0FBQ21KLFFBQVEsRUFBRW5DLE1BQU0sRUFBRTtJQUN4RCxNQUFNc0MsUUFBUSxHQUFHO01BQUVDLE1BQU0sRUFBRSxRQUFRO01BQUVDLE9BQU8sRUFBRTtJQUFlLENBQUM7SUFDOUQsS0FBSyxNQUFNQyxDQUFDLElBQUl6SixPQUFPLENBQUNtSixRQUFRLEVBQUU7TUFDaENuQixRQUFRLENBQ04sTUFBTXlCLENBQUMsQ0FBQ0MsTUFBTSxJQUFJRCxDQUFDLENBQUNFLEdBQUcsRUFBRSxFQUN6QkwsUUFBUSxDQUFDRyxDQUFDLENBQUNDLE1BQU0sQ0FBQyxFQUNsQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQ0QsQ0FBQyxDQUFDRSxHQUFHLENBQUMsRUFBRSxJQUFJLENBQzFCLENBQUM7SUFDSDtFQUNGO0VBQ0EsSUFBSXRLLHNCQUFzQixDQUFDLENBQUMsSUFBSVcsT0FBTyxDQUFDNEosR0FBRyxFQUFFNUMsTUFBTSxFQUFFO0lBQ25ELE1BQU02QyxLQUFLLEdBQUc7TUFDWkMsT0FBTyxFQUFFLFNBQVM7TUFDbEJDLE1BQU0sRUFBRSxRQUFRO01BQ2hCUixNQUFNLEVBQUUsUUFBUTtNQUNoQlMsU0FBUyxFQUFFLGNBQWM7TUFDekJDLE1BQU0sRUFBRSxRQUFRO01BQ2hCQyxLQUFLLEVBQUU7SUFDVCxDQUFDO0lBQ0QsS0FBSyxNQUFNQyxFQUFFLElBQUluSyxPQUFPLENBQUM0SixHQUFHLEVBQUU7TUFDNUI1QixRQUFRLENBQ04sTUFBTW1DLEVBQUUsQ0FBQ1QsTUFBTSxJQUFJUyxFQUFFLENBQUNDLE1BQU0sRUFBRSxFQUM5QlAsS0FBSyxDQUFDTSxFQUFFLENBQUNULE1BQU0sQ0FBQyxFQUNoQlMsRUFBRSxDQUFDRSxHQUFHLEdBQ0osQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUNGLEVBQUUsQ0FBQ0MsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUNELEVBQUUsQ0FBQ0UsR0FBRyxDQUFDLENBQUMsSUFBSSxHQUFHLEdBRWhELENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUNGLEVBQUUsQ0FBQ0MsTUFBTSxDQUFDLEVBQUUsSUFBSSxDQUVwQyxDQUFDO0lBQ0g7RUFDRjtFQUVBLElBQUl6RyxXQUFXLEdBQUcsQ0FBQyxFQUFFO0lBQ25CLE1BQU15RSxTQUFPLEdBQUdMLFdBQVcsQ0FBQ2YsTUFBTSxLQUFLLENBQUM7SUFDeEMsTUFBTXNELFVBQVUsR0FBRzlKLGFBQWEsR0FDNUI0SCxTQUFPLEdBQ0wsZUFBZSxHQUNmLGVBQWUsR0FDakJBLFNBQU8sR0FDTCxjQUFjLEdBQ2QsY0FBYztJQUNwQixJQUFJLENBQUNBLFNBQU8sRUFBRTtNQUNaTCxXQUFXLENBQUNsQixJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDakQ7SUFDQWtCLFdBQVcsQ0FBQ2xCLElBQUksQ0FDZCxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUTtBQUN4QixRQUFRLENBQUN5RCxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQzNHLFdBQVcsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUc7QUFDeEQsUUFBUSxDQUFDQSxXQUFXLEtBQUssQ0FBQyxHQUFHLFNBQVMsR0FBRyxVQUFVO0FBQ25ELE1BQU0sRUFBRSxJQUFJLENBQ1IsQ0FBQztFQUNIO0VBRUEsSUFBSUUsU0FBUyxHQUFHLENBQUMsRUFBRTtJQUNqQixNQUFNdUUsU0FBTyxHQUFHTCxXQUFXLENBQUNmLE1BQU0sS0FBSyxDQUFDO0lBQ3hDLE1BQU11RCxRQUFRLEdBQUcvSixhQUFhLEdBQzFCNEgsU0FBTyxHQUNMLFNBQVMsR0FDVCxTQUFTLEdBQ1hBLFNBQU8sR0FDTCxNQUFNLEdBQ04sTUFBTTtJQUNaLElBQUksQ0FBQ0EsU0FBTyxFQUFFO01BQ1pMLFdBQVcsQ0FBQ2xCLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNqRDtJQUNBa0IsV0FBVyxDQUFDbEIsSUFBSSxDQUNkLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNO0FBQ3RCLFFBQVEsQ0FBQzBELFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDMUcsU0FBUyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRztBQUNwRCxRQUFRLENBQUNBLFNBQVMsS0FBSyxDQUFDLEdBQUcsTUFBTSxHQUFHLE9BQU87QUFDM0MsTUFBTSxFQUFFLElBQUksQ0FDUixDQUFDO0VBQ0g7RUFFQSxJQUFJRSxTQUFTLEdBQUcsQ0FBQyxFQUFFO0lBQ2pCLE1BQU1xRSxTQUFPLEdBQUdMLFdBQVcsQ0FBQ2YsTUFBTSxLQUFLLENBQUM7SUFDeEMsTUFBTXdELFFBQVEsR0FBR2hLLGFBQWEsR0FDMUI0SCxTQUFPLEdBQ0wsU0FBUyxHQUNULFNBQVMsR0FDWEEsU0FBTyxHQUNMLFFBQVEsR0FDUixRQUFRO0lBQ2QsSUFBSSxDQUFDQSxTQUFPLEVBQUU7TUFDWkwsV0FBVyxDQUFDbEIsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ2pEO0lBQ0FrQixXQUFXLENBQUNsQixJQUFJLENBQ2QsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU07QUFDdEIsUUFBUSxDQUFDMkQsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUN6RyxTQUFTLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHO0FBQ3BELFFBQVEsQ0FBQ0EsU0FBUyxLQUFLLENBQUMsR0FBRyxXQUFXLEdBQUcsYUFBYTtBQUN0RCxNQUFNLEVBQUUsSUFBSSxDQUNSLENBQUM7RUFDSDtFQUVBLElBQUlFLFNBQVMsR0FBRyxDQUFDLEVBQUU7SUFDakIsTUFBTXdHLFFBQVEsR0FBR2pLLGFBQWEsR0FBRyxVQUFVLEdBQUcsUUFBUTtJQUN0RCxJQUFJdUgsV0FBVyxDQUFDZixNQUFNLEdBQUcsQ0FBQyxFQUFFO01BQzFCZSxXQUFXLENBQUNsQixJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDcEQ7SUFDQWtCLFdBQVcsQ0FBQ2xCLElBQUksQ0FDZCxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTTtBQUN0QixRQUFRLENBQUM0RCxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQ3hHLFNBQVMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUc7QUFDcEQsUUFBUSxDQUFDQSxTQUFTLEtBQUssQ0FBQyxHQUFHLE1BQU0sR0FBRyxPQUFPO0FBQzNDLE1BQU0sRUFBRSxJQUFJLENBQ1IsQ0FBQztFQUNIO0VBRUEsSUFBSW9CLFlBQVksR0FBRyxDQUFDLEVBQUU7SUFDcEIsTUFBTXFGLFdBQVcsR0FDZjFLLE9BQU8sQ0FBQzJLLGNBQWMsRUFDbEI3RCxHQUFHLENBQUM4RCxDQUFDLElBQUlBLENBQUMsQ0FBQ0MsT0FBTyxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUN4QzVCLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLO0lBQ3hCLE1BQU1iLFNBQU8sR0FBR0wsV0FBVyxDQUFDZixNQUFNLEtBQUssQ0FBQztJQUN4QyxNQUFNa0IsTUFBSSxHQUFHMUgsYUFBYSxHQUN0QjRILFNBQU8sR0FDTCxVQUFVLEdBQ1YsVUFBVSxHQUNaQSxTQUFPLEdBQ0wsU0FBUyxHQUNULFNBQVM7SUFDZixJQUFJLENBQUNBLFNBQU8sRUFBRTtNQUNaTCxXQUFXLENBQUNsQixJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDbkQ7SUFDQWtCLFdBQVcsQ0FBQ2xCLElBQUksQ0FDZCxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSztBQUNyQixRQUFRLENBQUNxQixNQUFJLENBQUMsQ0FBQyxDQUFDd0MsV0FBVztBQUMzQixRQUFRLENBQUNyRixZQUFZLEdBQUcsQ0FBQyxJQUNmO0FBQ1YsWUFBWSxDQUFDLEdBQUc7QUFDaEIsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQ0EsWUFBWSxDQUFDLEVBQUUsSUFBSSxDQUFDO0FBQzVDLFVBQVUsR0FDRDtBQUNULE1BQU0sRUFBRSxJQUFJLENBQ1IsQ0FBQztFQUNIO0VBRUEsSUFBSWhHLHNCQUFzQixDQUFDLENBQUMsSUFBSWlHLFNBQVMsR0FBRyxDQUFDLEVBQUU7SUFDN0MsTUFBTThDLFNBQU8sR0FBR0wsV0FBVyxDQUFDZixNQUFNLEtBQUssQ0FBQztJQUN4QyxNQUFNa0IsTUFBSSxHQUFHMUgsYUFBYSxHQUN0QjRILFNBQU8sR0FDTCxTQUFTLEdBQ1QsU0FBUyxHQUNYQSxTQUFPLEdBQ0wsS0FBSyxHQUNMLEtBQUs7SUFDWCxJQUFJLENBQUNBLFNBQU8sRUFBRTtNQUNaTCxXQUFXLENBQUNsQixJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDcEQ7SUFDQWtCLFdBQVcsQ0FBQ2xCLElBQUksQ0FDZCxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTTtBQUN0QixRQUFRLENBQUNxQixNQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQzVDLFNBQVMsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRztBQUNyRCxRQUFRLENBQUNBLFNBQVMsS0FBSyxDQUFDLEdBQUcsU0FBUyxHQUFHLFVBQVU7QUFDakQsTUFBTSxFQUFFLElBQUksQ0FDUixDQUFDO0VBQ0g7O0VBRUE7RUFDQSxNQUFNd0Ysa0JBQWtCLEdBQUcvQyxXQUFXLENBQUNmLE1BQU0sR0FBRyxDQUFDO0VBQ2pELE1BQU0rRCxRQUFRLEVBQUUzTSxLQUFLLENBQUNzRixTQUFTLEVBQUUsR0FBRyxFQUFFO0VBRXRDLElBQUlTLGVBQWUsR0FBRyxDQUFDLEVBQUU7SUFDdkIsTUFBTWlFLFNBQU8sR0FBRyxDQUFDMEMsa0JBQWtCLElBQUlDLFFBQVEsQ0FBQy9ELE1BQU0sS0FBSyxDQUFDO0lBQzVELE1BQU1rQixNQUFJLEdBQUcxSCxhQUFhLEdBQ3RCNEgsU0FBTyxHQUNMLFdBQVcsR0FDWCxXQUFXLEdBQ2JBLFNBQU8sR0FDTCxVQUFVLEdBQ1YsVUFBVTtJQUNoQixJQUFJLENBQUNBLFNBQU8sRUFBRTtNQUNaMkMsUUFBUSxDQUFDbEUsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQy9DO0lBQ0FrRSxRQUFRLENBQUNsRSxJQUFJLENBQ1gsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVU7QUFDMUIsUUFBUSxDQUFDcUIsTUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMvRCxlQUFlLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHO0FBQ3RELFFBQVEsQ0FBQ0EsZUFBZSxLQUFLLENBQUMsR0FBRyxRQUFRLEdBQUcsVUFBVTtBQUN0RCxNQUFNLEVBQUUsSUFBSSxDQUNSLENBQUM7RUFDSDtFQUVBLElBQUlELGlCQUFpQixHQUFHLENBQUMsRUFBRTtJQUN6QixNQUFNa0UsU0FBTyxHQUFHLENBQUMwQyxrQkFBa0IsSUFBSUMsUUFBUSxDQUFDL0QsTUFBTSxLQUFLLENBQUM7SUFDNUQsTUFBTWtCLE1BQUksR0FBRzFILGFBQWEsR0FDdEI0SCxTQUFPLEdBQ0wsV0FBVyxHQUNYLFdBQVcsR0FDYkEsU0FBTyxHQUNMLFVBQVUsR0FDVixVQUFVO0lBQ2hCLElBQUksQ0FBQ0EsU0FBTyxFQUFFO01BQ1oyQyxRQUFRLENBQUNsRSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDL0M7SUFDQWtFLFFBQVEsQ0FBQ2xFLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUMsR0FBR3FCLE1BQUksV0FBVyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7RUFDbkU7RUFFQSxJQUFJOUQsZ0JBQWdCLEdBQUcsQ0FBQyxFQUFFO0lBQ3hCLE1BQU1nRSxTQUFPLEdBQUcsQ0FBQzBDLGtCQUFrQixJQUFJQyxRQUFRLENBQUMvRCxNQUFNLEtBQUssQ0FBQztJQUM1RCxNQUFNa0IsTUFBSSxHQUFHMUgsYUFBYSxHQUN0QjRILFNBQU8sR0FDTCxTQUFTLEdBQ1QsU0FBUyxHQUNYQSxTQUFPLEdBQ0wsT0FBTyxHQUNQLE9BQU87SUFDYixJQUFJLENBQUNBLFNBQU8sRUFBRTtNQUNaMkMsUUFBUSxDQUFDbEUsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQy9DO0lBQ0FrRSxRQUFRLENBQUNsRSxJQUFJLENBQ1gsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVc7QUFDM0IsUUFBUSxDQUFDcUIsTUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM5RCxnQkFBZ0IsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUc7QUFDdkQsUUFBUSxDQUFDQSxnQkFBZ0IsS0FBSyxDQUFDLEdBQUcsUUFBUSxHQUFHLFVBQVU7QUFDdkQsTUFBTSxFQUFFLElBQUksQ0FDUixDQUFDO0VBQ0g7RUFFQSxPQUNFLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUNyRCxFQUFFLENBQUM7QUFDbEUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsS0FBSztBQUM5QixRQUFRLENBQUNQLGFBQWEsR0FDWixDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDZ0UsUUFBUSxDQUFDLEdBQUcsR0FFL0QsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQ2xCO0FBQ1QsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDaEUsYUFBYSxDQUFDO0FBQ3ZDLFVBQVUsQ0FBQ3VILFdBQVc7QUFDdEIsVUFBVSxDQUFDZ0QsUUFBUTtBQUNuQixVQUFVLENBQUM3TSxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQ2YwQixnQkFBZ0IsQ0FBQyxDQUFDb0wsaUJBQWlCLENBQUM7VUFDbENoTCxPQUFPO1VBQ1BRLGFBQWE7VUFDYnlLLGlCQUFpQixFQUFFSCxrQkFBa0IsSUFBSUMsUUFBUSxDQUFDL0QsTUFBTSxHQUFHO1FBQzdELENBQUMsQ0FBQyxHQUNGLElBQUk7QUFDbEIsVUFBVSxDQUFDeEcsYUFBYSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhO0FBQ3pFLFFBQVEsRUFBRSxJQUFJO0FBQ2QsTUFBTSxFQUFFLEdBQUc7QUFDWCxNQUFNLENBQUNBLGFBQWEsSUFBSWtHLGFBQWEsS0FBS2xFLFNBQVM7SUFDM0M7SUFDQTtJQUNBO0lBQ0EsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLEtBQUs7QUFDaEMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkMsWUFBWSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxJQUFJO0FBQzFDLFVBQVUsRUFBRSxHQUFHO0FBQ2YsVUFBVSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsRCxZQUFZLENBQUNrRSxhQUFhLENBQUN3RSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUNwRSxHQUFHLENBQUMsQ0FBQ3FFLElBQUksRUFBRUMsQ0FBQyxFQUFFQyxHQUFHLEtBQzFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVFELENBQUMsRUFBRSxDQUFDLENBQUMsUUFBUTtBQUM5QyxnQkFBZ0IsQ0FBQ0QsSUFBSTtBQUNyQixnQkFBZ0IsQ0FBQ0MsQ0FBQyxLQUFLQyxHQUFHLENBQUNyRSxNQUFNLEdBQUcsQ0FBQyxJQUFJUyxtQkFBbUI7QUFDNUQsY0FBYyxFQUFFLElBQUksQ0FDUCxDQUFDO0FBQ2QsVUFBVSxFQUFFLEdBQUc7QUFDZixRQUFRLEVBQUUsR0FBRyxDQUNOO0FBQ1AsTUFBTSxDQUFDekgsT0FBTyxDQUFDa0gsV0FBVyxLQUFLMUUsU0FBUyxJQUFJeEMsT0FBTyxDQUFDa0gsV0FBVyxHQUFHLENBQUMsSUFDM0QsQ0FBQyxJQUFJLENBQUMsUUFBUTtBQUN0QixVQUFVLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQ2xILE9BQU8sQ0FBQ2lILFNBQVMsQ0FBQyxXQUFXLENBQUMsR0FBRztBQUN6RCxVQUFVLENBQUNqSCxPQUFPLENBQUNpSCxTQUFTLEtBQUssQ0FBQyxHQUFHLE1BQU0sR0FBRyxPQUFPLENBQUM7QUFDdEQsVUFBVSxDQUFDN0gsa0JBQWtCLENBQUNZLE9BQU8sQ0FBQ2tILFdBQVcsQ0FBQyxDQUFDO0FBQ25ELFFBQVEsRUFBRSxJQUFJLENBQ1A7QUFDUCxJQUFJLEVBQUUsR0FBRyxDQUFDO0FBRVYiLCJpZ25vcmVMaXN0IjpbXX0=
src/components/messages/ShutdownMessage.tsx ADDED
@@ -0,0 +1,132 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { c as _c } from "react/compiler-runtime";
2
+ import * as React from 'react';
3
+ import { Box, Text } from '../../ink.js';
4
+ import { isShutdownApproved, isShutdownRejected, isShutdownRequest, type ShutdownRejectedMessage, type ShutdownRequestMessage } from '../../utils/teammateMailbox.js';
5
+ type ShutdownRequestProps = {
6
+ request: ShutdownRequestMessage;
7
+ };
8
+
9
+ /**
10
+ * Renders a shutdown request with a warning-colored border.
11
+ */
12
+ export function ShutdownRequestDisplay(t0) {
13
+ const $ = _c(7);
14
+ const {
15
+ request
16
+ } = t0;
17
+ let t1;
18
+ if ($[0] !== request.from) {
19
+ t1 = <Box marginBottom={1}><Text color="warning" bold={true}>Shutdown request from {request.from}</Text></Box>;
20
+ $[0] = request.from;
21
+ $[1] = t1;
22
+ } else {
23
+ t1 = $[1];
24
+ }
25
+ let t2;
26
+ if ($[2] !== request.reason) {
27
+ t2 = request.reason && <Box><Text>Reason: {request.reason}</Text></Box>;
28
+ $[2] = request.reason;
29
+ $[3] = t2;
30
+ } else {
31
+ t2 = $[3];
32
+ }
33
+ let t3;
34
+ if ($[4] !== t1 || $[5] !== t2) {
35
+ t3 = <Box flexDirection="column" marginY={1}><Box borderStyle="round" borderColor="warning" flexDirection="column" paddingX={1} paddingY={1}>{t1}{t2}</Box></Box>;
36
+ $[4] = t1;
37
+ $[5] = t2;
38
+ $[6] = t3;
39
+ } else {
40
+ t3 = $[6];
41
+ }
42
+ return t3;
43
+ }
44
+ type ShutdownRejectedProps = {
45
+ response: ShutdownRejectedMessage;
46
+ };
47
+
48
+ /**
49
+ * Renders a shutdown rejected message with a subtle (grey) border.
50
+ */
51
+ export function ShutdownRejectedDisplay(t0) {
52
+ const $ = _c(8);
53
+ const {
54
+ response
55
+ } = t0;
56
+ let t1;
57
+ if ($[0] !== response.from) {
58
+ t1 = <Text color="subtle" bold={true}>Shutdown rejected by {response.from}</Text>;
59
+ $[0] = response.from;
60
+ $[1] = t1;
61
+ } else {
62
+ t1 = $[1];
63
+ }
64
+ let t2;
65
+ if ($[2] !== response.reason) {
66
+ t2 = <Box marginTop={1} borderStyle="dashed" borderColor="subtle" borderLeft={false} borderRight={false} paddingX={1}><Text>Reason: {response.reason}</Text></Box>;
67
+ $[2] = response.reason;
68
+ $[3] = t2;
69
+ } else {
70
+ t2 = $[3];
71
+ }
72
+ let t3;
73
+ if ($[4] === Symbol.for("react.memo_cache_sentinel")) {
74
+ t3 = <Box marginTop={1}><Text dimColor={true}>Teammate is continuing to work. You may request shutdown again later.</Text></Box>;
75
+ $[4] = t3;
76
+ } else {
77
+ t3 = $[4];
78
+ }
79
+ let t4;
80
+ if ($[5] !== t1 || $[6] !== t2) {
81
+ t4 = <Box flexDirection="column" marginY={1}><Box borderStyle="round" borderColor="subtle" flexDirection="column" paddingX={1} paddingY={1}>{t1}{t2}{t3}</Box></Box>;
82
+ $[5] = t1;
83
+ $[6] = t2;
84
+ $[7] = t4;
85
+ } else {
86
+ t4 = $[7];
87
+ }
88
+ return t4;
89
+ }
90
+
91
+ /**
92
+ * Try to parse and render a shutdown message from raw content.
93
+ * Returns the rendered component if it's a shutdown message, null otherwise.
94
+ */
95
+ export function tryRenderShutdownMessage(content: string): React.ReactNode | null {
96
+ const request = isShutdownRequest(content);
97
+ if (request) {
98
+ return <ShutdownRequestDisplay request={request} />;
99
+ }
100
+
101
+ // Shutdown approved is handled inline by the caller — skip it here
102
+ if (isShutdownApproved(content)) {
103
+ return null;
104
+ }
105
+ const rejected = isShutdownRejected(content);
106
+ if (rejected) {
107
+ return <ShutdownRejectedDisplay response={rejected} />;
108
+ }
109
+ return null;
110
+ }
111
+
112
+ /**
113
+ * Get a brief summary text for a shutdown message.
114
+ * Used in places like the inbox queue where we want a short description.
115
+ * Returns null if the content is not a shutdown message.
116
+ */
117
+ export function getShutdownMessageSummary(content: string): string | null {
118
+ const request = isShutdownRequest(content);
119
+ if (request) {
120
+ return `[Shutdown Request from ${request.from}]${request.reason ? ` ${request.reason}` : ''}`;
121
+ }
122
+ const approved = isShutdownApproved(content);
123
+ if (approved) {
124
+ return `[Shutdown Approved] ${approved.from} is now exiting`;
125
+ }
126
+ const rejected = isShutdownRejected(content);
127
+ if (rejected) {
128
+ return `[Shutdown Rejected] ${rejected.from}: ${rejected.reason}`;
129
+ }
130
+ return null;
131
+ }
132
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsIkJveCIsIlRleHQiLCJpc1NodXRkb3duQXBwcm92ZWQiLCJpc1NodXRkb3duUmVqZWN0ZWQiLCJpc1NodXRkb3duUmVxdWVzdCIsIlNodXRkb3duUmVqZWN0ZWRNZXNzYWdlIiwiU2h1dGRvd25SZXF1ZXN0TWVzc2FnZSIsIlNodXRkb3duUmVxdWVzdFByb3BzIiwicmVxdWVzdCIsIlNodXRkb3duUmVxdWVzdERpc3BsYXkiLCJ0MCIsIiQiLCJfYyIsInQxIiwiZnJvbSIsInQyIiwicmVhc29uIiwidDMiLCJTaHV0ZG93blJlamVjdGVkUHJvcHMiLCJyZXNwb25zZSIsIlNodXRkb3duUmVqZWN0ZWREaXNwbGF5IiwiU3ltYm9sIiwiZm9yIiwidDQiLCJ0cnlSZW5kZXJTaHV0ZG93bk1lc3NhZ2UiLCJjb250ZW50IiwiUmVhY3ROb2RlIiwicmVqZWN0ZWQiLCJnZXRTaHV0ZG93bk1lc3NhZ2VTdW1tYXJ5IiwiYXBwcm92ZWQiXSwic291cmNlcyI6WyJTaHV0ZG93bk1lc3NhZ2UudHN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgQm94LCBUZXh0IH0gZnJvbSAnLi4vLi4vaW5rLmpzJ1xuaW1wb3J0IHtcbiAgaXNTaHV0ZG93bkFwcHJvdmVkLFxuICBpc1NodXRkb3duUmVqZWN0ZWQsXG4gIGlzU2h1dGRvd25SZXF1ZXN0LFxuICB0eXBlIFNodXRkb3duUmVqZWN0ZWRNZXNzYWdlLFxuICB0eXBlIFNodXRkb3duUmVxdWVzdE1lc3NhZ2UsXG59IGZyb20gJy4uLy4uL3V0aWxzL3RlYW1tYXRlTWFpbGJveC5qcydcblxudHlwZSBTaHV0ZG93blJlcXVlc3RQcm9wcyA9IHtcbiAgcmVxdWVzdDogU2h1dGRvd25SZXF1ZXN0TWVzc2FnZVxufVxuXG4vKipcbiAqIFJlbmRlcnMgYSBzaHV0ZG93biByZXF1ZXN0IHdpdGggYSB3YXJuaW5nLWNvbG9yZWQgYm9yZGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gU2h1dGRvd25SZXF1ZXN0RGlzcGxheSh7XG4gIHJlcXVlc3QsXG59OiBTaHV0ZG93blJlcXVlc3RQcm9wcyk6IFJlYWN0LlJlYWN0Tm9kZSB7XG4gIHJldHVybiAoXG4gICAgPEJveCBmbGV4RGlyZWN0aW9uPVwiY29sdW1uXCIgbWFyZ2luWT17MX0+XG4gICAgICA8Qm94XG4gICAgICAgIGJvcmRlclN0eWxlPVwicm91bmRcIlxuICAgICAgICBib3JkZXJDb2xvcj1cIndhcm5pbmdcIlxuICAgICAgICBmbGV4RGlyZWN0aW9uPVwiY29sdW1uXCJcbiAgICAgICAgcGFkZGluZ1g9ezF9XG4gICAgICAgIHBhZGRpbmdZPXsxfVxuICAgICAgPlxuICAgICAgICA8Qm94IG1hcmdpbkJvdHRvbT17MX0+XG4gICAgICAgICAgPFRleHQgY29sb3I9XCJ3YXJuaW5nXCIgYm9sZD5cbiAgICAgICAgICAgIFNodXRkb3duIHJlcXVlc3QgZnJvbSB7cmVxdWVzdC5mcm9tfVxuICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgPC9Cb3g+XG4gICAgICAgIHtyZXF1ZXN0LnJlYXNvbiAmJiAoXG4gICAgICAgICAgPEJveD5cbiAgICAgICAgICAgIDxUZXh0PlJlYXNvbjoge3JlcXVlc3QucmVhc29ufTwvVGV4dD5cbiAgICAgICAgICA8L0JveD5cbiAgICAgICAgKX1cbiAgICAgIDwvQm94PlxuICAgIDwvQm94PlxuICApXG59XG5cbnR5cGUgU2h1dGRvd25SZWplY3RlZFByb3BzID0ge1xuICByZXNwb25zZTogU2h1dGRvd25SZWplY3RlZE1lc3NhZ2Vcbn1cblxuLyoqXG4gKiBSZW5kZXJzIGEgc2h1dGRvd24gcmVqZWN0ZWQgbWVzc2FnZSB3aXRoIGEgc3VidGxlIChncmV5KSBib3JkZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBTaHV0ZG93blJlamVjdGVkRGlzcGxheSh7XG4gIHJlc3BvbnNlLFxufTogU2h1dGRvd25SZWplY3RlZFByb3BzKTogUmVhY3QuUmVhY3ROb2RlIHtcbiAgcmV0dXJuIChcbiAgICA8Qm94IGZsZXhEaXJlY3Rpb249XCJjb2x1bW5cIiBtYXJnaW5ZPXsxfT5cbiAgICAgIDxCb3hcbiAgICAgICAgYm9yZGVyU3R5bGU9XCJyb3VuZFwiXG4gICAgICAgIGJvcmRlckNvbG9yPVwic3VidGxlXCJcbiAgICAgICAgZmxleERpcmVjdGlvbj1cImNvbHVtblwiXG4gICAgICAgIHBhZGRpbmdYPXsxfVxuICAgICAgICBwYWRkaW5nWT17MX1cbiAgICAgID5cbiAgICAgICAgPFRleHQgY29sb3I9XCJzdWJ0bGVcIiBib2xkPlxuICAgICAgICAgIFNodXRkb3duIHJlamVjdGVkIGJ5IHtyZXNwb25zZS5mcm9tfVxuICAgICAgICA8L1RleHQ+XG4gICAgICAgIDxCb3hcbiAgICAgICAgICBtYXJnaW5Ub3A9ezF9XG4gICAgICAgICAgYm9yZGVyU3R5bGU9XCJkYXNoZWRcIlxuICAgICAgICAgIGJvcmRlckNvbG9yPVwic3VidGxlXCJcbiAgICAgICAgICBib3JkZXJMZWZ0PXtmYWxzZX1cbiAgICAgICAgICBib3JkZXJSaWdodD17ZmFsc2V9XG4gICAgICAgICAgcGFkZGluZ1g9ezF9XG4gICAgICAgID5cbiAgICAgICAgICA8VGV4dD5SZWFzb246IHtyZXNwb25zZS5yZWFzb259PC9UZXh0PlxuICAgICAgICA8L0JveD5cbiAgICAgICAgPEJveCBtYXJnaW5Ub3A9ezF9PlxuICAgICAgICAgIDxUZXh0IGRpbUNvbG9yPlxuICAgICAgICAgICAgVGVhbW1hdGUgaXMgY29udGludWluZyB0byB3b3JrLiBZb3UgbWF5IHJlcXVlc3Qgc2h1dGRvd24gYWdhaW5cbiAgICAgICAgICAgIGxhdGVyLlxuICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgPC9Cb3g+XG4gICAgICA8L0JveD5cbiAgICA8L0JveD5cbiAgKVxufVxuXG4vKipcbiAqIFRyeSB0byBwYXJzZSBhbmQgcmVuZGVyIGEgc2h1dGRvd24gbWVzc2FnZSBmcm9tIHJhdyBjb250ZW50LlxuICogUmV0dXJucyB0aGUgcmVuZGVyZWQgY29tcG9uZW50IGlmIGl0J3MgYSBzaHV0ZG93biBtZXNzYWdlLCBudWxsIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyeVJlbmRlclNodXRkb3duTWVzc2FnZShcbiAgY29udGVudDogc3RyaW5nLFxuKTogUmVhY3QuUmVhY3ROb2RlIHwgbnVsbCB7XG4gIGNvbnN0IHJlcXVlc3QgPSBpc1NodXRkb3duUmVxdWVzdChjb250ZW50KVxuICBpZiAocmVxdWVzdCkge1xuICAgIHJldHVybiA8U2h1dGRvd25SZXF1ZXN0RGlzcGxheSByZXF1ZXN0PXtyZXF1ZXN0fSAvPlxuICB9XG5cbiAgLy8gU2h1dGRvd24gYXBwcm92ZWQgaXMgaGFuZGxlZCBpbmxpbmUgYnkgdGhlIGNhbGxlciDigJQgc2tpcCBpdCBoZXJlXG4gIGlmIChpc1NodXRkb3duQXBwcm92ZWQoY29udGVudCkpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgY29uc3QgcmVqZWN0ZWQgPSBpc1NodXRkb3duUmVqZWN0ZWQoY29udGVudClcbiAgaWYgKHJlamVjdGVkKSB7XG4gICAgcmV0dXJuIDxTaHV0ZG93blJlamVjdGVkRGlzcGxheSByZXNwb25zZT17cmVqZWN0ZWR9IC8+XG4gIH1cblxuICByZXR1cm4gbnVsbFxufVxuXG4vKipcbiAqIEdldCBhIGJyaWVmIHN1bW1hcnkgdGV4dCBmb3IgYSBzaHV0ZG93biBtZXNzYWdlLlxuICogVXNlZCBpbiBwbGFjZXMgbGlrZSB0aGUgaW5ib3ggcXVldWUgd2hlcmUgd2Ugd2FudCBhIHNob3J0IGRlc2NyaXB0aW9uLlxuICogUmV0dXJucyBudWxsIGlmIHRoZSBjb250ZW50IGlzIG5vdCBhIHNodXRkb3duIG1lc3NhZ2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTaHV0ZG93bk1lc3NhZ2VTdW1tYXJ5KGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCByZXF1ZXN0ID0gaXNTaHV0ZG93blJlcXVlc3QoY29udGVudClcbiAgaWYgKHJlcXVlc3QpIHtcbiAgICByZXR1cm4gYFtTaHV0ZG93biBSZXF1ZXN0IGZyb20gJHtyZXF1ZXN0LmZyb219XSR7cmVxdWVzdC5yZWFzb24gPyBgICR7cmVxdWVzdC5yZWFzb259YCA6ICcnfWBcbiAgfVxuXG4gIGNvbnN0IGFwcHJvdmVkID0gaXNTaHV0ZG93bkFwcHJvdmVkKGNvbnRlbnQpXG4gIGlmIChhcHByb3ZlZCkge1xuICAgIHJldHVybiBgW1NodXRkb3duIEFwcHJvdmVkXSAke2FwcHJvdmVkLmZyb219IGlzIG5vdyBleGl0aW5nYFxuICB9XG5cbiAgY29uc3QgcmVqZWN0ZWQgPSBpc1NodXRkb3duUmVqZWN0ZWQoY29udGVudClcbiAgaWYgKHJlamVjdGVkKSB7XG4gICAgcmV0dXJuIGBbU2h1dGRvd24gUmVqZWN0ZWRdICR7cmVqZWN0ZWQuZnJvbX06ICR7cmVqZWN0ZWQucmVhc29ufWBcbiAgfVxuXG4gIHJldHVybiBudWxsXG59XG4iXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEtBQUtBLEtBQUssTUFBTSxPQUFPO0FBQzlCLFNBQVNDLEdBQUcsRUFBRUMsSUFBSSxRQUFRLGNBQWM7QUFDeEMsU0FDRUMsa0JBQWtCLEVBQ2xCQyxrQkFBa0IsRUFDbEJDLGlCQUFpQixFQUNqQixLQUFLQyx1QkFBdUIsRUFDNUIsS0FBS0Msc0JBQXNCLFFBQ3RCLGdDQUFnQztBQUV2QyxLQUFLQyxvQkFBb0IsR0FBRztFQUMxQkMsT0FBTyxFQUFFRixzQkFBc0I7QUFDakMsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQSxPQUFPLFNBQUFHLHVCQUFBQyxFQUFBO0VBQUEsTUFBQUMsQ0FBQSxHQUFBQyxFQUFBO0VBQWdDO0lBQUFKO0VBQUEsSUFBQUUsRUFFaEI7RUFBQSxJQUFBRyxFQUFBO0VBQUEsSUFBQUYsQ0FBQSxRQUFBSCxPQUFBLENBQUFNLElBQUE7SUFVZkQsRUFBQSxJQUFDLEdBQUcsQ0FBZSxZQUFDLENBQUQsR0FBQyxDQUNsQixDQUFDLElBQUksQ0FBTyxLQUFTLENBQVQsU0FBUyxDQUFD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
src/components/messages/TaskAssignmentMessage.tsx ADDED
@@ -0,0 +1,76 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { c as _c } from "react/compiler-runtime";
2
+ import * as React from 'react';
3
+ import { Box, Text } from '../../ink.js';
4
+ import { isTaskAssignment, type TaskAssignmentMessage } from '../../utils/teammateMailbox.js';
5
+ type Props = {
6
+ assignment: TaskAssignmentMessage;
7
+ };
8
+
9
+ /**
10
+ * Renders a task assignment with a cyan border (team-related color).
11
+ */
12
+ export function TaskAssignmentDisplay(t0) {
13
+ const $ = _c(11);
14
+ const {
15
+ assignment
16
+ } = t0;
17
+ let t1;
18
+ if ($[0] !== assignment.assignedBy || $[1] !== assignment.taskId) {
19
+ t1 = <Box marginBottom={1}><Text color="cyan_FOR_SUBAGENTS_ONLY" bold={true}>Task #{assignment.taskId} assigned by {assignment.assignedBy}</Text></Box>;
20
+ $[0] = assignment.assignedBy;
21
+ $[1] = assignment.taskId;
22
+ $[2] = t1;
23
+ } else {
24
+ t1 = $[2];
25
+ }
26
+ let t2;
27
+ if ($[3] !== assignment.subject) {
28
+ t2 = <Box><Text bold={true}>{assignment.subject}</Text></Box>;
29
+ $[3] = assignment.subject;
30
+ $[4] = t2;
31
+ } else {
32
+ t2 = $[4];
33
+ }
34
+ let t3;
35
+ if ($[5] !== assignment.description) {
36
+ t3 = assignment.description && <Box marginTop={1}><Text dimColor={true}>{assignment.description}</Text></Box>;
37
+ $[5] = assignment.description;
38
+ $[6] = t3;
39
+ } else {
40
+ t3 = $[6];
41
+ }
42
+ let t4;
43
+ if ($[7] !== t1 || $[8] !== t2 || $[9] !== t3) {
44
+ t4 = <Box flexDirection="column" marginY={1}><Box borderStyle="round" borderColor="cyan_FOR_SUBAGENTS_ONLY" flexDirection="column" paddingX={1} paddingY={1}>{t1}{t2}{t3}</Box></Box>;
45
+ $[7] = t1;
46
+ $[8] = t2;
47
+ $[9] = t3;
48
+ $[10] = t4;
49
+ } else {
50
+ t4 = $[10];
51
+ }
52
+ return t4;
53
+ }
54
+
55
+ /**
56
+ * Try to parse and render a task assignment message from raw content.
57
+ */
58
+ export function tryRenderTaskAssignmentMessage(content: string): React.ReactNode | null {
59
+ const assignment = isTaskAssignment(content);
60
+ if (assignment) {
61
+ return <TaskAssignmentDisplay assignment={assignment} />;
62
+ }
63
+ return null;
64
+ }
65
+
66
+ /**
67
+ * Get a brief summary text for a task assignment message.
68
+ */
69
+ export function getTaskAssignmentSummary(content: string): string | null {
70
+ const assignment = isTaskAssignment(content);
71
+ if (assignment) {
72
+ return `[Task Assigned] #${assignment.taskId} - ${assignment.subject}`;
73
+ }
74
+ return null;
75
+ }
76
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsIkJveCIsIlRleHQiLCJpc1Rhc2tBc3NpZ25tZW50IiwiVGFza0Fzc2lnbm1lbnRNZXNzYWdlIiwiUHJvcHMiLCJhc3NpZ25tZW50IiwiVGFza0Fzc2lnbm1lbnREaXNwbGF5IiwidDAiLCIkIiwiX2MiLCJ0MSIsImFzc2lnbmVkQnkiLCJ0YXNrSWQiLCJ0MiIsInN1YmplY3QiLCJ0MyIsImRlc2NyaXB0aW9uIiwidDQiLCJ0cnlSZW5kZXJUYXNrQXNzaWdubWVudE1lc3NhZ2UiLCJjb250ZW50IiwiUmVhY3ROb2RlIiwiZ2V0VGFza0Fzc2lnbm1lbnRTdW1tYXJ5Il0sInNvdXJjZXMiOlsiVGFza0Fzc2lnbm1lbnRNZXNzYWdlLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7IEJveCwgVGV4dCB9IGZyb20gJy4uLy4uL2luay5qcydcbmltcG9ydCB7XG4gIGlzVGFza0Fzc2lnbm1lbnQsXG4gIHR5cGUgVGFza0Fzc2lnbm1lbnRNZXNzYWdlLFxufSBmcm9tICcuLi8uLi91dGlscy90ZWFtbWF0ZU1haWxib3guanMnXG5cbnR5cGUgUHJvcHMgPSB7XG4gIGFzc2lnbm1lbnQ6IFRhc2tBc3NpZ25tZW50TWVzc2FnZVxufVxuXG4vKipcbiAqIFJlbmRlcnMgYSB0YXNrIGFzc2lnbm1lbnQgd2l0aCBhIGN5YW4gYm9yZGVyICh0ZWFtLXJlbGF0ZWQgY29sb3IpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gVGFza0Fzc2lnbm1lbnREaXNwbGF5KHsgYXNzaWdubWVudCB9OiBQcm9wcyk6IFJlYWN0LlJlYWN0Tm9kZSB7XG4gIHJldHVybiAoXG4gICAgPEJveCBmbGV4RGlyZWN0aW9uPVwiY29sdW1uXCIgbWFyZ2luWT17MX0+XG4gICAgICA8Qm94XG4gICAgICAgIGJvcmRlclN0eWxlPVwicm91bmRcIlxuICAgICAgICBib3JkZXJDb2xvcj1cImN5YW5fRk9SX1NVQkFHRU5UU19PTkxZXCJcbiAgICAgICAgZmxleERpcmVjdGlvbj1cImNvbHVtblwiXG4gICAgICAgIHBhZGRpbmdYPXsxfVxuICAgICAgICBwYWRkaW5nWT17MX1cbiAgICAgID5cbiAgICAgICAgPEJveCBtYXJnaW5Cb3R0b209ezF9PlxuICAgICAgICAgIDxUZXh0IGNvbG9yPVwiY3lhbl9GT1JfU1VCQUdFTlRTX09OTFlcIiBib2xkPlxuICAgICAgICAgICAgVGFzayAje2Fzc2lnbm1lbnQudGFza0lkfSBhc3NpZ25lZCBieSB7YXNzaWdubWVudC5hc3NpZ25lZEJ5fVxuICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgPC9Cb3g+XG4gICAgICAgIDxCb3g+XG4gICAgICAgICAgPFRleHQgYm9sZD57YXNzaWdubWVudC5zdWJqZWN0fTwvVGV4dD5cbiAgICAgICAgPC9Cb3g+XG4gICAgICAgIHthc3NpZ25tZW50LmRlc2NyaXB0aW9uICYmIChcbiAgICAgICAgICA8Qm94IG1hcmdpblRvcD17MX0+XG4gICAgICAgICAgICA8VGV4dCBkaW1Db2xvcj57YXNzaWdubWVudC5kZXNjcmlwdGlvbn08L1RleHQ+XG4gICAgICAgICAgPC9Cb3g+XG4gICAgICAgICl9XG4gICAgICA8L0JveD5cbiAgICA8L0JveD5cbiAgKVxufVxuXG4vKipcbiAqIFRyeSB0byBwYXJzZSBhbmQgcmVuZGVyIGEgdGFzayBhc3NpZ25tZW50IG1lc3NhZ2UgZnJvbSByYXcgY29udGVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyeVJlbmRlclRhc2tBc3NpZ25tZW50TWVzc2FnZShcbiAgY29udGVudDogc3RyaW5nLFxuKTogUmVhY3QuUmVhY3ROb2RlIHwgbnVsbCB7XG4gIGNvbnN0IGFzc2lnbm1lbnQgPSBpc1Rhc2tBc3NpZ25tZW50KGNvbnRlbnQpXG4gIGlmIChhc3NpZ25tZW50KSB7XG4gICAgcmV0dXJuIDxUYXNrQXNzaWdubWVudERpc3BsYXkgYXNzaWdubWVudD17YXNzaWdubWVudH0gLz5cbiAgfVxuICByZXR1cm4gbnVsbFxufVxuXG4vKipcbiAqIEdldCBhIGJyaWVmIHN1bW1hcnkgdGV4dCBmb3IgYSB0YXNrIGFzc2lnbm1lbnQgbWVzc2FnZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFRhc2tBc3NpZ25tZW50U3VtbWFyeShjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3QgYXNzaWdubWVudCA9IGlzVGFza0Fzc2lnbm1lbnQoY29udGVudClcbiAgaWYgKGFzc2lnbm1lbnQpIHtcbiAgICByZXR1cm4gYFtUYXNrIEFzc2lnbmVkXSAjJHthc3NpZ25tZW50LnRhc2tJZH0gLSAke2Fzc2lnbm1lbnQuc3ViamVjdH1gXG4gIH1cbiAgcmV0dXJuIG51bGxcbn1cbiJdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sS0FBS0EsS0FBSyxNQUFNLE9BQU87QUFDOUIsU0FBU0MsR0FBRyxFQUFFQyxJQUFJLFFBQVEsY0FBYztBQUN4QyxTQUNFQyxnQkFBZ0IsRUFDaEIsS0FBS0MscUJBQXFCLFFBQ3JCLGdDQUFnQztBQUV2QyxLQUFLQyxLQUFLLEdBQUc7RUFDWEMsVUFBVSxFQUFFRixxQkFBcUI7QUFDbkMsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQSxPQUFPLFNBQUFHLHNCQUFBQyxFQUFBO0VBQUEsTUFBQUMsQ0FBQSxHQUFBQyxFQUFBO0VBQStCO0lBQUFKO0VBQUEsSUFBQUUsRUFBcUI7RUFBQSxJQUFBRyxFQUFBO0VBQUEsSUFBQUYsQ0FBQSxRQUFBSCxVQUFBLENBQUFNLFVBQUEsSUFBQUgsQ0FBQSxRQUFBSCxVQUFBLENBQUFPLE1BQUE7SUFVbkRGLEVBQUEsSUFBQyxHQUFHLENBQWUsWUFBQyxDQUFELEdBQUMsQ0FDbEIsQ0FBQyxJQUFJLENBQU8sS0FBeUIsQ0FBekIseUJBQXlCLENBQUMsSUFBSSxDQUFKLEtBQUcsQ0FBQyxDQUFDLE1BQ2xDLENBQUFMLFVBQVUsQ0FBQU8sTUFBTSxDQUFFLGFBQWMsQ0FBQVAsVUFBVSxDQUFBTSxVQUFVLENBQzdELEVBRkMsSUFBSSxDQUdQLEVBSkMsR0FBRyxD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
src/components/messages/UserChannelMessage.tsx ADDED
@@ -0,0 +1,137 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { c as _c } from "react/compiler-runtime";
2
+ import type { TextBlockParam } from '@anthropic-ai/sdk/resources/index.mjs';
3
+ import * as React from 'react';
4
+ import { CHANNEL_ARROW } from '../../constants/figures.js';
5
+ import { CHANNEL_TAG } from '../../constants/xml.js';
6
+ import { Box, Text } from '../../ink.js';
7
+ import { truncateToWidth } from '../../utils/format.js';
8
+ type Props = {
9
+ addMargin: boolean;
10
+ param: TextBlockParam;
11
+ };
12
+
13
+ // <channel source="..." user="..." chat_id="...">content</channel>
14
+ // source is always first (wrapChannelMessage writes it), user is optional.
15
+ const CHANNEL_RE = new RegExp(`<${CHANNEL_TAG}\\s+source="([^"]+)"([^>]*)>\\n?([\\s\\S]*?)\\n?</${CHANNEL_TAG}>`);
16
+ const USER_ATTR_RE = /\buser="([^"]+)"/;
17
+
18
+ // Plugin-provided servers get names like plugin:slack-channel:slack via
19
+ // addPluginScopeToServers — show just the leaf. Matches the suffix-match
20
+ // logic in isServerInChannels.
21
+ function displayServerName(name: string): string {
22
+ const i = name.lastIndexOf(':');
23
+ return i === -1 ? name : name.slice(i + 1);
24
+ }
25
+ const TRUNCATE_AT = 60;
26
+ export function UserChannelMessage(t0) {
27
+ const $ = _c(29);
28
+ const {
29
+ addMargin,
30
+ param: t1
31
+ } = t0;
32
+ const {
33
+ text
34
+ } = t1;
35
+ let T0;
36
+ let T1;
37
+ let T2;
38
+ let t2;
39
+ let t3;
40
+ let t4;
41
+ let t5;
42
+ let t6;
43
+ let t7;
44
+ let truncated;
45
+ let user;
46
+ if ($[0] !== addMargin || $[1] !== text) {
47
+ t7 = Symbol.for("react.early_return_sentinel");
48
+ bb0: {
49
+ const m = CHANNEL_RE.exec(text);
50
+ if (!m) {
51
+ t7 = null;
52
+ break bb0;
53
+ }
54
+ const [, source, attrs, content] = m;
55
+ user = USER_ATTR_RE.exec(attrs ?? "")?.[1];
56
+ const body = (content ?? "").trim().replace(/\s+/g, " ");
57
+ truncated = truncateToWidth(body, TRUNCATE_AT);
58
+ T2 = Box;
59
+ t6 = addMargin ? 1 : 0;
60
+ T1 = Text;
61
+ if ($[13] === Symbol.for("react.memo_cache_sentinel")) {
62
+ t4 = <Text color="suggestion">{CHANNEL_ARROW}</Text>;
63
+ $[13] = t4;
64
+ } else {
65
+ t4 = $[13];
66
+ }
67
+ t5 = " ";
68
+ T0 = Text;
69
+ t2 = true;
70
+ t3 = displayServerName(source ?? "");
71
+ }
72
+ $[0] = addMargin;
73
+ $[1] = text;
74
+ $[2] = T0;
75
+ $[3] = T1;
76
+ $[4] = T2;
77
+ $[5] = t2;
78
+ $[6] = t3;
79
+ $[7] = t4;
80
+ $[8] = t5;
81
+ $[9] = t6;
82
+ $[10] = t7;
83
+ $[11] = truncated;
84
+ $[12] = user;
85
+ } else {
86
+ T0 = $[2];
87
+ T1 = $[3];
88
+ T2 = $[4];
89
+ t2 = $[5];
90
+ t3 = $[6];
91
+ t4 = $[7];
92
+ t5 = $[8];
93
+ t6 = $[9];
94
+ t7 = $[10];
95
+ truncated = $[11];
96
+ user = $[12];
97
+ }
98
+ if (t7 !== Symbol.for("react.early_return_sentinel")) {
99
+ return t7;
100
+ }
101
+ const t8 = user ? ` \u00b7 ${user}` : "";
102
+ let t9;
103
+ if ($[14] !== T0 || $[15] !== t2 || $[16] !== t3 || $[17] !== t8) {
104
+ t9 = <T0 dimColor={t2}>{t3}{t8}:</T0>;
105
+ $[14] = T0;
106
+ $[15] = t2;
107
+ $[16] = t3;
108
+ $[17] = t8;
109
+ $[18] = t9;
110
+ } else {
111
+ t9 = $[18];
112
+ }
113
+ let t10;
114
+ if ($[19] !== T1 || $[20] !== t4 || $[21] !== t5 || $[22] !== t9 || $[23] !== truncated) {
115
+ t10 = <T1>{t4}{t5}{t9}{" "}{truncated}</T1>;
116
+ $[19] = T1;
117
+ $[20] = t4;
118
+ $[21] = t5;
119
+ $[22] = t9;
120
+ $[23] = truncated;
121
+ $[24] = t10;
122
+ } else {
123
+ t10 = $[24];
124
+ }
125
+ let t11;
126
+ if ($[25] !== T2 || $[26] !== t10 || $[27] !== t6) {
127
+ t11 = <T2 marginTop={t6}>{t10}</T2>;
128
+ $[25] = T2;
129
+ $[26] = t10;
130
+ $[27] = t6;
131
+ $[28] = t11;
132
+ } else {
133
+ t11 = $[28];
134
+ }
135
+ return t11;
136
+ }
137
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJUZXh0QmxvY2tQYXJhbSIsIlJlYWN0IiwiQ0hBTk5FTF9BUlJPVyIsIkNIQU5ORUxfVEFHIiwiQm94IiwiVGV4dCIsInRydW5jYXRlVG9XaWR0aCIsIlByb3BzIiwiYWRkTWFyZ2luIiwicGFyYW0iLCJDSEFOTkVMX1JFIiwiUmVnRXhwIiwiVVNFUl9BVFRSX1JFIiwiZGlzcGxheVNlcnZlck5hbWUiLCJuYW1lIiwiaSIsImxhc3RJbmRleE9mIiwic2xpY2UiLCJUUlVOQ0FURV9BVCIsIlVzZXJDaGFubmVsTWVzc2FnZSIsInQwIiwiJCIsIl9jIiwidDEiLCJ0ZXh0IiwiVDAiLCJUMSIsIlQyIiwidDIiLCJ0MyIsInQ0IiwidDUiLCJ0NiIsInQ3IiwidHJ1bmNhdGVkIiwidXNlciIsIlN5bWJvbCIsImZvciIsImJiMCIsIm0iLCJleGVjIiwic291cmNlIiwiYXR0cnMiLCJjb250ZW50IiwiYm9keSIsInRyaW0iLCJyZXBsYWNlIiwidDgiLCJ0OSIsInQxMCIsInQxMSJdLCJzb3VyY2VzIjpbIlVzZXJDaGFubmVsTWVzc2FnZS50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBUZXh0QmxvY2tQYXJhbSB9IGZyb20gJ0BhbnRocm9waWMtYWkvc2RrL3Jlc291cmNlcy9pbmRleC5tanMnXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7IENIQU5ORUxfQVJST1cgfSBmcm9tICcuLi8uLi9jb25zdGFudHMvZmlndXJlcy5qcydcbmltcG9ydCB7IENIQU5ORUxfVEFHIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzL3htbC5qcydcbmltcG9ydCB7IEJveCwgVGV4dCB9IGZyb20gJy4uLy4uL2luay5qcydcbmltcG9ydCB7IHRydW5jYXRlVG9XaWR0aCB9IGZyb20gJy4uLy4uL3V0aWxzL2Zvcm1hdC5qcydcblxudHlwZSBQcm9wcyA9IHtcbiAgYWRkTWFyZ2luOiBib29sZWFuXG4gIHBhcmFtOiBUZXh0QmxvY2tQYXJhbVxufVxuXG4vLyA8Y2hhbm5lbCBzb3VyY2U9XCIuLi5cIiB1c2VyPVwiLi4uXCIgY2hhdF9pZD1cIi4uLlwiPmNvbnRlbnQ8L2NoYW5uZWw+XG4vLyBzb3VyY2UgaXMgYWx3YXlzIGZpcnN0ICh3cmFwQ2hhbm5lbE1lc3NhZ2Ugd3JpdGVzIGl0KSwgdXNlciBpcyBvcHRpb25hbC5cbmNvbnN0IENIQU5ORUxfUkUgPSBuZXcgUmVnRXhwKFxuICBgPCR7Q0hBTk5FTF9UQUd9XFxcXHMrc291cmNlPVwiKFteXCJdKylcIihbXj5dKik+XFxcXG4/KFtcXFxcc1xcXFxTXSo/KVxcXFxuPzwvJHtDSEFOTkVMX1RBR30+YCxcbilcbmNvbnN0IFVTRVJfQVRUUl9SRSA9IC9cXGJ1c2VyPVwiKFteXCJdKylcIi9cblxuLy8gUGx1Z2luLXByb3ZpZGVkIHNlcnZlcnMgZ2V0IG5hbWVzIGxpa2UgcGx1Z2luOnNsYWNrLWNoYW5uZWw6c2xhY2sgdmlhXG4vLyBhZGRQbHVnaW5TY29wZVRvU2VydmVycyDigJQgc2hvdyBqdXN0IHRoZSBsZWFmLiBNYXRjaGVzIHRoZSBzdWZmaXgtbWF0Y2hcbi8vIGxvZ2ljIGluIGlzU2VydmVySW5DaGFubmVscy5cbmZ1bmN0aW9uIGRpc3BsYXlTZXJ2ZXJOYW1lKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGkgPSBuYW1lLmxhc3RJbmRleE9mKCc6JylcbiAgcmV0dXJuIGkgPT09IC0xID8gbmFtZSA6IG5hbWUuc2xpY2UoaSArIDEpXG59XG5cbmNvbnN0IFRSVU5DQVRFX0FUID0gNjBcblxuZXhwb3J0IGZ1bmN0aW9uIFVzZXJDaGFubmVsTWVzc2FnZSh7XG4gIGFkZE1hcmdpbixcbiAgcGFyYW06IHsgdGV4dCB9LFxufTogUHJvcHMpOiBSZWFjdC5SZWFjdE5vZGUge1xuICBjb25zdCBtID0gQ0hBTk5FTF9SRS5leGVjKHRleHQpXG4gIGlmICghbSkgcmV0dXJuIG51bGxcbiAgY29uc3QgWywgc291cmNlLCBhdHRycywgY29udGVudF0gPSBtXG4gIGNvbnN0IHVzZXIgPSBVU0VSX0FUVFJfUkUuZXhlYyhhdHRycyA/PyAnJyk/LlsxXVxuICBjb25zdCBib2R5ID0gKGNvbnRlbnQgPz8gJycpLnRyaW0oKS5yZXBsYWNlKC9cXHMrL2csICcgJylcbiAgY29uc3QgdHJ1bmNhdGVkID0gdHJ1bmNhdGVUb1dpZHRoKGJvZHksIFRSVU5DQVRFX0FUKVxuICByZXR1cm4gKFxuICAgIDxCb3ggbWFyZ2luVG9wPXthZGRNYXJnaW4gPyAxIDogMH0+XG4gICAgICA8VGV4dD5cbiAgICAgICAgPFRleHQgY29sb3I9XCJzdWdnZXN0aW9uXCI+e0NIQU5ORUxfQVJST1d9PC9UZXh0PnsnICd9XG4gICAgICAgIDxUZXh0IGRpbUNvbG9yPlxuICAgICAgICAgIHtkaXNwbGF5U2VydmVyTmFtZShzb3VyY2UgPz8gJycpfVxuICAgICAgICAgIHt1c2VyID8gYCBcXHUwMGI3ICR7dXNlcn1gIDogJyd9OlxuICAgICAgICA8L1RleHQ+eycgJ31cbiAgICAgICAge3RydW5jYXRlZH1cbiAgICAgIDwvVGV4dD5cbiAgICA8L0JveD5cbiAgKVxufVxuIl0sIm1hcHBpbmdzIjoiO0FBQUEsY0FBY0EsY0FBYyxRQUFRLHVDQUF1QztBQUMzRSxPQUFPLEtBQUtDLEtBQUssTUFBTSxPQUFPO0FBQzlCLFNBQVNDLGFBQWEsUUFBUSw0QkFBNEI7QUFDMUQsU0FBU0MsV0FBVyxRQUFRLHdCQUF3QjtBQUNwRCxTQUFTQyxHQUFHLEVBQUVDLElBQUksUUFBUSxjQUFjO0FBQ3hDLFNBQVNDLGVBQWUsUUFBUSx1QkFBdUI7QUFFdkQsS0FBS0MsS0FBSyxHQUFHO0VBQ1hDLFNBQVMsRUFBRSxPQUFPO0VBQ2xCQyxLQUFLLEVBQUVULGNBQWM7QUFDdkIsQ0FBQzs7QUFFRDtBQUNBO0FBQ0EsTUFBTVUsVUFBVSxHQUFHLElBQUlDLE1BQU0sQ0FDM0IsSUFBSVIsV0FBVyxxREFBcURBLFdBQVcsR0FDakYsQ0FBQztBQUNELE1BQU1TLFlBQVksR0FBRyxrQkFBa0I7O0FBRXZDO0FBQ0E7QUFDQTtBQUNBLFNBQVNDLGlC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
src/components/messages/UserResourceUpdateMessage.tsx ADDED
@@ -0,0 +1,121 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { c as _c } from "react/compiler-runtime";
2
+ import type { TextBlockParam } from '@anthropic-ai/sdk/resources/index.mjs';
3
+ import * as React from 'react';
4
+ import { REFRESH_ARROW } from '../../constants/figures.js';
5
+ import { Box, Text } from '../../ink.js';
6
+ type Props = {
7
+ addMargin: boolean;
8
+ param: TextBlockParam;
9
+ };
10
+ type ParsedUpdate = {
11
+ kind: 'resource' | 'polling';
12
+ server: string;
13
+ /** URI for resource updates, tool name for polling updates */
14
+ target: string;
15
+ reason?: string;
16
+ };
17
+
18
+ // Parse resource and polling updates from XML format
19
+ function parseUpdates(text: string): ParsedUpdate[] {
20
+ const updates: ParsedUpdate[] = [];
21
+
22
+ // Match <mcp-resource-update server="..." uri="...">
23
+ const resourceRegex = /<mcp-resource-update\s+server="([^"]+)"\s+uri="([^"]+)"[^>]*>(?:[\s\S]*?<reason>([^<]+)<\/reason>)?/g;
24
+ let match;
25
+ while ((match = resourceRegex.exec(text)) !== null) {
26
+ updates.push({
27
+ kind: 'resource',
28
+ server: match[1] ?? '',
29
+ target: match[2] ?? '',
30
+ reason: match[3]
31
+ });
32
+ }
33
+
34
+ // Match <mcp-polling-update type="tool" server="..." tool="...">
35
+ const pollingRegex = /<mcp-polling-update\s+type="([^"]+)"\s+server="([^"]+)"\s+tool="([^"]+)"[^>]*>(?:[\s\S]*?<reason>([^<]+)<\/reason>)?/g;
36
+ while ((match = pollingRegex.exec(text)) !== null) {
37
+ updates.push({
38
+ kind: 'polling',
39
+ server: match[2] ?? '',
40
+ target: match[3] ?? '',
41
+ reason: match[4]
42
+ });
43
+ }
44
+ return updates;
45
+ }
46
+
47
+ // Format URI for display - show just the meaningful part
48
+ function formatUri(uri: string): string {
49
+ // For file:// URIs, show just the filename
50
+ if (uri.startsWith('file://')) {
51
+ const path = uri.slice(7);
52
+ const parts = path.split('/');
53
+ return parts[parts.length - 1] || path;
54
+ }
55
+ // For other URIs, show the whole thing but truncated
56
+ if (uri.length > 40) {
57
+ return uri.slice(0, 39) + '\u2026';
58
+ }
59
+ return uri;
60
+ }
61
+ export function UserResourceUpdateMessage(t0) {
62
+ const $ = _c(12);
63
+ const {
64
+ addMargin,
65
+ param: t1
66
+ } = t0;
67
+ const {
68
+ text
69
+ } = t1;
70
+ let T0;
71
+ let t2;
72
+ let t3;
73
+ let t4;
74
+ let t5;
75
+ if ($[0] !== addMargin || $[1] !== text) {
76
+ t5 = Symbol.for("react.early_return_sentinel");
77
+ bb0: {
78
+ const updates = parseUpdates(text);
79
+ if (updates.length === 0) {
80
+ t5 = null;
81
+ break bb0;
82
+ }
83
+ T0 = Box;
84
+ t2 = "column";
85
+ t3 = addMargin ? 1 : 0;
86
+ t4 = updates.map(_temp);
87
+ }
88
+ $[0] = addMargin;
89
+ $[1] = text;
90
+ $[2] = T0;
91
+ $[3] = t2;
92
+ $[4] = t3;
93
+ $[5] = t4;
94
+ $[6] = t5;
95
+ } else {
96
+ T0 = $[2];
97
+ t2 = $[3];
98
+ t3 = $[4];
99
+ t4 = $[5];
100
+ t5 = $[6];
101
+ }
102
+ if (t5 !== Symbol.for("react.early_return_sentinel")) {
103
+ return t5;
104
+ }
105
+ let t6;
106
+ if ($[7] !== T0 || $[8] !== t2 || $[9] !== t3 || $[10] !== t4) {
107
+ t6 = <T0 flexDirection={t2} marginTop={t3}>{t4}</T0>;
108
+ $[7] = T0;
109
+ $[8] = t2;
110
+ $[9] = t3;
111
+ $[10] = t4;
112
+ $[11] = t6;
113
+ } else {
114
+ t6 = $[11];
115
+ }
116
+ return t6;
117
+ }
118
+ function _temp(update, i) {
119
+ return <Box key={i}><Text><Text color="success">{REFRESH_ARROW}</Text>{" "}<Text dimColor={true}>{update.server}:</Text>{" "}<Text color="suggestion">{update.kind === "resource" ? formatUri(update.target) : update.target}</Text>{update.reason && <Text dimColor={true}> · {update.reason}</Text>}</Text></Box>;
120
+ }
121
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJUZXh0QmxvY2tQYXJhbSIsIlJlYWN0IiwiUkVGUkVTSF9BUlJPVyIsIkJveCIsIlRleHQiLCJQcm9wcyIsImFkZE1hcmdpbiIsInBhcmFtIiwiUGFyc2VkVXBkYXRlIiwia2luZCIsInNlcnZlciIsInRhcmdldCIsInJlYXNvbiIsInBhcnNlVXBkYXRlcyIsInRleHQiLCJ1cGRhdGVzIiwicmVzb3VyY2VSZWdleCIsIm1hdGNoIiwiZXhlYyIsInB1c2giLCJwb2xsaW5nUmVnZXgiLCJmb3JtYXRVcmkiLCJ1cmkiLCJzdGFydHNXaXRoIiwicGF0aCIsInNsaWNlIiwicGFydHMiLCJzcGxpdCIsImxlbmd0aCIsIlVzZXJSZXNvdXJjZVVwZGF0ZU1lc3NhZ2UiLCJ0MCIsIiQiLCJfYyIsInQxIiwiVDAiLCJ0MiIsInQzIiwidDQiLCJ0NSIsIlN5bWJvbCIsImZvciIsImJiMCIsIm1hcCIsIl90ZW1wIiwidDYiLCJ1cGRhdGUiLCJpIl0sInNvdXJjZXMiOlsiVXNlclJlc291cmNlVXBkYXRlTWVzc2FnZS50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBUZXh0QmxvY2tQYXJhbSB9IGZyb20gJ0BhbnRocm9waWMtYWkvc2RrL3Jlc291cmNlcy9pbmRleC5tanMnXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7IFJFRlJFU0hfQVJST1cgfSBmcm9tICcuLi8uLi9jb25zdGFudHMvZmlndXJlcy5qcydcbmltcG9ydCB7IEJveCwgVGV4dCB9IGZyb20gJy4uLy4uL2luay5qcydcblxudHlwZSBQcm9wcyA9IHtcbiAgYWRkTWFyZ2luOiBib29sZWFuXG4gIHBhcmFtOiBUZXh0QmxvY2tQYXJhbVxufVxuXG50eXBlIFBhcnNlZFVwZGF0ZSA9IHtcbiAga2luZDogJ3Jlc291cmNlJyB8ICdwb2xsaW5nJ1xuICBzZXJ2ZXI6IHN0cmluZ1xuICAvKiogVVJJIGZvciByZXNvdXJjZSB1cGRhdGVzLCB0b29sIG5hbWUgZm9yIHBvbGxpbmcgdXBkYXRlcyAqL1xuICB0YXJnZXQ6IHN0cmluZ1xuICByZWFzb24/OiBzdHJpbmdcbn1cblxuLy8gUGFyc2UgcmVzb3VyY2UgYW5kIHBvbGxpbmcgdXBkYXRlcyBmcm9tIFhNTCBmb3JtYXRcbmZ1bmN0aW9uIHBhcnNlVXBkYXRlcyh0ZXh0OiBzdHJpbmcpOiBQYXJzZWRVcGRhdGVbXSB7XG4gIGNvbnN0IHVwZGF0ZXM6IFBhcnNlZFVwZGF0ZVtdID0gW11cblxuICAvLyBNYXRjaCA8bWNwLXJlc291cmNlLXVwZGF0ZSBzZXJ2ZXI9XCIuLi5cIiB1cmk9XCIuLi5cIj5cbiAgY29uc3QgcmVzb3VyY2VSZWdleCA9XG4gICAgLzxtY3AtcmVzb3VyY2UtdXBkYXRlXFxzK3NlcnZlcj1cIihbXlwiXSspXCJcXHMrdXJpPVwiKFteXCJdKylcIltePl0qPig/OltcXHNcXFNdKj88cmVhc29uPihbXjxdKyk8XFwvcmVhc29uPik/L2dcbiAgbGV0IG1hdGNoXG4gIHdoaWxlICgobWF0Y2ggPSByZXNvdXJjZVJlZ2V4LmV4ZWModGV4dCkpICE9PSBudWxsKSB7XG4gICAgdXBkYXRlcy5wdXNoKHtcbiAgICAgIGtpbmQ6ICdyZXNvdXJjZScsXG4gICAgICBzZXJ2ZXI6IG1hdGNoWzFdID8/ICcnLFxuICAgICAgdGFyZ2V0OiBtYXRjaFsyXSA/PyAnJyxcbiAgICAgIHJlYXNvbjogbWF0Y2hbM10sXG4gICAgfSlcbiAgfVxuXG4gIC8vIE1hdGNoIDxtY3AtcG9sbGluZy11cGRhdGUgdHlwZT1cInRvb2xcIiBzZXJ2ZXI9XCIuLi5cIiB0b29sPVwiLi4uXCI+XG4gIGNvbnN0IHBvbGxpbmdSZWdleCA9XG4gICAgLzxtY3AtcG9sbGluZy11cGRhdGVcXHMrdHlwZT1cIihbXlwiXSspXCJcXHMrc2VydmVyPVwiKFteXCJdKylcIlxccyt0b29sPVwiKFteXCJdKylcIltePl0qPig/OltcXHNcXFNdKj88cmVhc29uPihbXjxdKyk8XFwvcmVhc29uPik/L2dcbiAgd2hpbGUgKChtYXRjaCA9IHBvbGxpbmdSZWdleC5leGVjKHRleHQpKSAhPT0gbnVsbCkge1xuICAgIHVwZGF0ZXMucHVzaCh7XG4gICAgICBraW5kOiAncG9sbGluZycsXG4gICAgICBzZXJ2ZXI6IG1hdGNoWzJdID8/ICcnLFxuICAgICAgdGFyZ2V0OiBtYXRjaFszXSA/PyAnJyxcbiAgICAgIHJlYXNvbjogbWF0Y2hbNF0sXG4gICAgfSlcbiAgfVxuXG4gIHJldHVybiB1cGRhdGVzXG59XG5cbi8vIEZvcm1hdCBVUkkgZm9yIGRpc3BsYXkgLSBzaG93IGp1c3QgdGhlIG1lYW5pbmdmdWwgcGFydFxuZnVuY3Rpb24gZm9ybWF0VXJpKHVyaTogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8gRm9yIGZpbGU6Ly8gVVJJcywgc2hvdyBqdXN0IHRoZSBmaWxlbmFtZVxuICBpZiAodXJpLnN0YXJ0c1dpdGgoJ2ZpbGU6Ly8nKSkge1xuICAgIGNvbnN0IHBhdGggPSB1cmkuc2xpY2UoNylcbiAgICBjb25zdCBwYXJ0cyA9IHBhdGguc3BsaXQoJy8nKVxuICAgIHJldHVybiBwYXJ0c1twYXJ0cy5sZW5ndGggLSAxXSB8fCBwYXRoXG4gIH1cbiAgLy8gRm9yIG90aGVyIFVSSXMsIHNob3cgdGhlIHdob2xlIHRoaW5nIGJ1dCB0cnVuY2F0ZWRcbiAgaWYgKHVyaS5sZW5ndGggPiA0MCkge1xuICAgIHJldHVybiB1cmkuc2xpY2UoMCwgMzkpICsgJ1xcdTIwMjYnXG4gIH1cbiAgcmV0dXJuIHVyaVxufVxuXG5leHBvcnQgZnVuY3Rpb24gVXNlclJlc291cmNlVXBkYXRlTWVzc2FnZSh7XG4gIGFkZE1hcmdpbixcbiAgcGFyYW06IHsgdGV4dCB9LFxufTogUHJvcHMpOiBSZWFjdC5SZWFjdE5vZGUge1xuICBjb25zdCB1cGRhdGVzID0gcGFyc2VVcGRhdGVzKHRleHQpXG4gIGlmICh1cGRhdGVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG51bGxcblxuICByZXR1cm4gKFxuICAgIDxCb3ggZmxleERpcmVjdGlvbj1cImNvbHVtblwiIG1hcmdpblRvcD17YWRkTWFyZ2luID8gMSA6IDB9PlxuICAgICAge3VwZGF0ZXMubWFwKCh1cGRhdGUsIGkpID0+IChcbiAgICAgICAgPEJveCBrZXk9e2l9PlxuICAgICAgICAgIDxUZXh0PlxuICAgICAgICAgICAgPFRleHQgY29sb3I9XCJzdWNjZXNzXCI+e1JFRlJFU0hfQVJST1d9PC9UZXh0PnsnICd9XG4gICAgICAgICAgICA8VGV4dCBkaW1Db2xvcj57dXBkYXRlLnNlcnZlcn06PC9UZXh0PnsnICd9XG4gICAgICAgICAgICA8VGV4dCBjb2xvcj1cInN1Z2dlc3Rpb25cIj5cbiAgICAgICAgICAgICAge3VwZGF0ZS5raW5kID09PSAncmVzb3VyY2UnXG4gICAgICAgICAgICAgICAgPyBmb3JtYXRVcmkodXBkYXRlLnRhcmdldClcbiAgICAgICAgICAgICAgICA6IHVwZGF0ZS50YXJnZXR9XG4gICAgICAgICAgICA8L1RleHQ+XG4gICAgICAgICAgICB7dXBkYXRlLnJlYXNvbiAmJiA8VGV4dCBkaW1Db2xvcj4gwrcge3VwZGF0ZS5yZWFzb259PC9UZXh0Pn1cbiAgICAgICAgICA8L1RleHQ+XG4gICAgICAgIDwvQm94PlxuICAgICAgKSl9XG4gICAgPC9Cb3g+XG4gIClcbn1cbiJdLCJtYXBwaW5ncyI6IjtBQUFBLGNBQWNBLGNBQWMsUUFBUSx1Q0FBdUM7QUFDM0UsT0FBTyxLQUFLQyxLQUFLLE1BQU0sT0FBTztBQUM5QixTQUFTQyxhQUFhLFFBQVEsNEJBQTRCO0FBQzFELFNBQVNDLEdBQUcsRUFBRUMsSUFBSSxRQUFRLGNBQWM7QUFFeEMsS0FBS0MsS0FBSyxHQUFHO0VBQ1hDLFNBQVMsRUFBRSxPQUFPO0VBQ2xCQyxLQUFLLEVBQUVQLGNBQWM7QUFDdkIsQ0FBQztBQUVELEtBQUtRLFlBQVksR0FBRztFQUNsQkMsSUFBSSxFQUFFLFVBQVUsR0FBRyxTQUFTO0VBQzVCQyxNQUFNLEVBQUUsTUFBTTtFQUNkO0VBQ0FDLE1BQU0sRUFBRSxNQUFNO0VBQ2RDLE1BQU0sQ0FBQyxFQUFFLE1BQU07QUFDakIsQ0FBQzs7QUFFRDtB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
src/components/messages/UserToolResultMessage/RejectedToolUseMessage.tsx ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { c as _c } from "react/compiler-runtime";
2
+ import * as React from 'react';
3
+ import { Text } from '../../../ink.js';
4
+ import { MessageResponse } from '../../MessageResponse.js';
5
+ export function RejectedToolUseMessage() {
6
+ const $ = _c(1);
7
+ let t0;
8
+ if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
9
+ t0 = <MessageResponse height={1}><Text dimColor={true}>Tool use rejected</Text></MessageResponse>;
10
+ $[0] = t0;
11
+ } else {
12
+ t0 = $[0];
13
+ }
14
+ return t0;
15
+ }
16
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsIlRleHQiLCJNZXNzYWdlUmVzcG9uc2UiLCJSZWplY3RlZFRvb2xVc2VNZXNzYWdlIiwiJCIsIl9jIiwidDAiLCJTeW1ib2wiLCJmb3IiXSwic291cmNlcyI6WyJSZWplY3RlZFRvb2xVc2VNZXNzYWdlLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7IFRleHQgfSBmcm9tICcuLi8uLi8uLi9pbmsuanMnXG5pbXBvcnQgeyBNZXNzYWdlUmVzcG9uc2UgfSBmcm9tICcuLi8uLi9NZXNzYWdlUmVzcG9uc2UuanMnXG5cbmV4cG9ydCBmdW5jdGlvbiBSZWplY3RlZFRvb2xVc2VNZXNzYWdlKCk6IFJlYWN0LlJlYWN0Tm9kZSB7XG4gIHJldHVybiAoXG4gICAgPE1lc3NhZ2VSZXNwb25zZSBoZWlnaHQ9ezF9PlxuICAgICAgPFRleHQgZGltQ29sb3I+VG9vbCB1c2UgcmVqZWN0ZWQ8L1RleHQ+XG4gICAgPC9NZXNzYWdlUmVzcG9uc2U+XG4gIClcbn1cbiJdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sS0FBS0EsS0FBSyxNQUFNLE9BQU87QUFDOUIsU0FBU0MsSUFBSSxRQUFRLGlCQUFpQjtBQUN0QyxTQUFTQyxlQUFlLFFBQVEsMEJBQTBCO0FBRTFELE9BQU8sU0FBQUMsdUJBQUE7RUFBQSxNQUFBQyxDQUFBLEdBQUFDLEVBQUE7RUFBQSxJQUFBQyxFQUFBO0VBQUEsSUFBQUYsQ0FBQSxRQUFBRyxNQUFBLENBQUFDLEdBQUE7SUFFSEYsRUFBQSxJQUFDLGVBQWUsQ0FBUyxNQUFDLENBQUQsR0FBQyxDQUN4QixDQUFDLElBQUksQ0FBQyxRQUFRLENBQVIsS0FBTyxDQUFDLENBQUMsaUJBQWlCLEVBQS9CLElBQUksQ0FDUCxFQUZDLGVBQWUsQ0FFRTtJQUFBRixDQUFBLE1BQUFFLEVBQUE7RUFBQTtJQUFBQSxFQUFBLEdBQUFGLENBQUE7RUFBQTtFQUFBLE9BRmxCRSxFQUVrQjtBQUFBIiwiaWdub3JlTGlzdCI6W119
src/components/messages/UserToolResultMessage/UserToolCanceledMessage.tsx ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { c as _c } from "react/compiler-runtime";
2
+ import * as React from 'react';
3
+ import { InterruptedByUser } from 'src/components/InterruptedByUser.js';
4
+ import { MessageResponse } from 'src/components/MessageResponse.js';
5
+ export function UserToolCanceledMessage() {
6
+ const $ = _c(1);
7
+ let t0;
8
+ if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
9
+ t0 = <MessageResponse height={1}><InterruptedByUser /></MessageResponse>;
10
+ $[0] = t0;
11
+ } else {
12
+ t0 = $[0];
13
+ }
14
+ return t0;
15
+ }
16
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsIkludGVycnVwdGVkQnlVc2VyIiwiTWVzc2FnZVJlc3BvbnNlIiwiVXNlclRvb2xDYW5jZWxlZE1lc3NhZ2UiLCIkIiwiX2MiLCJ0MCIsIlN5bWJvbCIsImZvciJdLCJzb3VyY2VzIjpbIlVzZXJUb29sQ2FuY2VsZWRNZXNzYWdlLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7IEludGVycnVwdGVkQnlVc2VyIH0gZnJvbSAnc3JjL2NvbXBvbmVudHMvSW50ZXJydXB0ZWRCeVVzZXIuanMnXG5pbXBvcnQgeyBNZXNzYWdlUmVzcG9uc2UgfSBmcm9tICdzcmMvY29tcG9uZW50cy9NZXNzYWdlUmVzcG9uc2UuanMnXG5cbmV4cG9ydCBmdW5jdGlvbiBVc2VyVG9vbENhbmNlbGVkTWVzc2FnZSgpOiBSZWFjdC5SZWFjdE5vZGUge1xuICByZXR1cm4gKFxuICAgIDxNZXNzYWdlUmVzcG9uc2UgaGVpZ2h0PXsxfT5cbiAgICAgIDxJbnRlcnJ1cHRlZEJ5VXNlciAvPlxuICAgIDwvTWVzc2FnZVJlc3BvbnNlPlxuICApXG59XG4iXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEtBQUtBLEtBQUssTUFBTSxPQUFPO0FBQzlCLFNBQVNDLGlCQUFpQixRQUFRLHFDQUFxQztBQUN2RSxTQUFTQyxlQUFlLFFBQVEsbUNBQW1DO0FBRW5FLE9BQU8sU0FBQUMsd0JBQUE7RUFBQSxNQUFBQyxDQUFBLEdBQUFDLEVBQUE7RUFBQSxJQUFBQyxFQUFBO0VBQUEsSUFBQUYsQ0FBQSxRQUFBRyxNQUFBLENBQUFDLEdBQUE7SUFFSEYsRUFBQSxJQUFDLGVBQWUsQ0FBUyxNQUFDLENBQUQsR0FBQyxDQUN4QixDQUFDLGlCQUFpQixHQUNwQixFQUZDLGVBQWUsQ0FFRTtJQUFBRixDQUFBLE1BQUFFLEVBQUE7RUFBQTtJQUFBQSxFQUFBLEdBQUFGLENBQUE7RUFBQTtFQUFBLE9BRmxCRSxFQUVrQjtBQUFBIiwiaWdub3JlTGlzdCI6W119
src/components/messages/UserToolResultMessage/UserToolErrorMessage.tsx ADDED
@@ -0,0 +1,103 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { c as _c } from "react/compiler-runtime";
2
+ import { feature } from 'bun:bundle';
3
+ import type { ToolResultBlockParam } from '@anthropic-ai/sdk/resources/index.mjs';
4
+ import * as React from 'react';
5
+ import { BULLET_OPERATOR } from '../../../constants/figures.js';
6
+ import { Text } from '../../../ink.js';
7
+ import { filterToolProgressMessages, type Tool, type Tools } from '../../../Tool.js';
8
+ import type { ProgressMessage } from '../../../types/message.js';
9
+ import { INTERRUPT_MESSAGE_FOR_TOOL_USE, isClassifierDenial, PLAN_REJECTION_PREFIX, REJECT_MESSAGE_WITH_REASON_PREFIX } from '../../../utils/messages.js';
10
+ import { FallbackToolUseErrorMessage } from '../../FallbackToolUseErrorMessage.js';
11
+ import { InterruptedByUser } from '../../InterruptedByUser.js';
12
+ import { MessageResponse } from '../../MessageResponse.js';
13
+ import { RejectedPlanMessage } from './RejectedPlanMessage.js';
14
+ import { RejectedToolUseMessage } from './RejectedToolUseMessage.js';
15
+ type Props = {
16
+ progressMessagesForMessage: ProgressMessage[];
17
+ tool?: Tool; // undefined when resuming an old conversation that uses an old tool
18
+ tools: Tools;
19
+ param: ToolResultBlockParam;
20
+ verbose: boolean;
21
+ isTranscriptMode?: boolean;
22
+ };
23
+ export function UserToolErrorMessage(t0) {
24
+ const $ = _c(14);
25
+ const {
26
+ progressMessagesForMessage,
27
+ tool,
28
+ tools,
29
+ param,
30
+ verbose,
31
+ isTranscriptMode
32
+ } = t0;
33
+ if (typeof param.content === "string" && param.content.includes(INTERRUPT_MESSAGE_FOR_TOOL_USE)) {
34
+ let t1;
35
+ if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
36
+ t1 = <MessageResponse height={1}><InterruptedByUser /></MessageResponse>;
37
+ $[0] = t1;
38
+ } else {
39
+ t1 = $[0];
40
+ }
41
+ return t1;
42
+ }
43
+ if (typeof param.content === "string" && param.content.startsWith(PLAN_REJECTION_PREFIX)) {
44
+ let t1;
45
+ if ($[1] !== param.content) {
46
+ t1 = param.content.substring(PLAN_REJECTION_PREFIX.length);
47
+ $[1] = param.content;
48
+ $[2] = t1;
49
+ } else {
50
+ t1 = $[2];
51
+ }
52
+ const planContent = t1;
53
+ let t2;
54
+ if ($[3] !== planContent) {
55
+ t2 = <RejectedPlanMessage plan={planContent} />;
56
+ $[3] = planContent;
57
+ $[4] = t2;
58
+ } else {
59
+ t2 = $[4];
60
+ }
61
+ return t2;
62
+ }
63
+ if (typeof param.content === "string" && param.content.startsWith(REJECT_MESSAGE_WITH_REASON_PREFIX)) {
64
+ let t1;
65
+ if ($[5] === Symbol.for("react.memo_cache_sentinel")) {
66
+ t1 = <RejectedToolUseMessage />;
67
+ $[5] = t1;
68
+ } else {
69
+ t1 = $[5];
70
+ }
71
+ return t1;
72
+ }
73
+ if (feature("TRANSCRIPT_CLASSIFIER") && typeof param.content === "string" && isClassifierDenial(param.content)) {
74
+ let t1;
75
+ if ($[6] === Symbol.for("react.memo_cache_sentinel")) {
76
+ t1 = <MessageResponse height={1}><Text dimColor={true}>Denied by auto mode classifier {BULLET_OPERATOR} /feedback if incorrect</Text></MessageResponse>;
77
+ $[6] = t1;
78
+ } else {
79
+ t1 = $[6];
80
+ }
81
+ return t1;
82
+ }
83
+ let t1;
84
+ if ($[7] !== isTranscriptMode || $[8] !== param.content || $[9] !== progressMessagesForMessage || $[10] !== tool || $[11] !== tools || $[12] !== verbose) {
85
+ t1 = tool?.renderToolUseErrorMessage?.(param.content, {
86
+ progressMessagesForMessage: filterToolProgressMessages(progressMessagesForMessage),
87
+ tools,
88
+ verbose,
89
+ isTranscriptMode
90
+ }) ?? <FallbackToolUseErrorMessage result={param.content} verbose={verbose} />;
91
+ $[7] = isTranscriptMode;
92
+ $[8] = param.content;
93
+ $[9] = progressMessagesForMessage;
94
+ $[10] = tool;
95
+ $[11] = tools;
96
+ $[12] = verbose;
97
+ $[13] = t1;
98
+ } else {
99
+ t1 = $[13];
100
+ }
101
+ return t1;
102
+ }
103
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJmZWF0dXJlIiwiVG9vbFJlc3VsdEJsb2NrUGFyYW0iLCJSZWFjdCIsIkJVTExFVF9PUEVSQVRPUiIsIlRleHQiLCJmaWx0ZXJUb29sUHJvZ3Jlc3NNZXNzYWdlcyIsIlRvb2wiLCJUb29scyIsIlByb2dyZXNzTWVzc2FnZSIsIklOVEVSUlVQVF9NRVNTQUdFX0ZPUl9UT09MX1VTRSIsImlzQ2xhc3NpZmllckRlbmlhbCIsIlBMQU5fUkVKRUNUSU9OX1BSRUZJWCIsIlJFSkVDVF9NRVNTQUdFX1dJVEhfUkVBU09OX1BSRUZJWCIsIkZhbGxiYWNrVG9vbFVzZUVycm9yTWVzc2FnZSIsIkludGVycnVwdGVkQnlVc2VyIiwiTWVzc2FnZVJlc3BvbnNlIiwiUmVqZWN0ZWRQbGFuTWVzc2FnZSIsIlJlamVjdGVkVG9vbFVzZU1lc3NhZ2UiLCJQcm9wcyIsInByb2dyZXNzTWVzc2FnZXNGb3JNZXNzYWdlIiwidG9vbCIsInRvb2xzIiwicGFyYW0iLCJ2ZXJib3NlIiwiaXNUcmFuc2NyaXB0TW9kZSIsIlVzZXJUb29sRXJyb3JNZXNzYWdlIiwidDAiLCIkIiwiX2MiLCJjb250ZW50IiwiaW5jbHVkZXMiLCJ0MSIsIlN5bWJvbCIsImZvciIsInN0YXJ0c1dpdGgiLCJzdWJzdHJpbmciLCJsZW5ndGgiLCJwbGFuQ29udGVudCIsInQyIiwicmVuZGVyVG9vbFVzZUVycm9yTWVzc2FnZSJdLCJzb3VyY2VzIjpbIlVzZXJUb29sRXJyb3JNZXNzYWdlLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBmZWF0dXJlIH0gZnJvbSAnYnVuOmJ1bmRsZSdcbmltcG9ydCB0eXBlIHsgVG9vbFJlc3VsdEJsb2NrUGFyYW0gfSBmcm9tICdAYW50aHJvcGljLWFpL3Nkay9yZXNvdXJjZXMvaW5kZXgubWpzJ1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBCVUxMRVRfT1BFUkFUT1IgfSBmcm9tICcuLi8uLi8uLi9jb25zdGFudHMvZmlndXJlcy5qcydcbmltcG9ydCB7IFRleHQgfSBmcm9tICcuLi8uLi8uLi9pbmsuanMnXG5pbXBvcnQge1xuICBmaWx0ZXJUb29sUHJvZ3Jlc3NNZXNzYWdlcyxcbiAgdHlwZSBUb29sLFxuICB0eXBlIFRvb2xzLFxufSBmcm9tICcuLi8uLi8uLi9Ub29sLmpzJ1xuaW1wb3J0IHR5cGUgeyBQcm9ncmVzc01lc3NhZ2UgfSBmcm9tICcuLi8uLi8uLi90eXBlcy9tZXNzYWdlLmpzJ1xuaW1wb3J0IHtcbiAgSU5URVJSVVBUX01FU1NBR0VfRk9SX1RPT0xfVVNFLFxuICBpc0NsYXNzaWZpZXJEZW5pYWwsXG4gIFBMQU5fUkVKRUNUSU9OX1BSRUZJWCxcbiAgUkVKRUNUX01FU1NBR0VfV0lUSF9SRUFTT05fUFJFRklYLFxufSBmcm9tICcuLi8uLi8uLi91dGlscy9tZXNzYWdlcy5qcydcbmltcG9ydCB7IEZhbGxiYWNrVG9vbFVzZUVycm9yTWVzc2FnZSB9IGZyb20gJy4uLy4uL0ZhbGxiYWNrVG9vbFVzZUVycm9yTWVzc2FnZS5qcydcbmltcG9ydCB7IEludGVycnVwdGVkQnlVc2VyIH0gZnJvbSAnLi4vLi4vSW50ZXJydXB0ZWRCeVVzZXIuanMnXG5pbXBvcnQgeyBNZXNzYWdlUmVzcG9uc2UgfSBmcm9tICcuLi8uLi9NZXNzYWdlUmVzcG9uc2UuanMnXG5pbXBvcnQgeyBSZWplY3RlZFBsYW5NZXNzYWdlIH0gZnJvbSAnLi9SZWplY3RlZFBsYW5NZXNzYWdlLmpzJ1xuaW1wb3J0IHsgUmVqZWN0ZWRUb29sVXNlTWVzc2FnZSB9IGZyb20gJy4vUmVqZWN0ZWRUb29sVXNlTWVzc2FnZS5qcydcblxudHlwZSBQcm9wcyA9IHtcbiAgcHJvZ3Jlc3NNZXNzYWdlc0Zvck1lc3NhZ2U6IFByb2dyZXNzTWVzc2FnZVtdXG4gIHRvb2w/OiBUb29sIC8vIHVuZGVmaW5lZCB3aGVuIHJlc3VtaW5nIGFuIG9sZCBjb252ZXJzYXRpb24gdGhhdCB1c2VzIGFuIG9sZCB0b29sXG4gIHRvb2xzOiBUb29sc1xuICBwYXJhbTogVG9vbFJlc3VsdEJsb2NrUGFyYW1cbiAgdmVyYm9zZTogYm9vbGVhblxuICBpc1RyYW5zY3JpcHRNb2RlPzogYm9vbGVhblxufVxuXG5leHBvcnQgZnVuY3Rpb24gVXNlclRvb2xFcnJvck1lc3NhZ2Uoe1xuICBwcm9ncmVzc01lc3NhZ2VzRm9yTWVzc2FnZSxcbiAgdG9vbCxcbiAgdG9vbHMsXG4gIHBhcmFtLFxuICB2ZXJib3NlLFxuICBpc1RyYW5zY3JpcHRNb2RlLFxufTogUHJvcHMpOiBSZWFjdC5SZWFjdE5vZGUge1xuICBpZiAoXG4gICAgdHlwZW9mIHBhcmFtLmNvbnRlbnQgPT09ICdzdHJpbmcnICYmXG4gICAgcGFyYW0uY29udGVudC5pbmNsdWRlcyhJTlRFUlJVUFRfTUVTU0FHRV9GT1JfVE9PTF9VU0UpXG4gICkge1xuICAgIHJldHVybiAoXG4gICAgICA8TWVzc2FnZVJlc3BvbnNlIGhlaWdodD17MX0+XG4gICAgICAgIDxJbnRlcnJ1cHRlZEJ5VXNlciAvPlxuICAgICAgPC9NZXNzYWdlUmVzcG9uc2U+XG4gICAgKVxuICB9XG5cbiAgaWYgKFxuICAgIHR5cGVvZiBwYXJhbS5jb250ZW50ID09PSAnc3RyaW5nJyAmJlxuICAgIHBhcmFtLmNvbnRlbnQuc3RhcnRzV2l0aChQTEFOX1JFSkVDVElPTl9QUkVGSVgpXG4gICkge1xuICAgIC8vIEV4dHJhY3QgdGhlIHBsYW4gY29udGVudCBmcm9tIHRoZSBlcnJvciBtZXNzYWdlXG4gICAgY29uc3QgcGxhbkNvbnRlbnQgPSBwYXJhbS5jb250ZW50LnN1YnN0cmluZyhQTEFOX1JFSkVDVElPTl9QUkVGSVgubGVuZ3RoKVxuICAgIHJldHVybiA8UmVqZWN0ZWRQbGFuTWVzc2FnZSBwbGFuPXtwbGFuQ29udGVudH0gLz5cbiAgfVxuXG4gIGlmIChcbiAgICB0eXBlb2YgcGFyYW0uY29udGVudCA9PT0gJ3N0cmluZycgJiZcbiAgICBwYXJhbS5jb250ZW50LnN0YXJ0c1dpdGgoUkVKRUNUX01FU1NBR0VfV0lUSF9SRUFTT05fUFJFRklYKVxuICApIHtcbiAgICByZXR1cm4gPFJlamVjdGVkVG9vbFVzZU1lc3NhZ2UgLz5cbiAgfVxuXG4gIGlmIChcbiAgICBmZWF0dXJlKCdUUkFOU0NSSVBUX0NMQVNTSUZJRVInKSAmJlxuICAgIHR5cGVvZiBwYXJhbS5jb250ZW50ID09PSAnc3RyaW5nJyAmJlxuICAgIGlzQ2xhc3NpZmllckRlbmlhbChwYXJhbS5jb250ZW50KVxuICApIHtcbiAgICByZXR1cm4gKFxuICAgICAgPE1lc3NhZ2VSZXNwb25zZSBoZWlnaHQ9ezF9PlxuICAgICAgICA8VGV4dCBkaW1Db2xvcj5cbiAgICAgICAgICBEZW5pZWQgYnkgYXV0byBtb2RlIGNsYXNzaWZpZXIge0JVTExFVF9PUEVSQVRPUn0gL2ZlZWRiYWNrIGlmXG4gICAgICAgICAgaW5jb3JyZWN0XG4gICAgICAgIDwvVGV4dD5cbiAgICAgIDwvTWVzc2FnZVJlc3BvbnNlPlxuICAgIClcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgdG9vbD8ucmVuZGVyVG9vbFVzZUVycm9yTWVzc2FnZT8uKHBhcmFtLmNvbnRlbnQsIHtcbiAgICAgIHByb2dyZXNzTWVzc2FnZXNGb3JNZXNzYWdlOiBmaWx0ZXJUb29sUHJvZ3Jlc3NNZXNzYWdlcyhcbiAgICAgICAgcHJvZ3Jlc3NNZXNzYWdlc0Zvck1lc3NhZ2UsXG4gICAgICApLFxuICAgICAgdG9vbHMsXG4gICAgICB2ZXJib3NlLFxuICAgICAgaXNUcmFuc2NyaXB0TW9kZSxcbiAgICB9KSA/PyAoXG4gICAgICA8RmFsbGJhY2tUb29sVXNlRXJyb3JNZXNzYWdlIHJlc3VsdD17cGFyYW0uY29udGVudH0gdmVyYm9zZT17dmVyYm9zZX0gLz5cbiAgICApXG4gIClcbn1cbiJdLCJtYXBwaW5ncyI6IjtBQUFBLFNBQVNBLE9BQU8sUUFBUSxZQUFZO0FBQ3BDLGNBQWNDLG9CQUFvQixRQUFRLHVDQUF1QztBQUNqRixPQUFPLEtBQUtDLEtBQUssTUFBTSxPQUFPO0FBQzlCLFNBQVNDLGVBQWUsUUFBUSwrQkFBK0I7QUFDL0QsU0FBU0MsSUFB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
src/components/messages/UserToolResultMessage/UserToolSuccessMessage.tsx ADDED
@@ -0,0 +1,104 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { feature } from 'bun:bundle';
2
+ import figures from 'figures';
3
+ import * as React from 'react';
4
+ import { SentryErrorBoundary } from 'src/components/SentryErrorBoundary.js';
5
+ import { Box, Text, useTheme } from '../../../ink.js';
6
+ import { useAppState } from '../../../state/AppState.js';
7
+ import { filterToolProgressMessages, type Tool, type Tools } from '../../../Tool.js';
8
+ import type { NormalizedUserMessage, ProgressMessage } from '../../../types/message.js';
9
+ import { deleteClassifierApproval, getClassifierApproval, getYoloClassifierApproval } from '../../../utils/classifierApprovals.js';
10
+ import type { buildMessageLookups } from '../../../utils/messages.js';
11
+ import { MessageResponse } from '../../MessageResponse.js';
12
+ import { HookProgressMessage } from '../HookProgressMessage.js';
13
+ type Props = {
14
+ message: NormalizedUserMessage;
15
+ lookups: ReturnType<typeof buildMessageLookups>;
16
+ toolUseID: string;
17
+ progressMessagesForMessage: ProgressMessage[];
18
+ style?: 'condensed';
19
+ tool?: Tool;
20
+ tools: Tools;
21
+ verbose: boolean;
22
+ width: number | string;
23
+ isTranscriptMode?: boolean;
24
+ };
25
+ export function UserToolSuccessMessage({
26
+ message,
27
+ lookups,
28
+ toolUseID,
29
+ progressMessagesForMessage,
30
+ style,
31
+ tool,
32
+ tools,
33
+ verbose,
34
+ width,
35
+ isTranscriptMode
36
+ }: Props): React.ReactNode {
37
+ const [theme] = useTheme();
38
+ // Hook stays inside feature() ternary so external builds don't pay a
39
+ // per-scrollback-message store subscription — same pattern as
40
+ // UserPromptMessage.tsx.
41
+ const isBriefOnly = feature('KAIROS') || feature('KAIROS_BRIEF') ?
42
+ // biome-ignore lint/correctness/useHookAtTopLevel: feature() is a compile-time constant
43
+ useAppState(s => s.isBriefOnly) : false;
44
+
45
+ // Capture classifier approval once on mount, then delete from Map to prevent linear growth.
46
+ // useState lazy initializer ensures the value persists across re-renders.
47
+ const [classifierRule] = React.useState(() => getClassifierApproval(toolUseID));
48
+ const [yoloReason] = React.useState(() => getYoloClassifierApproval(toolUseID));
49
+ React.useEffect(() => {
50
+ deleteClassifierApproval(toolUseID);
51
+ }, [toolUseID]);
52
+ if (!message.toolUseResult || !tool) {
53
+ return null;
54
+ }
55
+
56
+ // Resumed transcripts deserialize toolUseResult via raw JSON.parse with no
57
+ // validation (parseJSONL). A partial/corrupt/old-format result crashes
58
+ // renderToolResultMessage on first field access (anthropics/claude-code#39817).
59
+ // Validate against outputSchema before rendering — mirrors CollapsedReadSearchContent.
60
+ const parsedOutput = tool.outputSchema?.safeParse(message.toolUseResult);
61
+ if (parsedOutput && !parsedOutput.success) {
62
+ return null;
63
+ }
64
+ const toolResult = parsedOutput?.data ?? message.toolUseResult;
65
+ const renderedMessage = tool.renderToolResultMessage?.(toolResult as never, filterToolProgressMessages(progressMessagesForMessage), {
66
+ style,
67
+ theme,
68
+ tools,
69
+ verbose,
70
+ isTranscriptMode,
71
+ isBriefOnly,
72
+ input: lookups.toolUseByToolUseID.get(toolUseID)?.input
73
+ }) ?? null;
74
+
75
+ // Don't render anything if the tool result message is null
76
+ if (renderedMessage === null) {
77
+ return null;
78
+ }
79
+
80
+ // Tools that return '' from userFacingName opt out of tool chrome and
81
+ // render like plain assistant text. Skip the tool-result width constraint
82
+ // so MarkdownTable's SAFETY_MARGIN=4 (tuned for the assistant-text 2-col
83
+ // dot gutter) holds — otherwise tables wrap their box-drawing chars.
84
+ const rendersAsAssistantText = tool.userFacingName(undefined) === '';
85
+ return <Box flexDirection="column">
86
+ <Box flexDirection="column" width={rendersAsAssistantText ? undefined : width}>
87
+ {renderedMessage}
88
+ {feature('BASH_CLASSIFIER') ? classifierRule && <MessageResponse height={1}>
89
+ <Text dimColor>
90
+ <Text color="success">{figures.tick}</Text>
91
+ {' Auto-approved \u00b7 matched '}
92
+ {`"${classifierRule}"`}
93
+ </Text>
94
+ </MessageResponse> : null}
95
+ {feature('TRANSCRIPT_CLASSIFIER') ? yoloReason && <MessageResponse height={1}>
96
+ <Text dimColor>Allowed by auto mode classifier</Text>
97
+ </MessageResponse> : null}
98
+ </Box>
99
+ <SentryErrorBoundary>
100
+ <HookProgressMessage hookEvent="PostToolUse" lookups={lookups} toolUseID={toolUseID} verbose={verbose} isTranscriptMode={isTranscriptMode} />
101
+ </SentryErrorBoundary>
102
+ </Box>;
103
+ }
104
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJmZWF0dXJlIiwiZmlndXJlcyIsIlJlYWN0IiwiU2VudHJ5RXJyb3JCb3VuZGFyeSIsIkJveCIsIlRleHQiLCJ1c2VUaGVtZSIsInVzZUFwcFN0YXRlIiwiZmlsdGVyVG9vbFByb2dyZXNzTWVzc2FnZXMiLCJUb29sIiwiVG9vbHMiLCJOb3JtYWxpemVkVXNlck1lc3NhZ2UiLCJQcm9ncmVzc01lc3NhZ2UiLCJkZWxldGVDbGFzc2lmaWVyQXBwcm92YWwiLCJnZXRDbGFzc2lmaWVyQXBwcm92YWwiLCJnZXRZb2xvQ2xhc3NpZmllckFwcHJvdmFsIiwiYnVpbGRNZXNzYWdlTG9va3VwcyIsIk1lc3NhZ2VSZXNwb25zZSIsIkhvb2tQcm9ncmVzc01lc3NhZ2UiLCJQcm9wcyIsIm1lc3NhZ2UiLCJsb29rdXBzIiwiUmV0dXJuVHlwZSIsInRvb2xVc2VJRCIsInByb2dyZXNzTWVzc2FnZXNGb3JNZXNzYWdlIiwic3R5bGUiLCJ0b29sIiwidG9vbHMiLCJ2ZXJib3NlIiwid2lkdGgiLCJpc1RyYW5zY3JpcHRNb2RlIiwiVXNlclRvb2xTdWNjZXNzTWVzc2FnZSIsIlJlYWN0Tm9kZSIsInRoZW1lIiwiaXNCcmllZk9ubHkiLCJzIiwiY2xhc3NpZmllclJ1bGUiLCJ1c2VTdGF0ZSIsInlvbG9SZWFzb24iLCJ1c2VFZmZlY3QiLCJ0b29sVXNlUmVzdWx0IiwicGFyc2VkT3V0cHV0Iiwib3V0cHV0U2NoZW1hIiwic2FmZVBhcnNlIiwic3VjY2VzcyIsInRvb2xSZXN1bHQiLCJkYXRhIiwicmVuZGVyZWRNZXNzYWdlIiwicmVuZGVyVG9vbFJlc3VsdE1lc3NhZ2UiLCJpbnB1dCIsInRvb2xVc2VCeVRvb2xVc2VJRCIsImdldCIsInJlbmRlcnNBc0Fzc2lzdGFudFRleHQiLCJ1c2VyRmFjaW5nTmFtZSIsInVuZGVmaW5lZCIsInRpY2siXSwic291cmNlcyI6WyJVc2VyVG9vbFN1Y2Nlc3NNZXNzYWdlLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBmZWF0dXJlIH0gZnJvbSAnYnVuOmJ1bmRsZSdcbmltcG9ydCBmaWd1cmVzIGZyb20gJ2ZpZ3VyZXMnXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7IFNlbnRyeUVycm9yQm91bmRhcnkgfSBmcm9tICdzcmMvY29tcG9uZW50cy9TZW50cnlFcnJvckJvdW5kYXJ5LmpzJ1xuaW1wb3J0IHsgQm94LCBUZXh0LCB1c2VUaGVtZSB9IGZyb20gJy4uLy4uLy4uL2luay5qcydcbmltcG9ydCB7IHVzZUFwcFN0YXRlIH0gZnJvbSAnLi4vLi4vLi4vc3RhdGUvQXBwU3RhdGUuanMnXG5pbXBvcnQge1xuICBmaWx0ZXJUb29sUHJvZ3Jlc3NNZXNzYWdlcyxcbiAgdHlwZSBUb29sLFxuICB0eXBlIFRvb2xzLFxufSBmcm9tICcuLi8uLi8uLi9Ub29sLmpzJ1xuaW1wb3J0IHR5cGUge1xuICBOb3JtYWxpemVkVXNlck1lc3NhZ2UsXG4gIFByb2dyZXNzTWVzc2FnZSxcbn0gZnJvbSAnLi4vLi4vLi4vdHlwZXMvbWVzc2FnZS5qcydcbmltcG9ydCB7XG4gIGRlbGV0ZUNsYXNzaWZpZXJBcHByb3ZhbCxcbiAgZ2V0Q2xhc3NpZmllckFwcHJvdmFsLFxuICBnZXRZb2xvQ2xhc3NpZmllckFwcHJvdmFsLFxufSBmcm9tICcuLi8uLi8uLi91dGlscy9jbGFzc2lmaWVyQXBwcm92YWxzLmpzJ1xuaW1wb3J0IHR5cGUgeyBidWlsZE1lc3NhZ2VMb29rdXBzIH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMvbWVzc2FnZXMuanMnXG5pbXBvcnQgeyBNZXNzYWdlUmVzcG9uc2UgfSBmcm9tICcuLi8uLi9NZXNzYWdlUmVzcG9uc2UuanMnXG5pbXBvcnQgeyBIb29rUHJvZ3Jlc3NNZXNzYWdlIH0gZnJvbSAnLi4vSG9va1Byb2dyZXNzTWVzc2FnZS5qcydcblxudHlwZSBQcm9wcyA9IHtcbiAgbWVzc2FnZTogTm9ybWFsaXplZFVzZXJNZXNzYWdlXG4gIGxvb2t1cHM6IFJldHVyblR5cGU8dHlwZW9mIGJ1aWxkTWVzc2FnZUxvb2t1cHM+XG4gIHRvb2xVc2VJRDogc3RyaW5nXG4gIHByb2dyZXNzTWVzc2FnZXNGb3JNZXNzYWdlOiBQcm9ncmVzc01lc3NhZ2VbXVxuICBzdHlsZT86ICdjb25kZW5zZWQnXG4gIHRvb2w/OiBUb29sXG4gIHRvb2xzOiBUb29sc1xuICB2ZXJib3NlOiBib29sZWFuXG4gIHdpZHRoOiBudW1iZXIgfCBzdHJpbmdcbiAgaXNUcmFuc2NyaXB0TW9kZT86IGJvb2xlYW5cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFVzZXJUb29sU3VjY2Vzc01lc3NhZ2Uoe1xuICBtZXNzYWdlLFxuICBsb29rdXBzLFxuICB0b29sVXNlSUQsXG4gIHByb2dyZXNzTWVzc2FnZXNGb3JNZXNzYWdlLFxuICBzdHlsZSxcbiAgdG9vbCxcbiAgdG9vbHMsXG4gIHZlcmJvc2UsXG4gIHdpZHRoLFxuICBpc1RyYW5zY3JpcHRNb2RlLFxufTogUHJvcHMpOiBSZWFjdC5SZWFjdE5vZGUge1xuICBjb25zdCBbdGhlbWVdID0gdXNlVGhlbWUoKVxuICAvLyBIb29rIHN0YXlzIGluc2lkZSBmZWF0dXJlKCkgdGVybmFyeSBzbyBleHRlcm5hbCBidWlsZHMgZG9uJ3QgcGF5IGFcbiAgLy8gcGVyLXNjcm9sbGJhY2stbWVzc2FnZSBzdG9yZSBzdWJzY3JpcHRpb24g4oCUIHNhbWUgcGF0dGVybiBhc1xuICAvLyBVc2VyUHJvbXB0TWVzc2FnZS50c3guXG4gIGNvbnN0IGlzQnJpZWZPbmx5ID1cbiAgICBmZWF0dXJlKCdLQUlST1MnKSB8fCBmZWF0dXJlKCdLQUlST1NfQlJJRUYnKVxuICAgICAgPyAvLyBiaW9tZS1pZ25vcmUgbGludC9jb3JyZWN0bmVzcy91c2VIb29rQXRUb3BMZXZlbDogZmVhdHVyZSgpIGlzIGEgY29tcGlsZS10aW1lIGNvbnN0YW50XG4gICAgICAgIHVzZUFwcFN0YXRlKHMgPT4gcy5pc0JyaWVmT25seSlcbiAgICAgIDogZmFsc2VcblxuICAvLyBDYXB0dXJlIGNsYXNzaWZpZXIgYXBwcm92YWwgb25jZSBvbiBtb3VudCwgdGhlbiBkZWxldGUgZnJvbSBNYXAgdG8gcHJldmVudCBsaW5lYXIgZ3Jvd3RoLlxuICAvLyB1c2VTdGF0ZSBsYXp5IGluaXRpYWxpemVyIGVuc3VyZXMgdGhlIHZhbHVlIHBlcnNpc3RzIGFjcm9zcyByZS1yZW5kZXJzLlxuICBjb25zdCBbY2xhc3NpZmllclJ1bGVdID0gUmVhY3QudXNlU3RhdGUoKCkgPT5cbiAgICBnZXRDbGFzc2lmaWVyQXBwcm92YWwodG9vbFVzZUlEKSxcbiAgKVxuICBjb25zdCBbeW9sb1JlYXNvbl0gPSBSZWFjdC51c2VTdGF0ZSgoKSA9PlxuICAgIGdldFlvbG9DbGFzc2lmaWVyQXBwcm92YWwodG9vbFVzZUlEKSxcbiAgKVxuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIGRlbGV0ZUNsYXNzaWZpZXJBcHByb3ZhbCh0b29sVXNlSUQpXG4gIH0sIFt0b29sVXNlSURdKVxuXG4gIGlmICghbWVzc2FnZS50b29sVXNlUmVzdWx0IHx8ICF0b29sKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIC8vIFJlc3VtZWQgdHJhbnNjcmlwdHMgZGVzZXJpYWxpemUgdG9vbFVzZVJlc3VsdCB2aWEgcmF3IEpTT04ucGFyc2Ugd2l0aCBub1xuICAvLyB2YWxpZGF0aW9uIChwYXJzZUpTT05MKS4gQSBwYXJ0aWFsL2NvcnJ1cHQvb2xkLWZvcm1hdCByZXN1bHQgY3Jhc2hlc1xuICAvLyByZW5kZXJUb29sUmVzdWx0TWVzc2FnZSBvbiBmaXJzdCBmaWVsZCBhY2Nlc3MgKGFudGhyb3BpY3MvY2xhdWRlLWNvZGUjMzk4MTcpLlxuICAvLyBWYWxpZGF0ZSBhZ2FpbnN0IG91dHB1dFNjaGVtYSBiZWZvcmUgcmVuZGVyaW5nIOKAlCBtaXJyb3JzIENvbGxhcHNlZFJlYWRTZWFyY2hDb250ZW50LlxuICBjb25zdCBwYXJzZWRPdXRwdXQgPSB0b29sLm91dHB1dFNjaGVtYT8uc2FmZVBhcnNlKG1lc3NhZ2UudG9vbFVzZVJlc3VsdClcbiAgaWYgKHBhcnNlZE91dHB1dCAmJiAhcGFyc2VkT3V0cHV0LnN1Y2Nlc3MpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG4gIGNvbnN0IHRvb2xSZXN1bHQgPSBwYXJzZWRPdXRwdXQ/LmRhdGEgPz8gbWVzc2FnZS50b29sVXNlUmVzdWx0XG5cbiAgY29uc3QgcmVuZGVyZWRNZXNzYWdlID1cbiAgICB0b29sLnJlbmRlclRvb2xSZXN1bHRNZXNzYWdlPy4oXG4gICAgICB0b29sUmVzdWx0IGFzIG5ldmVyLFxuICAgICAgZmlsdGVyVG9vbFByb2dyZXNzTWVzc2FnZXMocHJvZ3Jlc3NNZXNzYWdlc0Zvck1lc3NhZ2UpLFxuICAgICAge1xuICAgICAgICBzdHlsZSxcbiAgICAgICAgdGhlbWUsXG4gICAgICAgIHRvb2xzLFxuICAgICAgICB2ZXJib3NlLFxuICAgICAgICBpc1RyYW5zY3JpcHRNb2RlLFxuICAgICAgICBpc0JyaWVmT25seSxcbiAgICAgICAgaW5wdXQ6IGxvb2t1cHMudG9vbFVzZUJ5VG9vbFVzZUlELmdldCh0b29sVXNlSUQpPy5pbnB1dCxcbiAgICAgIH0sXG4gICAgKSA/PyBudWxsXG5cbiAgLy8gRG9uJ3QgcmVuZGVyIGFueXRoaW5nIGlmIHRoZSB0b29sIHJlc3VsdCBtZXNzYWdlIGlzIG51bGxcbiAgaWYgKHJlbmRlcmVkTWVzc2FnZSA9PT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICAvLyBUb29scyB0aGF0IHJldHVybiAnJyBmcm9tIHVzZXJGYWNpbmdOYW1lIG9wdCBvdXQgb2YgdG9vbCBjaHJvbWUgYW5kXG4gIC8vIHJlbmRlciBsaWtlIHBsYWluIGFzc2lzdGFudCB0ZXh0LiBTa2lwIHRoZSB0b29sLXJlc3VsdCB3aWR0aCBjb25zdHJhaW50XG4gIC8vIHNvIE1hcmtkb3duVGFibGUncyBTQUZFVFlfTUFSR0lOPTQgKHR1bmVkIGZvciB0aGUgYXNzaXN0YW50LXRleHQgMi1jb2xcbiAgLy8gZG90IGd1dHRlcikgaG9sZHMg4oCUIG90aGVyd2lzZSB0YWJsZXMgd3JhcCB0aGVpciBib3gtZHJhd2luZyBjaGFycy5cbiAgY29uc3QgcmVuZGVyc0FzQXNzaXN0YW50VGV4dCA9IHRvb2wudXNlckZhY2luZ05hbWUodW5kZWZpbmVkKSA9PT0gJydcblxuICByZXR1cm4gKFxuICAgIDxCb3ggZmxleERpcmVjdGlvbj1cImNvbHVtblwiPlxuICAgICAgPEJveFxuICAgICAgICBmbGV4RGlyZWN0aW9uPVwiY29sdW1uXCJcbiAgICAgICAgd2lkdGg9e3JlbmRlcnNBc0Fzc2lzdGFudFRleHQgPyB1bmRlZmluZWQgOiB3aWR0aH1cbiAgICAgID5cbiAgICAgICAge3JlbmRlcmVkTWVzc2FnZX1cbiAgICAgICAge2ZlYXR1cmUoJ0JBU0hfQ0xBU1NJRklFUicpXG4gICAgICAgICAgPyBjbGFzc2lmaWVyUnVsZSAmJiAoXG4gICAgICAgICAgICAgIDxNZXNzYWdlUmVzcG9uc2UgaGVpZ2h0PXsxfT5cbiAgICAgICAgICAgICAgICA8VGV4dCBkaW1Db2xvcj5cbiAgICAgICAgICAgICAgICAgIDxUZXh0IGNvbG9yPVwic3VjY2Vzc1wiPntmaWd1cmVzLnRpY2t9PC9UZXh0PlxuICAgICAgICAgICAgICAgICAgeycgQXV0by1hcHByb3ZlZCBcXHUwMGI3IG1hdGNoZWQgJ31cbiAgICAgICAgICAgICAgICAgIHtgXCIke2NsYXNzaWZpZXJSdWxlfVwiYH1cbiAgICAgICAgICAgICAgICA8L1RleHQ+XG4gICAgICAgICAgICAgIDwvTWVzc2FnZVJlc3BvbnNlPlxuICAgICAgICAgICAgKVxuICAgICAgICAgIDogbnVsbH1cbiAgICAgICAge2ZlYXR1cmUoJ1RSQU5TQ1JJUFRfQ0xBU1NJRklFUicpXG4gICAgICAgICAgPyB5b2xvUmVhc29uICYmIChcbiAgICAgICAgICAgICAgPE1lc3NhZ2VSZXNwb25zZSBoZWlnaHQ9ezF9PlxuICAgICAgICAgICAgICAgIDxUZXh0IGRpbUNvbG9yPkFsbG93ZWQgYnkgYXV0byBtb2RlIGNsYXNzaWZpZXI8L1RleHQ+XG4gICAgICAgICAgICAgIDwvTWVzc2FnZVJlc3BvbnNlPlxuICAgICAgICAgICAgKVxuICAgICAgICAgIDogbnVsbH1cbiAgICAgIDwvQm94PlxuICAgICAgPFNlbnRyeUVycm9yQm91bmRhcnk+XG4gICAgICAgIDxIb29rUHJvZ3Jlc3NNZXNzYWdlXG4gICAgICAgICAgaG9va0V2ZW50PVwiUG9zdFRvb2xVc2VcIlxuICAgICAgICAgIGxvb2t1cHM9e2xvb2t1cHN9XG4gICAgICAgICAgdG9vbFVzZUlEPXt0b29sVXNlSUR9XG4gICAgICAgICAgdmVyYm9zZT17dmVyYm9zZX1cbiAgICAgICAgICBpc1RyYW5zY3JpcHRNb2RlPXtpc1RyYW5zY3JpcHRNb2RlfVxuICAgICAgICAvPlxuICAgICAgPC9TZW50cnlFcnJvckJvdW5kYXJ5PlxuICAgIDwvQm94PlxuICApXG59XG4iXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLE9BQU8sUUFBUSxZQUFZO0FBQ3BDLE9BQU9DLE9BQU8sTUFBTSxTQUFTO0FBQzdCLE9BQU8sS0FBS0MsS0FBSyxNQUFNLE9BQU87QUFDOUIsU0FBU0MsbUJBQW1CLFFBQVEsdUNBQXVDO0FBQzNFLFNBQVNDLEdBQUcsRUFBRUMsSUFBSSxFQUFFQyxRQUFRLFFBQVEsaUJBQWlCO0FBQ3JELFNBQVNDLFdBQVcsUUFBUSw0QkFBNEI7QUFDeEQsU0FDRUMsMEJBQTBCLEVBQzFCLEtBQUtDLElBQUksRUFDVCxLQUFLQyxLQUFLLFFBQ0wsa0JBQWtCO0FBQ3pCLGNBQ0VDLHFCQUFxQixFQUNyQkMsZUFBZSxRQUNWLDJCQUEyQjtBQUNsQyxTQUNFQyx3QkFBd0IsRUFDeEJDLHFCQUFxQixFQUNyQkMseUJBQXlCLFFBQ3BCLHVDQUF1QztBQUM5QyxjQUFjQyxtQkFBbUIsUUFBUSw0QkFBNEI7QUFDckUsU0FBU0MsZUFBZSxRQUFRLDBCQUEwQjtBQUMxRCxTQUFTQyxtQkFBbUIsUUFBUSwyQkFBMkI7QUFFL0QsS0FBS0MsS0FBSyxHQUFHO0VBQ1hDLE9BQU8sRUFBRVQscUJBQXFCO0VBQzlCVSxPQUFPLEVBQUVDLFVBQVUsQ0FBQyxPQUFPTixt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
src/components/messages/teamMemSaved.ts ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import type { SystemMemorySavedMessage } from '../../types/message.js'
2
+
3
+ /**
4
+ * Returns the team-memory segment for the memory-saved UI, plus the count so
5
+ * the caller can derive the private count without accessing teamCount itself.
6
+ * Plain function (not a React component) so the React Compiler won't hoist
7
+ * the teamCount property access for memoization. This module is only loaded
8
+ * when feature('TEAMMEM') is true.
9
+ */
10
+ export function teamMemSavedPart(
11
+ message: SystemMemorySavedMessage,
12
+ ): { segment: string; count: number } | null {
13
+ const count = message.teamCount ?? 0
14
+ if (count === 0) return null
15
+ return {
16
+ segment: `${count} team ${count === 1 ? 'memory' : 'memories'}`,
17
+ count,
18
+ }
19
+ }
src/components/permissions/AskUserQuestionPermissionRequest/PreviewQuestionView.tsx ADDED
@@ -0,0 +1,328 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import figures from 'figures';
2
+ import React, { useCallback, useMemo, useRef, useState } from 'react';
3
+ import { useTerminalSize } from '../../../hooks/useTerminalSize.js';
4
+ import type { KeyboardEvent } from '../../../ink/events/keyboard-event.js';
5
+ import { Box, Text } from '../../../ink.js';
6
+ import { useKeybinding, useKeybindings } from '../../../keybindings/useKeybinding.js';
7
+ import { useAppState } from '../../../state/AppState.js';
8
+ import type { Question } from '../../../tools/AskUserQuestionTool/AskUserQuestionTool.js';
9
+ import { getExternalEditor } from '../../../utils/editor.js';
10
+ import { toIDEDisplayName } from '../../../utils/ide.js';
11
+ import { editPromptInEditor } from '../../../utils/promptEditor.js';
12
+ import { Divider } from '../../design-system/Divider.js';
13
+ import TextInput from '../../TextInput.js';
14
+ import { PermissionRequestTitle } from '../PermissionRequestTitle.js';
15
+ import { PreviewBox } from './PreviewBox.js';
16
+ import { QuestionNavigationBar } from './QuestionNavigationBar.js';
17
+ import type { QuestionState } from './use-multiple-choice-state.js';
18
+ type Props = {
19
+ question: Question;
20
+ questions: Question[];
21
+ currentQuestionIndex: number;
22
+ answers: Record<string, string>;
23
+ questionStates: Record<string, QuestionState>;
24
+ hideSubmitTab?: boolean;
25
+ minContentHeight?: number;
26
+ minContentWidth?: number;
27
+ onUpdateQuestionState: (questionText: string, updates: Partial<QuestionState>, isMultiSelect: boolean) => void;
28
+ onAnswer: (questionText: string, label: string | string[], textInput?: string, shouldAdvance?: boolean) => void;
29
+ onTextInputFocus: (isInInput: boolean) => void;
30
+ onCancel: () => void;
31
+ onTabPrev?: () => void;
32
+ onTabNext?: () => void;
33
+ onRespondToClaude: () => void;
34
+ onFinishPlanInterview: () => void;
35
+ };
36
+
37
+ /**
38
+ * A side-by-side question view for questions with preview content.
39
+ * Displays a vertical option list on the left with a preview panel on the right.
40
+ */
41
+ export function PreviewQuestionView({
42
+ question,
43
+ questions,
44
+ currentQuestionIndex,
45
+ answers,
46
+ questionStates,
47
+ hideSubmitTab = false,
48
+ minContentHeight,
49
+ minContentWidth,
50
+ onUpdateQuestionState,
51
+ onAnswer,
52
+ onTextInputFocus,
53
+ onCancel,
54
+ onTabPrev,
55
+ onTabNext,
56
+ onRespondToClaude,
57
+ onFinishPlanInterview
58
+ }: Props): React.ReactNode {
59
+ const isInPlanMode = useAppState(s => s.toolPermissionContext.mode) === 'plan';
60
+ const [isFooterFocused, setIsFooterFocused] = useState(false);
61
+ const [footerIndex, setFooterIndex] = useState(0);
62
+ const [isInNotesInput, setIsInNotesInput] = useState(false);
63
+ const [cursorOffset, setCursorOffset] = useState(0);
64
+ const editor = getExternalEditor();
65
+ const editorName = editor ? toIDEDisplayName(editor) : null;
66
+ const questionText = question.question;
67
+ const questionState = questionStates[questionText];
68
+
69
+ // Only real options — no "Other" for preview questions
70
+ const allOptions = question.options;
71
+
72
+ // Track which option is focused (for preview display)
73
+ const [focusedIndex, setFocusedIndex] = useState(0);
74
+
75
+ // Reset focusedIndex when navigating to a different question
76
+ const prevQuestionText = useRef(questionText);
77
+ if (prevQuestionText.current !== questionText) {
78
+ prevQuestionText.current = questionText;
79
+ const selected = questionState?.selectedValue as string | undefined;
80
+ const idx = selected ? allOptions.findIndex(opt => opt.label === selected) : -1;
81
+ setFocusedIndex(idx >= 0 ? idx : 0);
82
+ }
83
+ const focusedOption = allOptions[focusedIndex];
84
+ const selectedValue = questionState?.selectedValue as string | undefined;
85
+ const notesValue = questionState?.textInputValue || '';
86
+ const handleSelectOption = useCallback((index: number) => {
87
+ const option = allOptions[index];
88
+ if (!option) return;
89
+ setFocusedIndex(index);
90
+ onUpdateQuestionState(questionText, {
91
+ selectedValue: option.label
92
+ }, false);
93
+ onAnswer(questionText, option.label);
94
+ }, [allOptions, questionText, onUpdateQuestionState, onAnswer]);
95
+ const handleNavigate = useCallback((direction: 'up' | 'down' | number) => {
96
+ if (isInNotesInput) return;
97
+ let newIndex: number;
98
+ if (typeof direction === 'number') {
99
+ newIndex = direction;
100
+ } else if (direction === 'up') {
101
+ newIndex = focusedIndex > 0 ? focusedIndex - 1 : focusedIndex;
102
+ } else {
103
+ newIndex = focusedIndex < allOptions.length - 1 ? focusedIndex + 1 : focusedIndex;
104
+ }
105
+ if (newIndex >= 0 && newIndex < allOptions.length) {
106
+ setFocusedIndex(newIndex);
107
+ }
108
+ }, [focusedIndex, allOptions.length, isInNotesInput]);
109
+
110
+ // Handle ctrl+g to open external editor for notes
111
+ useKeybinding('chat:externalEditor', async () => {
112
+ const currentValue = questionState?.textInputValue || '';
113
+ const result = await editPromptInEditor(currentValue);
114
+ if (result.content !== null && result.content !== currentValue) {
115
+ onUpdateQuestionState(questionText, {
116
+ textInputValue: result.content
117
+ }, false);
118
+ }
119
+ }, {
120
+ context: 'Chat',
121
+ isActive: isInNotesInput && !!editor
122
+ });
123
+
124
+ // Handle left/right arrow and tab for question navigation.
125
+ // This must be in the child component (not just the parent) because child useInput
126
+ // handlers register first on the event emitter and fire before parent handlers.
127
+ // Without this, the parent's useKeybindings may not fire reliably depending on
128
+ // listener ordering in the event emitter.
129
+ useKeybindings({
130
+ 'tabs:previous': () => onTabPrev?.(),
131
+ 'tabs:next': () => onTabNext?.()
132
+ }, {
133
+ context: 'Tabs',
134
+ isActive: !isInNotesInput && !isFooterFocused
135
+ });
136
+
137
+ // Re-submit the answer (plain label) when exiting notes input.
138
+ // Notes are stored in questionStates and collected at submit time via annotations.
139
+ const handleNotesExit = useCallback(() => {
140
+ setIsInNotesInput(false);
141
+ onTextInputFocus(false);
142
+ if (selectedValue) {
143
+ onAnswer(questionText, selectedValue);
144
+ }
145
+ }, [selectedValue, questionText, onAnswer, onTextInputFocus]);
146
+ const handleDownFromPreview = useCallback(() => {
147
+ setIsFooterFocused(true);
148
+ }, []);
149
+ const handleUpFromFooter = useCallback(() => {
150
+ setIsFooterFocused(false);
151
+ }, []);
152
+
153
+ // Handle keyboard input for option/footer/notes navigation.
154
+ // Always active — the handler routes internally based on isFooterFocused/isInNotesInput.
155
+ const handleKeyDown = useCallback((e: KeyboardEvent) => {
156
+ if (isFooterFocused) {
157
+ if (e.key === 'up' || e.ctrl && e.key === 'p') {
158
+ e.preventDefault();
159
+ if (footerIndex === 0) {
160
+ handleUpFromFooter();
161
+ } else {
162
+ setFooterIndex(0);
163
+ }
164
+ return;
165
+ }
166
+ if (e.key === 'down' || e.ctrl && e.key === 'n') {
167
+ e.preventDefault();
168
+ if (isInPlanMode && footerIndex === 0) {
169
+ setFooterIndex(1);
170
+ }
171
+ return;
172
+ }
173
+ if (e.key === 'return') {
174
+ e.preventDefault();
175
+ if (footerIndex === 0) {
176
+ onRespondToClaude();
177
+ } else {
178
+ onFinishPlanInterview();
179
+ }
180
+ return;
181
+ }
182
+ if (e.key === 'escape') {
183
+ e.preventDefault();
184
+ onCancel();
185
+ }
186
+ return;
187
+ }
188
+ if (isInNotesInput) {
189
+ // In notes input mode, handle escape to exit back to option navigation
190
+ if (e.key === 'escape') {
191
+ e.preventDefault();
192
+ handleNotesExit();
193
+ }
194
+ return;
195
+ }
196
+
197
+ // Handle option navigation (vertical)
198
+ if (e.key === 'up' || e.ctrl && e.key === 'p') {
199
+ e.preventDefault();
200
+ if (focusedIndex > 0) {
201
+ handleNavigate('up');
202
+ }
203
+ } else if (e.key === 'down' || e.ctrl && e.key === 'n') {
204
+ e.preventDefault();
205
+ if (focusedIndex === allOptions.length - 1) {
206
+ // At bottom of options, go to footer
207
+ handleDownFromPreview();
208
+ } else {
209
+ handleNavigate('down');
210
+ }
211
+ } else if (e.key === 'return') {
212
+ e.preventDefault();
213
+ handleSelectOption(focusedIndex);
214
+ } else if (e.key === 'n' && !e.ctrl && !e.meta) {
215
+ // Press 'n' to focus the notes input
216
+ e.preventDefault();
217
+ setIsInNotesInput(true);
218
+ onTextInputFocus(true);
219
+ } else if (e.key === 'escape') {
220
+ e.preventDefault();
221
+ onCancel();
222
+ } else if (e.key.length === 1 && e.key >= '1' && e.key <= '9') {
223
+ e.preventDefault();
224
+ const idx_0 = parseInt(e.key, 10) - 1;
225
+ if (idx_0 < allOptions.length) {
226
+ handleNavigate(idx_0);
227
+ }
228
+ }
229
+ }, [isFooterFocused, footerIndex, isInPlanMode, isInNotesInput, focusedIndex, allOptions.length, handleUpFromFooter, handleDownFromPreview, handleNavigate, handleSelectOption, handleNotesExit, onRespondToClaude, onFinishPlanInterview, onCancel, onTextInputFocus]);
230
+ const previewContent = focusedOption?.preview || null;
231
+
232
+ // The right panel's available width is terminal minus the left panel and gap.
233
+ const LEFT_PANEL_WIDTH = 30;
234
+ const GAP = 4;
235
+ const {
236
+ columns
237
+ } = useTerminalSize();
238
+ const previewMaxWidth = columns - LEFT_PANEL_WIDTH - GAP;
239
+
240
+ // Lines used within the content area that aren't preview content:
241
+ // 1: marginTop on side-by-side box
242
+ // 2: PreviewBox borders (top + bottom)
243
+ // 2: notes section (marginTop=1 + text)
244
+ // 2: footer section (marginTop=1 + divider)
245
+ // 1: "Chat about this" line
246
+ // 1: plan mode line (may or may not show)
247
+ // 2: help text (marginTop=1 + text)
248
+ const PREVIEW_OVERHEAD = 11;
249
+
250
+ // Compute the max lines available for preview content from the parent's
251
+ // height budget to prevent terminal overflow. We do NOT pad shorter options
252
+ // to match the tallest — the outer box's minHeight handles cross-question
253
+ // layout consistency, and within-question shifts are acceptable.
254
+ const previewMaxLines = useMemo(() => {
255
+ return minContentHeight ? Math.max(1, minContentHeight - PREVIEW_OVERHEAD) : undefined;
256
+ }, [minContentHeight]);
257
+ return <Box flexDirection="column" marginTop={1} tabIndex={0} autoFocus onKeyDown={handleKeyDown}>
258
+ <Divider color="inactive" />
259
+ <Box flexDirection="column" paddingTop={0}>
260
+ <QuestionNavigationBar questions={questions} currentQuestionIndex={currentQuestionIndex} answers={answers} hideSubmitTab={hideSubmitTab} />
261
+ <PermissionRequestTitle title={question.question} color={'text'} />
262
+
263
+ <Box flexDirection="column" minHeight={minContentHeight}>
264
+ {/* Side-by-side layout: options on left, preview on right */}
265
+ <Box marginTop={1} flexDirection="row" gap={4}>
266
+ {/* Left panel: vertical option list */}
267
+ <Box flexDirection="column" width={30}>
268
+ {allOptions.map((option_0, index_0) => {
269
+ const isFocused = focusedIndex === index_0;
270
+ const isSelected = selectedValue === option_0.label;
271
+ return <Box key={option_0.label} flexDirection="row">
272
+ {isFocused ? <Text color="suggestion">{figures.pointer}</Text> : <Text> </Text>}
273
+ <Text dimColor> {index_0 + 1}.</Text>
274
+ <Text color={isSelected ? 'success' : isFocused ? 'suggestion' : undefined} bold={isFocused}>
275
+ {' '}
276
+ {option_0.label}
277
+ </Text>
278
+ {isSelected && <Text color="success"> {figures.tick}</Text>}
279
+ </Box>;
280
+ })}
281
+ </Box>
282
+
283
+ {/* Right panel: preview + notes */}
284
+ <Box flexDirection="column" flexGrow={1}>
285
+ <PreviewBox content={previewContent || 'No preview available'} maxLines={previewMaxLines} minWidth={minContentWidth} maxWidth={previewMaxWidth} />
286
+ <Box marginTop={1} flexDirection="row" gap={1}>
287
+ <Text color="suggestion">Notes:</Text>
288
+ {isInNotesInput ? <TextInput value={notesValue} placeholder="Add notes on this design…" onChange={value => {
289
+ onUpdateQuestionState(questionText, {
290
+ textInputValue: value
291
+ }, false);
292
+ }} onSubmit={handleNotesExit} onExit={handleNotesExit} focus={true} showCursor={true} columns={60} cursorOffset={cursorOffset} onChangeCursorOffset={setCursorOffset} /> : <Text dimColor italic>
293
+ {notesValue || 'press n to add notes'}
294
+ </Text>}
295
+ </Box>
296
+ </Box>
297
+ </Box>
298
+
299
+ {/* Footer section */}
300
+ <Box flexDirection="column" marginTop={1}>
301
+ <Divider color="inactive" />
302
+ <Box flexDirection="row" gap={1}>
303
+ {isFooterFocused && footerIndex === 0 ? <Text color="suggestion">{figures.pointer}</Text> : <Text> </Text>}
304
+ <Text color={isFooterFocused && footerIndex === 0 ? 'suggestion' : undefined}>
305
+ Chat about this
306
+ </Text>
307
+ </Box>
308
+ {isInPlanMode && <Box flexDirection="row" gap={1}>
309
+ {isFooterFocused && footerIndex === 1 ? <Text color="suggestion">{figures.pointer}</Text> : <Text> </Text>}
310
+ <Text color={isFooterFocused && footerIndex === 1 ? 'suggestion' : undefined}>
311
+ Skip interview and plan immediately
312
+ </Text>
313
+ </Box>}
314
+ </Box>
315
+ <Box marginTop={1}>
316
+ <Text color="inactive" dimColor>
317
+ Enter to select · {figures.arrowUp}/{figures.arrowDown} to
318
+ navigate · n to add notes
319
+ {questions.length > 1 && <> · Tab to switch questions</>}
320
+ {isInNotesInput && editorName && <> · ctrl+g to edit in {editorName}</>}{' '}
321
+ · Esc to cancel
322
+ </Text>
323
+ </Box>
324
+ </Box>
325
+ </Box>
326
+ </Box>;
327
+ }
328
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJmaWd1cmVzIiwiUmVhY3QiLCJ1c2VDYWxsYmFjayIsInVzZU1lbW8iLCJ1c2VSZWYiLCJ1c2VTdGF0ZSIsInVzZVRlcm1pbmFsU2l6ZSIsIktleWJvYXJkRXZlbnQiLCJCb3giLCJUZXh0IiwidXNlS2V5YmluZGluZyIsInVzZUtleWJpbmRpbmdzIiwidXNlQXBwU3RhdGUiLCJRdWVzdGlvbiIsImdldEV4dGVybmFsRWRpdG9yIiwidG9JREVEaXNwbGF5TmFtZSIsImVkaXRQcm9tcHRJbkVkaXRvciIsIkRpdmlkZXIiLCJUZXh0SW5wdXQiLCJQZXJtaXNzaW9uUmVxdWVzdFRpdGxlIiwiUHJldmlld0JveCIsIlF1ZXN0aW9uTmF2aWdhdGlvbkJhciIsIlF1ZXN0aW9uU3RhdGUiLCJQcm9wcyIsInF1ZXN0aW9uIiwicXVlc3Rpb25zIiwiY3VycmVudFF1ZXN0aW9uSW5kZXgiLCJhbnN3ZXJzIiwiUmVjb3JkIiwicXVlc3Rpb25TdGF0ZXMiLCJoaWRlU3VibWl0VGFiIiwibWluQ29udGVudEhlaWdodCIsIm1pbkNvbnRlbnRXaWR0aCIsIm9uVXBkYXRlUXVlc3Rpb25TdGF0ZSIsInF1ZXN0aW9uVGV4dCIsInVwZGF0ZXMiLCJQYXJ0aWFsIiwiaXNNdWx0aVNlbGVjdCIsIm9uQW5zd2VyIiwibGFiZWwiLCJ0ZXh0SW5wdXQiLCJzaG91bGRBZHZhbmNlIiwib25UZXh0SW5wdXRGb2N1cyIsImlzSW5JbnB1dCIsIm9uQ2FuY2VsIiwib25UYWJQcmV2Iiwib25UYWJOZXh0Iiwib25SZXNwb25kVG9DbGF1ZGUiLCJvbkZpbmlzaFBsYW5JbnRlcnZpZXciLCJQcmV2aWV3UXVlc3Rpb25WaWV3IiwiUmVhY3ROb2RlIiwiaXNJblBsYW5Nb2RlIiwicyIsInRvb2xQZXJtaXNzaW9uQ29udGV4dCIsIm1vZGUiLCJpc0Zvb3RlckZvY3VzZWQiLCJzZXRJc0Zvb3RlckZvY3VzZWQiLCJmb290ZXJJbmRleCIsInNldEZvb3RlckluZGV4IiwiaXNJbk5vdGVzSW5wdXQiLCJzZXRJc0luTm90ZXNJbnB1dCIsImN1cnNvck9mZnNldCIsInNldEN1cnNvck9mZnNldCIsImVkaXRvciIsImVkaXRvck5hbWUiLCJxdWVzdGlvblN0YXRlIiwiYWxsT3B0aW9ucyIsIm9wdGlvbnMiLCJmb2N1c2VkSW5kZXgiLCJzZXRGb2N1c2VkSW5kZXgiLCJwcmV2UXVlc3Rpb25UZXh0IiwiY3VycmVudCIsInNlbGVjdGVkIiwic2VsZWN0ZWRWYWx1ZSIsImlkeCIsImZpbmRJbmRleCIsIm9wdCIsImZvY3VzZWRPcHRpb24iLCJub3Rlc1ZhbHVlIiwidGV4dElucHV0VmFsdWUiLCJoYW5kbGVTZWxlY3RPcHRpb24iLCJpbmRleCIsIm9wdGlvbiIsImhhbmRsZU5hdmlnYXRlIiwiZGlyZWN0aW9uIiwibmV3SW5kZXgiLCJsZW5ndGgiLCJjdXJyZW50VmFsdWUiLCJyZXN1bHQiLCJjb250ZW50IiwiY29udGV4dCIsImlzQWN0aXZlIiwidGFiczpwcmV2aW91cyIsInRhYnM6bmV4dCIsImhhbmRsZU5vdGVzRXhpdCIsImhhbmRsZURvd25Gcm9tUHJldmlldyIsImhhbmRsZVVwRnJvbUZvb3RlciIsImhhbmRsZUtleURvd24iLCJlIiwia2V5IiwiY3RybCIsInByZXZlbnREZWZhdWx0IiwibWV0YSIsInBhcnNlSW50IiwicHJldmlld0NvbnRlbnQiLCJwcmV2aWV3IiwiTEVGVF9QQU5FTF9XSURUSCIsIkdBUCIsImNvbHVtbnMiLCJwcmV2aWV3TWF4V2lkdGgiLCJQUkVWSUVXX09WRVJIRUFEIiwicHJldmlld01heExpbmVzIiwiTWF0aCIsIm1heCIsInVuZGVmaW5lZCIsIm1hcCIsImlzRm9jdXNlZCIsImlzU2VsZWN0ZWQiLCJwb2ludGVyIiwidGljayIsInZhbHVlIiwiYXJyb3dVcCIsImFycm93RG93biJdLCJzb3VyY2VzIjpbIlByZXZpZXdRdWVzdGlvblZpZXcudHN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBmaWd1cmVzIGZyb20gJ2ZpZ3VyZXMnXG5pbXBvcnQgUmVhY3QsIHsgdXNlQ2FsbGJhY2ssIHVzZU1lbW8sIHVzZVJlZiwgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCdcbmltcG9ydCB7IHVzZVRlcm1pbmFsU2l6ZSB9IGZyb20gJy4uLy4uLy4uL2hvb2tzL3VzZVRlcm1pbmFsU2l6ZS5qcydcbmltcG9ydCB0eXBlIHsgS2V5Ym9hcmRFdmVudCB9IGZyb20gJy4uLy4uLy4uL2luay9ldmVudHMva2V5Ym9hcmQtZXZlbnQuanMnXG5pbXBvcnQgeyBCb3gsIFRleHQgfSBmcm9tICcuLi8uLi8uLi9pbmsuanMnXG5pbXBvcnQge1xuICB1c2VLZXliaW5kaW5nLFxuICB1c2VLZXliaW5kaW5ncyxcbn0gZnJvbSAnLi4vLi4vLi4va2V5YmluZGluZ3MvdXNlS2V5YmluZGluZy5qcydcbmltcG9ydCB7IHVzZUFwcFN0YXRlIH0gZnJvbSAnLi4vLi4vLi4vc3RhdGUvQXBwU3RhdGUuanMnXG5pbXBvcnQgdHlwZSB7IFF1ZXN0aW9uIH0gZnJvbSAnLi4vLi4vLi4vdG9vbHMvQXNrVXNlclF1ZXN0aW9uVG9vbC9Bc2tVc2VyUXVlc3Rpb25Ub29sLmpzJ1xuaW1wb3J0IHsgZ2V0RXh0ZXJuYWxFZGl0b3IgfSBmcm9tICcuLi8uLi8uLi91dGlscy9lZGl0b3IuanMnXG5pbXBvcnQgeyB0b0lERURpc3BsYXlOYW1lIH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMvaWRlLmpzJ1xuaW1wb3J0IHsgZWRpdFByb21wdEluRWRpdG9yIH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMvcHJvbXB0RWRpdG9yLmpzJ1xuaW1wb3J0IHsgRGl2aWRlciB9IGZyb20gJy4uLy4uL2Rlc2lnbi1zeXN0ZW0vRGl2aWRlci5qcydcbmltcG9ydCBUZXh0SW5wdXQgZnJvbSAnLi4vLi4vVGV4dElucHV0LmpzJ1xuaW1wb3J0IHsgUGVybWlzc2lvblJlcXVlc3RUaXRsZSB9IGZyb20gJy4uL1Blcm1pc3Npb25SZXF1ZXN0VGl0bGUuanMnXG5pbXBvcnQgeyBQcmV2aWV3Qm94IH0gZnJvbSAnLi9QcmV2aWV3Qm94LmpzJ1xuaW1wb3J0IHsgUXVlc3Rpb25OYXZpZ2F0aW9uQmFyIH0gZnJvbSAnLi9RdWVzdGlvbk5hdmlnYXRpb25CYXIuanMnXG5pbXBvcnQgdHlwZSB7IFF1ZXN0aW9uU3RhdGUgfSBmcm9tICcuL3VzZS1tdWx0aXBsZS1jaG9pY2Utc3RhdGUuanMnXG5cbnR5cGUgUHJvcHMgPSB7XG4gIHF1ZXN0aW9uOiBRdWVzdGlvblxuICBxdWVzdGlvbnM6IFF1ZXN0aW9uW11cbiAgY3VycmVudFF1ZXN0aW9uSW5kZXg6IG51bWJlclxuICBhbnN3ZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4gIHF1ZXN0aW9uU3RhdGVzOiBSZWNvcmQ8c3RyaW5nLCBRdWVzdGlvblN0YXRlPlxuICBoaWRlU3VibWl0VGFiPzogYm9vbGVhblxuICBtaW5Db250ZW50SGVpZ2h0PzogbnVtYmVyXG4gIG1pbkNvbnRlbnRXaWR0aD86IG51bWJlclxuICBvblVwZGF0ZVF1ZXN0aW9uU3RhdGU6IChcbiAgICBxdWVzdGlvblRleHQ6IHN0cmluZyxcbiAgICB1cGRhdGVzOiBQYXJ0aWFsPFF1ZXN0aW9uU3RhdGU+LFxuICAgIGlzTXVsdGlTZWxlY3Q6IGJvb2xlYW4sXG4gICkgPT4gdm9pZFxuICBvbkFuc3dlcjogKFxuICAgIHF1ZXN0aW9uVGV4dDogc3RyaW5nLFxuICAgIGxhYmVsOiBzdHJpbmcgfCBzdHJpbmdbXSxcbiAgICB0ZXh0SW5wdXQ/OiBzdHJpbmcsXG4gICAgc2hvdWxkQWR2YW5jZT86IGJvb2xlYW4sXG4gICkgPT4gdm9pZFxuICBvblRleHRJbnB1dEZvY3VzOiAoaXNJbklucHV0OiBib29sZWFuKSA9PiB2b2lkXG4gIG9uQ2FuY2VsOiAoKSA9PiB2b2lkXG4gIG9uVGFiUHJldj86ICgpID0+IHZvaWRcbiAgb25UYWJOZXh0PzogKCkgPT4gdm9pZFxuICBvblJlc3BvbmRUb0NsYXVkZTogKCkgPT4gdm9pZFxuICBvbkZpbmlzaFBsYW5JbnRlcnZpZXc6ICgpID0+IHZvaWRcbn1cblxuLyoqXG4gKiBBIHNpZGUtYnktc2lkZSBxdWVzdGlvbiB2aWV3IGZvciBxdWVzdGlvbnMgd2l0aCBwcmV2aWV3IGNvbnRlbnQuXG4gKiBEaXNwbGF5cyBhIHZlcnRpY2FsIG9wdGlvbiBsaXN0IG9uIHRoZSBsZWZ0IHdpdGggYSBwcmV2aWV3IHBhbmVsIG9uIHRoZSByaWdodC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFByZXZpZXdRdWVzdGlvblZpZXcoe1xuICBxdWVzdGlvbixcbiAgcXVlc3Rpb25zLFxuICBjdXJyZW50UXVlc3Rpb25JbmRleCxcbiAgYW5zd2VycyxcbiAgcXVlc3Rpb25TdGF0ZXMsXG4gIGhpZGVTdWJtaXRUYWIgPSBmYWxzZSxcbiAgbWluQ29udGVudEhlaWdodCxcbiAgbWluQ29udGVudFdpZHRoLFxuICBvblVwZGF0ZVF1ZXN0aW9uU3RhdGUsXG4gIG9uQW5zd2VyLFxuICBvblRleHRJbnB1dEZvY3VzLFxuICBvbkNhbmNlbCxcbiAgb25UYWJQcmV2LFxuICBvblRhYk5leHQsXG4gIG9uUmVzcG9uZFRvQ2xhdWRlLFxuICBvbkZpbmlzaFBsYW5JbnRlcnZpZXcsXG59OiBQcm9wcyk6IFJlYWN0LlJlYWN0Tm9kZSB7XG4gIGNvbnN0IGlzSW5QbGFuTW9kZSA9IHVzZUFwcFN0YXRlKHMgPT4gcy50b29sUGVybWlzc2lvbkNvbnRleHQubW9kZSkgPT09ICdwbGFuJ1xuICBjb25zdCBbaXNGb290ZXJGb2N1c2VkLCBzZXRJc0Zvb3RlckZvY3VzZWRdID0gdXNlU3RhdGUoZmFsc2UpXG4gIGNvbnN0IFtmb290ZXJJbmRleCwgc2V0Rm9vdGVySW5kZXhdID0gdXNlU3RhdGUoMClcbiAgY29uc3QgW2lzSW5Ob3Rlc0lucHV0LCBzZXRJc0luTm90ZXNJbnB1dF0gPSB1c2VTdGF0ZShmYWxzZSlcbiAgY29uc3QgW2N1cnNvck9mZnNldCwgc2V0Q3Vyc29yT2Zmc2V0XSA9IHVzZVN0YXRlKDApXG5cbiAgY29uc3QgZWRpdG9yID0gZ2V0RXh0ZXJuYWxFZGl0b3IoKVxuICBjb25zdCBlZGl0b3JOYW1lID0gZWRpdG9yID8gdG9JREVEaXNwbGF5TmFtZShlZGl0b3IpIDogbnVsbFxuXG4gIGNvbnN0IHF1ZXN0aW9uVGV4dCA9IHF1ZXN0aW9uLnF1ZXN0aW9uXG4gIGNvbnN0IHF1ZXN0aW9uU3RhdGUgPSBxdWVzdGlvblN0YXRlc1txdWVzdGlvblRleHRdXG5cbiAgLy8gT25seSByZWFsIG9wdGlvbnMg4oCUIG5vIFwiT3RoZXJcIiBmb3IgcHJldmlldyBxdWVzdGlvbnNcbiAgY29uc3QgYWxsT3B0aW9ucyA9IHF1ZXN0aW9uLm9wdGlvbnNcblxuICAvLyBUcmFjayB3aGljaCBvcHRpb24gaXMgZm9jdXNlZCAoZm9yIHByZXZpZXcgZGlzcGxheSlcbiAgY29uc3QgW2ZvY3VzZWRJbmRleCwgc2V0Rm9jdXNlZEluZGV4XSA9IHVzZVN0YXRlKDApXG5cbiAgLy8gUmVzZXQgZm9jdXNlZEluZGV4IHdoZW4gbmF2aWdhdGluZyB0byBhIGRpZmZlcmVudCBxdWVzdGlvblxuICBjb25zdCBwcmV2UXVlc3Rpb25UZXh0ID0gdXNlUmVmKHF1ZXN0aW9uVGV4dClcbiAgaWYgKHByZXZRdWVzdGlvblRleHQuY3VycmVudCAhPT0gcXVlc3Rpb25UZXh0KSB7XG4gICAgcHJldlF1ZXN0aW9uVGV4dC5jdXJyZW50ID0gcXVlc3Rpb25UZXh0XG4gICAgY29uc3Qgc2VsZWN0ZWQgPSBxdWVzdGlvblN0YXRlPy5zZWxlY3RlZFZhbHVlIGFzIHN0cmluZyB8IHVuZGVmaW5lZFxuICAgIGNvbnN0IGlkeCA9IHNlbGVjdGVkXG4gICAgICA/IGFsbE9wdGlvbnMuZmluZEluZGV4KG9wdCA9PiBvcHQubGFiZWwgPT09IHNlbGVjdGVkKVxuICAgICAgOiAtMVxuICAgIHNldEZvY3VzZWRJbmRleChpZHggPj0gMCA/IGlkeCA6IDApXG4gIH1cblxuICBjb25zdCBmb2N1c2VkT3B0aW9uID0gYWxsT3B0aW9uc1tmb2N1c2VkSW5kZXhdXG4gIGNvbnN0IHNlbGVjdGVkVmFsdWUgPSBxdWVzdGlvblN0YXRlPy5zZWxlY3RlZFZhbHVlIGFzIHN0cmluZyB8IHVuZGVmaW5lZFxuICBjb25zdCBub3Rlc1ZhbHVlID0gcXVlc3Rpb25TdGF0ZT8udGV4dElucHV0VmFsdWUgfHwgJydcblxuICBjb25zdCBoYW5kbGVTZWxlY3RPcHRpb24gPSB1c2VDYWxsYmFjayhcbiAgICAoaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgY29uc3Qgb3B0aW9uID0gYWxsT3B0aW9uc1tpbmRleF1cbiAgICAgIGlmICghb3B0aW9uKSByZXR1cm5cblxuICAgICAgc2V0Rm9jdXNlZEluZGV4KGluZGV4KVxuICAgICAgb25VcGRhdGVRdWVzdGlvblN0YXRlKFxuICAgICAgICBxdWVzdGlvblRleHQsXG4gICAgICAgIHsgc2VsZWN0ZWRWYWx1ZTogb3B0aW9uLmxhYmVsIH0sXG4gICAgICAgIGZhbHNlLFxuICAgICAgKVxuXG4gICAgICBvbkFuc3dlcihxdWVzdGlvblRleHQsIG9wdGlvbi5sYWJlbClcbiAgICB9LFxuICAgIFthbGxPcHRpb25zLCBxdWVzdGlvblRleHQsIG9uVXBkYXRlUXVlc3Rpb25TdGF0ZSwgb25BbnN3ZXJdLFxuICApXG5cbiAgY29uc3QgaGFuZGxlTmF2aWdhdGUgPSB1c2VDYWxsYmFjayhcbiAgICAoZGlyZWN0aW9uOiAndXAnIHwgJ2Rvd24nIHwgbnVtYmVyKSA9PiB7XG4gICAgICBpZiAoaXNJbk5vdGVzSW5wdXQpIHJldHVyblxuXG4gICAgICBsZXQgbmV3SW5kZXg6IG51bWJlclxuICAgICAgaWYgKHR5cGVvZiBkaXJlY3Rpb24gPT09ICdudW1iZXInKSB7XG4gICAgICAgIG5ld0luZGV4ID0gZGlyZWN0aW9uXG4gICAgICB9IGVsc2UgaWYgKGRpcmVjdGlvbiA9PT0gJ3VwJykge1xuICAgICAgICBuZXdJbmRleCA9IGZvY3VzZWRJbmRleCA+IDAgPyBmb2N1c2VkSW5kZXggLSAxIDogZm9jdXNlZEluZGV4XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXdJbmRleCA9XG4gICAgICAgICAgZm9jdXNlZEluZGV4IDwgYWxsT3B0aW9ucy5sZW5ndGggLSAxID8gZm9jdXNlZEluZGV4ICsgMSA6IGZvY3VzZWRJbmRleFxuICAgICAgfVxuXG4gICAgICBpZiAobmV3SW5kZXggPj0gMCAmJiBuZXdJbmRleCA8IGFsbE9wdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgIHNldEZvY3VzZWRJbmRleChuZXdJbmRleClcbiAgICAgIH1cbiAgICB9LFxuICAgIFtmb2N1c2VkSW5kZXgsIGFsbE9wdGlvbnMubGVuZ3RoLCBpc0luTm90ZXNJbnB1dF0sXG4gIClcblxuICAvLyBIYW5kbGUgY3RybCtnIHRvIG9wZW4gZXh0ZXJuYWwgZWRpdG9yIGZvciBub3Rlc1xuICB1c2VLZXliaW5kaW5nKFxuICAgICdjaGF0OmV4dGVybmFsRWRpdG9yJyxcbiAgICBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBjdXJyZW50VmFsdWUgPSBxdWVzdGlvblN0YXRlPy50ZXh0SW5wdXRWYWx1ZSB8fCAnJ1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZWRpdFByb21wdEluRWRpdG9yKGN1cnJlbnRWYWx1ZSlcbiAgICAgIGlmIChyZXN1bHQuY29udGVudCAhPT0gbnVsbCAmJiByZXN1bHQuY29udGVudCAhPT0gY3VycmVudFZhbHVlKSB7XG4gICAgICAgIG9uVXBkYXRlUXVlc3Rpb25TdGF0ZShcbiAgICAgICAgICBxdWVzdGlvblRleHQsXG4gICAgICAgICAgeyB0ZXh0SW5wdXRWYWx1ZTogcmVzdWx0LmNvbnRlbnQgfSxcbiAgICAgICAgICBmYWxzZSxcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH0sXG4gICAgeyBjb250ZXh0OiAnQ2hhdCcsIGlzQWN0aXZlOiBpc0luTm90ZXNJbnB1dCAmJiAhIWVkaXRvciB9LFxuICApXG5cbiAgLy8gSGFuZGxlIGxlZnQvcmlnaHQgYXJyb3cgYW5kIHRhYiBmb3IgcXVlc3Rpb24gbmF2aWdhdGlvbi5cbiAgLy8gVGhpcyBtdXN0IGJlIGluIHRoZSBjaGlsZCBjb21wb25lbnQgKG5vdCBqdXN0IHRoZSBwYXJlbnQpIGJlY2F1c2UgY2hpbGQgdXNlSW5wdXRcbiAgLy8gaGFuZGxlcnMgcmVnaXN0ZXIgZmlyc3Qgb24gdGhlIGV2ZW50IGVtaXR0ZXIgYW5kIGZpcmUgYmVmb3JlIHBhcmVudCBoYW5kbGVycy5cbiAgLy8gV2l0aG91dCB0aGlzLCB0aGUgcGFyZW50J3MgdXNlS2V5YmluZGluZ3MgbWF5IG5vdCBmaXJlIHJlbGlhYmx5IGRlcGVuZGluZyBvblxuICAvLyBsaXN0ZW5lciBvcmRlcmluZyBpbiB0aGUgZXZlbnQgZW1pdHRlci5cbiAgdXNlS2V5YmluZGluZ3MoXG4gICAge1xuICAgICAgJ3RhYnM6cHJldmlvdXMnOiAoKSA9PiBvblRhYlByZXY/LigpLFxuICAgICAgJ3RhYnM6bmV4dCc6ICgpID0+IG9uVGFiTmV4dD8uKCksXG4gICAgfSxcbiAgICB7IGNvbnRleHQ6ICdUYWJzJywgaXNBY3RpdmU6ICFpc0luTm90ZXNJbnB1dCAmJiAhaXNGb290ZXJGb2N1c2VkIH0sXG4gIClcblxuICAvLyBSZS1zdWJtaXQgdGhlIGFuc3dlciAocGxhaW4gbGFiZWwpIHdoZW4gZXhpdGluZyBub3RlcyBpbnB1dC5cbiAgLy8gTm90ZXMgYXJlIHN0b3JlZCBpbiBxdWVzdGlvblN0YXRlcyBhbmQgY29sbGVjdGVkIGF0IHN1Ym1pdCB0aW1lIHZpYSBhbm5vdGF0aW9ucy5cbiAgY29uc3QgaGFuZGxlTm90ZXNFeGl0ID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIHNldElzSW5Ob3Rlc0lucHV0KGZhbHNlKVxuICAgIG9uVGV4dElucHV0Rm9jdXMoZmFsc2UpXG4gICAgaWYgKHNlbGVjdGVkVmFsdWUpIHtcbiAgICAgIG9uQW5zd2VyKHF1ZXN0aW9uVGV4dCwgc2VsZWN0ZWRWYWx1ZSlcbiAgICB9XG4gIH0sIFtzZWxlY3RlZFZhbHVlLCBxdWVzdGlvblRleHQsIG9uQW5zd2VyLCBvblRleHRJbnB1dEZvY3VzXSlcblxuICBjb25zdCBoYW5kbGVEb3duRnJvbVByZXZpZXcgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgc2V0SXNGb290ZXJGb2N1c2VkKHRydWUpXG4gIH0sIFtdKVxuXG4gIGNvbnN0IGhhbmRsZVVwRnJvbUZvb3RlciA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBzZXRJc0Zvb3RlckZvY3VzZWQoZmFsc2UpXG4gIH0sIFtdKVxuXG4gIC8vIEhhbmRsZSBrZXlib2FyZCBpbnB1dCBmb3Igb3B0aW9uL2Zvb3Rlci9ub3RlcyBuYXZpZ2F0aW9uLlxuICAvLyBBbHdheXMgYWN0aXZlIOKAlCB0aGUgaGFuZGxlciByb3V0ZXMgaW50ZXJuYWxseSBiYXNlZCBvbiBpc0Zvb3RlckZvY3VzZWQvaXNJbk5vdGVzSW5wdXQuXG4gIGNvbnN0IGhhbmRsZUtleURvd24gPSB1c2VDYWxsYmFjayhcbiAgICAoZTogS2V5Ym9hcmRFdmVudCkgPT4ge1xuICAgICAgaWYgKGlzRm9vdGVyRm9jdXNlZCkge1xuICAgICAgICBpZiAoZS5rZXkgPT09ICd1cCcgfHwgKGUuY3RybCAmJiBlLmtleSA9PT0gJ3AnKSkge1xuICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKVxuICAgICAgICAgIGlmIChmb290ZXJJbmRleCA9PT0gMCkge1xuICAgICAgICAgICAgaGFuZGxlVXBGcm9tRm9vdGVyKClcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2V0Rm9vdGVySW5kZXgoMClcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZS5rZXkgPT09ICdkb3duJyB8fCAoZS5jdHJsICYmIGUua2V5ID09PSAnbicpKSB7XG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgICAgaWYgKGlzSW5QbGFuTW9kZSAmJiBmb290ZXJJbmRleCA9PT0gMCkge1xuICAgICAgICAgICAgc2V0Rm9vdGVySW5kZXgoMSlcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZS5rZXkgPT09ICdyZXR1cm4nKSB7XG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgICAgaWYgKGZvb3RlckluZGV4ID09PSAwKSB7XG4gICAgICAgICAgICBvblJlc3BvbmRUb0NsYXVkZSgpXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG9uRmluaXNoUGxhbkludGVydmlldygpXG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGUua2V5ID09PSAnZXNjYXBlJykge1xuICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKVxuICAgICAgICAgIG9uQ2FuY2VsKClcbiAgICAgICAgfVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgaWYgKGlzSW5Ob3Rlc0lucHV0KSB7XG4gICAgICAgIC8vIEluIG5vdGVzIGlucHV0IG1vZGUsIGhhbmRsZSBlc2NhcGUgdG8gZXhpdCBiYWNrIHRvIG9wdGlvbiBuYXZpZ2F0aW9uXG4gICAgICAgIGlmIChlLmtleSA9PT0gJ2VzY2FwZScpIHtcbiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KClcbiAgICAgICAgICBoYW5kbGVOb3Rlc0V4aXQoKVxuICAgICAgICB9XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICAvLyBIYW5kbGUgb3B0aW9uIG5hdmlnYXRpb24gKHZlcnRpY2FsKVxuICAgICAgaWYgKGUua2V5ID09PSAndXAnIHx8IChlLmN0cmwgJiYgZS5rZXkgPT09ICdwJykpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgIGlmIChmb2N1c2VkSW5kZXggPiAwKSB7XG4gICAgICAgICAgaGFuZGxlTmF2aWdhdGUoJ3VwJylcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChlLmtleSA9PT0gJ2Rvd24nIHx8IChlLmN0cmwgJiYgZS5rZXkgPT09ICduJykpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgIGlmIChmb2N1c2VkSW5kZXggPT09IGFsbE9wdGlvbnMubGVuZ3RoIC0gMSkge1xuICAgICAgICAgIC8vIEF0IGJvdHRvbSBvZiBvcHRpb25zLCBnbyB0byBmb290ZXJcbiAgICAgICAgICBoYW5kbGVEb3duRnJvbVByZXZpZXcoKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGhhbmRsZU5hdmlnYXRlKCdkb3duJylcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChlLmtleSA9PT0gJ3JldHVybicpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgIGhhbmRsZVNlbGVjdE9wdGlvbihmb2N1c2VkSW5kZXgpXG4gICAgICB9IGVsc2UgaWYgKGUua2V5ID09PSAnbicgJiYgIWUuY3RybCAmJiAhZS5tZXRhKSB7XG4gICAgICAgIC8vIFByZXNzICduJyB0byBmb2N1cyB0aGUgbm90ZXMgaW5wdXRcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgIHNldElzSW5Ob3Rlc0lucHV0KHRydWUpXG4gICAgICAgIG9uVGV4dElucHV0Rm9jdXModHJ1ZSlcbiAgICAgIH0gZWxzZSBpZiAoZS5rZXkgPT09ICdlc2NhcGUnKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKVxuICAgICAgICBvbkNhbmNlbCgpXG4gICAgICB9IGVsc2UgaWYgKGUua2V5Lmxlbmd0aCA9PT0gMSAmJiBlLmtleSA+PSAnMScgJiYgZS5rZXkgPD0gJzknKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKVxuICAgICAgICBjb25zdCBpZHggPSBwYXJzZUludChlLmtleSwgMTApIC0gMVxuICAgICAgICBpZiAoaWR4IDwgYWxsT3B0aW9ucy5sZW5ndGgpIHtcbiAgICAgICAgICBoYW5kbGVOYXZpZ2F0ZShpZHgpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIFtcbiAgICAgIGlzRm9vdGVyRm9jdXNlZCxcbiAgICAgIGZvb3RlckluZGV4LFxuICAgICAgaXNJblBsYW5Nb2RlLFxuICAgICAgaXNJbk5vdGVzSW5wdXQsXG4gICAgICBmb2N1c2VkSW5kZXgsXG4gICAgICBhbGxPcHRpb25zLmxlbmd0aCxcbiAgICAgIGhhbmRsZVVwRnJvbUZvb3RlcixcbiAgICAgIGhhbmRsZURvd25Gcm9tUHJldmlldyxcbiAgICAgIGhhbmRsZU5hdmlnYXRlLFxuICAgICAgaGFuZGxlU2VsZWN0T3B0aW9uLFxuICAgICAgaGFuZGxlTm90ZXNFeGl0LFxuICAgICAgb25SZXNwb25kVG9DbGF1ZGUsXG4gICAgICBvbkZpbmlzaFBsYW5JbnRlcnZpZXcsXG4gICAgICBvbkNhbmNlbCxcbiAgICAgIG9uVGV4dElucHV0Rm9jdXMsXG4gICAgXSxcbiAgKVxuXG4gIGNvbnN0IHByZXZpZXdDb250ZW50ID0gZm9jdXNlZE9wdGlvbj8ucHJldmlldyB8fCBudWxsXG5cbiAgLy8gVGhlIHJpZ2h0IHBhbmVsJ3MgYXZhaWxhYmxlIHdpZHRoIGlzIHRlcm1pbmFsIG1pbnVzIHRoZSBsZWZ0IHBhbmVsIGFuZCBnYXAuXG4gIGNvbnN0IExFRlRfUEFORUxfV0lEVEggPSAzMFxuICBjb25zdCBHQVAgPSA0XG4gIGNvbnN0IHsgY29sdW1ucyB9ID0gdXNlVGVybWluYWxTaXplKClcbiAgY29uc3QgcHJldmlld01heFdpZHRoID0gY29sdW1ucyAtIExFRlRfUEFORUxfV0lEVEggLSBHQVBcblxuICAvLyBMaW5lcyB1c2VkIHdpdGhpbiB0aGUgY29udGVudCBhcmVhIHRoYXQgYXJlbid0IHByZXZpZXcgY29udGVudDpcbiAgLy8gMTogbWFyZ2luVG9wIG9uIHNpZGUtYnktc2lkZSBib3hcbiAgLy8gMjogUHJldmlld0JveCBib3JkZXJzICh0b3AgKyBib3R0b20pXG4gIC8vIDI6IG5vdGVzIHNlY3Rpb24gKG1hcmdpblRvcD0xICsgdGV4dClcbiAgLy8gMjogZm9vdGVyIHNlY3Rpb24gKG1hcmdpblRvcD0xICsgZGl2aWRlcilcbiAgLy8gMTogXCJDaGF0IGFib3V0IHRoaXNcIiBsaW5lXG4gIC8vIDE6IHBsYW4gbW9kZSBsaW5lIChtYXkgb3IgbWF5IG5vdCBzaG93KVxuICAvLyAyOiBoZWxwIHRleHQgKG1hcmdpblRvcD0xICsgdGV4dClcbiAgY29uc3QgUFJFVklFV19PVkVSSEVBRCA9IDExXG5cbiAgLy8gQ29tcHV0ZSB0aGUgbWF4IGxpbmVzIGF2YWlsYWJsZSBmb3IgcHJldmlldyBjb250ZW50IGZyb20gdGhlIHBhcmVudCdzXG4gIC8vIGhlaWdodCBidWRnZXQgdG8gcHJldmVudCB0ZXJtaW5hbCBvdmVyZmxvdy4gV2UgZG8gTk9UIHBhZCBzaG9ydGVyIG9wdGlvbnNcbiAgLy8gdG8gbWF0Y2ggdGhlIHRhbGxlc3Qg4oCUIHRoZSBvdXRlciBib3gncyBtaW5IZWlnaHQgaGFuZGxlcyBjcm9zcy1xdWVzdGlvblxuICAvLyBsYXlvdXQgY29uc2lzdGVuY3ksIGFuZCB3aXRoaW4tcXVlc3Rpb24gc2hpZnRzIGFyZSBhY2NlcHRhYmxlLlxuICBjb25zdCBwcmV2aWV3TWF4TGluZXMgPSB1c2VNZW1vKCgpID0+IHtcbiAgICByZXR1cm4gbWluQ29udGVudEhlaWdodFxuICAgICAgPyBNYXRoLm1heCgxLCBtaW5Db250ZW50SGVpZ2h0IC0gUFJFVklFV19PVkVSSEVBRClcbiAgICAgIDogdW5kZWZpbmVkXG4gIH0sIFttaW5Db250ZW50SGVpZ2h0XSlcblxuICByZXR1cm4gKFxuICAgIDxCb3hcbiAgICAgIGZsZXhEaXJlY3Rpb249XCJjb2x1bW5cIlxuICAgICAgbWFyZ2luVG9wPXsxfVxuICAgICAgdGFiSW5kZXg9ezB9XG4gICAgICBhdXRvRm9jdXNcbiAgICAgIG9uS2V5RG93bj17aGFuZGxlS2V5RG93bn1cbiAgICA+XG4gICAgICA8RGl2aWRlciBjb2xvcj1cImluYWN0aXZlXCIgLz5cbiAgICAgIDxCb3ggZmxleERpcmVjdGlvbj1cImNvbHVtblwiIHBhZGRpbmdUb3A9ezB9PlxuICAgICAgICA8UXVlc3Rpb25OYXZpZ2F0aW9uQmFyXG4gICAgICAgICAgcXVlc3Rpb25zPXtxdWVzdGlvbnN9XG4gICAgICAgICAgY3VycmVudFF1ZXN0aW9uSW5kZXg9e2N1cnJlbnRRdWVzdGlvbkluZGV4fVxuICAgICAgICAgIGFuc3dlcnM9e2Fuc3dlcnN9XG4gICAgICAgICAgaGlkZVN1Ym1pdFRhYj17aGlkZVN1Ym1pdFRhYn1cbiAgICAgICAgLz5cbiAgICAgICAgPFBlcm1pc3Npb25SZXF1ZXN0VGl0bGUgdGl0bGU9e3F1ZXN0aW9uLnF1ZXN0aW9ufSBjb2xvcj17J3RleHQnfSAvPlxuXG4gICAgICAgIDxCb3ggZmxleERpcmVjdGlvbj1cImNvbHVtblwiIG1pbkhlaWdodD17bWluQ29udGVudEhlaWdodH0+XG4gICAgICAgICAgey8qIFNpZGUtYnktc2lkZSBsYXlvdXQ6IG9wdGlvbnMgb24gbGVmdCwgcHJldmlldyBvbiByaWdodCAqL31cbiAgICAgICAgICA8Qm94IG1hcmdpblRvcD17MX0gZmxleERpcmVjdGlvbj1cInJvd1wiIGdhcD17NH0+XG4gICAgICAgICAgICB7LyogTGVmdCBwYW5lbDogdmVydGljYWwgb3B0aW9uIGxpc3QgKi99XG4gICAgICAgICAgICA8Qm94IGZsZXhEaXJlY3Rpb249XCJjb2x1bW5cIiB3aWR0aD17MzB9PlxuICAgICAgICAgICAgICB7YWxsT3B0aW9ucy5tYXAoKG9wdGlvbiwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBpc0ZvY3VzZWQgPSBmb2N1c2VkSW5kZXggPT09IGluZGV4XG4gICAgICAgICAgICAgICAgY29uc3QgaXNTZWxlY3RlZCA9IHNlbGVjdGVkVmFsdWUgPT09IG9wdGlvbi5sYWJlbFxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgIDxCb3gga2V5PXtvcHRpb24ubGFiZWx9IGZsZXhEaXJlY3Rpb249XCJyb3dcIj5cbiAgICAgICAgICAgICAgICAgICAge2lzRm9jdXNlZCA/IChcbiAgICAgICAgICAgICAgICAgICAgICA8VGV4dCBjb2xvcj1cInN1Z2dlc3Rpb25cIj57ZmlndXJlcy5wb2ludGVyfTwvVGV4dD5cbiAgICAgICAgICAgICAgICAgICAgKSA6IChcbiAgICAgICAgICAgICAgICAgICAgICA8VGV4dD4gPC9UZXh0PlxuICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICA8VGV4dCBkaW1Db2xvcj4ge2luZGV4ICsgMX0uPC9UZXh0PlxuICAgICAgICAgICAgICAgICAgICA8VGV4dFxuICAgICAgICAgICAgICAgICAgICAgIGNvbG9yPXtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzU2VsZWN0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnc3VjY2VzcydcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOiBpc0ZvY3VzZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICdzdWdnZXN0aW9uJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIGJvbGQ9e2lzRm9jdXNlZH1cbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIHsnICd9XG4gICAgICAgICAgICAgICAgICAgICAge29wdGlvbi5sYWJlbH1cbiAgICAgICAgICAgICAgICAgICAgPC9UZXh0PlxuICAgICAgICAgICAgICAgICAgICB7aXNTZWxlY3RlZCAmJiA8VGV4dCBjb2xvcj1cInN1Y2Nlc3NcIj4ge2ZpZ3VyZXMudGlja308L1RleHQ+fVxuICAgICAgICAgICAgICAgICAgPC9Cb3g+XG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgIDwvQm94PlxuXG4gICAgICAgICAgICB7LyogUmlnaHQgcGFuZWw6IHByZXZpZXcgKyBub3RlcyAqL31cbiAgICAgICAgICAgIDxCb3ggZmxleERpcmVjdGlvbj1cImNvbHVtblwiIGZsZXhHcm93PXsxfT5cbiAgICAgICAgICAgICAgPFByZXZpZXdCb3hcbiAgICAgICAgICAgICAgICBjb250ZW50PXtwcmV2aWV3Q29udGVudCB8fCAnTm8gcHJldmlldyBhdmFpbGFibGUnfVxuICAgICAgICAgICAgICAgIG1heExpbmVzPXtwcmV2aWV3TWF4TGluZXN9XG4gICAgICAgICAgICAgICAgbWluV2lkdGg9e21pbkNvbnRlbnRXaWR0aH1cbiAgICAgICAgICAgICAgICBtYXhXaWR0aD17cHJldmlld01heFdpZHRofVxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8Qm94IG1hcmdpblRvcD17MX0gZmxleERpcmVjdGlvbj1cInJvd1wiIGdhcD17MX0+XG4gICAgICAgICAgICAgICAgPFRleHQgY29sb3I9XCJzdWdnZXN0aW9uXCI+Tm90ZXM6PC9UZXh0PlxuICAgICAgICAgICAgICAgIHtpc0luTm90ZXNJbnB1dCA/IChcbiAgICAgICAgICAgICAgICAgIDxUZXh0SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU9e25vdGVzVmFsdWV9XG4gICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiQWRkIG5vdGVzIG9uIHRoaXMgZGVzaWdu4oCmXCJcbiAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e3ZhbHVlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICBvblVwZGF0ZVF1ZXN0aW9uU3RhdGUoXG4gICAgICAgICAgICAgICAgICAgICAgICBxdWVzdGlvblRleHQsXG4gICAgICAgICAgICAgICAgICAgICAgICB7IHRleHRJbnB1dFZhbHVlOiB2YWx1ZSB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICBvblN1Ym1pdD17aGFuZGxlTm90ZXNFeGl0fVxuICAgICAgICAgICAgICAgICAgICBvbkV4aXQ9e2hhbmRsZU5vdGVzRXhpdH1cbiAgICAgICAgICAgICAgICAgICAgZm9jdXM9e3RydWV9XG4gICAgICAgICAgICAgICAgICAgIHNob3dDdXJzb3I9e3RydWV9XG4gICAgICAgICAgICAgICAgICAgIGNvbHVtbnM9ezYwfVxuICAgICAgICAgICAgICAgICAgICBjdXJzb3JPZmZzZXQ9e2N1cnNvck9mZnNldH1cbiAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2VDdXJzb3JPZmZzZXQ9e3NldEN1cnNvck9mZnNldH1cbiAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgKSA6IChcbiAgICAgICAgICAgICAgICAgIDxUZXh0IGRpbUNvbG9yIGl0YWxpYz5cbiAgICAgICAgICAgICAgICAgICAge25vdGVzVmFsdWUgfHwgJ3ByZXNzIG4gdG8gYWRkIG5vdGVzJ31cbiAgICAgICAgICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICA8L0JveD5cbiAgICAgICAgICAgIDwvQm94PlxuICAgICAgICAgIDwvQm94PlxuXG4gICAgICAgICAgey8qIEZvb3RlciBzZWN0aW9uICovfVxuICAgICAgICAgIDxCb3ggZmxleERpcmVjdGlvbj1cImNvbHVtblwiIG1hcmdpblRvcD17MX0+XG4gICAgICAgICAgICA8RGl2aWRlciBjb2xvcj1cImluYWN0aXZlXCIgLz5cbiAgICAgICAgICAgIDxCb3ggZmxleERpcmVjdGlvbj1cInJvd1wiIGdhcD17MX0+XG4gICAgICAgICAgICAgIHtpc0Zvb3RlckZvY3VzZWQgJiYgZm9vdGVySW5kZXggPT09IDAgPyAoXG4gICAgICAgICAgICAgICAgPFRleHQgY29sb3I9XCJzdWdnZXN0aW9uXCI+e2ZpZ3VyZXMucG9pbnRlcn08L1RleHQ+XG4gICAgICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICAgICAgPFRleHQ+IDwvVGV4dD5cbiAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgPFRleHRcbiAgICAgICAgICAgICAgICBjb2xvcj17XG4gICAgICAgICAgICAgICAgICBpc0Zvb3RlckZvY3VzZWQgJiYgZm9vdGVySW5kZXggPT09IDBcbiAgICAgICAgICAgICAgICAgICAgPyAnc3VnZ2VzdGlvbidcbiAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICBDaGF0IGFib3V0IHRoaXNcbiAgICAgICAgICAgICAgPC9UZXh0PlxuICAgICAgICAgICAgPC9Cb3g+XG4gICAgICAgICAgICB7aXNJblBsYW5Nb2RlICYmIChcbiAgICAgICAgICAgICAgPEJveCBmbGV4RGlyZWN0aW9uPVwicm93XCIgZ2FwPXsxfT5cbiAgICAgICAgICAgICAgICB7aXNGb290ZXJGb2N1c2VkICYmIGZvb3RlckluZGV4ID09PSAxID8gKFxuICAgICAgICAgICAgICAgICAgPFRleHQgY29sb3I9XCJzdWdnZXN0aW9uXCI+e2ZpZ3VyZXMucG9pbnRlcn08L1RleHQ+XG4gICAgICAgICAgICAgICAgKSA6IChcbiAgICAgICAgICAgICAgICAgIDxUZXh0PiA8L1RleHQ+XG4gICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICA8VGV4dFxuICAgICAgICAgICAgICAgICAgY29sb3I9e1xuICAgICAgICAgICAgICAgICAgICBpc0Zvb3RlckZvY3VzZWQgJiYgZm9vdGVySW5kZXggPT09IDFcbiAgICAgICAgICAgICAgICAgICAgICA/ICdzdWdnZXN0aW9uJ1xuICAgICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgU2tpcCBpbnRlcnZpZXcgYW5kIHBsYW4gaW1tZWRpYXRlbHlcbiAgICAgICAgICAgICAgICA8L1RleHQ+XG4gICAgICAgICAgICAgIDwvQm94PlxuICAgICAgICAgICAgKX1cbiAgICAgICAgICA8L0JveD5cbiAgICAgICAgICA8Qm94IG1hcmdpblRvcD17MX0+XG4gICAgICAgICAgICA8VGV4dCBjb2xvcj1cImluYWN0aXZlXCIgZGltQ29sb3I+XG4gICAgICAgICAgICAgIEVudGVyIHRvIHNlbGVjdCDCtyB7ZmlndXJlcy5hcnJvd1VwfS97ZmlndXJlcy5hcnJvd0Rvd259IHRvXG4gICAgICAgICAgICAgIG5hdmlnYXRlIMK3IG4gdG8gYWRkIG5vdGVzXG4gICAgICAgICAgICAgIHtxdWVzdGlvbnMubGVuZ3RoID4gMSAmJiA8PiDCtyBUYWIgdG8gc3dpdGNoIHF1ZXN0aW9uczwvPn1cbiAgICAgICAgICAgICAge2lzSW5Ob3Rlc0lucHV0ICYmIGVkaXRvck5hbWUgJiYgKFxuICAgICAgICAgICAgICAgIDw+IMK3IGN0cmwrZyB0byBlZGl0IGluIHtlZGl0b3JOYW1lfTwvPlxuICAgICAgICAgICAgICApfXsnICd9XG4gICAgICAgICAgICAgIMK3IEVzYyB0byBjYW5jZWxcbiAgICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgICA8L0JveD5cbiAgICAgICAgPC9Cb3g+XG4gICAgICA8L0JveD5cbiAgICA8L0JveD5cbiAgKVxufVxuIl0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPQSxPQUFPLE1BQU0sU0FBUztBQUM3QixPQUFPQyxLQUFLLElBQUlDLFdBQVcsRUFBRUMsT0FBTyxFQUFFQyxNQUFNLEVBQUVDLFFBQVEsUUFBUSxPQUFPO0FBQ3JFLFNBQVNDLGVBQWUsUUFBUSxtQ0FBbUM7QUFDbkUsY0FBY0MsYUFBYSxRQUFRLHVDQUF1QztBQUMxRSxTQUFTQyxHQUFHLEVBQUVDLElBQUksUUFBUSxpQkFBaUI7QUFDM0MsU0FDRUMsYUFBYSxFQUNiQyxjQUFjLFFBQ1QsdUNBQXVDO0FBQzlDLFNBQVNDLFdBQVcsUUFBUSw0QkFBNEI7QUFDeEQsY0FBY0MsUUFBUSxRQUFRLDJEQUEyRDtBQUN6RixTQUFTQyxpQkFBaUIsUUFBUSwwQkFBMEI7QUFDNUQsU0FBU0MsZ0JBQWdCLFFBQVEsdUJBQXVCO0FBQ3hELFNBQVNDLGtCQUFrQixRQUFRLGdDQUFnQztBQUNuRSxTQUFTQyxPQUFPLFFBQVEsZ0NBQWdDO0FBQ3hELE9BQU9DLFNBQVMsTUFBTSxvQkFBb0I7QUFDMUMsU0FBU0Msc0JBQXNCLFFBQVEs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
src/components/permissions/AskUserQuestionPermissionRequest/SubmitQuestionsView.tsx ADDED
@@ -0,0 +1,144 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { c as _c } from "react/compiler-runtime";
2
+ import figures from 'figures';
3
+ import React from 'react';
4
+ import { Box, Text } from '../../../ink.js';
5
+ import type { Question } from '../../../tools/AskUserQuestionTool/AskUserQuestionTool.js';
6
+ import type { PermissionDecision } from '../../../utils/permissions/PermissionResult.js';
7
+ import { Select } from '../../CustomSelect/index.js';
8
+ import { Divider } from '../../design-system/Divider.js';
9
+ import { PermissionRequestTitle } from '../PermissionRequestTitle.js';
10
+ import { PermissionRuleExplanation } from '../PermissionRuleExplanation.js';
11
+ import { QuestionNavigationBar } from './QuestionNavigationBar.js';
12
+ type Props = {
13
+ questions: Question[];
14
+ currentQuestionIndex: number;
15
+ answers: Record<string, string>;
16
+ allQuestionsAnswered: boolean;
17
+ permissionResult: PermissionDecision;
18
+ minContentHeight?: number;
19
+ onFinalResponse: (value: 'submit' | 'cancel') => void;
20
+ };
21
+ export function SubmitQuestionsView(t0) {
22
+ const $ = _c(27);
23
+ const {
24
+ questions,
25
+ currentQuestionIndex,
26
+ answers,
27
+ allQuestionsAnswered,
28
+ permissionResult,
29
+ minContentHeight,
30
+ onFinalResponse
31
+ } = t0;
32
+ let t1;
33
+ if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
34
+ t1 = <Divider color="inactive" />;
35
+ $[0] = t1;
36
+ } else {
37
+ t1 = $[0];
38
+ }
39
+ let t2;
40
+ if ($[1] !== answers || $[2] !== currentQuestionIndex || $[3] !== questions) {
41
+ t2 = <QuestionNavigationBar questions={questions} currentQuestionIndex={currentQuestionIndex} answers={answers} />;
42
+ $[1] = answers;
43
+ $[2] = currentQuestionIndex;
44
+ $[3] = questions;
45
+ $[4] = t2;
46
+ } else {
47
+ t2 = $[4];
48
+ }
49
+ let t3;
50
+ if ($[5] === Symbol.for("react.memo_cache_sentinel")) {
51
+ t3 = <PermissionRequestTitle title="Review your answers" color="text" />;
52
+ $[5] = t3;
53
+ } else {
54
+ t3 = $[5];
55
+ }
56
+ let t4;
57
+ if ($[6] !== allQuestionsAnswered) {
58
+ t4 = !allQuestionsAnswered && <Box marginBottom={1}><Text color="warning">{figures.warning} You have not answered all questions</Text></Box>;
59
+ $[6] = allQuestionsAnswered;
60
+ $[7] = t4;
61
+ } else {
62
+ t4 = $[7];
63
+ }
64
+ let t5;
65
+ if ($[8] !== answers || $[9] !== questions) {
66
+ t5 = Object.keys(answers).length > 0 && <Box flexDirection="column" marginBottom={1}>{questions.filter(q => q?.question && answers[q.question]).map(q_0 => {
67
+ const answer = answers[q_0?.question];
68
+ return <Box key={q_0?.question || "answer"} flexDirection="column" marginLeft={1}><Text>{figures.bullet} {q_0?.question || "Question"}</Text><Box marginLeft={2}><Text color="success">{figures.arrowRight} {answer}</Text></Box></Box>;
69
+ })}</Box>;
70
+ $[8] = answers;
71
+ $[9] = questions;
72
+ $[10] = t5;
73
+ } else {
74
+ t5 = $[10];
75
+ }
76
+ let t6;
77
+ if ($[11] !== permissionResult) {
78
+ t6 = <PermissionRuleExplanation permissionResult={permissionResult} toolType="tool" />;
79
+ $[11] = permissionResult;
80
+ $[12] = t6;
81
+ } else {
82
+ t6 = $[12];
83
+ }
84
+ let t7;
85
+ if ($[13] === Symbol.for("react.memo_cache_sentinel")) {
86
+ t7 = <Text color="inactive">Ready to submit your answers?</Text>;
87
+ $[13] = t7;
88
+ } else {
89
+ t7 = $[13];
90
+ }
91
+ let t8;
92
+ if ($[14] === Symbol.for("react.memo_cache_sentinel")) {
93
+ t8 = {
94
+ type: "text" as const,
95
+ label: "Submit answers",
96
+ value: "submit"
97
+ };
98
+ $[14] = t8;
99
+ } else {
100
+ t8 = $[14];
101
+ }
102
+ let t9;
103
+ if ($[15] === Symbol.for("react.memo_cache_sentinel")) {
104
+ t9 = [t8, {
105
+ type: "text" as const,
106
+ label: "Cancel",
107
+ value: "cancel"
108
+ }];
109
+ $[15] = t9;
110
+ } else {
111
+ t9 = $[15];
112
+ }
113
+ let t10;
114
+ if ($[16] !== onFinalResponse) {
115
+ t10 = <Box marginTop={1}><Select options={t9} onChange={value => onFinalResponse(value as 'submit' | 'cancel')} onCancel={() => onFinalResponse("cancel")} /></Box>;
116
+ $[16] = onFinalResponse;
117
+ $[17] = t10;
118
+ } else {
119
+ t10 = $[17];
120
+ }
121
+ let t11;
122
+ if ($[18] !== minContentHeight || $[19] !== t10 || $[20] !== t4 || $[21] !== t5 || $[22] !== t6) {
123
+ t11 = <Box flexDirection="column" marginTop={1} minHeight={minContentHeight}>{t4}{t5}{t6}{t7}{t10}</Box>;
124
+ $[18] = minContentHeight;
125
+ $[19] = t10;
126
+ $[20] = t4;
127
+ $[21] = t5;
128
+ $[22] = t6;
129
+ $[23] = t11;
130
+ } else {
131
+ t11 = $[23];
132
+ }
133
+ let t12;
134
+ if ($[24] !== t11 || $[25] !== t2) {
135
+ t12 = <Box flexDirection="column" marginTop={1}>{t1}<Box flexDirection="column" borderTop={true} borderColor="inactive" paddingTop={0}>{t2}{t3}{t11}</Box></Box>;
136
+ $[24] = t11;
137
+ $[25] = t2;
138
+ $[26] = t12;
139
+ } else {
140
+ t12 = $[26];
141
+ }
142
+ return t12;
143
+ }
144
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJmaWd1cmVzIiwiUmVhY3QiLCJCb3giLCJUZXh0IiwiUXVlc3Rpb24iLCJQZXJtaXNzaW9uRGVjaXNpb24iLCJTZWxlY3QiLCJEaXZpZGVyIiwiUGVybWlzc2lvblJlcXVlc3RUaXRsZSIsIlBlcm1pc3Npb25SdWxlRXhwbGFuYXRpb24iLCJRdWVzdGlvbk5hdmlnYXRpb25CYXIiLCJQcm9wcyIsInF1ZXN0aW9ucyIsImN1cnJlbnRRdWVzdGlvbkluZGV4IiwiYW5zd2VycyIsIlJlY29yZCIsImFsbFF1ZXN0aW9uc0Fuc3dlcmVkIiwicGVybWlzc2lvblJlc3VsdCIsIm1pbkNvbnRlbnRIZWlnaHQiLCJvbkZpbmFsUmVzcG9uc2UiLCJ2YWx1ZSIsIlN1Ym1pdFF1ZXN0aW9uc1ZpZXciLCJ0MCIsIiQiLCJfYyIsInQxIiwiU3ltYm9sIiwiZm9yIiwidDIiLCJ0MyIsInQ0Iiwid2FybmluZyIsInQ1IiwiT2JqZWN0Iiwia2V5cyIsImxlbmd0aCIsImZpbHRlciIsInEiLCJxdWVzdGlvbiIsIm1hcCIsInFfMCIsImFuc3dlciIsImJ1bGxldCIsImFycm93UmlnaHQiLCJ0NiIsInQ3IiwidDgiLCJ0eXBlIiwiY29uc3QiLCJsYWJlbCIsInQ5IiwidDEwIiwidDExIiwidDEyIl0sInNvdXJjZXMiOlsiU3VibWl0UXVlc3Rpb25zVmlldy50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGZpZ3VyZXMgZnJvbSAnZmlndXJlcydcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7IEJveCwgVGV4dCB9IGZyb20gJy4uLy4uLy4uL2luay5qcydcbmltcG9ydCB0eXBlIHsgUXVlc3Rpb24gfSBmcm9tICcuLi8uLi8uLi90b29scy9Bc2tVc2VyUXVlc3Rpb25Ub29sL0Fza1VzZXJRdWVzdGlvblRvb2wuanMnXG5pbXBvcnQgdHlwZSB7IFBlcm1pc3Npb25EZWNpc2lvbiB9IGZyb20gJy4uLy4uLy4uL3V0aWxzL3Blcm1pc3Npb25zL1Blcm1pc3Npb25SZXN1bHQuanMnXG5pbXBvcnQgeyBTZWxlY3QgfSBmcm9tICcuLi8uLi9DdXN0b21TZWxlY3QvaW5kZXguanMnXG5pbXBvcnQgeyBEaXZpZGVyIH0gZnJvbSAnLi4vLi4vZGVzaWduLXN5c3RlbS9EaXZpZGVyLmpzJ1xuaW1wb3J0IHsgUGVybWlzc2lvblJlcXVlc3RUaXRsZSB9IGZyb20gJy4uL1Blcm1pc3Npb25SZXF1ZXN0VGl0bGUuanMnXG5pbXBvcnQgeyBQZXJtaXNzaW9uUnVsZUV4cGxhbmF0aW9uIH0gZnJvbSAnLi4vUGVybWlzc2lvblJ1bGVFeHBsYW5hdGlvbi5qcydcbmltcG9ydCB7IFF1ZXN0aW9uTmF2aWdhdGlvbkJhciB9IGZyb20gJy4vUXVlc3Rpb25OYXZpZ2F0aW9uQmFyLmpzJ1xuXG50eXBlIFByb3BzID0ge1xuICBxdWVzdGlvbnM6IFF1ZXN0aW9uW11cbiAgY3VycmVudFF1ZXN0aW9uSW5kZXg6IG51bWJlclxuICBhbnN3ZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4gIGFsbFF1ZXN0aW9uc0Fuc3dlcmVkOiBib29sZWFuXG4gIHBlcm1pc3Npb25SZXN1bHQ6IFBlcm1pc3Npb25EZWNpc2lvblxuICBtaW5Db250ZW50SGVpZ2h0PzogbnVtYmVyXG4gIG9uRmluYWxSZXNwb25zZTogKHZhbHVlOiAnc3VibWl0JyB8ICdjYW5jZWwnKSA9PiB2b2lkXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBTdWJtaXRRdWVzdGlvbnNWaWV3KHtcbiAgcXVlc3Rpb25zLFxuICBjdXJyZW50UXVlc3Rpb25JbmRleCxcbiAgYW5zd2VycyxcbiAgYWxsUXVlc3Rpb25zQW5zd2VyZWQsXG4gIHBlcm1pc3Npb25SZXN1bHQsXG4gIG1pbkNvbnRlbnRIZWlnaHQsXG4gIG9uRmluYWxSZXNwb25zZSxcbn06IFByb3BzKTogUmVhY3QuUmVhY3ROb2RlIHtcbiAgcmV0dXJuIChcbiAgICA8Qm94IGZsZXhEaXJlY3Rpb249XCJjb2x1bW5cIiBtYXJnaW5Ub3A9ezF9PlxuICAgICAgPERpdmlkZXIgY29sb3I9XCJpbmFjdGl2ZVwiIC8+XG4gICAgICA8Qm94XG4gICAgICAgIGZsZXhEaXJlY3Rpb249XCJjb2x1bW5cIlxuICAgICAgICBib3JkZXJUb3BcbiAgICAgICAgYm9yZGVyQ29sb3I9XCJpbmFjdGl2ZVwiXG4gICAgICAgIHBhZGRpbmdUb3A9ezB9XG4gICAgICA+XG4gICAgICAgIDxRdWVzdGlvbk5hdmlnYXRpb25CYXJcbiAgICAgICAgICBxdWVzdGlvbnM9e3F1ZXN0aW9uc31cbiAgICAgICAgICBjdXJyZW50UXVlc3Rpb25JbmRleD17Y3VycmVudFF1ZXN0aW9uSW5kZXh9XG4gICAgICAgICAgYW5zd2Vycz17YW5zd2Vyc31cbiAgICAgICAgLz5cbiAgICAgICAgPFBlcm1pc3Npb25SZXF1ZXN0VGl0bGUgdGl0bGU9XCJSZXZpZXcgeW91ciBhbnN3ZXJzXCIgY29sb3I9XCJ0ZXh0XCIgLz5cbiAgICAgICAgPEJveCBmbGV4RGlyZWN0aW9uPVwiY29sdW1uXCIgbWFyZ2luVG9wPXsxfSBtaW5IZWlnaHQ9e21pbkNvbnRlbnRIZWlnaHR9PlxuICAgICAgICAgIHshYWxsUXVlc3Rpb25zQW5zd2VyZWQgJiYgKFxuICAgICAgICAgICAgPEJveCBtYXJnaW5Cb3R0b209ezF9PlxuICAgICAgICAgICAgICA8VGV4dCBjb2xvcj1cIndhcm5pbmdcIj5cbiAgICAgICAgICAgICAgICB7ZmlndXJlcy53YXJuaW5nfSBZb3UgaGF2ZSBub3QgYW5zd2VyZWQgYWxsIHF1ZXN0aW9uc1xuICAgICAgICAgICAgICA8L1RleHQ+XG4gICAgICAgICAgICA8L0JveD5cbiAgICAgICAgICApfVxuICAgICAgICAgIHtPYmplY3Qua2V5cyhhbnN3ZXJzKS5sZW5ndGggPiAwICYmIChcbiAgICAgICAgICAgIDxCb3ggZmxleERpcmVjdGlvbj1cImNvbHVtblwiIG1hcmdpbkJvdHRvbT17MX0+XG4gICAgICAgICAgICAgIHtxdWVzdGlvbnNcbiAgICAgICAgICAgICAgICAuZmlsdGVyKChxOiBRdWVzdGlvbikgPT4gcT8ucXVlc3Rpb24gJiYgYW5zd2Vyc1txLnF1ZXN0aW9uXSlcbiAgICAgICAgICAgICAgICAubWFwKChxOiBRdWVzdGlvbikgPT4ge1xuICAgICAgICAgICAgICAgICAgY29uc3QgYW5zd2VyID0gYW5zd2Vyc1txPy5xdWVzdGlvbl1cblxuICAgICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgPEJveFxuICAgICAgICAgICAgICAgICAgICAgIGtleT17cT8ucXVlc3Rpb24gfHwgJ2Fuc3dlcid9XG4gICAgICAgICAgICAgICAgICAgICAgZmxleERpcmVjdGlvbj1cImNvbHVtblwiXG4gICAgICAgICAgICAgICAgICAgICAgbWFyZ2luTGVmdD17MX1cbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxUZXh0PlxuICAgICAgICAgICAgICAgICAgICAgICAge2ZpZ3VyZXMuYnVsbGV0fSB7cT8ucXVlc3Rpb24gfHwgJ1F1ZXN0aW9uJ31cbiAgICAgICAgICAgICAgICAgICAgICA8L1RleHQ+XG4gICAgICAgICAgICAgICAgICAgICAgPEJveCBtYXJnaW5MZWZ0PXsyfT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxUZXh0IGNvbG9yPVwic3VjY2Vzc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7ZmlndXJlcy5hcnJvd1JpZ2h0fSB7YW5zd2VyfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9UZXh0PlxuICAgICAgICAgICAgICAgICAgICAgIDwvQm94PlxuICAgICAgICAgICAgICAgICAgICA8L0JveD5cbiAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgIDwvQm94PlxuICAgICAgICAgICl9XG5cbiAgICAgICAgICA8UGVybWlzc2lvblJ1bGVFeHBsYW5hdGlvblxuICAgICAgICAgICAgcGVybWlzc2lvblJlc3VsdD17cGVybWlzc2lvblJlc3VsdH1cbiAgICAgICAgICAgIHRvb2xUeXBlPVwidG9vbFwiXG4gICAgICAgICAgLz5cbiAgICAgICAgICA8VGV4dCBjb2xvcj1cImluYWN0aXZlXCI+UmVhZHkgdG8gc3VibWl0IHlvdXIgYW5zd2Vycz88L1RleHQ+XG4gICAgICAgICAgPEJveCBtYXJnaW5Ub3A9ezF9PlxuICAgICAgICAgICAgPFNlbGVjdFxuICAgICAgICAgICAgICBvcHRpb25zPXtbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgdHlwZTogJ3RleHQnIGFzIGNvbnN0LFxuICAgICAgICAgICAgICAgICAgbGFiZWw6ICdTdWJtaXQgYW5zd2VycycsXG4gICAgICAgICAgICAgICAgICB2YWx1ZTogJ3N1Ym1pdCcsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7IHR5cGU6ICd0ZXh0JyBhcyBjb25zdCwgbGFiZWw6ICdDYW5jZWwnLCB2YWx1ZTogJ2NhbmNlbCcgfSxcbiAgICAgICAgICAgICAgXX1cbiAgICAgICAgICAgICAgb25DaGFuZ2U9e3ZhbHVlID0+IG9uRmluYWxSZXNwb25zZSh2YWx1ZSBhcyAnc3VibWl0JyB8ICdjYW5jZWwnKX1cbiAgICAgICAgICAgICAgb25DYW5jZWw9eygpID0+IG9uRmluYWxSZXNwb25zZSgnY2FuY2VsJyl9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvQm94PlxuICAgICAgICA8L0JveD5cbiAgICAgIDwvQm94PlxuICAgIDwvQm94PlxuICApXG59XG4iXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPQSxPQUFPLE1BQU0sU0FBUztBQUM3QixPQUFPQyxLQUFLLE1BQU0sT0FBTztBQUN6QixTQUFTQyxHQUFHLEVBQUVDLElBQUksUUFBUSxpQkFBaUI7QUFDM0MsY0FBY0MsUUFBUSxRQUFRLDJEQUEyRDtBQUN6RixjQUFjQyxrQkFBa0IsUUFBUSxnREFBZ0Q7QUFDeEYsU0FBU0MsTUFBTSxRQUFRLDZCQUE2QjtBQUNwRCxTQUFTQyxPQUFPLFFBQVEsZ0NBQWdDO0FBQ3hELFNBQVND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
src/components/permissions/AskUserQuestionPermissionRequest/use-multiple-choice-state.ts ADDED
@@ -0,0 +1,179 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { useCallback, useReducer } from 'react'
2
+
3
+ export type AnswerValue = string
4
+
5
+ export type QuestionState = {
6
+ selectedValue?: string | string[]
7
+ textInputValue: string
8
+ }
9
+
10
+ type State = {
11
+ currentQuestionIndex: number
12
+ answers: Record<string, AnswerValue>
13
+ questionStates: Record<string, QuestionState>
14
+ isInTextInput: boolean
15
+ }
16
+
17
+ type Action =
18
+ | { type: 'next-question' }
19
+ | { type: 'prev-question' }
20
+ | {
21
+ type: 'update-question-state'
22
+ questionText: string
23
+ updates: Partial<QuestionState>
24
+ isMultiSelect: boolean
25
+ }
26
+ | {
27
+ type: 'set-answer'
28
+ questionText: string
29
+ answer: string
30
+ shouldAdvance: boolean
31
+ }
32
+ | { type: 'set-text-input-mode'; isInInput: boolean }
33
+
34
+ function reducer(state: State, action: Action): State {
35
+ switch (action.type) {
36
+ case 'next-question':
37
+ return {
38
+ ...state,
39
+ currentQuestionIndex: state.currentQuestionIndex + 1,
40
+ isInTextInput: false,
41
+ }
42
+
43
+ case 'prev-question':
44
+ return {
45
+ ...state,
46
+ currentQuestionIndex: Math.max(0, state.currentQuestionIndex - 1),
47
+ isInTextInput: false,
48
+ }
49
+
50
+ case 'update-question-state': {
51
+ const existing = state.questionStates[action.questionText]
52
+ const newState: QuestionState = {
53
+ selectedValue:
54
+ action.updates.selectedValue ??
55
+ existing?.selectedValue ??
56
+ (action.isMultiSelect ? [] : undefined),
57
+ textInputValue:
58
+ action.updates.textInputValue ?? existing?.textInputValue ?? '',
59
+ }
60
+
61
+ return {
62
+ ...state,
63
+ questionStates: {
64
+ ...state.questionStates,
65
+ [action.questionText]: newState,
66
+ },
67
+ }
68
+ }
69
+
70
+ case 'set-answer': {
71
+ const newState = {
72
+ ...state,
73
+ answers: {
74
+ ...state.answers,
75
+ [action.questionText]: action.answer,
76
+ },
77
+ }
78
+
79
+ if (action.shouldAdvance) {
80
+ return {
81
+ ...newState,
82
+ currentQuestionIndex: newState.currentQuestionIndex + 1,
83
+ isInTextInput: false,
84
+ }
85
+ }
86
+
87
+ return newState
88
+ }
89
+
90
+ case 'set-text-input-mode':
91
+ return {
92
+ ...state,
93
+ isInTextInput: action.isInInput,
94
+ }
95
+ }
96
+ }
97
+
98
+ const INITIAL_STATE: State = {
99
+ currentQuestionIndex: 0,
100
+ answers: {},
101
+ questionStates: {},
102
+ isInTextInput: false,
103
+ }
104
+
105
+ export type MultipleChoiceState = {
106
+ currentQuestionIndex: number
107
+ answers: Record<string, AnswerValue>
108
+ questionStates: Record<string, QuestionState>
109
+ isInTextInput: boolean
110
+ nextQuestion: () => void
111
+ prevQuestion: () => void
112
+ updateQuestionState: (
113
+ questionText: string,
114
+ updates: Partial<QuestionState>,
115
+ isMultiSelect: boolean,
116
+ ) => void
117
+ setAnswer: (
118
+ questionText: string,
119
+ answer: string,
120
+ shouldAdvance?: boolean,
121
+ ) => void
122
+ setTextInputMode: (isInInput: boolean) => void
123
+ }
124
+
125
+ export function useMultipleChoiceState(): MultipleChoiceState {
126
+ const [state, dispatch] = useReducer(reducer, INITIAL_STATE)
127
+
128
+ const nextQuestion = useCallback(() => {
129
+ dispatch({ type: 'next-question' })
130
+ }, [])
131
+
132
+ const prevQuestion = useCallback(() => {
133
+ dispatch({ type: 'prev-question' })
134
+ }, [])
135
+
136
+ const updateQuestionState = useCallback(
137
+ (
138
+ questionText: string,
139
+ updates: Partial<QuestionState>,
140
+ isMultiSelect: boolean,
141
+ ) => {
142
+ dispatch({
143
+ type: 'update-question-state',
144
+ questionText,
145
+ updates,
146
+ isMultiSelect,
147
+ })
148
+ },
149
+ [],
150
+ )
151
+
152
+ const setAnswer = useCallback(
153
+ (questionText: string, answer: string, shouldAdvance: boolean = true) => {
154
+ dispatch({
155
+ type: 'set-answer',
156
+ questionText,
157
+ answer,
158
+ shouldAdvance,
159
+ })
160
+ },
161
+ [],
162
+ )
163
+
164
+ const setTextInputMode = useCallback((isInInput: boolean) => {
165
+ dispatch({ type: 'set-text-input-mode', isInInput })
166
+ }, [])
167
+
168
+ return {
169
+ currentQuestionIndex: state.currentQuestionIndex,
170
+ answers: state.answers,
171
+ questionStates: state.questionStates,
172
+ isInTextInput: state.isInTextInput,
173
+ nextQuestion,
174
+ prevQuestion,
175
+ updateQuestionState,
176
+ setAnswer,
177
+ setTextInputMode,
178
+ }
179
+ }
src/components/permissions/ExitPlanModePermissionRequest/ExitPlanModePermissionRequest.tsx ADDED
The diff for this file is too large to render. See raw diff
 
src/components/permissions/FilePermissionDialog/permissionOptions.tsx ADDED
@@ -0,0 +1,177 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { homedir } from 'os';
2
+ import { basename, join, sep } from 'path';
3
+ import React, { type ReactNode } from 'react';
4
+ import { getOriginalCwd } from '../../../bootstrap/state.js';
5
+ import { Text } from '../../../ink.js';
6
+ import { getShortcutDisplay } from '../../../keybindings/shortcutFormat.js';
7
+ import type { ToolPermissionContext } from '../../../Tool.js';
8
+ import { expandPath, getDirectoryForPath } from '../../../utils/path.js';
9
+ import { normalizeCaseForComparison, pathInAllowedWorkingPath } from '../../../utils/permissions/filesystem.js';
10
+ import type { OptionWithDescription } from '../../CustomSelect/select.js';
11
+ /**
12
+ * Check if a path is within the project's .claude/ folder.
13
+ * This is used to determine whether to show the special ".claude folder" permission option.
14
+ */
15
+ export function isInClaudeFolder(filePath: string): boolean {
16
+ const absolutePath = expandPath(filePath);
17
+ const claudeFolderPath = expandPath(`${getOriginalCwd()}/.claude`);
18
+
19
+ // Check if the path is within the project's .claude folder
20
+ const normalizedAbsolutePath = normalizeCaseForComparison(absolutePath);
21
+ const normalizedClaudeFolderPath = normalizeCaseForComparison(claudeFolderPath);
22
+
23
+ // Path must start with the .claude folder path (and be inside it, not just the folder itself)
24
+ return normalizedAbsolutePath.startsWith(normalizedClaudeFolderPath + sep.toLowerCase()) ||
25
+ // Also match case where sep is / on posix systems
26
+ normalizedAbsolutePath.startsWith(normalizedClaudeFolderPath + '/');
27
+ }
28
+
29
+ /**
30
+ * Check if a path is within the global ~/.claude/ folder.
31
+ * This is used to determine whether to show the special ".claude folder" permission option
32
+ * for files in the user's home directory.
33
+ */
34
+ export function isInGlobalClaudeFolder(filePath: string): boolean {
35
+ const absolutePath = expandPath(filePath);
36
+ const globalClaudeFolderPath = join(homedir(), '.claude');
37
+ const normalizedAbsolutePath = normalizeCaseForComparison(absolutePath);
38
+ const normalizedGlobalClaudeFolderPath = normalizeCaseForComparison(globalClaudeFolderPath);
39
+ return normalizedAbsolutePath.startsWith(normalizedGlobalClaudeFolderPath + sep.toLowerCase()) || normalizedAbsolutePath.startsWith(normalizedGlobalClaudeFolderPath + '/');
40
+ }
41
+ export type PermissionOption = {
42
+ type: 'accept-once';
43
+ } | {
44
+ type: 'accept-session';
45
+ scope?: 'claude-folder' | 'global-claude-folder';
46
+ } | {
47
+ type: 'reject';
48
+ };
49
+ export type PermissionOptionWithLabel = OptionWithDescription<string> & {
50
+ option: PermissionOption;
51
+ };
52
+ export type FileOperationType = 'read' | 'write' | 'create';
53
+ export function getFilePermissionOptions({
54
+ filePath,
55
+ toolPermissionContext,
56
+ operationType = 'write',
57
+ onRejectFeedbackChange,
58
+ onAcceptFeedbackChange,
59
+ yesInputMode = false,
60
+ noInputMode = false
61
+ }: {
62
+ filePath: string;
63
+ toolPermissionContext: ToolPermissionContext;
64
+ operationType?: FileOperationType;
65
+ onRejectFeedbackChange?: (value: string) => void;
66
+ onAcceptFeedbackChange?: (value: string) => void;
67
+ yesInputMode?: boolean;
68
+ noInputMode?: boolean;
69
+ }): PermissionOptionWithLabel[] {
70
+ const options: PermissionOptionWithLabel[] = [];
71
+ const modeCycleShortcut = getShortcutDisplay('chat:cycleMode', 'Chat', 'shift+tab');
72
+
73
+ // When in input mode, show input field
74
+ if (yesInputMode && onAcceptFeedbackChange) {
75
+ options.push({
76
+ type: 'input',
77
+ label: 'Yes',
78
+ value: 'yes',
79
+ placeholder: 'and tell Claude what to do next',
80
+ onChange: onAcceptFeedbackChange,
81
+ allowEmptySubmitToCancel: true,
82
+ option: {
83
+ type: 'accept-once'
84
+ }
85
+ });
86
+ } else {
87
+ options.push({
88
+ label: 'Yes',
89
+ value: 'yes',
90
+ option: {
91
+ type: 'accept-once'
92
+ }
93
+ });
94
+ }
95
+ const inAllowedPath = pathInAllowedWorkingPath(filePath, toolPermissionContext);
96
+
97
+ // Check if this is a .claude/ folder path (project or global)
98
+ const inClaudeFolder = isInClaudeFolder(filePath);
99
+ const inGlobalClaudeFolder = isInGlobalClaudeFolder(filePath);
100
+
101
+ // Option 2: For .claude/ folder, show special option instead of generic session option
102
+ // Note: Session-level options are always shown since they only affect in-memory state,
103
+ // not persisted settings. The allowManagedPermissionRulesOnly setting only restricts
104
+ // persisted permission rules.
105
+ if ((inClaudeFolder || inGlobalClaudeFolder) && operationType !== 'read') {
106
+ options.push({
107
+ label: 'Yes, and allow Claude to edit its own settings for this session',
108
+ value: 'yes-claude-folder',
109
+ option: {
110
+ type: 'accept-session',
111
+ scope: inGlobalClaudeFolder ? 'global-claude-folder' : 'claude-folder'
112
+ }
113
+ });
114
+ } else {
115
+ // Option 2: Allow all changes/reads during session
116
+ let sessionLabel: ReactNode;
117
+ if (inAllowedPath) {
118
+ // Inside working directory
119
+ if (operationType === 'read') {
120
+ sessionLabel = 'Yes, during this session';
121
+ } else {
122
+ sessionLabel = <Text>
123
+ Yes, allow all edits during this session{' '}
124
+ <Text bold>({modeCycleShortcut})</Text>
125
+ </Text>;
126
+ }
127
+ } else {
128
+ // Outside working directory - include directory name
129
+ const dirPath = getDirectoryForPath(filePath);
130
+ const dirName = basename(dirPath) || 'this directory';
131
+ if (operationType === 'read') {
132
+ sessionLabel = <Text>
133
+ Yes, allow reading from <Text bold>{dirName}/</Text> during this
134
+ session
135
+ </Text>;
136
+ } else {
137
+ sessionLabel = <Text>
138
+ Yes, allow all edits in <Text bold>{dirName}/</Text> during this
139
+ session <Text bold>({modeCycleShortcut})</Text>
140
+ </Text>;
141
+ }
142
+ }
143
+ options.push({
144
+ label: sessionLabel,
145
+ value: 'yes-session',
146
+ option: {
147
+ type: 'accept-session'
148
+ }
149
+ });
150
+ }
151
+
152
+ // When in input mode, show input field for reject
153
+ if (noInputMode && onRejectFeedbackChange) {
154
+ options.push({
155
+ type: 'input',
156
+ label: 'No',
157
+ value: 'no',
158
+ placeholder: 'and tell Claude what to do differently',
159
+ onChange: onRejectFeedbackChange,
160
+ allowEmptySubmitToCancel: true,
161
+ option: {
162
+ type: 'reject'
163
+ }
164
+ });
165
+ } else {
166
+ // Not in input mode - simple option
167
+ options.push({
168
+ label: 'No',
169
+ value: 'no',
170
+ option: {
171
+ type: 'reject'
172
+ }
173
+ });
174
+ }
175
+ return options;
176
+ }
177
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJob21lZGlyIiwiYmFzZW5hbWUiLCJqb2luIiwic2VwIiwiUmVhY3QiLCJSZWFjdE5vZGUiLCJnZXRPcmlnaW5hbEN3ZCIsIlRleHQiLCJnZXRTaG9ydGN1dERpc3BsYXkiLCJUb29sUGVybWlzc2lvbkNvbnRleHQiLCJleHBhbmRQYXRoIiwiZ2V0RGlyZWN0b3J5Rm9yUGF0aCIsIm5vcm1hbGl6ZUNhc2VGb3JDb21wYXJpc29uIiwicGF0aEluQWxsb3dlZFdvcmtpbmdQYXRoIiwiT3B0aW9uV2l0aERlc2NyaXB0aW9uIiwiaXNJbkNsYXVkZUZvbGRlciIsImZpbGVQYXRoIiwiYWJzb2x1dGVQYXRoIiwiY2xhdWRlRm9sZGVyUGF0aCIsIm5vcm1hbGl6ZWRBYnNvbHV0ZVBhdGgiLCJub3JtYWxpemVkQ2xhdWRlRm9sZGVyUGF0aCIsInN0YXJ0c1dpdGgiLCJ0b0xvd2VyQ2FzZSIsImlzSW5HbG9iYWxDbGF1ZGVGb2xkZXIiLCJnbG9iYWxDbGF1ZGVGb2xkZXJQYXRoIiwibm9ybWFsaXplZEdsb2JhbENsYXVkZUZvbGRlclBhdGgiLCJQZXJtaXNzaW9uT3B0aW9uIiwidHlwZSIsInNjb3BlIiwiUGVybWlzc2lvbk9wdGlvbldpdGhMYWJlbCIsIm9wdGlvbiIsIkZpbGVPcGVyYXRpb25UeXBlIiwiZ2V0RmlsZVBlcm1pc3Npb25PcHRpb25zIiwidG9vbFBlcm1pc3Npb25Db250ZXh0Iiwib3BlcmF0aW9uVHlwZSIsIm9uUmVqZWN0RmVlZGJhY2tDaGFuZ2UiLCJvbkFjY2VwdEZlZWRiYWNrQ2hhbmdlIiwieWVzSW5wdXRNb2RlIiwibm9JbnB1dE1vZGUiLCJ2YWx1ZSIsIm9wdGlvbnMiLCJtb2RlQ3ljbGVTaG9ydGN1dCIsInB1c2giLCJsYWJlbCIsInBsYWNlaG9sZGVyIiwib25DaGFuZ2UiLCJhbGxvd0VtcHR5U3VibWl0VG9DYW5jZWwiLCJpbkFsbG93ZWRQYXRoIiwiaW5DbGF1ZGVGb2xkZXIiLCJpbkdsb2JhbENsYXVkZUZvbGRlciIsInNlc3Npb25MYWJlbCIsImRpclBhdGgiLCJkaXJOYW1lIl0sInNvdXJjZXMiOlsicGVybWlzc2lvbk9wdGlvbnMudHN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGhvbWVkaXIgfSBmcm9tICdvcydcbmltcG9ydCB7IGJhc2VuYW1lLCBqb2luLCBzZXAgfSBmcm9tICdwYXRoJ1xuaW1wb3J0IFJlYWN0LCB7IHR5cGUgUmVhY3ROb2RlIH0gZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBnZXRPcmlnaW5hbEN3ZCB9IGZyb20gJy4uLy4uLy4uL2Jvb3RzdHJhcC9zdGF0ZS5qcydcbmltcG9ydCB7IFRleHQgfSBmcm9tICcuLi8uLi8uLi9pbmsuanMnXG5pbXBvcnQgeyBnZXRTaG9ydGN1dERpc3BsYXkgfSBmcm9tICcuLi8uLi8uLi9rZXliaW5kaW5ncy9zaG9ydGN1dEZvcm1hdC5qcydcbmltcG9ydCB0eXBlIHsgVG9vbFBlcm1pc3Npb25Db250ZXh0IH0gZnJvbSAnLi4vLi4vLi4vVG9vbC5qcydcbmltcG9ydCB7IGV4cGFuZFBhdGgsIGdldERpcmVjdG9yeUZvclBhdGggfSBmcm9tICcuLi8uLi8uLi91dGlscy9wYXRoLmpzJ1xuaW1wb3J0IHtcbiAgbm9ybWFsaXplQ2FzZUZvckNvbXBhcmlzb24sXG4gIHBhdGhJbkFsbG93ZWRXb3JraW5nUGF0aCxcbn0gZnJvbSAnLi4vLi4vLi4vdXRpbHMvcGVybWlzc2lvbnMvZmlsZXN5c3RlbS5qcydcbmltcG9ydCB0eXBlIHsgT3B0aW9uV2l0aERlc2NyaXB0aW9uIH0gZnJvbSAnLi4vLi4vQ3VzdG9tU2VsZWN0L3NlbGVjdC5qcydcbi8qKlxuICogQ2hlY2sgaWYgYSBwYXRoIGlzIHdpdGhpbiB0aGUgcHJvamVjdCdzIC5jbGF1ZGUvIGZvbGRlci5cbiAqIFRoaXMgaXMgdXNlZCB0byBkZXRlcm1pbmUgd2hldGhlciB0byBzaG93IHRoZSBzcGVjaWFsIFwiLmNsYXVkZSBmb2xkZXJcIiBwZXJtaXNzaW9uIG9wdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzSW5DbGF1ZGVGb2xkZXIoZmlsZVBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBhYnNvbHV0ZVBhdGggPSBleHBhbmRQYXRoKGZpbGVQYXRoKVxuICBjb25zdCBjbGF1ZGVGb2xkZXJQYXRoID0gZXhwYW5kUGF0aChgJHtnZXRPcmlnaW5hbEN3ZCgpfS8uY2xhdWRlYClcblxuICAvLyBDaGVjayBpZiB0aGUgcGF0aCBpcyB3aXRoaW4gdGhlIHByb2plY3QncyAuY2xhdWRlIGZvbGRlclxuICBjb25zdCBub3JtYWxpemVkQWJzb2x1dGVQYXRoID0gbm9ybWFsaXplQ2FzZUZvckNvbXBhcmlzb24oYWJzb2x1dGVQYXRoKVxuICBjb25zdCBub3JtYWxpemVkQ2xhdWRlRm9sZGVyUGF0aCA9XG4gICAgbm9ybWFsaXplQ2FzZUZvckNvbXBhcmlzb24oY2xhdWRlRm9sZGVyUGF0aClcblxuICAvLyBQYXRoIG11c3Qgc3RhcnQgd2l0aCB0aGUgLmNsYXVkZSBmb2xkZXIgcGF0aCAoYW5kIGJlIGluc2lkZSBpdCwgbm90IGp1c3QgdGhlIGZvbGRlciBpdHNlbGYpXG4gIHJldHVybiAoXG4gICAgbm9ybWFsaXplZEFic29sdXRlUGF0aC5zdGFydHNXaXRoKFxuICAgICAgbm9ybWFsaXplZENsYXVkZUZvbGRlclBhdGggKyBzZXAudG9Mb3dlckNhc2UoKSxcbiAgICApIHx8XG4gICAgLy8gQWxzbyBtYXRjaCBjYXNlIHdoZXJlIHNlcCBpcyAvIG9uIHBvc2l4IHN5c3RlbXNcbiAgICBub3JtYWxpemVkQWJzb2x1dGVQYXRoLnN0YXJ0c1dpdGgobm9ybWFsaXplZENsYXVkZUZvbGRlclBhdGggKyAnLycpXG4gIClcbn1cblxuLyoqXG4gKiBDaGVjayBpZiBhIHBhdGggaXMgd2l0aGluIHRoZSBnbG9iYWwgfi8uY2xhdWRlLyBmb2xkZXIuXG4gKiBUaGlzIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdG8gc2hvdyB0aGUgc3BlY2lhbCBcIi5jbGF1ZGUgZm9sZGVyXCIgcGVybWlzc2lvbiBvcHRpb25cbiAqIGZvciBmaWxlcyBpbiB0aGUgdXNlcidzIGhvbWUgZGlyZWN0b3J5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNJbkdsb2JhbENsYXVkZUZvbGRlcihmaWxlUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IGFic29sdXRlUGF0aCA9IGV4cGFuZFBhdGgoZmlsZVBhdGgpXG4gIGNvbnN0IGdsb2JhbENsYXVkZUZvbGRlclBhdGggPSBqb2luKGhvbWVkaXIoKSwgJy5jbGF1ZGUnKVxuXG4gIGNvbnN0IG5vcm1hbGl6ZWRBYnNvbHV0ZVBhdGggPSBub3JtYWxpemVDYXNlRm9yQ29tcGFyaXNvbihhYnNvbHV0ZVBhdGgpXG4gIGNvbnN0IG5vcm1hbGl6ZWRHbG9iYWxDbGF1ZGVGb2xkZXJQYXRoID0gbm9ybWFsaXplQ2FzZUZvckNvbXBhcmlzb24oXG4gICAgZ2xvYmFsQ2xhdWRlRm9sZGVyUGF0aCxcbiAgKVxuXG4gIHJldHVybiAoXG4gICAgbm9ybWFsaXplZEFic29sdXRlUGF0aC5zdGFydHNXaXRoKFxuICAgICAgbm9ybWFsaXplZEdsb2JhbENsYXVkZUZvbGRlclBhdGggKyBzZXAudG9Mb3dlckNhc2UoKSxcbiAgICApIHx8XG4gICAgbm9ybWFsaXplZEFic29sdXRlUGF0aC5zdGFydHNXaXRoKG5vcm1hbGl6ZWRHbG9iYWxDbGF1ZGVGb2xkZXJQYXRoICsgJy8nKVxuICApXG59XG5cbmV4cG9ydCB0eXBlIFBlcm1pc3Npb25PcHRpb24gPVxuICB8IHsgdHlwZTogJ2FjY2VwdC1vbmNlJyB9XG4gIHwgeyB0eXBlOiAnYWNjZXB0LXNlc3Npb24nOyBzY29wZT86ICdjbGF1ZGUtZm9sZGVyJyB8ICdnbG9iYWwtY2xhdWRlLWZvbGRlcicgfVxuICB8IHsgdHlwZTogJ3JlamVjdCcgfVxuXG5leHBvcnQgdHlwZSBQZXJtaXNzaW9uT3B0aW9uV2l0aExhYmVsID0gT3B0aW9uV2l0aERlc2NyaXB0aW9uPHN0cmluZz4gJiB7XG4gIG9wdGlvbjogUGVybWlzc2lvbk9wdGlvblxufVxuXG5leHBvcnQgdHlwZSBGaWxlT3BlcmF0aW9uVHlwZSA9ICdyZWFkJyB8ICd3cml0ZScgfCAnY3JlYXRlJ1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RmlsZVBlcm1pc3Npb25PcHRpb25zKHtcbiAgZmlsZVBhdGgsXG4gIHRvb2xQZXJtaXNzaW9uQ29udGV4dCxcbiAgb3BlcmF0aW9uVHlwZSA9ICd3cml0ZScsXG4gIG9uUmVqZWN0RmVlZGJhY2tDaGFuZ2UsXG4gIG9uQWNjZXB0RmVlZGJhY2tDaGFuZ2UsXG4gIHllc0lucHV0TW9kZSA9IGZhbHNlLFxuICBub0lucHV0TW9kZSA9IGZhbHNlLFxufToge1xuICBmaWxlUGF0aDogc3RyaW5nXG4gIHRvb2xQZXJtaXNzaW9uQ29udGV4dDogVG9vbFBlcm1pc3Npb25Db250ZXh0XG4gIG9wZXJhdGlvblR5cGU/OiBGaWxlT3BlcmF0aW9uVHlwZVxuICBvblJlamVjdEZlZWRiYWNrQ2hhbmdlPzogKHZhbHVlOiBzdHJpbmcpID0+IHZvaWRcbiAgb25BY2NlcHRGZWVkYmFja0NoYW5nZT86ICh2YWx1ZTogc3RyaW5nKSA9PiB2b2lkXG4gIHllc0lucHV0TW9kZT86IGJvb2xlYW5cbiAgbm9JbnB1dE1vZGU/OiBib29sZWFuXG59KTogUGVybWlzc2lvbk9wdGlvbldpdGhMYWJlbFtdIHtcbiAgY29uc3Qgb3B0aW9uczogUGVybWlzc2lvbk9wdGlvbldpdGhMYWJlbFtdID0gW11cbiAgY29uc3QgbW9kZUN5Y2xlU2hvcnRjdXQgPSBnZXRTaG9ydGN1dERpc3BsYXkoXG4gICAgJ2NoYXQ6Y3ljbGVNb2RlJyxcbiAgICAnQ2hhdCcsXG4gICAgJ3NoaWZ0K3RhYicsXG4gIClcblxuICAvLyBXaGVuIGluIGlucHV0IG1vZGUsIHNob3cgaW5wdXQgZmllbGRcbiAgaWYgKHllc0lucHV0TW9kZSAmJiBvbkFjY2VwdEZlZWRiYWNrQ2hhbmdlKSB7XG4gICAgb3B0aW9ucy5wdXNoKHtcbiAgICAgIHR5cGU6ICdpbnB1dCcsXG4gICAgICBsYWJlbDogJ1llcycsXG4gICAgICB2YWx1ZTogJ3llcycsXG4gICAgICBwbGFjZWhvbGRlcjogJ2FuZCB0ZWxsIENsYXVkZSB3aGF0IHRvIGRvIG5leHQnLFxuICAgICAgb25DaGFuZ2U6IG9uQWNjZXB0RmVlZGJhY2tDaGFuZ2UsXG4gICAgICBhbGxvd0VtcHR5U3VibWl0VG9DYW5jZWw6IHRydWUsXG4gICAgICBvcHRpb246IHsgdHlwZTogJ2FjY2VwdC1vbmNlJyB9LFxuICAgIH0pXG4gIH0gZWxzZSB7XG4gICAgb3B0aW9ucy5wdXNoKHtcbiAgICAgIGxhYmVsOiAnWWVzJyxcbiAgICAgIHZhbHVlOiAneWVzJyxcbiAgICAgIG9wdGlvbjogeyB0eXBlOiAnYWNjZXB0LW9uY2UnIH0sXG4gICAgfSlcbiAgfVxuXG4gIGNvbnN0IGluQWxsb3dlZFBhdGggPSBwYXRoSW5BbGxvd2VkV29ya2luZ1BhdGgoXG4gICAgZmlsZVBhdGgsXG4gICAgdG9vbFBlcm1pc3Npb25Db250ZXh0LFxuICApXG5cbiAgLy8gQ2hlY2sgaWYgdGhpcyBpcyBhIC5jbGF1ZGUvIGZvbGRlciBwYXRoIChwcm9qZWN0IG9yIGdsb2JhbClcbiAgY29uc3QgaW5DbGF1ZGVGb2xkZXIgPSBpc0luQ2xhdWRlRm9sZGVyKGZpbGVQYXRoKVxuICBjb25zdCBpbkdsb2JhbENsYXVkZUZvbGRlciA9IGlzSW5HbG9iYWxDbGF1ZGVGb2xkZXIoZmlsZVBhdGgpXG5cbiAgLy8gT3B0aW9uIDI6IEZvciAuY2xhdWRlLyBmb2xkZXIsIHNob3cgc3BlY2lhbCBvcHRpb24gaW5zdGVhZCBvZiBnZW5lcmljIHNlc3Npb24gb3B0aW9uXG4gIC8vIE5vdGU6IFNlc3Npb24tbGV2ZWwgb3B0aW9ucyBhcmUgYWx3YXlzIHNob3duIHNpbmNlIHRoZXkgb25seSBhZmZlY3QgaW4tbWVtb3J5IHN0YXRlLFxuICAvLyBub3QgcGVyc2lzdGVkIHNldHRpbmdzLiBUaGUgYWxsb3dNYW5hZ2VkUGVybWlzc2lvblJ1bGVzT25seSBzZXR0aW5nIG9ubHkgcmVzdHJpY3RzXG4gIC8vIHBlcnNpc3RlZCBwZXJtaXNzaW9uIHJ1bGVzLlxuICBpZiAoKGluQ2xhdWRlRm9sZGVyIHx8IGluR2xvYmFsQ2xhdWRlRm9sZGVyKSAmJiBvcGVyYXRpb25UeXBlICE9PSAncmVhZCcpIHtcbiAgICBvcHRpb25zLnB1c2goe1xuICAgICAgbGFiZWw6ICdZZXMsIGFuZCBhbGxvdyBDbGF1ZGUgdG8gZWRpdCBpdHMgb3duIHNldHRpbmdzIGZvciB0aGlzIHNlc3Npb24nLFxuICAgICAgdmFsdWU6ICd5ZXMtY2xhdWRlLWZvbGRlcicsXG4gICAgICBvcHRpb246IHtcbiAgICAgICAgdHlwZTogJ2FjY2VwdC1zZXNzaW9uJyxcbiAgICAgICAgc2NvcGU6IGluR2xvYmFsQ2xhdWRlRm9sZGVyID8gJ2dsb2JhbC1jbGF1ZGUtZm9sZGVyJyA6ICdjbGF1ZGUtZm9sZGVyJyxcbiAgICAgIH0sXG4gICAgfSlcbiAgfSBlbHNlIHtcbiAgICAvLyBPcHRpb24gMjogQWxsb3cgYWxsIGNoYW5nZXMvcmVhZHMgZHVyaW5nIHNlc3Npb25cbiAgICBsZXQgc2Vzc2lvbkxhYmVsOiBSZWFjdE5vZGVcblxuICAgIGlmIChpbkFsbG93ZWRQYXRoKSB7XG4gICAgICAvLyBJbnNpZGUgd29ya2luZyBkaXJlY3RvcnlcbiAgICAgIGlmIChvcGVyYXRpb25UeXBlID09PSAncmVhZCcpIHtcbiAgICAgICAgc2Vzc2lvbkxhYmVsID0gJ1llcywgZHVyaW5nIHRoaXMgc2Vzc2lvbidcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNlc3Npb25MYWJlbCA9IChcbiAgICAgICAgICA8VGV4dD5cbiAgICAgICAgICAgIFllcywgYWxsb3cgYWxsIGVkaXRzIGR1cmluZyB0aGlzIHNlc3Npb257JyAnfVxuICAgICAgICAgICAgPFRleHQgYm9sZD4oe21vZGVDeWNsZVNob3J0Y3V0fSk8L1RleHQ+XG4gICAgICAgICAgPC9UZXh0PlxuICAgICAgICApXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE91dHNpZGUgd29ya2luZyBkaXJlY3RvcnkgLSBpbmNsdWRlIGRpcmVjdG9yeSBuYW1lXG4gICAgICBjb25zdCBkaXJQYXRoID0gZ2V0RGlyZWN0b3J5Rm9yUGF0aChmaWxlUGF0aClcbiAgICAgIGNvbnN0IGRpck5hbWUgPSBiYXNlbmFtZShkaXJQYXRoKSB8fCAndGhpcyBkaXJlY3RvcnknXG5cbiAgICAgIGlmIChvcGVyYXRpb25UeXBlID09PSAncmVhZCcpIHtcbiAgICAgICAgc2Vzc2lvbkxhYmVsID0gKFxuICAgICAgICAgIDxUZXh0PlxuICAgICAgICAgICAgWWVzLCBhbGxvdyByZWFkaW5nIGZyb20gPFRleHQgYm9sZD57ZGlyTmFtZX0vPC9UZXh0PiBkdXJpbmcgdGhpc1xuICAgICAgICAgICAgc2Vzc2lvblxuICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2Vzc2lvbkxhYmVsID0gKFxuICAgICAgICAgIDxUZXh0PlxuICAgICAgICAgICAgWWVzLCBhbGxvdyBhbGwgZWRpdHMgaW4gPFRleHQgYm9sZD57ZGlyTmFtZX0vPC9UZXh0PiBkdXJpbmcgdGhpc1xuICAgICAgICAgICAgc2Vzc2lvbiA8VGV4dCBib2xkPih7bW9kZUN5Y2xlU2hvcnRjdXR9KTwvVGV4dD5cbiAgICAgICAgICA8L1RleHQ+XG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBvcHRpb25zLnB1c2goe1xuICAgICAgbGFiZWw6IHNlc3Npb25MYWJlbCxcbiAgICAgIHZhbHVlOiAneWVzLXNlc3Npb24nLFxuICAgICAgb3B0aW9uOiB7IHR5cGU6ICdhY2NlcHQtc2Vzc2lvbicgfSxcbiAgICB9KVxuICB9XG5cbiAgLy8gV2hlbiBpbiBpbnB1dCBtb2RlLCBzaG93IGlucHV0IGZpZWxkIGZvciByZWplY3RcbiAgaWYgKG5vSW5wdXRNb2RlICYmIG9uUmVqZWN0RmVlZGJhY2tDaGFuZ2UpIHtcbiAgICBvcHRpb25zLnB1c2goe1xuICAgICAgdHlwZTogJ2lucHV0JyxcbiAgICAgIGxhYmVsOiAnTm8nLFxuICAgICAgdmFsdWU6ICdubycsXG4gICAgICBwbGFjZWhvbGRlcjogJ2FuZCB0ZWxsIENsYXVkZSB3aGF0IHRvIGRvIGRpZmZlcmVudGx5JyxcbiAgICAgIG9uQ2hhbmdlOiBvblJlamVjdEZlZWRiYWNrQ2hhbmdlLFxuICAgICAgYWxsb3dFbXB0eVN1Ym1pdFRvQ2FuY2VsOiB0cnVlLFxuICAgICAgb3B0aW9uOiB7IHR5cGU6ICdyZWplY3QnIH0sXG4gICAgfSlcbiAgfSBlbHNlIHtcbiAgICAvLyBOb3QgaW4gaW5wdXQgbW9kZSAtIHNpbXBsZSBvcHRpb25cbiAgICBvcHRpb25zLnB1c2goe1xuICAgICAgbGFiZWw6ICdObycsXG4gICAgICB2YWx1ZTogJ25vJyxcbiAgICAgIG9wdGlvbjogeyB0eXBlOiAncmVqZWN0JyB9LFxuICAgIH0pXG4gIH1cblxuICByZXR1cm4gb3B0aW9uc1xufVxuIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxPQUFPLFFBQVEsSUFBSTtBQUM1QixTQUFTQyxRQUFRLEVBQUVDLElBQUksRUFBRUMsR0FBRyxRQUFRLE1BQU07QUFDMUMsT0FBT0MsS0FBSyxJQUFJLEtBQUtDLFNBQVMsUUFBUSxPQUFPO0FBQzdDLFNBQVNDLGNBQWMsUUFBUSw2QkFBNkI7QUFDNUQsU0FBU0MsSUFBSSxRQUFRLGlCQUFpQjtBQUN0QyxTQUFTQyxrQkFBa0IsUUFBUSx3Q0FBd0M7QUFDM0UsY0FBY0MscUJBQXFCLFFBQVEsa0JBQWtCO0FBQzdELFNBQVNDLFVBQVUsRUFBRUMsbUJBQW1CLFFBQVEsd0JBQXdCO0FBQ3hFLFNBQ0VDLDBCQUEwQixFQUMxQkMsd0JBQXdCLFFBQ25CLDBDQUEwQztBQUNqRCxjQUFjQyxxQkFBcUIsUUFBUSw4QkFBOEI7QUFDekU7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPLFNBQVNDLGdCQUFnQkEsQ0FBQ0MsUUFBUSxFQUFFLE1BQU0sQ0FBQyxFQUFFLE9BQU8sQ0FBQztFQUMxRCxNQUFNQyxZQUFZLEdBQUdQLFVBQVUsQ0FBQ00sUUFBUSxDQUFDO0VBQ3pDLE1BQU1FLGdCQUFnQixHQUFHUixVQUFVLENBQUMsR0FBR0osY0FBYyxDQUFDLENBQUMsVUFBVSxDQUFDOztFQUVsRTtFQUNBLE1BQU1hLHNCQUFzQixHQUFHUCwwQkFBMEIsQ0FBQ0ssWUFBWSxDQUFDO0VBQ3ZFLE1BQU1HLDBCQUEwQixHQUM5QlIsMEJBQTBCLENBQUNNLGdCQUFnQixDQUFDOztFQUU5QztFQUNBLE9BQ0VDLHNCQUFzQixDQUFDRSxVQUFVLENBQy9CRCwwQkFBMEIsR0FBR2pCLEdBQUcsQ0FBQ21CLFdBQVcsQ0FBQyxDQUMvQyxDQUFDO0VBQ0Q7RUFDQUgsc0JBQXNCLENBQUNFLFVBQVUsQ0FBQ0QsMEJBQTBCLEdBQUcsR0FBRyxDQUFDO0FBRXZFOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPLFNBQVNHLHNCQUFzQkEsQ0FBQ1AsUUFBUSxFQUFFLE1BQU0sQ0FBQyxFQUFFLE9BQU8sQ0FBQztFQUNoRSxNQUFNQyxZQUFZLEdBQUdQLFVBQVUsQ0FBQ00sUUFBUSxDQUFDO0VBQ3pDLE1BQU1RLHNCQUFzQixHQUFHdEIsSUFBSSxDQUFDRixPQUFPLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQztFQUV6RCxNQUFNbUIsc0JBQXNCLEdBQUdQLDBCQUEwQixDQUFDSyxZQUFZLENBQUM7RUFDdkUsTUFBTVEsZ0NBQWdDLEdBQUdiLDBCQUEwQixDQUNqRVksc0JBQ0YsQ0FBQztFQUVELE9BQ0VMLHNCQUFzQixDQUFDRSxVQUFVLENBQy9CSSxnQ0FBZ0MsR0FBR3RCLEdBQUcsQ0FBQ21CLFdBQVcsQ0FBQyxDQUNyRCxDQUFDLElBQ0RILHNCQUFzQixDQUFDRSxVQUFVLENBQUNJLGdDQUFnQyxHQUFHLEdBQUcsQ0FBQztBQUU3RTtBQUVBLE9BQU8sS0FBS0MsZ0JBQWdCLEdBQ3hCO0VBQUVDLElBQUksRUFBRSxhQUFhO0FBQUMsQ0FBQyxHQUN2QjtFQUFFQSxJQUFJLEVBQUUsZ0JBQWdCO0VBQUVDLEtBQUssQ0FBQyxFQUFFLGVBQWUsR0FBRyxzQkFBc0I7QUFBQyxDQUFDLEdBQzVFO0VBQUVELElBQUksRUFBRSxRQUFRO0FBQUMsQ0FBQztBQUV0QixPQUFPLEtBQUtFLHlCQUF5QixHQUFHZixxQkFBcUIsQ0FBQyxNQUFNLENBQUMsR0FBRztFQUN0RWdCLE1BQU0sRUFBRUosZ0JBQWdCO0FBQzFCLENBQUM7QUFFRCxPQUFPLEtBQUtLLGlCQUFpQixHQUFHLE1BQU0sR0FBRyxPQUFPLEdBQUcsUUFBUTtBQUUzRCxPQUFPLFNBQVNDLHdCQUF3QkEsQ0FBQztFQUN2Q2hCLFFBQVE7RUFDUmlCLHFCQUFxQjtFQUNyQkMsYUFBYSxHQUFHLE9BQU87RUFDdkJDLHNCQUFzQjtFQUN0QkMsc0JBQXNCO0VBQ3RCQyxZQUFZLEdBQUcsS0FBSztFQUNwQkMsV0FBVyxHQUFHO0FBU2hCLENBUkMsRUFBRTtFQUNEdEIsUUFBUSxFQUFFLE1BQU07RUFDaEJpQixxQkFBcUIsRUFBRXhCLHFCQUFxQjtFQUM1Q3lCLGFBQWEsQ0FBQyxFQUFFSCxpQkFBaUI7RUFDakNJLHNCQUFzQixDQUFDLEVBQUUsQ0FBQ0ksS0FBSyxFQUFFLE1BQU0sRUFBRSxHQUFHLElBQUk7RUFDaERILHNCQUFzQixDQUFDLEVBQUUsQ0FBQ0csS0FBSyxFQUFFLE1BQU0sRUFBRSxHQUFHLElBQUk7RUFDaERGLFlBQVksQ0FBQyxFQUFFLE9BQU87RUFDdEJDLFdBQVcsQ0FBQyxFQUFFLE9BQU87QUFDdkIsQ0FBQyxDQUFDLEVBQUVULHlCQUF5QixFQUFFLENBQUM7RUFDOUIsTUFBTVcsT0FBTyxFQUFFWCx5QkFBeUIsRUFBRSxHQUFHLEVBQUU7RUFDL0MsTUFBTVksaUJBQWlCLEdBQUdqQyxrQkFBa0IsQ0FDMUMsZ0JBQWdCLEVBQ2hCLE1BQU0sRUFDTixXQUNGLENBQUM7O0VBRUQ7RUFDQSxJQUFJNkIsWUFBWSxJQUFJRCxzQkFBc0IsRUFBRTtJQUMxQ0ksT0FBTyxDQUFDRSxJQUFJLENBQUM7TUFDWGYsSUFBSSxFQUFFLE9BQU87TUFDYmdCLEtBQUssRUFBRSxLQUFLO01BQ1pKLEtBQUssRUFBRSxLQUFLO01BQ1pLLFdBQVcsRUFBRSxpQ0FBaUM7TUFDOUNDLFFBQVEsRUFBRVQsc0JBQXNCO01BQ2hDVSx3QkFBd0IsRUFBRSxJQUFJO01BQzlCaEIsTUFBTSxFQUFFO1FBQUVILElBQUksRUFBRTtNQUFjO0lBQ2hDLENBQUMsQ0FBQztFQUNKLENBQUMsTUFBTTtJQUNMYSxPQUFPLENBQUNFLElBQUksQ0FBQztNQUNYQyxLQUFLLEVBQUUsS0FBSztNQUNaSixLQUFLLEVBQUUsS0FBSztNQUNaVCxNQUFNLEVBQUU7UUFBRUgsSUFBSSxFQUFFO01BQWM7SUFDaEMsQ0FBQyxDQUFDO0VBQ0o7RUFFQSxNQUFNb0IsYUFBYSxHQUFHbEMsd0JBQXdCLENBQzVDRyxRQUFRLEVBQ1JpQixxQkFDRixDQUFDOztFQUVEO0VBQ0EsTUFBTWUsY0FBYyxHQUFHakMsZ0JBQWdCLENBQUNDLFFBQVEsQ0FBQztFQUNqRCxNQUFNaUMsb0JBQW9CLEdBQUcxQixzQkFBc0IsQ0FBQ1AsUUFBUSxDQUFDOztFQUU3RDtFQUNBO0VBQ0E7RUFDQTtFQUNBLElBQUksQ0FBQ2dDLGNBQWMsSUFBSUMsb0JBQW9CLEtBQUtmLGFBQWEsS0FBSyxNQUFNLEVBQUU7SUFDeEVNLE9BQU8sQ0FBQ0UsSUFBSSxDQUFDO01BQ1hDLEtBQUssRUFBRSxpRUFBaUU7TUFDeEVKLEtBQUssRUFBRSxtQkFBbUI7TUFDMUJULE1BQU0sRUFBRTtRQUNOSCxJQUFJLEVBQUUsZ0JBQWdCO1FBQ3RCQyxLQUFLLEVBQUVxQixvQkFBb0IsR0FBRyxzQkFBc0IsR0FBRztNQUN6RDtJQUNGLENBQUMsQ0FBQztFQUNKLENBQUMsTUFBTTtJQUNMO0lBQ0EsSUFBSUMsWUFBWSxFQUFFN0MsU0FBUztJQUUzQixJQUFJMEMsYUFBYSxFQUFFO01BQ2pCO01BQ0EsSUFBSWIsYUFBYSxLQUFLLE1BQU0sRUFBRTtRQUM1QmdCLFlBQVksR0FBRywwQkFBMEI7TUFDM0MsQ0FBQyxNQUFNO1FBQ0xBLFlBQVksR0FDVixDQUFDLElBQUk7QUFDZixvREFBb0QsQ0FBQyxHQUFHO0FBQ3hELFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQ1QsaUJBQWlCLENBQUMsQ0FBQyxFQUFFLElBQUk7QUFDbEQsVUFBVSxFQUFFLElBQUksQ0FDUDtNQUNIO0lBQ0YsQ0FBQyxNQUFNO01BQ0w7TUFDQSxNQUFNVSxPQUFPLEdBQUd4QyxtQkFBbUIsQ0FBQ0ssUUFBUSxDQUFDO01BQzdDLE1BQU1vQyxPQUFPLEdBQUduRCxRQUFRLENBQUNrRCxPQUFPLENBQUMsSUFBSSxnQkFBZ0I7TUFFckQsSUFBSWpCLGFBQWEsS0FBSyxNQUFNLEVBQUU7UUFDNUJnQixZQUFZLEdBQ1YsQ0FBQyxJQUFJO0FBQ2Ysb0NBQW9DLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDRSxPQUFPLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQztBQUNoRTtBQUNBLFVBQVUsRUFBRSxJQUFJLENBQ1A7TUFDSCxDQUFDLE1BQU07UUFDTEYsWUFBWSxHQUNWLENBQUMsSUFBSTtBQUNmLG9DQUFvQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQ0UsT0FBTyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUM7QUFDaEUsb0JBQW9CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUNYLGlCQUFpQixDQUFDLENBQUMsRUFBRSxJQUFJO0FBQzFELFVBQVUsRUFBRSxJQUFJLENBQ1A7TUFDSDtJQUNGO0lBRUFELE9BQU8sQ0FBQ0UsSUFBSSxDQUFDO01BQ1hDLEtBQUssRUFBRU8sWUFBWTtNQUNuQlgsS0FBSyxFQUFFLGFBQWE7TUFDcEJULE1BQU0sRUFBRTtRQUFFSCxJQUFJLEVBQUU7TUFBaUI7SUFDbkMsQ0FBQyxDQUFDO0VBQ0o7O0VBRUE7RUFDQSxJQUFJVyxXQUFXLElBQUlILHNCQUFzQixFQUFFO0lBQ3pDSyxPQUFPLENBQUNFLElBQUksQ0FBQztNQUNYZixJQUFJLEVBQUUsT0FBTztNQUNiZ0IsS0FBSyxFQUFFLElBQUk7TUFDWEosS0FBSyxFQUFFLElBQUk7TUFDWEssV0FBVyxFQUFFLHdDQUF3QztNQUNyREMsUUFBUSxFQUFFVixzQkFBc0I7TUFDaENXLHdCQUF3QixFQUFFLElBQUk7TUFDOUJoQixNQUFNLEVBQUU7UUFBRUgsSUFBSSxFQUFFO01BQVM7SUFDM0IsQ0FBQyxDQUFDO0VBQ0osQ0FBQyxNQUFNO0lBQ0w7SUFDQWEsT0FBTyxDQUFDRSxJQUFJLENBQUM7TUFDWEMsS0FBSyxFQUFFLElBQUk7TUFDWEosS0FBSyxFQUFFLElBQUk7TUFDWFQsTUFBTSxFQUFFO1FBQUVILElBQUksRUFBRTtNQUFTO0lBQzNCLENBQUMsQ0FBQztFQUNKO0VBRUEsT0FBT2EsT0FBTztBQUNoQiIsImlnbm9yZUxpc3QiOltdfQ==
src/components/permissions/FilePermissionDialog/usePermissionHandler.ts ADDED
@@ -0,0 +1,185 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import {
2
+ type AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
3
+ logEvent,
4
+ } from '../../../services/analytics/index.js'
5
+ import { sanitizeToolNameForAnalytics } from '../../../services/analytics/metadata.js'
6
+ import type { ToolPermissionContext } from '../../../Tool.js'
7
+ import {
8
+ CLAUDE_FOLDER_PERMISSION_PATTERN,
9
+ FILE_EDIT_TOOL_NAME,
10
+ GLOBAL_CLAUDE_FOLDER_PERMISSION_PATTERN,
11
+ } from '../../../tools/FileEditTool/constants.js'
12
+ import { env } from '../../../utils/env.js'
13
+ import { generateSuggestions } from '../../../utils/permissions/filesystem.js'
14
+ import type { PermissionUpdate } from '../../../utils/permissions/PermissionUpdateSchema.js'
15
+ import {
16
+ type CompletionType,
17
+ logUnaryEvent,
18
+ } from '../../../utils/unaryLogging.js'
19
+ import type { ToolUseConfirm } from '../PermissionRequest.js'
20
+ import type {
21
+ FileOperationType,
22
+ PermissionOption,
23
+ } from './permissionOptions.js'
24
+
25
+ function logPermissionEvent(
26
+ event: 'accept' | 'reject',
27
+ completionType: CompletionType,
28
+ languageName: string | Promise<string>,
29
+ messageId: string,
30
+ hasFeedback?: boolean,
31
+ ): void {
32
+ void logUnaryEvent({
33
+ completion_type: completionType,
34
+ event,
35
+ metadata: {
36
+ language_name: languageName,
37
+ message_id: messageId,
38
+ platform: env.platform,
39
+ hasFeedback: hasFeedback ?? false,
40
+ },
41
+ })
42
+ }
43
+
44
+ export type PermissionHandlerParams = {
45
+ messageId: string
46
+ path: string | null
47
+ toolUseConfirm: ToolUseConfirm
48
+ toolPermissionContext: ToolPermissionContext
49
+ onDone: () => void
50
+ onReject: () => void
51
+ completionType: CompletionType
52
+ languageName: string | Promise<string>
53
+ operationType: FileOperationType
54
+ }
55
+
56
+ export type PermissionHandlerOptions = {
57
+ hasFeedback?: boolean
58
+ feedback?: string
59
+ enteredFeedbackMode?: boolean
60
+ scope?: 'claude-folder' | 'global-claude-folder'
61
+ }
62
+
63
+ function handleAcceptOnce(
64
+ params: PermissionHandlerParams,
65
+ options?: PermissionHandlerOptions,
66
+ ): void {
67
+ const { messageId, toolUseConfirm, onDone, completionType, languageName } =
68
+ params
69
+
70
+ logPermissionEvent('accept', completionType, languageName, messageId)
71
+
72
+ // Log accept submission with feedback context
73
+ logEvent('tengu_accept_submitted', {
74
+ toolName: sanitizeToolNameForAnalytics(
75
+ toolUseConfirm.tool.name,
76
+ ) as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
77
+ isMcp: toolUseConfirm.tool.isMcp ?? false,
78
+ has_instructions: !!options?.feedback,
79
+ instructions_length: options?.feedback?.length ?? 0,
80
+ entered_feedback_mode: options?.enteredFeedbackMode ?? false,
81
+ })
82
+
83
+ onDone()
84
+ toolUseConfirm.onAllow(toolUseConfirm.input, [], options?.feedback)
85
+ }
86
+
87
+ function handleAcceptSession(
88
+ params: PermissionHandlerParams,
89
+ options?: PermissionHandlerOptions,
90
+ ): void {
91
+ const {
92
+ messageId,
93
+ path,
94
+ toolUseConfirm,
95
+ toolPermissionContext,
96
+ onDone,
97
+ completionType,
98
+ languageName,
99
+ operationType,
100
+ } = params
101
+
102
+ logPermissionEvent('accept', completionType, languageName, messageId)
103
+
104
+ // For claude-folder scope, grant session-level access to all .claude/ files
105
+ if (
106
+ options?.scope === 'claude-folder' ||
107
+ options?.scope === 'global-claude-folder'
108
+ ) {
109
+ const pattern =
110
+ options.scope === 'global-claude-folder'
111
+ ? GLOBAL_CLAUDE_FOLDER_PERMISSION_PATTERN
112
+ : CLAUDE_FOLDER_PERMISSION_PATTERN
113
+ const suggestions: PermissionUpdate[] = [
114
+ {
115
+ type: 'addRules',
116
+ rules: [
117
+ {
118
+ toolName: FILE_EDIT_TOOL_NAME,
119
+ ruleContent: pattern,
120
+ },
121
+ ],
122
+ behavior: 'allow',
123
+ destination: 'session',
124
+ },
125
+ ]
126
+ onDone()
127
+ toolUseConfirm.onAllow(toolUseConfirm.input, suggestions)
128
+ return
129
+ }
130
+
131
+ // Generate permission updates if path is provided
132
+ const suggestions = path
133
+ ? generateSuggestions(path, operationType, toolPermissionContext)
134
+ : []
135
+
136
+ onDone()
137
+ // Pass permission updates directly to onAllow
138
+ toolUseConfirm.onAllow(toolUseConfirm.input, suggestions)
139
+ }
140
+
141
+ function handleReject(
142
+ params: PermissionHandlerParams,
143
+ options?: PermissionHandlerOptions,
144
+ ): void {
145
+ const {
146
+ messageId,
147
+ toolUseConfirm,
148
+ onDone,
149
+ onReject,
150
+ completionType,
151
+ languageName,
152
+ } = params
153
+
154
+ logPermissionEvent(
155
+ 'reject',
156
+ completionType,
157
+ languageName,
158
+ messageId,
159
+ options?.hasFeedback,
160
+ )
161
+
162
+ // Log reject submission with feedback context
163
+ logEvent('tengu_reject_submitted', {
164
+ toolName: sanitizeToolNameForAnalytics(
165
+ toolUseConfirm.tool.name,
166
+ ) as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
167
+ isMcp: toolUseConfirm.tool.isMcp ?? false,
168
+ has_instructions: !!options?.feedback,
169
+ instructions_length: options?.feedback?.length ?? 0,
170
+ entered_feedback_mode: options?.enteredFeedbackMode ?? false,
171
+ })
172
+
173
+ onDone()
174
+ onReject()
175
+ toolUseConfirm.onReject(options?.feedback)
176
+ }
177
+
178
+ export const PERMISSION_HANDLERS: Record<
179
+ PermissionOption['type'],
180
+ (params: PermissionHandlerParams, options?: PermissionHandlerOptions) => void
181
+ > = {
182
+ 'accept-once': handleAcceptOnce,
183
+ 'accept-session': handleAcceptSession,
184
+ reject: handleReject,
185
+ }
src/components/permissions/PermissionDecisionDebugInfo.tsx ADDED
@@ -0,0 +1,460 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { c as _c } from "react/compiler-runtime";
2
+ import { feature } from 'bun:bundle';
3
+ import chalk from 'chalk';
4
+ import figures from 'figures';
5
+ import React, { useMemo } from 'react';
6
+ import { Ansi, Box, color, Text, useTheme } from '../../ink.js';
7
+ import { useAppState } from '../../state/AppState.js';
8
+ import type { PermissionMode } from '../../utils/permissions/PermissionMode.js';
9
+ import { permissionModeTitle } from '../../utils/permissions/PermissionMode.js';
10
+ import type { PermissionDecision, PermissionDecisionReason } from '../../utils/permissions/PermissionResult.js';
11
+ import { extractRules } from '../../utils/permissions/PermissionUpdate.js';
12
+ import type { PermissionUpdate } from '../../utils/permissions/PermissionUpdateSchema.js';
13
+ import { permissionRuleValueToString } from '../../utils/permissions/permissionRuleParser.js';
14
+ import { detectUnreachableRules } from '../../utils/permissions/shadowedRuleDetection.js';
15
+ import { SandboxManager } from '../../utils/sandbox/sandbox-adapter.js';
16
+ import { getSettingSourceDisplayNameLowercase } from '../../utils/settings/constants.js';
17
+ type PermissionDecisionInfoItemProps = {
18
+ title?: string;
19
+ decisionReason: PermissionDecisionReason;
20
+ };
21
+ function decisionReasonDisplayString(decisionReason: PermissionDecisionReason & {
22
+ type: Exclude<PermissionDecisionReason['type'], 'subcommandResults'>;
23
+ }): string {
24
+ if ((feature('BASH_CLASSIFIER') || feature('TRANSCRIPT_CLASSIFIER')) && decisionReason.type === 'classifier') {
25
+ return `${chalk.bold(decisionReason.classifier)} classifier: ${decisionReason.reason}`;
26
+ }
27
+ switch (decisionReason.type) {
28
+ case 'rule':
29
+ return `${chalk.bold(permissionRuleValueToString(decisionReason.rule.ruleValue))} rule from ${getSettingSourceDisplayNameLowercase(decisionReason.rule.source)}`;
30
+ case 'mode':
31
+ return `${permissionModeTitle(decisionReason.mode)} mode`;
32
+ case 'sandboxOverride':
33
+ return 'Requires permission to bypass sandbox';
34
+ case 'workingDir':
35
+ return decisionReason.reason;
36
+ case 'safetyCheck':
37
+ case 'other':
38
+ return decisionReason.reason;
39
+ case 'permissionPromptTool':
40
+ return `${chalk.bold(decisionReason.permissionPromptToolName)} permission prompt tool`;
41
+ case 'hook':
42
+ return decisionReason.reason ? `${chalk.bold(decisionReason.hookName)} hook: ${decisionReason.reason}` : `${chalk.bold(decisionReason.hookName)} hook`;
43
+ case 'asyncAgent':
44
+ return decisionReason.reason;
45
+ default:
46
+ return '';
47
+ }
48
+ }
49
+ function PermissionDecisionInfoItem(t0) {
50
+ const $ = _c(10);
51
+ const {
52
+ title,
53
+ decisionReason
54
+ } = t0;
55
+ const [theme] = useTheme();
56
+ let t1;
57
+ if ($[0] !== decisionReason || $[1] !== theme) {
58
+ t1 = function formatDecisionReason() {
59
+ switch (decisionReason.type) {
60
+ case "subcommandResults":
61
+ {
62
+ return <Box flexDirection="column">{Array.from(decisionReason.reasons.entries()).map(t2 => {
63
+ const [subcommand, result] = t2;
64
+ const icon = result.behavior === "allow" ? color("success", theme)(figures.tick) : color("error", theme)(figures.cross);
65
+ return <Box flexDirection="column" key={subcommand}><Text>{icon} {subcommand}</Text>{result.decisionReason !== undefined && result.decisionReason.type !== "subcommandResults" && <Text><Text dimColor={true}>{" "}⎿{" "}</Text><Ansi>{decisionReasonDisplayString(result.decisionReason)}</Ansi></Text>}{result.behavior === "ask" && <SuggestedRules suggestions={result.suggestions} />}</Box>;
66
+ })}</Box>;
67
+ }
68
+ default:
69
+ {
70
+ return <Text><Ansi>{decisionReasonDisplayString(decisionReason)}</Ansi></Text>;
71
+ }
72
+ }
73
+ };
74
+ $[0] = decisionReason;
75
+ $[1] = theme;
76
+ $[2] = t1;
77
+ } else {
78
+ t1 = $[2];
79
+ }
80
+ const formatDecisionReason = t1;
81
+ let t2;
82
+ if ($[3] !== title) {
83
+ t2 = title && <Text>{title}</Text>;
84
+ $[3] = title;
85
+ $[4] = t2;
86
+ } else {
87
+ t2 = $[4];
88
+ }
89
+ let t3;
90
+ if ($[5] !== formatDecisionReason) {
91
+ t3 = formatDecisionReason();
92
+ $[5] = formatDecisionReason;
93
+ $[6] = t3;
94
+ } else {
95
+ t3 = $[6];
96
+ }
97
+ let t4;
98
+ if ($[7] !== t2 || $[8] !== t3) {
99
+ t4 = <Box flexDirection="column">{t2}{t3}</Box>;
100
+ $[7] = t2;
101
+ $[8] = t3;
102
+ $[9] = t4;
103
+ } else {
104
+ t4 = $[9];
105
+ }
106
+ return t4;
107
+ }
108
+ function SuggestedRules(t0) {
109
+ const $ = _c(18);
110
+ const {
111
+ suggestions
112
+ } = t0;
113
+ let T0;
114
+ let T1;
115
+ let t1;
116
+ let t2;
117
+ let t3;
118
+ let t4;
119
+ let t5;
120
+ if ($[0] !== suggestions) {
121
+ t5 = Symbol.for("react.early_return_sentinel");
122
+ bb0: {
123
+ const rules = extractRules(suggestions);
124
+ if (rules.length === 0) {
125
+ t5 = null;
126
+ break bb0;
127
+ }
128
+ T1 = Text;
129
+ if ($[8] === Symbol.for("react.memo_cache_sentinel")) {
130
+ t2 = <Text dimColor={true}>{" "}⎿{" "}</Text>;
131
+ $[8] = t2;
132
+ } else {
133
+ t2 = $[8];
134
+ }
135
+ t3 = "Suggested rules:";
136
+ t4 = " ";
137
+ T0 = Ansi;
138
+ t1 = rules.map(_temp).join(", ");
139
+ }
140
+ $[0] = suggestions;
141
+ $[1] = T0;
142
+ $[2] = T1;
143
+ $[3] = t1;
144
+ $[4] = t2;
145
+ $[5] = t3;
146
+ $[6] = t4;
147
+ $[7] = t5;
148
+ } else {
149
+ T0 = $[1];
150
+ T1 = $[2];
151
+ t1 = $[3];
152
+ t2 = $[4];
153
+ t3 = $[5];
154
+ t4 = $[6];
155
+ t5 = $[7];
156
+ }
157
+ if (t5 !== Symbol.for("react.early_return_sentinel")) {
158
+ return t5;
159
+ }
160
+ let t6;
161
+ if ($[9] !== T0 || $[10] !== t1) {
162
+ t6 = <T0>{t1}</T0>;
163
+ $[9] = T0;
164
+ $[10] = t1;
165
+ $[11] = t6;
166
+ } else {
167
+ t6 = $[11];
168
+ }
169
+ let t7;
170
+ if ($[12] !== T1 || $[13] !== t2 || $[14] !== t3 || $[15] !== t4 || $[16] !== t6) {
171
+ t7 = <T1>{t2}{t3}{t4}{t6}</T1>;
172
+ $[12] = T1;
173
+ $[13] = t2;
174
+ $[14] = t3;
175
+ $[15] = t4;
176
+ $[16] = t6;
177
+ $[17] = t7;
178
+ } else {
179
+ t7 = $[17];
180
+ }
181
+ return t7;
182
+ }
183
+ function _temp(rule) {
184
+ return chalk.bold(permissionRuleValueToString(rule));
185
+ }
186
+ type Props = {
187
+ permissionResult: PermissionDecision;
188
+ toolName?: string; // Filter unreachable rules to this tool
189
+ };
190
+
191
+ // Helper function to extract directories from permission updates
192
+ function extractDirectories(updates: PermissionUpdate[] | undefined): string[] {
193
+ if (!updates) return [];
194
+ return updates.flatMap(update => {
195
+ switch (update.type) {
196
+ case 'addDirectories':
197
+ return update.directories;
198
+ default:
199
+ return [];
200
+ }
201
+ });
202
+ }
203
+
204
+ // Helper function to extract mode from permission updates
205
+ function extractMode(updates: PermissionUpdate[] | undefined): PermissionMode | undefined {
206
+ if (!updates) return undefined;
207
+ const update = updates.findLast(u => u.type === 'setMode');
208
+ return update?.type === 'setMode' ? update.mode : undefined;
209
+ }
210
+ function SuggestionDisplay(t0) {
211
+ const $ = _c(22);
212
+ const {
213
+ suggestions,
214
+ width
215
+ } = t0;
216
+ if (!suggestions || suggestions.length === 0) {
217
+ let t1;
218
+ if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
219
+ t1 = <Text dimColor={true}>Suggestions </Text>;
220
+ $[0] = t1;
221
+ } else {
222
+ t1 = $[0];
223
+ }
224
+ let t2;
225
+ if ($[1] !== width) {
226
+ t2 = <Box justifyContent="flex-end" minWidth={width}>{t1}</Box>;
227
+ $[1] = width;
228
+ $[2] = t2;
229
+ } else {
230
+ t2 = $[2];
231
+ }
232
+ let t3;
233
+ if ($[3] === Symbol.for("react.memo_cache_sentinel")) {
234
+ t3 = <Text>None</Text>;
235
+ $[3] = t3;
236
+ } else {
237
+ t3 = $[3];
238
+ }
239
+ let t4;
240
+ if ($[4] !== t2) {
241
+ t4 = <Box flexDirection="row">{t2}{t3}</Box>;
242
+ $[4] = t2;
243
+ $[5] = t4;
244
+ } else {
245
+ t4 = $[5];
246
+ }
247
+ return t4;
248
+ }
249
+ let t1;
250
+ let t2;
251
+ if ($[6] !== suggestions || $[7] !== width) {
252
+ t2 = Symbol.for("react.early_return_sentinel");
253
+ bb0: {
254
+ const rules = extractRules(suggestions);
255
+ const directories = extractDirectories(suggestions);
256
+ const mode = extractMode(suggestions);
257
+ if (rules.length === 0 && directories.length === 0 && !mode) {
258
+ let t3;
259
+ if ($[10] === Symbol.for("react.memo_cache_sentinel")) {
260
+ t3 = <Text dimColor={true}>Suggestion </Text>;
261
+ $[10] = t3;
262
+ } else {
263
+ t3 = $[10];
264
+ }
265
+ let t4;
266
+ if ($[11] !== width) {
267
+ t4 = <Box justifyContent="flex-end" minWidth={width}>{t3}</Box>;
268
+ $[11] = width;
269
+ $[12] = t4;
270
+ } else {
271
+ t4 = $[12];
272
+ }
273
+ let t5;
274
+ if ($[13] === Symbol.for("react.memo_cache_sentinel")) {
275
+ t5 = <Text>None</Text>;
276
+ $[13] = t5;
277
+ } else {
278
+ t5 = $[13];
279
+ }
280
+ let t6;
281
+ if ($[14] !== t4) {
282
+ t6 = <Box flexDirection="row">{t4}{t5}</Box>;
283
+ $[14] = t4;
284
+ $[15] = t6;
285
+ } else {
286
+ t6 = $[15];
287
+ }
288
+ t2 = t6;
289
+ break bb0;
290
+ }
291
+ let t3;
292
+ if ($[16] === Symbol.for("react.memo_cache_sentinel")) {
293
+ t3 = <Text dimColor={true}>Suggestions </Text>;
294
+ $[16] = t3;
295
+ } else {
296
+ t3 = $[16];
297
+ }
298
+ let t4;
299
+ if ($[17] !== width) {
300
+ t4 = <Box justifyContent="flex-end" minWidth={width}>{t3}</Box>;
301
+ $[17] = width;
302
+ $[18] = t4;
303
+ } else {
304
+ t4 = $[18];
305
+ }
306
+ let t5;
307
+ if ($[19] === Symbol.for("react.memo_cache_sentinel")) {
308
+ t5 = <Text> </Text>;
309
+ $[19] = t5;
310
+ } else {
311
+ t5 = $[19];
312
+ }
313
+ let t6;
314
+ if ($[20] !== t4) {
315
+ t6 = <Box flexDirection="row">{t4}{t5}</Box>;
316
+ $[20] = t4;
317
+ $[21] = t6;
318
+ } else {
319
+ t6 = $[21];
320
+ }
321
+ t1 = <Box flexDirection="column">{t6}{rules.length > 0 && <Box flexDirection="row"><Box justifyContent="flex-end" minWidth={width}><Text dimColor={true}> Rules </Text></Box><Box flexDirection="column">{rules.map(_temp2)}</Box></Box>}{directories.length > 0 && <Box flexDirection="row"><Box justifyContent="flex-end" minWidth={width}><Text dimColor={true}> Directories </Text></Box><Box flexDirection="column">{directories.map(_temp3)}</Box></Box>}{mode && <Box flexDirection="row"><Box justifyContent="flex-end" minWidth={width}><Text dimColor={true}> Mode </Text></Box><Text>{permissionModeTitle(mode)}</Text></Box>}</Box>;
322
+ }
323
+ $[6] = suggestions;
324
+ $[7] = width;
325
+ $[8] = t1;
326
+ $[9] = t2;
327
+ } else {
328
+ t1 = $[8];
329
+ t2 = $[9];
330
+ }
331
+ if (t2 !== Symbol.for("react.early_return_sentinel")) {
332
+ return t2;
333
+ }
334
+ return t1;
335
+ }
336
+ function _temp3(dir, index_0) {
337
+ return <Text key={index_0}>{figures.bullet} {dir}</Text>;
338
+ }
339
+ function _temp2(rule, index) {
340
+ return <Text key={index}>{figures.bullet} {permissionRuleValueToString(rule)}</Text>;
341
+ }
342
+ export function PermissionDecisionDebugInfo(t0) {
343
+ const $ = _c(25);
344
+ const {
345
+ permissionResult,
346
+ toolName
347
+ } = t0;
348
+ const toolPermissionContext = useAppState(_temp4);
349
+ const decisionReason = permissionResult.decisionReason;
350
+ const suggestions = "suggestions" in permissionResult ? permissionResult.suggestions : undefined;
351
+ let t1;
352
+ if ($[0] !== suggestions || $[1] !== toolName || $[2] !== toolPermissionContext) {
353
+ bb0: {
354
+ const sandboxAutoAllowEnabled = SandboxManager.isSandboxingEnabled() && SandboxManager.isAutoAllowBashIfSandboxedEnabled();
355
+ const all = detectUnreachableRules(toolPermissionContext, {
356
+ sandboxAutoAllowEnabled
357
+ });
358
+ const suggestedRules = extractRules(suggestions);
359
+ if (suggestedRules.length > 0) {
360
+ t1 = all.filter(u => suggestedRules.some(suggested => suggested.toolName === u.rule.ruleValue.toolName && suggested.ruleContent === u.rule.ruleValue.ruleContent));
361
+ break bb0;
362
+ }
363
+ if (toolName) {
364
+ let t2;
365
+ if ($[4] !== toolName) {
366
+ t2 = u_0 => u_0.rule.ruleValue.toolName === toolName;
367
+ $[4] = toolName;
368
+ $[5] = t2;
369
+ } else {
370
+ t2 = $[5];
371
+ }
372
+ t1 = all.filter(t2);
373
+ break bb0;
374
+ }
375
+ t1 = all;
376
+ }
377
+ $[0] = suggestions;
378
+ $[1] = toolName;
379
+ $[2] = toolPermissionContext;
380
+ $[3] = t1;
381
+ } else {
382
+ t1 = $[3];
383
+ }
384
+ const unreachableRules = t1;
385
+ let t2;
386
+ if ($[6] === Symbol.for("react.memo_cache_sentinel")) {
387
+ t2 = <Box justifyContent="flex-end" minWidth={10}><Text dimColor={true}>Behavior </Text></Box>;
388
+ $[6] = t2;
389
+ } else {
390
+ t2 = $[6];
391
+ }
392
+ let t3;
393
+ if ($[7] !== permissionResult.behavior) {
394
+ t3 = <Box flexDirection="row">{t2}<Text>{permissionResult.behavior}</Text></Box>;
395
+ $[7] = permissionResult.behavior;
396
+ $[8] = t3;
397
+ } else {
398
+ t3 = $[8];
399
+ }
400
+ let t4;
401
+ if ($[9] !== permissionResult.behavior || $[10] !== permissionResult.message) {
402
+ t4 = permissionResult.behavior !== "allow" && <Box flexDirection="row"><Box justifyContent="flex-end" minWidth={10}><Text dimColor={true}>Message </Text></Box><Text>{permissionResult.message}</Text></Box>;
403
+ $[9] = permissionResult.behavior;
404
+ $[10] = permissionResult.message;
405
+ $[11] = t4;
406
+ } else {
407
+ t4 = $[11];
408
+ }
409
+ let t5;
410
+ if ($[12] === Symbol.for("react.memo_cache_sentinel")) {
411
+ t5 = <Box justifyContent="flex-end" minWidth={10}><Text dimColor={true}>Reason </Text></Box>;
412
+ $[12] = t5;
413
+ } else {
414
+ t5 = $[12];
415
+ }
416
+ let t6;
417
+ if ($[13] !== decisionReason) {
418
+ t6 = <Box flexDirection="row">{t5}{decisionReason === undefined ? <Text>undefined</Text> : <PermissionDecisionInfoItem decisionReason={decisionReason} />}</Box>;
419
+ $[13] = decisionReason;
420
+ $[14] = t6;
421
+ } else {
422
+ t6 = $[14];
423
+ }
424
+ let t7;
425
+ if ($[15] !== suggestions) {
426
+ t7 = <SuggestionDisplay suggestions={suggestions} width={10} />;
427
+ $[15] = suggestions;
428
+ $[16] = t7;
429
+ } else {
430
+ t7 = $[16];
431
+ }
432
+ let t8;
433
+ if ($[17] !== unreachableRules) {
434
+ t8 = unreachableRules.length > 0 && <Box flexDirection="column" marginTop={1}><Text color="warning">{figures.warning} Unreachable Rules ({unreachableRules.length})</Text>{unreachableRules.map(_temp5)}</Box>;
435
+ $[17] = unreachableRules;
436
+ $[18] = t8;
437
+ } else {
438
+ t8 = $[18];
439
+ }
440
+ let t9;
441
+ if ($[19] !== t3 || $[20] !== t4 || $[21] !== t6 || $[22] !== t7 || $[23] !== t8) {
442
+ t9 = <Box flexDirection="column">{t3}{t4}{t6}{t7}{t8}</Box>;
443
+ $[19] = t3;
444
+ $[20] = t4;
445
+ $[21] = t6;
446
+ $[22] = t7;
447
+ $[23] = t8;
448
+ $[24] = t9;
449
+ } else {
450
+ t9 = $[24];
451
+ }
452
+ return t9;
453
+ }
454
+ function _temp5(u_1, i) {
455
+ return <Box key={i} flexDirection="column" marginLeft={2}><Text color="warning">{permissionRuleValueToString(u_1.rule.ruleValue)}</Text><Text dimColor={true}>{" "}{u_1.reason}</Text><Text dimColor={true}>{" "}Fix: {u_1.fix}</Text></Box>;
456
+ }
457
+ function _temp4(s) {
458
+ return s.toolPermissionContext;
459
+ }
460
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJmZWF0dXJlIiwiY2hhbGsiLCJmaWd1cmVzIiwiUmVhY3QiLCJ1c2VNZW1vIiwiQW5zaSIsIkJveCIsImNvbG9yIiwiVGV4dCIsInVzZVRoZW1lIiwidXNlQXBwU3RhdGUiLCJQZXJtaXNzaW9uTW9kZSIsInBlcm1pc3Npb25Nb2RlVGl0bGUiLCJQZXJtaXNzaW9uRGVjaXNpb24iLCJQZXJtaXNzaW9uRGVjaXNpb25SZWFzb24iLCJleHRyYWN0UnVsZXMiLCJQZXJtaXNzaW9uVXBkYXRlIiwicGVybWlzc2lvblJ1bGVWYWx1ZVRvU3RyaW5nIiwiZGV0ZWN0VW5yZWFjaGFibGVSdWxlcyIsIlNhbmRib3hNYW5hZ2VyIiwiZ2V0U2V0dGluZ1NvdXJjZURpc3BsYXlOYW1lTG93ZXJjYXNlIiwiUGVybWlzc2lvbkRlY2lzaW9uSW5mb0l0ZW1Qcm9wcyIsInRpdGxlIiwiZGVjaXNpb25SZWFzb24iLCJkZWNpc2lvblJlYXNvbkRpc3BsYXlTdHJpbmciLCJ0eXBlIiwiRXhjbHVkZSIsImJvbGQiLCJjbGFzc2lmaWVyIiwicmVhc29uIiwicnVsZSIsInJ1bGVWYWx1ZSIsInNvdXJjZSIsIm1vZGUiLCJwZXJtaXNzaW9uUHJvbXB0VG9vbE5hbWUiLCJob29rTmFtZSIsIlBlcm1pc3Npb25EZWNpc2lvbkluZm9JdGVtIiwidDAiLCIkIiwiX2MiLCJ0aGVtZSIsInQxIiwiZm9ybWF0RGVjaXNpb25SZWFzb24iLCJBcnJheSIsImZyb20iLCJyZWFzb25zIiwiZW50cmllcyIsIm1hcCIsInQyIiwic3ViY29tbWFuZCIsInJlc3VsdCIsImljb24iLCJiZWhhdmlvciIsInRpY2siLCJjcm9zcyIsInVuZGVmaW5lZCIsInN1Z2dlc3Rpb25zIiwidDMiLCJ0NCIsIlN1Z2dlc3RlZFJ1bGVzIiwiVDAiLCJUMSIsInQ1IiwiU3ltYm9sIiwiZm9yIiwiYmIwIiwicnVsZXMiLCJsZW5ndGgiLCJfdGVtcCIsImpvaW4iLCJ0NiIsInQ3IiwiUHJvcHMiLCJwZXJtaXNzaW9uUmVzdWx0IiwidG9vbE5hbWUiLCJleHRyYWN0RGlyZWN0b3JpZXMiLCJ1cGRhdGVzIiwiZmxhdE1hcCIsInVwZGF0ZSIsImRpcmVjdG9yaWVzIiwiZXh0cmFjdE1vZGUiLCJmaW5kTGFzdCIsInUiLCJTdWdnZXN0aW9uRGlzcGxheSIsIndpZHRoIiwiX3RlbXAyIiwiX3RlbXAzIiwiZGlyIiwiaW5kZXhfMCIsImluZGV4IiwiYnVsbGV0IiwiUGVybWlzc2lvbkRlY2lzaW9uRGVidWdJbmZvIiwidG9vbFBlcm1pc3Npb25Db250ZXh0IiwiX3RlbXA0Iiwic2FuZGJveEF1dG9BbGxvd0VuYWJsZWQiLCJpc1NhbmRib3hpbmdFbmFibGVkIiwiaXNBdXRvQWxsb3dCYXNoSWZTYW5kYm94ZWRFbmFibGVkIiwiYWxsIiwic3VnZ2VzdGVkUnVsZXMiLCJmaWx0ZXIiLCJzb21lIiwic3VnZ2VzdGVkIiwicnVsZUNvbnRlbnQiLCJ1XzAiLCJ1bnJlYWNoYWJsZVJ1bGVzIiwiV0lEVEgiLCJtZXNzYWdlIiwidDgiLCJ3YXJuaW5nIiwiX3RlbXA1IiwidDkiLCJ1XzEiLCJpIiwiZml4IiwicyJdLCJzb3VyY2VzIjpbIlBlcm1pc3Npb25EZWNpc2lvbkRlYnVnSW5mby50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZmVhdHVyZSB9IGZyb20gJ2J1bjpidW5kbGUnXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnXG5pbXBvcnQgZmlndXJlcyBmcm9tICdmaWd1cmVzJ1xuaW1wb3J0IFJlYWN0LCB7IHVzZU1lbW8gfSBmcm9tICdyZWFjdCdcbmltcG9ydCB7IEFuc2ksIEJveCwgY29sb3IsIFRleHQsIHVzZVRoZW1lIH0gZnJvbSAnLi4vLi4vaW5rLmpzJ1xuaW1wb3J0IHsgdXNlQXBwU3RhdGUgfSBmcm9tICcuLi8uLi9zdGF0ZS9BcHBTdGF0ZS5qcydcbmltcG9ydCB0eXBlIHsgUGVybWlzc2lvbk1vZGUgfSBmcm9tICcuLi8uLi91dGlscy9wZXJtaXNzaW9ucy9QZXJtaXNzaW9uTW9kZS5qcydcbmltcG9ydCB7IHBlcm1pc3Npb25Nb2RlVGl0bGUgfSBmcm9tICcuLi8uLi91dGlscy9wZXJtaXNzaW9ucy9QZXJtaXNzaW9uTW9kZS5qcydcbmltcG9ydCB0eXBlIHtcbiAgUGVybWlzc2lvbkRlY2lzaW9uLFxuICBQZXJtaXNzaW9uRGVjaXNpb25SZWFzb24sXG59IGZyb20gJy4uLy4uL3V0aWxzL3Blcm1pc3Npb25zL1Blcm1pc3Npb25SZXN1bHQuanMnXG5pbXBvcnQgeyBleHRyYWN0UnVsZXMgfSBmcm9tICcuLi8uLi91dGlscy9wZXJtaXNzaW9ucy9QZXJtaXNzaW9uVXBkYXRlLmpzJ1xuaW1wb3J0IHR5cGUgeyBQZXJtaXNzaW9uVXBkYXRlIH0gZnJvbSAnLi4vLi4vdXRpbHMvcGVybWlzc2lvbnMvUGVybWlzc2lvblVwZGF0ZVNjaGVtYS5qcydcbmltcG9ydCB7IHBlcm1pc3Npb25SdWxlVmFsdWVUb1N0cmluZyB9IGZyb20gJy4uLy4uL3V0aWxzL3Blcm1pc3Npb25zL3Blcm1pc3Npb25SdWxlUGFyc2VyLmpzJ1xuaW1wb3J0IHsgZGV0ZWN0VW5yZWFjaGFibGVSdWxlcyB9IGZyb20gJy4uLy4uL3V0aWxzL3Blcm1pc3Npb25zL3NoYWRvd2VkUnVsZURldGVjdGlvbi5qcydcbmltcG9ydCB7IFNhbmRib3hNYW5hZ2VyIH0gZnJvbSAnLi4vLi4vdXRpbHMvc2FuZGJveC9zYW5kYm94LWFkYXB0ZXIuanMnXG5pbXBvcnQgeyBnZXRTZXR0aW5nU291cmNlRGlzcGxheU5hbWVMb3dlcmNhc2UgfSBmcm9tICcuLi8uLi91dGlscy9zZXR0aW5ncy9jb25zdGFudHMuanMnXG5cbnR5cGUgUGVybWlzc2lvbkRlY2lzaW9uSW5mb0l0ZW1Qcm9wcyA9IHtcbiAgdGl0bGU/OiBzdHJpbmdcbiAgZGVjaXNpb25SZWFzb246IFBlcm1pc3Npb25EZWNpc2lvblJlYXNvblxufVxuXG5mdW5jdGlvbiBkZWNpc2lvblJlYXNvbkRpc3BsYXlTdHJpbmcoXG4gIGRlY2lzaW9uUmVhc29uOiBQZXJtaXNzaW9uRGVjaXNpb25SZWFzb24gJiB7XG4gICAgdHlwZTogRXhjbHVkZTxQZXJtaXNzaW9uRGVjaXNpb25SZWFzb25bJ3R5cGUnXSwgJ3N1YmNvbW1hbmRSZXN1bHRzJz5cbiAgfSxcbik6IHN0cmluZyB7XG4gIGlmIChcbiAgICAoZmVhdHVyZSgnQkFTSF9DTEFTU0lGSUVSJykgfHwgZmVhdHVyZSgnVFJBTlNDUklQVF9DTEFTU0lGSUVSJykpICYmXG4gICAgZGVjaXNpb25SZWFzb24udHlwZSA9PT0gJ2NsYXNzaWZpZXInXG4gICkge1xuICAgIHJldHVybiBgJHtjaGFsay5ib2xkKGRlY2lzaW9uUmVhc29uLmNsYXNzaWZpZXIpfSBjbGFzc2lmaWVyOiAke2RlY2lzaW9uUmVhc29uLnJlYXNvbn1gXG4gIH1cbiAgc3dpdGNoIChkZWNpc2lvblJlYXNvbi50eXBlKSB7XG4gICAgY2FzZSAncnVsZSc6XG4gICAgICByZXR1cm4gYCR7Y2hhbGsuYm9sZChwZXJtaXNzaW9uUnVsZVZhbHVlVG9TdHJpbmcoZGVjaXNpb25SZWFzb24ucnVsZS5ydWxlVmFsdWUpKX0gcnVsZSBmcm9tICR7Z2V0U2V0dGluZ1NvdXJjZURpc3BsYXlOYW1lTG93ZXJjYXNlKGRlY2lzaW9uUmVhc29uLnJ1bGUuc291cmNlKX1gXG4gICAgY2FzZSAnbW9kZSc6XG4gICAgICByZXR1cm4gYCR7cGVybWlzc2lvbk1vZGVUaXRsZShkZWNpc2lvblJlYXNvbi5tb2RlKX0gbW9kZWBcbiAgICBjYXNlICdzYW5kYm94T3ZlcnJpZGUnOlxuICAgICAgcmV0dXJuICdSZXF1aXJlcyBwZXJtaXNzaW9uIHRvIGJ5cGFzcyBzYW5kYm94J1xuICAgIGNhc2UgJ3dvcmtpbmdEaXInOlxuICAgICAgcmV0dXJuIGRlY2lzaW9uUmVhc29uLnJlYXNvblxuICAgIGNhc2UgJ3NhZmV0eUNoZWNrJzpcbiAgICBjYXNlICdvdGhlcic6XG4gICAgICByZXR1cm4gZGVjaXNpb25SZWFzb24ucmVhc29uXG4gICAgY2FzZSAncGVybWlzc2lvblByb21wdFRvb2wnOlxuICAgICAgcmV0dXJuIGAke2NoYWxrLmJvbGQoZGVjaXNpb25SZWFzb24ucGVybWlzc2lvblByb21wdFRvb2xOYW1lKX0gcGVybWlzc2lvbiBwcm9tcHQgdG9vbGBcbiAgICBjYXNlICdob29rJzpcbiAgICAgIHJldHVybiBkZWNpc2lvblJlYXNvbi5yZWFzb25cbiAgICAgICAgPyBgJHtjaGFsay5ib2xkKGRlY2lzaW9uUmVhc29uLmhvb2tOYW1lKX0gaG9vazogJHtkZWNpc2lvblJlYXNvbi5yZWFzb259YFxuICAgICAgICA6IGAke2NoYWxrLmJvbGQoZGVjaXNpb25SZWFzb24uaG9va05hbWUpfSBob29rYFxuICAgIGNhc2UgJ2FzeW5jQWdlbnQnOlxuICAgICAgcmV0dXJuIGRlY2lzaW9uUmVhc29uLnJlYXNvblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gJydcbiAgfVxufVxuXG5mdW5jdGlvbiBQZXJtaXNzaW9uRGVjaXNpb25JbmZvSXRlbSh7XG4gIHRpdGxlLFxuICBkZWNpc2lvblJlYXNvbixcbn06IFBlcm1pc3Npb25EZWNpc2lvbkluZm9JdGVtUHJvcHMpOiBSZWFjdC5SZWFjdE5vZGUge1xuICBjb25zdCBbdGhlbWVdID0gdXNlVGhlbWUoKVxuXG4gIGZ1bmN0aW9uIGZvcm1hdERlY2lzaW9uUmVhc29uKCk6IFJlYWN0LlJlYWN0Tm9kZSB7XG4gICAgc3dpdGNoIChkZWNpc2lvblJlYXNvbi50eXBlKSB7XG4gICAgICBjYXNlICdzdWJjb21tYW5kUmVzdWx0cyc6XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgPEJveCBmbGV4RGlyZWN0aW9uPVwiY29sdW1uXCI+XG4gICAgICAgICAgICB7QXJyYXkuZnJvbShkZWNpc2lvblJlYXNvbi5yZWFzb25zLmVudHJpZXMoKSkubWFwKFxuICAgICAgICAgICAgICAoW3N1YmNvbW1hbmQsIHJlc3VsdF0pID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBpY29uID1cbiAgICAgICAgICAgICAgICAgIHJlc3VsdC5iZWhhdmlvciA9PT0gJ2FsbG93J1xuICAgICAgICAgICAgICAgICAgICA/IGNvbG9yKCdzdWNjZXNzJywgdGhlbWUpKGZpZ3VyZXMudGljaylcbiAgICAgICAgICAgICAgICAgICAgOiBjb2xvcignZXJyb3InLCB0aGVtZSkoZmlndXJlcy5jcm9zcylcbiAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgPEJveCBmbGV4RGlyZWN0aW9uPVwiY29sdW1uXCIga2V5PXtzdWJjb21tYW5kfT5cbiAgICAgICAgICAgICAgICAgICAgPFRleHQ+XG4gICAgICAgICAgICAgICAgICAgICAge2ljb259IHtzdWJjb21tYW5kfVxuICAgICAgICAgICAgICAgICAgICA8L1RleHQ+XG4gICAgICAgICAgICAgICAgICAgIHtyZXN1bHQuZGVjaXNpb25SZWFzb24gIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5kZWNpc2lvblJlYXNvbi50eXBlICE9PSAnc3ViY29tbWFuZFJlc3VsdHMnICYmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIDxUZXh0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8VGV4dCBkaW1Db2xvcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7JyAgJ33ijr97JyAgJ31cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9UZXh0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8QW5zaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ZGVjaXNpb25SZWFzb25EaXNwbGF5U3RyaW5nKHJlc3VsdC5kZWNpc2lvblJlYXNvbil9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvQW5zaT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICB7cmVzdWx0LmJlaGF2aW9yID09PSAnYXNrJyAmJiAoXG4gICAgICAgICAgICAgICAgICAgICAgPFN1Z2dlc3RlZFJ1bGVzIHN1Z2dlc3Rpb25zPXtyZXN1bHQuc3VnZ2VzdGlvbnN9IC8+XG4gICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICA8L0JveD5cbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICApfVxuICAgICAgICAgIDwvQm94PlxuICAgICAgICApXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIDxUZXh0PlxuICAgICAgICAgICAgPEFuc2k+e2RlY2lzaW9uUmVhc29uRGlzcGxheVN0cmluZyhkZWNpc2lvblJlYXNvbil9PC9BbnNpPlxuICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPEJveCBmbGV4RGlyZWN0aW9uPVwiY29sdW1uXCI+XG4gICAgICB7dGl0bGUgJiYgPFRleHQ+e3RpdGxlfTwvVGV4dD59XG4gICAgICB7Zm9ybWF0RGVjaXNpb25SZWFzb24oKX1cbiAgICA8L0JveD5cbiAgKVxufVxuXG5mdW5jdGlvbiBTdWdnZXN0ZWRSdWxlcyh7XG4gIHN1Z2dlc3Rpb25zLFxufToge1xuICBzdWdnZXN0aW9uczogUGVybWlzc2lvblVwZGF0ZVtdIHwgdW5kZWZpbmVkXG59KTogUmVhY3QuUmVhY3ROb2RlIHtcbiAgY29uc3QgcnVsZXMgPSBleHRyYWN0UnVsZXMoc3VnZ2VzdGlvbnMpXG4gIGlmIChydWxlcy5sZW5ndGggPT09IDApIHJldHVybiBudWxsXG4gIHJldHVybiAoXG4gICAgPFRleHQ+XG4gICAgICA8VGV4dCBkaW1Db2xvcj5cbiAgICAgICAgeycgICd94o6/eycgICd9XG4gICAgICA8L1RleHQ+XG4gICAgICBTdWdnZXN0ZWQgcnVsZXM6eycgJ31cbiAgICAgIDxBbnNpPlxuICAgICAgICB7cnVsZXNcbiAgICAgICAgICAubWFwKHJ1bGUgPT4gY2hhbGsuYm9sZChwZXJtaXNzaW9uUnVsZVZhbHVlVG9TdHJpbmcocnVsZSkpKVxuICAgICAgICAgIC5qb2luKCcsICcpfVxuICAgICAgPC9BbnNpPlxuICAgIDwvVGV4dD5cbiAgKVxufVxuXG50eXBlIFByb3BzID0ge1xuICBwZXJtaXNzaW9uUmVzdWx0OiBQZXJtaXNzaW9uRGVjaXNpb25cbiAgdG9vbE5hbWU/OiBzdHJpbmcgLy8gRmlsdGVyIHVucmVhY2hhYmxlIHJ1bGVzIHRvIHRoaXMgdG9vbFxufVxuXG4vLyBIZWxwZXIgZnVuY3Rpb24gdG8gZXh0cmFjdCBkaXJlY3RvcmllcyBmcm9tIHBlcm1pc3Npb24gdXBkYXRlc1xuZnVuY3Rpb24gZXh0cmFjdERpcmVjdG9yaWVzKHVwZGF0ZXM6IFBlcm1pc3Npb25VcGRhdGVbXSB8IHVuZGVmaW5lZCk6IHN0cmluZ1tdIHtcbiAgaWYgKCF1cGRhdGVzKSByZXR1cm4gW11cblxuICByZXR1cm4gdXBkYXRlcy5mbGF0TWFwKHVwZGF0ZSA9PiB7XG4gICAgc3dpdGNoICh1cGRhdGUudHlwZSkge1xuICAgICAgY2FzZSAnYWRkRGlyZWN0b3JpZXMnOlxuICAgICAgICByZXR1cm4gdXBkYXRlLmRpcmVjdG9yaWVzXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gW11cbiAgICB9XG4gIH0pXG59XG5cbi8vIEhlbHBlciBmdW5jdGlvbiB0byBleHRyYWN0IG1vZGUgZnJvbSBwZXJtaXNzaW9uIHVwZGF0ZXNcbmZ1bmN0aW9uIGV4dHJhY3RNb2RlKFxuICB1cGRhdGVzOiBQZXJtaXNzaW9uVXBkYXRlW10gfCB1bmRlZmluZWQsXG4pOiBQZXJtaXNzaW9uTW9kZSB8IHVuZGVmaW5lZCB7XG4gIGlmICghdXBkYXRlcykgcmV0dXJuIHVuZGVmaW5lZFxuICBjb25zdCB1cGRhdGUgPSB1cGRhdGVzLmZpbmRMYXN0KHUgPT4gdS50eXBlID09PSAnc2V0TW9kZScpXG4gIHJldHVybiB1cGRhdGU/LnR5cGUgPT09ICdzZXRNb2RlJyA/IHVwZGF0ZS5tb2RlIDogdW5kZWZpbmVkXG59XG5cbmZ1bmN0aW9uIFN1Z2dlc3Rpb25EaXNwbGF5KHtcbiAgc3VnZ2VzdGlvbnMsXG4gIHdpZHRoLFxufToge1xuICBzdWdnZXN0aW9uczogUGVybWlzc2lvblVwZGF0ZVtdIHwgdW5kZWZpbmVkXG4gIHdpZHRoOiBudW1iZXJcbn0pOiBSZWFjdC5SZWFjdE5vZGUge1xuICBpZiAoIXN1Z2dlc3Rpb25zIHx8IHN1Z2dlc3Rpb25zLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiAoXG4gICAgICA8Qm94IGZsZXhEaXJlY3Rpb249XCJyb3dcIj5cbiAgICAgICAgPEJveCBqdXN0aWZ5Q29udGVudD1cImZsZXgtZW5kXCIgbWluV2lkdGg9e3dpZHRofT5cbiAgICAgICAgICA8VGV4dCBkaW1Db2xvcj5TdWdnZXN0aW9ucyA8L1RleHQ+XG4gICAgICAgIDwvQm94PlxuICAgICAgICA8VGV4dD5Ob25lPC9UZXh0PlxuICAgICAgPC9Cb3g+XG4gICAgKVxuICB9XG5cbiAgY29uc3QgcnVsZXMgPSBleHRyYWN0UnVsZXMoc3VnZ2VzdGlvbnMpXG4gIGNvbnN0IGRpcmVjdG9yaWVzID0gZXh0cmFjdERpcmVjdG9yaWVzKHN1Z2dlc3Rpb25zKVxuICBjb25zdCBtb2RlID0gZXh0cmFjdE1vZGUoc3VnZ2VzdGlvbnMpXG5cbiAgLy8gSWYgbm90aGluZyB0byBkaXNwbGF5LCBzaG93IE5vbmVcbiAgaWYgKHJ1bGVzLmxlbmd0aCA9PT0gMCAmJiBkaXJlY3Rvcmllcy5sZW5ndGggPT09IDAgJiYgIW1vZGUpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPEJveCBmbGV4RGlyZWN0aW9uPVwicm93XCI+XG4gICAgICAgIDxCb3gganVzdGlmeUNvbnRlbnQ9XCJmbGV4LWVuZFwiIG1pbldpZHRoPXt3aWR0aH0+XG4gICAgICAgICAgPFRleHQgZGltQ29sb3I+U3VnZ2VzdGlvbiA8L1RleHQ+XG4gICAgICAgIDwvQm94PlxuICAgICAgICA8VGV4dD5Ob25lPC9UZXh0PlxuICAgICAgPC9Cb3g+XG4gICAgKVxuICB9XG5cbiAgcmV0dXJuIChcbiAgICA8Qm94IGZsZXhEaXJlY3Rpb249XCJjb2x1bW5cIj5cbiAgICAgIDxCb3ggZmxleERpcmVjdGlvbj1cInJvd1wiPlxuICAgICAgICA8Qm94IGp1c3RpZnlDb250ZW50PVwiZmxleC1lbmRcIiBtaW5XaWR0aD17d2lkdGh9PlxuICAgICAgICAgIDxUZXh0IGRpbUNvbG9yPlN1Z2dlc3Rpb25zIDwvVGV4dD5cbiAgICAgICAgPC9Cb3g+XG4gICAgICAgIDxUZXh0PiA8L1RleHQ+XG4gICAgICA8L0JveD5cblxuICAgICAgey8qIERpc3BsYXkgcnVsZXMgKi99XG4gICAgICB7cnVsZXMubGVuZ3RoID4gMCAmJiAoXG4gICAgICAgIDxCb3ggZmxleERpcmVjdGlvbj1cInJvd1wiPlxuICAgICAgICAgIDxCb3gganVzdGlmeUNvbnRlbnQ9XCJmbGV4LWVuZFwiIG1pbldpZHRoPXt3aWR0aH0+XG4gICAgICAgICAgICA8VGV4dCBkaW1Db2xvcj4gUnVsZXMgPC9UZXh0PlxuICAgICAgICAgIDwvQm94PlxuICAgICAgICAgIDxCb3ggZmxleERpcmVjdGlvbj1cImNvbHVtblwiPlxuICAgICAgICAgICAge3J1bGVzLm1hcCgocnVsZSwgaW5kZXgpID0+IChcbiAgICAgICAgICAgICAgPFRleHQga2V5PXtpbmRleH0+XG4gICAgICAgICAgICAgICAge2ZpZ3VyZXMuYnVsbGV0fSB7cGVybWlzc2lvblJ1bGVWYWx1ZVRvU3RyaW5nKHJ1bGUpfVxuICAgICAgICAgICAgICA8L1RleHQ+XG4gICAgICAgICAgICApKX1cbiAgICAgICAgICA8L0JveD5cbiAgICAgICAgPC9Cb3g+XG4gICAgICApfVxuXG4gICAgICB7LyogRGlzcGxheSBkaXJlY3RvcmllcyAqL31cbiAgICAgIHtkaXJlY3Rvcmllcy5sZW5ndGggPiAwICYmIChcbiAgICAgICAgPEJveCBmbGV4RGlyZWN0aW9uPVwicm93XCI+XG4gICAgICAgICAgPEJveCBqdXN0aWZ5Q29udGVudD1cImZsZXgtZW5kXCIgbWluV2lkdGg9e3dpZHRofT5cbiAgICAgICAgICAgIDxUZXh0IGRpbUNvbG9yPiBEaXJlY3RvcmllcyA8L1RleHQ+XG4gICAgICAgICAgPC9Cb3g+XG4gICAgICAgICAgPEJveCBmbGV4RGlyZWN0aW9uPVwiY29sdW1uXCI+XG4gICAgICAgICAgICB7ZGlyZWN0b3JpZXMubWFwKChkaXIsIGluZGV4KSA9PiAoXG4gICAgICAgICAgICAgIDxUZXh0IGtleT17aW5kZXh9PlxuICAgICAgICAgICAgICAgIHtmaWd1cmVzLmJ1bGxldH0ge2Rpcn1cbiAgICAgICAgICAgICAgPC9UZXh0PlxuICAgICAgICAgICAgKSl9XG4gICAgICAgICAgPC9Cb3g+XG4gICAgICAgIDwvQm94PlxuICAgICAgKX1cblxuICAgICAgey8qIERpc3BsYXkgbW9kZSBjaGFuZ2UgKi99XG4gICAgICB7bW9kZSAmJiAoXG4gICAgICAgIDxCb3ggZmxleERpcmVjdGlvbj1cInJvd1wiPlxuICAgICAgICAgIDxCb3gganVzdGlmeUNvbnRlbnQ9XCJmbGV4LWVuZFwiIG1pbldpZHRoPXt3aWR0aH0+XG4gICAgICAgICAgICA8VGV4dCBkaW1Db2xvcj4gTW9kZSA8L1RleHQ+XG4gICAgICAgICAgPC9Cb3g+XG4gICAgICAgICAgPFRleHQ+e3Blcm1pc3Npb25Nb2RlVGl0bGUobW9kZSl9PC9UZXh0PlxuICAgICAgICA8L0JveD5cbiAgICAgICl9XG4gICAgPC9Cb3g+XG4gIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFBlcm1pc3Npb25EZWNpc2lvbkRlYnVnSW5mbyh7XG4gIHBlcm1pc3Npb25SZXN1bHQsXG4gIHRvb2xOYW1lLFxufTogUHJvcHMpOiBSZWFjdC5SZWFjdE5vZGUge1xuICBjb25zdCB0b29sUGVybWlzc2lvbkNvbnRleHQgPSB1c2VBcHBTdGF0ZShzID0+IHMudG9vbFBlcm1pc3Npb25Db250ZXh0KVxuICBjb25zdCBkZWNpc2lvblJlYXNvbiA9IHBlcm1pc3Npb25SZXN1bHQuZGVjaXNpb25SZWFzb25cbiAgY29uc3Qgc3VnZ2VzdGlvbnMgPVxuICAgICdzdWdnZXN0aW9ucycgaW4gcGVybWlzc2lvblJlc3VsdCA/IHBlcm1pc3Npb25SZXN1bHQuc3VnZ2VzdGlvbnMgOiB1bmRlZmluZWRcblxuICBjb25zdCB1bnJlYWNoYWJsZVJ1bGVzID0gdXNlTWVtbygoKSA9PiB7XG4gICAgY29uc3Qgc2FuZGJveEF1dG9BbGxvd0VuYWJsZWQgPVxuICAgICAgU2FuZGJveE1hbmFnZXIuaXNTYW5kYm94aW5nRW5hYmxlZCgpICYmXG4gICAgICBTYW5kYm94TWFuYWdlci5pc0F1dG9BbGxvd0Jhc2hJZlNhbmRib3hlZEVuYWJsZWQoKVxuICAgIGNvbnN0IGFsbCA9IGRldGVjdFVucmVhY2hhYmxlUnVsZXModG9vbFBlcm1pc3Npb25Db250ZXh0LCB7XG4gICAgICBzYW5kYm94QXV0b0FsbG93RW5hYmxlZCxcbiAgICB9KVxuXG4gICAgLy8gR2V0IHRoZSBzdWdnZXN0ZWQgcnVsZXMgZnJvbSB0aGUgcGVybWlzc2lvbiByZXN1bHRcbiAgICBjb25zdCBzdWdnZXN0ZWRSdWxlcyA9IGV4dHJhY3RSdWxlcyhzdWdnZXN0aW9ucylcblxuICAgIC8vIEZpbHRlciB0byBydWxlcyB0aGF0IG1hdGNoIGFueSBvZiB0aGUgc3VnZ2VzdGVkIHJ1bGVzXG4gICAgLy8gQSBydWxlIG1hdGNoZXMgaWYgaXQgaGFzIHRoZSBzYW1lIHRvb2xOYW1lIGFuZCBydWxlQ29udGVudFxuICAgIGlmIChzdWdnZXN0ZWRSdWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gYWxsLmZpbHRlcih1ID0+XG4gICAgICAgIHN1Z2dlc3RlZFJ1bGVzLnNvbWUoXG4gICAgICAgICAgc3VnZ2VzdGVkID0+XG4gICAgICAgICAgICBzdWdnZXN0ZWQudG9vbE5hbWUgPT09IHUucnVsZS5ydWxlVmFsdWUudG9vbE5hbWUgJiZcbiAgICAgICAgICAgIHN1Z2dlc3RlZC5ydWxlQ29udGVudCA9PT0gdS5ydWxlLnJ1bGVWYWx1ZS5ydWxlQ29udGVudCxcbiAgICAgICAgKSxcbiAgICAgIClcbiAgICB9XG5cbiAgICAvLyBGYWxsYmFjazogZmlsdGVyIGJ5IHRvb2wgbmFtZSBpZiBzcGVjaWZpZWRcbiAgICBpZiAodG9vbE5hbWUpIHtcbiAgICAgIHJldHVybiBhbGwuZmlsdGVyKHUgPT4gdS5ydWxlLnJ1bGVWYWx1ZS50b29sTmFtZSA9PT0gdG9vbE5hbWUpXG4gICAgfVxuXG4gICAgcmV0dXJuIGFsbFxuICB9LCBbdG9vbFBlcm1pc3Npb25Db250ZXh0LCB0b29sTmFtZSwgc3VnZ2VzdGlvbnNdKVxuXG4gIGNvbnN0IFdJRFRIID0gMTBcblxuICByZXR1cm4gKFxuICAgIDxCb3ggZmxleERpcmVjdGlvbj1cImNvbHVtblwiPlxuICAgICAgPEJveCBmbGV4RGlyZWN0aW9uPVwicm93XCI+XG4gICAgICAgIDxCb3gganVzdGlmeUNvbnRlbnQ9XCJmbGV4LWVuZFwiIG1pbldpZHRoPXtXSURUSH0+XG4gICAgICAgICAgPFRleHQgZGltQ29sb3I+QmVoYXZpb3IgPC9UZXh0PlxuICAgICAgICA8L0JveD5cbiAgICAgICAgPFRleHQ+e3Blcm1pc3Npb25SZXN1bHQuYmVoYXZpb3J9PC9UZXh0PlxuICAgICAgPC9Cb3g+XG4gICAgICB7cGVybWlzc2lvblJlc3VsdC5iZWhhdmlvciAhPT0gJ2FsbG93JyAmJiAoXG4gICAgICAgIDxCb3ggZmxleERpcmVjdGlvbj1cInJvd1wiPlxuICAgICAgICAgIDxCb3gganVzdGlmeUNvbnRlbnQ9XCJmbGV4LWVuZFwiIG1pbldpZHRoPXtXSURUSH0+XG4gICAgICAgICAgICA8VGV4dCBkaW1Db2xvcj5NZXNzYWdlIDwvVGV4dD5cbiAgICAgICAgICA8L0JveD5cbiAgICAgICAgICA8VGV4dD57cGVybWlzc2lvblJlc3VsdC5tZXNzYWdlfTwvVGV4dD5cbiAgICAgICAgPC9Cb3g+XG4gICAgICApfVxuICAgICAgPEJveCBmbGV4RGlyZWN0aW9uPVwicm93XCI+XG4gICAgICAgIDxCb3gganVzdGlmeUNvbnRlbnQ9XCJmbGV4LWVuZFwiIG1pbldpZHRoPXtXSURUSH0+XG4gICAgICAgICAgPFRleHQgZGltQ29sb3I+UmVhc29uIDwvVGV4dD5cbiAgICAgICAgPC9Cb3g+XG4gICAgICAgIHtkZWNpc2lvblJlYXNvbiA9PT0gdW5kZWZpbmVkID8gKFxuICAgICAgICAgIDxUZXh0PnVuZGVmaW5lZDwvVGV4dD5cbiAgICAgICAgKSA6IChcbiAgICAgICAgICA8UGVybWlzc2lvbkRlY2lzaW9uSW5mb0l0ZW0gZGVjaXNpb25SZWFzb249e2RlY2lzaW9uUmVhc29ufSAvPlxuICAgICAgICApfVxuICAgICAgPC9Cb3g+XG4gICAgICA8U3VnZ2VzdGlvbkRpc3BsYXkgc3VnZ2VzdGlvbnM9e3N1Z2dlc3Rpb25zfSB3aWR0aD17V0lEVEh9IC8+XG4gICAgICB7dW5yZWFjaGFibGVSdWxlcy5sZW5ndGggPiAwICYmIChcbiAgICAgICAgPEJveCBmbGV4RGlyZWN0aW9uPVwiY29sdW1uXCIgbWFyZ2luVG9wPXsxfT5cbiAgICAgICAgICA8VGV4dCBjb2xvcj1cIndhcm5pbmdcIj5cbiAgICAgICAgICAgIHtmaWd1cmVzLndhcm5pbmd9IFVucmVhY2hhYmxlIFJ1bGVzICh7dW5yZWFjaGFibGVSdWxlcy5sZW5ndGh9KVxuICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgICB7dW5yZWFjaGFibGVSdWxlcy5tYXAoKHUsIGkpID0+IChcbiAgICAgICAgICAgIDxCb3gga2V5PXtpfSBmbGV4RGlyZWN0aW9uPVwiY29sdW1uXCIgbWFyZ2luTGVmdD17Mn0+XG4gICAgICAgICAgICAgIDxUZXh0IGNvbG9yPVwid2FybmluZ1wiPlxuICAgICAgICAgICAgICAgIHtwZXJtaXNzaW9uUnVsZVZhbHVlVG9TdHJpbmcodS5ydWxlLnJ1bGVWYWx1ZSl9XG4gICAgICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgICAgICAgPFRleHQgZGltQ29sb3I+XG4gICAgICAgICAgICAgICAgeycgICd9XG4gICAgICAgICAgICAgICAge3UucmVhc29ufVxuICAgICAgICAgICAgICA8L1RleHQ+XG4gICAgICAgICAgICAgIDxUZXh0IGRpbUNvbG9yPlxuICAgICAgICAgICAgICAgIHsnICAnfUZpeDoge3UuZml4fVxuICAgICAgICAgICAgICA8L1RleHQ+XG4gICAgICAgICAgICA8L0JveD5cbiAgICAgICAgICApKX1cbiAgICAgICAgPC9Cb3g+XG4gICAgICApfVxuICAgIDwvQm94PlxuICApXG59XG4iXSwibWFwcGluZ3MiOiI7QUFBQSxTQUFTQSxPQUFPLFFBQVEsWUFBWTtBQUNwQyxPQUFPQyxLQUFLLE1BQU0sT0FBTztBQUN6QixPQUFPQyxPQUFPLE1BQU0sU0FBUztBQUM3QixPQUFPQyxLQUFLLElBQUlDLE9BQU8sUUFBUSxPQUFPO0FBQ3RDLFNBQVNDLElBQUksRUFBRUMsR0FBRyxFQUFFQyxLQUFLLEVBQUVDLElBQUksRUFBRUMsUUFBUSxRQUFRLGNBQWM7QUFDL0QsU0FBU0MsV0FBVyxRQUFRLHlCQUF5QjtBQUNyRCxjQUFjQyxjQUFjLFFBQVEsMkNBQTJDO0FBQy9FLFNBQVNDLG1CQUFtQixRQUFRLDJDQUEyQztBQUMvRSxjQUNFQyxrQkFBa0IsRUFDbEJDLHdCQUF3QixRQUNuQiw2Q0FBNkM7QUFDcEQsU0FBU0MsWUFBWSxRQUFRLDZDQUE2QztBQUMxRSxjQUFjQyxnQkFBZ0IsUUFBUSxtREFBbUQ7QUFDekYsU0FBU0MsMkJBQTJCLFFBQVEsaURBQWlEO0FBQzdGLFNBQVNDLHNCQUFzQixRQUFRLGtEQUFrRDtBQUN6RixTQUFTQyxjQUFjLFFBQVEsd0NBQXdDO0FBQ3ZFLFNBQVNDLG9DQUFvQyxRQUFRLG1DQUFtQztBQUV4RixLQUFLQywrQkFBK0IsR0FBRztFQUNyQ0MsS0FBSyxDQUFDLEVBQUUsTUFBTTtFQUNkQyxjQUFjLEVBQUVULHdCQUF3QjtBQUMxQyxDQUFDO0FBRUQsU0FBU1UsMkJBQTJCQSxDQUNsQ0QsY0FBYyxFQUFFVCx3QkFBd0IsR0FBRztFQUN6Q1csSUFBSSxFQUFFQyxPQUFPLENBQUNaLHdCQUF3QixDQUFDLE1BQU0sQ0FBQyxFQUFFLG1CQUFtQixDQUFDO0FBQ3RFLENBQUMsQ0FDRixFQUFFLE1BQU0sQ0FBQztFQUNS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
src/components/permissions/PermissionRuleExplanation.tsx ADDED
@@ -0,0 +1,121 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { c as _c } from "react/compiler-runtime";
2
+ import { feature } from 'bun:bundle';
3
+ import chalk from 'chalk';
4
+ import React from 'react';
5
+ import { Ansi, Box, Text } from '../../ink.js';
6
+ import { useAppState } from '../../state/AppState.js';
7
+ import type { PermissionDecision, PermissionDecisionReason } from '../../utils/permissions/PermissionResult.js';
8
+ import { permissionRuleValueToString } from '../../utils/permissions/permissionRuleParser.js';
9
+ import type { Theme } from '../../utils/theme.js';
10
+ import ThemedText from '../design-system/ThemedText.js';
11
+ export type PermissionRuleExplanationProps = {
12
+ permissionResult: PermissionDecision;
13
+ toolType: 'tool' | 'command' | 'edit' | 'read';
14
+ };
15
+ type DecisionReasonStrings = {
16
+ reasonString: string;
17
+ configString?: string;
18
+ /** When set, reasonString is plain text rendered with this theme color instead of <Ansi>. */
19
+ themeColor?: keyof Theme;
20
+ };
21
+ function stringsForDecisionReason(reason: PermissionDecisionReason | undefined, toolType: 'tool' | 'command' | 'edit' | 'read'): DecisionReasonStrings | null {
22
+ if (!reason) {
23
+ return null;
24
+ }
25
+ if ((feature('BASH_CLASSIFIER') || feature('TRANSCRIPT_CLASSIFIER')) && reason.type === 'classifier') {
26
+ if (reason.classifier === 'auto-mode') {
27
+ return {
28
+ reasonString: `Auto mode classifier requires confirmation for this ${toolType}.\n${reason.reason}`,
29
+ configString: undefined,
30
+ themeColor: 'error'
31
+ };
32
+ }
33
+ return {
34
+ reasonString: `Classifier ${chalk.bold(reason.classifier)} requires confirmation for this ${toolType}.\n${reason.reason}`,
35
+ configString: undefined
36
+ };
37
+ }
38
+ switch (reason.type) {
39
+ case 'rule':
40
+ return {
41
+ reasonString: `Permission rule ${chalk.bold(permissionRuleValueToString(reason.rule.ruleValue))} requires confirmation for this ${toolType}.`,
42
+ configString: reason.rule.source === 'policySettings' ? undefined : '/permissions to update rules'
43
+ };
44
+ case 'hook':
45
+ {
46
+ const hookReasonString = reason.reason ? `:\n${reason.reason}` : '.';
47
+ const sourceLabel = reason.hookSource ? ` ${chalk.dim(`[${reason.hookSource}]`)}` : '';
48
+ return {
49
+ reasonString: `Hook ${chalk.bold(reason.hookName)} requires confirmation for this ${toolType}${hookReasonString}${sourceLabel}`,
50
+ configString: '/hooks to update'
51
+ };
52
+ }
53
+ case 'safetyCheck':
54
+ case 'other':
55
+ return {
56
+ reasonString: reason.reason,
57
+ configString: undefined
58
+ };
59
+ case 'workingDir':
60
+ return {
61
+ reasonString: reason.reason,
62
+ configString: '/permissions to update rules'
63
+ };
64
+ default:
65
+ return null;
66
+ }
67
+ }
68
+ export function PermissionRuleExplanation(t0) {
69
+ const $ = _c(11);
70
+ const {
71
+ permissionResult,
72
+ toolType
73
+ } = t0;
74
+ const permissionMode = useAppState(_temp);
75
+ const t1 = permissionResult?.decisionReason;
76
+ let t2;
77
+ if ($[0] !== t1 || $[1] !== toolType) {
78
+ t2 = stringsForDecisionReason(t1, toolType);
79
+ $[0] = t1;
80
+ $[1] = toolType;
81
+ $[2] = t2;
82
+ } else {
83
+ t2 = $[2];
84
+ }
85
+ const strings = t2;
86
+ if (!strings) {
87
+ return null;
88
+ }
89
+ const themeColor = strings.themeColor ?? (permissionResult?.decisionReason?.type === "hook" && permissionMode === "auto" ? "warning" : undefined);
90
+ let t3;
91
+ if ($[3] !== strings.reasonString || $[4] !== themeColor) {
92
+ t3 = themeColor ? <ThemedText color={themeColor}>{strings.reasonString}</ThemedText> : <Text><Ansi>{strings.reasonString}</Ansi></Text>;
93
+ $[3] = strings.reasonString;
94
+ $[4] = themeColor;
95
+ $[5] = t3;
96
+ } else {
97
+ t3 = $[5];
98
+ }
99
+ let t4;
100
+ if ($[6] !== strings.configString) {
101
+ t4 = strings.configString && <Text dimColor={true}>{strings.configString}</Text>;
102
+ $[6] = strings.configString;
103
+ $[7] = t4;
104
+ } else {
105
+ t4 = $[7];
106
+ }
107
+ let t5;
108
+ if ($[8] !== t3 || $[9] !== t4) {
109
+ t5 = <Box marginBottom={1} flexDirection="column">{t3}{t4}</Box>;
110
+ $[8] = t3;
111
+ $[9] = t4;
112
+ $[10] = t5;
113
+ } else {
114
+ t5 = $[10];
115
+ }
116
+ return t5;
117
+ }
118
+ function _temp(s) {
119
+ return s.toolPermissionContext.mode;
120
+ }
121
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJmZWF0dXJlIiwiY2hhbGsiLCJSZWFjdCIsIkFuc2kiLCJCb3giLCJUZXh0IiwidXNlQXBwU3RhdGUiLCJQZXJtaXNzaW9uRGVjaXNpb24iLCJQZXJtaXNzaW9uRGVjaXNpb25SZWFzb24iLCJwZXJtaXNzaW9uUnVsZVZhbHVlVG9TdHJpbmciLCJUaGVtZSIsIlRoZW1lZFRleHQiLCJQZXJtaXNzaW9uUnVsZUV4cGxhbmF0aW9uUHJvcHMiLCJwZXJtaXNzaW9uUmVzdWx0IiwidG9vbFR5cGUiLCJEZWNpc2lvblJlYXNvblN0cmluZ3MiLCJyZWFzb25TdHJpbmciLCJjb25maWdTdHJpbmciLCJ0aGVtZUNvbG9yIiwic3RyaW5nc0ZvckRlY2lzaW9uUmVhc29uIiwicmVhc29uIiwidHlwZSIsImNsYXNzaWZpZXIiLCJ1bmRlZmluZWQiLCJib2xkIiwicnVsZSIsInJ1bGVWYWx1ZSIsInNvdXJjZSIsImhvb2tSZWFzb25TdHJpbmciLCJzb3VyY2VMYWJlbCIsImhvb2tTb3VyY2UiLCJkaW0iLCJob29rTmFtZSIsIlBlcm1pc3Npb25SdWxlRXhwbGFuYXRpb24iLCJ0MCIsIiQiLCJfYyIsInBlcm1pc3Npb25Nb2RlIiwiX3RlbXAiLCJ0MSIsImRlY2lzaW9uUmVhc29uIiwidDIiLCJzdHJpbmdzIiwidDMiLCJ0NCIsInQ1IiwicyIsInRvb2xQZXJtaXNzaW9uQ29udGV4dCIsIm1vZGUiXSwic291cmNlcyI6WyJQZXJtaXNzaW9uUnVsZUV4cGxhbmF0aW9uLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBmZWF0dXJlIH0gZnJvbSAnYnVuOmJ1bmRsZSdcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsaydcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7IEFuc2ksIEJveCwgVGV4dCB9IGZyb20gJy4uLy4uL2luay5qcydcbmltcG9ydCB7IHVzZUFwcFN0YXRlIH0gZnJvbSAnLi4vLi4vc3RhdGUvQXBwU3RhdGUuanMnXG5pbXBvcnQgdHlwZSB7XG4gIFBlcm1pc3Npb25EZWNpc2lvbixcbiAgUGVybWlzc2lvbkRlY2lzaW9uUmVhc29uLFxufSBmcm9tICcuLi8uLi91dGlscy9wZXJtaXNzaW9ucy9QZXJtaXNzaW9uUmVzdWx0LmpzJ1xuaW1wb3J0IHsgcGVybWlzc2lvblJ1bGVWYWx1ZVRvU3RyaW5nIH0gZnJvbSAnLi4vLi4vdXRpbHMvcGVybWlzc2lvbnMvcGVybWlzc2lvblJ1bGVQYXJzZXIuanMnXG5pbXBvcnQgdHlwZSB7IFRoZW1lIH0gZnJvbSAnLi4vLi4vdXRpbHMvdGhlbWUuanMnXG5pbXBvcnQgVGhlbWVkVGV4dCBmcm9tICcuLi9kZXNpZ24tc3lzdGVtL1RoZW1lZFRleHQuanMnXG5cbmV4cG9ydCB0eXBlIFBlcm1pc3Npb25SdWxlRXhwbGFuYXRpb25Qcm9wcyA9IHtcbiAgcGVybWlzc2lvblJlc3VsdDogUGVybWlzc2lvbkRlY2lzaW9uXG4gIHRvb2xUeXBlOiAndG9vbCcgfCAnY29tbWFuZCcgfCAnZWRpdCcgfCAncmVhZCdcbn1cblxudHlwZSBEZWNpc2lvblJlYXNvblN0cmluZ3MgPSB7XG4gIHJlYXNvblN0cmluZzogc3RyaW5nXG4gIGNvbmZpZ1N0cmluZz86IHN0cmluZ1xuICAvKiogV2hlbiBzZXQsIHJlYXNvblN0cmluZyBpcyBwbGFpbiB0ZXh0IHJlbmRlcmVkIHdpdGggdGhpcyB0aGVtZSBjb2xvciBpbnN0ZWFkIG9mIDxBbnNpPi4gKi9cbiAgdGhlbWVDb2xvcj86IGtleW9mIFRoZW1lXG59XG5cbmZ1bmN0aW9uIHN0cmluZ3NGb3JEZWNpc2lvblJlYXNvbihcbiAgcmVhc29uOiBQZXJtaXNzaW9uRGVjaXNpb25SZWFzb24gfCB1bmRlZmluZWQsXG4gIHRvb2xUeXBlOiAndG9vbCcgfCAnY29tbWFuZCcgfCAnZWRpdCcgfCAncmVhZCcsXG4pOiBEZWNpc2lvblJlYXNvblN0cmluZ3MgfCBudWxsIHtcbiAgaWYgKCFyZWFzb24pIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG4gIGlmIChcbiAgICAoZmVhdHVyZSgnQkFTSF9DTEFTU0lGSUVSJykgfHwgZmVhdHVyZSgnVFJBTlNDUklQVF9DTEFTU0lGSUVSJykpICYmXG4gICAgcmVhc29uLnR5cGUgPT09ICdjbGFzc2lmaWVyJ1xuICApIHtcbiAgICBpZiAocmVhc29uLmNsYXNzaWZpZXIgPT09ICdhdXRvLW1vZGUnKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICByZWFzb25TdHJpbmc6IGBBdXRvIG1vZGUgY2xhc3NpZmllciByZXF1aXJlcyBjb25maXJtYXRpb24gZm9yIHRoaXMgJHt0b29sVHlwZX0uXFxuJHtyZWFzb24ucmVhc29ufWAsXG4gICAgICAgIGNvbmZpZ1N0cmluZzogdW5kZWZpbmVkLFxuICAgICAgICB0aGVtZUNvbG9yOiAnZXJyb3InLFxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgcmVhc29uU3RyaW5nOiBgQ2xhc3NpZmllciAke2NoYWxrLmJvbGQocmVhc29uLmNsYXNzaWZpZXIpfSByZXF1aXJlcyBjb25maXJtYXRpb24gZm9yIHRoaXMgJHt0b29sVHlwZX0uXFxuJHtyZWFzb24ucmVhc29ufWAsXG4gICAgICBjb25maWdTdHJpbmc6IHVuZGVmaW5lZCxcbiAgICB9XG4gIH1cbiAgc3dpdGNoIChyZWFzb24udHlwZSkge1xuICAgIGNhc2UgJ3J1bGUnOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcmVhc29uU3RyaW5nOiBgUGVybWlzc2lvbiBydWxlICR7Y2hhbGsuYm9sZChcbiAgICAgICAgICBwZXJtaXNzaW9uUnVsZVZhbHVlVG9TdHJpbmcocmVhc29uLnJ1bGUucnVsZVZhbHVlKSxcbiAgICAgICAgKX0gcmVxdWlyZXMgY29uZmlybWF0aW9uIGZvciB0aGlzICR7dG9vbFR5cGV9LmAsXG4gICAgICAgIGNvbmZpZ1N0cmluZzpcbiAgICAgICAgICByZWFzb24ucnVsZS5zb3VyY2UgPT09ICdwb2xpY3lTZXR0aW5ncydcbiAgICAgICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgICAgICA6ICcvcGVybWlzc2lvbnMgdG8gdXBkYXRlIHJ1bGVzJyxcbiAgICAgIH1cbiAgICBjYXNlICdob29rJzoge1xuICAgICAgY29uc3QgaG9va1JlYXNvblN0cmluZyA9IHJlYXNvbi5yZWFzb24gPyBgOlxcbiR7cmVhc29uLnJlYXNvbn1gIDogJy4nXG4gICAgICBjb25zdCBzb3VyY2VMYWJlbCA9IHJlYXNvbi5ob29rU291cmNlXG4gICAgICAgID8gYCAke2NoYWxrLmRpbShgWyR7cmVhc29uLmhvb2tTb3VyY2V9XWApfWBcbiAgICAgICAgOiAnJ1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcmVhc29uU3RyaW5nOiBgSG9vayAke2NoYWxrLmJvbGQocmVhc29uLmhvb2tOYW1lKX0gcmVxdWlyZXMgY29uZmlybWF0aW9uIGZvciB0aGlzICR7dG9vbFR5cGV9JHtob29rUmVhc29uU3RyaW5nfSR7c291cmNlTGFiZWx9YCxcbiAgICAgICAgY29uZmlnU3RyaW5nOiAnL2hvb2tzIHRvIHVwZGF0ZScsXG4gICAgICB9XG4gICAgfVxuICAgIGNhc2UgJ3NhZmV0eUNoZWNrJzpcbiAgICBjYXNlICdvdGhlcic6XG4gICAgICByZXR1cm4ge1xuICAgICAgICByZWFzb25TdHJpbmc6IHJlYXNvbi5yZWFzb24sXG4gICAgICAgIGNvbmZpZ1N0cmluZzogdW5kZWZpbmVkLFxuICAgICAgfVxuICAgIGNhc2UgJ3dvcmtpbmdEaXInOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcmVhc29uU3RyaW5nOiByZWFzb24ucmVhc29uLFxuICAgICAgICBjb25maWdTdHJpbmc6ICcvcGVybWlzc2lvbnMgdG8gdXBkYXRlIHJ1bGVzJyxcbiAgICAgIH1cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIG51bGxcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gUGVybWlzc2lvblJ1bGVFeHBsYW5hdGlvbih7XG4gIHBlcm1pc3Npb25SZXN1bHQsXG4gIHRvb2xUeXBlLFxufTogUGVybWlzc2lvblJ1bGVFeHBsYW5hdGlvblByb3BzKTogUmVhY3QuUmVhY3ROb2RlIHtcbiAgY29uc3QgcGVybWlzc2lvbk1vZGUgPSB1c2VBcHBTdGF0ZShzID0+IHMudG9vbFBlcm1pc3Npb25Db250ZXh0Lm1vZGUpXG4gIGNvbnN0IHN0cmluZ3MgPSBzdHJpbmdzRm9yRGVjaXNpb25SZWFzb24oXG4gICAgcGVybWlzc2lvblJlc3VsdD8uZGVjaXNpb25SZWFzb24sXG4gICAgdG9vbFR5cGUsXG4gIClcbiAgaWYgKCFzdHJpbmdzKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIGNvbnN0IHRoZW1lQ29sb3IgPVxuICAgIHN0cmluZ3MudGhlbWVDb2xvciA/P1xuICAgIChwZXJtaXNzaW9uUmVzdWx0Py5kZWNpc2lvblJlYXNvbj8udHlwZSA9PT0gJ2hvb2snICYmXG4gICAgcGVybWlzc2lvbk1vZGUgPT09ICdhdXRvJ1xuICAgICAgPyAnd2FybmluZydcbiAgICAgIDogdW5kZWZpbmVkKVxuXG4gIHJldHVybiAoXG4gICAgPEJveCBtYXJnaW5Cb3R0b209ezF9IGZsZXhEaXJlY3Rpb249XCJjb2x1bW5cIj5cbiAgICAgIHt0aGVtZUNvbG9yID8gKFxuICAgICAgICA8VGhlbWVkVGV4dCBjb2xvcj17dGhlbWVDb2xvcn0+e3N0cmluZ3MucmVhc29uU3RyaW5nfTwvVGhlbWVkVGV4dD5cbiAgICAgICkgOiAoXG4gICAgICAgIDxUZXh0PlxuICAgICAgICAgIDxBbnNpPntzdHJpbmdzLnJlYXNvblN0cmluZ308L0Fuc2k+XG4gICAgICAgIDwvVGV4dD5cbiAgICAgICl9XG4gICAgICB7c3RyaW5ncy5jb25maWdTdHJpbmcgJiYgPFRleHQgZGltQ29sb3I+e3N0cmluZ3MuY29uZmlnU3RyaW5nfTwvVGV4dD59XG4gICAgPC9Cb3g+XG4gIClcbn1cbiJdLCJtYXBwaW5ncyI6IjtBQUFBLFNBQVNBLE9BQU8sUUFBUSxZQUFZO0FBQ3BDLE9BQU9DLEtBQUssTUFBTSxPQUFPO0FBQ3pCLE9BQU9DLEtBQUssTUFBTSxPQUFPO0FBQ3pCLFNBQVNDLElBQUksRUFBRUMs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
src/components/permissions/SedEditPermissionRequest/SedEditPermissionRequest.tsx ADDED
@@ -0,0 +1,230 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { c as _c } from "react/compiler-runtime";
2
+ import { basename, relative } from 'path';
3
+ import React, { Suspense, use, useMemo } from 'react';
4
+ import { FileEditToolDiff } from 'src/components/FileEditToolDiff.js';
5
+ import { getCwd } from 'src/utils/cwd.js';
6
+ import { isENOENT } from 'src/utils/errors.js';
7
+ import { detectEncodingForResolvedPath } from 'src/utils/fileRead.js';
8
+ import { getFsImplementation } from 'src/utils/fsOperations.js';
9
+ import { Text } from '../../../ink.js';
10
+ import { BashTool } from '../../../tools/BashTool/BashTool.js';
11
+ import { applySedSubstitution, type SedEditInfo } from '../../../tools/BashTool/sedEditParser.js';
12
+ import { FilePermissionDialog } from '../FilePermissionDialog/FilePermissionDialog.js';
13
+ import type { PermissionRequestProps } from '../PermissionRequest.js';
14
+ type SedEditPermissionRequestProps = PermissionRequestProps & {
15
+ sedInfo: SedEditInfo;
16
+ };
17
+ type FileReadResult = {
18
+ oldContent: string;
19
+ fileExists: boolean;
20
+ };
21
+ export function SedEditPermissionRequest(t0) {
22
+ const $ = _c(9);
23
+ let props;
24
+ let sedInfo;
25
+ if ($[0] !== t0) {
26
+ ({
27
+ sedInfo,
28
+ ...props
29
+ } = t0);
30
+ $[0] = t0;
31
+ $[1] = props;
32
+ $[2] = sedInfo;
33
+ } else {
34
+ props = $[1];
35
+ sedInfo = $[2];
36
+ }
37
+ const {
38
+ filePath
39
+ } = sedInfo;
40
+ let t1;
41
+ if ($[3] !== filePath) {
42
+ t1 = (async () => {
43
+ const encoding = detectEncodingForResolvedPath(filePath);
44
+ const raw = await getFsImplementation().readFile(filePath, {
45
+ encoding
46
+ });
47
+ return {
48
+ oldContent: raw.replaceAll("\r\n", "\n"),
49
+ fileExists: true
50
+ };
51
+ })().catch(_temp);
52
+ $[3] = filePath;
53
+ $[4] = t1;
54
+ } else {
55
+ t1 = $[4];
56
+ }
57
+ const contentPromise = t1;
58
+ let t2;
59
+ if ($[5] !== contentPromise || $[6] !== props || $[7] !== sedInfo) {
60
+ t2 = <Suspense fallback={null}><SedEditPermissionRequestInner sedInfo={sedInfo} contentPromise={contentPromise} {...props} /></Suspense>;
61
+ $[5] = contentPromise;
62
+ $[6] = props;
63
+ $[7] = sedInfo;
64
+ $[8] = t2;
65
+ } else {
66
+ t2 = $[8];
67
+ }
68
+ return t2;
69
+ }
70
+ function _temp(e) {
71
+ if (!isENOENT(e)) {
72
+ throw e;
73
+ }
74
+ return {
75
+ oldContent: "",
76
+ fileExists: false
77
+ };
78
+ }
79
+ function SedEditPermissionRequestInner(t0) {
80
+ const $ = _c(35);
81
+ let contentPromise;
82
+ let props;
83
+ let sedInfo;
84
+ if ($[0] !== t0) {
85
+ ({
86
+ sedInfo,
87
+ contentPromise,
88
+ ...props
89
+ } = t0);
90
+ $[0] = t0;
91
+ $[1] = contentPromise;
92
+ $[2] = props;
93
+ $[3] = sedInfo;
94
+ } else {
95
+ contentPromise = $[1];
96
+ props = $[2];
97
+ sedInfo = $[3];
98
+ }
99
+ const {
100
+ filePath
101
+ } = sedInfo;
102
+ const {
103
+ oldContent,
104
+ fileExists
105
+ } = use(contentPromise);
106
+ let t1;
107
+ if ($[4] !== oldContent || $[5] !== sedInfo) {
108
+ t1 = applySedSubstitution(oldContent, sedInfo);
109
+ $[4] = oldContent;
110
+ $[5] = sedInfo;
111
+ $[6] = t1;
112
+ } else {
113
+ t1 = $[6];
114
+ }
115
+ const newContent = t1;
116
+ let t2;
117
+ bb0: {
118
+ if (oldContent === newContent) {
119
+ let t3;
120
+ if ($[7] === Symbol.for("react.memo_cache_sentinel")) {
121
+ t3 = [];
122
+ $[7] = t3;
123
+ } else {
124
+ t3 = $[7];
125
+ }
126
+ t2 = t3;
127
+ break bb0;
128
+ }
129
+ let t3;
130
+ if ($[8] !== newContent || $[9] !== oldContent) {
131
+ t3 = [{
132
+ old_string: oldContent,
133
+ new_string: newContent,
134
+ replace_all: false
135
+ }];
136
+ $[8] = newContent;
137
+ $[9] = oldContent;
138
+ $[10] = t3;
139
+ } else {
140
+ t3 = $[10];
141
+ }
142
+ t2 = t3;
143
+ }
144
+ const edits = t2;
145
+ let t3;
146
+ bb1: {
147
+ if (!fileExists) {
148
+ t3 = "File does not exist";
149
+ break bb1;
150
+ }
151
+ t3 = "Pattern did not match any content";
152
+ }
153
+ const noChangesMessage = t3;
154
+ let t4;
155
+ if ($[11] !== filePath || $[12] !== newContent) {
156
+ t4 = input => {
157
+ const parsed = BashTool.inputSchema.parse(input);
158
+ return {
159
+ ...parsed,
160
+ _simulatedSedEdit: {
161
+ filePath,
162
+ newContent
163
+ }
164
+ };
165
+ };
166
+ $[11] = filePath;
167
+ $[12] = newContent;
168
+ $[13] = t4;
169
+ } else {
170
+ t4 = $[13];
171
+ }
172
+ const parseInput = t4;
173
+ const t5 = props.toolUseConfirm;
174
+ const t6 = props.toolUseContext;
175
+ const t7 = props.onDone;
176
+ const t8 = props.onReject;
177
+ let t9;
178
+ if ($[14] !== filePath) {
179
+ t9 = relative(getCwd(), filePath);
180
+ $[14] = filePath;
181
+ $[15] = t9;
182
+ } else {
183
+ t9 = $[15];
184
+ }
185
+ let t10;
186
+ if ($[16] !== filePath) {
187
+ t10 = basename(filePath);
188
+ $[16] = filePath;
189
+ $[17] = t10;
190
+ } else {
191
+ t10 = $[17];
192
+ }
193
+ let t11;
194
+ if ($[18] !== t10) {
195
+ t11 = <Text>Do you want to make this edit to{" "}<Text bold={true}>{t10}</Text>?</Text>;
196
+ $[18] = t10;
197
+ $[19] = t11;
198
+ } else {
199
+ t11 = $[19];
200
+ }
201
+ let t12;
202
+ if ($[20] !== edits || $[21] !== filePath || $[22] !== noChangesMessage) {
203
+ t12 = edits.length > 0 ? <FileEditToolDiff file_path={filePath} edits={edits} /> : <Text dimColor={true}>{noChangesMessage}</Text>;
204
+ $[20] = edits;
205
+ $[21] = filePath;
206
+ $[22] = noChangesMessage;
207
+ $[23] = t12;
208
+ } else {
209
+ t12 = $[23];
210
+ }
211
+ let t13;
212
+ if ($[24] !== filePath || $[25] !== parseInput || $[26] !== props.onDone || $[27] !== props.onReject || $[28] !== props.toolUseConfirm || $[29] !== props.toolUseContext || $[30] !== props.workerBadge || $[31] !== t11 || $[32] !== t12 || $[33] !== t9) {
213
+ t13 = <FilePermissionDialog toolUseConfirm={t5} toolUseContext={t6} onDone={t7} onReject={t8} title="Edit file" subtitle={t9} question={t11} content={t12} path={filePath} completionType="str_replace_single" parseInput={parseInput} workerBadge={props.workerBadge} />;
214
+ $[24] = filePath;
215
+ $[25] = parseInput;
216
+ $[26] = props.onDone;
217
+ $[27] = props.onReject;
218
+ $[28] = props.toolUseConfirm;
219
+ $[29] = props.toolUseContext;
220
+ $[30] = props.workerBadge;
221
+ $[31] = t11;
222
+ $[32] = t12;
223
+ $[33] = t9;
224
+ $[34] = t13;
225
+ } else {
226
+ t13 = $[34];
227
+ }
228
+ return t13;
229
+ }
230
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJiYXNlbmFtZSIsInJlbGF0aXZlIiwiUmVhY3QiLCJTdXNwZW5zZSIsInVzZSIsInVzZU1lbW8iLCJGaWxlRWRpdFRvb2xEaWZmIiwiZ2V0Q3dkIiwiaXNFTk9FTlQiLCJkZXRlY3RFbmNvZGluZ0ZvclJlc29sdmVkUGF0aCIsImdldEZzSW1wbGVtZW50YXRpb24iLCJUZXh0IiwiQmFzaFRvb2wiLCJhcHBseVNlZFN1YnN0aXR1dGlvbiIsIlNlZEVkaXRJbmZvIiwiRmlsZVBlcm1pc3Npb25EaWFsb2ciLCJQZXJtaXNzaW9uUmVxdWVzdFByb3BzIiwiU2VkRWRpdFBlcm1pc3Npb25SZXF1ZXN0UHJvcHMiLCJzZWRJbmZvIiwiRmlsZVJlYWRSZXN1bHQiLCJvbGRDb250ZW50IiwiZmlsZUV4aXN0cyIsIlNlZEVkaXRQZXJtaXNzaW9uUmVxdWVzdCIsInQwIiwiJCIsIl9jIiwicHJvcHMiLCJmaWxlUGF0aCIsInQxIiwiZW5jb2RpbmciLCJyYXciLCJyZWFkRmlsZSIsInJlcGxhY2VBbGwiLCJjYXRjaCIsIl90ZW1wIiwiY29udGVudFByb21pc2UiLCJ0MiIsImUiLCJTZWRFZGl0UGVybWlzc2lvblJlcXVlc3RJbm5lciIsIm5ld0NvbnRlbnQiLCJiYjAiLCJ0MyIsIlN5bWJvbCIsImZvciIsIm9sZF9zdHJpbmciLCJuZXdfc3RyaW5nIiwicmVwbGFjZV9hbGwiLCJlZGl0cyIsImJiMSIsIm5vQ2hhbmdlc01lc3NhZ2UiLCJ0NCIsImlucHV0IiwicGFyc2VkIiwiaW5wdXRTY2hlbWEiLCJwYXJzZSIsIl9zaW11bGF0ZWRTZWRFZGl0IiwicGFyc2VJbnB1dCIsInQ1IiwidG9vbFVzZUNvbmZpcm0iLCJ0NiIsInRvb2xVc2VDb250ZXh0IiwidDciLCJvbkRvbmUiLCJ0OCIsIm9uUmVqZWN0IiwidDkiLCJ0MTAiLCJ0MTEiLCJ0MTIiLCJsZW5ndGgiLCJ0MTMiLCJ3b3JrZXJCYWRnZSJdLCJzb3VyY2VzIjpbIlNlZEVkaXRQZXJtaXNzaW9uUmVxdWVzdC50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYmFzZW5hbWUsIHJlbGF0aXZlIH0gZnJvbSAncGF0aCdcbmltcG9ydCBSZWFjdCwgeyBTdXNwZW5zZSwgdXNlLCB1c2VNZW1vIH0gZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBGaWxlRWRpdFRvb2xEaWZmIH0gZnJvbSAnc3JjL2NvbXBvbmVudHMvRmlsZUVkaXRUb29sRGlmZi5qcydcbmltcG9ydCB7IGdldEN3ZCB9IGZyb20gJ3NyYy91dGlscy9jd2QuanMnXG5pbXBvcnQgeyBpc0VOT0VOVCB9IGZyb20gJ3NyYy91dGlscy9lcnJvcnMuanMnXG5pbXBvcnQgeyBkZXRlY3RFbmNvZGluZ0ZvclJlc29sdmVkUGF0aCB9IGZyb20gJ3NyYy91dGlscy9maWxlUmVhZC5qcydcbmltcG9ydCB7IGdldEZzSW1wbGVtZW50YXRpb24gfSBmcm9tICdzcmMvdXRpbHMvZnNPcGVyYXRpb25zLmpzJ1xuaW1wb3J0IHsgVGV4dCB9IGZyb20gJy4uLy4uLy4uL2luay5qcydcbmltcG9ydCB7IEJhc2hUb29sIH0gZnJvbSAnLi4vLi4vLi4vdG9vbHMvQmFzaFRvb2wvQmFzaFRvb2wuanMnXG5pbXBvcnQge1xuICBhcHBseVNlZFN1YnN0aXR1dGlvbixcbiAgdHlwZSBTZWRFZGl0SW5mbyxcbn0gZnJvbSAnLi4vLi4vLi4vdG9vbHMvQmFzaFRvb2wvc2VkRWRpdFBhcnNlci5qcydcbmltcG9ydCB7IEZpbGVQZXJtaXNzaW9uRGlhbG9nIH0gZnJvbSAnLi4vRmlsZVBlcm1pc3Npb25EaWFsb2cvRmlsZVBlcm1pc3Npb25EaWFsb2cuanMnXG5pbXBvcnQgdHlwZSB7IFBlcm1pc3Npb25SZXF1ZXN0UHJvcHMgfSBmcm9tICcuLi9QZXJtaXNzaW9uUmVxdWVzdC5qcydcblxudHlwZSBTZWRFZGl0UGVybWlzc2lvblJlcXVlc3RQcm9wcyA9IFBlcm1pc3Npb25SZXF1ZXN0UHJvcHMgJiB7XG4gIHNlZEluZm86IFNlZEVkaXRJbmZvXG59XG5cbnR5cGUgRmlsZVJlYWRSZXN1bHQgPSB7IG9sZENvbnRlbnQ6IHN0cmluZzsgZmlsZUV4aXN0czogYm9vbGVhbiB9XG5cbmV4cG9ydCBmdW5jdGlvbiBTZWRFZGl0UGVybWlzc2lvblJlcXVlc3Qoe1xuICBzZWRJbmZvLFxuICAuLi5wcm9wc1xufTogU2VkRWRpdFBlcm1pc3Npb25SZXF1ZXN0UHJvcHMpOiBSZWFjdC5SZWFjdE5vZGUge1xuICBjb25zdCB7IGZpbGVQYXRoIH0gPSBzZWRJbmZvXG5cbiAgLy8gUmVhZCBmaWxlIGNvbnRlbnQgYXN5bmMgc28gbW91bnQgZG9lc24ndCBibG9jayBSZWFjdCBjb21taXQgb24gZGlzayBJL08uXG4gIC8vIExhcmdlIGZpbGVzIHdvdWxkIG90aGVyd2lzZSBoYW5nIHRoZSBkaWFsb2cgYmVmb3JlIGl0IHJlbmRlcnMuXG4gIC8vIE1lbW9pemVkIG9uIGZpbGVQYXRoIHNvIHdlIGRvbid0IHJlLXJlYWQgb24gZXZlcnkgcmVuZGVyLlxuICBjb25zdCBjb250ZW50UHJvbWlzZSA9IHVzZU1lbW8oXG4gICAgKCkgPT5cbiAgICAgIChhc3luYyAoKTogUHJvbWlzZTxGaWxlUmVhZFJlc3VsdD4gPT4ge1xuICAgICAgICAvLyBEZXRlY3QgZW5jb2RpbmcgZmlyc3QgKHN5bmMgNEtCIHJlYWQg4oCUIG5lZ2xpZ2libGUpIHNvIFVURi0xNkxFIEJPTXNcbiAgICAgICAgLy8gcmVuZGVyIGNvcnJlY3RseS4gVGhpcyBtYXRjaGVzIHdoYXQgcmVhZEZpbGVTeW5jIGRpZCBiZWZvcmUgdGhlXG4gICAgICAgIC8vIGFzeW5jIGNvbnZlcnNpb24uXG4gICAgICAgIGNvbnN0IGVuY29kaW5nID0gZGV0ZWN0RW5jb2RpbmdGb3JSZXNvbHZlZFBhdGgoZmlsZVBhdGgpXG4gICAgICAgIGNvbnN0IHJhdyA9IGF3YWl0IGdldEZzSW1wbGVtZW50YXRpb24oKS5yZWFkRmlsZShmaWxlUGF0aCwgeyBlbmNvZGluZyB9KVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG9sZENvbnRlbnQ6IHJhdy5yZXBsYWNlQWxsKCdcXHJcXG4nLCAnXFxuJyksXG4gICAgICAgICAgZmlsZUV4aXN0czogdHJ1ZSxcbiAgICAgICAgfVxuICAgICAgfSkoKS5jYXRjaCgoZTogdW5rbm93bik6IEZpbGVSZWFkUmVzdWx0ID0+IHtcbiAgICAgICAgaWYgKCFpc0VOT0VOVChlKSkgdGhyb3cgZVxuICAgICAgICByZXR1cm4geyBvbGRDb250ZW50OiAnJywgZmlsZUV4aXN0czogZmFsc2UgfVxuICAgICAgfSksXG4gICAgW2ZpbGVQYXRoXSxcbiAgKVxuXG4gIHJldHVybiAoXG4gICAgPFN1c3BlbnNlIGZhbGxiYWNrPXtudWxsfT5cbiAgICAgIDxTZWRFZGl0UGVybWlzc2lvblJlcXVlc3RJbm5lclxuICAgICAgICBzZWRJbmZvPXtzZWRJbmZvfVxuICAgICAgICBjb250ZW50UHJvbWlzZT17Y29udGVudFByb21pc2V9XG4gICAgICAgIHsuLi5wcm9wc31cbiAgICAgIC8+XG4gICAgPC9TdXNwZW5zZT5cbiAgKVxufVxuXG5mdW5jdGlvbiBTZWRFZGl0UGVybWlzc2lvblJlcXVlc3RJbm5lcih7XG4gIHNlZEluZm8sXG4gIGNvbnRlbnRQcm9taXNlLFxuICAuLi5wcm9wc1xufTogU2VkRWRpdFBlcm1pc3Npb25SZXF1ZXN0UHJvcHMgJiB7XG4gIGNvbnRlbnRQcm9taXNlOiBQcm9taXNlPEZpbGVSZWFkUmVzdWx0PlxufSk6IFJlYWN0LlJlYWN0Tm9kZSB7XG4gIGNvbnN0IHsgZmlsZVBhdGggfSA9IHNlZEluZm9cbiAgY29uc3QgeyBvbGRDb250ZW50LCBmaWxlRXhpc3RzIH0gPSB1c2UoY29udGVudFByb21pc2UpXG5cbiAgLy8gQ29tcHV0ZSB0aGUgbmV3IGNvbnRlbnQgYnkgYXBwbHlpbmcgdGhlIHNlZCBzdWJzdGl0dXRpb25cbiAgY29uc3QgbmV3Q29udGVudCA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIHJldHVybiBhcHBseVNlZFN1YnN0aXR1dGlvbihvbGRDb250ZW50LCBzZWRJbmZvKVxuICB9LCBbb2xkQ29udGVudCwgc2VkSW5mb10pXG5cbiAgLy8gQ3JlYXRlIHRoZSBlZGl0IHJlcHJlc2VudGF0aW9uIGZvciB0aGUgZGlmZlxuICBjb25zdCBlZGl0cyA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGlmIChvbGRDb250ZW50ID09PSBuZXdDb250ZW50KSB7XG4gICAgICByZXR1cm4gW11cbiAgICB9XG4gICAgcmV0dXJuIFtcbiAgICAgIHtcbiAgICAgICAgb2xkX3N0cmluZzogb2xkQ29udGVudCxcbiAgICAgICAgbmV3X3N0cmluZzogbmV3Q29udGVudCxcbiAgICAgICAgcmVwbGFjZV9hbGw6IGZhbHNlLFxuICAgICAgfSxcbiAgICBdXG4gIH0sIFtvbGRDb250ZW50LCBuZXdDb250ZW50XSlcblxuICAvLyBEZXRlcm1pbmUgYXBwcm9wcmlhdGUgbWVzc2FnZSB3aGVuIG5vIGNoYW5nZXNcbiAgY29uc3Qgbm9DaGFuZ2VzTWVzc2FnZSA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGlmICghZmlsZUV4aXN0cykge1xuICAgICAgcmV0dXJuICdGaWxlIGRvZXMgbm90IGV4aXN0J1xuICAgIH1cbiAgICByZXR1cm4gJ1BhdHRlcm4gZGlkIG5vdCBtYXRjaCBhbnkgY29udGVudCdcbiAgfSwgW2ZpbGVFeGlzdHNdKVxuXG4gIC8vIFBhcnNlIGlucHV0IGFuZCBhZGQgX3NpbXVsYXRlZFNlZEVkaXQgdG8gZW5zdXJlIHdoYXQgdXNlciBwcmV2aWV3ZWRcbiAgLy8gaXMgZXhhY3RseSB3aGF0IGdldHMgd3JpdHRlbiAocHJldmVudHMgc2VkL0pTIHJlZ2V4IGRpZmZlcmVuY2VzKVxuICBjb25zdCBwYXJzZUlucHV0ID0gKGlucHV0OiB1bmtub3duKSA9PiB7XG4gICAgY29uc3QgcGFyc2VkID0gQmFzaFRvb2wuaW5wdXRTY2hlbWEucGFyc2UoaW5wdXQpXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnBhcnNlZCxcbiAgICAgIF9zaW11bGF0ZWRTZWRFZGl0OiB7XG4gICAgICAgIGZpbGVQYXRoLFxuICAgICAgICBuZXdDb250ZW50LFxuICAgICAgfSxcbiAgICB9XG4gIH1cblxuICByZXR1cm4gKFxuICAgIDxGaWxlUGVybWlzc2lvbkRpYWxvZ1xuICAgICAgdG9vbFVzZUNvbmZpcm09e3Byb3BzLnRvb2xVc2VDb25maXJtfVxuICAgICAgdG9vbFVzZUNvbnRleHQ9e3Byb3BzLnRvb2xVc2VDb250ZXh0fVxuICAgICAgb25Eb25lPXtwcm9wcy5vbkRvbmV9XG4gICAgICBvblJlamVjdD17cHJvcHMub25SZWplY3R9XG4gICAgICB0aXRsZT1cIkVkaXQgZmlsZVwiXG4gICAgICBzdWJ0aXRsZT17cmVsYXRpdmUoZ2V0Q3dkKCksIGZpbGVQYXRoKX1cbiAgICAgIHF1ZXN0aW9uPXtcbiAgICAgICAgPFRleHQ+XG4gICAgICAgICAgRG8geW91IHdhbnQgdG8gbWFrZSB0aGlzIGVkaXQgdG97JyAnfVxuICAgICAgICAgIDxUZXh0IGJvbGQ+e2Jhc2VuYW1lKGZpbGVQYXRoKX08L1RleHQ+P1xuICAgICAgICA8L1RleHQ+XG4gICAgICB9XG4gICAgICBjb250ZW50PXtcbiAgICAgICAgZWRpdHMubGVuZ3RoID4gMCA/IChcbiAgICAgICAgICA8RmlsZUVkaXRUb29sRGlmZiBmaWxlX3BhdGg9e2ZpbGVQYXRofSBlZGl0cz17ZWRpdHN9IC8+XG4gICAgICAgICkgOiAoXG4gICAgICAgICAgPFRleHQgZGltQ29sb3I+e25vQ2hhbmdlc01lc3NhZ2V9PC9UZXh0PlxuICAgICAgICApXG4gICAgICB9XG4gICAgICBwYXRoPXtmaWxlUGF0aH1cbiAgICAgIGNvbXBsZXRpb25UeXBlPVwic3RyX3JlcGxhY2Vfc2luZ2xlXCJcbiAgICAgIHBhcnNlSW5wdXQ9e3BhcnNlSW5wdXR9XG4gICAgICB3b3JrZXJCYWRnZT17cHJvcHMud29ya2VyQmFkZ2V9XG4gICAgLz5cbiAgKVxufVxuIl0sIm1hcHBpbmdzIjoiO0FBQUEsU0FBU0EsUUFBUSxFQUFFQyxRQUFRLFFBQVEsTUFBTTtBQUN6QyxPQUFPQyxLQUFLLElBQUlDLFFBQVEsRUFBRUMsR0FBRyxFQUFF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
src/components/permissions/SkillPermissionRequest/SkillPermissionRequest.tsx ADDED
@@ -0,0 +1,369 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { c as _c } from "react/compiler-runtime";
2
+ import React, { useCallback, useMemo } from 'react';
3
+ import { logError } from 'src/utils/log.js';
4
+ import { getOriginalCwd } from '../../../bootstrap/state.js';
5
+ import { Box, Text } from '../../../ink.js';
6
+ import { sanitizeToolNameForAnalytics } from '../../../services/analytics/metadata.js';
7
+ import { SKILL_TOOL_NAME } from '../../../tools/SkillTool/constants.js';
8
+ import { SkillTool } from '../../../tools/SkillTool/SkillTool.js';
9
+ import { env } from '../../../utils/env.js';
10
+ import { shouldShowAlwaysAllowOptions } from '../../../utils/permissions/permissionsLoader.js';
11
+ import { logUnaryEvent } from '../../../utils/unaryLogging.js';
12
+ import { type UnaryEvent, usePermissionRequestLogging } from '../hooks.js';
13
+ import { PermissionDialog } from '../PermissionDialog.js';
14
+ import { PermissionPrompt, type PermissionPromptOption, type ToolAnalyticsContext } from '../PermissionPrompt.js';
15
+ import type { PermissionRequestProps } from '../PermissionRequest.js';
16
+ import { PermissionRuleExplanation } from '../PermissionRuleExplanation.js';
17
+ type SkillOptionValue = 'yes' | 'yes-exact' | 'yes-prefix' | 'no';
18
+ export function SkillPermissionRequest(props) {
19
+ const $ = _c(51);
20
+ const {
21
+ toolUseConfirm,
22
+ onDone,
23
+ onReject,
24
+ workerBadge
25
+ } = props;
26
+ const parseInput = _temp;
27
+ let t0;
28
+ if ($[0] !== toolUseConfirm.input) {
29
+ t0 = parseInput(toolUseConfirm.input);
30
+ $[0] = toolUseConfirm.input;
31
+ $[1] = t0;
32
+ } else {
33
+ t0 = $[1];
34
+ }
35
+ const skill = t0;
36
+ const commandObj = toolUseConfirm.permissionResult.behavior === "ask" && toolUseConfirm.permissionResult.metadata && "command" in toolUseConfirm.permissionResult.metadata ? toolUseConfirm.permissionResult.metadata.command : undefined;
37
+ let t1;
38
+ if ($[2] === Symbol.for("react.memo_cache_sentinel")) {
39
+ t1 = {
40
+ completion_type: "tool_use_single",
41
+ language_name: "none"
42
+ };
43
+ $[2] = t1;
44
+ } else {
45
+ t1 = $[2];
46
+ }
47
+ const unaryEvent = t1;
48
+ usePermissionRequestLogging(toolUseConfirm, unaryEvent);
49
+ let t2;
50
+ if ($[3] === Symbol.for("react.memo_cache_sentinel")) {
51
+ t2 = getOriginalCwd();
52
+ $[3] = t2;
53
+ } else {
54
+ t2 = $[3];
55
+ }
56
+ const originalCwd = t2;
57
+ let t3;
58
+ if ($[4] === Symbol.for("react.memo_cache_sentinel")) {
59
+ t3 = shouldShowAlwaysAllowOptions();
60
+ $[4] = t3;
61
+ } else {
62
+ t3 = $[4];
63
+ }
64
+ const showAlwaysAllowOptions = t3;
65
+ let t4;
66
+ if ($[5] === Symbol.for("react.memo_cache_sentinel")) {
67
+ t4 = [{
68
+ label: "Yes",
69
+ value: "yes",
70
+ feedbackConfig: {
71
+ type: "accept"
72
+ }
73
+ }];
74
+ $[5] = t4;
75
+ } else {
76
+ t4 = $[5];
77
+ }
78
+ const baseOptions = t4;
79
+ let alwaysAllowOptions;
80
+ if ($[6] !== skill) {
81
+ alwaysAllowOptions = [];
82
+ if (showAlwaysAllowOptions) {
83
+ const t5 = <Text bold={true}>{skill}</Text>;
84
+ let t6;
85
+ if ($[8] === Symbol.for("react.memo_cache_sentinel")) {
86
+ t6 = <Text bold={true}>{originalCwd}</Text>;
87
+ $[8] = t6;
88
+ } else {
89
+ t6 = $[8];
90
+ }
91
+ let t7;
92
+ if ($[9] !== t5) {
93
+ t7 = {
94
+ label: <Text>Yes, and don't ask again for {t5} in{" "}{t6}</Text>,
95
+ value: "yes-exact"
96
+ };
97
+ $[9] = t5;
98
+ $[10] = t7;
99
+ } else {
100
+ t7 = $[10];
101
+ }
102
+ alwaysAllowOptions.push(t7);
103
+ const spaceIndex = skill.indexOf(" ");
104
+ if (spaceIndex > 0) {
105
+ const commandPrefix = skill.substring(0, spaceIndex);
106
+ const t8 = commandPrefix + ":*";
107
+ let t9;
108
+ if ($[11] !== t8) {
109
+ t9 = <Text bold={true}>{t8}</Text>;
110
+ $[11] = t8;
111
+ $[12] = t9;
112
+ } else {
113
+ t9 = $[12];
114
+ }
115
+ let t10;
116
+ if ($[13] === Symbol.for("react.memo_cache_sentinel")) {
117
+ t10 = <Text bold={true}>{originalCwd}</Text>;
118
+ $[13] = t10;
119
+ } else {
120
+ t10 = $[13];
121
+ }
122
+ let t11;
123
+ if ($[14] !== t9) {
124
+ t11 = {
125
+ label: <Text>Yes, and don't ask again for{" "}{t9} commands in{" "}{t10}</Text>,
126
+ value: "yes-prefix"
127
+ };
128
+ $[14] = t9;
129
+ $[15] = t11;
130
+ } else {
131
+ t11 = $[15];
132
+ }
133
+ alwaysAllowOptions.push(t11);
134
+ }
135
+ }
136
+ $[6] = skill;
137
+ $[7] = alwaysAllowOptions;
138
+ } else {
139
+ alwaysAllowOptions = $[7];
140
+ }
141
+ let t5;
142
+ if ($[16] === Symbol.for("react.memo_cache_sentinel")) {
143
+ t5 = {
144
+ label: "No",
145
+ value: "no",
146
+ feedbackConfig: {
147
+ type: "reject"
148
+ }
149
+ };
150
+ $[16] = t5;
151
+ } else {
152
+ t5 = $[16];
153
+ }
154
+ const noOption = t5;
155
+ let t6;
156
+ if ($[17] !== alwaysAllowOptions) {
157
+ t6 = [...baseOptions, ...alwaysAllowOptions, noOption];
158
+ $[17] = alwaysAllowOptions;
159
+ $[18] = t6;
160
+ } else {
161
+ t6 = $[18];
162
+ }
163
+ const options = t6;
164
+ let t7;
165
+ if ($[19] !== toolUseConfirm.tool.name) {
166
+ t7 = sanitizeToolNameForAnalytics(toolUseConfirm.tool.name);
167
+ $[19] = toolUseConfirm.tool.name;
168
+ $[20] = t7;
169
+ } else {
170
+ t7 = $[20];
171
+ }
172
+ const t8 = toolUseConfirm.tool.isMcp ?? false;
173
+ let t9;
174
+ if ($[21] !== t7 || $[22] !== t8) {
175
+ t9 = {
176
+ toolName: t7,
177
+ isMcp: t8
178
+ };
179
+ $[21] = t7;
180
+ $[22] = t8;
181
+ $[23] = t9;
182
+ } else {
183
+ t9 = $[23];
184
+ }
185
+ const toolAnalyticsContext = t9;
186
+ let t10;
187
+ if ($[24] !== onDone || $[25] !== onReject || $[26] !== skill || $[27] !== toolUseConfirm) {
188
+ t10 = (value, feedback) => {
189
+ bb33: switch (value) {
190
+ case "yes":
191
+ {
192
+ logUnaryEvent({
193
+ completion_type: "tool_use_single",
194
+ event: "accept",
195
+ metadata: {
196
+ language_name: "none",
197
+ message_id: toolUseConfirm.assistantMessage.message.id,
198
+ platform: env.platform
199
+ }
200
+ });
201
+ toolUseConfirm.onAllow(toolUseConfirm.input, [], feedback);
202
+ onDone();
203
+ break bb33;
204
+ }
205
+ case "yes-exact":
206
+ {
207
+ logUnaryEvent({
208
+ completion_type: "tool_use_single",
209
+ event: "accept",
210
+ metadata: {
211
+ language_name: "none",
212
+ message_id: toolUseConfirm.assistantMessage.message.id,
213
+ platform: env.platform
214
+ }
215
+ });
216
+ toolUseConfirm.onAllow(toolUseConfirm.input, [{
217
+ type: "addRules",
218
+ rules: [{
219
+ toolName: SKILL_TOOL_NAME,
220
+ ruleContent: skill
221
+ }],
222
+ behavior: "allow",
223
+ destination: "localSettings"
224
+ }]);
225
+ onDone();
226
+ break bb33;
227
+ }
228
+ case "yes-prefix":
229
+ {
230
+ logUnaryEvent({
231
+ completion_type: "tool_use_single",
232
+ event: "accept",
233
+ metadata: {
234
+ language_name: "none",
235
+ message_id: toolUseConfirm.assistantMessage.message.id,
236
+ platform: env.platform
237
+ }
238
+ });
239
+ const spaceIndex_0 = skill.indexOf(" ");
240
+ const commandPrefix_0 = spaceIndex_0 > 0 ? skill.substring(0, spaceIndex_0) : skill;
241
+ toolUseConfirm.onAllow(toolUseConfirm.input, [{
242
+ type: "addRules",
243
+ rules: [{
244
+ toolName: SKILL_TOOL_NAME,
245
+ ruleContent: `${commandPrefix_0}:*`
246
+ }],
247
+ behavior: "allow",
248
+ destination: "localSettings"
249
+ }]);
250
+ onDone();
251
+ break bb33;
252
+ }
253
+ case "no":
254
+ {
255
+ logUnaryEvent({
256
+ completion_type: "tool_use_single",
257
+ event: "reject",
258
+ metadata: {
259
+ language_name: "none",
260
+ message_id: toolUseConfirm.assistantMessage.message.id,
261
+ platform: env.platform
262
+ }
263
+ });
264
+ toolUseConfirm.onReject(feedback);
265
+ onReject();
266
+ onDone();
267
+ }
268
+ }
269
+ };
270
+ $[24] = onDone;
271
+ $[25] = onReject;
272
+ $[26] = skill;
273
+ $[27] = toolUseConfirm;
274
+ $[28] = t10;
275
+ } else {
276
+ t10 = $[28];
277
+ }
278
+ const handleSelect = t10;
279
+ let t11;
280
+ if ($[29] !== onDone || $[30] !== onReject || $[31] !== toolUseConfirm) {
281
+ t11 = () => {
282
+ logUnaryEvent({
283
+ completion_type: "tool_use_single",
284
+ event: "reject",
285
+ metadata: {
286
+ language_name: "none",
287
+ message_id: toolUseConfirm.assistantMessage.message.id,
288
+ platform: env.platform
289
+ }
290
+ });
291
+ toolUseConfirm.onReject();
292
+ onReject();
293
+ onDone();
294
+ };
295
+ $[29] = onDone;
296
+ $[30] = onReject;
297
+ $[31] = toolUseConfirm;
298
+ $[32] = t11;
299
+ } else {
300
+ t11 = $[32];
301
+ }
302
+ const handleCancel = t11;
303
+ const t12 = `Use skill "${skill}"?`;
304
+ let t13;
305
+ if ($[33] === Symbol.for("react.memo_cache_sentinel")) {
306
+ t13 = <Text>Claude may use instructions, code, or files from this Skill.</Text>;
307
+ $[33] = t13;
308
+ } else {
309
+ t13 = $[33];
310
+ }
311
+ const t14 = commandObj?.description;
312
+ let t15;
313
+ if ($[34] !== t14) {
314
+ t15 = <Box flexDirection="column" paddingX={2} paddingY={1}><Text dimColor={true}>{t14}</Text></Box>;
315
+ $[34] = t14;
316
+ $[35] = t15;
317
+ } else {
318
+ t15 = $[35];
319
+ }
320
+ let t16;
321
+ if ($[36] !== toolUseConfirm.permissionResult) {
322
+ t16 = <PermissionRuleExplanation permissionResult={toolUseConfirm.permissionResult} toolType="tool" />;
323
+ $[36] = toolUseConfirm.permissionResult;
324
+ $[37] = t16;
325
+ } else {
326
+ t16 = $[37];
327
+ }
328
+ let t17;
329
+ if ($[38] !== handleCancel || $[39] !== handleSelect || $[40] !== options || $[41] !== toolAnalyticsContext) {
330
+ t17 = <PermissionPrompt options={options} onSelect={handleSelect} onCancel={handleCancel} toolAnalyticsContext={toolAnalyticsContext} />;
331
+ $[38] = handleCancel;
332
+ $[39] = handleSelect;
333
+ $[40] = options;
334
+ $[41] = toolAnalyticsContext;
335
+ $[42] = t17;
336
+ } else {
337
+ t17 = $[42];
338
+ }
339
+ let t18;
340
+ if ($[43] !== t16 || $[44] !== t17) {
341
+ t18 = <Box flexDirection="column">{t16}{t17}</Box>;
342
+ $[43] = t16;
343
+ $[44] = t17;
344
+ $[45] = t18;
345
+ } else {
346
+ t18 = $[45];
347
+ }
348
+ let t19;
349
+ if ($[46] !== t12 || $[47] !== t15 || $[48] !== t18 || $[49] !== workerBadge) {
350
+ t19 = <PermissionDialog title={t12} workerBadge={workerBadge}>{t13}{t15}{t18}</PermissionDialog>;
351
+ $[46] = t12;
352
+ $[47] = t15;
353
+ $[48] = t18;
354
+ $[49] = workerBadge;
355
+ $[50] = t19;
356
+ } else {
357
+ t19 = $[50];
358
+ }
359
+ return t19;
360
+ }
361
+ function _temp(input) {
362
+ const result = SkillTool.inputSchema.safeParse(input);
363
+ if (!result.success) {
364
+ logError(new Error(`Failed to parse skill tool input: ${result.error.message}`));
365
+ return "";
366
+ }
367
+ return result.data.skill;
368
+ }
369
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsInVzZUNhbGxiYWNrIiwidXNlTWVtbyIsImxvZ0Vycm9yIiwiZ2V0T3JpZ2luYWxDd2QiLCJCb3giLCJUZXh0Iiwic2FuaXRpemVUb29sTmFtZUZvckFuYWx5dGljcyIsIlNLSUxMX1RPT0xfTkFNRSIsIlNraWxsVG9vbCIsImVudiIsInNob3VsZFNob3dBbHdheXNBbGxvd09wdGlvbnMiLCJsb2dVbmFyeUV2ZW50IiwiVW5hcnlFdmVudCIsInVzZVBlcm1pc3Npb25SZXF1ZXN0TG9nZ2luZyIsIlBlcm1pc3Npb25EaWFsb2ciLCJQZXJtaXNzaW9uUHJvbXB0IiwiUGVybWlzc2lvblByb21wdE9wdGlvbiIsIlRvb2xBbmFseXRpY3NDb250ZXh0IiwiUGVybWlzc2lvblJlcXVlc3RQcm9wcyIsIlBlcm1pc3Npb25SdWxlRXhwbGFuYXRpb24iLCJTa2lsbE9wdGlvblZhbHVlIiwiU2tpbGxQZXJtaXNzaW9uUmVxdWVzdCIsInByb3BzIiwiJCIsIl9jIiwidG9vbFVzZUNvbmZpcm0iLCJvbkRvbmUiLCJvblJlamVjdCIsIndvcmtlckJhZGdlIiwicGFyc2VJbnB1dCIsIl90ZW1wIiwidDAiLCJpbnB1dCIsInNraWxsIiwiY29tbWFuZE9iaiIsInBlcm1pc3Npb25SZXN1bHQiLCJiZWhhdmlvciIsIm1ldGFkYXRhIiwiY29tbWFuZCIsInVuZGVmaW5lZCIsInQxIiwiU3ltYm9sIiwiZm9yIiwiY29tcGxldGlvbl90eXBlIiwibGFuZ3VhZ2VfbmFtZSIsInVuYXJ5RXZlbnQiLCJ0MiIsIm9yaWdpbmFsQ3dkIiwidDMiLCJzaG93QWx3YXlzQWxsb3dPcHRpb25zIiwidDQiLCJsYWJlbCIsInZhbHVlIiwiZmVlZGJhY2tDb25maWciLCJ0eXBlIiwiYmFzZU9wdGlvbnMiLCJhbHdheXNBbGxvd09wdGlvbnMiLCJ0NSIsInQ2IiwidDciLCJwdXNoIiwic3BhY2VJbmRleCIsImluZGV4T2YiLCJjb21tYW5kUHJlZml4Iiwic3Vic3RyaW5nIiwidDgiLCJ0OSIsInQxMCIsInQxMSIsIm5vT3B0aW9uIiwib3B0aW9ucyIsInRvb2wiLCJuYW1lIiwiaXNNY3AiLCJ0b29sTmFtZSIsInRvb2xBbmFseXRpY3NDb250ZXh0IiwiZmVlZGJhY2siLCJiYjMzIiwiZXZlbnQiLCJtZXNzYWdlX2lkIiwiYXNzaXN0YW50TWVzc2FnZSIsIm1lc3NhZ2UiLCJpZCIsInBsYXRmb3JtIiwib25BbGxvdyIsInJ1bGVzIiwicnVsZUNvbnRlbnQiLCJkZXN0aW5hdGlvbiIsInNwYWNlSW5kZXhfMCIsImNvbW1hbmRQcmVmaXhfMCIsImhhbmRsZVNlbGVjdCIsImhhbmRsZUNhbmNlbCIsInQxMiIsInQxMyIsInQxNCIsImRlc2NyaXB0aW9uIiwidDE1IiwidDE2IiwidDE3IiwidDE4IiwidDE5IiwicmVzdWx0IiwiaW5wdXRTY2hlbWEiLCJzYWZlUGFyc2UiLCJzdWNjZXNzIiwiRXJyb3IiLCJlcnJvciIsImRhdGEiXSwic291cmNlcyI6WyJTa2lsbFBlcm1pc3Npb25SZXF1ZXN0LnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVhY3QsIHsgdXNlQ2FsbGJhY2ssIHVzZU1lbW8gfSBmcm9tICdyZWFjdCdcbmltcG9ydCB7IGxvZ0Vycm9yIH0gZnJvbSAnc3JjL3V0aWxzL2xvZy5qcydcbmltcG9ydCB7IGdldE9yaWdpbmFsQ3dkIH0gZnJvbSAnLi4vLi4vLi4vYm9vdHN0cmFwL3N0YXRlLmpzJ1xuaW1wb3J0IHsgQm94LCBUZXh0IH0gZnJvbSAnLi4vLi4vLi4vaW5rLmpzJ1xuaW1wb3J0IHsgc2FuaXRpemVUb29sTmFtZUZvckFuYWx5dGljcyB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2FuYWx5dGljcy9tZXRhZGF0YS5qcydcbmltcG9ydCB7IFNLSUxMX1RPT0xfTkFNRSB9IGZyb20gJy4uLy4uLy4uL3Rvb2xzL1NraWxsVG9vbC9jb25zdGFudHMuanMnXG5pbXBvcnQgeyBTa2lsbFRvb2wgfSBmcm9tICcuLi8uLi8uLi90b29scy9Ta2lsbFRvb2wvU2tpbGxUb29sLmpzJ1xuaW1wb3J0IHsgZW52IH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMvZW52LmpzJ1xuaW1wb3J0IHsgc2hvdWxkU2hvd0Fsd2F5c0FsbG93T3B0aW9ucyB9IGZyb20gJy4uLy4uLy4uL3V0aWxzL3Blcm1pc3Npb25zL3Blcm1pc3Npb25zTG9hZGVyLmpzJ1xuaW1wb3J0IHsgbG9nVW5hcnlFdmVudCB9IGZyb20gJy4uLy4uLy4uL3V0aWxzL3VuYXJ5TG9nZ2luZy5qcydcbmltcG9ydCB7IHR5cGUgVW5hcnlFdmVudCwgdXNlUGVybWlzc2lvblJlcXVlc3RMb2dnaW5nIH0gZnJvbSAnLi4vaG9va3MuanMnXG5pbXBvcnQgeyBQZXJtaXNzaW9uRGlhbG9nIH0gZnJvbSAnLi4vUGVybWlzc2lvbkRpYWxvZy5qcydcbmltcG9ydCB7XG4gIFBlcm1pc3Npb25Qcm9tcHQsXG4gIHR5cGUgUGVybWlzc2lvblByb21wdE9wdGlvbixcbiAgdHlwZSBUb29sQW5hbHl0aWNzQ29udGV4dCxcbn0gZnJvbSAnLi4vUGVybWlzc2lvblByb21wdC5qcydcbmltcG9ydCB0eXBlIHsgUGVybWlzc2lvblJlcXVlc3RQcm9wcyB9IGZyb20gJy4uL1Blcm1pc3Npb25SZXF1ZXN0LmpzJ1xuaW1wb3J0IHsgUGVybWlzc2lvblJ1bGVFeHBsYW5hdGlvbiB9IGZyb20gJy4uL1Blcm1pc3Npb25SdWxlRXhwbGFuYXRpb24uanMnXG5cbnR5cGUgU2tpbGxPcHRpb25WYWx1ZSA9ICd5ZXMnIHwgJ3llcy1leGFjdCcgfCAneWVzLXByZWZpeCcgfCAnbm8nXG5cbmV4cG9ydCBmdW5jdGlvbiBTa2lsbFBlcm1pc3Npb25SZXF1ZXN0KFxuICBwcm9wczogUGVybWlzc2lvblJlcXVlc3RQcm9wcyxcbik6IFJlYWN0LlJlYWN0Tm9kZSB7XG4gIGNvbnN0IHtcbiAgICB0b29sVXNlQ29uZmlybSxcbiAgICBvbkRvbmUsXG4gICAgb25SZWplY3QsXG4gICAgdmVyYm9zZTogX3ZlcmJvc2UsXG4gICAgd29ya2VyQmFkZ2UsXG4gIH0gPSBwcm9wc1xuICBjb25zdCBwYXJzZUlucHV0ID0gKGlucHV0OiB1bmtub3duKTogc3RyaW5nID0+IHtcbiAgICBjb25zdCByZXN1bHQgPSBTa2lsbFRvb2wuaW5wdXRTY2hlbWEuc2FmZVBhcnNlKGlucHV0KVxuICAgIGlmICghcmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgIGxvZ0Vycm9yKFxuICAgICAgICBuZXcgRXJyb3IoYEZhaWxlZCB0byBwYXJzZSBza2lsbCB0b29sIGlucHV0OiAke3Jlc3VsdC5lcnJvci5tZXNzYWdlfWApLFxuICAgICAgKVxuICAgICAgcmV0dXJuICcnXG4gICAgfVxuICAgIHJldHVybiByZXN1bHQuZGF0YS5za2lsbFxuICB9XG5cbiAgY29uc3Qgc2tpbGwgPSBwYXJzZUlucHV0KHRvb2xVc2VDb25maXJtLmlucHV0KVxuXG4gIC8vIENoZWNrIGlmIHRoaXMgaXMgYSBjb21tYW5kIHVzaW5nIG1ldGFkYXRhIGZyb20gY2hlY2tQZXJtaXNzaW9uc1xuICBjb25zdCBjb21tYW5kT2JqID1cbiAgICB0b29sVXNlQ29uZmlybS5wZXJtaXNzaW9uUmVzdWx0LmJlaGF2aW9yID09PSAnYXNrJyAmJlxuICAgIHRvb2xVc2VDb25maXJtLnBlcm1pc3Npb25SZXN1bHQubWV0YWRhdGEgJiZcbiAgICAnY29tbWFuZCcgaW4gdG9vbFVzZUNvbmZpcm0ucGVybWlzc2lvblJlc3VsdC5tZXRhZGF0YVxuICAgICAgPyB0b29sVXNlQ29uZmlybS5wZXJtaXNzaW9uUmVzdWx0Lm1ldGFkYXRhLmNvbW1hbmRcbiAgICAgIDogdW5kZWZpbmVkXG5cbiAgY29uc3QgdW5hcnlFdmVudCA9IHVzZU1lbW88VW5hcnlFdmVudD4oXG4gICAgKCkgPT4gKHtcbiAgICAgIGNvbXBsZXRpb25fdHlwZTogJ3Rvb2xfdXNlX3NpbmdsZScsXG4gICAgICBsYW5ndWFnZV9uYW1lOiAnbm9uZScsXG4gICAgfSksXG4gICAgW10sXG4gIClcblxuICB1c2VQZXJtaXNzaW9uUmVxdWVzdExvZ2dpbmcodG9vbFVzZUNvbmZpcm0sIHVuYXJ5RXZlbnQpXG5cbiAgY29uc3Qgb3JpZ2luYWxDd2QgPSBnZXRPcmlnaW5hbEN3ZCgpXG4gIGNvbnN0IHNob3dBbHdheXNBbGxvd09wdGlvbnMgPSBzaG91bGRTaG93QWx3YXlzQWxsb3dPcHRpb25zKClcbiAgY29uc3Qgb3B0aW9ucyA9IHVzZU1lbW8oKCk6IFBlcm1pc3Npb25Qcm9tcHRPcHRpb248U2tpbGxPcHRpb25WYWx1ZT5bXSA9PiB7XG4gICAgY29uc3QgYmFzZU9wdGlvbnM6IFBlcm1pc3Npb25Qcm9tcHRPcHRpb248U2tpbGxPcHRpb25WYWx1ZT5bXSA9IFtcbiAgICAgIHtcbiAgICAgICAgbGFiZWw6ICdZZXMnLFxuICAgICAgICB2YWx1ZTogJ3llcycsXG4gICAgICAgIGZlZWRiYWNrQ29uZmlnOiB7IHR5cGU6ICdhY2NlcHQnIH0sXG4gICAgICB9LFxuICAgIF1cblxuICAgIC8vIE9ubHkgYWRkIFwiYWx3YXlzIGFsbG93XCIgb3B0aW9ucyB3aGVuIG5vdCByZXN0cmljdGVkIGJ5IGFsbG93TWFuYWdlZFBlcm1pc3Npb25SdWxlc09ubHlcbiAgICBjb25zdCBhbHdheXNBbGxvd09wdGlvbnM6IFBlcm1pc3Npb25Qcm9tcHRPcHRpb248U2tpbGxPcHRpb25WYWx1ZT5bXSA9IFtdXG4gICAgaWYgKHNob3dBbHdheXNBbGxvd09wdGlvbnMpIHtcbiAgICAgIC8vIEFkZCBleGFjdCBtYXRjaCBvcHRpb25cbiAgICAgIGFsd2F5c0FsbG93T3B0aW9ucy5wdXNoKHtcbiAgICAgICAgbGFiZWw6IChcbiAgICAgICAgICA8VGV4dD5cbiAgICAgICAgICAgIFllcywgYW5kIGRvbiZhcG9zO3QgYXNrIGFnYWluIGZvciA8VGV4dCBib2xkPntza2lsbH08L1RleHQ+IGlueycgJ31cbiAgICAgICAgICAgIDxUZXh0IGJvbGQ+e29yaWdpbmFsQ3dkfTwvVGV4dD5cbiAgICAgICAgICA8L1RleHQ+XG4gICAgICAgICksXG4gICAgICAgIHZhbHVlOiAneWVzLWV4YWN0JyxcbiAgICAgIH0pXG5cbiAgICAgIC8vIEFkZCBwcmVmaXggb3B0aW9uIGlmIHRoZSBza2lsbCBoYXMgYXJndW1lbnRzXG4gICAgICBjb25zdCBzcGFjZUluZGV4ID0gc2tpbGwuaW5kZXhPZignICcpXG4gICAgICBpZiAoc3BhY2VJbmRleCA+IDApIHtcbiAgICAgICAgY29uc3QgY29tbWFuZFByZWZpeCA9IHNraWxsLnN1YnN0cmluZygwLCBzcGFjZUluZGV4KVxuICAgICAgICBhbHdheXNBbGxvd09wdGlvbnMucHVzaCh7XG4gICAgICAgICAgbGFiZWw6IChcbiAgICAgICAgICAgIDxUZXh0PlxuICAgICAgICAgICAgICBZZXMsIGFuZCBkb24mYXBvczt0IGFzayBhZ2FpbiBmb3J7JyAnfVxuICAgICAgICAgICAgICA8VGV4dCBib2xkPntjb21tYW5kUHJlZml4ICsgJzoqJ308L1RleHQ+IGNvbW1hbmRzIGlueycgJ31cbiAgICAgICAgICAgICAgPFRleHQgYm9sZD57b3JpZ2luYWxDd2R9PC9UZXh0PlxuICAgICAgICAgICAgPC9UZXh0PlxuICAgICAgICAgICksXG4gICAgICAgICAgdmFsdWU6ICd5ZXMtcHJlZml4JyxcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBub09wdGlvbjogUGVybWlzc2lvblByb21wdE9wdGlvbjxTa2lsbE9wdGlvblZhbHVlPiA9IHtcbiAgICAgIGxhYmVsOiAnTm8nLFxuICAgICAgdmFsdWU6ICdubycsXG4gICAgICBmZWVkYmFja0NvbmZpZzogeyB0eXBlOiAncmVqZWN0JyB9LFxuICAgIH1cblxuICAgIHJldHVybiBbLi4uYmFzZU9wdGlvbnMsIC4uLmFsd2F5c0FsbG93T3B0aW9ucywgbm9PcHRpb25dXG4gIH0sIFtza2lsbCwgb3JpZ2luYWxDd2QsIHNob3dBbHdheXNBbGxvd09wdGlvbnNdKVxuXG4gIGNvbnN0IHRvb2xBbmFseXRpY3NDb250ZXh0ID0gdXNlTWVtbyhcbiAgICAoKTogVG9vbEFuYWx5dGljc0NvbnRleHQgPT4gKHtcbiAgICAgIHRvb2xOYW1lOiBzYW5pdGl6ZVRvb2xOYW1lRm9yQW5hbHl0aWNzKHRvb2xVc2VDb25maXJtLnRvb2wubmFtZSksXG4gICAgICBpc01jcDogdG9vbFVzZUNvbmZpcm0udG9vbC5pc01jcCA/PyBmYWxzZSxcbiAgICB9KSxcbiAgICBbdG9vbFVzZUNvbmZpcm0udG9vbC5uYW1lLCB0b29sVXNlQ29uZmlybS50b29sLmlzTWNwXSxcbiAgKVxuXG4gIGNvbnN0IGhhbmRsZVNlbGVjdCA9IHVzZUNhbGxiYWNrKFxuICAgICh2YWx1ZTogU2tpbGxPcHRpb25WYWx1ZSwgZmVlZGJhY2s/OiBzdHJpbmcpID0+IHtcbiAgICAgIHN3aXRjaCAodmFsdWUpIHtcbiAgICAgICAgY2FzZSAneWVzJzpcbiAgICAgICAgICB2b2lkIGxvZ1VuYXJ5RXZlbnQoe1xuICAgICAgICAgICAgY29tcGxldGlvbl90eXBlOiAndG9vbF91c2Vfc2luZ2xlJyxcbiAgICAgICAgICAgIGV2ZW50OiAnYWNjZXB0JyxcbiAgICAgICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgICAgIGxhbmd1YWdlX25hbWU6ICdub25lJyxcbiAgICAgICAgICAgICAgbWVzc2FnZV9pZDogdG9vbFVzZUNvbmZpcm0uYXNzaXN0YW50TWVzc2FnZS5tZXNzYWdlLmlkLFxuICAgICAgICAgICAgICBwbGF0Zm9ybTogZW52LnBsYXRmb3JtLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KVxuICAgICAgICAgIHRvb2xVc2VDb25maXJtLm9uQWxsb3codG9vbFVzZUNvbmZpcm0uaW5wdXQsIFtdLCBmZWVkYmFjaylcbiAgICAgICAgICBvbkRvbmUoKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgJ3llcy1leGFjdCc6IHtcbiAgICAgICAgICB2b2lkIGxvZ1VuYXJ5RXZlbnQoe1xuICAgICAgICAgICAgY29tcGxldGlvbl90eXBlOiAndG9vbF91c2Vfc2luZ2xlJyxcbiAgICAgICAgICAgIGV2ZW50OiAnYWNjZXB0JyxcbiAgICAgICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgICAgIGxhbmd1YWdlX25hbWU6ICdub25lJyxcbiAgICAgICAgICAgICAgbWVzc2FnZV9pZDogdG9vbFVzZUNvbmZpcm0uYXNzaXN0YW50TWVzc2FnZS5tZXNzYWdlLmlkLFxuICAgICAgICAgICAgICBwbGF0Zm9ybTogZW52LnBsYXRmb3JtLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KVxuXG4gICAgICAgICAgdG9vbFVzZUNvbmZpcm0ub25BbGxvdyh0b29sVXNlQ29uZmlybS5pbnB1dCwgW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB0eXBlOiAnYWRkUnVsZXMnLFxuICAgICAgICAgICAgICBydWxlczogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIHRvb2xOYW1lOiBTS0lMTF9UT09MX05BTUUsXG4gICAgICAgICAgICAgICAgICBydWxlQ29udGVudDogc2tpbGwsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgYmVoYXZpb3I6ICdhbGxvdycsXG4gICAgICAgICAgICAgIGRlc3RpbmF0aW9uOiAnbG9jYWxTZXR0aW5ncycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0pXG4gICAgICAgICAgb25Eb25lKClcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3llcy1wcmVmaXgnOiB7XG4gICAgICAgICAgdm9pZCBsb2dVbmFyeUV2ZW50KHtcbiAgICAgICAgICAgIGNvbXBsZXRpb25fdHlwZTogJ3Rvb2xfdXNlX3NpbmdsZScsXG4gICAgICAgICAgICBldmVudDogJ2FjY2VwdCcsXG4gICAgICAgICAgICBtZXRhZGF0YToge1xuICAgICAgICAgICAgICBsYW5ndWFnZV9uYW1lOiAnbm9uZScsXG4gICAgICAgICAgICAgIG1lc3NhZ2VfaWQ6IHRvb2xVc2VDb25maXJtLmFzc2lzdGFudE1lc3NhZ2UubWVzc2FnZS5pZCxcbiAgICAgICAgICAgICAgcGxhdGZvcm06IGVudi5wbGF0Zm9ybSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSlcblxuICAgICAgICAgIC8vIEV4dHJhY3QgdGhlIHNraWxsIHByZWZpeCAoZXZlcnl0aGluZyBiZWZvcmUgdGhlIGZpcnN0IHNwYWNlKVxuICAgICAgICAgIGNvbnN0IHNwYWNlSW5kZXggPSBza2lsbC5pbmRleE9mKCcgJylcbiAgICAgICAgICBjb25zdCBjb21tYW5kUHJlZml4ID1cbiAgICAgICAgICAgIHNwYWNlSW5kZXggPiAwID8gc2tpbGwuc3Vic3RyaW5nKDAsIHNwYWNlSW5kZXgpIDogc2tpbGxcblxuICAgICAgICAgIHRvb2xVc2VDb25maXJtLm9uQWxsb3codG9vbFVzZUNvbmZpcm0uaW5wdXQsIFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdHlwZTogJ2FkZFJ1bGVzJyxcbiAgICAgICAgICAgICAgcnVsZXM6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICB0b29sTmFtZTogU0tJTExfVE9PTF9OQU1FLFxuICAgICAgICAgICAgICAgICAgcnVsZUNvbnRlbnQ6IGAke2NvbW1hbmRQcmVmaXh9OipgLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIGJlaGF2aW9yOiAnYWxsb3cnLFxuICAgICAgICAgICAgICBkZXN0aW5hdGlvbjogJ2xvY2FsU2V0dGluZ3MnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdKVxuICAgICAgICAgIG9uRG9uZSgpXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdubyc6XG4gICAgICAgICAgdm9pZCBsb2dVbmFyeUV2ZW50KHtcbiAgICAgICAgICAgIGNvbXBsZXRpb25fdHlwZTogJ3Rvb2xfdXNlX3NpbmdsZScsXG4gICAgICAgICAgICBldmVudDogJ3JlamVjdCcsXG4gICAgICAgICAgICBtZXRhZGF0YToge1xuICAgICAgICAgICAgICBsYW5ndWFnZV9uYW1lOiAnbm9uZScsXG4gICAgICAgICAgICAgIG1lc3NhZ2VfaWQ6IHRvb2xVc2VDb25maXJtLmFzc2lzdGFudE1lc3NhZ2UubWVzc2FnZS5pZCxcbiAgICAgICAgICAgICAgcGxhdGZvcm06IGVudi5wbGF0Zm9ybSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSlcbiAgICAgICAgICB0b29sVXNlQ29uZmlybS5vblJlamVjdChmZWVkYmFjaylcbiAgICAgICAgICBvblJlamVjdCgpXG4gICAgICAgICAgb25Eb25lKClcbiAgICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH0sXG4gICAgW3Rvb2xVc2VDb25maXJtLCBvbkRvbmUsIG9uUmVqZWN0LCBza2lsbF0sXG4gIClcblxuICBjb25zdCBoYW5kbGVDYW5jZWwgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgdm9pZCBsb2dVbmFyeUV2ZW50KHtcbiAgICAgIGNvbXBsZXRpb25fdHlwZTogJ3Rvb2xfdXNlX3NpbmdsZScsXG4gICAgICBldmVudDogJ3JlamVjdCcsXG4gICAgICBtZXRhZGF0YToge1xuICAgICAgICBsYW5ndWFnZV9uYW1lOiAnbm9uZScsXG4gICAgICAgIG1lc3NhZ2VfaWQ6IHRvb2xVc2VDb25maXJtLmFzc2lzdGFudE1lc3NhZ2UubWVzc2FnZS5pZCxcbiAgICAgICAgcGxhdGZvcm06IGVudi5wbGF0Zm9ybSxcbiAgICAgIH0sXG4gICAgfSlcbiAgICB0b29sVXNlQ29uZmlybS5vblJlamVjdCgpXG4gICAgb25SZWplY3QoKVxuICAgIG9uRG9uZSgpXG4gIH0sIFt0b29sVXNlQ29uZmlybSwgb25Eb25lLCBvblJlamVjdF0pXG5cbiAgcmV0dXJuIChcbiAgICA8UGVybWlzc2lvbkRpYWxvZyB0aXRsZT17YFVzZSBza2lsbCBcIiR7c2tpbGx9XCI/YH0gd29ya2VyQmFkZ2U9e3dvcmtlckJhZGdlfT5cbiAgICAgIDxUZXh0PkNsYXVkZSBtYXkgdXNlIGluc3RydWN0aW9ucywgY29kZSwgb3IgZmlsZXMgZnJvbSB0aGlzIFNraWxsLjwvVGV4dD5cbiAgICAgIDxCb3ggZmxleERpcmVjdGlvbj1cImNvbHVtblwiIHBhZGRpbmdYPXsyfSBwYWRkaW5nWT17MX0+XG4gICAgICAgIDxUZXh0IGRpbUNvbG9yPntjb21tYW5kT2JqPy5kZXNjcmlwdGlvbn08L1RleHQ+XG4gICAgICA8L0JveD5cblxuICAgICAgPEJveCBmbGV4RGlyZWN0aW9uPVwiY29sdW1uXCI+XG4gICAgICAgIDxQZXJtaXNzaW9uUnVsZUV4cGxhbmF0aW9uXG4gICAgICAgICAgcGVybWlzc2lvblJlc3VsdD17dG9vbFVzZUNvbmZpcm0ucGVybWlzc2lvblJlc3VsdH1cbiAgICAgICAgICB0b29sVHlwZT1cInRvb2xcIlxuICAgICAgICAvPlxuICAgICAgICA8UGVybWlzc2lvblByb21wdFxuICAgICAgICAgIG9wdGlvbnM9e29wdGlvbnN9XG4gICAgICAgICAgb25TZWxlY3Q9e2hhbmRsZVNlbGVjdH1cbiAgICAgICAgICBvbkNhbmNlbD17aGFuZGxlQ2FuY2VsfVxuICAgICAgICAgIHRvb2xBbmFseXRpY3NDb250ZXh0PXt0b29sQW5hbHl0aWNzQ29udGV4dH1cbiAgICAgICAgLz5cbiAgICAgIDwvQm94PlxuICAgIDwvUGVybWlzc2lvbkRpYWxvZz5cbiAgKVxufVxuIl0sIm1hcHBpbmdzIjoiO0FBQUEsT0FBT0EsS0FBSyxJQUFJQyxXQUFXLEVBQUVDLE9BQU8sUUFBUSxPQUFPO0FBQ25ELFNBQVNDLFFBQVEsUUFBUSxrQkFBa0I7QUFDM0MsU0FBU0MsY0FBYyxRQUFRLDZCQUE2QjtBQUM1RCxTQUFTQyxHQUFHLEVBQUVDLElBQUksUUFBUSxpQkFBaUI7QUFDM0MsU0FBU0MsNEJBQTRCLFFBQVEseUNBQXlDO0FBQ3RGLFNBQVNDLGVBQWUsUUFBUSx1Q0FBdUM7QUFDdkUsU0FBU0MsU0FBUyxRQUFRLHVDQUF1QztBQUNqRSxTQUFTQyxHQUFHLFFBQVEsdUJBQXVCO0FBQzNDLFNBQVNDLDRCQUE0QixRQUFRLGlEQUFpRDtBQUM5RixTQUFTQyxhQUFhLFFBQVEsZ0NBQWdDO0FBQzlELFNBQVMsS0FBS0MsVUFBVSxFQUFFQywyQkFBMkIsUUFBUSxhQUFhO0FBQzFFLFNBQVNDLGdCQUFnQixRQUFRLHdCQUF3QjtBQUN6RCxTQUNFQyxnQkFBZ0IsRUFDaEIsS0FBS0Msc0JBQXNCLEVBQzNCLEtBQUtDLG9CQUFvQixRQUNwQix3QkFBd0I7QUFDL0IsY0FBY0Msc0JBQXNCLFFBQVEseUJBQXlCO0FBQ3JFLFNBQVNDLHlCQUF5QixRQUFRLGlDQUFpQztBQUUzRSxLQUFLQyxnQkFBZ0IsR0FBRyxLQUFLLEdBQUcsV0FBVyxHQUFHLFlBQVksR0FBRyxJQUFJO0FBRWpFLE9BQU8sU0FBQUMsdUJBQUFDLEtBQUE7RUFBQSxNQUFBQyxDQUFBLEdBQUFDLEVBQUE7RUFHTDtJQUFBQyxjQUFBO0lBQUFDLE1BQUE7SUFBQUMsUUFBQTtJQUFBQztFQUFBLElBTUlOLEtBQUs7RUFDVCxNQUFBTyxVQUFBLEdBQW1CQyxLQVNsQjtFQUFBLElBQUFDLEVBQUE7RUFBQSxJQUFBUixDQUFBLFFBQUFFLGNBQUEsQ0FBQU8sS0FBQTtJQUVhRCxFQUFBLEdBQUFGLFVBQVUsQ0FBQ0osY0FBYyxDQUFBTyxLQUFNLENBQUM7SUFBQVQsQ0FBQSxNQUFBRSxjQUFBLENBQUFPLEtBQUE7SUFBQVQsQ0FBQSxNQUFBUSxFQUFBO0VBQUE7SUFBQUEsRUFBQSxHQUFBUixDQUFBO0VBQUE7RUFBOUMsTUFBQVUsS0FBQSxHQUFjRixFQUFnQztFQUc5QyxNQUFBRyxVQUFBLEdBQ0VULGNBQWMsQ0FBQVUsZ0JBQWlCLENBQUFDLFFBQVMsS0FBSyxLQUNMLElBQXhDWCxjQUFjLENBQUFVLGdCQUFpQixDQUFBRSxRQUNzQixJQUFyRCxTQUFTLElBQUlaLGNBQWMsQ0FBQVUsZ0JBQWlCLENBQUFFLFFBRS9CLEdBRFRaLGNBQWMsQ0FBQVUsZ0JBQWlCLENBQUFFLFFBQVMsQ0FBQUMsT0FDL0IsR0FKYkMsU0FJYTtFQUFBLElBQUFDLEVBQUE7RUFBQSxJQUFBakIsQ0FBQSxRQUFBa0IsTUFBQSxDQUFBQyxHQUFBO0lBR05GLEVBQUE7TUFBQUcsZUFBQSxFQUNZLGlCQUFpQjtNQUFBQyxhQUFBLEVBQ25CO0lBQ2pCLENBQUM7SUFBQXJCLENBQUEsTUFBQWlCLEVBQUE7RUFBQTtJQUFBQSxFQUFBLEdBQUFqQixDQUFBO0VBQUE7RUFKSCxNQUFBc0IsVUFBQSxHQUNTTCxFQUdOO0VBSUgzQiwyQkFBMkIsQ0FBQ1ksY0FBYyxFQUFFb0IsVUFBVSxDQUFDO0VBQUEsSUFBQUMsRUFBQTtFQUFBLElBQUF2QixDQUFBLFFBQUFrQixNQUFBLENBQUFDLEdBQUE7SUFFbkNJLEVBQUEsR0FBQTNDLGNBQWMsQ0FBQyxDQUFDO0lBQUFvQixDQUFBLE1BQUF1QixFQUFBO0VBQUE7SUFBQUEsRUFBQSxHQUFBdkIsQ0FBQTtFQUFBO0VBQXBDLE1BQUF3QixXQUFBLEdBQW9CRCxFQUFnQjtFQUFBLElBQUFFLEVBQUE7RUFBQSxJQUFBekIsQ0FBQSxRQUFBa0IsTUFBQSxDQUFBQyxHQUFBO0lBQ0xNLEVBQUEsR0FBQXRDLDRCQUE0QixDQUFDLENBQUM7SUFBQWEsQ0FBQSxNQUFBeUIsRUFBQTtFQUFBO0lBQUFBLEVBQUEsR0FBQXpCLENBQUE7RUFBQTtFQUE3RCxNQUFBMEIsc0JBQUEsR0FBK0JELEVBQThCO0VBQUEsSUFBQUUsRUFBQTtFQUFBLElBQUEzQixDQUFBLFFBQUFrQixNQUFBLENBQUFDLEdBQUE7SUFFS1EsRUFBQSxJQUM5RDtNQUFBQyxLQUFBLEVBQ1MsS0FBSztNQUFBQyxLQUFBLEVBQ0wsS0FBSztNQUFBQyxjQUFBLEVBQ0k7UUFBQUMsSUFBQSxFQUFRO01BQVM7SUFDbkMsQ0FBQyxDQUNGO0lBQUEvQixDQUFBLE1BQUEyQixFQUFBO0VBQUE7SUFBQUEsRUFBQSxHQUFBM0IsQ0FBQTtFQUFBO0VBTkQsTUFBQWdDLFdBQUEsR0FBZ0VMLEVBTS9EO0VBQUEsSUFBQU0sa0JBQUE7RUFBQSxJQUFBakMsQ0FBQSxRQUFBVSxLQUFBO0lBR0R1QixrQkFBQSxHQUF1RSxFQUFFO0lBQ3pFLElBQUlQLHNCQUFzQjtNQUtnQixNQUFBUSxFQUFBLElBQUMsSUFBSSxDQUFDLElBQUksQ0FBSixLQUFHLENBQUMsQ0FBRXhCLE1BQUksQ0FBRSxFQUFqQixJQUFJLENBQW9CO01BQUEsSUFBQXlCLEVBQUE7TUFBQSxJQUFBbkMsQ0FBQSxRQUFBa0IsTUFBQSxDQUFBQyxHQUFBO1FBQzNEZ0IsRUFBQSxJQUFDLElBQUksQ0FBQyxJQUFJLENBQUosS0FBRyxDQUFDLENBQUVYLFlBQVUsQ0FBRSxFQUF2QixJQUFJLENBQTBCO1FBQUF4QixDQUFBLE1BQUFtQyxFQUFBO01BQUE7UUFBQUEsRUFBQSxHQUFBbkMsQ0FBQTtNQUFBO01BQUEsSUFBQW9DLEVBQUE7TUFBQSxJQUFBcEMsQ0FBQSxRQUFBa0MsRUFBQTtRQUpiRSxFQUFBO1VBQUFSLEtBQUEsRUFFcEIsQ0FBQyxJQUFJLENBQUMsNkJBQzhCLENBQUFNLEVBQXdCLENBQUMsR0FBSSxJQUFFLENBQ2pFLENBQUFDLEVBQThCLENBQ2hDLEVBSEMsSUFBSSxDQUdFO1VBQUFOLEtBQUEsRUFFRjtRQUNULENBQUM7UUFBQTdCLENBQUEsTUFBQWtDLEVBQUE7UUFBQWxDLENBQUEsT0FBQW9DLEVBQUE7TUFBQTtRQUFBQSxFQUFBLEdBQUFwQyxDQUFBO01BQUE7TUFSRGlDLGtCQUFrQixDQUFBSSxJQUFLLENBQUNELEVBUXZCLENBQUM7TUFHRixNQUFBRSxVQUFBLEdBQW1CNUIsS0FBSyxDQUFBNkIsT0FBUSxDQUFDLEdBQUcsQ0FBQztNQUNyQyxJQUFJRCxVQUFVLEdBQUcsQ0FBQztRQUNoQixNQUFBRSxhQUFBLEdBQXNCOUIsS0FBSyxDQUFBK0IsU0FBVSxDQUFDLENBQUMsRUFBRUgsVUFBVSxDQUFDO1FBS2xDLE1BQUFJLEVBQUEsR0FBQUYsYUFBYSxHQUFHLElBQUk7UUFBQSxJQUFBRyxFQUFBO1FBQUEsSUFBQTNDLENBQUEsU0FBQTBDLEVBQUE7VUFBaENDLEVBQUEsSUFBQyxJQUFJLENBQUMsSUFBSSxDQUFKLEtBQUcsQ0FBQyxDQUFFLENBQUFELEVBQW1CLENBQUUsRUFBaEMsSUFBSSxDQUFtQztVQUFBMUMsQ0FBQSxPQUFBMEMsRUFBQTtVQUFBMUMsQ0FBQSxPQUFBMkMsRUFBQTtRQUFBO1VBQUFBLEVBQUEsR0FBQTNDLENBQUE7UUFBQTtRQUFBLElBQUE0QyxHQUFBO1FBQUEsSUFBQTVDLENBQUEsU0FBQWtCLE1BQUEsQ0FBQUMsR0FBQTtVQUN4Q3lCLEdBQUEsSUFBQyxJQUFJLENBQUMsSUFBSSxDQUFKLEtBQUcsQ0FBQyxDQUFFcEIsWUFBVSxDQUFFLEVBQXZCLElBQUksQ0FBMEI7VUFBQXhCLENBQUEsT0FBQTRDLEdBQUE7UUFBQTtVQUFBQSxHQUFBLEdBQUE1QyxDQUFBO1FBQUE7UUFBQSxJQUFBNkMsR0FBQTtRQUFBLElBQUE3QyxDQUFBLFNBQUEyQyxFQUFBO1VBTGJFLEdBQUE7WUFBQWpCLEtBQUEsRUFFcEIsQ0FBQyxJQUFJLENBQUMsNEJBQzhCLElBQUUsQ0FDcEMsQ0FBQWUsRUFBdUMsQ0FBQyxZQUFhLElBQUUsQ0FDdkQsQ0FBQUMsR0FBOEIsQ0FDaEMsRUFKQyxJQUFJLENBSUU7WUFBQWYsS0FBQSxFQUVGO1VBQ1QsQ0FBQztVQUFBN0IsQ0FBQSxPQUFBMkMsRUFBQTtVQUFBM0MsQ0FBQSxPQUFBNkMsR0FBQTtRQUFBO1VBQUFBLEdBQUEsR0FBQTdDLENBQUE7UUFBQTtRQVREaUMsa0JBQWtCLENBQUFJLElBQUssQ0FBQ1EsR0FTdkIsQ0FBQztNQUFBO0lBQ0g7SUFDRjdDLENBQUEsTUFBQVUsS0FBQTtJQUFBVixDQUFBLE1BQUFpQyxrQkFBQTtFQUFBO0lBQUFBLGtCQUFBLEdBQUFqQyxDQUFBO0VBQUE7RUFBQSxJQUFBa0MsRUFBQTtFQUFBLElBQUFsQyxDQUFBLFNBQUFrQixNQUFBLENBQUFDLEdBQUE7SUFFMERlLEVBQUE7TUFBQU4sS0FBQSxFQUNsRCxJQUFJO01BQUFDLEtBQUEsRUFDSixJQUFJO01BQUFDLGNBQUEsRUFDSztRQUFBQyxJQUFBLEVBQVE7TUFBUztJQUNuQyxDQUFDO0lBQUEvQixDQUFBLE9BQUFrQyxFQUFBO0VBQUE7SUFBQUEsRUFBQSxHQUFBbEMsQ0FBQTtFQUFBO0VBSkQsTUFBQThDLFFBQUEsR0FBMkRaLEVBSTFEO0VBQUEsSUFBQUMsRUFBQTtFQUFBLElBQUFuQyxDQUFBLFNBQUFpQyxrQkFBQTtJQUVNRSxFQUFBLE9BQUlILFdBQVcsS0FBS0Msa0JBQWtCLEVBQUVhLFFBQVEsQ0FBQztJQUFBOUMsQ0FBQSxPQUFBaUMsa0JBQUE7SUFBQWpDLENBQUEsT0FBQW1DLEVBQUE7RUFBQTtJQUFBQSxFQUFBLEdBQUFuQyxDQUFBO0VBQUE7RUE5QzFELE1BQUErQyxPQUFBLEdBOENFWixFQUF3RDtFQUNWLElBQUFDLEVBQUE7RUFBQSxJQUFBcEMsQ0FBQSxTQUFBRSxjQUFBLENBQUE4QyxJQUFBLENBQUFDLElBQUE7SUFJbENiLEVBQUEsR0FBQXJELDRCQUE0QixDQUFDbUIsY0FBYyxDQUFBOEMsSUFBSyxDQUFBQyxJQUFLLENBQUM7SUFBQWpELENBQUEsT0FBQUUsY0FBQSxDQUFBOEMsSUFBQSxDQUFBQyxJQUFBO0lBQUFqRCxDQUFBLE9BQUFvQyxFQUFBO0VBQUE7SUFBQUEsRUFBQSxHQUFBcEMsQ0FBQTtFQUFBO0VBQ3pELE1BQUEwQyxFQUFBLEdBQUF4QyxjQUFjLENBQUE4QyxJQUFLLENBQUFFLEtBQWUsSUFBbEMsS0FBa0M7RUFBQSxJQUFBUCxFQUFBO0VBQUEsSUFBQTNDLENBQUEsU0FBQW9DLEVBQUEsSUFBQXBDLENBQUEsU0FBQTBDLEVBQUE7SUFGZEMsRUFBQTtNQUFBUSxRQUFBLEVBQ2pCZixFQUFzRDtNQUFBYyxLQUFBLEVBQ3pEUjtJQUNULENBQUM7SUFBQTFDLENBQUEsT0FBQW9DLEVBQUE7SUFBQXBDLENBQUEsT0FBQTBDLEVBQUE7SUFBQTFDLENBQUEsT0FBQTJDLEVBQUE7RUFBQTtJQUFBQSxFQUFBLEdBQUEzQyxDQUFBO0VBQUE7RUFKSCxNQUFBb0Qsb0JBQUEsR0FDK0JULEVBRzVCO0VBRUYsSUFBQUMsR0FBQTtFQUFBLElBQUE1QyxDQUFBLFNBQUFHLE1BQUEsSUFBQUgsQ0FBQSxTQUFBSSxRQUFBLElBQUFKLENBQUEsU0FBQVUsS0FBQSxJQUFBVixDQUFBLFNBQUFFLGNBQUE7SUFHQzBDLEdBQUEsR0FBQUEsQ0FBQWYsS0FBQSxFQUFBd0IsUUFBQTtNQUFBQyxJQUFBLEVBQ0UsUUFBUXpCLEtBQUs7UUFBQSxLQUNOLEtBQUs7VUFBQTtZQUNIekMsYUFBYSxDQUFDO2NBQUFnQyxlQUFBLEVBQ0EsaUJBQWlCO2NBQUFtQyxLQUFBLEVBQzNCLFFBQVE7Y0FBQXpDLFFBQUEsRUFDTDtnQkFBQU8sYUFBQSxFQUNPLE1BQU07Z0JBQUFtQyxVQUFBLEVBQ1R0RCxjQUFjLENBQUF1RCxnQkFBaUIsQ0FBQUMsT0FBUSxDQUFBQyxFQUFHO2dCQUFBQyxRQUFBLEVBQzVDMUUsR0FBRyxDQUFBMEU7Y0FDZjtZQUNGLENBQUMsQ0FBQztZQUNGMUQsY0FBYyxDQUFBMkQsT0FBUSxDQUFDM0QsY0FBYyxDQUFBTyxLQUFNLEVBQUUsRUFBRSxFQUFFNEMsUUFBUSxDQUFDO1lBQzFEbEQsTUFBTSxDQUFDLENBQUM7WUFDUixNQUFBbUQsSUFBQTtVQUFLO1FBQUEsS0FDRixXQUFXO1VBQUE7WUFDVGxFLGFBQWEsQ0FBQztjQUFBZ0MsZUFBQSxFQUNBLGlCQUFpQjtjQUFBbUMsS0FBQSxFQUMzQixRQUFRO2NBQUF6QyxRQUFBLEVBQ0w7Z0JBQUFPLGFBQUEsRUFDTyxNQUFNO2dCQUFBbUMsVUFBQSxFQUNUdEQsY0FBYyxDQUFBdUQsZ0JBQWlCLENBQUFDLE9BQVEsQ0FBQUMsRUFBRztnQkFBQUMsUUFBQSxFQUM1QzFFLEdBQUcsQ0FBQTBFO2NBQ2Y7WUFDRixDQUFDLENBQUM7WUFFRjFELGNBQWMsQ0FBQTJELE9BQVEsQ0FBQzNELGNBQWMsQ0FBQU8sS0FBTSxFQUFFLENBQzNDO2NBQUFzQixJQUFBLEVBQ1EsVUFBVTtjQUFBK0IsS0FBQSxFQUNULENBQ0w7Z0JBQUFYLFFBQUEsRUFDWW5FLGVBQWU7Z0JBQUErRSxXQUFBLEVBQ1pyRDtjQUNmLENBQUMsQ0FDRjtjQUFBRyxRQUFBLEVBQ1MsT0FBTztjQUFBbUQsV0FBQSxFQUNKO1lBQ2YsQ0FBQyxDQUNGLENBQUM7WUFDRjdELE1BQU0sQ0FBQyxDQUFDO1lBQ1IsTUFBQW1ELElBQUE7VUFBSztRQUFBLEtBRUYsWUFBWTtVQUFBO1lBQ1ZsRSxhQUFhLENBQUM7Y0FBQWdDLGVBQUEsRUFDQSxpQkFBaUI7Y0FBQW1DLEtBQUEsRUFDM0IsUUFBUTtjQUFBekMsUUFBQSxFQUNMO2dCQUFBTyxhQUFBLEVBQ08sTUFBTTtnQkFBQW1DLFVBQUEsRUFDVHRELGNBQWMsQ0FBQXVELGdCQUFpQixDQUFBQyxPQUFRLENBQUFDLEVBQUc7Z0JBQUFDLFFBQUEsRUFDNUMxRSxHQUFHLENBQUEwRTtjQUNmO1lBQ0YsQ0FBQyxDQUFDO1lBR0YsTUFBQUssWUFBQSxHQUFtQnZELEtBQUssQ0FBQTZCLE9BQVEsQ0FBQyxHQUFHLENBQUM7WUFDckMsTUFBQTJCLGVBQUEsR0FDRTVCLFlBQVUsR0FBRyxDQUEwQyxHQUF0QzVCLEtBQUssQ0FBQStCLFNBQVUsQ0FBQyxDQUFDLEVBQUVILFlBQWtCLENBQUMsR0FBdkQ1QixLQUF1RDtZQUV6RFIsY0FBYyxDQUFBMkQsT0FBUSxDQUFDM0QsY0FBYyxDQUFBTyxLQUFNLEVBQUUsQ0FDM0M7Y0FBQXNCLElBQUEsRUFDUSxVQUFVO2NBQUErQixLQUFBLEVBQ1QsQ0FDTDtnQkFBQVgsUUFBQSxFQUNZbkUsZUFBZTtnQkFBQStFLFdBQUEsRUFDWixHQUFHdkIsZUFBYTtjQUMvQixDQUFDLENBQ0Y7Y0FBQTNCLFFBQUEsRUFDUyxPQUFPO2NBQUFtRCxXQUFBLEVBQ0o7WUFDZixDQUFDLENBQ0YsQ0FBQztZQUNGN0QsTUFBTSxDQUFDLENBQUM7WUFDUixNQUFBbUQsSUFBQTtVQUFLO1FBQUEsS0FFRixJQUFJO1VBQUE7WUFDRmxFLGFBQWEsQ0FBQztjQUFBZ0MsZUFBQSxFQUNBLGlCQUFpQjtjQUFBbUMsS0FBQSxFQUMzQixRQUFRO2NBQUF6QyxRQUFBLEVBQ0w7Z0JBQUFPLGFBQUEsRUFDTyxNQUFNO2dCQUFBbUMsVUFBQSxFQUNUdEQsY0FBYyxDQUFBdUQsZ0JBQWlCLENBQUFDLE9BQVEsQ0FBQUMsRUFBRztnQkFBQUMsUUFBQSxFQUM1QzFFLEdBQUcsQ0FBQTBFO2NBQ2Y7WUFDRixDQUFDLENBQUM7WUFDRjFELGNBQWMsQ0FBQUUsUUFBUyxDQUFDaUQsUUFBUSxDQUFDO1lBQ2pDakQsUUFBUSxDQUFDLENBQUM7WUFDVkQsTUFBTSxDQUFDLENBQUM7VUFBQTtNQUVaO0lBQUMsQ0FDRjtJQUFBSCxDQUFBLE9BQUFHLE1BQUE7SUFBQUgsQ0FBQSxPQUFBSSxRQUFBO0lBQUFKLENBQUEsT0FBQVUsS0FBQTtJQUFBVixDQUFBLE9BQUFFLGNBQUE7SUFBQUYsQ0FBQSxPQUFBNEMsR0FBQTtFQUFBO0lBQUFBLEdBQUEsR0FBQTVDLENBQUE7RUFBQTtFQTFGSCxNQUFBbUUsWUFBQSxHQUFxQnZCLEdBNEZwQjtFQUFBLElBQUFDLEdBQUE7RUFBQSxJQUFBN0MsQ0FBQSxTQUFBRyxNQUFBLElBQUFILENBQUEsU0FBQUksUUFBQSxJQUFBSixDQUFBLFNBQUFFLGNBQUE7SUFFZ0MyQyxHQUFBLEdBQUFBLENBQUE7TUFDMUJ6RCxhQUFhLENBQUM7UUFBQWdDLGVBQUEsRUFDQSxpQkFBaUI7UUFBQW1DLEtBQUEsRUFDM0IsUUFBUTtRQUFBekMsUUFBQSxFQUNMO1VBQUFPLGFBQUEsRUFDTyxNQUFNO1VBQUFtQyxVQUFBLEVBQ1R0RCxjQUFjLENBQUF1RCxnQkFBaUIsQ0FBQUMsT0FBUSxDQUFBQyxFQUFHO1VBQUFDLFFBQUEsRUFDNUMxRSxHQUFHLENBQUEwRTtRQUNmO01BQ0YsQ0FBQyxDQUFDO01BQ0YxRCxjQUFjLENBQUFFLFFBQVMsQ0FBQyxDQUFDO01BQ3pCQSxRQUFRLENBQUMsQ0FBQztNQUNWRCxNQUFNLENBQUMsQ0FBQztJQUFBLENBQ1Q7SUFBQUgsQ0FBQSxPQUFBRyxNQUFBO0lBQUFILENBQUEsT0FBQUksUUFBQTtJQUFBSixDQUFBLE9BQUFFLGNBQUE7SUFBQUYsQ0FBQSxPQUFBNkMsR0FBQTtFQUFBO0lBQUFBLEdBQUEsR0FBQTdDLENBQUE7RUFBQTtFQWJELE1BQUFvRSxZQUFBLEdBQXFCdkIsR0FhaUI7RUFHWCxNQUFBd0IsR0FBQSxpQkFBYzNELEtBQUssSUFBSTtFQUFBLElBQUE0RCxHQUFBO0VBQUEsSUFBQXRFLENBQUEsU0FBQWtCLE1BQUEsQ0FBQUMsR0FBQTtJQUM5Q21ELEdBQUEsSUFBQyxJQUFJLENBQUMsNERBQTRELEVBQWpFLElBQUksQ0FBb0U7SUFBQXRFLENBQUEsT0FBQXNFLEdBQUE7RUFBQTtJQUFBQSxHQUFBLEdBQUF0RSxDQUFBO0VBQUE7RUFFdkQsTUFBQXVFLEdBQUEsR0FBQTVELFVBQVUsRUFBQTZELFdBQWE7RUFBQSxJQUFBQyxHQUFBO0VBQUEsSUFBQXpFLENBQUEsU0FBQXVFLEdBQUE7SUFEekNFLEdBQUEsSUFBQyxHQUFHLENBQWUsYUFBUSxDQUFSLFFBQVEsQ0FBVyxRQUFDLENBQUQsR0FBQyxDQUFZLFFBQUMsQ0FBRCxHQUFDLENBQ2xELENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBUixLQUFPLENBQUMsQ0FBRSxDQUFBRixHQUFzQixDQUFFLEVBQXZDLElBQUksQ0FDUCxFQUZDLEdBQUcsQ0FFRTtJQUFBdkUsQ0FBQSxPQUFBdUUsR0FBQTtJQUFBdkUsQ0FBQSxPQUFBeUUsR0FBQTtFQUFBO0lBQUFBLEdBQUEsR0FBQXpFLENBQUE7RUFBQTtFQUFBLElBQUEwRSxHQUFBO0VBQUEsSUFBQTFFLENBQUEsU0FBQUUsY0FBQSxDQUFBVSxnQkFBQTtJQUdKOEQsR0FBQSxJQUFDLHlCQUF5QixDQUNOLGdCQUErQixDQUEvQixDQUFBeEUsY0FBYyxDQUFBVSxnQkFBZ0IsQ0FBQyxDQUN4QyxRQUFNLENBQU4sTUFBTSxHQUNmO0lBQUFaLENBQUEsT0FBQUUsY0FBQSxDQUFBVSxnQkFBQTtJQUFBWixDQUFBLE9BQUEwRSxHQUFBO0VBQUE7SUFBQUEsR0FBQSxHQUFBMUUsQ0FBQTtFQUFBO0VBQUEsSUFBQTJFLEdBQUE7RUFBQSxJQUFBM0UsQ0FBQSxTQUFBb0UsWUFBQSxJQUFBcEUsQ0FBQSxTQUFBbUUsWUFBQSxJQUFBbkUsQ0FBQSxTQUFBK0MsT0FBQSxJQUFBL0MsQ0FBQSxTQUFBb0Qsb0JBQUE7SUFDRnVCLEdBQUEsSUFBQyxnQkFBZ0IsQ0FDTjVCLE9BQU8sQ0FBUEEsUUFBTSxDQUFDLENBQ05vQixRQUFZLENBQVpBLGFBQVcsQ0FBQyxDQUNaQyxRQUFZLENBQVpBLGFBQVcsQ0FBQyxDQUNBaEIsb0JBQW9CLENBQXBCQSxxQkFBbUIsQ0FBQyxHQUMxQztJQUFBcEQsQ0FBQSxPQUFBb0UsWUFBQTtJQUFBcEUsQ0FBQSxPQUFBbUUsWUFBQTtJQUFBbkUsQ0FBQSxPQUFBK0MsT0FBQTtJQUFBL0MsQ0FBQSxPQUFBb0Qsb0JBQUE7SUFBQXBELENBQUEsT0FBQTJFLEdBQUE7RUFBQTtJQUFBQSxHQUFBLEdBQUEzRSxDQUFBO0VBQUE7RUFBQSxJQUFBNEUsR0FBQTtFQUFBLElBQUE1RSxDQUFBLFNBQUEwRSxHQUFBLElBQUExRSxDQUFBLFNBQUEyRSxHQUFBO0lBVkpDLEdBQUEsSUFBQyxHQUFHLENBQWUsYUFBUSxDQUFSLFFBQVEsQ0FDekIsQ0FBQUYsR0FHQyxDQUNELENBQUFDLEdBS0MsQ0FDSCxFQVhDLEdBQUcsQ0FXRTtJQUFBM0UsQ0FBQSxPQUFBMEUsR0FBQTtJQUFBMUUsQ0FBQSxPQUFBMkUsR0FBQTtJQUFBM0UsQ0FBQSxPQUFBNEUsR0FBQTtFQUFBO0lBQUFBLEdBQUEsR0FBQTVFLENBQUE7RUFBQTtFQUFBLElBQUE2RSxHQUFBO0VBQUEsSUFBQTdFLENBQUEsU0FBQXFFLEdBQUEsSUFBQXJFLENBQUEsU0FBQXlFLEdBQUEsSUFBQXpFLENBQUEsU0FBQTRFLEdBQUEsSUFBQTVFLENBQUEsU0FBQUssV0FBQTtJQWpCUndFLEdBQUEsSUFBQyxnQkFBZ0IsQ0FBUSxLQUF1QixDQUF2QixDQUFBUixHQUFzQixDQUFDLENBQWVoRSxXQUFXLENBQVhBLFlBQVUsQ0FBQyxDQUN4RSxDQUFBaUUsR0FBd0UsQ0FDeEUsQ0FBQUcsR0FFSyxDQUVMLENBQUFHLEdBV0ssQ0FDUCxFQWxCQyxnQkFBZ0IsQ0FrQkU7SUFBQTVFLENBQUEsT0FBQXFFLEdBQUE7SUFBQXJFLENBQUEsT0FBQXlFLEdBQUE7SUFBQXpFLENBQUEsT0FBQTRFLEdBQUE7SUFBQTVFLENBQUEsT0FBQUssV0FBQTtJQUFBTCxDQUFBLE9BQUE2RSxHQUFBO0VBQUE7SUFBQUEsR0FBQSxHQUFBN0UsQ0FBQTtFQUFBO0VBQUEsT0FsQm5CNkUsR0FrQm1CO0FBQUE7QUFwT2hCLFNBQUF0RSxNQUFBRSxLQUFBO0VBV0gsTUFBQXFFLE1BQUEsR0FBZTdGLFNBQVMsQ0FBQThGLFdBQVksQ0FBQUMsU0FBVSxDQUFDdkUsS0FBSyxDQUFDO0VBQ3JELElBQUksQ0FBQ3FFLE1BQU0sQ0FBQUcsT0FBUTtJQUNqQnRHLFFBQVEsQ0FDTixJQUFJdUcsS0FBSyxDQUFDLHFDQUFxQ0osTUFBTSxDQUFBSyxLQUFNLENBQUF6QixPQUFRLEVBQUUsQ0FDdkUsQ0FBQztJQUFBLE9BQ00sRUFBRTtFQUFBO0VBQ1YsT0FDTW9CLE1BQU0sQ0FBQU0sSUFBSyxDQUFBMUUsS0FBTTtBQUFBIiwiaWdub3JlTGlzdCI6W119
src/components/permissions/WorkerBadge.tsx ADDED
@@ -0,0 +1,49 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { c as _c } from "react/compiler-runtime";
2
+ import * as React from 'react';
3
+ import { BLACK_CIRCLE } from '../../constants/figures.js';
4
+ import { Box, Text } from '../../ink.js';
5
+ import { toInkColor } from '../../utils/ink.js';
6
+ export type WorkerBadgeProps = {
7
+ name: string;
8
+ color: string;
9
+ };
10
+
11
+ /**
12
+ * Renders a colored badge showing the worker's name for permission prompts.
13
+ * Used to indicate which swarm worker is requesting the permission.
14
+ */
15
+ export function WorkerBadge(t0) {
16
+ const $ = _c(7);
17
+ const {
18
+ name,
19
+ color
20
+ } = t0;
21
+ let t1;
22
+ if ($[0] !== color) {
23
+ t1 = toInkColor(color);
24
+ $[0] = color;
25
+ $[1] = t1;
26
+ } else {
27
+ t1 = $[1];
28
+ }
29
+ const inkColor = t1;
30
+ let t2;
31
+ if ($[2] !== name) {
32
+ t2 = <Text bold={true}>@{name}</Text>;
33
+ $[2] = name;
34
+ $[3] = t2;
35
+ } else {
36
+ t2 = $[3];
37
+ }
38
+ let t3;
39
+ if ($[4] !== inkColor || $[5] !== t2) {
40
+ t3 = <Box flexDirection="row" gap={1}><Text color={inkColor}>{BLACK_CIRCLE} {t2}</Text></Box>;
41
+ $[4] = inkColor;
42
+ $[5] = t2;
43
+ $[6] = t3;
44
+ } else {
45
+ t3 = $[6];
46
+ }
47
+ return t3;
48
+ }
49
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsIkJMQUNLX0NJUkNMRSIsIkJveCIsIlRleHQiLCJ0b0lua0NvbG9yIiwiV29ya2VyQmFkZ2VQcm9wcyIsIm5hbWUiLCJjb2xvciIsIldvcmtlckJhZGdlIiwidDAiLCIkIiwiX2MiLCJ0MSIsImlua0NvbG9yIiwidDIiLCJ0MyJdLCJzb3VyY2VzIjpbIldvcmtlckJhZGdlLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7IEJMQUNLX0NJUkNMRSB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy9maWd1cmVzLmpzJ1xuaW1wb3J0IHsgQm94LCBUZXh0IH0gZnJvbSAnLi4vLi4vaW5rLmpzJ1xuaW1wb3J0IHsgdG9JbmtDb2xvciB9IGZyb20gJy4uLy4uL3V0aWxzL2luay5qcydcblxuZXhwb3J0IHR5cGUgV29ya2VyQmFkZ2VQcm9wcyA9IHtcbiAgbmFtZTogc3RyaW5nXG4gIGNvbG9yOiBzdHJpbmdcbn1cblxuLyoqXG4gKiBSZW5kZXJzIGEgY29sb3JlZCBiYWRnZSBzaG93aW5nIHRoZSB3b3JrZXIncyBuYW1lIGZvciBwZXJtaXNzaW9uIHByb21wdHMuXG4gKiBVc2VkIHRvIGluZGljYXRlIHdoaWNoIHN3YXJtIHdvcmtlciBpcyByZXF1ZXN0aW5nIHRoZSBwZXJtaXNzaW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gV29ya2VyQmFkZ2Uoe1xuICBuYW1lLFxuICBjb2xvcixcbn06IFdvcmtlckJhZGdlUHJvcHMpOiBSZWFjdC5SZWFjdE5vZGUge1xuICBjb25zdCBpbmtDb2xvciA9IHRvSW5rQ29sb3IoY29sb3IpXG4gIHJldHVybiAoXG4gICAgPEJveCBmbGV4RGlyZWN0aW9uPVwicm93XCIgZ2FwPXsxfT5cbiAgICAgIDxUZXh0IGNvbG9yPXtpbmtDb2xvcn0+XG4gICAgICAgIHtCTEFDS19DSVJDTEV9IDxUZXh0IGJvbGQ+QHtuYW1lfTwvVGV4dD5cbiAgICAgIDwvVGV4dD5cbiAgICA8L0JveD5cbiAgKVxufVxuIl0sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxLQUFLQSxLQUFLLE1BQU0sT0FBTztBQUM5QixTQUFTQyxZQUFZLFFBQVEsNEJBQTRCO0FBQ3pELFNBQVNDLEdBQUcsRUFBRUMsSUFBSSxRQUFRLGNBQWM7QUFDeEMsU0FBU0MsVUFBVSxRQUFRLG9CQUFvQjtBQUUvQyxPQUFPLEtBQUtDLGdCQUFnQixHQUFHO0VBQzdCQyxJQUFJLEVBQUUsTUFBTTtFQUNaQyxLQUFLLEVBQUUsTUFBTTtBQUNmLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPLFNBQUFDLFlBQUFDLEVBQUE7RUFBQSxNQUFBQyxDQUFBLEdBQUFDLEVBQUE7RUFBcUI7SUFBQUwsSUFBQTtJQUFBQztFQUFBLElBQUFFLEVBR1Q7RUFBQSxJQUFBRyxFQUFBO0VBQUEsSUFBQUYsQ0FBQSxRQUFBSCxLQUFBO0lBQ0FLLEVBQUEsR0FBQVIsVUFBVSxDQUFDRyxLQUFLLENBQUM7SUFBQUcsQ0FBQSxNQUFBSCxLQUFBO0lBQUFHLENBQUEsTUFBQUUsRUFBQTtFQUFBO0lBQUFBLEVBQUEsR0FBQUYsQ0FBQTtFQUFBO0VBQWxDLE1BQUFHLFFBQUEsR0FBaUJELEVBQWlCO0VBQUEsSUFBQUUsRUFBQTtFQUFBLElBQUFKLENBQUEsUUFBQUosSUFBQTtJQUliUSxFQUFBLElBQUMsSUFBSSxDQUFDLElBQUksQ0FBSixLQUFHLENBQUMsQ0FBQyxDQUFFUixLQUFHLENBQUUsRUFBakIsSUFBSSxDQUFvQjtJQUFBSSxDQUFBLE1BQUFKLElBQUE7SUFBQUksQ0FBQSxNQUFBSSxFQUFBO0VBQUE7SUFBQUEsRUFBQSxHQUFBSixDQUFBO0VBQUE7RUFBQSxJQUFBSyxFQUFBO0VBQUEsSUFBQUwsQ0FBQSxRQUFBRyxRQUFBLElBQUFILENBQUEsUUFBQUksRUFBQTtJQUY1Q0MsRUFBQSxJQUFDLEdBQUcsQ0FBZSxhQUFLLENBQUwsS0FBSyxDQUFNLEdBQUMsQ0FBRCxHQUFDLENBQzdCLENBQUMsSUFBSSxDQUFRRixLQUFRLENBQVJBLFNBQU8sQ0FBQyxDQUNsQlosYUFBVyxDQUFFLENBQUMsQ0FBQWEsRUFBd0IsQ0FDekMsRUFGQyxJQUFJLENBR1AsRUFKQyxHQUFHLENBSUU7SUFBQUosQ0FBQSxNQUFBRyxRQUFBO0lBQUFILENBQUEsTUFBQUksRUFBQTtJQUFBSixDQUFBLE1BQUFLLEVBQUE7RUFBQTtJQUFBQSxFQUFBLEdBQUFMLENBQUE7RUFBQTtFQUFBLE9BSk5LLEVBSU07QUFBQSIsImlnbm9yZUxpc3QiOltdfQ==
src/components/permissions/rules/PermissionRuleInput.tsx ADDED
@@ -0,0 +1,138 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { c as _c } from "react/compiler-runtime";
2
+ import figures from 'figures';
3
+ import * as React from 'react';
4
+ import { useState } from 'react';
5
+ import TextInput from '../../../components/TextInput.js';
6
+ import { useExitOnCtrlCDWithKeybindings } from '../../../hooks/useExitOnCtrlCDWithKeybindings.js';
7
+ import { useTerminalSize } from '../../../hooks/useTerminalSize.js';
8
+ import { Box, Newline, Text } from '../../../ink.js';
9
+ import { useKeybinding } from '../../../keybindings/useKeybinding.js';
10
+ import { BashTool } from '../../../tools/BashTool/BashTool.js';
11
+ import { WebFetchTool } from '../../../tools/WebFetchTool/WebFetchTool.js';
12
+ import type { PermissionBehavior, PermissionRuleValue } from '../../../utils/permissions/PermissionRule.js';
13
+ import { permissionRuleValueFromString, permissionRuleValueToString } from '../../../utils/permissions/permissionRuleParser.js';
14
+ export type PermissionRuleInputProps = {
15
+ onCancel: () => void;
16
+ onSubmit: (ruleValue: PermissionRuleValue, ruleBehavior: PermissionBehavior) => void;
17
+ ruleBehavior: PermissionBehavior;
18
+ };
19
+ export function PermissionRuleInput(t0) {
20
+ const $ = _c(24);
21
+ const {
22
+ onCancel,
23
+ onSubmit,
24
+ ruleBehavior
25
+ } = t0;
26
+ const [inputValue, setInputValue] = useState("");
27
+ const [cursorOffset, setCursorOffset] = useState(0);
28
+ const exitState = useExitOnCtrlCDWithKeybindings();
29
+ let t1;
30
+ if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
31
+ t1 = {
32
+ context: "Settings"
33
+ };
34
+ $[0] = t1;
35
+ } else {
36
+ t1 = $[0];
37
+ }
38
+ useKeybinding("confirm:no", onCancel, t1);
39
+ const {
40
+ columns
41
+ } = useTerminalSize();
42
+ const textInputColumns = columns - 6;
43
+ let t2;
44
+ if ($[1] !== onSubmit || $[2] !== ruleBehavior) {
45
+ t2 = value => {
46
+ const trimmedValue = value.trim();
47
+ if (trimmedValue.length === 0) {
48
+ return;
49
+ }
50
+ const ruleValue = permissionRuleValueFromString(trimmedValue);
51
+ onSubmit(ruleValue, ruleBehavior);
52
+ };
53
+ $[1] = onSubmit;
54
+ $[2] = ruleBehavior;
55
+ $[3] = t2;
56
+ } else {
57
+ t2 = $[3];
58
+ }
59
+ const handleSubmit = t2;
60
+ let t3;
61
+ if ($[4] !== ruleBehavior) {
62
+ t3 = <Text bold={true} color="permission">Add {ruleBehavior} permission rule</Text>;
63
+ $[4] = ruleBehavior;
64
+ $[5] = t3;
65
+ } else {
66
+ t3 = $[5];
67
+ }
68
+ let t4;
69
+ if ($[6] === Symbol.for("react.memo_cache_sentinel")) {
70
+ t4 = <Newline />;
71
+ $[6] = t4;
72
+ } else {
73
+ t4 = $[6];
74
+ }
75
+ let t5;
76
+ let t6;
77
+ if ($[7] === Symbol.for("react.memo_cache_sentinel")) {
78
+ t5 = <Text bold={true}>{permissionRuleValueToString({
79
+ toolName: WebFetchTool.name
80
+ })}</Text>;
81
+ t6 = <Text bold={false}> or </Text>;
82
+ $[7] = t5;
83
+ $[8] = t6;
84
+ } else {
85
+ t5 = $[7];
86
+ t6 = $[8];
87
+ }
88
+ let t7;
89
+ if ($[9] === Symbol.for("react.memo_cache_sentinel")) {
90
+ t7 = <Text>Permission rules are a tool name, optionally followed by a specifier in parentheses.{t4}e.g.,{" "}{t5}{t6}<Text bold={true}>{permissionRuleValueToString({
91
+ toolName: BashTool.name,
92
+ ruleContent: "ls:*"
93
+ })}</Text></Text>;
94
+ $[9] = t7;
95
+ } else {
96
+ t7 = $[9];
97
+ }
98
+ let t8;
99
+ if ($[10] !== cursorOffset || $[11] !== handleSubmit || $[12] !== inputValue || $[13] !== textInputColumns) {
100
+ t8 = <Box flexDirection="column">{t7}<Box borderDimColor={true} borderStyle="round" marginY={1} paddingLeft={1}><TextInput showCursor={true} value={inputValue} onChange={setInputValue} onSubmit={handleSubmit} placeholder={`Enter permission rule${figures.ellipsis}`} columns={textInputColumns} cursorOffset={cursorOffset} onChangeCursorOffset={setCursorOffset} /></Box></Box>;
101
+ $[10] = cursorOffset;
102
+ $[11] = handleSubmit;
103
+ $[12] = inputValue;
104
+ $[13] = textInputColumns;
105
+ $[14] = t8;
106
+ } else {
107
+ t8 = $[14];
108
+ }
109
+ let t9;
110
+ if ($[15] !== t3 || $[16] !== t8) {
111
+ t9 = <Box flexDirection="column" gap={1} borderStyle="round" paddingLeft={1} paddingRight={1} borderColor="permission">{t3}{t8}</Box>;
112
+ $[15] = t3;
113
+ $[16] = t8;
114
+ $[17] = t9;
115
+ } else {
116
+ t9 = $[17];
117
+ }
118
+ let t10;
119
+ if ($[18] !== exitState.keyName || $[19] !== exitState.pending) {
120
+ t10 = <Box marginLeft={3}>{exitState.pending ? <Text dimColor={true}>Press {exitState.keyName} again to exit</Text> : <Text dimColor={true}>Enter to submit · Esc to cancel</Text>}</Box>;
121
+ $[18] = exitState.keyName;
122
+ $[19] = exitState.pending;
123
+ $[20] = t10;
124
+ } else {
125
+ t10 = $[20];
126
+ }
127
+ let t11;
128
+ if ($[21] !== t10 || $[22] !== t9) {
129
+ t11 = <>{t9}{t10}</>;
130
+ $[21] = t10;
131
+ $[22] = t9;
132
+ $[23] = t11;
133
+ } else {
134
+ t11 = $[23];
135
+ }
136
+ return t11;
137
+ }
138
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJmaWd1cmVzIiwiUmVhY3QiLCJ1c2VTdGF0ZSIsIlRleHRJbnB1dCIsInVzZUV4aXRPbkN0cmxDRFdpdGhLZXliaW5kaW5ncyIsInVzZVRlcm1pbmFsU2l6ZSIsIkJveCIsIk5ld2xpbmUiLCJUZXh0IiwidXNlS2V5YmluZGluZyIsIkJhc2hUb29sIiwiV2ViRmV0Y2hUb29sIiwiUGVybWlzc2lvbkJlaGF2aW9yIiwiUGVybWlzc2lvblJ1bGVWYWx1ZSIsInBlcm1pc3Npb25SdWxlVmFsdWVGcm9tU3RyaW5nIiwicGVybWlzc2lvblJ1bGVWYWx1ZVRvU3RyaW5nIiwiUGVybWlzc2lvblJ1bGVJbnB1dFByb3BzIiwib25DYW5jZWwiLCJvblN1Ym1pdCIsInJ1bGVWYWx1ZSIsInJ1bGVCZWhhdmlvciIsIlBlcm1pc3Npb25SdWxlSW5wdXQiLCJ0MCIsIiQiLCJfYyIsImlucHV0VmFsdWUiLCJzZXRJbnB1dFZhbHVlIiwiY3Vyc29yT2Zmc2V0Iiwic2V0Q3Vyc29yT2Zmc2V0IiwiZXhpdFN0YXRlIiwidDEiLCJTeW1ib2wiLCJmb3IiLCJjb250ZXh0IiwiY29sdW1ucyIsInRleHRJbnB1dENvbHVtbnMiLCJ0MiIsInZhbHVlIiwidHJpbW1lZFZhbHVlIiwidHJpbSIsImxlbmd0aCIsImhhbmRsZVN1Ym1pdCIsInQzIiwidDQiLCJ0NSIsInQ2IiwidG9vbE5hbWUiLCJuYW1lIiwidDciLCJydWxlQ29udGVudCIsInQ4IiwiZWxsaXBzaXMiLCJ0OSIsInQxMCIsImtleU5hbWUiLCJwZW5kaW5nIiwidDExIl0sInNvdXJjZXMiOlsiUGVybWlzc2lvblJ1bGVJbnB1dC50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGZpZ3VyZXMgZnJvbSAnZmlndXJlcydcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCdcbmltcG9ydCBUZXh0SW5wdXQgZnJvbSAnLi4vLi4vLi4vY29tcG9uZW50cy9UZXh0SW5wdXQuanMnXG5pbXBvcnQgeyB1c2VFeGl0T25DdHJsQ0RXaXRoS2V5YmluZGluZ3MgfSBmcm9tICcuLi8uLi8uLi9ob29rcy91c2VFeGl0T25DdHJsQ0RXaXRoS2V5YmluZGluZ3MuanMnXG5pbXBvcnQgeyB1c2VUZXJtaW5hbFNpemUgfSBmcm9tICcuLi8uLi8uLi9ob29rcy91c2VUZXJtaW5hbFNpemUuanMnXG5pbXBvcnQgeyBCb3gsIE5ld2xpbmUsIFRleHQgfSBmcm9tICcuLi8uLi8uLi9pbmsuanMnXG5pbXBvcnQgeyB1c2VLZXliaW5kaW5nIH0gZnJvbSAnLi4vLi4vLi4va2V5YmluZGluZ3MvdXNlS2V5YmluZGluZy5qcydcbmltcG9ydCB7IEJhc2hUb29sIH0gZnJvbSAnLi4vLi4vLi4vdG9vbHMvQmFzaFRvb2wvQmFzaFRvb2wuanMnXG5pbXBvcnQgeyBXZWJGZXRjaFRvb2wgfSBmcm9tICcuLi8uLi8uLi90b29scy9XZWJGZXRjaFRvb2wvV2ViRmV0Y2hUb29sLmpzJ1xuaW1wb3J0IHR5cGUge1xuICBQZXJtaXNzaW9uQmVoYXZpb3IsXG4gIFBlcm1pc3Npb25SdWxlVmFsdWUsXG59IGZyb20gJy4uLy4uLy4uL3V0aWxzL3Blcm1pc3Npb25zL1Blcm1pc3Npb25SdWxlLmpzJ1xuaW1wb3J0IHtcbiAgcGVybWlzc2lvblJ1bGVWYWx1ZUZyb21TdHJpbmcsXG4gIHBlcm1pc3Npb25SdWxlVmFsdWVUb1N0cmluZyxcbn0gZnJvbSAnLi4vLi4vLi4vdXRpbHMvcGVybWlzc2lvbnMvcGVybWlzc2lvblJ1bGVQYXJzZXIuanMnXG5cbmV4cG9ydCB0eXBlIFBlcm1pc3Npb25SdWxlSW5wdXRQcm9wcyA9IHtcbiAgb25DYW5jZWw6ICgpID0+IHZvaWRcbiAgb25TdWJtaXQ6IChcbiAgICBydWxlVmFsdWU6IFBlcm1pc3Npb25SdWxlVmFsdWUsXG4gICAgcnVsZUJlaGF2aW9yOiBQZXJtaXNzaW9uQmVoYXZpb3IsXG4gICkgPT4gdm9pZFxuICBydWxlQmVoYXZpb3I6IFBlcm1pc3Npb25CZWhhdmlvclxufVxuXG5leHBvcnQgZnVuY3Rpb24gUGVybWlzc2lvblJ1bGVJbnB1dCh7XG4gIG9uQ2FuY2VsLFxuICBvblN1Ym1pdCxcbiAgcnVsZUJlaGF2aW9yLFxufTogUGVybWlzc2lvblJ1bGVJbnB1dFByb3BzKTogUmVhY3QuUmVhY3ROb2RlIHtcbiAgY29uc3QgW2lucHV0VmFsdWUsIHNldElucHV0VmFsdWVdID0gdXNlU3RhdGUoJycpXG4gIGNvbnN0IFtjdXJzb3JPZmZzZXQsIHNldEN1cnNvck9mZnNldF0gPSB1c2VTdGF0ZSgwKVxuICBjb25zdCBleGl0U3RhdGUgPSB1c2VFeGl0T25DdHJsQ0RXaXRoS2V5YmluZGluZ3MoKVxuXG4gIC8vIFVzZSBjb25maWd1cmFibGUga2V5YmluZGluZyBmb3IgRVNDIHRvIGNhbmNlbFxuICAvLyBVc2UgU2V0dGluZ3MgY29udGV4dCBzbyAnbicga2V5IGRvZXNuJ3QgY2FuY2VsIChhbGxvd3MgdHlwaW5nICduJyBpbiBpbnB1dClcbiAgdXNlS2V5YmluZGluZygnY29uZmlybTpubycsIG9uQ2FuY2VsLCB7IGNvbnRleHQ6ICdTZXR0aW5ncycgfSlcblxuICBjb25zdCB7IGNvbHVtbnMgfSA9IHVzZVRlcm1pbmFsU2l6ZSgpXG4gIGNvbnN0IHRleHRJbnB1dENvbHVtbnMgPSBjb2x1bW5zIC0gNlxuXG4gIGNvbnN0IGhhbmRsZVN1Ym1pdCA9ICh2YWx1ZTogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgdHJpbW1lZFZhbHVlID0gdmFsdWUudHJpbSgpXG4gICAgaWYgKHRyaW1tZWRWYWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBjb25zdCBydWxlVmFsdWUgPSBwZXJtaXNzaW9uUnVsZVZhbHVlRnJvbVN0cmluZyh0cmltbWVkVmFsdWUpXG4gICAgb25TdWJtaXQocnVsZVZhbHVlLCBydWxlQmVoYXZpb3IpXG4gIH1cblxuICByZXR1cm4gKFxuICAgIDw+XG4gICAgICA8Qm94XG4gICAgICAgIGZsZXhEaXJlY3Rpb249XCJjb2x1bW5cIlxuICAgICAgICBnYXA9ezF9XG4gICAgICAgIGJvcmRlclN0eWxlPVwicm91bmRcIlxuICAgICAgICBwYWRkaW5nTGVmdD17MX1cbiAgICAgICAgcGFkZGluZ1JpZ2h0PXsxfVxuICAgICAgICBib3JkZXJDb2xvcj1cInBlcm1pc3Npb25cIlxuICAgICAgPlxuICAgICAgICA8VGV4dCBib2xkIGNvbG9yPVwicGVybWlzc2lvblwiPlxuICAgICAgICAgIEFkZCB7cnVsZUJlaGF2aW9yfSBwZXJtaXNzaW9uIHJ1bGVcbiAgICAgICAgPC9UZXh0PlxuICAgICAgICA8Qm94IGZsZXhEaXJlY3Rpb249XCJjb2x1bW5cIj5cbiAgICAgICAgICA8VGV4dD5cbiAgICAgICAgICAgIFBlcm1pc3Npb24gcnVsZXMgYXJlIGEgdG9vbCBuYW1lLCBvcHRpb25hbGx5IGZvbGxvd2VkIGJ5IGEgc3BlY2lmaWVyXG4gICAgICAgICAgICBpbiBwYXJlbnRoZXNlcy5cbiAgICAgICAgICAgIDxOZXdsaW5lIC8+XG4gICAgICAgICAgICBlLmcuLHsnICd9XG4gICAgICAgICAgICA8VGV4dCBib2xkPlxuICAgICAgICAgICAgICB7cGVybWlzc2lvblJ1bGVWYWx1ZVRvU3RyaW5nKHsgdG9vbE5hbWU6IFdlYkZldGNoVG9vbC5uYW1lIH0pfVxuICAgICAgICAgICAgPC9UZXh0PlxuICAgICAgICAgICAgPFRleHQgYm9sZD17ZmFsc2V9PiBvciA8L1RleHQ+XG4gICAgICAgICAgICA8VGV4dCBib2xkPlxuICAgICAgICAgICAgICB7cGVybWlzc2lvblJ1bGVWYWx1ZVRvU3RyaW5nKHtcbiAgICAgICAgICAgICAgICB0b29sTmFtZTogQmFzaFRvb2wubmFtZSxcbiAgICAgICAgICAgICAgICBydWxlQ29udGVudDogJ2xzOionLFxuICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgICA8L1RleHQ+XG4gICAgICAgICAgPEJveCBib3JkZXJEaW1Db2xvciBib3JkZXJTdHlsZT1cInJvdW5kXCIgbWFyZ2luWT17MX0gcGFkZGluZ0xlZnQ9ezF9PlxuICAgICAgICAgICAgPFRleHRJbnB1dFxuICAgICAgICAgICAgICBzaG93Q3Vyc29yXG4gICAgICAgICAgICAgIHZhbHVlPXtpbnB1dFZhbHVlfVxuICAgICAgICAgICAgICBvbkNoYW5nZT17c2V0SW5wdXRWYWx1ZX1cbiAgICAgICAgICAgICAgb25TdWJtaXQ9e2hhbmRsZVN1Ym1pdH1cbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9e2BFbnRlciBwZXJtaXNzaW9uIHJ1bGUke2ZpZ3VyZXMuZWxsaXBzaXN9YH1cbiAgICAgICAgICAgICAgY29sdW1ucz17dGV4dElucHV0Q29sdW1uc31cbiAgICAgICAgICAgICAgY3Vyc29yT2Zmc2V0PXtjdXJzb3JPZmZzZXR9XG4gICAgICAgICAgICAgIG9uQ2hhbmdlQ3Vyc29yT2Zmc2V0PXtzZXRDdXJzb3JPZmZzZXR9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvQm94PlxuICAgICAgICA8L0JveD5cbiAgICAgIDwvQm94PlxuICAgICAgPEJveCBtYXJnaW5MZWZ0PXszfT5cbiAgICAgICAge2V4aXRTdGF0ZS5wZW5kaW5nID8gKFxuICAgICAgICAgIDxUZXh0IGRpbUNvbG9yPlByZXNzIHtleGl0U3RhdGUua2V5TmFtZX0gYWdhaW4gdG8gZXhpdDwvVGV4dD5cbiAgICAgICAgKSA6IChcbiAgICAgICAgICA8VGV4dCBkaW1Db2xvcj5FbnRlciB0byBzdWJtaXQgwrcgRXNjIHRvIGNhbmNlbDwvVGV4dD5cbiAgICAgICAgKX1cbiAgICAgIDwvQm94PlxuICAgIDwvPlxuICApXG59XG4iXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPQSxPQUFPLE1BQU0sU0FBUztBQUM3QixPQUFPLEtBQUtDLEtBQUssTUFBTSxPQUFPO0FBQzlCLFNBQVNDLFFBQVEsUUFBUSxPQUFPO0FBQ2hDLE9BQU9DLFNBQVMsTUFBTSxrQ0FBa0M7QUFDeEQsU0FBU0MsOEJBQThCLFFBQVEsa0RBQWtEO0FBQ2pH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
src/components/permissions/rules/PermissionRuleList.tsx ADDED
The diff for this file is too large to render. See raw diff
 
src/components/permissions/rules/RecentDenialsTab.tsx ADDED
@@ -0,0 +1,207 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { c as _c } from "react/compiler-runtime";
2
+ import * as React from 'react';
3
+ import { useCallback, useEffect, useState } from 'react';
4
+ // eslint-disable-next-line custom-rules/prefer-use-keybindings -- 'r' is a view-specific key, not a global keybinding
5
+ import { Box, Text, useInput } from '../../../ink.js';
6
+ import { type AutoModeDenial, getAutoModeDenials } from '../../../utils/autoModeDenials.js';
7
+ import { Select } from '../../CustomSelect/select.js';
8
+ import { StatusIcon } from '../../design-system/StatusIcon.js';
9
+ import { useTabHeaderFocus } from '../../design-system/Tabs.js';
10
+ type Props = {
11
+ onHeaderFocusChange?: (focused: boolean) => void;
12
+ /** Called when approved/retry state changes so parent can act on exit */
13
+ onStateChange: (state: {
14
+ approved: Set<number>;
15
+ retry: Set<number>;
16
+ denials: readonly AutoModeDenial[];
17
+ }) => void;
18
+ };
19
+ export function RecentDenialsTab(t0) {
20
+ const $ = _c(30);
21
+ const {
22
+ onHeaderFocusChange,
23
+ onStateChange
24
+ } = t0;
25
+ const {
26
+ headerFocused,
27
+ focusHeader
28
+ } = useTabHeaderFocus();
29
+ let t1;
30
+ let t2;
31
+ if ($[0] !== headerFocused || $[1] !== onHeaderFocusChange) {
32
+ t1 = () => {
33
+ onHeaderFocusChange?.(headerFocused);
34
+ };
35
+ t2 = [headerFocused, onHeaderFocusChange];
36
+ $[0] = headerFocused;
37
+ $[1] = onHeaderFocusChange;
38
+ $[2] = t1;
39
+ $[3] = t2;
40
+ } else {
41
+ t1 = $[2];
42
+ t2 = $[3];
43
+ }
44
+ useEffect(t1, t2);
45
+ const [denials] = useState(_temp);
46
+ const [approved, setApproved] = useState(_temp2);
47
+ const [retry, setRetry] = useState(_temp3);
48
+ const [focusedIdx, setFocusedIdx] = useState(0);
49
+ let t3;
50
+ let t4;
51
+ if ($[4] !== approved || $[5] !== denials || $[6] !== onStateChange || $[7] !== retry) {
52
+ t3 = () => {
53
+ onStateChange({
54
+ approved,
55
+ retry,
56
+ denials
57
+ });
58
+ };
59
+ t4 = [approved, retry, denials, onStateChange];
60
+ $[4] = approved;
61
+ $[5] = denials;
62
+ $[6] = onStateChange;
63
+ $[7] = retry;
64
+ $[8] = t3;
65
+ $[9] = t4;
66
+ } else {
67
+ t3 = $[8];
68
+ t4 = $[9];
69
+ }
70
+ useEffect(t3, t4);
71
+ let t5;
72
+ if ($[10] === Symbol.for("react.memo_cache_sentinel")) {
73
+ t5 = value => {
74
+ const idx = Number(value);
75
+ setApproved(prev => {
76
+ const next = new Set(prev);
77
+ if (next.has(idx)) {
78
+ next.delete(idx);
79
+ } else {
80
+ next.add(idx);
81
+ }
82
+ return next;
83
+ });
84
+ };
85
+ $[10] = t5;
86
+ } else {
87
+ t5 = $[10];
88
+ }
89
+ const handleSelect = t5;
90
+ let t6;
91
+ if ($[11] === Symbol.for("react.memo_cache_sentinel")) {
92
+ t6 = value_0 => {
93
+ setFocusedIdx(Number(value_0));
94
+ };
95
+ $[11] = t6;
96
+ } else {
97
+ t6 = $[11];
98
+ }
99
+ const handleFocus = t6;
100
+ let t7;
101
+ if ($[12] !== focusedIdx) {
102
+ t7 = (input, _key) => {
103
+ if (input === "r") {
104
+ setRetry(prev_0 => {
105
+ const next_0 = new Set(prev_0);
106
+ if (next_0.has(focusedIdx)) {
107
+ next_0.delete(focusedIdx);
108
+ } else {
109
+ next_0.add(focusedIdx);
110
+ }
111
+ return next_0;
112
+ });
113
+ setApproved(prev_1 => {
114
+ if (prev_1.has(focusedIdx)) {
115
+ return prev_1;
116
+ }
117
+ const next_1 = new Set(prev_1);
118
+ next_1.add(focusedIdx);
119
+ return next_1;
120
+ });
121
+ }
122
+ };
123
+ $[12] = focusedIdx;
124
+ $[13] = t7;
125
+ } else {
126
+ t7 = $[13];
127
+ }
128
+ const t8 = denials.length > 0;
129
+ let t9;
130
+ if ($[14] !== t8) {
131
+ t9 = {
132
+ isActive: t8
133
+ };
134
+ $[14] = t8;
135
+ $[15] = t9;
136
+ } else {
137
+ t9 = $[15];
138
+ }
139
+ useInput(t7, t9);
140
+ if (denials.length === 0) {
141
+ let t10;
142
+ if ($[16] === Symbol.for("react.memo_cache_sentinel")) {
143
+ t10 = <Text dimColor={true}>No recent denials. Commands denied by the auto mode classifier will appear here.</Text>;
144
+ $[16] = t10;
145
+ } else {
146
+ t10 = $[16];
147
+ }
148
+ return t10;
149
+ }
150
+ let t10;
151
+ if ($[17] !== approved || $[18] !== denials || $[19] !== retry) {
152
+ let t11;
153
+ if ($[21] !== approved || $[22] !== retry) {
154
+ t11 = (d, idx_0) => {
155
+ const isApproved = approved.has(idx_0);
156
+ const suffix = retry.has(idx_0) ? " (retry)" : "";
157
+ return {
158
+ label: <Text><StatusIcon status={isApproved ? "success" : "error"} withSpace={true} />{d.display}<Text dimColor={true}>{suffix}</Text></Text>,
159
+ value: String(idx_0)
160
+ };
161
+ };
162
+ $[21] = approved;
163
+ $[22] = retry;
164
+ $[23] = t11;
165
+ } else {
166
+ t11 = $[23];
167
+ }
168
+ t10 = denials.map(t11);
169
+ $[17] = approved;
170
+ $[18] = denials;
171
+ $[19] = retry;
172
+ $[20] = t10;
173
+ } else {
174
+ t10 = $[20];
175
+ }
176
+ const options = t10;
177
+ let t11;
178
+ if ($[24] === Symbol.for("react.memo_cache_sentinel")) {
179
+ t11 = <Text>Commands recently denied by the auto mode classifier.</Text>;
180
+ $[24] = t11;
181
+ } else {
182
+ t11 = $[24];
183
+ }
184
+ const t12 = Math.min(10, options.length);
185
+ let t13;
186
+ if ($[25] !== focusHeader || $[26] !== headerFocused || $[27] !== options || $[28] !== t12) {
187
+ t13 = <Box flexDirection="column">{t11}<Box marginTop={1}><Select options={options} onChange={handleSelect} onFocus={handleFocus} visibleOptionCount={t12} isDisabled={headerFocused} onUpFromFirstItem={focusHeader} /></Box></Box>;
188
+ $[25] = focusHeader;
189
+ $[26] = headerFocused;
190
+ $[27] = options;
191
+ $[28] = t12;
192
+ $[29] = t13;
193
+ } else {
194
+ t13 = $[29];
195
+ }
196
+ return t13;
197
+ }
198
+ function _temp3() {
199
+ return new Set();
200
+ }
201
+ function _temp2() {
202
+ return new Set();
203
+ }
204
+ function _temp() {
205
+ return getAutoModeDenials();
206
+ }
207
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsInVzZUNhbGxiYWNrIiwidXNlRWZmZWN0IiwidXNlU3RhdGUiLCJCb3giLCJUZXh0IiwidXNlSW5wdXQiLCJBdXRvTW9kZURlbmlhbCIsImdldEF1dG9Nb2RlRGVuaWFscyIsIlNlbGVjdCIsIlN0YXR1c0ljb24iLCJ1c2VUYWJIZWFkZXJGb2N1cyIsIlByb3BzIiwib25IZWFkZXJGb2N1c0NoYW5nZSIsImZvY3VzZWQiLCJvblN0YXRlQ2hhbmdlIiwic3RhdGUiLCJhcHByb3ZlZCIsIlNldCIsInJldHJ5IiwiZGVuaWFscyIsIlJlY2VudERlbmlhbHNUYWIiLCJ0MCIsIiQiLCJfYyIsImhlYWRlckZvY3VzZWQiLCJmb2N1c0hlYWRlciIsInQxIiwidDIiLCJfdGVtcCIsInNldEFwcHJvdmVkIiwiX3RlbXAyIiwic2V0UmV0cnkiLCJfdGVtcDMiLCJmb2N1c2VkSWR4Iiwic2V0Rm9jdXNlZElkeCIsInQzIiwidDQiLCJ0NSIsIlN5bWJvbCIsImZvciIsInZhbHVlIiwiaWR4IiwiTnVtYmVyIiwicHJldiIsIm5leHQiLCJoYXMiLCJkZWxldGUiLCJhZGQiLCJoYW5kbGVTZWxlY3QiLCJ0NiIsInZhbHVlXzAiLCJoYW5kbGVGb2N1cyIsInQ3IiwiaW5wdXQiLCJfa2V5IiwicHJldl8wIiwibmV4dF8wIiwicHJldl8xIiwibmV4dF8xIiwidDgiLCJsZW5ndGgiLCJ0OSIsImlzQWN0aXZlIiwidDEwIiwidDExIiwiZCIsImlkeF8wIiwiaXNBcHByb3ZlZCIsInN1ZmZpeCIsImxhYmVsIiwiZGlzcGxheSIsIlN0cmluZyIsIm1hcCIsIm9wdGlvbnMiLCJ0MTIiLCJNYXRoIiwibWluIiwidDEzIl0sInNvdXJjZXMiOlsiUmVjZW50RGVuaWFsc1RhYi50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgeyB1c2VDYWxsYmFjaywgdXNlRWZmZWN0LCB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0J1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGN1c3RvbS1ydWxlcy9wcmVmZXItdXNlLWtleWJpbmRpbmdzIC0tICdyJyBpcyBhIHZpZXctc3BlY2lmaWMga2V5LCBub3QgYSBnbG9iYWwga2V5YmluZGluZ1xuaW1wb3J0IHsgQm94LCBUZXh0LCB1c2VJbnB1dCB9IGZyb20gJy4uLy4uLy4uL2luay5qcydcbmltcG9ydCB7XG4gIHR5cGUgQXV0b01vZGVEZW5pYWwsXG4gIGdldEF1dG9Nb2RlRGVuaWFscyxcbn0gZnJvbSAnLi4vLi4vLi4vdXRpbHMvYXV0b01vZGVEZW5pYWxzLmpzJ1xuaW1wb3J0IHsgU2VsZWN0IH0gZnJvbSAnLi4vLi4vQ3VzdG9tU2VsZWN0L3NlbGVjdC5qcydcbmltcG9ydCB7IFN0YXR1c0ljb24gfSBmcm9tICcuLi8uLi9kZXNpZ24tc3lzdGVtL1N0YXR1c0ljb24uanMnXG5pbXBvcnQgeyB1c2VUYWJIZWFkZXJGb2N1cyB9IGZyb20gJy4uLy4uL2Rlc2lnbi1zeXN0ZW0vVGFicy5qcydcblxudHlwZSBQcm9wcyA9IHtcbiAgb25IZWFkZXJGb2N1c0NoYW5nZT86IChmb2N1c2VkOiBib29sZWFuKSA9PiB2b2lkXG4gIC8qKiBDYWxsZWQgd2hlbiBhcHByb3ZlZC9yZXRyeSBzdGF0ZSBjaGFuZ2VzIHNvIHBhcmVudCBjYW4gYWN0IG9uIGV4aXQgKi9cbiAgb25TdGF0ZUNoYW5nZTogKHN0YXRlOiB7XG4gICAgYXBwcm92ZWQ6IFNldDxudW1iZXI+XG4gICAgcmV0cnk6IFNldDxudW1iZXI+XG4gICAgZGVuaWFsczogcmVhZG9ubHkgQXV0b01vZGVEZW5pYWxbXVxuICB9KSA9PiB2b2lkXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBSZWNlbnREZW5pYWxzVGFiKHtcbiAgb25IZWFkZXJGb2N1c0NoYW5nZSxcbiAgb25TdGF0ZUNoYW5nZSxcbn06IFByb3BzKTogUmVhY3QuUmVhY3ROb2RlIHtcbiAgY29uc3QgeyBoZWFkZXJGb2N1c2VkLCBmb2N1c0hlYWRlciB9ID0gdXNlVGFiSGVhZGVyRm9jdXMoKVxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIG9uSGVhZGVyRm9jdXNDaGFuZ2U/LihoZWFkZXJGb2N1c2VkKVxuICB9LCBbaGVhZGVyRm9jdXNlZCwgb25IZWFkZXJGb2N1c0NoYW5nZV0pXG5cbiAgLy8gU25hcHNob3Qgb24gbW91bnQg4oCUIGFwcHJvdmVkL3JldHJ5IFNldHMga2V5IGJ5IGluZGV4LCBhbmQgdGhlIGxpdmUgc3RvcmVcbiAgLy8gcHJlcGVuZHMuIEEgY29uY3VycmVudCBkZW5pYWwgd291bGQgc2hpZnQgYWxsIGluZGljZXMgbWlkLWVkaXQuXG4gIGNvbnN0IFtkZW5pYWxzXSA9IHVzZVN0YXRlKCgpID0+IGdldEF1dG9Nb2RlRGVuaWFscygpKVxuXG4gIGNvbnN0IFthcHByb3ZlZCwgc2V0QXBwcm92ZWRdID0gdXNlU3RhdGU8U2V0PG51bWJlcj4+KCgpID0+IG5ldyBTZXQoKSlcbiAgY29uc3QgW3JldHJ5LCBzZXRSZXRyeV0gPSB1c2VTdGF0ZTxTZXQ8bnVtYmVyPj4oKCkgPT4gbmV3IFNldCgpKVxuICBjb25zdCBbZm9jdXNlZElkeCwgc2V0Rm9jdXNlZElkeF0gPSB1c2VTdGF0ZSgwKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgb25TdGF0ZUNoYW5nZSh7IGFwcHJvdmVkLCByZXRyeSwgZGVuaWFscyB9KVxuICB9LCBbYXBwcm92ZWQsIHJldHJ5LCBkZW5pYWxzLCBvblN0YXRlQ2hhbmdlXSlcblxuICBjb25zdCBoYW5kbGVTZWxlY3QgPSB1c2VDYWxsYmFjaygodmFsdWU6IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IGlkeCA9IE51bWJlcih2YWx1ZSlcbiAgICBzZXRBcHByb3ZlZChwcmV2ID0+IHtcbiAgICAgIGNvbnN0IG5leHQgPSBuZXcgU2V0KHByZXYpXG4gICAgICBpZiAobmV4dC5oYXMoaWR4KSkgbmV4dC5kZWxldGUoaWR4KVxuICAgICAgZWxzZSBuZXh0LmFkZChpZHgpXG4gICAgICByZXR1cm4gbmV4dFxuICAgIH0pXG4gIH0sIFtdKVxuXG4gIGNvbnN0IGhhbmRsZUZvY3VzID0gdXNlQ2FsbGJhY2soKHZhbHVlOiBzdHJpbmcpID0+IHtcbiAgICBzZXRGb2N1c2VkSWR4KE51bWJlcih2YWx1ZSkpXG4gIH0sIFtdKVxuXG4gIHVzZUlucHV0KFxuICAgIChpbnB1dCwgX2tleSkgPT4ge1xuICAgICAgaWYgKGlucHV0ID09PSAncicpIHtcbiAgICAgICAgc2V0UmV0cnkocHJldiA9PiB7XG4gICAgICAgICAgY29uc3QgbmV4dCA9IG5ldyBTZXQocHJldilcbiAgICAgICAgICBpZiAobmV4dC5oYXMoZm9jdXNlZElkeCkpIG5leHQuZGVsZXRlKGZvY3VzZWRJZHgpXG4gICAgICAgICAgZWxzZSBuZXh0LmFkZChmb2N1c2VkSWR4KVxuICAgICAgICAgIHJldHVybiBuZXh0XG4gICAgICAgIH0pXG4gICAgICAgIC8vIFJldHJ5IGltcGxpZXMgYXBwcm92ZVxuICAgICAgICBzZXRBcHByb3ZlZChwcmV2ID0+IHtcbiAgICAgICAgICBpZiAocHJldi5oYXMoZm9jdXNlZElkeCkpIHJldHVybiBwcmV2XG4gICAgICAgICAgY29uc3QgbmV4dCA9IG5ldyBTZXQocHJldilcbiAgICAgICAgICBuZXh0LmFkZChmb2N1c2VkSWR4KVxuICAgICAgICAgIHJldHVybiBuZXh0XG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSxcbiAgICB7IGlzQWN0aXZlOiBkZW5pYWxzLmxlbmd0aCA+IDAgfSxcbiAgKVxuXG4gIGlmIChkZW5pYWxzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiAoXG4gICAgICA8VGV4dCBkaW1Db2xvcj5cbiAgICAgICAgTm8gcmVjZW50IGRlbmlhbHMuIENvbW1hbmRzIGRlbmllZCBieSB0aGUgYXV0byBtb2RlIGNsYXNzaWZpZXIgd2lsbFxuICAgICAgICBhcHBlYXIgaGVyZS5cbiAgICAgIDwvVGV4dD5cbiAgICApXG4gIH1cblxuICBjb25zdCBvcHRpb25zID0gZGVuaWFscy5tYXAoKGQsIGlkeCkgPT4ge1xuICAgIGNvbnN0IGlzQXBwcm92ZWQgPSBhcHByb3ZlZC5oYXMoaWR4KVxuICAgIGNvbnN0IHN1ZmZpeCA9IHJldHJ5LmhhcyhpZHgpID8gJyAocmV0cnkpJyA6ICcnXG4gICAgcmV0dXJuIHtcbiAgICAgIGxhYmVsOiAoXG4gICAgICAgIDxUZXh0PlxuICAgICAgICAgIDxTdGF0dXNJY29uIHN0YXR1cz17aXNBcHByb3ZlZCA/ICdzdWNjZXNzJyA6ICdlcnJvcid9IHdpdGhTcGFjZSAvPlxuICAgICAgICAgIHtkLmRpc3BsYXl9XG4gICAgICAgICAgPFRleHQgZGltQ29sb3I+e3N1ZmZpeH08L1RleHQ+XG4gICAgICAgIDwvVGV4dD5cbiAgICAgICksXG4gICAgICB2YWx1ZTogU3RyaW5nKGlkeCksXG4gICAgfVxuICB9KVxuXG4gIHJldHVybiAoXG4gICAgPEJveCBmbGV4RGlyZWN0aW9uPVwiY29sdW1uXCI+XG4gICAgICA8VGV4dD5Db21tYW5kcyByZWNlbnRseSBkZW5pZWQgYnkgdGhlIGF1dG8gbW9kZSBjbGFzc2lmaWVyLjwvVGV4dD5cbiAgICAgIDxCb3ggbWFyZ2luVG9wPXsxfT5cbiAgICAgICAgPFNlbGVjdFxuICAgICAgICAgIG9wdGlvbnM9e29wdGlvbnN9XG4gICAgICAgICAgb25DaGFuZ2U9e2hhbmRsZVNlbGVjdH1cbiAgICAgICAgICBvbkZvY3VzPXtoYW5kbGVGb2N1c31cbiAgICAgICAgICB2aXNpYmxlT3B0aW9uQ291bnQ9e01hdGgubWluKDEwLCBvcHRpb25zLmxlbmd0aCl9XG4gICAgICAgICAgaXNEaXNhYmxlZD17aGVhZGVyRm9jdXNlZH1cbiAgICAgICAgICBvblVwRnJvbUZpcnN0SXRlbT17Zm9jdXNIZWFkZXJ9XG4gICAgICAgIC8+XG4gICAgICA8L0JveD5cbiAgICA8L0JveD5cbiAgKVxufVxuIl0sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxLQUFLQSxLQUFLLE1BQU0sT0FBTztBQUM5QixTQUFTQyxXQUFXLEVBQUVDLFNBQVMsRUFBRUMsUUFBUSxRQUFRLE9BQU87QUFD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
src/components/permissions/shellPermissionHelpers.tsx ADDED
@@ -0,0 +1,164 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { basename, sep } from 'path';
2
+ import React, { type ReactNode } from 'react';
3
+ import { getOriginalCwd } from '../../bootstrap/state.js';
4
+ import { Text } from '../../ink.js';
5
+ import type { PermissionUpdate } from '../../utils/permissions/PermissionUpdateSchema.js';
6
+ import { permissionRuleExtractPrefix } from '../../utils/permissions/shellRuleMatching.js';
7
+ function commandListDisplay(commands: string[]): ReactNode {
8
+ switch (commands.length) {
9
+ case 0:
10
+ return '';
11
+ case 1:
12
+ return <Text bold>{commands[0]}</Text>;
13
+ case 2:
14
+ return <Text>
15
+ <Text bold>{commands[0]}</Text> and <Text bold>{commands[1]}</Text>
16
+ </Text>;
17
+ default:
18
+ return <Text>
19
+ <Text bold>{commands.slice(0, -1).join(', ')}</Text>, and{' '}
20
+ <Text bold>{commands.slice(-1)[0]}</Text>
21
+ </Text>;
22
+ }
23
+ }
24
+ function commandListDisplayTruncated(commands: string[]): ReactNode {
25
+ // Check if the plain text representation would be too long
26
+ const plainText = commands.join(', ');
27
+ if (plainText.length > 50) {
28
+ return 'similar';
29
+ }
30
+ return commandListDisplay(commands);
31
+ }
32
+ function formatPathList(paths: string[]): ReactNode {
33
+ if (paths.length === 0) return '';
34
+
35
+ // Extract directory names from paths
36
+ const names = paths.map(p => basename(p) || p);
37
+ if (names.length === 1) {
38
+ return <Text>
39
+ <Text bold>{names[0]}</Text>
40
+ {sep}
41
+ </Text>;
42
+ }
43
+ if (names.length === 2) {
44
+ return <Text>
45
+ <Text bold>{names[0]}</Text>
46
+ {sep} and <Text bold>{names[1]}</Text>
47
+ {sep}
48
+ </Text>;
49
+ }
50
+
51
+ // For 3+, show first two with "and N more"
52
+ return <Text>
53
+ <Text bold>{names[0]}</Text>
54
+ {sep}, <Text bold>{names[1]}</Text>
55
+ {sep} and {paths.length - 2} more
56
+ </Text>;
57
+ }
58
+
59
+ /**
60
+ * Generate the label for the "Yes, and apply suggestions" option in shell
61
+ * permission dialogs (Bash, PowerShell). Parametrized by the shell tool name
62
+ * and an optional command transform (e.g., Bash strips output redirections so
63
+ * filenames don't show as commands).
64
+ */
65
+ export function generateShellSuggestionsLabel(suggestions: PermissionUpdate[], shellToolName: string, commandTransform?: (command: string) => string): ReactNode | null {
66
+ // Collect all rules for display
67
+ const allRules = suggestions.filter(s => s.type === 'addRules').flatMap(s => s.rules || []);
68
+
69
+ // Separate Read rules from shell rules
70
+ const readRules = allRules.filter(r => r.toolName === 'Read');
71
+ const shellRules = allRules.filter(r => r.toolName === shellToolName);
72
+
73
+ // Get directory info
74
+ const directories = suggestions.filter(s => s.type === 'addDirectories').flatMap(s => s.directories || []);
75
+
76
+ // Extract paths from Read rules (keep separate from directories)
77
+ const readPaths = readRules.map(r => r.ruleContent?.replace('/**', '') || '').filter(p => p);
78
+
79
+ // Extract shell command prefixes, optionally transforming for display
80
+ const shellCommands = [...new Set(shellRules.flatMap(rule => {
81
+ if (!rule.ruleContent) return [];
82
+ const command = permissionRuleExtractPrefix(rule.ruleContent) ?? rule.ruleContent;
83
+ return commandTransform ? commandTransform(command) : command;
84
+ }))];
85
+
86
+ // Check what we have
87
+ const hasDirectories = directories.length > 0;
88
+ const hasReadPaths = readPaths.length > 0;
89
+ const hasCommands = shellCommands.length > 0;
90
+
91
+ // Handle single type cases
92
+ if (hasReadPaths && !hasDirectories && !hasCommands) {
93
+ // Only Read rules - use "reading from" language
94
+ if (readPaths.length === 1) {
95
+ const firstPath = readPaths[0]!;
96
+ const dirName = basename(firstPath) || firstPath;
97
+ return <Text>
98
+ Yes, allow reading from <Text bold>{dirName}</Text>
99
+ {sep} from this project
100
+ </Text>;
101
+ }
102
+
103
+ // Multiple read paths
104
+ return <Text>
105
+ Yes, allow reading from {formatPathList(readPaths)} from this project
106
+ </Text>;
107
+ }
108
+ if (hasDirectories && !hasReadPaths && !hasCommands) {
109
+ // Only directory permissions - use "access to" language
110
+ if (directories.length === 1) {
111
+ const firstDir = directories[0]!;
112
+ const dirName = basename(firstDir) || firstDir;
113
+ return <Text>
114
+ Yes, and always allow access to <Text bold>{dirName}</Text>
115
+ {sep} from this project
116
+ </Text>;
117
+ }
118
+
119
+ // Multiple directories
120
+ return <Text>
121
+ Yes, and always allow access to {formatPathList(directories)} from this
122
+ project
123
+ </Text>;
124
+ }
125
+ if (hasCommands && !hasDirectories && !hasReadPaths) {
126
+ // Only shell command permissions
127
+ return <Text>
128
+ {"Yes, and don't ask again for "}
129
+ {commandListDisplayTruncated(shellCommands)} commands in{' '}
130
+ <Text bold>{getOriginalCwd()}</Text>
131
+ </Text>;
132
+ }
133
+
134
+ // Handle mixed cases
135
+ if ((hasDirectories || hasReadPaths) && !hasCommands) {
136
+ // Combine directories and read paths since they're both path access
137
+ const allPaths = [...directories, ...readPaths];
138
+ if (hasDirectories && hasReadPaths) {
139
+ // Mixed - use generic "access to"
140
+ return <Text>
141
+ Yes, and always allow access to {formatPathList(allPaths)} from this
142
+ project
143
+ </Text>;
144
+ }
145
+ }
146
+ if ((hasDirectories || hasReadPaths) && hasCommands) {
147
+ // Build descriptive message for both types
148
+ const allPaths = [...directories, ...readPaths];
149
+
150
+ // Keep it concise but informative
151
+ if (allPaths.length === 1 && shellCommands.length === 1) {
152
+ return <Text>
153
+ Yes, and allow access to {formatPathList(allPaths)} and{' '}
154
+ {commandListDisplayTruncated(shellCommands)} commands
155
+ </Text>;
156
+ }
157
+ return <Text>
158
+ Yes, and allow {formatPathList(allPaths)} access and{' '}
159
+ {commandListDisplayTruncated(shellCommands)} commands
160
+ </Text>;
161
+ }
162
+ return null;
163
+ }
164
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJiYXNlbmFtZSIsInNlcCIsIlJlYWN0IiwiUmVhY3ROb2RlIiwiZ2V0T3JpZ2luYWxDd2QiLCJUZXh0IiwiUGVybWlzc2lvblVwZGF0ZSIsInBlcm1pc3Npb25SdWxlRXh0cmFjdFByZWZpeCIsImNvbW1hbmRMaXN0RGlzcGxheSIsImNvbW1hbmRzIiwibGVuZ3RoIiwic2xpY2UiLCJqb2luIiwiY29tbWFuZExpc3REaXNwbGF5VHJ1bmNhdGVkIiwicGxhaW5UZXh0IiwiZm9ybWF0UGF0aExpc3QiLCJwYXRocyIsIm5hbWVzIiwibWFwIiwicCIsImdlbmVyYXRlU2hlbGxTdWdnZXN0aW9uc0xhYmVsIiwic3VnZ2VzdGlvbnMiLCJzaGVsbFRvb2xOYW1lIiwiY29tbWFuZFRyYW5zZm9ybSIsImNvbW1hbmQiLCJhbGxSdWxlcyIsImZpbHRlciIsInMiLCJ0eXBlIiwiZmxhdE1hcCIsInJ1bGVzIiwicmVhZFJ1bGVzIiwiciIsInRvb2xOYW1lIiwic2hlbGxSdWxlcyIsImRpcmVjdG9yaWVzIiwicmVhZFBhdGhzIiwicnVsZUNvbnRlbnQiLCJyZXBsYWNlIiwic2hlbGxDb21tYW5kcyIsIlNldCIsInJ1bGUiLCJoYXNEaXJlY3RvcmllcyIsImhhc1JlYWRQYXRocyIsImhhc0NvbW1hbmRzIiwiZmlyc3RQYXRoIiwiZGlyTmFtZSIsImZpcnN0RGlyIiwiYWxsUGF0aHMiXSwic291cmNlcyI6WyJzaGVsbFBlcm1pc3Npb25IZWxwZXJzLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBiYXNlbmFtZSwgc2VwIH0gZnJvbSAncGF0aCdcbmltcG9ydCBSZWFjdCwgeyB0eXBlIFJlYWN0Tm9kZSB9IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgZ2V0T3JpZ2luYWxDd2QgfSBmcm9tICcuLi8uLi9ib290c3RyYXAvc3RhdGUuanMnXG5pbXBvcnQgeyBUZXh0IH0gZnJvbSAnLi4vLi4vaW5rLmpzJ1xuaW1wb3J0IHR5cGUgeyBQZXJtaXNzaW9uVXBkYXRlIH0gZnJvbSAnLi4vLi4vdXRpbHMvcGVybWlzc2lvbnMvUGVybWlzc2lvblVwZGF0ZVNjaGVtYS5qcydcbmltcG9ydCB7IHBlcm1pc3Npb25SdWxlRXh0cmFjdFByZWZpeCB9IGZyb20gJy4uLy4uL3V0aWxzL3Blcm1pc3Npb25zL3NoZWxsUnVsZU1hdGNoaW5nLmpzJ1xuXG5mdW5jdGlvbiBjb21tYW5kTGlzdERpc3BsYXkoY29tbWFuZHM6IHN0cmluZ1tdKTogUmVhY3ROb2RlIHtcbiAgc3dpdGNoIChjb21tYW5kcy5sZW5ndGgpIHtcbiAgICBjYXNlIDA6XG4gICAgICByZXR1cm4gJydcbiAgICBjYXNlIDE6XG4gICAgICByZXR1cm4gPFRleHQgYm9sZD57Y29tbWFuZHNbMF19PC9UZXh0PlxuICAgIGNhc2UgMjpcbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxUZXh0PlxuICAgICAgICAgIDxUZXh0IGJvbGQ+e2NvbW1hbmRzWzBdfTwvVGV4dD4gYW5kIDxUZXh0IGJvbGQ+e2NvbW1hbmRzWzFdfTwvVGV4dD5cbiAgICAgICAgPC9UZXh0PlxuICAgICAgKVxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gKFxuICAgICAgICA8VGV4dD5cbiAgICAgICAgICA8VGV4dCBib2xkPntjb21tYW5kcy5zbGljZSgwLCAtMSkuam9pbignLCAnKX08L1RleHQ+LCBhbmR7JyAnfVxuICAgICAgICAgIDxUZXh0IGJvbGQ+e2NvbW1hbmRzLnNsaWNlKC0xKVswXX08L1RleHQ+XG4gICAgICAgIDwvVGV4dD5cbiAgICAgIClcbiAgfVxufVxuXG5mdW5jdGlvbiBjb21tYW5kTGlzdERpc3BsYXlUcnVuY2F0ZWQoY29tbWFuZHM6IHN0cmluZ1tdKTogUmVhY3ROb2RlIHtcbiAgLy8gQ2hlY2sgaWYgdGhlIHBsYWluIHRleHQgcmVwcmVzZW50YXRpb24gd291bGQgYmUgdG9vIGxvbmdcbiAgY29uc3QgcGxhaW5UZXh0ID0gY29tbWFuZHMuam9pbignLCAnKVxuICBpZiAocGxhaW5UZXh0Lmxlbmd0aCA+IDUwKSB7XG4gICAgcmV0dXJuICdzaW1pbGFyJ1xuICB9XG4gIHJldHVybiBjb21tYW5kTGlzdERpc3BsYXkoY29tbWFuZHMpXG59XG5cbmZ1bmN0aW9uIGZvcm1hdFBhdGhMaXN0KHBhdGhzOiBzdHJpbmdbXSk6IFJlYWN0Tm9kZSB7XG4gIGlmIChwYXRocy5sZW5ndGggPT09IDApIHJldHVybiAnJ1xuXG4gIC8vIEV4dHJhY3QgZGlyZWN0b3J5IG5hbWVzIGZyb20gcGF0aHNcbiAgY29uc3QgbmFtZXMgPSBwYXRocy5tYXAocCA9PiBiYXNlbmFtZShwKSB8fCBwKVxuXG4gIGlmIChuYW1lcy5sZW5ndGggPT09IDEpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPFRleHQ+XG4gICAgICAgIDxUZXh0IGJvbGQ+e25hbWVzWzBdfTwvVGV4dD5cbiAgICAgICAge3NlcH1cbiAgICAgIDwvVGV4dD5cbiAgICApXG4gIH1cbiAgaWYgKG5hbWVzLmxlbmd0aCA9PT0gMikge1xuICAgIHJldHVybiAoXG4gICAgICA8VGV4dD5cbiAgICAgICAgPFRleHQgYm9sZD57bmFtZXNbMF19PC9UZXh0PlxuICAgICAgICB7c2VwfSBhbmQgPFRleHQgYm9sZD57bmFtZXNbMV19PC9UZXh0PlxuICAgICAgICB7c2VwfVxuICAgICAgPC9UZXh0PlxuICAgIClcbiAgfVxuXG4gIC8vIEZvciAzKywgc2hvdyBmaXJzdCB0d28gd2l0aCBcImFuZCBOIG1vcmVcIlxuICByZXR1cm4gKFxuICAgIDxUZXh0PlxuICAgICAgPFRleHQgYm9sZD57bmFtZXNbMF19PC9UZXh0PlxuICAgICAge3NlcH0sIDxUZXh0IGJvbGQ+e25hbWVzWzFdfTwvVGV4dD5cbiAgICAgIHtzZXB9IGFuZCB7cGF0aHMubGVuZ3RoIC0gMn0gbW9yZVxuICAgIDwvVGV4dD5cbiAgKVxufVxuXG4vKipcbiAqIEdlbmVyYXRlIHRoZSBsYWJlbCBmb3IgdGhlIFwiWWVzLCBhbmQgYXBwbHkgc3VnZ2VzdGlvbnNcIiBvcHRpb24gaW4gc2hlbGxcbiAqIHBlcm1pc3Npb24gZGlhbG9ncyAoQmFzaCwgUG93ZXJTaGVsbCkuIFBhcmFtZXRyaXplZCBieSB0aGUgc2hlbGwgdG9vbCBuYW1lXG4gKiBhbmQgYW4gb3B0aW9uYWwgY29tbWFuZCB0cmFuc2Zvcm0gKGUuZy4sIEJhc2ggc3RyaXBzIG91dHB1dCByZWRpcmVjdGlvbnMgc29cbiAqIGZpbGVuYW1lcyBkb24ndCBzaG93IGFzIGNvbW1hbmRzKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlU2hlbGxTdWdnZXN0aW9uc0xhYmVsKFxuICBzdWdnZXN0aW9uczogUGVybWlzc2lvblVwZGF0ZVtdLFxuICBzaGVsbFRvb2xOYW1lOiBzdHJpbmcsXG4gIGNvbW1hbmRUcmFuc2Zvcm0/OiAoY29tbWFuZDogc3RyaW5nKSA9PiBzdHJpbmcsXG4pOiBSZWFjdE5vZGUgfCBudWxsIHtcbiAgLy8gQ29sbGVjdCBhbGwgcnVsZXMgZm9yIGRpc3BsYXlcbiAgY29uc3QgYWxsUnVsZXMgPSBzdWdnZXN0aW9uc1xuICAgIC5maWx0ZXIocyA9PiBzLnR5cGUgPT09ICdhZGRSdWxlcycpXG4gICAgLmZsYXRNYXAocyA9PiBzLnJ1bGVzIHx8IFtdKVxuXG4gIC8vIFNlcGFyYXRlIFJlYWQgcnVsZXMgZnJvbSBzaGVsbCBydWxlc1xuICBjb25zdCByZWFkUnVsZXMgPSBhbGxSdWxlcy5maWx0ZXIociA9PiByLnRvb2xOYW1lID09PSAnUmVhZCcpXG4gIGNvbnN0IHNoZWxsUnVsZXMgPSBhbGxSdWxlcy5maWx0ZXIociA9PiByLnRvb2xOYW1lID09PSBzaGVsbFRvb2xOYW1lKVxuXG4gIC8vIEdldCBkaXJlY3RvcnkgaW5mb1xuICBjb25zdCBkaXJlY3RvcmllcyA9IHN1Z2dlc3Rpb25zXG4gICAgLmZpbHRlcihzID0+IHMudHlwZSA9PT0gJ2FkZERpcmVjdG9yaWVzJylcbiAgICAuZmxhdE1hcChzID0+IHMuZGlyZWN0b3JpZXMgfHwgW10pXG5cbiAgLy8gRXh0cmFjdCBwYXRocyBmcm9tIFJlYWQgcnVsZXMgKGtlZXAgc2VwYXJhdGUgZnJvbSBkaXJlY3RvcmllcylcbiAgY29uc3QgcmVhZFBhdGhzID0gcmVhZFJ1bGVzXG4gICAgLm1hcChyID0+IHIucnVsZUNvbnRlbnQ/LnJlcGxhY2UoJy8qKicsICcnKSB8fCAnJylcbiAgICAuZmlsdGVyKHAgPT4gcClcblxuICAvLyBFeHRyYWN0IHNoZWxsIGNvbW1hbmQgcHJlZml4ZXMsIG9wdGlvbmFsbHkgdHJhbnNmb3JtaW5nIGZvciBkaXNwbGF5XG4gIGNvbnN0IHNoZWxsQ29tbWFuZHMgPSBbXG4gICAgLi4ubmV3IFNldChcbiAgICAgIHNoZWxsUnVsZXMuZmxhdE1hcChydWxlID0+IHtcbiAgICAgICAgaWYgKCFydWxlLnJ1bGVDb250ZW50KSByZXR1cm4gW11cbiAgICAgICAgY29uc3QgY29tbWFuZCA9XG4gICAgICAgICAgcGVybWlzc2lvblJ1bGVFeHRyYWN0UHJlZml4KHJ1bGUucnVsZUNvbnRlbnQpID8/IHJ1bGUucnVsZUNvbnRlbnRcbiAgICAgICAgcmV0dXJuIGNvbW1hbmRUcmFuc2Zvcm0gPyBjb21tYW5kVHJhbnNmb3JtKGNvbW1hbmQpIDogY29tbWFuZFxuICAgICAgfSksXG4gICAgKSxcbiAgXVxuXG4gIC8vIENoZWNrIHdoYXQgd2UgaGF2ZVxuICBjb25zdCBoYXNEaXJlY3RvcmllcyA9IGRpcmVjdG9yaWVzLmxlbmd0aCA+IDBcbiAgY29uc3QgaGFzUmVhZFBhdGhzID0gcmVhZFBhdGhzLmxlbmd0aCA+IDBcbiAgY29uc3QgaGFzQ29tbWFuZHMgPSBzaGVsbENvbW1hbmRzLmxlbmd0aCA+IDBcblxuICAvLyBIYW5kbGUgc2luZ2xlIHR5cGUgY2FzZXNcbiAgaWYgKGhhc1JlYWRQYXRocyAmJiAhaGFzRGlyZWN0b3JpZXMgJiYgIWhhc0NvbW1hbmRzKSB7XG4gICAgLy8gT25seSBSZWFkIHJ1bGVzIC0gdXNlIFwicmVhZGluZyBmcm9tXCIgbGFuZ3VhZ2VcbiAgICBpZiAocmVhZFBhdGhzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgY29uc3QgZmlyc3RQYXRoID0gcmVhZFBhdGhzWzBdIVxuICAgICAgY29uc3QgZGlyTmFtZSA9IGJhc2VuYW1lKGZpcnN0UGF0aCkgfHwgZmlyc3RQYXRoXG4gICAgICByZXR1cm4gKFxuICAgICAgICA8VGV4dD5cbiAgICAgICAgICBZZXMsIGFsbG93IHJlYWRpbmcgZnJvbSA8VGV4dCBib2xkPntkaXJOYW1lfTwvVGV4dD5cbiAgICAgICAgICB7c2VwfSBmcm9tIHRoaXMgcHJvamVjdFxuICAgICAgICA8L1RleHQ+XG4gICAgICApXG4gICAgfVxuXG4gICAgLy8gTXVsdGlwbGUgcmVhZCBwYXRoc1xuICAgIHJldHVybiAoXG4gICAgICA8VGV4dD5cbiAgICAgICAgWWVzLCBhbGxvdyByZWFkaW5nIGZyb20ge2Zvcm1hdFBhdGhMaXN0KHJlYWRQYXRocyl9IGZyb20gdGhpcyBwcm9qZWN0XG4gICAgICA8L1RleHQ+XG4gICAgKVxuICB9XG5cbiAgaWYgKGhhc0RpcmVjdG9yaWVzICYmICFoYXNSZWFkUGF0aHMgJiYgIWhhc0NvbW1hbmRzKSB7XG4gICAgLy8gT25seSBkaXJlY3RvcnkgcGVybWlzc2lvbnMgLSB1c2UgXCJhY2Nlc3MgdG9cIiBsYW5ndWFnZVxuICAgIGlmIChkaXJlY3Rvcmllcy5sZW5ndGggPT09IDEpIHtcbiAgICAgIGNvbnN0IGZpcnN0RGlyID0gZGlyZWN0b3JpZXNbMF0hXG4gICAgICBjb25zdCBkaXJOYW1lID0gYmFzZW5hbWUoZmlyc3REaXIpIHx8IGZpcnN0RGlyXG4gICAgICByZXR1cm4gKFxuICAgICAgICA8VGV4dD5cbiAgICAgICAgICBZZXMsIGFuZCBhbHdheXMgYWxsb3cgYWNjZXNzIHRvIDxUZXh0IGJvbGQ+e2Rpck5hbWV9PC9UZXh0PlxuICAgICAgICAgIHtzZXB9IGZyb20gdGhpcyBwcm9qZWN0XG4gICAgICAgIDwvVGV4dD5cbiAgICAgIClcbiAgICB9XG5cbiAgICAvLyBNdWx0aXBsZSBkaXJlY3Rvcmllc1xuICAgIHJldHVybiAoXG4gICAgICA8VGV4dD5cbiAgICAgICAgWWVzLCBhbmQgYWx3YXlzIGFsbG93IGFjY2VzcyB0byB7Zm9ybWF0UGF0aExpc3QoZGlyZWN0b3JpZXMpfSBmcm9tIHRoaXNcbiAgICAgICAgcHJvamVjdFxuICAgICAgPC9UZXh0PlxuICAgIClcbiAgfVxuXG4gIGlmIChoYXNDb21tYW5kcyAmJiAhaGFzRGlyZWN0b3JpZXMgJiYgIWhhc1JlYWRQYXRocykge1xuICAgIC8vIE9ubHkgc2hlbGwgY29tbWFuZCBwZXJtaXNzaW9uc1xuICAgIHJldHVybiAoXG4gICAgICA8VGV4dD5cbiAgICAgICAge1wiWWVzLCBhbmQgZG9uJ3QgYXNrIGFnYWluIGZvciBcIn1cbiAgICAgICAge2NvbW1hbmRMaXN0RGlzcGxheVRydW5jYXRlZChzaGVsbENvbW1hbmRzKX0gY29tbWFuZHMgaW57JyAnfVxuICAgICAgICA8VGV4dCBib2xkPntnZXRPcmlnaW5hbEN3ZCgpfTwvVGV4dD5cbiAgICAgIDwvVGV4dD5cbiAgICApXG4gIH1cblxuICAvLyBIYW5kbGUgbWl4ZWQgY2FzZXNcbiAgaWYgKChoYXNEaXJlY3RvcmllcyB8fCBoYXNSZWFkUGF0aHMpICYmICFoYXNDb21tYW5kcykge1xuICAgIC8vIENvbWJpbmUgZGlyZWN0b3JpZXMgYW5kIHJlYWQgcGF0aHMgc2luY2UgdGhleSdyZSBib3RoIHBhdGggYWNjZXNzXG4gICAgY29uc3QgYWxsUGF0aHMgPSBbLi4uZGlyZWN0b3JpZXMsIC4uLnJlYWRQYXRoc11cbiAgICBpZiAoaGFzRGlyZWN0b3JpZXMgJiYgaGFzUmVhZFBhdGhzKSB7XG4gICAgICAvLyBNaXhlZCAtIHVzZSBnZW5lcmljIFwiYWNjZXNzIHRvXCJcbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxUZXh0PlxuICAgICAgICAgIFllcywgYW5kIGFsd2F5cyBhbGxvdyBhY2Nlc3MgdG8ge2Zvcm1hdFBhdGhMaXN0KGFsbFBhdGhzKX0gZnJvbSB0aGlzXG4gICAgICAgICAgcHJvamVjdFxuICAgICAgICA8L1RleHQ+XG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgaWYgKChoYXNEaXJlY3RvcmllcyB8fCBoYXNSZWFkUGF0aHMpICYmIGhhc0NvbW1hbmRzKSB7XG4gICAgLy8gQnVpbGQgZGVzY3JpcHRpdmUgbWVzc2FnZSBmb3IgYm90aCB0eXBlc1xuICAgIGNvbnN0IGFsbFBhdGhzID0gWy4uLmRpcmVjdG9yaWVzLCAuLi5yZWFkUGF0aHNdXG5cbiAgICAvLyBLZWVwIGl0IGNvbmNpc2UgYnV0IGluZm9ybWF0aXZlXG4gICAgaWYgKGFsbFBhdGhzLmxlbmd0aCA9PT0gMSAmJiBzaGVsbENvbW1hbmRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgPFRleHQ+XG4gICAgICAgICAgWWVzLCBhbmQgYWxsb3cgYWNjZXNzIHRvIHtmb3JtYXRQYXRoTGlzdChhbGxQYXRocyl9IGFuZHsnICd9XG4gICAgICAgICAge2NvbW1hbmRMaXN0RGlzcGxheVRydW5jYXRlZChzaGVsbENvbW1hbmRzKX0gY29tbWFuZHNcbiAgICAgICAgPC9UZXh0PlxuICAgICAgKVxuICAgIH1cblxuICAgIHJldHVybiAoXG4gICAgICA8VGV4dD5cbiAgICAgICAgWWVzLCBhbmQgYWxsb3cge2Zvcm1hdFBhdGhMaXN0KGFsbFBhdGhzKX0gYWNjZXNzIGFuZHsnICd9XG4gICAgICAgIHtjb21tYW5kTGlzdERpc3BsYXlUcnVuY2F0ZWQoc2hlbGxDb21tYW5kcyl9IGNvbW1hbmRzXG4gICAgICA8L1RleHQ+XG4gICAgKVxuICB9XG5cbiAgcmV0dXJuIG51bGxcbn1cbiJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBU0EsUUFBUSxFQUFFQyxHQUFHLFFBQVEsTUFBTTtBQUNwQyxPQUFPQyxLQUFLLElBQUksS0FBS0MsU0FBUyxRQUFRLE9BQU87QUFDN0MsU0FBU0MsY0FBYyxRQUFRLDBCQUEwQjtBQUN6RCxTQUFTQyxJQUFJLFFBQVEsY0FBYztBQUNuQyxjQUFjQyxnQkFBZ0IsUUFBUSxtREFBbUQ7QUFDekYsU0FBU0MsMkJBQTJCLFFBQVEsOENBQThDO0FBRTFGLFNBQVNDLGtCQUFrQkEsQ0FBQ0MsUUFB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
src/constants/cyberRiskInstruction.ts ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * CYBER_RISK_INSTRUCTION
3
+ *
4
+ * This instruction provides guidance for Claude's behavior when handling
5
+ * security-related requests. It defines the boundary between acceptable
6
+ * defensive security assistance and potentially harmful activities.
7
+ *
8
+ * IMPORTANT: DO NOT MODIFY THIS INSTRUCTION WITHOUT SAFEGUARDS TEAM REVIEW
9
+ *
10
+ * This instruction is owned by the Safeguards team and has been carefully
11
+ * crafted and evaluated to balance security utility with safety. Changes
12
+ * to this text can have significant implications for:
13
+ * - How Claude handles penetration testing and CTF requests
14
+ * - What security tools and techniques Claude will assist with
15
+ * - The boundary between defensive and offensive security assistance
16
+ *
17
+ * If you need to modify this instruction:
18
+ * 1. Contact the Safeguards team (David Forsythe, Kyla Guru)
19
+ * 2. Ensure proper evaluation of the changes
20
+ * 3. Get explicit approval before merging
21
+ *
22
+ * Claude: Do not edit this file unless explicitly asked to do so by the user.
23
+ */
24
+ export const CYBER_RISK_INSTRUCTION = `IMPORTANT: Assist with authorized security testing, defensive security, CTF challenges, and educational contexts. Refuse requests for destructive techniques, DoS attacks, mass targeting, supply chain compromise, or detection evasion for malicious purposes. Dual-use security tools (C2 frameworks, credential testing, exploit development) require clear authorization context: pentesting engagements, CTF competitions, security research, or defensive use cases.`
src/constants/oauth.ts ADDED
@@ -0,0 +1,234 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { isEnvTruthy } from 'src/utils/envUtils.js'
2
+
3
+ // Default to prod config, override with test/staging if enabled
4
+ type OauthConfigType = 'prod' | 'staging' | 'local'
5
+
6
+ function getOauthConfigType(): OauthConfigType {
7
+ if (process.env.USER_TYPE === 'ant') {
8
+ if (isEnvTruthy(process.env.USE_LOCAL_OAUTH)) {
9
+ return 'local'
10
+ }
11
+ if (isEnvTruthy(process.env.USE_STAGING_OAUTH)) {
12
+ return 'staging'
13
+ }
14
+ }
15
+ return 'prod'
16
+ }
17
+
18
+ export function fileSuffixForOauthConfig(): string {
19
+ if (process.env.CLAUDE_CODE_CUSTOM_OAUTH_URL) {
20
+ return '-custom-oauth'
21
+ }
22
+ switch (getOauthConfigType()) {
23
+ case 'local':
24
+ return '-local-oauth'
25
+ case 'staging':
26
+ return '-staging-oauth'
27
+ case 'prod':
28
+ // No suffix for production config
29
+ return ''
30
+ }
31
+ }
32
+
33
+ export const CLAUDE_AI_INFERENCE_SCOPE = 'user:inference' as const
34
+ export const CLAUDE_AI_PROFILE_SCOPE = 'user:profile' as const
35
+ const CONSOLE_SCOPE = 'org:create_api_key' as const
36
+ export const OAUTH_BETA_HEADER = 'oauth-2025-04-20' as const
37
+
38
+ // Console OAuth scopes - for API key creation via Console
39
+ export const CONSOLE_OAUTH_SCOPES = [
40
+ CONSOLE_SCOPE,
41
+ CLAUDE_AI_PROFILE_SCOPE,
42
+ ] as const
43
+
44
+ // Claude.ai OAuth scopes - for Claude.ai subscribers (Pro/Max/Team/Enterprise)
45
+ export const CLAUDE_AI_OAUTH_SCOPES = [
46
+ CLAUDE_AI_PROFILE_SCOPE,
47
+ CLAUDE_AI_INFERENCE_SCOPE,
48
+ 'user:sessions:claude_code',
49
+ 'user:mcp_servers',
50
+ 'user:file_upload',
51
+ ] as const
52
+
53
+ // All OAuth scopes - union of all scopes used in Claude CLI
54
+ // When logging in, request all scopes in order to handle both Console -> Claude.ai redirect
55
+ // Ensure that `OAuthConsentPage` in apps repo is kept in sync with this list.
56
+ export const ALL_OAUTH_SCOPES = Array.from(
57
+ new Set([...CONSOLE_OAUTH_SCOPES, ...CLAUDE_AI_OAUTH_SCOPES]),
58
+ )
59
+
60
+ type OauthConfig = {
61
+ BASE_API_URL: string
62
+ CONSOLE_AUTHORIZE_URL: string
63
+ CLAUDE_AI_AUTHORIZE_URL: string
64
+ /**
65
+ * The claude.ai web origin. Separate from CLAUDE_AI_AUTHORIZE_URL because
66
+ * that now routes through claude.com/cai/* for attribution — deriving
67
+ * .origin from it would give claude.com, breaking links to /code,
68
+ * /settings/connectors, and other claude.ai web pages.
69
+ */
70
+ CLAUDE_AI_ORIGIN: string
71
+ TOKEN_URL: string
72
+ API_KEY_URL: string
73
+ ROLES_URL: string
74
+ CONSOLE_SUCCESS_URL: string
75
+ CLAUDEAI_SUCCESS_URL: string
76
+ MANUAL_REDIRECT_URL: string
77
+ CLIENT_ID: string
78
+ OAUTH_FILE_SUFFIX: string
79
+ MCP_PROXY_URL: string
80
+ MCP_PROXY_PATH: string
81
+ }
82
+
83
+ // Production OAuth configuration - Used in normal operation
84
+ const PROD_OAUTH_CONFIG = {
85
+ BASE_API_URL: 'https://api.anthropic.com',
86
+ CONSOLE_AUTHORIZE_URL: 'https://platform.claude.com/oauth/authorize',
87
+ // Bounces through claude.com/cai/* so CLI sign-ins connect to claude.com
88
+ // visits for attribution. 307s to claude.ai/oauth/authorize in two hops.
89
+ CLAUDE_AI_AUTHORIZE_URL: 'https://claude.com/cai/oauth/authorize',
90
+ CLAUDE_AI_ORIGIN: 'https://claude.ai',
91
+ TOKEN_URL: 'https://platform.claude.com/v1/oauth/token',
92
+ API_KEY_URL: 'https://api.anthropic.com/api/oauth/claude_cli/create_api_key',
93
+ ROLES_URL: 'https://api.anthropic.com/api/oauth/claude_cli/roles',
94
+ CONSOLE_SUCCESS_URL:
95
+ 'https://platform.claude.com/buy_credits?returnUrl=/oauth/code/success%3Fapp%3Dclaude-code',
96
+ CLAUDEAI_SUCCESS_URL:
97
+ 'https://platform.claude.com/oauth/code/success?app=claude-code',
98
+ MANUAL_REDIRECT_URL: 'https://platform.claude.com/oauth/code/callback',
99
+ CLIENT_ID: '9d1c250a-e61b-44d9-88ed-5944d1962f5e',
100
+ // No suffix for production config
101
+ OAUTH_FILE_SUFFIX: '',
102
+ MCP_PROXY_URL: 'https://mcp-proxy.anthropic.com',
103
+ MCP_PROXY_PATH: '/v1/mcp/{server_id}',
104
+ } as const
105
+
106
+ /**
107
+ * Client ID Metadata Document URL for MCP OAuth (CIMD / SEP-991).
108
+ * When an MCP auth server advertises client_id_metadata_document_supported: true,
109
+ * Claude Code uses this URL as its client_id instead of Dynamic Client Registration.
110
+ * The URL must point to a JSON document hosted by Anthropic.
111
+ * See: https://datatracker.ietf.org/doc/html/draft-ietf-oauth-client-id-metadata-document-00
112
+ */
113
+ export const MCP_CLIENT_METADATA_URL =
114
+ 'https://claude.ai/oauth/claude-code-client-metadata'
115
+
116
+ // Staging OAuth configuration - only included in ant builds with staging flag
117
+ // Uses literal check for dead code elimination
118
+ const STAGING_OAUTH_CONFIG =
119
+ process.env.USER_TYPE === 'ant'
120
+ ? ({
121
+ BASE_API_URL: 'https://api-staging.anthropic.com',
122
+ CONSOLE_AUTHORIZE_URL:
123
+ 'https://platform.staging.ant.dev/oauth/authorize',
124
+ CLAUDE_AI_AUTHORIZE_URL:
125
+ 'https://claude-ai.staging.ant.dev/oauth/authorize',
126
+ CLAUDE_AI_ORIGIN: 'https://claude-ai.staging.ant.dev',
127
+ TOKEN_URL: 'https://platform.staging.ant.dev/v1/oauth/token',
128
+ API_KEY_URL:
129
+ 'https://api-staging.anthropic.com/api/oauth/claude_cli/create_api_key',
130
+ ROLES_URL:
131
+ 'https://api-staging.anthropic.com/api/oauth/claude_cli/roles',
132
+ CONSOLE_SUCCESS_URL:
133
+ 'https://platform.staging.ant.dev/buy_credits?returnUrl=/oauth/code/success%3Fapp%3Dclaude-code',
134
+ CLAUDEAI_SUCCESS_URL:
135
+ 'https://platform.staging.ant.dev/oauth/code/success?app=claude-code',
136
+ MANUAL_REDIRECT_URL:
137
+ 'https://platform.staging.ant.dev/oauth/code/callback',
138
+ CLIENT_ID: '22422756-60c9-4084-8eb7-27705fd5cf9a',
139
+ OAUTH_FILE_SUFFIX: '-staging-oauth',
140
+ MCP_PROXY_URL: 'https://mcp-proxy-staging.anthropic.com',
141
+ MCP_PROXY_PATH: '/v1/mcp/{server_id}',
142
+ } as const)
143
+ : undefined
144
+
145
+ // Three local dev servers: :8000 api-proxy (`api dev start -g ccr`),
146
+ // :4000 claude-ai frontend, :3000 Console frontend. Env vars let
147
+ // scripts/claude-localhost override if your layout differs.
148
+ function getLocalOauthConfig(): OauthConfig {
149
+ const api =
150
+ process.env.CLAUDE_LOCAL_OAUTH_API_BASE?.replace(/\/$/, '') ??
151
+ 'http://localhost:8000'
152
+ const apps =
153
+ process.env.CLAUDE_LOCAL_OAUTH_APPS_BASE?.replace(/\/$/, '') ??
154
+ 'http://localhost:4000'
155
+ const consoleBase =
156
+ process.env.CLAUDE_LOCAL_OAUTH_CONSOLE_BASE?.replace(/\/$/, '') ??
157
+ 'http://localhost:3000'
158
+ return {
159
+ BASE_API_URL: api,
160
+ CONSOLE_AUTHORIZE_URL: `${consoleBase}/oauth/authorize`,
161
+ CLAUDE_AI_AUTHORIZE_URL: `${apps}/oauth/authorize`,
162
+ CLAUDE_AI_ORIGIN: apps,
163
+ TOKEN_URL: `${api}/v1/oauth/token`,
164
+ API_KEY_URL: `${api}/api/oauth/claude_cli/create_api_key`,
165
+ ROLES_URL: `${api}/api/oauth/claude_cli/roles`,
166
+ CONSOLE_SUCCESS_URL: `${consoleBase}/buy_credits?returnUrl=/oauth/code/success%3Fapp%3Dclaude-code`,
167
+ CLAUDEAI_SUCCESS_URL: `${consoleBase}/oauth/code/success?app=claude-code`,
168
+ MANUAL_REDIRECT_URL: `${consoleBase}/oauth/code/callback`,
169
+ CLIENT_ID: '22422756-60c9-4084-8eb7-27705fd5cf9a',
170
+ OAUTH_FILE_SUFFIX: '-local-oauth',
171
+ MCP_PROXY_URL: 'http://localhost:8205',
172
+ MCP_PROXY_PATH: '/v1/toolbox/shttp/mcp/{server_id}',
173
+ }
174
+ }
175
+
176
+ // Allowed base URLs for CLAUDE_CODE_CUSTOM_OAUTH_URL override.
177
+ // Only FedStart/PubSec deployments are permitted to prevent OAuth tokens
178
+ // from being sent to arbitrary endpoints.
179
+ const ALLOWED_OAUTH_BASE_URLS = [
180
+ 'https://beacon.claude-ai.staging.ant.dev',
181
+ 'https://claude.fedstart.com',
182
+ 'https://claude-staging.fedstart.com',
183
+ ]
184
+
185
+ // Default to prod config, override with test/staging if enabled
186
+ export function getOauthConfig(): OauthConfig {
187
+ let config: OauthConfig = (() => {
188
+ switch (getOauthConfigType()) {
189
+ case 'local':
190
+ return getLocalOauthConfig()
191
+ case 'staging':
192
+ return STAGING_OAUTH_CONFIG ?? PROD_OAUTH_CONFIG
193
+ case 'prod':
194
+ return PROD_OAUTH_CONFIG
195
+ }
196
+ })()
197
+
198
+ // Allow overriding all OAuth URLs to point to an approved FedStart deployment.
199
+ // Only allowlisted base URLs are accepted to prevent credential leakage.
200
+ const oauthBaseUrl = process.env.CLAUDE_CODE_CUSTOM_OAUTH_URL
201
+ if (oauthBaseUrl) {
202
+ const base = oauthBaseUrl.replace(/\/$/, '')
203
+ if (!ALLOWED_OAUTH_BASE_URLS.includes(base)) {
204
+ throw new Error(
205
+ 'CLAUDE_CODE_CUSTOM_OAUTH_URL is not an approved endpoint.',
206
+ )
207
+ }
208
+ config = {
209
+ ...config,
210
+ BASE_API_URL: base,
211
+ CONSOLE_AUTHORIZE_URL: `${base}/oauth/authorize`,
212
+ CLAUDE_AI_AUTHORIZE_URL: `${base}/oauth/authorize`,
213
+ CLAUDE_AI_ORIGIN: base,
214
+ TOKEN_URL: `${base}/v1/oauth/token`,
215
+ API_KEY_URL: `${base}/api/oauth/claude_cli/create_api_key`,
216
+ ROLES_URL: `${base}/api/oauth/claude_cli/roles`,
217
+ CONSOLE_SUCCESS_URL: `${base}/oauth/code/success?app=claude-code`,
218
+ CLAUDEAI_SUCCESS_URL: `${base}/oauth/code/success?app=claude-code`,
219
+ MANUAL_REDIRECT_URL: `${base}/oauth/code/callback`,
220
+ OAUTH_FILE_SUFFIX: '-custom-oauth',
221
+ }
222
+ }
223
+
224
+ // Allow CLIENT_ID override via environment variable (e.g., for Xcode integration)
225
+ const clientIdOverride = process.env.CLAUDE_CODE_OAUTH_CLIENT_ID
226
+ if (clientIdOverride) {
227
+ config = {
228
+ ...config,
229
+ CLIENT_ID: clientIdOverride,
230
+ }
231
+ }
232
+
233
+ return config
234
+ }
src/constants/toolLimits.ts ADDED
@@ -0,0 +1,56 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Constants related to tool result size limits
3
+ */
4
+
5
+ /**
6
+ * Default maximum size in characters for tool results before they get persisted
7
+ * to disk. When exceeded, the result is saved to a file and the model receives
8
+ * a preview with the file path instead of the full content.
9
+ *
10
+ * Individual tools may declare a lower maxResultSizeChars, but this constant
11
+ * acts as a system-wide cap regardless of what tools declare.
12
+ */
13
+ export const DEFAULT_MAX_RESULT_SIZE_CHARS = 50_000
14
+
15
+ /**
16
+ * Maximum size for tool results in tokens.
17
+ * Based on analysis of tool result sizes, we set this to a reasonable upper bound
18
+ * to prevent excessively large tool results from consuming too much context.
19
+ *
20
+ * This is approximately 400KB of text (assuming ~4 bytes per token).
21
+ */
22
+ export const MAX_TOOL_RESULT_TOKENS = 100_000
23
+
24
+ /**
25
+ * Bytes per token estimate for calculating token count from byte size.
26
+ * This is a conservative estimate - actual token count may vary.
27
+ */
28
+ export const BYTES_PER_TOKEN = 4
29
+
30
+ /**
31
+ * Maximum size for tool results in bytes (derived from token limit).
32
+ */
33
+ export const MAX_TOOL_RESULT_BYTES = MAX_TOOL_RESULT_TOKENS * BYTES_PER_TOKEN
34
+
35
+ /**
36
+ * Default maximum aggregate size in characters for tool_result blocks within
37
+ * a SINGLE user message (one turn's batch of parallel tool results). When a
38
+ * message's blocks together exceed this, the largest blocks in that message
39
+ * are persisted to disk and replaced with previews until under budget.
40
+ * Messages are evaluated independently — a 150K result in one turn and a
41
+ * 150K result in the next are both untouched.
42
+ *
43
+ * This prevents N parallel tools from each hitting the per-tool max and
44
+ * collectively producing e.g. 10 × 40K = 400K in one turn's user message.
45
+ *
46
+ * Overridable at runtime via GrowthBook flag tengu_hawthorn_window — see
47
+ * getPerMessageBudgetLimit() in toolResultStorage.ts.
48
+ */
49
+ export const MAX_TOOL_RESULTS_PER_MESSAGE_CHARS = 200_000
50
+
51
+ /**
52
+ * Maximum character length for tool summary strings in compact views.
53
+ * Used by getToolUseSummary() implementations to truncate long inputs
54
+ * for display in grouped agent rendering.
55
+ */
56
+ export const TOOL_SUMMARY_MAX_LENGTH = 50