opencode-antigravity-auth-mf 1.3.0-1

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 (195) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +630 -0
  3. package/dist/index.d.ts +4 -0
  4. package/dist/index.d.ts.map +1 -0
  5. package/dist/index.js +3 -0
  6. package/dist/index.js.map +1 -0
  7. package/dist/src/antigravity/oauth.d.ts +31 -0
  8. package/dist/src/antigravity/oauth.d.ts.map +1 -0
  9. package/dist/src/antigravity/oauth.js +168 -0
  10. package/dist/src/antigravity/oauth.js.map +1 -0
  11. package/dist/src/constants.d.ts +99 -0
  12. package/dist/src/constants.d.ts.map +1 -0
  13. package/dist/src/constants.js +135 -0
  14. package/dist/src/constants.js.map +1 -0
  15. package/dist/src/hooks/auto-update-checker/cache.d.ts +3 -0
  16. package/dist/src/hooks/auto-update-checker/cache.d.ts.map +1 -0
  17. package/dist/src/hooks/auto-update-checker/cache.js +71 -0
  18. package/dist/src/hooks/auto-update-checker/cache.js.map +1 -0
  19. package/dist/src/hooks/auto-update-checker/checker.d.ts +16 -0
  20. package/dist/src/hooks/auto-update-checker/checker.d.ts.map +1 -0
  21. package/dist/src/hooks/auto-update-checker/checker.js +237 -0
  22. package/dist/src/hooks/auto-update-checker/checker.js.map +1 -0
  23. package/dist/src/hooks/auto-update-checker/constants.d.ts +9 -0
  24. package/dist/src/hooks/auto-update-checker/constants.d.ts.map +1 -0
  25. package/dist/src/hooks/auto-update-checker/constants.js +23 -0
  26. package/dist/src/hooks/auto-update-checker/constants.js.map +1 -0
  27. package/dist/src/hooks/auto-update-checker/index.d.ts +34 -0
  28. package/dist/src/hooks/auto-update-checker/index.d.ts.map +1 -0
  29. package/dist/src/hooks/auto-update-checker/index.js +125 -0
  30. package/dist/src/hooks/auto-update-checker/index.js.map +1 -0
  31. package/dist/src/hooks/auto-update-checker/types.d.ts +25 -0
  32. package/dist/src/hooks/auto-update-checker/types.d.ts.map +1 -0
  33. package/dist/src/hooks/auto-update-checker/types.js +1 -0
  34. package/dist/src/hooks/auto-update-checker/types.js.map +1 -0
  35. package/dist/src/plugin/accounts.d.ts +86 -0
  36. package/dist/src/plugin/accounts.d.ts.map +1 -0
  37. package/dist/src/plugin/accounts.js +609 -0
  38. package/dist/src/plugin/accounts.js.map +1 -0
  39. package/dist/src/plugin/auth.d.ts +21 -0
  40. package/dist/src/plugin/auth.d.ts.map +1 -0
  41. package/dist/src/plugin/auth.js +46 -0
  42. package/dist/src/plugin/auth.js.map +1 -0
  43. package/dist/src/plugin/cache/index.d.ts +5 -0
  44. package/dist/src/plugin/cache/index.d.ts.map +1 -0
  45. package/dist/src/plugin/cache/index.js +5 -0
  46. package/dist/src/plugin/cache/index.js.map +1 -0
  47. package/dist/src/plugin/cache/signature-cache.d.ts +111 -0
  48. package/dist/src/plugin/cache/signature-cache.d.ts.map +1 -0
  49. package/dist/src/plugin/cache/signature-cache.js +375 -0
  50. package/dist/src/plugin/cache/signature-cache.js.map +1 -0
  51. package/dist/src/plugin/cache.d.ts +44 -0
  52. package/dist/src/plugin/cache.d.ts.map +1 -0
  53. package/dist/src/plugin/cache.js +200 -0
  54. package/dist/src/plugin/cache.js.map +1 -0
  55. package/dist/src/plugin/cli.d.ts +19 -0
  56. package/dist/src/plugin/cli.d.ts.map +1 -0
  57. package/dist/src/plugin/cli.js +59 -0
  58. package/dist/src/plugin/cli.js.map +1 -0
  59. package/dist/src/plugin/config/index.d.ts +16 -0
  60. package/dist/src/plugin/config/index.d.ts.map +1 -0
  61. package/dist/src/plugin/config/index.js +16 -0
  62. package/dist/src/plugin/config/index.js.map +1 -0
  63. package/dist/src/plugin/config/loader.d.ts +37 -0
  64. package/dist/src/plugin/config/loader.d.ts.map +1 -0
  65. package/dist/src/plugin/config/loader.js +206 -0
  66. package/dist/src/plugin/config/loader.js.map +1 -0
  67. package/dist/src/plugin/config/schema.d.ts +411 -0
  68. package/dist/src/plugin/config/schema.d.ts.map +1 -0
  69. package/dist/src/plugin/config/schema.js +339 -0
  70. package/dist/src/plugin/config/schema.js.map +1 -0
  71. package/dist/src/plugin/core/streaming/index.d.ts +3 -0
  72. package/dist/src/plugin/core/streaming/index.d.ts.map +1 -0
  73. package/dist/src/plugin/core/streaming/index.js +3 -0
  74. package/dist/src/plugin/core/streaming/index.js.map +1 -0
  75. package/dist/src/plugin/core/streaming/transformer.d.ts +10 -0
  76. package/dist/src/plugin/core/streaming/transformer.d.ts.map +1 -0
  77. package/dist/src/plugin/core/streaming/transformer.js +255 -0
  78. package/dist/src/plugin/core/streaming/transformer.js.map +1 -0
  79. package/dist/src/plugin/core/streaming/types.d.ts +35 -0
  80. package/dist/src/plugin/core/streaming/types.d.ts.map +1 -0
  81. package/dist/src/plugin/core/streaming/types.js +1 -0
  82. package/dist/src/plugin/core/streaming/types.js.map +1 -0
  83. package/dist/src/plugin/debug.d.ts +68 -0
  84. package/dist/src/plugin/debug.d.ts.map +1 -0
  85. package/dist/src/plugin/debug.js +325 -0
  86. package/dist/src/plugin/debug.js.map +1 -0
  87. package/dist/src/plugin/errors.d.ts +28 -0
  88. package/dist/src/plugin/errors.d.ts.map +1 -0
  89. package/dist/src/plugin/errors.js +42 -0
  90. package/dist/src/plugin/errors.js.map +1 -0
  91. package/dist/src/plugin/image-saver.d.ts +25 -0
  92. package/dist/src/plugin/image-saver.d.ts.map +1 -0
  93. package/dist/src/plugin/image-saver.js +86 -0
  94. package/dist/src/plugin/image-saver.js.map +1 -0
  95. package/dist/src/plugin/logger.d.ts +54 -0
  96. package/dist/src/plugin/logger.d.ts.map +1 -0
  97. package/dist/src/plugin/logger.js +120 -0
  98. package/dist/src/plugin/logger.js.map +1 -0
  99. package/dist/src/plugin/project.d.ts +33 -0
  100. package/dist/src/plugin/project.d.ts.map +1 -0
  101. package/dist/src/plugin/project.js +234 -0
  102. package/dist/src/plugin/project.js.map +1 -0
  103. package/dist/src/plugin/recovery/constants.d.ts +22 -0
  104. package/dist/src/plugin/recovery/constants.d.ts.map +1 -0
  105. package/dist/src/plugin/recovery/constants.js +43 -0
  106. package/dist/src/plugin/recovery/constants.js.map +1 -0
  107. package/dist/src/plugin/recovery/index.d.ts +12 -0
  108. package/dist/src/plugin/recovery/index.d.ts.map +1 -0
  109. package/dist/src/plugin/recovery/index.js +12 -0
  110. package/dist/src/plugin/recovery/index.js.map +1 -0
  111. package/dist/src/plugin/recovery/storage.d.ts +24 -0
  112. package/dist/src/plugin/recovery/storage.d.ts.map +1 -0
  113. package/dist/src/plugin/recovery/storage.js +354 -0
  114. package/dist/src/plugin/recovery/storage.js.map +1 -0
  115. package/dist/src/plugin/recovery/types.d.ts +116 -0
  116. package/dist/src/plugin/recovery/types.d.ts.map +1 -0
  117. package/dist/src/plugin/recovery/types.js +6 -0
  118. package/dist/src/plugin/recovery/types.js.map +1 -0
  119. package/dist/src/plugin/recovery.d.ts +61 -0
  120. package/dist/src/plugin/recovery.d.ts.map +1 -0
  121. package/dist/src/plugin/recovery.js +376 -0
  122. package/dist/src/plugin/recovery.js.map +1 -0
  123. package/dist/src/plugin/refresh-queue.d.ts +101 -0
  124. package/dist/src/plugin/refresh-queue.d.ts.map +1 -0
  125. package/dist/src/plugin/refresh-queue.js +244 -0
  126. package/dist/src/plugin/refresh-queue.js.map +1 -0
  127. package/dist/src/plugin/request-helpers.d.ts +278 -0
  128. package/dist/src/plugin/request-helpers.d.ts.map +1 -0
  129. package/dist/src/plugin/request-helpers.js +2268 -0
  130. package/dist/src/plugin/request-helpers.js.map +1 -0
  131. package/dist/src/plugin/request.d.ts +91 -0
  132. package/dist/src/plugin/request.d.ts.map +1 -0
  133. package/dist/src/plugin/request.js +1302 -0
  134. package/dist/src/plugin/request.js.map +1 -0
  135. package/dist/src/plugin/rotation.d.ts +168 -0
  136. package/dist/src/plugin/rotation.d.ts.map +1 -0
  137. package/dist/src/plugin/rotation.js +302 -0
  138. package/dist/src/plugin/rotation.js.map +1 -0
  139. package/dist/src/plugin/server.d.ts +23 -0
  140. package/dist/src/plugin/server.d.ts.map +1 -0
  141. package/dist/src/plugin/server.js +324 -0
  142. package/dist/src/plugin/server.js.map +1 -0
  143. package/dist/src/plugin/storage.d.ts +92 -0
  144. package/dist/src/plugin/storage.d.ts.map +1 -0
  145. package/dist/src/plugin/storage.js +417 -0
  146. package/dist/src/plugin/storage.js.map +1 -0
  147. package/dist/src/plugin/stores/signature-store.d.ts +5 -0
  148. package/dist/src/plugin/stores/signature-store.d.ts.map +1 -0
  149. package/dist/src/plugin/stores/signature-store.js +25 -0
  150. package/dist/src/plugin/stores/signature-store.js.map +1 -0
  151. package/dist/src/plugin/thinking-recovery.d.ts +90 -0
  152. package/dist/src/plugin/thinking-recovery.d.ts.map +1 -0
  153. package/dist/src/plugin/thinking-recovery.js +316 -0
  154. package/dist/src/plugin/thinking-recovery.js.map +1 -0
  155. package/dist/src/plugin/token.d.ts +19 -0
  156. package/dist/src/plugin/token.d.ts.map +1 -0
  157. package/dist/src/plugin/token.js +128 -0
  158. package/dist/src/plugin/token.js.map +1 -0
  159. package/dist/src/plugin/transform/claude.d.ts +80 -0
  160. package/dist/src/plugin/transform/claude.d.ts.map +1 -0
  161. package/dist/src/plugin/transform/claude.js +265 -0
  162. package/dist/src/plugin/transform/claude.js.map +1 -0
  163. package/dist/src/plugin/transform/cross-model-sanitizer.d.ts +35 -0
  164. package/dist/src/plugin/transform/cross-model-sanitizer.d.ts.map +1 -0
  165. package/dist/src/plugin/transform/cross-model-sanitizer.js +225 -0
  166. package/dist/src/plugin/transform/cross-model-sanitizer.js.map +1 -0
  167. package/dist/src/plugin/transform/gemini.d.ts +112 -0
  168. package/dist/src/plugin/transform/gemini.d.ts.map +1 -0
  169. package/dist/src/plugin/transform/gemini.js +409 -0
  170. package/dist/src/plugin/transform/gemini.js.map +1 -0
  171. package/dist/src/plugin/transform/index.d.ts +15 -0
  172. package/dist/src/plugin/transform/index.d.ts.map +1 -0
  173. package/dist/src/plugin/transform/index.js +14 -0
  174. package/dist/src/plugin/transform/index.js.map +1 -0
  175. package/dist/src/plugin/transform/model-resolver.d.ts +101 -0
  176. package/dist/src/plugin/transform/model-resolver.d.ts.map +1 -0
  177. package/dist/src/plugin/transform/model-resolver.js +356 -0
  178. package/dist/src/plugin/transform/model-resolver.js.map +1 -0
  179. package/dist/src/plugin/transform/types.d.ts +106 -0
  180. package/dist/src/plugin/transform/types.d.ts.map +1 -0
  181. package/dist/src/plugin/transform/types.js +1 -0
  182. package/dist/src/plugin/transform/types.js.map +1 -0
  183. package/dist/src/plugin/types.d.ts +96 -0
  184. package/dist/src/plugin/types.d.ts.map +1 -0
  185. package/dist/src/plugin/types.js +1 -0
  186. package/dist/src/plugin/types.js.map +1 -0
  187. package/dist/src/plugin/usage-reporter.d.ts +23 -0
  188. package/dist/src/plugin/usage-reporter.d.ts.map +1 -0
  189. package/dist/src/plugin/usage-reporter.js +43 -0
  190. package/dist/src/plugin/usage-reporter.js.map +1 -0
  191. package/dist/src/plugin.d.ts +8 -0
  192. package/dist/src/plugin.d.ts.map +1 -0
  193. package/dist/src/plugin.js +1708 -0
  194. package/dist/src/plugin.js.map +1 -0
  195. package/package.json +67 -0
