@vybestack/llxprt-code-auth 0.10.0-nightly.260613.1adad3b34

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 (71) hide show
  1. package/dist/.last_build +0 -0
  2. package/dist/index.d.ts +10 -0
  3. package/dist/index.js +11 -0
  4. package/dist/index.js.map +1 -0
  5. package/dist/src/auth-precedence-resolver.d.ts +147 -0
  6. package/dist/src/auth-precedence-resolver.js +542 -0
  7. package/dist/src/auth-precedence-resolver.js.map +1 -0
  8. package/dist/src/flows/anthropic-device-flow.d.ts +57 -0
  9. package/dist/src/flows/anthropic-device-flow.js +231 -0
  10. package/dist/src/flows/anthropic-device-flow.js.map +1 -0
  11. package/dist/src/flows/codex-device-flow.d.ts +114 -0
  12. package/dist/src/flows/codex-device-flow.js +437 -0
  13. package/dist/src/flows/codex-device-flow.js.map +1 -0
  14. package/dist/src/flows/qwen-device-flow.d.ts +45 -0
  15. package/dist/src/flows/qwen-device-flow.js +183 -0
  16. package/dist/src/flows/qwen-device-flow.js.map +1 -0
  17. package/dist/src/index.d.ts +34 -0
  18. package/dist/src/index.js +26 -0
  19. package/dist/src/index.js.map +1 -0
  20. package/dist/src/interfaces/debug-logger.d.ts +31 -0
  21. package/dist/src/interfaces/debug-logger.js +6 -0
  22. package/dist/src/interfaces/debug-logger.js.map +1 -0
  23. package/dist/src/interfaces/index.d.ts +18 -0
  24. package/dist/src/interfaces/index.js +10 -0
  25. package/dist/src/interfaces/index.js.map +1 -0
  26. package/dist/src/interfaces/provider-key-storage.d.ts +26 -0
  27. package/dist/src/interfaces/provider-key-storage.js +6 -0
  28. package/dist/src/interfaces/provider-key-storage.js.map +1 -0
  29. package/dist/src/interfaces/runtime-context.d.ts +37 -0
  30. package/dist/src/interfaces/runtime-context.js +6 -0
  31. package/dist/src/interfaces/runtime-context.js.map +1 -0
  32. package/dist/src/interfaces/secure-store.d.ts +47 -0
  33. package/dist/src/interfaces/secure-store.js +6 -0
  34. package/dist/src/interfaces/secure-store.js.map +1 -0
  35. package/dist/src/interfaces/settings-service.d.ts +25 -0
  36. package/dist/src/interfaces/settings-service.js +6 -0
  37. package/dist/src/interfaces/settings-service.js.map +1 -0
  38. package/dist/src/keyring-token-store.d.ts +96 -0
  39. package/dist/src/keyring-token-store.js +391 -0
  40. package/dist/src/keyring-token-store.js.map +1 -0
  41. package/dist/src/oauth-errors.d.ts +173 -0
  42. package/dist/src/oauth-errors.js +465 -0
  43. package/dist/src/oauth-errors.js.map +1 -0
  44. package/dist/src/precedence.d.ts +115 -0
  45. package/dist/src/precedence.js +278 -0
  46. package/dist/src/precedence.js.map +1 -0
  47. package/dist/src/proxy/framing.d.ts +35 -0
  48. package/dist/src/proxy/framing.js +86 -0
  49. package/dist/src/proxy/framing.js.map +1 -0
  50. package/dist/src/proxy/proxy-provider-key-storage.d.ts +23 -0
  51. package/dist/src/proxy/proxy-provider-key-storage.js +41 -0
  52. package/dist/src/proxy/proxy-provider-key-storage.js.map +1 -0
  53. package/dist/src/proxy/proxy-socket-client.d.ts +43 -0
  54. package/dist/src/proxy/proxy-socket-client.js +219 -0
  55. package/dist/src/proxy/proxy-socket-client.js.map +1 -0
  56. package/dist/src/proxy/proxy-token-store.d.ts +39 -0
  57. package/dist/src/proxy/proxy-token-store.js +87 -0
  58. package/dist/src/proxy/proxy-token-store.js.map +1 -0
  59. package/dist/src/token-merge.d.ts +16 -0
  60. package/dist/src/token-merge.js +13 -0
  61. package/dist/src/token-merge.js.map +1 -0
  62. package/dist/src/token-sanitization.d.ts +16 -0
  63. package/dist/src/token-sanitization.js +10 -0
  64. package/dist/src/token-sanitization.js.map +1 -0
  65. package/dist/src/token-store.d.ts +93 -0
  66. package/dist/src/token-store.js +7 -0
  67. package/dist/src/token-store.js.map +1 -0
  68. package/dist/src/types.d.ts +204 -0
  69. package/dist/src/types.js +86 -0
  70. package/dist/src/types.js.map +1 -0
  71. package/package.json +42 -0
