@agentuity/cli 2.0.6 → 2.0.7
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/README.md +11 -0
- package/dist/cmd/cloud/task/close.d.ts +3 -0
- package/dist/cmd/cloud/task/close.d.ts.map +1 -0
- package/dist/cmd/cloud/task/close.js +286 -0
- package/dist/cmd/cloud/task/close.js.map +1 -0
- package/dist/cmd/cloud/task/delete.d.ts +1 -5
- package/dist/cmd/cloud/task/delete.d.ts.map +1 -1
- package/dist/cmd/cloud/task/delete.js +15 -38
- package/dist/cmd/cloud/task/delete.js.map +1 -1
- package/dist/cmd/cloud/task/index.d.ts.map +1 -1
- package/dist/cmd/cloud/task/index.js +10 -0
- package/dist/cmd/cloud/task/index.js.map +1 -1
- package/dist/cmd/cloud/task/list.d.ts.map +1 -1
- package/dist/cmd/cloud/task/list.js +97 -3
- package/dist/cmd/cloud/task/list.js.map +1 -1
- package/dist/cmd/cloud/task/util.d.ts +10 -0
- package/dist/cmd/cloud/task/util.d.ts.map +1 -1
- package/dist/cmd/cloud/task/util.js +47 -3
- package/dist/cmd/cloud/task/util.js.map +1 -1
- package/dist/cmd/coder/config/index.d.ts +2 -0
- package/dist/cmd/coder/config/index.d.ts.map +1 -0
- package/dist/cmd/coder/config/index.js +20 -0
- package/dist/cmd/coder/config/index.js.map +1 -0
- package/dist/cmd/coder/config/set.d.ts +2 -0
- package/dist/cmd/coder/config/set.d.ts.map +1 -0
- package/dist/cmd/coder/config/set.js +100 -0
- package/dist/cmd/coder/config/set.js.map +1 -0
- package/dist/cmd/coder/hub-url.d.ts +21 -10
- package/dist/cmd/coder/hub-url.d.ts.map +1 -1
- package/dist/cmd/coder/hub-url.js +97 -55
- package/dist/cmd/coder/hub-url.js.map +1 -1
- package/dist/cmd/coder/index.d.ts.map +1 -1
- package/dist/cmd/coder/index.js +6 -1
- package/dist/cmd/coder/index.js.map +1 -1
- package/dist/cmd/coder/inspect.d.ts.map +1 -1
- package/dist/cmd/coder/inspect.js +15 -7
- package/dist/cmd/coder/inspect.js.map +1 -1
- package/dist/cmd/coder/list.d.ts.map +1 -1
- package/dist/cmd/coder/list.js +14 -7
- package/dist/cmd/coder/list.js.map +1 -1
- package/dist/cmd/coder/start.d.ts.map +1 -1
- package/dist/cmd/coder/start.js +38 -23
- package/dist/cmd/coder/start.js.map +1 -1
- package/dist/cmd/coder/tui-init.d.ts +4 -1
- package/dist/cmd/coder/tui-init.d.ts.map +1 -1
- package/dist/cmd/coder/tui-init.js +3 -2
- package/dist/cmd/coder/tui-init.js.map +1 -1
- package/dist/cmd/dev/sync.js +5 -5
- package/dist/cmd/dev/sync.js.map +1 -1
- package/dist/coder-config.d.ts +14 -0
- package/dist/coder-config.d.ts.map +1 -0
- package/dist/coder-config.js +119 -0
- package/dist/coder-config.js.map +1 -0
- package/dist/coder-hub-url.d.ts +3 -0
- package/dist/coder-hub-url.d.ts.map +1 -0
- package/dist/coder-hub-url.js +32 -0
- package/dist/coder-hub-url.js.map +1 -0
- package/dist/config.d.ts +1 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +11 -0
- package/dist/config.js.map +1 -1
- package/dist/internal-logger.d.ts +4 -0
- package/dist/internal-logger.d.ts.map +1 -1
- package/dist/internal-logger.js +64 -2
- package/dist/internal-logger.js.map +1 -1
- package/dist/keychain.d.ts +3 -0
- package/dist/keychain.d.ts.map +1 -1
- package/dist/keychain.js +47 -28
- package/dist/keychain.js.map +1 -1
- package/dist/types.d.ts +4 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +10 -0
- package/dist/types.js.map +1 -1
- package/package.json +6 -6
- package/src/cmd/cloud/task/close.ts +319 -0
- package/src/cmd/cloud/task/delete.ts +15 -43
- package/src/cmd/cloud/task/index.ts +10 -0
- package/src/cmd/cloud/task/list.ts +111 -4
- package/src/cmd/cloud/task/util.ts +59 -5
- package/src/cmd/coder/config/index.ts +20 -0
- package/src/cmd/coder/config/set.ts +112 -0
- package/src/cmd/coder/hub-url.ts +147 -53
- package/src/cmd/coder/index.ts +6 -1
- package/src/cmd/coder/inspect.ts +33 -10
- package/src/cmd/coder/list.ts +33 -10
- package/src/cmd/coder/start.ts +62 -26
- package/src/cmd/coder/tui-init.ts +7 -2
- package/src/cmd/dev/sync.ts +5 -5
- package/src/coder-config.ts +141 -0
- package/src/coder-hub-url.ts +32 -0
- package/src/config.ts +13 -0
- package/src/internal-logger.ts +83 -2
- package/src/keychain.ts +68 -39
- package/src/types.ts +10 -0
|
@@ -4,8 +4,12 @@
|
|
|
4
4
|
* Resolution priority:
|
|
5
5
|
* 1. --hub-url flag (explicit per-command override)
|
|
6
6
|
* 2. AGENTUITY_CODER_HUB_URL env var
|
|
7
|
-
* 3.
|
|
7
|
+
* 3. Stored per-profile Hub URL
|
|
8
|
+
* 4. AGENTUITY_DEVMODE_URL env var (dev tunnel URL)
|
|
8
9
|
*/
|
|
10
|
+
import { clearStoredCoderApiKey, getStoredCoderApiKey, getStoredCoderHubUrl, } from '../../coder-config';
|
|
11
|
+
import { normalizeCoderHubHttpUrl, toCoderHubWsUrl } from '../../coder-hub-url';
|
|
12
|
+
import { getCommand } from '../../command-prefix';
|
|
9
13
|
import { getVersion } from '../../version';
|
|
10
14
|
/**
|
|
11
15
|
* Resolve the Hub HTTP base URL for REST API calls.
|
|
@@ -14,18 +18,22 @@ import { getVersion } from '../../version';
|
|
|
14
18
|
* @param flagUrl Optional --hub-url flag value
|
|
15
19
|
* @returns HTTP base URL (e.g. "http://localhost:3500") or null if Hub is unreachable
|
|
16
20
|
*/
|
|
17
|
-
export async function resolveHubUrl(flagUrl) {
|
|
21
|
+
export async function resolveHubUrl(flagUrl, config) {
|
|
18
22
|
// 1. Explicit flag
|
|
19
23
|
if (flagUrl)
|
|
20
|
-
return
|
|
24
|
+
return normalizeCoderHubHttpUrl(flagUrl);
|
|
21
25
|
// 2. Env var (explicit)
|
|
22
26
|
const envUrl = process.env.AGENTUITY_CODER_HUB_URL;
|
|
23
27
|
if (envUrl)
|
|
24
|
-
return
|
|
25
|
-
// 3.
|
|
28
|
+
return normalizeCoderHubHttpUrl(envUrl);
|
|
29
|
+
// 3. Stored profile config
|
|
30
|
+
const storedUrl = await getStoredCoderHubUrl(config);
|
|
31
|
+
if (storedUrl)
|
|
32
|
+
return storedUrl;
|
|
33
|
+
// 4. Dev mode URL (tunnel)
|
|
26
34
|
const devUrl = process.env.AGENTUITY_DEVMODE_URL;
|
|
27
35
|
if (devUrl)
|
|
28
|
-
return
|
|
36
|
+
return normalizeCoderHubHttpUrl(devUrl);
|
|
29
37
|
return null;
|
|
30
38
|
}
|
|
31
39
|
/**
|
|
@@ -35,72 +43,106 @@ export async function resolveHubUrl(flagUrl) {
|
|
|
35
43
|
* @param flagUrl Optional --hub-url flag value
|
|
36
44
|
* @returns WebSocket URL (e.g. "ws://127.0.0.1:3500/api/ws") or null
|
|
37
45
|
*/
|
|
38
|
-
export async function resolveHubWsUrl(flagUrl) {
|
|
39
|
-
const httpUrl = await resolveHubUrl(flagUrl);
|
|
46
|
+
export async function resolveHubWsUrl(flagUrl, config) {
|
|
47
|
+
const httpUrl = await resolveHubUrl(flagUrl, config);
|
|
40
48
|
if (!httpUrl)
|
|
41
49
|
return null;
|
|
42
50
|
return toHubWsUrl(httpUrl);
|
|
43
51
|
}
|
|
44
52
|
export function toHubWsUrl(hubHttpUrl) {
|
|
45
|
-
return
|
|
53
|
+
return toCoderHubWsUrl(hubHttpUrl);
|
|
46
54
|
}
|
|
47
55
|
/**
|
|
48
|
-
*
|
|
56
|
+
* Resolve the API key for Hub authentication.
|
|
49
57
|
*/
|
|
50
|
-
function
|
|
51
|
-
|
|
52
|
-
// ws:// -> http://
|
|
53
|
-
if (normalized.startsWith('ws://'))
|
|
54
|
-
normalized = 'http://' + normalized.slice(5);
|
|
55
|
-
else if (normalized.startsWith('wss://'))
|
|
56
|
-
normalized = 'https://' + normalized.slice(6);
|
|
57
|
-
// Strip known Hub transport/helper paths to get the HTTP base URL.
|
|
58
|
-
// Accept `/ws` as a convenience alias because users often copy the raw route name.
|
|
59
|
-
normalized = normalized.replace(/\/api\/ws\b.*$/, '');
|
|
60
|
-
normalized = normalized.replace(/\/ws\b.*$/, '');
|
|
61
|
-
normalized = normalized.replace(/\/api\/hub\b.*$/, '');
|
|
62
|
-
return normalized.replace(/\/+$/, '');
|
|
58
|
+
function resolveEnvApiKey() {
|
|
59
|
+
return process.env.AGENTUITY_CODER_API_KEY || null;
|
|
63
60
|
}
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
else if (wsUrl.startsWith('https://'))
|
|
72
|
-
wsUrl = 'wss://' + wsUrl.slice(8);
|
|
73
|
-
try {
|
|
74
|
-
const parsed = new URL(wsUrl);
|
|
75
|
-
if (parsed.pathname !== '/api/ws') {
|
|
76
|
-
parsed.pathname = '/api/ws';
|
|
77
|
-
wsUrl = parsed.toString().replace(/\/$/, '');
|
|
78
|
-
}
|
|
61
|
+
export async function resolveHubApiKey(config) {
|
|
62
|
+
const envApiKey = resolveEnvApiKey();
|
|
63
|
+
if (envApiKey) {
|
|
64
|
+
return {
|
|
65
|
+
apiKey: envApiKey,
|
|
66
|
+
source: 'env',
|
|
67
|
+
};
|
|
79
68
|
}
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
69
|
+
const storedApiKey = await getStoredCoderApiKey(config);
|
|
70
|
+
if (storedApiKey) {
|
|
71
|
+
return {
|
|
72
|
+
apiKey: storedApiKey,
|
|
73
|
+
source: 'stored',
|
|
74
|
+
};
|
|
84
75
|
}
|
|
85
|
-
return
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
* TODO: Remove/Change when we get Agentuity service level auth enabled, this is just temporary
|
|
90
|
-
*/
|
|
91
|
-
export function resolveApiKey() {
|
|
92
|
-
return process.env.AGENTUITY_CODER_API_KEY || null;
|
|
76
|
+
return {
|
|
77
|
+
apiKey: null,
|
|
78
|
+
source: 'none',
|
|
79
|
+
};
|
|
93
80
|
}
|
|
94
81
|
/**
|
|
95
82
|
* Build headers object with API key if available.
|
|
96
|
-
* TODO: Remove/Change when we get Agentuity service level auth enabled, this is just temporary
|
|
97
83
|
*/
|
|
98
|
-
export function hubFetchHeaders(extra) {
|
|
84
|
+
export function hubFetchHeaders(extra, apiKey) {
|
|
99
85
|
const headers = { ...extra };
|
|
100
86
|
headers['User-Agent'] = `Agentuity Coder/${getVersion()}`;
|
|
101
|
-
const
|
|
102
|
-
if (
|
|
103
|
-
headers['x-agentuity-auth-api-key'] =
|
|
87
|
+
const resolvedApiKey = apiKey === undefined ? resolveEnvApiKey() : apiKey;
|
|
88
|
+
if (resolvedApiKey)
|
|
89
|
+
headers['x-agentuity-auth-api-key'] = resolvedApiKey;
|
|
104
90
|
return headers;
|
|
105
91
|
}
|
|
92
|
+
export function isHubUnauthorizedStatus(status) {
|
|
93
|
+
return status === 401 || status === 403;
|
|
94
|
+
}
|
|
95
|
+
export async function clearStoredHubApiKeyOnUnauthorized(status, resolvedApiKey, config, clearStoredApiKey = clearStoredCoderApiKey) {
|
|
96
|
+
if (!isHubUnauthorizedStatus(status) || resolvedApiKey.source !== 'stored') {
|
|
97
|
+
return false;
|
|
98
|
+
}
|
|
99
|
+
await clearStoredApiKey(config);
|
|
100
|
+
return true;
|
|
101
|
+
}
|
|
102
|
+
export function getHubUrlSetupGuidance() {
|
|
103
|
+
return (`Set a default Hub URL with:\n` +
|
|
104
|
+
` ${getCommand('coder config set url <url>')}\n\n` +
|
|
105
|
+
`Or pass --hub-url for a one-off override, or use AGENTUITY_CODER_HUB_URL.`);
|
|
106
|
+
}
|
|
107
|
+
export function getHubApiKeySetupGuidance() {
|
|
108
|
+
return (`Set a Hub API key with:\n` +
|
|
109
|
+
` ${getCommand('coder config set apikey <apikey>')}\n\n` +
|
|
110
|
+
`Or use AGENTUITY_CODER_API_KEY as an override.`);
|
|
111
|
+
}
|
|
112
|
+
export function formatMissingHubUrlMessage() {
|
|
113
|
+
return `Could not find a configured Coder Hub URL.\n\n${getHubUrlSetupGuidance()}`;
|
|
114
|
+
}
|
|
115
|
+
export function formatHubUnauthorizedMessage(hubUrl, serverMessage, options) {
|
|
116
|
+
const clearedStoredKey = options?.clearedStoredKey ? 'Stored Hub API key cleared.\n\n' : '';
|
|
117
|
+
return (`Coder Hub at ${hubUrl} requires a valid API key.\n\n` +
|
|
118
|
+
`${clearedStoredKey}${getHubApiKeySetupGuidance()}\n\n` +
|
|
119
|
+
`Server said: ${serverMessage}`);
|
|
120
|
+
}
|
|
121
|
+
export async function getHubResponseErrorMessage(response) {
|
|
122
|
+
const fallback = `${response.status} ${response.statusText}`;
|
|
123
|
+
try {
|
|
124
|
+
const payload = (await response.clone().json());
|
|
125
|
+
if (typeof payload.error === 'string' && payload.error.trim()) {
|
|
126
|
+
return payload.error.trim();
|
|
127
|
+
}
|
|
128
|
+
if (typeof payload.message === 'string' && payload.message.trim()) {
|
|
129
|
+
return payload.message.trim();
|
|
130
|
+
}
|
|
131
|
+
if (typeof payload.details === 'string' && payload.details.trim()) {
|
|
132
|
+
return payload.details.trim();
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
catch {
|
|
136
|
+
// Fall back to the response text below.
|
|
137
|
+
}
|
|
138
|
+
try {
|
|
139
|
+
const text = (await response.text()).trim();
|
|
140
|
+
if (text)
|
|
141
|
+
return text;
|
|
142
|
+
}
|
|
143
|
+
catch {
|
|
144
|
+
// Fall back to the status text below.
|
|
145
|
+
}
|
|
146
|
+
return fallback;
|
|
147
|
+
}
|
|
106
148
|
//# sourceMappingURL=hub-url.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hub-url.js","sourceRoot":"","sources":["../../../src/cmd/coder/hub-url.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"hub-url.js","sourceRoot":"","sources":["../../../src/cmd/coder/hub-url.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/cmd/coder/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/cmd/coder/index.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,OAAO,mCAwBlB,CAAC"}
|
package/dist/cmd/coder/index.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { createCommand } from '../../types';
|
|
2
|
+
import { configSubcommand } from './config';
|
|
2
3
|
import { listSubcommand } from './list';
|
|
3
4
|
import { inspectSubcommand } from './inspect';
|
|
4
5
|
import { startSubcommand } from './start';
|
|
@@ -20,8 +21,12 @@ export const command = createCommand({
|
|
|
20
21
|
command: getCommand('coder inspect <session-id>'),
|
|
21
22
|
description: 'Show detailed session information',
|
|
22
23
|
},
|
|
24
|
+
{
|
|
25
|
+
command: getCommand('coder config set url https://hub.example.com'),
|
|
26
|
+
description: 'Set the default Coder Hub URL for this profile',
|
|
27
|
+
},
|
|
23
28
|
],
|
|
24
|
-
subcommands: [startSubcommand, listSubcommand, inspectSubcommand],
|
|
29
|
+
subcommands: [startSubcommand, listSubcommand, inspectSubcommand, configSubcommand],
|
|
25
30
|
optional: { auth: true },
|
|
26
31
|
});
|
|
27
32
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cmd/coder/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AACxC,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAElD,MAAM,CAAC,MAAM,OAAO,GAAG,aAAa,CAAC;IACpC,IAAI,EAAE,OAAO;IACb,WAAW,EAAE,uCAAuC;IACpD,IAAI,EAAE,CAAC,eAAe,CAAC;IACvB,QAAQ,EAAE;QACT;YACC,OAAO,EAAE,UAAU,CAAC,aAAa,CAAC;YAClC,WAAW,EAAE,+CAA+C;SAC5D;QACD;YACC,OAAO,EAAE,UAAU,CAAC,UAAU,CAAC;YAC/B,WAAW,EAAE,oCAAoC;SACjD;QACD;YACC,OAAO,EAAE,UAAU,CAAC,4BAA4B,CAAC;YACjD,WAAW,EAAE,mCAAmC;SAChD;KACD;IACD,WAAW,EAAE,CAAC,eAAe,EAAE,cAAc,EAAE,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cmd/coder/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AACxC,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAElD,MAAM,CAAC,MAAM,OAAO,GAAG,aAAa,CAAC;IACpC,IAAI,EAAE,OAAO;IACb,WAAW,EAAE,uCAAuC;IACpD,IAAI,EAAE,CAAC,eAAe,CAAC;IACvB,QAAQ,EAAE;QACT;YACC,OAAO,EAAE,UAAU,CAAC,aAAa,CAAC;YAClC,WAAW,EAAE,+CAA+C;SAC5D;QACD;YACC,OAAO,EAAE,UAAU,CAAC,UAAU,CAAC;YAC/B,WAAW,EAAE,oCAAoC;SACjD;QACD;YACC,OAAO,EAAE,UAAU,CAAC,4BAA4B,CAAC;YACjD,WAAW,EAAE,mCAAmC;SAChD;QACD;YACC,OAAO,EAAE,UAAU,CAAC,8CAA8C,CAAC;YACnE,WAAW,EAAE,gDAAgD;SAC7D;KACD;IACD,WAAW,EAAE,CAAC,eAAe,EAAE,cAAc,EAAE,iBAAiB,EAAE,gBAAgB,CAAC;IACnF,QAAQ,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE;CACxB,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inspect.d.ts","sourceRoot":"","sources":["../../../src/cmd/coder/inspect.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"inspect.d.ts","sourceRoot":"","sources":["../../../src/cmd/coder/inspect.ts"],"names":[],"mappings":"AAwCA,eAAO,MAAM,iBAAiB,sCAsL5B,CAAC"}
|
|
@@ -3,7 +3,7 @@ import { createSubcommand } from '../../types';
|
|
|
3
3
|
import * as tui from '../../tui';
|
|
4
4
|
import { getCommand } from '../../command-prefix';
|
|
5
5
|
import { ErrorCode } from '../../errors';
|
|
6
|
-
import {
|
|
6
|
+
import { clearStoredHubApiKeyOnUnauthorized, formatHubUnauthorizedMessage, formatMissingHubUrlMessage, getHubResponseErrorMessage, getHubUrlSetupGuidance, hubFetchHeaders, isHubUnauthorizedStatus, resolveHubApiKey, resolveHubUrl, } from './hub-url';
|
|
7
7
|
function formatRelativeTime(isoDate) {
|
|
8
8
|
const diffMs = Date.now() - new Date(isoDate).getTime();
|
|
9
9
|
const seconds = Math.floor(diffMs / 1000);
|
|
@@ -54,19 +54,26 @@ export const inspectSubcommand = createSubcommand({
|
|
|
54
54
|
}),
|
|
55
55
|
},
|
|
56
56
|
async handler(ctx) {
|
|
57
|
-
const { args, options, opts } = ctx;
|
|
57
|
+
const { args, options, opts, config } = ctx;
|
|
58
58
|
const sessionId = args.session_id;
|
|
59
|
-
const hubUrl = await resolveHubUrl(opts?.hubUrl);
|
|
59
|
+
const hubUrl = await resolveHubUrl(opts?.hubUrl, config);
|
|
60
60
|
if (!hubUrl) {
|
|
61
|
-
tui.fatal(
|
|
61
|
+
tui.fatal(formatMissingHubUrlMessage(), ErrorCode.NETWORK_ERROR);
|
|
62
62
|
return;
|
|
63
63
|
}
|
|
64
|
+
const resolvedHubApiKey = await resolveHubApiKey(config);
|
|
64
65
|
let data;
|
|
65
66
|
try {
|
|
66
67
|
const resp = await fetch(`${hubUrl}/api/hub/session/${encodeURIComponent(sessionId)}`, {
|
|
67
|
-
headers: hubFetchHeaders(),
|
|
68
|
+
headers: hubFetchHeaders(undefined, resolvedHubApiKey.apiKey),
|
|
68
69
|
signal: AbortSignal.timeout(10_000),
|
|
69
70
|
});
|
|
71
|
+
if (isHubUnauthorizedStatus(resp.status)) {
|
|
72
|
+
const message = await getHubResponseErrorMessage(resp);
|
|
73
|
+
const clearedStoredKey = await clearStoredHubApiKeyOnUnauthorized(resp.status, resolvedHubApiKey, config);
|
|
74
|
+
tui.fatal(formatHubUnauthorizedMessage(hubUrl, message, { clearedStoredKey }), ErrorCode.API_ERROR);
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
70
77
|
if (resp.status === 404) {
|
|
71
78
|
tui.fatal(`Session not found: ${sessionId}`, ErrorCode.RESOURCE_NOT_FOUND);
|
|
72
79
|
return;
|
|
@@ -76,14 +83,15 @@ export const inspectSubcommand = createSubcommand({
|
|
|
76
83
|
return;
|
|
77
84
|
}
|
|
78
85
|
if (!resp.ok) {
|
|
79
|
-
|
|
86
|
+
const message = await getHubResponseErrorMessage(resp);
|
|
87
|
+
tui.fatal(`Hub returned ${resp.status}: ${message}. Is the Coder Hub running at ${hubUrl}?`, ErrorCode.API_ERROR);
|
|
80
88
|
return;
|
|
81
89
|
}
|
|
82
90
|
data = (await resp.json());
|
|
83
91
|
}
|
|
84
92
|
catch (err) {
|
|
85
93
|
const msg = err instanceof Error ? err.message : String(err);
|
|
86
|
-
tui.fatal(`Could not connect to Coder Hub at ${hubUrl}: ${msg}\n\
|
|
94
|
+
tui.fatal(`Could not connect to Coder Hub at ${hubUrl}: ${msg}\n\n${getHubUrlSetupGuidance()}`, ErrorCode.NETWORK_ERROR);
|
|
87
95
|
return;
|
|
88
96
|
}
|
|
89
97
|
if (options.json) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inspect.js","sourceRoot":"","sources":["../../../src/cmd/coder/inspect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,KAAK,GAAG,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,
|
|
1
|
+
{"version":3,"file":"inspect.js","sourceRoot":"","sources":["../../../src/cmd/coder/inspect.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../src/cmd/coder/list.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../src/cmd/coder/list.ts"],"names":[],"mappings":"AA2CA,eAAO,MAAM,cAAc,sCA0HzB,CAAC"}
|
package/dist/cmd/coder/list.js
CHANGED
|
@@ -3,7 +3,7 @@ import { createSubcommand } from '../../types';
|
|
|
3
3
|
import * as tui from '../../tui';
|
|
4
4
|
import { getCommand } from '../../command-prefix';
|
|
5
5
|
import { ErrorCode } from '../../errors';
|
|
6
|
-
import {
|
|
6
|
+
import { clearStoredHubApiKeyOnUnauthorized, formatHubUnauthorizedMessage, formatMissingHubUrlMessage, getHubResponseErrorMessage, getHubUrlSetupGuidance, hubFetchHeaders, isHubUnauthorizedStatus, resolveHubApiKey, resolveHubUrl, } from './hub-url';
|
|
7
7
|
function formatRelativeTime(isoDate) {
|
|
8
8
|
const diffMs = Date.now() - new Date(isoDate).getTime();
|
|
9
9
|
const seconds = Math.floor(diffMs / 1000);
|
|
@@ -52,27 +52,34 @@ export const listSubcommand = createSubcommand({
|
|
|
52
52
|
response: SessionListResponseSchema,
|
|
53
53
|
},
|
|
54
54
|
async handler(ctx) {
|
|
55
|
-
const { options, opts } = ctx;
|
|
56
|
-
const hubUrl = await resolveHubUrl(opts?.hubUrl);
|
|
55
|
+
const { options, opts, config } = ctx;
|
|
56
|
+
const hubUrl = await resolveHubUrl(opts?.hubUrl, config);
|
|
57
57
|
if (!hubUrl) {
|
|
58
|
-
tui.fatal(
|
|
58
|
+
tui.fatal(formatMissingHubUrlMessage(), ErrorCode.NETWORK_ERROR);
|
|
59
59
|
return [];
|
|
60
60
|
}
|
|
61
|
+
const resolvedHubApiKey = await resolveHubApiKey(config);
|
|
61
62
|
let data;
|
|
62
63
|
try {
|
|
63
64
|
const resp = await fetch(`${hubUrl}/api/hub/sessions`, {
|
|
64
|
-
headers: hubFetchHeaders(),
|
|
65
|
+
headers: hubFetchHeaders(undefined, resolvedHubApiKey.apiKey),
|
|
65
66
|
signal: AbortSignal.timeout(10_000),
|
|
66
67
|
});
|
|
67
68
|
if (!resp.ok) {
|
|
68
|
-
|
|
69
|
+
const message = await getHubResponseErrorMessage(resp);
|
|
70
|
+
if (isHubUnauthorizedStatus(resp.status)) {
|
|
71
|
+
const clearedStoredKey = await clearStoredHubApiKeyOnUnauthorized(resp.status, resolvedHubApiKey, config);
|
|
72
|
+
tui.fatal(formatHubUnauthorizedMessage(hubUrl, message, { clearedStoredKey }), ErrorCode.API_ERROR);
|
|
73
|
+
return [];
|
|
74
|
+
}
|
|
75
|
+
tui.fatal(`Hub returned ${resp.status}: ${message}. Is the Coder Hub running at ${hubUrl}?`, ErrorCode.API_ERROR);
|
|
69
76
|
return [];
|
|
70
77
|
}
|
|
71
78
|
data = (await resp.json());
|
|
72
79
|
}
|
|
73
80
|
catch (err) {
|
|
74
81
|
const msg = err instanceof Error ? err.message : String(err);
|
|
75
|
-
tui.fatal(`Could not connect to Coder Hub at ${hubUrl}: ${msg}\n\
|
|
82
|
+
tui.fatal(`Could not connect to Coder Hub at ${hubUrl}: ${msg}\n\n${getHubUrlSetupGuidance()}`, ErrorCode.NETWORK_ERROR);
|
|
76
83
|
return [];
|
|
77
84
|
}
|
|
78
85
|
const sessions = data.sessions.websocket;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../../src/cmd/coder/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,KAAK,GAAG,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,
|
|
1
|
+
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../../src/cmd/coder/list.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../../src/cmd/coder/start.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../../src/cmd/coder/start.ts"],"names":[],"mappings":"AA6EA,eAAO,MAAM,eAAe,sCA2X1B,CAAC"}
|
package/dist/cmd/coder/start.js
CHANGED
|
@@ -13,7 +13,7 @@ import { createSubcommand } from '../../types';
|
|
|
13
13
|
import * as tui from '../../tui';
|
|
14
14
|
import { getCommand } from '../../command-prefix';
|
|
15
15
|
import { ErrorCode } from '../../errors';
|
|
16
|
-
import {
|
|
16
|
+
import { clearStoredHubApiKeyOnUnauthorized, formatHubUnauthorizedMessage, formatMissingHubUrlMessage, getHubResponseErrorMessage, hubFetchHeaders, isHubUnauthorizedStatus, resolveHubApiKey, resolveHubUrl, toHubWsUrl, } from './hub-url';
|
|
17
17
|
import { probeHubInitAccess } from './tui-init';
|
|
18
18
|
/**
|
|
19
19
|
* Resolve the Coder extension path.
|
|
@@ -133,18 +133,29 @@ export const startSubcommand = createSubcommand({
|
|
|
133
133
|
}),
|
|
134
134
|
},
|
|
135
135
|
async handler(ctx) {
|
|
136
|
-
const { opts, options } = ctx;
|
|
136
|
+
const { opts, options, config } = ctx;
|
|
137
137
|
// Resolve Hub URL
|
|
138
|
-
const hubHttpUrl = await resolveHubUrl(opts?.hubUrl);
|
|
138
|
+
const hubHttpUrl = await resolveHubUrl(opts?.hubUrl, config);
|
|
139
139
|
if (!hubHttpUrl) {
|
|
140
|
-
tui.fatal(
|
|
140
|
+
tui.fatal(formatMissingHubUrlMessage(), ErrorCode.NETWORK_ERROR);
|
|
141
141
|
return;
|
|
142
142
|
}
|
|
143
143
|
const hubWsUrl = toHubWsUrl(hubHttpUrl);
|
|
144
|
-
const
|
|
144
|
+
const resolvedHubApiKey = await resolveHubApiKey(config);
|
|
145
|
+
const handleUnauthorizedResponse = async (response, errorCode = ErrorCode.NETWORK_ERROR) => {
|
|
146
|
+
const message = await getHubResponseErrorMessage(response);
|
|
147
|
+
const clearedStoredKey = await clearStoredHubApiKeyOnUnauthorized(response.status, resolvedHubApiKey, config);
|
|
148
|
+
tui.fatal(formatHubUnauthorizedMessage(hubHttpUrl, message, { clearedStoredKey }), errorCode);
|
|
149
|
+
};
|
|
150
|
+
const initProbe = await probeHubInitAccess(hubHttpUrl, {
|
|
151
|
+
apiKey: resolvedHubApiKey.apiKey,
|
|
152
|
+
});
|
|
145
153
|
if (!initProbe.ok) {
|
|
146
154
|
if (initProbe.code === 'unauthorized') {
|
|
147
|
-
|
|
155
|
+
const clearedStoredKey = resolvedHubApiKey.source === 'stored'
|
|
156
|
+
? await clearStoredHubApiKeyOnUnauthorized(401, resolvedHubApiKey, config)
|
|
157
|
+
: false;
|
|
158
|
+
tui.fatal(formatHubUnauthorizedMessage(hubHttpUrl, initProbe.message, { clearedStoredKey }), ErrorCode.NETWORK_ERROR);
|
|
148
159
|
return;
|
|
149
160
|
}
|
|
150
161
|
tui.fatal(`Could not bootstrap the Coder Hub at ${hubHttpUrl}: ${initProbe.message}`, ErrorCode.NETWORK_ERROR);
|
|
@@ -173,18 +184,22 @@ export const startSubcommand = createSubcommand({
|
|
|
173
184
|
message: 'Fetching connectable sessions…',
|
|
174
185
|
callback: async () => {
|
|
175
186
|
const resp = await fetch(`${hubHttpUrl}/api/hub/sessions/connectable`, {
|
|
176
|
-
headers: hubFetchHeaders(),
|
|
187
|
+
headers: hubFetchHeaders(undefined, resolvedHubApiKey.apiKey),
|
|
177
188
|
signal: AbortSignal.timeout(10_000),
|
|
178
189
|
});
|
|
190
|
+
if (isHubUnauthorizedStatus(resp.status)) {
|
|
191
|
+
await handleUnauthorizedResponse(resp);
|
|
192
|
+
throw new Error('Hub authentication failed');
|
|
193
|
+
}
|
|
179
194
|
if (!resp.ok) {
|
|
180
|
-
throw new Error(`${resp.status} ${resp
|
|
195
|
+
throw new Error(`${resp.status} ${await getHubResponseErrorMessage(resp)}`);
|
|
181
196
|
}
|
|
182
197
|
const data = (await resp.json());
|
|
183
198
|
return data.sessions;
|
|
184
199
|
},
|
|
185
200
|
});
|
|
186
201
|
if (sessions.length === 0) {
|
|
187
|
-
tui.fatal(
|
|
202
|
+
tui.fatal(`No connectable sandbox sessions found.\n\nCreate one with:\n ${getCommand('coder start --sandbox "your task"')}`, ErrorCode.CONFIG_INVALID);
|
|
188
203
|
return;
|
|
189
204
|
}
|
|
190
205
|
const prompt = tui.createPrompt();
|
|
@@ -206,7 +221,7 @@ export const startSubcommand = createSubcommand({
|
|
|
206
221
|
}
|
|
207
222
|
catch (err) {
|
|
208
223
|
const msg = err instanceof Error ? err.message : String(err);
|
|
209
|
-
if (msg === 'User cancelled')
|
|
224
|
+
if (msg === 'User cancelled' || msg === 'Hub authentication failed')
|
|
210
225
|
return;
|
|
211
226
|
tui.fatal(`Failed to fetch connectable sessions: ${msg}`, ErrorCode.NETWORK_ERROR);
|
|
212
227
|
return;
|
|
@@ -245,11 +260,6 @@ export const startSubcommand = createSubcommand({
|
|
|
245
260
|
tui.fatal('--sandbox requires a task description.\n\nExample: --sandbox "Build an authentication system"', ErrorCode.CONFIG_INVALID);
|
|
246
261
|
return;
|
|
247
262
|
}
|
|
248
|
-
const hubHttpUrl = await resolveHubUrl(opts?.hubUrl);
|
|
249
|
-
if (!hubHttpUrl) {
|
|
250
|
-
tui.fatal('Could not find Hub URL for sandbox creation.', ErrorCode.NETWORK_ERROR);
|
|
251
|
-
return;
|
|
252
|
-
}
|
|
253
263
|
// Build request body
|
|
254
264
|
const body = { task };
|
|
255
265
|
if (opts?.repo) {
|
|
@@ -262,13 +272,16 @@ export const startSubcommand = createSubcommand({
|
|
|
262
272
|
try {
|
|
263
273
|
const resp = await fetch(`${hubHttpUrl}/api/hub/session`, {
|
|
264
274
|
method: 'POST',
|
|
265
|
-
headers: hubFetchHeaders({ 'Content-Type': 'application/json' }),
|
|
275
|
+
headers: hubFetchHeaders({ 'Content-Type': 'application/json' }, resolvedHubApiKey.apiKey),
|
|
266
276
|
body: JSON.stringify(body),
|
|
267
277
|
signal: AbortSignal.timeout(10_000),
|
|
268
278
|
});
|
|
279
|
+
if (isHubUnauthorizedStatus(resp.status)) {
|
|
280
|
+
await handleUnauthorizedResponse(resp);
|
|
281
|
+
return;
|
|
282
|
+
}
|
|
269
283
|
if (!resp.ok) {
|
|
270
|
-
|
|
271
|
-
tui.fatal(`Failed to create sandbox session: ${resp.status} ${errText}`, ErrorCode.NETWORK_ERROR);
|
|
284
|
+
tui.fatal(`Failed to create sandbox session: ${resp.status} ${await getHubResponseErrorMessage(resp)}`, ErrorCode.NETWORK_ERROR);
|
|
272
285
|
return;
|
|
273
286
|
}
|
|
274
287
|
const sessionInfo = (await resp.json());
|
|
@@ -293,9 +306,13 @@ export const startSubcommand = createSubcommand({
|
|
|
293
306
|
await new Promise((r) => setTimeout(r, POLL_INTERVAL));
|
|
294
307
|
try {
|
|
295
308
|
const pollResp = await fetch(`${hubHttpUrl}/api/hub/session/${sessionId}`, {
|
|
296
|
-
headers: hubFetchHeaders(),
|
|
309
|
+
headers: hubFetchHeaders(undefined, resolvedHubApiKey.apiKey),
|
|
297
310
|
signal: AbortSignal.timeout(5_000),
|
|
298
311
|
});
|
|
312
|
+
if (isHubUnauthorizedStatus(pollResp.status)) {
|
|
313
|
+
await handleUnauthorizedResponse(pollResp);
|
|
314
|
+
return;
|
|
315
|
+
}
|
|
299
316
|
if (pollResp.ok) {
|
|
300
317
|
const data = (await pollResp.json());
|
|
301
318
|
if (data.participants?.some((p) => p.role === 'lead')) {
|
|
@@ -332,10 +349,8 @@ export const startSubcommand = createSubcommand({
|
|
|
332
349
|
...process.env,
|
|
333
350
|
AGENTUITY_CODER_HUB_URL: hubWsUrl,
|
|
334
351
|
};
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
if (cliApiKey)
|
|
338
|
-
env.AGENTUITY_CODER_API_KEY = cliApiKey;
|
|
352
|
+
if (resolvedHubApiKey.apiKey)
|
|
353
|
+
env.AGENTUITY_CODER_API_KEY = resolvedHubApiKey.apiKey;
|
|
339
354
|
if (opts?.agent) {
|
|
340
355
|
env.AGENTUITY_CODER_AGENT = opts.agent;
|
|
341
356
|
}
|