WikifitaGitHub live67e8de5
outro · sdk-test/sdk-test-decompiled-patterns

Decompiled Code Patterns — 10 Architectural Patterns from 3305 Functions

Architectural patterns extracted from Ghidra decompilation of the agy Go binary: Cascade Architecture, Trajectory Persistence, Battle Mode, Subagent Architecture, MCP Integration, Browser Automation, Knowledge Management, CEL Enforcement, Feature Flags, and Hardcoded Permissions

Baixar raw

Decompiled Code Patterns — 10 Architectural Patterns from 3305 Functions

Overview

Systematic analysis of 3,305 decompiled functions from the agy Go binary (language_server_hub) reveals 10 distinct architectural patterns. These patterns define the internal structure of the JETSKY platform and reveal how Google's agent runtime is engineered at scale.

The binary's internal package root is github.com/anthropics/jetsky/internal/.... All function names, package paths, and structural relationships were extracted via Ghidra MCP decompilation.

mindmap
  root((JETSKY Binary<br/>3305 Functions))
    Cascade Architecture
      CascadeManager
      Trajectory orchestration
      Battle Mode
    Trajectory Persistence
      Serialization to disk
      Resume from saved state
      ProtoStore
    Battle Mode
      Multi-model A/B
      Winner selection
      Step replacement
    Subagent Architecture
      InvokeSubagentHandler
      Task mode
      Inbox management
    MCP Integration
      Stdio + HTTP transports
      System MCP
      Tool routing
    Browser Automation
      CDP client
      Screenshot capture
      JS execution
    Knowledge Management
      Knowledge Items
      Document manager
      Web scraping
    CEL Enforcement
      Expression evaluation
      Request authorization
      Sandbox proxy
    Feature Flags
      UnleashWrapper
      Experiment configs
      Gradual rollout
    Hardcoded Permissions
      getHardcodedGrants
      Access control
      Permission system

Pattern 1: Cascade Architecture

What Is a Cascade?

The "cascade" is the core agent execution loop. It is the fundamental unit of agent computation in JETSKY. A cascade manages a trajectory (conversation session), handles model calls, tool execution, and state transitions.

Key Functions

FunctionPackageSizePurpose
CascadeManager.Newcortex~8KBCreates the cascade manager
CascadeManager.EndBattleModecortexEnds battle mode for a cascade
CascadeManager.applyBattleModeWinnercortexApplies winning model from A/B test
CascadeManager.ensureTrajectoryLoadedcortexLoads trajectory from disk if needed
CascadeManager.getBaseTrajectorycortexGets the root trajectory
CascadeManager.getTrajectoryMetadatacortexGets trajectory metadata
CascadeManager.normalizeWorkspaceURIcortexNormalizes workspace paths
Server.StartCascadelanguage_serverStarts a new cascade on the server

Architecture

graph TB
    subgraph "CascadeManager"
        CM["CascadeManager<br/>Orchestrates all cascades"]
        CM -->|"manages"| C1["Cascade 1<br/>trajectory: main"]
        CM -->|"manages"| C2["Cascade 2<br/>trajectory: subagent-1"]
        CM -->|"manages"| C3["Cascade 3<br/>trajectory: subagent-2"]
    end

    subgraph "Per-Cascade"
        direction TB
        Traj["Trajectory<br/>(conversation state)"]
        Exec["CascadeExecutor<br/>(execution engine)"]
        Gen["Generator<br/>(model API calls)"]
        Tools["Tool Manager<br/>(tool execution)"]
        
        Traj --> Exec
        Exec --> Gen
        Exec --> Tools
    end

    C1 --> Traj
    C2 --> Traj
    C3 --> Traj

    style CM fill:#2a4a6b

Relationship to SDK

The SDK's LocalConnection maps to a single cascade. The cascade_id in HarnessConfig identifies which cascade the SDK is connected to. Subagents create additional cascades tracked by the CascadeManager.

Pattern 2: Trajectory Persistence

What Is a Trajectory?

A trajectory is the serialized state of a conversation -- including all steps, tool calls, model responses, and metadata. It can be saved to disk and resumed later.

Key Functions

