Workers implement tools declared on agents over the Work stream. See Tool workers in the runtime docs.
Worker
new Worker(options)
workerId is required. Optional runtimeAddr, workloadIdentity, imageDigest.
TypeScript
import { Worker } from "@phrony/sdk/worker";
const worker = new Worker({
workerId: "weather-worker-1",
runtimeAddr: process.env.PHRONY_RUNTIME_ADDR,
workloadIdentity: "k8s://default/weather-worker",
imageDigest: "sha256:abc…",
});registerTool(options)
Register before connect(). handler receives (args, context) with AbortSignal for cancellation.
TypeScript
worker.registerTool({
tool: "weather.get-forecast",
version: "1.0.0",
maxConcurrency: 4,
handler: async (args: { city: string }, ctx) => {
if (ctx.signal.aborted) throw new Error("cancelled");
return { temp_c: 12, city: args.city };
},
});connect() / close()
connect() blocks until the stream ends; close() aborts in-flight calls and shuts down.
TypeScript
await worker.connect(); // blocks until disconnect
await worker.close();ToolError
Throw from a handler to return a structured tool failure to the runtime.
TypeScript
import { ToolError } from "@phrony/sdk/worker";
handler: async () => {
throw new ToolError("UPSTREAM_TIMEOUT", "Weather API timed out");
}WorkStream
Low-level helper from @phrony/sdk/worker for custom registration or reconnect logic.
WorkStream
sendRegister, run(handlers), sendResult, sendNack, inFlightCalls, close, buildHandlerAdvertisements.
TypeScript
import { RuntimeClient, WorkStream, buildHandlerAdvertisements } from "@phrony/sdk/worker";
const client = await RuntimeClient.connect();
const stream = new WorkStream(client.work());
stream.sendRegister({
workerId: "weather-worker-1",
handlers: buildHandlerAdvertisements([
{ tool: "weather.get-forecast", version: "1.0.0", maxConcurrency: 4 },
]),
inFlight: stream.inFlightCalls(),
});
stream.run({
onRegistered: (leaseTtlMs) => console.log("lease", leaseTtlMs),
onInvoke: (invoke) => {
stream.markCallExecuting(invoke.callId);
stream.sendResult({
callId: invoke.callId,
payload: Buffer.from(JSON.stringify({ ok: true })),
});
},
});
stream.close();
client.close();