@braingrid/cli 0.1.3 → 0.2.1

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 (243) hide show
  1. package/CHANGELOG.md +56 -0
  2. package/README.md +54 -39
  3. package/dist/chunk-KNVWIF3L.js +401 -0
  4. package/dist/chunk-KNVWIF3L.js.map +1 -0
  5. package/dist/cli.js +6229 -290
  6. package/dist/cli.js.map +1 -1
  7. package/dist/gh-installer-B65ZOOC4.js +13 -0
  8. package/dist/gh-installer-B65ZOOC4.js.map +1 -0
  9. package/package.json +40 -13
  10. package/dist/build-config.d.ts +0 -26
  11. package/dist/build-config.d.ts.map +0 -1
  12. package/dist/build-config.js +0 -45
  13. package/dist/build-config.js.map +0 -1
  14. package/dist/cli.d.ts +0 -3
  15. package/dist/cli.d.ts.map +0 -1
  16. package/dist/handlers/agent.handlers.d.ts +0 -12
  17. package/dist/handlers/agent.handlers.d.ts.map +0 -1
  18. package/dist/handlers/agent.handlers.js +0 -130
  19. package/dist/handlers/agent.handlers.js.map +0 -1
  20. package/dist/handlers/auth.handlers.d.ts +0 -19
  21. package/dist/handlers/auth.handlers.d.ts.map +0 -1
  22. package/dist/handlers/auth.handlers.js +0 -177
  23. package/dist/handlers/auth.handlers.js.map +0 -1
  24. package/dist/handlers/index.d.ts +0 -14
  25. package/dist/handlers/index.d.ts.map +0 -1
  26. package/dist/handlers/index.js +0 -14
  27. package/dist/handlers/index.js.map +0 -1
  28. package/dist/handlers/init.handlers.d.ts +0 -10
  29. package/dist/handlers/init.handlers.d.ts.map +0 -1
  30. package/dist/handlers/init.handlers.js +0 -638
  31. package/dist/handlers/init.handlers.js.map +0 -1
  32. package/dist/handlers/project.handlers.d.ts +0 -36
  33. package/dist/handlers/project.handlers.d.ts.map +0 -1
  34. package/dist/handlers/project.handlers.js +0 -309
  35. package/dist/handlers/project.handlers.js.map +0 -1
  36. package/dist/handlers/requirement.handlers.d.ts +0 -32
  37. package/dist/handlers/requirement.handlers.d.ts.map +0 -1
  38. package/dist/handlers/requirement.handlers.js +0 -264
  39. package/dist/handlers/requirement.handlers.js.map +0 -1
  40. package/dist/handlers/status.handlers.d.ts +0 -12
  41. package/dist/handlers/status.handlers.d.ts.map +0 -1
  42. package/dist/handlers/status.handlers.js +0 -212
  43. package/dist/handlers/status.handlers.js.map +0 -1
  44. package/dist/handlers/task.handlers.d.ts +0 -29
  45. package/dist/handlers/task.handlers.d.ts.map +0 -1
  46. package/dist/handlers/task.handlers.js +0 -326
  47. package/dist/handlers/task.handlers.js.map +0 -1
  48. package/dist/handlers/types.d.ts +0 -10
  49. package/dist/handlers/types.d.ts.map +0 -1
  50. package/dist/handlers/types.js +0 -5
  51. package/dist/handlers/types.js.map +0 -1
  52. package/dist/handlers/update.handlers.d.ts +0 -16
  53. package/dist/handlers/update.handlers.d.ts.map +0 -1
  54. package/dist/handlers/update.handlers.js +0 -119
  55. package/dist/handlers/update.handlers.js.map +0 -1
  56. package/dist/rpc/registry.d.ts +0 -97
  57. package/dist/rpc/registry.d.ts.map +0 -1
  58. package/dist/rpc/registry.js +0 -119
  59. package/dist/rpc/registry.js.map +0 -1
  60. package/dist/rpc/server.d.ts +0 -78
  61. package/dist/rpc/server.d.ts.map +0 -1
  62. package/dist/rpc/server.js +0 -437
  63. package/dist/rpc/server.js.map +0 -1
  64. package/dist/rpc/transport.d.ts +0 -84
  65. package/dist/rpc/transport.d.ts.map +0 -1
  66. package/dist/rpc/transport.js +0 -296
  67. package/dist/rpc/transport.js.map +0 -1
  68. package/dist/services/__mocks__/utils.d.ts +0 -16
  69. package/dist/services/__mocks__/utils.d.ts.map +0 -1
  70. package/dist/services/__mocks__/utils.js +0 -21
  71. package/dist/services/__mocks__/utils.js.map +0 -1
  72. package/dist/services/agent-service.d.ts +0 -29
  73. package/dist/services/agent-service.d.ts.map +0 -1
  74. package/dist/services/agent-service.js +0 -273
  75. package/dist/services/agent-service.js.map +0 -1
  76. package/dist/services/auth.d.ts +0 -59
  77. package/dist/services/auth.d.ts.map +0 -1
  78. package/dist/services/auth.js +0 -549
  79. package/dist/services/auth.js.map +0 -1
  80. package/dist/services/claude.d.ts +0 -18
  81. package/dist/services/claude.d.ts.map +0 -1
  82. package/dist/services/claude.js +0 -164
  83. package/dist/services/claude.js.map +0 -1
  84. package/dist/services/credential-store.d.ts +0 -47
  85. package/dist/services/credential-store.d.ts.map +0 -1
  86. package/dist/services/credential-store.js +0 -89
  87. package/dist/services/credential-store.js.map +0 -1
  88. package/dist/services/internal/github-service.d.ts +0 -67
  89. package/dist/services/internal/github-service.d.ts.map +0 -1
  90. package/dist/services/internal/github-service.js +0 -81
  91. package/dist/services/internal/github-service.js.map +0 -1
  92. package/dist/services/internal/repository-service.d.ts +0 -79
  93. package/dist/services/internal/repository-service.d.ts.map +0 -1
  94. package/dist/services/internal/repository-service.js +0 -88
  95. package/dist/services/internal/repository-service.js.map +0 -1
  96. package/dist/services/oauth2-auth.d.ts +0 -76
  97. package/dist/services/oauth2-auth.d.ts.map +0 -1
  98. package/dist/services/oauth2-auth.js +0 -451
  99. package/dist/services/oauth2-auth.js.map +0 -1
  100. package/dist/services/project-service.d.ts +0 -24
  101. package/dist/services/project-service.d.ts.map +0 -1
  102. package/dist/services/project-service.js +0 -60
  103. package/dist/services/project-service.js.map +0 -1
  104. package/dist/services/requirement-service.d.ts +0 -32
  105. package/dist/services/requirement-service.d.ts.map +0 -1
  106. package/dist/services/requirement-service.js +0 -91
  107. package/dist/services/requirement-service.js.map +0 -1
  108. package/dist/services/task-service.d.ts +0 -22
  109. package/dist/services/task-service.d.ts.map +0 -1
  110. package/dist/services/task-service.js +0 -52
  111. package/dist/services/task-service.js.map +0 -1
  112. package/dist/types/api.d.ts +0 -16
  113. package/dist/types/api.d.ts.map +0 -1
  114. package/dist/types/api.js +0 -5
  115. package/dist/types/api.js.map +0 -1
  116. package/dist/types/auth.d.ts +0 -73
  117. package/dist/types/auth.d.ts.map +0 -1
  118. package/dist/types/auth.js +0 -2
  119. package/dist/types/auth.js.map +0 -1
  120. package/dist/types/claude.d.ts +0 -22
  121. package/dist/types/claude.d.ts.map +0 -1
  122. package/dist/types/claude.js +0 -2
  123. package/dist/types/claude.js.map +0 -1
  124. package/dist/types/github.d.ts +0 -105
  125. package/dist/types/github.d.ts.map +0 -1
  126. package/dist/types/github.js +0 -6
  127. package/dist/types/github.js.map +0 -1
  128. package/dist/types/local-project.d.ts +0 -30
  129. package/dist/types/local-project.d.ts.map +0 -1
  130. package/dist/types/local-project.js +0 -24
  131. package/dist/types/local-project.js.map +0 -1
  132. package/dist/types/project.d.ts +0 -56
  133. package/dist/types/project.d.ts.map +0 -1
  134. package/dist/types/project.js +0 -5
  135. package/dist/types/project.js.map +0 -1
  136. package/dist/types/requirement.d.ts +0 -69
  137. package/dist/types/requirement.d.ts.map +0 -1
  138. package/dist/types/requirement.js +0 -5
  139. package/dist/types/requirement.js.map +0 -1
  140. package/dist/types/task.d.ts +0 -44
  141. package/dist/types/task.d.ts.map +0 -1
  142. package/dist/types/task.js +0 -5
  143. package/dist/types/task.js.map +0 -1
  144. package/dist/utils/axios-retry.d.ts +0 -25
  145. package/dist/utils/axios-retry.d.ts.map +0 -1
  146. package/dist/utils/axios-retry.js +0 -174
  147. package/dist/utils/axios-retry.js.map +0 -1
  148. package/dist/utils/axios-with-auth.d.ts +0 -10
  149. package/dist/utils/axios-with-auth.d.ts.map +0 -1
  150. package/dist/utils/axios-with-auth.js +0 -118
  151. package/dist/utils/axios-with-auth.js.map +0 -1
  152. package/dist/utils/cli-tools.d.ts +0 -30
  153. package/dist/utils/cli-tools.d.ts.map +0 -1
  154. package/dist/utils/cli-tools.js +0 -199
  155. package/dist/utils/cli-tools.js.map +0 -1
  156. package/dist/utils/command-execution.d.ts +0 -30
  157. package/dist/utils/command-execution.d.ts.map +0 -1
  158. package/dist/utils/command-execution.js +0 -264
  159. package/dist/utils/command-execution.js.map +0 -1
  160. package/dist/utils/command-parser.d.ts +0 -85
  161. package/dist/utils/command-parser.d.ts.map +0 -1
  162. package/dist/utils/command-parser.js +0 -287
  163. package/dist/utils/command-parser.js.map +0 -1
  164. package/dist/utils/config.d.ts +0 -10
  165. package/dist/utils/config.d.ts.map +0 -1
  166. package/dist/utils/config.js +0 -77
  167. package/dist/utils/config.js.map +0 -1
  168. package/dist/utils/error-formatter.d.ts +0 -17
  169. package/dist/utils/error-formatter.d.ts.map +0 -1
  170. package/dist/utils/error-formatter.js +0 -115
  171. package/dist/utils/error-formatter.js.map +0 -1
  172. package/dist/utils/formatting.d.ts +0 -10
  173. package/dist/utils/formatting.d.ts.map +0 -1
  174. package/dist/utils/formatting.js +0 -122
  175. package/dist/utils/formatting.js.map +0 -1
  176. package/dist/utils/gh-installer.d.ts +0 -31
  177. package/dist/utils/gh-installer.d.ts.map +0 -1
  178. package/dist/utils/gh-installer.js +0 -296
  179. package/dist/utils/gh-installer.js.map +0 -1
  180. package/dist/utils/git-installer.d.ts +0 -31
  181. package/dist/utils/git-installer.d.ts.map +0 -1
  182. package/dist/utils/git-installer.js +0 -290
  183. package/dist/utils/git-installer.js.map +0 -1
  184. package/dist/utils/git.d.ts +0 -60
  185. package/dist/utils/git.d.ts.map +0 -1
  186. package/dist/utils/git.js +0 -144
  187. package/dist/utils/git.js.map +0 -1
  188. package/dist/utils/github-repo.d.ts +0 -43
  189. package/dist/utils/github-repo.d.ts.map +0 -1
  190. package/dist/utils/github-repo.js +0 -113
  191. package/dist/utils/github-repo.js.map +0 -1
  192. package/dist/utils/id-normalization.d.ts +0 -26
  193. package/dist/utils/id-normalization.d.ts.map +0 -1
  194. package/dist/utils/id-normalization.js +0 -45
  195. package/dist/utils/id-normalization.js.map +0 -1
  196. package/dist/utils/jwt.d.ts +0 -45
  197. package/dist/utils/jwt.d.ts.map +0 -1
  198. package/dist/utils/jwt.js +0 -64
  199. package/dist/utils/jwt.js.map +0 -1
  200. package/dist/utils/local-store.d.ts +0 -36
  201. package/dist/utils/local-store.d.ts.map +0 -1
  202. package/dist/utils/local-store.js +0 -94
  203. package/dist/utils/local-store.js.map +0 -1
  204. package/dist/utils/logger.d.ts +0 -36
  205. package/dist/utils/logger.d.ts.map +0 -1
  206. package/dist/utils/logger.js +0 -176
  207. package/dist/utils/logger.js.map +0 -1
  208. package/dist/utils/package-manager-installer.d.ts +0 -36
  209. package/dist/utils/package-manager-installer.d.ts.map +0 -1
  210. package/dist/utils/package-manager-installer.js +0 -106
  211. package/dist/utils/package-manager-installer.js.map +0 -1
  212. package/dist/utils/package-manager.d.ts +0 -31
  213. package/dist/utils/package-manager.d.ts.map +0 -1
  214. package/dist/utils/package-manager.js +0 -133
  215. package/dist/utils/package-manager.js.map +0 -1
  216. package/dist/utils/projects.d.ts +0 -23
  217. package/dist/utils/projects.d.ts.map +0 -1
  218. package/dist/utils/projects.js +0 -36
  219. package/dist/utils/projects.js.map +0 -1
  220. package/dist/utils/repository-access.d.ts +0 -89
  221. package/dist/utils/repository-access.d.ts.map +0 -1
  222. package/dist/utils/repository-access.js +0 -132
  223. package/dist/utils/repository-access.js.map +0 -1
  224. package/dist/utils/requirements.d.ts +0 -43
  225. package/dist/utils/requirements.d.ts.map +0 -1
  226. package/dist/utils/requirements.js +0 -79
  227. package/dist/utils/requirements.js.map +0 -1
  228. package/dist/utils/spinner.d.ts +0 -47
  229. package/dist/utils/spinner.d.ts.map +0 -1
  230. package/dist/utils/spinner.js +0 -101
  231. package/dist/utils/spinner.js.map +0 -1
  232. package/dist/utils/status-parser.d.ts +0 -95
  233. package/dist/utils/status-parser.d.ts.map +0 -1
  234. package/dist/utils/status-parser.js +0 -205
  235. package/dist/utils/status-parser.js.map +0 -1
  236. package/dist/utils/tasks.d.ts +0 -21
  237. package/dist/utils/tasks.d.ts.map +0 -1
  238. package/dist/utils/tasks.js +0 -63
  239. package/dist/utils/tasks.js.map +0 -1
  240. package/dist/utils/workspace-manager.d.ts +0 -65
  241. package/dist/utils/workspace-manager.d.ts.map +0 -1
  242. package/dist/utils/workspace-manager.js +0 -98
  243. package/dist/utils/workspace-manager.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"repository-service.js","sourceRoot":"","sources":["../../../src/services/internal/repository-service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,EAAE,wBAAwB,EAAE,MAAM,gCAAgC,CAAC;AAG1E;;GAEG;AACH,MAAM,OAAO,iBAAiB;IAK7B,YAAY,OAAe,EAAE,IAAmB;QAC/C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,KAAK,GAAG,wBAAwB,CAAC,IAAI,CAAC,CAAC;IAC7C,CAAC;IAEO,UAAU;QACjB,OAAO;YACN,cAAc,EAAE,kBAAkB;SAClC,CAAC;IACH,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;IACH,KAAK,CAAC,gBAAgB,CAAC,MAKtB;QACA,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,sBAAsB,CAAC;QAClD,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAElC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAA2B,GAAG,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;QAC1F,OAAO,QAAQ,CAAC,IAAI,CAAC;IACtB,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,KAAK,CAAC,aAAa,CAAC,YAAoB;QACvC,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,wBAAwB,YAAY,EAAE,CAAC;QAClE,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAElC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAa,GAAG,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;QACpE,OAAO,QAAQ,CAAC,IAAI,CAAC;IACtB,CAAC;CACD"}
