uxnan-bridge 0.0.1-alpha.20260621

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 (255) hide show
  1. package/README.md +150 -0
  2. package/dist/src/account-status.d.ts +13 -0
  3. package/dist/src/account-status.js +78 -0
  4. package/dist/src/account-status.js.map +1 -0
  5. package/dist/src/adapters/base-adapter.d.ts +18 -0
  6. package/dist/src/adapters/base-adapter.js +15 -0
  7. package/dist/src/adapters/base-adapter.js.map +1 -0
  8. package/dist/src/adapters/claude-adapter.d.ts +102 -0
  9. package/dist/src/adapters/claude-adapter.js +486 -0
  10. package/dist/src/adapters/claude-adapter.js.map +1 -0
  11. package/dist/src/adapters/claude-tools.d.ts +25 -0
  12. package/dist/src/adapters/claude-tools.js +146 -0
  13. package/dist/src/adapters/claude-tools.js.map +1 -0
  14. package/dist/src/adapters/codex-adapter.d.ts +116 -0
  15. package/dist/src/adapters/codex-adapter.js +912 -0
  16. package/dist/src/adapters/codex-adapter.js.map +1 -0
  17. package/dist/src/adapters/codex-app-server.d.ts +74 -0
  18. package/dist/src/adapters/codex-app-server.js +225 -0
  19. package/dist/src/adapters/codex-app-server.js.map +1 -0
  20. package/dist/src/adapters/codex-approval.d.ts +88 -0
  21. package/dist/src/adapters/codex-approval.js +160 -0
  22. package/dist/src/adapters/codex-approval.js.map +1 -0
  23. package/dist/src/adapters/codex-tools.d.ts +18 -0
  24. package/dist/src/adapters/codex-tools.js +106 -0
  25. package/dist/src/adapters/codex-tools.js.map +1 -0
  26. package/dist/src/adapters/content-blocks.d.ts +68 -0
  27. package/dist/src/adapters/content-blocks.js +205 -0
  28. package/dist/src/adapters/content-blocks.js.map +1 -0
  29. package/dist/src/adapters/echo-agent-adapter.d.ts +23 -0
  30. package/dist/src/adapters/echo-agent-adapter.js +72 -0
  31. package/dist/src/adapters/echo-agent-adapter.js.map +1 -0
  32. package/dist/src/adapters/gemini-adapter.d.ts +87 -0
  33. package/dist/src/adapters/gemini-adapter.js +594 -0
  34. package/dist/src/adapters/gemini-adapter.js.map +1 -0
  35. package/dist/src/adapters/gemini-tools.d.ts +4 -0
  36. package/dist/src/adapters/gemini-tools.js +48 -0
  37. package/dist/src/adapters/gemini-tools.js.map +1 -0
  38. package/dist/src/adapters/opencode-adapter.d.ts +74 -0
  39. package/dist/src/adapters/opencode-adapter.js +418 -0
  40. package/dist/src/adapters/opencode-adapter.js.map +1 -0
  41. package/dist/src/adapters/opencode-tools.d.ts +2 -0
  42. package/dist/src/adapters/opencode-tools.js +41 -0
  43. package/dist/src/adapters/opencode-tools.js.map +1 -0
  44. package/dist/src/adapters/pi-adapter.d.ts +92 -0
  45. package/dist/src/adapters/pi-adapter.js +467 -0
  46. package/dist/src/adapters/pi-adapter.js.map +1 -0
  47. package/dist/src/adapters/pi-tools.d.ts +10 -0
  48. package/dist/src/adapters/pi-tools.js +72 -0
  49. package/dist/src/adapters/pi-tools.js.map +1 -0
  50. package/dist/src/adapters/process-agent-adapter.d.ts +24 -0
  51. package/dist/src/adapters/process-agent-adapter.js +111 -0
  52. package/dist/src/adapters/process-agent-adapter.js.map +1 -0
  53. package/dist/src/adapters/resolve-claude.d.ts +13 -0
  54. package/dist/src/adapters/resolve-claude.js +57 -0
  55. package/dist/src/adapters/resolve-claude.js.map +1 -0
  56. package/dist/src/adapters/resolve-codex.d.ts +13 -0
  57. package/dist/src/adapters/resolve-codex.js +48 -0
  58. package/dist/src/adapters/resolve-codex.js.map +1 -0
  59. package/dist/src/adapters/resolve-gemini.d.ts +13 -0
  60. package/dist/src/adapters/resolve-gemini.js +47 -0
  61. package/dist/src/adapters/resolve-gemini.js.map +1 -0
  62. package/dist/src/adapters/resolve-opencode.d.ts +11 -0
  63. package/dist/src/adapters/resolve-opencode.js +49 -0
  64. package/dist/src/adapters/resolve-opencode.js.map +1 -0
  65. package/dist/src/adapters/resolve-pi.d.ts +13 -0
  66. package/dist/src/adapters/resolve-pi.js +46 -0
  67. package/dist/src/adapters/resolve-pi.js.map +1 -0
  68. package/dist/src/adapters/run-options.d.ts +22 -0
  69. package/dist/src/adapters/run-options.js +48 -0
  70. package/dist/src/adapters/run-options.js.map +1 -0
  71. package/dist/src/adapters/spawn.d.ts +20 -0
  72. package/dist/src/adapters/spawn.js +16 -0
  73. package/dist/src/adapters/spawn.js.map +1 -0
  74. package/dist/src/agents/agent-manager.d.ts +98 -0
  75. package/dist/src/agents/agent-manager.js +433 -0
  76. package/dist/src/agents/agent-manager.js.map +1 -0
  77. package/dist/src/agents/attachments.d.ts +28 -0
  78. package/dist/src/agents/attachments.js +121 -0
  79. package/dist/src/agents/attachments.js.map +1 -0
  80. package/dist/src/bridge-context.d.ts +45 -0
  81. package/dist/src/bridge-context.js +2 -0
  82. package/dist/src/bridge-context.js.map +1 -0
  83. package/dist/src/bridge-status.d.ts +12 -0
  84. package/dist/src/bridge-status.js +17 -0
  85. package/dist/src/bridge-status.js.map +1 -0
  86. package/dist/src/bridge.d.ts +37 -0
  87. package/dist/src/bridge.js +446 -0
  88. package/dist/src/bridge.js.map +1 -0
  89. package/dist/src/cli.d.ts +2 -0
  90. package/dist/src/cli.js +194 -0
  91. package/dist/src/cli.js.map +1 -0
  92. package/dist/src/conversation/session-history.d.ts +27 -0
  93. package/dist/src/conversation/session-history.js +1082 -0
  94. package/dist/src/conversation/session-history.js.map +1 -0
  95. package/dist/src/conversation/thread-store.d.ts +74 -0
  96. package/dist/src/conversation/thread-store.js +366 -0
  97. package/dist/src/conversation/thread-store.js.map +1 -0
  98. package/dist/src/daemon-config.d.ts +123 -0
  99. package/dist/src/daemon-config.js +64 -0
  100. package/dist/src/daemon-config.js.map +1 -0
  101. package/dist/src/daemon-state.d.ts +27 -0
  102. package/dist/src/daemon-state.js +76 -0
  103. package/dist/src/daemon-state.js.map +1 -0
  104. package/dist/src/git/git-runner.d.ts +24 -0
  105. package/dist/src/git/git-runner.js +63 -0
  106. package/dist/src/git/git-runner.js.map +1 -0
  107. package/dist/src/git/git-service.d.ts +76 -0
  108. package/dist/src/git/git-service.js +435 -0
  109. package/dist/src/git/git-service.js.map +1 -0
  110. package/dist/src/handler-router.d.ts +34 -0
  111. package/dist/src/handler-router.js +67 -0
  112. package/dist/src/handler-router.js.map +1 -0
  113. package/dist/src/handlers/account-handler.d.ts +4 -0
  114. package/dist/src/handlers/account-handler.js +27 -0
  115. package/dist/src/handlers/account-handler.js.map +1 -0
  116. package/dist/src/handlers/agent-handler.d.ts +2 -0
  117. package/dist/src/handlers/agent-handler.js +8 -0
  118. package/dist/src/handlers/agent-handler.js.map +1 -0
  119. package/dist/src/handlers/bridge-control-handler.d.ts +2 -0
  120. package/dist/src/handlers/bridge-control-handler.js +64 -0
  121. package/dist/src/handlers/bridge-control-handler.js.map +1 -0
  122. package/dist/src/handlers/desktop-handler.d.ts +12 -0
  123. package/dist/src/handlers/desktop-handler.js +5 -0
  124. package/dist/src/handlers/desktop-handler.js.map +1 -0
  125. package/dist/src/handlers/git-handler.d.ts +2 -0
  126. package/dist/src/handlers/git-handler.js +82 -0
  127. package/dist/src/handlers/git-handler.js.map +1 -0
  128. package/dist/src/handlers/index.d.ts +8 -0
  129. package/dist/src/handlers/index.js +22 -0
  130. package/dist/src/handlers/index.js.map +1 -0
  131. package/dist/src/handlers/not-implemented.d.ts +10 -0
  132. package/dist/src/handlers/not-implemented.js +21 -0
  133. package/dist/src/handlers/not-implemented.js.map +1 -0
  134. package/dist/src/handlers/notifications-handler.d.ts +2 -0
  135. package/dist/src/handlers/notifications-handler.js +62 -0
  136. package/dist/src/handlers/notifications-handler.js.map +1 -0
  137. package/dist/src/handlers/params.d.ts +11 -0
  138. package/dist/src/handlers/params.js +72 -0
  139. package/dist/src/handlers/params.js.map +1 -0
  140. package/dist/src/handlers/project-handler.d.ts +2 -0
  141. package/dist/src/handlers/project-handler.js +6 -0
  142. package/dist/src/handlers/project-handler.js.map +1 -0
  143. package/dist/src/handlers/thread-context-handler.d.ts +2 -0
  144. package/dist/src/handlers/thread-context-handler.js +211 -0
  145. package/dist/src/handlers/thread-context-handler.js.map +1 -0
  146. package/dist/src/handlers/workspace-handler.d.ts +2 -0
  147. package/dist/src/handlers/workspace-handler.js +101 -0
  148. package/dist/src/handlers/workspace-handler.js.map +1 -0
  149. package/dist/src/hooks/claude-approval-hook.d.ts +7 -0
  150. package/dist/src/hooks/claude-approval-hook.js +95 -0
  151. package/dist/src/hooks/claude-approval-hook.js.map +1 -0
  152. package/dist/src/hooks/gemini-approval-hook.d.ts +7 -0
  153. package/dist/src/hooks/gemini-approval-hook.js +113 -0
  154. package/dist/src/hooks/gemini-approval-hook.js.map +1 -0
  155. package/dist/src/index.d.ts +62 -0
  156. package/dist/src/index.js +65 -0
  157. package/dist/src/index.js.map +1 -0
  158. package/dist/src/keyring-secret-store.d.ts +36 -0
  159. package/dist/src/keyring-secret-store.js +70 -0
  160. package/dist/src/keyring-secret-store.js.map +1 -0
  161. package/dist/src/lock-file.d.ts +18 -0
  162. package/dist/src/lock-file.js +60 -0
  163. package/dist/src/lock-file.js.map +1 -0
  164. package/dist/src/logger.d.ts +28 -0
  165. package/dist/src/logger.js +99 -0
  166. package/dist/src/logger.js.map +1 -0
  167. package/dist/src/pairing/pairing-code-service.d.ts +45 -0
  168. package/dist/src/pairing/pairing-code-service.js +183 -0
  169. package/dist/src/pairing/pairing-code-service.js.map +1 -0
  170. package/dist/src/projects/project-registry.d.ts +14 -0
  171. package/dist/src/projects/project-registry.js +60 -0
  172. package/dist/src/projects/project-registry.js.map +1 -0
  173. package/dist/src/push/push-sender.d.ts +21 -0
  174. package/dist/src/push/push-sender.js +96 -0
  175. package/dist/src/push/push-sender.js.map +1 -0
  176. package/dist/src/push/push-service.d.ts +122 -0
  177. package/dist/src/push/push-service.js +260 -0
  178. package/dist/src/push/push-service.js.map +1 -0
  179. package/dist/src/qr.d.ts +17 -0
  180. package/dist/src/qr.js +31 -0
  181. package/dist/src/qr.js.map +1 -0
  182. package/dist/src/secret-store.d.ts +23 -0
  183. package/dist/src/secret-store.js +27 -0
  184. package/dist/src/secret-store.js.map +1 -0
  185. package/dist/src/secure-device-state.d.ts +16 -0
  186. package/dist/src/secure-device-state.js +63 -0
  187. package/dist/src/secure-device-state.js.map +1 -0
  188. package/dist/src/service-installer.d.ts +57 -0
  189. package/dist/src/service-installer.js +254 -0
  190. package/dist/src/service-installer.js.map +1 -0
  191. package/dist/src/session-state.d.ts +14 -0
  192. package/dist/src/session-state.js +19 -0
  193. package/dist/src/session-state.js.map +1 -0
  194. package/dist/src/transport/crypto.d.ts +43 -0
  195. package/dist/src/transport/crypto.js +78 -0
  196. package/dist/src/transport/crypto.js.map +1 -0
  197. package/dist/src/transport/lan-server.d.ts +33 -0
  198. package/dist/src/transport/lan-server.js +105 -0
  199. package/dist/src/transport/lan-server.js.map +1 -0
  200. package/dist/src/transport/local-hosts.d.ts +17 -0
  201. package/dist/src/transport/local-hosts.js +30 -0
  202. package/dist/src/transport/local-hosts.js.map +1 -0
  203. package/dist/src/transport/mdns-advertiser.d.ts +83 -0
  204. package/dist/src/transport/mdns-advertiser.js +282 -0
  205. package/dist/src/transport/mdns-advertiser.js.map +1 -0
  206. package/dist/src/transport/message-io.d.ts +33 -0
  207. package/dist/src/transport/message-io.js +87 -0
  208. package/dist/src/transport/message-io.js.map +1 -0
  209. package/dist/src/transport/outbound-log.d.ts +24 -0
  210. package/dist/src/transport/outbound-log.js +78 -0
  211. package/dist/src/transport/outbound-log.js.map +1 -0
  212. package/dist/src/transport/relay-client.d.ts +19 -0
  213. package/dist/src/transport/relay-client.js +27 -0
  214. package/dist/src/transport/relay-client.js.map +1 -0
  215. package/dist/src/transport/secure-channel.d.ts +33 -0
  216. package/dist/src/transport/secure-channel.js +81 -0
  217. package/dist/src/transport/secure-channel.js.map +1 -0
  218. package/dist/src/transport/server-handshake.d.ts +49 -0
  219. package/dist/src/transport/server-handshake.js +137 -0
  220. package/dist/src/transport/server-handshake.js.map +1 -0
  221. package/dist/src/transport/session-handler.d.ts +19 -0
  222. package/dist/src/transport/session-handler.js +134 -0
  223. package/dist/src/transport/session-handler.js.map +1 -0
  224. package/dist/src/transport/session-registry.d.ts +58 -0
  225. package/dist/src/transport/session-registry.js +91 -0
  226. package/dist/src/transport/session-registry.js.map +1 -0
  227. package/dist/src/transport/trust-store.d.ts +23 -0
  228. package/dist/src/transport/trust-store.js +33 -0
  229. package/dist/src/transport/trust-store.js.map +1 -0
  230. package/dist/src/transport/ws-adapter.d.ts +7 -0
  231. package/dist/src/transport/ws-adapter.js +16 -0
  232. package/dist/src/transport/ws-adapter.js.map +1 -0
  233. package/dist/src/version.d.ts +1 -0
  234. package/dist/src/version.js +13 -0
  235. package/dist/src/version.js.map +1 -0
  236. package/dist/src/workspace/browse-service.d.ts +10 -0
  237. package/dist/src/workspace/browse-service.js +97 -0
  238. package/dist/src/workspace/browse-service.js.map +1 -0
  239. package/dist/src/workspace/checkpoint-service.d.ts +21 -0
  240. package/dist/src/workspace/checkpoint-service.js +219 -0
  241. package/dist/src/workspace/checkpoint-service.js.map +1 -0
  242. package/dist/src/workspace/path-guard.d.ts +7 -0
  243. package/dist/src/workspace/path-guard.js +51 -0
  244. package/dist/src/workspace/path-guard.js.map +1 -0
  245. package/dist/src/workspace/workspace-service.d.ts +8 -0
  246. package/dist/src/workspace/workspace-service.js +111 -0
  247. package/dist/src/workspace/workspace-service.js.map +1 -0
  248. package/package.json +46 -0
  249. package/scripts/extract-gemini-hook.mjs +16 -0
  250. package/scripts/fake-approval-bridge.mjs +23 -0
  251. package/scripts/install-service-linux.sh +38 -0
  252. package/scripts/install-service-macos.sh +38 -0
  253. package/scripts/install-service-windows.ps1 +26 -0
  254. package/scripts/test-gemini-hook-e2e.mjs +168 -0
  255. package/scripts/write-gemini-settings.mjs +31 -0
