takt/src/core/piece/session-key.ts
2026-02-08 17:09:26 +09:00

30 lines
1.1 KiB
TypeScript

/**
* Session key generation for persona sessions.
*
* When multiple movements share the same persona but use different providers
* (e.g., claude-eye uses Claude, codex-eye uses Codex, both with persona "coder"),
* sessions must be keyed by provider to prevent cross-provider contamination.
*
* Without provider in the key, a Codex session ID could overwrite a Claude session,
* causing Claude to attempt resuming a non-existent session file (exit code 1).
*/
import type { PieceMovement } from '../models/types.js';
/**
* Build a unique session key for a movement.
*
* - Base key: `step.persona ?? step.name`
* - If the movement specifies a provider, appends `:{provider}` to disambiguate
*
* Examples:
* - persona="coder", provider=undefined → "coder"
* - persona="coder", provider="claude" → "coder:claude"
* - persona="coder", provider="codex" → "coder:codex"
* - persona=undefined, name="plan" → "plan"
*/
export function buildSessionKey(step: PieceMovement): string {
const base = step.persona ?? step.name;
return step.provider ? `${base}:${step.provider}` : base;
}