@100xprompt/brain 0.0.0-stage → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (260) hide show
  1. package/LICENSE +48 -0
  2. package/README.md +235 -2
  3. package/package.json +48 -4
  4. package/src/adapters/aider/index.ts +8 -0
  5. package/src/adapters/aider/reader.ts +129 -0
  6. package/src/adapters/aider/records.ts +220 -0
  7. package/src/adapters/aider/writer.ts +269 -0
  8. package/src/adapters/amazon-q-cli/index.ts +8 -0
  9. package/src/adapters/amazon-q-cli/reader.ts +84 -0
  10. package/src/adapters/amazon-q-cli/records.ts +191 -0
  11. package/src/adapters/amazon-q-cli/writer.ts +370 -0
  12. package/src/adapters/amazon-q-ide/index.ts +9 -0
  13. package/src/adapters/amazon-q-ide/reader.ts +131 -0
  14. package/src/adapters/amazon-q-ide/records.ts +141 -0
  15. package/src/adapters/amazon-q-ide/writer.ts +325 -0
  16. package/src/adapters/antigravity/index.ts +9 -0
  17. package/src/adapters/antigravity/proto.ts +194 -0
  18. package/src/adapters/antigravity/reader.ts +424 -0
  19. package/src/adapters/antigravity/records.ts +236 -0
  20. package/src/adapters/antigravity/writer.ts +463 -0
  21. package/src/adapters/auggie/index.ts +36 -0
  22. package/src/adapters/claude-code/index.ts +8 -0
  23. package/src/adapters/claude-code/reader.ts +639 -0
  24. package/src/adapters/claude-code/records.ts +88 -0
  25. package/src/adapters/claude-code/writer.ts +329 -0
  26. package/src/adapters/cline/index.ts +12 -0
  27. package/src/adapters/cline/reader.ts +432 -0
  28. package/src/adapters/cline/records.ts +151 -0
  29. package/src/adapters/cline/vscdb.ts +56 -0
  30. package/src/adapters/cline/writer.ts +656 -0
  31. package/src/adapters/cline/xml.ts +177 -0
  32. package/src/adapters/cline4/index.ts +9 -0
  33. package/src/adapters/cline4/reader.ts +179 -0
  34. package/src/adapters/cline4/records.ts +92 -0
  35. package/src/adapters/cline4/writer.ts +361 -0
  36. package/src/adapters/codebuff/index.ts +8 -0
  37. package/src/adapters/codebuff/project.ts +207 -0
  38. package/src/adapters/codebuff/reader.ts +215 -0
  39. package/src/adapters/codebuff/records.ts +173 -0
  40. package/src/adapters/codebuff/writer.ts +383 -0
  41. package/src/adapters/codex/index.ts +8 -0
  42. package/src/adapters/codex/native.ts +239 -0
  43. package/src/adapters/codex/reader.ts +747 -0
  44. package/src/adapters/codex/records.ts +114 -0
  45. package/src/adapters/codex/writer.ts +479 -0
  46. package/src/adapters/continue/index.ts +9 -0
  47. package/src/adapters/continue/reader.ts +68 -0
  48. package/src/adapters/continue/records.ts +418 -0
  49. package/src/adapters/continue/writer.ts +162 -0
  50. package/src/adapters/copilot-cli/index.ts +9 -0
  51. package/src/adapters/copilot-cli/reader.ts +186 -0
  52. package/src/adapters/copilot-cli/records.ts +241 -0
  53. package/src/adapters/copilot-cli/writer.ts +353 -0
  54. package/src/adapters/crush/index.ts +8 -0
  55. package/src/adapters/crush/reader.ts +180 -0
  56. package/src/adapters/crush/records.ts +169 -0
  57. package/src/adapters/crush/writer.ts +333 -0
  58. package/src/adapters/cursor-cli/index.ts +405 -0
  59. package/src/adapters/cursor-ide/agentkv.ts +95 -0
  60. package/src/adapters/cursor-ide/index.ts +501 -0
  61. package/src/adapters/cursor-ide/transcripts.ts +122 -0
  62. package/src/adapters/cursor-ide/workspaces.ts +119 -0
  63. package/src/adapters/cursor-ide/writer.ts +170 -0
  64. package/src/adapters/devin/index.ts +8 -0
  65. package/src/adapters/devin/reader.ts +305 -0
  66. package/src/adapters/devin/records.ts +277 -0
  67. package/src/adapters/devin/writer.ts +523 -0
  68. package/src/adapters/factory-droid/index.ts +12 -0
  69. package/src/adapters/factory-droid/reader.ts +184 -0
  70. package/src/adapters/factory-droid/records.ts +79 -0
  71. package/src/adapters/factory-droid/writer.ts +350 -0
  72. package/src/adapters/gemini-cli/exchanges.ts +228 -0
  73. package/src/adapters/gemini-cli/index.ts +396 -0
  74. package/src/adapters/gemini-cli/records.ts +521 -0
  75. package/src/adapters/gemini-cli/writer.ts +354 -0
  76. package/src/adapters/goose/index.ts +8 -0
  77. package/src/adapters/goose/reader.ts +138 -0
  78. package/src/adapters/goose/records.ts +199 -0
  79. package/src/adapters/goose/writer.ts +340 -0
  80. package/src/adapters/grok-cli/image.ts +44 -0
  81. package/src/adapters/grok-cli/index.ts +8 -0
  82. package/src/adapters/grok-cli/reader.ts +302 -0
  83. package/src/adapters/grok-cli/records.ts +172 -0
  84. package/src/adapters/grok-cli/writer.ts +329 -0
  85. package/src/adapters/hermes/index.ts +8 -0
  86. package/src/adapters/hermes/reader.ts +249 -0
  87. package/src/adapters/hermes/records.ts +285 -0
  88. package/src/adapters/hermes/writer.ts +452 -0
  89. package/src/adapters/iflow-cli/index.ts +72 -0
  90. package/src/adapters/iflow-cli/records.ts +215 -0
  91. package/src/adapters/iflow-cli/writer.ts +204 -0
  92. package/src/adapters/index.ts +112 -0
  93. package/src/adapters/kilo-cli/index.ts +21 -0
  94. package/src/adapters/kilo-code/index.ts +11 -0
  95. package/src/adapters/kilo-code/writer.ts +92 -0
  96. package/src/adapters/kimi/index.ts +9 -0
  97. package/src/adapters/kimi/reader.ts +92 -0
  98. package/src/adapters/kimi/records.ts +221 -0
  99. package/src/adapters/kimi/writer.ts +367 -0
  100. package/src/adapters/kiro-cli/index.ts +8 -0
  101. package/src/adapters/kiro-cli/reader.ts +87 -0
  102. package/src/adapters/kiro-cli/records.ts +260 -0
  103. package/src/adapters/kiro-cli/writer.ts +305 -0
  104. package/src/adapters/kiro-ide/index.ts +8 -0
  105. package/src/adapters/kiro-ide/writer.ts +52 -0
  106. package/src/adapters/letta/index.ts +8 -0
  107. package/src/adapters/letta/reader.ts +177 -0
  108. package/src/adapters/letta/records.ts +119 -0
  109. package/src/adapters/letta/writer.ts +413 -0
  110. package/src/adapters/mastracode/index.ts +8 -0
  111. package/src/adapters/mastracode/reader.ts +323 -0
  112. package/src/adapters/mastracode/records.ts +336 -0
  113. package/src/adapters/mastracode/writer.ts +385 -0
  114. package/src/adapters/mistral-vibe/index.ts +9 -0
  115. package/src/adapters/mistral-vibe/reader.ts +62 -0
  116. package/src/adapters/mistral-vibe/records.ts +104 -0
  117. package/src/adapters/mistral-vibe/writer.ts +359 -0
  118. package/src/adapters/muse/index.ts +10 -0
  119. package/src/adapters/muse/reader.ts +332 -0
  120. package/src/adapters/muse/records.ts +104 -0
  121. package/src/adapters/muse/writer.ts +387 -0
  122. package/src/adapters/omp/index.ts +13 -0
  123. package/src/adapters/omp/reader.ts +314 -0
  124. package/src/adapters/omp/records.ts +153 -0
  125. package/src/adapters/omp/writer.ts +216 -0
  126. package/src/adapters/opencode/ids.ts +52 -0
  127. package/src/adapters/opencode/index.ts +31 -0
  128. package/src/adapters/opencode/note.ts +8 -0
  129. package/src/adapters/opencode/reader.ts +452 -0
  130. package/src/adapters/opencode/tools.ts +174 -0
  131. package/src/adapters/opencode/v2.ts +367 -0
  132. package/src/adapters/opencode/writer.ts +379 -0
  133. package/src/adapters/openhands/index.ts +8 -0
  134. package/src/adapters/openhands/reader.ts +222 -0
  135. package/src/adapters/openhands/records.ts +136 -0
  136. package/src/adapters/openhands/writer.ts +404 -0
  137. package/src/adapters/pearai/index.ts +10 -0
  138. package/src/adapters/pi/index.ts +28 -0
  139. package/src/adapters/pi/reader.ts +261 -0
  140. package/src/adapters/pi/records.ts +99 -0
  141. package/src/adapters/pi/writer.ts +362 -0
  142. package/src/adapters/qoder-cli/index.ts +8 -0
  143. package/src/adapters/qoder-cli/reader.ts +83 -0
  144. package/src/adapters/qoder-cli/records.ts +45 -0
  145. package/src/adapters/qoder-cli/writer.ts +72 -0
  146. package/src/adapters/qwen-code/index.ts +84 -0
  147. package/src/adapters/qwen-code/records.ts +194 -0
  148. package/src/adapters/qwen-code/writer.ts +224 -0
  149. package/src/adapters/tabnine-cli/index.ts +8 -0
  150. package/src/adapters/tabnine-cli/reader.ts +106 -0
  151. package/src/adapters/tabnine-cli/records.ts +33 -0
  152. package/src/adapters/tabnine-cli/writer.ts +156 -0
  153. package/src/adapters/types.ts +73 -0
  154. package/src/adapters/void/index.ts +9 -0
  155. package/src/adapters/void/reader.ts +48 -0
  156. package/src/adapters/void/records.ts +285 -0
  157. package/src/adapters/void/writer.ts +93 -0
  158. package/src/adapters/vscode-copilot/index.ts +9 -0
  159. package/src/adapters/vscode-copilot/reader.ts +212 -0
  160. package/src/adapters/vscode-copilot/records.ts +388 -0
  161. package/src/adapters/vscode-copilot/shared.ts +68 -0
  162. package/src/adapters/vscode-copilot/writer.ts +546 -0
  163. package/src/adapters/zed/index.ts +8 -0
  164. package/src/adapters/zed/reader.ts +198 -0
  165. package/src/adapters/zed/records.ts +87 -0
  166. package/src/adapters/zed/writer.ts +341 -0
  167. package/src/brief-writers.ts +71 -0
  168. package/src/brief.ts +238 -0
  169. package/src/cli.ts +351 -0
  170. package/src/dashboard/cli.ts +148 -0
  171. package/src/dashboard/conversions.ts +170 -0
  172. package/src/dashboard/report.ts +261 -0
  173. package/src/dashboard/send.ts +213 -0
  174. package/src/dashboard/state.ts +95 -0
  175. package/src/fsutil.ts +133 -0
  176. package/src/gateway/common.ts +232 -0
  177. package/src/gateway/connect.ts +847 -0
  178. package/src/gateway/connectors/aider.ts +356 -0
  179. package/src/gateway/connectors/amazon-q-cli.ts +6 -0
  180. package/src/gateway/connectors/amazon-q-ide.ts +6 -0
  181. package/src/gateway/connectors/antigravity.ts +6 -0
  182. package/src/gateway/connectors/auggie.ts +6 -0
  183. package/src/gateway/connectors/cline-sdk.ts +85 -0
  184. package/src/gateway/connectors/cline.ts +34 -0
  185. package/src/gateway/connectors/codebuff.ts +6 -0
  186. package/src/gateway/connectors/continue.ts +579 -0
  187. package/src/gateway/connectors/copilot-cli.ts +138 -0
  188. package/src/gateway/connectors/crush.ts +313 -0
  189. package/src/gateway/connectors/cursor-cli.ts +6 -0
  190. package/src/gateway/connectors/cursor.ts +6 -0
  191. package/src/gateway/connectors/devin.ts +6 -0
  192. package/src/gateway/connectors/factory-droid.ts +308 -0
  193. package/src/gateway/connectors/goose.ts +79 -0
  194. package/src/gateway/connectors/grok-cli.ts +82 -0
  195. package/src/gateway/connectors/hermes.ts +230 -0
  196. package/src/gateway/connectors/iflow-cli.ts +50 -0
  197. package/src/gateway/connectors/index.ts +86 -0
  198. package/src/gateway/connectors/kilo-cli.ts +434 -0
  199. package/src/gateway/connectors/kilo-code.ts +32 -0
  200. package/src/gateway/connectors/kimi-code.ts +241 -0
  201. package/src/gateway/connectors/kiro-cli.ts +6 -0
  202. package/src/gateway/connectors/kiro-ide.ts +6 -0
  203. package/src/gateway/connectors/letta-code.ts +170 -0
  204. package/src/gateway/connectors/mastracode.ts +91 -0
  205. package/src/gateway/connectors/mistral-vibe.ts +495 -0
  206. package/src/gateway/connectors/muse.ts +27 -0
  207. package/src/gateway/connectors/omp.ts +279 -0
  208. package/src/gateway/connectors/openhands.ts +296 -0
  209. package/src/gateway/connectors/pearai.ts +52 -0
  210. package/src/gateway/connectors/pi.ts +357 -0
  211. package/src/gateway/connectors/qoder-cli.ts +6 -0
  212. package/src/gateway/connectors/qwen-code.ts +411 -0
  213. package/src/gateway/connectors/roo.ts +43 -0
  214. package/src/gateway/connectors/tabnine-cli.ts +6 -0
  215. package/src/gateway/connectors/void.ts +6 -0
  216. package/src/gateway/connectors/vscode-copilot.ts +286 -0
  217. package/src/gateway/connectors/windsurf.ts +6 -0
  218. package/src/gateway/connectors/zed.ts +29 -0
  219. package/src/gateway/signin.ts +323 -0
  220. package/src/handoff.ts +104 -0
  221. package/src/hooks.ts +455 -0
  222. package/src/memory/audit.ts +514 -0
  223. package/src/memory/blobs.ts +94 -0
  224. package/src/memory/cli.ts +117 -0
  225. package/src/memory/distill.ts +381 -0
  226. package/src/memory/externalize.ts +435 -0
  227. package/src/memory/lookups.ts +70 -0
  228. package/src/memory/mcp-install.ts +401 -0
  229. package/src/memory/mcp-server.ts +296 -0
  230. package/src/memory/prepare.ts +179 -0
  231. package/src/memory/preview.ts +154 -0
  232. package/src/memory/project.ts +35 -0
  233. package/src/memory/redact.ts +72 -0
  234. package/src/memory/relevance.ts +187 -0
  235. package/src/memory/repomap.ts +516 -0
  236. package/src/memory/store.ts +270 -0
  237. package/src/memory/sync.ts +166 -0
  238. package/src/memory/tidy.ts +193 -0
  239. package/src/memory/types.ts +118 -0
  240. package/src/org/admin-ops.ts +96 -0
  241. package/src/org/auth.ts +112 -0
  242. package/src/org/backup.ts +115 -0
  243. package/src/org/cli.ts +438 -0
  244. package/src/org/client.ts +404 -0
  245. package/src/org/config.ts +44 -0
  246. package/src/org/crypto.ts +537 -0
  247. package/src/org/db.ts +435 -0
  248. package/src/org/graph.ts +318 -0
  249. package/src/org/oidc.ts +435 -0
  250. package/src/org/policy.ts +398 -0
  251. package/src/org/server.ts +920 -0
  252. package/src/org/sso.ts +316 -0
  253. package/src/org/tls.ts +66 -0
  254. package/src/org/types.ts +193 -0
  255. package/src/self.ts +68 -0
  256. package/src/session/attachments.ts +53 -0
  257. package/src/session/peekcache.ts +50 -0
  258. package/src/session/types.ts +104 -0
  259. package/src/session/util.ts +130 -0
  260. package/src/sqlite.ts +48 -0