@@ -0,0 +1,594 @@
1
+ /**
2
+ * Google Gemini CLI adapter (`@google/gemini-cli`, the `gemini` command — real agent).
3
+ *
4
+ * Gemini does NOT speak the generic bridge agent IPC. Each turn spawns
5
+ * `gemini -p <prompt> --output-format stream-json …` as a one-shot process and maps
6
+ * its NDJSON event stream onto the bridge's agent events (same one-shot pattern as
7
+ * the OpenCode, Claude Code, Codex and pi adapters). Validated live against
8
+ * gemini-cli 0.45.2.
9
+ *
10
+ * Session continuity: the first turn passes `--session-id <uuid>` (a UUID the
11
+ * adapter generates); subsequent turns pass `--resume <uuid>` to resume the SAME
12
+ * conversation (verified: a fact set on turn 1 is recalled on turn 2). The native
13
+ * session id is captured from the `init` event and tracked per thread.
14
+ *
15
+ * Critical detail: like the other CLIs, `gemini -p` is spawned with stdin IGNORED
16
+ * (the shared `defaultSpawn`); the prompt is passed as an argv element with
17
+ * `shell:false`, so it is never interpolated into a shell. `--skip-trust` trusts
18
+ * the workspace for the session so a headless run never blocks on a trust prompt.
19
+ *
20
+ * Captured `--output-format stream-json` event shapes (one JSON object per line):
21
+ * { "type":"init", "session_id":"<uuid>", "model":"gemini-2.5-flash" }
22
+ * { "type":"message", "role":"user", "content":"…" } (echo — ignored)
23
+ * { "type":"tool_use", "tool_name":"write_file", "tool_id":"…", "parameters":{…} }
24
+ * { "type":"tool_result", "tool_id":"…", "status":"success", "output"?:"…" }
25
+ * { "type":"message", "role":"assistant", "content":"…", "delta":true } (streamed text)
26
+ * { "type":"result", "status":"success", "stats":{ "total_tokens":…, "models":{…} } }
27
+ *
28
+ * Notes:
29
+ * - Gemini's `stats.models` reports the CONCRETE model an alias resolved to
30
+ * (e.g. `gemini-2.5-flash-lite` → `gemini-3.1-flash-lite`); we surface it via
31
+ * `model_resolved`, and `stats.total_tokens` as the per-turn context usage.
32
+ * - No reasoning/thinking flag is exposed by the CLI, so no reasoning knob is
33
+ * advertised (FOR-DEV: revisit if a `--thinking`-style flag appears).
34
+ * - `update_topic` is a Gemini-internal bookkeeping tool and is filtered out.
35
+ * - **Interactive approvals** (opt-in, see `interactiveApprovals` below): the
36
+ * adapter writes a `<cwd>/.gemini/settings.json` with a `BeforeTool` hook
37
+ * (gemini-cli uses the same hook contract as Claude Code; the CLI ships a
38
+ * `gemini hooks migrate` command that imports Claude hook settings). The
39
+ * hook round-trips every tool to the bridge's local HTTP endpoint, which
40
+ * forwards the decision to the phone (`turn/send { approvalResponse }`).
41
+ * `--approval-mode` is set to Gemini's `default` (which means "prompt for
42
+ * approval" in Gemini's vocabulary — the hook is the gate, NOT a TTY
43
+ * prompt, since `-p` is non-interactive). Without the hook the prompt would
44
+ * block Gemini forever; the bridge only injects it when the endpoint is
45
+ * resolvable. See `gemini-approval-hook.ts` for the script.
46
+ *
47
+ * See bridge/FOR-DEV.md (agent adapters) and bridge/docs/testing.md.
48
+ */
49
+ import { randomUUID } from 'node:crypto';
50
+ import { createInterface } from 'node:readline';
51
+ import { mkdir, writeFile } from 'node:fs/promises';
52
+ import { join } from 'node:path';
53
+ import { BaseAgentAdapter } from './base-adapter.js';
54
+ import { geminiToolBlock, isInternalGeminiTool } from './gemini-tools.js';
55
+ import { defaultSpawn } from './spawn.js';
56
+ const GEMINI_CAPABILITIES = {
57
+ // Gemini has an `--approval-mode plan` (read-only) mode.
58
+ planMode: true,
59
+ streaming: true,
60
+ approvals: true,
61
+ forking: true,
62
+ images: true,
63
+ reportsContextUsage: true,
64
+ };
65
+ /** Gemini context window (all current 2.5/3.x models are ~1M tokens). */
66
+ const GEMINI_CONTEXT_WINDOW = 1_048_576;
67
+ /**
68
+ * Curated Gemini model set. The Gemini CLI exposes **no headless enumerate
69
+ * command** (like Claude Code — only Codex via app-server and OpenCode/pi via
70
+ * their own list commands can enumerate), so we ship a hand-kept table sourced
71
+ * from the CLI's own constants
72
+ * (`packages/core/src/config/models.ts` in google-gemini/gemini-cli). Every id
73
+ * in the CLI's `VALID_GEMINI_MODELS` set is listed, plus the `auto` routing
74
+ * alias. The concrete model a run resolves to is always surfaced via the
75
+ * `model_resolved` event.
76
+ */
77
+ const GEMINI_MODELS = [
78
+ // Auto-routing (the CLI picks the best model for each task).
79
+ {
80
+ id: 'auto',
81
+ displayName: 'Auto',
82
+ description: 'Let the CLI pick the best model for each task (recommended)',
83
+ isDefault: true,
84
+ },
85
+ // Pro tier.
86
+ {
87
+ id: 'gemini-3-pro-preview',
88
+ displayName: 'Gemini 3 Pro (Preview)',
89
+ description: 'Most capable, preview build',
90
+ },
91
+ {
92
+ id: 'gemini-3.1-pro-preview',
93
+ displayName: 'Gemini 3.1 Pro (Preview)',
94
+ description: 'Newer Pro preview build',
95
+ },
96
+ {
97
+ id: 'gemini-3.1-pro-preview-customtools',
98
+ displayName: 'Gemini 3.1 Pro (Preview, custom tools)',
99
+ description: '3.1 Pro preview variant for custom-tools backends',
100
+ },
101
+ {
102
+ id: 'gemini-2.5-pro',
103
+ displayName: 'Gemini 2.5 Pro',
104
+ description: 'Stable 2.5-generation Pro',
105
+ },
106
+ // Flash tier.
107
+ {
108
+ id: 'gemini-3-flash-preview',
109
+ displayName: 'Gemini 3 Flash (Preview)',
110
+ description: 'Pinned 3-generation Flash preview build',
111
+ },
112
+ {
113
+ id: 'gemini-3.5-flash',
114
+ displayName: 'Gemini 3.5 Flash',
115
+ description: '3.5-generation Flash (GA)',
116
+ },
117
+ {
118
+ id: 'gemini-3-flash',
119
+ displayName: 'Gemini 3 Flash',
120
+ description: 'Secondary 3.5-flash alias for backends that reject "gemini-3.5-flash"',
121
+ },
122
+ {
123
+ id: 'gemini-2.5-flash',
124
+ displayName: 'Gemini 2.5 Flash',
125
+ description: 'Stable 2.5-generation Flash',
126
+ },
127
+ // Flash-Lite tier.
128
+ {
129
+ id: 'gemini-3.1-flash-lite',
130
+ displayName: 'Gemini 3.1 Flash-Lite',
131
+ description: 'Cheapest 3.1-generation tier (GA)',
132
+ },
133
+ // Experimental — gated by the CLI's `experimentalGemma` flag.
134
+ {
135
+ id: 'gemma-4-31b-it',
136
+ displayName: 'Gemma 4 31B (IT) — Experimental',
137
+ description: 'Experimental — only enabled when the CLI runs with `experimentalGemma` on',
138
+ },
139
+ {
140
+ id: 'gemma-4-26b-a4b-it',
141
+ displayName: 'Gemma 4 26B (A4B, IT) — Experimental',
142
+ description: 'Experimental — only enabled when the CLI runs with `experimentalGemma` on',
143
+ },
144
+ ];
145
+ const DEFAULT_GEMINI_MODEL = 'auto';
146
+ function approvalModeFor(mode) {
147
+ if (mode === 'acceptEdits')
148
+ return 'auto_edit';
149
+ if (mode === 'bypassPermissions')
150
+ return 'yolo';
151
+ if (mode === 'interactive')
152
+ return 'default';
153
+ return 'plan';
154
+ }
155
+ /** True when this adapter should inject the BeforeTool hook (i.e. the bridge
156
+ * has a resolvable approval endpoint AND the user opted in). */
157
+ function needsApprovalHook(mode, hook) {
158
+ if (mode !== 'interactive')
159
+ return false;
160
+ if (!hook)
161
+ return false;
162
+ return hook.url() !== undefined;
163
+ }
164
+ /** Parse one `gemini --output-format stream-json` line, or null if it isn't JSON. */
165
+ export function parseGeminiLine(line) {
166
+ const trimmed = line.trim();
167
+ if (!trimmed)
168
+ return null;
169
+ let parsed;
170
+ try {
171
+ parsed = JSON.parse(trimmed);
172
+ }
173
+ catch {
174
+ return null;
175
+ }
176
+ switch (parsed['type']) {
177
+ case 'init': {
178
+ const sessionId = str(parsed['session_id']);
179
+ const model = str(parsed['model']);
180
+ return {
181
+ kind: 'session',
182
+ ...(sessionId !== undefined ? { sessionId } : {}),
183
+ ...(model !== undefined ? { model } : {}),
184
+ };
185
+ }
186
+ case 'message': {
187
+ if (parsed['role'] !== 'assistant')
188
+ return { kind: 'other' };
189
+ const text = str(parsed['content']) ?? '';
190
+ return { kind: 'delta', text, delta: parsed['delta'] === true };
191
+ }
192
+ case 'tool_use': {
193
+ const name = str(parsed['tool_name']);
194
+ const id = str(parsed['tool_id']) ?? '';
195
+ if (!name)
196
+ return { kind: 'other' };
197
+ const params = isRecord(parsed['parameters']) ? parsed['parameters'] : {};
198
+ return { kind: 'tool_use', tool: { name, id, params } };
199
+ }
200
+ case 'tool_result': {
201
+ return {
202
+ kind: 'tool_result',
203
+ toolId: str(parsed['tool_id']) ?? '',
204
+ status: str(parsed['status']) ?? 'success',
205
+ output: str(parsed['output']) ?? '',
206
+ };
207
+ }
208
+ case 'result': {
209
+ const status = str(parsed['status']) ?? 'success';
210
+ if (status !== 'success') {
211
+ return { kind: 'error', text: readResultError(parsed), status };
212
+ }
213
+ const stats = isRecord(parsed['stats']) ? parsed['stats'] : undefined;
214
+ const tokens = typeof stats?.['total_tokens'] === 'number' ? stats['total_tokens'] : undefined;
215
+ const concrete = concreteModel(stats?.['models']);
216
+ return {
217
+ kind: 'completed',
218
+ ...(tokens !== undefined ? { tokens } : {}),
219
+ ...(concrete !== undefined ? { model: concrete } : {}),
220
+ };
221
+ }
222
+ case 'error':
223
+ return { kind: 'error', text: str(parsed['message']) ?? 'gemini error' };
224
+ default:
225
+ return { kind: 'other' };
226
+ }
227
+ }
228
+ export class GeminiAdapter extends BaseAgentAdapter {
229
+ agentId = 'gemini-cli';
230
+ capabilities = GEMINI_CAPABILITIES;
231
+ #binaryPath;
232
+ #prependArgs;
233
+ #defaultModel;
234
+ #permissionMode;
235
+ #approvalHook;
236
+ #spawn;
237
+ /** threadId → Gemini session id, for `--resume` continuity. */
238
+ #sessionByThread = new Map();
239
+ /** turnId → in-flight run, for cancellation. */
240
+ #active = new Map();
241
+ #defaultCwd = process.cwd();
242
+ /** cwd's we've already written `.gemini/settings.json` into (idempotent). */
243
+ #hookInstalledCwd = new Set();
244
+ /** Native Gemini session id for a thread (continuity + history-fallback locator). */
245
+ nativeSessionId(threadId) {
246
+ return this.#sessionByThread.get(threadId);
247
+ }
248
+ constructor(options = {}) {
249
+ super();
250
+ this.#binaryPath = options.binaryPath ?? 'gemini';
251
+ this.#prependArgs = options.prependArgs ?? [];
252
+ this.#defaultModel = options.defaultModel ?? DEFAULT_GEMINI_MODEL;
253
+ this.#permissionMode = options.permissionMode ?? 'acceptEdits';
254
+ this.#approvalHook = options.approvalHook;
255
+ this.#spawn = options.spawnFn ?? defaultSpawn;
256
+ }
257
+ get defaultModel() {
258
+ return this.#defaultModel;
259
+ }
260
+ start(config) {
261
+ if (config.cwd)
262
+ this.#defaultCwd = config.cwd;
263
+ return Promise.resolve();
264
+ }
265
+ stop() {
266
+ for (const run of this.#active.values())
267
+ run.child.kill();
268
+ this.#active.clear();
269
+ return Promise.resolve();
270
+ }
271
+ async sendTurn(options) {
272
+ const { threadId, turnId, text } = options;
273
+ const cwd = options.cwd ?? this.#defaultCwd;
274
+ const model = options.service ?? this.#defaultModel;
275
+ const resumeId = this.#sessionByThread.get(threadId);
276
+ // First turn: create a session under a UUID we own; later turns resume it.
277
+ const newSessionId = resumeId ? undefined : randomUUID();
278
+ // Interactive approvals: when `permissionMode === 'interactive'` and the
279
+ // bridge has a resolvable hook endpoint, write `<cwd>/.gemini/settings.json`
280
+ // with a `BeforeTool` hook that round-trips every tool to the phone. The
281
+ // hook script itself was written at bridge startup
282
+ // (`writeGeminiApprovalHook`). Idempotent per cwd so we don't re-write on
283
+ // every turn.
284
+ //
285
+ // We AWAIT the install before spawning the CLI so a misconfigured cwd (or
286
+ // a transient EACCES) fails the turn with a clear error — and so tests
287
+ // can assert on the written file synchronously after sendTurn resolves.
288
+ // A failure to write the settings fails the turn (no fallback) so the
289
+ // phone sees a clear "hook not installed" error instead of a CLI that
290
+ // blocks on a non-existent prompt gate.
291
+ const useHook = needsApprovalHook(this.#permissionMode, this.#approvalHook);
292
+ if (useHook) {
293
+ try {
294
+ await this.#installHook(cwd);
295
+ }
296
+ catch (err) {
297
+ this.emit({
298
+ type: 'turn_error',
299
+ threadId,
300
+ turnId,
301
+ data: {
302
+ text: `failed to install Gemini approval hook (${errorMessage(err)}); interactive approvals unavailable this turn`,
303
+ },
304
+ });
305
+ return;
306
+ }
307
+ }
308
+ else if (this.#permissionMode === 'interactive') {
309
+ // The user opted into interactive approvals but the bridge can't wire
310
+ // the hook (LAN server not started, no token, etc.). Fail the turn so
311
+ // the phone knows why the approval is not interactive.
312
+ this.emit({
313
+ type: 'turn_error',
314
+ threadId,
315
+ turnId,
316
+ data: {
317
+ text: 'gemini interactive approvals requested but the bridge hook URL is unavailable. Enable `lanEnabled` and ensure the bridge has bound its LAN server, or set `agents.gemini-cli.permissionMode` to a non-interactive value.',
318
+ },
319
+ });
320
+ return;
321
+ }
322
+ const args = [
323
+ '--output-format',
324
+ 'stream-json',
325
+ '--approval-mode',
326
+ approvalModeFor(this.#permissionMode),
327
+ // Trust the workspace for this session so a headless run never blocks on a
328
+ // trust prompt in an arbitrary project directory.
329
+ '--skip-trust',
330
+ ];
331
+ if (model)
332
+ args.push('-m', model);
333
+ if (resumeId)
334
+ args.push('--resume', resumeId);
335
+ else if (newSessionId)
336
+ args.push('--session-id', newSessionId);
337
+ args.push('-p', text);
338
+ // Pass the bridge endpoint + token to the hook via env so the script can
339
+ // POST each tool invocation to the bridge's local HTTP endpoint. The
340
+ // threadId is what the hook embeds in the request, so the bridge can
341
+ // route the response back to the right thread.
342
+ const spawnExtra = useHook && this.#approvalHook
343
+ ? {
344
+ env: {
345
+ UXNAN_HOOK_URL: this.#approvalHook.url() ?? '',
346
+ UXNAN_HOOK_TOKEN: this.#approvalHook.token,
347
+ UXNAN_HOOK_THREAD_ID: threadId,
348
+ },
349
+ }
350
+ : undefined;
351
+ let child;
352
+ try {
353
+ child = this.#spawn(this.#binaryPath, [...this.#prependArgs, ...args], cwd, spawnExtra);
354
+ }
355
+ catch (err) {
356
+ this.emit({
357
+ type: 'turn_error',
358
+ threadId,
359
+ turnId,
360
+ data: { text: `failed to launch gemini: ${errorMessage(err)}` },
361
+ });
362
+ return;
363
+ }
364
+ this.#active.set(turnId, { child, threadId });
365
+ this.emit({ type: 'turn_started', threadId, turnId });
366
+ let full = '';
367
+ let sawDelta = false;
368
+ let errored = false;
369
+ let completed = false;
370
+ const pendingTools = new Map();
371
+ const reader = createInterface({ input: child.stdout });
372
+ reader.on('line', (line) => {
373
+ const event = parseGeminiLine(line);
374
+ if (!event)
375
+ return;
376
+ switch (event.kind) {
377
+ case 'session':
378
+ if (event.sessionId)
379
+ this.#sessionByThread.set(threadId, event.sessionId);
380
+ break;
381
+ case 'delta':
382
+ if (event.text) {
383
+ if (event.delta) {
384
+ full += event.text;
385
+ sawDelta = true;
386
+ this.emit({ type: 'delta', threadId, turnId, data: { text: event.text } });
387
+ }
388
+ else if (!sawDelta) {
389
+ // A single complete (non-streamed) assistant message.
390
+ full = event.text;
391
+ this.emit({ type: 'delta', threadId, turnId, data: { text: event.text } });
392
+ }
393
+ }
394
+ break;
395
+ case 'tool_use':
396
+ if (event.tool && !isInternalGeminiTool(event.tool.name)) {
397
+ pendingTools.set(event.tool.id, event.tool);
398
+ }
399
+ break;
400
+ case 'tool_result': {
401
+ const tool = event.toolId ? pendingTools.get(event.toolId) : undefined;
402
+ if (tool) {
403
+ pendingTools.delete(tool.id);
404
+ const content = geminiToolBlock(tool.name, tool.id, tool.params, event.output ?? '', event.status === 'error');
405
+ this.emit({ type: 'block', threadId, turnId, data: { content } });
406
+ }
407
+ break;
408
+ }
409
+ case 'completed': {
410
+ completed = true;
411
+ if (event.model) {
412
+ this.emit({ type: 'model_resolved', threadId, turnId, data: { text: event.model } });
413
+ }
414
+ const usage = event.tokens !== undefined
415
+ ? { tokens: event.tokens, contextWindow: GEMINI_CONTEXT_WINDOW }
416
+ : undefined;
417
+ this.emit({
418
+ type: 'turn_completed',
419
+ threadId,
420
+ turnId,
421
+ data: { text: full, ...(usage !== undefined ? { usage } : {}) },
422
+ });
423
+ break;
424
+ }
425
+ case 'error':
426
+ errored = true;
427
+ this.emit({
428
+ type: 'turn_error',
429
+ threadId,
430
+ turnId,
431
+ data: { text: event.text ?? 'gemini error' },
432
+ });
433
+ break;
434
+ }
435
+ });
436
+ child.on('error', (err) => {
437
+ reader.close();
438
+ this.#active.delete(turnId);
439
+ if (!errored && !completed) {
440
+ errored = true;
441
+ this.emit({
442
+ type: 'turn_error',
443
+ threadId,
444
+ turnId,
445
+ data: { text: `gemini process error: ${err.message}` },
446
+ });
447
+ }
448
+ });
449
+ child.on('close', () => {
450
+ reader.close();
451
+ this.#active.delete(turnId);
452
+ if (!completed && !errored) {
453
+ // No terminal `result` arrived (e.g. killed): complete with what we have.
454
+ this.emit({ type: 'turn_completed', threadId, turnId, data: { text: full } });
455
+ }
456
+ });
457
+ }
458
+ cancelTurn(threadId, turnId) {
459
+ const run = this.#active.get(turnId);
460
+ if (run) {
461
+ run.child.kill();
462
+ this.#active.delete(turnId);
463
+ this.emit({ type: 'turn_aborted', threadId, turnId });
464
+ }
465
+ return Promise.resolve();
466
+ }
467
+ /**
468
+ * Write (or overwrite) `<cwd>/.gemini/settings.json` with a `BeforeTool` hook
469
+ * pointing at the bridge's local approval endpoint. Idempotent per cwd — the
470
+ * hook only needs to exist in the workspace, not per turn. Existing user
471
+ * settings (other hooks, theme, …) are preserved: we MERGE the `hooks` map
472
+ * over whatever is already there. The bridge's hook is named `uxnan-approval`
473
+ * so it's easy to identify and disable from `/hooks disable uxnan-approval`.
474
+ *
475
+ * The actual round-trip is handled by the bridge's central
476
+ * `AgentManager.requestApproval` (the same flow Claude's `PreToolUse` hook
477
+ * uses — the gemini hook POSTs to the same `POST /agent-hook/approval`
478
+ * endpoint). The adapter does NOT need its own `respondApproval` for the
479
+ * hook flow: the bridge resolves the pending approval and returns the
480
+ * `allow`/`deny` decision via the HTTP response.
481
+ */
482
+ async #installHook(cwd) {
483
+ const key = this.#hookKey(cwd);
484
+ if (this.#hookInstalledCwd.has(key))
485
+ return;
486
+ const hook = this.#approvalHook;
487
+ if (!hook)
488
+ return;
489
+ const url = hook.url();
490
+ if (!url)
491
+ return;
492
+ const dir = join(cwd, '.gemini');
493
+ const path = join(dir, 'settings.json');
494
+ let existing = {};
495
+ try {
496
+ const { readFile } = await import('node:fs/promises');
497
+ const raw = await readFile(path, 'utf-8');
498
+ const parsed = JSON.parse(raw);
499
+ if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {
500
+ existing = parsed;
501
+ }
502
+ }
503
+ catch {
504
+ // File doesn't exist or is unreadable / malformed — start fresh.
505
+ }
506
+ const hookEntry = {
507
+ hooks: [
508
+ {
509
+ type: 'command',
510
+ name: 'uxnan-approval',
511
+ command: `node "${hook.scriptPath}"`,
512
+ },
513
+ ],
514
+ };
515
+ // Wrap the entry under a matcher key (Gemini uses regex matchers on the
516
+ // tool name; `.*` matches every tool — the bridge decides per-call).
517
+ const matchers = existing.hooks && typeof existing.hooks === 'object'
518
+ ? existing.hooks
519
+ : {};
520
+ const beforeToolRaw = matchers['BeforeTool'];
521
+ const beforeTool = Array.isArray(beforeToolRaw) ? beforeToolRaw : [];
522
+ // Drop any prior uxnan-approval entry so re-installs don't duplicate.
523
+ const filtered = beforeTool.filter((entry) => {
524
+ if (!entry || typeof entry !== 'object')
525
+ return true;
526
+ const hooks = entry['hooks'];
527
+ if (!Array.isArray(hooks))
528
+ return true;
529
+ return !hooks.some((h) => h && typeof h === 'object' && h['name'] === 'uxnan-approval');
530
+ });
531
+ filtered.push({ matcher: '.*', ...hookEntry });
532
+ const next = {
533
+ ...existing,
534
+ hooks: {
535
+ ...(matchers ?? {}),
536
+ BeforeTool: filtered,
537
+ },
538
+ };
539
+ await mkdir(dir, { recursive: true });
540
+ await writeFile(path, `${JSON.stringify(next, null, 2)}\n`, 'utf-8');
541
+ this.#hookInstalledCwd.add(key);
542
+ }
543
+ /**
544
+ * Normalize a cwd for the dedup set so Windows mixed slashes / case
545
+ * differences don't make us rewrite the same file. Best-effort — the
546
+ * Windows file system is case-insensitive but Node strings are not.
547
+ */
548
+ #hookKey(cwd) {
549
+ return process.platform === 'win32' ? cwd.toLowerCase() : cwd;
550
+ }
551
+ /**
552
+ * Gemini CLI has no enumerate command, so report the curated known set. No
553
+ * reasoning knob is advertised (the CLI exposes no thinking/effort flag).
554
+ */
555
+ listModels() {
556
+ return Promise.resolve(GEMINI_MODELS.map((m) => ({ ...m })));
557
+ }
558
+ }
559
+ function str(value) {
560
+ return typeof value === 'string' ? value : undefined;
561
+ }
562
+ function isRecord(value) {
563
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
564
+ }
565
+ /**
566
+ * From Gemini's `stats.models` map (`{ "<modelId>": { total_tokens, … } }`) pick
567
+ * the concrete model that actually ran (the one with the most tokens) — that is
568
+ * the version an alias resolved to.
569
+ */
570
+ function concreteModel(models) {
571
+ if (!isRecord(models))
572
+ return undefined;
573
+ let best;
574
+ let bestTokens = -1;
575
+ for (const [id, stat] of Object.entries(models)) {
576
+ const tokens = isRecord(stat) && typeof stat['total_tokens'] === 'number' ? stat['total_tokens'] : 0;
577
+ if (tokens > bestTokens) {
578
+ bestTokens = tokens;
579
+ best = id;
580
+ }
581
+ }
582
+ return bestTokens > 0 ? best : undefined;
583
+ }
584
+ /** Best-effort error message extraction from a failed `result` event. */
585
+ function readResultError(parsed) {
586
+ if (isRecord(parsed['error']) && typeof parsed['error']['message'] === 'string') {
587
+ return parsed['error']['message'];
588
+ }
589
+ return str(parsed['message']) ?? 'gemini turn failed';
590
+ }
591
+ function errorMessage(err) {
592
+ return err instanceof Error ? err.message : String(err);
593
+ }
594
+ //# sourceMappingURL=gemini-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemini-adapter.js","sourceRoot":"","sources":["../../../src/adapters/gemini-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ /** Whether this tool is Gemini-internal bookkeeping that should not surface. */
2
+ export declare function isInternalGeminiTool(toolName: string): boolean;
3
+ /** Build the structured block for one completed Gemini tool call. */
4
+ export declare function geminiToolBlock(toolName: string, toolId: string, params: Record<string, unknown>, output: string, isError: boolean): Record<string, unknown>;