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.
Files changed (235) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +745 -0
  3. package/dist/index.d.ts +4 -0
  4. package/dist/index.d.ts.map +1 -0
  5. package/dist/index.js +3 -0
  6. package/dist/index.js.map +1 -0
  7. package/dist/src/antigravity/oauth.d.ts +31 -0
  8. package/dist/src/antigravity/oauth.d.ts.map +1 -0
  9. package/dist/src/antigravity/oauth.js +171 -0
  10. package/dist/src/antigravity/oauth.js.map +1 -0
  11. package/dist/src/constants.d.ts +155 -0
  12. package/dist/src/constants.d.ts.map +1 -0
  13. package/dist/src/constants.js +251 -0
  14. package/dist/src/constants.js.map +1 -0
  15. package/dist/src/hooks/auto-update-checker/cache.d.ts +3 -0
  16. package/dist/src/hooks/auto-update-checker/cache.d.ts.map +1 -0
  17. package/dist/src/hooks/auto-update-checker/cache.js +71 -0
  18. package/dist/src/hooks/auto-update-checker/cache.js.map +1 -0
  19. package/dist/src/hooks/auto-update-checker/checker.d.ts +16 -0
  20. package/dist/src/hooks/auto-update-checker/checker.d.ts.map +1 -0
  21. package/dist/src/hooks/auto-update-checker/checker.js +237 -0
  22. package/dist/src/hooks/auto-update-checker/checker.js.map +1 -0
  23. package/dist/src/hooks/auto-update-checker/constants.d.ts +9 -0
  24. package/dist/src/hooks/auto-update-checker/constants.d.ts.map +1 -0
  25. package/dist/src/hooks/auto-update-checker/constants.js +23 -0
  26. package/dist/src/hooks/auto-update-checker/constants.js.map +1 -0
  27. package/dist/src/hooks/auto-update-checker/index.d.ts +34 -0
  28. package/dist/src/hooks/auto-update-checker/index.d.ts.map +1 -0
  29. package/dist/src/hooks/auto-update-checker/index.js +125 -0
  30. package/dist/src/hooks/auto-update-checker/index.js.map +1 -0
  31. package/dist/src/hooks/auto-update-checker/types.d.ts +25 -0
  32. package/dist/src/hooks/auto-update-checker/types.d.ts.map +1 -0
  33. package/dist/src/hooks/auto-update-checker/types.js +1 -0
  34. package/dist/src/hooks/auto-update-checker/types.js.map +1 -0
  35. package/dist/src/plugin/accounts.d.ts +174 -0
  36. package/dist/src/plugin/accounts.d.ts.map +1 -0
  37. package/dist/src/plugin/accounts.js +1243 -0
  38. package/dist/src/plugin/accounts.js.map +1 -0
  39. package/dist/src/plugin/auth.d.ts +21 -0
  40. package/dist/src/plugin/auth.d.ts.map +1 -0
  41. package/dist/src/plugin/auth.js +46 -0
  42. package/dist/src/plugin/auth.js.map +1 -0
  43. package/dist/src/plugin/cache/index.d.ts +5 -0
  44. package/dist/src/plugin/cache/index.d.ts.map +1 -0
  45. package/dist/src/plugin/cache/index.js +5 -0
  46. package/dist/src/plugin/cache/index.js.map +1 -0
  47. package/dist/src/plugin/cache/signature-cache.d.ts +111 -0
  48. package/dist/src/plugin/cache/signature-cache.d.ts.map +1 -0
  49. package/dist/src/plugin/cache/signature-cache.js +375 -0
  50. package/dist/src/plugin/cache/signature-cache.js.map +1 -0
  51. package/dist/src/plugin/cache.d.ts +44 -0
  52. package/dist/src/plugin/cache.d.ts.map +1 -0
  53. package/dist/src/plugin/cache.js +200 -0
  54. package/dist/src/plugin/cache.js.map +1 -0
  55. package/dist/src/plugin/cli.d.ts +27 -0
  56. package/dist/src/plugin/cli.d.ts.map +1 -0
  57. package/dist/src/plugin/cli.js +130 -0
  58. package/dist/src/plugin/cli.js.map +1 -0
  59. package/dist/src/plugin/config/index.d.ts +16 -0
  60. package/dist/src/plugin/config/index.d.ts.map +1 -0
  61. package/dist/src/plugin/config/index.js +16 -0
  62. package/dist/src/plugin/config/index.js.map +1 -0
  63. package/dist/src/plugin/config/loader.d.ts +38 -0
  64. package/dist/src/plugin/config/loader.d.ts.map +1 -0
  65. package/dist/src/plugin/config/loader.js +204 -0
  66. package/dist/src/plugin/config/loader.js.map +1 -0
  67. package/dist/src/plugin/config/models.d.ts +27 -0
  68. package/dist/src/plugin/config/models.d.ts.map +1 -0
  69. package/dist/src/plugin/config/models.js +79 -0
  70. package/dist/src/plugin/config/models.js.map +1 -0
  71. package/dist/src/plugin/config/schema.d.ts +134 -0
  72. package/dist/src/plugin/config/schema.d.ts.map +1 -0
  73. package/dist/src/plugin/config/schema.js +445 -0
  74. package/dist/src/plugin/config/schema.js.map +1 -0
  75. package/dist/src/plugin/config/updater.d.ts +55 -0
  76. package/dist/src/plugin/config/updater.d.ts.map +1 -0
  77. package/dist/src/plugin/config/updater.js +133 -0
  78. package/dist/src/plugin/config/updater.js.map +1 -0
  79. package/dist/src/plugin/core/streaming/index.d.ts +3 -0
  80. package/dist/src/plugin/core/streaming/index.d.ts.map +1 -0
  81. package/dist/src/plugin/core/streaming/index.js +3 -0
  82. package/dist/src/plugin/core/streaming/index.js.map +1 -0
  83. package/dist/src/plugin/core/streaming/transformer.d.ts +10 -0
  84. package/dist/src/plugin/core/streaming/transformer.d.ts.map +1 -0
  85. package/dist/src/plugin/core/streaming/transformer.js +271 -0
  86. package/dist/src/plugin/core/streaming/transformer.js.map +1 -0
  87. package/dist/src/plugin/core/streaming/types.d.ts +27 -0
  88. package/dist/src/plugin/core/streaming/types.d.ts.map +1 -0
  89. package/dist/src/plugin/core/streaming/types.js +1 -0
  90. package/dist/src/plugin/core/streaming/types.js.map +1 -0
  91. package/dist/src/plugin/debug.d.ts +94 -0
  92. package/dist/src/plugin/debug.d.ts.map +1 -0
  93. package/dist/src/plugin/debug.js +418 -0
  94. package/dist/src/plugin/debug.js.map +1 -0
  95. package/dist/src/plugin/errors.d.ts +28 -0
  96. package/dist/src/plugin/errors.d.ts.map +1 -0
  97. package/dist/src/plugin/errors.js +42 -0
  98. package/dist/src/plugin/errors.js.map +1 -0
  99. package/dist/src/plugin/fingerprint.d.ts +71 -0
  100. package/dist/src/plugin/fingerprint.d.ts.map +1 -0
  101. package/dist/src/plugin/fingerprint.js +140 -0
  102. package/dist/src/plugin/fingerprint.js.map +1 -0
  103. package/dist/src/plugin/image-saver.d.ts +25 -0
  104. package/dist/src/plugin/image-saver.d.ts.map +1 -0
  105. package/dist/src/plugin/image-saver.js +86 -0
  106. package/dist/src/plugin/image-saver.js.map +1 -0
  107. package/dist/src/plugin/logger.d.ts +54 -0
  108. package/dist/src/plugin/logger.d.ts.map +1 -0
  109. package/dist/src/plugin/logger.js +120 -0
  110. package/dist/src/plugin/logger.js.map +1 -0
  111. package/dist/src/plugin/project.d.ts +33 -0
  112. package/dist/src/plugin/project.d.ts.map +1 -0
  113. package/dist/src/plugin/project.js +234 -0
  114. package/dist/src/plugin/project.js.map +1 -0
  115. package/dist/src/plugin/proxy.d.ts +2 -0
  116. package/dist/src/plugin/proxy.d.ts.map +1 -0
  117. package/dist/src/plugin/proxy.js +20 -0
  118. package/dist/src/plugin/proxy.js.map +1 -0
  119. package/dist/src/plugin/quota.d.ts +58 -0
  120. package/dist/src/plugin/quota.d.ts.map +1 -0
  121. package/dist/src/plugin/quota.js +430 -0
  122. package/dist/src/plugin/quota.js.map +1 -0
  123. package/dist/src/plugin/recovery/constants.d.ts +22 -0
  124. package/dist/src/plugin/recovery/constants.d.ts.map +1 -0
  125. package/dist/src/plugin/recovery/constants.js +43 -0
  126. package/dist/src/plugin/recovery/constants.js.map +1 -0
  127. package/dist/src/plugin/recovery/index.d.ts +12 -0
  128. package/dist/src/plugin/recovery/index.d.ts.map +1 -0
  129. package/dist/src/plugin/recovery/index.js +12 -0
  130. package/dist/src/plugin/recovery/index.js.map +1 -0
  131. package/dist/src/plugin/recovery/storage.d.ts +24 -0
  132. package/dist/src/plugin/recovery/storage.d.ts.map +1 -0
  133. package/dist/src/plugin/recovery/storage.js +354 -0
  134. package/dist/src/plugin/recovery/storage.js.map +1 -0
  135. package/dist/src/plugin/recovery/types.d.ts +116 -0
  136. package/dist/src/plugin/recovery/types.d.ts.map +1 -0
  137. package/dist/src/plugin/recovery/types.js +6 -0
  138. package/dist/src/plugin/recovery/types.js.map +1 -0
  139. package/dist/src/plugin/recovery.d.ts +61 -0
  140. package/dist/src/plugin/recovery.d.ts.map +1 -0
  141. package/dist/src/plugin/recovery.js +378 -0
  142. package/dist/src/plugin/recovery.js.map +1 -0
  143. package/dist/src/plugin/refresh-queue.d.ts +101 -0
  144. package/dist/src/plugin/refresh-queue.d.ts.map +1 -0
  145. package/dist/src/plugin/refresh-queue.js +248 -0
  146. package/dist/src/plugin/refresh-queue.js.map +1 -0
  147. package/dist/src/plugin/request-helpers.d.ts +306 -0
  148. package/dist/src/plugin/request-helpers.d.ts.map +1 -0
  149. package/dist/src/plugin/request-helpers.js +2476 -0
  150. package/dist/src/plugin/request-helpers.js.map +1 -0
  151. package/dist/src/plugin/request.d.ts +98 -0
  152. package/dist/src/plugin/request.d.ts.map +1 -0
  153. package/dist/src/plugin/request.js +1513 -0
  154. package/dist/src/plugin/request.js.map +1 -0
  155. package/dist/src/plugin/rotation.d.ts +169 -0
  156. package/dist/src/plugin/rotation.d.ts.map +1 -0
  157. package/dist/src/plugin/rotation.js +328 -0
  158. package/dist/src/plugin/rotation.js.map +1 -0
  159. package/dist/src/plugin/search.d.ts +32 -0
  160. package/dist/src/plugin/search.d.ts.map +1 -0
  161. package/dist/src/plugin/search.js +195 -0
  162. package/dist/src/plugin/search.js.map +1 -0
  163. package/dist/src/plugin/server.d.ts +23 -0
  164. package/dist/src/plugin/server.d.ts.map +1 -0
  165. package/dist/src/plugin/server.js +324 -0
  166. package/dist/src/plugin/server.js.map +1 -0
  167. package/dist/src/plugin/storage.d.ts +137 -0
  168. package/dist/src/plugin/storage.d.ts.map +1 -0
  169. package/dist/src/plugin/storage.js +588 -0
  170. package/dist/src/plugin/storage.js.map +1 -0
  171. package/dist/src/plugin/stores/signature-store.d.ts +5 -0
  172. package/dist/src/plugin/stores/signature-store.d.ts.map +1 -0
  173. package/dist/src/plugin/stores/signature-store.js +25 -0
  174. package/dist/src/plugin/stores/signature-store.js.map +1 -0
  175. package/dist/src/plugin/thinking-recovery.d.ts +90 -0
  176. package/dist/src/plugin/thinking-recovery.d.ts.map +1 -0
  177. package/dist/src/plugin/thinking-recovery.js +316 -0
  178. package/dist/src/plugin/thinking-recovery.js.map +1 -0
  179. package/dist/src/plugin/token.d.ts +19 -0
  180. package/dist/src/plugin/token.d.ts.map +1 -0
  181. package/dist/src/plugin/token.js +128 -0
  182. package/dist/src/plugin/token.js.map +1 -0
  183. package/dist/src/plugin/transform/claude.d.ts +82 -0
  184. package/dist/src/plugin/transform/claude.d.ts.map +1 -0
  185. package/dist/src/plugin/transform/claude.js +278 -0
  186. package/dist/src/plugin/transform/claude.js.map +1 -0
  187. package/dist/src/plugin/transform/cross-model-sanitizer.d.ts +35 -0
  188. package/dist/src/plugin/transform/cross-model-sanitizer.d.ts.map +1 -0
  189. package/dist/src/plugin/transform/cross-model-sanitizer.js +225 -0
  190. package/dist/src/plugin/transform/cross-model-sanitizer.js.map +1 -0
  191. package/dist/src/plugin/transform/gemini.d.ts +100 -0
  192. package/dist/src/plugin/transform/gemini.d.ts.map +1 -0
  193. package/dist/src/plugin/transform/gemini.js +504 -0
  194. package/dist/src/plugin/transform/gemini.js.map +1 -0
  195. package/dist/src/plugin/transform/index.d.ts +15 -0
  196. package/dist/src/plugin/transform/index.d.ts.map +1 -0
  197. package/dist/src/plugin/transform/index.js +14 -0
  198. package/dist/src/plugin/transform/index.js.map +1 -0
  199. package/dist/src/plugin/transform/model-resolver.d.ts +104 -0
  200. package/dist/src/plugin/transform/model-resolver.d.ts.map +1 -0
  201. package/dist/src/plugin/transform/model-resolver.js +409 -0
  202. package/dist/src/plugin/transform/model-resolver.js.map +1 -0
  203. package/dist/src/plugin/transform/types.d.ts +111 -0
  204. package/dist/src/plugin/transform/types.d.ts.map +1 -0
  205. package/dist/src/plugin/transform/types.js +1 -0
  206. package/dist/src/plugin/transform/types.js.map +1 -0
  207. package/dist/src/plugin/types.d.ts +97 -0
  208. package/dist/src/plugin/types.d.ts.map +1 -0
  209. package/dist/src/plugin/types.js +1 -0
  210. package/dist/src/plugin/types.js.map +1 -0
  211. package/dist/src/plugin/ui/ansi.d.ts +32 -0
  212. package/dist/src/plugin/ui/ansi.d.ts.map +1 -0
  213. package/dist/src/plugin/ui/ansi.js +52 -0
  214. package/dist/src/plugin/ui/ansi.js.map +1 -0
  215. package/dist/src/plugin/ui/auth-menu.d.ts +37 -0
  216. package/dist/src/plugin/ui/auth-menu.d.ts.map +1 -0
  217. package/dist/src/plugin/ui/auth-menu.js +182 -0
  218. package/dist/src/plugin/ui/auth-menu.js.map +1 -0
  219. package/dist/src/plugin/ui/confirm.d.ts +2 -0
  220. package/dist/src/plugin/ui/confirm.d.ts.map +1 -0
  221. package/dist/src/plugin/ui/confirm.js +15 -0
  222. package/dist/src/plugin/ui/confirm.js.map +1 -0
  223. package/dist/src/plugin/ui/select.d.ts +23 -0
  224. package/dist/src/plugin/ui/select.d.ts.map +1 -0
  225. package/dist/src/plugin/ui/select.js +254 -0
  226. package/dist/src/plugin/ui/select.js.map +1 -0
  227. package/dist/src/plugin/version.d.ts +19 -0
  228. package/dist/src/plugin/version.d.ts.map +1 -0
  229. package/dist/src/plugin/version.js +74 -0
  230. package/dist/src/plugin/version.js.map +1 -0
  231. package/dist/src/plugin.d.ts +40 -0
  232. package/dist/src/plugin.d.ts.map +1 -0
  233. package/dist/src/plugin.js +3407 -0
  234. package/dist/src/plugin.js.map +1 -0
  235. package/package.json +73 -0
