import { proxyActivities } from "@temporalio/workflow"; import type { WorkbenchActivityConfig, WorkbenchSteerInput, WorkbenchTurnInput } from "./contracts.ts"; type WorkbenchActivities = { dispatchWorkbenchTurn(input: WorkbenchTurnInput): Promise>; steerWorkbenchTurn(input: WorkbenchSteerInput): Promise>; cancelWorkbenchTurn(input: { actor: WorkbenchTurnInput["actor"]; traceId: string; params: Record }): Promise>; }; export async function workbenchTurnWorkflow(input: WorkbenchTurnInput & { activity: WorkbenchActivityConfig }) { const activities = workbenchActivities(input.activity); const dispatch = await activities.dispatchWorkbenchTurn(input); return { accepted: true, traceId: input.traceId, dispatch, terminalAuthority: "hwlab.event.v1", resultSynthesized: false }; } export async function workbenchCancelWorkflow(input: { actor: WorkbenchTurnInput["actor"]; traceId: string; params: Record; activity: WorkbenchActivityConfig }) { const activities = workbenchActivities(input.activity); const cancel = await activities.cancelWorkbenchTurn(input); return { accepted: true, traceId: input.traceId, cancel, terminalAuthority: "hwlab.event.v1", resultSynthesized: false }; } export async function workbenchSteerWorkflow(input: WorkbenchSteerInput & { activity: WorkbenchActivityConfig }) { const activities = workbenchActivities(input.activity); const steer = await activities.steerWorkbenchTurn(input); return { accepted: true, traceId: typeof steer.traceId === "string" ? steer.traceId : input.steerTraceId, targetTraceId: input.targetTraceId, steerTraceId: input.steerTraceId, requestedDelivery: steer.requestedDelivery ?? "steer", delivery: steer.delivery ?? null, agentRun: steer.agentRun ?? null, steer, terminalAuthority: "hwlab.event.v1", resultSynthesized: false }; } function workbenchActivities(activity: WorkbenchActivityConfig) { return proxyActivities({ startToCloseTimeout: `${activity.startToCloseTimeoutMs} milliseconds`, retry: { initialInterval: `${activity.retryInitialIntervalMs} milliseconds`, maximumInterval: `${activity.retryMaximumIntervalMs} milliseconds`, maximumAttempts: activity.retryMaximumAttempts } }); }