opencode-openai-codex-auth-multi 4.5.0 → 4.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +22 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +19 -2
- package/dist/index.js.map +1 -1
- package/dist/lib/cli.d.ts.map +1 -1
- package/dist/lib/cli.js +4 -3
- package/dist/lib/cli.js.map +1 -1
- package/dist/lib/config.d.ts +2 -0
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +8 -0
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/context-overflow.d.ts +27 -0
- package/dist/lib/context-overflow.d.ts.map +1 -0
- package/dist/lib/context-overflow.js +124 -0
- package/dist/lib/context-overflow.js.map +1 -0
- package/dist/lib/recovery/constants.d.ts +12 -0
- package/dist/lib/recovery/constants.d.ts.map +1 -0
- package/dist/lib/recovery/constants.js +25 -0
- package/dist/lib/recovery/constants.js.map +1 -0
- package/dist/lib/recovery/index.d.ts +12 -0
- package/dist/lib/recovery/index.d.ts.map +1 -0
- package/dist/lib/recovery/index.js +12 -0
- package/dist/lib/recovery/index.js.map +1 -0
- package/dist/lib/recovery/storage.d.ts +24 -0
- package/dist/lib/recovery/storage.d.ts.map +1 -0
- package/dist/lib/recovery/storage.js +354 -0
- package/dist/lib/recovery/storage.js.map +1 -0
- package/dist/lib/recovery/types.d.ts +116 -0
- package/dist/lib/recovery/types.d.ts.map +1 -0
- package/dist/lib/recovery/types.js +7 -0
- package/dist/lib/recovery/types.js.map +1 -0
- package/dist/lib/recovery.d.ts +31 -0
- package/dist/lib/recovery.d.ts.map +1 -0
- package/dist/lib/recovery.js +308 -0
- package/dist/lib/recovery.js.map +1 -0
- package/dist/lib/request/fetch-helpers.d.ts +1 -0
- package/dist/lib/request/fetch-helpers.d.ts.map +1 -1
- package/dist/lib/request/fetch-helpers.js +8 -1
- package/dist/lib/request/fetch-helpers.js.map +1 -1
- package/dist/lib/request/helpers/input-utils.d.ts +1 -0
- package/dist/lib/request/helpers/input-utils.d.ts.map +1 -1
- package/dist/lib/request/helpers/input-utils.js +39 -0
- package/dist/lib/request/helpers/input-utils.js.map +1 -1
- package/dist/lib/request/request-transformer.d.ts.map +1 -1
- package/dist/lib/request/request-transformer.js +2 -1
- package/dist/lib/request/request-transformer.js.map +1 -1
- package/dist/lib/types.d.ts +2 -27
- package/dist/lib/types.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session recovery module for opencode-openai-codex-auth-multi.
|
|
3
|
+
*
|
|
4
|
+
* Provides recovery from:
|
|
5
|
+
* - tool_result_missing: Interrupted tool executions
|
|
6
|
+
* - thinking_block_order: Corrupted thinking blocks
|
|
7
|
+
* - thinking_disabled_violation: Thinking in non-thinking model
|
|
8
|
+
*/
|
|
9
|
+
export * from "./types.js";
|
|
10
|
+
export * from "./constants.js";
|
|
11
|
+
export * from "./storage.js";
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../lib/recovery/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Storage utilities for reading OpenCode's session data.
|
|
3
|
+
*
|
|
4
|
+
* Based on opencode-antigravity-auth recovery module.
|
|
5
|
+
*/
|
|
6
|
+
import type { StoredMessageMeta, StoredPart } from "./types.js";
|
|
7
|
+
export declare function generatePartId(): string;
|
|
8
|
+
export declare function getMessageDir(sessionID: string): string;
|
|
9
|
+
export declare function readMessages(sessionID: string): StoredMessageMeta[];
|
|
10
|
+
export declare function readParts(messageID: string): StoredPart[];
|
|
11
|
+
export declare function hasContent(part: StoredPart): boolean;
|
|
12
|
+
export declare function messageHasContent(messageID: string): boolean;
|
|
13
|
+
export declare function injectTextPart(sessionID: string, messageID: string, text: string): boolean;
|
|
14
|
+
export declare function findMessagesWithThinkingBlocks(sessionID: string): string[];
|
|
15
|
+
export declare function findMessagesWithThinkingOnly(sessionID: string): string[];
|
|
16
|
+
export declare function findMessagesWithOrphanThinking(sessionID: string): string[];
|
|
17
|
+
export declare function prependThinkingPart(sessionID: string, messageID: string): boolean;
|
|
18
|
+
export declare function stripThinkingParts(messageID: string): boolean;
|
|
19
|
+
export declare function findEmptyMessages(sessionID: string): string[];
|
|
20
|
+
export declare function findEmptyMessageByIndex(sessionID: string, targetIndex: number): string | null;
|
|
21
|
+
export declare function findMessageByIndexNeedingThinking(sessionID: string, targetIndex: number): string | null;
|
|
22
|
+
export declare function replaceEmptyTextParts(messageID: string, replacementText: string): boolean;
|
|
23
|
+
export declare function findMessagesWithEmptyTextParts(sessionID: string): string[];
|
|
24
|
+
//# sourceMappingURL=storage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../../lib/recovery/storage.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EAAE,iBAAiB,EAAE,UAAU,EAAkB,MAAM,YAAY,CAAC;AAMhF,wBAAgB,cAAc,IAAI,MAAM,CAIvC;AAMD,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAqBvD;AAMD,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,iBAAiB,EAAE,CAyBnE;AAMD,wBAAgB,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,UAAU,EAAE,CAoBzD;AAMD,wBAAgB,UAAU,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAkBpD;AAED,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAG5D;AAMD,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAuB1F;AAMD,wBAAgB,8BAA8B,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,CAe1E;AAED,wBAAgB,4BAA4B,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,CAoBxE;AAED,wBAAgB,8BAA8B,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,CAwB1E;AAED,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAuBjF;AAED,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAyB7D;AAMD,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,CAW7D;AAED,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAkB7F;AAED,wBAAgB,iCAAiC,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAsBvG;AAED,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,OAAO,CA+BzF;AAED,wBAAgB,8BAA8B,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,CAkB1E"}
|
|
@@ -0,0 +1,354 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Storage utilities for reading OpenCode's session data.
|
|
3
|
+
*
|
|
4
|
+
* Based on opencode-antigravity-auth recovery module.
|
|
5
|
+
*/
|
|
6
|
+
import { existsSync, mkdirSync, readdirSync, readFileSync, unlinkSync, writeFileSync } from "node:fs";
|
|
7
|
+
import { join } from "node:path";
|
|
8
|
+
import { MESSAGE_STORAGE, PART_STORAGE, THINKING_TYPES, META_TYPES } from "./constants.js";
|
|
9
|
+
// =============================================================================
|
|
10
|
+
// ID Generation
|
|
11
|
+
// =============================================================================
|
|
12
|
+
export function generatePartId() {
|
|
13
|
+
const timestamp = Date.now().toString(16);
|
|
14
|
+
const random = Math.random().toString(36).substring(2, 10);
|
|
15
|
+
return `prt_${timestamp}${random}`;
|
|
16
|
+
}
|
|
17
|
+
// =============================================================================
|
|
18
|
+
// Directory Helpers
|
|
19
|
+
// =============================================================================
|
|
20
|
+
export function getMessageDir(sessionID) {
|
|
21
|
+
if (!existsSync(MESSAGE_STORAGE))
|
|
22
|
+
return "";
|
|
23
|
+
const directPath = join(MESSAGE_STORAGE, sessionID);
|
|
24
|
+
if (existsSync(directPath)) {
|
|
25
|
+
return directPath;
|
|
26
|
+
}
|
|
27
|
+
// Search in subdirectories
|
|
28
|
+
try {
|
|
29
|
+
for (const dir of readdirSync(MESSAGE_STORAGE)) {
|
|
30
|
+
const sessionPath = join(MESSAGE_STORAGE, dir, sessionID);
|
|
31
|
+
if (existsSync(sessionPath)) {
|
|
32
|
+
return sessionPath;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
// Ignore read errors
|
|
38
|
+
}
|
|
39
|
+
return "";
|
|
40
|
+
}
|
|
41
|
+
// =============================================================================
|
|
42
|
+
// Message Reading
|
|
43
|
+
// =============================================================================
|
|
44
|
+
export function readMessages(sessionID) {
|
|
45
|
+
const messageDir = getMessageDir(sessionID);
|
|
46
|
+
if (!messageDir || !existsSync(messageDir))
|
|
47
|
+
return [];
|
|
48
|
+
const messages = [];
|
|
49
|
+
try {
|
|
50
|
+
for (const file of readdirSync(messageDir)) {
|
|
51
|
+
if (!file.endsWith(".json"))
|
|
52
|
+
continue;
|
|
53
|
+
try {
|
|
54
|
+
const content = readFileSync(join(messageDir, file), "utf-8");
|
|
55
|
+
messages.push(JSON.parse(content));
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
return [];
|
|
64
|
+
}
|
|
65
|
+
return messages.sort((a, b) => {
|
|
66
|
+
const aTime = a.time?.created ?? 0;
|
|
67
|
+
const bTime = b.time?.created ?? 0;
|
|
68
|
+
if (aTime !== bTime)
|
|
69
|
+
return aTime - bTime;
|
|
70
|
+
return a.id.localeCompare(b.id);
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
// =============================================================================
|
|
74
|
+
// Part Reading
|
|
75
|
+
// =============================================================================
|
|
76
|
+
export function readParts(messageID) {
|
|
77
|
+
const partDir = join(PART_STORAGE, messageID);
|
|
78
|
+
if (!existsSync(partDir))
|
|
79
|
+
return [];
|
|
80
|
+
const parts = [];
|
|
81
|
+
try {
|
|
82
|
+
for (const file of readdirSync(partDir)) {
|
|
83
|
+
if (!file.endsWith(".json"))
|
|
84
|
+
continue;
|
|
85
|
+
try {
|
|
86
|
+
const content = readFileSync(join(partDir, file), "utf-8");
|
|
87
|
+
parts.push(JSON.parse(content));
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
continue;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
return [];
|
|
96
|
+
}
|
|
97
|
+
return parts;
|
|
98
|
+
}
|
|
99
|
+
// =============================================================================
|
|
100
|
+
// Content Helpers
|
|
101
|
+
// =============================================================================
|
|
102
|
+
export function hasContent(part) {
|
|
103
|
+
if (THINKING_TYPES.has(part.type))
|
|
104
|
+
return false;
|
|
105
|
+
if (META_TYPES.has(part.type))
|
|
106
|
+
return false;
|
|
107
|
+
if (part.type === "text") {
|
|
108
|
+
const textPart = part;
|
|
109
|
+
return !!(textPart.text?.trim());
|
|
110
|
+
}
|
|
111
|
+
if (part.type === "tool" || part.type === "tool_use") {
|
|
112
|
+
return true;
|
|
113
|
+
}
|
|
114
|
+
if (part.type === "tool_result") {
|
|
115
|
+
return true;
|
|
116
|
+
}
|
|
117
|
+
return false;
|
|
118
|
+
}
|
|
119
|
+
export function messageHasContent(messageID) {
|
|
120
|
+
const parts = readParts(messageID);
|
|
121
|
+
return parts.some(hasContent);
|
|
122
|
+
}
|
|
123
|
+
// =============================================================================
|
|
124
|
+
// Part Injection (for recovery)
|
|
125
|
+
// =============================================================================
|
|
126
|
+
export function injectTextPart(sessionID, messageID, text) {
|
|
127
|
+
const partDir = join(PART_STORAGE, messageID);
|
|
128
|
+
try {
|
|
129
|
+
if (!existsSync(partDir)) {
|
|
130
|
+
mkdirSync(partDir, { recursive: true });
|
|
131
|
+
}
|
|
132
|
+
const partId = generatePartId();
|
|
133
|
+
const part = {
|
|
134
|
+
id: partId,
|
|
135
|
+
sessionID,
|
|
136
|
+
messageID,
|
|
137
|
+
type: "text",
|
|
138
|
+
text,
|
|
139
|
+
synthetic: true,
|
|
140
|
+
};
|
|
141
|
+
writeFileSync(join(partDir, `${partId}.json`), JSON.stringify(part, null, 2));
|
|
142
|
+
return true;
|
|
143
|
+
}
|
|
144
|
+
catch {
|
|
145
|
+
return false;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
// =============================================================================
|
|
149
|
+
// Thinking Block Recovery
|
|
150
|
+
// =============================================================================
|
|
151
|
+
export function findMessagesWithThinkingBlocks(sessionID) {
|
|
152
|
+
const messages = readMessages(sessionID);
|
|
153
|
+
const result = [];
|
|
154
|
+
for (const msg of messages) {
|
|
155
|
+
if (msg.role !== "assistant")
|
|
156
|
+
continue;
|
|
157
|
+
const parts = readParts(msg.id);
|
|
158
|
+
const hasThinking = parts.some((p) => THINKING_TYPES.has(p.type));
|
|
159
|
+
if (hasThinking) {
|
|
160
|
+
result.push(msg.id);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
return result;
|
|
164
|
+
}
|
|
165
|
+
export function findMessagesWithThinkingOnly(sessionID) {
|
|
166
|
+
const messages = readMessages(sessionID);
|
|
167
|
+
const result = [];
|
|
168
|
+
for (const msg of messages) {
|
|
169
|
+
if (msg.role !== "assistant")
|
|
170
|
+
continue;
|
|
171
|
+
const parts = readParts(msg.id);
|
|
172
|
+
if (parts.length === 0)
|
|
173
|
+
continue;
|
|
174
|
+
const hasThinking = parts.some((p) => THINKING_TYPES.has(p.type));
|
|
175
|
+
const hasTextContent = parts.some(hasContent);
|
|
176
|
+
// Has thinking but no text content = orphan thinking
|
|
177
|
+
if (hasThinking && !hasTextContent) {
|
|
178
|
+
result.push(msg.id);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
return result;
|
|
182
|
+
}
|
|
183
|
+
export function findMessagesWithOrphanThinking(sessionID) {
|
|
184
|
+
const messages = readMessages(sessionID);
|
|
185
|
+
const result = [];
|
|
186
|
+
for (let i = 0; i < messages.length; i++) {
|
|
187
|
+
const msg = messages[i];
|
|
188
|
+
if (!msg || msg.role !== "assistant")
|
|
189
|
+
continue;
|
|
190
|
+
const parts = readParts(msg.id);
|
|
191
|
+
if (parts.length === 0)
|
|
192
|
+
continue;
|
|
193
|
+
const sortedParts = [...parts].sort((a, b) => a.id.localeCompare(b.id));
|
|
194
|
+
const firstPart = sortedParts[0];
|
|
195
|
+
if (!firstPart)
|
|
196
|
+
continue;
|
|
197
|
+
const firstIsThinking = THINKING_TYPES.has(firstPart.type);
|
|
198
|
+
// If first part is not thinking, it's orphan
|
|
199
|
+
if (!firstIsThinking) {
|
|
200
|
+
result.push(msg.id);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
return result;
|
|
204
|
+
}
|
|
205
|
+
export function prependThinkingPart(sessionID, messageID) {
|
|
206
|
+
const partDir = join(PART_STORAGE, messageID);
|
|
207
|
+
try {
|
|
208
|
+
if (!existsSync(partDir)) {
|
|
209
|
+
mkdirSync(partDir, { recursive: true });
|
|
210
|
+
}
|
|
211
|
+
const partId = "prt_0000000000_thinking";
|
|
212
|
+
const part = {
|
|
213
|
+
id: partId,
|
|
214
|
+
sessionID,
|
|
215
|
+
messageID,
|
|
216
|
+
type: "thinking",
|
|
217
|
+
thinking: "",
|
|
218
|
+
synthetic: true,
|
|
219
|
+
};
|
|
220
|
+
writeFileSync(join(partDir, `${partId}.json`), JSON.stringify(part, null, 2));
|
|
221
|
+
return true;
|
|
222
|
+
}
|
|
223
|
+
catch {
|
|
224
|
+
return false;
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
export function stripThinkingParts(messageID) {
|
|
228
|
+
const partDir = join(PART_STORAGE, messageID);
|
|
229
|
+
if (!existsSync(partDir))
|
|
230
|
+
return false;
|
|
231
|
+
let anyRemoved = false;
|
|
232
|
+
try {
|
|
233
|
+
for (const file of readdirSync(partDir)) {
|
|
234
|
+
if (!file.endsWith(".json"))
|
|
235
|
+
continue;
|
|
236
|
+
try {
|
|
237
|
+
const filePath = join(partDir, file);
|
|
238
|
+
const content = readFileSync(filePath, "utf-8");
|
|
239
|
+
const part = JSON.parse(content);
|
|
240
|
+
if (THINKING_TYPES.has(part.type)) {
|
|
241
|
+
unlinkSync(filePath);
|
|
242
|
+
anyRemoved = true;
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
catch {
|
|
246
|
+
continue;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
catch {
|
|
251
|
+
return false;
|
|
252
|
+
}
|
|
253
|
+
return anyRemoved;
|
|
254
|
+
}
|
|
255
|
+
// =============================================================================
|
|
256
|
+
// Empty Message Recovery
|
|
257
|
+
// =============================================================================
|
|
258
|
+
export function findEmptyMessages(sessionID) {
|
|
259
|
+
const messages = readMessages(sessionID);
|
|
260
|
+
const emptyIds = [];
|
|
261
|
+
for (const msg of messages) {
|
|
262
|
+
if (!messageHasContent(msg.id)) {
|
|
263
|
+
emptyIds.push(msg.id);
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
return emptyIds;
|
|
267
|
+
}
|
|
268
|
+
export function findEmptyMessageByIndex(sessionID, targetIndex) {
|
|
269
|
+
const messages = readMessages(sessionID);
|
|
270
|
+
// API index may differ from storage index due to system messages
|
|
271
|
+
const indicesToTry = [targetIndex, targetIndex - 1, targetIndex - 2];
|
|
272
|
+
for (const idx of indicesToTry) {
|
|
273
|
+
if (idx < 0 || idx >= messages.length)
|
|
274
|
+
continue;
|
|
275
|
+
const targetMsg = messages[idx];
|
|
276
|
+
if (!targetMsg)
|
|
277
|
+
continue;
|
|
278
|
+
if (!messageHasContent(targetMsg.id)) {
|
|
279
|
+
return targetMsg.id;
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
return null;
|
|
283
|
+
}
|
|
284
|
+
export function findMessageByIndexNeedingThinking(sessionID, targetIndex) {
|
|
285
|
+
const messages = readMessages(sessionID);
|
|
286
|
+
if (targetIndex < 0 || targetIndex >= messages.length)
|
|
287
|
+
return null;
|
|
288
|
+
const targetMsg = messages[targetIndex];
|
|
289
|
+
if (!targetMsg || targetMsg.role !== "assistant")
|
|
290
|
+
return null;
|
|
291
|
+
const parts = readParts(targetMsg.id);
|
|
292
|
+
if (parts.length === 0)
|
|
293
|
+
return null;
|
|
294
|
+
const sortedParts = [...parts].sort((a, b) => a.id.localeCompare(b.id));
|
|
295
|
+
const firstPart = sortedParts[0];
|
|
296
|
+
if (!firstPart)
|
|
297
|
+
return null;
|
|
298
|
+
const firstIsThinking = THINKING_TYPES.has(firstPart.type);
|
|
299
|
+
if (!firstIsThinking) {
|
|
300
|
+
return targetMsg.id;
|
|
301
|
+
}
|
|
302
|
+
return null;
|
|
303
|
+
}
|
|
304
|
+
export function replaceEmptyTextParts(messageID, replacementText) {
|
|
305
|
+
const partDir = join(PART_STORAGE, messageID);
|
|
306
|
+
if (!existsSync(partDir))
|
|
307
|
+
return false;
|
|
308
|
+
let anyReplaced = false;
|
|
309
|
+
try {
|
|
310
|
+
for (const file of readdirSync(partDir)) {
|
|
311
|
+
if (!file.endsWith(".json"))
|
|
312
|
+
continue;
|
|
313
|
+
try {
|
|
314
|
+
const filePath = join(partDir, file);
|
|
315
|
+
const content = readFileSync(filePath, "utf-8");
|
|
316
|
+
const part = JSON.parse(content);
|
|
317
|
+
if (part.type === "text") {
|
|
318
|
+
const textPart = part;
|
|
319
|
+
if (!textPart.text?.trim()) {
|
|
320
|
+
textPart.text = replacementText;
|
|
321
|
+
textPart.synthetic = true;
|
|
322
|
+
writeFileSync(filePath, JSON.stringify(textPart, null, 2));
|
|
323
|
+
anyReplaced = true;
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
catch {
|
|
328
|
+
continue;
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
catch {
|
|
333
|
+
return false;
|
|
334
|
+
}
|
|
335
|
+
return anyReplaced;
|
|
336
|
+
}
|
|
337
|
+
export function findMessagesWithEmptyTextParts(sessionID) {
|
|
338
|
+
const messages = readMessages(sessionID);
|
|
339
|
+
const result = [];
|
|
340
|
+
for (const msg of messages) {
|
|
341
|
+
const parts = readParts(msg.id);
|
|
342
|
+
const hasEmptyTextPart = parts.some((p) => {
|
|
343
|
+
if (p.type !== "text")
|
|
344
|
+
return false;
|
|
345
|
+
const textPart = p;
|
|
346
|
+
return !textPart.text?.trim();
|
|
347
|
+
});
|
|
348
|
+
if (hasEmptyTextPart) {
|
|
349
|
+
result.push(msg.id);
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
return result;
|
|
353
|
+
}
|
|
354
|
+
//# sourceMappingURL=storage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../../../lib/recovery/storage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Types for session recovery.
|
|
3
|
+
*
|
|
4
|
+
* Based on opencode-antigravity-auth recovery module.
|
|
5
|
+
*/
|
|
6
|
+
export type ThinkingPartType = "thinking" | "redacted_thinking" | "reasoning";
|
|
7
|
+
export type MetaPartType = "step-start" | "step-finish";
|
|
8
|
+
export type ContentPartType = "text" | "tool" | "tool_use" | "tool_result";
|
|
9
|
+
export interface StoredMessageMeta {
|
|
10
|
+
id: string;
|
|
11
|
+
sessionID: string;
|
|
12
|
+
role: "user" | "assistant";
|
|
13
|
+
parentID?: string;
|
|
14
|
+
time?: {
|
|
15
|
+
created: number;
|
|
16
|
+
completed?: number;
|
|
17
|
+
};
|
|
18
|
+
error?: unknown;
|
|
19
|
+
}
|
|
20
|
+
export interface StoredTextPart {
|
|
21
|
+
id: string;
|
|
22
|
+
sessionID: string;
|
|
23
|
+
messageID: string;
|
|
24
|
+
type: "text";
|
|
25
|
+
text: string;
|
|
26
|
+
synthetic?: boolean;
|
|
27
|
+
ignored?: boolean;
|
|
28
|
+
}
|
|
29
|
+
export interface StoredToolPart {
|
|
30
|
+
id: string;
|
|
31
|
+
sessionID: string;
|
|
32
|
+
messageID: string;
|
|
33
|
+
type: "tool";
|
|
34
|
+
callID: string;
|
|
35
|
+
tool: string;
|
|
36
|
+
state: {
|
|
37
|
+
status: "pending" | "running" | "completed" | "error";
|
|
38
|
+
input: Record<string, unknown>;
|
|
39
|
+
output?: string;
|
|
40
|
+
error?: string;
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
export interface StoredReasoningPart {
|
|
44
|
+
id: string;
|
|
45
|
+
sessionID: string;
|
|
46
|
+
messageID: string;
|
|
47
|
+
type: "reasoning";
|
|
48
|
+
text: string;
|
|
49
|
+
}
|
|
50
|
+
export interface StoredStepPart {
|
|
51
|
+
id: string;
|
|
52
|
+
sessionID: string;
|
|
53
|
+
messageID: string;
|
|
54
|
+
type: "step-start" | "step-finish";
|
|
55
|
+
}
|
|
56
|
+
export type StoredPart = StoredTextPart | StoredToolPart | StoredReasoningPart | StoredStepPart | {
|
|
57
|
+
id: string;
|
|
58
|
+
sessionID: string;
|
|
59
|
+
messageID: string;
|
|
60
|
+
type: string;
|
|
61
|
+
[key: string]: unknown;
|
|
62
|
+
};
|
|
63
|
+
export interface MessagePart {
|
|
64
|
+
type: string;
|
|
65
|
+
id?: string;
|
|
66
|
+
text?: string;
|
|
67
|
+
thinking?: string;
|
|
68
|
+
name?: string;
|
|
69
|
+
input?: Record<string, unknown>;
|
|
70
|
+
callID?: string;
|
|
71
|
+
}
|
|
72
|
+
export interface MessageData {
|
|
73
|
+
info?: {
|
|
74
|
+
id?: string;
|
|
75
|
+
role?: string;
|
|
76
|
+
sessionID?: string;
|
|
77
|
+
parentID?: string;
|
|
78
|
+
error?: unknown;
|
|
79
|
+
agent?: string;
|
|
80
|
+
model?: {
|
|
81
|
+
providerID: string;
|
|
82
|
+
modelID: string;
|
|
83
|
+
};
|
|
84
|
+
system?: string;
|
|
85
|
+
tools?: Record<string, boolean>;
|
|
86
|
+
};
|
|
87
|
+
parts?: MessagePart[];
|
|
88
|
+
}
|
|
89
|
+
export interface MessageInfo {
|
|
90
|
+
id?: string;
|
|
91
|
+
role?: string;
|
|
92
|
+
sessionID?: string;
|
|
93
|
+
parentID?: string;
|
|
94
|
+
error?: unknown;
|
|
95
|
+
}
|
|
96
|
+
export interface ResumeConfig {
|
|
97
|
+
sessionID: string;
|
|
98
|
+
agent?: string;
|
|
99
|
+
model?: {
|
|
100
|
+
providerID: string;
|
|
101
|
+
modelID: string;
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
export type RecoveryErrorType = "tool_result_missing" | "thinking_block_order" | "thinking_disabled_violation" | null;
|
|
105
|
+
export interface ToolUsePart {
|
|
106
|
+
type: "tool_use";
|
|
107
|
+
id: string;
|
|
108
|
+
name: string;
|
|
109
|
+
input: Record<string, unknown>;
|
|
110
|
+
}
|
|
111
|
+
export interface ToolResultPart {
|
|
112
|
+
type: "tool_result";
|
|
113
|
+
tool_use_id: string;
|
|
114
|
+
content: string;
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../lib/recovery/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../lib/recovery/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { PluginInput } from "@opencode-ai/plugin";
|
|
2
|
+
import type { PluginConfig } from "./types.js";
|
|
3
|
+
import type { MessageInfo, MessageData, RecoveryErrorType, ResumeConfig } from "./recovery/types.js";
|
|
4
|
+
export type { RecoveryErrorType, MessageInfo, MessageData, ResumeConfig };
|
|
5
|
+
type PluginClient = PluginInput["client"];
|
|
6
|
+
export declare function detectErrorType(error: unknown): RecoveryErrorType;
|
|
7
|
+
export declare function isRecoverableError(error: unknown): boolean;
|
|
8
|
+
export declare function getRecoveryToastContent(errorType: RecoveryErrorType): {
|
|
9
|
+
title: string;
|
|
10
|
+
message: string;
|
|
11
|
+
};
|
|
12
|
+
export declare function getRecoverySuccessToast(): {
|
|
13
|
+
title: string;
|
|
14
|
+
message: string;
|
|
15
|
+
};
|
|
16
|
+
export declare function getRecoveryFailureToast(): {
|
|
17
|
+
title: string;
|
|
18
|
+
message: string;
|
|
19
|
+
};
|
|
20
|
+
export interface SessionRecoveryHook {
|
|
21
|
+
handleSessionRecovery: (info: MessageInfo) => Promise<boolean>;
|
|
22
|
+
isRecoverableError: (error: unknown) => boolean;
|
|
23
|
+
setOnAbortCallback: (callback: (sessionID: string) => void) => void;
|
|
24
|
+
setOnRecoveryCompleteCallback: (callback: (sessionID: string) => void) => void;
|
|
25
|
+
}
|
|
26
|
+
export interface SessionRecoveryContext {
|
|
27
|
+
client: PluginClient;
|
|
28
|
+
directory: string;
|
|
29
|
+
}
|
|
30
|
+
export declare function createSessionRecoveryHook(ctx: SessionRecoveryContext, config: PluginConfig): SessionRecoveryHook | null;
|
|
31
|
+
//# sourceMappingURL=recovery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recovery.d.ts","sourceRoot":"","sources":["../../lib/recovery.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAS/C,OAAO,KAAK,EACV,WAAW,EACX,WAAW,EAEX,iBAAiB,EACjB,YAAY,EACb,MAAM,qBAAqB,CAAC;AAE7B,YAAY,EAAE,iBAAiB,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC;AAE1E,KAAK,YAAY,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;AAuC1C,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,iBAAiB,CAsBjE;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAE1D;AA2JD,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,iBAAiB,GAAG;IACrE,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB,CAWA;AAED,wBAAgB,uBAAuB,IAAI;IACzC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB,CAKA;AAED,wBAAgB,uBAAuB,IAAI;IACzC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB,CAKA;AAED,MAAM,WAAW,mBAAmB;IAClC,qBAAqB,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/D,kBAAkB,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC;IAChD,kBAAkB,EAAE,CAAC,QAAQ,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,KAAK,IAAI,CAAC;IACpE,6BAA6B,EAAE,CAAC,QAAQ,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,KAAK,IAAI,CAAC;CAChF;AAED,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,YAAY,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,yBAAyB,CACvC,GAAG,EAAE,sBAAsB,EAC3B,MAAM,EAAE,YAAY,GACnB,mBAAmB,GAAG,IAAI,CA6H5B"}
|