| name | host-operations |
| description | Host development workflows for runtime environments. Use when creating hosts, debugging host issues, or understanding host implementation patterns. Use when this capability is needed. |
| metadata | {"author":"adriandarian"} |
Host Operations
Host operations cover creating and maintaining runtime hosts that attach 3Lens to different rendering environments (vanilla three.js, React Three Fiber, TresJS, Workers, etc.).
When to Use
- Creating a host for a new runtime environment
- Debugging host attachment issues
- Understanding event emission patterns
- Implementing multi-context support
Host Types
Manual Host (Vanilla three.js)
import { createHost } from '@3lens/runtime';
import * as THREE from 'three';
export const manualHost = createHost({
name: 'manual',
attach(renderer: THREE.WebGLRenderer) {
const originalRender = renderer.render.bind(renderer);
renderer.render = (scene, camera) => {
emitRenderEvent(renderer, scene, camera);
originalRender(scene, camera);
};
}
});
React Three Fiber Host
import { useFrame } from '@react-three/fiber';
import { useLens } from '@3lens/mount-react';
export function useThreeLensHost() {
const lens = useLens();
useFrame((state) => {
lens.emitEvent({
type: 'render_event',
context_id: 'main',
renderer_id: state.gl.domElement.id,
scene_id: state.scene.uuid,
camera_id: state.camera.uuid
});
});
}
Worker Host
export const workerHost = createHost({
name: 'worker',
attach(canvas: OffscreenCanvas) {
}
});
Commands
Scaffold a Host
3lens scaffold host my-framework
Generates:
- Host adapter source
- Context registration
- Lifecycle hooks
- Framework-specific bindings
Host Implementation
Host Interface
interface Host {
name: string;
attach(renderer: Renderer): void;
detach(): void;
registerContext(context: RenderContext): void;
unregisterContext(contextId: string): void;
}
Context Registration
client.registerContext({
id: 'main',
renderer: renderer,
scenes: [scene],
cameras: [camera]
});
emitEvent({
type: 'render_event',
context_id: 'main',
seq: seq++,
});
Event Emission
let seq = 0;
function onRender(renderer, scene, camera) {
emitEvent({
type: 'render_event',
context_id: 'main',
seq: seq++,
timestamp: performance.now(),
renderer_id: `renderer:main:${renderer.id}`,
scene_id: `scene:main:${scene.uuid}`,
camera_id: `camera:main:${camera.uuid}`
});
}
Multi-Context Support
const contexts = new Map<string, RenderContext>();
function registerContext(context: RenderContext) {
contexts.set(context.id, context);
client.registerContext(context);
}
function onRender(contextId: string) {
const context = contexts.get(contextId);
emitEvent({
type: 'render_event',
context_id: contextId,
});
}
Late Attach Handling
emitEvent({
type: 'attach_point',
context_id: 'main',
timestamp: Date.now()
});
scanEntities().forEach(entity => {
emitEvent({
type: 'resource_create',
context_id: 'main',
entity_id: entity.id,
origin: 'preexisting'
});
});
Host Requirements
Every host MUST:
-
Register Contexts Before Events
- Context registration must precede any events
- Include context metadata
-
Emit Events in Correct Order
- Sequence numbers must be monotonic per context
- Include context_id in all events
-
Support Multiple Contexts
- Handle multiple renderers/scenes/cameras
- Track contexts independently
-
Handle Late Attach
- Mark attach point
- Mark pre-existing entities
-
Respect Overhead Budgets
- Check overhead budget
- Degrade capture mode if needed
Agent Use Cases
- New host: "Create a host for Solid.js"
- Debugging: "My host isn't emitting events correctly"
- Multi-context: "How do I support multiple renderers?"
- Late attach: "How do I handle late attachment?"
Post-Scaffold Steps
After scaffolding, follow the playbook:
Additional Resources
Converted and distributed by TomeVault — claim your Tome and manage your conversions.