opencode-agy-auth 2.0.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/LICENSE +21 -0
- package/README.md +745 -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 +171 -0
- package/dist/src/antigravity/oauth.js.map +1 -0
- package/dist/src/constants.d.ts +155 -0
- package/dist/src/constants.d.ts.map +1 -0
- package/dist/src/constants.js +251 -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 +174 -0
- package/dist/src/plugin/accounts.d.ts.map +1 -0
- package/dist/src/plugin/accounts.js +1243 -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 +27 -0
- package/dist/src/plugin/cli.d.ts.map +1 -0
- package/dist/src/plugin/cli.js +130 -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 +38 -0
- package/dist/src/plugin/config/loader.d.ts.map +1 -0
- package/dist/src/plugin/config/loader.js +204 -0
- package/dist/src/plugin/config/loader.js.map +1 -0
- package/dist/src/plugin/config/models.d.ts +27 -0
- package/dist/src/plugin/config/models.d.ts.map +1 -0
- package/dist/src/plugin/config/models.js +79 -0
- package/dist/src/plugin/config/models.js.map +1 -0
- package/dist/src/plugin/config/schema.d.ts +134 -0
- package/dist/src/plugin/config/schema.d.ts.map +1 -0
- package/dist/src/plugin/config/schema.js +445 -0
- package/dist/src/plugin/config/schema.js.map +1 -0
- package/dist/src/plugin/config/updater.d.ts +55 -0
- package/dist/src/plugin/config/updater.d.ts.map +1 -0
- package/dist/src/plugin/config/updater.js +133 -0
- package/dist/src/plugin/config/updater.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 +271 -0
- package/dist/src/plugin/core/streaming/transformer.js.map +1 -0
- package/dist/src/plugin/core/streaming/types.d.ts +27 -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 +94 -0
- package/dist/src/plugin/debug.d.ts.map +1 -0
- package/dist/src/plugin/debug.js +418 -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/fingerprint.d.ts +71 -0
- package/dist/src/plugin/fingerprint.d.ts.map +1 -0
- package/dist/src/plugin/fingerprint.js +140 -0
- package/dist/src/plugin/fingerprint.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/proxy.d.ts +2 -0
- package/dist/src/plugin/proxy.d.ts.map +1 -0
- package/dist/src/plugin/proxy.js +20 -0
- package/dist/src/plugin/proxy.js.map +1 -0
- package/dist/src/plugin/quota.d.ts +58 -0
- package/dist/src/plugin/quota.d.ts.map +1 -0
- package/dist/src/plugin/quota.js +430 -0
- package/dist/src/plugin/quota.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 +378 -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 +248 -0
- package/dist/src/plugin/refresh-queue.js.map +1 -0
- package/dist/src/plugin/request-helpers.d.ts +306 -0
- package/dist/src/plugin/request-helpers.d.ts.map +1 -0
- package/dist/src/plugin/request-helpers.js +2476 -0
- package/dist/src/plugin/request-helpers.js.map +1 -0
- package/dist/src/plugin/request.d.ts +98 -0
- package/dist/src/plugin/request.d.ts.map +1 -0
- package/dist/src/plugin/request.js +1513 -0
- package/dist/src/plugin/request.js.map +1 -0
- package/dist/src/plugin/rotation.d.ts +169 -0
- package/dist/src/plugin/rotation.d.ts.map +1 -0
- package/dist/src/plugin/rotation.js +328 -0
- package/dist/src/plugin/rotation.js.map +1 -0
- package/dist/src/plugin/search.d.ts +32 -0
- package/dist/src/plugin/search.d.ts.map +1 -0
- package/dist/src/plugin/search.js +195 -0
- package/dist/src/plugin/search.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 +137 -0
- package/dist/src/plugin/storage.d.ts.map +1 -0
- package/dist/src/plugin/storage.js +588 -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 +82 -0
- package/dist/src/plugin/transform/claude.d.ts.map +1 -0
- package/dist/src/plugin/transform/claude.js +278 -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 +100 -0
- package/dist/src/plugin/transform/gemini.d.ts.map +1 -0
- package/dist/src/plugin/transform/gemini.js +504 -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 +104 -0
- package/dist/src/plugin/transform/model-resolver.d.ts.map +1 -0
- package/dist/src/plugin/transform/model-resolver.js +409 -0
- package/dist/src/plugin/transform/model-resolver.js.map +1 -0
- package/dist/src/plugin/transform/types.d.ts +111 -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 +97 -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/ui/ansi.d.ts +32 -0
- package/dist/src/plugin/ui/ansi.d.ts.map +1 -0
- package/dist/src/plugin/ui/ansi.js +52 -0
- package/dist/src/plugin/ui/ansi.js.map +1 -0
- package/dist/src/plugin/ui/auth-menu.d.ts +37 -0
- package/dist/src/plugin/ui/auth-menu.d.ts.map +1 -0
- package/dist/src/plugin/ui/auth-menu.js +182 -0
- package/dist/src/plugin/ui/auth-menu.js.map +1 -0
- package/dist/src/plugin/ui/confirm.d.ts +2 -0
- package/dist/src/plugin/ui/confirm.d.ts.map +1 -0
- package/dist/src/plugin/ui/confirm.js +15 -0
- package/dist/src/plugin/ui/confirm.js.map +1 -0
- package/dist/src/plugin/ui/select.d.ts +23 -0
- package/dist/src/plugin/ui/select.d.ts.map +1 -0
- package/dist/src/plugin/ui/select.js +254 -0
- package/dist/src/plugin/ui/select.js.map +1 -0
- package/dist/src/plugin/version.d.ts +19 -0
- package/dist/src/plugin/version.d.ts.map +1 -0
- package/dist/src/plugin/version.js +74 -0
- package/dist/src/plugin/version.js.map +1 -0
- package/dist/src/plugin.d.ts +40 -0
- package/dist/src/plugin.d.ts.map +1 -0
- package/dist/src/plugin.js +3407 -0
- package/dist/src/plugin.js.map +1 -0
- package/package.json +73 -0
|
@@ -0,0 +1,430 @@
|
|
|
1
|
+
import { ANTIGRAVITY_ENDPOINT_PROD, DEFAULT_CLAUDE_CONTEXT_LIMIT, DEFAULT_CLAUDE_THINKING_BUDGET, DEFAULT_GEMINI_CONTEXT_LIMIT, getAntigravityHeaders, getDefaultModelLimits, ANTIGRAVITY_PROVIDER_ID, } from "../constants";
|
|
2
|
+
import { accessTokenExpired, formatRefreshParts, parseRefreshParts } from "./auth";
|
|
3
|
+
import { logQuotaFetch, logQuotaStatus } from "./debug";
|
|
4
|
+
import { ensureProjectContext } from "./project";
|
|
5
|
+
import { refreshAccessToken } from "./token";
|
|
6
|
+
import { getModelFamily } from "./transform/model-resolver";
|
|
7
|
+
const FETCH_TIMEOUT_MS = 10000;
|
|
8
|
+
function buildAuthFromAccount(account) {
|
|
9
|
+
return {
|
|
10
|
+
type: "oauth",
|
|
11
|
+
refresh: formatRefreshParts({
|
|
12
|
+
refreshToken: account.refreshToken,
|
|
13
|
+
projectId: account.projectId,
|
|
14
|
+
managedProjectId: account.managedProjectId,
|
|
15
|
+
}),
|
|
16
|
+
access: undefined,
|
|
17
|
+
expires: undefined,
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
function normalizeRemainingFraction(value) {
|
|
21
|
+
// If value is missing or invalid, treat as exhausted (0%)
|
|
22
|
+
if (typeof value !== "number" || !Number.isFinite(value)) {
|
|
23
|
+
return 0;
|
|
24
|
+
}
|
|
25
|
+
if (value < 0)
|
|
26
|
+
return 0;
|
|
27
|
+
if (value > 1)
|
|
28
|
+
return 1;
|
|
29
|
+
return value;
|
|
30
|
+
}
|
|
31
|
+
function parseResetTime(resetTime) {
|
|
32
|
+
if (typeof resetTime === "number") {
|
|
33
|
+
return Number.isFinite(resetTime) ? resetTime : null;
|
|
34
|
+
}
|
|
35
|
+
if (!resetTime)
|
|
36
|
+
return null;
|
|
37
|
+
const timestamp = Date.parse(resetTime);
|
|
38
|
+
if (!Number.isFinite(timestamp)) {
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
return timestamp;
|
|
42
|
+
}
|
|
43
|
+
function formatResetTime(resetTime) {
|
|
44
|
+
if (typeof resetTime === "string") {
|
|
45
|
+
return parseResetTime(resetTime) === null ? undefined : resetTime;
|
|
46
|
+
}
|
|
47
|
+
if (typeof resetTime === "number" && Number.isFinite(resetTime)) {
|
|
48
|
+
const date = new Date(resetTime);
|
|
49
|
+
return Number.isFinite(date.getTime()) ? date.toISOString() : undefined;
|
|
50
|
+
}
|
|
51
|
+
return undefined;
|
|
52
|
+
}
|
|
53
|
+
function classifyQuotaGroup(modelName, displayName) {
|
|
54
|
+
const combined = `${modelName} ${displayName ?? ""}`.toLowerCase();
|
|
55
|
+
if (combined.includes("claude")) {
|
|
56
|
+
return "claude";
|
|
57
|
+
}
|
|
58
|
+
const isGemini3 = combined.includes("gemini-3") || combined.includes("gemini 3");
|
|
59
|
+
if (!isGemini3) {
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
const family = getModelFamily(modelName);
|
|
63
|
+
return family === "gemini-flash" ? "gemini-flash" : "gemini-pro";
|
|
64
|
+
}
|
|
65
|
+
const QUOTA_FAMILY_MODEL_NAMES = new Set([
|
|
66
|
+
"claude",
|
|
67
|
+
"gemini",
|
|
68
|
+
"gemini-pro",
|
|
69
|
+
"gemini-flash",
|
|
70
|
+
]);
|
|
71
|
+
function isConcreteQuotaModelName(modelName) {
|
|
72
|
+
const normalized = modelName.trim().toLowerCase();
|
|
73
|
+
if (!normalized) {
|
|
74
|
+
return false;
|
|
75
|
+
}
|
|
76
|
+
if (QUOTA_FAMILY_MODEL_NAMES.has(normalized)) {
|
|
77
|
+
return false;
|
|
78
|
+
}
|
|
79
|
+
return /^[a-z0-9][a-z0-9._-]*$/.test(normalized);
|
|
80
|
+
}
|
|
81
|
+
function resolveQuotaEntryModelName(modelKey, entry) {
|
|
82
|
+
const candidates = [entry.modelName, modelKey];
|
|
83
|
+
for (const candidate of candidates) {
|
|
84
|
+
if (typeof candidate === "string" && isConcreteQuotaModelName(candidate)) {
|
|
85
|
+
return candidate;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
for (const candidate of candidates) {
|
|
89
|
+
if (typeof candidate === "string" && candidate.trim().length > 0) {
|
|
90
|
+
return candidate.trim();
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return modelKey;
|
|
94
|
+
}
|
|
95
|
+
export function getGroupMinFraction(entries) {
|
|
96
|
+
if (entries.length === 0) {
|
|
97
|
+
return undefined;
|
|
98
|
+
}
|
|
99
|
+
return Math.min(...entries.map((entry) => entry.remainingFraction));
|
|
100
|
+
}
|
|
101
|
+
export function getGroupEarliestReset(entries) {
|
|
102
|
+
if (entries.length === 0) {
|
|
103
|
+
return undefined;
|
|
104
|
+
}
|
|
105
|
+
const getEarliestReset = (quotaEntries) => {
|
|
106
|
+
let earliestTime;
|
|
107
|
+
let earliestTimestamp;
|
|
108
|
+
for (const entry of quotaEntries) {
|
|
109
|
+
if (!entry.resetTime) {
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
112
|
+
const parsedTime = parseResetTime(entry.resetTime);
|
|
113
|
+
if (parsedTime === null) {
|
|
114
|
+
continue;
|
|
115
|
+
}
|
|
116
|
+
if (earliestTimestamp === undefined || parsedTime < earliestTimestamp) {
|
|
117
|
+
earliestTimestamp = parsedTime;
|
|
118
|
+
earliestTime = formatResetTime(entry.resetTime);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return earliestTime;
|
|
122
|
+
};
|
|
123
|
+
const exhaustedEntries = entries.filter((entry) => entry.remainingFraction <= 0.1);
|
|
124
|
+
if (exhaustedEntries.length > 0) {
|
|
125
|
+
return getEarliestReset(exhaustedEntries);
|
|
126
|
+
}
|
|
127
|
+
return getEarliestReset(entries);
|
|
128
|
+
}
|
|
129
|
+
function aggregateQuota(models) {
|
|
130
|
+
const groups = {};
|
|
131
|
+
if (!models) {
|
|
132
|
+
return { groups, modelCount: 0 };
|
|
133
|
+
}
|
|
134
|
+
let totalCount = 0;
|
|
135
|
+
for (const [modelName, entry] of Object.entries(models)) {
|
|
136
|
+
const group = classifyQuotaGroup(modelName, entry.displayName ?? entry.modelName);
|
|
137
|
+
if (!group) {
|
|
138
|
+
continue;
|
|
139
|
+
}
|
|
140
|
+
const quotaInfo = entry.quotaInfo;
|
|
141
|
+
const remainingFraction = normalizeRemainingFraction(quotaInfo?.remainingFraction);
|
|
142
|
+
const resetTime = quotaInfo?.resetTime;
|
|
143
|
+
const parsedResetTime = parseResetTime(resetTime);
|
|
144
|
+
totalCount += 1;
|
|
145
|
+
if (!groups[group]) {
|
|
146
|
+
groups[group] = [];
|
|
147
|
+
}
|
|
148
|
+
const resolvedModelName = resolveQuotaEntryModelName(modelName, entry);
|
|
149
|
+
const displayName = typeof entry.displayName === "string" && entry.displayName.trim().length > 0
|
|
150
|
+
? entry.displayName.trim()
|
|
151
|
+
: undefined;
|
|
152
|
+
groups[group]?.push({
|
|
153
|
+
model: resolvedModelName,
|
|
154
|
+
displayName,
|
|
155
|
+
remainingFraction,
|
|
156
|
+
resetTime: parsedResetTime === null ? undefined : resetTime,
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
return { groups, modelCount: totalCount };
|
|
160
|
+
}
|
|
161
|
+
async function fetchWithTimeout(url, options, timeoutMs = FETCH_TIMEOUT_MS) {
|
|
162
|
+
const controller = new AbortController();
|
|
163
|
+
const timeout = setTimeout(() => controller.abort(), timeoutMs);
|
|
164
|
+
try {
|
|
165
|
+
return await fetch(url, { ...options, signal: controller.signal });
|
|
166
|
+
}
|
|
167
|
+
finally {
|
|
168
|
+
clearTimeout(timeout);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
async function fetchAvailableModels(accessToken, projectId) {
|
|
172
|
+
const endpoint = ANTIGRAVITY_ENDPOINT_PROD;
|
|
173
|
+
const quotaUserAgent = getAntigravityHeaders()["User-Agent"] || "antigravity/windows/amd64";
|
|
174
|
+
const errors = [];
|
|
175
|
+
const body = projectId ? { project: projectId } : {};
|
|
176
|
+
const response = await fetchWithTimeout(`${endpoint}/v1internal:fetchAvailableModels`, {
|
|
177
|
+
method: "POST",
|
|
178
|
+
headers: {
|
|
179
|
+
Authorization: `Bearer ${accessToken}`,
|
|
180
|
+
"Content-Type": "application/json",
|
|
181
|
+
"User-Agent": quotaUserAgent,
|
|
182
|
+
},
|
|
183
|
+
body: JSON.stringify(body),
|
|
184
|
+
});
|
|
185
|
+
if (response.ok) {
|
|
186
|
+
return (await response.json());
|
|
187
|
+
}
|
|
188
|
+
const message = await response.text().catch(() => "");
|
|
189
|
+
const snippet = message.trim().slice(0, 200);
|
|
190
|
+
errors.push(`fetchAvailableModels ${response.status} at ${endpoint}${snippet ? `: ${snippet}` : ""}`);
|
|
191
|
+
throw new Error(errors.join("; ") || "fetchAvailableModels failed");
|
|
192
|
+
}
|
|
193
|
+
async function fetchGeminiCliQuota(accessToken, projectId) {
|
|
194
|
+
const endpoint = ANTIGRAVITY_ENDPOINT_PROD;
|
|
195
|
+
// Use Gemini CLI user-agent to get CLI quota buckets (not Antigravity buckets)
|
|
196
|
+
const platform = process.platform || "darwin";
|
|
197
|
+
const arch = process.arch || "arm64";
|
|
198
|
+
const geminiCliUserAgent = `GeminiCLI/1.0.0/gemini-2.5-pro (${platform}; ${arch})`;
|
|
199
|
+
const body = projectId ? { project: projectId } : {};
|
|
200
|
+
try {
|
|
201
|
+
const response = await fetchWithTimeout(`${endpoint}/v1internal:retrieveUserQuota`, {
|
|
202
|
+
method: "POST",
|
|
203
|
+
headers: {
|
|
204
|
+
Authorization: `Bearer ${accessToken}`,
|
|
205
|
+
"Content-Type": "application/json",
|
|
206
|
+
"User-Agent": geminiCliUserAgent,
|
|
207
|
+
},
|
|
208
|
+
body: JSON.stringify(body),
|
|
209
|
+
});
|
|
210
|
+
if (response.ok) {
|
|
211
|
+
const data = (await response.json());
|
|
212
|
+
return data;
|
|
213
|
+
}
|
|
214
|
+
// Non-OK response - return empty buckets
|
|
215
|
+
return { buckets: [] };
|
|
216
|
+
}
|
|
217
|
+
catch {
|
|
218
|
+
// Network error or timeout - return empty buckets
|
|
219
|
+
return { buckets: [] };
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
function aggregateGeminiCliQuota(response) {
|
|
223
|
+
const models = [];
|
|
224
|
+
if (!response.buckets || response.buckets.length === 0) {
|
|
225
|
+
return { models };
|
|
226
|
+
}
|
|
227
|
+
for (const bucket of response.buckets) {
|
|
228
|
+
if (!bucket.modelId) {
|
|
229
|
+
continue;
|
|
230
|
+
}
|
|
231
|
+
// Filter out models we don't care about for Gemini CLI quotas
|
|
232
|
+
// Only show gemini-3-* and gemini-2.5-pro models (the premium ones)
|
|
233
|
+
const modelId = bucket.modelId;
|
|
234
|
+
const isRelevantModel = modelId.startsWith("gemini-3-") ||
|
|
235
|
+
modelId === "gemini-2.5-pro";
|
|
236
|
+
if (!isRelevantModel) {
|
|
237
|
+
continue;
|
|
238
|
+
}
|
|
239
|
+
models.push({
|
|
240
|
+
modelId: bucket.modelId,
|
|
241
|
+
remainingFraction: normalizeRemainingFraction(bucket.remainingFraction),
|
|
242
|
+
resetTime: bucket.resetTime,
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
// Sort by model ID for consistent display
|
|
246
|
+
models.sort((a, b) => a.modelId.localeCompare(b.modelId));
|
|
247
|
+
return { models };
|
|
248
|
+
}
|
|
249
|
+
function applyAccountUpdates(account, auth) {
|
|
250
|
+
const parts = parseRefreshParts(auth.refresh);
|
|
251
|
+
if (!parts.refreshToken) {
|
|
252
|
+
return undefined;
|
|
253
|
+
}
|
|
254
|
+
const updated = {
|
|
255
|
+
...account,
|
|
256
|
+
refreshToken: parts.refreshToken,
|
|
257
|
+
projectId: parts.projectId ?? account.projectId,
|
|
258
|
+
managedProjectId: parts.managedProjectId ?? account.managedProjectId,
|
|
259
|
+
};
|
|
260
|
+
const changed = updated.refreshToken !== account.refreshToken ||
|
|
261
|
+
updated.projectId !== account.projectId ||
|
|
262
|
+
updated.managedProjectId !== account.managedProjectId;
|
|
263
|
+
return changed ? updated : undefined;
|
|
264
|
+
}
|
|
265
|
+
export async function checkAccountsQuota(accounts, client, providerId = ANTIGRAVITY_PROVIDER_ID) {
|
|
266
|
+
const results = [];
|
|
267
|
+
logQuotaFetch("start", accounts.length);
|
|
268
|
+
for (const [index, account] of accounts.entries()) {
|
|
269
|
+
const disabled = account.enabled === false;
|
|
270
|
+
let auth = buildAuthFromAccount(account);
|
|
271
|
+
try {
|
|
272
|
+
if (accessTokenExpired(auth)) {
|
|
273
|
+
const refreshed = await refreshAccessToken(auth, client, providerId);
|
|
274
|
+
if (!refreshed) {
|
|
275
|
+
throw new Error("Token refresh failed");
|
|
276
|
+
}
|
|
277
|
+
auth = refreshed;
|
|
278
|
+
}
|
|
279
|
+
const projectContext = await ensureProjectContext(auth);
|
|
280
|
+
auth = projectContext.auth;
|
|
281
|
+
const updatedAccount = applyAccountUpdates(account, auth);
|
|
282
|
+
let quotaResult;
|
|
283
|
+
let geminiCliQuotaResult;
|
|
284
|
+
// Fetch both Antigravity and Gemini CLI quotas in parallel
|
|
285
|
+
const [antigravityResponse, geminiCliResponse] = await Promise.all([
|
|
286
|
+
fetchAvailableModels(auth.access ?? "", projectContext.effectiveProjectId)
|
|
287
|
+
.catch((error) => ({ models: undefined })),
|
|
288
|
+
fetchGeminiCliQuota(auth.access ?? "", projectContext.effectiveProjectId),
|
|
289
|
+
]);
|
|
290
|
+
// Process Antigravity quota
|
|
291
|
+
if (antigravityResponse.models === undefined) {
|
|
292
|
+
quotaResult = {
|
|
293
|
+
groups: {},
|
|
294
|
+
modelCount: 0,
|
|
295
|
+
error: "Failed to fetch Antigravity quota",
|
|
296
|
+
};
|
|
297
|
+
}
|
|
298
|
+
else {
|
|
299
|
+
quotaResult = aggregateQuota(antigravityResponse.models);
|
|
300
|
+
}
|
|
301
|
+
// Process Gemini CLI quota
|
|
302
|
+
geminiCliQuotaResult = aggregateGeminiCliQuota(geminiCliResponse);
|
|
303
|
+
if (geminiCliResponse.buckets === undefined || geminiCliResponse.buckets.length === 0) {
|
|
304
|
+
geminiCliQuotaResult.error = geminiCliQuotaResult.models.length === 0
|
|
305
|
+
? "No Gemini CLI quota available"
|
|
306
|
+
: undefined;
|
|
307
|
+
}
|
|
308
|
+
results.push({
|
|
309
|
+
index,
|
|
310
|
+
email: account.email,
|
|
311
|
+
status: "ok",
|
|
312
|
+
disabled,
|
|
313
|
+
quota: quotaResult,
|
|
314
|
+
geminiCliQuota: geminiCliQuotaResult,
|
|
315
|
+
updatedAccount,
|
|
316
|
+
});
|
|
317
|
+
// Log quota status for each family
|
|
318
|
+
for (const [family, groupQuota] of Object.entries(quotaResult.groups)) {
|
|
319
|
+
const remainingPercent = (getGroupMinFraction(groupQuota) ?? 0) * 100;
|
|
320
|
+
logQuotaStatus(account.email, index, remainingPercent, family);
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
catch (error) {
|
|
324
|
+
results.push({
|
|
325
|
+
index,
|
|
326
|
+
email: account.email,
|
|
327
|
+
status: "error",
|
|
328
|
+
disabled,
|
|
329
|
+
error: error instanceof Error ? error.message : String(error),
|
|
330
|
+
});
|
|
331
|
+
logQuotaFetch("error", undefined, `account=${account.email ?? index} error=${error instanceof Error ? error.message : String(error)}`);
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
logQuotaFetch("complete", accounts.length, `ok=${results.filter(r => r.status === "ok").length} errors=${results.filter(r => r.status === "error").length}`);
|
|
335
|
+
return results;
|
|
336
|
+
}
|
|
337
|
+
export async function readModelLimits(configDir) {
|
|
338
|
+
try {
|
|
339
|
+
const { readFile } = await import("node:fs/promises");
|
|
340
|
+
const path = await import("node:path");
|
|
341
|
+
const configPath = path.join(configDir, "antigravity.json");
|
|
342
|
+
const raw = await readFile(configPath, "utf-8");
|
|
343
|
+
const parsed = JSON.parse(raw);
|
|
344
|
+
const ml = parsed["model_limits"];
|
|
345
|
+
if (!ml)
|
|
346
|
+
return getDefaultModelLimits();
|
|
347
|
+
return {
|
|
348
|
+
claude_context_limit: typeof ml.claude_context_limit === "number"
|
|
349
|
+
? ml.claude_context_limit
|
|
350
|
+
: DEFAULT_CLAUDE_CONTEXT_LIMIT,
|
|
351
|
+
claude_thinking_budget_max: typeof ml.claude_thinking_budget_max === "number"
|
|
352
|
+
? ml.claude_thinking_budget_max
|
|
353
|
+
: DEFAULT_CLAUDE_THINKING_BUDGET,
|
|
354
|
+
gemini_context_limit: typeof ml.gemini_context_limit === "number"
|
|
355
|
+
? ml.gemini_context_limit
|
|
356
|
+
: DEFAULT_GEMINI_CONTEXT_LIMIT,
|
|
357
|
+
last_discovered_at: typeof ml.last_discovered_at === "string"
|
|
358
|
+
? ml.last_discovered_at
|
|
359
|
+
: undefined,
|
|
360
|
+
};
|
|
361
|
+
}
|
|
362
|
+
catch {
|
|
363
|
+
return getDefaultModelLimits();
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
export async function discoverAndPersistModelLimits(configDir, quotaModels) {
|
|
367
|
+
try {
|
|
368
|
+
let claudeContextLimit;
|
|
369
|
+
let claudeThinkingBudgetMax;
|
|
370
|
+
let geminiContextLimit;
|
|
371
|
+
for (const [modelName, entry] of quotaModels) {
|
|
372
|
+
const name = modelName.toLowerCase();
|
|
373
|
+
if (name.includes("claude")) {
|
|
374
|
+
if (entry.inputTokenLimit && (!claudeContextLimit || entry.inputTokenLimit < claudeContextLimit)) {
|
|
375
|
+
claudeContextLimit = entry.inputTokenLimit;
|
|
376
|
+
}
|
|
377
|
+
if (entry.thinkingBudgetMax && (!claudeThinkingBudgetMax || entry.thinkingBudgetMax > claudeThinkingBudgetMax)) {
|
|
378
|
+
claudeThinkingBudgetMax = entry.thinkingBudgetMax;
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
else if (name.includes("gemini")) {
|
|
382
|
+
if (entry.inputTokenLimit && (!geminiContextLimit || entry.inputTokenLimit > geminiContextLimit)) {
|
|
383
|
+
geminiContextLimit = entry.inputTokenLimit;
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
if (!claudeContextLimit && !claudeThinkingBudgetMax && !geminiContextLimit) {
|
|
388
|
+
return;
|
|
389
|
+
}
|
|
390
|
+
const current = await readModelLimits(configDir);
|
|
391
|
+
const updated = {
|
|
392
|
+
claude_context_limit: claudeContextLimit ?? current.claude_context_limit,
|
|
393
|
+
claude_thinking_budget_max: claudeThinkingBudgetMax ?? current.claude_thinking_budget_max,
|
|
394
|
+
gemini_context_limit: geminiContextLimit ?? current.gemini_context_limit,
|
|
395
|
+
last_discovered_at: new Date().toISOString(),
|
|
396
|
+
};
|
|
397
|
+
if (updated.claude_context_limit === current.claude_context_limit
|
|
398
|
+
&& updated.claude_thinking_budget_max === current.claude_thinking_budget_max
|
|
399
|
+
&& updated.gemini_context_limit === current.gemini_context_limit) {
|
|
400
|
+
return;
|
|
401
|
+
}
|
|
402
|
+
const { readFile, writeFile } = await import("node:fs/promises");
|
|
403
|
+
const path = await import("node:path");
|
|
404
|
+
const configPath = path.join(configDir, "antigravity.json");
|
|
405
|
+
let existing = {};
|
|
406
|
+
try {
|
|
407
|
+
const raw = await readFile(configPath, "utf-8");
|
|
408
|
+
existing = JSON.parse(raw);
|
|
409
|
+
}
|
|
410
|
+
catch { }
|
|
411
|
+
existing["model_limits"] = updated;
|
|
412
|
+
await writeFile(configPath, JSON.stringify(existing, null, 2) + "\n", "utf-8");
|
|
413
|
+
}
|
|
414
|
+
catch { }
|
|
415
|
+
}
|
|
416
|
+
/**
|
|
417
|
+
* Resolves the effective thinking budget to use for a request.
|
|
418
|
+
* Priority: variant config > tier from model suffix > server default
|
|
419
|
+
* Special: -1 means server-controlled (pass through, don't send budget)
|
|
420
|
+
*/
|
|
421
|
+
export function resolveEffectiveThinkingBudget(serverBudget, variantBudget, modelDefault) {
|
|
422
|
+
// -1 = server-controlled, don't send thinkingBudget at all
|
|
423
|
+
if (serverBudget === -1)
|
|
424
|
+
return -1;
|
|
425
|
+
const effective = typeof variantBudget === "number" && variantBudget > 0
|
|
426
|
+
? variantBudget
|
|
427
|
+
: (serverBudget ?? modelDefault);
|
|
428
|
+
return Math.max(128, effective);
|
|
429
|
+
}
|
|
430
|
+
//# sourceMappingURL=quota.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quota.js","sourceRoot":"","sources":["../../../src/plugin/quota.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Constants for session recovery storage paths.
|
|
3
|
+
*
|
|
4
|
+
* Based on oh-my-opencode/src/hooks/session-recovery/constants.ts
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Get the XDG config directory for Antigravity config.
|
|
8
|
+
* Falls back to ~/.config on Linux/Mac, or APPDATA on Windows.
|
|
9
|
+
*/
|
|
10
|
+
export declare function getXdgConfig(): string;
|
|
11
|
+
/**
|
|
12
|
+
* Get the Antigravity config directory.
|
|
13
|
+
* Default: ~/.config/opencode/antigravity.json
|
|
14
|
+
*/
|
|
15
|
+
export declare function getAntigravityConfigDir(): string;
|
|
16
|
+
export declare const OPENCODE_STORAGE: string;
|
|
17
|
+
export declare const MESSAGE_STORAGE: string;
|
|
18
|
+
export declare const PART_STORAGE: string;
|
|
19
|
+
export declare const THINKING_TYPES: Set<string>;
|
|
20
|
+
export declare const META_TYPES: Set<string>;
|
|
21
|
+
export declare const CONTENT_TYPES: Set<string>;
|
|
22
|
+
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../../src/plugin/recovery/constants.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAmBH;;;GAGG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAQrC;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,IAAI,MAAM,CAEhD;AAED,eAAO,MAAM,gBAAgB,QAA4C,CAAC;AAC1E,eAAO,MAAM,eAAe,QAAoC,CAAC;AACjE,eAAO,MAAM,YAAY,QAAiC,CAAC;AAE3D,eAAO,MAAM,cAAc,aAA0D,CAAC;AACtF,eAAO,MAAM,UAAU,aAAyC,CAAC;AACjE,eAAO,MAAM,aAAa,aAAuD,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Constants for session recovery storage paths.
|
|
3
|
+
*
|
|
4
|
+
* Based on oh-my-opencode/src/hooks/session-recovery/constants.ts
|
|
5
|
+
*/
|
|
6
|
+
import { join } from "node:path";
|
|
7
|
+
import { homedir } from "node:os";
|
|
8
|
+
/**
|
|
9
|
+
* Get the XDG data directory for OpenCode storage.
|
|
10
|
+
* Falls back to ~/.local/share on Linux/Mac, or APPDATA on Windows.
|
|
11
|
+
*/
|
|
12
|
+
function getXdgData() {
|
|
13
|
+
const platform = process.platform;
|
|
14
|
+
if (platform === "win32") {
|
|
15
|
+
return process.env.APPDATA || join(homedir(), "AppData", "Roaming");
|
|
16
|
+
}
|
|
17
|
+
return process.env.XDG_DATA_HOME || join(homedir(), ".local", "share");
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Get the XDG config directory for Antigravity config.
|
|
21
|
+
* Falls back to ~/.config on Linux/Mac, or APPDATA on Windows.
|
|
22
|
+
*/
|
|
23
|
+
export function getXdgConfig() {
|
|
24
|
+
const platform = process.platform;
|
|
25
|
+
if (platform === "win32") {
|
|
26
|
+
return process.env.APPDATA || join(homedir(), "AppData", "Roaming");
|
|
27
|
+
}
|
|
28
|
+
return process.env.XDG_CONFIG_HOME || join(homedir(), ".config");
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Get the Antigravity config directory.
|
|
32
|
+
* Default: ~/.config/opencode/antigravity.json
|
|
33
|
+
*/
|
|
34
|
+
export function getAntigravityConfigDir() {
|
|
35
|
+
return join(getXdgConfig(), "opencode");
|
|
36
|
+
}
|
|
37
|
+
export const OPENCODE_STORAGE = join(getXdgData(), "opencode", "storage");
|
|
38
|
+
export const MESSAGE_STORAGE = join(OPENCODE_STORAGE, "message");
|
|
39
|
+
export const PART_STORAGE = join(OPENCODE_STORAGE, "part");
|
|
40
|
+
export const THINKING_TYPES = new Set(["thinking", "redacted_thinking", "reasoning"]);
|
|
41
|
+
export const META_TYPES = new Set(["step-start", "step-finish"]);
|
|
42
|
+
export const CONTENT_TYPES = new Set(["text", "tool", "tool_use", "tool_result"]);
|
|
43
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../../src/plugin/recovery/constants.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC;;;GAGG;AACH,SAAS,UAAU;IACjB,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAElC,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACzB,OAAO,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;IACtE,CAAC;IAED,OAAO,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;AACzE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY;IAC1B,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAElC,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACzB,OAAO,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;IACtE,CAAC;IAED,OAAO,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC;AACnE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,uBAAuB;IACrC,OAAO,IAAI,CAAC,YAAY,EAAE,EAAE,UAAU,CAAC,CAAC;AAC1C,CAAC;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,CAAC,UAAU,EAAE,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;AAC1E,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,CAAC,gBAAgB,EAAE,SAAS,CAAC,CAAC;AACjE,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;AAE3D,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,CAAC,UAAU,EAAE,mBAAmB,EAAE,WAAW,CAAC,CAAC,CAAC;AACtF,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC,CAAC;AACjE,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session recovery module for opencode-agy-auth.
|
|
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";
|
|
10
|
+
export * from "./constants";
|
|
11
|
+
export * from "./storage";
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/plugin/recovery/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,cAAc,SAAS,CAAC;AACxB,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session recovery module for opencode-agy-auth.
|
|
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";
|
|
10
|
+
export * from "./constants";
|
|
11
|
+
export * from "./storage";
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/plugin/recovery/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,cAAc,SAAS,CAAC;AACxB,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Storage utilities for reading OpenCode's session data.
|
|
3
|
+
*
|
|
4
|
+
* Based on oh-my-opencode/src/hooks/session-recovery/storage.ts
|
|
5
|
+
*/
|
|
6
|
+
import type { StoredMessageMeta, StoredPart } from "./types";
|
|
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":["../../../../src/plugin/recovery/storage.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EAAE,iBAAiB,EAAE,UAAU,EAAkB,MAAM,SAAS,CAAC;AAM7E,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"}
|