@testany/hephos 0.3.18 → 0.4.0-dev.4

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 (81) hide show
  1. package/README.md +29 -0
  2. package/out/auth/AuthConfig.d.ts +54 -0
  3. package/out/auth/AuthConfig.d.ts.map +1 -0
  4. package/out/auth/AuthConfig.js +70 -0
  5. package/out/auth/AuthConfig.js.map +1 -0
  6. package/out/auth/AuthService.d.ts +74 -0
  7. package/out/auth/AuthService.d.ts.map +1 -0
  8. package/out/auth/AuthService.js +275 -0
  9. package/out/auth/AuthService.js.map +1 -0
  10. package/out/auth/CallbackServer.d.ts +15 -0
  11. package/out/auth/CallbackServer.d.ts.map +1 -0
  12. package/out/auth/CallbackServer.js +277 -0
  13. package/out/auth/CallbackServer.js.map +1 -0
  14. package/out/auth/TokenCache.d.ts +81 -0
  15. package/out/auth/TokenCache.d.ts.map +1 -0
  16. package/out/auth/TokenCache.js +191 -0
  17. package/out/auth/TokenCache.js.map +1 -0
  18. package/out/auth/index.d.ts +11 -0
  19. package/out/auth/index.d.ts.map +1 -0
  20. package/out/auth/index.js +13 -0
  21. package/out/auth/index.js.map +1 -0
  22. package/out/auth/types.d.ts +75 -0
  23. package/out/auth/types.d.ts.map +1 -0
  24. package/out/auth/types.js +15 -0
  25. package/out/auth/types.js.map +1 -0
  26. package/out/cli.d.ts.map +1 -1
  27. package/out/cli.js +224 -34
  28. package/out/cli.js.map +1 -1
  29. package/out/repl/ReplModeInk.d.ts +1 -0
  30. package/out/repl/ReplModeInk.d.ts.map +1 -1
  31. package/out/repl/ReplModeInk.js +231 -22
  32. package/out/repl/ReplModeInk.js.map +1 -1
  33. package/out/secure-config/BaseDirResolver.d.ts +5 -0
  34. package/out/secure-config/BaseDirResolver.d.ts.map +1 -0
  35. package/out/secure-config/BaseDirResolver.js +20 -0
  36. package/out/secure-config/BaseDirResolver.js.map +1 -0
  37. package/out/secure-config/DeviceKeyService.d.ts +13 -0
  38. package/out/secure-config/DeviceKeyService.d.ts.map +1 -0
  39. package/out/secure-config/DeviceKeyService.js +51 -0
  40. package/out/secure-config/DeviceKeyService.js.map +1 -0
  41. package/out/secure-config/DeviceStore.d.ts +13 -0
  42. package/out/secure-config/DeviceStore.d.ts.map +1 -0
  43. package/out/secure-config/DeviceStore.js +39 -0
  44. package/out/secure-config/DeviceStore.js.map +1 -0
  45. package/out/secure-config/InstructionNormalizer.d.ts +5 -0
  46. package/out/secure-config/InstructionNormalizer.d.ts.map +1 -0
  47. package/out/secure-config/InstructionNormalizer.js +20 -0
  48. package/out/secure-config/InstructionNormalizer.js.map +1 -0
  49. package/out/secure-config/KeysetService.d.ts +15 -0
  50. package/out/secure-config/KeysetService.d.ts.map +1 -0
  51. package/out/secure-config/KeysetService.js +88 -0
  52. package/out/secure-config/KeysetService.js.map +1 -0
  53. package/out/secure-config/SCPService.d.ts +14 -0
  54. package/out/secure-config/SCPService.d.ts.map +1 -0
  55. package/out/secure-config/SCPService.js +79 -0
  56. package/out/secure-config/SCPService.js.map +1 -0
  57. package/out/secure-config/SecureConfigClient.d.ts +30 -0
  58. package/out/secure-config/SecureConfigClient.d.ts.map +1 -0
  59. package/out/secure-config/SecureConfigClient.js +81 -0
  60. package/out/secure-config/SecureConfigClient.js.map +1 -0
  61. package/out/secure-config/errors.d.ts +8 -0
  62. package/out/secure-config/errors.d.ts.map +1 -0
  63. package/out/secure-config/errors.js +20 -0
  64. package/out/secure-config/errors.js.map +1 -0
  65. package/out/secure-config/index.d.ts +11 -0
  66. package/out/secure-config/index.d.ts.map +1 -0
  67. package/out/secure-config/index.js +11 -0
  68. package/out/secure-config/index.js.map +1 -0
  69. package/out/secure-config/rootKey.d.ts +3 -0
  70. package/out/secure-config/rootKey.d.ts.map +1 -0
  71. package/out/secure-config/rootKey.js +57 -0
  72. package/out/secure-config/rootKey.js.map +1 -0
  73. package/out/secure-config/signatureUtils.d.ts +3 -0
  74. package/out/secure-config/signatureUtils.d.ts.map +1 -0
  75. package/out/secure-config/signatureUtils.js +23 -0
  76. package/out/secure-config/signatureUtils.js.map +1 -0
  77. package/out/secure-config/types.d.ts +79 -0
  78. package/out/secure-config/types.d.ts.map +1 -0
  79. package/out/secure-config/types.js +2 -0
  80. package/out/secure-config/types.js.map +1 -0
  81. package/package.json +2 -2
