@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.
Files changed (94) hide show
  1. package/README.md +11 -0
  2. package/dist/cmd/cloud/task/close.d.ts +3 -0
  3. package/dist/cmd/cloud/task/close.d.ts.map +1 -0
  4. package/dist/cmd/cloud/task/close.js +286 -0
  5. package/dist/cmd/cloud/task/close.js.map +1 -0
  6. package/dist/cmd/cloud/task/delete.d.ts +1 -5
  7. package/dist/cmd/cloud/task/delete.d.ts.map +1 -1
  8. package/dist/cmd/cloud/task/delete.js +15 -38
  9. package/dist/cmd/cloud/task/delete.js.map +1 -1
  10. package/dist/cmd/cloud/task/index.d.ts.map +1 -1
  11. package/dist/cmd/cloud/task/index.js +10 -0
  12. package/dist/cmd/cloud/task/index.js.map +1 -1
  13. package/dist/cmd/cloud/task/list.d.ts.map +1 -1
  14. package/dist/cmd/cloud/task/list.js +97 -3
  15. package/dist/cmd/cloud/task/list.js.map +1 -1
  16. package/dist/cmd/cloud/task/util.d.ts +10 -0
  17. package/dist/cmd/cloud/task/util.d.ts.map +1 -1
  18. package/dist/cmd/cloud/task/util.js +47 -3
  19. package/dist/cmd/cloud/task/util.js.map +1 -1
  20. package/dist/cmd/coder/config/index.d.ts +2 -0
  21. package/dist/cmd/coder/config/index.d.ts.map +1 -0
  22. package/dist/cmd/coder/config/index.js +20 -0
  23. package/dist/cmd/coder/config/index.js.map +1 -0
  24. package/dist/cmd/coder/config/set.d.ts +2 -0
  25. package/dist/cmd/coder/config/set.d.ts.map +1 -0
  26. package/dist/cmd/coder/config/set.js +100 -0
  27. package/dist/cmd/coder/config/set.js.map +1 -0
  28. package/dist/cmd/coder/hub-url.d.ts +21 -10
  29. package/dist/cmd/coder/hub-url.d.ts.map +1 -1
  30. package/dist/cmd/coder/hub-url.js +97 -55
  31. package/dist/cmd/coder/hub-url.js.map +1 -1
  32. package/dist/cmd/coder/index.d.ts.map +1 -1
  33. package/dist/cmd/coder/index.js +6 -1
  34. package/dist/cmd/coder/index.js.map +1 -1
  35. package/dist/cmd/coder/inspect.d.ts.map +1 -1
  36. package/dist/cmd/coder/inspect.js +15 -7
  37. package/dist/cmd/coder/inspect.js.map +1 -1
  38. package/dist/cmd/coder/list.d.ts.map +1 -1
  39. package/dist/cmd/coder/list.js +14 -7
  40. package/dist/cmd/coder/list.js.map +1 -1
  41. package/dist/cmd/coder/start.d.ts.map +1 -1
  42. package/dist/cmd/coder/start.js +38 -23
  43. package/dist/cmd/coder/start.js.map +1 -1
  44. package/dist/cmd/coder/tui-init.d.ts +4 -1
  45. package/dist/cmd/coder/tui-init.d.ts.map +1 -1
  46. package/dist/cmd/coder/tui-init.js +3 -2
  47. package/dist/cmd/coder/tui-init.js.map +1 -1
  48. package/dist/cmd/dev/sync.js +5 -5
  49. package/dist/cmd/dev/sync.js.map +1 -1
  50. package/dist/coder-config.d.ts +14 -0
  51. package/dist/coder-config.d.ts.map +1 -0
  52. package/dist/coder-config.js +119 -0
  53. package/dist/coder-config.js.map +1 -0
  54. package/dist/coder-hub-url.d.ts +3 -0
  55. package/dist/coder-hub-url.d.ts.map +1 -0
  56. package/dist/coder-hub-url.js +32 -0
  57. package/dist/coder-hub-url.js.map +1 -0
  58. package/dist/config.d.ts +1 -0
  59. package/dist/config.d.ts.map +1 -1
  60. package/dist/config.js +11 -0
  61. package/dist/config.js.map +1 -1
  62. package/dist/internal-logger.d.ts +4 -0
  63. package/dist/internal-logger.d.ts.map +1 -1
  64. package/dist/internal-logger.js +64 -2
  65. package/dist/internal-logger.js.map +1 -1
  66. package/dist/keychain.d.ts +3 -0
  67. package/dist/keychain.d.ts.map +1 -1
  68. package/dist/keychain.js +47 -28
  69. package/dist/keychain.js.map +1 -1
  70. package/dist/types.d.ts +4 -0
  71. package/dist/types.d.ts.map +1 -1
  72. package/dist/types.js +10 -0
  73. package/dist/types.js.map +1 -1
  74. package/package.json +6 -6
  75. package/src/cmd/cloud/task/close.ts +319 -0
  76. package/src/cmd/cloud/task/delete.ts +15 -43
  77. package/src/cmd/cloud/task/index.ts +10 -0
  78. package/src/cmd/cloud/task/list.ts +111 -4
  79. package/src/cmd/cloud/task/util.ts +59 -5
  80. package/src/cmd/coder/config/index.ts +20 -0
  81. package/src/cmd/coder/config/set.ts +112 -0
  82. package/src/cmd/coder/hub-url.ts +147 -53
  83. package/src/cmd/coder/index.ts +6 -1
  84. package/src/cmd/coder/inspect.ts +33 -10
  85. package/src/cmd/coder/list.ts +33 -10
  86. package/src/cmd/coder/start.ts +62 -26
  87. package/src/cmd/coder/tui-init.ts +7 -2
  88. package/src/cmd/dev/sync.ts +5 -5
  89. package/src/coder-config.ts +141 -0
  90. package/src/coder-hub-url.ts +32 -0
  91. package/src/config.ts +13 -0
  92. package/src/internal-logger.ts +83 -2
  93. package/src/keychain.ts +68 -39
  94. 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. AGENTUITY_DEVMODE_URL env var (dev tunnel URL)
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 normalizeToHttp(flagUrl);
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 normalizeToHttp(envUrl);
25
- // 3. Dev mode URL (tunnel)
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 normalizeToHttp(devUrl);
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 normalizeToWs(hubHttpUrl);
53
+ return toCoderHubWsUrl(hubHttpUrl);
46
54
  }