FunctionPackagePurpose
protoTrajectorytrajectoryConverts internal trajectory to protobuf
StepHeaderMetadatatrajectoryMetadata header for each step
StepHeaderTaskDetailstrajectoryTask-specific step details
ChatModelHeadertrajectoryModel information header
GeneratorMetadataHeadertrajectoryGenerator metadata
PlannerResponseStepViewtrajectoryPlanner response visualization
processPendingUpdatestrajProcesses queued trajectory updates
startCommitWorkertrajBackground trajectory persistence worker
ManagertrajectorystoreTrajectory store manager
ProtoStoretrajectorystoreProtobuf-based storage backend

Persistence Flow

sequenceDiagram
    participant Agent as Agent Loop
    participant Store as TrajectoryStore
    participant Worker as Commit Worker
    participant Disk as Filesystem

    Agent->>Store: Add step to trajectory
    Store->>Store: Queue pending update
    
    Worker->>Store: Poll for pending updates
    Store-->>Worker: Batch of updates
    Worker->>Worker: Serialize to protobuf
    Worker->>Disk: Write trajectory file
    
    Note over Disk: Path: ~/.gemini/antigravity/<session-id>/trajectory.pb
    
    Agent->>Store: Session resume requested
    Store->>Disk: Read trajectory file
    Disk-->>Store: Protobuf bytes
    Store->>Store: Deserialize trajectory
    Store-->>Agent: Restored trajectory state

SDK Integration

The SDK can resume sessions via the initial_trajectory field in HarnessConfig:

config = LocalAgentConfig(
    conversation_id="previous-session-id",
    save_dir="/path/to/saved/trajectory",
)

The harness reads the saved trajectory from save_dir and passes it as initial_trajectory bytes in the handshake.

Pattern 3: Battle Mode

What Is Battle Mode?

Battle Mode is an internal A/B testing mechanism that runs multiple models in parallel on the same input and compares their outputs. The winning model's output is used.

Key Functions

FunctionPackagePurpose
CascadeManager.EndBattleModecortexEnds battle mode for a cascade
CascadeManager.applyBattleModeWinnercortexApplies the winning model's output
trajectoryWithReplacerbattlemodeStep replacement logic
trajectoryWithReplacer.clonebattlemodeClones trajectory for parallel execution
Step status indexingbattlemodeTracks step completion across models

Architecture

graph TB
    Input["User Input"] --> BM["Battle Mode Manager"]
    
    BM -->|"Clone trajectory"| M1["Model A<br/>(e.g., gemini-2.5-pro)"]
    BM -->|"Clone trajectory"| M2["Model B<br/>(e.g., gemini-3.5-flash)"]
    BM -->|"Clone trajectory"| M3["Model C<br/>(e.g., deepseek-v4)"]
    
    M1 -->|"Response A"| Judge["Winner Selection<br/>(quality metric)"]
    M2 -->|"Response B"| Judge
    M3 -->|"Response C"| Judge
    
    Judge -->|"Winner"| Apply["applyBattleModeWinner()<br/>Replace trajectory steps"]
    Apply --> Output["Final Response"]
    
    style BM fill:#6b2a4a
    style Judge fill:#4a6b2a

How It Works

  1. Clone: The current trajectory is cloned for each competing model
  2. Execute: All models process the same input in parallel
  3. Compare: A quality metric (human feedback, automated scoring, or heuristic) evaluates outputs
  4. Select: The winning model's trajectory replaces the original
  5. Discard: Losing trajectories are discarded

This is likely used for internal quality benchmarking and model selection optimization.

Pattern 4: Subagent Architecture

Key Functions

FunctionPackagePurpose
InvokeSubagentHandler.HandlehandlersMain subagent invocation
InvokeSubagentHandler.handleTaskModehandlersTask-mode subagent
DefineSubagentSubHandler.HandlehandlersSubagent definition
ManageInboxSubHandler.handleListhandlersInbox management
ConversationSubagentManagersubagentSubagent lifecycle manager
SubagentUpdateForwarderagent_state_componentForwards updates from subagent to parent
mergeParallelArraysagent_state_componentMerges parallel subagent results
mergeTrajectoryUpdatesagent_state_componentCombines trajectory state from subagents

Subagent Invocation Flow

