@cortexkit/opencode-antigravity-auth 1.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 (271) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +714 -0
  3. package/dist/index.d.ts +4 -0
  4. package/dist/index.d.ts.map +1 -0
  5. package/dist/index.js +15175 -0
  6. package/dist/index.js.map +7 -0
  7. package/dist/src/antigravity/oauth.d.ts +2 -0
  8. package/dist/src/antigravity/oauth.d.ts.map +1 -0
  9. package/dist/src/antigravity/oauth.js +3 -0
  10. package/dist/src/antigravity/oauth.js.map +1 -0
  11. package/dist/src/constants.d.ts +2 -0
  12. package/dist/src/constants.d.ts.map +1 -0
  13. package/dist/src/constants.js +3 -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 +234 -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 +122 -0
  30. package/dist/src/hooks/auto-update-checker/index.js.map +1 -0
  31. package/dist/src/hooks/auto-update-checker/logging.d.ts +3 -0
  32. package/dist/src/hooks/auto-update-checker/logging.d.ts.map +1 -0
  33. package/dist/src/hooks/auto-update-checker/logging.js +9 -0
  34. package/dist/src/hooks/auto-update-checker/logging.js.map +1 -0
  35. package/dist/src/hooks/auto-update-checker/types.d.ts +25 -0
  36. package/dist/src/hooks/auto-update-checker/types.d.ts.map +1 -0
  37. package/dist/src/hooks/auto-update-checker/types.js +1 -0
  38. package/dist/src/hooks/auto-update-checker/types.js.map +1 -0
  39. package/dist/src/plugin/accounts.d.ts +232 -0
  40. package/dist/src/plugin/accounts.d.ts.map +1 -0
  41. package/dist/src/plugin/accounts.js +1163 -0
  42. package/dist/src/plugin/accounts.js.map +1 -0
  43. package/dist/src/plugin/agy-transport.d.ts +2 -0
  44. package/dist/src/plugin/agy-transport.d.ts.map +1 -0
  45. package/dist/src/plugin/agy-transport.js +3 -0
  46. package/dist/src/plugin/agy-transport.js.map +1 -0
  47. package/dist/src/plugin/auth-doctor.d.ts +30 -0
  48. package/dist/src/plugin/auth-doctor.d.ts.map +1 -0
  49. package/dist/src/plugin/auth-doctor.js +144 -0
  50. package/dist/src/plugin/auth-doctor.js.map +1 -0
  51. package/dist/src/plugin/auth-drift.d.ts +13 -0
  52. package/dist/src/plugin/auth-drift.d.ts.map +1 -0
  53. package/dist/src/plugin/auth-drift.js +70 -0
  54. package/dist/src/plugin/auth-drift.js.map +1 -0
  55. package/dist/src/plugin/auth.d.ts +2 -0
  56. package/dist/src/plugin/auth.d.ts.map +1 -0
  57. package/dist/src/plugin/auth.js +3 -0
  58. package/dist/src/plugin/auth.js.map +1 -0
  59. package/dist/src/plugin/cache/index.d.ts +5 -0
  60. package/dist/src/plugin/cache/index.d.ts.map +1 -0
  61. package/dist/src/plugin/cache/index.js +5 -0
  62. package/dist/src/plugin/cache/index.js.map +1 -0
  63. package/dist/src/plugin/cache/signature-cache.d.ts +111 -0
  64. package/dist/src/plugin/cache/signature-cache.d.ts.map +1 -0
  65. package/dist/src/plugin/cache/signature-cache.js +375 -0
  66. package/dist/src/plugin/cache/signature-cache.js.map +1 -0
  67. package/dist/src/plugin/cache.d.ts +44 -0
  68. package/dist/src/plugin/cache.d.ts.map +1 -0
  69. package/dist/src/plugin/cache.js +247 -0
  70. package/dist/src/plugin/cache.js.map +1 -0
  71. package/dist/src/plugin/cli.d.ts +44 -0
  72. package/dist/src/plugin/cli.d.ts.map +1 -0
  73. package/dist/src/plugin/cli.js +153 -0
  74. package/dist/src/plugin/cli.js.map +1 -0
  75. package/dist/src/plugin/config/index.d.ts +16 -0
  76. package/dist/src/plugin/config/index.d.ts.map +1 -0
  77. package/dist/src/plugin/config/index.js +16 -0
  78. package/dist/src/plugin/config/index.js.map +1 -0
  79. package/dist/src/plugin/config/loader.d.ts +36 -0
  80. package/dist/src/plugin/config/loader.d.ts.map +1 -0
  81. package/dist/src/plugin/config/loader.js +140 -0
  82. package/dist/src/plugin/config/loader.js.map +1 -0
  83. package/dist/src/plugin/config/models.d.ts +3 -0
  84. package/dist/src/plugin/config/models.d.ts.map +1 -0
  85. package/dist/src/plugin/config/models.js +2 -0
  86. package/dist/src/plugin/config/models.js.map +1 -0
  87. package/dist/src/plugin/config/schema.d.ts +141 -0
  88. package/dist/src/plugin/config/schema.d.ts.map +1 -0
  89. package/dist/src/plugin/config/schema.js +504 -0
  90. package/dist/src/plugin/config/schema.js.map +1 -0
  91. package/dist/src/plugin/config/updater.d.ts +55 -0
  92. package/dist/src/plugin/config/updater.d.ts.map +1 -0
  93. package/dist/src/plugin/config/updater.js +127 -0
  94. package/dist/src/plugin/config/updater.js.map +1 -0
  95. package/dist/src/plugin/core/streaming/index.d.ts +3 -0
  96. package/dist/src/plugin/core/streaming/index.d.ts.map +1 -0
  97. package/dist/src/plugin/core/streaming/index.js +3 -0
  98. package/dist/src/plugin/core/streaming/index.js.map +1 -0
  99. package/dist/src/plugin/core/streaming/transformer.d.ts +12 -0
  100. package/dist/src/plugin/core/streaming/transformer.d.ts.map +1 -0
  101. package/dist/src/plugin/core/streaming/transformer.js +447 -0
  102. package/dist/src/plugin/core/streaming/transformer.js.map +1 -0
  103. package/dist/src/plugin/core/streaming/types.d.ts +34 -0
  104. package/dist/src/plugin/core/streaming/types.d.ts.map +1 -0
  105. package/dist/src/plugin/core/streaming/types.js +1 -0
  106. package/dist/src/plugin/core/streaming/types.js.map +1 -0
  107. package/dist/src/plugin/debug.d.ts +94 -0
  108. package/dist/src/plugin/debug.d.ts.map +1 -0
  109. package/dist/src/plugin/debug.js +383 -0
  110. package/dist/src/plugin/debug.js.map +1 -0
  111. package/dist/src/plugin/errors.d.ts +28 -0
  112. package/dist/src/plugin/errors.d.ts.map +1 -0
  113. package/dist/src/plugin/errors.js +42 -0
  114. package/dist/src/plugin/errors.js.map +1 -0
  115. package/dist/src/plugin/fingerprint.d.ts +2 -0
  116. package/dist/src/plugin/fingerprint.d.ts.map +1 -0
  117. package/dist/src/plugin/fingerprint.js +3 -0
  118. package/dist/src/plugin/fingerprint.js.map +1 -0
  119. package/dist/src/plugin/gemini-dump.d.ts +47 -0
  120. package/dist/src/plugin/gemini-dump.d.ts.map +1 -0
  121. package/dist/src/plugin/gemini-dump.js +238 -0
  122. package/dist/src/plugin/gemini-dump.js.map +1 -0
  123. package/dist/src/plugin/image-saver.d.ts +25 -0
  124. package/dist/src/plugin/image-saver.d.ts.map +1 -0
  125. package/dist/src/plugin/image-saver.js +86 -0
  126. package/dist/src/plugin/image-saver.js.map +1 -0
  127. package/dist/src/plugin/logger.d.ts +23 -0
  128. package/dist/src/plugin/logger.d.ts.map +1 -0
  129. package/dist/src/plugin/logger.js +80 -0
  130. package/dist/src/plugin/logger.js.map +1 -0
  131. package/dist/src/plugin/logging-utils.d.ts +23 -0
  132. package/dist/src/plugin/logging-utils.d.ts.map +1 -0
  133. package/dist/src/plugin/logging-utils.js +92 -0
  134. package/dist/src/plugin/logging-utils.js.map +1 -0
  135. package/dist/src/plugin/model-registry.d.ts +2 -0
  136. package/dist/src/plugin/model-registry.d.ts.map +1 -0
  137. package/dist/src/plugin/model-registry.js +3 -0
  138. package/dist/src/plugin/model-registry.js.map +1 -0
  139. package/dist/src/plugin/project.d.ts +2 -0
  140. package/dist/src/plugin/project.d.ts.map +1 -0
  141. package/dist/src/plugin/project.js +3 -0
  142. package/dist/src/plugin/project.js.map +1 -0
  143. package/dist/src/plugin/prompt-context.d.ts +18 -0
  144. package/dist/src/plugin/prompt-context.d.ts.map +1 -0
  145. package/dist/src/plugin/prompt-context.js +99 -0
  146. package/dist/src/plugin/prompt-context.js.map +1 -0
  147. package/dist/src/plugin/quota.d.ts +44 -0
  148. package/dist/src/plugin/quota.d.ts.map +1 -0
  149. package/dist/src/plugin/quota.js +336 -0
  150. package/dist/src/plugin/quota.js.map +1 -0
  151. package/dist/src/plugin/recovery/constants.d.ts +22 -0
  152. package/dist/src/plugin/recovery/constants.d.ts.map +1 -0
  153. package/dist/src/plugin/recovery/constants.js +43 -0
  154. package/dist/src/plugin/recovery/constants.js.map +1 -0
  155. package/dist/src/plugin/recovery/index.d.ts +12 -0
  156. package/dist/src/plugin/recovery/index.d.ts.map +1 -0
  157. package/dist/src/plugin/recovery/index.js +12 -0
  158. package/dist/src/plugin/recovery/index.js.map +1 -0
  159. package/dist/src/plugin/recovery/storage.d.ts +24 -0
  160. package/dist/src/plugin/recovery/storage.d.ts.map +1 -0
  161. package/dist/src/plugin/recovery/storage.js +354 -0
  162. package/dist/src/plugin/recovery/storage.js.map +1 -0
  163. package/dist/src/plugin/recovery/types.d.ts +116 -0
  164. package/dist/src/plugin/recovery/types.d.ts.map +1 -0
  165. package/dist/src/plugin/recovery/types.js +6 -0
  166. package/dist/src/plugin/recovery/types.js.map +1 -0
  167. package/dist/src/plugin/recovery.d.ts +61 -0
  168. package/dist/src/plugin/recovery.d.ts.map +1 -0
  169. package/dist/src/plugin/recovery.js +381 -0
  170. package/dist/src/plugin/recovery.js.map +1 -0
  171. package/dist/src/plugin/refresh-queue.d.ts +100 -0
  172. package/dist/src/plugin/refresh-queue.d.ts.map +1 -0
  173. package/dist/src/plugin/refresh-queue.js +247 -0
  174. package/dist/src/plugin/refresh-queue.js.map +1 -0
  175. package/dist/src/plugin/request-helpers.d.ts +278 -0
  176. package/dist/src/plugin/request-helpers.d.ts.map +1 -0
  177. package/dist/src/plugin/request-helpers.js +2323 -0
  178. package/dist/src/plugin/request-helpers.js.map +1 -0
  179. package/dist/src/plugin/request.d.ts +102 -0
  180. package/dist/src/plugin/request.d.ts.map +1 -0
  181. package/dist/src/plugin/request.js +1658 -0
  182. package/dist/src/plugin/request.js.map +1 -0
  183. package/dist/src/plugin/rotation.d.ts +169 -0
  184. package/dist/src/plugin/rotation.d.ts.map +1 -0
  185. package/dist/src/plugin/rotation.js +328 -0
  186. package/dist/src/plugin/rotation.js.map +1 -0
  187. package/dist/src/plugin/search.d.ts +25 -0
  188. package/dist/src/plugin/search.d.ts.map +1 -0
  189. package/dist/src/plugin/search.js +200 -0
  190. package/dist/src/plugin/search.js.map +1 -0
  191. package/dist/src/plugin/server.d.ts +23 -0
  192. package/dist/src/plugin/server.d.ts.map +1 -0
  193. package/dist/src/plugin/server.js +324 -0
  194. package/dist/src/plugin/server.js.map +1 -0
  195. package/dist/src/plugin/storage.d.ts +150 -0
  196. package/dist/src/plugin/storage.d.ts.map +1 -0
  197. package/dist/src/plugin/storage.js +628 -0
  198. package/dist/src/plugin/storage.js.map +1 -0
  199. package/dist/src/plugin/stores/signature-store.d.ts +5 -0
  200. package/dist/src/plugin/stores/signature-store.d.ts.map +1 -0
  201. package/dist/src/plugin/stores/signature-store.js +25 -0
  202. package/dist/src/plugin/stores/signature-store.js.map +1 -0
  203. package/dist/src/plugin/thinking-recovery.d.ts +90 -0
  204. package/dist/src/plugin/thinking-recovery.d.ts.map +1 -0
  205. package/dist/src/plugin/thinking-recovery.js +330 -0
  206. package/dist/src/plugin/thinking-recovery.js.map +1 -0
  207. package/dist/src/plugin/token.d.ts +19 -0
  208. package/dist/src/plugin/token.d.ts.map +1 -0
  209. package/dist/src/plugin/token.js +130 -0
  210. package/dist/src/plugin/token.js.map +1 -0
  211. package/dist/src/plugin/transform/claude.d.ts +92 -0
  212. package/dist/src/plugin/transform/claude.d.ts.map +1 -0
  213. package/dist/src/plugin/transform/claude.js +280 -0
  214. package/dist/src/plugin/transform/claude.js.map +1 -0
  215. package/dist/src/plugin/transform/cross-model-sanitizer.d.ts +2 -0
  216. package/dist/src/plugin/transform/cross-model-sanitizer.d.ts.map +1 -0
  217. package/dist/src/plugin/transform/cross-model-sanitizer.js +3 -0
  218. package/dist/src/plugin/transform/cross-model-sanitizer.js.map +1 -0
  219. package/dist/src/plugin/transform/gemini.d.ts +100 -0
  220. package/dist/src/plugin/transform/gemini.d.ts.map +1 -0
  221. package/dist/src/plugin/transform/gemini.js +446 -0
  222. package/dist/src/plugin/transform/gemini.js.map +1 -0
  223. package/dist/src/plugin/transform/index.d.ts +2 -0
  224. package/dist/src/plugin/transform/index.d.ts.map +1 -0
  225. package/dist/src/plugin/transform/index.js +3 -0
  226. package/dist/src/plugin/transform/index.js.map +1 -0
  227. package/dist/src/plugin/transform/model-resolver.d.ts +2 -0
  228. package/dist/src/plugin/transform/model-resolver.d.ts.map +1 -0
  229. package/dist/src/plugin/transform/model-resolver.js +3 -0
  230. package/dist/src/plugin/transform/model-resolver.js.map +1 -0
  231. package/dist/src/plugin/transform/types.d.ts +2 -0
  232. package/dist/src/plugin/transform/types.d.ts.map +1 -0
  233. package/dist/src/plugin/transform/types.js +3 -0
  234. package/dist/src/plugin/transform/types.js.map +1 -0
  235. package/dist/src/plugin/types.d.ts +80 -0
  236. package/dist/src/plugin/types.d.ts.map +1 -0
  237. package/dist/src/plugin/types.js +1 -0
  238. package/dist/src/plugin/types.js.map +1 -0
  239. package/dist/src/plugin/ui/ansi.d.ts +32 -0
  240. package/dist/src/plugin/ui/ansi.d.ts.map +1 -0
  241. package/dist/src/plugin/ui/ansi.js +52 -0
  242. package/dist/src/plugin/ui/ansi.js.map +1 -0
  243. package/dist/src/plugin/ui/auth-menu.d.ts +59 -0
  244. package/dist/src/plugin/ui/auth-menu.d.ts.map +1 -0
  245. package/dist/src/plugin/ui/auth-menu.js +362 -0
  246. package/dist/src/plugin/ui/auth-menu.js.map +1 -0
  247. package/dist/src/plugin/ui/confirm.d.ts +2 -0
  248. package/dist/src/plugin/ui/confirm.d.ts.map +1 -0
  249. package/dist/src/plugin/ui/confirm.js +15 -0
  250. package/dist/src/plugin/ui/confirm.js.map +1 -0
  251. package/dist/src/plugin/ui/model-status.d.ts +28 -0
  252. package/dist/src/plugin/ui/model-status.d.ts.map +1 -0
  253. package/dist/src/plugin/ui/model-status.js +80 -0
  254. package/dist/src/plugin/ui/model-status.js.map +1 -0
  255. package/dist/src/plugin/ui/quota-status.d.ts +82 -0
  256. package/dist/src/plugin/ui/quota-status.d.ts.map +1 -0
  257. package/dist/src/plugin/ui/quota-status.js +251 -0
  258. package/dist/src/plugin/ui/quota-status.js.map +1 -0
  259. package/dist/src/plugin/ui/select.d.ts +23 -0
  260. package/dist/src/plugin/ui/select.d.ts.map +1 -0
  261. package/dist/src/plugin/ui/select.js +254 -0
  262. package/dist/src/plugin/ui/select.js.map +1 -0
  263. package/dist/src/plugin/version.d.ts +2 -0
  264. package/dist/src/plugin/version.d.ts.map +1 -0
  265. package/dist/src/plugin/version.js +3 -0
  266. package/dist/src/plugin/version.js.map +1 -0
  267. package/dist/src/plugin.d.ts +32 -0
  268. package/dist/src/plugin.d.ts.map +1 -0
  269. package/dist/src/plugin.js +3125 -0
  270. package/dist/src/plugin.js.map +1 -0
  271. package/package.json +70 -0
