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.
- package/LICENSE +21 -0
- package/README.md +630 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/src/antigravity/oauth.d.ts +31 -0
- package/dist/src/antigravity/oauth.d.ts.map +1 -0
- package/dist/src/antigravity/oauth.js +168 -0
- package/dist/src/antigravity/oauth.js.map +1 -0
- package/dist/src/constants.d.ts +99 -0
- package/dist/src/constants.d.ts.map +1 -0
- package/dist/src/constants.js +135 -0
- package/dist/src/constants.js.map +1 -0
- package/dist/src/hooks/auto-update-checker/cache.d.ts +3 -0
- package/dist/src/hooks/auto-update-checker/cache.d.ts.map +1 -0
- package/dist/src/hooks/auto-update-checker/cache.js +71 -0
- package/dist/src/hooks/auto-update-checker/cache.js.map +1 -0
- package/dist/src/hooks/auto-update-checker/checker.d.ts +16 -0
- package/dist/src/hooks/auto-update-checker/checker.d.ts.map +1 -0
- package/dist/src/hooks/auto-update-checker/checker.js +237 -0
- package/dist/src/hooks/auto-update-checker/checker.js.map +1 -0
- package/dist/src/hooks/auto-update-checker/constants.d.ts +9 -0
- package/dist/src/hooks/auto-update-checker/constants.d.ts.map +1 -0
- package/dist/src/hooks/auto-update-checker/constants.js +23 -0
- package/dist/src/hooks/auto-update-checker/constants.js.map +1 -0
- package/dist/src/hooks/auto-update-checker/index.d.ts +34 -0
- package/dist/src/hooks/auto-update-checker/index.d.ts.map +1 -0
- package/dist/src/hooks/auto-update-checker/index.js +125 -0
- package/dist/src/hooks/auto-update-checker/index.js.map +1 -0
- package/dist/src/hooks/auto-update-checker/types.d.ts +25 -0
- package/dist/src/hooks/auto-update-checker/types.d.ts.map +1 -0
- package/dist/src/hooks/auto-update-checker/types.js +1 -0
- package/dist/src/hooks/auto-update-checker/types.js.map +1 -0
- package/dist/src/plugin/accounts.d.ts +86 -0
- package/dist/src/plugin/accounts.d.ts.map +1 -0
- package/dist/src/plugin/accounts.js +609 -0
- package/dist/src/plugin/accounts.js.map +1 -0
- package/dist/src/plugin/auth.d.ts +21 -0
- package/dist/src/plugin/auth.d.ts.map +1 -0
- package/dist/src/plugin/auth.js +46 -0
- package/dist/src/plugin/auth.js.map +1 -0
- package/dist/src/plugin/cache/index.d.ts +5 -0
- package/dist/src/plugin/cache/index.d.ts.map +1 -0
- package/dist/src/plugin/cache/index.js +5 -0
- package/dist/src/plugin/cache/index.js.map +1 -0
- package/dist/src/plugin/cache/signature-cache.d.ts +111 -0
- package/dist/src/plugin/cache/signature-cache.d.ts.map +1 -0
- package/dist/src/plugin/cache/signature-cache.js +375 -0
- package/dist/src/plugin/cache/signature-cache.js.map +1 -0
- package/dist/src/plugin/cache.d.ts +44 -0
- package/dist/src/plugin/cache.d.ts.map +1 -0
- package/dist/src/plugin/cache.js +200 -0
- package/dist/src/plugin/cache.js.map +1 -0
- package/dist/src/plugin/cli.d.ts +19 -0
- package/dist/src/plugin/cli.d.ts.map +1 -0
- package/dist/src/plugin/cli.js +59 -0
- package/dist/src/plugin/cli.js.map +1 -0
- package/dist/src/plugin/config/index.d.ts +16 -0
- package/dist/src/plugin/config/index.d.ts.map +1 -0
- package/dist/src/plugin/config/index.js +16 -0
- package/dist/src/plugin/config/index.js.map +1 -0
- package/dist/src/plugin/config/loader.d.ts +37 -0
- package/dist/src/plugin/config/loader.d.ts.map +1 -0
- package/dist/src/plugin/config/loader.js +206 -0
- package/dist/src/plugin/config/loader.js.map +1 -0
- package/dist/src/plugin/config/schema.d.ts +411 -0
- package/dist/src/plugin/config/schema.d.ts.map +1 -0
- package/dist/src/plugin/config/schema.js +339 -0
- package/dist/src/plugin/config/schema.js.map +1 -0
- package/dist/src/plugin/core/streaming/index.d.ts +3 -0
- package/dist/src/plugin/core/streaming/index.d.ts.map +1 -0
- package/dist/src/plugin/core/streaming/index.js +3 -0
- package/dist/src/plugin/core/streaming/index.js.map +1 -0
- package/dist/src/plugin/core/streaming/transformer.d.ts +10 -0
- package/dist/src/plugin/core/streaming/transformer.d.ts.map +1 -0
- package/dist/src/plugin/core/streaming/transformer.js +255 -0
- package/dist/src/plugin/core/streaming/transformer.js.map +1 -0
- package/dist/src/plugin/core/streaming/types.d.ts +35 -0
- package/dist/src/plugin/core/streaming/types.d.ts.map +1 -0
- package/dist/src/plugin/core/streaming/types.js +1 -0
- package/dist/src/plugin/core/streaming/types.js.map +1 -0
- package/dist/src/plugin/debug.d.ts +68 -0
- package/dist/src/plugin/debug.d.ts.map +1 -0
- package/dist/src/plugin/debug.js +325 -0
- package/dist/src/plugin/debug.js.map +1 -0
- package/dist/src/plugin/errors.d.ts +28 -0
- package/dist/src/plugin/errors.d.ts.map +1 -0
- package/dist/src/plugin/errors.js +42 -0
- package/dist/src/plugin/errors.js.map +1 -0
- package/dist/src/plugin/image-saver.d.ts +25 -0
- package/dist/src/plugin/image-saver.d.ts.map +1 -0
- package/dist/src/plugin/image-saver.js +86 -0
- package/dist/src/plugin/image-saver.js.map +1 -0
- package/dist/src/plugin/logger.d.ts +54 -0
- package/dist/src/plugin/logger.d.ts.map +1 -0
- package/dist/src/plugin/logger.js +120 -0
- package/dist/src/plugin/logger.js.map +1 -0
- package/dist/src/plugin/project.d.ts +33 -0
- package/dist/src/plugin/project.d.ts.map +1 -0
- package/dist/src/plugin/project.js +234 -0
- package/dist/src/plugin/project.js.map +1 -0
- package/dist/src/plugin/recovery/constants.d.ts +22 -0
- package/dist/src/plugin/recovery/constants.d.ts.map +1 -0
- package/dist/src/plugin/recovery/constants.js +43 -0
- package/dist/src/plugin/recovery/constants.js.map +1 -0
- package/dist/src/plugin/recovery/index.d.ts +12 -0
- package/dist/src/plugin/recovery/index.d.ts.map +1 -0
- package/dist/src/plugin/recovery/index.js +12 -0
- package/dist/src/plugin/recovery/index.js.map +1 -0
- package/dist/src/plugin/recovery/storage.d.ts +24 -0
- package/dist/src/plugin/recovery/storage.d.ts.map +1 -0
- package/dist/src/plugin/recovery/storage.js +354 -0
- package/dist/src/plugin/recovery/storage.js.map +1 -0
- package/dist/src/plugin/recovery/types.d.ts +116 -0
- package/dist/src/plugin/recovery/types.d.ts.map +1 -0
- package/dist/src/plugin/recovery/types.js +6 -0
- package/dist/src/plugin/recovery/types.js.map +1 -0
- package/dist/src/plugin/recovery.d.ts +61 -0
- package/dist/src/plugin/recovery.d.ts.map +1 -0
- package/dist/src/plugin/recovery.js +376 -0
- package/dist/src/plugin/recovery.js.map +1 -0
- package/dist/src/plugin/refresh-queue.d.ts +101 -0
- package/dist/src/plugin/refresh-queue.d.ts.map +1 -0
- package/dist/src/plugin/refresh-queue.js +244 -0
- package/dist/src/plugin/refresh-queue.js.map +1 -0
- package/dist/src/plugin/request-helpers.d.ts +278 -0
- package/dist/src/plugin/request-helpers.d.ts.map +1 -0
- package/dist/src/plugin/request-helpers.js +2268 -0
- package/dist/src/plugin/request-helpers.js.map +1 -0
- package/dist/src/plugin/request.d.ts +91 -0
- package/dist/src/plugin/request.d.ts.map +1 -0
- package/dist/src/plugin/request.js +1302 -0
- package/dist/src/plugin/request.js.map +1 -0
- package/dist/src/plugin/rotation.d.ts +168 -0
- package/dist/src/plugin/rotation.d.ts.map +1 -0
- package/dist/src/plugin/rotation.js +302 -0
- package/dist/src/plugin/rotation.js.map +1 -0
- package/dist/src/plugin/server.d.ts +23 -0
- package/dist/src/plugin/server.d.ts.map +1 -0
- package/dist/src/plugin/server.js +324 -0
- package/dist/src/plugin/server.js.map +1 -0
- package/dist/src/plugin/storage.d.ts +92 -0
- package/dist/src/plugin/storage.d.ts.map +1 -0
- package/dist/src/plugin/storage.js +417 -0
- package/dist/src/plugin/storage.js.map +1 -0
- package/dist/src/plugin/stores/signature-store.d.ts +5 -0
- package/dist/src/plugin/stores/signature-store.d.ts.map +1 -0
- package/dist/src/plugin/stores/signature-store.js +25 -0
- package/dist/src/plugin/stores/signature-store.js.map +1 -0
- package/dist/src/plugin/thinking-recovery.d.ts +90 -0
- package/dist/src/plugin/thinking-recovery.d.ts.map +1 -0
- package/dist/src/plugin/thinking-recovery.js +316 -0
- package/dist/src/plugin/thinking-recovery.js.map +1 -0
- package/dist/src/plugin/token.d.ts +19 -0
- package/dist/src/plugin/token.d.ts.map +1 -0
- package/dist/src/plugin/token.js +128 -0
- package/dist/src/plugin/token.js.map +1 -0
- package/dist/src/plugin/transform/claude.d.ts +80 -0
- package/dist/src/plugin/transform/claude.d.ts.map +1 -0
- package/dist/src/plugin/transform/claude.js +265 -0
- package/dist/src/plugin/transform/claude.js.map +1 -0
- package/dist/src/plugin/transform/cross-model-sanitizer.d.ts +35 -0
- package/dist/src/plugin/transform/cross-model-sanitizer.d.ts.map +1 -0
- package/dist/src/plugin/transform/cross-model-sanitizer.js +225 -0
- package/dist/src/plugin/transform/cross-model-sanitizer.js.map +1 -0
- package/dist/src/plugin/transform/gemini.d.ts +112 -0
- package/dist/src/plugin/transform/gemini.d.ts.map +1 -0
- package/dist/src/plugin/transform/gemini.js +409 -0
- package/dist/src/plugin/transform/gemini.js.map +1 -0
- package/dist/src/plugin/transform/index.d.ts +15 -0
- package/dist/src/plugin/transform/index.d.ts.map +1 -0
- package/dist/src/plugin/transform/index.js +14 -0
- package/dist/src/plugin/transform/index.js.map +1 -0
- package/dist/src/plugin/transform/model-resolver.d.ts +101 -0
- package/dist/src/plugin/transform/model-resolver.d.ts.map +1 -0
- package/dist/src/plugin/transform/model-resolver.js +356 -0
- package/dist/src/plugin/transform/model-resolver.js.map +1 -0
- package/dist/src/plugin/transform/types.d.ts +106 -0
- package/dist/src/plugin/transform/types.d.ts.map +1 -0
- package/dist/src/plugin/transform/types.js +1 -0
- package/dist/src/plugin/transform/types.js.map +1 -0
- package/dist/src/plugin/types.d.ts +96 -0
- package/dist/src/plugin/types.d.ts.map +1 -0
- package/dist/src/plugin/types.js +1 -0
- package/dist/src/plugin/types.js.map +1 -0
- package/dist/src/plugin/usage-reporter.d.ts +23 -0
- package/dist/src/plugin/usage-reporter.d.ts.map +1 -0
- package/dist/src/plugin/usage-reporter.js +43 -0
- package/dist/src/plugin/usage-reporter.js.map +1 -0
- package/dist/src/plugin.d.ts +8 -0
- package/dist/src/plugin.d.ts.map +1 -0
- package/dist/src/plugin.js +1708 -0
- package/dist/src/plugin.js.map +1 -0
- package/package.json +67 -0
|
@@ -0,0 +1,316 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Thinking Recovery Module
|
|
3
|
+
*
|
|
4
|
+
* Minimal implementation for recovering from corrupted thinking state.
|
|
5
|
+
* When Claude's conversation history gets corrupted (thinking blocks stripped/malformed),
|
|
6
|
+
* this module provides a "last resort" recovery by closing the current turn and starting fresh.
|
|
7
|
+
*
|
|
8
|
+
* Philosophy: "Let it crash and start again" - Instead of trying to fix corrupted state,
|
|
9
|
+
* we abandon the corrupted turn and let Claude generate fresh thinking.
|
|
10
|
+
*/
|
|
11
|
+
// ============================================================================
|
|
12
|
+
// DETECTION HELPERS
|
|
13
|
+
// ============================================================================
|
|
14
|
+
/**
|
|
15
|
+
* Checks if a message part is a thinking/reasoning block.
|
|
16
|
+
*/
|
|
17
|
+
function isThinkingPart(part) {
|
|
18
|
+
if (!part || typeof part !== "object")
|
|
19
|
+
return false;
|
|
20
|
+
return (part.thought === true ||
|
|
21
|
+
part.type === "thinking" ||
|
|
22
|
+
part.type === "redacted_thinking");
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Checks if a message part is a function response (tool result).
|
|
26
|
+
*/
|
|
27
|
+
function isFunctionResponsePart(part) {
|
|
28
|
+
return part && typeof part === "object" && "functionResponse" in part;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Checks if a message part is a function call.
|
|
32
|
+
*/
|
|
33
|
+
function isFunctionCallPart(part) {
|
|
34
|
+
return part && typeof part === "object" && "functionCall" in part;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Checks if a message is a tool result container (user role with functionResponse).
|
|
38
|
+
*/
|
|
39
|
+
function isToolResultMessage(msg) {
|
|
40
|
+
if (!msg || msg.role !== "user")
|
|
41
|
+
return false;
|
|
42
|
+
const parts = msg.parts || [];
|
|
43
|
+
return parts.some(isFunctionResponsePart);
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Checks if a message contains thinking/reasoning content.
|
|
47
|
+
*/
|
|
48
|
+
function messageHasThinking(msg) {
|
|
49
|
+
if (!msg || typeof msg !== "object")
|
|
50
|
+
return false;
|
|
51
|
+
// Gemini format: parts array
|
|
52
|
+
if (Array.isArray(msg.parts)) {
|
|
53
|
+
return msg.parts.some(isThinkingPart);
|
|
54
|
+
}
|
|
55
|
+
// Anthropic format: content array
|
|
56
|
+
if (Array.isArray(msg.content)) {
|
|
57
|
+
return msg.content.some((block) => block?.type === "thinking" || block?.type === "redacted_thinking");
|
|
58
|
+
}
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Checks if a message contains tool calls.
|
|
63
|
+
*/
|
|
64
|
+
function messageHasToolCalls(msg) {
|
|
65
|
+
if (!msg || typeof msg !== "object")
|
|
66
|
+
return false;
|
|
67
|
+
// Gemini format: parts array with functionCall
|
|
68
|
+
if (Array.isArray(msg.parts)) {
|
|
69
|
+
return msg.parts.some(isFunctionCallPart);
|
|
70
|
+
}
|
|
71
|
+
// Anthropic format: content array with tool_use
|
|
72
|
+
if (Array.isArray(msg.content)) {
|
|
73
|
+
return msg.content.some((block) => block?.type === "tool_use");
|
|
74
|
+
}
|
|
75
|
+
return false;
|
|
76
|
+
}
|
|
77
|
+
// ============================================================================
|
|
78
|
+
// CONVERSATION STATE ANALYSIS
|
|
79
|
+
// ============================================================================
|
|
80
|
+
/**
|
|
81
|
+
* Analyzes conversation state to detect tool use loops and thinking mode issues.
|
|
82
|
+
*
|
|
83
|
+
* Key insight: A "turn" can span multiple assistant messages in a tool-use loop.
|
|
84
|
+
* We need to find the TURN START (first assistant message after last real user message)
|
|
85
|
+
* and check if THAT message had thinking, not just the last assistant message.
|
|
86
|
+
*/
|
|
87
|
+
export function analyzeConversationState(contents) {
|
|
88
|
+
const state = {
|
|
89
|
+
inToolLoop: false,
|
|
90
|
+
turnStartIdx: -1,
|
|
91
|
+
turnHasThinking: false,
|
|
92
|
+
lastModelIdx: -1,
|
|
93
|
+
lastModelHasThinking: false,
|
|
94
|
+
lastModelHasToolCalls: false,
|
|
95
|
+
};
|
|
96
|
+
if (!Array.isArray(contents) || contents.length === 0) {
|
|
97
|
+
return state;
|
|
98
|
+
}
|
|
99
|
+
// First pass: Find the last "real" user message (not a tool result)
|
|
100
|
+
let lastRealUserIdx = -1;
|
|
101
|
+
for (let i = 0; i < contents.length; i++) {
|
|
102
|
+
const msg = contents[i];
|
|
103
|
+
if (msg?.role === "user" && !isToolResultMessage(msg)) {
|
|
104
|
+
lastRealUserIdx = i;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
// Second pass: Analyze conversation and find turn boundaries
|
|
108
|
+
for (let i = 0; i < contents.length; i++) {
|
|
109
|
+
const msg = contents[i];
|
|
110
|
+
const role = msg?.role;
|
|
111
|
+
if (role === "model" || role === "assistant") {
|
|
112
|
+
const hasThinking = messageHasThinking(msg);
|
|
113
|
+
const hasToolCalls = messageHasToolCalls(msg);
|
|
114
|
+
// Track if this is the turn start
|
|
115
|
+
if (i > lastRealUserIdx && state.turnStartIdx === -1) {
|
|
116
|
+
state.turnStartIdx = i;
|
|
117
|
+
state.turnHasThinking = hasThinking;
|
|
118
|
+
}
|
|
119
|
+
state.lastModelIdx = i;
|
|
120
|
+
state.lastModelHasToolCalls = hasToolCalls;
|
|
121
|
+
state.lastModelHasThinking = hasThinking;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
// Determine if we're in a tool loop
|
|
125
|
+
// We're in a tool loop if the conversation ends with a tool result
|
|
126
|
+
if (contents.length > 0) {
|
|
127
|
+
const lastMsg = contents[contents.length - 1];
|
|
128
|
+
if (lastMsg?.role === "user" && isToolResultMessage(lastMsg)) {
|
|
129
|
+
state.inToolLoop = true;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
return state;
|
|
133
|
+
}
|
|
134
|
+
// ============================================================================
|
|
135
|
+
// RECOVERY FUNCTIONS
|
|
136
|
+
// ============================================================================
|
|
137
|
+
/**
|
|
138
|
+
* Strips all thinking blocks from messages.
|
|
139
|
+
* Used before injecting synthetic messages to avoid invalid thinking patterns.
|
|
140
|
+
*/
|
|
141
|
+
function stripAllThinkingBlocks(contents) {
|
|
142
|
+
return contents.map((content) => {
|
|
143
|
+
if (!content || typeof content !== "object")
|
|
144
|
+
return content;
|
|
145
|
+
// Handle Gemini-style parts
|
|
146
|
+
if (Array.isArray(content.parts)) {
|
|
147
|
+
const filteredParts = content.parts.filter((part) => !isThinkingPart(part));
|
|
148
|
+
// Keep at least one part to avoid empty messages
|
|
149
|
+
if (filteredParts.length === 0 && content.parts.length > 0) {
|
|
150
|
+
return content;
|
|
151
|
+
}
|
|
152
|
+
return { ...content, parts: filteredParts };
|
|
153
|
+
}
|
|
154
|
+
// Handle Anthropic-style content
|
|
155
|
+
if (Array.isArray(content.content)) {
|
|
156
|
+
const filteredContent = content.content.filter((block) => block?.type !== "thinking" && block?.type !== "redacted_thinking");
|
|
157
|
+
if (filteredContent.length === 0 && content.content.length > 0) {
|
|
158
|
+
return content;
|
|
159
|
+
}
|
|
160
|
+
return { ...content, content: filteredContent };
|
|
161
|
+
}
|
|
162
|
+
return content;
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Counts tool results at the end of the conversation.
|
|
167
|
+
*/
|
|
168
|
+
function countTrailingToolResults(contents) {
|
|
169
|
+
let count = 0;
|
|
170
|
+
for (let i = contents.length - 1; i >= 0; i--) {
|
|
171
|
+
const msg = contents[i];
|
|
172
|
+
if (msg?.role === "user") {
|
|
173
|
+
const parts = msg.parts || [];
|
|
174
|
+
const functionResponses = parts.filter(isFunctionResponsePart);
|
|
175
|
+
if (functionResponses.length > 0) {
|
|
176
|
+
count += functionResponses.length;
|
|
177
|
+
}
|
|
178
|
+
else {
|
|
179
|
+
break; // Real user message, stop counting
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
else if (msg?.role === "model" || msg?.role === "assistant") {
|
|
183
|
+
break; // Stop at the model that made the tool calls
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
return count;
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Closes an incomplete tool loop by injecting synthetic messages to start a new turn.
|
|
190
|
+
*
|
|
191
|
+
* This is the "let it crash and start again" recovery mechanism.
|
|
192
|
+
*
|
|
193
|
+
* When we detect:
|
|
194
|
+
* - We're in a tool loop (conversation ends with functionResponse)
|
|
195
|
+
* - The tool call was made WITHOUT thinking (thinking was stripped/corrupted)
|
|
196
|
+
* - We NOW want to enable thinking
|
|
197
|
+
*
|
|
198
|
+
* Instead of trying to fix the corrupted state, we:
|
|
199
|
+
* 1. Strip ALL thinking blocks (removes any corrupted ones)
|
|
200
|
+
* 2. Add synthetic MODEL message to complete the non-thinking turn
|
|
201
|
+
* 3. Add synthetic USER message to start a NEW turn
|
|
202
|
+
*
|
|
203
|
+
* This allows Claude to generate fresh thinking for the new turn.
|
|
204
|
+
*/
|
|
205
|
+
export function closeToolLoopForThinking(contents) {
|
|
206
|
+
// Strip any old/corrupted thinking first
|
|
207
|
+
const strippedContents = stripAllThinkingBlocks(contents);
|
|
208
|
+
// Count tool results from the end of the conversation
|
|
209
|
+
const toolResultCount = countTrailingToolResults(strippedContents);
|
|
210
|
+
// Build synthetic model message content based on tool count
|
|
211
|
+
let syntheticModelContent;
|
|
212
|
+
if (toolResultCount === 0) {
|
|
213
|
+
syntheticModelContent = "[Processing previous context.]";
|
|
214
|
+
}
|
|
215
|
+
else if (toolResultCount === 1) {
|
|
216
|
+
syntheticModelContent = "[Tool execution completed.]";
|
|
217
|
+
}
|
|
218
|
+
else {
|
|
219
|
+
syntheticModelContent = `[${toolResultCount} tool executions completed.]`;
|
|
220
|
+
}
|
|
221
|
+
// Step 1: Inject synthetic MODEL message to complete the non-thinking turn
|
|
222
|
+
const syntheticModel = {
|
|
223
|
+
role: "model",
|
|
224
|
+
parts: [{ text: syntheticModelContent }],
|
|
225
|
+
};
|
|
226
|
+
// Step 2: Inject synthetic USER message to start a NEW turn
|
|
227
|
+
const syntheticUser = {
|
|
228
|
+
role: "user",
|
|
229
|
+
parts: [{ text: "[Continue]" }],
|
|
230
|
+
};
|
|
231
|
+
return [...strippedContents, syntheticModel, syntheticUser];
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Checks if conversation state requires tool loop closure for thinking recovery.
|
|
235
|
+
*
|
|
236
|
+
* Returns true if:
|
|
237
|
+
* - We're in a tool loop (state.inToolLoop)
|
|
238
|
+
* - The turn didn't start with thinking (state.turnHasThinking === false)
|
|
239
|
+
*
|
|
240
|
+
* This is the trigger for the "let it crash and start again" recovery.
|
|
241
|
+
*/
|
|
242
|
+
export function needsThinkingRecovery(state) {
|
|
243
|
+
return state.inToolLoop && !state.turnHasThinking;
|
|
244
|
+
}
|
|
245
|
+
// ============================================================================
|
|
246
|
+
// COMPACTED THINKING TURN DETECTION (Ported from LLM-API-Key-Proxy)
|
|
247
|
+
// ============================================================================
|
|
248
|
+
/**
|
|
249
|
+
* Detects if a message looks like it was compacted from a thinking-enabled turn.
|
|
250
|
+
*
|
|
251
|
+
* This is a heuristic to distinguish between:
|
|
252
|
+
* - "Never had thinking" (model didn't use thinking mode)
|
|
253
|
+
* - "Thinking was stripped" (context compaction removed thinking blocks)
|
|
254
|
+
*
|
|
255
|
+
* Port of LLM-API-Key-Proxy's _looks_like_compacted_thinking_turn()
|
|
256
|
+
*
|
|
257
|
+
* Heuristics:
|
|
258
|
+
* 1. Has functionCall parts (typical thinking flow produces tool calls)
|
|
259
|
+
* 2. No thinking parts (thought: true)
|
|
260
|
+
* 3. No text content before functionCall (thinking responses usually have text)
|
|
261
|
+
*
|
|
262
|
+
* @param msg - A single message from the conversation
|
|
263
|
+
* @returns true if the message looks like thinking was stripped
|
|
264
|
+
*/
|
|
265
|
+
export function looksLikeCompactedThinkingTurn(msg) {
|
|
266
|
+
if (!msg || typeof msg !== "object")
|
|
267
|
+
return false;
|
|
268
|
+
const parts = msg.parts || [];
|
|
269
|
+
if (parts.length === 0)
|
|
270
|
+
return false;
|
|
271
|
+
// Check if message has function calls
|
|
272
|
+
const hasFunctionCall = parts.some((p) => p && typeof p === "object" && p.functionCall);
|
|
273
|
+
if (!hasFunctionCall)
|
|
274
|
+
return false;
|
|
275
|
+
// Check for thinking blocks
|
|
276
|
+
const hasThinking = parts.some((p) => p &&
|
|
277
|
+
typeof p === "object" &&
|
|
278
|
+
(p.thought === true || p.type === "thinking" || p.type === "redacted_thinking"));
|
|
279
|
+
if (hasThinking)
|
|
280
|
+
return false;
|
|
281
|
+
// Check for text content (not thinking)
|
|
282
|
+
const hasTextBeforeFunctionCall = parts.some((p, idx) => {
|
|
283
|
+
if (!p || typeof p !== "object")
|
|
284
|
+
return false;
|
|
285
|
+
// Only check parts before the first functionCall
|
|
286
|
+
const firstFuncIdx = parts.findIndex((fp) => fp && typeof fp === "object" && fp.functionCall);
|
|
287
|
+
if (idx >= firstFuncIdx)
|
|
288
|
+
return false;
|
|
289
|
+
// Check for non-thinking text
|
|
290
|
+
return ("text" in p &&
|
|
291
|
+
typeof p.text === "string" &&
|
|
292
|
+
p.text.trim().length > 0 &&
|
|
293
|
+
!p.thought);
|
|
294
|
+
});
|
|
295
|
+
// If we have functionCall but no text before it, likely compacted
|
|
296
|
+
return !hasTextBeforeFunctionCall;
|
|
297
|
+
}
|
|
298
|
+
/**
|
|
299
|
+
* Checks if any message in the current turn looks like it was compacted.
|
|
300
|
+
*
|
|
301
|
+
* @param contents - Full conversation contents
|
|
302
|
+
* @param turnStartIdx - Index of the first model message in current turn
|
|
303
|
+
* @returns true if any model message in the turn looks compacted
|
|
304
|
+
*/
|
|
305
|
+
export function hasPossibleCompactedThinking(contents, turnStartIdx) {
|
|
306
|
+
if (!Array.isArray(contents) || turnStartIdx < 0)
|
|
307
|
+
return false;
|
|
308
|
+
for (let i = turnStartIdx; i < contents.length; i++) {
|
|
309
|
+
const msg = contents[i];
|
|
310
|
+
if (msg?.role === "model" && looksLikeCompactedThinkingTurn(msg)) {
|
|
311
|
+
return true;
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
return false;
|
|
315
|
+
}
|
|
316
|
+
//# sourceMappingURL=thinking-recovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"thinking-recovery.js","sourceRoot":"","sources":["../../../src/plugin/thinking-recovery.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { OAuthAuthDetails, PluginClient } from "./types";
|
|
2
|
+
export declare class AntigravityTokenRefreshError extends Error {
|
|
3
|
+
code?: string;
|
|
4
|
+
description?: string;
|
|
5
|
+
status: number;
|
|
6
|
+
statusText: string;
|
|
7
|
+
constructor(options: {
|
|
8
|
+
message: string;
|
|
9
|
+
code?: string;
|
|
10
|
+
description?: string;
|
|
11
|
+
status: number;
|
|
12
|
+
statusText: string;
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Refreshes an Antigravity OAuth access token, updates persisted credentials, and handles revocation.
|
|
17
|
+
*/
|
|
18
|
+
export declare function refreshAccessToken(auth: OAuthAuthDetails, client: PluginClient, providerId: string): Promise<OAuthAuthDetails | undefined>;
|
|
19
|
+
//# sourceMappingURL=token.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token.d.ts","sourceRoot":"","sources":["../../../src/plugin/token.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAgB,MAAM,SAAS,CAAC;AAsD5E,qBAAa,4BAA6B,SAAQ,KAAK;IACrD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;gBAEP,OAAO,EAAE;QACnB,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,EAAE,MAAM,CAAC;KACpB;CAQF;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,gBAAgB,EACtB,MAAM,EAAE,YAAY,EACpB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC,CAgFvC"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { ANTIGRAVITY_CLIENT_ID, ANTIGRAVITY_CLIENT_SECRET } from "../constants";
|
|
2
|
+
import { formatRefreshParts, parseRefreshParts, calculateTokenExpiry } from "./auth";
|
|
3
|
+
import { clearCachedAuth, storeCachedAuth } from "./cache";
|
|
4
|
+
import { createLogger } from "./logger";
|
|
5
|
+
import { invalidateProjectContextCache } from "./project";
|
|
6
|
+
const log = createLogger("token");
|
|
7
|
+
/**
|
|
8
|
+
* Parses OAuth error payloads returned by Google token endpoints, tolerating varied shapes.
|
|
9
|
+
*/
|
|
10
|
+
function parseOAuthErrorPayload(text) {
|
|
11
|
+
if (!text) {
|
|
12
|
+
return {};
|
|
13
|
+
}
|
|
14
|
+
try {
|
|
15
|
+
const payload = JSON.parse(text);
|
|
16
|
+
if (!payload || typeof payload !== "object") {
|
|
17
|
+
return { description: text };
|
|
18
|
+
}
|
|
19
|
+
let code;
|
|
20
|
+
if (typeof payload.error === "string") {
|
|
21
|
+
code = payload.error;
|
|
22
|
+
}
|
|
23
|
+
else if (payload.error && typeof payload.error === "object") {
|
|
24
|
+
code = payload.error.status ?? payload.error.code;
|
|
25
|
+
if (!payload.error_description && payload.error.message) {
|
|
26
|
+
return { code, description: payload.error.message };
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
const description = payload.error_description;
|
|
30
|
+
if (description) {
|
|
31
|
+
return { code, description };
|
|
32
|
+
}
|
|
33
|
+
if (payload.error && typeof payload.error === "object" && payload.error.message) {
|
|
34
|
+
return { code, description: payload.error.message };
|
|
35
|
+
}
|
|
36
|
+
return { code };
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
return { description: text };
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
export class AntigravityTokenRefreshError extends Error {
|
|
43
|
+
code;
|
|
44
|
+
description;
|
|
45
|
+
status;
|
|
46
|
+
statusText;
|
|
47
|
+
constructor(options) {
|
|
48
|
+
super(options.message);
|
|
49
|
+
this.name = "AntigravityTokenRefreshError";
|
|
50
|
+
this.code = options.code;
|
|
51
|
+
this.description = options.description;
|
|
52
|
+
this.status = options.status;
|
|
53
|
+
this.statusText = options.statusText;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Refreshes an Antigravity OAuth access token, updates persisted credentials, and handles revocation.
|
|
58
|
+
*/
|
|
59
|
+
export async function refreshAccessToken(auth, client, providerId) {
|
|
60
|
+
const parts = parseRefreshParts(auth.refresh);
|
|
61
|
+
if (!parts.refreshToken) {
|
|
62
|
+
return undefined;
|
|
63
|
+
}
|
|
64
|
+
try {
|
|
65
|
+
const startTime = Date.now();
|
|
66
|
+
const response = await fetch("https://oauth2.googleapis.com/token", {
|
|
67
|
+
method: "POST",
|
|
68
|
+
headers: {
|
|
69
|
+
"Content-Type": "application/x-www-form-urlencoded",
|
|
70
|
+
},
|
|
71
|
+
body: new URLSearchParams({
|
|
72
|
+
grant_type: "refresh_token",
|
|
73
|
+
refresh_token: parts.refreshToken,
|
|
74
|
+
client_id: ANTIGRAVITY_CLIENT_ID,
|
|
75
|
+
client_secret: ANTIGRAVITY_CLIENT_SECRET,
|
|
76
|
+
}),
|
|
77
|
+
});
|
|
78
|
+
if (!response.ok) {
|
|
79
|
+
let errorText;
|
|
80
|
+
try {
|
|
81
|
+
errorText = await response.text();
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
errorText = undefined;
|
|
85
|
+
}
|
|
86
|
+
const { code, description } = parseOAuthErrorPayload(errorText);
|
|
87
|
+
const details = [code, description ?? errorText].filter(Boolean).join(": ");
|
|
88
|
+
const baseMessage = `Antigravity token refresh failed (${response.status} ${response.statusText})`;
|
|
89
|
+
const message = details ? `${baseMessage} - ${details}` : baseMessage;
|
|
90
|
+
log.warn("Token refresh failed", { status: response.status, code, details });
|
|
91
|
+
if (code === "invalid_grant") {
|
|
92
|
+
log.warn("Google revoked the stored refresh token - reauthentication required");
|
|
93
|
+
invalidateProjectContextCache(auth.refresh);
|
|
94
|
+
clearCachedAuth(auth.refresh);
|
|
95
|
+
}
|
|
96
|
+
throw new AntigravityTokenRefreshError({
|
|
97
|
+
message,
|
|
98
|
+
code,
|
|
99
|
+
description: description ?? errorText,
|
|
100
|
+
status: response.status,
|
|
101
|
+
statusText: response.statusText,
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
const payload = (await response.json());
|
|
105
|
+
const refreshedParts = {
|
|
106
|
+
refreshToken: payload.refresh_token ?? parts.refreshToken,
|
|
107
|
+
projectId: parts.projectId,
|
|
108
|
+
managedProjectId: parts.managedProjectId,
|
|
109
|
+
};
|
|
110
|
+
const updatedAuth = {
|
|
111
|
+
...auth,
|
|
112
|
+
access: payload.access_token,
|
|
113
|
+
expires: calculateTokenExpiry(startTime, payload.expires_in),
|
|
114
|
+
refresh: formatRefreshParts(refreshedParts),
|
|
115
|
+
};
|
|
116
|
+
storeCachedAuth(updatedAuth);
|
|
117
|
+
invalidateProjectContextCache(auth.refresh);
|
|
118
|
+
return updatedAuth;
|
|
119
|
+
}
|
|
120
|
+
catch (error) {
|
|
121
|
+
if (error instanceof AntigravityTokenRefreshError) {
|
|
122
|
+
throw error;
|
|
123
|
+
}
|
|
124
|
+
log.error("Unexpected token refresh error", { error: String(error) });
|
|
125
|
+
return undefined;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=token.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token.js","sourceRoot":"","sources":["../../../src/plugin/token.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,80 @@
|
|
|
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 type { RequestPayload, ThinkingConfig } from "./types";
|
|
11
|
+
/** Claude thinking models need a sufficiently large max output token limit when thinking is enabled */
|
|
12
|
+
export declare const CLAUDE_THINKING_MAX_OUTPUT_TOKENS = 64000;
|
|
13
|
+
/** Interleaved thinking hint appended to system instructions */
|
|
14
|
+
export declare 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 declare function isClaudeModel(model: string): boolean;
|
|
19
|
+
/**
|
|
20
|
+
* Check if a model is a Claude thinking model.
|
|
21
|
+
*/
|
|
22
|
+
export declare function isClaudeThinkingModel(model: string): boolean;
|
|
23
|
+
/**
|
|
24
|
+
* Configure Claude tool calling to use VALIDATED mode.
|
|
25
|
+
* This ensures proper tool call validation on the backend.
|
|
26
|
+
*/
|
|
27
|
+
export declare function configureClaudeToolConfig(payload: RequestPayload): void;
|
|
28
|
+
/**
|
|
29
|
+
* Build Claude thinking config with snake_case keys.
|
|
30
|
+
*/
|
|
31
|
+
export declare function buildClaudeThinkingConfig(includeThoughts: boolean, thinkingBudget?: number): ThinkingConfig;
|
|
32
|
+
/**
|
|
33
|
+
* Ensure maxOutputTokens is sufficient for Claude thinking models.
|
|
34
|
+
* If thinking budget is set, max output must be larger than the budget.
|
|
35
|
+
*/
|
|
36
|
+
export declare function ensureClaudeMaxOutputTokens(generationConfig: Record<string, unknown>, thinkingBudget: number): void;
|
|
37
|
+
/**
|
|
38
|
+
* Append interleaved thinking hint to system instruction.
|
|
39
|
+
* Handles various system instruction formats (string, object with parts array).
|
|
40
|
+
*/
|
|
41
|
+
export declare function appendClaudeThinkingHint(payload: RequestPayload, hint?: string): void;
|
|
42
|
+
/**
|
|
43
|
+
* Normalize tools for Claude models.
|
|
44
|
+
* Converts various tool formats to functionDeclarations format.
|
|
45
|
+
*
|
|
46
|
+
* @returns Debug info about tool normalization
|
|
47
|
+
*/
|
|
48
|
+
export declare function normalizeClaudeTools(payload: RequestPayload, cleanJSONSchema: (schema: unknown) => Record<string, unknown>): {
|
|
49
|
+
toolDebugMissing: number;
|
|
50
|
+
toolDebugSummaries: string[];
|
|
51
|
+
};
|
|
52
|
+
/**
|
|
53
|
+
* Convert snake_case stop_sequences to camelCase stopSequences.
|
|
54
|
+
*/
|
|
55
|
+
export declare function convertStopSequences(generationConfig: Record<string, unknown>): void;
|
|
56
|
+
/**
|
|
57
|
+
* Apply all Claude-specific transformations to a request payload.
|
|
58
|
+
*/
|
|
59
|
+
export interface ClaudeTransformOptions {
|
|
60
|
+
/** The effective model name (resolved) */
|
|
61
|
+
model: string;
|
|
62
|
+
/** Tier-based thinking budget (from model suffix) */
|
|
63
|
+
tierThinkingBudget?: number;
|
|
64
|
+
/** Normalized thinking config from user settings */
|
|
65
|
+
normalizedThinking?: {
|
|
66
|
+
includeThoughts?: boolean;
|
|
67
|
+
thinkingBudget?: number;
|
|
68
|
+
};
|
|
69
|
+
/** Function to clean JSON schema for Antigravity */
|
|
70
|
+
cleanJSONSchema: (schema: unknown) => Record<string, unknown>;
|
|
71
|
+
}
|
|
72
|
+
export interface ClaudeTransformResult {
|
|
73
|
+
toolDebugMissing: number;
|
|
74
|
+
toolDebugSummaries: string[];
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Apply all Claude-specific transformations.
|
|
78
|
+
*/
|
|
79
|
+
export declare function applyClaudeTransforms(payload: RequestPayload, options: ClaudeTransformOptions): ClaudeTransformResult;
|
|
80
|
+
//# sourceMappingURL=claude.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude.d.ts","sourceRoot":"","sources":["../../../../src/plugin/transform/claude.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAM9D,uGAAuG;AACvG,eAAO,MAAM,iCAAiC,QAAS,CAAC;AAExD,gEAAgE;AAChE,eAAO,MAAM,gCAAgC,qPACuM,CAAC;AAErP;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAEpD;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAG5D;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI,CAcvE;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,eAAe,EAAE,OAAO,EACxB,cAAc,CAAC,EAAE,MAAM,GACtB,cAAc,CAOhB;AAED;;;GAGG;AACH,wBAAgB,2BAA2B,CACzC,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACzC,cAAc,EAAE,MAAM,GACrB,IAAI,CASN;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,cAAc,EACvB,IAAI,GAAE,MAAyC,GAC9C,IAAI,CAuCN;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,cAAc,EACvB,eAAe,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5D;IAAE,gBAAgB,EAAE,MAAM,CAAC;IAAC,kBAAkB,EAAE,MAAM,EAAE,CAAA;CAAE,CA2I5D;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACxC,IAAI,CAKN;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,0CAA0C;IAC1C,KAAK,EAAE,MAAM,CAAC;IACd,qDAAqD;IACrD,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,oDAAoD;IACpD,kBAAkB,CAAC,EAAE;QAAE,eAAe,CAAC,EAAE,OAAO,CAAC;QAAC,cAAc,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5E,oDAAoD;IACpD,eAAe,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/D;AAED,MAAM,WAAW,qBAAqB;IACpC,gBAAgB,EAAE,MAAM,CAAC;IACzB,kBAAkB,EAAE,MAAM,EAAE,CAAC;CAC9B;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,cAAc,EACvB,OAAO,EAAE,sBAAsB,GAC9B,qBAAqB,CAuCvB"}
|