summaryrefslogtreecommitdiffhomepage
path: root/packages/kernel/src/runtime/run-turn.ts
diff options
context:
space:
mode:
authorAdam Malczewski <[email protected]>2026-06-05 01:35:50 +0900
committerAdam Malczewski <[email protected]>2026-06-05 01:35:50 +0900
commit94dd5334b0277f3cf3b0588150a6615af86a32b3 (patch)
tree53b1b327790ae43bd3b7cbabe555b832f3e27248 /packages/kernel/src/runtime/run-turn.ts
parent977ca522736bba53172e010494de5ac59fdb2a4a (diff)
downloaddispatch-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.ts39
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,
});