@@ -0,0 +1,204 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Vybestack LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { z } from 'zod';
7
+ /**
8
+ * OAuth token storage schema
9
+ */
10
+ export declare const OAuthTokenSchema: z.ZodObject<{
11
+ access_token: z.ZodString;
12
+ refresh_token: z.ZodOptional<z.ZodString>;
13
+ expiry: z.ZodNumber;
14
+ scope: z.ZodOptional<z.ZodNullable<z.ZodString>>;
15
+ token_type: z.ZodEnum<["Bearer", "bearer"]>;
16
+ resource_url: z.ZodOptional<z.ZodString>;
17
+ }, "strip", z.ZodTypeAny, {
18
+ access_token: string;
19
+ expiry: number;
20
+ token_type: "Bearer" | "bearer";
21
+ refresh_token?: string | undefined;
22
+ scope?: string | null | undefined;
23
+ resource_url?: string | undefined;
24
+ }, {
25
+ access_token: string;
26
+ expiry: number;
27
+ token_type: "Bearer" | "bearer";
28
+ refresh_token?: string | undefined;
29
+ scope?: string | null | undefined;
30
+ resource_url?: string | undefined;
31
+ }>;
32
+ /**
33
+ * Provider OAuth configuration schema
34
+ */
35
+ export declare const ProviderOAuthConfigSchema: z.ZodObject<{
36
+ provider: z.ZodEnum<["gemini", "qwen"]>;
37
+ clientId: z.ZodString;
38
+ authorizationEndpoint: z.ZodString;
39
+ tokenEndpoint: z.ZodString;
40
+ scopes: z.ZodArray<z.ZodString, "many">;
41
+ }, "strip", z.ZodTypeAny, {
42
+ provider: "gemini" | "qwen";
43
+ clientId: string;
44
+ authorizationEndpoint: string;
45
+ tokenEndpoint: string;
46
+ scopes: string[];
47
+ }, {
48
+ provider: "gemini" | "qwen";
49
+ clientId: string;
50
+ authorizationEndpoint: string;
51
+ tokenEndpoint: string;
52
+ scopes: string[];
53
+ }>;
54
+ /**
55
+ * Device code response schema
56
+ */
57
+ export declare const DeviceCodeResponseSchema: z.ZodObject<{
58
+ device_code: z.ZodString;
59
+ user_code: z.ZodString;
60
+ verification_uri: z.ZodString;
61
+ verification_uri_complete: z.ZodOptional<z.ZodString>;
62
+ expires_in: z.ZodNumber;
63
+ interval: z.ZodOptional<z.ZodNumber>;
64
+ }, "strip", z.ZodTypeAny, {
65
+ device_code: string;
66
+ user_code: string;
67
+ verification_uri: string;
68
+ expires_in: number;
69
+ verification_uri_complete?: string | undefined;
70
+ interval?: number | undefined;
71
+ }, {
72
+ device_code: string;
73
+ user_code: string;
74
+ verification_uri: string;
75
+ expires_in: number;
76
+ verification_uri_complete?: string | undefined;
77
+ interval?: number | undefined;
78
+ }>;
79
+ /**
80
+ * Token response schema
81
+ */
82
+ export declare const TokenResponseSchema: z.ZodObject<{
83
+ access_token: z.ZodString;
84
+ token_type: z.ZodString;
85
+ expires_in: z.ZodOptional<z.ZodNumber>;
86
+ refresh_token: z.ZodOptional<z.ZodString>;
87
+ scope: z.ZodOptional<z.ZodNullable<z.ZodString>>;
88
+ resource_url: z.ZodOptional<z.ZodString>;
89
+ }, "strip", z.ZodTypeAny, {
90
+ access_token: string;
91
+ token_type: string;
92
+ refresh_token?: string | undefined;
93
+ scope?: string | null | undefined;
94
+ resource_url?: string | undefined;
95
+ expires_in?: number | undefined;
96
+ }, {
97
+ access_token: string;
98
+ token_type: string;
99
+ refresh_token?: string | undefined;
100
+ scope?: string | null | undefined;
101
+ resource_url?: string | undefined;
102
+ expires_in?: number | undefined;
103
+ }>;
104
+ /**
105
+ * Auth status schema
106
+ */
107
+ export declare const AuthStatusSchema: z.ZodObject<{
108
+ provider: z.ZodString;
109
+ authenticated: z.ZodBoolean;
110
+ expiresIn: z.ZodOptional<z.ZodNumber>;
111
+ oauthEnabled: z.ZodOptional<z.ZodBoolean>;
112
+ }, "strip", z.ZodTypeAny, {
113
+ provider: string;
114
+ authenticated: boolean;
115
+ expiresIn?: number | undefined;
116
+ oauthEnabled?: boolean | undefined;
117
+ }, {
118
+ provider: string;
119
+ authenticated: boolean;
120
+ expiresIn?: number | undefined;
121
+ oauthEnabled?: boolean | undefined;
122
+ }>;
123
+ /**
124
+ * Codex OAuth token schema - extends OAuthTokenSchema with account_id
125
+ * Required for ChatGPT-Account-ID header
126
+ */
127
+ export declare const CodexOAuthTokenSchema: z.ZodObject<{
128
+ access_token: z.ZodString;
129
+ refresh_token: z.ZodOptional<z.ZodString>;
130
+ expiry: z.ZodNumber;
131
+ scope: z.ZodOptional<z.ZodNullable<z.ZodString>>;
132
+ token_type: z.ZodEnum<["Bearer", "bearer"]>;
133
+ resource_url: z.ZodOptional<z.ZodString>;
134
+ } & {
135
+ account_id: z.ZodString;
136
+ id_token: z.ZodOptional<z.ZodString>;
137
+ }, "strip", z.ZodTypeAny, {
138
+ access_token: string;
139
+ expiry: number;
140
+ token_type: "Bearer" | "bearer";
141
+ account_id: string;
142
+ refresh_token?: string | undefined;
143
+ scope?: string | null | undefined;
144
+ resource_url?: string | undefined;
145
+ id_token?: string | undefined;
146
+ }, {
147
+ access_token: string;
148
+ expiry: number;
149
+ token_type: "Bearer" | "bearer";
150
+ account_id: string;
151
+ refresh_token?: string | undefined;
152
+ scope?: string | null | undefined;
153
+ resource_url?: string | undefined;
154
+ id_token?: string | undefined;
155
+ }>;
156
+ export type CodexOAuthToken = z.infer<typeof CodexOAuthTokenSchema>;
157
+ /**
158
+ * Codex token response schema
159
+ */
160
+ export declare const CodexTokenResponseSchema: z.ZodObject<{
161
+ access_token: z.ZodString;
162
+ id_token: z.ZodOptional<z.ZodString>;
163
+ expires_in: z.ZodOptional<z.ZodNumber>;
164
+ refresh_token: z.ZodOptional<z.ZodString>;
165
+ token_type: z.ZodString;
166
+ }, "strip", z.ZodTypeAny, {
167
+ access_token: string;
168
+ token_type: string;
169
+ refresh_token?: string | undefined;
170
+ expires_in?: number | undefined;
171
+ id_token?: string | undefined;
172
+ }, {
173
+ access_token: string;
174
+ token_type: string;
175
+ refresh_token?: string | undefined;
176
+ expires_in?: number | undefined;
177
+ id_token?: string | undefined;
178
+ }>;
179
+ export type CodexTokenResponse = z.infer<typeof CodexTokenResponseSchema>;
180
+ /**
181
+ * Bucket statistics schema
182
+ */
183
+ export declare const BucketStatsSchema: z.ZodObject<{
184
+ bucket: z.ZodString;
185
+ requestCount: z.ZodNumber;
186
+ percentage: z.ZodNumber;
187
+ lastUsed: z.ZodOptional<z.ZodNumber>;
188
+ }, "strip", z.ZodTypeAny, {
189
+ bucket: string;
190
+ requestCount: number;
191
+ percentage: number;
192
+ lastUsed?: number | undefined;
193
+ }, {
194
+ bucket: string;
195
+ requestCount: number;
196
+ percentage: number;
197
+ lastUsed?: number | undefined;
198
+ }>;
199
+ export type OAuthToken = z.infer<typeof OAuthTokenSchema>;
200
+ export type ProviderOAuthConfig = z.infer<typeof ProviderOAuthConfigSchema>;
201
+ export type DeviceCodeResponse = z.infer<typeof DeviceCodeResponseSchema>;
202
+ export type TokenResponse = z.infer<typeof TokenResponseSchema>;
203
+ export type AuthStatus = z.infer<typeof AuthStatusSchema>;
204
+ export type BucketStats = z.infer<typeof BucketStatsSchema>;
@@ -0,0 +1,86 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Vybestack LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { z } from 'zod';
7
+ /**
8
+ * OAuth token storage schema
9
+ */
10
+ export const OAuthTokenSchema = z.object({
11
+ access_token: z.string(),
12
+ refresh_token: z.string().optional(),
13
+ expiry: z.number(), // Unix timestamp
14
+ scope: z.string().nullable().optional(),
15
+ token_type: z.enum(['Bearer', 'bearer']), // OpenAI returns lowercase 'bearer'
16
+ resource_url: z.string().optional(), // For Qwen OAuth - indicates the API endpoint to use
17
+ });
18
+ /**
19
+ * Provider OAuth configuration schema
20
+ */
21
+ export const ProviderOAuthConfigSchema = z.object({
22
+ provider: z.enum(['gemini', 'qwen']),
23
+ clientId: z.string(),
24
+ authorizationEndpoint: z.string().url(),
25
+ tokenEndpoint: z.string().url(),
26
+ scopes: z.array(z.string()),
27
+ });
28
+ /**
29
+ * Device code response schema
30
+ */
31
+ export const DeviceCodeResponseSchema = z.object({
32
+ device_code: z.string(),
33
+ user_code: z.string(),
34
+ verification_uri: z.string().url(),
35
+ verification_uri_complete: z.string().url().optional(),
36
+ expires_in: z.number(),
37
+ interval: z.number().optional(), // Qwen doesn't include this field
38
+ });
39
+ /**
40
+ * Token response schema
41
+ */
42
+ export const TokenResponseSchema = z.object({
43
+ access_token: z.string(),
44
+ token_type: z.string(),
45
+ expires_in: z.number().optional(),
46
+ refresh_token: z.string().optional(),
47
+ scope: z.string().nullable().optional(), // Qwen may return null for scope
48
+ resource_url: z.string().optional(), // Qwen OAuth returns the API endpoint to use
49
+ });
50
+ /**
51
+ * Auth status schema
52
+ */
53
+ export const AuthStatusSchema = z.object({
54
+ provider: z.string(),
55
+ authenticated: z.boolean(),
56
+ expiresIn: z.number().optional(), // seconds until expiry
57
+ oauthEnabled: z.boolean().optional(), // whether OAuth is enabled for this provider
58
+ });
59
+ /**
60
+ * Codex OAuth token schema - extends OAuthTokenSchema with account_id
61
+ * Required for ChatGPT-Account-ID header
62
+ */
63
+ export const CodexOAuthTokenSchema = OAuthTokenSchema.extend({
64
+ account_id: z.string().describe('Required for ChatGPT-Account-ID header'),
65
+ id_token: z.string().optional().describe('JWT containing account claims'),
66
+ });
67
+ /**
68
+ * Codex token response schema
69
+ */
70
+ export const CodexTokenResponseSchema = z.object({
71
+ access_token: z.string(),
72
+ id_token: z.string().optional(),
73
+ expires_in: z.number().optional(),
74
+ refresh_token: z.string().optional(),
75
+ token_type: z.string(),
76
+ });
77
+ /**
78
+ * Bucket statistics schema
79
+ */
80
+ export const BucketStatsSchema = z.object({
81
+ bucket: z.string(),
82
+ requestCount: z.number(),
83
+ percentage: z.number(),
84
+ lastUsed: z.number().optional(), // Unix timestamp in milliseconds
85
+ });
86
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,42 @@
1
+ {
2
+ "name": "@vybestack/llxprt-code-auth",
3
+ "version": "0.10.0-nightly.260613.1adad3b34",
4
+ "description": "LLxprt Code Auth — authentication and authorization domain",
5
+ "license": "Apache-2.0",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "git+https://github.com/vybestack/llxprt-code.git"
9
+ },
10
+ "type": "module",
11
+ "main": "dist/index.js",
12
+ "types": "dist/index.d.ts",
13
+ "exports": {
14
+ ".": {
15
+ "types": "./dist/index.d.ts",
16
+ "import": "./dist/index.js"
17
+ }
18
+ },
19
+ "scripts": {
20
+ "build": "node ../../scripts/build_package.js",
21
+ "lint": "eslint . --ext .ts,.tsx",
22
+ "format": "prettier --write .",
23
+ "test": "vitest run",
24
+ "test:ci": "vitest run",
25
+ "typecheck": "tsc --noEmit"
26
+ },
27
+ "files": [
28
+ "dist"
29
+ ],
30
+ "dependencies": {
31
+ "zod": "^3.25.76"
32
+ },
33
+ "devDependencies": {
34
+ "@types/node": "^24.2.1",
35
+ "fast-check": "^4.8.0",
36
+ "typescript": "^5.3.3",
37
+ "vitest": "^3.2.4"
38
+ },
39
+ "engines": {
40
+ "node": ">=20"
41
+ }
42
+ }