@agentuity/cli 2.0.6 → 2.0.8

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 (201) hide show
  1. package/README.md +11 -0
  2. package/dist/cli.d.ts.map +1 -1
  3. package/dist/cli.js +4 -2
  4. package/dist/cli.js.map +1 -1
  5. package/dist/cmd/build/vite/route-discovery.d.ts.map +1 -1
  6. package/dist/cmd/build/vite/route-discovery.js +6 -0
  7. package/dist/cmd/build/vite/route-discovery.js.map +1 -1
  8. package/dist/cmd/cloud/sandbox/fs/rm.d.ts.map +1 -1
  9. package/dist/cmd/cloud/sandbox/fs/rm.js +9 -3
  10. package/dist/cmd/cloud/sandbox/fs/rm.js.map +1 -1
  11. package/dist/cmd/cloud/sandbox/fs/rmdir.d.ts.map +1 -1
  12. package/dist/cmd/cloud/sandbox/fs/rmdir.js +9 -3
  13. package/dist/cmd/cloud/sandbox/fs/rmdir.js.map +1 -1
  14. package/dist/cmd/cloud/task/close.d.ts +3 -0
  15. package/dist/cmd/cloud/task/close.d.ts.map +1 -0
  16. package/dist/cmd/cloud/task/close.js +286 -0
  17. package/dist/cmd/cloud/task/close.js.map +1 -0
  18. package/dist/cmd/cloud/task/delete.d.ts +1 -5
  19. package/dist/cmd/cloud/task/delete.d.ts.map +1 -1
  20. package/dist/cmd/cloud/task/delete.js +15 -38
  21. package/dist/cmd/cloud/task/delete.js.map +1 -1
  22. package/dist/cmd/cloud/task/index.d.ts.map +1 -1
  23. package/dist/cmd/cloud/task/index.js +10 -0
  24. package/dist/cmd/cloud/task/index.js.map +1 -1
  25. package/dist/cmd/cloud/task/list.d.ts.map +1 -1
  26. package/dist/cmd/cloud/task/list.js +97 -3
  27. package/dist/cmd/cloud/task/list.js.map +1 -1
  28. package/dist/cmd/cloud/task/util.d.ts +10 -0
  29. package/dist/cmd/cloud/task/util.d.ts.map +1 -1
  30. package/dist/cmd/cloud/task/util.js +47 -3
  31. package/dist/cmd/cloud/task/util.js.map +1 -1
  32. package/dist/cmd/coder/archive.d.ts +2 -0
  33. package/dist/cmd/coder/archive.d.ts.map +1 -0
  34. package/dist/cmd/coder/archive.js +57 -0
  35. package/dist/cmd/coder/archive.js.map +1 -0
  36. package/dist/cmd/coder/create.d.ts +2 -0
  37. package/dist/cmd/coder/create.d.ts.map +1 -0
  38. package/dist/cmd/coder/create.js +245 -0
  39. package/dist/cmd/coder/create.js.map +1 -0
  40. package/dist/cmd/coder/delete.d.ts +2 -0
  41. package/dist/cmd/coder/delete.d.ts.map +1 -0
  42. package/dist/cmd/coder/delete.js +64 -0
  43. package/dist/cmd/coder/delete.js.map +1 -0
  44. package/dist/cmd/coder/events.d.ts +2 -0
  45. package/dist/cmd/coder/events.d.ts.map +1 -0
  46. package/dist/cmd/coder/events.js +99 -0
  47. package/dist/cmd/coder/events.js.map +1 -0
  48. package/dist/cmd/coder/extension-path.d.ts +8 -0
  49. package/dist/cmd/coder/extension-path.d.ts.map +1 -0
  50. package/dist/cmd/coder/extension-path.js +59 -0
  51. package/dist/cmd/coder/extension-path.js.map +1 -0
  52. package/dist/cmd/coder/get.d.ts +2 -0
  53. package/dist/cmd/coder/get.d.ts.map +1 -0
  54. package/dist/cmd/coder/{inspect.js → get.js} +37 -33
  55. package/dist/cmd/coder/get.js.map +1 -0
  56. package/dist/cmd/coder/index.d.ts.map +1 -1
  57. package/dist/cmd/coder/index.js +54 -4
  58. package/dist/cmd/coder/index.js.map +1 -1
  59. package/dist/cmd/coder/list.d.ts.map +1 -1
  60. package/dist/cmd/coder/list.js +25 -34
  61. package/dist/cmd/coder/list.js.map +1 -1
  62. package/dist/cmd/coder/loop.d.ts +2 -0
  63. package/dist/cmd/coder/loop.d.ts.map +1 -0
  64. package/dist/cmd/coder/loop.js +78 -0
  65. package/dist/cmd/coder/loop.js.map +1 -0
  66. package/dist/cmd/coder/participants.d.ts +2 -0
  67. package/dist/cmd/coder/participants.d.ts.map +1 -0
  68. package/dist/cmd/coder/participants.js +93 -0
  69. package/dist/cmd/coder/participants.js.map +1 -0
  70. package/dist/cmd/coder/replay.d.ts +2 -0
  71. package/dist/cmd/coder/replay.d.ts.map +1 -0
  72. package/dist/cmd/coder/replay.js +53 -0
  73. package/dist/cmd/coder/replay.js.map +1 -0
  74. package/dist/cmd/coder/resolve-repo.d.ts +27 -0
  75. package/dist/cmd/coder/resolve-repo.d.ts.map +1 -0
  76. package/dist/cmd/coder/resolve-repo.js +97 -0
  77. package/dist/cmd/coder/resolve-repo.js.map +1 -0
  78. package/dist/cmd/coder/skill/buckets.d.ts +2 -0
  79. package/dist/cmd/coder/skill/buckets.d.ts.map +1 -0
  80. package/dist/cmd/coder/skill/buckets.js +174 -0
  81. package/dist/cmd/coder/skill/buckets.js.map +1 -0
  82. package/dist/cmd/coder/skill/delete.d.ts +2 -0
  83. package/dist/cmd/coder/skill/delete.d.ts.map +1 -0
  84. package/dist/cmd/coder/skill/delete.js +64 -0
  85. package/dist/cmd/coder/skill/delete.js.map +1 -0
  86. package/dist/cmd/coder/skill/index.d.ts +2 -0
  87. package/dist/cmd/coder/skill/index.d.ts.map +1 -0
  88. package/dist/cmd/coder/skill/index.js +33 -0
  89. package/dist/cmd/coder/skill/index.js.map +1 -0
  90. package/dist/cmd/coder/skill/list.d.ts +2 -0
  91. package/dist/cmd/coder/skill/list.d.ts.map +1 -0
  92. package/dist/cmd/coder/skill/list.js +93 -0
  93. package/dist/cmd/coder/skill/list.js.map +1 -0
  94. package/dist/cmd/coder/skill/save.d.ts +2 -0
  95. package/dist/cmd/coder/skill/save.d.ts.map +1 -0
  96. package/dist/cmd/coder/skill/save.js +77 -0
  97. package/dist/cmd/coder/skill/save.js.map +1 -0
  98. package/dist/cmd/coder/start.d.ts.map +1 -1
  99. package/dist/cmd/coder/start.js +88 -117
  100. package/dist/cmd/coder/start.js.map +1 -1
  101. package/dist/cmd/coder/tui-init.d.ts +4 -1
  102. package/dist/cmd/coder/tui-init.d.ts.map +1 -1
  103. package/dist/cmd/coder/tui-init.js +9 -3
  104. package/dist/cmd/coder/tui-init.js.map +1 -1
  105. package/dist/cmd/coder/update.d.ts +2 -0
  106. package/dist/cmd/coder/update.d.ts.map +1 -0
  107. package/dist/cmd/coder/update.js +126 -0
  108. package/dist/cmd/coder/update.js.map +1 -0
  109. package/dist/cmd/coder/users.d.ts +2 -0
  110. package/dist/cmd/coder/users.d.ts.map +1 -0
  111. package/dist/cmd/coder/users.js +97 -0
  112. package/dist/cmd/coder/users.js.map +1 -0
  113. package/dist/cmd/coder/workspace/create.d.ts +2 -0
  114. package/dist/cmd/coder/workspace/create.d.ts.map +1 -0
  115. package/dist/cmd/coder/workspace/create.js +97 -0
  116. package/dist/cmd/coder/workspace/create.js.map +1 -0
  117. package/dist/cmd/coder/workspace/delete.d.ts +2 -0
  118. package/dist/cmd/coder/workspace/delete.d.ts.map +1 -0
  119. package/dist/cmd/coder/workspace/delete.js +64 -0
  120. package/dist/cmd/coder/workspace/delete.js.map +1 -0
  121. package/dist/cmd/coder/workspace/get.d.ts +2 -0
  122. package/dist/cmd/coder/workspace/get.d.ts.map +1 -0
  123. package/dist/cmd/coder/workspace/get.js +109 -0
  124. package/dist/cmd/coder/workspace/get.js.map +1 -0
  125. package/dist/cmd/coder/workspace/index.d.ts +2 -0
  126. package/dist/cmd/coder/workspace/index.d.ts.map +1 -0
  127. package/dist/cmd/coder/workspace/index.js +38 -0
  128. package/dist/cmd/coder/workspace/index.js.map +1 -0
  129. package/dist/cmd/coder/workspace/list.d.ts +2 -0
  130. package/dist/cmd/coder/workspace/list.d.ts.map +1 -0
  131. package/dist/cmd/coder/workspace/list.js +93 -0
  132. package/dist/cmd/coder/workspace/list.js.map +1 -0
  133. package/dist/cmd/dev/sync.js +5 -5
  134. package/dist/cmd/dev/sync.js.map +1 -1
  135. package/dist/coder-hub-url.d.ts +3 -0
  136. package/dist/coder-hub-url.d.ts.map +1 -0
  137. package/dist/coder-hub-url.js +32 -0
  138. package/dist/coder-hub-url.js.map +1 -0
  139. package/dist/config.d.ts +1 -0
  140. package/dist/config.d.ts.map +1 -1
  141. package/dist/config.js +14 -3
  142. package/dist/config.js.map +1 -1
  143. package/dist/internal-logger.d.ts +4 -0
  144. package/dist/internal-logger.d.ts.map +1 -1
  145. package/dist/internal-logger.js +64 -2
  146. package/dist/internal-logger.js.map +1 -1
  147. package/dist/keychain.d.ts +3 -0
  148. package/dist/keychain.d.ts.map +1 -1
  149. package/dist/keychain.js +47 -28
  150. package/dist/keychain.js.map +1 -1
  151. package/dist/types.d.ts +1 -1
  152. package/package.json +7 -6
  153. package/src/cli.ts +4 -2
  154. package/src/cmd/ai/prompt/agent.md +6 -6
  155. package/src/cmd/build/vite/route-discovery.ts +8 -0
  156. package/src/cmd/cloud/sandbox/fs/rm.ts +8 -3
  157. package/src/cmd/cloud/sandbox/fs/rmdir.ts +8 -3
  158. package/src/cmd/cloud/task/close.ts +319 -0
  159. package/src/cmd/cloud/task/delete.ts +15 -43
  160. package/src/cmd/cloud/task/index.ts +10 -0
  161. package/src/cmd/cloud/task/list.ts +111 -4
  162. package/src/cmd/cloud/task/util.ts +59 -5
  163. package/src/cmd/coder/archive.ts +59 -0
  164. package/src/cmd/coder/create.ts +268 -0
  165. package/src/cmd/coder/delete.ts +67 -0
  166. package/src/cmd/coder/events.ts +106 -0
  167. package/src/cmd/coder/extension-path.ts +71 -0
  168. package/src/cmd/coder/{inspect.ts → get.ts} +44 -45
  169. package/src/cmd/coder/index.ts +54 -4
  170. package/src/cmd/coder/list.ts +28 -65
  171. package/src/cmd/coder/loop.ts +85 -0
  172. package/src/cmd/coder/participants.ts +100 -0
  173. package/src/cmd/coder/replay.ts +58 -0
  174. package/src/cmd/coder/resolve-repo.ts +119 -0
  175. package/src/cmd/coder/skill/buckets.ts +191 -0
  176. package/src/cmd/coder/skill/delete.ts +67 -0
  177. package/src/cmd/coder/skill/index.ts +35 -0
  178. package/src/cmd/coder/skill/list.ts +97 -0
  179. package/src/cmd/coder/skill/save.ts +84 -0
  180. package/src/cmd/coder/start.ts +104 -141
  181. package/src/cmd/coder/tui-init.ts +13 -4
  182. package/src/cmd/coder/update.ts +128 -0
  183. package/src/cmd/coder/users.ts +101 -0
  184. package/src/cmd/coder/workspace/create.ts +104 -0
  185. package/src/cmd/coder/workspace/delete.ts +70 -0
  186. package/src/cmd/coder/workspace/get.ts +112 -0
  187. package/src/cmd/coder/workspace/index.ts +38 -0
  188. package/src/cmd/coder/workspace/list.ts +101 -0
  189. package/src/cmd/dev/sync.ts +5 -5
  190. package/src/coder-hub-url.ts +32 -0
  191. package/src/config.ts +17 -3
  192. package/src/internal-logger.ts +83 -2
  193. package/src/keychain.ts +68 -39
  194. package/dist/cmd/coder/hub-url.d.ts +0 -36
  195. package/dist/cmd/coder/hub-url.d.ts.map +0 -1
  196. package/dist/cmd/coder/hub-url.js +0 -106
  197. package/dist/cmd/coder/hub-url.js.map +0 -1
  198. package/dist/cmd/coder/inspect.d.ts +0 -2
  199. package/dist/cmd/coder/inspect.d.ts.map +0 -1
  200. package/dist/cmd/coder/inspect.js.map +0 -1
  201. package/src/cmd/coder/hub-url.ts +0 -111