sequenceDiagram
    participant Parent as Parent Agent
    participant Handler as InvokeSubagentHandler
    participant CM as CascadeManager
    participant Sub as Subagent Cascade

    Parent->>Handler: Tool call: start_subagent(task="...")
    Handler->>Handler: handleTaskMode(task)
    Handler->>CM: Create new cascade
    CM->>Sub: Initialize subagent trajectory
    
    loop Subagent execution
        Sub->>Sub: Process task
        Sub->>Handler: SubagentUpdateForwarder
        Handler->>Parent: Forward updates to parent trajectory
    end

    Sub->>Handler: Task complete
    Handler->>Parent: Return subagent result
    CM->>CM: Clean up subagent cascade

Parent-Child Relationship

  • Parent trajectories track subagent IDs in _active_subagent_ids
  • Subagent trajectories have unique trajectory_id values
  • The connection only goes idle when ALL trajectories (parent + subagents) complete
  • mergeParallelArrays combines results when multiple subagents run in parallel

Pattern 5: MCP Integration

Key Functions

FunctionPackagePurpose
setUpMcpManagerlanguage_serverInitialize MCP manager
setUpSystemMcpManagerlanguage_serverInitialize system-level MCP
McpServersSection.ContentmixinsSystem prompt section for MCP
MCP server managementmcp / mcpcoreMCP protocol implementation

Transport Support

graph LR
    subgraph "MCP Manager"
        MM["McpManager"]
    end

    subgraph "Stdio Transport"
        ST["Subprocess<br/>stdin/stdout<br/>JSON-RPC 2.0"]
    end

    subgraph "HTTP Transport"
        HT["HTTP Client<br/>Streamable HTTP<br/>SSE support"]
    end

    subgraph "System MCP"
        SM["Built-in MCP servers<br/>managed by harness"]
    end

    MM --> ST
    MM --> HT
    MM --> SM
    ST -->|"tool call"| Ext1["External MCP Server 1"]
    HT -->|"tool call"| Ext2["External MCP Server 2"]
    SM -->|"tool call"| Built["Built-in Tools"]

System Prompt Injection

MCP servers are injected into the system prompt via McpServersSection:

## Available MCP Servers

### server-name
Tools:
- tool1: Description of tool1
- tool2: Description of tool2

This is generated by the mixins.McpServersSection.Content function and appended to the system instructions.

Pattern 6: Browser Automation

Key Functions

FunctionPackagePurpose
CommonBrowserHandler.handleInternalbrowserMain browser operation handler
BrowserSubagentHandler.internalHandlebrowserBrowser subagent handler
BrowserSubagentHandler.handleStopRecordingbrowserStop recording
Operator.CaptureScreenshotbrowserScreenshot capture
BrowserPage.evaluateCDPbrowserabstractionsCDP command execution
captureContextsMetadatabrowserabstractionsCapture page context
NewCaptureBrowserScreenshotHandlerbrowserScreenshot handler factory
NewCaptureBrowserConsoleLogsHandlerbrowserConsole log handler
NewListBrowserPagesHandlerbrowserPage enumeration
NewReadBrowserPageHandlerbrowserPage content reader
NewBrowserScrollHandlerbrowserScroll control
executeJavaScriptActionbrowserJS execution
mouseWheelAction / pressKeyActionbrowserInput simulation

CDP Integration

graph TB
    subgraph "Browser Subsystem"
        BH["Browser Handler"]
        BP["Browser Page"]
        CDP["CDP Client"]
    end

    subgraph "Chrome DevTools Protocol"
        Screenshot["Page.captureScreenshot"]
        DOM["DOM.getDocument"]
        JS["Runtime.evaluate"]
        Input["Input.dispatchMouseEvent<br/>Input.dispatchKeyEvent"]
    end

    subgraph "Output"
        PNG["Screenshot PNG"]
        Content["Page Content"]
        Console["Console Logs"]
    end

    BH --> BP
    BP --> CDP
    CDP --> Screenshot
    CDP --> DOM
    CDP --> JS
    CDP --> Input
    Screenshot --> PNG
    DOM --> Content
    JS --> Content

Browser Capabilities

CapabilityFunctionCDP Method
ScreenshotCaptureScreenshotPage.captureScreenshot
DOM ReadingReadBrowserPageDOM.getDocument
JS ExecutionexecuteJavaScriptActionRuntime.evaluate
Mouse EventsmouseWheelActionInput.dispatchMouseEvent
Keyboard EventspressKeyActionInput.dispatchKeyEvent
Console LogsCaptureBrowserConsoleLogsRuntime.consoleAPICalled
Page NavigationListBrowserPagesTarget.getTargets

