diff options
| author | Adam Malczewski <[email protected]> | 2026-06-05 01:35:50 +0900 |
|---|---|---|
| committer | Adam Malczewski <[email protected]> | 2026-06-05 01:35:50 +0900 |
| commit | 94dd5334b0277f3cf3b0588150a6615af86a32b3 (patch) | |
| tree | 53b1b327790ae43bd3b7cbabe555b832f3e27248 /packages/kernel/src/runtime/run-turn.ts | |
| parent | 977ca522736bba53172e010494de5ac59fdb2a4a (diff) | |
| download | dispatch-94dd5334b0277f3cf3b0588150a6615af86a32b3.tar.gz dispatch-94dd5334b0277f3cf3b0588150a6615af86a32b3.zip | |
refactor(kernel): rename tabId → conversationId across contracts + consumers (218 tests)
Step 4 of the post-MVP backlog: resolve the last vocab drift. The canonical
term for a thread of turns is `conversationId` (GLOSSARY), but `AgentEvent`
variants and `RunTurnInput` still used the legacy `tabId` from the old frontend
"tab" concept, with session-orchestrator bridging `conversationId → tabId`.
Atomic, type-driven rename across the full 10-file consumer set:
- contracts/events.ts: all 11 AgentEvent variants tabId → conversationId
- contracts/runtime.ts: RunTurnInput.tabId → conversationId
- runtime/{events,run-turn,dispatch}.ts: factory params, ctx field, locals
- session-orchestrator: drop the redundant `tabId: conversationId` bridge line
- transport-http: emit wiring; external /chat field + X-Conversation-Id header
unchanged (already canonical) — only the emitted NDJSON event field flips
- tests (run-turn, app, logic): inputs + assertions now use conversationId
Pure rename, zero behavior change: typecheck clean, 218 tests pass (unchanged
count), biome clean, `grep tabId packages/` → zero matches. Verified live:
multi-turn curl emits conversationId-keyed NDJSON and threads history correctly.
GLOSSARY drift note removed. Closes the post-MVP backlog (Steps 1–4).
Diffstat (limited to 'packages/kernel/src/runtime/run-turn.ts')
| -rw-r--r-- | packages/kernel/src/runtime/run-turn.ts | 39 |
1 files changed, 28 insertions, 11 deletions
diff --git a/packages/kernel/src/runtime/run-turn.ts b/packages/kernel/src/runtime/run-turn.ts index 919491a..9421d86 100644 --- a/packages/kernel/src/runtime/run-turn.ts +++ b/packages/kernel/src/runtime/run-turn.ts @@ -74,7 +74,7 @@ interface StepContext { readonly dispatch: RunTurnInput["dispatch"]; readonly emit: EventEmitter; readonly signal: AbortSignal; - readonly tabId: string; + readonly conversationId: string; readonly turnId: string; } @@ -96,11 +96,11 @@ function processEvent( switch (event.type) { case "text-delta": appendTextDelta(chunks, event.delta); - ctx.emit(textDeltaEvent(ctx.tabId, ctx.turnId, event.delta)); + ctx.emit(textDeltaEvent(ctx.conversationId, ctx.turnId, event.delta)); break; case "reasoning-delta": appendThinkingDelta(chunks, event.delta); - ctx.emit(reasoningDeltaEvent(ctx.tabId, ctx.turnId, event.delta)); + ctx.emit(reasoningDeltaEvent(ctx.conversationId, ctx.turnId, event.delta)); break; case "tool-call": { const call: ToolCall = { @@ -115,14 +115,22 @@ function processEvent( toolName: event.toolName, input: event.input, }); - ctx.emit(toolCallEvent(ctx.tabId, ctx.turnId, event.toolCallId, event.toolName, event.input)); + ctx.emit( + toolCallEvent( + ctx.conversationId, + ctx.turnId, + event.toolCallId, + event.toolName, + event.input, + ), + ); if (ctx.dispatch.eager) { dispatcher.submit(call); } break; } case "usage": - ctx.emit(usageEvent(ctx.tabId, ctx.turnId, event.usage)); + ctx.emit(usageEvent(ctx.conversationId, ctx.turnId, event.usage)); break; case "finish": break; @@ -132,7 +140,7 @@ function processEvent( } else { chunks.push({ type: "error", message: event.message }); } - ctx.emit(errorEvent(ctx.tabId, ctx.turnId, event.message, event.code)); + ctx.emit(errorEvent(ctx.conversationId, ctx.turnId, event.message, event.code)); break; } } @@ -148,7 +156,7 @@ async function executeStep(ctx: StepContext): Promise<StepResult> { ctx.dispatch, ctx.signal, ctx.emit, - ctx.tabId, + ctx.conversationId, ctx.turnId, ); @@ -167,7 +175,7 @@ async function executeStep(ctx: StepContext): Promise<StepResult> { } catch (err) { const message = err instanceof Error ? err.message : String(err); chunks.push({ type: "error", message }); - ctx.emit(errorEvent(ctx.tabId, ctx.turnId, message)); + ctx.emit(errorEvent(ctx.conversationId, ctx.turnId, message)); finishReason = "error"; } @@ -184,7 +192,16 @@ async function executeStep(ctx: StepContext): Promise<StepResult> { const result = results.get(call.id); if (result !== undefined) { const isError = result.isError ?? false; - ctx.emit(toolResultEvent(ctx.tabId, ctx.turnId, call.id, call.name, result.content, isError)); + ctx.emit( + toolResultEvent( + ctx.conversationId, + ctx.turnId, + call.id, + call.name, + result.content, + isError, + ), + ); toolMessages.push({ role: "tool", chunks: [ @@ -217,7 +234,7 @@ export async function runTurn(input: RunTurnInput): Promise<RunTurnResult> { toolMap.set(tool.name, tool); } - const tabId = input.tabId; + const conversationId = input.conversationId; const turnId = input.turnId; const signal = input.signal ?? new AbortController().signal; @@ -235,7 +252,7 @@ export async function runTurn(input: RunTurnInput): Promise<RunTurnResult> { dispatch: input.dispatch, emit: input.emit, signal, - tabId, + conversationId, turnId, }); |