package/README.md CHANGED
@@ -34,6 +34,35 @@ agent-chatter
34
34
  agent-chatter config-example
35
35
  ```
36
36
 
37
+ ## Authentication
38
+
39
+ Login to HephOS cloud to access team sync and cloud features:
40
+
41
+ ```bash
42
+ # Login via CLI command
43
+ hephos --login cn # Login to CN region (authing.cn)
44
+ hephos --login us # Login to US region (us.authing.co)
45
+
46
+ # Check authentication status
47
+ hephos --auth-status
48
+
49
+ # Logout
50
+ hephos --logout # Logout from active region
51
+ hephos --logout cn # Logout from specific region
52
+ ```
53
+
54
+ Or use REPL commands:
55
+
56
+ ```bash
57
+ hephos # Start REPL
58
+ /login cn # Login to CN region
59
+ /login us # Login to US region
60
+ /login status # Check auth status
61
+ /login logout # Logout
62
+ ```
63
+
64
+ Tokens are cached at `~/.agent-chatter/auth/token-cache.json` with 0600 permissions.
65
+
37
66
  ## Features
38
67
 
39
68
  - Multi-agent conversation orchestration
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Authentication configuration for US and CN regions
3
+ */
4
+ import type { AuthRegion, AuthEnvironment } from './types.js';
5
+ /** Region-specific configuration */
6
+ export interface RegionConfig {
7
+ /** Authing application host URL */
8
+ appHost: string;
9
+ /** Authing application ID (audience for JWT) */
10
+ appId: string;
11
+ /** HephOS backend API base URLs by environment */
12
+ apiBaseUrls: Record<AuthEnvironment, string>;
13
+ /** Display name for UI */
14
+ displayName: string;
15
+ }
16
+ /** Authentication configuration by region */
17
+ export declare const AUTH_CONFIG: Record<AuthRegion, RegionConfig>;
18
+ /** OAuth redirect URI - fixed localhost port */
19
+ export declare const REDIRECT_URI = "http://127.0.0.1:8400/callback";
20
+ /** Callback server port */
21
+ export declare const CALLBACK_PORT = 8400;
22
+ /** OAuth scopes required for login */
23
+ export declare const SCOPES = "openid profile email offline_access";
24
+ /** Login timeout in milliseconds (5 minutes) */
25
+ export declare const LOGIN_TIMEOUT_MS: number;
26
+ /** Token refresh threshold - refresh when less than 5 minutes remaining */
27
+ export declare const REFRESH_THRESHOLD_MS: number;
28
+ /** Token cache file version */
29
+ export declare const TOKEN_CACHE_VERSION = 1;
30
+ /** Default environment */
31
+ export declare const DEFAULT_ENVIRONMENT: AuthEnvironment;
32
+ /**
33
+ * Get OIDC endpoints for a region
34
+ */
35
+ export declare function getOIDCEndpoints(region: AuthRegion): {
36
+ authorization: string;
37
+ token: string;
38
+ userInfo: string;
39
+ logout: string;
40
+ jwks: string;
41
+ };
42
+ /**
43
+ * Validate region string
44
+ */
45
+ export declare function isValidRegion(region: string): region is AuthRegion;
46
+ /**
47
+ * Validate environment string
48
+ */
49
+ export declare function isValidEnvironment(env: string): env is AuthEnvironment;
50
+ /**
51
+ * Resolve API base URL by region/environment
52
+ */
53
+ export declare function getApiBaseUrl(region: AuthRegion, env: AuthEnvironment): string;
54
+ //# sourceMappingURL=AuthConfig.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AuthConfig.d.ts","sourceRoot":"","sources":["../../src/auth/AuthConfig.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE9D,oCAAoC;AACpC,MAAM,WAAW,YAAY;IAC3B,mCAAmC;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,gDAAgD;IAChD,KAAK,EAAE,MAAM,CAAC;IACd,kDAAkD;IAClD,WAAW,EAAE,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;IAC7C,0BAA0B;IAC1B,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,6CAA6C;AAC7C,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,UAAU,EAAE,YAAY,CAmB/C,CAAC;AAEX,gDAAgD;AAChD,eAAO,MAAM,YAAY,mCAAmC,CAAC;AAE7D,2BAA2B;AAC3B,eAAO,MAAM,aAAa,OAAO,CAAC;AAElC,sCAAsC;AACtC,eAAO,MAAM,MAAM,wCAAwC,CAAC;AAE5D,gDAAgD;AAChD,eAAO,MAAM,gBAAgB,QAAgB,CAAC;AAE9C,2EAA2E;AAC3E,eAAO,MAAM,oBAAoB,QAAgB,CAAC;AAElD,+BAA+B;AAC/B,eAAO,MAAM,mBAAmB,IAAI,CAAC;AAErC,0BAA0B;AAC1B,eAAO,MAAM,mBAAmB,EAAE,eAAwB,CAAC;AAE3D;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,UAAU;;;;;;EASlD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,IAAI,UAAU,CAElE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,IAAI,eAAe,CAEtE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,eAAe,GAAG,MAAM,CAE9E"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Authentication configuration for US and CN regions
3
+ */
4
+ /** Authentication configuration by region */
5
+ export const AUTH_CONFIG = {
6
+ cn: {
7
+ appHost: 'https://hephos-cn.authing.cn',
8
+ appId: '69452ae6e3adaa39789bf1a2',
9
+ apiBaseUrls: {
10
+ prod: 'https://api-cn.hephos.testany.com.cn',
11
+ staging: 'https://api-cn-staging.hephos.testany.com.cn',
12
+ },
13
+ displayName: 'CN (China)',
14
+ },
15
+ us: {
16
+ appHost: 'https://hephos-us.us.authing.co',
17
+ appId: '6948c9d11aa104ecec25d599',
18
+ apiBaseUrls: {
19
+ prod: 'https://api.hephos.ai',
20
+ staging: 'https://api-staging.hephos.ai',
21
+ },
22
+ displayName: 'US (International)',
23
+ },
24
+ };
25
+ /** OAuth redirect URI - fixed localhost port */
26
+ export const REDIRECT_URI = 'http://127.0.0.1:8400/callback';
27
+ /** Callback server port */
28
+ export const CALLBACK_PORT = 8400;
29
+ /** OAuth scopes required for login */
30
+ export const SCOPES = 'openid profile email offline_access';
31
+ /** Login timeout in milliseconds (5 minutes) */
32
+ export const LOGIN_TIMEOUT_MS = 5 * 60 * 1000;
33
+ /** Token refresh threshold - refresh when less than 5 minutes remaining */
34
+ export const REFRESH_THRESHOLD_MS = 5 * 60 * 1000;
35
+ /** Token cache file version */
36
+ export const TOKEN_CACHE_VERSION = 1;
37
+ /** Default environment */
38
+ export const DEFAULT_ENVIRONMENT = 'prod';
39
+ /**
40
+ * Get OIDC endpoints for a region
41
+ */
42
+ export function getOIDCEndpoints(region) {
43
+ const { appHost } = AUTH_CONFIG[region];
44
+ return {
45
+ authorization: `${appHost}/oidc/auth`,
46
+ token: `${appHost}/oidc/token`,
47
+ userInfo: `${appHost}/oidc/me`,
48
+ logout: `${appHost}/oidc/session/end`,
49
+ jwks: `${appHost}/oidc/.well-known/jwks.json`,
50
+ };
51
+ }
52
+ /**
53
+ * Validate region string
54
+ */
55
+ export function isValidRegion(region) {
56
+ return region === 'cn' || region === 'us';
57
+ }
58
+ /**
59
+ * Validate environment string
60
+ */
61
+ export function isValidEnvironment(env) {
62
+ return env === 'prod' || env === 'staging';
63
+ }
64
+ /**
65
+ * Resolve API base URL by region/environment
66
+ */
67
+ export function getApiBaseUrl(region, env) {
68
+ return AUTH_CONFIG[region].apiBaseUrls[env];
69
+ }
70
+ //# sourceMappingURL=AuthConfig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AuthConfig.js","sourceRoot":"","sources":["../../src/auth/AuthConfig.ts"],"names":[],"mappings":"AAAA;;GAEG;AAgBH,6CAA6C;AAC7C,MAAM,CAAC,MAAM,WAAW,GAAqC;IAC3D,EAAE,EAAE;QACF,OAAO,EAAE,8BAA8B;QACvC,KAAK,EAAE,0BAA0B;QACjC,WAAW,EAAE;YACX,IAAI,EAAE,sCAAsC;YAC5C,OAAO,EAAE,8CAA8C;SACxD;QACD,WAAW,EAAE,YAAY;KAC1B;IACD,EAAE,EAAE;QACF,OAAO,EAAE,iCAAiC;QAC1C,KAAK,EAAE,0BAA0B;QACjC,WAAW,EAAE;YACX,IAAI,EAAE,uBAAuB;YAC7B,OAAO,EAAE,+BAA+B;SACzC;QACD,WAAW,EAAE,oBAAoB;KAClC;CACO,CAAC;AAEX,gDAAgD;AAChD,MAAM,CAAC,MAAM,YAAY,GAAG,gCAAgC,CAAC;AAE7D,2BAA2B;AAC3B,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,CAAC;AAElC,sCAAsC;AACtC,MAAM,CAAC,MAAM,MAAM,GAAG,qCAAqC,CAAC;AAE5D,gDAAgD;AAChD,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;AAE9C,2EAA2E;AAC3E,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;AAElD,+BAA+B;AAC/B,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC;AAErC,0BAA0B;AAC1B,MAAM,CAAC,MAAM,mBAAmB,GAAoB,MAAM,CAAC;AAE3D;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAkB;IACjD,MAAM,EAAE,OAAO,EAAE,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;IACxC,OAAO;QACL,aAAa,EAAE,GAAG,OAAO,YAAY;QACrC,KAAK,EAAE,GAAG,OAAO,aAAa;QAC9B,QAAQ,EAAE,GAAG,OAAO,UAAU;QAC9B,MAAM,EAAE,GAAG,OAAO,mBAAmB;QACrC,IAAI,EAAE,GAAG,OAAO,6BAA6B;KAC9C,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,MAAc;IAC1C,OAAO,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,IAAI,CAAC;AAC5C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,GAAW;IAC5C,OAAO,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,SAAS,CAAC;AAC7C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,MAAkB,EAAE,GAAoB;IACpE,OAAO,WAAW,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;AAC9C,CAAC"}
@@ -0,0 +1,74 @@
1
+ /**
2
+ * Authentication service implementing PKCE OAuth flow with Authing
3
+ */
4
+ import type { AuthRegion, AuthEnvironment, AuthUrlResult, TokenSet, UserInfo, LoginResult } from './types.js';
5
+ export declare class AuthService {
6
+ private region;
7
+ private environment;
8
+ private endpoints;
9
+ private config;
10
+ private apiBaseUrl;
11
+ constructor(region: AuthRegion, environment?: AuthEnvironment);
12
+ /**
13
+ * Generate PKCE parameters (code_verifier, code_challenge, state)
14
+ */
15
+ private generatePKCE;
16
+ /**
17
+ * Build authorization URL with PKCE
18
+ */
19
+ buildAuthUrl(): AuthUrlResult;
20
+ /**
21
+ * Exchange authorization code for tokens
22
+ */
23
+ exchangeCodeForTokens(code: string, verifier: string): Promise<TokenSet>;
24
+ /**
25
+ * Refresh tokens using refresh_token
26
+ */
27
+ refreshTokens(refreshToken: string): Promise<TokenSet>;
28
+ /**
29
+ * Get user info from Authing userInfo endpoint
30
+ */
31
+ getUserInfo(accessToken: string): Promise<UserInfo>;
32
+ /**
33
+ * Sync user with HephOS backend
34
+ */
35
+ syncUser(accessToken: string): Promise<void>;
36
+ /**
37
+ * Open browser for login
38
+ */
39
+ private openBrowser;
40
+ /**
41
+ * Complete login flow
42
+ */
43
+ login(): Promise<LoginResult>;
44
+ /**
45
+ * Logout - clear tokens and optionally call logout endpoint
46
+ * For CLI, we just clear local tokens. Browser session cleanup at Authing is optional.
47
+ */
48
+ logout(): Promise<void>;
49
+ /**
50
+ * Refresh token if needed
51
+ */
52
+ refreshIfNeeded(): Promise<boolean>;
53
+ /**
54
+ * Get valid access token (refreshing if needed)
55
+ */
56
+ getValidAccessToken(): Promise<string | null>;
57
+ /**
58
+ * Check if user is logged in
59
+ */
60
+ isLoggedIn(): boolean;
61
+ /**
62
+ * Get current user info (from cache)
63
+ */
64
+ getCurrentUser(): UserInfo | null;
65
+ }
66
+ /**
67
+ * Create auth service for a region
68
+ */
69
+ export declare function createAuthService(region: AuthRegion, environment?: AuthEnvironment): AuthService;
70
+ /**
71
+ * Mask sensitive token for logging
72
+ */
73
+ export declare function maskToken(token: string): string;
74
+ //# sourceMappingURL=AuthService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AuthService.d.ts","sourceRoot":"","sources":["../../src/auth/AuthService.ts"],"names":[],"mappings":"AAAA;;GAEG;AAeH,OAAO,KAAK,EACV,UAAU,EACV,eAAe,EAEf,aAAa,EACb,QAAQ,EACR,QAAQ,EACR,WAAW,EACZ,MAAM,YAAY,CAAC;AAEpB,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,WAAW,CAAkB;IACrC,OAAO,CAAC,SAAS,CAAsC;IACvD,OAAO,CAAC,MAAM,CAAiC;IAC/C,OAAO,CAAC,UAAU,CAAS;gBAEf,MAAM,EAAE,UAAU,EAAE,WAAW,GAAE,eAAqC;IAQlF;;OAEG;IACH,OAAO,CAAC,YAAY;IAkBpB;;OAEG;IACH,YAAY,IAAI,aAAa;IAuB7B;;OAEG;IACG,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IA+B9E;;OAEG;IACG,aAAa,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IAyB5D;;OAEG;IACG,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IAiBzD;;OAEG;IACG,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAuBlD;;OAEG;YACW,WAAW;IAYzB;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,WAAW,CAAC;IA4DnC;;;OAGG;IACG,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAM7B;;OAEG;IACG,eAAe,IAAI,OAAO,CAAC,OAAO,CAAC;IAqBzC;;OAEG;IACG,mBAAmB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAQnD;;OAEG;IACH,UAAU,IAAI,OAAO;IAIrB;;OAEG;IACH,cAAc,IAAI,QAAQ,GAAG,IAAI;CAGlC;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,UAAU,EAAE,WAAW,GAAE,eAAqC,GAAG,WAAW,CAErH;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAG/C"}
@@ -0,0 +1,275 @@
1
+ /**
2
+ * Authentication service implementing PKCE OAuth flow with Authing
3
+ */
4
+ import * as crypto from 'crypto';
5
+ import open from 'open';
6
+ import { AUTH_CONFIG, REDIRECT_URI, SCOPES, getOIDCEndpoints, getApiBaseUrl, DEFAULT_ENVIRONMENT, } from './AuthConfig.js';
7
+ import { startCallbackServer } from './CallbackServer.js';
8
+ import { tokenCache } from './TokenCache.js';
9
+ import { AuthError } from './types.js';
10
+ export class AuthService {
11
+ region;
12
+ environment;
13
+ endpoints;
14
+ config;
15
+ apiBaseUrl;
16
+ constructor(region, environment = DEFAULT_ENVIRONMENT) {
17
+ this.region = region;
18
+ this.environment = environment;
19
+ this.endpoints = getOIDCEndpoints(region);
20
+ this.config = AUTH_CONFIG[region];
21
+ this.apiBaseUrl = getApiBaseUrl(region, environment);
22
+ }
23
+ /**
24
+ * Generate PKCE parameters (code_verifier, code_challenge, state)
25
+ */
26
+ generatePKCE() {
27
+ // Generate code_verifier: 64 bytes of random data as hex (128 chars)
28
+ const verifier = crypto.randomBytes(64).toString('hex');
29
+ // Generate code_challenge: SHA-256 of verifier, base64url encoded
30
+ const hash = crypto.createHash('sha256').update(verifier).digest();
31
+ const challenge = hash
32
+ .toString('base64')
33
+ .replace(/\+/g, '-')
34
+ .replace(/\//g, '_')
35
+ .replace(/=/g, '');
36
+ // Generate state: 16 bytes of random data as hex (32 chars)
37
+ const state = crypto.randomBytes(16).toString('hex');
38
+ return { verifier, challenge, state };
39
+ }
40
+ /**
41
+ * Build authorization URL with PKCE
42
+ */
43
+ buildAuthUrl() {
44
+ const pkce = this.generatePKCE();
45
+ const params = new URLSearchParams({
46
+ client_id: this.config.appId,
47
+ redirect_uri: REDIRECT_URI,
48
+ response_type: 'code',
49
+ scope: SCOPES,
50
+ code_challenge: pkce.challenge,
51
+ code_challenge_method: 'S256',
52
+ state: pkce.state,
53
+ prompt: 'consent', // Required to get refresh_token with offline_access scope
54
+ });
55
+ const url = `${this.endpoints.authorization}?${params.toString()}`;
56
+ return {
57
+ url,
58
+ state: pkce.state,
59
+ verifier: pkce.verifier,
60
+ };
61
+ }
62
+ /**
63
+ * Exchange authorization code for tokens
64
+ */
65
+ async exchangeCodeForTokens(code, verifier) {
66
+ const body = new URLSearchParams({
67
+ grant_type: 'authorization_code',
68
+ client_id: this.config.appId,
69
+ code,
70
+ redirect_uri: REDIRECT_URI,
71
+ code_verifier: verifier,
72
+ });
73
+ const response = await fetch(this.endpoints.token, {
74
+ method: 'POST',
75
+ headers: {
76
+ 'Content-Type': 'application/x-www-form-urlencoded',
77
+ },
78
+ body: body.toString(),
79
+ });
80
+ if (!response.ok) {
81
+ const errorData = await response.json().catch(() => ({}));
82
+ const errorMessage = errorData.error_description
83
+ || errorData.error
84
+ || 'Token exchange failed';
85
+ throw new AuthError('AUTH_TOKEN_EXCHANGE_FAILED', `Failed to exchange code for tokens: ${errorMessage}`);
86
+ }
87
+ return await response.json();
88
+ }
89
+ /**
90
+ * Refresh tokens using refresh_token
91
+ */
92
+ async refreshTokens(refreshToken) {
93
+ const body = new URLSearchParams({
94
+ grant_type: 'refresh_token',
95
+ client_id: this.config.appId,
96
+ refresh_token: refreshToken,
97
+ });
98
+ const response = await fetch(this.endpoints.token, {
99
+ method: 'POST',
100
+ headers: {
101
+ 'Content-Type': 'application/x-www-form-urlencoded',
102
+ },
103
+ body: body.toString(),
104
+ });
105
+ if (!response.ok) {
106
+ throw new AuthError('AUTH_REFRESH_FAILED', 'Failed to refresh token. Please login again.');
107
+ }
108
+ return await response.json();
109
+ }
110
+ /**
111
+ * Get user info from Authing userInfo endpoint
112
+ */
113
+ async getUserInfo(accessToken) {
114
+ const response = await fetch(this.endpoints.userInfo, {
115
+ headers: {
116
+ Authorization: `Bearer ${accessToken}`,
117
+ },
118
+ });
119
+ if (!response.ok) {
120
+ throw new AuthError('AUTH_TOKEN_EXCHANGE_FAILED', 'Failed to fetch user info');
121
+ }
122
+ return await response.json();
123
+ }
124
+ /**
125
+ * Sync user with HephOS backend
126
+ */
127
+ async syncUser(accessToken) {
128
+ const response = await fetch(`${this.apiBaseUrl}/users/sync`, {
129
+ method: 'POST',
130
+ headers: {
131
+ 'Authorization': `Bearer ${accessToken}`,
132
+ 'Content-Type': 'application/json',
133
+ },
134
+ body: '{}',
135
+ });
136
+ if (!response.ok) {
137
+ // 404 means user hasn't completed onboarding on web
138
+ if (response.status === 404) {
139
+ throw new AuthError('AUTH_USER_SYNC_FAILED', 'User not found. Please complete onboarding on the HephOS website first.');
140
+ }
141
+ // Other errors - warn but don't block
142
+ console.warn(`Warning: User sync failed (${response.status}), but login succeeded.`);
143
+ }
144
+ }
145
+ /**
146
+ * Open browser for login
147
+ */
148
+ async openBrowser(url) {
149
+ try {
150
+ await open(url);
151
+ }
152
+ catch {
153
+ // Browser failed to open - user will need to manually open URL
154
+ throw new AuthError('AUTH_BROWSER_FAILED', `Failed to open browser. Please visit this URL manually:\n${url}`);
155
+ }
156
+ }
157
+ /**
158
+ * Complete login flow
159
+ */
160
+ async login() {
161
+ // Build auth URL with PKCE
162
+ const { url, state, verifier } = this.buildAuthUrl();
163
+ // Start callback server
164
+ const callbackPromise = startCallbackServer();
165
+ // Open browser (with fallback message)
166
+ let browserError = null;
167
+ try {
168
+ await this.openBrowser(url);
169
+ }
170
+ catch (err) {
171
+ if (err instanceof AuthError) {
172
+ browserError = err;
173
+ }
174
+ }
175
+ // If browser failed, show URL but continue waiting for callback
176
+ if (browserError) {
177
+ console.log(`\nPlease open this URL in your browser:\n${url}\n`);
178
+ }
179
+ // Wait for callback
180
+ const callback = await callbackPromise;
181
+ // Validate state
182
+ if (callback.state !== state) {
183
+ throw new AuthError('AUTH_STATE_MISMATCH', 'Security validation failed. Please try again.');
184
+ }
185
+ // Exchange code for tokens
186
+ const tokens = await this.exchangeCodeForTokens(callback.code, verifier);
187
+ // Get user info
188
+ const userInfo = await this.getUserInfo(tokens.access_token);
189
+ // Save tokens to cache
190
+ tokenCache.save(this.region, tokens, userInfo, this.environment);
191
+ // Try to sync user (non-blocking)
192
+ try {
193
+ await this.syncUser(tokens.access_token);
194
+ }
195
+ catch (err) {
196
+ if (err instanceof AuthError && err.code === 'AUTH_USER_SYNC_FAILED') {
197
+ console.warn(`\nWarning: ${err.message}`);
198
+ }
199
+ // Continue - token is saved, user can retry sync later
200
+ }
201
+ return {
202
+ tokens,
203
+ userInfo,
204
+ region: this.region,
205
+ environment: this.environment,
206
+ };
207
+ }
208
+ /**
209
+ * Logout - clear tokens and optionally call logout endpoint
210
+ * For CLI, we just clear local tokens. Browser session cleanup at Authing is optional.
211
+ */
212
+ async logout() {
213
+ tokenCache.clear(this.region);
214
+ // Note: We don't open browser to Authing logout endpoint for CLI.
215
+ // Local token cleanup is sufficient. User can manually logout from Authing if needed.
216
+ }
217
+ /**
218
+ * Refresh token if needed
219
+ */
220
+ async refreshIfNeeded() {
221
+ if (!tokenCache.needsRefresh(this.region)) {
222
+ return false;
223
+ }
224
+ const refreshToken = tokenCache.getRefreshToken(this.region);
225
+ if (!refreshToken) {
226
+ return false;
227
+ }
228
+ try {
229
+ const tokens = await this.refreshTokens(refreshToken);
230
+ const userInfo = await this.getUserInfo(tokens.access_token);
231
+ tokenCache.save(this.region, tokens, userInfo, this.environment);
232
+ return true;
233
+ }
234
+ catch {
235
+ // Refresh failed - token will expire and user will need to re-login
236
+ return false;
237
+ }
238
+ }
239
+ /**
240
+ * Get valid access token (refreshing if needed)
241
+ */
242
+ async getValidAccessToken() {
243
+ // Try to refresh if needed
244
+ await this.refreshIfNeeded();
245
+ // Return token if valid
246
+ return tokenCache.getAccessToken(this.region);
247
+ }
248
+ /**
249
+ * Check if user is logged in
250
+ */
251
+ isLoggedIn() {
252
+ return tokenCache.isValid(this.region);
253
+ }
254
+ /**
255
+ * Get current user info (from cache)
256
+ */
257
+ getCurrentUser() {
258
+ return tokenCache.getUserInfo(this.region);
259
+ }
260
+ }
261
+ /**
262
+ * Create auth service for a region
263
+ */
264
+ export function createAuthService(region, environment = DEFAULT_ENVIRONMENT) {
265
+ return new AuthService(region, environment);
266
+ }
267
+ /**
268
+ * Mask sensitive token for logging
269
+ */
270
+ export function maskToken(token) {
271
+ if (token.length <= 10)
272
+ return '***';
273
+ return `${token.slice(0, 5)}...${token.slice(-5)}`;
274
+ }
275
+ //# sourceMappingURL=AuthService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AuthService.js","sourceRoot":"","sources":["../../src/auth/AuthService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Local HTTP server to receive OAuth callback
3
+ * Listens on 127.0.0.1:8400 for security (localhost only)
4
+ */
5
+ import type { CallbackResult } from './types.js';
6
+ /**
7
+ * Start a local HTTP server to receive OAuth callback
8
+ * Returns a promise that resolves with the authorization code and state
9
+ */
10
+ export declare function startCallbackServer(): Promise<CallbackResult>;
11
+ /**
12
+ * Check if port is available
13
+ */
14
+ export declare function isPortAvailable(port?: number): Promise<boolean>;
15
+ //# sourceMappingURL=CallbackServer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CallbackServer.d.ts","sourceRoot":"","sources":["../../src/auth/CallbackServer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAkLjD;;;GAGG;AACH,wBAAgB,mBAAmB,IAAI,OAAO,CAAC,cAAc,CAAC,CAoG7D;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,GAAE,MAAsB,GAAG,OAAO,CAAC,OAAO,CAAC,CAY9E"}