@rotorsoft/contui 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.
Files changed (94) hide show
  1. package/README.md +192 -0
  2. package/dist/components/App.d.ts +3 -0
  3. package/dist/components/App.d.ts.map +1 -0
  4. package/dist/components/App.js +365 -0
  5. package/dist/components/App.js.map +1 -0
  6. package/dist/components/ConfirmDialog.d.ts +9 -0
  7. package/dist/components/ConfirmDialog.d.ts.map +1 -0
  8. package/dist/components/ConfirmDialog.js +14 -0
  9. package/dist/components/ConfirmDialog.js.map +1 -0
  10. package/dist/components/ContainersView.d.ts +10 -0
  11. package/dist/components/ContainersView.d.ts.map +1 -0
  12. package/dist/components/ContainersView.js +46 -0
  13. package/dist/components/ContainersView.js.map +1 -0
  14. package/dist/components/CreateDialog.d.ts +9 -0
  15. package/dist/components/CreateDialog.d.ts.map +1 -0
  16. package/dist/components/CreateDialog.js +19 -0
  17. package/dist/components/CreateDialog.js.map +1 -0
  18. package/dist/components/DetailView.d.ts +9 -0
  19. package/dist/components/DetailView.d.ts.map +1 -0
  20. package/dist/components/DetailView.js +38 -0
  21. package/dist/components/DetailView.js.map +1 -0
  22. package/dist/components/HelpOverlay.d.ts +7 -0
  23. package/dist/components/HelpOverlay.d.ts.map +1 -0
  24. package/dist/components/HelpOverlay.js +54 -0
  25. package/dist/components/HelpOverlay.js.map +1 -0
  26. package/dist/components/ImagesView.d.ts +10 -0
  27. package/dist/components/ImagesView.d.ts.map +1 -0
  28. package/dist/components/ImagesView.js +17 -0
  29. package/dist/components/ImagesView.js.map +1 -0
  30. package/dist/components/LogsView.d.ts +9 -0
  31. package/dist/components/LogsView.d.ts.map +1 -0
  32. package/dist/components/LogsView.js +7 -0
  33. package/dist/components/LogsView.js.map +1 -0
  34. package/dist/components/NetworksView.d.ts +10 -0
  35. package/dist/components/NetworksView.d.ts.map +1 -0
  36. package/dist/components/NetworksView.js +16 -0
  37. package/dist/components/NetworksView.js.map +1 -0
  38. package/dist/components/PullDialog.d.ts +8 -0
  39. package/dist/components/PullDialog.d.ts.map +1 -0
  40. package/dist/components/PullDialog.js +19 -0
  41. package/dist/components/PullDialog.js.map +1 -0
  42. package/dist/components/SearchInput.d.ts +9 -0
  43. package/dist/components/SearchInput.d.ts.map +1 -0
  44. package/dist/components/SearchInput.js +7 -0
  45. package/dist/components/SearchInput.js.map +1 -0
  46. package/dist/components/StatusBar.d.ts +13 -0
  47. package/dist/components/StatusBar.d.ts.map +1 -0
  48. package/dist/components/StatusBar.js +31 -0
  49. package/dist/components/StatusBar.js.map +1 -0
  50. package/dist/components/TabBar.d.ts +8 -0
  51. package/dist/components/TabBar.d.ts.map +1 -0
  52. package/dist/components/TabBar.js +13 -0
  53. package/dist/components/TabBar.js.map +1 -0
  54. package/dist/components/Table.d.ts +16 -0
  55. package/dist/components/Table.d.ts.map +1 -0
  56. package/dist/components/Table.js +19 -0
  57. package/dist/components/Table.js.map +1 -0
  58. package/dist/components/VolumesView.d.ts +10 -0
  59. package/dist/components/VolumesView.d.ts.map +1 -0
  60. package/dist/components/VolumesView.js +16 -0
  61. package/dist/components/VolumesView.js.map +1 -0
  62. package/dist/hooks/useContainerData.d.ts +13 -0
  63. package/dist/hooks/useContainerData.d.ts.map +1 -0
  64. package/dist/hooks/useContainerData.js +46 -0
  65. package/dist/hooks/useContainerData.js.map +1 -0
  66. package/dist/hooks/useKeyboard.d.ts +18 -0
  67. package/dist/hooks/useKeyboard.d.ts.map +1 -0
  68. package/dist/hooks/useKeyboard.js +122 -0
  69. package/dist/hooks/useKeyboard.js.map +1 -0
  70. package/dist/hooks/useReleaseCheck.d.ts +15 -0
  71. package/dist/hooks/useReleaseCheck.d.ts.map +1 -0
  72. package/dist/hooks/useReleaseCheck.js +60 -0
  73. package/dist/hooks/useReleaseCheck.js.map +1 -0
  74. package/dist/index.d.ts +3 -0
  75. package/dist/index.d.ts.map +1 -0
  76. package/dist/index.js +18 -0
  77. package/dist/index.js.map +1 -0
  78. package/dist/services/container-cli.d.ts +33 -0
  79. package/dist/services/container-cli.d.ts.map +1 -0
  80. package/dist/services/container-cli.js +241 -0
  81. package/dist/services/container-cli.js.map +1 -0
  82. package/dist/services/health-check.d.ts +8 -0
  83. package/dist/services/health-check.d.ts.map +1 -0
  84. package/dist/services/health-check.js +59 -0
  85. package/dist/services/health-check.js.map +1 -0
  86. package/dist/types/index.d.ts +79 -0
  87. package/dist/types/index.d.ts.map +1 -0
  88. package/dist/types/index.js +2 -0
  89. package/dist/types/index.js.map +1 -0
  90. package/dist/utils/app-version.d.ts +2 -0
  91. package/dist/utils/app-version.d.ts.map +1 -0
  92. package/dist/utils/app-version.js +18 -0
  93. package/dist/utils/app-version.js.map +1 -0
  94. package/package.json +70 -0