Media Output

Screenshots are converted to protobuf format:

  • imageToPNGImageProto -- converts raw screenshot to PNG protobuf
  • makeClickFeedbackPNG -- generates visual feedback for clicks
  • makeDragFeedbackPNGs -- generates visual feedback for drag operations

Pattern 7: Knowledge Management

Key Functions

FunctionPackagePurpose
localManager.scanKILockedknowledgeScan Knowledge Items
Document managementdocument / documentmanagerDocument lifecycle
Document parsingdocDocument content extraction
Notebook supportnotebookJupyter/notebook integration
Web scrapingweb_scrapingWeb content extraction

Knowledge Item System

graph TB
    subgraph "Knowledge Sources"
        Files["Local Files"]
        Web["Web Pages"]
        Docs["Documents"]
        NB["Notebooks"]
    end

    subgraph "Knowledge Manager"
        KM["localManager"]
        KI["Knowledge Items<br/>(structured memory)"]
        Index["Index<br/>(searchable)"]
    end

    subgraph "Agent Access"
        Agent["Agent Loop"]
        Context["Context Injection"]
    end

    Files --> KM
    Web --> KM
    Docs --> KM
    NB --> KM
    
    KM --> KI
    KI --> Index
    Index --> Agent
    Agent --> Context

The Knowledge system provides structured memory for agents. Knowledge Items are scanned, indexed, and injected into the agent's context when relevant.

Pattern 8: CEL Enforcement

Key Functions

FunctionPackagePurpose
celEnforcer.IsRequestAllowedsandboxproxyCEL-based request authorization

What Is CEL?

CEL (Common Expression Language) is Google's expression language for policy evaluation. It is used in JETSKY for fine-grained request authorization.

flowchart TD
    Req["Incoming Request"] --> CEL["CEL Enforcer"]
    CEL --> Eval{"Evaluate CEL<br/>Expressions"}
    Eval -->|"Allow"| Process["Process Request"]
    Eval -->|"Deny"| Reject["Reject with Error"]
    Eval -->|"Condition"| Check["Check Additional<br/>Conditions"]
    Check -->|"Pass"| Process
    Check -->|"Fail"| Reject

Use Cases

  • Per-user rate limiting: request.user.rate_limit < 100
  • Feature gating: request.feature in user.enabled_features
  • Geographic restrictions: request.geo in allowed_regions
  • Resource quotas: request.tokens + user.used_tokens < user.quota

Integration with Sandbox Proxy

The CEL enforcer sits in the sandboxproxy layer, intercepting all requests before they reach the backend:

sequenceDiagram
    participant Client as Client Request
    participant Proxy as Sandbox Proxy
    participant CEL as CEL Enforcer
    participant Backend as Backend Service

    Client->>Proxy: gRPC Request
    Proxy->>CEL: IsRequestAllowed(request)
    
    alt Allowed
        CEL-->>Proxy: true
        Proxy->>Backend: Forward request
        Backend-->>Proxy: Response
        Proxy-->>Client: Response
    else Denied
        CEL-->>Proxy: false
        Proxy-->>Client: PERMISSION_DENIED
    end

Pattern 9: Feature Flags (Unleash)

Key Functions

FunctionPackagePurpose
UnleashWrapperunleashFeature flag wrapper
UnleashWrapperFactoryunleashFactory for creating wrappers
contextFieldStateunleashContext field management
InitializeFactoryunleashFactory initialization
mergeExperimentConfigsunleashMerge experiment configurations
setUpUnleashlanguage_serverInitialize feature flags at startup

Architecture

graph TB
    subgraph "Unleash System"
        UW["UnleashWrapper"]
        Factory["UnleashWrapperFactory"]
        Context["contextFieldState"]
        Config["ExperimentConfigs"]
    end

    subgraph "Feature Checks"
        F1["Feature A: enabled"]
        F2["Feature B: disabled"]
        F3["Feature C: gradual rollout 10%"]
    end

    subgraph "Components"
        Server["Language Server"]
        MCP["MCP Manager"]
        Browser["Browser System"]
        Agent["Agent Loop"]
    end

    Factory --> UW
    UW --> Context
    UW --> Config
    Config --> F1
    Config --> F2
    Config --> F3

    Server -->|"check feature"| UW
    MCP -->|"check feature"| UW
    Browser -->|"check feature"| UW
    Agent -->|"check feature"| UW

