@allternit/gizzi-code 1.0.0 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/gizzi +4 -0
- package/bin/gizzi-ink +5 -0
- package/package.json +137 -31
- package/src/Tool.ts +26 -0
- package/src/bootstrap/state.ts +165 -322
- package/src/commands.ts +209 -0
- package/src/context/QueuedMessageContext.tsx +63 -0
- package/src/context/fpsMetrics.tsx +30 -0
- package/src/context/mailbox.tsx +38 -0
- package/src/context/modalContext.tsx +58 -0
- package/src/context/notifications.tsx +240 -0
- package/src/context/overlayContext.tsx +151 -0
- package/src/context/promptOverlayContext.tsx +125 -0
- package/src/context/stats.tsx +220 -0
- package/src/context/voice.tsx +88 -0
- package/src/hooks/useCanUseTool.ts +11 -0
- package/src/hooks/useExitOnCtrlCD.ts +40 -187
- package/src/hooks/useExitOnCtrlCDWithKeybindings.ts +68 -0
- package/src/hooks/useKeybinding.ts +68 -209
- package/src/hooks/useTerminalSize.ts +31 -99
- package/src/hooks.ts +37 -0
- package/src/ink.ts +204 -0
- package/src/main.ts +7 -0
- package/src/types/command.ts +216 -0
- package/src/types/connectorText.ts +39 -0
- package/src/types/fileSuggestion.ts +15 -0
- package/src/types/generated/events_mono/claude_code/v1/claude_code_internal_event.ts +865 -0
- package/src/types/generated/events_mono/common/v1/auth.ts +100 -0
- package/src/types/generated/events_mono/growthbook/v1/growthbook_experiment_event.ts +223 -0
- package/src/types/generated/google/protobuf/timestamp.ts +187 -0
- package/src/types/hooks.ts +319 -0
- package/src/types/ids.ts +44 -0
- package/src/types/logs.ts +331 -0
- package/src/types/merged/index.ts +5 -0
- package/src/types/merged/message.ts +552 -0
- package/src/types/message.ts +927 -186
- package/src/types/messageQueueTypes.ts +21 -0
- package/src/types/notebook.ts +72 -0
- package/src/types/permissions.ts +447 -0
- package/src/types/plugin.ts +363 -0
- package/src/types/statusLine.ts +15 -0
- package/src/types/textInputTypes.ts +387 -0
- package/src/types/tools.ts +149 -0
- package/src/types/utils.ts +20 -0
- package/src/utils/advisor.ts +12 -0
- package/src/utils/api.ts +29 -0
- package/src/utils/array.ts +7 -0
- package/src/utils/attachments.ts +60 -0
- package/src/utils/auth.ts +3 -0
- package/src/utils/claudeInChrome/chromeNativeHost.ts +15 -0
- package/src/utils/claudeInChrome/common.ts +12 -0
- package/src/utils/claudeInChrome/mcpServer.ts +15 -0
- package/src/utils/computerUse/common.ts +19 -0
- package/src/utils/computerUse/mcpServer.ts +15 -0
- package/src/utils/config.ts +35 -0
- package/src/utils/context.ts +19 -0
- package/src/utils/cwd.ts +3 -0
- package/src/utils/debug.ts +3 -0
- package/src/utils/earlyInput.ts +7 -0
- package/src/utils/effort.ts +13 -0
- package/src/utils/embeddedTools.ts +12 -0
- package/src/utils/envUtils.ts +3 -0
- package/src/utils/errors.ts +3 -0
- package/src/utils/execFileNoThrow.ts +24 -0
- package/src/utils/feature-flags.ts +112 -0
- package/src/utils/file.ts +3 -0
- package/src/utils/fileHistory.ts +17 -0
- package/src/utils/fingerprint.ts +7 -0
- package/src/utils/format.ts +75 -305
- package/src/utils/frontmatterParser.ts +33 -0
- package/src/utils/fsOperations.ts +31 -0
- package/src/utils/fullscreen.ts +40 -350
- package/src/utils/git.ts +15 -0
- package/src/utils/imageResizer.ts +30 -0
- package/src/utils/lazySchema.ts +9 -0
- package/src/utils/log.ts +3 -0
- package/src/utils/markdownConfigLoader.ts +12 -0
- package/src/utils/messages.ts +13 -0
- package/src/utils/migration.ts +137 -0
- package/src/utils/model/providers.ts +15 -0
- package/src/utils/path.ts +3 -0
- package/src/utils/permissions/PermissionResult.ts +14 -0
- package/src/utils/permissions/autoModeState.ts +12 -0
- package/src/utils/permissions/filesystem.ts +12 -0
- package/src/utils/plugins/loadPluginOutputStyles.ts +12 -0
- package/src/utils/plugins/schemas.ts +25 -0
- package/src/utils/process.ts +16 -0
- package/src/utils/sandbox/sandbox-adapter.ts +19 -0
- package/src/utils/sessionStorage.ts +238 -472
- package/src/utils/settings/constants.ts +10 -0
- package/src/utils/settings/settings.ts +19 -0
- package/src/utils/settings/types.ts +18 -0
- package/src/utils/shell/shellToolUtils.ts +9 -0
- package/src/utils/sinks.ts +11 -0
- package/src/utils/sleep.ts +7 -0
- package/src/utils/sliceAnsi.ts +7 -0
- package/src/utils/slowOperations.ts +3 -0
- package/src/utils/startupProfiler.ts +11 -0
- package/src/utils/stringUtils.ts +106 -0
- package/src/utils/systemPromptType.ts +9 -0
- package/src/utils/teleport/api.ts +15 -0
- package/src/utils/textHighlighting.ts +16 -0
- package/src/utils/theme.ts +17 -0
- package/src/utils/thinking.ts +58 -0
- package/src/utils/tokens.ts +11 -0
- package/src/utils/toolResultStorage.ts +17 -0
- package/src/utils/worktreeModeEnabled.ts +7 -0
- package/WORKSPACE_INTEGRATION.md +0 -290
- package/chat-sessions/sessions-index.json +0 -98
- package/package.json.original +0 -31
- package/package.json.publish +0 -47
- package/src/bootstrap/state.d.ts +0 -169
- package/src/bootstrap/state.js +0 -261
- package/src/context/pack-builder.d.ts +0 -24
- package/src/context/pack-builder.js +0 -281
- package/src/hooks/useExitOnCtrlCD.d.ts +0 -86
- package/src/hooks/useExitOnCtrlCD.js +0 -130
- package/src/hooks/useKeybinding.d.ts +0 -89
- package/src/hooks/useKeybinding.js +0 -163
- package/src/hooks/useTerminalSize.d.ts +0 -41
- package/src/hooks/useTerminalSize.js +0 -90
- package/src/index.d.ts +0 -23
- package/src/index.js +0 -24
- package/src/runtime/brand/brand.d.ts +0 -488
- package/src/runtime/brand/brand.js +0 -464
- package/src/runtime/brand/brand.ts +0 -667
- package/src/runtime/services/tokenEstimation.d.ts +0 -187
- package/src/runtime/services/tokenEstimation.js +0 -423
- package/src/runtime/services/tokenEstimation.ts +0 -547
- package/src/runtime/tools/Tool.d.ts +0 -239
- package/src/runtime/tools/Tool.js +0 -285
- package/src/runtime/tools/Tool.ts +0 -524
- package/src/scheduler/TaskScheduler.d.ts +0 -98
- package/src/scheduler/TaskScheduler.js +0 -201
- package/src/scheduler/TaskScheduler.ts +0 -259
- package/src/state/AppStateStore.d.ts +0 -347
- package/src/state/AppStateStore.js +0 -439
- package/src/state/AppStateStore.ts +0 -658
- package/src/state/WorkspaceStateStore.d.ts +0 -43
- package/src/state/WorkspaceStateStore.js +0 -224
- package/src/state/WorkspaceStateStore.ts +0 -297
- package/src/types/message.d.ts +0 -190
- package/src/types/message.js +0 -77
- package/src/utils/format.d.ts +0 -126
- package/src/utils/format.js +0 -230
- package/src/utils/fullscreen.d.ts +0 -161
- package/src/utils/fullscreen.js +0 -277
- package/src/utils/sessionStorage.d.ts +0 -210
- package/src/utils/sessionStorage.js +0 -435
- package/src/watcher/WorkspaceWatcher.d.ts +0 -70
- package/src/watcher/WorkspaceWatcher.js +0 -191
- package/src/watcher/WorkspaceWatcher.ts +0 -251
- package/src/workspace/loader.d.ts +0 -30
- package/src/workspace/loader.js +0 -117
- package/src/workspace/types.d.ts +0 -91
- package/src/workspace/types.js +0 -7
- package/threads/thread_1775361175022.json +0 -9
- package/tsconfig.json +0 -14
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
import type * as React from 'react';
|
|
2
|
+
import { useCallback, useEffect } from 'react';
|
|
3
|
+
import { useAppStateStore, useSetAppState } from '@/state/AppState.js';
|
|
4
|
+
import type { Theme } from '../utils/theme.js';
|
|
5
|
+
type Priority = 'low' | 'medium' | 'high' | 'immediate';
|
|
6
|
+
type BaseNotification = {
|
|
7
|
+
key: string;
|
|
8
|
+
/**
|
|
9
|
+
* Keys of notifications that this notification invalidates.
|
|
10
|
+
* If a notification is invalidated, it will be removed from the queue
|
|
11
|
+
* and, if currently displayed, cleared immediately.
|
|
12
|
+
*/
|
|
13
|
+
invalidates?: string[];
|
|
14
|
+
priority: Priority;
|
|
15
|
+
timeoutMs?: number;
|
|
16
|
+
/**
|
|
17
|
+
* Combine notifications with the same key, like Array.reduce().
|
|
18
|
+
* Called as fold(accumulator, incoming) when a notification with a matching
|
|
19
|
+
* key already exists in the queue or is currently displayed.
|
|
20
|
+
* Returns the merged notification (should carry fold forward for future merges).
|
|
21
|
+
*/
|
|
22
|
+
fold?: (accumulator: Notification, incoming: Notification) => Notification;
|
|
23
|
+
};
|
|
24
|
+
type TextNotification = BaseNotification & {
|
|
25
|
+
text: string;
|
|
26
|
+
color?: keyof Theme;
|
|
27
|
+
};
|
|
28
|
+
type JSXNotification = BaseNotification & {
|
|
29
|
+
jsx: React.ReactNode;
|
|
30
|
+
};
|
|
31
|
+
type AddNotificationFn = (content: Notification) => void;
|
|
32
|
+
type RemoveNotificationFn = (key: string) => void;
|
|
33
|
+
export type Notification = TextNotification | JSXNotification;
|
|
34
|
+
const DEFAULT_TIMEOUT_MS = 8000;
|
|
35
|
+
|
|
36
|
+
// Track current timeout to clear it when immediate notifications arrive
|
|
37
|
+
let currentTimeoutId: NodeJS.Timeout | null = null;
|
|
38
|
+
export function useNotifications(): {
|
|
39
|
+
addNotification: AddNotificationFn;
|
|
40
|
+
removeNotification: RemoveNotificationFn;
|
|
41
|
+
} {
|
|
42
|
+
const store = useAppStateStore();
|
|
43
|
+
const setAppState = useSetAppState();
|
|
44
|
+
|
|
45
|
+
// Process queue when current notification finishes or queue changes
|
|
46
|
+
const processQueue = useCallback(() => {
|
|
47
|
+
setAppState(prev => {
|
|
48
|
+
const next = getNext(prev.notifications.queue);
|
|
49
|
+
if (prev.notifications.current !== null || !next) {
|
|
50
|
+
return prev;
|
|
51
|
+
}
|
|
52
|
+
currentTimeoutId = setTimeout((setAppState, nextKey, processQueue) => {
|
|
53
|
+
currentTimeoutId = null;
|
|
54
|
+
setAppState(prev => {
|
|
55
|
+
// Compare by key instead of reference to handle re-created notifications
|
|
56
|
+
if (prev.notifications.current?.key !== nextKey) {
|
|
57
|
+
return prev;
|
|
58
|
+
}
|
|
59
|
+
return {
|
|
60
|
+
...prev,
|
|
61
|
+
notifications: {
|
|
62
|
+
queue: prev.notifications.queue,
|
|
63
|
+
current: null
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
});
|
|
67
|
+
processQueue();
|
|
68
|
+
}, next.timeoutMs ?? DEFAULT_TIMEOUT_MS, setAppState, next.key, processQueue);
|
|
69
|
+
return {
|
|
70
|
+
...prev,
|
|
71
|
+
notifications: {
|
|
72
|
+
queue: prev.notifications.queue.filter(_ => _ !== next),
|
|
73
|
+
current: next
|
|
74
|
+
}
|
|
75
|
+
};
|
|
76
|
+
});
|
|
77
|
+
}, [setAppState]);
|
|
78
|
+
const addNotification = useCallback<AddNotificationFn>((notif: Notification) => {
|
|
79
|
+
// Handle immediate priority notifications
|
|
80
|
+
if (notif.priority === 'immediate') {
|
|
81
|
+
// Clear any existing timeout since we're showing a new immediate notification
|
|
82
|
+
if (currentTimeoutId) {
|
|
83
|
+
clearTimeout(currentTimeoutId);
|
|
84
|
+
currentTimeoutId = null;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// Set up timeout for the immediate notification
|
|
88
|
+
currentTimeoutId = setTimeout((setAppState, notif, processQueue) => {
|
|
89
|
+
currentTimeoutId = null;
|
|
90
|
+
setAppState(prev => {
|
|
91
|
+
// Compare by key instead of reference to handle re-created notifications
|
|
92
|
+
if (prev.notifications.current?.key !== notif.key) {
|
|
93
|
+
return prev;
|
|
94
|
+
}
|
|
95
|
+
return {
|
|
96
|
+
...prev,
|
|
97
|
+
notifications: {
|
|
98
|
+
queue: prev.notifications.queue.filter(_ => !notif.invalidates?.includes(_.key)),
|
|
99
|
+
current: null
|
|
100
|
+
}
|
|
101
|
+
};
|
|
102
|
+
});
|
|
103
|
+
processQueue();
|
|
104
|
+
}, notif.timeoutMs ?? DEFAULT_TIMEOUT_MS, setAppState, notif, processQueue);
|
|
105
|
+
|
|
106
|
+
// Show the immediate notification right away
|
|
107
|
+
setAppState(prev => ({
|
|
108
|
+
...prev,
|
|
109
|
+
notifications: {
|
|
110
|
+
current: notif,
|
|
111
|
+
queue:
|
|
112
|
+
// Only re-queue the current notification if it's not immediate
|
|
113
|
+
[...(prev.notifications.current ? [prev.notifications.current] : []), ...prev.notifications.queue].filter(_ => _.priority !== 'immediate' && !notif.invalidates?.includes(_.key))
|
|
114
|
+
}
|
|
115
|
+
}));
|
|
116
|
+
return; // IMPORTANT: Exit addNotification for immediate notifications
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
// Handle non-immediate notifications
|
|
120
|
+
setAppState(prev => {
|
|
121
|
+
// Check if we can fold into an existing notification with the same key
|
|
122
|
+
if (notif.fold) {
|
|
123
|
+
// Fold into current notification if keys match
|
|
124
|
+
if (prev.notifications.current?.key === notif.key) {
|
|
125
|
+
const folded = notif.fold(prev.notifications.current, notif);
|
|
126
|
+
// Reset timeout for the folded notification
|
|
127
|
+
if (currentTimeoutId) {
|
|
128
|
+
clearTimeout(currentTimeoutId);
|
|
129
|
+
currentTimeoutId = null;
|
|
130
|
+
}
|
|
131
|
+
currentTimeoutId = setTimeout((setAppState, foldedKey, processQueue) => {
|
|
132
|
+
currentTimeoutId = null;
|
|
133
|
+
setAppState(p => {
|
|
134
|
+
if (p.notifications.current?.key !== foldedKey) {
|
|
135
|
+
return p;
|
|
136
|
+
}
|
|
137
|
+
return {
|
|
138
|
+
...p,
|
|
139
|
+
notifications: {
|
|
140
|
+
queue: p.notifications.queue,
|
|
141
|
+
current: null
|
|
142
|
+
}
|
|
143
|
+
};
|
|
144
|
+
});
|
|
145
|
+
processQueue();
|
|
146
|
+
}, folded.timeoutMs ?? DEFAULT_TIMEOUT_MS, setAppState, folded.key, processQueue);
|
|
147
|
+
return {
|
|
148
|
+
...prev,
|
|
149
|
+
notifications: {
|
|
150
|
+
current: folded,
|
|
151
|
+
queue: prev.notifications.queue
|
|
152
|
+
}
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
// Fold into queued notification if keys match
|
|
157
|
+
const queueIdx = prev.notifications.queue.findIndex(_ => _.key === notif.key);
|
|
158
|
+
if (queueIdx !== -1) {
|
|
159
|
+
const folded = notif.fold(prev.notifications.queue[queueIdx]!, notif);
|
|
160
|
+
const newQueue = [...prev.notifications.queue];
|
|
161
|
+
newQueue[queueIdx] = folded;
|
|
162
|
+
return {
|
|
163
|
+
...prev,
|
|
164
|
+
notifications: {
|
|
165
|
+
current: prev.notifications.current,
|
|
166
|
+
queue: newQueue
|
|
167
|
+
}
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
// Only add to queue if not already present (prevent duplicates)
|
|
173
|
+
const queuedKeys = new Set(prev.notifications.queue.map(_ => _.key));
|
|
174
|
+
const shouldAdd = !queuedKeys.has(notif.key) && prev.notifications.current?.key !== notif.key;
|
|
175
|
+
if (!shouldAdd) return prev;
|
|
176
|
+
const invalidatesCurrent = prev.notifications.current !== null && notif.invalidates?.includes(prev.notifications.current.key);
|
|
177
|
+
if (invalidatesCurrent && currentTimeoutId) {
|
|
178
|
+
clearTimeout(currentTimeoutId);
|
|
179
|
+
currentTimeoutId = null;
|
|
180
|
+
}
|
|
181
|
+
return {
|
|
182
|
+
...prev,
|
|
183
|
+
notifications: {
|
|
184
|
+
current: invalidatesCurrent ? null : prev.notifications.current,
|
|
185
|
+
queue: [...prev.notifications.queue.filter(_ => _.priority !== 'immediate' && !notif.invalidates?.includes(_.key)), notif]
|
|
186
|
+
}
|
|
187
|
+
};
|
|
188
|
+
});
|
|
189
|
+
|
|
190
|
+
// Process queue after adding the notification
|
|
191
|
+
processQueue();
|
|
192
|
+
}, [setAppState, processQueue]);
|
|
193
|
+
const removeNotification = useCallback<RemoveNotificationFn>((key: string) => {
|
|
194
|
+
setAppState(prev => {
|
|
195
|
+
const isCurrent = prev.notifications.current?.key === key;
|
|
196
|
+
const inQueue = prev.notifications.queue.some(n => n.key === key);
|
|
197
|
+
if (!isCurrent && !inQueue) {
|
|
198
|
+
return prev;
|
|
199
|
+
}
|
|
200
|
+
if (isCurrent && currentTimeoutId) {
|
|
201
|
+
clearTimeout(currentTimeoutId);
|
|
202
|
+
currentTimeoutId = null;
|
|
203
|
+
}
|
|
204
|
+
return {
|
|
205
|
+
...prev,
|
|
206
|
+
notifications: {
|
|
207
|
+
current: isCurrent ? null : prev.notifications.current,
|
|
208
|
+
queue: prev.notifications.queue.filter(n => n.key !== key)
|
|
209
|
+
}
|
|
210
|
+
};
|
|
211
|
+
});
|
|
212
|
+
processQueue();
|
|
213
|
+
}, [setAppState, processQueue]);
|
|
214
|
+
|
|
215
|
+
// Process queue on mount if there are notifications in the initial state.
|
|
216
|
+
// Imperative read (not useAppState) — a subscription in a mount-only
|
|
217
|
+
// effect would be vestigial and make every caller re-render on queue changes.
|
|
218
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
219
|
+
// biome-ignore lint/correctness/useExhaustiveDependencies: mount-only effect, store is a stable context ref
|
|
220
|
+
useEffect(() => {
|
|
221
|
+
if (store.getState().notifications.queue.length > 0) {
|
|
222
|
+
processQueue();
|
|
223
|
+
}
|
|
224
|
+
}, []);
|
|
225
|
+
return {
|
|
226
|
+
addNotification,
|
|
227
|
+
removeNotification
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
const PRIORITIES: Record<Priority, number> = {
|
|
231
|
+
immediate: 0,
|
|
232
|
+
high: 1,
|
|
233
|
+
medium: 2,
|
|
234
|
+
low: 3
|
|
235
|
+
};
|
|
236
|
+
export function getNext(queue: Notification[]): Notification | undefined {
|
|
237
|
+
if (queue.length === 0) return undefined;
|
|
238
|
+
return queue.reduce((min, n) => PRIORITIES[n.priority] < PRIORITIES[min.priority] ? n : min);
|
|
239
|
+
}
|
|
240
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsInVzZUNhbGxiYWNrIiwidXNlRWZmZWN0IiwidXNlQXBwU3RhdGVTdG9yZSIsInVzZVNldEFwcFN0YXRlIiwiVGhlbWUiLCJQcmlvcml0eSIsIkJhc2VOb3RpZmljYXRpb24iLCJrZXkiLCJpbnZhbGlkYXRlcyIsInByaW9yaXR5IiwidGltZW91dE1zIiwiZm9sZCIsImFjY3VtdWxhdG9yIiwiTm90aWZpY2F0aW9uIiwiaW5jb21pbmciLCJUZXh0Tm90aWZpY2F0aW9uIiwidGV4dCIsImNvbG9yIiwiSlNYTm90aWZpY2F0aW9uIiwianN4IiwiUmVhY3ROb2RlIiwiQWRkTm90aWZpY2F0aW9uRm4iLCJjb250ZW50IiwiUmVtb3ZlTm90aWZpY2F0aW9uRm4iLCJERUZBVUxUX1RJTUVPVVRfTVMiLCJjdXJyZW50VGltZW91dElkIiwiTm9kZUpTIiwiVGltZW91dCIsInVzZU5vdGlmaWNhdGlvbnMiLCJhZGROb3RpZmljYXRpb24iLCJyZW1vdmVOb3RpZmljYXRpb24iLCJzdG9yZSIsInNldEFwcFN0YXRlIiwicHJvY2Vzc1F1ZXVlIiwicHJldiIsIm5leHQiLCJnZXROZXh0Iiwibm90aWZpY2F0aW9ucyIsInF1ZXVlIiwiY3VycmVudCIsInNldFRpbWVvdXQiLCJuZXh0S2V5IiwiZmlsdGVyIiwiXyIsIm5vdGlmIiwiY2xlYXJUaW1lb3V0IiwiaW5jbHVkZXMiLCJmb2xkZWQiLCJmb2xkZWRLZXkiLCJwIiwicXVldWVJZHgiLCJmaW5kSW5kZXgiLCJuZXdRdWV1ZSIsInF1ZXVlZEtleXMiLCJTZXQiLCJtYXAiLCJzaG91bGRBZGQiLCJoYXMiLCJpbnZhbGlkYXRlc0N1cnJlbnQiLCJpc0N1cnJlbnQiLCJpblF1ZXVlIiwic29tZSIsIm4iLCJnZXRTdGF0ZSIsImxlbmd0aCIsIlBSSU9SSVRJRVMiLCJSZWNvcmQiLCJpbW1lZGlhdGUiLCJoaWdoIiwibWVkaXVtIiwibG93IiwidW5kZWZpbmVkIiwicmVkdWNlIiwibWluIl0sInNvdXJjZXMiOlsibm90aWZpY2F0aW9ucy50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QgfSBmcm9tICdyZWFjdCdcbmltcG9ydCB7IHVzZUFwcFN0YXRlU3RvcmUsIHVzZVNldEFwcFN0YXRlIH0gZnJvbSAnc3JjL3N0YXRlL0FwcFN0YXRlLmpzJ1xuaW1wb3J0IHR5cGUgeyBUaGVtZSB9IGZyb20gJy4uL3V0aWxzL3RoZW1lLmpzJ1xuXG50eXBlIFByaW9yaXR5ID0gJ2xvdycgfCAnbWVkaXVtJyB8ICdoaWdoJyB8ICdpbW1lZGlhdGUnXG5cbnR5cGUgQmFzZU5vdGlmaWNhdGlvbiA9IHtcbiAga2V5OiBzdHJpbmdcbiAgLyoqXG4gICAqIEtleXMgb2Ygbm90aWZpY2F0aW9ucyB0aGF0IHRoaXMgbm90aWZpY2F0aW9uIGludmFsaWRhdGVzLlxuICAgKiBJZiBhIG5vdGlmaWNhdGlvbiBpcyBpbnZhbGlkYXRlZCwgaXQgd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlIHF1ZXVlXG4gICAqIGFuZCwgaWYgY3VycmVudGx5IGRpc3BsYXllZCwgY2xlYXJlZCBpbW1lZGlhdGVseS5cbiAgICovXG4gIGludmFsaWRhdGVzPzogc3RyaW5nW11cbiAgcHJpb3JpdHk6IFByaW9yaXR5XG4gIHRpbWVvdXRNcz86IG51bWJlclxuICAvKipcbiAgICogQ29tYmluZSBub3RpZmljYXRpb25zIHdpdGggdGhlIHNhbWUga2V5LCBsaWtlIEFycmF5LnJlZHVjZSgpLlxuICAgKiBDYWxsZWQgYXMgZm9sZChhY2N1bXVsYXRvciwgaW5jb21pbmcpIHdoZW4gYSBub3RpZmljYXRpb24gd2l0aCBhIG1hdGNoaW5nXG4gICAqIGtleSBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgcXVldWUgb3IgaXMgY3VycmVudGx5IGRpc3BsYXllZC5cbiAgICogUmV0dXJucyB0aGUgbWVyZ2VkIG5vdGlmaWNhdGlvbiAoc2hvdWxkIGNhcnJ5IGZvbGQgZm9yd2FyZCBmb3IgZnV0dXJlIG1lcmdlcykuXG4gICAqL1xuICBmb2xkPzogKGFjY3VtdWxhdG9yOiBOb3RpZmljYXRpb24sIGluY29taW5nOiBOb3RpZmljYXRpb24pID0+IE5vdGlmaWNhdGlvblxufVxuXG50eXBlIFRleHROb3RpZmljYXRpb24gPSBCYXNlTm90aWZpY2F0aW9uICYge1xuICB0ZXh0OiBzdHJpbmdcbiAgY29sb3I/OiBrZXlvZiBUaGVtZVxufVxuXG50eXBlIEpTWE5vdGlmaWNhdGlvbiA9IEJhc2VOb3RpZmljYXRpb24gJiB7XG4gIGpzeDogUmVhY3QuUmVhY3ROb2RlXG59XG5cbnR5cGUgQWRkTm90aWZpY2F0aW9uRm4gPSAoY29udGVudDogTm90aWZpY2F0aW9uKSA9PiB2b2lkXG50eXBlIFJlbW92ZU5vdGlmaWNhdGlvbkZuID0gKGtleTogc3RyaW5nKSA9PiB2b2lkXG5cbmV4cG9ydCB0eXBlIE5vdGlmaWNhdGlvbiA9IFRleHROb3RpZmljYXRpb24gfCBKU1hOb3RpZmljYXRpb25cblxuY29uc3QgREVGQVVMVF9USU1FT1VUX01TID0gODAwMFxuXG4vLyBUcmFjayBjdXJyZW50IHRpbWVvdXQgdG8gY2xlYXIgaXQgd2hlbiBpbW1lZGlhdGUgbm90aWZpY2F0aW9ucyBhcnJpdmVcbmxldCBjdXJyZW50VGltZW91dElkOiBOb2RlSlMuVGltZW91dCB8IG51bGwgPSBudWxsXG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VOb3RpZmljYXRpb25zKCk6IHtcbiAgYWRkTm90aWZpY2F0aW9uOiBBZGROb3RpZmljYXRpb25GblxuICByZW1vdmVOb3RpZmljYXRpb246IFJlbW92ZU5vdGlmaWNhdGlvbkZuXG59IHtcbiAgY29uc3Qgc3RvcmUgPSB1c2VBcHBTdGF0ZVN0b3JlKClcbiAgY29uc3Qgc2V0QXBwU3RhdGUgPSB1c2VTZXRBcHBTdGF0ZSgpXG5cbiAgLy8gUHJvY2VzcyBxdWV1ZSB3aGVuIGN1cnJlbnQgbm90aWZpY2F0aW9uIGZpbmlzaGVzIG9yIHF1ZXVlIGNoYW5nZXNcbiAgY29uc3QgcHJvY2Vzc1F1ZXVlID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIHNldEFwcFN0YXRlKHByZXYgPT4ge1xuICAgICAgY29uc3QgbmV4dCA9IGdldE5leHQocHJldi5ub3RpZmljYXRpb25zLnF1ZXVlKVxuICAgICAgaWYgKHByZXYubm90aWZpY2F0aW9ucy5jdXJyZW50ICE9PSBudWxsIHx8ICFuZXh0KSB7XG4gICAgICAgIHJldHVybiBwcmV2XG4gICAgICB9XG5cbiAgICAgIGN1cnJlbnRUaW1lb3V0SWQgPSBzZXRUaW1lb3V0KFxuICAgICAgICAoc2V0QXBwU3RhdGUsIG5leHRLZXksIHByb2Nlc3NRdWV1ZSkgPT4ge1xuICAgICAgICAgIGN1cnJlbnRUaW1lb3V0SWQgPSBudWxsXG4gICAgICAgICAgc2V0QXBwU3RhdGUocHJldiA9PiB7XG4gICAgICAgICAgICAvLyBDb21wYXJlIGJ5IGtleSBpbnN0ZWFkIG9mIHJlZmVyZW5jZSB0byBoYW5kbGUgcmUtY3JlYXRlZCBub3RpZmljYXRpb25zXG4gICAgICAgICAgICBpZiAocHJldi5ub3RpZmljYXRpb25zLmN1cnJlbnQ/LmtleSAhPT0gbmV4dEtleSkge1xuICAgICAgICAgICAgICByZXR1cm4gcHJldlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgLi4ucHJldixcbiAgICAgICAgICAgICAgbm90aWZpY2F0aW9uczoge1xuICAgICAgICAgICAgICAgIHF1ZXVlOiBwcmV2Lm5vdGlmaWNhdGlvbnMucXVldWUsXG4gICAgICAgICAgICAgICAgY3VycmVudDogbnVsbCxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICAgIHByb2Nlc3NRdWV1ZSgpXG4gICAgICAgIH0sXG4gICAgICAgIG5leHQudGltZW91dE1zID8/IERFRkFVTFRfVElNRU9VVF9NUyxcbiAgICAgICAgc2V0QXBwU3RhdGUsXG4gICAgICAgIG5leHQua2V5LFxuICAgICAgICBwcm9jZXNzUXVldWUsXG4gICAgICApXG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnByZXYsXG4gICAgICAgIG5vdGlmaWNhdGlvbnM6IHtcbiAgICAgICAgICBxdWV1ZTogcHJldi5ub3RpZmljYXRpb25zLnF1ZXVlLmZpbHRlcihfID0+IF8gIT09IG5leHQpLFxuICAgICAgICAgIGN1cnJlbnQ6IG5leHQsXG4gICAgICAgIH0sXG4gICAgICB9XG4gICAgfSlcbiAgfSwgW3NldEFwcFN0YXRlXSlcblxuICBjb25zdCBhZGROb3RpZmljYXRpb24gPSB1c2VDYWxsYmFjazxBZGROb3RpZmljYXRpb25Gbj4oXG4gICAgKG5vdGlmOiBOb3RpZmljYXRpb24pID0+IHtcbiAgICAgIC8vIEhhbmRsZSBpbW1lZGlhdGUgcHJpb3JpdHkgbm90aWZpY2F0aW9uc1xuICAgICAgaWYgKG5vdGlmLnByaW9yaXR5ID09PSAnaW1tZWRpYXRlJykge1xuICAgICAgICAvLyBDbGVhciBhbnkgZXhpc3RpbmcgdGltZW91dCBzaW5jZSB3ZSdyZSBzaG93aW5nIGEgbmV3IGltbWVkaWF0ZSBub3RpZmljYXRpb25cbiAgICAgICAgaWYgKGN1cnJlbnRUaW1lb3V0SWQpIHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQoY3VycmVudFRpbWVvdXRJZClcbiAgICAgICAgICBjdXJyZW50VGltZW91dElkID0gbnVsbFxuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2V0IHVwIHRpbWVvdXQgZm9yIHRoZSBpbW1lZGlhdGUgbm90aWZpY2F0aW9uXG4gICAgICAgIGN1cnJlbnRUaW1lb3V0SWQgPSBzZXRUaW1lb3V0KFxuICAgICAgICAgIChzZXRBcHBTdGF0ZSwgbm90aWYsIHByb2Nlc3NRdWV1ZSkgPT4ge1xuICAgICAgICAgICAgY3VycmVudFRpbWVvdXRJZCA9IG51bGxcbiAgICAgICAgICAgIHNldEFwcFN0YXRlKHByZXYgPT4ge1xuICAgICAgICAgICAgICAvLyBDb21wYXJlIGJ5IGtleSBpbnN0ZWFkIG9mIHJlZmVyZW5jZSB0byBoYW5kbGUgcmUtY3JlYXRlZCBub3RpZmljYXRpb25zXG4gICAgICAgICAgICAgIGlmIChwcmV2Lm5vdGlmaWNhdGlvbnMuY3VycmVudD8ua2V5ICE9PSBub3RpZi5rZXkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJldlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgLi4ucHJldixcbiAgICAgICAgICAgICAgICBub3RpZmljYXRpb25zOiB7XG4gICAgICAgICAgICAgICAgICBxdWV1ZTogcHJldi5ub3RpZmljYXRpb25zLnF1ZXVlLmZpbHRlcihcbiAgICAgICAgICAgICAgICAgICAgXyA9PiAhbm90aWYuaW52YWxpZGF0ZXM/LmluY2x1ZGVzKF8ua2V5KSxcbiAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICBjdXJyZW50OiBudWxsLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBwcm9jZXNzUXVldWUoKVxuICAgICAgICAgIH0sXG4gICAgICAgICAgbm90aWYudGltZW91dE1zID8/IERFRkFVTFRfVElNRU9VVF9NUyxcbiAgICAgICAgICBzZXRBcHBTdGF0ZSxcbiAgICAgICAgICBub3RpZixcbiAgICAgICAgICBwcm9jZXNzUXVldWUsXG4gICAgICAgIClcblxuICAgICAgICAvLyBTaG93IHRoZSBpbW1lZGlhdGUgbm90aWZpY2F0aW9uIHJpZ2h0IGF3YXlcbiAgICAgICAgc2V0QXBwU3RhdGUocHJldiA9PiAoe1xuICAgICAgICAgIC4uLnByZXYsXG4gICAgICAgICAgbm90aWZpY2F0aW9uczoge1xuICAgICAgICAgICAgY3VycmVudDogbm90aWYsXG4gICAgICAgICAgICBxdWV1ZTpcbiAgICAgICAgICAgICAgLy8gT25seSByZS1xdWV1ZSB0aGUgY3VycmVudCBub3RpZmljYXRpb24gaWYgaXQncyBub3QgaW1tZWRpYXRlXG4gICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAuLi4ocHJldi5ub3RpZmljYXRpb25zLmN1cnJlbnRcbiAgICAgICAgICAgICAgICAgID8gW3ByZXYubm90aWZpY2F0aW9ucy5jdXJyZW50XVxuICAgICAgICAgICAgICAgICAgOiBbXSksXG4gICAgICAgICAgICAgICAgLi4ucHJldi5ub3RpZmljYXRpb25zLnF1ZXVlLFxuICAgICAgICAgICAgICBdLmZpbHRlcihcbiAgICAgICAgICAgICAgICBfID0+XG4gICAgICAgICAgICAgICAgICBfLnByaW9yaXR5ICE9PSAnaW1tZWRpYXRlJyAmJlxuICAgICAgICAgICAgICAgICAgIW5vdGlmLmludmFsaWRhdGVzPy5pbmNsdWRlcyhfLmtleSksXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgfSxcbiAgICAgICAgfSkpXG4gICAgICAgIHJldHVybiAvLyBJTVBPUlRBTlQ6IEV4aXQgYWRkTm90aWZpY2F0aW9uIGZvciBpbW1lZGlhdGUgbm90aWZpY2F0aW9uc1xuICAgICAgfVxuXG4gICAgICAvLyBIYW5kbGUgbm9uLWltbWVkaWF0ZSBub3RpZmljYXRpb25zXG4gICAgICBzZXRBcHBTdGF0ZShwcmV2ID0+IHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgd2UgY2FuIGZvbGQgaW50byBhbiBleGlzdGluZyBub3RpZmljYXRpb24gd2l0aCB0aGUgc2FtZSBrZXlcbiAgICAgICAgaWYgKG5vdGlmLmZvbGQpIHtcbiAgICAgICAgICAvLyBGb2xkIGludG8gY3VycmVudCBub3RpZmljYXRpb24gaWYga2V5cyBtYXRjaFxuICAgICAgICAgIGlmIChwcmV2Lm5vdGlmaWNhdGlvbnMuY3VycmVudD8ua2V5ID09PSBub3RpZi5rZXkpIHtcbiAgICAgICAgICAgIGNvbnN0IGZvbGRlZCA9IG5vdGlmLmZvbGQocHJldi5ub3RpZmljYXRpb25zLmN1cnJlbnQsIG5vdGlmKVxuICAgICAgICAgICAgLy8gUmVzZXQgdGltZW91dCBmb3IgdGhlIGZvbGRlZCBub3RpZmljYXRpb25cbiAgICAgICAgICAgIGlmIChjdXJyZW50VGltZW91dElkKSB7XG4gICAgICAgICAgICAgIGNsZWFyVGltZW91dChjdXJyZW50VGltZW91dElkKVxuICAgICAgICAgICAgICBjdXJyZW50VGltZW91dElkID0gbnVsbFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY3VycmVudFRpbWVvdXRJZCA9IHNldFRpbWVvdXQoXG4gICAgICAgICAgICAgIChzZXRBcHBTdGF0ZSwgZm9sZGVkS2V5LCBwcm9jZXNzUXVldWUpID0+IHtcbiAgICAgICAgICAgICAgICBjdXJyZW50VGltZW91dElkID0gbnVsbFxuICAgICAgICAgICAgICAgIHNldEFwcFN0YXRlKHAgPT4ge1xuICAgICAgICAgICAgICAgICAgaWYgKHAubm90aWZpY2F0aW9ucy5jdXJyZW50Py5rZXkgIT09IGZvbGRlZEtleSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcFxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgLi4ucCxcbiAgICAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uczoge1xuICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlOiBwLm5vdGlmaWNhdGlvbnMucXVldWUsXG4gICAgICAgICAgICAgICAgICAgICAgY3VycmVudDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIHByb2Nlc3NRdWV1ZSgpXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGZvbGRlZC50aW1lb3V0TXMgPz8gREVGQVVMVF9USU1FT1VUX01TLFxuICAgICAgICAgICAgICBzZXRBcHBTdGF0ZSxcbiAgICAgICAgICAgICAgZm9sZGVkLmtleSxcbiAgICAgICAgICAgICAgcHJvY2Vzc1F1ZXVlLFxuICAgICAgICAgICAgKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAuLi5wcmV2LFxuICAgICAgICAgICAgICBub3RpZmljYXRpb25zOiB7XG4gICAgICAgICAgICAgICAgY3VycmVudDogZm9sZGVkLFxuICAgICAgICAgICAgICAgIHF1ZXVlOiBwcmV2Lm5vdGlmaWNhdGlvbnMucXVldWUsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gRm9sZCBpbnRvIHF1ZXVlZCBub3RpZmljYXRpb24gaWYga2V5cyBtYXRjaFxuICAgICAgICAgIGNvbnN0IHF1ZXVlSWR4ID0gcHJldi5ub3RpZmljYXRpb25zLnF1ZXVlLmZpbmRJbmRleChcbiAgICAgICAgICAgIF8gPT4gXy5rZXkgPT09IG5vdGlmLmtleSxcbiAgICAgICAgICApXG4gICAgICAgICAgaWYgKHF1ZXVlSWR4ICE9PSAtMSkge1xuICAgICAgICAgICAgY29uc3QgZm9sZGVkID0gbm90aWYuZm9sZChcbiAgICAgICAgICAgICAgcHJldi5ub3RpZmljYXRpb25zLnF1ZXVlW3F1ZXVlSWR4XSEsXG4gICAgICAgICAgICAgIG5vdGlmLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgY29uc3QgbmV3UXVldWUgPSBbLi4ucHJldi5ub3RpZmljYXRpb25zLnF1ZXVlXVxuICAgICAgICAgICAgbmV3UXVldWVbcXVldWVJZHhdID0gZm9sZGVkXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAuLi5wcmV2LFxuICAgICAgICAgICAgICBub3RpZmljYXRpb25zOiB7XG4gICAgICAgICAgICAgICAgY3VycmVudDogcHJldi5ub3RpZmljYXRpb25zLmN1cnJlbnQsXG4gICAgICAgICAgICAgICAgcXVldWU6IG5ld1F1ZXVlLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE9ubHkgYWRkIHRvIHF1ZXVlIGlmIG5vdCBhbHJlYWR5IHByZXNlbnQgKHByZXZlbnQgZHVwbGljYXRlcylcbiAgICAgICAgY29uc3QgcXVldWVkS2V5cyA9IG5ldyBTZXQocHJldi5ub3RpZmljYXRpb25zLnF1ZXVlLm1hcChfID0+IF8ua2V5KSlcbiAgICAgICAgY29uc3Qgc2hvdWxkQWRkID1cbiAgICAgICAgICAhcXVldWVkS2V5cy5oYXMobm90aWYua2V5KSAmJlxuICAgICAgICAgIHByZXYubm90aWZpY2F0aW9ucy5jdXJyZW50Py5rZXkgIT09IG5vdGlmLmtleVxuXG4gICAgICAgIGlmICghc2hvdWxkQWRkKSByZXR1cm4gcHJldlxuXG4gICAgICAgIGNvbnN0IGludmFsaWRhdGVzQ3VycmVudCA9XG4gICAgICAgICAgcHJldi5ub3RpZmljYXRpb25zLmN1cnJlbnQgIT09IG51bGwgJiZcbiAgICAgICAgICBub3RpZi5pbnZhbGlkYXRlcz8uaW5jbHVkZXMocHJldi5ub3RpZmljYXRpb25zLmN1cnJlbnQua2V5KVxuXG4gICAgICAgIGlmIChpbnZhbGlkYXRlc0N1cnJlbnQgJiYgY3VycmVudFRpbWVvdXRJZCkge1xuICAgICAgICAgIGNsZWFyVGltZW91dChjdXJyZW50VGltZW91dElkKVxuICAgICAgICAgIGN1cnJlbnRUaW1lb3V0SWQgPSBudWxsXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLnByZXYsXG4gICAgICAgICAgbm90aWZpY2F0aW9uczoge1xuICAgICAgICAgICAgY3VycmVudDogaW52YWxpZGF0ZXNDdXJyZW50ID8gbnVsbCA6IHByZXYubm90aWZpY2F0aW9ucy5jdXJyZW50LFxuICAgICAgICAgICAgcXVldWU6IFtcbiAgICAgICAgICAgICAgLi4ucHJldi5ub3RpZmljYXRpb25zLnF1ZXVlLmZpbHRlcihcbiAgICAgICAgICAgICAgICBfID0+XG4gICAgICAgICAgICAgICAgICBfLnByaW9yaXR5ICE9PSAnaW1tZWRpYXRlJyAmJlxuICAgICAgICAgICAgICAgICAgIW5vdGlmLmludmFsaWRhdGVzPy5pbmNsdWRlcyhfLmtleSksXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgIG5vdGlmLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICB9XG4gICAgICB9KVxuXG4gICAgICAvLyBQcm9jZXNzIHF1ZXVlIGFmdGVyIGFkZGluZyB0aGUgbm90aWZpY2F0aW9uXG4gICAgICBwcm9jZXNzUXVldWUoKVxuICAgIH0sXG4gICAgW3NldEFwcFN0YXRlLCBwcm9jZXNzUXVldWVdLFxuICApXG5cbiAgY29uc3QgcmVtb3ZlTm90aWZpY2F0aW9uID0gdXNlQ2FsbGJhY2s8UmVtb3ZlTm90aWZpY2F0aW9uRm4+KFxuICAgIChrZXk6IHN0cmluZykgPT4ge1xuICAgICAgc2V0QXBwU3RhdGUocHJldiA9PiB7XG4gICAgICAgIGNvbnN0IGlzQ3VycmVudCA9IHByZXYubm90aWZpY2F0aW9ucy5jdXJyZW50Py5rZXkgPT09IGtleVxuICAgICAgICBjb25zdCBpblF1ZXVlID0gcHJldi5ub3RpZmljYXRpb25zLnF1ZXVlLnNvbWUobiA9PiBuLmtleSA9PT0ga2V5KVxuXG4gICAgICAgIGlmICghaXNDdXJyZW50ICYmICFpblF1ZXVlKSB7XG4gICAgICAgICAgcmV0dXJuIHByZXZcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc0N1cnJlbnQgJiYgY3VycmVudFRpbWVvdXRJZCkge1xuICAgICAgICAgIGNsZWFyVGltZW91dChjdXJyZW50VGltZW91dElkKVxuICAgICAgICAgIGN1cnJlbnRUaW1lb3V0SWQgPSBudWxsXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLnByZXYsXG4gICAgICAgICAgbm90aWZpY2F0aW9uczoge1xuICAgICAgICAgICAgY3VycmVudDogaXNDdXJyZW50ID8gbnVsbCA6IHByZXYubm90aWZpY2F0aW9ucy5jdXJyZW50LFxuICAgICAgICAgICAgcXVldWU6IHByZXYubm90aWZpY2F0aW9ucy5xdWV1ZS5maWx0ZXIobiA9PiBuLmtleSAhPT0ga2V5KSxcbiAgICAgICAgICB9LFxuICAgICAgICB9XG4gICAgICB9KVxuXG4gICAgICBwcm9jZXNzUXVldWUoKVxuICAgIH0sXG4gICAgW3NldEFwcFN0YXRlLCBwcm9jZXNzUXVldWVdLFxuICApXG5cbiAgLy8gUHJvY2VzcyBxdWV1ZSBvbiBtb3VudCBpZiB0aGVyZSBhcmUgbm90aWZpY2F0aW9ucyBpbiB0aGUgaW5pdGlhbCBzdGF0ZS5cbiAgLy8gSW1wZXJhdGl2ZSByZWFkIChub3QgdXNlQXBwU3RhdGUpIOKAlCBhIHN1YnNjcmlwdGlvbiBpbiBhIG1vdW50LW9ubHlcbiAgLy8gZWZmZWN0IHdvdWxkIGJlIHZlc3RpZ2lhbCBhbmQgbWFrZSBldmVyeSBjYWxsZXIgcmUtcmVuZGVyIG9uIHF1ZXVlIGNoYW5nZXMuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHNcbiAgLy8gYmlvbWUtaWdub3JlIGxpbnQvY29ycmVjdG5lc3MvdXNlRXhoYXVzdGl2ZURlcGVuZGVuY2llczogbW91bnQtb25seSBlZmZlY3QsIHN0b3JlIGlzIGEgc3RhYmxlIGNvbnRleHQgcmVmXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHN0b3JlLmdldFN0YXRlKCkubm90aWZpY2F0aW9ucy5xdWV1ZS5sZW5ndGggPiAwKSB7XG4gICAgICBwcm9jZXNzUXVldWUoKVxuICAgIH1cbiAgfSwgW10pXG5cbiAgcmV0dXJuIHsgYWRkTm90aWZpY2F0aW9uLCByZW1vdmVOb3RpZmljYXRpb24gfVxufVxuXG5jb25zdCBQUklPUklUSUVTOiBSZWNvcmQ8UHJpb3JpdHksIG51bWJlcj4gPSB7XG4gIGltbWVkaWF0ZTogMCxcbiAgaGlnaDogMSxcbiAgbWVkaXVtOiAyLFxuICBsb3c6IDMsXG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0TmV4dChxdWV1ZTogTm90aWZpY2F0aW9uW10pOiBOb3RpZmljYXRpb24gfCB1bmRlZmluZWQge1xuICBpZiAocXVldWUubGVuZ3RoID09PSAwKSByZXR1cm4gdW5kZWZpbmVkXG4gIHJldHVybiBxdWV1ZS5yZWR1Y2UoKG1pbiwgbikgPT5cbiAgICBQUklPUklUSUVTW24ucHJpb3JpdHldIDwgUFJJT1JJVElFU1ttaW4ucHJpb3JpdHldID8gbiA6IG1pbixcbiAgKVxufVxuIl0sIm1hcHBpbmdzIjoiQUFBQSxZQUFZLEtBQUtBLEtBQUssTUFBTSxPQUFPO0FBQ25DLFNBQVNDLFdBQVcsRUFBRUMsU0FBUyxRQUFRLE9BQU87QUFDOUMsU0FBU0MsZ0JBQWdCLEVBQUVDLGNBQWMsUUFBUSx1QkFBdUI7QUFDeEUsY0FBY0MsS0FBSyxRQUFRLG1CQUFtQjtBQUU5QyxLQUFLQyxRQUFRLEdBQUcsS0FBSyxHQUFHLFFBQVEsR0FBRyxNQUFNLEdBQUcsV0FBVztBQUV2RCxLQUFLQyxnQkFBZ0IsR0FBRztFQUN0QkMsR0FBRyxFQUFFLE1BQU07RUFDWDtBQUNGO0FBQ0E7QUFDQTtBQUNBO0VBQ0VDLFdBQVcsQ0FBQyxFQUFFLE1BQU0sRUFBRTtFQUN0QkMsUUFBUSxFQUFFSixRQUFRO0VBQ2xCSyxTQUFTLENBQUMsRUFBRSxNQUFNO0VBQ2xCO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNFQyxJQUFJLENBQUMsRUFBRSxDQUFDQyxXQUFXLEVBQUVDLFlBQVksRUFBRUMsUUFBUSxFQUFFRCxZQUFZLEVBQUUsR0FBR0EsWUFBWTtBQUM1RSxDQUFDO0FBRUQsS0FBS0UsZ0JBQWdCLEdBQUdULGdCQUFnQixHQUFHO0VBQ3pDVSxJQUFJLEVBQUUsTUFBTTtFQUNaQyxLQUFLLENBQUMsRUFBRSxNQUFNYixLQUFLO0FBQ3JCLENBQUM7QUFFRCxLQUFLYyxlQUFlLEdBQUdaLGdCQUFnQixHQUFHO0VBQ3hDYSxHQUFHLEVBQUVwQixLQUFLLENBQUNxQixTQUFTO0FBQ3RCLENBQUM7QUFFRCxLQUFLQyxpQkFBaUIsR0FBRyxDQUFDQyxPQUFPLEVBQUVULFlBQVksRUFBRSxHQUFHLElB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
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import { c as _c } from "react/compiler-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* Overlay tracking for Escape key coordination.
|
|
4
|
+
*
|
|
5
|
+
* This solves the problem of escape key handling when overlays (like Select with onCancel)
|
|
6
|
+
* are open. The CancelRequestHandler needs to know when an overlay is active so it doesn't
|
|
7
|
+
* cancel requests when the user just wants to dismiss the overlay.
|
|
8
|
+
*
|
|
9
|
+
* Usage:
|
|
10
|
+
* 1. Call useRegisterOverlay() in any overlay component to automatically register it
|
|
11
|
+
* 2. Call useIsOverlayActive() to check if any overlay is currently active
|
|
12
|
+
*
|
|
13
|
+
* The hook automatically registers on mount and unregisters on unmount,
|
|
14
|
+
* so no manual cleanup or state management is needed.
|
|
15
|
+
*/
|
|
16
|
+
import { useContext, useEffect, useLayoutEffect } from 'react';
|
|
17
|
+
import instances from '@/ink/instances.js';
|
|
18
|
+
import { AppStoreContext, useAppState } from '@/state/AppState.js';
|
|
19
|
+
|
|
20
|
+
// Non-modal overlays that shouldn't disable TextInput focus
|
|
21
|
+
const NON_MODAL_OVERLAYS = new Set(['autocomplete']);
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Hook to register a component as an active overlay.
|
|
25
|
+
* Automatically registers on mount and unregisters on unmount.
|
|
26
|
+
*
|
|
27
|
+
* @param id - Unique identifier for this overlay (e.g., 'select', 'multi-select')
|
|
28
|
+
* @param enabled - Whether to register (default: true). Use this to conditionally register
|
|
29
|
+
* based on component props, e.g., only register when onCancel is provided.
|
|
30
|
+
*
|
|
31
|
+
* @example
|
|
32
|
+
* // Conditional registration based on whether cancel is supported
|
|
33
|
+
* function useSelectInput({ state }) {
|
|
34
|
+
* useRegisterOverlay('select', !!state.onCancel)
|
|
35
|
+
* // ...
|
|
36
|
+
* }
|
|
37
|
+
*/
|
|
38
|
+
export function useRegisterOverlay(id: string, t0?: boolean) {
|
|
39
|
+
const $ = _c(8);
|
|
40
|
+
const enabled = t0 === undefined ? true : t0;
|
|
41
|
+
const store = useContext(AppStoreContext);
|
|
42
|
+
const setAppState = store?.setState;
|
|
43
|
+
let t1;
|
|
44
|
+
let t2;
|
|
45
|
+
if ($[0] !== enabled || $[1] !== id || $[2] !== setAppState) {
|
|
46
|
+
t1 = () => {
|
|
47
|
+
if (!enabled || !setAppState) {
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
setAppState(prev => {
|
|
51
|
+
if (prev.activeOverlays.has(id)) {
|
|
52
|
+
return prev;
|
|
53
|
+
}
|
|
54
|
+
const next = new Set(prev.activeOverlays);
|
|
55
|
+
next.add(id);
|
|
56
|
+
return {
|
|
57
|
+
...prev,
|
|
58
|
+
activeOverlays: next
|
|
59
|
+
};
|
|
60
|
+
});
|
|
61
|
+
return () => {
|
|
62
|
+
setAppState(prev_0 => {
|
|
63
|
+
if (!prev_0.activeOverlays.has(id)) {
|
|
64
|
+
return prev_0;
|
|
65
|
+
}
|
|
66
|
+
const next_0 = new Set(prev_0.activeOverlays);
|
|
67
|
+
next_0.delete(id);
|
|
68
|
+
return {
|
|
69
|
+
...prev_0,
|
|
70
|
+
activeOverlays: next_0
|
|
71
|
+
};
|
|
72
|
+
});
|
|
73
|
+
};
|
|
74
|
+
};
|
|
75
|
+
t2 = [id, enabled, setAppState];
|
|
76
|
+
$[0] = enabled;
|
|
77
|
+
$[1] = id;
|
|
78
|
+
$[2] = setAppState;
|
|
79
|
+
$[3] = t1;
|
|
80
|
+
$[4] = t2;
|
|
81
|
+
} else {
|
|
82
|
+
t1 = $[3];
|
|
83
|
+
t2 = $[4];
|
|
84
|
+
}
|
|
85
|
+
useEffect(t1, t2);
|
|
86
|
+
let t3;
|
|
87
|
+
let t4;
|
|
88
|
+
if ($[5] !== enabled) {
|
|
89
|
+
t3 = () => {
|
|
90
|
+
if (!enabled) {
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
return _temp;
|
|
94
|
+
};
|
|
95
|
+
t4 = [enabled];
|
|
96
|
+
$[5] = enabled;
|
|
97
|
+
$[6] = t3;
|
|
98
|
+
$[7] = t4;
|
|
99
|
+
} else {
|
|
100
|
+
t3 = $[6];
|
|
101
|
+
t4 = $[7];
|
|
102
|
+
}
|
|
103
|
+
useLayoutEffect(t3, t4);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Hook to check if any overlay is currently active.
|
|
108
|
+
* This is reactive - the component will re-render when the overlay state changes.
|
|
109
|
+
*
|
|
110
|
+
* @returns true if any overlay is currently active
|
|
111
|
+
*
|
|
112
|
+
* @example
|
|
113
|
+
* function CancelRequestHandler() {
|
|
114
|
+
* const isOverlayActive = useIsOverlayActive()
|
|
115
|
+
* const isActive = !isOverlayActive && canCancelRunningTask
|
|
116
|
+
* useKeybinding('chat:cancel', handleCancel, { isActive })
|
|
117
|
+
* }
|
|
118
|
+
*/
|
|
119
|
+
function _temp() {
|
|
120
|
+
return instances.get(process.stdout)?.invalidatePrevFrame();
|
|
121
|
+
}
|
|
122
|
+
export function useIsOverlayActive() {
|
|
123
|
+
return useAppState(_temp2);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Hook to check if any modal overlay is currently active.
|
|
128
|
+
* Modal overlays are overlays that should capture all input (like Select dialogs).
|
|
129
|
+
* Non-modal overlays (like autocomplete) don't disable TextInput focus.
|
|
130
|
+
*
|
|
131
|
+
* @returns true if any modal overlay is currently active
|
|
132
|
+
*
|
|
133
|
+
* @example
|
|
134
|
+
* // Use for TextInput focus - allows typing during autocomplete
|
|
135
|
+
* focus: !isSearchingHistory && !isModalOverlayActive
|
|
136
|
+
*/
|
|
137
|
+
function _temp2(s) {
|
|
138
|
+
return s.activeOverlays.size > 0;
|
|
139
|
+
}
|
|
140
|
+
export function useIsModalOverlayActive() {
|
|
141
|
+
return useAppState(_temp3);
|
|
142
|
+
}
|
|
143
|
+
function _temp3(s) {
|
|
144
|
+
for (const id of s.activeOverlays) {
|
|
145
|
+
if (!NON_MODAL_OVERLAYS.has(id)) {
|
|
146
|
+
return true;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
return false;
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ1c2VDb250ZXh0IiwidXNlRWZmZWN0IiwidXNlTGF5b3V0RWZmZWN0IiwiaW5zdGFuY2VzIiwiQXBwU3RvcmVDb250ZXh0IiwidXNlQXBwU3RhdGUiLCJOT05fTU9EQUxfT1ZFUkxBWVMiLCJTZXQiLCJ1c2VSZWdpc3Rlck92ZXJsYXkiLCJpZCIsInQwIiwiJCIsIl9jIiwiZW5hYmxlZCIsInVuZGVmaW5lZCIsInN0b3JlIiwic2V0QXBwU3RhdGUiLCJzZXRTdGF0ZSIsInQxIiwidDIiLCJwcmV2IiwiYWN0aXZlT3ZlcmxheXMiLCJoYXMiLCJuZXh0IiwiYWRkIiwicHJldl8wIiwibmV4dF8wIiwiZGVsZXRlIiwidDMiLCJ0NCIsIl90ZW1wIiwiZ2V0IiwicHJvY2VzcyIsInN0ZG91dCIsImludmFsaWRhdGVQcmV2RnJhbWUiLCJ1c2VJc092ZXJsYXlBY3RpdmUiLCJfdGVtcDIiLCJzIiwic2l6ZSIsInVzZUlzTW9kYWxPdmVybGF5QWN0aXZlIiwiX3RlbXAzIl0sInNvdXJjZXMiOlsib3ZlcmxheUNvbnRleHQudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogT3ZlcmxheSB0cmFja2luZyBmb3IgRXNjYXBlIGtleSBjb29yZGluYXRpb24uXG4gKlxuICogVGhpcyBzb2x2ZXMgdGhlIHByb2JsZW0gb2YgZXNjYXBlIGtleSBoYW5kbGluZyB3aGVuIG92ZXJsYXlzIChsaWtlIFNlbGVjdCB3aXRoIG9uQ2FuY2VsKVxuICogYXJlIG9wZW4uIFRoZSBDYW5jZWxSZXF1ZXN0SGFuZGxlciBuZWVkcyB0byBrbm93IHdoZW4gYW4gb3ZlcmxheSBpcyBhY3RpdmUgc28gaXQgZG9lc24ndFxuICogY2FuY2VsIHJlcXVlc3RzIHdoZW4gdGhlIHVzZXIganVzdCB3YW50cyB0byBkaXNtaXNzIHRoZSBvdmVybGF5LlxuICpcbiAqIFVzYWdlOlxuICogMS4gQ2FsbCB1c2VSZWdpc3Rlck92ZXJsYXkoKSBpbiBhbnkgb3ZlcmxheSBjb21wb25lbnQgdG8gYXV0b21hdGljYWxseSByZWdpc3RlciBpdFxuICogMi4gQ2FsbCB1c2VJc092ZXJsYXlBY3RpdmUoKSB0byBjaGVjayBpZiBhbnkgb3ZlcmxheSBpcyBjdXJyZW50bHkgYWN0aXZlXG4gKlxuICogVGhlIGhvb2sgYXV0b21hdGljYWxseSByZWdpc3RlcnMgb24gbW91bnQgYW5kIHVucmVnaXN0ZXJzIG9uIHVubW91bnQsXG4gKiBzbyBubyBtYW51YWwgY2xlYW51cCBvciBzdGF0ZSBtYW5hZ2VtZW50IGlzIG5lZWRlZC5cbiAqL1xuaW1wb3J0IHsgdXNlQ29udGV4dCwgdXNlRWZmZWN0LCB1c2VMYXlvdXRFZmZlY3QgfSBmcm9tICdyZWFjdCdcbmltcG9ydCBpbnN0YW5jZXMgZnJvbSAnLi4vaW5rL2luc3RhbmNlcy5qcydcbmltcG9ydCB7IEFwcFN0b3JlQ29udGV4dCwgdXNlQXBwU3RhdGUgfSBmcm9tICcuLi9zdGF0ZS9BcHBTdGF0ZS5qcydcblxuLy8gTm9uLW1vZGFsIG92ZXJsYXlzIHRoYXQgc2hvdWxkbid0IGRpc2FibGUgVGV4dElucHV0IGZvY3VzXG5jb25zdCBOT05fTU9EQUxfT1ZFUkxBWVMgPSBuZXcgU2V0KFsnYXV0b2NvbXBsZXRlJ10pXG5cbi8qKlxuICogSG9vayB0byByZWdpc3RlciBhIGNvbXBvbmVudCBhcyBhbiBhY3RpdmUgb3ZlcmxheS5cbiAqIEF1dG9tYXRpY2FsbHkgcmVnaXN0ZXJzIG9uIG1vdW50IGFuZCB1bnJlZ2lzdGVycyBvbiB1bm1vdW50LlxuICpcbiAqIEBwYXJhbSBpZCAtIFVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIG92ZXJsYXkgKGUuZy4sICdzZWxlY3QnLCAnbXVsdGktc2VsZWN0JylcbiAqIEBwYXJhbSBlbmFibGVkIC0gV2hldGhlciB0byByZWdpc3RlciAoZGVmYXVsdDogdHJ1ZSkuIFVzZSB0aGlzIHRvIGNvbmRpdGlvbmFsbHkgcmVnaXN0ZXJcbiAqICAgICAgICAgICAgICAgICAgYmFzZWQgb24gY29tcG9uZW50IHByb3BzLCBlLmcuLCBvbmx5IHJlZ2lzdGVyIHdoZW4gb25DYW5jZWwgaXMgcHJvdmlkZWQuXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIENvbmRpdGlvbmFsIHJlZ2lzdHJhdGlvbiBiYXNlZCBvbiB3aGV0aGVyIGNhbmNlbCBpcyBzdXBwb3J0ZWRcbiAqIGZ1bmN0aW9uIHVzZVNlbGVjdElucHV0KHsgc3RhdGUgfSkge1xuICogICB1c2VSZWdpc3Rlck92ZXJsYXkoJ3NlbGVjdCcsICEhc3RhdGUub25DYW5jZWwpXG4gKiAgIC8vIC4uLlxuICogfVxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlUmVnaXN0ZXJPdmVybGF5KGlkOiBzdHJpbmcsIGVuYWJsZWQgPSB0cnVlKTogdm9pZCB7XG4gIC8vIFVzZSBjb250ZXh0IGRpcmVjdGx5IHNvIHRoaXMgaXMgYSBuby1vcCB3aGVuIHJlbmRlcmVkIG91dHNpZGUgQXBwU3RhdGVQcm92aWRlclxuICAvLyAoZS5nLiwgaW4gaXNvbGF0ZWQgY29tcG9uZW50IHRlc3RzIHRoYXQgZG9uJ3QgbmVlZCB0aGUgZnVsbCBhcHAgc3RhdGUgdHJlZSkuXG4gIGNvbnN0IHN0b3JlID0gdXNlQ29udGV4dChBcHBTdG9yZUNvbnRleHQpXG4gIGNvbnN0IHNldEFwcFN0YXRlID0gc3RvcmU/LnNldFN0YXRlXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFlbmFibGVkIHx8ICFzZXRBcHBTdGF0ZSkgcmV0dXJuXG4gICAgc2V0QXBwU3RhdGUocHJldiA9PiB7XG4gICAgICBpZiAocHJldi5hY3RpdmVPdmVybGF5cy5oYXMoaWQpKSByZXR1cm4gcHJldlxuICAgICAgY29uc3QgbmV4dCA9IG5ldyBTZXQocHJldi5hY3RpdmVPdmVybGF5cylcbiAgICAgIG5leHQuYWRkKGlkKVxuICAgICAgcmV0dXJuIHsgLi4ucHJldiwgYWN0aXZlT3ZlcmxheXM6IG5leHQgfVxuICAgIH0pXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHNldEFwcFN0YXRlKHByZXYgPT4ge1xuICAgICAgICBpZiAoIXByZXYuYWN0aXZlT3ZlcmxheXMuaGFzKGlkKSkgcmV0dXJuIHByZXZcbiAgICAgICAgY29uc3QgbmV4dCA9IG5ldyBTZXQocHJldi5hY3RpdmVPdmVybGF5cylcbiAgICAgICAgbmV4dC5kZWxldGUoaWQpXG4gICAgICAgIHJldHVybiB7IC4uLnByZXYsIGFjdGl2ZU92ZXJsYXlzOiBuZXh0IH1cbiAgICAgIH0pXG4gICAgfVxuICB9LCBbaWQsIGVuYWJsZWQsIHNldEFwcFN0YXRlXSlcblxuICAvLyBPbiBvdmVybGF5IGNsb3NlLCBmb3JjZSB0aGUgbmV4dCByZW5kZXIgdG8gZnVsbC1kYW1hZ2UgZGlmZiBpbnN0ZWFkXG4gIC8vIG9mIGJsaXQuIEEgdGFsbCBvdmVybGF5IChlLmcuIEZ1enp5UGlja2VyIHdpdGggYSAyMC1saW5lIHByZXZpZXcpXG4gIC8vIHNocmlua3MgdGhlIEluay1tYW5hZ2VkIHJlZ2lvbiBvbiB1bm1vdW50OyB0aGUgYmxpdCBmYXN0IHBhdGggY2FuXG4gIC8vIGNvcHkgc3RhbGUgY2VsbHMgZnJvbSB0aGUgb3ZlcmxheSdzIHByZXZpb3VzIGZyYW1lIGludG8gcm93cyB0aGVcbiAgLy8gc2hvcnRlciBsYXlvdXQgbm8gbG9uZ2VyIHJlYWNoZXMsIGxlYXZpbmcgYSBnaG9zdCB0aXRsZS9kaXZpZGVyLlxuICAvLyB1c2VMYXlvdXRFZmZlY3Qgc28gY2xlYW51cCBydW5zIHN5bmNocm9ub3VzbHkgYmVmb3JlIHRoZSBtaWNyb3Rhc2stXG4gIC8vIGRlZmVycmVkIG9uUmVuZGVyIChzY2hlZHVsZVJlbmRlciBxdWV1ZXMgYSBtaWNyb3Rhc2sgZnJvbVxuICAvLyByZXNldEFmdGVyQ29tbWl0OyBwYXNzaXZlLWVmZmVjdCBjbGVhbnVwIHdvdWxkIGxhbmQgYWZ0ZXIgaXQpLlxuICB1c2VMYXlvdXRFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghZW5hYmxlZCkgcmV0dXJuXG4gICAgcmV0dXJuICgpID0+IGluc3RhbmNlcy5nZXQocHJvY2Vzcy5zdGRvdXQpPy5pbnZhbGlkYXRlUHJldkZyYW1lKClcbiAgfSwgW2VuYWJsZWRdKVxufVxuXG4vKipcbiAqIEhvb2sgdG8gY2hlY2sgaWYgYW55IG92ZXJsYXkgaXMgY3VycmVudGx5IGFjdGl2ZS5cbiAqIFRoaXMgaXMgcmVhY3RpdmUgLSB0aGUgY29tcG9uZW50IHdpbGwgcmUtcmVuZGVyIHdoZW4gdGhlIG92ZXJsYXkgc3RhdGUgY2hhbmdlcy5cbiAqXG4gKiBAcmV0dXJucyB0cnVlIGlmIGFueSBvdmVybGF5IGlzIGN1cnJlbnRseSBhY3RpdmVcbiAqXG4gKiBAZXhhbXBsZVxuICogZnVuY3Rpb24gQ2FuY2VsUmVxdWVzdEhhbmRsZXIoKSB7XG4gKiAgIGNvbnN0IGlzT3ZlcmxheUFjdGl2ZSA9IHVzZUlzT3ZlcmxheUFjdGl2ZSgpXG4gKiAgIGNvbnN0IGlzQWN0aXZlID0gIWlzT3ZlcmxheUFjdGl2ZSAmJiBjYW5DYW5jZWxSdW5uaW5nVGFza1xuICogICB1c2VLZXliaW5kaW5nKCdjaGF0OmNhbmNlbCcsIGhhbmRsZUNhbmNlbCwgeyBpc0FjdGl2ZSB9KVxuICogfVxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlSXNPdmVybGF5QWN0aXZlKCk6IGJvb2xlYW4ge1xuICByZXR1cm4gdXNlQXBwU3RhdGUocyA9PiBzLmFjdGl2ZU92ZXJsYXlzLnNpemUgPiAwKVxufVxuXG4vKipcbiAqIEhvb2sgdG8gY2hlY2sgaWYgYW55IG1vZGFsIG92ZXJsYXkgaXMgY3VycmVudGx5IGFjdGl2ZS5cbiAqIE1vZGFsIG92ZXJsYXlzIGFyZSBvdmVybGF5cyB0aGF0IHNob3VsZCBjYXB0dXJlIGFsbCBpbnB1dCAobGlrZSBTZWxlY3QgZGlhbG9ncykuXG4gKiBOb24tbW9kYWwgb3ZlcmxheXMgKGxpa2UgYXV0b2NvbXBsZXRlKSBkb24ndCBkaXNhYmxlIFRleHRJbnB1dCBmb2N1cy5cbiAqXG4gKiBAcmV0dXJucyB0cnVlIGlmIGFueSBtb2RhbCBvdmVybGF5IGlzIGN1cnJlbnRseSBhY3RpdmVcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gVXNlIGZvciBUZXh0SW5wdXQgZm9jdXMgLSBhbGxvd3MgdHlwaW5nIGR1cmluZyBhdXRvY29tcGxldGVcbiAqIGZvY3VzOiAhaXNTZWFyY2hpbmdIaXN0b3J5ICYmICFpc01vZGFsT3ZlcmxheUFjdGl2ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlSXNNb2RhbE92ZXJsYXlBY3RpdmUoKTogYm9vbGVhbiB7XG4gIHJldHVybiB1c2VBcHBTdGF0ZShzID0+IHtcbiAgICBmb3IgKGNvbnN0IGlkIG9mIHMuYWN0aXZlT3ZlcmxheXMpIHtcbiAgICAgIGlmICghTk9OX01PREFMX09WRVJMQVlTLmhhcyhpZCkpIHJldHVybiB0cnVlXG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9KVxufVxuIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVNBLFVBQVUsRUFBRUMsU0FBUyxFQUFFQyxlQUFlLFFBQVEsT0FBTztBQUM5RCxPQUFPQyxTQUFTLE1BQU0scUJBQXFCO0FBQzNDLFNBQVNDLGVBQWUsRUFBRUMsV0FBVyxRQUFRLHNCQUFzQjs7QUFFbkU7QUFDQSxNQUFNQyxrQkFBa0IsR0FBRyxJQUFJQyxHQUFHLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQzs7QUFFcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTyxTQUFBQyxtQkFBQUMsRUFBQSxFQUFBQyxFQUFBO0VBQUEsTUFBQUMsQ0FBQSxHQUFBQyxFQUFBO0VBQXdDLE1BQUFDLE9BQUEsR0FBQUgsRUFBYyxLQUFkSSxTQUFjLEdBQWQsSUFBYyxHQUFkSixFQUFjO0VBRzNELE1BQUFLLEtBQUEsR0FBY2YsVUFBVSxDQUFDSSxlQUFlLENBQUM7RUFDekMsTUFBQVksV0FBQSxHQUFvQkQsS0FBSyxFQUFBRSxRQUFVO0VBQUEsSUFBQUMsRUFBQTtFQUFBLElB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
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { c as _c } from "react/compiler-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* Portal for content that floats above the prompt so it escapes
|
|
4
|
+
* FullscreenLayout's bottom-slot `overflowY:hidden` clip.
|
|
5
|
+
*
|
|
6
|
+
* The clip is load-bearing (CC-668: tall pastes squash the ScrollBox
|
|
7
|
+
* without it), but floating overlays use `position:absolute
|
|
8
|
+
* bottom="100%"` to float above the prompt — and Ink's clip stack
|
|
9
|
+
* intersects ALL descendants, so they were clipped to ~1 row.
|
|
10
|
+
*
|
|
11
|
+
* Two channels:
|
|
12
|
+
* - `useSetPromptOverlay` — slash-command suggestion data (structured,
|
|
13
|
+
* written by PromptInputFooter)
|
|
14
|
+
* - `useSetPromptOverlayDialog` — arbitrary dialog node (e.g.
|
|
15
|
+
* AutoModeOptInDialog, written by PromptInput)
|
|
16
|
+
*
|
|
17
|
+
* FullscreenLayout reads both and renders them outside the clipped slot.
|
|
18
|
+
*
|
|
19
|
+
* Split into data/setter context pairs so writers never re-render on
|
|
20
|
+
* their own writes — the setter contexts are stable.
|
|
21
|
+
*/
|
|
22
|
+
import React, { createContext, type ReactNode, useContext, useEffect, useState } from 'react';
|
|
23
|
+
import type { SuggestionItem } from '../components/PromptInput/PromptInputFooterSuggestions.js';
|
|
24
|
+
export type PromptOverlayData = {
|
|
25
|
+
suggestions: SuggestionItem[];
|
|
26
|
+
selectedSuggestion: number;
|
|
27
|
+
maxColumnWidth?: number;
|
|
28
|
+
};
|
|
29
|
+
type Setter<T> = (d: T | null) => void;
|
|
30
|
+
const DataContext = createContext<PromptOverlayData | null>(null);
|
|
31
|
+
const SetContext = createContext<Setter<PromptOverlayData> | null>(null);
|
|
32
|
+
const DialogContext = createContext<ReactNode>(null);
|
|
33
|
+
const SetDialogContext = createContext<Setter<ReactNode> | null>(null);
|
|
34
|
+
export function PromptOverlayProvider(t0) {
|
|
35
|
+
const $ = _c(6);
|
|
36
|
+
const {
|
|
37
|
+
children
|
|
38
|
+
} = t0;
|
|
39
|
+
const [data, setData] = useState(null);
|
|
40
|
+
const [dialog, setDialog] = useState(null);
|
|
41
|
+
let t1;
|
|
42
|
+
if ($[0] !== children || $[1] !== dialog) {
|
|
43
|
+
t1 = <DialogContext.Provider value={dialog}>{children}</DialogContext.Provider>;
|
|
44
|
+
$[0] = children;
|
|
45
|
+
$[1] = dialog;
|
|
46
|
+
$[2] = t1;
|
|
47
|
+
} else {
|
|
48
|
+
t1 = $[2];
|
|
49
|
+
}
|
|
50
|
+
let t2;
|
|
51
|
+
if ($[3] !== data || $[4] !== t1) {
|
|
52
|
+
t2 = <SetContext.Provider value={setData}><SetDialogContext.Provider value={setDialog}><DataContext.Provider value={data}>{t1}</DataContext.Provider></SetDialogContext.Provider></SetContext.Provider>;
|
|
53
|
+
$[3] = data;
|
|
54
|
+
$[4] = t1;
|
|
55
|
+
$[5] = t2;
|
|
56
|
+
} else {
|
|
57
|
+
t2 = $[5];
|
|
58
|
+
}
|
|
59
|
+
return t2;
|
|
60
|
+
}
|
|
61
|
+
export function usePromptOverlay() {
|
|
62
|
+
return useContext(DataContext);
|
|
63
|
+
}
|
|
64
|
+
export function usePromptOverlayDialog() {
|
|
65
|
+
return useContext(DialogContext);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Register suggestion data for the floating overlay. Clears on unmount.
|
|
70
|
+
* No-op outside the provider (non-fullscreen renders inline instead).
|
|
71
|
+
*/
|
|
72
|
+
export function useSetPromptOverlay(data) {
|
|
73
|
+
const $ = _c(4);
|
|
74
|
+
const set = useContext(SetContext);
|
|
75
|
+
let t0;
|
|
76
|
+
let t1;
|
|
77
|
+
if ($[0] !== data || $[1] !== set) {
|
|
78
|
+
t0 = () => {
|
|
79
|
+
if (!set) {
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
set(data);
|
|
83
|
+
return () => set(null);
|
|
84
|
+
};
|
|
85
|
+
t1 = [set, data];
|
|
86
|
+
$[0] = data;
|
|
87
|
+
$[1] = set;
|
|
88
|
+
$[2] = t0;
|
|
89
|
+
$[3] = t1;
|
|
90
|
+
} else {
|
|
91
|
+
t0 = $[2];
|
|
92
|
+
t1 = $[3];
|
|
93
|
+
}
|
|
94
|
+
useEffect(t0, t1);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Register a dialog node to float above the prompt. Clears on unmount.
|
|
99
|
+
* No-op outside the provider (non-fullscreen renders inline instead).
|
|
100
|
+
*/
|
|
101
|
+
export function useSetPromptOverlayDialog(node) {
|
|
102
|
+
const $ = _c(4);
|
|
103
|
+
const set = useContext(SetDialogContext);
|
|
104
|
+
let t0;
|
|
105
|
+
let t1;
|
|
106
|
+
if ($[0] !== node || $[1] !== set) {
|
|
107
|
+
t0 = () => {
|
|
108
|
+
if (!set) {
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
set(node);
|
|
112
|
+
return () => set(null);
|
|
113
|
+
};
|
|
114
|
+
t1 = [set, node];
|
|
115
|
+
$[0] = node;
|
|
116
|
+
$[1] = set;
|
|
117
|
+
$[2] = t0;
|
|
118
|
+
$[3] = t1;
|
|
119
|
+
} else {
|
|
120
|
+
t0 = $[2];
|
|
121
|
+
t1 = $[3];
|
|
122
|
+
}
|
|
123
|
+
useEffect(t0, t1);
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsImNyZWF0ZUNvbnRleHQiLCJSZWFjdE5vZGUiLCJ1c2VDb250ZXh0IiwidXNlRWZmZWN0IiwidXNlU3RhdGUiLCJTdWdnZXN0aW9uSXRlbSIsIlByb21wdE92ZXJsYXlEYXRhIiwic3VnZ2VzdGlvbnMiLCJzZWxlY3RlZFN1Z2dlc3Rpb24iLCJtYXhDb2x1bW5XaWR0aCIsIlNldHRlciIsImQiLCJUIiwiRGF0YUNvbnRleHQiLCJTZXRDb250ZXh0IiwiRGlhbG9nQ29udGV4dCIsIlNldERpYWxvZ0NvbnRleHQiLCJQcm9tcHRPdmVybGF5UHJvdmlkZXIiLCJ0MCIsIiQiLCJfYyIsImNoaWxkcmVuIiwiZGF0YSIsInNldERhdGEiLCJkaWFsb2ciLCJzZXREaWFsb2ciLCJ0MSIsInQyIiwidXNlUHJvbXB0T3ZlcmxheSIsInVzZVByb21wdE92ZXJsYXlEaWFsb2ciLCJ1c2VTZXRQcm9tcHRPdmVybGF5Iiwic2V0IiwidXNlU2V0UHJvbXB0T3ZlcmxheURpYWxvZyIsIm5vZGUiXSwic291cmNlcyI6WyJwcm9tcHRPdmVybGF5Q29udGV4dC50c3giXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBQb3J0YWwgZm9yIGNvbnRlbnQgdGhhdCBmbG9hdHMgYWJvdmUgdGhlIHByb21wdCBzbyBpdCBlc2NhcGVzXG4gKiBGdWxsc2NyZWVuTGF5b3V0J3MgYm90dG9tLXNsb3QgYG92ZXJmbG93WTpoaWRkZW5gIGNsaXAuXG4gKlxuICogVGhlIGNsaXAgaXMgbG9hZC1iZWFyaW5nIChDQy02Njg6IHRhbGwgcGFzdGVzIHNxdWFzaCB0aGUgU2Nyb2xsQm94XG4gKiB3aXRob3V0IGl0KSwgYnV0IGZsb2F0aW5nIG92ZXJsYXlzIHVzZSBgcG9zaXRpb246YWJzb2x1dGVcbiAqIGJvdHRvbT1cIjEwMCVcImAgdG8gZmxvYXQgYWJvdmUgdGhlIHByb21wdCDigJQgYW5kIEluaydzIGNsaXAgc3RhY2tcbiAqIGludGVyc2VjdHMgQUxMIGRlc2NlbmRhbnRzLCBzbyB0aGV5IHdlcmUgY2xpcHBlZCB0byB+MSByb3cuXG4gKlxuICogVHdvIGNoYW5uZWxzOlxuICogLSBgdXNlU2V0UHJvbXB0T3ZlcmxheWAg4oCUIHNsYXNoLWNvbW1hbmQgc3VnZ2VzdGlvbiBkYXRhIChzdHJ1Y3R1cmVkLFxuICogICB3cml0dGVuIGJ5IFByb21wdElucHV0Rm9vdGVyKVxuICogLSBgdXNlU2V0UHJvbXB0T3ZlcmxheURpYWxvZ2Ag4oCUIGFyYml0cmFyeSBkaWFsb2cgbm9kZSAoZS5nLlxuICogICBBdXRvTW9kZU9wdEluRGlhbG9nLCB3cml0dGVuIGJ5IFByb21wdElucHV0KVxuICpcbiAqIEZ1bGxzY3JlZW5MYXlvdXQgcmVhZHMgYm90aCBhbmQgcmVuZGVycyB0aGVtIG91dHNpZGUgdGhlIGNsaXBwZWQgc2xvdC5cbiAqXG4gKiBTcGxpdCBpbnRvIGRhdGEvc2V0dGVyIGNvbnRleHQgcGFpcnMgc28gd3JpdGVycyBuZXZlciByZS1yZW5kZXIgb25cbiAqIHRoZWlyIG93biB3cml0ZXMg4oCUIHRoZSBzZXR0ZXIgY29udGV4dHMgYXJlIHN0YWJsZS5cbiAqL1xuaW1wb3J0IFJlYWN0LCB7XG4gIGNyZWF0ZUNvbnRleHQsXG4gIHR5cGUgUmVhY3ROb2RlLFxuICB1c2VDb250ZXh0LFxuICB1c2VFZmZlY3QsXG4gIHVzZVN0YXRlLFxufSBmcm9tICdyZWFjdCdcbmltcG9ydCB0eXBlIHsgU3VnZ2VzdGlvbkl0ZW0gfSBmcm9tICcuLi9jb21wb25lbnRzL1Byb21wdElucHV0L1Byb21wdElucHV0Rm9vdGVyU3VnZ2VzdGlvbnMuanMnXG5cbmV4cG9ydCB0eXBlIFByb21wdE92ZXJsYXlEYXRhID0ge1xuICBzdWdnZXN0aW9uczogU3VnZ2VzdGlvbkl0ZW1bXVxuICBzZWxlY3RlZFN1Z2dlc3Rpb246IG51bWJlclxuICBtYXhDb2x1bW5XaWR0aD86IG51bWJlclxufVxuXG50eXBlIFNldHRlcjxUPiA9IChkOiBUIHwgbnVsbCkgPT4gdm9pZFxuXG5jb25zdCBEYXRhQ29udGV4dCA9IGNyZWF0ZUNvbnRleHQ8UHJvbXB0T3ZlcmxheURhdGEgfCBudWxsPihudWxsKVxuY29uc3QgU2V0Q29udGV4dCA9IGNyZWF0ZUNvbnRleHQ8U2V0dGVyPFByb21wdE92ZXJsYXlEYXRhPiB8IG51bGw+KG51bGwpXG5jb25zdCBEaWFsb2dDb250ZXh0ID0gY3JlYXRlQ29udGV4dDxSZWFjdE5vZGU+KG51bGwpXG5jb25zdCBTZXREaWFsb2dDb250ZXh0ID0gY3JlYXRlQ29udGV4dDxTZXR0ZXI8UmVhY3ROb2RlPiB8IG51bGw+KG51bGwpXG5cbmV4cG9ydCBmdW5jdGlvbiBQcm9tcHRPdmVybGF5UHJvdmlkZXIoe1xuICBjaGlsZHJlbixcbn06IHtcbiAgY2hpbGRyZW46IFJlYWN0Tm9kZVxufSk6IFJlYWN0Tm9kZSB7XG4gIGNvbnN0IFtkYXRhLCBzZXREYXRhXSA9IHVzZVN0YXRlPFByb21wdE92ZXJsYXlEYXRhIHwgbnVsbD4obnVsbClcbiAgY29uc3QgW2RpYWxvZywgc2V0RGlhbG9nXSA9IHVzZVN0YXRlPFJlYWN0Tm9kZT4obnVsbClcbiAgcmV0dXJuIChcbiAgICA8U2V0Q29udGV4dC5Qcm92aWRlciB2YWx1ZT17c2V0RGF0YX0+XG4gICAgICA8U2V0RGlhbG9nQ29udGV4dC5Qcm92aWRlciB2YWx1ZT17c2V0RGlhbG9nfT5cbiAgICAgICAgPERhdGFDb250ZXh0LlByb3ZpZGVyIHZhbHVlPXtkYXRhfT5cbiAgICAgICAgICA8RGlhbG9nQ29udGV4dC5Qcm92aWRlciB2YWx1ZT17ZGlhbG9nfT5cbiAgICAgICAgICAgIHtjaGlsZHJlbn1cbiAgICAgICAgICA8L0RpYWxvZ0NvbnRleHQuUHJvdmlkZXI+XG4gICAgICAgIDwvRGF0YUNvbnRleHQuUHJvdmlkZXI+XG4gICAgICA8L1NldERpYWxvZ0NvbnRleHQuUHJvdmlkZXI+XG4gICAgPC9TZXRDb250ZXh0LlByb3ZpZGVyPlxuICApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VQcm9tcHRPdmVybGF5KCk6IFByb21wdE92ZXJsYXlEYXRhIHwgbnVsbCB7XG4gIHJldHVybiB1c2VDb250ZXh0KERhdGFDb250ZXh0KVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdXNlUHJvbXB0T3ZlcmxheURpYWxvZygpOiBSZWFjdE5vZGUge1xuICByZXR1cm4gdXNlQ29udGV4dChEaWFsb2dDb250ZXh0KVxufVxuXG4vKipcbiAqIFJlZ2lzdGVyIHN1Z2dlc3Rpb24gZGF0YSBmb3IgdGhlIGZsb2F0aW5nIG92ZXJsYXkuIENsZWFycyBvbiB1bm1vdW50LlxuICogTm8tb3Agb3V0c2lkZSB0aGUgcHJvdmlkZXIgKG5vbi1mdWxsc2NyZWVuIHJlbmRlcnMgaW5saW5lIGluc3RlYWQpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlU2V0UHJvbXB0T3ZlcmxheShkYXRhOiBQcm9tcHRPdmVybGF5RGF0YSB8IG51bGwpOiB2b2lkIHtcbiAgY29uc3Qgc2V0ID0gdXNlQ29udGV4dChTZXRDb250ZXh0KVxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghc2V0KSByZXR1cm5cbiAgICBzZXQoZGF0YSlcbiAgICByZXR1cm4gKCkgPT4gc2V0KG51bGwpXG4gIH0sIFtzZXQsIGRhdGFdKVxufVxuXG4vKipcbiAqIFJlZ2lzdGVyIGEgZGlhbG9nIG5vZGUgdG8gZmxvYXQgYWJvdmUgdGhlIHByb21wdC4gQ2xlYXJzIG9uIHVubW91bnQuXG4gKiBOby1vcCBvdXRzaWRlIHRoZSBwcm92aWRlciAobm9uLWZ1bGxzY3JlZW4gcmVuZGVycyBpbmxpbmUgaW5zdGVhZCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VTZXRQcm9tcHRPdmVybGF5RGlhbG9nKG5vZGU6IFJlYWN0Tm9kZSk6IHZvaWQge1xuICBjb25zdCBzZXQgPSB1c2VDb250ZXh0KFNldERpYWxvZ0NvbnRleHQpXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFzZXQpIHJldHVyblxuICAgIHNldChub2RlKVxuICAgIHJldHVybiAoKSA9PiBzZXQobnVsbClcbiAgfSwgW3NldCwgbm9kZV0pXG59XG4i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
|