kimi-code/apps/vis/server/test/fixtures/build.ts
Kai c0b63c1ea7
refactor(vis): rewrite for new agent-core protocol (#34)
* feat(agent-core): re-export wire record types for in-monorepo consumers

* chore(vis): purge legacy wire protocol code

* feat(vis): introduce single-source agent-record types

* test(vis): add fixture session and builder helper

* feat(vis): implement new session store reader

* feat(vis): wire new session list/detail routes

* refactor(vis): drop legacy path config

* feat(vis): adapt session list page to new DTO

* feat(vis): implement per-agent wire reader

* feat(vis): rewrite wire route for new protocol

* feat(vis): rewrite wire type metadata for new protocol

* feat(vis): rewrite wire row + headline for new record union

* feat(vis): wire tab detail panel + multi-agent selector

* feat(vis): rebuild wire issues detection for new protocol

* feat(vis): implement context projector

* feat(vis): rewrite context route on projector

* feat(vis): rebuild context tab for new ContextMessage shape

* feat(vis): implement agent tree builder

* feat(vis): rewrite agents route

* feat(vis): rebuild subagents tab around state.json.agents

* feat(vis): rebuild state tab on raw state.json

* chore(vis): purge residual legacy field references

* vis: rewrite complete on new agent-core protocol

* fix(vis): adapt to wire protocol 1.1 with flattened tool calls

* fix(vis): populate workDir from session index

* fix(vis): return broken-state sessions from detail lookup

* fix(vis): tolerate per-session wire read failures during listing

* fix(vis): read wire files from canonical session path

* feat(vis): restore session detail page with full tab layout

* feat(vis): wire subagent context tab to real ContextTab

* fix(vis): sync wire and context tab agentId with prop changes

* feat(vis): auto-pick a free dev port when 3001 is busy

* feat(vis): accept v1.0 wire files via agent-core migration chain

* refactor(vis): default API to 5174 and pick a non-colliding vite port

* feat(vis): make long strings expandable with copy in JsonViewer

* fix(vis): stop gating session health on protocol version

* refactor(vis): split wire records into raw + projected; best-effort unknown protocol

* feat(vis): pair tool.call with tool.result via inline cross-reference and hover highlight

* feat(vis): open session folder and copy its path from the detail header

* fix(vis): reconstruct assistant and tool messages from loop events

* fix(vis): keep system prompt bubble within the message column width

* feat(vis): collapse tool result bubble by default in context view

* feat(vis): expose broken_main_wire in the session health filter

* fix(vis): reset wire and context tab agent when navigating sessions

* fix(vis): fall back to a generic headline for unknown wire record types

* fix(vis): emit compaction summary as an assistant message with origin

* fix(vis): harden session-store reads for broken wires, broken state, and path-traversal agent ids

* feat(vis): inline image previews for image_url content parts
2026-05-26 17:57:49 +08:00

48 lines
1.6 KiB
TypeScript

import { cp, mkdir, readFile, writeFile, rm } from 'node:fs/promises';
import { join } from 'node:path';
import { tmpdir } from 'node:os';
/** Copy a fixture session into a temp dir, rewriting state.json.agents.*.homedir
* to the real path so wire-reader / agent-tree can resolve them. */
export async function buildSessionFixture(name: string): Promise<{
home: string;
sessionDir: string;
cleanup: () => Promise<void>;
}> {
const src = new URL(`./sessions/${name}`, import.meta.url).pathname;
const home = await mkdtemp();
const sessionsDir = join(home, 'sessions', 'wd_test_000000000000');
const sessionDir = join(sessionsDir, 'session_fixture');
await mkdir(sessionsDir, { recursive: true });
await cp(src, sessionDir, { recursive: true });
// Rewrite homedir placeholders.
const statePath = join(sessionDir, 'state.json');
const state = JSON.parse(await readFile(statePath, 'utf8'));
for (const id of Object.keys(state.agents)) {
state.agents[id].homedir = join(sessionDir, 'agents', id);
}
await writeFile(statePath, JSON.stringify(state, null, 2));
// Write session_index.jsonl.
await writeFile(
join(home, 'session_index.jsonl'),
JSON.stringify({
sessionId: 'session_fixture',
sessionDir,
workDir: '/tmp/work',
}) + '\n',
);
return {
home,
sessionDir,
cleanup: () => rm(home, { recursive: true, force: true }),
};
}
async function mkdtemp(): Promise<string> {
const base = join(tmpdir(), `vis-fixture-${process.pid}-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`);
await mkdir(base, { recursive: true });
return base;
}