@sentropic/llm-mesh 0.13.0 → 0.14.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/README.md +105 -6
- package/dist/account-transports.d.ts +14 -1
- package/dist/account-transports.d.ts.map +1 -1
- package/dist/account-transports.js +37 -3
- package/dist/account-transports.js.map +1 -1
- package/dist/codex.d.ts +43 -0
- package/dist/codex.d.ts.map +1 -0
- package/dist/codex.js +62 -0
- package/dist/codex.js.map +1 -0
- package/dist/enrollment/cloud-code.d.ts +6 -1
- package/dist/enrollment/cloud-code.d.ts.map +1 -1
- package/dist/enrollment/cloud-code.js +53 -25
- package/dist/enrollment/cloud-code.js.map +1 -1
- package/dist/enrollment/codex.d.ts +1 -0
- package/dist/enrollment/codex.d.ts.map +1 -1
- package/dist/enrollment/codex.js +1 -0
- package/dist/enrollment/codex.js.map +1 -1
- package/dist/enrollment/contracts.d.ts +10 -0
- package/dist/enrollment/contracts.d.ts.map +1 -1
- package/dist/equivalence-council.d.ts +61 -0
- package/dist/equivalence-council.d.ts.map +1 -0
- package/dist/equivalence-council.js +119 -0
- package/dist/equivalence-council.js.map +1 -0
- package/dist/generated-model-council.d.ts +10 -0
- package/dist/generated-model-council.d.ts.map +1 -0
- package/dist/generated-model-council.js +32 -0
- package/dist/generated-model-council.js.map +1 -0
- package/dist/generation.d.ts +3 -0
- package/dist/generation.d.ts.map +1 -1
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -1
- package/dist/messages.d.ts +8 -1
- package/dist/messages.d.ts.map +1 -1
- package/dist/node/index.d.ts +1 -0
- package/dist/node/index.d.ts.map +1 -1
- package/dist/node/index.js +1 -0
- package/dist/node/index.js.map +1 -1
- package/dist/node/keyring/encrypted-file-keyring.d.ts +13 -0
- package/dist/node/keyring/encrypted-file-keyring.d.ts.map +1 -0
- package/dist/node/keyring/encrypted-file-keyring.js +134 -0
- package/dist/node/keyring/encrypted-file-keyring.js.map +1 -0
- package/dist/route-attempt.d.ts +18 -0
- package/dist/route-attempt.d.ts.map +1 -0
- package/dist/route-attempt.js +70 -0
- package/dist/route-attempt.js.map +1 -0
- package/dist/route-health.d.ts +14 -0
- package/dist/route-health.d.ts.map +1 -0
- package/dist/route-health.js +69 -0
- package/dist/route-health.js.map +1 -0
- package/dist/route-planner-state.d.ts +37 -0
- package/dist/route-planner-state.d.ts.map +1 -0
- package/dist/route-planner-state.js +27 -0
- package/dist/route-planner-state.js.map +1 -0
- package/dist/route-planner.d.ts +48 -0
- package/dist/route-planner.d.ts.map +1 -0
- package/dist/route-planner.js +327 -0
- package/dist/route-planner.js.map +1 -0
- package/dist/route-selection.d.ts +17 -0
- package/dist/route-selection.d.ts.map +1 -0
- package/dist/route-selection.js +127 -0
- package/dist/route-selection.js.map +1 -0
- package/dist/routing-contracts.d.ts +130 -0
- package/dist/routing-contracts.d.ts.map +1 -0
- package/dist/routing-contracts.js +2 -0
- package/dist/routing-contracts.js.map +1 -0
- package/dist/routing-policy.d.ts +68 -0
- package/dist/routing-policy.d.ts.map +1 -0
- package/dist/routing-policy.js +93 -0
- package/dist/routing-policy.js.map +1 -0
- package/dist/routing-targets.d.ts +25 -0
- package/dist/routing-targets.d.ts.map +1 -0
- package/dist/routing-targets.js +48 -0
- package/dist/routing-targets.js.map +1 -0
- package/dist/service/facade.d.ts +31 -0
- package/dist/service/facade.d.ts.map +1 -1
- package/dist/service/facade.js +11 -2
- package/dist/service/facade.js.map +1 -1
- package/dist/service/local-account-transport-service.d.ts +15 -2
- package/dist/service/local-account-transport-service.d.ts.map +1 -1
- package/dist/service/local-account-transport-service.js +279 -17
- package/dist/service/local-account-transport-service.js.map +1 -1
- package/dist/transport/cloud-code-runtime-client.d.ts +22 -0
- package/dist/transport/cloud-code-runtime-client.d.ts.map +1 -0
- package/dist/transport/cloud-code-runtime-client.js +306 -0
- package/dist/transport/cloud-code-runtime-client.js.map +1 -0
- package/dist/transport/cloud-code-transport.d.ts +3 -0
- package/dist/transport/cloud-code-transport.d.ts.map +1 -1
- package/dist/transport/cloud-code-transport.js +39 -10
- package/dist/transport/cloud-code-transport.js.map +1 -1
- package/dist/transport/codex-runtime-client.d.ts +17 -0
- package/dist/transport/codex-runtime-client.d.ts.map +1 -0
- package/dist/transport/codex-runtime-client.js +121 -0
- package/dist/transport/codex-runtime-client.js.map +1 -0
- package/dist/transport/codex-runtime-wire.d.ts +5 -0
- package/dist/transport/codex-runtime-wire.d.ts.map +1 -0
- package/dist/transport/codex-runtime-wire.js +144 -0
- package/dist/transport/codex-runtime-wire.js.map +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,15 +1,114 @@
|
|
|
1
1
|
# @sentropic/llm-mesh
|
|
2
2
|
|
|
3
|
-
Provider-agnostic
|
|
3
|
+
Provider-agnostic model runtime, enrollment, and routing control plane.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
`@sentropic/llm-mesh` owns provider/model capabilities, enrolled account
|
|
6
|
+
eligibility, credentials, health, routing policy, affinity, and the versioned
|
|
7
|
+
model-equivalence council. It returns opaque route plans and prepared attempts;
|
|
8
|
+
neither a gateway nor another consumer receives provider credentials or raw
|
|
9
|
+
account identifiers.
|
|
6
10
|
|
|
7
11
|
## Public Scope
|
|
8
12
|
|
|
9
13
|
- Providers: OpenAI, Google Gemini, Anthropic Claude, Mistral, Cohere.
|
|
10
|
-
- Auth sources: direct token, user token, workspace token, environment token,
|
|
11
|
-
|
|
14
|
+
- Auth sources: direct token, user token, workspace token, environment token,
|
|
15
|
+
Codex account, Cloud Code account, and Claude Code account.
|
|
12
16
|
- Normalized stream events: `reasoning_delta`, `content_delta`, `tool_call_start`, `tool_call_delta`, `tool_call_result`, `status`, `error`, `done`.
|
|
13
|
-
- Provider adapters: OpenAI, Gemini, Anthropic Claude, Mistral, and Cohere
|
|
17
|
+
- Provider adapters: OpenAI, Gemini, Anthropic Claude, Mistral, and Cohere.
|
|
18
|
+
- Enrolled runtimes: `CodexRuntimeClient` and `CloudCodeRuntimeClient` execute
|
|
19
|
+
canonical requests without exposing their account tokens.
|
|
20
|
+
- Routing strategies: last successfully enrolled first (default), ordered, or
|
|
21
|
+
round-robin across new affinities only, with per-model/capability/intent rules.
|
|
14
22
|
|
|
15
|
-
|
|
23
|
+
Caller authentication, wire translation, financial metering, and response
|
|
24
|
+
commitment remain outside this package. CLI enrollment uses an encrypted local
|
|
25
|
+
keyring; portal mode remains injection-only. Override the CLI keyring directory
|
|
26
|
+
with `SENTROPIC_LLM_MESH_KEYRING_DIR` when runtime isolation requires it.
|
|
27
|
+
|
|
28
|
+
`CloudCodeRuntimeClient` projects function parameter schemas onto the JSON
|
|
29
|
+
Schema subset accepted by the Cloud Code Gemini wire. Tool names, properties,
|
|
30
|
+
required fields and supported constraints are preserved; unsupported
|
|
31
|
+
validation-only keywords are omitted before dispatch rather than causing an
|
|
32
|
+
upstream 400 for rich Claude Code tool catalogs.
|
|
33
|
+
|
|
34
|
+
## Routing policy
|
|
35
|
+
|
|
36
|
+
`DEFAULT_ROUTE_POLICY` uses the latest successful enrollment, a strict sticky
|
|
37
|
+
account, same-transport preference, at most three attempts, and a five-minute
|
|
38
|
+
negative-health cache. `retest-preferred` is the default fallback mode: a failed
|
|
39
|
+
preferred route is suppressed until its TTL expires, then tested again.
|
|
40
|
+
`one-way` promotes a successful fallback instead. Override `negativeCacheTtlMs`
|
|
41
|
+
between 1 second and 1 hour.
|
|
42
|
+
|
|
43
|
+
Equivalent-account rotation is disabled by default. Enabling
|
|
44
|
+
`rotateEquivalentAccounts` may move an affinity to another account and lose
|
|
45
|
+
provider-side prompt/session cache continuity; such a move is exposed as an
|
|
46
|
+
audited rebind with `cacheContinuityRisk: true`. Mesh preserves account and
|
|
47
|
+
stable-session affinity, but does not claim or manage a provider prompt cache.
|
|
48
|
+
|
|
49
|
+
The built-in equivalence council fails closed: a model is either covered by
|
|
50
|
+
fresh benchmark evidence or explicitly excluded. Update its pinned source and
|
|
51
|
+
generated artifact together:
|
|
52
|
+
|
|
53
|
+
```sh
|
|
54
|
+
make refresh-llm-model-equivalences
|
|
55
|
+
make check-llm-model-equivalences
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
Create the gateway-facing planner from the same facade that owns enrollment:
|
|
59
|
+
|
|
60
|
+
```ts
|
|
61
|
+
import { createLlmMeshFacade } from '@sentropic/llm-mesh/facade';
|
|
62
|
+
|
|
63
|
+
const facade = createLlmMeshFacade({ mode: 'cli', configResolver });
|
|
64
|
+
const routePlanner = facade.createRoutePlanner(runtime, {
|
|
65
|
+
affinityAudit: (event) => audit.write(event),
|
|
66
|
+
});
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
Every completed enrollment persists its `ownerScopeRef`. The planner lists and
|
|
70
|
+
prepares only accounts whose owner scope exactly matches the authenticated
|
|
71
|
+
`VerifiedRoutingSubject`; changing a bearer/session principal does not change
|
|
72
|
+
that owner scope or its affinities. Older local keyring records that predate
|
|
73
|
+
owner tagging fail closed unless the host explicitly binds them once:
|
|
74
|
+
|
|
75
|
+
```ts
|
|
76
|
+
const facade = createLlmMeshFacade({
|
|
77
|
+
mode: 'cli',
|
|
78
|
+
configResolver,
|
|
79
|
+
legacyAccountOwnerScopeRef: stableLocalOwnerRef,
|
|
80
|
+
});
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
That migration option is only for pre-ownerScope local records. New enrollment
|
|
84
|
+
always takes ownership from `StartEnrollmentInput.ownerScope`.
|
|
85
|
+
|
|
86
|
+
## Cloud Code OAuth client rotation
|
|
87
|
+
|
|
88
|
+
The embedded Antigravity OAuth client credential is distributable client configuration, not a
|
|
89
|
+
user access or refresh token. Source and npm artifacts are built from the same checked-in value.
|
|
90
|
+
|
|
91
|
+
Rotate it from a protected `0600` file, then bump the package version in the same pull request:
|
|
92
|
+
|
|
93
|
+
```sh
|
|
94
|
+
make rotate-llm-mesh-cloud-code-oauth \
|
|
95
|
+
CLOUD_CODE_OAUTH_CLIENT_SECRET_FILE=/absolute/path/to/client-secret
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
Recovery from an official Antigravity binary is fail-closed and requires both the pinned binary
|
|
99
|
+
checksum and the expected credential fingerprint:
|
|
100
|
+
|
|
101
|
+
```sh
|
|
102
|
+
make rotate-llm-mesh-cloud-code-oauth-from-agy \
|
|
103
|
+
AGY_BINARY=/absolute/path/to/antigravity \
|
|
104
|
+
AGY_BINARY_SHA256=<verified-binary-sha256> \
|
|
105
|
+
CLOUD_CODE_OAUTH_EXPECTED_SHA256=<approved-credential-sha256>
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
Update the GitHub Actions secret `LLM_MESH_CLOUD_CODE_OAUTH_CLIENT_SECRET` before merging. The
|
|
109
|
+
main-branch publish job rebuilds the package, compares source and `dist` to that protected
|
|
110
|
+
reference, rejects credential fragments outside the intended module (including source maps), and
|
|
111
|
+
only then publishes through npm OIDC provenance. The workflow never writes the value to logs.
|
|
112
|
+
|
|
113
|
+
Published versions are immutable. Keep the previous and replacement clients valid for an agreed
|
|
114
|
+
grace period, or explicitly accept that revocation breaks enrollment for older package versions.
|
|
@@ -4,6 +4,7 @@ export type AccountTransportAccountStatus = 'active' | 'cooldown' | 'reauth_requ
|
|
|
4
4
|
export type AccountTransportOutcomeStatus = 'success' | 'failed' | 'rate_limited' | 'auth_failed';
|
|
5
5
|
export interface AccountTransportAccount {
|
|
6
6
|
accountId: string;
|
|
7
|
+
ownerScopeRef?: string;
|
|
7
8
|
accountLabel?: string | null;
|
|
8
9
|
targetProviderId: ProviderId | (string & {});
|
|
9
10
|
transportProviderId: AccountTransportProviderId | (string & {});
|
|
@@ -17,8 +18,12 @@ export interface AccountTransportAccount {
|
|
|
17
18
|
cooldownUntil?: Date | string | null;
|
|
18
19
|
headers?: Record<string, string>;
|
|
19
20
|
metadata?: Record<string, unknown>;
|
|
21
|
+
enrollmentCompletedAt?: string;
|
|
20
22
|
}
|
|
21
23
|
export interface AccountTransportAcquireInput {
|
|
24
|
+
/** Mesh-internal exact candidate binding; never sourced from gateway ingress. */
|
|
25
|
+
accountId?: string;
|
|
26
|
+
ownerScopeRef?: string;
|
|
22
27
|
targetProviderId: ProviderId | (string & {});
|
|
23
28
|
transportProviderId: AccountTransportProviderId | (string & {});
|
|
24
29
|
modelId?: ModelId | (string & {}) | null;
|
|
@@ -63,6 +68,8 @@ export interface AccountTransportAcquisition {
|
|
|
63
68
|
metadata?: Record<string, unknown>;
|
|
64
69
|
};
|
|
65
70
|
recordOutcome(outcome: AccountTransportOutcome): Promise<void>;
|
|
71
|
+
/** Releases an unfinished reservation without changing account health. */
|
|
72
|
+
release?(): Promise<void>;
|
|
66
73
|
}
|
|
67
74
|
/**
|
|
68
75
|
* Coordinator that manages account selection, leasing, and cooldown lifecycle.
|
|
@@ -83,7 +90,13 @@ export declare class InMemoryAccountTransportCoordinator implements AccountTrans
|
|
|
83
90
|
private leaseSequence;
|
|
84
91
|
private reservationSequence;
|
|
85
92
|
constructor(accounts?: readonly AccountTransportAccount[]);
|
|
86
|
-
addAccount(account: AccountTransportAccount):
|
|
93
|
+
addAccount(account: AccountTransportAccount): AccountTransportAccount;
|
|
94
|
+
/**
|
|
95
|
+
* Advance time-based lifecycle state without acquiring an account.
|
|
96
|
+
* Returns account ids whose cooldown expired so a durable host can persist
|
|
97
|
+
* the transition before exposing route inventory.
|
|
98
|
+
*/
|
|
99
|
+
refreshLifecycle(nowInput?: Date | string | number): readonly string[];
|
|
87
100
|
acquire(input: AccountTransportAcquireInput): Promise<AccountTransportAcquisition>;
|
|
88
101
|
private getLeasedAccount;
|
|
89
102
|
private selectAccount;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"account-transports.d.ts","sourceRoot":"","sources":["../src/account-transports.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,4BAA4B,EAC5B,0BAA0B,EAC1B,cAAc,EACf,MAAM,WAAW,CAAC;AACnB,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAE1D,MAAM,MAAM,6BAA6B,GACrC,QAAQ,GACR,UAAU,GACV,iBAAiB,GACjB,UAAU,CAAC;AAEf,MAAM,MAAM,6BAA6B,GACrC,SAAS,GACT,QAAQ,GACR,cAAc,GACd,aAAa,CAAC;AAElB,MAAM,WAAW,uBAAuB;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,gBAAgB,EAAE,UAAU,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;IAC7C,mBAAmB,EAAE,0BAA0B,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;IAChE,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,MAAM,CAAC,EAAE,6BAA6B,CAAC;IACvC,QAAQ,CAAC,EAAE,SAAS,CAAC,OAAO,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC;IAChD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,IAAI,GAAG,MAAM,GAAG,IAAI,CAAC;IACrC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"account-transports.d.ts","sourceRoot":"","sources":["../src/account-transports.ts"],"names":[],"mappings":"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"}
|
|
@@ -26,6 +26,7 @@ const buildLeaseKey = (input) => {
|
|
|
26
26
|
return undefined;
|
|
27
27
|
}
|
|
28
28
|
return [
|
|
29
|
+
normalizeOptional(input.ownerScopeRef),
|
|
29
30
|
normalizeOptional(input.workspaceId),
|
|
30
31
|
input.affinityKey,
|
|
31
32
|
input.targetProviderId,
|
|
@@ -60,13 +61,28 @@ export class InMemoryAccountTransportCoordinator {
|
|
|
60
61
|
}
|
|
61
62
|
}
|
|
62
63
|
addAccount(account) {
|
|
63
|
-
|
|
64
|
+
const stored = {
|
|
64
65
|
...account,
|
|
65
66
|
status: account.status ?? 'active',
|
|
66
67
|
priority: account.priority ?? 0,
|
|
67
68
|
weight: Math.max(account.weight ?? 1, 1),
|
|
68
69
|
totalAcquisitions: 0,
|
|
69
|
-
}
|
|
70
|
+
};
|
|
71
|
+
this.accounts.set(account.accountId, stored);
|
|
72
|
+
// The local account service deliberately retains this exact object. Token
|
|
73
|
+
// refreshes and lifecycle transitions therefore update the executable
|
|
74
|
+
// coordinator state instead of a detached copy.
|
|
75
|
+
return stored;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Advance time-based lifecycle state without acquiring an account.
|
|
79
|
+
* Returns account ids whose cooldown expired so a durable host can persist
|
|
80
|
+
* the transition before exposing route inventory.
|
|
81
|
+
*/
|
|
82
|
+
refreshLifecycle(nowInput) {
|
|
83
|
+
const now = toDate(nowInput);
|
|
84
|
+
this.releaseExpiredReservations(now);
|
|
85
|
+
return this.expireCooldowns(now);
|
|
70
86
|
}
|
|
71
87
|
async acquire(input) {
|
|
72
88
|
const now = toDate(input.now);
|
|
@@ -132,6 +148,12 @@ export class InMemoryAccountTransportCoordinator {
|
|
|
132
148
|
this.reservations.delete(reservation.reservationId);
|
|
133
149
|
this.applyOutcome(account, outcome);
|
|
134
150
|
},
|
|
151
|
+
release: async () => {
|
|
152
|
+
if (outcomeRecorded)
|
|
153
|
+
return;
|
|
154
|
+
outcomeRecorded = true;
|
|
155
|
+
this.reservations.delete(reservation.reservationId);
|
|
156
|
+
},
|
|
135
157
|
};
|
|
136
158
|
}
|
|
137
159
|
getLeasedAccount(lease, input, now) {
|
|
@@ -145,6 +167,11 @@ export class InMemoryAccountTransportCoordinator {
|
|
|
145
167
|
const candidates = [...this.accounts.values()]
|
|
146
168
|
.filter((account) => this.isEligible(account, input, now))
|
|
147
169
|
.sort((left, right) => {
|
|
170
|
+
const enrollmentOrder = (Date.parse(right.enrollmentCompletedAt ?? '') || 0)
|
|
171
|
+
- (Date.parse(left.enrollmentCompletedAt ?? '') || 0);
|
|
172
|
+
if (enrollmentOrder !== 0) {
|
|
173
|
+
return enrollmentOrder;
|
|
174
|
+
}
|
|
148
175
|
if (right.priority !== left.priority) {
|
|
149
176
|
return right.priority - left.priority;
|
|
150
177
|
}
|
|
@@ -161,7 +188,11 @@ export class InMemoryAccountTransportCoordinator {
|
|
|
161
188
|
return candidates[0];
|
|
162
189
|
}
|
|
163
190
|
isEligible(account, input, _now) {
|
|
164
|
-
return account.
|
|
191
|
+
return (!input.accountId || account.accountId === input.accountId)
|
|
192
|
+
&& (input.ownerScopeRef
|
|
193
|
+
? account.ownerScopeRef === input.ownerScopeRef
|
|
194
|
+
: account.ownerScopeRef === undefined)
|
|
195
|
+
&& account.targetProviderId === input.targetProviderId
|
|
165
196
|
&& account.transportProviderId === input.transportProviderId
|
|
166
197
|
&& account.status === 'active'
|
|
167
198
|
&& supportsModel(account, input.modelId);
|
|
@@ -215,12 +246,15 @@ export class InMemoryAccountTransportCoordinator {
|
|
|
215
246
|
}
|
|
216
247
|
}
|
|
217
248
|
expireCooldowns(now) {
|
|
249
|
+
const recovered = [];
|
|
218
250
|
for (const account of this.accounts.values()) {
|
|
219
251
|
if (account.status === 'cooldown' && !isCooldownActive(account, now)) {
|
|
220
252
|
account.status = 'active';
|
|
221
253
|
account.cooldownUntil = undefined;
|
|
254
|
+
recovered.push(account.accountId);
|
|
222
255
|
}
|
|
223
256
|
}
|
|
257
|
+
return recovered;
|
|
224
258
|
}
|
|
225
259
|
applyOutcome(account, outcome) {
|
|
226
260
|
if (outcome.status === 'auth_failed') {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"account-transports.js","sourceRoot":"","sources":["../src/account-transports.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"account-transports.js","sourceRoot":"","sources":["../src/account-transports.ts"],"names":[],"mappings":"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"}
|
package/dist/codex.d.ts
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
export declare const CODEX_RESPONSES_URL = "https://chatgpt.com/backend-api/codex/responses";
|
|
2
|
+
export type CodexReasoningEffort = 'none' | 'low' | 'medium' | 'high' | 'xhigh';
|
|
3
|
+
export type CodexContentPart = {
|
|
4
|
+
type: 'text' | 'input_text';
|
|
5
|
+
text?: string;
|
|
6
|
+
} | {
|
|
7
|
+
type: string;
|
|
8
|
+
[key: string]: unknown;
|
|
9
|
+
};
|
|
10
|
+
export interface CodexInstructionsInputMessage {
|
|
11
|
+
readonly role?: string;
|
|
12
|
+
readonly content?: unknown;
|
|
13
|
+
}
|
|
14
|
+
export interface CodexResponsesRequestInput {
|
|
15
|
+
readonly model: string;
|
|
16
|
+
readonly stream?: boolean;
|
|
17
|
+
readonly input?: unknown;
|
|
18
|
+
readonly instructions?: string;
|
|
19
|
+
readonly reasoning?: {
|
|
20
|
+
readonly effort?: CodexReasoningEffort | string;
|
|
21
|
+
readonly [key: string]: unknown;
|
|
22
|
+
};
|
|
23
|
+
readonly max_output_tokens?: number;
|
|
24
|
+
readonly store?: boolean;
|
|
25
|
+
readonly [key: string]: unknown;
|
|
26
|
+
}
|
|
27
|
+
export interface CodexPreparedResponsesRequest {
|
|
28
|
+
readonly url: typeof CODEX_RESPONSES_URL;
|
|
29
|
+
readonly body: CodexResponsesRequestInput;
|
|
30
|
+
}
|
|
31
|
+
export declare const stringifyCodexContent: (value: unknown) => string;
|
|
32
|
+
export declare const codexInstructionsText: (content: unknown) => string;
|
|
33
|
+
export declare const collectCodexInstructions: (messages: readonly CodexInstructionsInputMessage[], fallback?: string) => string;
|
|
34
|
+
export declare const stripCodexInputIds: (body: string) => string;
|
|
35
|
+
export declare const prepareCodexResponsesRequest: (request: CodexResponsesRequestInput) => CodexPreparedResponsesRequest;
|
|
36
|
+
export interface CodexUsageDoneEvent {
|
|
37
|
+
readonly type: 'done';
|
|
38
|
+
readonly data: {
|
|
39
|
+
readonly usage?: unknown;
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
export declare const codexDoneEventFromResponseCompleted: (event: unknown) => CodexUsageDoneEvent;
|
|
43
|
+
//# sourceMappingURL=codex.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex.d.ts","sourceRoot":"","sources":["../src/codex.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,mBAAmB,oDAAoD,CAAC;AAErF,MAAM,MAAM,oBAAoB,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAC;AAChF,MAAM,MAAM,gBAAgB,GACxB;IAAE,IAAI,EAAE,MAAM,GAAG,YAAY,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAC9C;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,CAAC;AAC7C,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;CAC5B;AACD,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,SAAS,CAAC,EAAE;QACnB,QAAQ,CAAC,MAAM,CAAC,EAAE,oBAAoB,GAAG,MAAM,CAAC;QAChD,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;KACjC,CAAC;IACF,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IACzB,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACjC;AACD,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,GAAG,EAAE,OAAO,mBAAmB,CAAC;IACzC,QAAQ,CAAC,IAAI,EAAE,0BAA0B,CAAC;CAC3C;AAKD,eAAO,MAAM,qBAAqB,UAAW,OAAO,KAAG,MAGtD,CAAC;AAEF,eAAO,MAAM,qBAAqB,YAAa,OAAO,KAAG,MAQxD,CAAC;AAEF,eAAO,MAAM,wBAAwB,aACzB,SAAS,6BAA6B,EAAE,wBAEjD,MAMF,CAAC;AAWF,eAAO,MAAM,kBAAkB,SAAU,MAAM,KAAG,MAMjD,CAAC;AAEF,eAAO,MAAM,4BAA4B,YAC9B,0BAA0B,KAClC,6BAGF,CAAC;AAEF,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE;QAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;CAC7C;AAED,eAAO,MAAM,mCAAmC,UAAW,OAAO,KAAG,mBAKpE,CAAC"}
|
package/dist/codex.js
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
export const CODEX_RESPONSES_URL = 'https://chatgpt.com/backend-api/codex/responses';
|
|
2
|
+
const isRecord = (value) => Boolean(value) && typeof value === 'object' && !Array.isArray(value);
|
|
3
|
+
export const stringifyCodexContent = (value) => {
|
|
4
|
+
if (typeof value === 'string')
|
|
5
|
+
return value;
|
|
6
|
+
try {
|
|
7
|
+
return JSON.stringify(value ?? '');
|
|
8
|
+
}
|
|
9
|
+
catch {
|
|
10
|
+
return String(value ?? '');
|
|
11
|
+
}
|
|
12
|
+
};
|
|
13
|
+
export const codexInstructionsText = (content) => {
|
|
14
|
+
if (typeof content === 'string')
|
|
15
|
+
return content;
|
|
16
|
+
if (!Array.isArray(content))
|
|
17
|
+
return stringifyCodexContent(content);
|
|
18
|
+
const text = content.map((part) => {
|
|
19
|
+
if (!isRecord(part) || (part.type !== 'text' && part.type !== 'input_text'))
|
|
20
|
+
return '';
|
|
21
|
+
return typeof part.text === 'string' ? part.text : '';
|
|
22
|
+
}).filter((part) => part.trim().length > 0).join('\n\n').trim();
|
|
23
|
+
return text || stringifyCodexContent(content);
|
|
24
|
+
};
|
|
25
|
+
export const collectCodexInstructions = (messages, fallback = 'You are a helpful assistant.') => {
|
|
26
|
+
const instructions = messages
|
|
27
|
+
.filter((message) => message.role === 'system' || message.role === 'developer')
|
|
28
|
+
.map((message) => codexInstructionsText(message.content))
|
|
29
|
+
.filter((text) => text.trim().length > 0).join('\n\n').trim();
|
|
30
|
+
return instructions || fallback;
|
|
31
|
+
};
|
|
32
|
+
const stripCodexInputIdsFromValue = (value) => {
|
|
33
|
+
if (!Array.isArray(value))
|
|
34
|
+
return value;
|
|
35
|
+
return value.map((item) => {
|
|
36
|
+
if (!isRecord(item) || !('id' in item))
|
|
37
|
+
return item;
|
|
38
|
+
const { id: _id, ...rest } = item;
|
|
39
|
+
return rest;
|
|
40
|
+
});
|
|
41
|
+
};
|
|
42
|
+
export const stripCodexInputIds = (body) => {
|
|
43
|
+
try {
|
|
44
|
+
const parsed = JSON.parse(body);
|
|
45
|
+
parsed.input = stripCodexInputIdsFromValue(parsed.input);
|
|
46
|
+
return JSON.stringify(parsed);
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
return body;
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
export const prepareCodexResponsesRequest = (request) => {
|
|
53
|
+
const { max_output_tokens: _maxOutputTokens, ...rest } = request;
|
|
54
|
+
return { url: CODEX_RESPONSES_URL, body: { ...rest, store: false } };
|
|
55
|
+
};
|
|
56
|
+
export const codexDoneEventFromResponseCompleted = (event) => {
|
|
57
|
+
const record = isRecord(event) ? event : {};
|
|
58
|
+
const response = isRecord(record.response) ? record.response : undefined;
|
|
59
|
+
const usage = response && isRecord(response.usage) ? response.usage : undefined;
|
|
60
|
+
return { type: 'done', data: usage ? { usage } : {} };
|
|
61
|
+
};
|
|
62
|
+
//# sourceMappingURL=codex.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex.js","sourceRoot":"","sources":["../src/codex.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import type { ConfigResolver } from '../service/facade.js';
|
|
2
2
|
import type { CompleteEnrollmentInput, EnrollmentProvider, EnrollmentSession, PreparedCredential, RefreshInput, ResolvedProviderMetadata, StartEnrollmentInput } from './contracts.js';
|
|
3
|
-
export declare const CLOUD_CODE_AUTH_URL = "https://accounts.google.com/o/oauth2/
|
|
3
|
+
export declare const CLOUD_CODE_AUTH_URL = "https://accounts.google.com/o/oauth2/auth";
|
|
4
4
|
export declare const CLOUD_CODE_TOKEN_URL = "https://oauth2.googleapis.com/token";
|
|
5
5
|
export declare const CLOUD_CODE_LOAD_CODE_ASSIST_URL = "https://daily-cloudcode-pa.googleapis.com/v1internal:loadCodeAssist";
|
|
6
6
|
export declare const CLOUD_CODE_USER_AGENT = "antigravity/cli/1.1.10 (aidev_client; os_type=linux; arch=amd64; auth_method=consumer)";
|
|
7
|
+
export declare const CLOUD_CODE_CLIENT_ID = "1071006060591-tmhssin2h21lcre235vtolojh4g403ep.apps.googleusercontent.com";
|
|
8
|
+
export declare const CLOUD_CODE_CLIENT_SECRET: string;
|
|
7
9
|
export interface CloudCodeEnrollmentOptions {
|
|
8
10
|
clientId?: string;
|
|
9
11
|
clientSecret?: string;
|
|
@@ -23,6 +25,9 @@ export declare class CloudCodeEnrollmentProvider implements EnrollmentProvider {
|
|
|
23
25
|
waitForCallback(enrollmentId: string): Promise<{
|
|
24
26
|
accountId: string;
|
|
25
27
|
label: string;
|
|
28
|
+
ownerScope: string;
|
|
29
|
+
credential: PreparedCredential;
|
|
30
|
+
metadata: ResolvedProviderMetadata;
|
|
26
31
|
}>;
|
|
27
32
|
complete(input: CompleteEnrollmentInput): Promise<PreparedCredential>;
|
|
28
33
|
resolve(credential: PreparedCredential): Promise<ResolvedProviderMetadata>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cloud-code.d.ts","sourceRoot":"","sources":["../../src/enrollment/cloud-code.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EACV,uBAAuB,EACvB,kBAAkB,EAClB,iBAAiB,EAEjB,kBAAkB,EAClB,YAAY,EACZ,wBAAwB,EACxB,oBAAoB,EACrB,MAAM,gBAAgB,CAAC;AAIxB,eAAO,MAAM,mBAAmB,
|
|
1
|
+
{"version":3,"file":"cloud-code.d.ts","sourceRoot":"","sources":["../../src/enrollment/cloud-code.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EACV,uBAAuB,EACvB,kBAAkB,EAClB,iBAAiB,EAEjB,kBAAkB,EAClB,YAAY,EACZ,wBAAwB,EACxB,oBAAoB,EACrB,MAAM,gBAAgB,CAAC;AAIxB,eAAO,MAAM,mBAAmB,8CAA8C,CAAC;AAC/E,eAAO,MAAM,oBAAoB,wCAAwC,CAAC;AAC1E,eAAO,MAAM,+BAA+B,wEAC2B,CAAC;AACxE,eAAO,MAAM,qBAAqB,2FACwD,CAAC;AAE3F,eAAO,MAAM,oBAAoB,8EAC4C,CAAC;AAE9E,eAAO,MAAM,wBAAwB,QAA2D,CAAC;AAWjG,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,OAAO,CAAC,EAAE,OAAO,KAAK,CAAC;CACxB;AAED,qBAAa,2BAA4B,YAAW,kBAAkB;IACpE,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;IACzC,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAS;IAC7C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAiB;IACjD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAe;IACvC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAGrB;IACJ,OAAO,CAAC,QAAQ,CAAK;gBAET,OAAO,GAAE,0BAA+B;YAOtC,UAAU;IAyBlB,KAAK,CAAC,KAAK,EAAE,oBAAoB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAyD9D,eAAe,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC;QACnD,SAAS,EAAE,MAAM,CAAC;QAClB,KAAK,EAAE,MAAM,CAAC;QACd,UAAU,EAAE,MAAM,CAAC;QACnB,UAAU,EAAE,kBAAkB,CAAC;QAC/B,QAAQ,EAAE,wBAAwB,CAAC;KACpC,CAAC;IAsCI,QAAQ,CAAC,KAAK,EAAE,uBAAuB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAmErE,OAAO,CAAC,UAAU,EAAE,kBAAkB,GAAG,OAAO,CAAC,wBAAwB,CAAC;IAiC1E,OAAO,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAsDzD,MAAM,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CASlD"}
|
|
@@ -1,8 +1,19 @@
|
|
|
1
1
|
import { createLoopbackServer, generateNonce, generatePkcePair } from './pkce.js';
|
|
2
|
-
export const CLOUD_CODE_AUTH_URL = 'https://accounts.google.com/o/oauth2/
|
|
2
|
+
export const CLOUD_CODE_AUTH_URL = 'https://accounts.google.com/o/oauth2/auth';
|
|
3
3
|
export const CLOUD_CODE_TOKEN_URL = 'https://oauth2.googleapis.com/token';
|
|
4
4
|
export const CLOUD_CODE_LOAD_CODE_ASSIST_URL = 'https://daily-cloudcode-pa.googleapis.com/v1internal:loadCodeAssist';
|
|
5
5
|
export const CLOUD_CODE_USER_AGENT = 'antigravity/cli/1.1.10 (aidev_client; os_type=linux; arch=amd64; auth_method=consumer)';
|
|
6
|
+
export const CLOUD_CODE_CLIENT_ID = '1071006060591-tmhssin2h21lcre235vtolojh4g403ep.apps.googleusercontent.com';
|
|
7
|
+
// cloud-code-oauth-credential:start
|
|
8
|
+
export const CLOUD_CODE_CLIENT_SECRET = ['GOCSPX-', 'K58FWR486LdLJ1', 'mLB8sXC4z6qDAf'].join('');
|
|
9
|
+
// cloud-code-oauth-credential:end
|
|
10
|
+
function redactOAuthError(text, clientSecret) {
|
|
11
|
+
return text
|
|
12
|
+
.split(clientSecret)
|
|
13
|
+
.join('[redacted]')
|
|
14
|
+
.replace(/GOCSPX-[A-Za-z0-9_-]+/g, '[redacted]')
|
|
15
|
+
.replace(/(client_secret(?:=|%3D))[^&\s"']+/gi, '$1[redacted]');
|
|
16
|
+
}
|
|
6
17
|
export class CloudCodeEnrollmentProvider {
|
|
7
18
|
defaultClientId;
|
|
8
19
|
defaultClientSecret;
|
|
@@ -11,30 +22,31 @@ export class CloudCodeEnrollmentProvider {
|
|
|
11
22
|
sessions = new Map();
|
|
12
23
|
sequence = 0;
|
|
13
24
|
constructor(options = {}) {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
}
|
|
17
|
-
if (!options.clientSecret && !options.configResolver) {
|
|
18
|
-
throw new Error('CloudCodeEnrollmentProvider: clientSecret or configResolver required');
|
|
19
|
-
}
|
|
20
|
-
this.defaultClientId = options.clientId ?? '';
|
|
21
|
-
this.defaultClientSecret = options.clientSecret ?? '';
|
|
25
|
+
this.defaultClientId = options.clientId ?? CLOUD_CODE_CLIENT_ID;
|
|
26
|
+
this.defaultClientSecret = options.clientSecret ?? CLOUD_CODE_CLIENT_SECRET;
|
|
22
27
|
this.configResolver = options.configResolver;
|
|
23
28
|
this.fetchFn = options.fetchFn ?? fetch;
|
|
24
29
|
}
|
|
25
30
|
async getSecrets(configRef) {
|
|
26
|
-
|
|
31
|
+
const envSecret = process.env.GOOGLE_OAUTH_CLIENT_SECRET ??
|
|
32
|
+
process.env.GOOGLE_CLIENT_SECRET ??
|
|
33
|
+
this.defaultClientSecret;
|
|
34
|
+
if (this.configResolver) {
|
|
27
35
|
try {
|
|
28
|
-
const config = await this.configResolver.resolveConfig(configRef);
|
|
29
|
-
const clientId = typeof config.clientId === 'string'
|
|
30
|
-
|
|
36
|
+
const config = await this.configResolver.resolveConfig(configRef || 'default');
|
|
37
|
+
const clientId = typeof config.clientId === 'string' && config.clientId.trim().length > 0
|
|
38
|
+
? config.clientId
|
|
39
|
+
: this.defaultClientId;
|
|
40
|
+
const clientSecret = typeof config.clientSecret === 'string' && config.clientSecret.trim().length > 0
|
|
41
|
+
? config.clientSecret
|
|
42
|
+
: envSecret;
|
|
31
43
|
return { clientId, clientSecret };
|
|
32
44
|
}
|
|
33
45
|
catch {
|
|
34
46
|
// Fall back to default secrets if resolver fails or yields empty
|
|
35
47
|
}
|
|
36
48
|
}
|
|
37
|
-
return { clientId: this.defaultClientId, clientSecret:
|
|
49
|
+
return { clientId: this.defaultClientId, clientSecret: envSecret };
|
|
38
50
|
}
|
|
39
51
|
async start(input) {
|
|
40
52
|
this.sequence += 1;
|
|
@@ -54,7 +66,7 @@ export class CloudCodeEnrollmentProvider {
|
|
|
54
66
|
url.searchParams.set('client_id', clientId);
|
|
55
67
|
url.searchParams.set('response_type', 'code');
|
|
56
68
|
url.searchParams.set('redirect_uri', redirectUri);
|
|
57
|
-
url.searchParams.set('scope', 'https://www.googleapis.com/auth/cloud-platform https://www.googleapis.com/auth/userinfo.email');
|
|
69
|
+
url.searchParams.set('scope', 'https://www.googleapis.com/auth/cloud-platform https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/cclog https://www.googleapis.com/auth/experimentsandconfigs https://www.googleapis.com/auth/aicode openid');
|
|
58
70
|
url.searchParams.set('code_challenge', codeChallenge);
|
|
59
71
|
url.searchParams.set('code_challenge_method', 'S256');
|
|
60
72
|
url.searchParams.set('state', pkceState);
|
|
@@ -68,6 +80,7 @@ export class CloudCodeEnrollmentProvider {
|
|
|
68
80
|
pkceState,
|
|
69
81
|
redirectUri,
|
|
70
82
|
configVersion: 'v1.0.0',
|
|
83
|
+
configRef: input.configRef,
|
|
71
84
|
createdAt: new Date().toISOString(),
|
|
72
85
|
expiresAt,
|
|
73
86
|
};
|
|
@@ -104,10 +117,13 @@ export class CloudCodeEnrollmentProvider {
|
|
|
104
117
|
const meta = await this.resolve(cred);
|
|
105
118
|
return {
|
|
106
119
|
accountId: cred.accountId,
|
|
120
|
+
ownerScope: entry.state.ownerScope,
|
|
107
121
|
label: cred.accountEmail ??
|
|
108
122
|
(meta.cloudaicompanionProject
|
|
109
123
|
? `Cloud Code (${meta.cloudaicompanionProject})`
|
|
110
124
|
: 'Cloud Code Account'),
|
|
125
|
+
credential: cred,
|
|
126
|
+
metadata: meta,
|
|
111
127
|
};
|
|
112
128
|
}
|
|
113
129
|
async complete(input) {
|
|
@@ -122,26 +138,29 @@ export class CloudCodeEnrollmentProvider {
|
|
|
122
138
|
throw new Error(`Enrollment session ${input.enrollmentId} was cancelled`);
|
|
123
139
|
}
|
|
124
140
|
entry.state.consumedAt = new Date().toISOString();
|
|
125
|
-
const { clientId, clientSecret } = await this.getSecrets();
|
|
126
|
-
const
|
|
141
|
+
const { clientId, clientSecret } = await this.getSecrets(entry.state.configRef);
|
|
142
|
+
const bodyParams = {
|
|
127
143
|
grant_type: 'authorization_code',
|
|
128
144
|
code: input.code,
|
|
129
145
|
redirect_uri: entry.state.redirectUri,
|
|
130
146
|
client_id: clientId,
|
|
131
|
-
client_secret: clientSecret,
|
|
132
147
|
code_verifier: entry.state.pkceVerifier,
|
|
133
|
-
}
|
|
148
|
+
};
|
|
149
|
+
if (clientSecret && clientSecret.trim().length > 0) {
|
|
150
|
+
bodyParams.client_secret = clientSecret;
|
|
151
|
+
}
|
|
152
|
+
const body = new URLSearchParams(bodyParams);
|
|
134
153
|
const response = await this.fetchFn(CLOUD_CODE_TOKEN_URL, {
|
|
135
154
|
method: 'POST',
|
|
136
155
|
headers: {
|
|
137
|
-
'
|
|
138
|
-
|
|
156
|
+
'Content-Type': 'application/x-www-form-urlencoded',
|
|
157
|
+
Accept: 'application/json',
|
|
139
158
|
},
|
|
140
159
|
body,
|
|
141
160
|
});
|
|
142
161
|
if (!response.ok) {
|
|
143
162
|
const text = await response.text().catch(() => '');
|
|
144
|
-
throw new Error(`Cloud Code token exchange failed (${response.status}): ${text}`);
|
|
163
|
+
throw new Error(`Cloud Code token exchange failed (${response.status}): ${redactOAuthError(text, clientSecret)}`);
|
|
145
164
|
}
|
|
146
165
|
const payload = (await response.json());
|
|
147
166
|
if (!payload.access_token) {
|
|
@@ -165,6 +184,12 @@ export class CloudCodeEnrollmentProvider {
|
|
|
165
184
|
Authorization: `Bearer ${credential.accessToken}`,
|
|
166
185
|
'User-Agent': CLOUD_CODE_USER_AGENT,
|
|
167
186
|
'Content-Type': 'application/json',
|
|
187
|
+
'X-Goog-Api-Client': 'gl-node/22.0.0 antigravity/0.1.0',
|
|
188
|
+
'Client-Metadata': JSON.stringify({
|
|
189
|
+
ideType: 'ANTIGRAVITY',
|
|
190
|
+
platform: 'PLATFORM_UNSPECIFIED',
|
|
191
|
+
pluginType: 'ANTIGRAVITY',
|
|
192
|
+
}),
|
|
168
193
|
},
|
|
169
194
|
body: JSON.stringify({ metadata: { ideType: 'ANTIGRAVITY' } }),
|
|
170
195
|
});
|
|
@@ -187,12 +212,15 @@ export class CloudCodeEnrollmentProvider {
|
|
|
187
212
|
throw new Error('Cloud Code token refresh failed: invalid or missing refresh token');
|
|
188
213
|
}
|
|
189
214
|
const { clientId, clientSecret } = await this.getSecrets();
|
|
190
|
-
const
|
|
215
|
+
const bodyParams = {
|
|
191
216
|
grant_type: 'refresh_token',
|
|
192
217
|
refresh_token: refreshToken,
|
|
193
218
|
client_id: clientId,
|
|
194
|
-
|
|
195
|
-
|
|
219
|
+
};
|
|
220
|
+
if (clientSecret && clientSecret.trim().length > 0) {
|
|
221
|
+
bodyParams.client_secret = clientSecret;
|
|
222
|
+
}
|
|
223
|
+
const body = new URLSearchParams(bodyParams);
|
|
196
224
|
const response = await this.fetchFn(CLOUD_CODE_TOKEN_URL, {
|
|
197
225
|
method: 'POST',
|
|
198
226
|
headers: {
|