mirror of
https://github.com/agentclientprotocol/claude-agent-acp.git
synced 2026-11-11 11:51:14 +00:00
## Summary - resolve AIR fork points from the complete persisted transcript when the target is outside the active parent chain - support message fingerprints and repeated assistant content when resolving persisted fork points - restore resumed models from the same local assistant transcript record Claude Code uses - remove all automatic `getContextUsage` control requests; use `compact_metadata.post_tokens` after compaction - add structured timing logs for fork, load, replay, and session creation phases ## Performance Cold-loading the reproduced 69-message forked session dropped from 20–29 seconds to 1.9 seconds. Transcript model lookup took 5 ms and replay took 14 ms; the remaining time was SDK initialization. ## Tests - `env -u ANTHROPIC_BASE_URL npm run test:run` (1230 passed, 27 skipped) - `npm run build` - `npm run lint` - Prettier check for all changed files - real ACP cold-load probe against the reproduced forked session
28 lines
846 B
TypeScript
28 lines
846 B
TypeScript
type TimingLogger = {
|
|
log: (...args: unknown[]) => void;
|
|
};
|
|
|
|
/** Small phase timer for session lifecycle diagnostics. */
|
|
export class SessionTiming {
|
|
private readonly startedAt: number;
|
|
private phaseStartedAt: number;
|
|
|
|
constructor(
|
|
private readonly logger: TimingLogger | undefined,
|
|
private readonly operation: string,
|
|
private readonly sessionId: string,
|
|
startedAt = performance.now(),
|
|
) {
|
|
this.startedAt = startedAt;
|
|
this.phaseStartedAt = startedAt;
|
|
}
|
|
|
|
phase(name: string, detail = ""): void {
|
|
const finishedAt = performance.now();
|
|
this.logger?.log(
|
|
`[session/${this.operation}] sessionId=${this.sessionId} phase=${name} durationMs=${Math.round(finishedAt - this.phaseStartedAt)} totalMs=${Math.round(finishedAt - this.startedAt)}${detail}`,
|
|
);
|
|
this.phaseStartedAt = finishedAt;
|
|
}
|
|
}
|