@sentropic/llm-mesh 0.11.0 → 0.13.0
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/auth.d.ts +8 -2
- package/dist/auth.d.ts.map +1 -1
- package/dist/auth.js +14 -0
- package/dist/auth.js.map +1 -1
- package/dist/catalog.d.ts +14 -0
- package/dist/catalog.d.ts.map +1 -1
- package/dist/catalog.js +11 -0
- package/dist/catalog.js.map +1 -1
- package/dist/enrollment/claude-code.d.ts +9 -0
- package/dist/enrollment/claude-code.d.ts.map +1 -0
- package/dist/enrollment/claude-code.js +18 -0
- package/dist/enrollment/claude-code.js.map +1 -0
- package/dist/enrollment/cloud-code.d.ts +32 -0
- package/dist/enrollment/cloud-code.d.ts.map +1 -0
- package/dist/enrollment/cloud-code.js +232 -0
- package/dist/enrollment/cloud-code.js.map +1 -0
- package/dist/enrollment/codex.d.ts +33 -0
- package/dist/enrollment/codex.d.ts.map +1 -0
- package/dist/enrollment/codex.js +222 -0
- package/dist/enrollment/codex.js.map +1 -0
- package/dist/enrollment/contracts.d.ts +77 -0
- package/dist/enrollment/contracts.d.ts.map +1 -0
- package/dist/enrollment/contracts.js +3 -0
- package/dist/enrollment/contracts.js.map +1 -0
- package/dist/enrollment/index.d.ts +2 -0
- package/dist/enrollment/index.d.ts.map +1 -0
- package/dist/enrollment/index.js +3 -0
- package/dist/enrollment/index.js.map +1 -0
- package/dist/enrollment/pkce.d.ts +18 -0
- package/dist/enrollment/pkce.d.ts.map +1 -0
- package/dist/enrollment/pkce.js +104 -0
- package/dist/enrollment/pkce.js.map +1 -0
- package/dist/generation.d.ts +7 -1
- package/dist/generation.d.ts.map +1 -1
- package/dist/node/index.d.ts +6 -0
- package/dist/node/index.d.ts.map +1 -0
- package/dist/node/index.js +5 -0
- package/dist/node/index.js.map +1 -0
- package/dist/node/keyring/env-keyring.d.ts +11 -0
- package/dist/node/keyring/env-keyring.d.ts.map +1 -0
- package/dist/node/keyring/env-keyring.js +26 -0
- package/dist/node/keyring/env-keyring.js.map +1 -0
- package/dist/node/keyring/in-memory-keyring.d.ts +8 -0
- package/dist/node/keyring/in-memory-keyring.d.ts.map +1 -0
- package/dist/node/keyring/in-memory-keyring.js +13 -0
- package/dist/node/keyring/in-memory-keyring.js.map +1 -0
- package/dist/node/keyring/linux-secretstore-keyring.d.ts +10 -0
- package/dist/node/keyring/linux-secretstore-keyring.d.ts.map +1 -0
- package/dist/node/keyring/linux-secretstore-keyring.js +17 -0
- package/dist/node/keyring/linux-secretstore-keyring.js.map +1 -0
- package/dist/node/keyring/macos-keychain-keyring.d.ts +10 -0
- package/dist/node/keyring/macos-keychain-keyring.d.ts.map +1 -0
- package/dist/node/keyring/macos-keychain-keyring.js +17 -0
- package/dist/node/keyring/macos-keychain-keyring.js.map +1 -0
- package/dist/providers.d.ts +3 -3
- package/dist/providers.d.ts.map +1 -1
- package/dist/providers.js +2 -1
- package/dist/providers.js.map +1 -1
- package/dist/service/facade.d.ts +52 -0
- package/dist/service/facade.d.ts.map +1 -0
- package/dist/service/facade.js +51 -0
- package/dist/service/facade.js.map +1 -0
- package/dist/service/local-account-transport-service.d.ts +31 -0
- package/dist/service/local-account-transport-service.d.ts.map +1 -0
- package/dist/service/local-account-transport-service.js +181 -0
- package/dist/service/local-account-transport-service.js.map +1 -0
- package/dist/transport/cloud-code-transport.d.ts +26 -0
- package/dist/transport/cloud-code-transport.d.ts.map +1 -0
- package/dist/transport/cloud-code-transport.js +213 -0
- package/dist/transport/cloud-code-transport.js.map +1 -0
- package/package.json +18 -1
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
export const CODEX_AUTH_ISSUER = 'https://auth.openai.com';
|
|
2
|
+
export const CODEX_CLIENT_ID = 'app_EMoamEEZ73f0CkXaXp7hrann';
|
|
3
|
+
export const CODEX_DEVICE_AUTH_URL = `${CODEX_AUTH_ISSUER}/api/accounts/deviceauth/usercode`;
|
|
4
|
+
export const CODEX_DEVICE_TOKEN_URL = `${CODEX_AUTH_ISSUER}/api/accounts/deviceauth/token`;
|
|
5
|
+
export const CODEX_OAUTH_TOKEN_URL = `${CODEX_AUTH_ISSUER}/oauth/token`;
|
|
6
|
+
export const CODEX_VERIFICATION_URL = `${CODEX_AUTH_ISSUER}/codex/device`;
|
|
7
|
+
export class CodexEnrollmentProvider {
|
|
8
|
+
defaultClientId;
|
|
9
|
+
configResolver;
|
|
10
|
+
fetchFn;
|
|
11
|
+
sessions = new Map();
|
|
12
|
+
sequence = 0;
|
|
13
|
+
constructor(options = {}) {
|
|
14
|
+
this.defaultClientId = options.clientId ?? CODEX_CLIENT_ID;
|
|
15
|
+
this.configResolver = options.configResolver;
|
|
16
|
+
this.fetchFn = options.fetchFn ?? fetch;
|
|
17
|
+
}
|
|
18
|
+
async getClientId(configRef) {
|
|
19
|
+
if (this.configResolver && configRef) {
|
|
20
|
+
try {
|
|
21
|
+
const config = await this.configResolver.resolveConfig(configRef);
|
|
22
|
+
if (typeof config.clientId === 'string')
|
|
23
|
+
return config.clientId;
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
// Fallback
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return this.defaultClientId;
|
|
30
|
+
}
|
|
31
|
+
async start(input) {
|
|
32
|
+
this.sequence += 1;
|
|
33
|
+
const enrollmentId = `enr_codex_${Date.now().toString(36)}_${this.sequence.toString(36)}`;
|
|
34
|
+
const expiresAt = new Date(Date.now() + 15 * 60 * 1000).toISOString();
|
|
35
|
+
const clientId = await this.getClientId(input.configRef);
|
|
36
|
+
const response = await this.fetchFn(CODEX_DEVICE_AUTH_URL, {
|
|
37
|
+
method: 'POST',
|
|
38
|
+
headers: {
|
|
39
|
+
'content-type': 'application/json',
|
|
40
|
+
accept: 'application/json',
|
|
41
|
+
},
|
|
42
|
+
body: JSON.stringify({ client_id: clientId }),
|
|
43
|
+
});
|
|
44
|
+
if (!response.ok) {
|
|
45
|
+
const text = await response.text().catch(() => '');
|
|
46
|
+
throw new Error(`Codex device auth start failed (${response.status}): ${text}`);
|
|
47
|
+
}
|
|
48
|
+
const payload = (await response.json());
|
|
49
|
+
if (!payload.device_auth_id || !payload.user_code) {
|
|
50
|
+
throw new Error('Codex device auth returned incomplete response');
|
|
51
|
+
}
|
|
52
|
+
const pollIntervalMs = typeof payload.interval === 'number'
|
|
53
|
+
? payload.interval * 1000
|
|
54
|
+
: 5000;
|
|
55
|
+
const state = {
|
|
56
|
+
enrollmentId,
|
|
57
|
+
providerId: 'codex',
|
|
58
|
+
ownerScope: input.ownerScope,
|
|
59
|
+
pkceVerifier: '',
|
|
60
|
+
pkceState: '',
|
|
61
|
+
redirectUri: input.redirectUri,
|
|
62
|
+
configVersion: 'v1.0.0',
|
|
63
|
+
createdAt: new Date().toISOString(),
|
|
64
|
+
expiresAt,
|
|
65
|
+
};
|
|
66
|
+
this.sessions.set(enrollmentId, {
|
|
67
|
+
state,
|
|
68
|
+
deviceAuthId: payload.device_auth_id,
|
|
69
|
+
userCode: payload.user_code,
|
|
70
|
+
pollIntervalMs,
|
|
71
|
+
});
|
|
72
|
+
return {
|
|
73
|
+
kind: 'device-code',
|
|
74
|
+
enrollmentId,
|
|
75
|
+
verificationUrl: CODEX_VERIFICATION_URL,
|
|
76
|
+
userCode: payload.user_code,
|
|
77
|
+
pollIntervalMs,
|
|
78
|
+
expiresAt,
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
async pollForCompletion(enrollmentId, maxAttempts = 60) {
|
|
82
|
+
const entry = this.sessions.get(enrollmentId);
|
|
83
|
+
if (!entry) {
|
|
84
|
+
throw new Error(`Enrollment session ${enrollmentId} not found`);
|
|
85
|
+
}
|
|
86
|
+
const clientId = await this.getClientId();
|
|
87
|
+
for (let attempt = 0; attempt < maxAttempts; attempt += 1) {
|
|
88
|
+
if (entry.state.cancelledAt) {
|
|
89
|
+
throw new Error(`Enrollment session ${enrollmentId} was cancelled`);
|
|
90
|
+
}
|
|
91
|
+
const response = await this.fetchFn(CODEX_DEVICE_TOKEN_URL, {
|
|
92
|
+
method: 'POST',
|
|
93
|
+
headers: {
|
|
94
|
+
'content-type': 'application/json',
|
|
95
|
+
accept: 'application/json',
|
|
96
|
+
},
|
|
97
|
+
body: JSON.stringify({
|
|
98
|
+
device_auth_id: entry.deviceAuthId,
|
|
99
|
+
user_code: entry.userCode,
|
|
100
|
+
}),
|
|
101
|
+
});
|
|
102
|
+
if (response.status === 403) {
|
|
103
|
+
// P0-3: Wait for pollIntervalMs without hardcoded 50ms cap
|
|
104
|
+
await new Promise((res) => setTimeout(res, entry.pollIntervalMs));
|
|
105
|
+
continue;
|
|
106
|
+
}
|
|
107
|
+
if (!response.ok) {
|
|
108
|
+
const text = await response.text().catch(() => '');
|
|
109
|
+
throw new Error(`Codex device poll failed (${response.status}): ${text}`);
|
|
110
|
+
}
|
|
111
|
+
const tokenPayload = (await response.json());
|
|
112
|
+
if (!tokenPayload.authorization_code || !tokenPayload.code_verifier) {
|
|
113
|
+
throw new Error('Codex device poll returned incomplete exchange payload');
|
|
114
|
+
}
|
|
115
|
+
// Exchange authorization code
|
|
116
|
+
const exchangeBody = new URLSearchParams({
|
|
117
|
+
grant_type: 'authorization_code',
|
|
118
|
+
code: tokenPayload.authorization_code,
|
|
119
|
+
redirect_uri: `${CODEX_AUTH_ISSUER}/deviceauth/callback`,
|
|
120
|
+
client_id: clientId,
|
|
121
|
+
code_verifier: tokenPayload.code_verifier,
|
|
122
|
+
});
|
|
123
|
+
const exchangeResponse = await this.fetchFn(CODEX_OAUTH_TOKEN_URL, {
|
|
124
|
+
method: 'POST',
|
|
125
|
+
headers: {
|
|
126
|
+
'content-type': 'application/x-www-form-urlencoded',
|
|
127
|
+
accept: 'application/json',
|
|
128
|
+
},
|
|
129
|
+
body: exchangeBody,
|
|
130
|
+
});
|
|
131
|
+
if (!exchangeResponse.ok) {
|
|
132
|
+
const text = await exchangeResponse.text().catch(() => '');
|
|
133
|
+
throw new Error(`Codex OAuth token exchange failed (${exchangeResponse.status}): ${text}`);
|
|
134
|
+
}
|
|
135
|
+
const credPayload = (await exchangeResponse.json());
|
|
136
|
+
if (!credPayload.access_token) {
|
|
137
|
+
throw new Error('Codex token exchange returned no access token');
|
|
138
|
+
}
|
|
139
|
+
const accountId = `acct_codex_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`;
|
|
140
|
+
const expiresAt = new Date(Date.now() + (credPayload.expires_in ?? 3600) * 1000).toISOString();
|
|
141
|
+
// P0-4: Store credentials so they are preserved and persisted
|
|
142
|
+
const credential = {
|
|
143
|
+
accountId,
|
|
144
|
+
accessToken: credPayload.access_token,
|
|
145
|
+
...(credPayload.refresh_token ? { refreshToken: credPayload.refresh_token } : {}),
|
|
146
|
+
expiresAt,
|
|
147
|
+
authClientConfigVersion: entry.state.configVersion,
|
|
148
|
+
};
|
|
149
|
+
entry.credential = credential;
|
|
150
|
+
return {
|
|
151
|
+
accountId,
|
|
152
|
+
label: `Codex Account (${accountId.slice(0, 16)})`,
|
|
153
|
+
credential,
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
throw new Error('Codex device enrollment polling timed out');
|
|
157
|
+
}
|
|
158
|
+
async complete(input) {
|
|
159
|
+
const entry = this.sessions.get(input.enrollmentId);
|
|
160
|
+
if (!entry) {
|
|
161
|
+
throw new Error(`Enrollment session ${input.enrollmentId} not found`);
|
|
162
|
+
}
|
|
163
|
+
if (entry.credential) {
|
|
164
|
+
return entry.credential;
|
|
165
|
+
}
|
|
166
|
+
const accountId = `acct_codex_${Date.now().toString(36)}`;
|
|
167
|
+
return {
|
|
168
|
+
accountId,
|
|
169
|
+
accessToken: `token_${input.code}`,
|
|
170
|
+
expiresAt: new Date(Date.now() + 3600 * 1000).toISOString(),
|
|
171
|
+
authClientConfigVersion: entry.state.configVersion,
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
async resolve(credential) {
|
|
175
|
+
return {
|
|
176
|
+
provider: 'codex',
|
|
177
|
+
accountId: credential.accountId,
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
async refresh(input) {
|
|
181
|
+
const refreshToken = input.refreshToken ?? input.credentialVersion;
|
|
182
|
+
if (!refreshToken || refreshToken === 'v1.0.0') {
|
|
183
|
+
throw new Error('Codex token refresh failed: invalid or missing refresh token');
|
|
184
|
+
}
|
|
185
|
+
const clientId = await this.getClientId();
|
|
186
|
+
const body = new URLSearchParams({
|
|
187
|
+
grant_type: 'refresh_token',
|
|
188
|
+
refresh_token: refreshToken,
|
|
189
|
+
client_id: clientId,
|
|
190
|
+
});
|
|
191
|
+
const response = await this.fetchFn(CODEX_OAUTH_TOKEN_URL, {
|
|
192
|
+
method: 'POST',
|
|
193
|
+
headers: {
|
|
194
|
+
'content-type': 'application/x-www-form-urlencoded',
|
|
195
|
+
accept: 'application/json',
|
|
196
|
+
},
|
|
197
|
+
body,
|
|
198
|
+
});
|
|
199
|
+
if (!response.ok) {
|
|
200
|
+
const text = await response.text().catch(() => '');
|
|
201
|
+
throw new Error(`Codex token refresh failed (${response.status}): ${text}`);
|
|
202
|
+
}
|
|
203
|
+
const payload = (await response.json());
|
|
204
|
+
if (!payload.access_token) {
|
|
205
|
+
throw new Error('Codex token refresh returned no access token');
|
|
206
|
+
}
|
|
207
|
+
return {
|
|
208
|
+
accountId: input.accountId,
|
|
209
|
+
accessToken: payload.access_token,
|
|
210
|
+
...(payload.refresh_token ? { refreshToken: payload.refresh_token } : { refreshToken }),
|
|
211
|
+
expiresAt: new Date(Date.now() + (payload.expires_in ?? 3600) * 1000).toISOString(),
|
|
212
|
+
authClientConfigVersion: 'v1.0.0',
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
async cancel(enrollmentId) {
|
|
216
|
+
const entry = this.sessions.get(enrollmentId);
|
|
217
|
+
if (entry) {
|
|
218
|
+
entry.state.cancelledAt = new Date().toISOString();
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
//# sourceMappingURL=codex.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex.js","sourceRoot":"","sources":["../../src/enrollment/codex.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
export type EnrollmentSession = {
|
|
2
|
+
kind: 'authorization-url';
|
|
3
|
+
enrollmentId: string;
|
|
4
|
+
url: string;
|
|
5
|
+
expiresAt: string;
|
|
6
|
+
} | {
|
|
7
|
+
kind: 'device-code';
|
|
8
|
+
enrollmentId: string;
|
|
9
|
+
verificationUrl: string;
|
|
10
|
+
userCode: string;
|
|
11
|
+
pollIntervalMs: number;
|
|
12
|
+
expiresAt: string;
|
|
13
|
+
};
|
|
14
|
+
export interface EnrollmentState {
|
|
15
|
+
enrollmentId: string;
|
|
16
|
+
providerId: 'cloud-code' | 'codex' | 'claude-code';
|
|
17
|
+
ownerScope: string;
|
|
18
|
+
pkceVerifier: string;
|
|
19
|
+
pkceState: string;
|
|
20
|
+
redirectUri: string;
|
|
21
|
+
configVersion: string;
|
|
22
|
+
createdAt: string;
|
|
23
|
+
expiresAt: string;
|
|
24
|
+
consumedAt?: string;
|
|
25
|
+
cancelledAt?: string;
|
|
26
|
+
}
|
|
27
|
+
export interface StartEnrollmentInput {
|
|
28
|
+
configRef: string;
|
|
29
|
+
mode: 'cli' | 'portal';
|
|
30
|
+
redirectUri: string;
|
|
31
|
+
ownerScope: string;
|
|
32
|
+
}
|
|
33
|
+
export interface CompleteEnrollmentInput {
|
|
34
|
+
enrollmentId: string;
|
|
35
|
+
code: string;
|
|
36
|
+
}
|
|
37
|
+
export interface PreparedCredential {
|
|
38
|
+
accountId: string;
|
|
39
|
+
accessToken: string;
|
|
40
|
+
refreshToken?: string;
|
|
41
|
+
expiresAt: string;
|
|
42
|
+
authClientConfigVersion: string;
|
|
43
|
+
accountEmail?: string;
|
|
44
|
+
}
|
|
45
|
+
export interface RefreshInput {
|
|
46
|
+
accountId: string;
|
|
47
|
+
refreshToken?: string;
|
|
48
|
+
credentialVersion: string;
|
|
49
|
+
}
|
|
50
|
+
export interface ResolvedProviderMetadata {
|
|
51
|
+
cloudaicompanionProject?: string;
|
|
52
|
+
cloudCodeUserAgentVersion?: string;
|
|
53
|
+
[key: string]: unknown;
|
|
54
|
+
}
|
|
55
|
+
export interface AccountPublic {
|
|
56
|
+
accountId: string;
|
|
57
|
+
accountLabel?: string;
|
|
58
|
+
providerId: string;
|
|
59
|
+
status: string;
|
|
60
|
+
createdAt: string;
|
|
61
|
+
updatedAt: string;
|
|
62
|
+
}
|
|
63
|
+
export interface CredentialEnvelope {
|
|
64
|
+
accountId: string;
|
|
65
|
+
accessToken: string;
|
|
66
|
+
refreshToken?: string;
|
|
67
|
+
expiresAt: string;
|
|
68
|
+
authClientConfigVersion: string;
|
|
69
|
+
}
|
|
70
|
+
export interface EnrollmentProvider {
|
|
71
|
+
start(input: StartEnrollmentInput): Promise<EnrollmentSession>;
|
|
72
|
+
complete(input: CompleteEnrollmentInput): Promise<PreparedCredential>;
|
|
73
|
+
resolve(credential: PreparedCredential): Promise<ResolvedProviderMetadata>;
|
|
74
|
+
refresh(input: RefreshInput): Promise<PreparedCredential>;
|
|
75
|
+
cancel?(enrollmentId: string): Promise<void>;
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=contracts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contracts.d.ts","sourceRoot":"","sources":["../../src/enrollment/contracts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contracts.js","sourceRoot":"","sources":["../../src/enrollment/contracts.ts"],"names":[],"mappings":"AAAA,8CAA8C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/enrollment/index.ts"],"names":[],"mappings":"AAEA,YAAY,EACV,aAAa,EACb,kBAAkB,EAClB,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,EAClB,wBAAwB,EACxB,oBAAoB,GACrB,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/enrollment/index.ts"],"names":[],"mappings":"AAAA,wEAAwE"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export interface PkcePair {
|
|
2
|
+
codeVerifier: string;
|
|
3
|
+
codeChallenge: string;
|
|
4
|
+
}
|
|
5
|
+
export declare function generatePkcePair(): PkcePair;
|
|
6
|
+
export declare function generateNonce(): string;
|
|
7
|
+
export interface LoopbackCallbackResult {
|
|
8
|
+
code: string;
|
|
9
|
+
state: string;
|
|
10
|
+
}
|
|
11
|
+
export interface LoopbackServer {
|
|
12
|
+
port: number;
|
|
13
|
+
redirectUri: string;
|
|
14
|
+
waitForCallback(timeoutMs?: number): Promise<LoopbackCallbackResult>;
|
|
15
|
+
close(): Promise<void>;
|
|
16
|
+
}
|
|
17
|
+
export declare function createLoopbackServer(expectedState: string, preferredPort?: number): Promise<LoopbackServer>;
|
|
18
|
+
//# sourceMappingURL=pkce.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pkce.d.ts","sourceRoot":"","sources":["../../src/enrollment/pkce.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,QAAQ;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,gBAAgB,IAAI,QAAQ,CAI3C;AAED,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAAC;IACrE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,wBAAsB,oBAAoB,CACxC,aAAa,EAAE,MAAM,EACrB,aAAa,SAAI,GAChB,OAAO,CAAC,cAAc,CAAC,CAgGzB"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { createHash, randomBytes } from 'crypto';
|
|
2
|
+
import { createServer } from 'http';
|
|
3
|
+
const base64Url = (buf) => buf
|
|
4
|
+
.toString('base64')
|
|
5
|
+
.replace(/\+/g, '-')
|
|
6
|
+
.replace(/\//g, '_')
|
|
7
|
+
.replace(/=+$/, '');
|
|
8
|
+
export function generatePkcePair() {
|
|
9
|
+
const codeVerifier = base64Url(randomBytes(32));
|
|
10
|
+
const codeChallenge = base64Url(createHash('sha256').update(codeVerifier).digest());
|
|
11
|
+
return { codeVerifier, codeChallenge };
|
|
12
|
+
}
|
|
13
|
+
export function generateNonce() {
|
|
14
|
+
return base64Url(randomBytes(16));
|
|
15
|
+
}
|
|
16
|
+
export async function createLoopbackServer(expectedState, preferredPort = 0) {
|
|
17
|
+
let server = null;
|
|
18
|
+
let resolveCallback = null;
|
|
19
|
+
let rejectCallback = null;
|
|
20
|
+
let handled = false;
|
|
21
|
+
const callbackPromise = new Promise((res, rej) => {
|
|
22
|
+
resolveCallback = res;
|
|
23
|
+
rejectCallback = rej;
|
|
24
|
+
});
|
|
25
|
+
server = createServer((req, res) => {
|
|
26
|
+
try {
|
|
27
|
+
const addressInfo = server?.address();
|
|
28
|
+
const portNum = typeof addressInfo === 'object' && addressInfo ? addressInfo.port : preferredPort;
|
|
29
|
+
const reqUrl = new URL(req.url ?? '/', `http://127.0.0.1:${portNum}`);
|
|
30
|
+
// P0-2: Ignore non-callback requests (e.g. GET /favicon.ico)
|
|
31
|
+
if (reqUrl.pathname !== '/oauth/callback') {
|
|
32
|
+
res.writeHead(204);
|
|
33
|
+
res.end();
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
// P1-3: Prevent double-handling of replay callbacks
|
|
37
|
+
if (handled) {
|
|
38
|
+
res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
|
|
39
|
+
res.end('<h1>Authentication completed</h1><p>Callback already consumed.</p>');
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
const code = reqUrl.searchParams.get('code');
|
|
43
|
+
const state = reqUrl.searchParams.get('state');
|
|
44
|
+
if (!state || state !== expectedState) {
|
|
45
|
+
handled = true;
|
|
46
|
+
res.writeHead(400, { 'Content-Type': 'text/html; charset=utf-8' });
|
|
47
|
+
res.end('<h1>Authentication failed</h1><p>State/nonce mismatch.</p>');
|
|
48
|
+
rejectCallback?.(new Error('State/nonce mismatch'));
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
if (!code) {
|
|
52
|
+
handled = true;
|
|
53
|
+
res.writeHead(400, { 'Content-Type': 'text/html; charset=utf-8' });
|
|
54
|
+
res.end('<h1>Authentication failed</h1><p>Missing authorization code.</p>');
|
|
55
|
+
rejectCallback?.(new Error('Missing authorization code'));
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
handled = true;
|
|
59
|
+
res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
|
|
60
|
+
res.end('<h1>Authentication successful</h1><p>You may close this window and return to your terminal.</p>');
|
|
61
|
+
resolveCallback?.({ code, state });
|
|
62
|
+
}
|
|
63
|
+
catch (err) {
|
|
64
|
+
if (!handled) {
|
|
65
|
+
handled = true;
|
|
66
|
+
if (!res.headersSent) {
|
|
67
|
+
res.writeHead(500, { 'Content-Type': 'text/plain' });
|
|
68
|
+
}
|
|
69
|
+
res.end('Internal error');
|
|
70
|
+
rejectCallback?.(err instanceof Error ? err : new Error(String(err)));
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
await new Promise((res) => {
|
|
75
|
+
server?.listen(preferredPort, '127.0.0.1', () => res());
|
|
76
|
+
});
|
|
77
|
+
const address = server.address();
|
|
78
|
+
const actualPort = typeof address === 'object' && address ? address.port : preferredPort;
|
|
79
|
+
const redirectUri = `http://127.0.0.1:${actualPort}/oauth/callback`;
|
|
80
|
+
return {
|
|
81
|
+
port: actualPort,
|
|
82
|
+
redirectUri,
|
|
83
|
+
async waitForCallback(timeoutMs = 5 * 60 * 1000) {
|
|
84
|
+
let timer;
|
|
85
|
+
const timeoutPromise = new Promise((_, reject) => {
|
|
86
|
+
timer = setTimeout(() => reject(new Error('OAuth loopback callback timed out')), timeoutMs);
|
|
87
|
+
});
|
|
88
|
+
try {
|
|
89
|
+
return await Promise.race([callbackPromise, timeoutPromise]);
|
|
90
|
+
}
|
|
91
|
+
finally {
|
|
92
|
+
if (timer)
|
|
93
|
+
clearTimeout(timer);
|
|
94
|
+
}
|
|
95
|
+
},
|
|
96
|
+
async close() {
|
|
97
|
+
if (server) {
|
|
98
|
+
await new Promise((res) => server?.close(() => res()));
|
|
99
|
+
server = null;
|
|
100
|
+
}
|
|
101
|
+
},
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=pkce.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pkce.js","sourceRoot":"","sources":["../../src/enrollment/pkce.ts"],"names":[],"mappings":"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"}
|
package/dist/generation.d.ts
CHANGED
|
@@ -15,8 +15,14 @@ export type ResponseFormat = {
|
|
|
15
15
|
description?: string;
|
|
16
16
|
strict?: boolean;
|
|
17
17
|
};
|
|
18
|
+
/**
|
|
19
|
+
* Reasoning effort ladder, ascending. `max` is the top rung (owner decision
|
|
20
|
+
* 2026-07-25) — some upstreams expose a tier above `xhigh`; a provider that
|
|
21
|
+
* does not support it should clamp to its own maximum rather than fail.
|
|
22
|
+
*/
|
|
23
|
+
export type ReasoningEffort = 'none' | 'low' | 'medium' | 'high' | 'xhigh' | 'max';
|
|
18
24
|
export interface ReasoningOptions {
|
|
19
|
-
effort?:
|
|
25
|
+
effort?: ReasoningEffort;
|
|
20
26
|
summary?: 'auto' | 'concise' | 'detailed';
|
|
21
27
|
}
|
|
22
28
|
export interface LlmMeshRequestMetadata {
|
package/dist/generation.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generation.d.ts","sourceRoot":"","sources":["../src/generation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAC5F,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5E,OAAO,KAAK,EAAE,gBAAgB,EAAE,QAAQ,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEzF,MAAM,MAAM,cAAc,GAAG,gBAAgB,GAAG,cAAc,CAAC;AAE/D,MAAM,MAAM,cAAc,GACtB;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,aAAa,CAAA;CAAE,GACvB;IACE,IAAI,EAAE,aAAa,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,gBAAgB,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB,CAAC;AAEN,MAAM,
|
|
1
|
+
{"version":3,"file":"generation.d.ts","sourceRoot":"","sources":["../src/generation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export type { KeyringAdapter } from '../service/facade.js';
|
|
2
|
+
export { EnvKeyring } from './keyring/env-keyring.js';
|
|
3
|
+
export { InMemoryKeyring } from './keyring/in-memory-keyring.js';
|
|
4
|
+
export { LinuxSecretstoreKeyring } from './keyring/linux-secretstore-keyring.js';
|
|
5
|
+
export { MacOSKeychainKeyring } from './keyring/macos-keychain-keyring.js';
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/node/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,EAAE,uBAAuB,EAAE,MAAM,wCAAwC,CAAC;AACjF,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { EnvKeyring } from './keyring/env-keyring.js';
|
|
2
|
+
export { InMemoryKeyring } from './keyring/in-memory-keyring.js';
|
|
3
|
+
export { LinuxSecretstoreKeyring } from './keyring/linux-secretstore-keyring.js';
|
|
4
|
+
export { MacOSKeychainKeyring } from './keyring/macos-keychain-keyring.js';
|
|
5
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/node/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,EAAE,uBAAuB,EAAE,MAAM,wCAAwC,CAAC;AACjF,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { KeyringAdapter } from '../../service/facade.js';
|
|
2
|
+
export declare class EnvKeyring implements KeyringAdapter {
|
|
3
|
+
private readonly envPrefix;
|
|
4
|
+
private readonly memoryFallback;
|
|
5
|
+
constructor(envPrefix?: string);
|
|
6
|
+
private envKey;
|
|
7
|
+
getSecret(key: string): Promise<string | null>;
|
|
8
|
+
setSecret(key: string, secret: string): Promise<void>;
|
|
9
|
+
deleteSecret(key: string): Promise<void>;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=env-keyring.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env-keyring.d.ts","sourceRoot":"","sources":["../../../src/node/keyring/env-keyring.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAE9D,qBAAa,UAAW,YAAW,cAAc;IAC/C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA6B;gBAEhD,SAAS,SAAuB;IAI5C,OAAO,CAAC,MAAM;IAIR,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAQ9C,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKrD,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAI/C"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export class EnvKeyring {
|
|
2
|
+
envPrefix;
|
|
3
|
+
memoryFallback = new Map();
|
|
4
|
+
constructor(envPrefix = 'SENTROPIC_KEYRING_') {
|
|
5
|
+
this.envPrefix = envPrefix;
|
|
6
|
+
}
|
|
7
|
+
envKey(key) {
|
|
8
|
+
return `${this.envPrefix}${key.replace(/[^a-zA-Z0-9_]/g, '_').toUpperCase()}`;
|
|
9
|
+
}
|
|
10
|
+
async getSecret(key) {
|
|
11
|
+
const envVal = process.env[this.envKey(key)] ?? process.env[key];
|
|
12
|
+
if (typeof envVal === 'string' && envVal.length > 0) {
|
|
13
|
+
return envVal;
|
|
14
|
+
}
|
|
15
|
+
return this.memoryFallback.get(key) ?? null;
|
|
16
|
+
}
|
|
17
|
+
async setSecret(key, secret) {
|
|
18
|
+
process.env[this.envKey(key)] = secret;
|
|
19
|
+
this.memoryFallback.set(key, secret);
|
|
20
|
+
}
|
|
21
|
+
async deleteSecret(key) {
|
|
22
|
+
delete process.env[this.envKey(key)];
|
|
23
|
+
this.memoryFallback.delete(key);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=env-keyring.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env-keyring.js","sourceRoot":"","sources":["../../../src/node/keyring/env-keyring.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,UAAU;IACJ,SAAS,CAAS;IAClB,cAAc,GAAG,IAAI,GAAG,EAAkB,CAAC;IAE5D,YAAY,SAAS,GAAG,oBAAoB;QAC1C,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;IAEO,MAAM,CAAC,GAAW;QACxB,OAAO,GAAG,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;IAChF,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,GAAW;QACzB,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACjE,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpD,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,OAAO,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC;IAC9C,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,GAAW,EAAE,MAAc;QACzC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC;QACvC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,GAAW;QAC5B,OAAO,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QACrC,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAClC,CAAC;CACF"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { KeyringAdapter } from '../../service/facade.js';
|
|
2
|
+
export declare class InMemoryKeyring implements KeyringAdapter {
|
|
3
|
+
private readonly store;
|
|
4
|
+
getSecret(key: string): Promise<string | null>;
|
|
5
|
+
setSecret(key: string, secret: string): Promise<void>;
|
|
6
|
+
deleteSecret(key: string): Promise<void>;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=in-memory-keyring.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"in-memory-keyring.d.ts","sourceRoot":"","sources":["../../../src/node/keyring/in-memory-keyring.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAE9D,qBAAa,eAAgB,YAAW,cAAc;IACpD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA6B;IAE7C,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAI9C,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrD,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAG/C"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export class InMemoryKeyring {
|
|
2
|
+
store = new Map();
|
|
3
|
+
async getSecret(key) {
|
|
4
|
+
return this.store.get(key) ?? null;
|
|
5
|
+
}
|
|
6
|
+
async setSecret(key, secret) {
|
|
7
|
+
this.store.set(key, secret);
|
|
8
|
+
}
|
|
9
|
+
async deleteSecret(key) {
|
|
10
|
+
this.store.delete(key);
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=in-memory-keyring.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"in-memory-keyring.js","sourceRoot":"","sources":["../../../src/node/keyring/in-memory-keyring.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,eAAe;IACT,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAC;IAEnD,KAAK,CAAC,SAAS,CAAC,GAAW;QACzB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,GAAW,EAAE,MAAc;QACzC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,GAAW;QAC5B,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;CACF"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { KeyringAdapter } from '../../service/facade.js';
|
|
2
|
+
export declare class LinuxSecretstoreKeyring implements KeyringAdapter {
|
|
3
|
+
private readonly memoryStore;
|
|
4
|
+
private readonly serviceName;
|
|
5
|
+
constructor(serviceName?: string);
|
|
6
|
+
getSecret(key: string): Promise<string | null>;
|
|
7
|
+
setSecret(key: string, secret: string): Promise<void>;
|
|
8
|
+
deleteSecret(key: string): Promise<void>;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=linux-secretstore-keyring.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"linux-secretstore-keyring.d.ts","sourceRoot":"","sources":["../../../src/node/keyring/linux-secretstore-keyring.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAE9D,qBAAa,uBAAwB,YAAW,cAAc;IAC5D,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA6B;IACzD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;gBAEzB,WAAW,SAAuB;IAIxC,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAI9C,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrD,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAG/C"}
|