SDKs

SDKs · TypeScript

Tool workers

Register tool handlers on the Work stream with Worker and WorkStream.

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();