package/README.md ADDED
@@ -0,0 +1,192 @@
1
+ # @rotorsoft/contui
2
+
3
+ [![npm version](https://img.shields.io/npm/v/@rotorsoft/contui.svg)](https://www.npmjs.com/package/@rotorsoft/contui)
4
+ [![CI](https://github.com/Rotorsoft/contui/actions/workflows/ci.yml/badge.svg)](https://github.com/Rotorsoft/contui/actions/workflows/ci.yml)
5
+ [![Release](https://github.com/Rotorsoft/contui/actions/workflows/release.yml/badge.svg)](https://github.com/Rotorsoft/contui/actions/workflows/release.yml)
6
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
7
+ [![Node.js Version](https://img.shields.io/badge/node-%3E%3D18.0.0-brightgreen)](https://nodejs.org/)
8
+
9
+ A terminal UI for managing containers on macOS using the native `container` CLI.
10
+
11
+ ## Features
12
+
13
+ - **Container Management**: List, start, stop, restart, and remove containers
14
+ - **Image Management**: List, pull, inspect, and remove images
15
+ - **Network Management**: List, create, inspect, and remove networks
16
+ - **Volume Management**: List, create, inspect, and remove volumes
17
+ - **Vim-style Navigation**: Use `j`/`k` or arrow keys for navigation
18
+ - **Search/Filter**: Quickly filter resources with `/`
19
+ - **Real-time Refresh**: Auto-refresh data with `r` key
20
+ - **Detailed Inspection**: View full resource details with `Enter` or `i`
21
+ - **Container Logs**: View container logs with `L`
22
+
23
+ ## Prerequisites
24
+
25
+ - macOS with native container support
26
+ - Node.js >= 18.0.0
27
+ - The `container` CLI must be installed and the container service running
28
+
29
+ ## Installation
30
+
31
+ ### Download and Run (npm)
32
+
33
+ ```bash
34
+ # Install globally
35
+ npm install -g @rotorsoft/contui
36
+
37
+ # Run the CLI
38
+ contui
39
+ ```
40
+
41
+ ```bash
42
+ # Or run without installing
43
+ npx @rotorsoft/contui
44
+ ```
45
+
46
+ ### From Source (pnpm)
47
+
48
+ ```bash
49
+ # Clone the repository
50
+ git clone https://github.com/Rotorsoft/contui.git
51
+ cd contui
52
+
53
+ # Install dependencies
54
+ pnpm install
55
+
56
+ # Build the project
57
+ pnpm run build
58
+
59
+ # Run the application
60
+ pnpm start
61
+ ```
62
+
63
+ ### Global Installation
64
+
65
+ ```bash
66
+ # Link for global usage
67
+ pnpm link --global
68
+
69
+ # Run from anywhere
70
+ contui
71
+ ```
72
+
73
+ ## Usage
74
+
75
+ ### Keyboard Shortcuts
76
+
77
+ #### Navigation
78
+ | Key | Action |
79
+ |-----|--------|
80
+ | `1-4` | Switch tabs (Containers, Images, Networks, Volumes) |
81
+ | `h` / `l` | Previous/Next tab |
82
+ | `j` / `k` or `↓` / `↑` | Navigate list |
83
+ | `Enter` | Inspect selected item |
84
+ | `Esc` | Go back / Cancel |
85
+ | `q` | Quit |
86
+
87
+ #### Actions
88
+ | Key | Action |
89
+ |-----|--------|
90
+ | `s` | Start container |
91
+ | `x` | Stop container |
92
+ | `R` | Restart container |
93
+ | `d` | Delete (with confirmation) |
94
+ | `L` | View container logs |
95
+ | `i` | Inspect details |
96
+ | `p` | Pull image (Images tab) |
97
+ | `c` | Create network/volume |
98
+
99
+ #### Other
100
+ | Key | Action |
101
+ |-----|--------|
102
+ | `/` | Search/Filter |
103
+ | `r` | Refresh data |
104
+ | `?` | Show help |
105
+
106
+ ## Development
107
+
108
+ ```bash
109
+ # Run in development mode with hot reload
110
+ pnpm dev
111
+
112
+ # Type check
113
+ pnpm run typecheck
114
+
115
+ # Lint
116
+ pnpm run lint
117
+
118
+ # Run tests
119
+ pnpm test
120
+
121
+ # Run tests with coverage
122
+ pnpm run test:coverage
123
+
124
+ # Format code
125
+ pnpm run format
126
+ ```
127
+
128
+ ## Architecture
129
+
130
+ The application is built with:
131
+
132
+ - **[Ink](https://github.com/vadimdemedes/ink)**: React for CLI applications
133
+ - **TypeScript**: Type-safe development
134
+ - **React Hooks**: State management with `useState`, `useCallback`, `useEffect`
135
+
136
+ ### Project Structure
137
+
138
+ ```
139
+ src/
140
+ ├── components/ # React components (views, dialogs, UI elements)
141
+ ├── hooks/ # Custom React hooks
142
+ ├── services/ # Container CLI wrapper and utilities
143
+ ├── types/ # TypeScript type definitions
144
+ └── index.tsx # Application entry point
145
+ ```
146
+
147
+ ### Key Files
148
+
149
+ | File | Description |
150
+ |------|-------------|
151
+ | `src/index.tsx` | Entry point with health check |
152
+ | `src/components/App.tsx` | Main application component |
153
+ | `src/services/container-cli.ts` | macOS container CLI wrapper |
154
+ | `src/hooks/useContainerData.ts` | Data fetching and state |
155
+ | `src/hooks/useKeyboard.ts` | Centralized keyboard handling |
156
+ | `src/types/index.ts` | TypeScript interfaces |
157
+
158
+ ## Contributing
159
+
160
+ 1. Fork the repository
161
+ 2. Create a feature branch (`git checkout -b feat/amazing-feature`)
162
+ 3. Make your changes
163
+ 4. Run validation:
164
+ ```bash
165
+ pnpm run typecheck
166
+ pnpm run lint
167
+ pnpm test
168
+ ```
169
+ 5. Commit using [Conventional Commits](https://www.conventionalcommits.org/):
170
+ ```bash
171
+ git commit -m "feat: add amazing feature"
172
+ ```
173
+ 6. Push and open a Pull Request
174
+
175
+ ### Commit Message Format
176
+
177
+ This project uses [conventional commits](https://www.conventionalcommits.org/) enforced by commitlint:
178
+
179
+ - `feat:` New feature
180
+ - `fix:` Bug fix
181
+ - `docs:` Documentation changes
182
+ - `style:` Code style changes (formatting, etc.)
183
+ - `refactor:` Code refactoring
184
+ - `perf:` Performance improvements
185
+ - `test:` Test additions or corrections
186
+ - `build:` Build system changes
187
+ - `ci:` CI configuration changes
188
+ - `chore:` Maintenance tasks
189
+
190
+ ## License
191
+
192
+ MIT
@@ -0,0 +1,3 @@
1
+ import React from "react";
2
+ export declare function App(): React.ReactElement;
3
+ //# sourceMappingURL=App.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../../src/components/App.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAgC,MAAM,OAAO,CAAC;AAgErD,wBAAgB,GAAG,IAAI,KAAK,CAAC,YAAY,CAybxC"}
@@ -0,0 +1,365 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState, useCallback } from "react";
3
+ import { Box, Text, useApp } from "ink";
4
+ import Spinner from "ink-spinner";
5
+ import { TabBar } from "./TabBar.js";
6
+ import { StatusBar } from "./StatusBar.js";
7
+ import { HelpOverlay } from "./HelpOverlay.js";
8
+ import { SearchInput } from "./SearchInput.js";
9
+ import { ContainersView } from "./ContainersView.js";
10
+ import { ImagesView } from "./ImagesView.js";
11
+ import { NetworksView } from "./NetworksView.js";
12
+ import { VolumesView } from "./VolumesView.js";
13
+ import { DetailView } from "./DetailView.js";
14
+ import { LogsView } from "./LogsView.js";
15
+ import { ConfirmDialog } from "./ConfirmDialog.js";
16
+ import { CreateDialog } from "./CreateDialog.js";
17
+ import { PullDialog } from "./PullDialog.js";
18
+ import { useContainerData } from "../hooks/useContainerData.js";
19
+ import { useKeyboard } from "../hooks/useKeyboard.js";
20
+ import { useReleaseCheck } from "../hooks/useReleaseCheck.js";
21
+ import { containerCli } from "../services/container-cli.js";
22
+ import { getAppVersion } from "../utils/app-version.js";
23
+ const APP_VERSION = getAppVersion();
24
+ // Truncate large objects to prevent rendering performance issues
25
+ function truncateData(obj, maxDepth = 4, maxArrayLength = 20, maxStringLength = 200) {
26
+ if (maxDepth <= 0)
27
+ return "[truncated]";
28
+ if (obj === null || obj === undefined)
29
+ return obj;
30
+ if (typeof obj === "string") {
31
+ return obj.length > maxStringLength ? obj.substring(0, maxStringLength) + "..." : obj;
32
+ }
33
+ if (typeof obj !== "object")
34
+ return obj;
35
+ if (Array.isArray(obj)) {
36
+ const truncated = obj.slice(0, maxArrayLength).map(item => truncateData(item, maxDepth - 1, maxArrayLength, maxStringLength));
37
+ if (obj.length > maxArrayLength) {
38
+ truncated.push(`[...${obj.length - maxArrayLength} more items]`);
39
+ }
40
+ return truncated;
41
+ }
42
+ const result = {};
43
+ for (const [key, value] of Object.entries(obj)) {
44
+ result[key] = truncateData(value, maxDepth - 1, maxArrayLength, maxStringLength);
45
+ }
46
+ return result;
47
+ }
48
+ export function App() {
49
+ const { exit } = useApp();
50
+ const { containers, images, networks, volumes, loading, error, refresh } = useContainerData();
51
+ const releaseStatus = useReleaseCheck({ packageName: "@rotorsoft/contui", currentVersion: APP_VERSION });
52
+ const [activeTab, setActiveTab] = useState("containers");
53
+ const [selectedIndex, setSelectedIndex] = useState(0);
54
+ const [searchQuery, setSearchQuery] = useState("");
55
+ const [searchMode, setSearchMode] = useState(false);
56
+ const [searchInput, setSearchInput] = useState("");
57
+ const [showHelp, setShowHelp] = useState(false);
58
+ const [dialog, setDialog] = useState({ type: null });
59
+ const [actionError, setActionError] = useState(null);
60
+ const [actionInProgress, setActionInProgress] = useState(null);
61
+ const getItemCount = useCallback(() => {
62
+ switch (activeTab) {
63
+ case "containers":
64
+ return containers.length;
65
+ case "images":
66
+ return images.length;
67
+ case "networks":
68
+ return networks.length;
69
+ case "volumes":
70
+ return volumes.length;
71
+ default:
72
+ return 0;
73
+ }
74
+ }, [activeTab, containers.length, images.length, networks.length, volumes.length]);
75
+ const handleQuit = useCallback(() => {
76
+ exit();
77
+ }, [exit]);
78
+ const handleTabChange = useCallback((tab) => {
79
+ setActiveTab(tab);
80
+ setSelectedIndex(0);
81
+ setSearchQuery("");
82
+ setActionError(null);
83
+ }, []);
84
+ const handleNavigate = useCallback((direction) => {
85
+ setActionError(null);
86
+ const count = getItemCount();
87
+ if (count === 0)
88
+ return;
89
+ setSelectedIndex((prev) => {
90
+ if (direction === "up") {
91
+ return prev > 0 ? prev - 1 : count - 1;
92
+ }
93
+ else {
94
+ return prev < count - 1 ? prev + 1 : 0;
95
+ }
96
+ });
97
+ }, [getItemCount]);
98
+ const handleSelect = useCallback(async () => {
99
+ setActionError(null);
100
+ try {
101
+ let inspectData = {};
102
+ switch (activeTab) {
103
+ case "containers": {
104
+ const container = containers[selectedIndex];
105
+ if (!container)
106
+ return;
107
+ inspectData = (await containerCli.inspectContainer(container.id));
108
+ break;
109
+ }
110
+ case "images": {
111
+ const image = images[selectedIndex];
112
+ if (!image)
113
+ return;
114
+ inspectData = await containerCli.inspectImage(image.reference);
115
+ break;
116
+ }
117
+ case "networks": {
118
+ const network = networks[selectedIndex];
119
+ if (!network)
120
+ return;
121
+ inspectData = (await containerCli.inspectNetwork(network.id));
122
+ break;
123
+ }
124
+ case "volumes": {
125
+ const volume = volumes[selectedIndex];
126
+ if (!volume)
127
+ return;
128
+ inspectData = (await containerCli.inspectVolume(volume.name));
129
+ break;
130
+ }
131
+ }
132
+ setDialog({ type: "inspect", data: truncateData(inspectData) });
133
+ }
134
+ catch (err) {
135
+ setActionError(err instanceof Error ? err.message : "Failed to inspect");
136
+ }
137
+ }, [activeTab, selectedIndex, containers, images, networks, volumes]);
138
+ const handleBack = useCallback(() => {
139
+ setActionError(null);
140
+ if (searchMode) {
141
+ setSearchMode(false);
142
+ setSearchInput("");
143
+ }
144
+ else if (dialog.type) {
145
+ setDialog({ type: null, data: undefined, logs: undefined });
146
+ }
147
+ else if (showHelp) {
148
+ setShowHelp(false);
149
+ }
150
+ }, [searchMode, dialog.type, showHelp]);
151
+ const handleSearch = useCallback(() => {
152
+ setActionError(null);
153
+ setSearchMode(true);
154
+ setSearchInput(searchQuery);
155
+ }, [searchQuery]);
156
+ const handleSearchSubmit = useCallback(() => {
157
+ setSearchQuery(searchInput);
158
+ setSearchMode(false);
159
+ setSelectedIndex(0);
160
+ }, [searchInput]);
161
+ const handleHelp = useCallback(() => {
162
+ setActionError(null);
163
+ setShowHelp((prev) => !prev);
164
+ }, []);
165
+ const handleRefresh = useCallback(async () => {
166
+ setActionError(null);
167
+ await refresh();
168
+ }, [refresh]);
169
+ const getItemIdentifiers = useCallback(() => {
170
+ switch (activeTab) {
171
+ case "containers": {
172
+ const c = containers[selectedIndex];
173
+ return c ? { id: c.id, name: c.name } : null;
174
+ }
175
+ case "images": {
176
+ const i = images[selectedIndex];
177
+ return i ? { id: i.reference, name: `${i.repository}:${i.tag}` } : null;
178
+ }
179
+ case "networks": {
180
+ const n = networks[selectedIndex];
181
+ return n ? { id: n.id, name: n.name } : null;
182
+ }
183
+ case "volumes": {
184
+ const v = volumes[selectedIndex];
185
+ return v ? { id: v.name, name: v.name } : null;
186
+ }
187
+ default:
188
+ return null;
189
+ }
190
+ }, [activeTab, selectedIndex, containers, images, networks, volumes]);
191
+ const handleAction = useCallback(async (action) => {
192
+ setActionError(null);
193
+ if (action === "pull" && activeTab === "images") {
194
+ setDialog({ type: "pull" });
195
+ return;
196
+ }
197
+ if (action === "create" && (activeTab === "networks" || activeTab === "volumes")) {
198
+ setDialog({
199
+ type: "create",
200
+ createType: activeTab === "networks" ? "network" : "volume",
201
+ });
202
+ return;
203
+ }
204
+ const identifiers = getItemIdentifiers();
205
+ if (!identifiers)
206
+ return;
207
+ const { id: itemId, name: itemName } = identifiers;
208
+ try {
209
+ switch (action) {
210
+ case "start":
211
+ if (activeTab === "containers") {
212
+ setActionInProgress(`Starting ${itemName}...`);
213
+ await containerCli.startContainer(itemId);
214
+ await refresh();
215
+ setActionInProgress(null);
216
+ }
217
+ break;
218
+ case "stop":
219
+ if (activeTab === "containers") {
220
+ setActionInProgress(`Stopping ${itemName}...`);
221
+ await containerCli.stopContainer(itemId);
222
+ await refresh();
223
+ setActionInProgress(null);
224
+ }
225
+ break;
226
+ case "restart":
227
+ if (activeTab === "containers") {
228
+ setActionInProgress(`Restarting ${itemName}...`);
229
+ await containerCli.restartContainer(itemId);
230
+ await refresh();
231
+ setActionInProgress(null);
232
+ }
233
+ break;
234
+ case "delete":
235
+ setDialog({
236
+ type: "confirm",
237
+ message: `Are you sure you want to delete ${itemName}?`,
238
+ action: async () => {
239
+ setActionInProgress(`Deleting ${itemName}...`);
240
+ switch (activeTab) {
241
+ case "containers":
242
+ await containerCli.removeContainer(itemId, true);
243
+ break;
244
+ case "images":
245
+ await containerCli.removeImage(itemId, true);
246
+ break;
247
+ case "networks":
248
+ await containerCli.removeNetwork(itemId);
249
+ break;
250
+ case "volumes":
251
+ await containerCli.removeVolume(itemName, true);
252
+ break;
253
+ }
254
+ await refresh();
255
+ setSelectedIndex((prev) => Math.max(0, prev - 1));
256
+ setActionInProgress(null);
257
+ },
258
+ });
259
+ break;
260
+ case "logs":
261
+ if (activeTab === "containers") {
262
+ setActionInProgress(`Fetching logs...`);
263
+ const logs = await containerCli.getContainerLogs(itemId);
264
+ setActionInProgress(null);
265
+ setDialog({ type: "logs", logs, containerName: itemName });
266
+ }
267
+ break;
268
+ case "inspect":
269
+ setActionInProgress(`Loading details...`);
270
+ await handleSelect();
271
+ setActionInProgress(null);
272
+ break;
273
+ }
274
+ }
275
+ catch (err) {
276
+ setActionInProgress(null);
277
+ setActionError(err instanceof Error ? err.message : "Action failed");
278
+ }
279
+ }, [getItemIdentifiers, activeTab, refresh, handleSelect]);
280
+ const handleConfirm = useCallback(async () => {
281
+ if (dialog.action) {
282
+ try {
283
+ await dialog.action();
284
+ }
285
+ catch (err) {
286
+ setActionInProgress(null);
287
+ setActionError(err instanceof Error ? err.message : "Action failed");
288
+ }
289
+ }
290
+ setDialog({ type: null, data: undefined, logs: undefined });
291
+ }, [dialog]);
292
+ const handlePullConfirm = useCallback(async (imageName) => {
293
+ setDialog({ type: null, data: undefined, logs: undefined });
294
+ setActionInProgress(`Pulling ${imageName}...`);
295
+ try {
296
+ await containerCli.pullImage(imageName);
297
+ await refresh();
298
+ setActionInProgress(null);
299
+ }
300
+ catch (err) {
301
+ setActionInProgress(null);
302
+ setActionError(err instanceof Error ? err.message : "Failed to pull image");
303
+ }
304
+ }, [refresh]);
305
+ const handleCreateConfirm = useCallback(async (name) => {
306
+ setDialog({ type: null, data: undefined, logs: undefined });
307
+ setActionInProgress(`Creating ${name}...`);
308
+ try {
309
+ if (dialog.createType === "network") {
310
+ await containerCli.createNetwork(name);
311
+ }
312
+ else {
313
+ await containerCli.createVolume(name);
314
+ }
315
+ await refresh();
316
+ setActionInProgress(null);
317
+ }
318
+ catch (err) {
319
+ setActionInProgress(null);
320
+ setActionError(err instanceof Error ? err.message : "Failed to create");
321
+ }
322
+ }, [dialog.createType, refresh]);
323
+ const handleCancel = useCallback(() => {
324
+ setDialog({ type: null, data: undefined, logs: undefined });
325
+ }, []);
326
+ useKeyboard({
327
+ onQuit: handleQuit,
328
+ onTabChange: handleTabChange,
329
+ onNavigate: handleNavigate,
330
+ onSelect: handleSelect,
331
+ onBack: handleBack,
332
+ onSearch: handleSearch,
333
+ onHelp: handleHelp,
334
+ onRefresh: handleRefresh,
335
+ onAction: handleAction,
336
+ isSearchMode: searchMode,
337
+ isDetailView: dialog.type === "logs" || dialog.type === "inspect",
338
+ activeTab,
339
+ });
340
+ if (loading && containers.length === 0) {
341
+ return (_jsxs(Box, { padding: 1, children: [_jsx(Text, { color: "cyan", children: _jsx(Spinner, { type: "dots" }) }), _jsx(Text, { children: " Loading container data..." })] }));
342
+ }
343
+ if (showHelp) {
344
+ return _jsx(HelpOverlay, { onClose: () => setShowHelp(false) });
345
+ }
346
+ if (dialog.type === "confirm" && dialog.message) {
347
+ return (_jsx(ConfirmDialog, { message: dialog.message, onConfirm: handleConfirm, onCancel: handleCancel }));
348
+ }
349
+ if (dialog.type === "pull") {
350
+ return _jsx(PullDialog, { onConfirm: handlePullConfirm, onCancel: handleCancel });
351
+ }
352
+ if (dialog.type === "create" && dialog.createType) {
353
+ return (_jsx(CreateDialog, { type: dialog.createType, onConfirm: handleCreateConfirm, onCancel: handleCancel }));
354
+ }
355
+ if (dialog.type === "logs" && dialog.logs !== undefined) {
356
+ return (_jsx(LogsView, { containerName: dialog.containerName || "", logs: dialog.logs, onClose: handleCancel }));
357
+ }
358
+ if (dialog.type === "inspect" && dialog.data) {
359
+ const identifiers = getItemIdentifiers();
360
+ const title = `Inspect: ${identifiers?.name || "Unknown"}`;
361
+ return _jsx(DetailView, { title: title, data: dialog.data, onClose: handleCancel });
362
+ }
363
+ return (_jsxs(Box, { flexDirection: "column", height: "100%", children: [_jsxs(Box, { marginBottom: 0, children: [_jsxs(Text, { bold: true, color: "cyan", children: ["contui v", APP_VERSION] }), _jsx(Text, { dimColor: true, children: " - Container Management TUI" })] }), _jsx(TabBar, { activeTab: activeTab }), searchMode && (_jsx(SearchInput, { value: searchInput, onChange: setSearchInput, onSubmit: handleSearchSubmit })), _jsxs(Box, { flexDirection: "column", flexGrow: 1, children: [activeTab === "containers" && (_jsx(ContainersView, { containers: containers, selectedIndex: selectedIndex, searchQuery: searchQuery })), activeTab === "images" && (_jsx(ImagesView, { images: images, selectedIndex: selectedIndex, searchQuery: searchQuery })), activeTab === "networks" && (_jsx(NetworksView, { networks: networks, selectedIndex: selectedIndex, searchQuery: searchQuery })), activeTab === "volumes" && (_jsx(VolumesView, { volumes: volumes, selectedIndex: selectedIndex, searchQuery: searchQuery }))] }), _jsx(StatusBar, { activeTab: activeTab, itemCount: getItemCount(), error: error || actionError, actionInProgress: actionInProgress, releaseStatus: releaseStatus })] }));
364
+ }
365
+ //# sourceMappingURL=App.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"App.js","sourceRoot":"","sources":["../../src/components/App.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import React from "react";
2
+ interface ConfirmDialogProps {
3
+ message: string;
4
+ onConfirm: () => void;
5
+ onCancel: () => void;
6
+ }
7
+ export declare function ConfirmDialog({ message, onConfirm, onCancel, }: ConfirmDialogProps): React.ReactElement;
8
+ export {};
9
+ //# sourceMappingURL=ConfirmDialog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConfirmDialog.d.ts","sourceRoot":"","sources":["../../src/components/ConfirmDialog.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,UAAU,kBAAkB;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,QAAQ,EAAE,MAAM,IAAI,CAAC;CACtB;AAED,wBAAgB,aAAa,CAAC,EAC5B,OAAO,EACP,SAAS,EACT,QAAQ,GACT,EAAE,kBAAkB,GAAG,KAAK,CAAC,YAAY,CAkCzC"}
@@ -0,0 +1,14 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Box, Text, useInput } from "ink";
3
+ export function ConfirmDialog({ message, onConfirm, onCancel, }) {
4
+ useInput((input, key) => {
5
+ if (input === "y" || input === "Y") {
6
+ onConfirm();
7
+ }
8
+ else if (input === "n" || input === "N" || key.escape) {
9
+ onCancel();
10
+ }
11
+ });
12
+ return (_jsxs(Box, { flexDirection: "column", borderStyle: "double", borderColor: "red", paddingX: 2, paddingY: 1, children: [_jsx(Box, { justifyContent: "center", marginBottom: 1, children: _jsx(Text, { bold: true, color: "red", children: "Confirm Action" }) }), _jsx(Box, { justifyContent: "center", children: _jsx(Text, { children: message }) }), _jsx(Box, { justifyContent: "center", marginTop: 1, children: _jsxs(Text, { children: [_jsx(Text, { color: "green", children: "[Y]" }), "es / ", _jsx(Text, { color: "red", children: "[N]" }), "o"] }) })] }));
13
+ }
14
+ //# sourceMappingURL=ConfirmDialog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConfirmDialog.js","sourceRoot":"","sources":["../../src/components/ConfirmDialog.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AAQ1C,MAAM,UAAU,aAAa,CAAC,EAC5B,OAAO,EACP,SAAS,EACT,QAAQ,GACW;IACnB,QAAQ,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QACtB,IAAI,KAAK,KAAK,GAAG,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;YACnC,SAAS,EAAE,CAAC;QACd,CAAC;aAAM,IAAI,KAAK,KAAK,GAAG,IAAI,KAAK,KAAK,GAAG,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;YACxD,QAAQ,EAAE,CAAC;QACb,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,CACL,MAAC,GAAG,IACF,aAAa,EAAC,QAAQ,EACtB,WAAW,EAAC,QAAQ,EACpB,WAAW,EAAC,KAAK,EACjB,QAAQ,EAAE,CAAC,EACX,QAAQ,EAAE,CAAC,aAEX,KAAC,GAAG,IAAC,cAAc,EAAC,QAAQ,EAAC,YAAY,EAAE,CAAC,YAC1C,KAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAC,KAAK,+BAEf,GACH,EAEN,KAAC,GAAG,IAAC,cAAc,EAAC,QAAQ,YAC1B,KAAC,IAAI,cAAE,OAAO,GAAQ,GAClB,EAEN,KAAC,GAAG,IAAC,cAAc,EAAC,QAAQ,EAAC,SAAS,EAAE,CAAC,YACvC,MAAC,IAAI,eACH,KAAC,IAAI,IAAC,KAAK,EAAC,OAAO,oBAAW,WAAK,KAAC,IAAI,IAAC,KAAK,EAAC,KAAK,oBAAW,SAC1D,GACH,IACF,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,10 @@
1
+ import React from "react";
2
+ import type { Container } from "../types/index.js";
3
+ interface ContainersViewProps {
4
+ containers: Container[];
5
+ selectedIndex: number;
6
+ searchQuery: string;
7
+ }
8
+ export declare function ContainersView({ containers, selectedIndex, searchQuery, }: ContainersViewProps): React.ReactElement;
9
+ export {};
10
+ //# sourceMappingURL=ContainersView.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ContainersView.d.ts","sourceRoot":"","sources":["../../src/components/ContainersView.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,KAAK,EAAE,SAAS,EAAmB,MAAM,mBAAmB,CAAC;AAEpE,UAAU,mBAAmB;IAC3B,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;CACrB;AAsBD,wBAAgB,cAAc,CAAC,EAC7B,UAAU,EACV,aAAa,EACb,WAAW,GACZ,EAAE,mBAAmB,GAAG,KAAK,CAAC,YAAY,CA0C1C"}