@@ -0,0 +1,236 @@
1
+ import { join } from "node:path"
2
+ import type { ToolKind } from "../../session/types.ts"
3
+ import { toolKindOf } from "../../session/util.ts"
4
+ import { allBytes, asText, concat, decode, messageField, numberOf, textField, textOf, varintField, type Field } from "./proto.ts"
5
+
6
+ // Antigravity (Google): where its conversations are and what their rows look like. Ported from the clean-room
7
+ // format notes and reference adapter of session-migrate (MIT, xhluca: docs/antigravity-format.md,
8
+ // src/session_migrate/formats/antigravity.py), which pin Antigravity CLI 1.1.16, and checked against the real
9
+ // 1.1.16 capture in test/fixtures/native-corpus/antigravity.
10
+ //
11
+ // Every conversation is its own SQLite database, ~/.gemini/<store>/conversations/<uuid>.db, with seven tables:
12
+ // trajectory_meta (the conversation's trajectory: type 4 cascade, source 17 for the CLI), steps (one row per
13
+ // step, idx 0..n-1, each with its type and status both as columns and inside the serialised Step protobuf),
14
+ // trajectory_metadata_blob (one "main" row), and four runtime tables. Beside the folder,
15
+ // conversation_summaries.db is the picker's index: title, preview, workspace, times. The CLI keeps its store in
16
+ // antigravity-cli; the IDE uses antigravity and antigravity-ide, the same layout, a wider summaries table, and
17
+ // encrypted <uuid>.pb files that nothing here reads.
18
+ //
19
+ // A Step carries its type in field 1, its status in field 4 (3 done, 7 error), its metadata (times, the tool
20
+ // call a result answers) in field 5, and its body in a field that depends on the type (PAYLOAD_FIELD). A user
21
+ // input keeps the person's text in field 2; a planner response keeps the reply in field 1, a message id in
22
+ // field 6 and its tool calls (id 1, name 2, JSON arguments 3) in repeated field 7, and private thinking in
23
+ // fields 3, 4, 14 and 16; a generic tool step keeps the arguments as {key, JSON value} entries in repeated field
24
+ // 1 and the result in field 2 (text in its field 1, {key, value} metadata in its repeated field 2).
25
+
26
+ export const TOOL = "antigravity"
27
+ export const LABEL = "Antigravity"
28
+ /** Antigravity CLI versions whose store the writer was checked against (by session-migrate's live checks). */
29
+ export const TESTED_VERSIONS = ["1.1.16"]
30
+
31
+ /** The CLI's store, then the IDE's two. */
32
+ export const STORES = ["antigravity-cli", "antigravity", "antigravity-ide"] as const
33
+ export type Store = (typeof STORES)[number]
34
+ export const CLI_STORE: Store = "antigravity-cli"
35
+
36
+ export const storeDir = (home: string, store: Store) => join(home, ".gemini", store)
37
+ export const conversationsDir = (home: string, store: Store) => join(storeDir(home, store), "conversations")
38
+ export const summariesPath = (home: string, store: Store) => join(storeDir(home, store), "conversation_summaries.db")
39
+
40
+ /** A conversation database's file name: its UUID and .db. */
41
+ export const CONVERSATION_FILE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\.db$/i
42
+
43
+ export const STEP = {
44
+ viewFile: 8,
45
+ listDirectory: 9,
46
+ userInput: 14,
47
+ plannerResponse: 15,
48
+ runCommand: 21,
49
+ checkpoint: 23,
50
+ mcpTool: 38,
51
+ fileChange: 86,
52
+ conversationHistory: 98,
53
+ shellExec: 112,
54
+ writeBlob: 128,
55
+ generic: 132,
56
+ } as const
57
+
58
+ /** The Step field holding each type's body, as observed in 1.1.16. */
59
+ export const PAYLOAD_FIELD: Record<number, number> = { 8: 14, 9: 15, 14: 19, 15: 20, 21: 28, 23: 30, 38: 47, 86: 98, 98: 111, 112: 127, 128: 142, 132: 140 }
60
+
61
+ export const STATUS = { done: 3, error: 7 } as const
62
+ export const TRAJECTORY = { cascade: 4, cli: 17 } as const
63
+ /** The project the CLI files conversations under when it has no other. */
64
+ export const PROJECT_ID = "default-cli-project"
65
+ /** The generic result's metadata key linking it to its call (session-migrate's, kept for interoperability). */
66
+ export const LINK_KEY = "session_migrate_call_id"
67
+
68
+ /** Bounds on what a reader accepts from a store. */
69
+ export const MAX_DB_BYTES = 256 * 1024 * 1024
70
+ export const MAX_STEPS = 100_000
71
+
72
+ /** The conversation database as the 1.1.16 CLI creates it (from the capture's sqlite_master). */
73
+ export const SCHEMA = `
74
+ CREATE TABLE \`trajectory_meta\` (\`trajectory_id\` text,\`cascade_id\` text,\`trajectory_type\` integer,\`source\` integer,PRIMARY KEY (\`trajectory_id\`));
75
+ CREATE TABLE \`steps\` (\`idx\` integer,\`step_type\` integer NOT NULL DEFAULT 0,\`status\` integer NOT NULL DEFAULT 0,\`has_subtrajectory\` numeric NOT NULL DEFAULT false,\`metadata\` blob,\`error_details\` blob,\`permissions\` blob,\`task_details\` blob,\`render_info\` blob,\`step_payload\` blob,\`step_format\` integer NOT NULL DEFAULT 0,PRIMARY KEY (\`idx\`));
76
+ CREATE TABLE \`gen_metadata\` (\`idx\` integer,\`data\` blob,\`size\` integer NOT NULL DEFAULT 0,PRIMARY KEY (\`idx\`));
77
+ CREATE TABLE \`executor_metadata\` (\`idx\` integer,\`data\` blob,PRIMARY KEY (\`idx\`));
78
+ CREATE TABLE \`parent_references\` (\`idx\` integer,\`data\` blob,PRIMARY KEY (\`idx\`));
79
+ CREATE TABLE \`trajectory_metadata_blob\` (\`id\` text DEFAULT "main",\`data\` blob,PRIMARY KEY (\`id\`));
80
+ CREATE TABLE \`battle_mode_infos\` (\`idx\` integer,\`data\` blob,PRIMARY KEY (\`idx\`));
81
+ CREATE INDEX \`idx_steps_status\` ON \`steps\`(\`status\`);
82
+ CREATE INDEX \`idx_steps_step_type\` ON \`steps\`(\`step_type\`);
83
+ `
84
+
85
+ /** The picker index as 1.1.16 creates it. */
86
+ export const SUMMARY_SCHEMA = `
87
+ CREATE TABLE \`conversation_summaries\` (\`conversation_id\` text,\`title\` text NOT NULL DEFAULT "",\`preview\` text NOT NULL DEFAULT "",\`step_count\` integer NOT NULL DEFAULT 0,\`last_modified_time\` datetime NOT NULL,\`workspace_uris\` text NOT NULL,\`status\` text NOT NULL DEFAULT "",\`source\` text NOT NULL DEFAULT "",\`project_id\` text NOT NULL DEFAULT "",\`agent_name\` text NOT NULL DEFAULT "",\`parent_conversation_id\` text NOT NULL DEFAULT "",\`nesting_depth\` integer NOT NULL DEFAULT 0,\`battle_id\` text NOT NULL DEFAULT "",\`winning_conversation_id\` text NOT NULL DEFAULT "",\`not_fully_idle\` numeric NOT NULL DEFAULT false,\`killed\` numeric NOT NULL DEFAULT false,\`last_user_input_time\` datetime NOT NULL,\`last_user_input_step_index\` integer NOT NULL DEFAULT -1,\`app_data_dir\` text NOT NULL DEFAULT "",PRIMARY KEY (\`conversation_id\`));
88
+ CREATE INDEX \`idx_conversation_summaries_last_user_input_time\` ON \`conversation_summaries\`(\`last_user_input_time\`);
89
+ CREATE INDEX \`idx_conversation_summaries_last_modified_time\` ON \`conversation_summaries\`(\`last_modified_time\`);
90
+ `
91
+
92
+ /** The summary columns 1.1.16 has, all of which the writer fills. Newer builds and the IDE add more. */
93
+ export const SUMMARY_COLUMNS = [
94
+ "conversation_id",
95
+ "title",
96
+ "preview",
97
+ "step_count",
98
+ "last_modified_time",
99
+ "workspace_uris",
100
+ "status",
101
+ "source",
102
+ "project_id",
103
+ "agent_name",
104
+ "parent_conversation_id",
105
+ "nesting_depth",
106
+ "battle_id",
107
+ "winning_conversation_id",
108
+ "not_fully_idle",
109
+ "killed",
110
+ "last_user_input_time",
111
+ "last_user_input_step_index",
112
+ "app_data_dir",
113
+ ] as const
114
+
115
+ /** A google.protobuf.Timestamp ({1: seconds, 2: nanos}) as ISO time. */
116
+ export function timestampOf(fields: Field[] | undefined): string | undefined {
117
+ const seconds = fields && numberOf(fields, 1)
118
+ if (!seconds || seconds <= 0) return undefined
119
+ const nanos = numberOf(fields!, 2) ?? 0
120
+ const ms = seconds * 1000 + Math.floor(nanos / 1e6)
121
+ return Number.isFinite(ms) && ms < 8.64e15 ? new Date(ms).toISOString() : undefined
122
+ }
123
+
124
+ /** A summaries datetime ("2026-09-01 00:08:05.04913412+00:00", as Go writes it) as ISO time; Go's zero time is none. */
125
+ export function sqlTime(v: unknown): string | undefined {
126
+ if (typeof v !== "string") return undefined
127
+ const m = /^(\d{4}-\d\d-\d\d)[ T](\d\d:\d\d:\d\d)(?:\.(\d+))?\s*(Z|[+-]\d\d:?\d\d)?$/.exec(v.trim())
128
+ if (!m || m[1]!.startsWith("0001-")) return undefined
129
+ const frac = (m[3] ?? "").slice(0, 3).padEnd(3, "0")
130
+ const t = Date.parse(`${m[1]}T${m[2]}.${frac}${m[4] ?? "Z"}`)
131
+ return Number.isFinite(t) ? new Date(t).toISOString() : undefined
132
+ }
133
+
134
+ /** A time as the summaries table stores it. */
135
+ export const toSqlTime = (d: Date) => `${d.toISOString().slice(0, 10)} ${d.toISOString().slice(11, 23)}+00:00`
136
+
137
+ /** A tool call as a planner response stores it. */
138
+ export interface NativeCall {
139
+ id: string
140
+ name: string
141
+ /** The arguments JSON as stored. */
142
+ args: string
143
+ }
144
+
145
+ export function decodeCall(b: Uint8Array): NativeCall | undefined {
146
+ const f = decode(b)
147
+ const id = textOf(f, 1)
148
+ const name = textOf(f, 2)
149
+ if (!id || !name) return undefined
150
+ return { id, name, args: textOf(f, 3) ?? "" }
151
+ }
152
+
153
+ /** Whether a planner response holds private thinking (visible or raw thinking, a signature, or the thinking flag). */
154
+ export const hasThinking = (planner: Field[]) => [3, 4, 14, 16].some((n) => allBytes(planner, n).length > 0) || numberOf(planner, 5) === 1
155
+
156
+ /** The {key, value} entries of a repeated map field. */
157
+ export function entriesOf(fields: Field[], no: number): Array<[string, string]> {
158
+ const out: Array<[string, string]> = []
159
+ for (const e of allBytes(fields, no)) {
160
+ try {
161
+ const f = decode(e)
162
+ const k = textOf(f, 1)
163
+ if (k !== undefined) out.push([k, textOf(f, 2) ?? ""])
164
+ } catch {
165
+ // An entry that is not a {key, value} message is skipped.
166
+ }
167
+ }
168
+ return out
169
+ }
170
+
171
+ /** What Antigravity's own tools do; other names go through the shared guess. */
172
+ const KINDS: Record<string, ToolKind> = {
173
+ view_file: "read",
174
+ view_file_outline: "read",
175
+ view_code_item: "read",
176
+ list_dir: "list",
177
+ find_by_name: "search",
178
+ grep_search: "search",
179
+ codebase_search: "search",
180
+ run_command: "shell",
181
+ command_status: "shell",
182
+ send_command_input: "shell",
183
+ shell_exec: "shell",
184
+ write_to_file: "write",
185
+ replace_file_content: "edit",
186
+ multi_replace_file_content: "edit",
187
+ read_url_content: "web",
188
+ search_web: "web",
189
+ }
190
+ export const antigravityToolKind = (name: string): ToolKind => KINDS[name] ?? toolKindOf(name)
191
+
192
+ // Encoding the four messages the writer emits.
193
+
194
+ const uuidText = (no: number, id: string) => textField(no, id)
195
+
196
+ /** A whole Step: type, status, and the body in its type's field. */
197
+ export function stepBytes(type: number, status: number, body: Uint8Array): Uint8Array {
198
+ const field = PAYLOAD_FIELD[type]
199
+ if (field === undefined) throw new Error(`no payload field is known for Antigravity step type ${type}`)
200
+ return concat([varintField(1, type), varintField(4, status), messageField(field, [body])])
201
+ }
202
+
203
+ export const userInputBody = (text: string) => textField(2, text)
204
+
205
+ export function plannerBody(o: { text?: string; messageId: string; calls?: NativeCall[] }): Uint8Array {
206
+ return concat([
207
+ ...(o.text ? [textField(1, o.text)] : []),
208
+ uuidText(6, o.messageId),
209
+ ...(o.calls ?? []).map((c) => messageField(7, [textField(1, c.id), textField(2, c.name), textField(3, c.args)])),
210
+ ])
211
+ }
212
+
213
+ export function genericBody(o: { args: Array<[string, string]>; result: string; callId: string }): Uint8Array {
214
+ return concat([
215
+ ...o.args.map(([k, v]) => messageField(1, [textField(1, k), textField(2, v)])),
216
+ messageField(2, [textField(1, o.result), messageField(2, [textField(1, LINK_KEY), textField(2, o.callId)])]),
217
+ ])
218
+ }
219
+
220
+ /** The minimal "main" trajectory metadata: creation time, root conversation id, project. */
221
+ export const trajectoryMetadata = (seconds: number, conversationId: string) =>
222
+ concat([messageField(2, [varintField(1, seconds)]), textField(6, conversationId), textField(18, PROJECT_ID)])
223
+
224
+ /** The first workspace folder in trajectory metadata (field 1's folder URI, else field 7). */
225
+ export function workspaceOf(meta: Field[]): string | undefined {
226
+ for (const w of allBytes(meta, 1)) {
227
+ try {
228
+ const uri = textOf(decode(w), 1)
229
+ if (uri) return uri
230
+ } catch {
231
+ // not a workspace message
232
+ }
233
+ }
234
+ const first = allBytes(meta, 7)[0]
235
+ return first ? asText(first) : undefined
236
+ }