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.
- package/README.md +150 -0
- package/dist/src/account-status.d.ts +13 -0
- package/dist/src/account-status.js +78 -0
- package/dist/src/account-status.js.map +1 -0
- package/dist/src/adapters/base-adapter.d.ts +18 -0
- package/dist/src/adapters/base-adapter.js +15 -0
- package/dist/src/adapters/base-adapter.js.map +1 -0
- package/dist/src/adapters/claude-adapter.d.ts +102 -0
- package/dist/src/adapters/claude-adapter.js +486 -0
- package/dist/src/adapters/claude-adapter.js.map +1 -0
- package/dist/src/adapters/claude-tools.d.ts +25 -0
- package/dist/src/adapters/claude-tools.js +146 -0
- package/dist/src/adapters/claude-tools.js.map +1 -0
- package/dist/src/adapters/codex-adapter.d.ts +116 -0
- package/dist/src/adapters/codex-adapter.js +912 -0
- package/dist/src/adapters/codex-adapter.js.map +1 -0
- package/dist/src/adapters/codex-app-server.d.ts +74 -0
- package/dist/src/adapters/codex-app-server.js +225 -0
- package/dist/src/adapters/codex-app-server.js.map +1 -0
- package/dist/src/adapters/codex-approval.d.ts +88 -0
- package/dist/src/adapters/codex-approval.js +160 -0
- package/dist/src/adapters/codex-approval.js.map +1 -0
- package/dist/src/adapters/codex-tools.d.ts +18 -0
- package/dist/src/adapters/codex-tools.js +106 -0
- package/dist/src/adapters/codex-tools.js.map +1 -0
- package/dist/src/adapters/content-blocks.d.ts +68 -0
- package/dist/src/adapters/content-blocks.js +205 -0
- package/dist/src/adapters/content-blocks.js.map +1 -0
- package/dist/src/adapters/echo-agent-adapter.d.ts +23 -0
- package/dist/src/adapters/echo-agent-adapter.js +72 -0
- package/dist/src/adapters/echo-agent-adapter.js.map +1 -0
- package/dist/src/adapters/gemini-adapter.d.ts +87 -0
- package/dist/src/adapters/gemini-adapter.js +594 -0
- package/dist/src/adapters/gemini-adapter.js.map +1 -0
- package/dist/src/adapters/gemini-tools.d.ts +4 -0
- package/dist/src/adapters/gemini-tools.js +48 -0
- package/dist/src/adapters/gemini-tools.js.map +1 -0
- package/dist/src/adapters/opencode-adapter.d.ts +74 -0
- package/dist/src/adapters/opencode-adapter.js +418 -0
- package/dist/src/adapters/opencode-adapter.js.map +1 -0
- package/dist/src/adapters/opencode-tools.d.ts +2 -0
- package/dist/src/adapters/opencode-tools.js +41 -0
- package/dist/src/adapters/opencode-tools.js.map +1 -0
- package/dist/src/adapters/pi-adapter.d.ts +92 -0
- package/dist/src/adapters/pi-adapter.js +467 -0
- package/dist/src/adapters/pi-adapter.js.map +1 -0
- package/dist/src/adapters/pi-tools.d.ts +10 -0
- package/dist/src/adapters/pi-tools.js +72 -0
- package/dist/src/adapters/pi-tools.js.map +1 -0
- package/dist/src/adapters/process-agent-adapter.d.ts +24 -0
- package/dist/src/adapters/process-agent-adapter.js +111 -0
- package/dist/src/adapters/process-agent-adapter.js.map +1 -0
- package/dist/src/adapters/resolve-claude.d.ts +13 -0
- package/dist/src/adapters/resolve-claude.js +57 -0
- package/dist/src/adapters/resolve-claude.js.map +1 -0
- package/dist/src/adapters/resolve-codex.d.ts +13 -0
- package/dist/src/adapters/resolve-codex.js +48 -0
- package/dist/src/adapters/resolve-codex.js.map +1 -0
- package/dist/src/adapters/resolve-gemini.d.ts +13 -0
- package/dist/src/adapters/resolve-gemini.js +47 -0
- package/dist/src/adapters/resolve-gemini.js.map +1 -0
- package/dist/src/adapters/resolve-opencode.d.ts +11 -0
- package/dist/src/adapters/resolve-opencode.js +49 -0
- package/dist/src/adapters/resolve-opencode.js.map +1 -0
- package/dist/src/adapters/resolve-pi.d.ts +13 -0
- package/dist/src/adapters/resolve-pi.js +46 -0
- package/dist/src/adapters/resolve-pi.js.map +1 -0
- package/dist/src/adapters/run-options.d.ts +22 -0
- package/dist/src/adapters/run-options.js +48 -0
- package/dist/src/adapters/run-options.js.map +1 -0
- package/dist/src/adapters/spawn.d.ts +20 -0
- package/dist/src/adapters/spawn.js +16 -0
- package/dist/src/adapters/spawn.js.map +1 -0
- package/dist/src/agents/agent-manager.d.ts +98 -0
- package/dist/src/agents/agent-manager.js +433 -0
- package/dist/src/agents/agent-manager.js.map +1 -0
- package/dist/src/agents/attachments.d.ts +28 -0
- package/dist/src/agents/attachments.js +121 -0
- package/dist/src/agents/attachments.js.map +1 -0
- package/dist/src/bridge-context.d.ts +45 -0
- package/dist/src/bridge-context.js +2 -0
- package/dist/src/bridge-context.js.map +1 -0
- package/dist/src/bridge-status.d.ts +12 -0
- package/dist/src/bridge-status.js +17 -0
- package/dist/src/bridge-status.js.map +1 -0
- package/dist/src/bridge.d.ts +37 -0
- package/dist/src/bridge.js +446 -0
- package/dist/src/bridge.js.map +1 -0
- package/dist/src/cli.d.ts +2 -0
- package/dist/src/cli.js +194 -0
- package/dist/src/cli.js.map +1 -0
- package/dist/src/conversation/session-history.d.ts +27 -0
- package/dist/src/conversation/session-history.js +1082 -0
- package/dist/src/conversation/session-history.js.map +1 -0
- package/dist/src/conversation/thread-store.d.ts +74 -0
- package/dist/src/conversation/thread-store.js +366 -0
- package/dist/src/conversation/thread-store.js.map +1 -0
- package/dist/src/daemon-config.d.ts +123 -0
- package/dist/src/daemon-config.js +64 -0
- package/dist/src/daemon-config.js.map +1 -0
- package/dist/src/daemon-state.d.ts +27 -0
- package/dist/src/daemon-state.js +76 -0
- package/dist/src/daemon-state.js.map +1 -0
- package/dist/src/git/git-runner.d.ts +24 -0
- package/dist/src/git/git-runner.js +63 -0
- package/dist/src/git/git-runner.js.map +1 -0
- package/dist/src/git/git-service.d.ts +76 -0
- package/dist/src/git/git-service.js +435 -0
- package/dist/src/git/git-service.js.map +1 -0
- package/dist/src/handler-router.d.ts +34 -0
- package/dist/src/handler-router.js +67 -0
- package/dist/src/handler-router.js.map +1 -0
- package/dist/src/handlers/account-handler.d.ts +4 -0
- package/dist/src/handlers/account-handler.js +27 -0
- package/dist/src/handlers/account-handler.js.map +1 -0
- package/dist/src/handlers/agent-handler.d.ts +2 -0
- package/dist/src/handlers/agent-handler.js +8 -0
- package/dist/src/handlers/agent-handler.js.map +1 -0
- package/dist/src/handlers/bridge-control-handler.d.ts +2 -0
- package/dist/src/handlers/bridge-control-handler.js +64 -0
- package/dist/src/handlers/bridge-control-handler.js.map +1 -0
- package/dist/src/handlers/desktop-handler.d.ts +12 -0
- package/dist/src/handlers/desktop-handler.js +5 -0
- package/dist/src/handlers/desktop-handler.js.map +1 -0
- package/dist/src/handlers/git-handler.d.ts +2 -0
- package/dist/src/handlers/git-handler.js +82 -0
- package/dist/src/handlers/git-handler.js.map +1 -0
- package/dist/src/handlers/index.d.ts +8 -0
- package/dist/src/handlers/index.js +22 -0
- package/dist/src/handlers/index.js.map +1 -0
- package/dist/src/handlers/not-implemented.d.ts +10 -0
- package/dist/src/handlers/not-implemented.js +21 -0
- package/dist/src/handlers/not-implemented.js.map +1 -0
- package/dist/src/handlers/notifications-handler.d.ts +2 -0
- package/dist/src/handlers/notifications-handler.js +62 -0
- package/dist/src/handlers/notifications-handler.js.map +1 -0
- package/dist/src/handlers/params.d.ts +11 -0
- package/dist/src/handlers/params.js +72 -0
- package/dist/src/handlers/params.js.map +1 -0
- package/dist/src/handlers/project-handler.d.ts +2 -0
- package/dist/src/handlers/project-handler.js +6 -0
- package/dist/src/handlers/project-handler.js.map +1 -0
- package/dist/src/handlers/thread-context-handler.d.ts +2 -0
- package/dist/src/handlers/thread-context-handler.js +211 -0
- package/dist/src/handlers/thread-context-handler.js.map +1 -0
- package/dist/src/handlers/workspace-handler.d.ts +2 -0
- package/dist/src/handlers/workspace-handler.js +101 -0
- package/dist/src/handlers/workspace-handler.js.map +1 -0
- package/dist/src/hooks/claude-approval-hook.d.ts +7 -0
- package/dist/src/hooks/claude-approval-hook.js +95 -0
- package/dist/src/hooks/claude-approval-hook.js.map +1 -0
- package/dist/src/hooks/gemini-approval-hook.d.ts +7 -0
- package/dist/src/hooks/gemini-approval-hook.js +113 -0
- package/dist/src/hooks/gemini-approval-hook.js.map +1 -0
- package/dist/src/index.d.ts +62 -0
- package/dist/src/index.js +65 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/keyring-secret-store.d.ts +36 -0
- package/dist/src/keyring-secret-store.js +70 -0
- package/dist/src/keyring-secret-store.js.map +1 -0
- package/dist/src/lock-file.d.ts +18 -0
- package/dist/src/lock-file.js +60 -0
- package/dist/src/lock-file.js.map +1 -0
- package/dist/src/logger.d.ts +28 -0
- package/dist/src/logger.js +99 -0
- package/dist/src/logger.js.map +1 -0
- package/dist/src/pairing/pairing-code-service.d.ts +45 -0
- package/dist/src/pairing/pairing-code-service.js +183 -0
- package/dist/src/pairing/pairing-code-service.js.map +1 -0
- package/dist/src/projects/project-registry.d.ts +14 -0
- package/dist/src/projects/project-registry.js +60 -0
- package/dist/src/projects/project-registry.js.map +1 -0
- package/dist/src/push/push-sender.d.ts +21 -0
- package/dist/src/push/push-sender.js +96 -0
- package/dist/src/push/push-sender.js.map +1 -0
- package/dist/src/push/push-service.d.ts +122 -0
- package/dist/src/push/push-service.js +260 -0
- package/dist/src/push/push-service.js.map +1 -0
- package/dist/src/qr.d.ts +17 -0
- package/dist/src/qr.js +31 -0
- package/dist/src/qr.js.map +1 -0
- package/dist/src/secret-store.d.ts +23 -0
- package/dist/src/secret-store.js +27 -0
- package/dist/src/secret-store.js.map +1 -0
- package/dist/src/secure-device-state.d.ts +16 -0
- package/dist/src/secure-device-state.js +63 -0
- package/dist/src/secure-device-state.js.map +1 -0
- package/dist/src/service-installer.d.ts +57 -0
- package/dist/src/service-installer.js +254 -0
- package/dist/src/service-installer.js.map +1 -0
- package/dist/src/session-state.d.ts +14 -0
- package/dist/src/session-state.js +19 -0
- package/dist/src/session-state.js.map +1 -0
- package/dist/src/transport/crypto.d.ts +43 -0
- package/dist/src/transport/crypto.js +78 -0
- package/dist/src/transport/crypto.js.map +1 -0
- package/dist/src/transport/lan-server.d.ts +33 -0
- package/dist/src/transport/lan-server.js +105 -0
- package/dist/src/transport/lan-server.js.map +1 -0
- package/dist/src/transport/local-hosts.d.ts +17 -0
- package/dist/src/transport/local-hosts.js +30 -0
- package/dist/src/transport/local-hosts.js.map +1 -0
- package/dist/src/transport/mdns-advertiser.d.ts +83 -0
- package/dist/src/transport/mdns-advertiser.js +282 -0
- package/dist/src/transport/mdns-advertiser.js.map +1 -0
- package/dist/src/transport/message-io.d.ts +33 -0
- package/dist/src/transport/message-io.js +87 -0
- package/dist/src/transport/message-io.js.map +1 -0
- package/dist/src/transport/outbound-log.d.ts +24 -0
- package/dist/src/transport/outbound-log.js +78 -0
- package/dist/src/transport/outbound-log.js.map +1 -0
- package/dist/src/transport/relay-client.d.ts +19 -0
- package/dist/src/transport/relay-client.js +27 -0
- package/dist/src/transport/relay-client.js.map +1 -0
- package/dist/src/transport/secure-channel.d.ts +33 -0
- package/dist/src/transport/secure-channel.js +81 -0
- package/dist/src/transport/secure-channel.js.map +1 -0
- package/dist/src/transport/server-handshake.d.ts +49 -0
- package/dist/src/transport/server-handshake.js +137 -0
- package/dist/src/transport/server-handshake.js.map +1 -0
- package/dist/src/transport/session-handler.d.ts +19 -0
- package/dist/src/transport/session-handler.js +134 -0
- package/dist/src/transport/session-handler.js.map +1 -0
- package/dist/src/transport/session-registry.d.ts +58 -0
- package/dist/src/transport/session-registry.js +91 -0
- package/dist/src/transport/session-registry.js.map +1 -0
- package/dist/src/transport/trust-store.d.ts +23 -0
- package/dist/src/transport/trust-store.js +33 -0
- package/dist/src/transport/trust-store.js.map +1 -0
- package/dist/src/transport/ws-adapter.d.ts +7 -0
- package/dist/src/transport/ws-adapter.js +16 -0
- package/dist/src/transport/ws-adapter.js.map +1 -0
- package/dist/src/version.d.ts +1 -0
- package/dist/src/version.js +13 -0
- package/dist/src/version.js.map +1 -0
- package/dist/src/workspace/browse-service.d.ts +10 -0
- package/dist/src/workspace/browse-service.js +97 -0
- package/dist/src/workspace/browse-service.js.map +1 -0
- package/dist/src/workspace/checkpoint-service.d.ts +21 -0
- package/dist/src/workspace/checkpoint-service.js +219 -0
- package/dist/src/workspace/checkpoint-service.js.map +1 -0
- package/dist/src/workspace/path-guard.d.ts +7 -0
- package/dist/src/workspace/path-guard.js +51 -0
- package/dist/src/workspace/path-guard.js.map +1 -0
- package/dist/src/workspace/workspace-service.d.ts +8 -0
- package/dist/src/workspace/workspace-service.js +111 -0
- package/dist/src/workspace/workspace-service.js.map +1 -0
- package/package.json +46 -0
- package/scripts/extract-gemini-hook.mjs +16 -0
- package/scripts/fake-approval-bridge.mjs +23 -0
- package/scripts/install-service-linux.sh +38 -0
- package/scripts/install-service-macos.sh +38 -0
- package/scripts/install-service-windows.ps1 +26 -0
- package/scripts/test-gemini-hook-e2e.mjs +168 -0
- 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>;
|