Feature Flag Flow

  1. At startup, setUpUnleash initializes the Unleash client
  2. Feature configurations are fetched from the GetUnleashContextFields API
  3. mergeExperimentConfigs combines local and remote configurations
  4. Components check features via UnleashWrapper.isEnabled(feature_name)
  5. Gradual rollouts use the installation ID for consistent hashing

Pattern 10: Hardcoded Permissions

Key Functions

FunctionPackagePurpose
getHardcodedGrantspermissionsReturns hardcoded permission grants
Permission managementpermissionsPermission system infrastructure

What Are Hardcoded Grants?

The binary contains a set of baked-in permission grants that cannot be overridden by configuration. These define the minimum set of capabilities available to all users.

graph TB
    subgraph "Permission System"
        HG["getHardcodedGrants()<br/>Always active"]
        CP["Config Permissions<br/>User/team configurable"]
        DP["Dynamic Permissions<br/>Runtime evaluation"]
    end

    subgraph "Effective Permissions"
        EP["Effective Permission Set<br/>HG ∪ CP ∪ DP"]
    end

    HG --> EP
    CP --> EP
    DP --> EP
    
    EP -->|"Check"| Tools["Tool Access"]
    EP -->|"Check"| Features["Feature Access"]
    EP -->|"Check"| Resources["Resource Access"]

Implications

The presence of getHardcodedGrants means:

  1. Some permissions are non-negotiable -- they cannot be denied
  2. The permission system has a baseline that all configurations build upon
  3. These grants likely include basic read operations and system-level access

Subsystem Function Map

Core Server (language_server.*)

FunctionSizePurpose
CreateLanguageServerAndServe~15KBMain entry point -- massive initialization
setUpLoggingLogging configuration
setUpFSFilesystem setup
setUpFSInjectionFilesystem injection (virtual FS)
setUpTracingDistributed tracing
setUpInstallationIDInstallation ID generation
setUpMetadataProviderMetadata provider setup
setUpServerPortListenersPort binding
setUpUnleashFeature flag initialization
setUpExtensionServerClientExtension server connection
setUpClientsClient initialization
setUpWorkspaceManagerWorkspace management
setUpConversationAnnotationsManagerConversation annotations
setUpMcpManagerMCP manager initialization
setUpSystemMcpManagerSystem MCP initialization
setUpCustomizationOptionsCustomization setup
setUpTrajectorySaverTrajectory persistence setup
setUpGoMaxProcsGo runtime configuration

Agent State (agent_state.*)

FunctionPurpose
component.mergeParallelArraysMerges parallel subagent results
component.mergeTrajectoryUpdatesCombines trajectory state
component.buildFullStateUpdateLockedBuilds complete state snapshot
SubagentUpdateForwarderForwards subagent updates to parent

Handlers (handlers.*)

FunctionPurpose
InvokeSubagentHandler.HandleMain subagent invocation
InvokeSubagentHandler.handleTaskModeTask-mode subagent
DefineSubagentSubHandler.HandleSubagent definition
ManageInboxSubHandler.handleListInbox management
CodeActionHandler.ApplyCodeEditCode action application

Serialization (serializers.*)

FunctionPurpose
stepToMessageConverts internal steps to wire format
checkpointSummaryOutputGenerates checkpoint summaries

Git/VCS (git.*, vcs.*)

FunctionPurpose
CreateOrUpdatePullRequestPR management
GitStatusShellGit status
GetDiffsFromUncommittedChangesConfigDiff computation
VcsCache.FindCodeiumYamlForDirConfig file discovery
Repository.createPatchForOneUntrackedFilePatch generation

Utils (utils.*)

FunctionPurpose
TrajectoryToCascadeSummarySummarize trajectory for display
DOMTreeJSONToProtoConvert DOM tree to protobuf
StepToMarkdownConvert step to markdown

Cross-References


Source: Ghidra MCP decompilation of agy binary. 3,305 .c files in reverse_engineering/language_server_hub/decompiled/. Entry point: language_server_CreateLanguageServerAndServe (~15KB). Core agent loop: cortex_ptrCascadeManager_New (~8KB).