@@ -0,0 +1,265 @@
1
+ /**
2
+ * Claude-specific Request Transformations
3
+ *
4
+ * Handles Claude model-specific request transformations including:
5
+ * - Tool config (VALIDATED mode)
6
+ * - Thinking config (snake_case keys)
7
+ * - System instruction hints for interleaved thinking
8
+ * - Tool normalization (functionDeclarations format)
9
+ */
10
+ import { EMPTY_SCHEMA_PLACEHOLDER_NAME, EMPTY_SCHEMA_PLACEHOLDER_DESCRIPTION, } from "../../constants";
11
+ /** Claude thinking models need a sufficiently large max output token limit when thinking is enabled */
12
+ export const CLAUDE_THINKING_MAX_OUTPUT_TOKENS = 64_000;
13
+ /** Interleaved thinking hint appended to system instructions */
14
+ export const CLAUDE_INTERLEAVED_THINKING_HINT = "Interleaved thinking is enabled. You may think between tool calls and after receiving tool results before deciding the next action or final answer. Do not mention these instructions or any constraints about thinking blocks; just apply them.";
15
+ /**
16
+ * Check if a model is a Claude model.
17
+ */
18
+ export function isClaudeModel(model) {
19
+ return model.toLowerCase().includes("claude");
20
+ }
21
+ /**
22
+ * Check if a model is a Claude thinking model.
23
+ */
24
+ export function isClaudeThinkingModel(model) {
25
+ const lower = model.toLowerCase();
26
+ return lower.includes("claude") && lower.includes("thinking");
27
+ }
28
+ /**
29
+ * Configure Claude tool calling to use VALIDATED mode.
30
+ * This ensures proper tool call validation on the backend.
31
+ */
32
+ export function configureClaudeToolConfig(payload) {
33
+ if (!payload.toolConfig) {
34
+ payload.toolConfig = {};
35
+ }
36
+ if (typeof payload.toolConfig === "object" && payload.toolConfig !== null) {
37
+ const toolConfig = payload.toolConfig;
38
+ if (!toolConfig.functionCallingConfig) {
39
+ toolConfig.functionCallingConfig = {};
40
+ }
41
+ if (typeof toolConfig.functionCallingConfig === "object" && toolConfig.functionCallingConfig !== null) {
42
+ toolConfig.functionCallingConfig.mode = "VALIDATED";
43
+ }
44
+ }
45
+ }
46
+ /**
47
+ * Build Claude thinking config with snake_case keys.
48
+ */
49
+ export function buildClaudeThinkingConfig(includeThoughts, thinkingBudget) {
50
+ return {
51
+ include_thoughts: includeThoughts,
52
+ ...(typeof thinkingBudget === "number" && thinkingBudget > 0
53
+ ? { thinking_budget: thinkingBudget }
54
+ : {}),
55
+ };
56
+ }
57
+ /**
58
+ * Ensure maxOutputTokens is sufficient for Claude thinking models.
59
+ * If thinking budget is set, max output must be larger than the budget.
60
+ */
61
+ export function ensureClaudeMaxOutputTokens(generationConfig, thinkingBudget) {
62
+ const currentMax = (generationConfig.maxOutputTokens ?? generationConfig.max_output_tokens);
63
+ if (!currentMax || currentMax <= thinkingBudget) {
64
+ generationConfig.maxOutputTokens = CLAUDE_THINKING_MAX_OUTPUT_TOKENS;
65
+ if (generationConfig.max_output_tokens !== undefined) {
66
+ delete generationConfig.max_output_tokens;
67
+ }
68
+ }
69
+ }
70
+ /**
71
+ * Append interleaved thinking hint to system instruction.
72
+ * Handles various system instruction formats (string, object with parts array).
73
+ */
74
+ export function appendClaudeThinkingHint(payload, hint = CLAUDE_INTERLEAVED_THINKING_HINT) {
75
+ const existing = payload.systemInstruction;
76
+ if (typeof existing === "string") {
77
+ payload.systemInstruction = existing.trim().length > 0 ? `${existing}\n\n${hint}` : hint;
78
+ }
79
+ else if (existing && typeof existing === "object") {
80
+ const sys = existing;
81
+ const partsValue = sys.parts;
82
+ if (Array.isArray(partsValue)) {
83
+ const parts = partsValue;
84
+ let appended = false;
85
+ // Find the last text part and append to it
86
+ for (let i = parts.length - 1; i >= 0; i--) {
87
+ const part = parts[i];
88
+ if (part && typeof part === "object") {
89
+ const partRecord = part;
90
+ const text = partRecord.text;
91
+ if (typeof text === "string") {
92
+ partRecord.text = `${text}\n\n${hint}`;
93
+ appended = true;
94
+ break;
95
+ }
96
+ }
97
+ }
98
+ if (!appended) {
99
+ parts.push({ text: hint });
100
+ }
101
+ }
102
+ else {
103
+ sys.parts = [{ text: hint }];
104
+ }
105
+ payload.systemInstruction = sys;
106
+ }
107
+ else if (Array.isArray(payload.contents)) {
108
+ // No existing system instruction, create one
109
+ payload.systemInstruction = { parts: [{ text: hint }] };
110
+ }
111
+ }
112
+ /**
113
+ * Normalize tools for Claude models.
114
+ * Converts various tool formats to functionDeclarations format.
115
+ *
116
+ * @returns Debug info about tool normalization
117
+ */
118
+ export function normalizeClaudeTools(payload, cleanJSONSchema) {
119
+ let toolDebugMissing = 0;
120
+ const toolDebugSummaries = [];
121
+ if (!Array.isArray(payload.tools)) {
122
+ return { toolDebugMissing, toolDebugSummaries };
123
+ }
124
+ const functionDeclarations = [];
125
+ const passthroughTools = [];
126
+ const normalizeSchema = (schema) => {
127
+ const createPlaceholderSchema = (base = {}) => ({
128
+ ...base,
129
+ type: "object",
130
+ properties: {
131
+ [EMPTY_SCHEMA_PLACEHOLDER_NAME]: {
132
+ type: "boolean",
133
+ description: EMPTY_SCHEMA_PLACEHOLDER_DESCRIPTION,
134
+ },
135
+ },
136
+ required: [EMPTY_SCHEMA_PLACEHOLDER_NAME],
137
+ });
138
+ if (!schema || typeof schema !== "object" || Array.isArray(schema)) {
139
+ toolDebugMissing += 1;
140
+ return createPlaceholderSchema();
141
+ }
142
+ const cleaned = cleanJSONSchema(schema);
143
+ if (!cleaned || typeof cleaned !== "object" || Array.isArray(cleaned)) {
144
+ toolDebugMissing += 1;
145
+ return createPlaceholderSchema();
146
+ }
147
+ // Claude VALIDATED mode requires tool parameters to be an object schema
148
+ // with at least one property.
149
+ const hasProperties = cleaned.properties &&
150
+ typeof cleaned.properties === "object" &&
151
+ Object.keys(cleaned.properties).length > 0;
152
+ cleaned.type = "object";
153
+ if (!hasProperties) {
154
+ cleaned.properties = {
155
+ _placeholder: {
156
+ type: "boolean",
157
+ description: "Placeholder. Always pass true.",
158
+ },
159
+ };
160
+ cleaned.required = Array.isArray(cleaned.required)
161
+ ? Array.from(new Set([...cleaned.required, "_placeholder"]))
162
+ : ["_placeholder"];
163
+ }
164
+ return cleaned;
165
+ };
166
+ payload.tools.forEach((tool) => {
167
+ const t = tool;
168
+ const pushDeclaration = (decl, source) => {
169
+ const schema = decl?.parameters ||
170
+ decl?.parametersJsonSchema ||
171
+ decl?.input_schema ||
172
+ decl?.inputSchema ||
173
+ t.parameters ||
174
+ t.parametersJsonSchema ||
175
+ t.input_schema ||
176
+ t.inputSchema ||
177
+ t.function?.parameters ||
178
+ t.function?.parametersJsonSchema ||
179
+ t.function?.input_schema ||
180
+ t.function?.inputSchema ||
181
+ t.custom?.parameters ||
182
+ t.custom?.parametersJsonSchema ||
183
+ t.custom?.input_schema;
184
+ let name = decl?.name ||
185
+ t.name ||
186
+ t.function?.name ||
187
+ t.custom?.name ||
188
+ `tool-${functionDeclarations.length}`;
189
+ // Sanitize tool name: must be alphanumeric with underscores, no special chars
190
+ name = String(name).replace(/[^a-zA-Z0-9_-]/g, "_").slice(0, 64);
191
+ const description = decl?.description ||
192
+ t.description ||
193
+ t.function?.description ||
194
+ t.custom?.description ||
195
+ "";
196
+ functionDeclarations.push({
197
+ name,
198
+ description: String(description || ""),
199
+ parameters: normalizeSchema(schema),
200
+ });
201
+ toolDebugSummaries.push(`decl=${name},src=${source},hasSchema=${schema ? "y" : "n"}`);
202
+ };
203
+ // Check for functionDeclarations array first
204
+ if (Array.isArray(t.functionDeclarations) && t.functionDeclarations.length > 0) {
205
+ t.functionDeclarations.forEach((decl) => pushDeclaration(decl, "functionDeclarations"));
206
+ return;
207
+ }
208
+ // Fall back to function/custom style definitions
209
+ if (t.function || t.custom || t.parameters || t.input_schema || t.inputSchema) {
210
+ pushDeclaration(t.function ??
211
+ t.custom ??
212
+ t, "function/custom");
213
+ return;
214
+ }
215
+ // Preserve any non-function tool entries (e.g., codeExecution) untouched
216
+ passthroughTools.push(tool);
217
+ });
218
+ const finalTools = [];
219
+ if (functionDeclarations.length > 0) {
220
+ finalTools.push({ functionDeclarations });
221
+ }
222
+ payload.tools = finalTools.concat(passthroughTools);
223
+ return { toolDebugMissing, toolDebugSummaries };
224
+ }
225
+ /**
226
+ * Convert snake_case stop_sequences to camelCase stopSequences.
227
+ */
228
+ export function convertStopSequences(generationConfig) {
229
+ if (Array.isArray(generationConfig.stop_sequences)) {
230
+ generationConfig.stopSequences = generationConfig.stop_sequences;
231
+ delete generationConfig.stop_sequences;
232
+ }
233
+ }
234
+ /**
235
+ * Apply all Claude-specific transformations.
236
+ */
237
+ export function applyClaudeTransforms(payload, options) {
238
+ const { model, tierThinkingBudget, normalizedThinking, cleanJSONSchema } = options;
239
+ const isThinking = isClaudeThinkingModel(model);
240
+ // 1. Configure tool calling mode
241
+ configureClaudeToolConfig(payload);
242
+ if (payload.generationConfig) {
243
+ convertStopSequences(payload.generationConfig);
244
+ }
245
+ // 2. Apply thinking config if needed
246
+ if (normalizedThinking) {
247
+ const thinkingBudget = tierThinkingBudget ?? normalizedThinking.thinkingBudget;
248
+ if (isThinking) {
249
+ const thinkingConfig = buildClaudeThinkingConfig(normalizedThinking.includeThoughts ?? true, thinkingBudget);
250
+ const generationConfig = (payload.generationConfig ?? {});
251
+ generationConfig.thinkingConfig = thinkingConfig;
252
+ if (typeof thinkingBudget === "number" && thinkingBudget > 0) {
253
+ ensureClaudeMaxOutputTokens(generationConfig, thinkingBudget);
254
+ }
255
+ payload.generationConfig = generationConfig;
256
+ }
257
+ }
258
+ // 3. Append interleaved thinking hint for thinking models with tools
259
+ if (isThinking && Array.isArray(payload.tools) && payload.tools.length > 0) {
260
+ appendClaudeThinkingHint(payload);
261
+ }
262
+ // 4. Normalize tools
263
+ return normalizeClaudeTools(payload, cleanJSONSchema);
264
+ }
265
+ //# sourceMappingURL=claude.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude.js","sourceRoot":"","sources":["../../../../src/plugin/transform/claude.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Cross-Model Metadata Sanitization
3
+ *
4
+ * Fixes: "Invalid `signature` in `thinking` block" error when switching models mid-session.
5
+ *
6
+ * Root cause: Gemini stores thoughtSignature in metadata.google, Claude stores signature
7
+ * in top-level thinking blocks. Foreign signatures fail validation on the target model.
8
+ */
9
+ export type ModelFamily = "claude" | "gemini" | "unknown";
10
+ export interface SanitizerOptions {
11
+ targetModel: string;
12
+ sourceModel?: string;
13
+ preserveNonSignatureMetadata?: boolean;
14
+ }
15
+ export interface SanitizationResult {
16
+ payload: unknown;
17
+ modified: boolean;
18
+ signaturesStripped: number;
19
+ }
20
+ export declare function getModelFamily(model: string): ModelFamily;
21
+ export declare function stripGeminiThinkingMetadata(part: Record<string, unknown>, preserveNonSignature?: boolean): {
22
+ part: Record<string, unknown>;
23
+ stripped: number;
24
+ };
25
+ export declare function stripClaudeThinkingFields(part: Record<string, unknown>): {
26
+ part: Record<string, unknown>;
27
+ stripped: number;
28
+ };
29
+ export declare function deepSanitizeCrossModelMetadata(obj: unknown, targetFamily: ModelFamily, preserveNonSignature?: boolean): {
30
+ obj: unknown;
31
+ stripped: number;
32
+ };
33
+ export declare function sanitizeCrossModelPayload(payload: unknown, options: SanitizerOptions): SanitizationResult;
34
+ export declare function sanitizeCrossModelPayloadInPlace(payload: Record<string, unknown>, options: SanitizerOptions): number;
35
+ //# sourceMappingURL=cross-model-sanitizer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cross-model-sanitizer.d.ts","sourceRoot":"","sources":["../../../../src/plugin/transform/cross-model-sanitizer.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;AAE1D,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,4BAA4B,CAAC,EAAE,OAAO,CAAC;CACxC;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAKD,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,CAIzD;AAMD,wBAAgB,2BAA2B,CACzC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,oBAAoB,UAAO,GAC1B;IAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAoCrD;AAED,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B;IAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAoBrD;AAiGD,wBAAgB,8BAA8B,CAC5C,GAAG,EAAE,OAAO,EACZ,YAAY,EAAE,WAAW,EACzB,oBAAoB,UAAO,GAC1B;IAAE,GAAG,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAwDpC;AAED,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,gBAAgB,GACxB,kBAAkB,CAuBpB;AAED,wBAAgB,gCAAgC,CAC9C,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,OAAO,EAAE,gBAAgB,GACxB,MAAM,CAyDR"}
@@ -0,0 +1,225 @@
1
+ /**
2
+ * Cross-Model Metadata Sanitization
3
+ *
4
+ * Fixes: "Invalid `signature` in `thinking` block" error when switching models mid-session.
5
+ *
6
+ * Root cause: Gemini stores thoughtSignature in metadata.google, Claude stores signature
7
+ * in top-level thinking blocks. Foreign signatures fail validation on the target model.
8
+ */
9
+ import { isClaudeModel } from "./claude";
10
+ import { isGeminiModel } from "./gemini";
11
+ const GEMINI_SIGNATURE_FIELDS = ["thoughtSignature", "thinkingMetadata"];
12
+ const CLAUDE_SIGNATURE_FIELDS = ["signature"];
13
+ export function getModelFamily(model) {
14
+ if (isClaudeModel(model))
15
+ return "claude";
16
+ if (isGeminiModel(model))
17
+ return "gemini";
18
+ return "unknown";
19
+ }
20
+ function isPlainObject(value) {
21
+ return typeof value === "object" && value !== null && !Array.isArray(value);
22
+ }
23
+ export function stripGeminiThinkingMetadata(part, preserveNonSignature = true) {
24
+ let stripped = 0;
25
+ if ("thoughtSignature" in part) {
26
+ delete part.thoughtSignature;
27
+ stripped++;
28
+ }
29
+ if ("thinkingMetadata" in part) {
30
+ delete part.thinkingMetadata;
31
+ stripped++;
32
+ }
33
+ if (isPlainObject(part.metadata)) {
34
+ const metadata = part.metadata;
35
+ if (isPlainObject(metadata.google)) {
36
+ const google = metadata.google;
37
+ for (const field of GEMINI_SIGNATURE_FIELDS) {
38
+ if (field in google) {
39
+ delete google[field];
40
+ stripped++;
41
+ }
42
+ }
43
+ if (!preserveNonSignature || Object.keys(google).length === 0) {
44
+ delete metadata.google;
45
+ }
46
+ if (Object.keys(metadata).length === 0) {
47
+ delete part.metadata;
48
+ }
49
+ }
50
+ }
51
+ return { part, stripped };
52
+ }
53
+ export function stripClaudeThinkingFields(part) {
54
+ let stripped = 0;
55
+ if (part.type === "thinking" || part.type === "redacted_thinking") {
56
+ for (const field of CLAUDE_SIGNATURE_FIELDS) {
57
+ if (field in part) {
58
+ delete part[field];
59
+ stripped++;
60
+ }
61
+ }
62
+ }
63
+ if ("signature" in part && typeof part.signature === "string") {
64
+ if (part.signature.length >= 50) {
65
+ delete part.signature;
66
+ stripped++;
67
+ }
68
+ }
69
+ return { part, stripped };
70
+ }
71
+ function sanitizePart(part, targetFamily, preserveNonSignature) {
72
+ if (!isPlainObject(part)) {
73
+ return { part, stripped: 0 };
74
+ }
75
+ let totalStripped = 0;
76
+ const partObj = { ...part };
77
+ if (targetFamily === "claude") {
78
+ const result = stripGeminiThinkingMetadata(partObj, preserveNonSignature);
79
+ totalStripped += result.stripped;
80
+ }
81
+ else if (targetFamily === "gemini") {
82
+ const result = stripClaudeThinkingFields(partObj);
83
+ totalStripped += result.stripped;
84
+ }
85
+ return { part: partObj, stripped: totalStripped };
86
+ }
87
+ function sanitizeParts(parts, targetFamily, preserveNonSignature) {
88
+ let totalStripped = 0;
89
+ const sanitizedParts = parts.map((part) => {
90
+ const result = sanitizePart(part, targetFamily, preserveNonSignature);
91
+ totalStripped += result.stripped;
92
+ return result.part;
93
+ });
94
+ return { parts: sanitizedParts, stripped: totalStripped };
95
+ }
96
+ function sanitizeContents(contents, targetFamily, preserveNonSignature) {
97
+ let totalStripped = 0;
98
+ const sanitizedContents = contents.map((content) => {
99
+ if (!isPlainObject(content))
100
+ return content;
101
+ const contentObj = { ...content };
102
+ if (Array.isArray(contentObj.parts)) {
103
+ const result = sanitizeParts(contentObj.parts, targetFamily, preserveNonSignature);
104
+ contentObj.parts = result.parts;
105
+ totalStripped += result.stripped;
106
+ }
107
+ return contentObj;
108
+ });
109
+ return { contents: sanitizedContents, stripped: totalStripped };
110
+ }
111
+ function sanitizeMessages(messages, targetFamily, preserveNonSignature) {
112
+ let totalStripped = 0;
113
+ const sanitizedMessages = messages.map((message) => {
114
+ if (!isPlainObject(message))
115
+ return message;
116
+ const messageObj = { ...message };
117
+ if (Array.isArray(messageObj.content)) {
118
+ const result = sanitizeParts(messageObj.content, targetFamily, preserveNonSignature);
119
+ messageObj.content = result.parts;
120
+ totalStripped += result.stripped;
121
+ }
122
+ return messageObj;
123
+ });
124
+ return { messages: sanitizedMessages, stripped: totalStripped };
125
+ }
126
+ export function deepSanitizeCrossModelMetadata(obj, targetFamily, preserveNonSignature = true) {
127
+ if (!isPlainObject(obj)) {
128
+ return { obj, stripped: 0 };
129
+ }
130
+ let totalStripped = 0;
131
+ const result = { ...obj };
132
+ if (Array.isArray(result.contents)) {
133
+ const sanitized = sanitizeContents(result.contents, targetFamily, preserveNonSignature);
134
+ result.contents = sanitized.contents;
135
+ totalStripped += sanitized.stripped;
136
+ }
137
+ if (Array.isArray(result.messages)) {
138
+ const sanitized = sanitizeMessages(result.messages, targetFamily, preserveNonSignature);
139
+ result.messages = sanitized.messages;
140
+ totalStripped += sanitized.stripped;
141
+ }
142
+ if (isPlainObject(result.extra_body)) {
143
+ const extraBody = { ...result.extra_body };
144
+ if (Array.isArray(extraBody.messages)) {
145
+ const sanitized = sanitizeMessages(extraBody.messages, targetFamily, preserveNonSignature);
146
+ extraBody.messages = sanitized.messages;
147
+ totalStripped += sanitized.stripped;
148
+ }
149
+ result.extra_body = extraBody;
150
+ }
151
+ if (Array.isArray(result.requests)) {
152
+ const sanitizedRequests = result.requests.map((req) => {
153
+ const sanitized = deepSanitizeCrossModelMetadata(req, targetFamily, preserveNonSignature);
154
+ totalStripped += sanitized.stripped;
155
+ return sanitized.obj;
156
+ });
157
+ result.requests = sanitizedRequests;
158
+ }
159
+ return { obj: result, stripped: totalStripped };
160
+ }
161
+ export function sanitizeCrossModelPayload(payload, options) {
162
+ const targetFamily = getModelFamily(options.targetModel);
163
+ if (targetFamily === "unknown") {
164
+ return {
165
+ payload,
166
+ modified: false,
167
+ signaturesStripped: 0,
168
+ };
169
+ }
170
+ const preserveNonSignature = options.preserveNonSignatureMetadata ?? true;
171
+ const result = deepSanitizeCrossModelMetadata(payload, targetFamily, preserveNonSignature);
172
+ return {
173
+ payload: result.obj,
174
+ modified: result.stripped > 0,
175
+ signaturesStripped: result.stripped,
176
+ };
177
+ }
178
+ export function sanitizeCrossModelPayloadInPlace(payload, options) {
179
+ const targetFamily = getModelFamily(options.targetModel);
180
+ if (targetFamily === "unknown") {
181
+ return 0;
182
+ }
183
+ const preserveNonSignature = options.preserveNonSignatureMetadata ?? true;
184
+ let totalStripped = 0;
185
+ const sanitizePartsInPlace = (parts) => {
186
+ for (const part of parts) {
187
+ if (!isPlainObject(part))
188
+ continue;
189
+ if (targetFamily === "claude") {
190
+ const result = stripGeminiThinkingMetadata(part, preserveNonSignature);
191
+ totalStripped += result.stripped;
192
+ }
193
+ else if (targetFamily === "gemini") {
194
+ const result = stripClaudeThinkingFields(part);
195
+ totalStripped += result.stripped;
196
+ }
197
+ }
198
+ };
199
+ if (Array.isArray(payload.contents)) {
200
+ for (const content of payload.contents) {
201
+ if (isPlainObject(content) && Array.isArray(content.parts)) {
202
+ sanitizePartsInPlace(content.parts);
203
+ }
204
+ }
205
+ }
206
+ if (Array.isArray(payload.messages)) {
207
+ for (const message of payload.messages) {
208
+ if (isPlainObject(message) && Array.isArray(message.content)) {
209
+ sanitizePartsInPlace(message.content);
210
+ }
211
+ }
212
+ }
213
+ if (isPlainObject(payload.extra_body)) {
214
+ const extraBody = payload.extra_body;
215
+ if (Array.isArray(extraBody.messages)) {
216
+ for (const message of extraBody.messages) {
217
+ if (isPlainObject(message) && Array.isArray(message.content)) {
218
+ sanitizePartsInPlace(message.content);
219
+ }
220
+ }
221
+ }
222
+ }
223
+ return totalStripped;
224
+ }
225
+ //# sourceMappingURL=cross-model-sanitizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cross-model-sanitizer.js","sourceRoot":"","sources":["../../../../src/plugin/transform/cross-model-sanitizer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,112 @@
1
+ /**
2
+ * Gemini-specific Request Transformations
3
+ *
4
+ * Handles Gemini model-specific request transformations including:
5
+ * - Thinking config (camelCase keys, thinkingLevel for Gemini 3)
6
+ * - Tool normalization (function/custom format)
7
+ * - Schema transformation (JSON Schema -> Gemini Schema format)
8
+ */
9
+ import type { RequestPayload, ThinkingConfig, ThinkingTier, GoogleSearchConfig } from "./types";
10
+ export declare function toGeminiSchema(schema: unknown): unknown;
11
+ /**
12
+ * Check if a model is a Gemini model (not Claude).
13
+ */
14
+ export declare function isGeminiModel(model: string): boolean;
15
+ /**
16
+ * Check if a model is Gemini 3 (uses thinkingLevel string).
17
+ */
18
+ export declare function isGemini3Model(model: string): boolean;
19
+ /**
20
+ * Check if a model is Gemini 2.5 (uses numeric thinkingBudget).
21
+ */
22
+ export declare function isGemini25Model(model: string): boolean;
23
+ /**
24
+ * Check if a model is an image generation model.
25
+ * Image models don't support thinking and require imageConfig.
26
+ */
27
+ export declare function isImageGenerationModel(model: string): boolean;
28
+ /**
29
+ * Build Gemini 3 thinking config with thinkingLevel string.
30
+ */
31
+ export declare function buildGemini3ThinkingConfig(includeThoughts: boolean, thinkingLevel: ThinkingTier): ThinkingConfig;
32
+ /**
33
+ * Build Gemini 2.5 thinking config with numeric thinkingBudget.
34
+ */
35
+ export declare function buildGemini25ThinkingConfig(includeThoughts: boolean, thinkingBudget?: number): ThinkingConfig;
36
+ /**
37
+ * Image generation config for Gemini image models.
38
+ *
39
+ * Supported aspect ratios: "1:1", "2:3", "3:2", "3:4", "4:3", "4:5", "5:4", "9:16", "16:9", "21:9"
40
+ */
41
+ export interface ImageConfig {
42
+ aspectRatio?: string;
43
+ }
44
+ /**
45
+ * Build image generation config for Gemini image models.
46
+ *
47
+ * Configuration is read from environment variables:
48
+ * - OPENCODE_IMAGE_ASPECT_RATIO: Aspect ratio (e.g., "16:9", "4:3")
49
+ *
50
+ * Defaults to 1:1 aspect ratio if not specified.
51
+ *
52
+ * Note: Resolution setting is not currently supported by the Antigravity API.
53
+ */
54
+ export declare function buildImageGenerationConfig(): ImageConfig;
55
+ /**
56
+ * Normalize tools for Gemini models.
57
+ * Ensures tools have proper function-style format.
58
+ *
59
+ * @returns Debug info about tool normalization
60
+ */
61
+ export declare function normalizeGeminiTools(payload: RequestPayload): {
62
+ toolDebugMissing: number;
63
+ toolDebugSummaries: string[];
64
+ };
65
+ /**
66
+ * Apply all Gemini-specific transformations to a request payload.
67
+ */
68
+ export interface GeminiTransformOptions {
69
+ /** The effective model name (resolved) */
70
+ model: string;
71
+ /** Tier-based thinking budget (from model suffix, for Gemini 2.5) */
72
+ tierThinkingBudget?: number;
73
+ /** Tier-based thinking level (from model suffix, for Gemini 3) */
74
+ tierThinkingLevel?: ThinkingTier;
75
+ /** Normalized thinking config from user settings */
76
+ normalizedThinking?: {
77
+ includeThoughts?: boolean;
78
+ thinkingBudget?: number;
79
+ };
80
+ /** Google Search configuration */
81
+ googleSearch?: GoogleSearchConfig;
82
+ }
83
+ export interface GeminiTransformResult {
84
+ toolDebugMissing: number;
85
+ toolDebugSummaries: string[];
86
+ /** Number of function declarations after wrapping */
87
+ wrappedFunctionCount: number;
88
+ /** Number of passthrough tools (googleSearchRetrieval, codeExecution) */
89
+ passthroughToolCount: number;
90
+ }
91
+ /**
92
+ * Apply all Gemini-specific transformations.
93
+ */
94
+ export declare function applyGeminiTransforms(payload: RequestPayload, options: GeminiTransformOptions): GeminiTransformResult;
95
+ export interface WrapToolsResult {
96
+ wrappedFunctionCount: number;
97
+ passthroughToolCount: number;
98
+ }
99
+ /**
100
+ * Wrap tools array in Gemini's required functionDeclarations format.
101
+ *
102
+ * Gemini/Antigravity API expects:
103
+ * { tools: [{ functionDeclarations: [{ name, description, parameters }] }] }
104
+ *
105
+ * NOT:
106
+ * { tools: [{ function: {...}, parameters: {...} }] }
107
+ *
108
+ * The wrapper-level 'parameters' field causes:
109
+ * "Unknown name 'parameters' at 'request.tools[0]'"
110
+ */
111
+ export declare function wrapToolsAsFunctionDeclarations(payload: RequestPayload): WrapToolsResult;
112
+ //# sourceMappingURL=gemini.d.ts.map