Welcome to Cocoon, a core component of the Land Code Editor. Cocoon is a specialized Node.js sidecar process meticulously designed to host and execute existing Visual Studio Code extensions. It achieves this by providing a comprehensive, Effect-TS native environment that faithfully replicates the VS Code Extension Host API. This allows Land to leverage the vast and mature VS Code extension ecosystem, offering users a rich and familiar feature set from day one.
Cocoon's primary goal is to enable high compatibility with Node.js-based VS Code
extensions. It communicates with the main Rust-based Land backend (Mountain)
via gRPC (Vine protocol), ensuring a performant and strongly-typed IPC
channel. Cocoon translates extension API calls into declarative Effects that are
sent to Mountain for native execution.
- Effect-TS Native Architecture: The entire
Cocoonapplication is built with Effect-TS. All services, API shims, and IPC logic are implemented as declarative, composableLayers andEffects, ensuring maximum robustness, testability, and type safety. - High-Fidelity VSCode API Shims: Provides a comprehensive set of service
shims (e.g., for
vscode.workspace,vscode.window,vscode.commands) that replicate the behavior of the real VS Code Extension Host. - gRPC-Powered Communication: All communication with the
Mountainbackend is handled via gRPC, providing a fast, modern, and strongly-typed contract for all IPC operations. - Robust Module Interception: Implements high-fidelity interceptors for both
CJS
require()and ESMimportstatements, ensuring that calls to the'vscode'module are correctly sandboxed and routed to the appropriate, extension-specific API instance. - Process Hardening & Lifecycle Management: Includes sophisticated process
patching to handle uncaught exceptions, pipe logs to the host, and
automatically terminate if the parent
Mountainprocess exits, ensuring a stable and well-behaved sidecar.
To understand how Cocoon's internal components interact to provide the
high-fidelity vscode API, see the following source files:
Bootstrap/Implementation/CocoonMain.ts- Main entry point and bootstrap orchestrationEffect/Bootstrap.ts- Effect-TS bootstrap stages (Environment, Configuration, Mountain Connection, Module Interceptor, RPC Server, Extensions, Health Check)ServiceMapping.ts- Dependency injection and service compositionServices/APIFactory.ts- Constructs thevscodeAPI object for extensionsServices/ExtensionHostService.ts- Extension activation and lifecycle managementServices/IPCService.ts- Bi-directional gRPC communicationServices/MountainGRPCClient.ts- gRPC client for Mountain backendPatchProcess/- Process hardening and securityTypeConverter/- DTO serialization for gRPC transport
Cocoon operates as a standalone Node.js process, carefully orchestrated by and
communicating with Mountain.
| Component within Cocoon | Role & Key Responsibilities |
|---|---|
| Node.js Process | The runtime environment for Cocoon. |
Bootstrap/Implementation/CocoonMain.ts |
The primary entry point. It composes all Effect-TS layers, establishes the gRPC connection, performs the initialization handshake with Mountain, and starts the extension host services. |
PatchProcess/ |
Performs very early process hardening (patching process.exit, handling exceptions, piping logs), ensuring a stable foundation before any other code runs. |
Effect/ Modules |
Orchestrates the bootstrap process. Bootstrap.ts coordinates initialization stages, Extension.ts manages extension lifecycle, ModuleInterceptor.ts patches require and import, and Telemetry.ts provides logging and tracing. |
Services/ Modules |
A comprehensive collection of Effect-TS Layers, each implementing a specific VS Code IExtHost... service interface (e.g., CommandsProvider, WorkspaceProvider, WebviewProvider). These shims are the core of the compatibility layer. Key services include APIFactory.ts, ExtensionHostService.ts, IPCService.ts, and MountainGRPCClient.ts. |
IPC/ & Services/IPC.ts |
IPC/ contains the protocol layer (Channel.ts, Handler.ts, Message.ts, Protocol.ts). Services/IPC.ts implements both the gRPC client (to call Mountain) and server (to receive calls from Mountain), managing the entire bi-directional communication lifecycle. |
TypeConverter/ |
Provides pure functions to serialize TypeScript types into plain DTOs for gRPC transport. Organized by feature: Main/ (URI, Range, TextEdit), Dialog/, TreeView/, Webview/, Task/, WorkspaceEdit/. The actual vscode API class definitions are in the Services/ modules that use them. |
| Extension Code | The JavaScript/TypeScript code of the VS Code extensions being hosted and run within the Cocoon environment. |
MountainlaunchesCocoonwith initialization data.Cocoon'sBootstrap/Implementation/CocoonMain.tsbootstraps the application:PatchProcesshardens the environment.Effect/Bootstrap.tsorchestrates the initialization stages (environment detection, configuration, gRPC connection, module interceptor, RPC server, extensions, health check).- The main
AppLayeris built viaServiceMapping.ts, composing all Effect-TS services. - The real VS Code
ExtHostExtensionServiceis instantiated within this Effect-TS environment.
ExtHostExtensionService(inServices/ExtensionHostService.ts) activates an extension. The extension receives avscodeAPI object constructed by theAPIFactoryservice.- The extension calls
vscode.window.showInformationMessage("Hello"). - The call is routed to the
Windowservice. - The
Windowservice creates anEffectthat sends ashowMessagegRPC request toMountainviaMountainGRPCClient. Mountain'sVinelayer receives the request. ItsTrackdispatcher routes it to the native UI handler.Mountaindisplays the native UI notification and waits for user interaction.- The result is sent back to
Cocoonvia a gRPC response. - The
EffectinCocooncompletes, resolving the promise returned to the extension's API call.
This diagram illustrates the internal architecture of Cocoon and its place within the broader Land ecosystem.
graph LR
classDef mountain fill:#f9f,stroke:#333,stroke-width:2px;
classDef cocoon fill:#ccf,stroke:#333,stroke-width:2px;
classDef effectts fill:#cfc,stroke:#333,stroke-width:1px;
classDef vscode fill:#ddd,stroke:#666,stroke-width:1px,stroke-dasharray: 5 5;
subgraph "Cocoon 🦋 (Node.js SideCar)"
direction TB
Bootstrap["Bootstrap/Implementation/CocoonMain.ts"]:::effectts
AppLayer["Cocoon AppLayer"]:::effectts
EffectModules["Effect/ Modules (Bootstrap, Telemetry, Extension)"]:::effectts
PatchProcess["PatchProcess/ (Process Hardening)"]:::cocoon
APIServices["Services/ (APIFactory, ExtensionHost, Window, Workspace, etc.)"]:::cocoon
IPCService["Services/IPCService.ts + IPC/ Protocol"]:::cocoon
GRPCClient["Services/MountainGRPCClient.ts"]:::cocoon
TypeConverter["TypeConverter/ (DTO Serialization)"]:::cocoon
Bootstrap -- Builds & Runs --> AppLayer
AppLayer -- Composes --> EffectModules
AppLayer -- Composes --> APIServices
AppLayer -- Composes --> IPCService
APIServices -- Use --> GRPCClient
APIServices -- Use --> TypeConverter
GRPCClient -- Use --> IPCService
PatchProcess -- Hardens --> Bootstrap
end
subgraph "Mountain ⛰️ (Rust/Tauri Backend)"
VineGRPC["Vine gRPC Server"]:::mountain
end
subgraph "VS Code Extension"
ExtensionCode["Extension Code"]:::vscode
end
APIServices -- Provides `vscode` object to --> ExtensionCode
ExtensionCode -- Makes API calls to --> APIServices
GRPCClient -- gRPC <--> VineGRPC
Cocoon is developed as a core component of the main Land project. To work on
or run Cocoon, please follow the instructions in the main
Land Repository README. The
Bundle=true build variable is essential, as it triggers the Rest element to
prepare the necessary VS Code platform code for Cocoon to consume.
Key Dependencies:
effect(v3.19.18): The core library for the entire application structure.@effect/platform&@effect/platform-node: Effect-TS platform abstractions.@grpc/grpc-js&@grpc/proto-loader: For gRPC communication.google-protobuf&protobufjs: Protocol buffers for gRPC.- VS Code platform code (e.g.,
vs/base,vs/platform), sourced from theLand/Dependencysubmodule.
Current Version: 0.0.1 (see package.json)
Debugging Cocoon:
- Since Cocoon is a Node.js process, it can be debugged by attaching a standard
Node.js debugger.
Mountainmust launch the Cocoon process with the appropriate Node.js debug flags (e.g.,--inspect-brk=PORT_NUMBER). - Logs from
Cocoonare automatically piped to the parentMountainprocess thanks to thePatchProcessmodule and will appear inMountain's console output or log files.
This project is released into the public domain under the Creative Commons CC0
Universal license. You are free to use, modify, distribute, and build upon
this work for any purpose, without any restrictions. For the full legal text,
see the LICENSE
file.
Stay updated with our progress! See
CHANGELOG.md for a
history of changes specific to Cocoon.
Cocoon is a core element of the Land ecosystem. This project is funded through NGI0 Commons Fund, a fund established by NLnet with financial support from the European Commission's Next Generation Internet program. Learn more at the NLnet project page.
| Land | PlayForm | NLnet | NGI0 Commons Fund |
|---|---|---|---|
|
|
|
|
|
Project Maintainers: Source Open (Source/Open@Editor.Land) | GitHub Repository | Report an Issue | Security Policy