@@ -0,0 +1,375 @@
1
+ /**
2
+ * Signature cache for persisting thinking block signatures to disk.
3
+ *
4
+ * Features (based on LLM-API-Key-Proxy's ProviderCache):
5
+ * - Dual-TTL system: short memory TTL, longer disk TTL
6
+ * - Background disk persistence with batched writes
7
+ * - Atomic writes with temp file + move pattern
8
+ * - Automatic cleanup of expired entries
9
+ *
10
+ * Cache key format: `${sessionId}:${modelId}`
11
+ */
12
+ import { existsSync, mkdirSync, readFileSync, writeFileSync, renameSync, unlinkSync } from "node:fs";
13
+ import { join, dirname } from "node:path";
14
+ import { homedir } from "node:os";
15
+ import { tmpdir } from "node:os";
16
+ import { ensureGitignoreSync } from "../storage";
17
+ // =============================================================================
18
+ // Path Utilities
19
+ // =============================================================================
20
+ function getConfigDir() {
21
+ const platform = process.platform;
22
+ if (platform === "win32") {
23
+ return join(process.env.APPDATA || join(homedir(), "AppData", "Roaming"), "opencode");
24
+ }
25
+ const xdgConfig = process.env.XDG_CONFIG_HOME || join(homedir(), ".config");
26
+ return join(xdgConfig, "opencode");
27
+ }
28
+ function getCacheFilePath() {
29
+ return join(getConfigDir(), "antigravity-signature-cache.json");
30
+ }
31
+ // =============================================================================
32
+ // Signature Cache Class
33
+ // =============================================================================
34
+ export class SignatureCache {
35
+ // In-memory cache: key -> entry with signature and optional thinking text
36
+ cache = new Map();
37
+ // Configuration
38
+ memoryTtlMs;
39
+ diskTtlMs;
40
+ writeIntervalMs;
41
+ cacheFilePath;
42
+ enabled;
43
+ // State
44
+ dirty = false;
45
+ writeTimer = null;
46
+ cleanupTimer = null;
47
+ // Statistics
48
+ stats = {
49
+ memoryHits: 0,
50
+ diskHits: 0,
51
+ misses: 0,
52
+ writes: 0,
53
+ };
54
+ constructor(config) {
55
+ this.enabled = config.enabled;
56
+ this.memoryTtlMs = config.memory_ttl_seconds * 1000;
57
+ this.diskTtlMs = config.disk_ttl_seconds * 1000;
58
+ this.writeIntervalMs = config.write_interval_seconds * 1000;
59
+ this.cacheFilePath = getCacheFilePath();
60
+ if (this.enabled) {
61
+ this.loadFromDisk();
62
+ this.startBackgroundTasks();
63
+ }
64
+ }
65
+ // ===========================================================================
66
+ // Public API
67
+ // ===========================================================================
68
+ /**
69
+ * Generate a cache key from sessionId and modelId.
70
+ */
71
+ static makeKey(sessionId, modelId) {
72
+ return `${sessionId}:${modelId}`;
73
+ }
74
+ /**
75
+ * Store a signature in the cache.
76
+ */
77
+ store(key, signature) {
78
+ if (!this.enabled)
79
+ return;
80
+ this.cache.set(key, {
81
+ value: signature,
82
+ timestamp: Date.now(),
83
+ });
84
+ this.dirty = true;
85
+ }
86
+ /**
87
+ * Retrieve a signature from the cache.
88
+ * Returns null if not found or expired.
89
+ */
90
+ retrieve(key) {
91
+ if (!this.enabled)
92
+ return null;
93
+ const entry = this.cache.get(key);
94
+ if (entry) {
95
+ const age = Date.now() - entry.timestamp;
96
+ if (age <= this.memoryTtlMs) {
97
+ this.stats.memoryHits++;
98
+ return entry.value;
99
+ }
100
+ // Expired from memory, remove it
101
+ this.cache.delete(key);
102
+ }
103
+ this.stats.misses++;
104
+ return null;
105
+ }
106
+ /**
107
+ * Check if a key exists in the cache (without updating stats).
108
+ */
109
+ has(key) {
110
+ if (!this.enabled)
111
+ return false;
112
+ const entry = this.cache.get(key);
113
+ if (!entry)
114
+ return false;
115
+ const age = Date.now() - entry.timestamp;
116
+ return age <= this.memoryTtlMs;
117
+ }
118
+ // ===========================================================================
119
+ // Full Thinking Cache (ported from LLM-API-Key-Proxy)
120
+ // ===========================================================================
121
+ /**
122
+ * Store full thinking content with signature.
123
+ * This enables recovery even after thinking text is stripped by compaction.
124
+ *
125
+ * Port of LLM-API-Key-Proxy's _cache_thinking()
126
+ */
127
+ storeThinking(key, thinkingText, signature, toolIds) {
128
+ if (!this.enabled || !thinkingText || !signature)
129
+ return;
130
+ this.cache.set(key, {
131
+ value: signature,
132
+ timestamp: Date.now(),
133
+ thinkingText,
134
+ textPreview: thinkingText.slice(0, 100),
135
+ toolIds,
136
+ });
137
+ this.dirty = true;
138
+ }
139
+ /**
140
+ * Retrieve full thinking content by key.
141
+ * Returns null if not found or expired.
142
+ */
143
+ retrieveThinking(key) {
144
+ if (!this.enabled)
145
+ return null;
146
+ const entry = this.cache.get(key);
147
+ if (!entry || !entry.thinkingText)
148
+ return null;
149
+ const age = Date.now() - entry.timestamp;
150
+ if (age > this.memoryTtlMs) {
151
+ this.cache.delete(key);
152
+ return null;
153
+ }
154
+ this.stats.memoryHits++;
155
+ return {
156
+ text: entry.thinkingText,
157
+ signature: entry.value,
158
+ toolIds: entry.toolIds,
159
+ };
160
+ }
161
+ /**
162
+ * Check if full thinking content exists for a key.
163
+ */
164
+ hasThinking(key) {
165
+ if (!this.enabled)
166
+ return false;
167
+ const entry = this.cache.get(key);
168
+ if (!entry || !entry.thinkingText)
169
+ return false;
170
+ const age = Date.now() - entry.timestamp;
171
+ return age <= this.memoryTtlMs;
172
+ }
173
+ /**
174
+ * Get cache statistics.
175
+ */
176
+ getStats() {
177
+ return {
178
+ ...this.stats,
179
+ memoryEntries: this.cache.size,
180
+ dirty: this.dirty,
181
+ diskEnabled: this.enabled,
182
+ };
183
+ }
184
+ /**
185
+ * Manually trigger a disk save.
186
+ */
187
+ async flush() {
188
+ if (!this.enabled)
189
+ return true;
190
+ return this.saveToDisk();
191
+ }
192
+ /**
193
+ * Graceful shutdown: stop timers and flush to disk.
194
+ */
195
+ shutdown() {
196
+ if (this.writeTimer) {
197
+ clearInterval(this.writeTimer);
198
+ this.writeTimer = null;
199
+ }
200
+ if (this.cleanupTimer) {
201
+ clearInterval(this.cleanupTimer);
202
+ this.cleanupTimer = null;
203
+ }
204
+ if (this.dirty && this.enabled) {
205
+ this.saveToDisk();
206
+ }
207
+ }
208
+ // ===========================================================================
209
+ // Disk Operations
210
+ // ===========================================================================
211
+ /**
212
+ * Load cache from disk file with TTL validation.
213
+ */
214
+ loadFromDisk() {
215
+ try {
216
+ if (!existsSync(this.cacheFilePath)) {
217
+ return;
218
+ }
219
+ const content = readFileSync(this.cacheFilePath, "utf-8");
220
+ const data = JSON.parse(content);
221
+ if (data.version !== "1.0") {
222
+ // Version mismatch - silently start fresh
223
+ return;
224
+ }
225
+ const now = Date.now();
226
+ let loaded = 0;
227
+ let expired = 0;
228
+ for (const [key, entry] of Object.entries(data.entries)) {
229
+ const age = now - entry.timestamp;
230
+ if (age <= this.diskTtlMs) {
231
+ this.cache.set(key, {
232
+ value: entry.value,
233
+ timestamp: entry.timestamp,
234
+ });
235
+ loaded++;
236
+ }
237
+ else {
238
+ expired++;
239
+ }
240
+ }
241
+ // Silently load - no console output
242
+ }
243
+ catch {
244
+ // Silently start fresh on any error (corruption, file not found, etc.)
245
+ }
246
+ }
247
+ /**
248
+ * Save cache to disk with atomic write pattern.
249
+ * Merges with existing disk entries that haven't expired.
250
+ */
251
+ saveToDisk() {
252
+ try {
253
+ // Ensure directory exists
254
+ const dir = dirname(this.cacheFilePath);
255
+ if (!existsSync(dir)) {
256
+ mkdirSync(dir, { recursive: true });
257
+ }
258
+ ensureGitignoreSync(dir);
259
+ const now = Date.now();
260
+ // Step 1: Load existing disk entries (if any)
261
+ let existingEntries = {};
262
+ if (existsSync(this.cacheFilePath)) {
263
+ try {
264
+ const content = readFileSync(this.cacheFilePath, "utf-8");
265
+ const data = JSON.parse(content);
266
+ existingEntries = data.entries || {};
267
+ }
268
+ catch {
269
+ // Start fresh if corrupted
270
+ }
271
+ }
272
+ // Step 2: Filter existing disk entries by disk_ttl
273
+ const validDiskEntries = {};
274
+ for (const [key, entry] of Object.entries(existingEntries)) {
275
+ const age = now - entry.timestamp;
276
+ if (age <= this.diskTtlMs) {
277
+ validDiskEntries[key] = entry;
278
+ }
279
+ }
280
+ // Step 3: Merge - memory entries take precedence
281
+ const mergedEntries = { ...validDiskEntries };
282
+ for (const [key, entry] of this.cache.entries()) {
283
+ mergedEntries[key] = {
284
+ value: entry.value,
285
+ timestamp: entry.timestamp,
286
+ };
287
+ }
288
+ // Step 4: Build cache data
289
+ const cacheData = {
290
+ version: "1.0",
291
+ memory_ttl_seconds: this.memoryTtlMs / 1000,
292
+ disk_ttl_seconds: this.diskTtlMs / 1000,
293
+ entries: mergedEntries,
294
+ statistics: {
295
+ memory_hits: this.stats.memoryHits,
296
+ disk_hits: this.stats.diskHits,
297
+ misses: this.stats.misses,
298
+ writes: this.stats.writes + 1,
299
+ last_write: now,
300
+ },
301
+ };
302
+ // Step 5: Atomic write (temp file + rename)
303
+ const tmpPath = join(tmpdir(), `antigravity-cache-${Date.now()}-${Math.random().toString(36).slice(2)}.tmp`);
304
+ writeFileSync(tmpPath, JSON.stringify(cacheData, null, 2), "utf-8");
305
+ try {
306
+ renameSync(tmpPath, this.cacheFilePath);
307
+ }
308
+ catch {
309
+ // On Windows, rename across volumes may fail
310
+ // Fall back to copy + delete
311
+ writeFileSync(this.cacheFilePath, readFileSync(tmpPath));
312
+ try {
313
+ unlinkSync(tmpPath);
314
+ }
315
+ catch {
316
+ // Ignore cleanup errors
317
+ }
318
+ }
319
+ this.stats.writes++;
320
+ this.dirty = false;
321
+ return true;
322
+ }
323
+ catch {
324
+ // Silently fail - disk cache is optional
325
+ return false;
326
+ }
327
+ }
328
+ // ===========================================================================
329
+ // Background Tasks
330
+ // ===========================================================================
331
+ /**
332
+ * Start background write and cleanup timers.
333
+ */
334
+ startBackgroundTasks() {
335
+ // Periodic disk writes
336
+ this.writeTimer = setInterval(() => {
337
+ if (this.dirty) {
338
+ this.saveToDisk();
339
+ }
340
+ }, this.writeIntervalMs);
341
+ // Periodic memory cleanup (every 30 minutes)
342
+ this.cleanupTimer = setInterval(() => {
343
+ this.cleanupExpired();
344
+ }, 30 * 60 * 1000);
345
+ }
346
+ /**
347
+ * Remove expired entries from memory.
348
+ */
349
+ cleanupExpired() {
350
+ const now = Date.now();
351
+ let cleaned = 0;
352
+ for (const [key, entry] of this.cache.entries()) {
353
+ const age = now - entry.timestamp;
354
+ if (age > this.memoryTtlMs) {
355
+ this.cache.delete(key);
356
+ cleaned++;
357
+ }
358
+ }
359
+ // Silently clean - no console output
360
+ }
361
+ }
362
+ // =============================================================================
363
+ // Factory Function
364
+ // =============================================================================
365
+ /**
366
+ * Create a signature cache with the given configuration.
367
+ * Returns null if caching is disabled.
368
+ */
369
+ export function createSignatureCache(config) {
370
+ if (!config || !config.enabled) {
371
+ return null;
372
+ }
373
+ return new SignatureCache(config);
374
+ }
375
+ //# sourceMappingURL=signature-cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signature-cache.js","sourceRoot":"","sources":["../../../../src/plugin/cache/signature-cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrG,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAEjC,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAkDjD,gFAAgF;AAChF,iBAAiB;AACjB,gFAAgF;AAEhF,SAAS,YAAY;IACnB,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAClC,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACzB,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,SAAS,CAAC,EAAE,UAAU,CAAC,CAAC;IACxF,CAAC;IACD,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC;IAC5E,OAAO,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;AACrC,CAAC;AAED,SAAS,gBAAgB;IACvB,OAAO,IAAI,CAAC,YAAY,EAAE,EAAE,kCAAkC,CAAC,CAAC;AAClE,CAAC;AAED,gFAAgF;AAChF,wBAAwB;AACxB,gFAAgF;AAEhF,MAAM,OAAO,cAAc;IACzB,0EAA0E;IAClE,KAAK,GAA4B,IAAI,GAAG,EAAE,CAAC;IAEnD,gBAAgB;IACR,WAAW,CAAS;IACpB,SAAS,CAAS;IAClB,eAAe,CAAS;IACxB,aAAa,CAAS;IACtB,OAAO,CAAU;IAEzB,QAAQ;IACA,KAAK,GAAY,KAAK,CAAC;IACvB,UAAU,GAA0C,IAAI,CAAC;IACzD,YAAY,GAA0C,IAAI,CAAC;IAEnE,aAAa;IACL,KAAK,GAAG;QACd,UAAU,EAAE,CAAC;QACb,QAAQ,EAAE,CAAC;QACX,MAAM,EAAE,CAAC;QACT,MAAM,EAAE,CAAC;KACV,CAAC;IAEF,YAAY,MAA4B;QACtC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;QAC9B,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,kBAAkB,GAAG,IAAI,CAAC;QACpD,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAChD,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC,sBAAsB,GAAG,IAAI,CAAC;QAC5D,IAAI,CAAC,aAAa,GAAG,gBAAgB,EAAE,CAAC;QAExC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,IAAI,CAAC,YAAY,EAAE,CAAC;YACpB,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC9B,CAAC;IACH,CAAC;IAED,8EAA8E;IAC9E,aAAa;IACb,8EAA8E;IAE9E;;OAEG;IACH,MAAM,CAAC,OAAO,CAAC,SAAiB,EAAE,OAAe;QAC/C,OAAO,GAAG,SAAS,IAAI,OAAO,EAAE,CAAC;IACnC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,GAAW,EAAE,SAAiB;QAClC,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO;QAE1B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE;YAClB,KAAK,EAAE,SAAS;YAChB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB,CAAC,CAAC;QACH,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;IACpB,CAAC;IAED;;;OAGG;IACH,QAAQ,CAAC,GAAW;QAClB,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC;QAE/B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,SAAS,CAAC;YACzC,IAAI,GAAG,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;gBAC5B,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;gBACxB,OAAO,KAAK,CAAC,KAAK,CAAC;YACrB,CAAC;YACD,iCAAiC;YACjC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACzB,CAAC;QAED,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;QACpB,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACH,GAAG,CAAC,GAAW;QACb,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO,KAAK,CAAC;QAEhC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,CAAC,KAAK;YAAE,OAAO,KAAK,CAAC;QAEzB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,SAAS,CAAC;QACzC,OAAO,GAAG,IAAI,IAAI,CAAC,WAAW,CAAC;IACjC,CAAC;IAED,8EAA8E;IAC9E,sDAAsD;IACtD,8EAA8E;IAE9E;;;;;OAKG;IACH,aAAa,CACX,GAAW,EACX,YAAoB,EACpB,SAAiB,EACjB,OAAkB;QAElB,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,YAAY,IAAI,CAAC,SAAS;YAAE,OAAO;QAEzD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE;YAClB,KAAK,EAAE,SAAS;YAChB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,YAAY;YACZ,WAAW,EAAE,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;YACvC,OAAO;SACR,CAAC,CAAC;QACH,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;IACpB,CAAC;IAED;;;OAGG;IACH,gBAAgB,CAAC,GAAW;QAC1B,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC;QAE/B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,YAAY;YAAE,OAAO,IAAI,CAAC;QAE/C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,SAAS,CAAC;QACzC,IAAI,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;YAC3B,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACvB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;QACxB,OAAO;YACL,IAAI,EAAE,KAAK,CAAC,YAAY;YACxB,SAAS,EAAE,KAAK,CAAC,KAAK;YACtB,OAAO,EAAE,KAAK,CAAC,OAAO;SACvB,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,WAAW,CAAC,GAAW;QACrB,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO,KAAK,CAAC;QAEhC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,YAAY;YAAE,OAAO,KAAK,CAAC;QAEhD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,SAAS,CAAC;QACzC,OAAO,GAAG,IAAI,IAAI,CAAC,WAAW,CAAC;IACjC,CAAC;IAED;;OAEG;IACH,QAAQ;QACN,OAAO;YACL,GAAG,IAAI,CAAC,KAAK;YACb,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI;YAC9B,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,WAAW,EAAE,IAAI,CAAC,OAAO;SAC1B,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC;QAC/B,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,QAAQ;QACN,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC/B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACzB,CAAC;QACD,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YACjC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QAC3B,CAAC;QAED,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAC/B,IAAI,CAAC,UAAU,EAAE,CAAC;QACpB,CAAC;IACH,CAAC;IAED,8EAA8E;IAC9E,kBAAkB;IAClB,8EAA8E;IAE9E;;OAEG;IACK,YAAY;QAClB,IAAI,CAAC;YACH,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;gBACpC,OAAO;YACT,CAAC;YAED,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;YAC1D,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAc,CAAC;YAE9C,IAAI,IAAI,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;gBAC3B,0CAA0C;gBAC1C,OAAO;YACT,CAAC;YAED,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACvB,IAAI,MAAM,GAAG,CAAC,CAAC;YACf,IAAI,OAAO,GAAG,CAAC,CAAC;YAEhB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;gBACxD,MAAM,GAAG,GAAG,GAAG,GAAG,KAAK,CAAC,SAAS,CAAC;gBAClC,IAAI,GAAG,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;oBAC1B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE;wBAClB,KAAK,EAAE,KAAK,CAAC,KAAK;wBAClB,SAAS,EAAE,KAAK,CAAC,SAAS;qBAC3B,CAAC,CAAC;oBACH,MAAM,EAAE,CAAC;gBACX,CAAC;qBAAM,CAAC;oBACN,OAAO,EAAE,CAAC;gBACZ,CAAC;YACH,CAAC;YAED,oCAAoC;QACtC,CAAC;QAAC,MAAM,CAAC;YACP,uEAAuE;QACzE,CAAC;IACH,CAAC;IAED;;;OAGG;IACK,UAAU;QAChB,IAAI,CAAC;YACH,0BAA0B;YAC1B,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YACxC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBACrB,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACtC,CAAC;YAED,mBAAmB,CAAC,GAAG,CAAC,CAAC;YAEzB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAEvB,8CAA8C;YAC9C,IAAI,eAAe,GAA+B,EAAE,CAAC;YACrD,IAAI,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;gBACnC,IAAI,CAAC;oBACH,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;oBAC1D,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAc,CAAC;oBAC9C,eAAe,GAAG,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;gBACvC,CAAC;gBAAC,MAAM,CAAC;oBACP,2BAA2B;gBAC7B,CAAC;YACH,CAAC;YAED,mDAAmD;YACnD,MAAM,gBAAgB,GAA+B,EAAE,CAAC;YACxD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,CAAC;gBAC3D,MAAM,GAAG,GAAG,GAAG,GAAG,KAAK,CAAC,SAAS,CAAC;gBAClC,IAAI,GAAG,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;oBAC1B,gBAAgB,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;gBAChC,CAAC;YACH,CAAC;YAED,iDAAiD;YACjD,MAAM,aAAa,GAA+B,EAAE,GAAG,gBAAgB,EAAE,CAAC;YAC1E,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;gBAChD,aAAa,CAAC,GAAG,CAAC,GAAG;oBACnB,KAAK,EAAE,KAAK,CAAC,KAAK;oBAClB,SAAS,EAAE,KAAK,CAAC,SAAS;iBAC3B,CAAC;YACJ,CAAC;YAED,2BAA2B;YAC3B,MAAM,SAAS,GAAc;gBAC3B,OAAO,EAAE,KAAK;gBACd,kBAAkB,EAAE,IAAI,CAAC,WAAW,GAAG,IAAI;gBAC3C,gBAAgB,EAAE,IAAI,CAAC,SAAS,GAAG,IAAI;gBACvC,OAAO,EAAE,aAAa;gBACtB,UAAU,EAAE;oBACV,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU;oBAClC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ;oBAC9B,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM;oBACzB,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;oBAC7B,UAAU,EAAE,GAAG;iBAChB;aACF,CAAC;YAEF,4CAA4C;YAC5C,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,qBAAqB,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;YAC7G,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;YAEpE,IAAI,CAAC;gBACH,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;YAC1C,CAAC;YAAC,MAAM,CAAC;gBACP,6CAA6C;gBAC7C,6BAA6B;gBAC7B,aAAa,CAAC,IAAI,CAAC,aAAa,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC;gBACzD,IAAI,CAAC;oBACH,UAAU,CAAC,OAAO,CAAC,CAAC;gBACtB,CAAC;gBAAC,MAAM,CAAC;oBACP,wBAAwB;gBAC1B,CAAC;YACH,CAAC;YAED,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YACpB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;YACnB,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,yCAAyC;YACzC,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,8EAA8E;IAC9E,mBAAmB;IACnB,8EAA8E;IAE9E;;OAEG;IACK,oBAAoB;QAC1B,uBAAuB;QACvB,IAAI,CAAC,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE;YACjC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;gBACf,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,CAAC;QACH,CAAC,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;QAEzB,6CAA6C;QAC7C,IAAI,CAAC,YAAY,GAAG,WAAW,CAAC,GAAG,EAAE;YACnC,IAAI,CAAC,cAAc,EAAE,CAAC;QACxB,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;IACrB,CAAC;IAED;;OAEG;IACK,cAAc;QACpB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,IAAI,OAAO,GAAG,CAAC,CAAC;QAEhB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;YAChD,MAAM,GAAG,GAAG,GAAG,GAAG,KAAK,CAAC,SAAS,CAAC;YAClC,IAAI,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;gBAC3B,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBACvB,OAAO,EAAE,CAAC;YACZ,CAAC;QACH,CAAC;QAED,qCAAqC;IACvC,CAAC;CACF;AAED,gFAAgF;AAChF,mBAAmB;AACnB,gFAAgF;AAEhF;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,MAAwC;IAC3E,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QAC/B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,IAAI,cAAc,CAAC,MAAM,CAAC,CAAC;AACpC,CAAC"}
@@ -0,0 +1,44 @@
1
+ import type { OAuthAuthDetails } from "./types";
2
+ /**
3
+ * Returns a cached auth snapshot when available, favoring unexpired tokens.
4
+ */
5
+ export declare function resolveCachedAuth(auth: OAuthAuthDetails): OAuthAuthDetails;
6
+ /**
7
+ * Stores the latest auth snapshot keyed by refresh token.
8
+ */
9
+ export declare function storeCachedAuth(auth: OAuthAuthDetails): void;
10
+ /**
11
+ * Clears cached auth globally or for a specific refresh token.
12
+ */
13
+ export declare function clearCachedAuth(refresh?: string): void;
14
+ import { SignatureCache } from "./cache/signature-cache";
15
+ import type { SignatureCacheConfig } from "./config";
16
+ /**
17
+ * Initialize the disk-based signature cache.
18
+ * Call this from plugin initialization when keep_thinking is enabled.
19
+ */
20
+ export declare function initDiskSignatureCache(config: SignatureCacheConfig | undefined): SignatureCache | null;
21
+ /**
22
+ * Get the disk cache instance (for testing/debugging).
23
+ */
24
+ export declare function getDiskSignatureCache(): SignatureCache | null;
25
+ /**
26
+ * Caches a thinking signature for a given session and text.
27
+ * Used for Claude models that require signed thinking blocks in multi-turn conversations.
28
+ * Also writes to disk cache if enabled.
29
+ */
30
+ export declare function cacheSignature(sessionId: string, text: string, signature: string): void;
31
+ /**
32
+ * Retrieves a cached signature for a given session and text.
33
+ * Checks memory first, then falls back to disk cache.
34
+ * Returns undefined if not found or expired.
35
+ */
36
+ export declare function getCachedSignature(sessionId: string, text: string): string | undefined;
37
+ /**
38
+ * Clears signature cache for a specific session or all sessions.
39
+ * Also clears from disk cache if enabled.
40
+ */
41
+ export declare function clearSignatureCache(sessionId?: string): void;
42
+ export { SignatureCache, createSignatureCache } from "./cache/signature-cache";
43
+ export type { SignatureCacheConfig } from "./config";
44
+ //# sourceMappingURL=cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../../src/plugin/cache.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAahD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,gBAAgB,GAAG,gBAAgB,CAuB1E;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,gBAAgB,GAAG,IAAI,CAM5D;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAStD;AAMD,OAAO,EAAE,cAAc,EAAwB,MAAM,yBAAyB,CAAC;AAC/E,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAsBrD;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,oBAAoB,GAAG,SAAS,GAAG,cAAc,GAAG,IAAI,CAGtG;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,cAAc,GAAG,IAAI,CAE7D;AAkBD;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAsCvF;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAoCtF;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAU5D;AAOD,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/E,YAAY,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC"}
@@ -0,0 +1,200 @@
1
+ import { accessTokenExpired } from "./auth";
2
+ import { createHash } from "node:crypto";
3
+ const authCache = new Map();
4
+ /**
5
+ * Produces a stable cache key from a refresh token string.
6
+ */
7
+ function normalizeRefreshKey(refresh) {
8
+ const key = refresh?.trim();
9
+ return key ? key : undefined;
10
+ }
11
+ /**
12
+ * Returns a cached auth snapshot when available, favoring unexpired tokens.
13
+ */
14
+ export function resolveCachedAuth(auth) {
15
+ const key = normalizeRefreshKey(auth.refresh);
16
+ if (!key) {
17
+ return auth;
18
+ }
19
+ const cached = authCache.get(key);
20
+ if (!cached) {
21
+ authCache.set(key, auth);
22
+ return auth;
23
+ }
24
+ if (!accessTokenExpired(auth)) {
25
+ authCache.set(key, auth);
26
+ return auth;
27
+ }
28
+ if (!accessTokenExpired(cached)) {
29
+ return cached;
30
+ }
31
+ authCache.set(key, auth);
32
+ return auth;
33
+ }
34
+ /**
35
+ * Stores the latest auth snapshot keyed by refresh token.
36
+ */
37
+ export function storeCachedAuth(auth) {
38
+ const key = normalizeRefreshKey(auth.refresh);
39
+ if (!key) {
40
+ return;
41
+ }
42
+ authCache.set(key, auth);
43
+ }
44
+ /**
45
+ * Clears cached auth globally or for a specific refresh token.
46
+ */
47
+ export function clearCachedAuth(refresh) {
48
+ if (!refresh) {
49
+ authCache.clear();
50
+ return;
51
+ }
52
+ const key = normalizeRefreshKey(refresh);
53
+ if (key) {
54
+ authCache.delete(key);
55
+ }
56
+ }
57
+ // ============================================================================
58
+ // Thinking Signature Cache (for Claude multi-turn conversations)
59
+ // ============================================================================
60
+ import { SignatureCache, createSignatureCache } from "./cache/signature-cache";
61
+ // Map: sessionId -> Map<textHash, SignatureEntry>
62
+ const signatureCache = new Map();
63
+ // Cache entries expire after 1 hour
64
+ const SIGNATURE_CACHE_TTL_MS = 60 * 60 * 1000;
65
+ // Maximum entries per session to prevent memory bloat
66
+ const MAX_ENTRIES_PER_SESSION = 100;
67
+ // 16 hex chars = 64-bit key space; keeps memory bounded while making collisions extremely unlikely.
68
+ const SIGNATURE_TEXT_HASH_HEX_LEN = 16;
69
+ // Disk cache instance (initialized via initDiskSignatureCache)
70
+ let diskCache = null;
71
+ /**
72
+ * Initialize the disk-based signature cache.
73
+ * Call this from plugin initialization when keep_thinking is enabled.
74
+ */
75
+ export function initDiskSignatureCache(config) {
76
+ diskCache = createSignatureCache(config);
77
+ return diskCache;
78
+ }
79
+ /**
80
+ * Get the disk cache instance (for testing/debugging).
81
+ */
82
+ export function getDiskSignatureCache() {
83
+ return diskCache;
84
+ }
85
+ /**
86
+ * Hashes text content into a stable, Unicode-safe key.
87
+ *
88
+ * Uses SHA-256 over UTF-8 bytes and truncates to keep memory usage bounded.
89
+ */
90
+ function hashText(text) {
91
+ return createHash("sha256").update(text, "utf8").digest("hex").slice(0, SIGNATURE_TEXT_HASH_HEX_LEN);
92
+ }
93
+ /**
94
+ * Create a disk cache key from sessionId and textHash.
95
+ */
96
+ function makeDiskKey(sessionId, textHash) {
97
+ return `${sessionId}:${textHash}`;
98
+ }
99
+ /**
100
+ * Caches a thinking signature for a given session and text.
101
+ * Used for Claude models that require signed thinking blocks in multi-turn conversations.
102
+ * Also writes to disk cache if enabled.
103
+ */
104
+ export function cacheSignature(sessionId, text, signature) {
105
+ if (!sessionId || !text || !signature)
106
+ return;
107
+ const textHash = hashText(text);
108
+ // Write to memory cache
109
+ let sessionMemCache = signatureCache.get(sessionId);
110
+ if (!sessionMemCache) {
111
+ sessionMemCache = new Map();
112
+ signatureCache.set(sessionId, sessionMemCache);
113
+ }
114
+ // Evict old entries if we're at capacity
115
+ if (sessionMemCache.size >= MAX_ENTRIES_PER_SESSION) {
116
+ const now = Date.now();
117
+ for (const [key, entry] of sessionMemCache.entries()) {
118
+ if (now - entry.timestamp > SIGNATURE_CACHE_TTL_MS) {
119
+ sessionMemCache.delete(key);
120
+ }
121
+ }
122
+ // If still at capacity, remove oldest entries
123
+ if (sessionMemCache.size >= MAX_ENTRIES_PER_SESSION) {
124
+ const entries = Array.from(sessionMemCache.entries())
125
+ .sort((a, b) => a[1].timestamp - b[1].timestamp);
126
+ const toRemove = entries.slice(0, Math.floor(MAX_ENTRIES_PER_SESSION / 4));
127
+ for (const [key] of toRemove) {
128
+ sessionMemCache.delete(key);
129
+ }
130
+ }
131
+ }
132
+ sessionMemCache.set(textHash, { signature, timestamp: Date.now() });
133
+ // Write to disk cache if enabled
134
+ if (diskCache) {
135
+ const diskKey = makeDiskKey(sessionId, textHash);
136
+ diskCache.store(diskKey, signature);
137
+ }
138
+ }
139
+ /**
140
+ * Retrieves a cached signature for a given session and text.
141
+ * Checks memory first, then falls back to disk cache.
142
+ * Returns undefined if not found or expired.
143
+ */
144
+ export function getCachedSignature(sessionId, text) {
145
+ if (!sessionId || !text)
146
+ return undefined;
147
+ const textHash = hashText(text);
148
+ // Check memory cache first
149
+ const sessionMemCache = signatureCache.get(sessionId);
150
+ if (sessionMemCache) {
151
+ const entry = sessionMemCache.get(textHash);
152
+ if (entry) {
153
+ // Check if expired
154
+ if (Date.now() - entry.timestamp > SIGNATURE_CACHE_TTL_MS) {
155
+ sessionMemCache.delete(textHash);
156
+ }
157
+ else {
158
+ return entry.signature;
159
+ }
160
+ }
161
+ }
162
+ // Fall back to disk cache
163
+ if (diskCache) {
164
+ const diskKey = makeDiskKey(sessionId, textHash);
165
+ const diskValue = diskCache.retrieve(diskKey);
166
+ if (diskValue) {
167
+ // Promote to memory cache for faster subsequent access
168
+ let memCache = signatureCache.get(sessionId);
169
+ if (!memCache) {
170
+ memCache = new Map();
171
+ signatureCache.set(sessionId, memCache);
172
+ }
173
+ memCache.set(textHash, { signature: diskValue, timestamp: Date.now() });
174
+ return diskValue;
175
+ }
176
+ }
177
+ return undefined;
178
+ }
179
+ /**
180
+ * Clears signature cache for a specific session or all sessions.
181
+ * Also clears from disk cache if enabled.
182
+ */
183
+ export function clearSignatureCache(sessionId) {
184
+ if (sessionId) {
185
+ signatureCache.delete(sessionId);
186
+ // Note: We don't clear individual sessions from disk cache to avoid
187
+ // expensive iteration. Disk cache entries will expire naturally.
188
+ }
189
+ else {
190
+ signatureCache.clear();
191
+ // For full clear, we could clear disk cache, but leaving it for now
192
+ // since entries have TTL and will expire naturally.
193
+ }
194
+ }
195
+ // ============================================================================
196
+ // Disk-Persistent Signature Cache (re-export from cache/ folder)
197
+ // ============================================================================
198
+ // Re-export SignatureCache class and factory for direct use
199
+ export { SignatureCache, createSignatureCache } from "./cache/signature-cache";
200
+ //# sourceMappingURL=cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.js","sourceRoot":"","sources":["../../../src/plugin/cache.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import { type AccountStatus } from "./ui/auth-menu";
2
+ export declare function promptProjectId(): Promise<string>;
3
+ export declare function promptAddAnotherAccount(currentCount: number): Promise<boolean>;
4
+ export declare function pause(message?: string): Promise<void>;
5
+ export type LoginMode = "add" | "fresh" | "manage" | "check" | "verify" | "verify-all" | "cancel";
6
+ export interface ExistingAccountInfo {
7
+ email?: string;
8
+ index: number;
9
+ addedAt?: number;
10
+ lastUsed?: number;
11
+ status?: AccountStatus;
12
+ isCurrentAccount?: boolean;
13
+ enabled?: boolean;
14
+ }
15
+ export interface LoginMenuResult {
16
+ mode: LoginMode;
17
+ deleteAccountIndex?: number;
18
+ refreshAccountIndex?: number;
19
+ toggleAccountIndex?: number;
20
+ verifyAccountIndex?: number;
21
+ verifyAll?: boolean;
22
+ deleteAll?: boolean;
23
+ }
24
+ export declare function promptLoginMode(existingAccounts: ExistingAccountInfo[]): Promise<LoginMenuResult>;
25
+ export { isTTY } from "./ui/auth-menu";
26
+ export type { AccountStatus } from "./ui/auth-menu";
27
+ //# sourceMappingURL=cli.d.ts.map