@positronic/cli 0.0.60 → 0.0.62
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 +3 -3
- package/dist/src/commands/helpers.js +2 -9
- package/dist/src/components/event-detail.js +2 -0
- package/dist/src/components/project-auth-setup.js +241 -0
- package/dist/src/components/project-create.js +33 -1
- package/dist/src/components/top-navigator.js +4 -1
- package/dist/src/components/watch.js +11 -4
- package/dist/src/lib/jwt-auth.js +91 -9
- package/dist/src/lib/ssh-key-utils.js +51 -1
- package/dist/types/commands/helpers.d.ts.map +1 -1
- package/dist/types/components/event-detail.d.ts.map +1 -1
- package/dist/types/components/project-auth-setup.d.ts +7 -0
- package/dist/types/components/project-auth-setup.d.ts.map +1 -0
- package/dist/types/components/project-create.d.ts.map +1 -1
- package/dist/types/components/top-navigator.d.ts.map +1 -1
- package/dist/types/components/watch.d.ts.map +1 -1
- package/dist/types/lib/jwt-auth.d.ts +8 -2
- package/dist/types/lib/jwt-auth.d.ts.map +1 -1
- package/dist/types/lib/ssh-key-utils.d.ts +10 -0
- package/dist/types/lib/ssh-key-utils.d.ts.map +1 -1
- package/package.json +4 -4
package/dist/src/cli.js
CHANGED
|
@@ -954,9 +954,9 @@ export function buildCli(options) {
|
|
|
954
954
|
}).demandCommand(1, 'You need to specify a users command (list, create, delete, keys)');
|
|
955
955
|
return yargsUsers;
|
|
956
956
|
});
|
|
957
|
-
// --- Auth Commands (
|
|
958
|
-
|
|
959
|
-
|
|
957
|
+
// --- Auth Commands (Available in both local and global mode) ---
|
|
958
|
+
var authCommand = new AuthCommand();
|
|
959
|
+
{
|
|
960
960
|
cli = cli.command('auth', 'Manage authentication configuration\n', function(yargsAuth) {
|
|
961
961
|
yargsAuth.command('status', 'Show current auth configuration\n', function() {}, function() {
|
|
962
962
|
var element = authCommand.status();
|
|
@@ -267,7 +267,7 @@ var isLocalDevMode = true;
|
|
|
267
267
|
export var apiClient = {
|
|
268
268
|
fetch: function(apiPath, options) {
|
|
269
269
|
return _async_to_generator(function() {
|
|
270
|
-
var baseUrl, port, fullUrl,
|
|
270
|
+
var baseUrl, port, fullUrl, existingHeaders, headersObj, authHeader, requestOptions;
|
|
271
271
|
return _ts_generator(this, function(_state) {
|
|
272
272
|
switch(_state.label){
|
|
273
273
|
case 0:
|
|
@@ -279,12 +279,7 @@ export var apiClient = {
|
|
|
279
279
|
baseUrl = "http://localhost:".concat(port);
|
|
280
280
|
}
|
|
281
281
|
fullUrl = "".concat(baseUrl).concat(apiPath.startsWith('/') ? apiPath : '/' + apiPath);
|
|
282
|
-
// Add auth header
|
|
283
|
-
requestOptions = options || {};
|
|
284
|
-
if (!!isLocalDevMode) return [
|
|
285
|
-
3,
|
|
286
|
-
2
|
|
287
|
-
];
|
|
282
|
+
// Add auth header to all requests
|
|
288
283
|
existingHeaders = (options === null || options === void 0 ? void 0 : options.headers) || {};
|
|
289
284
|
headersObj = {};
|
|
290
285
|
// Convert headers to plain object
|
|
@@ -309,8 +304,6 @@ export var apiClient = {
|
|
|
309
304
|
requestOptions = _object_spread_props(_object_spread({}, options), {
|
|
310
305
|
headers: _object_spread({}, headersObj, authHeader)
|
|
311
306
|
});
|
|
312
|
-
_state.label = 2;
|
|
313
|
-
case 2:
|
|
314
307
|
return [
|
|
315
308
|
2,
|
|
316
309
|
fetch(fullUrl, requestOptions)
|
|
@@ -0,0 +1,241 @@
|
|
|
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 _instanceof(left, right) {
|
|
10
|
+
if (right != null && typeof Symbol !== "undefined" && right[Symbol.hasInstance]) {
|
|
11
|
+
return !!right[Symbol.hasInstance](left);
|
|
12
|
+
} else {
|
|
13
|
+
return left instanceof right;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
function _iterable_to_array_limit(arr, i) {
|
|
17
|
+
var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"];
|
|
18
|
+
if (_i == null) return;
|
|
19
|
+
var _arr = [];
|
|
20
|
+
var _n = true;
|
|
21
|
+
var _d = false;
|
|
22
|
+
var _s, _e;
|
|
23
|
+
try {
|
|
24
|
+
for(_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true){
|
|
25
|
+
_arr.push(_s.value);
|
|
26
|
+
if (i && _arr.length === i) break;
|
|
27
|
+
}
|
|
28
|
+
} catch (err) {
|
|
29
|
+
_d = true;
|
|
30
|
+
_e = err;
|
|
31
|
+
} finally{
|
|
32
|
+
try {
|
|
33
|
+
if (!_n && _i["return"] != null) _i["return"]();
|
|
34
|
+
} finally{
|
|
35
|
+
if (_d) throw _e;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return _arr;
|
|
39
|
+
}
|
|
40
|
+
function _non_iterable_rest() {
|
|
41
|
+
throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
|
|
42
|
+
}
|
|
43
|
+
function _sliced_to_array(arr, i) {
|
|
44
|
+
return _array_with_holes(arr) || _iterable_to_array_limit(arr, i) || _unsupported_iterable_to_array(arr, i) || _non_iterable_rest();
|
|
45
|
+
}
|
|
46
|
+
function _unsupported_iterable_to_array(o, minLen) {
|
|
47
|
+
if (!o) return;
|
|
48
|
+
if (typeof o === "string") return _array_like_to_array(o, minLen);
|
|
49
|
+
var n = Object.prototype.toString.call(o).slice(8, -1);
|
|
50
|
+
if (n === "Object" && o.constructor) n = o.constructor.name;
|
|
51
|
+
if (n === "Map" || n === "Set") return Array.from(n);
|
|
52
|
+
if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen);
|
|
53
|
+
}
|
|
54
|
+
import React, { useState, useEffect } from 'react';
|
|
55
|
+
import { Box, Text, useApp } from 'ink';
|
|
56
|
+
import { ProjectConfigManager } from '../commands/project-config-manager.js';
|
|
57
|
+
import { discoverSSHKeys, generateSSHKey, convertSSHPubKeyToJWK } from '../lib/ssh-key-utils.js';
|
|
58
|
+
import { resetJwtAuthProvider } from '../lib/jwt-auth.js';
|
|
59
|
+
import { SelectList } from './select-list.js';
|
|
60
|
+
import { appendFileSync, existsSync, writeFileSync } from 'fs';
|
|
61
|
+
import { join } from 'path';
|
|
62
|
+
export var ProjectAuthSetup = function(param) {
|
|
63
|
+
var projectDir = param.projectDir, onComplete = param.onComplete;
|
|
64
|
+
var exit = useApp().exit;
|
|
65
|
+
var _useState = _sliced_to_array(useState('checking'), 2), state = _useState[0], setState = _useState[1];
|
|
66
|
+
var _useState1 = _sliced_to_array(useState([]), 2), discoveredKeys = _useState1[0], setDiscoveredKeys = _useState1[1];
|
|
67
|
+
var _useState2 = _sliced_to_array(useState(null), 2), selectedKey = _useState2[0], setSelectedKey = _useState2[1];
|
|
68
|
+
var _useState3 = _sliced_to_array(useState(null), 2), error = _useState3[0], setError = _useState3[1];
|
|
69
|
+
var _useState4 = _sliced_to_array(useState(null), 2), generatedKeyPath = _useState4[0], setGeneratedKeyPath = _useState4[1];
|
|
70
|
+
// Check for existing keys on mount
|
|
71
|
+
useEffect(function() {
|
|
72
|
+
var keys = discoverSSHKeys();
|
|
73
|
+
setDiscoveredKeys(keys);
|
|
74
|
+
if (keys.length === 0) {
|
|
75
|
+
// No keys found, generate one
|
|
76
|
+
setState('generating');
|
|
77
|
+
} else if (keys.length === 1) {
|
|
78
|
+
// Auto-select single key
|
|
79
|
+
setSelectedKey(keys[0]);
|
|
80
|
+
setState('configuring');
|
|
81
|
+
} else {
|
|
82
|
+
// Multiple keys, show selection
|
|
83
|
+
setState('selecting');
|
|
84
|
+
}
|
|
85
|
+
}, []);
|
|
86
|
+
// Generate key when in generating state
|
|
87
|
+
useEffect(function() {
|
|
88
|
+
if (state !== 'generating') return;
|
|
89
|
+
var result = generateSSHKey();
|
|
90
|
+
if (result.success) {
|
|
91
|
+
setGeneratedKeyPath(result.path);
|
|
92
|
+
// Re-discover keys to get the newly generated key
|
|
93
|
+
var keys = discoverSSHKeys();
|
|
94
|
+
var newKey = keys.find(function(k) {
|
|
95
|
+
return k.path === result.path;
|
|
96
|
+
});
|
|
97
|
+
if (newKey) {
|
|
98
|
+
setSelectedKey(newKey);
|
|
99
|
+
setState('configuring');
|
|
100
|
+
} else {
|
|
101
|
+
setError('Generated key but could not find it');
|
|
102
|
+
setState('error');
|
|
103
|
+
}
|
|
104
|
+
} else {
|
|
105
|
+
setError(result.error || 'Failed to generate SSH key');
|
|
106
|
+
setState('error');
|
|
107
|
+
}
|
|
108
|
+
}, [
|
|
109
|
+
state
|
|
110
|
+
]);
|
|
111
|
+
// Configure project when key is selected
|
|
112
|
+
useEffect(function() {
|
|
113
|
+
if (state !== 'configuring' || !selectedKey) return;
|
|
114
|
+
try {
|
|
115
|
+
// Convert public key to JWK
|
|
116
|
+
var pubKeyPath = selectedKey.path + '.pub';
|
|
117
|
+
if (!existsSync(pubKeyPath)) {
|
|
118
|
+
setError("Public key not found at ".concat(pubKeyPath));
|
|
119
|
+
setState('error');
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
var keyInfo = convertSSHPubKeyToJWK(pubKeyPath);
|
|
123
|
+
var jwkString = JSON.stringify(keyInfo.jwk);
|
|
124
|
+
// Write ROOT_PUBLIC_KEY to project .env file
|
|
125
|
+
var envPath = join(projectDir, '.env');
|
|
126
|
+
var envLine = "ROOT_PUBLIC_KEY='".concat(jwkString, "'\n");
|
|
127
|
+
if (existsSync(envPath)) {
|
|
128
|
+
appendFileSync(envPath, envLine);
|
|
129
|
+
} else {
|
|
130
|
+
writeFileSync(envPath, envLine);
|
|
131
|
+
}
|
|
132
|
+
// Set the CLI to use this key globally
|
|
133
|
+
var configManager = new ProjectConfigManager();
|
|
134
|
+
var displayPath = selectedKey.path.replace(process.env.HOME || '', '~');
|
|
135
|
+
configManager.setDefaultPrivateKeyPath(displayPath);
|
|
136
|
+
// Reset JWT provider to use the new key
|
|
137
|
+
resetJwtAuthProvider();
|
|
138
|
+
setState('success');
|
|
139
|
+
} catch (err) {
|
|
140
|
+
setError(_instanceof(err, Error) ? err.message : 'Failed to configure auth');
|
|
141
|
+
setState('error');
|
|
142
|
+
}
|
|
143
|
+
}, [
|
|
144
|
+
state,
|
|
145
|
+
selectedKey,
|
|
146
|
+
projectDir
|
|
147
|
+
]);
|
|
148
|
+
// Auto-complete on success after a short delay
|
|
149
|
+
useEffect(function() {
|
|
150
|
+
if (state === 'success') {
|
|
151
|
+
var timer = setTimeout(function() {
|
|
152
|
+
onComplete();
|
|
153
|
+
}, 100);
|
|
154
|
+
return function() {
|
|
155
|
+
return clearTimeout(timer);
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
}, [
|
|
159
|
+
state,
|
|
160
|
+
onComplete
|
|
161
|
+
]);
|
|
162
|
+
// Checking state
|
|
163
|
+
if (state === 'checking') {
|
|
164
|
+
return /*#__PURE__*/ React.createElement(Box, {
|
|
165
|
+
flexDirection: "column"
|
|
166
|
+
}, /*#__PURE__*/ React.createElement(Text, null, "Checking for SSH keys..."));
|
|
167
|
+
}
|
|
168
|
+
// Generating state
|
|
169
|
+
if (state === 'generating') {
|
|
170
|
+
return /*#__PURE__*/ React.createElement(Box, {
|
|
171
|
+
flexDirection: "column"
|
|
172
|
+
}, /*#__PURE__*/ React.createElement(Text, null, "No SSH keys found. Generating a new Ed25519 key..."));
|
|
173
|
+
}
|
|
174
|
+
// Selecting state - show key picker
|
|
175
|
+
if (state === 'selecting') {
|
|
176
|
+
var items = discoveredKeys.map(function(key) {
|
|
177
|
+
return {
|
|
178
|
+
id: key.path,
|
|
179
|
+
label: key.path.replace(process.env.HOME || '', '~'),
|
|
180
|
+
description: "".concat(key.algorithm, " - ").concat(key.fingerprint).concat(key.comment ? " (".concat(key.comment, ")") : '')
|
|
181
|
+
};
|
|
182
|
+
});
|
|
183
|
+
var handleSelect = function(item) {
|
|
184
|
+
var key = discoveredKeys.find(function(k) {
|
|
185
|
+
return k.path === item.id;
|
|
186
|
+
});
|
|
187
|
+
if (key) {
|
|
188
|
+
setSelectedKey(key);
|
|
189
|
+
setState('configuring');
|
|
190
|
+
}
|
|
191
|
+
};
|
|
192
|
+
var handleCancel = function() {
|
|
193
|
+
exit();
|
|
194
|
+
};
|
|
195
|
+
return /*#__PURE__*/ React.createElement(SelectList, {
|
|
196
|
+
items: items,
|
|
197
|
+
header: "Select an SSH key to use for this project",
|
|
198
|
+
onSelect: handleSelect,
|
|
199
|
+
onCancel: handleCancel,
|
|
200
|
+
footer: "Use arrow keys to navigate, Enter to select, q to cancel"
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
// Configuring state
|
|
204
|
+
if (state === 'configuring') {
|
|
205
|
+
return /*#__PURE__*/ React.createElement(Box, {
|
|
206
|
+
flexDirection: "column"
|
|
207
|
+
}, /*#__PURE__*/ React.createElement(Text, null, "Configuring authentication..."));
|
|
208
|
+
}
|
|
209
|
+
// Success state
|
|
210
|
+
if (state === 'success' && selectedKey) {
|
|
211
|
+
var displayPath = selectedKey.path.replace(process.env.HOME || '', '~');
|
|
212
|
+
return /*#__PURE__*/ React.createElement(Box, {
|
|
213
|
+
flexDirection: "column",
|
|
214
|
+
marginTop: 1
|
|
215
|
+
}, /*#__PURE__*/ React.createElement(Text, {
|
|
216
|
+
color: "green"
|
|
217
|
+
}, "Authentication configured!"), /*#__PURE__*/ React.createElement(Box, {
|
|
218
|
+
paddingLeft: 2,
|
|
219
|
+
flexDirection: "column"
|
|
220
|
+
}, /*#__PURE__*/ React.createElement(Text, null, /*#__PURE__*/ React.createElement(Text, {
|
|
221
|
+
bold: true
|
|
222
|
+
}, "SSH Key:"), " ", displayPath), generatedKeyPath && /*#__PURE__*/ React.createElement(Text, {
|
|
223
|
+
dimColor: true
|
|
224
|
+
}, "(New key generated at ", generatedKeyPath, ")")));
|
|
225
|
+
}
|
|
226
|
+
// Error state
|
|
227
|
+
if (state === 'error') {
|
|
228
|
+
return /*#__PURE__*/ React.createElement(Box, {
|
|
229
|
+
flexDirection: "column",
|
|
230
|
+
paddingTop: 1,
|
|
231
|
+
paddingBottom: 1
|
|
232
|
+
}, /*#__PURE__*/ React.createElement(Text, {
|
|
233
|
+
color: "red"
|
|
234
|
+
}, "Auth setup failed: ", error), /*#__PURE__*/ React.createElement(Box, {
|
|
235
|
+
marginTop: 1
|
|
236
|
+
}, /*#__PURE__*/ React.createElement(Text, {
|
|
237
|
+
dimColor: true
|
|
238
|
+
}, "You can manually configure auth later with: px auth login")));
|
|
239
|
+
}
|
|
240
|
+
return null;
|
|
241
|
+
};
|
|
@@ -174,6 +174,7 @@ function _ts_generator(thisArg, body) {
|
|
|
174
174
|
import React, { useState, useEffect } from 'react';
|
|
175
175
|
import { Box, Text } from 'ink';
|
|
176
176
|
import { generateProject } from '../commands/helpers.js';
|
|
177
|
+
import { ProjectAuthSetup } from './project-auth-setup.js';
|
|
177
178
|
import path from 'path';
|
|
178
179
|
export var ProjectCreate = function(param) {
|
|
179
180
|
var projectPathArg = param.projectPathArg;
|
|
@@ -204,7 +205,12 @@ export var ProjectCreate = function(param) {
|
|
|
204
205
|
];
|
|
205
206
|
case 1:
|
|
206
207
|
_state.sent();
|
|
207
|
-
|
|
208
|
+
// After scaffolding, move to auth setup (skip in test environment)
|
|
209
|
+
if (process.env.NODE_ENV === 'test') {
|
|
210
|
+
setStatus('success');
|
|
211
|
+
} else {
|
|
212
|
+
setStatus('auth_setup');
|
|
213
|
+
}
|
|
208
214
|
return [
|
|
209
215
|
3,
|
|
210
216
|
3
|
|
@@ -241,6 +247,32 @@ export var ProjectCreate = function(param) {
|
|
|
241
247
|
color: "red"
|
|
242
248
|
}, "Error creating project: ", error));
|
|
243
249
|
}
|
|
250
|
+
if (status === 'auth_setup') {
|
|
251
|
+
return /*#__PURE__*/ React.createElement(Box, {
|
|
252
|
+
flexDirection: "column",
|
|
253
|
+
paddingTop: 1
|
|
254
|
+
}, /*#__PURE__*/ React.createElement(Text, {
|
|
255
|
+
bold: true,
|
|
256
|
+
color: "green"
|
|
257
|
+
}, "Project scaffolded!"), /*#__PURE__*/ React.createElement(Box, {
|
|
258
|
+
marginTop: 1,
|
|
259
|
+
paddingLeft: 2,
|
|
260
|
+
flexDirection: "column"
|
|
261
|
+
}, /*#__PURE__*/ React.createElement(Text, null, /*#__PURE__*/ React.createElement(Text, {
|
|
262
|
+
bold: true
|
|
263
|
+
}, "Name:"), " ", projectName), /*#__PURE__*/ React.createElement(Text, null, /*#__PURE__*/ React.createElement(Text, {
|
|
264
|
+
bold: true
|
|
265
|
+
}, "Location:"), " ", projectDir)), /*#__PURE__*/ React.createElement(Box, {
|
|
266
|
+
marginTop: 1
|
|
267
|
+
}, /*#__PURE__*/ React.createElement(Text, {
|
|
268
|
+
bold: true
|
|
269
|
+
}, "Setting up authentication...")), /*#__PURE__*/ React.createElement(ProjectAuthSetup, {
|
|
270
|
+
projectDir: projectDir,
|
|
271
|
+
onComplete: function() {
|
|
272
|
+
return setStatus('success');
|
|
273
|
+
}
|
|
274
|
+
}));
|
|
275
|
+
}
|
|
244
276
|
return /*#__PURE__*/ React.createElement(Box, {
|
|
245
277
|
flexDirection: "column",
|
|
246
278
|
paddingTop: 1,
|
|
@@ -48,6 +48,7 @@ import React, { useState, useEffect, useRef } from 'react';
|
|
|
48
48
|
import { Text, Box, useStdout, useInput, useApp } from 'ink';
|
|
49
49
|
import { EventSource } from 'eventsource';
|
|
50
50
|
import { getApiBaseUrl, isApiLocalDevMode, apiClient } from '../commands/helpers.js';
|
|
51
|
+
import { authenticatedFetch } from '../lib/jwt-auth.js';
|
|
51
52
|
import { STATUS } from '@positronic/core';
|
|
52
53
|
import { useApiDelete } from '../hooks/useApi.js';
|
|
53
54
|
import { ErrorComponent } from './error.js';
|
|
@@ -123,7 +124,9 @@ export var TopNavigator = function(param) {
|
|
|
123
124
|
}
|
|
124
125
|
var baseUrl = getApiBaseUrl();
|
|
125
126
|
var url = "".concat(baseUrl, "/brains/watch");
|
|
126
|
-
var es = new EventSource(url
|
|
127
|
+
var es = new EventSource(url, {
|
|
128
|
+
fetch: authenticatedFetch
|
|
129
|
+
});
|
|
127
130
|
eventSourceRef.current = es;
|
|
128
131
|
setIsConnected(false);
|
|
129
132
|
setError(null);
|
|
@@ -91,6 +91,7 @@ import { EventSource } from 'eventsource';
|
|
|
91
91
|
import { BRAIN_EVENTS, STATUS, reconstructBrainTree, createBrainExecutionMachine, sendEvent } from '@positronic/core';
|
|
92
92
|
import { useBrainMachine } from '../hooks/useBrainMachine.js';
|
|
93
93
|
import { getApiBaseUrl, isApiLocalDevMode } from '../commands/helpers.js';
|
|
94
|
+
import { authenticatedFetch } from '../lib/jwt-auth.js';
|
|
94
95
|
import { ErrorComponent } from './error.js';
|
|
95
96
|
import { EventsView } from './events-view.js';
|
|
96
97
|
import { StateView } from './state-view.js';
|
|
@@ -105,9 +106,9 @@ var getCurrentStepIndex = function(steps) {
|
|
|
105
106
|
return s.status === STATUS.RUNNING;
|
|
106
107
|
});
|
|
107
108
|
if (runningIndex >= 0) return runningIndex;
|
|
108
|
-
// Find the last completed step
|
|
109
|
+
// Find the last completed/halted step
|
|
109
110
|
for(var i = steps.length - 1; i >= 0; i--){
|
|
110
|
-
if (steps[i].status === STATUS.COMPLETE || steps[i].status === STATUS.ERROR) {
|
|
111
|
+
if (steps[i].status === STATUS.COMPLETE || steps[i].status === STATUS.HALTED || steps[i].status === STATUS.ERROR) {
|
|
111
112
|
return i;
|
|
112
113
|
}
|
|
113
114
|
}
|
|
@@ -116,7 +117,7 @@ var getCurrentStepIndex = function(steps) {
|
|
|
116
117
|
// Count completed steps
|
|
117
118
|
var getCompletedCount = function(steps) {
|
|
118
119
|
return steps.filter(function(s) {
|
|
119
|
-
return s.status === STATUS.COMPLETE;
|
|
120
|
+
return s.status === STATUS.COMPLETE || s.status === STATUS.HALTED;
|
|
120
121
|
}).length;
|
|
121
122
|
};
|
|
122
123
|
// Get status indicator character
|
|
@@ -124,6 +125,8 @@ var getStatusChar = function(status) {
|
|
|
124
125
|
switch(status){
|
|
125
126
|
case STATUS.COMPLETE:
|
|
126
127
|
return '✓';
|
|
128
|
+
case STATUS.HALTED:
|
|
129
|
+
return '-';
|
|
127
130
|
case STATUS.ERROR:
|
|
128
131
|
return '✗';
|
|
129
132
|
case STATUS.RUNNING:
|
|
@@ -139,6 +142,8 @@ var getStatusColor = function(status) {
|
|
|
139
142
|
switch(status){
|
|
140
143
|
case STATUS.COMPLETE:
|
|
141
144
|
return 'green';
|
|
145
|
+
case STATUS.HALTED:
|
|
146
|
+
return 'gray';
|
|
142
147
|
case STATUS.ERROR:
|
|
143
148
|
return 'red';
|
|
144
149
|
case STATUS.RUNNING:
|
|
@@ -279,7 +284,9 @@ export var Watch = function(param) {
|
|
|
279
284
|
useEffect(function() {
|
|
280
285
|
var baseUrl = getApiBaseUrl();
|
|
281
286
|
var url = "".concat(baseUrl, "/brains/runs/").concat(runId, "/watch");
|
|
282
|
-
var es = new EventSource(url
|
|
287
|
+
var es = new EventSource(url, {
|
|
288
|
+
fetch: authenticatedFetch
|
|
289
|
+
});
|
|
283
290
|
// Reset connection state for new connection
|
|
284
291
|
// Note: rootBrain and isComplete are handled by the new machine (via useMemo)
|
|
285
292
|
setIsConnected(false);
|
package/dist/src/lib/jwt-auth.js
CHANGED
|
@@ -66,6 +66,45 @@ function _instanceof(left, right) {
|
|
|
66
66
|
return left instanceof right;
|
|
67
67
|
}
|
|
68
68
|
}
|
|
69
|
+
function _object_spread(target) {
|
|
70
|
+
for(var i = 1; i < arguments.length; i++){
|
|
71
|
+
var source = arguments[i] != null ? arguments[i] : {};
|
|
72
|
+
var ownKeys = Object.keys(source);
|
|
73
|
+
if (typeof Object.getOwnPropertySymbols === "function") {
|
|
74
|
+
ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) {
|
|
75
|
+
return Object.getOwnPropertyDescriptor(source, sym).enumerable;
|
|
76
|
+
}));
|
|
77
|
+
}
|
|
78
|
+
ownKeys.forEach(function(key) {
|
|
79
|
+
_define_property(target, key, source[key]);
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
return target;
|
|
83
|
+
}
|
|
84
|
+
function ownKeys(object, enumerableOnly) {
|
|
85
|
+
var keys = Object.keys(object);
|
|
86
|
+
if (Object.getOwnPropertySymbols) {
|
|
87
|
+
var symbols = Object.getOwnPropertySymbols(object);
|
|
88
|
+
if (enumerableOnly) {
|
|
89
|
+
symbols = symbols.filter(function(sym) {
|
|
90
|
+
return Object.getOwnPropertyDescriptor(object, sym).enumerable;
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
keys.push.apply(keys, symbols);
|
|
94
|
+
}
|
|
95
|
+
return keys;
|
|
96
|
+
}
|
|
97
|
+
function _object_spread_props(target, source) {
|
|
98
|
+
source = source != null ? source : {};
|
|
99
|
+
if (Object.getOwnPropertyDescriptors) {
|
|
100
|
+
Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
|
|
101
|
+
} else {
|
|
102
|
+
ownKeys(Object(source)).forEach(function(key) {
|
|
103
|
+
Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
return target;
|
|
107
|
+
}
|
|
69
108
|
function _ts_generator(thisArg, body) {
|
|
70
109
|
var f, y, t, _ = {
|
|
71
110
|
label: 0,
|
|
@@ -541,31 +580,36 @@ var providerInstance = null;
|
|
|
541
580
|
}
|
|
542
581
|
/**
|
|
543
582
|
* Get the Authorization header if auth is available
|
|
544
|
-
*
|
|
545
|
-
*
|
|
583
|
+
* Returns empty object if no key is configured (server will reject if auth is required)
|
|
584
|
+
* Only throws for unexpected errors during token creation
|
|
546
585
|
*/ export function getAuthHeader() {
|
|
547
586
|
return _async_to_generator(function() {
|
|
548
|
-
var provider,
|
|
587
|
+
var provider, token, error;
|
|
549
588
|
return _ts_generator(this, function(_state) {
|
|
550
589
|
switch(_state.label){
|
|
551
590
|
case 0:
|
|
552
591
|
provider = getJwtAuthProvider();
|
|
553
592
|
if (!provider.isReady()) {
|
|
554
|
-
|
|
555
|
-
if
|
|
556
|
-
throw error;
|
|
557
|
-
}
|
|
558
|
-
console.warn('Warning: No SSH key configured for authentication. Run "px auth login" to configure.');
|
|
593
|
+
// No key configured - return empty headers
|
|
594
|
+
// The server will reject the request if authentication is required
|
|
559
595
|
return [
|
|
560
596
|
2,
|
|
561
597
|
{}
|
|
562
598
|
];
|
|
563
599
|
}
|
|
600
|
+
_state.label = 1;
|
|
601
|
+
case 1:
|
|
602
|
+
_state.trys.push([
|
|
603
|
+
1,
|
|
604
|
+
3,
|
|
605
|
+
,
|
|
606
|
+
4
|
|
607
|
+
]);
|
|
564
608
|
return [
|
|
565
609
|
4,
|
|
566
610
|
provider.createToken()
|
|
567
611
|
];
|
|
568
|
-
case
|
|
612
|
+
case 2:
|
|
569
613
|
token = _state.sent();
|
|
570
614
|
return [
|
|
571
615
|
2,
|
|
@@ -573,7 +617,45 @@ var providerInstance = null;
|
|
|
573
617
|
Authorization: "Bearer ".concat(token)
|
|
574
618
|
}
|
|
575
619
|
];
|
|
620
|
+
case 3:
|
|
621
|
+
error = _state.sent();
|
|
622
|
+
// Token creation failed (e.g., ssh-agent not running for encrypted key)
|
|
623
|
+
// Return empty headers and let the server reject if auth is required
|
|
624
|
+
return [
|
|
625
|
+
2,
|
|
626
|
+
{}
|
|
627
|
+
];
|
|
628
|
+
case 4:
|
|
629
|
+
return [
|
|
630
|
+
2
|
|
631
|
+
];
|
|
576
632
|
}
|
|
577
633
|
});
|
|
578
634
|
})();
|
|
579
635
|
}
|
|
636
|
+
/**
|
|
637
|
+
* Authenticated fetch wrapper for use with EventSource or other
|
|
638
|
+
* consumers that need a fetch function with automatic JWT authentication.
|
|
639
|
+
* Each fetch call gets a fresh JWT token (tokens have 30-second lifetime).
|
|
640
|
+
*/ export var authenticatedFetch = function(input, init) {
|
|
641
|
+
return _async_to_generator(function() {
|
|
642
|
+
var authHeader;
|
|
643
|
+
return _ts_generator(this, function(_state) {
|
|
644
|
+
switch(_state.label){
|
|
645
|
+
case 0:
|
|
646
|
+
return [
|
|
647
|
+
4,
|
|
648
|
+
getAuthHeader()
|
|
649
|
+
];
|
|
650
|
+
case 1:
|
|
651
|
+
authHeader = _state.sent();
|
|
652
|
+
return [
|
|
653
|
+
2,
|
|
654
|
+
fetch(input, _object_spread_props(_object_spread({}, init), {
|
|
655
|
+
headers: _object_spread({}, init === null || init === void 0 ? void 0 : init.headers, authHeader)
|
|
656
|
+
}))
|
|
657
|
+
];
|
|
658
|
+
}
|
|
659
|
+
});
|
|
660
|
+
})();
|
|
661
|
+
};
|
|
@@ -1,8 +1,16 @@
|
|
|
1
|
+
function _instanceof(left, right) {
|
|
2
|
+
if (right != null && typeof Symbol !== "undefined" && right[Symbol.hasInstance]) {
|
|
3
|
+
return !!right[Symbol.hasInstance](left);
|
|
4
|
+
} else {
|
|
5
|
+
return left instanceof right;
|
|
6
|
+
}
|
|
7
|
+
}
|
|
1
8
|
import sshpk from 'sshpk';
|
|
2
|
-
import { readFileSync, readdirSync, existsSync } from 'fs';
|
|
9
|
+
import { readFileSync, readdirSync, existsSync, mkdirSync } from 'fs';
|
|
3
10
|
import { homedir } from 'os';
|
|
4
11
|
import { join } from 'path';
|
|
5
12
|
import { createPublicKey } from 'crypto';
|
|
13
|
+
import { execSync } from 'child_process';
|
|
6
14
|
/**
|
|
7
15
|
* Discover available SSH keys in the ~/.ssh directory
|
|
8
16
|
* Scans for common key files and returns metadata about each key
|
|
@@ -210,3 +218,45 @@ import { createPublicKey } from 'crypto';
|
|
|
210
218
|
}
|
|
211
219
|
return keyPath;
|
|
212
220
|
}
|
|
221
|
+
/**
|
|
222
|
+
* Generate a new SSH key using ssh-keygen
|
|
223
|
+
* Creates an Ed25519 key with no passphrase
|
|
224
|
+
*/ export function generateSSHKey() {
|
|
225
|
+
var keyPath = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : join(homedir(), '.ssh', 'id_ed25519');
|
|
226
|
+
var expandedPath = expandPath(keyPath);
|
|
227
|
+
// Ensure the .ssh directory exists
|
|
228
|
+
var sshDir = join(homedir(), '.ssh');
|
|
229
|
+
if (!existsSync(sshDir)) {
|
|
230
|
+
mkdirSync(sshDir, {
|
|
231
|
+
mode: 448
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
// Check if key already exists
|
|
235
|
+
if (existsSync(expandedPath)) {
|
|
236
|
+
return {
|
|
237
|
+
success: false,
|
|
238
|
+
error: "Key already exists at ".concat(expandedPath),
|
|
239
|
+
path: expandedPath
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
try {
|
|
243
|
+
// Generate Ed25519 key with no passphrase
|
|
244
|
+
// -t ed25519: key type
|
|
245
|
+
// -N "": empty passphrase
|
|
246
|
+
// -f: output file path
|
|
247
|
+
// -C: comment (email/identifier)
|
|
248
|
+
execSync('ssh-keygen -t ed25519 -N "" -f "'.concat(expandedPath, '" -C "positronic-key"'), {
|
|
249
|
+
stdio: 'ignore'
|
|
250
|
+
});
|
|
251
|
+
return {
|
|
252
|
+
success: true,
|
|
253
|
+
path: expandedPath
|
|
254
|
+
};
|
|
255
|
+
} catch (error) {
|
|
256
|
+
return {
|
|
257
|
+
success: false,
|
|
258
|
+
error: _instanceof(error, Error) ? error.message : 'Failed to generate SSH key',
|
|
259
|
+
path: expandedPath
|
|
260
|
+
};
|
|
261
|
+
}
|
|
262
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../src/commands/helpers.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAUtD,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,gBAAgB,GAAG,CAAC,QAAQ,EAAE,YAAY,KAAK,IAAI,CAAC;AAGhE,MAAM,MAAM,SAAS,GAAG,OAAO,SAAS,CAAC;AAMzC;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,GAAE,OAAc,GAAG,IAAI,CAGtF;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAE3C;AAED;;;GAGG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAOtC;AAGD,eAAO,MAAM,SAAS;qBACG,MAAM,YAAY,WAAW,KAAG,OAAO,CAAC,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../src/commands/helpers.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAUtD,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,gBAAgB,GAAG,CAAC,QAAQ,EAAE,YAAY,KAAK,IAAI,CAAC;AAGhE,MAAM,MAAM,SAAS,GAAG,OAAO,SAAS,CAAC;AAMzC;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,GAAE,OAAc,GAAG,IAAI,CAGtF;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAE3C;AAED;;;GAGG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAOtC;AAGD,eAAO,MAAM,SAAS;qBACG,MAAM,YAAY,WAAW,KAAG,OAAO,CAAC,QAAQ,CAAC;IA6CxE;;OAEG;oCACmC,MAAM,YAAY,WAAW,KAAG,OAAO,CAAC,QAAQ,CAAC;CAkBxF,CAAC;AAEF,wBAAsB,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,iBAsF5E;AAED,wBAAgB,kBAAkB,CAAC,YAAY,EAAE,MAAM,GAAG,aAAa,EAAE,CAsCxE;AAeD,UAAU,UAAU;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAClD;AAED,MAAM,MAAM,oBAAoB,GAAG,CAAC,QAAQ,EAAE;IAC5C,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,UAAU,GAAG,WAAW,GAAG,UAAU,CAAC;IAC9C,KAAK,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;CAC5B,KAAK,IAAI,CAAC;AAEX;;GAEG;AACH,wBAAsB,aAAa,CACjC,eAAe,EAAE,MAAM,EACvB,MAAM,GAAE,SAAqB,EAC7B,UAAU,CAAC,EAAE,oBAAoB,GAChC,OAAO,CAAC,UAAU,CAAC,CA+KrB;AAqKD;;GAEG;AACH,wBAAsB,aAAa,CACjC,eAAe,EAAE,MAAM,EACvB,MAAM,GAAE,SAAqB,mBAoB9B;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,eAAe,EAAE,MAAM,GAAG,MAAM,CAwCnE;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,eAAe,EAAE,MAAM,GAAG,MAAM,CAO3E;AAsCD;;GAEG;AACH,wBAAsB,cAAc,CAClC,IAAI,CAAC,EAAE,MAAM,EACb,SAAS,SAAO,GACf,OAAO,CAAC,OAAO,CAAC,CAsBlB;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,0BAA0B,CAC9C,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,MAAM,GAAE,SAAqB,EAC7B,UAAU,CAAC,EAAE,gBAAgB,EAC7B,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,IAAI,CAAC,CA2If"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event-detail.d.ts","sourceRoot":"","sources":["../../../src/components/event-detail.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEpD,UAAU,gBAAgB;IACxB,MAAM,EAAE,WAAW,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;
|
|
1
|
+
{"version":3,"file":"event-detail.d.ts","sourceRoot":"","sources":["../../../src/components/event-detail.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEpD,UAAU,gBAAgB;IACxB,MAAM,EAAE,WAAW,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAiOD,eAAO,MAAM,WAAW,GAAI,oDAA2D,gBAAgB,4CAqDtG,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
interface ProjectAuthSetupProps {
|
|
2
|
+
projectDir: string;
|
|
3
|
+
onComplete: () => void;
|
|
4
|
+
}
|
|
5
|
+
export declare const ProjectAuthSetup: ({ projectDir, onComplete }: ProjectAuthSetupProps) => import("react/jsx-runtime").JSX.Element | null;
|
|
6
|
+
export {};
|
|
7
|
+
//# sourceMappingURL=project-auth-setup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-auth-setup.d.ts","sourceRoot":"","sources":["../../../src/components/project-auth-setup.tsx"],"names":[],"mappings":"AAcA,UAAU,qBAAqB;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,IAAI,CAAC;CACxB;AAUD,eAAO,MAAM,gBAAgB,GAAI,4BAA4B,qBAAqB,mDAiMjF,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project-create.d.ts","sourceRoot":"","sources":["../../../src/components/project-create.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"project-create.d.ts","sourceRoot":"","sources":["../../../src/components/project-create.tsx"],"names":[],"mappings":"AAMA,UAAU,kBAAkB;IAC1B,cAAc,EAAE,MAAM,CAAC;CACxB;AAID,eAAO,MAAM,aAAa,GAAI,oBAAoB,kBAAkB,4CAqGnE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"top-navigator.d.ts","sourceRoot":"","sources":["../../../src/components/top-navigator.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"top-navigator.d.ts","sourceRoot":"","sources":["../../../src/components/top-navigator.tsx"],"names":[],"mappings":"AAeA,UAAU,iBAAiB;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAID,eAAO,MAAM,YAAY,GAAI,iBAAiB,iBAAiB,4CAmT9D,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"watch.d.ts","sourceRoot":"","sources":["../../../src/components/watch.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"watch.d.ts","sourceRoot":"","sources":["../../../src/components/watch.tsx"],"names":[],"mappings":"AAqMA,UAAU,UAAU;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,eAAO,MAAM,KAAK,GAAI,wDAAuE,UAAU,4CAmetG,CAAC"}
|
|
@@ -79,8 +79,14 @@ export declare function resetJwtAuthProvider(): void;
|
|
|
79
79
|
export declare function isAuthAvailable(): boolean;
|
|
80
80
|
/**
|
|
81
81
|
* Get the Authorization header if auth is available
|
|
82
|
-
*
|
|
83
|
-
*
|
|
82
|
+
* Returns empty object if no key is configured (server will reject if auth is required)
|
|
83
|
+
* Only throws for unexpected errors during token creation
|
|
84
84
|
*/
|
|
85
85
|
export declare function getAuthHeader(): Promise<Record<string, string>>;
|
|
86
|
+
/**
|
|
87
|
+
* Authenticated fetch wrapper for use with EventSource or other
|
|
88
|
+
* consumers that need a fetch function with automatic JWT authentication.
|
|
89
|
+
* Each fetch call gets a fresh JWT token (tokens have 30-second lifetime).
|
|
90
|
+
*/
|
|
91
|
+
export declare const authenticatedFetch: typeof fetch;
|
|
86
92
|
//# sourceMappingURL=jwt-auth.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jwt-auth.d.ts","sourceRoot":"","sources":["../../../src/lib/jwt-auth.ts"],"names":[],"mappings":"AAuBA;;;;GAIG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,UAAU,CAAiC;IACnD,OAAO,CAAC,WAAW,CAAuB;IAC1C,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,SAAS,CAAsB;IAGvC,OAAO,CAAC,gBAAgB,CAAuB;IAC/C,OAAO,CAAC,WAAW,CAA4B;IAC/C,OAAO,CAAC,QAAQ,CAA0B;IAC1C,OAAO,CAAC,QAAQ,CAAS;;IAMzB,OAAO,CAAC,UAAU;IAqClB;;;;OAIG;IACH,OAAO,IAAI,OAAO;IAYlB;;OAEG;IACH,eAAe,IAAI,OAAO;IAI1B;;OAEG;IACH,QAAQ,IAAI,KAAK,GAAG,IAAI;IAIxB;;OAEG;IACH,cAAc,IAAI,MAAM,GAAG,IAAI;IAI/B;;OAEG;IACH,OAAO,CAAC,YAAY;IAQpB;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAqB9B;;;;OAIG;IACH,OAAO,CAAC,WAAW;IAiCnB;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC;IAoBpC;;OAEG;YACW,iBAAiB;IAwB/B;;OAEG;YACW,gBAAgB;IAwC9B;;;OAGG;YACW,oBAAoB;CAuCnC;AAKD;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,eAAe,CAKpD;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,IAAI,IAAI,CAE3C;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,OAAO,CAEzC;AAED;;;;GAIG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"jwt-auth.d.ts","sourceRoot":"","sources":["../../../src/lib/jwt-auth.ts"],"names":[],"mappings":"AAuBA;;;;GAIG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,UAAU,CAAiC;IACnD,OAAO,CAAC,WAAW,CAAuB;IAC1C,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,SAAS,CAAsB;IAGvC,OAAO,CAAC,gBAAgB,CAAuB;IAC/C,OAAO,CAAC,WAAW,CAA4B;IAC/C,OAAO,CAAC,QAAQ,CAA0B;IAC1C,OAAO,CAAC,QAAQ,CAAS;;IAMzB,OAAO,CAAC,UAAU;IAqClB;;;;OAIG;IACH,OAAO,IAAI,OAAO;IAYlB;;OAEG;IACH,eAAe,IAAI,OAAO;IAI1B;;OAEG;IACH,QAAQ,IAAI,KAAK,GAAG,IAAI;IAIxB;;OAEG;IACH,cAAc,IAAI,MAAM,GAAG,IAAI;IAI/B;;OAEG;IACH,OAAO,CAAC,YAAY;IAQpB;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAqB9B;;;;OAIG;IACH,OAAO,CAAC,WAAW;IAiCnB;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC;IAoBpC;;OAEG;YACW,iBAAiB;IAwB/B;;OAEG;YACW,gBAAgB;IAwC9B;;;OAGG;YACW,oBAAoB;CAuCnC;AAKD;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,eAAe,CAKpD;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,IAAI,IAAI,CAE3C;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,OAAO,CAEzC;AAED;;;;GAIG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAiBrE;AAED;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,EAAE,OAAO,KAYvC,CAAC"}
|
|
@@ -44,4 +44,14 @@ export declare function resolvePrivateKeyPath(configuredPath?: string | null): s
|
|
|
44
44
|
* Expand a path that may contain ~ to the full path
|
|
45
45
|
*/
|
|
46
46
|
export declare function expandPath(keyPath: string): string;
|
|
47
|
+
export interface GenerateSSHKeyResult {
|
|
48
|
+
success: boolean;
|
|
49
|
+
error?: string;
|
|
50
|
+
path: string;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Generate a new SSH key using ssh-keygen
|
|
54
|
+
* Creates an Ed25519 key with no passphrase
|
|
55
|
+
*/
|
|
56
|
+
export declare function generateSSHKey(keyPath?: string): GenerateSSHKeyResult;
|
|
47
57
|
//# sourceMappingURL=ssh-key-utils.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ssh-key-utils.d.ts","sourceRoot":"","sources":["../../../src/lib/ssh-key-utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,OAAO,EAAmB,UAAU,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"ssh-key-utils.d.ts","sourceRoot":"","sources":["../../../src/lib/ssh-key-utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,OAAO,EAAmB,UAAU,EAAE,MAAM,QAAQ,CAAC;AAGrD,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,UAAU,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,wBAAgB,eAAe,IAAI,aAAa,EAAE,CAkDjD;AA0CD;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,UAAU,CAiBpE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC,UAAU,CAyBnE;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,UAAU,EAAE,KAAK,CAAC,UAAU,GAAG,MAAM,CAG7E;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAIlE;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAoB5E;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAKlD;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,OAAO,GAAE,MAA8C,GACtD,oBAAoB,CAuCtB"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@positronic/cli",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.62",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"access": "public"
|
|
6
6
|
},
|
|
@@ -23,9 +23,9 @@
|
|
|
23
23
|
"clean": "rm -rf tsconfig.tsbuildinfo dist node_modules"
|
|
24
24
|
},
|
|
25
25
|
"dependencies": {
|
|
26
|
-
"@positronic/core": "^0.0.
|
|
27
|
-
"@positronic/spec": "^0.0.
|
|
28
|
-
"@positronic/template-new-project": "^0.0.
|
|
26
|
+
"@positronic/core": "^0.0.62",
|
|
27
|
+
"@positronic/spec": "^0.0.62",
|
|
28
|
+
"@positronic/template-new-project": "^0.0.62",
|
|
29
29
|
"caz": "^2.0.0",
|
|
30
30
|
"chokidar": "^3.6.0",
|
|
31
31
|
"dotenv": "^16.4.7",
|