@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.
Files changed (87) hide show
  1. package/dist/src/cli.js +130 -0
  2. package/dist/src/commands/auth.js +98 -0
  3. package/dist/src/commands/helpers.js +48 -10
  4. package/dist/src/commands/project-config-manager.js +119 -0
  5. package/dist/src/commands/users.js +91 -0
  6. package/dist/src/components/agent-chat-view.js +125 -0
  7. package/dist/src/components/auth-list.js +56 -0
  8. package/dist/src/components/auth-login.js +209 -0
  9. package/dist/src/components/auth-logout.js +75 -0
  10. package/dist/src/components/auth-status.js +88 -0
  11. package/dist/src/components/brain-run.js +287 -254
  12. package/dist/src/components/brain-top-table.js +4 -0
  13. package/dist/src/components/event-detail.js +364 -0
  14. package/dist/src/components/events-view.js +221 -25
  15. package/dist/src/components/state-view.js +52 -0
  16. package/dist/src/components/top-navigator.js +80 -6
  17. package/dist/src/components/types.js +1 -0
  18. package/dist/src/components/users-create.js +293 -0
  19. package/dist/src/components/users-delete.js +294 -0
  20. package/dist/src/components/users-keys-add.js +156 -0
  21. package/dist/src/components/users-keys-list.js +119 -0
  22. package/dist/src/components/users-keys-remove.js +299 -0
  23. package/dist/src/components/users-list.js +109 -0
  24. package/dist/src/components/watch-keyboard.js +136 -0
  25. package/dist/src/components/watch-machine.js +573 -0
  26. package/dist/src/components/watch.js +357 -44
  27. package/dist/src/hooks/useApi.js +80 -42
  28. package/dist/src/lib/request-signer.js +208 -0
  29. package/dist/src/lib/ssh-key-utils.js +212 -0
  30. package/dist/src/utils/agent-utils.js +107 -0
  31. package/dist/types/cli.d.ts.map +1 -1
  32. package/dist/types/commands/auth.d.ts +36 -0
  33. package/dist/types/commands/auth.d.ts.map +1 -0
  34. package/dist/types/commands/helpers.d.ts.map +1 -1
  35. package/dist/types/commands/project-config-manager.d.ts +43 -0
  36. package/dist/types/commands/project-config-manager.d.ts.map +1 -1
  37. package/dist/types/commands/users.d.ts +33 -0
  38. package/dist/types/commands/users.d.ts.map +1 -0
  39. package/dist/types/components/agent-chat-view.d.ts +12 -0
  40. package/dist/types/components/agent-chat-view.d.ts.map +1 -0
  41. package/dist/types/components/auth-list.d.ts +7 -0
  42. package/dist/types/components/auth-list.d.ts.map +1 -0
  43. package/dist/types/components/auth-login.d.ts +9 -0
  44. package/dist/types/components/auth-login.d.ts.map +1 -0
  45. package/dist/types/components/auth-logout.d.ts +8 -0
  46. package/dist/types/components/auth-logout.d.ts.map +1 -0
  47. package/dist/types/components/auth-status.d.ts +7 -0
  48. package/dist/types/components/auth-status.d.ts.map +1 -0
  49. package/dist/types/components/brain-run.d.ts +11 -1
  50. package/dist/types/components/brain-run.d.ts.map +1 -1
  51. package/dist/types/components/brain-top-table.d.ts.map +1 -1
  52. package/dist/types/components/event-detail.d.ts +10 -0
  53. package/dist/types/components/event-detail.d.ts.map +1 -0
  54. package/dist/types/components/events-view.d.ts +9 -7
  55. package/dist/types/components/events-view.d.ts.map +1 -1
  56. package/dist/types/components/state-view.d.ts +13 -0
  57. package/dist/types/components/state-view.d.ts.map +1 -0
  58. package/dist/types/components/top-navigator.d.ts.map +1 -1
  59. package/dist/types/components/types.d.ts +11 -0
  60. package/dist/types/components/types.d.ts.map +1 -0
  61. package/dist/types/components/users-create.d.ts +6 -0
  62. package/dist/types/components/users-create.d.ts.map +1 -0
  63. package/dist/types/components/users-delete.d.ts +7 -0
  64. package/dist/types/components/users-delete.d.ts.map +1 -0
  65. package/dist/types/components/users-keys-add.d.ts +8 -0
  66. package/dist/types/components/users-keys-add.d.ts.map +1 -0
  67. package/dist/types/components/users-keys-list.d.ts +6 -0
  68. package/dist/types/components/users-keys-list.d.ts.map +1 -0
  69. package/dist/types/components/users-keys-remove.d.ts +8 -0
  70. package/dist/types/components/users-keys-remove.d.ts.map +1 -0
  71. package/dist/types/components/users-list.d.ts +2 -0
  72. package/dist/types/components/users-list.d.ts.map +1 -0
  73. package/dist/types/components/watch-keyboard.d.ts +56 -0
  74. package/dist/types/components/watch-keyboard.d.ts.map +1 -0
  75. package/dist/types/components/watch-machine.d.ts +171 -0
  76. package/dist/types/components/watch-machine.d.ts.map +1 -0
  77. package/dist/types/components/watch.d.ts.map +1 -1
  78. package/dist/types/hooks/useApi.d.ts.map +1 -1
  79. package/dist/types/hooks/useBrainMachine.d.ts +9 -3
  80. package/dist/types/hooks/useBrainMachine.d.ts.map +1 -1
  81. package/dist/types/lib/request-signer.d.ts +51 -0
  82. package/dist/types/lib/request-signer.d.ts.map +1 -0
  83. package/dist/types/lib/ssh-key-utils.d.ts +45 -0
  84. package/dist/types/lib/ssh-key-utils.d.ts.map +1 -0
  85. package/dist/types/utils/agent-utils.d.ts +20 -0
  86. package/dist/types/utils/agent-utils.d.ts.map +1 -0
  87. 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 - b or escape goes back to list
200
- if (input === 'b' || key.escape) {
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: "b back x kill"
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 = 'j/k or ↑/↓ select • Enter watch • x kill • esc quit';
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)), killError && /*#__PURE__*/ React.createElement(ErrorComponent, {
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
+ };