Please check the build logs for more information.
See Builds for ideas on how to fix a failed build, or Metadata for how to configure docs.rs builds.
If you believe this is docs.rs' fault, open an issue.
PCTX Code Mode
A TypeScript code execution engine that enables AI agents to dynamically call tools through generated code. Code Mode converts tool schemas (like MCP tools) into TypeScript interfaces, executes LLM-generated code in a sandboxed Deno runtime, and bridges function calls back to your Rust callbacks.
Quick Start
use ;
use schema_for;
use ;
use Arc;
async
Core Concepts
1. Tools and ToolSets
Tools represent individual functions that can be called from TypeScript code. They are organized into ToolSets (namespaces).
use ;
// Create a tool with input/output schemas
let tool = new_callback?;
// Organize tools into a namespace
let toolset = new;
2. CodeMode
The main execution engine that manages tools and executes TypeScript code.
let mut code_mode = default;
code_mode.tool_sets = vec!;
// List available functions
let list = code_mode.list_functions;
for func in list.functions
// Get detailed type information
let details = code_mode.get_function_details;
println!;
3. Callbacks
Callbacks are Rust functions that execute when TypeScript code calls your tools.
use ;
use Arc;
let registry = default;
let callback: CallbackFn = new;
// Register with namespace.function format
registry.add?;
4. Code Execution
Execute LLM-generated TypeScript code that calls your registered tools.
let code = r#"
async function run() {
// Call your registered tools
const user = await DataApi.fetchData({ id: 123 });
const greeting = await Greeter.greet({ name: user.name });
// Chain multiple calls
const result = await DataApi.saveData({
id: user.id,
message: greeting.message
});
// Return the final result
return result;
}
"#;
let output = code_mode.execute.await?;
match output.success
API Reference
CodeMode
The main execution engine.
new() / default()
let code_mode = default;
list_functions() -> ListFunctionsOutput
Lists all available functions with their TypeScript interface declarations.
let list = code_mode.list_functions;
println!;
for func in list.functions
get_function_details(input: GetFunctionDetailsInput) -> GetFunctionDetailsOutput
Gets detailed TypeScript type definitions for specific functions.
use ;
let details = code_mode.get_function_details;
println!;
execute(code: &str, callbacks: Option<CallbackRegistry>) -> Result<ExecuteOutput>
Executes TypeScript code in a sandboxed Deno runtime.
let output = code_mode.execute.await?;
if output.success else
add_callback(config: &CallbackConfig) -> Result<()>
Dynamically adds a callback-based tool to the code mode.
use CallbackConfig;
code_mode.add_callback?;
CallbackRegistry
Thread-safe registry for managing callback functions.
default() -> CallbackRegistry
let registry = default;
add(id: &str, callback: CallbackFn) -> Result<()>
Registers a callback with a specific ID (format: Namespace.functionName).
registry.add?;
has(id: &str) -> bool
Checks if a callback is registered.
if registry.has
Types
Tool
Create tools for MCP-style tools or callbacks:
// MCP-style tool
let tool = new_mcp?;
// Callback-based tool
let tool = new_callback?;
ToolSet
let toolset = new;
ExecuteOutput
CallbackFn
Type alias for callback functions:
pub type CallbackFn = ;
Advanced Usage
Converting MCP Tools
Convert MCP (Model Context Protocol) tools into Code Mode tools:
use Tool as McpTool;
Dynamic Tool Registration
Register tools at runtime based on configuration:
for config in tool_configs
Async Tool Execution
Callbacks support full async operations:
registry.add?;
Error Handling
let output = code_mode.execute.await?;
if !output.success
TypeScript Code Requirements
LLM-generated code must follow this pattern:
async function run() {
// Your code that calls registered tools
const result = await Namespace.toolName({ param: value });
// MUST return a value
return result;
}
The code execution engine:
- Wraps your code with namespace implementations
- Automatically calls
run()and captures its return value - Provides the return value in
ExecuteOutput.output
Architecture
- Tool Definition: Tools are defined with JSON Schemas for inputs/outputs
- Code Generation: TypeScript interface definitions are generated from schemas
- Code Execution: User code is wrapped with namespace implementations and executed in Deno
- Callback Routing: Function calls in TypeScript are routed to Rust callbacks
- Result Marshaling: JSON values are passed between TypeScript and Rust
Sandbox Security
Code is executed in a Deno runtime with:
- Network access restricted to allowed hosts
- No file system access
- No subprocess spawning
- Isolated V8 context per execution
Configure allowed hosts:
code_mode.servers = vec!;
let allowed = code_mode.allowed_hosts;
println!;
Examples
Multi-Tool Workflow
let code = r#"
async function run() {
// Fetch user data
const user = await UserApi.getUser({ id: 123 });
// Process the data
const processed = await DataProcessor.transform({
input: user.data,
format: "normalized"
});
// Save results
const saved = await Storage.save({
key: `user_${user.id}`,
value: processed
});
return {
userId: user.id,
saved: saved.success,
location: saved.url
};
}
"#;
let output = code_mode.execute.await?;
Error Recovery
let code = r#"
async function run() {
try {
return await RiskyApi.operation({ id: 1 });
} catch (error) {
console.error("Operation failed:", error);
// Fall back to safe default
return await SafeApi.getDefault();
}
}
"#;
let output = code_mode.execute.await?;
// Check console output
if !output.stdout.is_empty
Parallel Execution
let code = r#"
async function run() {
// Execute multiple operations in parallel
const [users, posts, comments] = await Promise.all([
UserApi.listUsers(),
PostApi.listPosts(),
CommentApi.listComments()
]);
return { users, posts, comments };
}
"#;
Related Crates
pctx_codegen: TypeScript code generation from JSON schemaspctx_executor: Deno runtime execution enginepctx_code_execution_runtime: Runtime environment and callback system
License
MIT