journey.test.ts 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. import { expect, test } from "vitest";
  2. import { buildTaskCycles, groupParallelSteps } from "@/lib/journey";
  3. import type { JourneyEdge, JourneyStep } from "@/lib/types";
  4. function step(overrides: Partial<JourneyStep>): JourneyStep {
  5. return {
  6. step_id: "plan:task-1",
  7. sequence: 1,
  8. step_type: "plan",
  9. title: "Planner 规划·整体结构",
  10. status: "completed",
  11. task_id: "task-1",
  12. attempt_id: null,
  13. validation_id: null,
  14. decision_id: null,
  15. reasoning: "当前缺少整体结构",
  16. reasoning_source: "contract",
  17. process: { label: "创建整体结构 Task", actor: "Planner", tool_name: null, trace_id: null, details: {} },
  18. input_data: [],
  19. output_data: [],
  20. contract: { action: "创建", reasoning: "需要结构", goals: ["goal-1"], inputs: [], output: "整体结构", criteria: [] },
  21. parallel_group_id: null,
  22. parallel_position: null,
  23. parallel_total: null,
  24. model: null,
  25. tokens: null,
  26. cost: null,
  27. duration_ms: null,
  28. created_at: "2026-07-21T00:00:00Z",
  29. evidence: { contract: null, tool_calls: [], artifact_refs: [], validation: null, decision: null },
  30. ...overrides,
  31. };
  32. }
  33. test("全局层按 Task 聚合规划、执行、验收和返工", () => {
  34. const values = [
  35. step({}),
  36. step({ step_id: "execute:attempt-1", step_type: "execute", attempt_id: "attempt-1" }),
  37. step({ step_id: "decide:decision-1", step_type: "decide", decision_id: "decision-1", status: "retry" }),
  38. ];
  39. const edges: JourneyEdge[] = [
  40. { edge_id: "loop", source: "decide:decision-1", target: "execute:attempt-1", relation: "loop", label: "重试" },
  41. ];
  42. const cycles = buildTaskCycles(values, edges);
  43. expect(cycles).toHaveLength(1);
  44. expect(cycles[0].title).toBe("整体结构");
  45. expect(cycles[0].loopCount).toBe(1);
  46. expect(cycles[0].steps).toHaveLength(3);
  47. });
  48. test("步骤层把同一 Operation 的 Worker 表达为并行组", () => {
  49. const values = [
  50. step({ step_id: "execute:a", step_type: "execute", parallel_group_id: "operation-1" }),
  51. step({ step_id: "execute:b", step_type: "execute", task_id: "task-2", parallel_group_id: "operation-1" }),
  52. ];
  53. const groups = groupParallelSteps(values);
  54. expect(groups).toHaveLength(1);
  55. expect(groups[0].kind).toBe("parallel");
  56. expect(groups[0].steps).toHaveLength(2);
  57. });