@hoox-sh/hoox-tui 0.2.0
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/README.md +247 -0
- package/bin/hoox-tui.js +35 -0
- package/dist/main.js +17594 -0
- package/package.json +72 -0
- package/src/app.tsx +696 -0
- package/src/cli-bridge-test-double.ts +212 -0
- package/src/components/layout/layout.test.tsx +205 -0
- package/src/components/layout/sidebar.tsx +69 -0
- package/src/components/layout/statusbar.test.tsx +423 -0
- package/src/components/layout/statusbar.tsx +348 -0
- package/src/components/shared/animated-border.tsx +58 -0
- package/src/components/shared/chrome.test.tsx +29 -0
- package/src/components/shared/command-palette.tsx +361 -0
- package/src/components/shared/cool-brackets.tsx +75 -0
- package/src/components/shared/crash-screen.tsx +167 -0
- package/src/components/shared/error-boundary.tsx +99 -0
- package/src/components/shared/keybinding-hint.tsx +37 -0
- package/src/components/shared/panel.tsx +61 -0
- package/src/components/shared/quit-modal.tsx +65 -0
- package/src/components/shared/shared.test.tsx +538 -0
- package/src/components/shared/spinner.tsx +85 -0
- package/src/components/shared/status-dot.tsx +54 -0
- package/src/components/shared/view-header.tsx +53 -0
- package/src/components/ui/connection-toasts.test.ts +50 -0
- package/src/components/ui/connection-toasts.ts +215 -0
- package/src/components/ui/dialog.tsx +281 -0
- package/src/components/ui/select.tsx +197 -0
- package/src/components/ui/toast.tsx +185 -0
- package/src/components/views/ai-chat.test.tsx +81 -0
- package/src/components/views/ai-chat.tsx +576 -0
- package/src/components/views/config-editor/action-bar.tsx +102 -0
- package/src/components/views/config-editor/code-editor.tsx +597 -0
- package/src/components/views/config-editor/file-tree.tsx +113 -0
- package/src/components/views/config-editor/types.ts +37 -0
- package/src/components/views/config-editor.test.tsx +465 -0
- package/src/components/views/config-editor.tsx +709 -0
- package/src/components/views/dashboard/alerts-panel.tsx +154 -0
- package/src/components/views/dashboard/auto-repair-panel.tsx +229 -0
- package/src/components/views/dashboard/model-health-section.tsx +276 -0
- package/src/components/views/dashboard/pyne-health-section.tsx +112 -0
- package/src/components/views/dashboard.test.tsx +347 -0
- package/src/components/views/dashboard.tsx +647 -0
- package/src/components/views/db-query.test.tsx +115 -0
- package/src/components/views/db-query.tsx +849 -0
- package/src/components/views/edge-topology.test.tsx +198 -0
- package/src/components/views/edge-topology.tsx +572 -0
- package/src/components/views/kv-viewer.test.tsx +241 -0
- package/src/components/views/kv-viewer.tsx +717 -0
- package/src/components/views/logs-viewer.test.tsx +273 -0
- package/src/components/views/logs-viewer.tsx +616 -0
- package/src/components/views/queue-depth.test.tsx +221 -0
- package/src/components/views/queue-depth.tsx +376 -0
- package/src/components/views/secrets-viewer.test.tsx +65 -0
- package/src/components/views/secrets-viewer.tsx +548 -0
- package/src/components/views/service-manager.test.tsx +358 -0
- package/src/components/views/service-manager.tsx +946 -0
- package/src/components/views/settings.test.tsx +648 -0
- package/src/components/views/settings.tsx +1497 -0
- package/src/components/views/setup-wizard.test.tsx +297 -0
- package/src/components/views/setup-wizard.tsx +1321 -0
- package/src/components/views/trade-monitor.test.tsx +592 -0
- package/src/components/views/trade-monitor.tsx +745 -0
- package/src/components/views/worker-detail.test.tsx +289 -0
- package/src/components/views/worker-detail.tsx +676 -0
- package/src/components/views/worker-settings.test.tsx +43 -0
- package/src/components/views/worker-settings.tsx +563 -0
- package/src/components/views/workers-overview.test.tsx +260 -0
- package/src/components/views/workers-overview.tsx +631 -0
- package/src/hooks/hooks.test.ts +72 -0
- package/src/hooks/index.ts +11 -0
- package/src/hooks/renderer-ref.ts +22 -0
- package/src/hooks/use-keyboard.ts +130 -0
- package/src/hooks/use-polling.ts +73 -0
- package/src/hooks/use-service-data.ts +18 -0
- package/src/main.tsx +117 -0
- package/src/network-test-double.ts +133 -0
- package/src/opentui-augment.d.ts +45 -0
- package/src/opentui-jsx.d.ts +70 -0
- package/src/services/cli-bridge/index.ts +1662 -0
- package/src/services/cli-bridge/standalone.ts +315 -0
- package/src/services/cli-bridge/types.ts +307 -0
- package/src/services/cli-bridge.test.ts +406 -0
- package/src/services/clipboard.test.ts +57 -0
- package/src/services/clipboard.ts +180 -0
- package/src/services/dashboard-settings-loader.ts +31 -0
- package/src/services/dev-log.test.ts +168 -0
- package/src/services/dev-log.ts +194 -0
- package/src/services/hoox-path-service.test.ts +183 -0
- package/src/services/hoox-path-service.ts +185 -0
- package/src/services/tui-connection.test.ts +212 -0
- package/src/services/tui-connection.ts +236 -0
- package/src/services/tui-storage.test.ts +92 -0
- package/src/services/tui-storage.ts +86 -0
- package/src/stores/config-store.test.ts +360 -0
- package/src/stores/service-store.test.ts +1026 -0
- package/src/stores/session-restore.test.ts +134 -0
- package/src/stores/ui-store.test.ts +276 -0
- package/src/test-setup.ts +265 -0
- package/src/test-utils.ts +179 -0
- package/src/types.ts +153 -0
- package/src/utils/colors.test.ts +326 -0
- package/src/utils/formatters.test.ts +236 -0
- package/src/view-registry.test.ts +132 -0
- package/src/view-registry.tsx +368 -0
|
@@ -0,0 +1,368 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2026 HOOX · HOOX · jango-blockchained (hoox-sh)
|
|
3
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
/** @jsxImportSource @opentui/react */
|
|
7
|
+
/**
|
|
8
|
+
* View registry — single source of truth for view factories, sidebar items,
|
|
9
|
+
* keyboard shortcuts, and command-palette view commands.
|
|
10
|
+
*/
|
|
11
|
+
import type { ViewId } from "@hoox-sh/hoox-shared";
|
|
12
|
+
import type { DialogHandle } from "./components/ui/dialog";
|
|
13
|
+
import type { CommandEntry } from "./components/shared/command-palette";
|
|
14
|
+
|
|
15
|
+
import { DashboardView } from "./components/views/dashboard";
|
|
16
|
+
import { WorkersOverview } from "./components/views/workers-overview";
|
|
17
|
+
import { WorkerDetail } from "./components/views/worker-detail";
|
|
18
|
+
import { TradeMonitor } from "./components/views/trade-monitor";
|
|
19
|
+
import { LogsViewer } from "./components/views/logs-viewer";
|
|
20
|
+
import { ServiceManager } from "./components/views/service-manager";
|
|
21
|
+
import { ConfigEditor } from "./components/views/config-editor";
|
|
22
|
+
import { SetupWizard } from "./components/views/setup-wizard";
|
|
23
|
+
import { SettingsView } from "./components/views/settings";
|
|
24
|
+
import { QueueDepthView } from "./components/views/queue-depth";
|
|
25
|
+
import { KvViewer } from "./components/views/kv-viewer";
|
|
26
|
+
import { SecretsViewer } from "./components/views/secrets-viewer";
|
|
27
|
+
import { AiChatView } from "./components/views/ai-chat";
|
|
28
|
+
import { DbQueryView } from "./components/views/db-query";
|
|
29
|
+
import { EdgeTopology } from "./components/views/edge-topology";
|
|
30
|
+
import { WorkerSettingsView } from "./components/views/worker-settings";
|
|
31
|
+
|
|
32
|
+
export type ViewFactory = (dialog: DialogHandle) => React.ReactNode;
|
|
33
|
+
|
|
34
|
+
export type ViewKeyMod = "ctrl" | "ctrl-alt";
|
|
35
|
+
|
|
36
|
+
export interface ViewRegistryEntry {
|
|
37
|
+
id: ViewId;
|
|
38
|
+
/** Palette long name */
|
|
39
|
+
label: string;
|
|
40
|
+
/** Sidebar short name */
|
|
41
|
+
shortLabel: string;
|
|
42
|
+
/** Human hint in sidebar (e.g. "1", "^K") */
|
|
43
|
+
shortcut: string;
|
|
44
|
+
/** Key name for keyboard handler (digit or letter) */
|
|
45
|
+
key: string;
|
|
46
|
+
keyMod: ViewKeyMod;
|
|
47
|
+
aliases?: string[];
|
|
48
|
+
/** Palette shortcut display (e.g. "^1", "^#k") */
|
|
49
|
+
paletteShortcut?: string;
|
|
50
|
+
factory: ViewFactory;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export const VIEW_REGISTRY: ViewRegistryEntry[] = [
|
|
54
|
+
{
|
|
55
|
+
id: "dashboard",
|
|
56
|
+
label: "DASHBOARD",
|
|
57
|
+
shortLabel: "DASHBOARD",
|
|
58
|
+
shortcut: "1",
|
|
59
|
+
key: "1",
|
|
60
|
+
keyMod: "ctrl",
|
|
61
|
+
paletteShortcut: "^1",
|
|
62
|
+
aliases: ["home", "overview"],
|
|
63
|
+
factory: (dialog) => <DashboardView dialog={dialog} />,
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
id: "workers",
|
|
67
|
+
label: "WORKERS OVERVIEW",
|
|
68
|
+
shortLabel: "WORKERS",
|
|
69
|
+
shortcut: "2",
|
|
70
|
+
key: "2",
|
|
71
|
+
keyMod: "ctrl",
|
|
72
|
+
paletteShortcut: "^2",
|
|
73
|
+
aliases: ["services"],
|
|
74
|
+
factory: (dialog) => <WorkersOverview dialog={dialog} />,
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
id: "worker-detail",
|
|
78
|
+
label: "WORKER DETAIL",
|
|
79
|
+
shortLabel: "DETAIL",
|
|
80
|
+
shortcut: "3",
|
|
81
|
+
key: "3",
|
|
82
|
+
keyMod: "ctrl",
|
|
83
|
+
paletteShortcut: "^3",
|
|
84
|
+
aliases: ["detail"],
|
|
85
|
+
factory: () => <WorkerDetail />,
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
id: "trade-monitor",
|
|
89
|
+
label: "TRADE MONITOR",
|
|
90
|
+
shortLabel: "TRADES",
|
|
91
|
+
shortcut: "4",
|
|
92
|
+
key: "4",
|
|
93
|
+
keyMod: "ctrl",
|
|
94
|
+
paletteShortcut: "^4",
|
|
95
|
+
aliases: ["trades", "positions"],
|
|
96
|
+
factory: () => <TradeMonitor />,
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
id: "logs-viewer",
|
|
100
|
+
label: "LOGS VIEWER",
|
|
101
|
+
shortLabel: "LOGS",
|
|
102
|
+
shortcut: "5",
|
|
103
|
+
key: "5",
|
|
104
|
+
keyMod: "ctrl",
|
|
105
|
+
paletteShortcut: "^5",
|
|
106
|
+
aliases: ["logs"],
|
|
107
|
+
factory: () => <LogsViewer />,
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
id: "service-manager",
|
|
111
|
+
label: "SERVICE MANAGER",
|
|
112
|
+
shortLabel: "SERVICES",
|
|
113
|
+
shortcut: "6",
|
|
114
|
+
key: "6",
|
|
115
|
+
keyMod: "ctrl",
|
|
116
|
+
paletteShortcut: "^6",
|
|
117
|
+
aliases: ["deploy", "restart"],
|
|
118
|
+
factory: (dialog) => <ServiceManager dialog={dialog} />,
|
|
119
|
+
},
|
|
120
|
+
{
|
|
121
|
+
id: "config-editor",
|
|
122
|
+
label: "CONFIG EDITOR",
|
|
123
|
+
shortLabel: "CONFIG",
|
|
124
|
+
shortcut: "7",
|
|
125
|
+
key: "7",
|
|
126
|
+
keyMod: "ctrl",
|
|
127
|
+
paletteShortcut: "^7",
|
|
128
|
+
aliases: ["edit", "settings"],
|
|
129
|
+
factory: () => <ConfigEditor />,
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
id: "setup-wizard",
|
|
133
|
+
label: "SETUP WIZARD",
|
|
134
|
+
shortLabel: "SETUP",
|
|
135
|
+
shortcut: "8",
|
|
136
|
+
key: "8",
|
|
137
|
+
keyMod: "ctrl",
|
|
138
|
+
paletteShortcut: "^8",
|
|
139
|
+
aliases: ["onboarding", "first-run"],
|
|
140
|
+
factory: (dialog) => <SetupWizard dialog={dialog} />,
|
|
141
|
+
},
|
|
142
|
+
{
|
|
143
|
+
id: "settings",
|
|
144
|
+
label: "SETTINGS",
|
|
145
|
+
shortLabel: "SETTINGS",
|
|
146
|
+
shortcut: "9",
|
|
147
|
+
key: "9",
|
|
148
|
+
keyMod: "ctrl",
|
|
149
|
+
paletteShortcut: "^9",
|
|
150
|
+
aliases: ["preferences"],
|
|
151
|
+
factory: (dialog) => <SettingsView dialog={dialog} />,
|
|
152
|
+
},
|
|
153
|
+
{
|
|
154
|
+
id: "queue-depth",
|
|
155
|
+
label: "QUEUE DEPTH",
|
|
156
|
+
shortLabel: "QUEUES",
|
|
157
|
+
shortcut: "0",
|
|
158
|
+
key: "0",
|
|
159
|
+
keyMod: "ctrl",
|
|
160
|
+
paletteShortcut: "^0",
|
|
161
|
+
aliases: ["queues", "backlog"],
|
|
162
|
+
factory: () => <QueueDepthView />,
|
|
163
|
+
},
|
|
164
|
+
{
|
|
165
|
+
id: "kv-viewer",
|
|
166
|
+
label: "KV VIEWER",
|
|
167
|
+
shortLabel: "KV",
|
|
168
|
+
shortcut: "^K",
|
|
169
|
+
key: "k",
|
|
170
|
+
keyMod: "ctrl-alt",
|
|
171
|
+
paletteShortcut: "^#k",
|
|
172
|
+
aliases: ["kv", "config-kv", "config-kv-list"],
|
|
173
|
+
factory: () => <KvViewer />,
|
|
174
|
+
},
|
|
175
|
+
{
|
|
176
|
+
id: "secrets-viewer",
|
|
177
|
+
label: "SECRETS VIEWER",
|
|
178
|
+
shortLabel: "SECRETS",
|
|
179
|
+
shortcut: "^S",
|
|
180
|
+
key: "s",
|
|
181
|
+
keyMod: "ctrl-alt",
|
|
182
|
+
paletteShortcut: "^#s",
|
|
183
|
+
aliases: ["secrets", "config-secrets", "config-secrets-list"],
|
|
184
|
+
factory: () => <SecretsViewer />,
|
|
185
|
+
},
|
|
186
|
+
{
|
|
187
|
+
id: "db-query",
|
|
188
|
+
label: "DB QUERY",
|
|
189
|
+
shortLabel: "DB QUERY",
|
|
190
|
+
shortcut: "^Q",
|
|
191
|
+
key: "q",
|
|
192
|
+
keyMod: "ctrl-alt",
|
|
193
|
+
paletteShortcut: "^#q",
|
|
194
|
+
aliases: ["sql", "d1", "database", "db"],
|
|
195
|
+
factory: () => <DbQueryView />,
|
|
196
|
+
},
|
|
197
|
+
{
|
|
198
|
+
id: "ai-chat",
|
|
199
|
+
label: "AI CHAT",
|
|
200
|
+
shortLabel: "AI CHAT",
|
|
201
|
+
shortcut: "^C",
|
|
202
|
+
key: "c",
|
|
203
|
+
keyMod: "ctrl-alt",
|
|
204
|
+
paletteShortcut: "^#c",
|
|
205
|
+
aliases: ["chat", "ai", "agent"],
|
|
206
|
+
factory: () => <AiChatView />,
|
|
207
|
+
},
|
|
208
|
+
{
|
|
209
|
+
id: "edge-topology",
|
|
210
|
+
label: "EDGE TOPOLOGY",
|
|
211
|
+
shortLabel: "TOPOLOGY",
|
|
212
|
+
shortcut: "^E",
|
|
213
|
+
key: "e",
|
|
214
|
+
keyMod: "ctrl-alt",
|
|
215
|
+
paletteShortcut: "^#e",
|
|
216
|
+
aliases: ["topology", "graph", "architecture", "map"],
|
|
217
|
+
factory: () => <EdgeTopology />,
|
|
218
|
+
},
|
|
219
|
+
{
|
|
220
|
+
id: "worker-settings",
|
|
221
|
+
label: "WORKER SETTINGS",
|
|
222
|
+
shortLabel: "W SETTINGS",
|
|
223
|
+
shortcut: "^W",
|
|
224
|
+
key: "w",
|
|
225
|
+
keyMod: "ctrl-alt",
|
|
226
|
+
paletteShortcut: "^#w",
|
|
227
|
+
aliases: [
|
|
228
|
+
"dashboard-settings",
|
|
229
|
+
"worker-config",
|
|
230
|
+
"dashboard.jsonc",
|
|
231
|
+
"kv-settings",
|
|
232
|
+
],
|
|
233
|
+
factory: () => <WorkerSettingsView />,
|
|
234
|
+
},
|
|
235
|
+
];
|
|
236
|
+
|
|
237
|
+
/** All ViewIds in registry order (single source for exhaustiveness checks). */
|
|
238
|
+
export const REGISTERED_VIEW_IDS: ViewId[] = VIEW_REGISTRY.map((e) => e.id);
|
|
239
|
+
|
|
240
|
+
const REGISTERED_VIEW_ID_SET = new Set<string>(REGISTERED_VIEW_IDS);
|
|
241
|
+
|
|
242
|
+
/** True when `id` is a known primary view (safe for setView / session restore). */
|
|
243
|
+
export function isRegisteredViewId(id: unknown): id is ViewId {
|
|
244
|
+
return typeof id === "string" && REGISTERED_VIEW_ID_SET.has(id);
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
/** Compile-time exhaustiveness helper (call once at module load). */
|
|
248
|
+
function assertFullCoverage(entries: ViewRegistryEntry[]): void {
|
|
249
|
+
const ids = new Set(entries.map((e) => e.id));
|
|
250
|
+
const required: ViewId[] = [
|
|
251
|
+
"dashboard",
|
|
252
|
+
"workers",
|
|
253
|
+
"worker-detail",
|
|
254
|
+
"trade-monitor",
|
|
255
|
+
"logs-viewer",
|
|
256
|
+
"service-manager",
|
|
257
|
+
"config-editor",
|
|
258
|
+
"setup-wizard",
|
|
259
|
+
"settings",
|
|
260
|
+
"queue-depth",
|
|
261
|
+
"kv-viewer",
|
|
262
|
+
"secrets-viewer",
|
|
263
|
+
"db-query",
|
|
264
|
+
"ai-chat",
|
|
265
|
+
"edge-topology",
|
|
266
|
+
"worker-settings",
|
|
267
|
+
];
|
|
268
|
+
for (const id of required) {
|
|
269
|
+
if (!ids.has(id)) throw new Error(`view-registry missing ViewId: ${id}`);
|
|
270
|
+
}
|
|
271
|
+
// Unique keyboard bindings within each modifier class
|
|
272
|
+
const ctrlKeys = new Set<string>();
|
|
273
|
+
const ctrlAltKeys = new Set<string>();
|
|
274
|
+
for (const e of entries) {
|
|
275
|
+
if (e.keyMod === "ctrl") {
|
|
276
|
+
if (ctrlKeys.has(e.key)) {
|
|
277
|
+
throw new Error(`view-registry duplicate Ctrl+${e.key}`);
|
|
278
|
+
}
|
|
279
|
+
ctrlKeys.add(e.key);
|
|
280
|
+
} else {
|
|
281
|
+
if (ctrlAltKeys.has(e.key)) {
|
|
282
|
+
throw new Error(`view-registry duplicate Ctrl+Alt+${e.key}`);
|
|
283
|
+
}
|
|
284
|
+
ctrlAltKeys.add(e.key);
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
assertFullCoverage(VIEW_REGISTRY);
|
|
289
|
+
|
|
290
|
+
/** Cached sidebar rows (registry is static). */
|
|
291
|
+
export const SIDEBAR_ITEMS: {
|
|
292
|
+
id: ViewId;
|
|
293
|
+
label: string;
|
|
294
|
+
shortcut: string;
|
|
295
|
+
}[] = VIEW_REGISTRY.map((e) => ({
|
|
296
|
+
id: e.id,
|
|
297
|
+
label: e.shortLabel,
|
|
298
|
+
shortcut: e.shortcut,
|
|
299
|
+
}));
|
|
300
|
+
|
|
301
|
+
export function getSidebarItems(): {
|
|
302
|
+
id: ViewId;
|
|
303
|
+
label: string;
|
|
304
|
+
shortcut: string;
|
|
305
|
+
}[] {
|
|
306
|
+
return SIDEBAR_ITEMS;
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
export function getViewShortcutMap(): Record<string, ViewId> {
|
|
310
|
+
const map: Record<string, ViewId> = {};
|
|
311
|
+
for (const e of VIEW_REGISTRY) {
|
|
312
|
+
if (e.keyMod === "ctrl") map[e.key] = e.id;
|
|
313
|
+
}
|
|
314
|
+
return map;
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
export function getCtrlAltViewMap(): Record<string, ViewId> {
|
|
318
|
+
const map: Record<string, ViewId> = {};
|
|
319
|
+
for (const e of VIEW_REGISTRY) {
|
|
320
|
+
if (e.keyMod === "ctrl-alt") map[e.key] = e.id;
|
|
321
|
+
}
|
|
322
|
+
return map;
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
export function getViewFactory(id: ViewId): ViewFactory {
|
|
326
|
+
const entry = VIEW_REGISTRY.find((e) => e.id === id);
|
|
327
|
+
// Fail soft to dashboard when store has a stale/unknown id
|
|
328
|
+
return entry?.factory ?? VIEW_REGISTRY[0]!.factory;
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
export function getViewPaletteCommands(): CommandEntry[] {
|
|
332
|
+
return VIEW_REGISTRY.map((e) => ({
|
|
333
|
+
id: e.id,
|
|
334
|
+
name: e.label,
|
|
335
|
+
category: "view" as const,
|
|
336
|
+
shortcut: e.paletteShortcut,
|
|
337
|
+
aliases: e.aliases,
|
|
338
|
+
}));
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
export const ACTION_COMMANDS: CommandEntry[] = [
|
|
342
|
+
{
|
|
343
|
+
id: "refresh",
|
|
344
|
+
name: "REFRESH DATA",
|
|
345
|
+
category: "action",
|
|
346
|
+
shortcut: "^R",
|
|
347
|
+
aliases: ["reload"],
|
|
348
|
+
},
|
|
349
|
+
{
|
|
350
|
+
id: "toggle-sidebar",
|
|
351
|
+
name: "TOGGLE SIDEBAR",
|
|
352
|
+
category: "action",
|
|
353
|
+
shortcut: "^B",
|
|
354
|
+
aliases: ["collapse"],
|
|
355
|
+
},
|
|
356
|
+
{
|
|
357
|
+
id: "quit",
|
|
358
|
+
name: "QUIT HOOX",
|
|
359
|
+
category: "action",
|
|
360
|
+
shortcut: "^Q",
|
|
361
|
+
aliases: ["exit", "close"],
|
|
362
|
+
},
|
|
363
|
+
];
|
|
364
|
+
|
|
365
|
+
export const ALL_PALETTE_COMMANDS: CommandEntry[] = [
|
|
366
|
+
...getViewPaletteCommands(),
|
|
367
|
+
...ACTION_COMMANDS,
|
|
368
|
+
];
|