@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 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 (Global Mode Only) ---
958
- if (!isLocalDevMode) {
959
- var authCommand = new AuthCommand();
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, requestOptions, existingHeaders, headersObj, authHeader;
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 when not in local dev mode
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)
@@ -42,6 +42,8 @@ function getStatusIcon(status) {
42
42
  switch(status){
43
43
  case 'complete':
44
44
  return '✓';
45
+ case 'halted':
46
+ return '-';
45
47
  case 'running':
46
48
  return '•';
47
49
  case 'error':
@@ -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
- setStatus('success');
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);
@@ -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
- * Throws if there's an auth configuration error
545
- * Returns empty object with warning if no key is configured
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, error, token;
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
- error = provider.getError();
555
- if (error) {
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 1:
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;IAgDxE;;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
+ {"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;AA+ND,eAAO,MAAM,WAAW,GAAI,oDAA2D,gBAAgB,4CAqDtG,CAAC"}
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":"AAKA,UAAU,kBAAkB;IAC1B,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,eAAO,MAAM,aAAa,GAAI,oBAAoB,kBAAkB,4CAyEnE,CAAC"}
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":"AAcA,UAAU,iBAAiB;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAID,eAAO,MAAM,YAAY,GAAI,iBAAiB,iBAAiB,4CAmT9D,CAAC"}
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":"AAgMA,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,4CAketG,CAAC"}
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
- * Throws if there's an auth configuration error
83
- * Returns empty object with warning if no key is configured
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,CAgBrE"}
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;AAErD,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"}
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.60",
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.60",
27
- "@positronic/spec": "^0.0.60",
28
- "@positronic/template-new-project": "^0.0.60",
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",