diff --git a/packages/cli-workflow/src/commands/thread.ts b/packages/cli-workflow/src/commands/thread.ts index e7614bb..01432c7 100644 --- a/packages/cli-workflow/src/commands/thread.ts +++ b/packages/cli-workflow/src/commands/thread.ts @@ -624,13 +624,17 @@ function resolveAgentConfig( return agentConfig; } -function spawnAgent(agent: AgentConfig, threadId: ThreadId, role: string): CasRef { +function spawnAgent(agent: AgentConfig, threadId: ThreadId, role: string, edgePrompt: string | null): CasRef { const argv = [...agent.args, threadId, role]; + const env = { ...process.env }; + if (edgePrompt !== null) { + env.UWF_EDGE_PROMPT = edgePrompt; + } let stdout: string; try { stdout = execFileSync(agent.command, argv, { encoding: "utf8", - env: process.env, + env, stdio: ["ignore", "pipe", "pipe"], }); } catch (e) { @@ -712,7 +716,7 @@ async function cmdThreadStepOnce( fail(nextResult.error.message); } - if (nextResult.value === END_ROLE) { + if (nextResult.value.role === END_ROLE) { await archiveThread(storageRoot, threadId, workflowHash, headHash); return { workflow: workflowHash, @@ -722,12 +726,13 @@ async function cmdThreadStepOnce( }; } - const role = nextResult.value; + const role = nextResult.value.role; + const edgePrompt = nextResult.value.prompt; const config = await loadWorkflowConfig(storageRoot); const agent = resolveAgentConfig(config, workflow, role, agentOverride); loadDotenv({ path: getEnvPath(storageRoot) }); - const newHead = spawnAgent(agent, threadId, role); + const newHead = spawnAgent(agent, threadId, role, edgePrompt); // Re-create store to pick up nodes written by the agent subprocess const uwfAfter = await createUwfStore(storageRoot); diff --git a/packages/cli-workflow/src/commands/workflow.ts b/packages/cli-workflow/src/commands/workflow.ts index 782f2b5..c0ec891 100644 --- a/packages/cli-workflow/src/commands/workflow.ts +++ b/packages/cli-workflow/src/commands/workflow.ts @@ -58,6 +58,7 @@ function normalizeGraph(graph: Record): Record ({ role: t.role, condition: t.condition ?? null, + prompt: t.prompt ?? null, })); } return result; diff --git a/packages/workflow-agent-kit/src/context.ts b/packages/workflow-agent-kit/src/context.ts index 32f03b7..bd4943d 100644 --- a/packages/workflow-agent-kit/src/context.ts +++ b/packages/workflow-agent-kit/src/context.ts @@ -133,6 +133,7 @@ export async function buildContext(threadId: ThreadId, role: string): Promise> { +): Promise> { const role = currentRole(context); const transitions = workflow.graph[role]; if (transitions === undefined) { @@ -90,7 +90,7 @@ export async function evaluate( for (const transition of transitions) { if (transition.condition === null) { - return { ok: true, value: transition.role }; + return { ok: true, value: { role: transition.role, prompt: transition.prompt } }; } const conditionDef = workflow.conditions[transition.condition]; @@ -106,7 +106,7 @@ export async function evaluate( return evalResult; } if (isTruthy(evalResult.value)) { - return { ok: true, value: transition.role }; + return { ok: true, value: { role: transition.role, prompt: transition.prompt } }; } } diff --git a/packages/workflow-moderator/src/index.ts b/packages/workflow-moderator/src/index.ts index 2d5203f..91dabbc 100644 --- a/packages/workflow-moderator/src/index.ts +++ b/packages/workflow-moderator/src/index.ts @@ -1 +1,2 @@ export { evaluate } from "./evaluate.js"; +export type { EvaluateResult } from "./types.js"; diff --git a/packages/workflow-moderator/src/types.ts b/packages/workflow-moderator/src/types.ts index 4b92a78..0d09297 100644 --- a/packages/workflow-moderator/src/types.ts +++ b/packages/workflow-moderator/src/types.ts @@ -1 +1,7 @@ export type Result = { ok: true; value: T } | { ok: false; error: E }; + +/** The result of moderator evaluation — which role to go to, and the edge prompt (if any). */ +export type EvaluateResult = { + role: string; + prompt: string | null; +}; diff --git a/packages/workflow-protocol/src/types.ts b/packages/workflow-protocol/src/types.ts index 8960f0c..86b1a09 100644 --- a/packages/workflow-protocol/src/types.ts +++ b/packages/workflow-protocol/src/types.ts @@ -28,6 +28,7 @@ export type RoleDefinition = { export type Transition = { role: string; condition: string | null; + prompt: string | null; }; export type ConditionDefinition = {