@providerkit/core 0.23.0 → 0.25.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.
Files changed (96) hide show
  1. package/README.md +43 -7
  2. package/dist/auth/device.d.ts +3 -2
  3. package/dist/auth/device.d.ts.map +1 -1
  4. package/dist/auth/device.js +5 -2
  5. package/dist/auth/device.js.map +1 -1
  6. package/dist/auth/flows.d.ts +5 -1
  7. package/dist/auth/flows.d.ts.map +1 -1
  8. package/dist/auth/flows.js +237 -0
  9. package/dist/auth/flows.js.map +1 -1
  10. package/dist/auth/oauth.d.ts +4 -2
  11. package/dist/auth/oauth.d.ts.map +1 -1
  12. package/dist/auth/oauth.js +4 -3
  13. package/dist/auth/oauth.js.map +1 -1
  14. package/dist/auth/with-token.d.ts +4 -1
  15. package/dist/auth/with-token.d.ts.map +1 -1
  16. package/dist/auth/with-token.js +9 -4
  17. package/dist/auth/with-token.js.map +1 -1
  18. package/dist/errors.d.ts.map +1 -1
  19. package/dist/errors.js +3 -0
  20. package/dist/errors.js.map +1 -1
  21. package/dist/gate.d.ts +29 -0
  22. package/dist/gate.d.ts.map +1 -0
  23. package/dist/gate.js +96 -0
  24. package/dist/gate.js.map +1 -0
  25. package/dist/index.d.ts +3 -0
  26. package/dist/index.d.ts.map +1 -1
  27. package/dist/index.js +3 -0
  28. package/dist/index.js.map +1 -1
  29. package/dist/key-pool.d.ts +11 -0
  30. package/dist/key-pool.d.ts.map +1 -1
  31. package/dist/key-pool.js +14 -0
  32. package/dist/key-pool.js.map +1 -1
  33. package/dist/presets.d.ts +53 -0
  34. package/dist/presets.d.ts.map +1 -1
  35. package/dist/presets.js +100 -0
  36. package/dist/presets.js.map +1 -1
  37. package/dist/providers/anthropic.d.ts +7 -0
  38. package/dist/providers/anthropic.d.ts.map +1 -1
  39. package/dist/providers/anthropic.js +3 -1
  40. package/dist/providers/anthropic.js.map +1 -1
  41. package/dist/providers/factory.d.ts +36 -0
  42. package/dist/providers/factory.d.ts.map +1 -1
  43. package/dist/providers/factory.js +208 -22
  44. package/dist/providers/factory.js.map +1 -1
  45. package/dist/providers/gemini.d.ts +17 -5
  46. package/dist/providers/gemini.d.ts.map +1 -1
  47. package/dist/providers/gemini.js +241 -119
  48. package/dist/providers/gemini.js.map +1 -1
  49. package/dist/providers/openai.d.ts +7 -0
  50. package/dist/providers/openai.d.ts.map +1 -1
  51. package/dist/providers/openai.js +7 -4
  52. package/dist/providers/openai.js.map +1 -1
  53. package/dist/providers/responses.d.ts +11 -0
  54. package/dist/providers/responses.d.ts.map +1 -1
  55. package/dist/providers/responses.js +3 -1
  56. package/dist/providers/responses.js.map +1 -1
  57. package/dist/registry.d.ts +105 -0
  58. package/dist/registry.d.ts.map +1 -0
  59. package/dist/registry.js +291 -0
  60. package/dist/registry.js.map +1 -0
  61. package/dist/schema.d.ts +27 -9
  62. package/dist/schema.d.ts.map +1 -1
  63. package/dist/schema.js +197 -62
  64. package/dist/schema.js.map +1 -1
  65. package/dist/tools.d.ts +8 -0
  66. package/dist/tools.d.ts.map +1 -1
  67. package/dist/tools.js +2 -2
  68. package/dist/tools.js.map +1 -1
  69. package/dist/turn.d.ts +55 -0
  70. package/dist/turn.d.ts.map +1 -0
  71. package/dist/turn.js +125 -0
  72. package/dist/turn.js.map +1 -0
  73. package/dist/types.d.ts +8 -22
  74. package/dist/types.d.ts.map +1 -1
  75. package/dist/types.js +0 -45
  76. package/dist/types.js.map +1 -1
  77. package/package.json +1 -1
  78. package/src/auth/device.ts +8 -4
  79. package/src/auth/flows.ts +288 -1
  80. package/src/auth/oauth.ts +8 -3
  81. package/src/auth/with-token.ts +9 -4
  82. package/src/errors.ts +3 -0
  83. package/src/gate.ts +152 -0
  84. package/src/index.ts +3 -0
  85. package/src/key-pool.ts +15 -0
  86. package/src/presets.ts +100 -0
  87. package/src/providers/anthropic.ts +10 -1
  88. package/src/providers/factory.ts +288 -34
  89. package/src/providers/gemini.ts +273 -124
  90. package/src/providers/openai.ts +15 -4
  91. package/src/providers/responses.ts +14 -1
  92. package/src/registry.ts +420 -0
  93. package/src/schema.ts +200 -72
  94. package/src/tools.ts +10 -2
  95. package/src/turn.ts +166 -0
  96. package/src/types.ts +8 -62
