This is the compatibility map for teams moving TypeScript agents to native Rust Agentic Harness agents.
The migration is not a line-by-line port. Move the agent contract first
(AGENTS.md, roles, skills, payload shape), then rewrite handlers as native
Rust AgentDefinitions.
FlueContext->AgentContextinit({ model, sandbox })->AgentApp::model(...)plusctx.session_with_env(...)session.prompt()->Session::prompt_with_options(...)session.skill()->Session::skill(...)session.task()->Session::task(...)defineCommand()->CommandDefandAgentContext::command(...)getVirtualSandbox()->VirtualSessionEnvor a customSessionEnvconnectMcpServer()->connect_mcp_server(...)flue add daytona->agentic-harness add daytona --printflue dev/run/build->agentic-harness dev/run/build
Minimal webhook rewrite:
use agentic_harness::prelude::*;
use serde::Deserialize;
use serde_json::json;
#[derive(Deserialize)]
struct Payload {
text: String,
}
fn app() -> Result<AgentApp, AgenticHarnessError> {
Ok(AgentApp::new().agent(AgentDefinition::webhook("hello", |ctx| {
let payload: Payload = ctx.payload()?;
Ok(json!({ "message": payload.text }))
})))
}Migration order:
- Move
AGENTS.md, roles, and skills into the Rust workspace. - Rewrite each
.flue/agents/*.tshandler as a RustAgentDefinition. - Replace TypeScript schemas with Rust
Deserializepayload/result structs. - Replace sandbox imports with
VirtualSessionEnv,HttpSessionEnv, or a providerSessionEnvconnector. - Run
agentic-harness doctor --workspace ., thenagentic-harness run.
After each migrated agent, run:
cargo fmt --all --check
cargo test --workspace
agentic-harness manifest --workspace .
agentic-harness run <agent> --workspace . --id migration-smoke --payload '{}'Use a representative payload instead of {} when the agent requires fields.