@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,278 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Vybestack LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ export const runtimeScopedStates = new Map();
7
+ let legacyRuntimeScopeWarningEmitted = false;
8
+ function maskToken(token) {
9
+ if (!token) {
10
+ return '[redacted]';
11
+ }
12
+ const trimmed = token.replace(/\s+/g, '');
13
+ if (trimmed.length <= 4) {
14
+ return '*'.repeat(trimmed.length);
15
+ }
16
+ if (trimmed.length <= 8) {
17
+ return `${trimmed.slice(0, 2)}***${trimmed.slice(-2)}`;
18
+ }
19
+ return `${trimmed.slice(0, 4)}…${trimmed.slice(-4)}`;
20
+ }
21
+ function normalizeExpiry(expiry) {
22
+ if (expiry == null || expiry === 0 || Number.isNaN(expiry)) {
23
+ return undefined;
24
+ }
25
+ return expiry > 1_000_000_000_000 ? expiry : expiry * 1000;
26
+ }
27
+ export function resolveProfileId(settingsService) {
28
+ const maybeGetName = settingsService.getCurrentProfileName;
29
+ if (typeof maybeGetName === 'function') {
30
+ const profileName = maybeGetName.call(settingsService);
31
+ if (profileName?.trim()) {
32
+ return profileName.trim();
33
+ }
34
+ }
35
+ const currentProfile = settingsService.get('currentProfile');
36
+ if (typeof currentProfile === 'string' && currentProfile.trim()) {
37
+ return currentProfile.trim();
38
+ }
39
+ return null;
40
+ }
41
+ export function buildCacheKey(runtimeId, providerId, profileId) {
42
+ return `${runtimeId}::${providerId}::${profileId}`;
43
+ }
44
+ function toPublicEntry(entry, overrides) {
45
+ const summary = {
46
+ key: entry.key,
47
+ providerId: entry.providerId,
48
+ profileId: entry.profileId,
49
+ runtimeAuthScopeId: entry.runtimeAuthScopeId,
50
+ createdAt: entry.createdAt,
51
+ expiresAt: entry.expiresAt,
52
+ preview: maskToken(entry.token),
53
+ stale: entry.stale,
54
+ };
55
+ return overrides ? { ...summary, ...overrides } : summary;
56
+ }
57
+ function updateMetadataEntry(state, entry, summary) {
58
+ const snapshot = summary ?? toPublicEntry(entry);
59
+ const existingIndex = state.metadata.cacheEntries.findIndex((item) => item.key === snapshot.key);
60
+ if (existingIndex >= 0) {
61
+ state.metadata.cacheEntries[existingIndex] = snapshot;
62
+ }
63
+ else {
64
+ state.metadata.cacheEntries.push(snapshot);
65
+ }
66
+ state.metadata.metrics.lastUpdated = Date.now();
67
+ }
68
+ export function ensureRuntimeState(context, logger) {
69
+ const runtimeId = context.runtimeId ?? 'legacy-singleton';
70
+ let state = runtimeScopedStates.get(runtimeId);
71
+ if (!state) {
72
+ const metadata = {
73
+ runtimeAuthScopeId: runtimeId,
74
+ cacheEntries: [],
75
+ cancellationHooks: [],
76
+ revokedTokens: [],
77
+ metrics: {
78
+ hits: 0,
79
+ misses: 0,
80
+ lastUpdated: Date.now(),
81
+ },
82
+ };
83
+ state = {
84
+ runtimeAuthScopeId: runtimeId,
85
+ entries: new Map(),
86
+ metadata,
87
+ settingsSubscriptions: [],
88
+ };
89
+ runtimeScopedStates.set(runtimeId, state);
90
+ }
91
+ context.metadata ??= {};
92
+ context.metadata.runtimeAuthScope = state.metadata;
93
+ if (runtimeId === 'legacy-singleton' &&
94
+ !legacyRuntimeScopeWarningEmitted &&
95
+ process.env.DEBUG &&
96
+ logger) {
97
+ logger.warn('AuthPrecedenceResolver invoked without runtimeId; using legacy singleton auth cache.');
98
+ legacyRuntimeScopeWarningEmitted = true;
99
+ }
100
+ return state;
101
+ }
102
+ export function recordCacheHit(state) {
103
+ state.metadata.metrics.hits += 1;
104
+ state.metadata.metrics.lastUpdated = Date.now();
105
+ }
106
+ export function recordCacheMiss(state) {
107
+ state.metadata.metrics.misses += 1;
108
+ state.metadata.metrics.lastUpdated = Date.now();
109
+ }
110
+ export function getValidCachedEntry(state, providerId, profileId) {
111
+ const cacheKey = buildCacheKey(state.runtimeAuthScopeId, providerId, profileId);
112
+ const entry = state.entries.get(cacheKey);
113
+ if (!entry) {
114
+ return null;
115
+ }
116
+ if (entry.stale === true) {
117
+ return null;
118
+ }
119
+ if (entry.expiresAt != null && entry.expiresAt <= Date.now()) {
120
+ invalidateEntry(state, cacheKey, 'expired');
121
+ return null;
122
+ }
123
+ entry.updatedAt = Date.now();
124
+ updateMetadataEntry(state, entry);
125
+ return entry;
126
+ }
127
+ export function registerSettingsSubscriptions(state, settingsService, providerId, logger) {
128
+ if (state.settingsService === settingsService) {
129
+ return;
130
+ }
131
+ for (const unsubscribe of state.settingsSubscriptions) {
132
+ try {
133
+ unsubscribe();
134
+ }
135
+ catch (error) {
136
+ if (process.env.DEBUG && logger) {
137
+ logger.debug('Failed to remove runtime auth scope subscription:', error);
138
+ }
139
+ }
140
+ }
141
+ state.settingsSubscriptions = [];
142
+ state.settingsService = settingsService;
143
+ const handleProviderChange = (...args) => {
144
+ const [event] = args;
145
+ const payload = (event ?? {});
146
+ if (payload.provider === providerId) {
147
+ invalidateMatchingEntries(state, (entry) => entry.providerId === providerId, 'provider-change');
148
+ }
149
+ };
150
+ settingsService.on('provider-change', handleProviderChange);
151
+ state.settingsSubscriptions.push(() => settingsService.off('provider-change', handleProviderChange));
152
+ const handleProfileChange = (...args) => {
153
+ const [event] = args;
154
+ const payload = (event ?? {});
155
+ if (payload.key === 'currentProfile') {
156
+ invalidateMatchingEntries(state, () => true, 'profile-change');
157
+ }
158
+ };
159
+ settingsService.on('change', handleProfileChange);
160
+ state.settingsSubscriptions.push(() => settingsService.off('change', handleProfileChange));
161
+ const handleCleared = (..._args) => {
162
+ invalidateMatchingEntries(state, () => true, 'settings-cleared');
163
+ };
164
+ settingsService.on('cleared', handleCleared);
165
+ state.settingsSubscriptions.push(() => settingsService.off('cleared', handleCleared));
166
+ }
167
+ export function invalidateMatchingEntries(state, predicate, reason) {
168
+ const summaries = [];
169
+ for (const entry of [...state.entries.values()]) {
170
+ if (predicate(entry)) {
171
+ summaries.push(invalidateEntry(state, entry.key, reason));
172
+ }
173
+ }
174
+ return summaries;
175
+ }
176
+ export function storeRuntimeScopedToken(state, providerId, profileId, token, oauthToken) {
177
+ const cacheKey = buildCacheKey(state.runtimeAuthScopeId, providerId, profileId);
178
+ const expiresAt = normalizeExpiry(oauthToken?.expiry ?? null);
179
+ const now = Date.now();
180
+ let entry = state.entries.get(cacheKey);
181
+ if (!entry) {
182
+ entry = {
183
+ key: cacheKey,
184
+ providerId,
185
+ profileId,
186
+ runtimeAuthScopeId: state.runtimeAuthScopeId,
187
+ token,
188
+ createdAt: now,
189
+ updatedAt: now,
190
+ expiresAt,
191
+ stale: false,
192
+ };
193
+ state.entries.set(cacheKey, entry);
194
+ }
195
+ else {
196
+ entry.token = token;
197
+ entry.updatedAt = now;
198
+ entry.expiresAt = expiresAt;
199
+ entry.stale = false;
200
+ }
201
+ if (entry.cancellationHook) {
202
+ state.metadata.cancellationHooks = state.metadata.cancellationHooks.filter((hook) => hook !== entry.cancellationHook);
203
+ }
204
+ const cancellationHook = () => {
205
+ invalidateEntry(state, cacheKey, 'cancellation-hook');
206
+ };
207
+ entry.cancellationHook = cancellationHook;
208
+ state.metadata.cancellationHooks.push(cancellationHook);
209
+ updateMetadataEntry(state, entry, toPublicEntry(entry));
210
+ }
211
+ export function invalidateEntry(state, cacheKey, reason) {
212
+ const entry = state.entries.get(cacheKey);
213
+ if (!entry) {
214
+ const summary = {
215
+ key: cacheKey,
216
+ providerId: 'unknown',
217
+ profileId: 'default',
218
+ runtimeAuthScopeId: state.runtimeAuthScopeId,
219
+ preview: '[revoked]',
220
+ createdAt: Date.now(),
221
+ expiresAt: undefined,
222
+ stale: true,
223
+ reason,
224
+ };
225
+ state.metadata.revokedTokens.push(summary);
226
+ state.metadata.metrics.lastUpdated = Date.now();
227
+ return summary;
228
+ }
229
+ entry.stale = true;
230
+ entry.updatedAt = Date.now();
231
+ const summary = toPublicEntry(entry, { stale: true, reason });
232
+ state.entries.delete(cacheKey);
233
+ updateMetadataEntry(state, entry, summary);
234
+ if (entry.cancellationHook) {
235
+ state.metadata.cancellationHooks = state.metadata.cancellationHooks.filter((hook) => hook !== entry.cancellationHook);
236
+ }
237
+ state.metadata.revokedTokens.push(summary);
238
+ state.metadata.metrics.lastUpdated = Date.now();
239
+ entry.token = '';
240
+ entry.expiresAt = undefined;
241
+ entry.cancellationHook = undefined;
242
+ return summary;
243
+ }
244
+ /**
245
+ * Flush scoped credentials for a runtime and return revocation metadata.
246
+ * @plan PLAN-20251018-STATELESSPROVIDER2.P18, PLAN-20260608-ISSUE1586.P09
247
+ * @requirement REQ-SP2-004, REQ-API-001.4
248
+ */
249
+ export function flushRuntimeAuthScope(runtimeId) {
250
+ const state = runtimeScopedStates.get(runtimeId);
251
+ if (!state) {
252
+ return { runtimeId, revokedTokens: [] };
253
+ }
254
+ const revokedTokens = [];
255
+ for (const key of [...state.entries.keys()]) {
256
+ revokedTokens.push(invalidateEntry(state, key, 'runtime-dispose'));
257
+ }
258
+ for (const unsubscribe of state.settingsSubscriptions) {
259
+ try {
260
+ unsubscribe();
261
+ }
262
+ catch {
263
+ // Best-effort cleanup
264
+ }
265
+ }
266
+ state.settingsSubscriptions = [];
267
+ state.settingsService = undefined;
268
+ state.metadata.cancellationHooks = [];
269
+ state.metadata.cacheEntries = state.metadata.cacheEntries.map((entry) => ({
270
+ ...entry,
271
+ stale: true,
272
+ }));
273
+ state.metadata.metrics.lastUpdated = Date.now();
274
+ runtimeScopedStates.delete(runtimeId);
275
+ return { runtimeId, revokedTokens };
276
+ }
277
+ export { AuthPrecedenceResolver } from './auth-precedence-resolver.js';
278
+ //# sourceMappingURL=precedence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"precedence.js","sourceRoot":"","sources":["../../src/precedence.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Vybestack LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ /**
7
+ * Length-prefixed framing protocol for credential proxy IPC.
8
+ *
9
+ * @plan PLAN-20250214-CREDPROXY.P03
10
+ * @requirement R5.1, R5.2, R5.3
11
+ * @pseudocode analysis/pseudocode/001-framing-protocol.md
12
+ */
13
+ export declare const MAX_FRAME_SIZE = 65536;
14
+ export declare const PARTIAL_FRAME_TIMEOUT_MS = 5000;
15
+ export declare class FrameError extends Error {
16
+ constructor(message: string);
17
+ }
18
+ export declare function encodeFrame(payload: Record<string, unknown>): Buffer;
19
+ export interface FrameDecoderOptions {
20
+ /**
21
+ * Called when a partial frame times out. The buffer is reset after this
22
+ * callback returns. Use this to close the connection or log the error.
23
+ */
24
+ onPartialFrameTimeout?: () => void;
25
+ }
26
+ export declare class FrameDecoder {
27
+ private buffer;
28
+ private partialFrameTimer;
29
+ private readonly onPartialFrameTimeout?;
30
+ constructor(options?: FrameDecoderOptions);
31
+ feed(chunk: Buffer): Array<Record<string, unknown>>;
32
+ reset(): void;
33
+ private startPartialFrameTimer;
34
+ private cancelPartialFrameTimer;
35
+ }
@@ -0,0 +1,86 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Vybestack LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ /**
7
+ * Length-prefixed framing protocol for credential proxy IPC.
8
+ *
9
+ * @plan PLAN-20250214-CREDPROXY.P03
10
+ * @requirement R5.1, R5.2, R5.3
11
+ * @pseudocode analysis/pseudocode/001-framing-protocol.md
12
+ */
13
+ // ─── Constants ───────────────────────────────────────────────────────────────
14
+ export const MAX_FRAME_SIZE = 65536;
15
+ export const PARTIAL_FRAME_TIMEOUT_MS = 5000;
16
+ // ─── Errors ──────────────────────────────────────────────────────────────────
17
+ export class FrameError extends Error {
18
+ constructor(message) {
19
+ super(message);
20
+ }
21
+ }
22
+ // ─── Functions ───────────────────────────────────────────────────────────────
23
+ export function encodeFrame(payload) {
24
+ const json = JSON.stringify(payload);
25
+ const jsonBytes = Buffer.from(json, 'utf8');
26
+ if (jsonBytes.length > MAX_FRAME_SIZE) {
27
+ throw new FrameError('Frame exceeds maximum size');
28
+ }
29
+ const header = Buffer.alloc(4);
30
+ header.writeUInt32BE(jsonBytes.length, 0);
31
+ return Buffer.concat([header, jsonBytes]);
32
+ }
33
+ export class FrameDecoder {
34
+ buffer = Buffer.alloc(0);
35
+ partialFrameTimer = null;
36
+ onPartialFrameTimeout;
37
+ constructor(options = {}) {
38
+ this.onPartialFrameTimeout = options.onPartialFrameTimeout;
39
+ }
40
+ feed(chunk) {
41
+ this.buffer = Buffer.concat([this.buffer, chunk]);
42
+ const frames = [];
43
+ while (this.buffer.length >= 4) {
44
+ const payloadLength = this.buffer.readUInt32BE(0);
45
+ if (payloadLength > MAX_FRAME_SIZE) {
46
+ throw new FrameError('Frame exceeds maximum size');
47
+ }
48
+ if (this.buffer.length < 4 + payloadLength) {
49
+ this.startPartialFrameTimer();
50
+ break;
51
+ }
52
+ this.cancelPartialFrameTimer();
53
+ const jsonBytes = this.buffer.subarray(4, 4 + payloadLength);
54
+ this.buffer = this.buffer.subarray(4 + payloadLength);
55
+ let parsed;
56
+ try {
57
+ parsed = JSON.parse(jsonBytes.toString('utf8'));
58
+ }
59
+ catch (e) {
60
+ throw new FrameError(`Invalid JSON in frame: ${e.message}`);
61
+ }
62
+ frames.push(parsed);
63
+ }
64
+ return frames;
65
+ }
66
+ reset() {
67
+ this.buffer = Buffer.alloc(0);
68
+ this.cancelPartialFrameTimer();
69
+ }
70
+ startPartialFrameTimer() {
71
+ if (this.partialFrameTimer !== null)
72
+ return;
73
+ this.partialFrameTimer = setTimeout(() => {
74
+ this.partialFrameTimer = null;
75
+ this.onPartialFrameTimeout?.();
76
+ this.buffer = Buffer.alloc(0);
77
+ }, PARTIAL_FRAME_TIMEOUT_MS);
78
+ }
79
+ cancelPartialFrameTimer() {
80
+ if (this.partialFrameTimer !== null) {
81
+ clearTimeout(this.partialFrameTimer);
82
+ this.partialFrameTimer = null;
83
+ }
84
+ }
85
+ }
86
+ //# sourceMappingURL=framing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"framing.js","sourceRoot":"","sources":["../../../src/proxy/framing.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Vybestack LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ /**
7
+ * Read-only provider key storage that proxies read operations through
8
+ * the credential proxy Unix socket. Write operations are blocked.
9
+ *
10
+ * @plan PLAN-20250214-CREDPROXY.P12
11
+ * @requirement R9
12
+ * @pseudocode analysis/pseudocode/004-proxy-provider-key-storage.md
13
+ */
14
+ import type { ProxySocketClient } from './proxy-socket-client.js';
15
+ export declare class ProxyProviderKeyStorage {
16
+ private readonly client;
17
+ constructor(client: ProxySocketClient);
18
+ getKey(name: string): Promise<string | null>;
19
+ listKeys(): Promise<string[]>;
20
+ hasKey(name: string): Promise<boolean>;
21
+ saveKey(_name: string, _apiKey: string): Promise<void>;
22
+ deleteKey(_name: string): Promise<boolean>;
23
+ }
@@ -0,0 +1,41 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Vybestack LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ export class ProxyProviderKeyStorage {
7
+ client;
8
+ constructor(client) {
9
+ this.client = client;
10
+ }
11
+ async getKey(name) {
12
+ const response = await this.client.request('get_api_key', { name });
13
+ if (!response.ok) {
14
+ if (response.code === 'NOT_FOUND')
15
+ return null;
16
+ throw new Error(response.error ?? 'proxy error');
17
+ }
18
+ return response.data.key;
19
+ }
20
+ async listKeys() {
21
+ const response = await this.client.request('list_api_keys', {});
22
+ if (!response.ok) {
23
+ throw new Error(response.error ?? 'proxy error');
24
+ }
25
+ return response.data.keys;
26
+ }
27
+ async hasKey(name) {
28
+ const response = await this.client.request('has_api_key', { name });
29
+ if (!response.ok) {
30
+ throw new Error(response.error ?? 'proxy error');
31
+ }
32
+ return response.data.exists;
33
+ }
34
+ async saveKey(_name, _apiKey) {
35
+ throw new Error('API key management is not available in sandbox mode');
36
+ }
37
+ async deleteKey(_name) {
38
+ throw new Error('API key management is not available in sandbox mode');
39
+ }
40
+ }
41
+ //# sourceMappingURL=proxy-provider-key-storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proxy-provider-key-storage.js","sourceRoot":"","sources":["../../../src/proxy/proxy-provider-key-storage.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAaH,MAAM,OAAO,uBAAuB;IACjB,MAAM,CAAoB;IAE3C,YAAY,MAAyB;QACnC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,IAAY;QACvB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QACpE,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,IAAI,QAAQ,CAAC,IAAI,KAAK,WAAW;gBAAE,OAAO,IAAI,CAAC;YAC/C,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,IAAI,aAAa,CAAC,CAAC;QACnD,CAAC;QACD,OAAO,QAAQ,CAAC,IAAK,CAAC,GAAa,CAAC;IACtC,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC;QAChE,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,IAAI,aAAa,CAAC,CAAC;QACnD,CAAC;QACD,OAAO,QAAQ,CAAC,IAAK,CAAC,IAAgB,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,IAAY;QACvB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QACpE,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,IAAI,aAAa,CAAC,CAAC;QACnD,CAAC;QACD,OAAO,QAAQ,CAAC,IAAK,CAAC,MAAiB,CAAC;IAC1C,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,KAAa,EAAE,OAAe;QAC1C,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;IACzE,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,KAAa;QAC3B,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;IACzE,CAAC;CACF"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Vybestack LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ export declare const REQUEST_TIMEOUT_MS = 30000;
7
+ export declare const IDLE_TIMEOUT_MS = 300000;
8
+ export declare const PROTOCOL_VERSION = 1;
9
+ export type ProxyResponse = {
10
+ ok: boolean;
11
+ data?: Record<string, unknown>;
12
+ error?: string;
13
+ code?: string;
14
+ retryAfter?: number;
15
+ };
16
+ export declare class ProxySocketClient {
17
+ private readonly socketPath;
18
+ private socket;
19
+ private decoder;
20
+ private pendingRequests;
21
+ private handshakeComplete;
22
+ private idleTimer;
23
+ private connectingPromise;
24
+ private handshakeResolver;
25
+ constructor(socketPath: string);
26
+ ensureConnected(): Promise<void>;
27
+ private isConnected;
28
+ request(op: string, payload: Record<string, unknown>): Promise<ProxyResponse>;
29
+ private sendRequest;
30
+ close(): void;
31
+ gracefulClose(): void;
32
+ private connectAndHandshake;
33
+ private connect;
34
+ private handshake;
35
+ private onData;
36
+ private resolvePendingRequest;
37
+ private onError;
38
+ private onClose;
39
+ private handlePartialFrameTimeout;
40
+ private destroy;
41
+ private resetIdleTimer;
42
+ private cancelIdleTimer;
43
+ }