@@ -0,0 +1,127 @@
1
+ /**
2
+ * OpenCode configuration file updater.
3
+ *
4
+ * Updates ~/.config/opencode/opencode.json(c) with plugin models.
5
+ */
6
+ import { existsSync, readFileSync, writeFileSync, mkdirSync } from "node:fs";
7
+ import { join, dirname } from "node:path";
8
+ import { homedir } from "node:os";
9
+ import { getAntigravityOpencodeModelIds, OPENCODE_MODEL_DEFINITIONS } from "./models";
10
+ // =============================================================================
11
+ // Constants
12
+ // =============================================================================
13
+ const PLUGIN_NAME = "@cortexkit/opencode-antigravity-auth@latest";
14
+ const SCHEMA_URL = "https://opencode.ai/config.json";
15
+ const OPENCODE_JSON_FILENAME = "opencode.json";
16
+ const OPENCODE_JSONC_FILENAME = "opencode.jsonc";
17
+ function stripJsonCommentsAndTrailingCommas(json) {
18
+ return json
19
+ .replace(/\\"|"(?:\\"|[^"])*"|(\/\/.*|\/\*[\s\S]*?\*\/)/g, (match, group) => (group ? "" : match))
20
+ .replace(/,(\s*[}\]])/g, "$1");
21
+ }
22
+ /**
23
+ * Get the opencode config directory path.
24
+ */
25
+ export function getOpencodeConfigDir() {
26
+ const xdgConfig = process.env.XDG_CONFIG_HOME || join(homedir(), ".config");
27
+ return join(xdgConfig, "opencode");
28
+ }
29
+ /**
30
+ * Get the opencode config file path.
31
+ *
32
+ * Prefers opencode.jsonc when present so we update the active config file
33
+ * instead of creating a new opencode.json.
34
+ */
35
+ export function getOpencodeConfigPath() {
36
+ const configDir = getOpencodeConfigDir();
37
+ const jsoncPath = join(configDir, OPENCODE_JSONC_FILENAME);
38
+ const jsonPath = join(configDir, OPENCODE_JSON_FILENAME);
39
+ if (existsSync(jsoncPath)) {
40
+ return jsoncPath;
41
+ }
42
+ if (existsSync(jsonPath)) {
43
+ return jsonPath;
44
+ }
45
+ return jsonPath;
46
+ }
47
+ // =============================================================================
48
+ // Main Function
49
+ // =============================================================================
50
+ /**
51
+ * Updates the opencode configuration file with plugin models.
52
+ *
53
+ * This function:
54
+ * 1. Reads existing opencode.json/opencode.jsonc (or creates default structure)
55
+ * 2. Replaces `provider.google.models` with plugin models
56
+ * 3. Writes back to disk with proper formatting
57
+ *
58
+ * Preserves:
59
+ * - $schema and other top-level config keys
60
+ * - Non-google provider sections
61
+ * - Other settings within google provider (except models)
62
+ *
63
+ * @param options - Optional configuration (e.g., custom configPath for testing)
64
+ * @returns UpdateConfigResult with success status and path
65
+ */
66
+ export async function updateOpencodeConfig(options = {}) {
67
+ const configPath = options.configPath ?? getOpencodeConfigPath();
68
+ try {
69
+ let config;
70
+ // Read existing config or create default
71
+ if (existsSync(configPath)) {
72
+ const content = readFileSync(configPath, "utf-8");
73
+ config = JSON.parse(stripJsonCommentsAndTrailingCommas(content));
74
+ }
75
+ else {
76
+ // Create default config structure
77
+ config = {
78
+ $schema: SCHEMA_URL,
79
+ plugin: [],
80
+ provider: {},
81
+ };
82
+ }
83
+ // Ensure $schema is set
84
+ if (!config.$schema) {
85
+ config.$schema = SCHEMA_URL;
86
+ }
87
+ // Ensure plugin array exists and contains our plugin
88
+ if (!Array.isArray(config.plugin)) {
89
+ config.plugin = [];
90
+ }
91
+ // Check if plugin is already in the list (any version)
92
+ const hasPlugin = config.plugin.some((p) => p.includes("opencode-antigravity-auth"));
93
+ if (!hasPlugin) {
94
+ config.plugin.push(PLUGIN_NAME);
95
+ }
96
+ // Ensure provider.google structure exists
97
+ if (!config.provider) {
98
+ config.provider = {};
99
+ }
100
+ if (!config.provider.google) {
101
+ config.provider.google = {};
102
+ }
103
+ // Replace google models with the agy-supported catalog and hide built-in
104
+ // Google models that Antigravity does not support.
105
+ config.provider.google.models = { ...OPENCODE_MODEL_DEFINITIONS };
106
+ config.provider.google.whitelist = getAntigravityOpencodeModelIds();
107
+ // Ensure config directory exists
108
+ const configDir = dirname(configPath);
109
+ if (!existsSync(configDir)) {
110
+ mkdirSync(configDir, { recursive: true });
111
+ }
112
+ // Write config with proper formatting (2-space indent)
113
+ writeFileSync(configPath, JSON.stringify(config, null, 2), "utf-8");
114
+ return {
115
+ success: true,
116
+ configPath,
117
+ };
118
+ }
119
+ catch (error) {
120
+ return {
121
+ success: false,
122
+ configPath,
123
+ error: error instanceof Error ? error.message : String(error),
124
+ };
125
+ }
126
+ }
127
+ //# sourceMappingURL=updater.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"updater.js","sourceRoot":"","sources":["../../../../src/plugin/config/updater.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export * from './types';
2
+ export * from './transformer';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/plugin/core/streaming/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,eAAe,CAAC"}
@@ -0,0 +1,3 @@
1
+ export * from './types';
2
+ export * from './transformer';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/plugin/core/streaming/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,eAAe,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { SignatureStore, StreamingCallbacks, StreamingOptions, StreamingUsageMetadata, ThoughtBuffer } from './types';
2
+ export declare function createThoughtBuffer(): ThoughtBuffer;
3
+ export declare function transformStreamingPayload(payload: string, transformThinkingParts?: (response: unknown) => unknown): string;
4
+ export declare function deduplicateThinkingText(response: unknown, sentBuffer: ThoughtBuffer, displayedThinkingHashes?: Set<string>): unknown;
5
+ export declare function transformSseLine(line: string, signatureStore: SignatureStore, thoughtBuffer: ThoughtBuffer, sentThinkingBuffer: ThoughtBuffer, callbacks: StreamingCallbacks, options: StreamingOptions, debugState: {
6
+ injected: boolean;
7
+ }, usageState?: {
8
+ lastUsage: StreamingUsageMetadata | null;
9
+ }): string;
10
+ export declare function cacheThinkingSignaturesFromResponse(response: unknown, signatureSessionKey: string, signatureStore: SignatureStore, thoughtBuffer: ThoughtBuffer, onCacheSignature?: (sessionKey: string, text: string, signature: string) => void): void;
11
+ export declare function createStreamingTransformer(signatureStore: SignatureStore, callbacks: StreamingCallbacks, options?: StreamingOptions): TransformStream<Uint8Array, Uint8Array>;
12
+ //# sourceMappingURL=transformer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transformer.d.ts","sourceRoot":"","sources":["../../../../../src/plugin/core/streaming/transformer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,kBAAkB,EAClB,gBAAgB,EAChB,sBAAsB,EACtB,aAAa,EACd,MAAM,SAAS,CAAC;AAcjB,wBAAgB,mBAAmB,IAAI,aAAa,CAOnD;AAED,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,MAAM,EACf,sBAAsB,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,KAAK,OAAO,GACtD,MAAM,CAyBR;AACD,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,OAAO,EACjB,UAAU,EAAE,aAAa,EACzB,uBAAuB,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GACpC,OAAO,CA0GT;AAkLD,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,EACZ,cAAc,EAAE,cAAc,EAC9B,aAAa,EAAE,aAAa,EAC5B,kBAAkB,EAAE,aAAa,EACjC,SAAS,EAAE,kBAAkB,EAC7B,OAAO,EAAE,gBAAgB,EACzB,UAAU,EAAE;IAAE,QAAQ,EAAE,OAAO,CAAA;CAAE,EACjC,UAAU,CAAC,EAAE;IAAE,SAAS,EAAE,sBAAsB,GAAG,IAAI,CAAA;CAAE,GACxD,MAAM,CAWR;AAED,wBAAgB,mCAAmC,CACjD,QAAQ,EAAE,OAAO,EACjB,mBAAmB,EAAE,MAAM,EAC3B,cAAc,EAAE,cAAc,EAC9B,aAAa,EAAE,aAAa,EAC5B,gBAAgB,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,IAAI,GAC/E,IAAI,CAwDN;AAED,wBAAgB,0BAA0B,CACxC,cAAc,EAAE,cAAc,EAC9B,SAAS,EAAE,kBAAkB,EAC7B,OAAO,GAAE,gBAAqB,GAC7B,eAAe,CAAC,UAAU,EAAE,UAAU,CAAC,CAuIzC"}
@@ -0,0 +1,447 @@
1
+ import { processImageData } from '../../image-saver';
2
+ /**
3
+ * Simple string hash for thinking deduplication.
4
+ * Uses DJB2-like algorithm.
5
+ */
6
+ function hashString(str) {
7
+ let hash = 5381;
8
+ for (let i = 0; i < str.length; i++) {
9
+ hash = ((hash << 5) + hash) + str.charCodeAt(i); /* hash * 33 + c */
10
+ }
11
+ return (hash >>> 0).toString(16);
12
+ }
13
+ export function createThoughtBuffer() {
14
+ const buffer = new Map();
15
+ return {
16
+ get: (index) => buffer.get(index),
17
+ set: (index, text) => buffer.set(index, text),
18
+ clear: () => buffer.clear(),
19
+ };
20
+ }
21
+ export function transformStreamingPayload(payload, transformThinkingParts) {
22
+ return payload
23
+ .split('\n')
24
+ .map((line) => {
25
+ if (!line.startsWith('data:')) {
26
+ return line;
27
+ }
28
+ const json = line.slice(5).trim();
29
+ if (!json) {
30
+ return line;
31
+ }
32
+ try {
33
+ const parsed = JSON.parse(json);
34
+ if (parsed.response !== undefined) {
35
+ const transformed = transformThinkingParts
36
+ ? transformThinkingParts(parsed.response)
37
+ : parsed.response;
38
+ return `data: ${JSON.stringify(transformed)}`;
39
+ }
40
+ }
41
+ catch (_) {
42
+ console.warn("[antigravity] Malformed SSE chunk, passing through untransformed:", json.slice(0, 200));
43
+ }
44
+ return line;
45
+ })
46
+ .join('\n');
47
+ }
48
+ export function deduplicateThinkingText(response, sentBuffer, displayedThinkingHashes) {
49
+ if (!response || typeof response !== 'object')
50
+ return response;
51
+ const resp = response;
52
+ if (Array.isArray(resp.candidates)) {
53
+ const newCandidates = resp.candidates.map((candidate, index) => {
54
+ const cand = candidate;
55
+ if (!cand?.content)
56
+ return candidate;
57
+ const content = cand.content;
58
+ if (!Array.isArray(content.parts))
59
+ return candidate;
60
+ const newParts = content.parts.flatMap((part) => {
61
+ const p = part;
62
+ // Handle image data - save to disk and return file path
63
+ if (p.inlineData) {
64
+ const inlineData = p.inlineData;
65
+ const result = processImageData({
66
+ mimeType: inlineData.mimeType,
67
+ data: inlineData.data,
68
+ });
69
+ if (result) {
70
+ return { text: result };
71
+ }
72
+ }
73
+ if (p.thought === true || p.type === 'thinking') {
74
+ const fullText = typeof p.text === "string" ? p.text : typeof p.thinking === "string" ? p.thinking : "";
75
+ if (displayedThinkingHashes) {
76
+ const hash = hashString(fullText);
77
+ if (displayedThinkingHashes.has(hash)) {
78
+ sentBuffer.set(index, fullText);
79
+ return [];
80
+ }
81
+ displayedThinkingHashes.add(hash);
82
+ }
83
+ const sentText = sentBuffer.get(index) ?? '';
84
+ if (fullText.startsWith(sentText)) {
85
+ const delta = fullText.slice(sentText.length);
86
+ sentBuffer.set(index, fullText);
87
+ if (delta) {
88
+ // Clean object — NO spread to prevent thinking: <object> leaking
89
+ return { thought: true, text: delta };
90
+ }
91
+ return [];
92
+ }
93
+ sentBuffer.set(index, fullText);
94
+ return part;
95
+ }
96
+ return [part];
97
+ });
98
+ return {
99
+ ...cand,
100
+ content: { ...content, parts: newParts },
101
+ };
102
+ });
103
+ return { ...resp, candidates: newCandidates };
104
+ }
105
+ if (Array.isArray(resp.content)) {
106
+ let thinkingIndex = 0;
107
+ const newContent = resp.content.flatMap((block) => {
108
+ const b = block;
109
+ if (b?.type === 'thinking') {
110
+ const fullText = typeof b.thinking === "string" ? b.thinking : typeof b.text === "string" ? b.text : "";
111
+ if (displayedThinkingHashes) {
112
+ const hash = hashString(fullText);
113
+ if (displayedThinkingHashes.has(hash)) {
114
+ sentBuffer.set(thinkingIndex, fullText);
115
+ thinkingIndex++;
116
+ return [];
117
+ }
118
+ displayedThinkingHashes.add(hash);
119
+ }
120
+ const sentText = sentBuffer.get(thinkingIndex) ?? '';
121
+ if (fullText.startsWith(sentText)) {
122
+ const delta = fullText.slice(sentText.length);
123
+ sentBuffer.set(thinkingIndex, fullText);
124
+ thinkingIndex++;
125
+ if (delta) {
126
+ // Clean object — NO spread to prevent thinking: <object> leaking
127
+ return { type: b.type, thinking: delta, text: delta };
128
+ }
129
+ return [];
130
+ }
131
+ sentBuffer.set(thinkingIndex, fullText);
132
+ thinkingIndex++;
133
+ return block;
134
+ }
135
+ return [block];
136
+ });
137
+ return { ...resp, content: newContent };
138
+ }
139
+ return response;
140
+ }
141
+ function extractUsageMetadataFromDataLine(line) {
142
+ if (!line.startsWith("data:"))
143
+ return undefined;
144
+ const json = line.slice(5).trim();
145
+ if (!json || json === "[DONE]")
146
+ return undefined;
147
+ try {
148
+ const parsed = JSON.parse(json);
149
+ const response = parsed && typeof parsed === "object" && "response" in parsed
150
+ ? parsed.response
151
+ : parsed;
152
+ if (!response || typeof response !== "object")
153
+ return undefined;
154
+ const usage = response.usageMetadata;
155
+ return usage && typeof usage === "object" ? usage : undefined;
156
+ }
157
+ catch {
158
+ return undefined;
159
+ }
160
+ }
161
+ function usageMetadataHasCacheRead(usageMetadata) {
162
+ return typeof usageMetadata?.cachedContentTokenCount === "number";
163
+ }
164
+ function completeSseEventSuffix(suffix) {
165
+ if (suffix.includes("\n\n"))
166
+ return suffix;
167
+ if (suffix.endsWith("\n"))
168
+ return suffix + "\n";
169
+ return suffix + "\n\n";
170
+ }
171
+ function mergeUsageMetadataIntoDataLine(line, usageMetadata) {
172
+ if (!usageMetadata || !line.startsWith("data:"))
173
+ return line;
174
+ const json = line.slice(5).trim();
175
+ if (!json || json === "[DONE]")
176
+ return line;
177
+ try {
178
+ const parsed = JSON.parse(json);
179
+ const hasResponseWrapper = !!parsed && typeof parsed === "object" && "response" in parsed;
180
+ const response = hasResponseWrapper
181
+ ? parsed.response
182
+ : parsed;
183
+ if (!response || typeof response !== "object")
184
+ return line;
185
+ const mutableResponse = response;
186
+ const existing = mutableResponse.usageMetadata && typeof mutableResponse.usageMetadata === "object"
187
+ ? mutableResponse.usageMetadata
188
+ : {};
189
+ mutableResponse.usageMetadata = { ...existing, ...usageMetadata };
190
+ return `data: ${JSON.stringify(parsed)}`;
191
+ }
192
+ catch {
193
+ return line;
194
+ }
195
+ }
196
+ function responseHasToolCall(response) {
197
+ if (!response || typeof response !== "object")
198
+ return false;
199
+ const resp = response;
200
+ if (Array.isArray(resp.candidates)) {
201
+ return resp.candidates.some((candidate) => {
202
+ const cand = candidate;
203
+ const content = cand?.content;
204
+ const parts = content?.parts;
205
+ return Array.isArray(parts) && parts.some((part) => {
206
+ const p = part;
207
+ return Boolean(p?.functionCall) || p?.type === "tool_use";
208
+ });
209
+ });
210
+ }
211
+ if (Array.isArray(resp.content)) {
212
+ return resp.content.some((block) => {
213
+ const b = block;
214
+ return Boolean(b?.functionCall) || b?.type === "tool_use";
215
+ });
216
+ }
217
+ return false;
218
+ }
219
+ function responseHasFinishReason(response) {
220
+ if (!response || typeof response !== "object")
221
+ return false;
222
+ const resp = response;
223
+ if (Array.isArray(resp.candidates)) {
224
+ return resp.candidates.some((candidate) => {
225
+ const cand = candidate;
226
+ return typeof cand?.finishReason === "string" && cand.finishReason.length > 0;
227
+ });
228
+ }
229
+ const stopReason = resp.stopReason ?? resp.stop_reason;
230
+ return typeof stopReason === "string" && stopReason.length > 0;
231
+ }
232
+ function transformSseLineWithMetadata(line, signatureStore, thoughtBuffer, sentThinkingBuffer, callbacks, options, debugState, usageState) {
233
+ if (!line.startsWith('data:')) {
234
+ return { line, hasToolCall: false, hasFinishReason: false };
235
+ }
236
+ const json = line.slice(5).trim();
237
+ if (!json) {
238
+ return { line, hasToolCall: false, hasFinishReason: false };
239
+ }
240
+ try {
241
+ const parsed = JSON.parse(json);
242
+ if (parsed.response !== undefined) {
243
+ const hasToolCall = responseHasToolCall(parsed.response);
244
+ const hasFinishReason = responseHasFinishReason(parsed.response);
245
+ if (options.cacheSignatures && options.signatureSessionKey) {
246
+ cacheThinkingSignaturesFromResponse(parsed.response, options.signatureSessionKey, signatureStore, thoughtBuffer, callbacks.onCacheSignature);
247
+ }
248
+ // Extract usage metadata from streaming chunks
249
+ if (usageState) {
250
+ const resp = parsed.response;
251
+ const meta = resp.usageMetadata;
252
+ if (meta && typeof meta === "object") {
253
+ usageState.lastUsage = {
254
+ cachedContentTokenCount: typeof meta.cachedContentTokenCount === "number" ? meta.cachedContentTokenCount : 0,
255
+ promptTokenCount: typeof meta.promptTokenCount === "number" ? meta.promptTokenCount : 0,
256
+ candidatesTokenCount: typeof meta.candidatesTokenCount === "number" ? meta.candidatesTokenCount : 0,
257
+ totalTokenCount: typeof meta.totalTokenCount === "number" ? meta.totalTokenCount : 0,
258
+ };
259
+ }
260
+ }
261
+ let response = deduplicateThinkingText(parsed.response, sentThinkingBuffer, options.displayedThinkingHashes);
262
+ if (options.debugText && callbacks.onInjectDebug && !debugState.injected) {
263
+ response = callbacks.onInjectDebug(response, options.debugText);
264
+ debugState.injected = true;
265
+ }
266
+ // Note: onInjectSyntheticThinking removed - keep_thinking now uses debugText path
267
+ const transformed = callbacks.transformThinkingParts
268
+ ? callbacks.transformThinkingParts(response)
269
+ : response;
270
+ return { line: `data: ${JSON.stringify(transformed)}`, hasToolCall, hasFinishReason };
271
+ }
272
+ }
273
+ catch (_) {
274
+ console.warn("[antigravity] Malformed SSE chunk in streaming transform, passing through untransformed:", json.slice(0, 200));
275
+ }
276
+ return { line, hasToolCall: false, hasFinishReason: false };
277
+ }
278
+ export function transformSseLine(line, signatureStore, thoughtBuffer, sentThinkingBuffer, callbacks, options, debugState, usageState) {
279
+ return transformSseLineWithMetadata(line, signatureStore, thoughtBuffer, sentThinkingBuffer, callbacks, options, debugState, usageState).line;
280
+ }
281
+ export function cacheThinkingSignaturesFromResponse(response, signatureSessionKey, signatureStore, thoughtBuffer, onCacheSignature) {
282
+ if (!response || typeof response !== 'object')
283
+ return;
284
+ const resp = response;
285
+ if (Array.isArray(resp.candidates)) {
286
+ resp.candidates.forEach((candidate, index) => {
287
+ const cand = candidate;
288
+ if (!cand?.content)
289
+ return;
290
+ const content = cand.content;
291
+ if (!Array.isArray(content.parts))
292
+ return;
293
+ content.parts.forEach((part) => {
294
+ const p = part;
295
+ if (p.thought === true || p.type === 'thinking') {
296
+ const text = typeof p.text === "string" ? p.text : typeof p.thinking === "string" ? p.thinking : "";
297
+ if (text) {
298
+ const current = thoughtBuffer.get(index) ?? '';
299
+ thoughtBuffer.set(index, current + text);
300
+ }
301
+ }
302
+ if (p.thoughtSignature) {
303
+ const fullText = thoughtBuffer.get(index) ?? '';
304
+ if (fullText) {
305
+ const signature = p.thoughtSignature;
306
+ onCacheSignature?.(signatureSessionKey, fullText, signature);
307
+ signatureStore.set(signatureSessionKey, { text: fullText, signature });
308
+ }
309
+ }
310
+ });
311
+ });
312
+ }
313
+ if (Array.isArray(resp.content)) {
314
+ // Use thoughtBuffer to accumulate thinking text across SSE events
315
+ // Claude streams thinking content and signature in separate events
316
+ const CLAUDE_BUFFER_KEY = 0; // Use index 0 for Claude's single-stream content
317
+ resp.content.forEach((block) => {
318
+ const b = block;
319
+ if (b?.type === 'thinking') {
320
+ const text = typeof b.thinking === "string" ? b.thinking : typeof b.text === "string" ? b.text : "";
321
+ if (text) {
322
+ const current = thoughtBuffer.get(CLAUDE_BUFFER_KEY) ?? '';
323
+ thoughtBuffer.set(CLAUDE_BUFFER_KEY, current + text);
324
+ }
325
+ }
326
+ if (b?.signature) {
327
+ const fullText = thoughtBuffer.get(CLAUDE_BUFFER_KEY) ?? '';
328
+ if (fullText) {
329
+ const signature = b.signature;
330
+ onCacheSignature?.(signatureSessionKey, fullText, signature);
331
+ signatureStore.set(signatureSessionKey, { text: fullText, signature });
332
+ }
333
+ }
334
+ });
335
+ }
336
+ }
337
+ export function createStreamingTransformer(signatureStore, callbacks, options = {}) {
338
+ const decoder = new TextDecoder();
339
+ const encoder = new TextEncoder();
340
+ let buffer = '';
341
+ const thoughtBuffer = createThoughtBuffer();
342
+ const sentThinkingBuffer = createThoughtBuffer();
343
+ const debugState = { injected: false };
344
+ let hasSeenUsageMetadata = false;
345
+ let terminatedAfterFinishReason = false;
346
+ const pendingUsageLines = [];
347
+ const usageState = { lastUsage: null };
348
+ const emitSyntheticUsageIfMissing = (controller) => {
349
+ if (hasSeenUsageMetadata)
350
+ return;
351
+ const syntheticUsage = {
352
+ response: {
353
+ usageMetadata: {
354
+ promptTokenCount: 0,
355
+ candidatesTokenCount: 0,
356
+ totalTokenCount: 0,
357
+ }
358
+ }
359
+ };
360
+ controller.enqueue(encoder.encode(`\ndata: ${JSON.stringify(syntheticUsage)}\n\n`));
361
+ hasSeenUsageMetadata = true;
362
+ };
363
+ const emitUsageCallback = () => {
364
+ if (usageState.lastUsage && callbacks.onUsageMetadata) {
365
+ callbacks.onUsageMetadata(usageState.lastUsage);
366
+ }
367
+ };
368
+ const emitPendingUsageLines = (controller, finalUsage) => {
369
+ while (pendingUsageLines.length > 0) {
370
+ const pending = pendingUsageLines.shift();
371
+ if (!pending)
372
+ continue;
373
+ const line = mergeUsageMetadataIntoDataLine(pending.line, finalUsage);
374
+ controller.enqueue(encoder.encode(line + pending.suffix));
375
+ }
376
+ };
377
+ const processLine = (line, controller, suffix) => {
378
+ if (pendingUsageLines.length > 0 && line.trim() === "") {
379
+ const lastPending = pendingUsageLines[pendingUsageLines.length - 1];
380
+ if (lastPending)
381
+ lastPending.suffix += suffix;
382
+ return false;
383
+ }
384
+ if (line.includes('usageMetadata')) {
385
+ hasSeenUsageMetadata = true;
386
+ }
387
+ const result = transformSseLineWithMetadata(line, signatureStore, thoughtBuffer, sentThinkingBuffer, callbacks, options, debugState, usageState);
388
+ if (!result.hasFinishReason && pendingUsageLines.length > 0) {
389
+ emitPendingUsageLines(controller);
390
+ }
391
+ const lineUsage = extractUsageMetadataFromDataLine(result.line);
392
+ if (!result.hasFinishReason && lineUsage && !usageMetadataHasCacheRead(lineUsage)) {
393
+ // Gemini often reports partial usage on the content/functionCall event,
394
+ // then reports cachedContentTokenCount only on the terminal STOP event.
395
+ // Some OpenCode/AI SDK paths attach step usage from the latest content
396
+ // event they saw before halt, so keep a one-line delay and merge the
397
+ // terminal cache usage when it arrives.
398
+ pendingUsageLines.push({ line: result.line, suffix });
399
+ return false;
400
+ }
401
+ if (result.hasFinishReason) {
402
+ const finalUsage = lineUsage;
403
+ emitPendingUsageLines(controller, finalUsage);
404
+ controller.enqueue(encoder.encode(result.line + completeSseEventSuffix(suffix)));
405
+ // Antigravity can leave the HTTP response open after a terminal candidate event.
406
+ // Forward a complete SSE frame before closing; downstream parsers only dispatch
407
+ // the terminal STOP event after the blank event separator is seen.
408
+ // OpenCode only records step-finish and exits/continues after the provider stream closes,
409
+ // so terminate once the finished event has been forwarded.
410
+ emitSyntheticUsageIfMissing(controller);
411
+ emitUsageCallback();
412
+ terminatedAfterFinishReason = true;
413
+ controller.terminate();
414
+ return true;
415
+ }
416
+ emitPendingUsageLines(controller);
417
+ controller.enqueue(encoder.encode(result.line + suffix));
418
+ return false;
419
+ };
420
+ return new TransformStream({
421
+ transform(chunk, controller) {
422
+ if (terminatedAfterFinishReason)
423
+ return;
424
+ buffer += decoder.decode(chunk, { stream: true });
425
+ const lines = buffer.split('\n');
426
+ buffer = lines.pop() || '';
427
+ for (const line of lines) {
428
+ if (processLine(line, controller, '\n')) {
429
+ return;
430
+ }
431
+ }
432
+ },
433
+ flush(controller) {
434
+ if (terminatedAfterFinishReason)
435
+ return;
436
+ buffer += decoder.decode();
437
+ if (buffer && processLine(buffer, controller, '')) {
438
+ return;
439
+ }
440
+ emitPendingUsageLines(controller);
441
+ // Inject synthetic usage metadata if missing (fixes "Context % used: 0%" issue)
442
+ emitSyntheticUsageIfMissing(controller);
443
+ emitUsageCallback();
444
+ },
445
+ });
446
+ }
447
+ //# sourceMappingURL=transformer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transformer.js","sourceRoot":"","sources":["../../../../../src/plugin/core/streaming/transformer.ts"],"names":[],"mappings":"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"}