Getting Started¶
Install¶
For Rust-accelerated handlers and MCP runtime:
Minimal example¶
from pulsing.forge import ForgeEnvironment, LocalToolSession
env = ForgeEnvironment(
cwd=".",
sandbox_policy="off",
session=LocalToolSession(token_budget=128_000),
)
rt = env.runtime()
out = rt.call_tool("Glob", {"pattern": "*.md", "path": "."})
print(out.content, out.is_error)
After maturin develop, env.runtime() defaults to HybridForgeRuntime: Rust handlers first, Python fallback for Host-only tools — all 32 tools callable.
Host session hooks¶
Tools like request_user_input and update_plan call back into ToolSession:
from pulsing.forge import ForgeEnvironment, LocalToolSession
session = LocalToolSession()
session.user_input = lambda args: {"answers": {"confirm": "yes"}}
env = ForgeEnvironment(session=session)
env.runtime().call_tool("request_user_input", {"questions": [...]})
Forge emits structured requests; your Host decides how to show UI or auto-approve.
Isolated worker (Pulsing Actor)¶
import pulsing as pul
from pulsing.forge import ToolWorkerActor, ToolWorkerConfig
await pul.init()
try:
worker = await ToolWorkerActor.spawn(ToolWorkerConfig(cwd="."), public=False)
pong = await worker.ping()
out = await worker.Read(file_path="README.md")
finally:
await pul.shutdown()
Unified deployment: ForgeBackend (LOCAL / DEDICATED / SHARED).
REPL (no LLM)¶
Drive tools directly, save JSONL traces, replay steps. See Session REPL design.
Verify install¶
Example script: examples/python/forge_minimal.py
Next steps¶
- Concepts — mental model
- Tools (32) — inventory
- Deployment on Pulsing — cluster path
- Craft integration — reference Host