@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.
- package/dist/.last_build +0 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/src/auth-precedence-resolver.d.ts +147 -0
- package/dist/src/auth-precedence-resolver.js +542 -0
- package/dist/src/auth-precedence-resolver.js.map +1 -0
- package/dist/src/flows/anthropic-device-flow.d.ts +57 -0
- package/dist/src/flows/anthropic-device-flow.js +231 -0
- package/dist/src/flows/anthropic-device-flow.js.map +1 -0
- package/dist/src/flows/codex-device-flow.d.ts +114 -0
- package/dist/src/flows/codex-device-flow.js +437 -0
- package/dist/src/flows/codex-device-flow.js.map +1 -0
- package/dist/src/flows/qwen-device-flow.d.ts +45 -0
- package/dist/src/flows/qwen-device-flow.js +183 -0
- package/dist/src/flows/qwen-device-flow.js.map +1 -0
- package/dist/src/index.d.ts +34 -0
- package/dist/src/index.js +26 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/interfaces/debug-logger.d.ts +31 -0
- package/dist/src/interfaces/debug-logger.js +6 -0
- package/dist/src/interfaces/debug-logger.js.map +1 -0
- package/dist/src/interfaces/index.d.ts +18 -0
- package/dist/src/interfaces/index.js +10 -0
- package/dist/src/interfaces/index.js.map +1 -0
- package/dist/src/interfaces/provider-key-storage.d.ts +26 -0
- package/dist/src/interfaces/provider-key-storage.js +6 -0
- package/dist/src/interfaces/provider-key-storage.js.map +1 -0
- package/dist/src/interfaces/runtime-context.d.ts +37 -0
- package/dist/src/interfaces/runtime-context.js +6 -0
- package/dist/src/interfaces/runtime-context.js.map +1 -0
- package/dist/src/interfaces/secure-store.d.ts +47 -0
- package/dist/src/interfaces/secure-store.js +6 -0
- package/dist/src/interfaces/secure-store.js.map +1 -0
- package/dist/src/interfaces/settings-service.d.ts +25 -0
- package/dist/src/interfaces/settings-service.js +6 -0
- package/dist/src/interfaces/settings-service.js.map +1 -0
- package/dist/src/keyring-token-store.d.ts +96 -0
- package/dist/src/keyring-token-store.js +391 -0
- package/dist/src/keyring-token-store.js.map +1 -0
- package/dist/src/oauth-errors.d.ts +173 -0
- package/dist/src/oauth-errors.js +465 -0
- package/dist/src/oauth-errors.js.map +1 -0
- package/dist/src/precedence.d.ts +115 -0
- package/dist/src/precedence.js +278 -0
- package/dist/src/precedence.js.map +1 -0
- package/dist/src/proxy/framing.d.ts +35 -0
- package/dist/src/proxy/framing.js +86 -0
- package/dist/src/proxy/framing.js.map +1 -0
- package/dist/src/proxy/proxy-provider-key-storage.d.ts +23 -0
- package/dist/src/proxy/proxy-provider-key-storage.js +41 -0
- package/dist/src/proxy/proxy-provider-key-storage.js.map +1 -0
- package/dist/src/proxy/proxy-socket-client.d.ts +43 -0
- package/dist/src/proxy/proxy-socket-client.js +219 -0
- package/dist/src/proxy/proxy-socket-client.js.map +1 -0
- package/dist/src/proxy/proxy-token-store.d.ts +39 -0
- package/dist/src/proxy/proxy-token-store.js +87 -0
- package/dist/src/proxy/proxy-token-store.js.map +1 -0
- package/dist/src/token-merge.d.ts +16 -0
- package/dist/src/token-merge.js +13 -0
- package/dist/src/token-merge.js.map +1 -0
- package/dist/src/token-sanitization.d.ts +16 -0
- package/dist/src/token-sanitization.js +10 -0
- package/dist/src/token-sanitization.js.map +1 -0
- package/dist/src/token-store.d.ts +93 -0
- package/dist/src/token-store.js +7 -0
- package/dist/src/token-store.js.map +1 -0
- package/dist/src/types.d.ts +204 -0
- package/dist/src/types.js +86 -0
- package/dist/src/types.js.map +1 -0
- 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
|
+
}
|