47
55
  /**
48
- * Convert any URL form to an HTTP base URL (strip paths, convert ws->http).
56
+ * Resolve the API key for Hub authentication.
49
57
  */
50
- function normalizeToHttp(url) {
51
- let normalized = url.trim().replace(/\/+$/, '');
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
- * Convert an HTTP base URL to a WebSocket URL with /api/ws path.
66
- */
67
- function normalizeToWs(httpUrl) {
68
- let wsUrl = httpUrl;
69
- if (wsUrl.startsWith('http://'))
70
- wsUrl = 'ws://' + wsUrl.slice(7);
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
- catch {
81
- if (!wsUrl.endsWith('/api/ws')) {
82
- wsUrl = wsUrl.replace(/\/?$/, '/api/ws');
83
- }
69
+ const storedApiKey = await getStoredCoderApiKey(config);
70
+ if (storedApiKey) {
71
+ return {
72
+ apiKey: storedApiKey,
73
+ source: 'stored',
74
+ };
84
75
  }
85
- return wsUrl;
86
- }
87
- /**
88
- * Resolve the API key for Hub authentication.
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 apiKey = resolveApiKey();
102
- if (apiKey)
103
- headers['x-agentuity-auth-api-key'] = apiKey;
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":"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"}
1
+ {"version":3,"file":"hub-url.js","sourceRoot":"","sources":["../../../src/cmd/coder/hub-url.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EACN,sBAAsB,EACtB,oBAAoB,EACpB,oBAAoB,GACpB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,wBAAwB,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAChF,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAElD,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAS3C;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAClC,OAAgB,EAChB,MAAsB;IAEtB,mBAAmB;IACnB,IAAI,OAAO;QAAE,OAAO,wBAAwB,CAAC,OAAO,CAAC,CAAC;IAEtD,wBAAwB;IACxB,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC;IACnD,IAAI,MAAM;QAAE,OAAO,wBAAwB,CAAC,MAAM,CAAC,CAAC;IAEpD,2BAA2B;IAC3B,MAAM,SAAS,GAAG,MAAM,oBAAoB,CAAC,MAAM,CAAC,CAAC;IACrD,IAAI,SAAS;QAAE,OAAO,SAAS,CAAC;IAEhC,2BAA2B;IAC3B,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC;IACjD,IAAI,MAAM;QAAE,OAAO,wBAAwB,CAAC,MAAM,CAAC,CAAC;IAEpD,OAAO,IAAI,CAAC;AACb,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACpC,OAAgB,EAChB,MAAsB;IAEtB,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACrD,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAC1B,OAAO,UAAU,CAAC,OAAO,CAAC,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,UAAkB;IAC5C,OAAO,eAAe,CAAC,UAAU,CAAC,CAAC;AACpC,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB;IACxB,OAAO,OAAO,CAAC,GAAG,CAAC,uBAAuB,IAAI,IAAI,CAAC;AACpD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,MAAsB;IAC5D,MAAM,SAAS,GAAG,gBAAgB,EAAE,CAAC;IACrC,IAAI,SAAS,EAAE,CAAC;QACf,OAAO;YACN,MAAM,EAAE,SAAS;YACjB,MAAM,EAAE,KAAK;SACb,CAAC;IACH,CAAC;IAED,MAAM,YAAY,GAAG,MAAM,oBAAoB,CAAC,MAAM,CAAC,CAAC;IACxD,IAAI,YAAY,EAAE,CAAC;QAClB,OAAO;YACN,MAAM,EAAE,YAAY;YACpB,MAAM,EAAE,QAAQ;SAChB,CAAC;IACH,CAAC;IAED,OAAO;QACN,MAAM,EAAE,IAAI;QACZ,MAAM,EAAE,MAAM;KACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAC9B,KAA8B,EAC9B,MAAsB;IAEtB,MAAM,OAAO,GAA2B,EAAE,GAAG,KAAK,EAAE,CAAC;IACrD,OAAO,CAAC,YAAY,CAAC,GAAG,mBAAmB,UAAU,EAAE,EAAE,CAAC;IAC1D,MAAM,cAAc,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;IAC1E,IAAI,cAAc;QAAE,OAAO,CAAC,0BAA0B,CAAC,GAAG,cAAc,CAAC;IACzE,OAAO,OAAO,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,MAAc;IACrD,OAAO,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG,CAAC;AACzC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kCAAkC,CACvD,MAAc,EACd,cAAiC,EACjC,MAAsB,EACtB,oBAAkE,sBAAsB;IAExF,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC,IAAI,cAAc,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC5E,OAAO,KAAK,CAAC;IACd,CAAC;IAED,MAAM,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAChC,OAAO,IAAI,CAAC;AACb,CAAC;AAED,MAAM,UAAU,sBAAsB;IACrC,OAAO,CACN,+BAA+B;QAC/B,KAAK,UAAU,CAAC,4BAA4B,CAAC,MAAM;QACnD,2EAA2E,CAC3E,CAAC;AACH,CAAC;AAED,MAAM,UAAU,yBAAyB;IACxC,OAAO,CACN,2BAA2B;QAC3B,KAAK,UAAU,CAAC,kCAAkC,CAAC,MAAM;QACzD,gDAAgD,CAChD,CAAC;AACH,CAAC;AAED,MAAM,UAAU,0BAA0B;IACzC,OAAO,iDAAiD,sBAAsB,EAAE,EAAE,CAAC;AACpF,CAAC;AAED,MAAM,UAAU,4BAA4B,CAC3C,MAAc,EACd,aAAqB,EACrB,OAEC;IAED,MAAM,gBAAgB,GAAG,OAAO,EAAE,gBAAgB,CAAC,CAAC,CAAC,iCAAiC,CAAC,CAAC,CAAC,EAAE,CAAC;IAE5F,OAAO,CACN,gBAAgB,MAAM,gCAAgC;QACtD,GAAG,gBAAgB,GAAG,yBAAyB,EAAE,MAAM;QACvD,gBAAgB,aAAa,EAAE,CAC/B,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAAC,QAAkB;IAClE,MAAM,QAAQ,GAAG,GAAG,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC;IAE7D,IAAI,CAAC;QACJ,MAAM,OAAO,GAAG,CAAC,MAAM,QAAQ,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,CAI7C,CAAC;QACF,IAAI,OAAO,OAAO,CAAC,KAAK,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;YAC/D,OAAO,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QAC7B,CAAC;QACD,IAAI,OAAO,OAAO,CAAC,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;YACnE,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAC/B,CAAC;QACD,IAAI,OAAO,OAAO,CAAC,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;YACnE,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAC/B,CAAC;IACF,CAAC;IAAC,MAAM,CAAC;QACR,wCAAwC;IACzC,CAAC;IAED,IAAI,CAAC;QACJ,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAC5C,IAAI,IAAI;YAAE,OAAO,IAAI,CAAC;IACvB,CAAC;IAAC,MAAM,CAAC;QACR,sCAAsC;IACvC,CAAC;IAED,OAAO,QAAQ,CAAC;AACjB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/cmd/coder/index.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,OAAO,mCAoBlB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/cmd/coder/index.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,OAAO,mCAwBlB,CAAC"}
@@ -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;IACjE,QAAQ,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE;CACxB,CAAC,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":"AA8BA,eAAO,MAAM,iBAAiB,sCAyK5B,CAAC"}
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 { resolveHubUrl, hubFetchHeaders } from './hub-url';
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('Could not find a running Coder Hub.\n\nEither:\n - Start the Hub with: bun run dev\n - Set AGENTUITY_CODER_HUB_URL environment variable\n - Pass --hub-url flag', ErrorCode.NETWORK_ERROR);
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
- tui.fatal(`Hub returned ${resp.status}: ${resp.statusText}. Is the Coder Hub running at ${hubUrl}?`, ErrorCode.API_ERROR);
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\nSet AGENTUITY_CODER_HUB_URL or start the Hub with: bun run dev`, ErrorCode.NETWORK_ERROR);
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":"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"}
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":"AAiCA,eAAO,MAAM,cAAc,sCA6GzB,CAAC"}
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../src/cmd/coder/list.ts"],"names":[],"mappings":"AA2CA,eAAO,MAAM,cAAc,sCA0HzB,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 { resolveHubUrl, hubFetchHeaders } from './hub-url';
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('Could not find a running Coder Hub.\n\nEither:\n - Start the Hub with: bun run dev\n - Set AGENTUITY_CODER_HUB_URL environment variable\n - Pass --hub-url flag', ErrorCode.NETWORK_ERROR);
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
- tui.fatal(`Hub returned ${resp.status}: ${resp.statusText}. Is the Coder Hub running at ${hubUrl}?`, ErrorCode.API_ERROR);
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\nSet AGENTUITY_CODER_HUB_URL or start the Hub with: bun run dev`, ErrorCode.NETWORK_ERROR);
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":"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"}
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":"AAmEA,eAAO,MAAM,eAAe,sCAiW1B,CAAC"}
1
+ {"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../../src/cmd/coder/start.ts"],"names":[],"mappings":"AA6EA,eAAO,MAAM,eAAe,sCA2X1B,CAAC"}
@@ -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 { toHubWsUrl, resolveHubUrl, hubFetchHeaders } from './hub-url';
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('Could not find a running Coder Hub.\n\nEither:\n - Start the Hub with: bun run dev\n - Set AGENTUITY_CODER_HUB_URL environment variable\n - Pass --hub-url flag', ErrorCode.NETWORK_ERROR);
140
+ tui.fatal(formatMissingHubUrlMessage(), ErrorCode.NETWORK_ERROR);
141
141
  return;
142
142
  }
143
143
  const hubWsUrl = toHubWsUrl(hubHttpUrl);
144
- const initProbe = await probeHubInitAccess(hubHttpUrl);
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
- tui.fatal(`Coder Hub at ${hubHttpUrl} requires authentication.\n\nSet AGENTUITY_CODER_API_KEY in your shell and retry.\n\nServer said: ${initProbe.message}`, ErrorCode.NETWORK_ERROR);
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.statusText}`);
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('No connectable sandbox sessions found.\n\nCreate one with: ag-dev coder session create --task "your task"', ErrorCode.CONFIG_INVALID);
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
- const errText = await resp.text();
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
- // TODO: Remove/Change when we get Agentuity service level auth enabled, this is just temporary
336
- const cliApiKey = process.env.AGENTUITY_CODER_API_KEY;
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
  }