@@ -1,76 +0,0 @@
1
- export interface OAuth2AuthResult {
2
- accessToken: string;
3
- refreshToken?: string;
4
- idToken?: string;
5
- expiresIn?: number;
6
- tokenType?: string;
7
- }
8
- export interface OAuth2AuthUrlResult {
9
- authUrl: string;
10
- redirectUri: string;
11
- state: string;
12
- }
13
- export declare class OAuth2Handler {
14
- private abortController?;
15
- private onAuthCodeReceived?;
16
- private server?;
17
- private authorizationCode?;
18
- private authError?;
19
- private state?;
20
- private pkceVerifier?;
21
- /**
22
- * Set callback for when auth URL is ready
23
- */
24
- setAuthUrlCallback(callback: (authUrl: string) => void): void;
25
- /**
26
- * Generate PKCE challenge for OAuth2 flow
27
- */
28
- private generatePKCEChallenge;
29
- /**
30
- * Generate a cryptographically secure state parameter
31
- */
32
- private generateState;
33
- /**
34
- * Get the fixed port for the callback server
35
- */
36
- private getCallbackPort;
37
- /**
38
- * Start local HTTP server to handle OAuth callback
39
- */
40
- private startCallbackServer;
41
- /**
42
- * Build the authorization URL with PKCE parameters
43
- */
44
- private buildAuthorizationUrl;
45
- /**
46
- * Exchange authorization code for tokens
47
- */
48
- private exchangeCodeForTokens;
49
- /**
50
- * Wait for the authorization code from the callback
51
- */
52
- private waitForAuthorizationCode;
53
- /**
54
- * Prepare OAuth2 flow and return auth URL (for RPC mode)
55
- * Starts the callback server but doesn't open the browser
56
- */
57
- prepareAuthUrl(): Promise<OAuth2AuthUrlResult>;
58
- /**
59
- * Complete the OAuth2 flow after browser authentication (for RPC mode)
60
- * Call this after prepareAuthUrl() and the user has authenticated
61
- */
62
- completeAuth(timeoutMs?: number): Promise<OAuth2AuthResult>;
63
- /**
64
- * Initiates the OAuth2 authorization code flow with PKCE
65
- */
66
- authenticate(): Promise<OAuth2AuthResult>;
67
- /**
68
- * Refresh an access token using a refresh token
69
- */
70
- refreshToken(refreshToken: string): Promise<OAuth2AuthResult>;
71
- /**
72
- * Abort any ongoing authentication
73
- */
74
- abort(): void;
75
- }
76
- //# sourceMappingURL=oauth2-auth.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"oauth2-auth.d.ts","sourceRoot":"","sources":["../../src/services/oauth2-auth.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,gBAAgB;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;CACd;AAQD,qBAAa,aAAa;IACzB,OAAO,CAAC,eAAe,CAAC,CAAkB;IAC1C,OAAO,CAAC,kBAAkB,CAAC,CAA4B;IACvD,OAAO,CAAC,MAAM,CAAC,CAAkC;IACjD,OAAO,CAAC,iBAAiB,CAAC,CAAS;IACnC,OAAO,CAAC,SAAS,CAAC,CAAS;IAC3B,OAAO,CAAC,KAAK,CAAC,CAAS;IACvB,OAAO,CAAC,YAAY,CAAC,CAAS;IAE9B;;OAEG;IACH,kBAAkB,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI;IAI7D;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAc7B;;OAEG;IACH,OAAO,CAAC,aAAa;IAIrB;;OAEG;IACH,OAAO,CAAC,eAAe;IAKvB;;OAEG;YACW,mBAAmB;IAyHjC;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAsB7B;;OAEG;YACW,qBAAqB;IA+CnC;;OAEG;YACW,wBAAwB;IAqCtC;;;OAGG;IACG,cAAc,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAuCpD;;;OAGG;IACG,YAAY,CAAC,SAAS,GAAE,MAAe,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAuCzE;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,gBAAgB,CAAC;IAwE/C;;OAEG;IACG,YAAY,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IA4CnE;;OAEG;IACH,KAAK,IAAI,IAAI;CAWb"}
@@ -1,451 +0,0 @@
1
- import { createHash, randomBytes } from 'crypto';
2
- import { createServer } from 'http';
3
- import open from 'open';
4
- import axios, { AxiosError } from 'axios';
5
- import { getConfig } from '../utils/config.js';
6
- import { getLogger } from '../utils/logger.js';
7
- const logger = getLogger();
8
- export class OAuth2Handler {
9
- /**
10
- * Set callback for when auth URL is ready
11
- */
12
- setAuthUrlCallback(callback) {
13
- this.onAuthCodeReceived = callback;
14
- }
15
- /**
16
- * Generate PKCE challenge for OAuth2 flow
17
- */
18
- generatePKCEChallenge() {
19
- // Generate a cryptographically secure random verifier (43-128 chars)
20
- const verifier = randomBytes(32).toString('base64url');
21
- // Create challenge from verifier using SHA256
22
- const challenge = createHash('sha256').update(verifier).digest('base64url');
23
- return {
24
- verifier,
25
- challenge,
26
- method: 'S256',
27
- };
28
- }
29
- /**
30
- * Generate a cryptographically secure state parameter
31
- */
32
- generateState() {
33
- return randomBytes(32).toString('base64url');
34
- }
35
- /**
36
- * Get the fixed port for the callback server
37
- */
38
- getCallbackPort() {
39
- // Use fixed port 34536 for OAuth callback
40
- return 34536;
41
- }
42
- /**
43
- * Start local HTTP server to handle OAuth callback
44
- */
45
- async startCallbackServer(port) {
46
- return new Promise(resolve => {
47
- this.server = createServer((req, res) => {
48
- const url = new URL(req.url || '', `http://127.0.0.1:${port}`);
49
- // Handle OAuth callback
50
- if (url.pathname === '/callback') {
51
- const code = url.searchParams.get('code');
52
- const error = url.searchParams.get('error');
53
- const state = url.searchParams.get('state');
54
- // Validate state parameter
55
- if (state !== this.state) {
56
- res.writeHead(400, { 'Content-Type': 'text/html; charset=utf-8' });
57
- res.end(`
58
- <html>
59
- <body>
60
- <h1>Authentication Failed</h1>
61
- <p>Invalid state parameter. Please try again.</p>
62
- <script>window.setTimeout(() => window.close(), 3000);</script>
63
- </body>
64
- </html>
65
- `);
66
- this.authError = 'Invalid state parameter';
67
- return;
68
- }
69
- if (error) {
70
- // Handle error response
71
- const errorDescription = url.searchParams.get('error_description') || 'Unknown error';
72
- res.writeHead(400, { 'Content-Type': 'text/html; charset=utf-8' });
73
- res.end(`
74
- <html>
75
- <body>
76
- <h1>Authentication Failed</h1>
77
- <p>${errorDescription}</p>
78
- <script>window.setTimeout(() => window.close(), 3000);</script>
79
- </body>
80
- </html>
81
- `);
82
- this.authError = errorDescription;
83
- }
84
- else if (code) {
85
- // Success! Store the code
86
- this.authorizationCode = code;
87
- res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
88
- res.end(`
89
- <html>
90
- <head>
91
- <style>
92
- body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; display: flex; align-items: center; justify-content: center; height: 100vh; margin: 0; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); }
93
- .container { background: white; padding: 2rem; border-radius: 10px; box-shadow: 0 10px 40px rgba(0,0,0,0.1); text-align: center; }
94
- h1 { color: #2d3748; margin-bottom: 1rem; }
95
- p { color: #718096; }
96
- .success-icon { font-size: 3rem; margin-bottom: 1rem; }
97
- </style>
98
- </head>
99
- <body>
100
- <div class="container">
101
- <div class="success-icon">✅</div>
102
- <h1>Authentication Successful!</h1>
103
- <p>You can now close this window and return to the CLI.</p>
104
- <script>window.setTimeout(() => window.close(), 2000);</script>
105
- </div>
106
- </body>
107
- </html>
108
- `);
109
- }
110
- else {
111
- // No code or error
112
- res.writeHead(400, { 'Content-Type': 'text/html; charset=utf-8' });
113
- res.end(`
114
- <html>
115
- <body>
116
- <h1>Authentication Failed</h1>
117
- <p>No authorization code received.</p>
118
- <script>window.setTimeout(() => window.close(), 3000);</script>
119
- </body>
120
- </html>
121
- `);
122
- this.authError = 'No authorization code received';
123
- }
124
- // Close the server after handling the callback
125
- setTimeout(() => {
126
- if (this.server) {
127
- this.server.close();
128
- this.server = undefined;
129
- }
130
- }, 500);
131
- }
132
- else {
133
- // Handle other routes (redirect to /callback or show waiting page)
134
- res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
135
- res.end(`
136
- <html>
137
- <head>
138
- <style>
139
- body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; display: flex; align-items: center; justify-content: center; height: 100vh; margin: 0; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); }
140
- .container { background: white; padding: 2rem; border-radius: 10px; box-shadow: 0 10px 40px rgba(0,0,0,0.1); text-align: center; }
141
- h1 { color: #2d3748; }
142
- .spinner { border: 3px solid #f3f4f6; border-top: 3px solid #667eea; border-radius: 50%; width: 40px; height: 40px; animation: spin 1s linear infinite; margin: 1rem auto; }
143
- @keyframes spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } }
144
- </style>
145
- </head>
146
- <body>
147
- <div class="container">
148
- <h1>Waiting for authentication...</h1>
149
- <div class="spinner"></div>
150
- <p>Please complete the authentication in your browser.</p>
151
- </div>
152
- </body>
153
- </html>
154
- `);
155
- }
156
- });
157
- this.server.listen(port, '127.0.0.1', () => {
158
- logger.debug(`Callback server listening on http://127.0.0.1:${port}`);
159
- resolve();
160
- });
161
- });
162
- }
163
- /**
164
- * Build the authorization URL with PKCE parameters
165
- */
166
- buildAuthorizationUrl(pkce, redirectUri) {
167
- const config = getConfig();
168
- // Use WorkOS AuthKit directly like the MCP server does
169
- const authUrl = config.getWorkOSAuthUrl();
170
- // Generate state for CSRF protection
171
- this.state = this.generateState();
172
- const params = new URLSearchParams({
173
- client_id: config.oauthClientId || 'braingrid-cli',
174
- redirect_uri: redirectUri,
175
- response_type: 'code',
176
- scope: 'openid email profile offline_access',
177
- state: this.state,
178
- code_challenge: pkce.challenge,
179
- code_challenge_method: pkce.method,
180
- });
181
- return `${authUrl}/oauth2/authorize?${params.toString()}`;
182
- }
183
- /**
184
- * Exchange authorization code for tokens
185
- */
186
- async exchangeCodeForTokens(code, verifier, redirectUri) {
187
- const config = getConfig();
188
- // Use WorkOS AuthKit token endpoint
189
- const tokenUrl = `${config.getWorkOSAuthUrl()}/oauth2/token`;
190
- const params = new URLSearchParams({
191
- grant_type: 'authorization_code',
192
- client_id: config.oauthClientId || 'braingrid-cli',
193
- code: code,
194
- redirect_uri: redirectUri,
195
- code_verifier: verifier,
196
- });
197
- logger.debug('Exchanging authorization code for tokens', { tokenUrl });
198
- try {
199
- const response = await axios.post(tokenUrl, params.toString(), {
200
- headers: {
201
- 'Content-Type': 'application/x-www-form-urlencoded',
202
- },
203
- });
204
- logger.debug('Token exchange successful', {
205
- hasAccessToken: !!response.data.access_token,
206
- hasRefreshToken: !!response.data.refresh_token,
207
- });
208
- return response.data;
209
- }
210
- catch (error) {
211
- if (error instanceof AxiosError && error.response) {
212
- const errorData = error.response.data;
213
- logger.error('Token exchange failed', {
214
- status: error.response.status,
215
- error: errorData,
216
- });
217
- throw new Error(`Token exchange failed: ${errorData.error_description || errorData.error}`);
218
- }
219
- throw new Error(`Token exchange failed: ${error instanceof Error ? error.message : String(error)}`);
220
- }
221
- }
222
- /**
223
- * Wait for the authorization code from the callback
224
- */
225
- async waitForAuthorizationCode(timeoutMs = 300000) {
226
- // 5 minutes timeout
227
- return new Promise((resolve, reject) => {
228
- const startTime = Date.now();
229
- const checkInterval = setInterval(() => {
230
- // Check if we should abort
231
- if (this.abortController?.signal.aborted) {
232
- clearInterval(checkInterval);
233
- reject(new Error('Authentication cancelled'));
234
- return;
235
- }
236
- // Check for error
237
- if (this.authError) {
238
- clearInterval(checkInterval);
239
- reject(new Error(this.authError));
240
- return;
241
- }
242
- // Check for success
243
- if (this.authorizationCode) {
244
- clearInterval(checkInterval);
245
- resolve(this.authorizationCode);
246
- return;
247
- }
248
- // Check for timeout
249
- if (Date.now() - startTime > timeoutMs) {
250
- clearInterval(checkInterval);
251
- reject(new Error('Authentication timeout - no response received'));
252
- return;
253
- }
254
- }, 500); // Check every 500ms
255
- });
256
- }
257
- /**
258
- * Prepare OAuth2 flow and return auth URL (for RPC mode)
259
- * Starts the callback server but doesn't open the browser
260
- */
261
- async prepareAuthUrl() {
262
- logger.info('Preparing OAuth2 authentication URL for RPC mode');
263
- // Create new AbortController for this authentication session
264
- this.abortController = new AbortController();
265
- // Reset state
266
- this.authorizationCode = undefined;
267
- this.authError = undefined;
268
- this.state = undefined;
269
- this.pkceVerifier = undefined;
270
- // Step 1: Generate PKCE challenge
271
- const pkce = this.generatePKCEChallenge();
272
- this.pkceVerifier = pkce.verifier; // Store for later use
273
- logger.debug('PKCE challenge generated');
274
- // Step 2: Use fixed port and start callback server
275
- const port = this.getCallbackPort();
276
- const redirectUri = `http://127.0.0.1:${port}/callback`;
277
- logger.info('Starting callback server', { port, redirectUri });
278
- await this.startCallbackServer(port);
279
- // Step 3: Build authorization URL
280
- const authUrl = this.buildAuthorizationUrl(pkce, redirectUri);
281
- logger.info('Authorization URL ready for RPC client', { authUrl });
282
- if (!this.state) {
283
- throw new Error('State not initialized');
284
- }
285
- return {
286
- authUrl,
287
- redirectUri,
288
- state: this.state,
289
- };
290
- }
291
- /**
292
- * Complete the OAuth2 flow after browser authentication (for RPC mode)
293
- * Call this after prepareAuthUrl() and the user has authenticated
294
- */
295
- async completeAuth(timeoutMs = 300000) {
296
- if (!this.pkceVerifier) {
297
- throw new Error('Must call prepareAuthUrl() before completeAuth()');
298
- }
299
- try {
300
- // Wait for authorization code from callback
301
- logger.info('Waiting for user to complete authentication in browser...');
302
- const code = await this.waitForAuthorizationCode(timeoutMs);
303
- logger.info('Authorization code received');
304
- // Get redirect URI from server (it's always the same port)
305
- const port = this.getCallbackPort();
306
- const redirectUri = `http://127.0.0.1:${port}/callback`;
307
- // Exchange code for tokens
308
- const tokens = await this.exchangeCodeForTokens(code, this.pkceVerifier, redirectUri);
309
- logger.info('Authentication successful');
310
- // Return token info
311
- return {
312
- accessToken: tokens.access_token,
313
- refreshToken: tokens.refresh_token,
314
- idToken: tokens.id_token,
315
- expiresIn: tokens.expires_in,
316
- tokenType: tokens.token_type,
317
- };
318
- }
319
- catch (error) {
320
- this.abort();
321
- throw error;
322
- }
323
- finally {
324
- // Clean up server if still running
325
- if (this.server) {
326
- this.server.close();
327
- this.server = undefined;
328
- }
329
- }
330
- }
331
- /**
332
- * Initiates the OAuth2 authorization code flow with PKCE
333
- */
334
- async authenticate() {
335
- logger.info('Starting OAuth2 authentication flow with PKCE');
336
- // Create new AbortController for this authentication session
337
- this.abortController = new AbortController();
338
- // Reset state
339
- this.authorizationCode = undefined;
340
- this.authError = undefined;
341
- this.state = undefined;
342
- try {
343
- // Step 1: Generate PKCE challenge
344
- const pkce = this.generatePKCEChallenge();
345
- logger.debug('PKCE challenge generated');
346
- // Step 2: Use fixed port and start callback server
347
- const port = this.getCallbackPort();
348
- const redirectUri = `http://127.0.0.1:${port}/callback`;
349
- logger.info('Starting callback server', { port, redirectUri });
350
- await this.startCallbackServer(port);
351
- // Step 3: Build authorization URL
352
- const authUrl = this.buildAuthorizationUrl(pkce, redirectUri);
353
- logger.info('Authorization URL ready', { authUrl });
354
- // Notify callback if set
355
- if (this.onAuthCodeReceived) {
356
- this.onAuthCodeReceived(authUrl);
357
- }
358
- // Step 4: Open browser
359
- try {
360
- logger.debug('Opening browser for authentication');
361
- await open(authUrl);
362
- logger.info('Browser opened automatically');
363
- }
364
- catch (error) {
365
- logger.warn('Failed to open browser automatically', { error });
366
- logger.info(`Please open the following URL manually:\n${authUrl}`);
367
- }
368
- // Step 5: Wait for authorization code
369
- logger.info('Waiting for user to complete authentication...');
370
- const code = await this.waitForAuthorizationCode();
371
- logger.info('Authorization code received');
372
- // Step 6: Exchange code for tokens
373
- const tokens = await this.exchangeCodeForTokens(code, pkce.verifier, redirectUri);
374
- logger.info('Authentication successful');
375
- // Step 7: Return token info
376
- return {
377
- accessToken: tokens.access_token,
378
- refreshToken: tokens.refresh_token,
379
- idToken: tokens.id_token,
380
- expiresIn: tokens.expires_in,
381
- tokenType: tokens.token_type,
382
- };
383
- }
384
- catch (error) {
385
- // Abort any ongoing operations
386
- this.abort();
387
- throw error;
388
- }
389
- finally {
390
- // Clean up server if still running
391
- if (this.server) {
392
- this.server.close();
393
- this.server = undefined;
394
- }
395
- }
396
- }
397
- /**
398
- * Refresh an access token using a refresh token
399
- */
400
- async refreshToken(refreshToken) {
401
- const config = getConfig();
402
- // Use WorkOS AuthKit token endpoint for refresh
403
- const tokenUrl = `${config.getWorkOSAuthUrl()}/oauth2/token`;
404
- const params = new URLSearchParams({
405
- grant_type: 'refresh_token',
406
- client_id: config.oauthClientId || 'braingrid-cli',
407
- refresh_token: refreshToken,
408
- });
409
- logger.debug('Refreshing access token');
410
- try {
411
- const response = await axios.post(tokenUrl, params.toString(), {
412
- headers: {
413
- 'Content-Type': 'application/x-www-form-urlencoded',
414
- },
415
- });
416
- logger.debug('Token refresh successful');
417
- return {
418
- accessToken: response.data.access_token,
419
- refreshToken: response.data.refresh_token,
420
- idToken: response.data.id_token,
421
- expiresIn: response.data.expires_in,
422
- tokenType: response.data.token_type,
423
- };
424
- }
425
- catch (error) {
426
- if (error instanceof AxiosError && error.response) {
427
- const errorData = error.response.data;
428
- logger.error('Token refresh failed', {
429
- status: error.response.status,
430
- error: errorData,
431
- });
432
- throw new Error(`Token refresh failed: ${errorData.error_description || errorData.error}`);
433
- }
434
- throw new Error(`Token refresh failed: ${error instanceof Error ? error.message : String(error)}`);
435
- }
436
- }
437
- /**
438
- * Abort any ongoing authentication
439
- */
440
- abort() {
441
- if (this.abortController) {
442
- this.abortController.abort();
443
- this.abortController = undefined;
444
- }
445
- if (this.server) {
446
- this.server.close();
447
- this.server = undefined;
448
- }
449
- }
450
- }
451
- //# sourceMappingURL=oauth2-auth.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"oauth2-auth.js","sourceRoot":"","sources":["../../src/services/oauth2-auth.ts"],"names":[],"mappings":"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"}
@@ -1,24 +0,0 @@
1
- /**
2
- * Project Service
3
- * Handles all API interactions for projects
4
- */
5
- import { BraingridAuth } from './auth.js';
6
- import { Project, CreateProjectRequest, UpdateProjectRequest, ListProjectsResponse, ListProjectsWithRepositoryResponse } from '../types/project.js';
7
- export declare class ProjectService {
8
- private baseUrl;
9
- private auth;
10
- private axios;
11
- constructor(baseUrl: string, auth: BraingridAuth);
12
- private getHeaders;
13
- listProjects(params: {
14
- page?: number;
15
- limit?: number;
16
- repository_owner?: string;
17
- repository_name?: string;
18
- }): Promise<ListProjectsResponse | ListProjectsWithRepositoryResponse>;
19
- getProject(projectId: string): Promise<Project>;
20
- createProject(data: CreateProjectRequest): Promise<Project>;
21
- updateProject(projectId: string, data: UpdateProjectRequest): Promise<Project>;
22
- deleteProject(projectId: string): Promise<void>;
23
- }
24
- //# sourceMappingURL=project-service.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"project-service.d.ts","sourceRoot":"","sources":["../../src/services/project-service.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAE1C,OAAO,EACN,OAAO,EACP,oBAAoB,EACpB,oBAAoB,EACpB,oBAAoB,EACpB,kCAAkC,EAClC,MAAM,qBAAqB,CAAC;AAE7B,qBAAa,cAAc;IAC1B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,IAAI,CAAgB;IAC5B,OAAO,CAAC,KAAK,CAAgB;gBAEjB,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa;IAMhD,OAAO,CAAC,UAAU;IAMZ,YAAY,CAAC,MAAM,EAAE;QAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,eAAe,CAAC,EAAE,MAAM,CAAC;KACzB,GAAG,OAAO,CAAC,oBAAoB,GAAG,kCAAkC,CAAC;IAoBhE,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAQ/C,aAAa,CAAC,IAAI,EAAE,oBAAoB,GAAG,OAAO,CAAC,OAAO,CAAC;IAQ3D,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,oBAAoB,GAAG,OAAO,CAAC,OAAO,CAAC;IAQ9E,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAMrD"}
@@ -1,60 +0,0 @@
1
- /**
2
- * Project Service
3
- * Handles all API interactions for projects
4
- */
5
- import { createAuthenticatedAxios } from '../utils/axios-with-auth.js';
6
- export class ProjectService {
7
- constructor(baseUrl, auth) {
8
- this.baseUrl = baseUrl;
9
- this.auth = auth;
10
- this.axios = createAuthenticatedAxios(auth);
11
- }
12
- getHeaders() {
13
- return {
14
- 'Content-Type': 'application/json',
15
- };
16
- }
17
- async listProjects(params) {
18
- const queryParams = new URLSearchParams();
19
- if (params.page)
20
- queryParams.append('page', params.page.toString());
21
- if (params.limit)
22
- queryParams.append('limit', params.limit.toString());
23
- if (params.repository_owner)
24
- queryParams.append('repository_owner', params.repository_owner);
25
- if (params.repository_name)
26
- queryParams.append('repository_name', params.repository_name);
27
- const url = `${this.baseUrl}/api/v1/projects?${queryParams.toString()}`;
28
- const headers = this.getHeaders();
29
- // API returns different response structures based on query parameters:
30
- // - ListProjectsResponse (with pagination) for regular lists
31
- // - ListProjectsWithRepositoryResponse (with total_count) for repository filters
32
- // Handlers are equipped to handle both types via union type
33
- const response = await this.axios.get(url, { headers });
34
- return response.data;
35
- }
36
- async getProject(projectId) {
37
- const url = `${this.baseUrl}/api/v1/projects/${projectId}`;
38
- const headers = this.getHeaders();
39
- const response = await this.axios.get(url, { headers });
40
- return response.data;
41
- }
42
- async createProject(data) {
43
- const url = `${this.baseUrl}/api/v1/projects`;
44
- const headers = this.getHeaders();
45
- const response = await this.axios.post(url, data, { headers });
46
- return response.data;
47
- }
48
- async updateProject(projectId, data) {
49
- const url = `${this.baseUrl}/api/v1/projects/${projectId}`;
50
- const headers = this.getHeaders();
51
- const response = await this.axios.patch(url, data, { headers });
52
- return response.data;
53
- }
54
- async deleteProject(projectId) {
55
- const url = `${this.baseUrl}/api/v1/projects/${projectId}`;
56
- const headers = this.getHeaders();
57
- await this.axios.delete(url, { headers });
58
- }
59
- }
60
- //# sourceMappingURL=project-service.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"project-service.js","sourceRoot":"","sources":["../../src/services/project-service.ts"],"names":[],"mappings":"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"}