package/src/keychain.ts CHANGED
@@ -7,6 +7,8 @@
7
7
 
8
8
  const SERVICE_PREFIX = 'com.agentuity.cli';
9
9
  const KEY_ACCOUNT = 'aes-encryption-key';
10
+ const AUTH_ACCOUNT = 'auth-token';
11
+ const CODER_API_KEY_ACCOUNT = 'coder-hub-api-key';
10
12
 
11
13
  /**
12
14
  * Check if we're running on macOS
@@ -88,26 +90,15 @@ async function decrypt(combined: Uint8Array, keyBytes: Uint8Array): Promise<stri
88
90
  return new TextDecoder().decode(plaintext);
89
91
  }
90
92
 
91
- /**
92
- * Store auth data in macOS Keychain
93
- */
94
- export async function saveAuthToKeychain(
95
- profileName: string,
96
- authData: { api_key: string; user_id: string; expires: number }
93
+ async function saveEncryptedValueToKeychain(
94
+ service: string,
95
+ account: string,
96
+ value: string
97
97
  ): Promise<void> {
98
- const service = `${SERVICE_PREFIX}.${profileName}`;
99
- const account = 'auth-token';
100
-
101
- // Get or create encryption key
102
98
  const key = await ensureEncryptionKey(service);
103
-
104
- // Encrypt the auth data
105
- const json = JSON.stringify(authData);
106
- const encrypted = await encrypt(json, key);
99
+ const encrypted = await encrypt(value, key);
107
100
  const b64 = Buffer.from(encrypted).toString('base64');
108
101
 
109
- // Store encrypted auth in keychain
110
- // First try to delete if exists, then add
111
102
  const del = Bun.spawn(['security', 'delete-generic-password', '-s', service, '-a', account], {
112
103
  stderr: 'ignore',
113
104
  });
@@ -127,6 +118,43 @@ export async function saveAuthToKeychain(
127
118
  await add.exited;
128
119
  }
129
120
 
121
+ async function getEncryptedValueFromKeychain(
122
+ service: string,
123
+ account: string
124
+ ): Promise<string | null> {
125
+ const find = Bun.spawn(
126
+ ['security', 'find-generic-password', '-s', service, '-a', account, '-w'],
127
+ { stderr: 'ignore' }
128
+ );
129
+
130
+ const stdout = await new Response(find.stdout).text();
131
+ if (stdout.length === 0) {
132
+ return null;
133
+ }
134
+
135
+ const encrypted = Uint8Array.from(Buffer.from(stdout.trim(), 'base64'));
136
+ const key = await ensureEncryptionKey(service);
137
+ return decrypt(encrypted, key);
138
+ }
139
+
140
+ async function deleteValueFromKeychain(service: string, account: string): Promise<void> {
141
+ const del = Bun.spawn(['security', 'delete-generic-password', '-s', service, '-a', account], {
142
+ stderr: 'ignore',
143
+ });
144
+ await del.exited;
145
+ }
146
+
147
+ /**
148
+ * Store auth data in macOS Keychain
149
+ */
150
+ export async function saveAuthToKeychain(
151
+ profileName: string,
152
+ authData: { api_key: string; user_id: string; expires: number }
153
+ ): Promise<void> {
154
+ const service = `${SERVICE_PREFIX}.${profileName}`;
155
+ await saveEncryptedValueToKeychain(service, AUTH_ACCOUNT, JSON.stringify(authData));
156
+ }
157
+
130
158
  /**
131
159
  * Retrieve auth data from macOS Keychain
132
160
  */
@@ -134,28 +162,12 @@ export async function getAuthFromKeychain(
134
162
  profileName: string
135
163
  ): Promise<{ api_key: string; user_id: string; expires: number } | null> {
136
164
  const service = `${SERVICE_PREFIX}.${profileName}`;
137
- const account = 'auth-token';
138
165
 
139
166
  try {
140
- // Get the encrypted auth data
141
- const find = Bun.spawn(
142
- ['security', 'find-generic-password', '-s', service, '-a', account, '-w'],
143
- { stderr: 'ignore' }
144
- );
145
-
146
- const stdout = await new Response(find.stdout).text();
147
- if (stdout.length === 0) {
167
+ const json = await getEncryptedValueFromKeychain(service, AUTH_ACCOUNT);
168
+ if (!json) {
148
169
  return null;
149
170
  }
150
-
151
- const b64 = stdout.trim();
152
- const encrypted = Uint8Array.from(Buffer.from(b64, 'base64'));
153
-
154
- // Get the encryption key
155
- const key = await ensureEncryptionKey(service);
156
-
157
- // Decrypt the auth data
158
- const json = await decrypt(encrypted, key);
159
171
  return JSON.parse(json);
160
172
  } catch {
161
173
  return null;
@@ -167,10 +179,27 @@ export async function getAuthFromKeychain(
167
179
  */
168
180
  export async function deleteAuthFromKeychain(profileName: string): Promise<void> {
169
181
  const service = `${SERVICE_PREFIX}.${profileName}`;
170
- const account = 'auth-token';
182
+ await deleteValueFromKeychain(service, AUTH_ACCOUNT);
183
+ }
171
184
 
172
- const del = Bun.spawn(['security', 'delete-generic-password', '-s', service, '-a', account], {
173
- stderr: 'ignore',
174
- });
175
- await del.exited;
185
+ export async function saveCoderApiKeyToKeychain(
186
+ profileName: string,
187
+ apiKey: string
188
+ ): Promise<void> {
189
+ const service = `${SERVICE_PREFIX}.${profileName}`;
190
+ await saveEncryptedValueToKeychain(service, CODER_API_KEY_ACCOUNT, apiKey);
191
+ }
192
+
193
+ export async function getCoderApiKeyFromKeychain(profileName: string): Promise<string | null> {
194
+ const service = `${SERVICE_PREFIX}.${profileName}`;
195
+ try {
196
+ return await getEncryptedValueFromKeychain(service, CODER_API_KEY_ACCOUNT);
197
+ } catch {
198
+ return null;
199
+ }
200
+ }
201
+
202
+ export async function deleteCoderApiKeyFromKeychain(profileName: string): Promise<void> {
203
+ const service = `${SERVICE_PREFIX}.${profileName}`;
204
+ await deleteValueFromKeychain(service, CODER_API_KEY_ACCOUNT);
176
205
  }
@@ -1,36 +0,0 @@
1
- /**
2
- * Hub URL resolution for Coder CLI commands.
3
- *
4
- * Resolution priority:
5
- * 1. --hub-url flag (explicit per-command override)
6
- * 2. AGENTUITY_CODER_HUB_URL env var
7
- * 3. AGENTUITY_DEVMODE_URL env var (dev tunnel URL)
8
- */
9
- /**
10
- * Resolve the Hub HTTP base URL for REST API calls.
11
- * Converts ws:// URLs to http:// automatically.
12
- *
13
- * @param flagUrl Optional --hub-url flag value
14
- * @returns HTTP base URL (e.g. "http://localhost:3500") or null if Hub is unreachable
15
- */
16
- export declare function resolveHubUrl(flagUrl?: string): Promise<string | null>;
17
- /**
18
- * Resolve the Hub WebSocket URL for Pi extension connections.
19
- * Converts http:// URLs to ws:// automatically and ensures /api/ws path.
20
- *
21
- * @param flagUrl Optional --hub-url flag value
22
- * @returns WebSocket URL (e.g. "ws://127.0.0.1:3500/api/ws") or null
23
- */
24
- export declare function resolveHubWsUrl(flagUrl?: string): Promise<string | null>;
25
- export declare function toHubWsUrl(hubHttpUrl: string): string;
26
- /**
27
- * Resolve the API key for Hub authentication.
28
- * TODO: Remove/Change when we get Agentuity service level auth enabled, this is just temporary
29
- */
30
- export declare function resolveApiKey(): string | null;
31
- /**
32
- * Build headers object with API key if available.
33
- * TODO: Remove/Change when we get Agentuity service level auth enabled, this is just temporary
34
- */
35
- export declare function hubFetchHeaders(extra?: Record<string, string>): Record<string, string>;
36
- //# sourceMappingURL=hub-url.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"hub-url.d.ts","sourceRoot":"","sources":["../../../src/cmd/coder/hub-url.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH;;;;;;GAMG;AACH,wBAAsB,aAAa,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAa5E;AAED;;;;;;GAMG;AACH,wBAAsB,eAAe,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAI9E;AAED,wBAAgB,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAErD;AA4CD;;;GAGG;AACH,wBAAgB,aAAa,IAAI,MAAM,GAAG,IAAI,CAE7C;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAMtF"}
@@ -1,106 +0,0 @@
1
- /**
2
- * Hub URL resolution for Coder CLI commands.
3
- *
4
- * Resolution priority:
5
- * 1. --hub-url flag (explicit per-command override)
6
- * 2. AGENTUITY_CODER_HUB_URL env var
7
- * 3. AGENTUITY_DEVMODE_URL env var (dev tunnel URL)
8
- */
9
- import { getVersion } from '../../version';
10
- /**
11
- * Resolve the Hub HTTP base URL for REST API calls.
12
- * Converts ws:// URLs to http:// automatically.
13
- *
14
- * @param flagUrl Optional --hub-url flag value
15
- * @returns HTTP base URL (e.g. "http://localhost:3500") or null if Hub is unreachable
16
- */
17
- export async function resolveHubUrl(flagUrl) {
18
- // 1. Explicit flag
19
- if (flagUrl)
20
- return normalizeToHttp(flagUrl);
21
- // 2. Env var (explicit)
22
- const envUrl = process.env.AGENTUITY_CODER_HUB_URL;
23
- if (envUrl)
24
- return normalizeToHttp(envUrl);
25
- // 3. Dev mode URL (tunnel)
26
- const devUrl = process.env.AGENTUITY_DEVMODE_URL;
27
- if (devUrl)
28
- return normalizeToHttp(devUrl);
29
- return null;
30
- }
31
- /**
32
- * Resolve the Hub WebSocket URL for Pi extension connections.
33
- * Converts http:// URLs to ws:// automatically and ensures /api/ws path.
34
- *
35
- * @param flagUrl Optional --hub-url flag value
36
- * @returns WebSocket URL (e.g. "ws://127.0.0.1:3500/api/ws") or null
37
- */
38
- export async function resolveHubWsUrl(flagUrl) {
39
- const httpUrl = await resolveHubUrl(flagUrl);
40
- if (!httpUrl)
41
- return null;
42
- return toHubWsUrl(httpUrl);
43
- }
44
- export function toHubWsUrl(hubHttpUrl) {
45
- return normalizeToWs(hubHttpUrl);
46
- }
47
- /**
48
- * Convert any URL form to an HTTP base URL (strip paths, convert ws->http).
49
- */
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(/\/+$/, '');
63
- }
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
- }
79
- }
80
- catch {
81
- if (!wsUrl.endsWith('/api/ws')) {
82
- wsUrl = wsUrl.replace(/\/?$/, '/api/ws');
83
- }
84
- }
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;
93
- }
94
- /**
95
- * 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
- */
98
- export function hubFetchHeaders(extra) {
99
- const headers = { ...extra };
100
- headers['User-Agent'] = `Agentuity Coder/${getVersion()}`;
101
- const apiKey = resolveApiKey();
102
- if (apiKey)
103
- headers['x-agentuity-auth-api-key'] = apiKey;
104
- return headers;
105
- }
106
- //# sourceMappingURL=hub-url.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"hub-url.js","sourceRoot":"","sources":["../../../src/cmd/coder/hub-url.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export declare const inspectSubcommand: import("../..").SubcommandDefinition;
2
- //# sourceMappingURL=inspect.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"inspect.d.ts","sourceRoot":"","sources":["../../../src/cmd/coder/inspect.ts"],"names":[],"mappings":"AA8BA,eAAO,MAAM,iBAAiB,sCAyK5B,CAAC"}
@@ -1 +0,0 @@
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,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAE3D,SAAS,kBAAkB,CAAC,OAAe;IAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC;IACxD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC1C,IAAI,OAAO,GAAG,EAAE;QAAE,OAAO,GAAG,OAAO,OAAO,CAAC;IAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;IACzC,IAAI,OAAO,GAAG,EAAE;QAAE,OAAO,GAAG,OAAO,OAAO,CAAC;IAC3C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;IACvC,IAAI,KAAK,GAAG,EAAE;QAAE,OAAO,GAAG,KAAK,OAAO,CAAC;IACvC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;IACpC,OAAO,GAAG,IAAI,OAAO,CAAC;AACvB,CAAC;AAED,SAAS,cAAc,CAAC,EAAU;IACjC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;IACtC,IAAI,OAAO,GAAG,EAAE;QAAE,OAAO,GAAG,OAAO,GAAG,CAAC;IACvC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;IACzC,MAAM,SAAS,GAAG,OAAO,GAAG,EAAE,CAAC;IAC/B,IAAI,OAAO,GAAG,EAAE;QAAE,OAAO,GAAG,OAAO,KAAK,SAAS,GAAG,CAAC;IACrD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;IACvC,MAAM,SAAS,GAAG,OAAO,GAAG,EAAE,CAAC;IAC/B,OAAO,GAAG,KAAK,KAAK,SAAS,GAAG,CAAC;AAClC,CAAC;AAED,MAAM,CAAC,MAAM,iBAAiB,GAAG,gBAAgB,CAAC;IACjD,IAAI,EAAE,SAAS;IACf,WAAW,EAAE,qDAAqD;IAClE,IAAI,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,eAAe,CAAC;IAC5C,QAAQ,EAAE;QACT;YACC,OAAO,EAAE,UAAU,CAAC,+BAA+B,CAAC;YACpD,WAAW,EAAE,yBAAyB;SACtC;QACD;YACC,OAAO,EAAE,UAAU,CAAC,sCAAsC,CAAC;YAC3D,WAAW,EAAE,6BAA6B;SAC1C;KACD;IACD,UAAU,EAAE,IAAI;IAChB,MAAM,EAAE;QACP,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;YACd,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC;SAC9D,CAAC;QACF,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC;YACjB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC;SAC1D,CAAC;KACF;IACD,KAAK,CAAC,OAAO,CAAC,GAAG;QAChB,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC;QACpC,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC;QAClC,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAEjD,IAAI,CAAC,MAAM,EAAE,CAAC;YACb,GAAG,CAAC,KAAK,CACR,oKAAoK,EACpK,SAAS,CAAC,aAAa,CACvB,CAAC;YACF,OAAO;QACR,CAAC;QAED,IAAI,IAoCH,CAAC;QAEF,IAAI,CAAC;YACJ,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,GAAG,MAAM,oBAAoB,kBAAkB,CAAC,SAAS,CAAC,EAAE,EAAE;gBACtF,OAAO,EAAE,eAAe,EAAE;gBAC1B,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC;aACnC,CAAC,CAAC;YACH,IAAI,IAAI,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBACzB,GAAG,CAAC,KAAK,CAAC,sBAAsB,SAAS,EAAE,EAAE,SAAS,CAAC,kBAAkB,CAAC,CAAC;gBAC3E,OAAO;YACR,CAAC;YACD,IAAI,IAAI,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBACzB,GAAG,CAAC,KAAK,CAAC,0BAA0B,SAAS,EAAE,EAAE,SAAS,CAAC,kBAAkB,CAAC,CAAC;gBAC/E,OAAO;YACR,CAAC;YACD,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;gBACd,GAAG,CAAC,KAAK,CACR,gBAAgB,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,UAAU,iCAAiC,MAAM,GAAG,EACzF,SAAS,CAAC,SAAS,CACnB,CAAC;gBACF,OAAO;YACR,CAAC;YACD,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAgB,CAAC;QAC3C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7D,GAAG,CAAC,KAAK,CACR,qCAAqC,MAAM,KAAK,GAAG,oEAAoE,EACvH,SAAS,CAAC,aAAa,CACvB,CAAC;YACF,OAAO;QACR,CAAC;QAED,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YAClB,OAAO,IAAI,CAAC;QACb,CAAC;QAED,SAAS;QACT,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,SAAS,CAAC;QAC3C,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,cAAc,KAAK,KAAK,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC;QACvD,MAAM,KAAK,GAAG,CAAC,WAAW,IAAI,CAAC,MAAM,EAAE,EAAE,SAAS,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QAC/D,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM;YAAE,KAAK,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QACtE,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACtC,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;QAE5C,eAAe;QACf,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;QAC/B,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACpC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAC3B,CAAC;aAAM,CAAC;YACP,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;gBACnC,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;gBACtC,MAAM,SAAS,GAAG,CAAC,CAAC,WAAW;oBAC9B,CAAC,CAAC,eAAe,kBAAkB,CAAC,CAAC,CAAC,WAAW,CAAC,EAAE;oBACpD,CAAC,CAAC,EAAE,CAAC;gBACN,OAAO,CAAC,GAAG,CACV,OAAO,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,SAAS,GAAG,SAAS,GAAG,IAAI,EAAE,CAC/E,CAAC;YACH,CAAC;QACF,CAAC;QAED,QAAQ;QACR,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3B,OAAO,CAAC,GAAG,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YACxB,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;gBAC5B,MAAM,GAAG,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;gBAC1D,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;gBAC/E,OAAO,CAAC,GAAG,CACV,OAAO,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,GAAG,EAAE,CACrG,CAAC;YACH,CAAC;QACF,CAAC;QAED,iBAAiB;QACjB,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACjD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,OAAO,CAAC,GAAG,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;YACjC,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;gBACxB,MAAM,IAAI,GAAG,CAAC,CAAC,WAAW;oBACzB,CAAC,CAAC,GAAG,CAAC,CAAC,WAAW,KAAK,CAAC,CAAC,aAAa,SAAS;oBAC/C,CAAC,CAAC,GAAG,CAAC,CAAC,aAAa,QAAQ,CAAC;gBAC9B,MAAM,OAAO,GAAG,CAAC,CAAC,YAAY;oBAC7B,CAAC,CAAC,kBAAkB,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,EAAE,CAAC;oBAC5D,CAAC,CAAC,GAAG,CAAC;gBACP,OAAO,CAAC,GAAG,CACV,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,UAAU,OAAO,EAAE,CACpF,CAAC;YACH,CAAC;QACF,CAAC;QAED,OAAO,CAAC,GAAG,EAAE,CAAC;QAEd,OAAO,IAAI,CAAC;IACb,CAAC;CACD,CAAC,CAAC"}
@@ -1,111 +0,0 @@
1
- /**
2
- * Hub URL resolution for Coder CLI commands.
3
- *
4
- * Resolution priority:
5
- * 1. --hub-url flag (explicit per-command override)
6
- * 2. AGENTUITY_CODER_HUB_URL env var
7
- * 3. AGENTUITY_DEVMODE_URL env var (dev tunnel URL)
8
- */
9
-
10
- import { getVersion } from '../../version';
11
-
12
- /**
13
- * Resolve the Hub HTTP base URL for REST API calls.
14
- * Converts ws:// URLs to http:// automatically.
15
- *
16
- * @param flagUrl Optional --hub-url flag value
17
- * @returns HTTP base URL (e.g. "http://localhost:3500") or null if Hub is unreachable
18
- */
19
- export async function resolveHubUrl(flagUrl?: string): Promise<string | null> {
20
- // 1. Explicit flag
21
- if (flagUrl) return normalizeToHttp(flagUrl);
22
-
23
- // 2. Env var (explicit)
24
- const envUrl = process.env.AGENTUITY_CODER_HUB_URL;
25
- if (envUrl) return normalizeToHttp(envUrl);
26
-
27
- // 3. Dev mode URL (tunnel)
28
- const devUrl = process.env.AGENTUITY_DEVMODE_URL;
29
- if (devUrl) return normalizeToHttp(devUrl);
30
-
31
- return null;
32
- }
33
-
34
- /**
35
- * Resolve the Hub WebSocket URL for Pi extension connections.
36
- * Converts http:// URLs to ws:// automatically and ensures /api/ws path.
37
- *
38
- * @param flagUrl Optional --hub-url flag value
39
- * @returns WebSocket URL (e.g. "ws://127.0.0.1:3500/api/ws") or null
40
- */
41
- export async function resolveHubWsUrl(flagUrl?: string): Promise<string | null> {
42
- const httpUrl = await resolveHubUrl(flagUrl);
43
- if (!httpUrl) return null;
44
- return toHubWsUrl(httpUrl);
45
- }
46
-
47
- export function toHubWsUrl(hubHttpUrl: string): string {
48
- return normalizeToWs(hubHttpUrl);
49
- }
50
-
51
- /**
52
- * Convert any URL form to an HTTP base URL (strip paths, convert ws->http).
53
- */
54
- function normalizeToHttp(url: string): string {
55
- let normalized = url.trim().replace(/\/+$/, '');
56
-
57
- // ws:// -> http://
58
- if (normalized.startsWith('ws://')) normalized = 'http://' + normalized.slice(5);
59
- else if (normalized.startsWith('wss://')) normalized = 'https://' + normalized.slice(6);
60
-
61
- // Strip known Hub transport/helper paths to get the HTTP base URL.
62
- // Accept `/ws` as a convenience alias because users often copy the raw route name.
63
- normalized = normalized.replace(/\/api\/ws\b.*$/, '');
64
- normalized = normalized.replace(/\/ws\b.*$/, '');
65
- normalized = normalized.replace(/\/api\/hub\b.*$/, '');
66
-
67
- return normalized.replace(/\/+$/, '');
68
- }
69
-
70
- /**
71
- * Convert an HTTP base URL to a WebSocket URL with /api/ws path.
72
- */
73
- function normalizeToWs(httpUrl: string): string {
74
- let wsUrl = httpUrl;
75
- if (wsUrl.startsWith('http://')) wsUrl = 'ws://' + wsUrl.slice(7);
76
- else if (wsUrl.startsWith('https://')) wsUrl = 'wss://' + wsUrl.slice(8);
77
-
78
- try {
79
- const parsed = new URL(wsUrl);
80
- if (parsed.pathname !== '/api/ws') {
81
- parsed.pathname = '/api/ws';
82
- wsUrl = parsed.toString().replace(/\/$/, '');
83
- }
84
- } catch {
85
- if (!wsUrl.endsWith('/api/ws')) {
86
- wsUrl = wsUrl.replace(/\/?$/, '/api/ws');
87
- }
88
- }
89
-
90
- return wsUrl;
91
- }
92
-
93
- /**
94
- * Resolve the API key for Hub authentication.
95
- * TODO: Remove/Change when we get Agentuity service level auth enabled, this is just temporary
96
- */
97
- export function resolveApiKey(): string | null {
98
- return process.env.AGENTUITY_CODER_API_KEY || null;
99
- }
100
-
101
- /**
102
- * Build headers object with API key if available.
103
- * TODO: Remove/Change when we get Agentuity service level auth enabled, this is just temporary
104
- */
105
- export function hubFetchHeaders(extra?: Record<string, string>): Record<string, string> {
106
- const headers: Record<string, string> = { ...extra };
107
- headers['User-Agent'] = `Agentuity Coder/${getVersion()}`;
108
- const apiKey = resolveApiKey();
109
- if (apiKey) headers['x-agentuity-auth-api-key'] = apiKey;
110
- return headers;
111
- }