@positronic/cli 0.0.56 → 0.0.57
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/dist/src/cli.js +130 -0
- package/dist/src/commands/auth.js +98 -0
- package/dist/src/commands/helpers.js +48 -10
- package/dist/src/commands/project-config-manager.js +119 -0
- package/dist/src/commands/users.js +91 -0
- package/dist/src/components/agent-chat-view.js +125 -0
- package/dist/src/components/auth-list.js +56 -0
- package/dist/src/components/auth-login.js +209 -0
- package/dist/src/components/auth-logout.js +75 -0
- package/dist/src/components/auth-status.js +88 -0
- package/dist/src/components/brain-run.js +287 -254
- package/dist/src/components/brain-top-table.js +4 -0
- package/dist/src/components/event-detail.js +364 -0
- package/dist/src/components/events-view.js +221 -25
- package/dist/src/components/state-view.js +52 -0
- package/dist/src/components/top-navigator.js +80 -6
- package/dist/src/components/types.js +1 -0
- package/dist/src/components/users-create.js +293 -0
- package/dist/src/components/users-delete.js +294 -0
- package/dist/src/components/users-keys-add.js +156 -0
- package/dist/src/components/users-keys-list.js +119 -0
- package/dist/src/components/users-keys-remove.js +299 -0
- package/dist/src/components/users-list.js +109 -0
- package/dist/src/components/watch-keyboard.js +136 -0
- package/dist/src/components/watch-machine.js +573 -0
- package/dist/src/components/watch.js +357 -44
- package/dist/src/hooks/useApi.js +80 -42
- package/dist/src/lib/request-signer.js +208 -0
- package/dist/src/lib/ssh-key-utils.js +212 -0
- package/dist/src/utils/agent-utils.js +107 -0
- package/dist/types/cli.d.ts.map +1 -1
- package/dist/types/commands/auth.d.ts +36 -0
- package/dist/types/commands/auth.d.ts.map +1 -0
- package/dist/types/commands/helpers.d.ts.map +1 -1
- package/dist/types/commands/project-config-manager.d.ts +43 -0
- package/dist/types/commands/project-config-manager.d.ts.map +1 -1
- package/dist/types/commands/users.d.ts +33 -0
- package/dist/types/commands/users.d.ts.map +1 -0
- package/dist/types/components/agent-chat-view.d.ts +12 -0
- package/dist/types/components/agent-chat-view.d.ts.map +1 -0
- package/dist/types/components/auth-list.d.ts +7 -0
- package/dist/types/components/auth-list.d.ts.map +1 -0
- package/dist/types/components/auth-login.d.ts +9 -0
- package/dist/types/components/auth-login.d.ts.map +1 -0
- package/dist/types/components/auth-logout.d.ts +8 -0
- package/dist/types/components/auth-logout.d.ts.map +1 -0
- package/dist/types/components/auth-status.d.ts +7 -0
- package/dist/types/components/auth-status.d.ts.map +1 -0
- package/dist/types/components/brain-run.d.ts +11 -1
- package/dist/types/components/brain-run.d.ts.map +1 -1
- package/dist/types/components/brain-top-table.d.ts.map +1 -1
- package/dist/types/components/event-detail.d.ts +10 -0
- package/dist/types/components/event-detail.d.ts.map +1 -0
- package/dist/types/components/events-view.d.ts +9 -7
- package/dist/types/components/events-view.d.ts.map +1 -1
- package/dist/types/components/state-view.d.ts +13 -0
- package/dist/types/components/state-view.d.ts.map +1 -0
- package/dist/types/components/top-navigator.d.ts.map +1 -1
- package/dist/types/components/types.d.ts +11 -0
- package/dist/types/components/types.d.ts.map +1 -0
- package/dist/types/components/users-create.d.ts +6 -0
- package/dist/types/components/users-create.d.ts.map +1 -0
- package/dist/types/components/users-delete.d.ts +7 -0
- package/dist/types/components/users-delete.d.ts.map +1 -0
- package/dist/types/components/users-keys-add.d.ts +8 -0
- package/dist/types/components/users-keys-add.d.ts.map +1 -0
- package/dist/types/components/users-keys-list.d.ts +6 -0
- package/dist/types/components/users-keys-list.d.ts.map +1 -0
- package/dist/types/components/users-keys-remove.d.ts +8 -0
- package/dist/types/components/users-keys-remove.d.ts.map +1 -0
- package/dist/types/components/users-list.d.ts +2 -0
- package/dist/types/components/users-list.d.ts.map +1 -0
- package/dist/types/components/watch-keyboard.d.ts +56 -0
- package/dist/types/components/watch-keyboard.d.ts.map +1 -0
- package/dist/types/components/watch-machine.d.ts +171 -0
- package/dist/types/components/watch-machine.d.ts.map +1 -0
- package/dist/types/components/watch.d.ts.map +1 -1
- package/dist/types/hooks/useApi.d.ts.map +1 -1
- package/dist/types/hooks/useBrainMachine.d.ts +9 -3
- package/dist/types/hooks/useBrainMachine.d.ts.map +1 -1
- package/dist/types/lib/request-signer.d.ts +51 -0
- package/dist/types/lib/request-signer.d.ts.map +1 -0
- package/dist/types/lib/ssh-key-utils.d.ts +45 -0
- package/dist/types/lib/ssh-key-utils.d.ts.map +1 -0
- package/dist/types/utils/agent-utils.d.ts +20 -0
- package/dist/types/utils/agent-utils.d.ts.map +1 -0
- package/package.json +7 -4
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { Text, Box, useStdout, useInput } from 'ink';
|
|
3
|
+
export var StateView = function(param) {
|
|
4
|
+
var state = param.state, title = param.title, scrollOffset = param.scrollOffset, onScrollChange = param.onScrollChange, _param_isActive = param.isActive, isActive = _param_isActive === void 0 ? true : _param_isActive;
|
|
5
|
+
var stdout = useStdout().stdout;
|
|
6
|
+
var terminalHeight = (stdout === null || stdout === void 0 ? void 0 : stdout.rows) || 24;
|
|
7
|
+
// Reserve lines for header, footer, margins
|
|
8
|
+
var maxLines = Math.max(5, terminalHeight - 6);
|
|
9
|
+
var content = JSON.stringify(state, null, 2);
|
|
10
|
+
var lines = content.split('\n');
|
|
11
|
+
var totalLines = lines.length;
|
|
12
|
+
var maxScroll = Math.max(0, totalLines - maxLines);
|
|
13
|
+
// Page size keeps 2 lines of context
|
|
14
|
+
var pageSize = Math.max(1, maxLines - 2);
|
|
15
|
+
// Handle scrolling
|
|
16
|
+
useInput(function(input, key) {
|
|
17
|
+
if (!isActive) return;
|
|
18
|
+
if (key.upArrow || input === 'k') {
|
|
19
|
+
onScrollChange(Math.max(0, scrollOffset - 1));
|
|
20
|
+
} else if (key.downArrow || input === 'j') {
|
|
21
|
+
onScrollChange(Math.min(maxScroll, scrollOffset + 1));
|
|
22
|
+
} else if (input === ' ' && !key.shift) {
|
|
23
|
+
// Space = page down
|
|
24
|
+
onScrollChange(Math.min(maxScroll, scrollOffset + pageSize));
|
|
25
|
+
} else if (input === ' ' && key.shift) {
|
|
26
|
+
// Shift+Space = page up
|
|
27
|
+
onScrollChange(Math.max(0, scrollOffset - pageSize));
|
|
28
|
+
}
|
|
29
|
+
}, {
|
|
30
|
+
isActive: isActive
|
|
31
|
+
});
|
|
32
|
+
var visibleLines = lines.slice(scrollOffset, scrollOffset + maxLines);
|
|
33
|
+
return /*#__PURE__*/ React.createElement(Box, {
|
|
34
|
+
flexDirection: "column"
|
|
35
|
+
}, /*#__PURE__*/ React.createElement(Box, {
|
|
36
|
+
marginBottom: 1
|
|
37
|
+
}, /*#__PURE__*/ React.createElement(Text, {
|
|
38
|
+
bold: true,
|
|
39
|
+
color: "cyan"
|
|
40
|
+
}, title)), /*#__PURE__*/ React.createElement(Box, {
|
|
41
|
+
flexDirection: "column",
|
|
42
|
+
marginLeft: 2
|
|
43
|
+
}, visibleLines.map(function(line, i) {
|
|
44
|
+
return /*#__PURE__*/ React.createElement(Text, {
|
|
45
|
+
key: scrollOffset + i
|
|
46
|
+
}, line);
|
|
47
|
+
})), totalLines > maxLines && /*#__PURE__*/ React.createElement(Box, {
|
|
48
|
+
marginTop: 1
|
|
49
|
+
}, /*#__PURE__*/ React.createElement(Text, {
|
|
50
|
+
dimColor: true
|
|
51
|
+
}, "Lines ", scrollOffset + 1, "-", Math.min(scrollOffset + maxLines, totalLines), " of ", totalLines)));
|
|
52
|
+
};
|
|
@@ -47,7 +47,8 @@ function _unsupported_iterable_to_array(o, minLen) {
|
|
|
47
47
|
import React, { useState, useEffect, useRef } from 'react';
|
|
48
48
|
import { Text, Box, useStdout, useInput, useApp } from 'ink';
|
|
49
49
|
import { EventSource } from 'eventsource';
|
|
50
|
-
import { getApiBaseUrl, isApiLocalDevMode } from '../commands/helpers.js';
|
|
50
|
+
import { getApiBaseUrl, isApiLocalDevMode, apiClient } from '../commands/helpers.js';
|
|
51
|
+
import { STATUS } from '@positronic/core';
|
|
51
52
|
import { useApiDelete } from '../hooks/useApi.js';
|
|
52
53
|
import { ErrorComponent } from './error.js';
|
|
53
54
|
import { BrainTopTable } from './brain-top-table.js';
|
|
@@ -70,6 +71,11 @@ export var TopNavigator = function(param) {
|
|
|
70
71
|
var _useState8 = _sliced_to_array(useState(false), 2), isKilling = _useState8[0], setIsKilling = _useState8[1];
|
|
71
72
|
var _useState9 = _sliced_to_array(useState(null), 2), killMessage = _useState9[0], setKillMessage = _useState9[1];
|
|
72
73
|
var _useApiDelete = useApiDelete('brain'), killBrain = _useApiDelete.execute, killError = _useApiDelete.error;
|
|
74
|
+
// Pause/resume state (for list mode)
|
|
75
|
+
var _useState10 = _sliced_to_array(useState(false), 2), isPausing = _useState10[0], setIsPausing = _useState10[1];
|
|
76
|
+
var _useState11 = _sliced_to_array(useState(null), 2), pauseMessage = _useState11[0], setPauseMessage = _useState11[1];
|
|
77
|
+
var _useState12 = _sliced_to_array(useState(false), 2), isResuming = _useState12[0], setIsResuming = _useState12[1];
|
|
78
|
+
var _useState13 = _sliced_to_array(useState(null), 2), resumeMessage = _useState13[0], setResumeMessage = _useState13[1];
|
|
73
79
|
var eventSourceRef = useRef(null);
|
|
74
80
|
var hasReceivedDataRef = useRef(false);
|
|
75
81
|
// Filter brains client-side
|
|
@@ -192,12 +198,63 @@ export var TopNavigator = function(param) {
|
|
|
192
198
|
}
|
|
193
199
|
} else if (input === 'x' && filteredBrains.length > 0 && !isKilling) {
|
|
194
200
|
setConfirmingKill(true);
|
|
201
|
+
} else if (input === 'p' && filteredBrains.length > 0 && !isPausing) {
|
|
202
|
+
var brain2 = filteredBrains[selectedIndex];
|
|
203
|
+
if (brain2 && brain2.status === STATUS.RUNNING) {
|
|
204
|
+
setIsPausing(true);
|
|
205
|
+
apiClient.fetch("/brains/runs/".concat(brain2.brainRunId, "/signals"), {
|
|
206
|
+
method: 'POST',
|
|
207
|
+
headers: {
|
|
208
|
+
'Content-Type': 'application/json'
|
|
209
|
+
},
|
|
210
|
+
body: JSON.stringify({
|
|
211
|
+
type: 'PAUSE'
|
|
212
|
+
})
|
|
213
|
+
}).then(function(res) {
|
|
214
|
+
if (res.status === 202) {
|
|
215
|
+
setPauseMessage("Paused: ".concat(brain2.brainTitle));
|
|
216
|
+
setTimeout(function() {
|
|
217
|
+
return setPauseMessage(null);
|
|
218
|
+
}, 2000);
|
|
219
|
+
}
|
|
220
|
+
}).catch(function() {
|
|
221
|
+
// Silently ignore - user can retry
|
|
222
|
+
}).finally(function() {
|
|
223
|
+
return setIsPausing(false);
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
} else if (input === 'r' && filteredBrains.length > 0 && !isResuming) {
|
|
227
|
+
var brain3 = filteredBrains[selectedIndex];
|
|
228
|
+
if (brain3 && brain3.status === STATUS.PAUSED) {
|
|
229
|
+
setIsResuming(true);
|
|
230
|
+
apiClient.fetch("/brains/runs/".concat(brain3.brainRunId, "/signals"), {
|
|
231
|
+
method: 'POST',
|
|
232
|
+
headers: {
|
|
233
|
+
'Content-Type': 'application/json'
|
|
234
|
+
},
|
|
235
|
+
body: JSON.stringify({
|
|
236
|
+
type: 'RESUME'
|
|
237
|
+
})
|
|
238
|
+
}).then(function(res) {
|
|
239
|
+
if (res.status === 202) {
|
|
240
|
+
setResumeMessage("Resumed: ".concat(brain3.brainTitle));
|
|
241
|
+
setTimeout(function() {
|
|
242
|
+
return setResumeMessage(null);
|
|
243
|
+
}, 2000);
|
|
244
|
+
}
|
|
245
|
+
}).catch(function() {
|
|
246
|
+
// Silently ignore - user can retry
|
|
247
|
+
}).finally(function() {
|
|
248
|
+
return setIsResuming(false);
|
|
249
|
+
});
|
|
250
|
+
}
|
|
195
251
|
} else if (input === 'q' || key.escape) {
|
|
196
252
|
exit();
|
|
197
253
|
}
|
|
198
254
|
} else if (mode === 'detail') {
|
|
199
|
-
// Detail mode navigation -
|
|
200
|
-
|
|
255
|
+
// Detail mode navigation - only escape goes back to list
|
|
256
|
+
// 'b' is reserved for Watch internal navigation (back from agent-chat, state view, etc.)
|
|
257
|
+
if (key.escape) {
|
|
201
258
|
setSelectedRunId(null);
|
|
202
259
|
setMode('list');
|
|
203
260
|
}
|
|
@@ -227,7 +284,7 @@ export var TopNavigator = function(param) {
|
|
|
227
284
|
return /*#__PURE__*/ React.createElement(Watch, {
|
|
228
285
|
runId: selectedRunId,
|
|
229
286
|
manageScreenBuffer: false,
|
|
230
|
-
footer: "
|
|
287
|
+
footer: "s state | e events | a agents | x kill | esc list"
|
|
231
288
|
});
|
|
232
289
|
}
|
|
233
290
|
// List mode - show connecting state
|
|
@@ -235,10 +292,19 @@ export var TopNavigator = function(param) {
|
|
|
235
292
|
return /*#__PURE__*/ React.createElement(Box, null, /*#__PURE__*/ React.createElement(Text, null, "Connecting to watch service..."));
|
|
236
293
|
}
|
|
237
294
|
// Build footer based on state
|
|
238
|
-
var listFooter
|
|
295
|
+
var listFooter;
|
|
239
296
|
if (confirmingKill) {
|
|
240
297
|
var brain = filteredBrains[selectedIndex];
|
|
241
298
|
listFooter = 'Kill "'.concat(brain === null || brain === void 0 ? void 0 : brain.brainTitle, '"? (y/n)');
|
|
299
|
+
} else {
|
|
300
|
+
var selectedBrain = filteredBrains[selectedIndex];
|
|
301
|
+
var pauseResumeAction = '';
|
|
302
|
+
if ((selectedBrain === null || selectedBrain === void 0 ? void 0 : selectedBrain.status) === STATUS.RUNNING) {
|
|
303
|
+
pauseResumeAction = 'p pause • ';
|
|
304
|
+
} else if ((selectedBrain === null || selectedBrain === void 0 ? void 0 : selectedBrain.status) === STATUS.PAUSED) {
|
|
305
|
+
pauseResumeAction = 'r resume • ';
|
|
306
|
+
}
|
|
307
|
+
listFooter = "j/k or ↑/↓ select • Enter watch • ".concat(pauseResumeAction, "x kill • esc quit");
|
|
242
308
|
}
|
|
243
309
|
// List mode - show table
|
|
244
310
|
return /*#__PURE__*/ React.createElement(Box, {
|
|
@@ -253,7 +319,15 @@ export var TopNavigator = function(param) {
|
|
|
253
319
|
color: "yellow"
|
|
254
320
|
}, "Killing brain...")), killMessage && /*#__PURE__*/ React.createElement(Box, null, /*#__PURE__*/ React.createElement(Text, {
|
|
255
321
|
color: "green"
|
|
256
|
-
}, killMessage)),
|
|
322
|
+
}, killMessage)), isPausing && /*#__PURE__*/ React.createElement(Box, null, /*#__PURE__*/ React.createElement(Text, {
|
|
323
|
+
color: "yellow"
|
|
324
|
+
}, "Pausing brain...")), pauseMessage && /*#__PURE__*/ React.createElement(Box, null, /*#__PURE__*/ React.createElement(Text, {
|
|
325
|
+
color: "cyan"
|
|
326
|
+
}, pauseMessage)), isResuming && /*#__PURE__*/ React.createElement(Box, null, /*#__PURE__*/ React.createElement(Text, {
|
|
327
|
+
color: "yellow"
|
|
328
|
+
}, "Resuming brain...")), resumeMessage && /*#__PURE__*/ React.createElement(Box, null, /*#__PURE__*/ React.createElement(Text, {
|
|
329
|
+
color: "green"
|
|
330
|
+
}, resumeMessage)), killError && /*#__PURE__*/ React.createElement(ErrorComponent, {
|
|
257
331
|
error: killError
|
|
258
332
|
}));
|
|
259
333
|
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { };
|
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
function _array_like_to_array(arr, len) {
|
|
2
|
+
if (len == null || len > arr.length) len = arr.length;
|
|
3
|
+
for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];
|
|
4
|
+
return arr2;
|
|
5
|
+
}
|
|
6
|
+
function _array_with_holes(arr) {
|
|
7
|
+
if (Array.isArray(arr)) return arr;
|
|
8
|
+
}
|
|
9
|
+
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
|
|
10
|
+
try {
|
|
11
|
+
var info = gen[key](arg);
|
|
12
|
+
var value = info.value;
|
|
13
|
+
} catch (error) {
|
|
14
|
+
reject(error);
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
if (info.done) {
|
|
18
|
+
resolve(value);
|
|
19
|
+
} else {
|
|
20
|
+
Promise.resolve(value).then(_next, _throw);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
function _async_to_generator(fn) {
|
|
24
|
+
return function() {
|
|
25
|
+
var self = this, args = arguments;
|
|
26
|
+
return new Promise(function(resolve, reject) {
|
|
27
|
+
var gen = fn.apply(self, args);
|
|
28
|
+
function _next(value) {
|
|
29
|
+
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
|
|
30
|
+
}
|
|
31
|
+
function _throw(err) {
|
|
32
|
+
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
|
|
33
|
+
}
|
|
34
|
+
_next(undefined);
|
|
35
|
+
});
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
function _iterable_to_array_limit(arr, i) {
|
|
39
|
+
var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"];
|
|
40
|
+
if (_i == null) return;
|
|
41
|
+
var _arr = [];
|
|
42
|
+
var _n = true;
|
|
43
|
+
var _d = false;
|
|
44
|
+
var _s, _e;
|
|
45
|
+
try {
|
|
46
|
+
for(_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true){
|
|
47
|
+
_arr.push(_s.value);
|
|
48
|
+
if (i && _arr.length === i) break;
|
|
49
|
+
}
|
|
50
|
+
} catch (err) {
|
|
51
|
+
_d = true;
|
|
52
|
+
_e = err;
|
|
53
|
+
} finally{
|
|
54
|
+
try {
|
|
55
|
+
if (!_n && _i["return"] != null) _i["return"]();
|
|
56
|
+
} finally{
|
|
57
|
+
if (_d) throw _e;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return _arr;
|
|
61
|
+
}
|
|
62
|
+
function _non_iterable_rest() {
|
|
63
|
+
throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
|
|
64
|
+
}
|
|
65
|
+
function _sliced_to_array(arr, i) {
|
|
66
|
+
return _array_with_holes(arr) || _iterable_to_array_limit(arr, i) || _unsupported_iterable_to_array(arr, i) || _non_iterable_rest();
|
|
67
|
+
}
|
|
68
|
+
function _unsupported_iterable_to_array(o, minLen) {
|
|
69
|
+
if (!o) return;
|
|
70
|
+
if (typeof o === "string") return _array_like_to_array(o, minLen);
|
|
71
|
+
var n = Object.prototype.toString.call(o).slice(8, -1);
|
|
72
|
+
if (n === "Object" && o.constructor) n = o.constructor.name;
|
|
73
|
+
if (n === "Map" || n === "Set") return Array.from(n);
|
|
74
|
+
if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen);
|
|
75
|
+
}
|
|
76
|
+
function _ts_generator(thisArg, body) {
|
|
77
|
+
var f, y, t, _ = {
|
|
78
|
+
label: 0,
|
|
79
|
+
sent: function() {
|
|
80
|
+
if (t[0] & 1) throw t[1];
|
|
81
|
+
return t[1];
|
|
82
|
+
},
|
|
83
|
+
trys: [],
|
|
84
|
+
ops: []
|
|
85
|
+
}, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
|
|
86
|
+
return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() {
|
|
87
|
+
return this;
|
|
88
|
+
}), g;
|
|
89
|
+
function verb(n) {
|
|
90
|
+
return function(v) {
|
|
91
|
+
return step([
|
|
92
|
+
n,
|
|
93
|
+
v
|
|
94
|
+
]);
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
function step(op) {
|
|
98
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
99
|
+
while(g && (g = 0, op[0] && (_ = 0)), _)try {
|
|
100
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
101
|
+
if (y = 0, t) op = [
|
|
102
|
+
op[0] & 2,
|
|
103
|
+
t.value
|
|
104
|
+
];
|
|
105
|
+
switch(op[0]){
|
|
106
|
+
case 0:
|
|
107
|
+
case 1:
|
|
108
|
+
t = op;
|
|
109
|
+
break;
|
|
110
|
+
case 4:
|
|
111
|
+
_.label++;
|
|
112
|
+
return {
|
|
113
|
+
value: op[1],
|
|
114
|
+
done: false
|
|
115
|
+
};
|
|
116
|
+
case 5:
|
|
117
|
+
_.label++;
|
|
118
|
+
y = op[1];
|
|
119
|
+
op = [
|
|
120
|
+
0
|
|
121
|
+
];
|
|
122
|
+
continue;
|
|
123
|
+
case 7:
|
|
124
|
+
op = _.ops.pop();
|
|
125
|
+
_.trys.pop();
|
|
126
|
+
continue;
|
|
127
|
+
default:
|
|
128
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {
|
|
129
|
+
_ = 0;
|
|
130
|
+
continue;
|
|
131
|
+
}
|
|
132
|
+
if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {
|
|
133
|
+
_.label = op[1];
|
|
134
|
+
break;
|
|
135
|
+
}
|
|
136
|
+
if (op[0] === 6 && _.label < t[1]) {
|
|
137
|
+
_.label = t[1];
|
|
138
|
+
t = op;
|
|
139
|
+
break;
|
|
140
|
+
}
|
|
141
|
+
if (t && _.label < t[2]) {
|
|
142
|
+
_.label = t[2];
|
|
143
|
+
_.ops.push(op);
|
|
144
|
+
break;
|
|
145
|
+
}
|
|
146
|
+
if (t[2]) _.ops.pop();
|
|
147
|
+
_.trys.pop();
|
|
148
|
+
continue;
|
|
149
|
+
}
|
|
150
|
+
op = body.call(thisArg, _);
|
|
151
|
+
} catch (e) {
|
|
152
|
+
op = [
|
|
153
|
+
6,
|
|
154
|
+
e
|
|
155
|
+
];
|
|
156
|
+
y = 0;
|
|
157
|
+
} finally{
|
|
158
|
+
f = t = 0;
|
|
159
|
+
}
|
|
160
|
+
if (op[0] & 5) throw op[1];
|
|
161
|
+
return {
|
|
162
|
+
value: op[0] ? op[1] : void 0,
|
|
163
|
+
done: true
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
import React, { useEffect, useState } from 'react';
|
|
168
|
+
import { Box, Text } from 'ink';
|
|
169
|
+
import { ErrorComponent } from './error.js';
|
|
170
|
+
import { apiClient } from '../commands/helpers.js';
|
|
171
|
+
export var UsersCreate = function(param) {
|
|
172
|
+
var name = param.name;
|
|
173
|
+
var _useState = _sliced_to_array(useState(null), 2), data = _useState[0], setData = _useState[1];
|
|
174
|
+
var _useState1 = _sliced_to_array(useState(true), 2), loading = _useState1[0], setLoading = _useState1[1];
|
|
175
|
+
var _useState2 = _sliced_to_array(useState(null), 2), error = _useState2[0], setError = _useState2[1];
|
|
176
|
+
useEffect(function() {
|
|
177
|
+
var createUser = function() {
|
|
178
|
+
return _async_to_generator(function() {
|
|
179
|
+
var response, result, errorText, err;
|
|
180
|
+
return _ts_generator(this, function(_state) {
|
|
181
|
+
switch(_state.label){
|
|
182
|
+
case 0:
|
|
183
|
+
_state.trys.push([
|
|
184
|
+
0,
|
|
185
|
+
6,
|
|
186
|
+
7,
|
|
187
|
+
8
|
|
188
|
+
]);
|
|
189
|
+
return [
|
|
190
|
+
4,
|
|
191
|
+
apiClient.fetch('/users', {
|
|
192
|
+
method: 'POST',
|
|
193
|
+
headers: {
|
|
194
|
+
'Content-Type': 'application/json'
|
|
195
|
+
},
|
|
196
|
+
body: JSON.stringify({
|
|
197
|
+
name: name
|
|
198
|
+
})
|
|
199
|
+
})
|
|
200
|
+
];
|
|
201
|
+
case 1:
|
|
202
|
+
response = _state.sent();
|
|
203
|
+
if (!(response.status === 201)) return [
|
|
204
|
+
3,
|
|
205
|
+
3
|
|
206
|
+
];
|
|
207
|
+
return [
|
|
208
|
+
4,
|
|
209
|
+
response.json()
|
|
210
|
+
];
|
|
211
|
+
case 2:
|
|
212
|
+
result = _state.sent();
|
|
213
|
+
setData(result);
|
|
214
|
+
return [
|
|
215
|
+
3,
|
|
216
|
+
5
|
|
217
|
+
];
|
|
218
|
+
case 3:
|
|
219
|
+
return [
|
|
220
|
+
4,
|
|
221
|
+
response.text()
|
|
222
|
+
];
|
|
223
|
+
case 4:
|
|
224
|
+
errorText = _state.sent();
|
|
225
|
+
setError({
|
|
226
|
+
title: 'Server Error',
|
|
227
|
+
message: "Error creating user: ".concat(response.status, " ").concat(response.statusText),
|
|
228
|
+
details: "Server response: ".concat(errorText)
|
|
229
|
+
});
|
|
230
|
+
_state.label = 5;
|
|
231
|
+
case 5:
|
|
232
|
+
return [
|
|
233
|
+
3,
|
|
234
|
+
8
|
|
235
|
+
];
|
|
236
|
+
case 6:
|
|
237
|
+
err = _state.sent();
|
|
238
|
+
setError({
|
|
239
|
+
title: 'Connection Error',
|
|
240
|
+
message: 'Error connecting to the local development server.',
|
|
241
|
+
details: err.message
|
|
242
|
+
});
|
|
243
|
+
return [
|
|
244
|
+
3,
|
|
245
|
+
8
|
|
246
|
+
];
|
|
247
|
+
case 7:
|
|
248
|
+
setLoading(false);
|
|
249
|
+
return [
|
|
250
|
+
7
|
|
251
|
+
];
|
|
252
|
+
case 8:
|
|
253
|
+
return [
|
|
254
|
+
2
|
|
255
|
+
];
|
|
256
|
+
}
|
|
257
|
+
});
|
|
258
|
+
})();
|
|
259
|
+
};
|
|
260
|
+
createUser();
|
|
261
|
+
}, [
|
|
262
|
+
name
|
|
263
|
+
]);
|
|
264
|
+
if (error) {
|
|
265
|
+
return /*#__PURE__*/ React.createElement(ErrorComponent, {
|
|
266
|
+
error: error
|
|
267
|
+
});
|
|
268
|
+
}
|
|
269
|
+
if (loading) {
|
|
270
|
+
return /*#__PURE__*/ React.createElement(Box, null, /*#__PURE__*/ React.createElement(Text, null, 'Creating user "', name, '"...'));
|
|
271
|
+
}
|
|
272
|
+
if (data) {
|
|
273
|
+
return /*#__PURE__*/ React.createElement(Box, {
|
|
274
|
+
flexDirection: "column",
|
|
275
|
+
paddingTop: 1,
|
|
276
|
+
paddingBottom: 1
|
|
277
|
+
}, /*#__PURE__*/ React.createElement(Text, {
|
|
278
|
+
color: "green"
|
|
279
|
+
}, "User created successfully!"), /*#__PURE__*/ React.createElement(Box, {
|
|
280
|
+
marginTop: 1,
|
|
281
|
+
flexDirection: "column"
|
|
282
|
+
}, /*#__PURE__*/ React.createElement(Text, null, /*#__PURE__*/ React.createElement(Text, {
|
|
283
|
+
bold: true
|
|
284
|
+
}, "Name:"), " ", data.name), /*#__PURE__*/ React.createElement(Text, null, /*#__PURE__*/ React.createElement(Text, {
|
|
285
|
+
bold: true
|
|
286
|
+
}, "ID:"), " ", data.id)), /*#__PURE__*/ React.createElement(Box, {
|
|
287
|
+
marginTop: 1
|
|
288
|
+
}, /*#__PURE__*/ React.createElement(Text, {
|
|
289
|
+
dimColor: true
|
|
290
|
+
}, "Add a key with: px users ", data.id, " keys add ~/.ssh/id_rsa.pub")));
|
|
291
|
+
}
|
|
292
|
+
return null;
|
|
293
|
+
};
|