test-workflow-status-tools.js 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. #!/usr/bin/env node
  2. import assert from 'assert';
  3. import fs from 'fs';
  4. import os from 'os';
  5. import path from 'path';
  6. import { WebServer } from './src/server/server.js';
  7. import { createVLGenerateTool } from './src/tools/vl-generate.js';
  8. import { createVLAdjustTool } from './src/tools/vl-adjust.js';
  9. import { createWorkflowRunTool } from './src/tools/workflow-run.js';
  10. function createTempProject() {
  11. const dir = fs.mkdtempSync(path.join(os.tmpdir(), 'vlcode-workflow-status-'));
  12. fs.mkdirSync(path.join(dir, '.vl-code'), { recursive: true });
  13. fs.writeFileSync(path.join(dir, '.vl-code', 'workspace.json'), '{}');
  14. return dir;
  15. }
  16. async function main() {
  17. const workDir = createTempProject();
  18. const projectContext = {
  19. workDir,
  20. async load() {},
  21. async scan() {},
  22. isVLProject() { return true; },
  23. getSummary() { return { projectName: path.basename(workDir) }; },
  24. getAllFiles() { return []; },
  25. };
  26. const toolRegistry = {
  27. clear() {},
  28. execute: async () => ({}),
  29. getToolSchemas() { return []; },
  30. };
  31. const server = new WebServer({
  32. config: { workDir, port: 4002 },
  33. orchestrator: null,
  34. projectContext,
  35. contextManager: null,
  36. toolRegistry,
  37. symbolIndex: null,
  38. impactAnalyzer: null,
  39. autoFix: null,
  40. localWorkspace: null,
  41. blueprintContext: null,
  42. });
  43. clearInterval(server._sseHeartbeat);
  44. server.autoExtractMeta = () => {};
  45. const generateTool = createVLGenerateTool(server.config);
  46. const adjustTool = createVLAdjustTool(server.config);
  47. const workflowTool = createWorkflowRunTool(server.config);
  48. let status = JSON.parse(await generateTool.execute({ action: 'status' }));
  49. assert.equal(status.active, false);
  50. assert.equal(status.workflowName, null);
  51. assert.equal(status.projectName, path.basename(workDir));
  52. server.config._onWorkflowStart('3-file');
  53. server.config._onWorkflowNodeStatus('LLM_100_PRD', 'running');
  54. server.config._recordWorkflowEvent({
  55. type: 'wf_node_start',
  56. nodeId: 'LLM_100_PRD',
  57. title: 'PRD Analysis',
  58. nodeType: 'LLM',
  59. input: { docs: ['31'] },
  60. });
  61. status = JSON.parse(await generateTool.execute({ action: 'status' }));
  62. assert.equal(status.active, true);
  63. assert.equal(status.workflowName, '3-file');
  64. assert.equal(status.nodeStatuses.LLM_100_PRD, 'running');
  65. assert.equal(status.nodeDetails.LLM_100_PRD.title, 'PRD Analysis');
  66. assert.equal(status.timeline[0].type, 'wf_node_start');
  67. let adjustStatus = JSON.parse(await adjustTool.execute({ action: 'status' }));
  68. assert.equal(adjustStatus.active, true);
  69. assert.equal(adjustStatus.workflowName, '3-file');
  70. assert.equal(adjustStatus.nodeDetails.LLM_100_PRD.type, 'LLM');
  71. let workflowStatus = JSON.parse(await workflowTool.execute({ mode: 'status' }));
  72. assert.equal(workflowStatus.active, true);
  73. assert.equal(workflowStatus.workflowName, '3-file');
  74. assert.equal(workflowStatus.nodeDetails.LLM_100_PRD.status, 'running');
  75. server.config._onWorkflowDone();
  76. await new Promise((resolve) => setTimeout(resolve, 0));
  77. adjustStatus = JSON.parse(await adjustTool.execute({ action: 'status' }));
  78. assert.equal(adjustStatus.active, false);
  79. assert.equal(adjustStatus.workflowName, null);
  80. workflowStatus = JSON.parse(await workflowTool.execute({ mode: 'status' }));
  81. assert.equal(workflowStatus.active, false);
  82. assert.equal(workflowStatus.workflowName, null);
  83. fs.rmSync(workDir, { recursive: true, force: true });
  84. console.log('\n── Workflow Status Tools ──');
  85. console.log('PASS test-workflow-status-tools.js');
  86. }
  87. main().catch((err) => {
  88. console.error(err);
  89. process.exit(1);
  90. });