package/dist/types.d.ts CHANGED
@@ -51,8 +51,9 @@ export interface FilePart {
51
51
  export type ContentPart = TextPart | ImagePart | FilePart;
52
52
  /**
53
53
  * A tool the model asked to run. `arguments` is the RAW JSON string, not a
54
- * parsed object: it arrives in fragments and can be truncated mid-stream, so
55
- * assembly and validation are the consumer's job (see tools/define).
54
+ * parsed object: it arrives in fragments and can be truncated mid-stream.
55
+ * `collectTurn` joins the fragments; healing and validating them is the
56
+ * consumer's job (see tools/define).
56
57
  */
57
58
  export interface ToolCall {
58
59
  id: string;
@@ -127,7 +128,7 @@ export interface ToolDefinition {
127
128
  inputSchema: JsonObjectSchema;
128
129
  }
129
130
  export type FinishReason = "stop" | "length" | "tool_calls" | "content_filter";
130
- /** Incremental tool-call fragment, assembled by `index` by the consumer. */
131
+ /** Incremental tool-call fragment, assembled by `index`. `collectTurn` does it. */
131
132
  export interface ToolCallDelta {
132
133
  index: number;
133
134
  id?: string;
@@ -275,9 +276,10 @@ export interface StreamOptions {
275
276
  */
276
277
  jsonWithTools?: JsonWithTools;
277
278
  /**
278
- * Stable id for the conversation or job this call belongs to. Sent only to
279
- * endpoints whose preset names a `sessionHeader` (OpenCode Go routes and
280
- * caches by it); every other endpoint ignores it.
279
+ * Stable id for the conversation or job this call belongs to. Sent in the
280
+ * `sessionHeader` of endpoints that name one (OpenCode Go routes and caches
281
+ * by it), and as `prompt_cache_key` on the Responses shape. A call without
282
+ * one sends the provider's `instanceSessionId` in that header instead.
281
283
  */
282
284
  sessionId?: string;
283
285
  /**
@@ -322,22 +324,6 @@ export interface Provider {
322
324
  readonly model: string;
323
325
  createStream(messages: ChatMessage[], tools: ToolDefinition[], opts?: StreamOptions): AsyncIterable<ProviderChunk>;
324
326
  }
325
- export interface Completion {
326
- text: string;
327
- /** Present when the stream identifies the endpoint that answered. */
328
- provider?: string;
329
- reasoning: string;
330
- /** Present only where the provider sent one. See ChatMessage.reasoningDetails. */
331
- reasoningDetails?: unknown[];
332
- /** Present only where the provider sent them. See ChatMessage.reasoningItems. */
333
- reasoningItems?: ReasoningItems;
334
- usage: TokenUsage;
335
- finishReason: FinishReason | null;
336
- model: string;
337
- }
338
- /** Drain a no-tools stream into a Completion. Usage chunks are cumulative on
339
- * some providers and final-only on others: the LAST one wins. */
340
- export declare function drainStream(stream: AsyncIterable<ProviderChunk>, model: string): Promise<Completion>;
341
327
  /**
342
328
  * Prepare a history for a thinking-DISABLED turn: strip `reasoning` from every
343
329
  * assistant message.
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js CHANGED
@@ -128,51 +128,6 @@ function bracketed(text) {
128
128
  }
129
129
  return text.slice(start);
130
130
  }
131
- /** Drain a no-tools stream into a Completion. Usage chunks are cumulative on
132
- * some providers and final-only on others: the LAST one wins. */
133
- export async function drainStream(stream, model) {
134
- let text = "";
135
- let reasoning = "";
136
- // Not concatenated: this half of the record is a payload the provider owns,
137
- // and it arrives whole on one delta rather than in fragments. Dropped here,
138
- // a drained turn replays only half its own reasoning on the next round —
139
- // which is the failure `reasoningDetails` exists to prevent.
140
- let reasoningDetails;
141
- let reasoningItems;
142
- let usage = EMPTY_USAGE;
143
- let finishReason = null;
144
- let source;
145
- for await (const chunk of stream) {
146
- if (chunk.source)
147
- source = chunk.source;
148
- if (chunk.type === "delta") {
149
- if (chunk.content)
150
- text += chunk.content;
151
- if (chunk.reasoning)
152
- reasoning += chunk.reasoning;
153
- if (chunk.reasoningDetails?.length)
154
- reasoningDetails = chunk.reasoningDetails;
155
- if (chunk.reasoningItems?.items.length)
156
- reasoningItems = chunk.reasoningItems;
157
- }
158
- else if (chunk.type === "usage" && chunk.usage) {
159
- usage = chunk.usage;
160
- }
161
- else if (chunk.type === "finish" && chunk.finishReason) {
162
- finishReason = chunk.finishReason;
163
- }
164
- }
165
- return {
166
- text,
167
- reasoning,
168
- ...(reasoningDetails ? { reasoningDetails } : {}),
169
- ...(reasoningItems ? { reasoningItems } : {}),
170
- usage,
171
- finishReason,
172
- model: source?.model ?? model,
173
- ...(source ? { provider: source.provider } : {}),
174
- };
175
- }
176
131
  /**
177
132
  * Prepare a history for a thinking-DISABLED turn: strip `reasoning` from every
178
133
  * assistant message.
package/dist/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@providerkit/core",
3
- "version": "0.23.0",
3
+ "version": "0.25.0",
4
4
  "description": "The layer under your agent loop: one seam for every LLM provider, plus the failure handling you only learn in production.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -18,8 +18,9 @@ export interface DeviceEndpoint {
18
18
  clientId: string;
19
19
  /** Sent with the code request, for vendors that want scopes. */
20
20
  scope?: string;
21
- /** Extra fields on the code request only (xAI wants a `referrer`). */
22
- extra?: Record<string, string>;
21
+ /** Extra fields on the code request only (xAI wants a `referrer`, OpenCode
22
+ * Console wants `supports_org_scope: true`). */
23
+ extra?: Record<string, string | boolean>;
23
24
  encode: "form" | "json";
24
25
  }
25
26
 
@@ -51,9 +52,12 @@ export async function requestDeviceCode(
51
52
  );
52
53
  const userCode = str(body.user_code);
53
54
  const deviceCode = str(body.device_code);
54
- // The complete URL carries the code, so there is nothing to type.
55
+ // The complete URL carries the code, so there is nothing to type. OpenCode
56
+ // Console returns a path relative to its origin (`/console/device?user_code=…`),
57
+ // so resolve against `deviceUrl`.
55
58
  const verificationUrl =
56
- webUrl(str(body.verification_uri_complete)) ?? webUrl(str(body.verification_uri));
59
+ webUrl(str(body.verification_uri_complete), undefined, endpoint.deviceUrl) ??
60
+ webUrl(str(body.verification_uri), undefined, endpoint.deviceUrl);
57
61
  if (!userCode || !deviceCode || !verificationUrl) {
58
62
  throw authError(
59
63
  "device_response_invalid",
package/src/auth/flows.ts CHANGED
@@ -40,7 +40,14 @@ export interface AuthFlow {
40
40
  }
41
41
 
42
42
  export type AuthFlowId =
43
- "chatgpt" | "kimi-plan" | "grok" | "github-copilot" | "meta" | "openrouter";
43
+ | "chatgpt"
44
+ | "kimi-plan"
45
+ | "grok"
46
+ | "github-copilot"
47
+ | "meta"
48
+ | "openrouter"
49
+ | "opencode-zen"
50
+ | "antigravity";
44
51
 
45
52
  export function createAuthFlow(id: AuthFlowId, host: AuthHost): AuthFlow {
46
53
  switch (id) {
@@ -66,6 +73,10 @@ export function createAuthFlow(id: AuthFlowId, host: AuthHost): AuthFlow {
66
73
  );
67
74
  case "openrouter":
68
75
  return openrouterFlow(host);
76
+ case "opencode-zen":
77
+ return deviceFlow(host, OPENCODE_ZEN_DEVICE, opencodeZenCredential, opencodeZenRefresh(host));
78
+ case "antigravity":
79
+ return antigravityFlow(host);
69
80
  }
70
81
  }
71
82
 
@@ -518,6 +529,282 @@ function openrouterFlow(host: AuthHost): AuthFlow {
518
529
  };
519
530
  }
520
531
 
532
+ // ── OpenCode Console (Zen / Go): device code ──────────────────────────────
533
+ // Matches `opencode auth login opencode` in OpenCode v2 (`packages/core/src/plugin/provider/opencode.ts`)
534
+ // and `cc-proxy auth login opencode-zen --device`. The Console returns a relative
535
+ // `verification_uri_complete` (`/console/device?user_code=…&client_id=opencode-cli`),
536
+ // which `requestDeviceCode` resolves against `deviceUrl`.
537
+
538
+ const OPENCODE_ZEN_DEVICE: DeviceEndpoint = {
539
+ clientId: "opencode-cli",
540
+ deviceUrl: "https://opencode.ai/console/auth/device/code",
541
+ tokenUrl: "https://opencode.ai/console/auth/device/token",
542
+ extra: { supports_org_scope: true },
543
+ encode: "json",
544
+ };
545
+
546
+ function opencodeZenCredential(
547
+ body: Record<string, unknown>,
548
+ fallbackRefresh?: string,
549
+ ): Credential {
550
+ const accessToken = str(body.access_token);
551
+ if (!accessToken) {
552
+ throw authError("token_incomplete", "OpenCode Console's reply has no access token.");
553
+ }
554
+ const refreshToken = str(body.refresh_token) ?? fallbackRefresh ?? "";
555
+ const expiresIn = num(body.expires_in);
556
+ const expiresAt =
557
+ refreshToken && expiresIn !== undefined
558
+ ? Date.now() + expiresIn * 1000 - REFRESH_SKEW_MS
559
+ : NEVER;
560
+ const account = str(body.org_id) ?? accountFromToken(accessToken, "email", "sub");
561
+ return {
562
+ accessToken,
563
+ refreshToken,
564
+ expiresAt,
565
+ ...(account ? { account } : {}),
566
+ };
567
+ }
568
+
569
+ function opencodeZenRefresh(host: AuthHost): AuthFlow["refresh"] {
570
+ return async (credential) => {
571
+ if (!credential.refreshToken) return credential;
572
+ const body = await postToken(
573
+ host,
574
+ OPENCODE_ZEN_DEVICE.tokenUrl,
575
+ {
576
+ client_id: OPENCODE_ZEN_DEVICE.clientId,
577
+ grant_type: "refresh_token",
578
+ refresh_token: credential.refreshToken,
579
+ },
580
+ { encode: "json" },
581
+ );
582
+ const fresh = opencodeZenCredential(body, credential.refreshToken);
583
+ return credential.account && !fresh.account ? { ...fresh, account: credential.account } : fresh;
584
+ };
585
+ }
586
+
587
+ // ── Google Antigravity (Cloud Code Assist): PKCE + project discovery ──────
588
+ // Mirrors `cc-proxy/src/providers/antigravity.rs` and `opencodex/src/oauth/google-antigravity.ts`.
589
+ // Signs in with Google OAuth PKCE using the public Antigravity desktop client,
590
+ // then discovers the Cloud Code Assist `projectId` via `loadCodeAssist` (with
591
+ // `onboardUser` fallback for accounts without a project yet).
592
+
593
+ const ANTIGRAVITY = {
594
+ clientId: [
595
+ "1071006060591-",
596
+ "tmhssin2h21lcre235vtolojh4g403ep",
597
+ ".apps.google",
598
+ "usercontent.com",
599
+ ].join(""),
600
+ clientSecret: ["GOCS", "PX-", "K58FWR486LdL", "J1mLB8sXC4z6qDAf"].join(""),
601
+ authorizeUrl: "https://accounts.google.com/o/oauth2/v2/auth",
602
+ tokenUrl: "https://oauth2.googleapis.com/token",
603
+ redirectUri: "http://127.0.0.1:51121/callback",
604
+ prodApi: "https://cloudcode-pa.googleapis.com",
605
+ dailyApi: "https://daily-cloudcode-pa.googleapis.com",
606
+ apiVersion: "v1internal",
607
+ ideUserAgent:
608
+ "antigravity/ide/2.5.5 (os_type=windows; arch=amd64; aidev_client; auth_method=oauth)",
609
+ scopes: [
610
+ "https://www.googleapis.com/auth/cloud-platform",
611
+ "https://www.googleapis.com/auth/userinfo.email",
612
+ "https://www.googleapis.com/auth/userinfo.profile",
613
+ "https://www.googleapis.com/auth/cclog",
614
+ "https://www.googleapis.com/auth/experimentsandconfigs",
615
+ ].join(" "),
616
+ onboardAttempts: 5,
617
+ onboardPollMs: 2_000,
618
+ } as const;
619
+
620
+ /** The authorize URL to open for Google Antigravity. Exported so tests can pin the exact params. */
621
+ export function antigravityAuthorizeUrl(challenge: string, state: string): string {
622
+ const params = new URLSearchParams({
623
+ response_type: "code",
624
+ client_id: ANTIGRAVITY.clientId,
625
+ redirect_uri: ANTIGRAVITY.redirectUri,
626
+ scope: ANTIGRAVITY.scopes,
627
+ code_challenge: challenge,
628
+ code_challenge_method: "S256",
629
+ access_type: "offline",
630
+ prompt: "consent",
631
+ state,
632
+ });
633
+ return `${ANTIGRAVITY.authorizeUrl}?${params.toString()}`;
634
+ }
635
+
636
+ function extractAntigravityProjectId(data: Record<string, unknown>): string | undefined {
637
+ for (const key of ["cloudaicompanionProject", "projectId", "project"]) {
638
+ const val = data[key];
639
+ const direct = str(val);
640
+ if (direct) return direct;
641
+ const nested = str(asRecord(val).id);
642
+ if (nested) return nested;
643
+ }
644
+ return undefined;
645
+ }
646
+
647
+ /** Discover the Cloud Code Assist project for an Antigravity access token. */
648
+ export async function discoverAntigravityProject(
649
+ host: AuthHost,
650
+ accessToken: string,
651
+ signal?: AbortSignal,
652
+ ): Promise<string | undefined> {
653
+ const headers = {
654
+ Authorization: `Bearer ${accessToken}`,
655
+ Accept: "application/json",
656
+ "Content-Type": "application/json",
657
+ "User-Agent": ANTIGRAVITY.ideUserAgent,
658
+ };
659
+ try {
660
+ const loadRes = await authFetch(
661
+ host,
662
+ `${ANTIGRAVITY.prodApi}/${ANTIGRAVITY.apiVersion}:loadCodeAssist`,
663
+ {
664
+ method: "POST",
665
+ headers,
666
+ body: JSON.stringify({ metadata: { ideType: "ANTIGRAVITY" } }),
667
+ ...(signal ? { signal } : {}),
668
+ },
669
+ );
670
+ if (loadRes.ok) {
671
+ const payload = asRecord(parseJson(await loadRes.text().catch(() => "")));
672
+ const found = extractAntigravityProjectId(payload);
673
+ if (found) return found;
674
+ }
675
+ } catch (err) {
676
+ if (signal?.aborted) throw err;
677
+ }
678
+
679
+ for (let attempt = 0; attempt < ANTIGRAVITY.onboardAttempts; attempt++) {
680
+ if (signal?.aborted) throw signal.reason ?? new Error("Aborted");
681
+ try {
682
+ const onboardRes = await authFetch(
683
+ host,
684
+ `${ANTIGRAVITY.dailyApi}/${ANTIGRAVITY.apiVersion}:onboardUser`,
685
+ {
686
+ method: "POST",
687
+ headers,
688
+ body: JSON.stringify({
689
+ tier_id: "free-tier",
690
+ metadata: {
691
+ ide_type: "ANTIGRAVITY",
692
+ ide_name: "antigravity",
693
+ ide_version: "2.5.5",
694
+ },
695
+ }),
696
+ ...(signal ? { signal } : {}),
697
+ },
698
+ );
699
+ if (onboardRes.ok) {
700
+ const payload = asRecord(parseJson(await onboardRes.text().catch(() => "")));
701
+ if (payload.done === true) {
702
+ const found = extractAntigravityProjectId(asRecord(payload.response));
703
+ if (found) return found;
704
+ }
705
+ } else if (onboardRes.status !== 429 && onboardRes.status < 500) {
706
+ return undefined;
707
+ }
708
+ } catch (err) {
709
+ if (signal?.aborted) throw err;
710
+ }
711
+ if (attempt + 1 < ANTIGRAVITY.onboardAttempts) {
712
+ await waitMs(ANTIGRAVITY.onboardPollMs, signal);
713
+ }
714
+ }
715
+ return undefined;
716
+ }
717
+
718
+ function waitMs(ms: number, signal?: AbortSignal): Promise<void> {
719
+ return new Promise((resolve, reject) => {
720
+ if (signal?.aborted) {
721
+ reject(signal.reason ?? new Error("Aborted"));
722
+ return;
723
+ }
724
+ const timer = setTimeout(() => {
725
+ signal?.removeEventListener("abort", onAbort);
726
+ resolve();
727
+ }, ms);
728
+ const onAbort = () => {
729
+ clearTimeout(timer);
730
+ reject(signal?.reason ?? new Error("Aborted"));
731
+ };
732
+ signal?.addEventListener("abort", onAbort, { once: true });
733
+ });
734
+ }
735
+
736
+ function antigravityFlow(host: AuthHost): AuthFlow {
737
+ const tokenRequest = (params: Record<string, string>) =>
738
+ postToken(
739
+ host,
740
+ ANTIGRAVITY.tokenUrl,
741
+ {
742
+ client_id: ANTIGRAVITY.clientId,
743
+ client_secret: ANTIGRAVITY.clientSecret,
744
+ ...params,
745
+ },
746
+ { encode: "form" },
747
+ );
748
+
749
+ return {
750
+ async signIn(signal, onPrompt) {
751
+ const { verifier, challenge } = await generatePKCE();
752
+ const state = randomState();
753
+ const authorizeUrl = antigravityAuthorizeUrl(challenge, state);
754
+ onPrompt({ url: authorizeUrl });
755
+ const code = await host.captureRedirect({
756
+ authorizeUrl,
757
+ redirectUri: ANTIGRAVITY.redirectUri,
758
+ state,
759
+ signal,
760
+ });
761
+ const body = await tokenRequest({
762
+ grant_type: "authorization_code",
763
+ code,
764
+ redirect_uri: ANTIGRAVITY.redirectUri,
765
+ code_verifier: verifier,
766
+ });
767
+ const credential = antigravityCredential(body);
768
+ const projectId = await discoverAntigravityProject(host, credential.accessToken, signal);
769
+ if (!projectId) {
770
+ throw authError(
771
+ "setup_required",
772
+ "Antigravity login could not discover a Cloud Code Assist project for this Google account.",
773
+ );
774
+ }
775
+ return { ...credential, projectId };
776
+ },
777
+ async refresh(credential) {
778
+ const body = await tokenRequest({
779
+ grant_type: "refresh_token",
780
+ refresh_token: credential.refreshToken,
781
+ });
782
+ const fresh = antigravityCredential(body, credential.refreshToken, credential.account);
783
+ const projectId =
784
+ credential.projectId ??
785
+ (await discoverAntigravityProject(host, fresh.accessToken).catch(() => undefined));
786
+ return projectId ? { ...fresh, projectId } : fresh;
787
+ },
788
+ };
789
+ }
790
+
791
+ function antigravityCredential(
792
+ body: Record<string, unknown>,
793
+ fallbackRefresh?: string,
794
+ fallbackAccount?: string,
795
+ ): Credential {
796
+ const credential = toCredential(
797
+ { ...body, expires_in: num(body.expires_in) ?? GROK_DEFAULT_LIFETIME_SEC },
798
+ fallbackRefresh,
799
+ );
800
+ const idToken = str(body.id_token);
801
+ const account =
802
+ accountFromToken(idToken, "email") ??
803
+ accountFromToken(credential.accessToken, "email") ??
804
+ fallbackAccount;
805
+ return account ? { ...credential, account } : credential;
806
+ }
807
+
521
808
  function parseJson(text: string): unknown {
522
809
  try {
523
810
  return JSON.parse(text);
package/src/auth/oauth.ts CHANGED
@@ -42,6 +42,8 @@ export interface Credential {
42
42
  account?: string;
43
43
  /** ChatGPT only: send it as the `ChatGPT-Account-Id` header. */
44
44
  chatgptAccountId?: string;
45
+ /** Google Antigravity only: the Cloud Code Assist project id for the envelope. */
46
+ projectId?: string;
45
47
  /** Set when the vendor gives each account its own host (Copilot). */
46
48
  baseUrl?: string;
47
49
  }
@@ -137,17 +139,19 @@ function toBase64Url(bytes: Uint8Array): string {
137
139
  export async function postToken(
138
140
  host: AuthHost,
139
141
  url: string,
140
- params: Record<string, string>,
142
+ params: Record<string, string | boolean>,
141
143
  opts: { encode: "json" | "form"; allowErrorBody?: boolean },
142
144
  ): Promise<Record<string, unknown>> {
143
145
  const json = opts.encode === "json";
146
+ const formEntries = () =>
147
+ Object.entries(params).map(([k, v]): [string, string] => [k, String(v)]);
144
148
  const res = await authFetch(host, url, {
145
149
  method: "POST",
146
150
  headers: {
147
151
  "Content-Type": json ? "application/json" : "application/x-www-form-urlencoded",
148
152
  Accept: "application/json",
149
153
  },
150
- body: json ? JSON.stringify(params) : new URLSearchParams(params).toString(),
154
+ body: json ? JSON.stringify(params) : new URLSearchParams(formEntries()).toString(),
151
155
  });
152
156
  const text = await res.text().catch(() => "");
153
157
  const record = asRecord(safeJson(text));
@@ -237,10 +241,11 @@ export function accountFromToken(
237
241
  export function webUrl(
238
242
  value: string | undefined,
239
243
  protocols = ["https:", "http:"],
244
+ base?: string,
240
245
  ): string | undefined {
241
246
  if (!value) return undefined;
242
247
  try {
243
- const url = new URL(value);
248
+ const url = base ? new URL(value, base) : new URL(value);
244
249
  return protocols.includes(url.protocol) ? url.href : undefined;
245
250
  } catch {
246
251
  return undefined;
@@ -24,7 +24,10 @@ export type TokenAuth = Pick<PresetProviderConfig, "apiKey" | "baseUrl" | "heade
24
24
  * factory. It gets the access token as `apiKey`, the credential's own host as
25
25
  * `baseUrl` (Copilot gives each plan its own) and its `ChatGPT-Account-Id`
26
26
  * header, which the Codex backend refuses the request without. To add headers
27
- * of your own, merge them with `auth.headers` rather than replacing them.
27
+ * of your own, merge them with `auth.headers` rather than replacing them. On
28
+ * a preset that sends a session id (`chatgpt`), pass `instanceSessionId` too:
29
+ * a provider built per call mints a new id per call, and the backend's prompt
30
+ * cache misses on every one.
28
31
  *
29
32
  * A 401 before any output renews the token and replays the call once: a token
30
33
  * can be refused before its expiry, and without this the caller sees an auth
@@ -68,12 +71,14 @@ export function withToken<C extends Credential>(
68
71
  }
69
72
 
70
73
  function authOf(credential: Credential): TokenAuth {
74
+ const headers: Record<string, string> = {
75
+ ...(credential.chatgptAccountId ? { "ChatGPT-Account-Id": credential.chatgptAccountId } : {}),
76
+ ...(credential.projectId ? { "x-antigravity-project": credential.projectId } : {}),
77
+ };
71
78
  return {
72
79
  apiKey: credential.accessToken,
73
80
  ...(credential.baseUrl ? { baseUrl: credential.baseUrl } : {}),
74
- ...(credential.chatgptAccountId
75
- ? { headers: { "ChatGPT-Account-Id": credential.chatgptAccountId } }
76
- : {}),
81
+ ...(Object.keys(headers).length > 0 ? { headers } : {}),
77
82
  };
78
83
  }
79
84
 
package/src/errors.ts CHANGED
@@ -349,6 +349,9 @@ const CONTEXT_PATTERNS: readonly RegExp[] = [
349
349
  // shipped the same two patterns for the same reason (0.1.51).
350
350
  /model_max_prompt_tokens_exceeded/i,
351
351
  /prompt token count of \d+ exceeds the limit/i,
352
+ // Gemini: "The input token count exceeds the maximum number of tokens allowed 1048576."
353
+ // The generic pattern below stops at "maximum number", so this read as `invalid`.
354
+ /input token count exceeds the maximum number of tokens/i,
352
355
  // Scoped to the thing that overflowed: a bare "exceeds the maximum" also
353
356
  // covers image counts and per-minute token rates, which compaction can't fix.
354
357
  /exceeds? the (?:model'?s? )?maximum (?:input |prompt |context )?(?:tokens?|length|context)/i,