{
  "as_of": "2026-10-27",
  "runtime_version": {
    "name": "Google Gemini CLI",
    "package": "@google/gemini-cli",
    "pin": "0.65.0",
    "release_date": "2026-10-20",
    "channel": "latest stable npm dist-tag as observed; later preview/nightly builds exist and are excluded from this specification",
    "license": "Apache-2.0",
    "node_requirement": ">=20",
    "binary": "gemini",
    "refs": ["release", "npm_versions", "npm_metadata", "license"],
    "model_providers": [
      {
        "fact": "Documented authentication routes are Sign in with Google (Gemini Code Assist/eligible Google account), Gemini API key via GEMINI_API_KEY, and Vertex AI via ADC, service-account credentials, or Google Cloud API key. The CLI's documented model selection is for Gemini models; a general third-party model provider interface is not established by these sources.",
        "refs": ["auth", "cli_reference"]
      },
      {
        "fact": "Google AI Pro/Ultra subscription holders can sign in with the associated Google account. This is an interactive browser login performed before unattended runs; cached credentials can then be reused by headless mode. Organization accounts and some Code Assist licenses require a configured Google Cloud project. The documentation recommends an API key or Vertex AI for a headless environment that has not already authenticated.",
        "refs": ["auth", "quotas"]
      }
    ],
    "version_boundary": "All implementation claims below use v0.65.0 tagged documentation or source. The moving documentation site is an entry point, not evidence that a later main-branch feature is available in this stable version.",
    "refs_for_boundary": ["release", "headless", "policy"]
  },
  "invocation": {
    "status": "documented stable capability plus adapter design",
    "install": {
      "fact": "Provision the pinned @google/gemini-cli@0.65.0 package ahead of the job; npm metadata maps the gemini executable to bundle/gemini.js. Do not use the unpinned latest image or package for this specification.",
      "refs": ["npm_metadata", "sandbox"]
    },
    "template": {
      "type": "adapter template; shell parameters are supplied by the worker",
      "prompt_only": "cd -- \"$WORKDIR\" && gemini -e none --skip-trust --approval-mode=default --output-format=stream-json --model \"$MODEL\" -p \"$PROMPT\" </dev/null",
      "prompt_plus_file": "cd -- \"$WORKDIR\" && gemini -e none --skip-trust --approval-mode=default --output-format=stream-json --model \"$MODEL\" -p \"$PROMPT\" <\"$INPUT_FILE\"",
      "parameters": "WORKDIR is the mounted job workspace, MODEL is a deployment-selected supported model, PROMPT is the task text, and INPUT_FILE is an optional adapter-provided context file. stdin is appended to -p prompt text. Use process argv and cwd APIs instead of shell interpolation when implementing the adapter; the strings here illustrate the exact CLI flags and redirection.",
      "refs": ["cli_reference", "automation", "configuration", "trusted", "npm_metadata"]
    },
    "completion": [
      {
        "fact": "-p/--prompt forces non-interactive mode, and headless mode runs once and exits; non-TTY input also triggers it. --output-format supports text, json, and stream-json. The template omits --resume for a fresh session and uses -e none to disable extensions.",
        "refs": ["headless", "automation", "cli_reference", "configuration"]
      },
      {
        "fact": "--skip-trust suppresses the headless trust-dialog failure by trusting the workspace for that session. It therefore must be paired with an immutable higher-precedence system settings file, admin policy, and outer isolation before processing an untrusted repository. If folder trust is enabled and no bypass or trust record exists, headless exits with FatalUntrustedWorkspaceError.",
        "refs": ["trusted", "configuration", "policy", "errors"]
      },
      {
        "fact": "Normal default approval asks for mutating tools; in headless policy evaluation an ask_user decision becomes deny. A policy decision of allow executes without a person. The separate ask_user tool presents an interactive dialog, so the minimal policy denies that tool as well.",
        "refs": ["policy", "policy_source", "ask_user"]
      }
    ],
    "authentication_prerequisite": {
      "fact": "Before launch, provide a valid existing cached Sign in with Google credential in the isolated CLI profile, or configure the documented Gemini API key/Vertex AI environment route. The initial Google subscription login itself needs a browser and user action; no documented non-interactive first-time subscription provisioning method was found. The tagged code also recognizes GOOGLE_GENAI_USE_GCA=true when selecting the Google-account auth type, but that variable does not create a credential.",
      "refs": ["auth", "content_generator", "noninteractive_auth"]
    },
    "exit_and_timeout": [
      {
        "fact": "Headless reference lists 0 success, 1 general/API failure, 42 input error, and 53 turn limit. Tagged error classes additionally define 41 auth, 44 sandbox, 52 config, 54 fatal tool, 55 untrusted workspace, and 130 cancellation. Do not interpret every nonzero as one failure type.",
        "refs": ["headless", "errors"]
      },
      {
        "fact": "stream-json has a final result event with status success/error and optional error/stats. Tagged error handling can emit a result with error status and metrics before exiting, but a killed process or crash is not guaranteed to emit one. The JSON error path can emit error without stats.",
        "refs": ["output_types", "cli_errors", "json_formatter"]
      },
      {
        "type": "adapter_design",
        "action": "Capture stdout and stderr separately, parse newline-delimited events, require both process exit 0 and a success result for success, and classify a nonzero exit, malformed/truncated stream, or missing result as failure with usage incomplete. Run the process in a supervised cgroup/container or VM with a deployment-set wall-clock deadline; terminate the process group at deadline and retain partial output. Treat --model and model.maxSessionTurns as model/turn choices, not as a wall-clock or spend cap.",
        "refs": ["headless", "output_types", "configuration", "noninteractive_cli"]
      }
    ]
  },
  "confinement": {
    "built_in_boundaries": [
      {
        "fact": "The built-in file tools are documented as operating within rootDirectory (cwd/workspace root); shell commands run via bash -c on Unix or PowerShell on Windows and can execute arbitrary commands. Without a sandbox, policy controls whether tools are offered/approved, but is not an OS filesystem or network boundary. --include-directories can extend the workspace and is omitted here.",
        "refs": ["filesystem", "shell", "cli_reference", "policy"]
      },
      {
        "fact": "Gemini CLI offers -s/--sandbox, GEMINI_SANDBOX, and tools.sandbox settings. The tagged sandbox guide describes macOS Seatbelt's default permissive-open profile as restricting writes while allowing broad reads and network; Docker/Podman mounts the current workspace at the same absolute path in a sandbox container. The configuration reference calls tools.sandbox a legacy full-process sandbox. These mechanisms have different scopes and mount/network behavior; a worktree is a git workspace feature, not isolation.",
        "refs": ["sandbox", "configuration", "cli_reference"]
      },
      {
        "fact": "Network defaults have an apparent conflict/scope mismatch in v0.65.0: the settings reference lists tools.sandboxNetworkAccess default false, while the legacy sandbox loader initializes networkAccess=true and config.ts ORs that value with the setting. The Seatbelt guide also says its default profile allows network. Therefore neither a default network-deny claim nor a default network-allow claim is safe across all modes; explicitly enforce egress outside the CLI and test the selected mechanism.",
        "refs": ["configuration", "sandbox_config", "cli_config", "sandbox"]
      },
      {
        "fact": "The tools list includes web_fetch and google_web_search, and configured MCP servers can add tools; extensions, hooks, and remote A2A agents can add execution or network paths. Hooks are enabled by default in the tagged configuration; local and remote subagents are enabled by default. Policy rules govern tool calls, not a documented complete mediation of every process-side effect.",
        "refs": ["tools_reference", "configuration", "subagents", "remote_agents", "policy"]
      }
    ],
    "proposed_outer_boundary": {
      "type": "adapter_design; not a tested Gemini CLI feature",
      "design": "Run the entire pinned CLI process and all descendants in an unprivileged container or VM with an immutable root image, read-only policy/system-settings mounts, one writable job workspace, a separate minimal CLI-auth state mount if using cached Google login, no host Docker socket, no other host filesystem mounts, resource limits, and a supervisor that kills all descendants. A worktree or tool-only sandbox may still be useful for workflow separation, but does not replace this boundary.",
      "egress": "Provide an explicit controlled HTTPS egress route for online model/auth traffic: the deployment-selected Gemini API, Vertex AI, or Google Code Assist endpoint set plus required credential-refresh endpoints. Deny all other outbound destinations at the container/VM network layer, including generic web/MCP/A2A/extension endpoints, unless separately approved. For the API-key route, the tagged logging generator identifies generativelanguage.googleapis.com:443 as its default Gemini API endpoint; Google-login and Vertex routes require their own verified endpoint allowlists. Keep local telemetry on a mounted file or approved collector route. Network-none cannot serve an online model unless an explicit host-side inference proxy is provided.",
      "refs": ["logging_generator", "auth", "remote_agents", "sandbox", "configuration", "telemetry"]
    }
  },
  "metering": {
    "stdout_schemas": [
      {
        "fact": "--output-format=json returns one object with optional session_id, response, stats, error, warnings. stats is SessionMetrics: models[model].api has totalRequests,totalErrors,totalLatencyMs, optional errorsByType; models[model].tokens has input,prompt,candidates,total,cached,thoughts,tool; models[model].roles may break those metrics out by LLM role. stats.tools has totalCalls,totalSuccess,totalFail,totalDurationMs,totalDecisions,byName; stats.files has totalLinesAdded,totalLinesRemoved.",
        "refs": ["headless", "json_formatter", "output_types", "ui_telemetry"]
      },
      {
        "fact": "--output-format=stream-json emits JSONL init/message/tool_use/tool_result/error/result events. init has session_id and model. The final result.stats contains total_tokens,input_tokens,output_tokens,cached,input,duration_ms,tool_calls and models[model] with total_tokens,input_tokens,output_tokens,cached,input. This stream is not a per-request token feed; it omits explicit thoughts/tool-token and role breakdown fields in its result schema.",
        "refs": ["headless", "output_types", "stream_formatter"]
      }
    ],
    "accounting_semantics": [
      {
        "fact": "Tagged aggregation adds each successful API-response usageMetadata to model totals. prompt is promptTokenCount, candidates is candidatesTokenCount, total is totalTokenCount, cached is cachedContentTokenCount, thoughts is thoughtsTokenCount, tool is toolUsePromptTokenCount, and input is max(0,prompt-cached). Stream input_tokens maps to prompt, output_tokens to candidates; cached is a subset of prompt and input is uncached prompt. Do not add these overlapping categories to total_tokens.",
        "refs": ["ui_telemetry", "telemetry_types", "stream_formatter"]
      },
      {
        "fact": "The logging generator records one successful event per completed stream using the last usageMetadata seen, not one event per chunk. Missing usageMetadata becomes zero in ApiResponseEvent. Failed or aborted streams do not emit successful token usage; errors increment request/error counts, and aborted requests are skipped as API errors. Thus stdout totals can undercount provider-billed usage from failures, cancellations, or missing metadata.",
        "refs": ["logging_generator", "telemetry_types", "ui_telemetry"]
      },
      {
        "fact": "The per-request gemini_cli.api_response telemetry log includes model, prompt_id, role when present, duration and input/output/cached/thought/tool/total token counts; it is a separate optional local/OTLP channel, disabled by default. API errors have no token counts in the documented log schema. It is more granular than stdout, but is still subject to missing provider usage and lacks a documented stable request UUID in the listed log fields.",
        "refs": ["telemetry", "telemetry_types", "logging_generator"]
      },
      {
        "fact": "The LLM role enum distinguishes main, subagent, utility_compressor, utility_summarizer, utility_router and other auxiliary roles. Local subagents create a GeminiChat with subagent role; their calls use the common logging generator and global UiTelemetryService, so the tagged code indicates their successful usage contributes to the process aggregate. Compression explicitly makes utility_compressor calls. Remote A2A child-side model usage is not shown as a guaranteed part of Gemini CLI's stdout totals.",
        "refs": ["llm_roles", "local_executor", "logging_generator", "loggers", "ui_telemetry", "compression", "remote_agents"]
      },
      {
        "fact": "On resume, UiTelemetryService.hydrate rebuilds model token and tool totals from conversation history; a resumed output can include prior work. Its hydration code restores only available recorded messages and omits some live metrics such as role and latency breakdowns. Fresh sessions are therefore the recommended unit for this adapter.",
        "refs": ["ui_telemetry", "cli_reference"]
      }
    ],
    "adapter_capture": {
      "type": "adapter_design",
      "canonical": "For the minimal recipe, persist each raw stream-json event and take token totals once from the sole final result.stats for a fresh process/session. Do not sum model entries on top of total_tokens, do not sum cached or thoughts into total_tokens, and do not add OTLP api_response counts to stdout totals. If detailed role/thought/tool categories are required, choose json mode for that run or ingest optional per-request local telemetry; record the capture mode with the run.",
      "deduplication": "Key the worker run by an adapter-assigned run ID plus CLI session_id; accept one terminal result per process. If consuming OTLP, keep it as a separate ledger and deduplicate only identical collector deliveries with a receiver-assigned event identity, not merely by prompt_id (multiple requests/retries can share a prompt). Reconcile its sum to the CLI aggregate rather than adding both. If no terminal result exists, mark usage incomplete; never replace unknown counts with zero.",
      "cost": "Use model-specific and auth-route-specific external tariff data, if available, to calculate a clearly labeled estimate from uncached prompt, cached prompt, output and applicable reasoning conventions. The CLI JSON/stream-json schemas contain token counts but no invoice amount; Google subscription login is described as fixed-price quota, while API-key/Vertex pay-as-you-go pricing differs. Do not label a token-derived estimate as a provider bill.",
      "limits": "Set external wall-clock, CPU/memory and egress/request limits. model.maxSessionTurns and general.maxAttempts are documented turn/retry controls, not a documented hard per-run token or currency ceiling. No stable built-in whole-run spend cap or exact accounting for failed provider attempts was established.",
      "refs": ["output_types", "stream_formatter", "ui_telemetry", "telemetry", "telemetry_types", "logging_generator", "configuration", "quotas"]
    }
  },
  "tool_policy": {
    "policy_location_and_precedence": {
      "fact": "Install TOML in the standard admin policy directory (/etc/gemini-cli/policies on Linux) owned by root and not group/other-writable, with the CLI running as a different unprivileged user. Admin policy tier outranks user/default policy; within a tier higher numeric priority wins. Workspace policy files are documented as currently non-functional. A global deny rule excludes denied tools from model context unless a higher-priority allow matches. In headless mode ask_user decisions become deny.",
      "refs": ["policy", "policy_source"]
    },
    "minimal_system_settings_example": {
      "type": "documented JSON syntax assembled into an adapter example; place in immutable /etc/gemini-cli/settings.json inside the proposed image",
      "json": {
        "general": {"enableAutoUpdate": false},
        "tools": {"core": ["read_file", "read_many_files", "list_directory", "glob", "grep_search", "write_file", "replace"]},
        "experimental": {"enableAgents": false},
        "hooksConfig": {"enabled": false},
        "skills": {"enabled": false},
        "admin": {"extensions": {"enabled": false}, "mcp": {"enabled": false}}
      },
      "refs": ["configuration", "tools_reference", "subagents", "shell"]
    },
    "minimal_admin_policy_example": {
      "type": "documented TOML syntax assembled into an adapter example; place in immutable root-owned admin policy directory",
      "toml": "[[rule]]\ntoolName = \"*\"\ndecision = \"deny\"\npriority = 100\n\n[[rule]]\ntoolName = [\"read_file\", \"read_many_files\", \"list_directory\", \"glob\", \"grep_search\", \"write_file\", \"replace\"]\ndecision = \"allow\"\npriority = 200\n",
      "refs": ["policy", "tools_reference"]
    },
    "interpretation": [
      {
        "fact": "tools.core is an allowlist for all built-in tools, not a shell-only allowlist. The example offers file reads/search and direct file edits, with no shell, web, ask_user, plan, or agent invocation. The policy's catch-all deny also covers MCP tool names. Explicit allow at priority 200 beats the catch-all deny at 100 within the same admin tier; neither automatic approval nor deprecated --allowed-tools is needed.",
        "refs": ["shell", "policy", "tools_reference", "cli_reference"]
      },
      {
        "fact": "--approval-mode=default is used so an omitted mutating tool remains denied in headless mode, while an explicit allow executes. auto_edit and yolo add broad automatic approvals; yolo allows unmatched tools unless a higher-priority policy denies them. Tagged source also has exceptional hard safety checks (for example protected build-file modifications may be denied headlessly despite an allow), so the acceptance plan must exercise the exact intended edit paths.",
        "refs": ["cli_reference", "policy", "policy_source"]
      },
      {
        "fact": "The shell policy syntax, if shell is later needed, is [[rule]] with toolName=\"run_shell_command\", commandPrefix or commandRegex, decision, and priority; commandPrefix is prefix matching, shell chains are decomposed, and redirection can require explicit allowRedirection. A prefix rule alone is not an OS command or filesystem boundary. The minimal recipe keeps shell denied.",
        "refs": ["policy", "shell", "policy_source"]
      }
    ],
    "parallel_children_addition": {
      "type": "future adapter design, outside the minimal recipe",
      "requirements": "Enable experimental.enableAgents, explicitly select/define child agents and their tool sets, add higher-priority allow rules for each approved virtual agent tool name and subagent-scoped tools, impose per-child maxTurns/maxTimeMinutes where supported, and test inherited policy and outer container limits. Local subagents have independent context and cannot recursively invoke other subagents; the tagged scheduler batches eligible parallel tool calls and executes a batch with Promise.all. Remote A2A agents require separate network and usage accounting. Do not assume a documented fixed concurrency cap or remote child token inclusion.",
      "refs": ["subagents", "policy", "scheduler", "tool_utils", "remote_agents", "ui_telemetry"]
    }
  },
  "integration_gaps": [
    {"gap": "The release-tagged settings reference and legacy sandbox loader disagree in apparent network default/scope; networkAccess cannot be treated as denied by default. The exact behavior of every sandbox flavor and model-auth route remains to be acceptance-tested.", "refs": ["configuration", "sandbox_config", "cli_config", "sandbox"]},
    {"gap": "No documented first-time headless Google subscription login, stable credential-export contract, or guaranteed unattended refresh behavior was found; provision a legitimate cached login interactively before jobs or choose the documented API-key/Vertex route.", "refs": ["auth", "noninteractive_auth"]},
    {"gap": "stdout offers aggregate token totals, not per-request usage; failed/aborted calls or responses without usage metadata can leave unknown billable usage. No invoice amount, per-run token/currency cap, or guaranteed terminal stats after forced kill was found.", "refs": ["output_types", "logging_generator", "telemetry_types", "cli_errors", "configuration", "quotas"]},
    {"gap": "No guaranteed CLI meter for remote A2A agent providers or stable request UUID for OTLP deduplication was established. Parallel-child usage attribution and concurrency under the proposed policy need version-pinned tests before enabling children.", "refs": ["remote_agents", "telemetry", "subagents", "scheduler"]},
    {"gap": "The tagged subagent guide contains older sample policy syntax ([[rules]]/action) in one section, whereas the dedicated tagged policy reference specifies [[rule]]/decision. The example here follows the dedicated policy reference; validate it against 0.65.0 before deployment.", "refs": ["subagents", "policy"]}
  ],
  "verification_plan": {
    "type": "proposed acceptance checklist; no runtime execution claimed",
    "checks": [
      "In a disposable image, assert gemini --version is 0.65.0, load only the immutable system settings and admin TOML, and verify a fresh headless prompt produces one init and one terminal result with expected exit/status.",
      "Try the allowed read/write/replace tools, denied shell/web/ask_user/MCP/agent tools, an attempted build-file edit, an outside-workspace file path and a project-supplied settings/hook/extension. Verify host files and denied egress remain untouched.",
      "With a legitimate pre-provisioned authentication route, compare stream-json result totals to json SessionMetrics in separate fresh test runs; exercise cache, tool use, a local child if later enabled, compression, retry, provider error, resume, and forced timeout. Confirm when stats disappear and that the adapter marks unknown usage incomplete.",
      "Trace DNS/HTTPS during an actual inference and auth refresh, then enforce the approved endpoint route at the outer network layer; confirm web/MCP/remote-child attempts are denied and online inference still succeeds.",
      "Confirm the supervisor kills descendants and that only the job workspace and approved CLI state mounts can change."
    ],
    "refs": ["npm_metadata", "headless", "policy", "configuration", "output_types", "ui_telemetry", "logging_generator", "sandbox", "auth"]
  },
  "sources": {
    "release": "https://github.com/google-gemini/gemini-cli/releases/tag/v0.65.0",
    "npm_versions": "https://www.npmjs.com/package/@google/gemini-cli?activeTab=versions",
    "npm_metadata": "https://registry.npmjs.org/@google%2Fgemini-cli/0.65.0",
    "license": "https://github.com/google-gemini/gemini-cli/blob/v0.65.0/LICENSE",
    "headless": "https://github.com/google-gemini/gemini-cli/blob/v0.65.0/docs/cli/headless.md",
    "cli_reference": "https://github.com/google-gemini/gemini-cli/blob/v0.65.0/docs/cli/cli-reference.md",
    "automation": "https://github.com/google-gemini/gemini-cli/blob/v0.65.0/docs/cli/tutorials/automation.md",
    "auth": "https://github.com/google-gemini/gemini-cli/blob/v0.65.0/docs/get-started/authentication.mdx",
    "quotas": "https://github.com/google-gemini/gemini-cli/blob/v0.65.0/docs/resources/quota-and-pricing.md",
    "trusted": "https://github.com/google-gemini/gemini-cli/blob/v0.65.0/docs/cli/trusted-folders.md",
    "policy": "https://github.com/google-gemini/gemini-cli/blob/v0.65.0/docs/reference/policy-engine.md",
    "policy_source": "https://github.com/google-gemini/gemini-cli/blob/v0.65.0/packages/core/src/policy/policy-engine.ts",
    "configuration": "https://github.com/google-gemini/gemini-cli/blob/v0.65.0/docs/reference/configuration.md",
    "sandbox": "https://github.com/google-gemini/gemini-cli/blob/v0.65.0/docs/cli/sandbox.md",
    "sandbox_config": "https://github.com/google-gemini/gemini-cli/blob/v0.65.0/packages/cli/src/config/sandboxConfig.ts",
    "cli_config": "https://github.com/google-gemini/gemini-cli/blob/v0.65.0/packages/cli/src/config/config.ts",
    "filesystem": "https://github.com/google-gemini/gemini-cli/blob/v0.65.0/docs/tools/file-system.md",
    "shell": "https://github.com/google-gemini/gemini-cli/blob/v0.65.0/docs/tools/shell.md",
    "tools_reference": "https://github.com/google-gemini/gemini-cli/blob/v0.65.0/docs/reference/tools.md",
    "ask_user": "https://github.com/google-gemini/gemini-cli/blob/v0.65.0/docs/tools/ask-user.md",
    "subagents": "https://github.com/google-gemini/gemini-cli/blob/v0.65.0/docs/core/subagents.md",
    "remote_agents": "https://github.com/google-gemini/gemini-cli/blob/v0.65.0/docs/core/remote-agents.md",
    "scheduler": "https://github.com/google-gemini/gemini-cli/blob/v0.65.0/packages/core/src/scheduler/scheduler.ts",
    "tool_utils": "https://github.com/google-gemini/gemini-cli/blob/v0.65.0/packages/core/src/utils/tool-utils.ts",
    "local_executor": "https://github.com/google-gemini/gemini-cli/blob/v0.65.0/packages/core/src/agents/local-executor.ts",
    "content_generator": "https://github.com/google-gemini/gemini-cli/blob/v0.65.0/packages/core/src/core/contentGenerator.ts",
    "noninteractive_auth": "https://github.com/google-gemini/gemini-cli/blob/v0.65.0/packages/cli/src/validateNonInterActiveAuth.ts",
    "noninteractive_cli": "https://github.com/google-gemini/gemini-cli/blob/v0.65.0/packages/cli/src/nonInteractiveCli.ts",
    "errors": "https://github.com/google-gemini/gemini-cli/blob/v0.65.0/packages/core/src/utils/errors.ts",
    "cli_errors": "https://github.com/google-gemini/gemini-cli/blob/v0.65.0/packages/cli/src/utils/errors.ts",
    "output_types": "https://github.com/google-gemini/gemini-cli/blob/v0.65.0/packages/core/src/output/types.ts",
    "json_formatter": "https://github.com/google-gemini/gemini-cli/blob/v0.65.0/packages/core/src/output/json-formatter.ts",
    "stream_formatter": "https://github.com/google-gemini/gemini-cli/blob/v0.65.0/packages/core/src/output/stream-json-formatter.ts",
    "ui_telemetry": "https://github.com/google-gemini/gemini-cli/blob/v0.65.0/packages/core/src/telemetry/uiTelemetry.ts",
    "telemetry_types": "https://github.com/google-gemini/gemini-cli/blob/v0.65.0/packages/core/src/telemetry/types.ts",
    "llm_roles": "https://github.com/google-gemini/gemini-cli/blob/v0.65.0/packages/core/src/telemetry/llmRole.ts",
    "logging_generator": "https://github.com/google-gemini/gemini-cli/blob/v0.65.0/packages/core/src/core/loggingContentGenerator.ts",
    "loggers": "https://github.com/google-gemini/gemini-cli/blob/v0.65.0/packages/core/src/telemetry/loggers.ts",
    "telemetry": "https://github.com/google-gemini/gemini-cli/blob/v0.65.0/docs/cli/telemetry.md",
    "compression": "https://github.com/google-gemini/gemini-cli/blob/v0.65.0/packages/core/src/context/chatCompressionService.ts"
  }
}
