verify-workshop-readback.mjs 2.7 KB

123456789101112131415161718192021222324252627
  1. import fs from 'node:fs';
  2. import assert from 'node:assert/strict';
  3. import {runWorkshop,createWorkshopCaller} from '../skills/ksf-workshop-runtime/scripts/ksf-workshop.mjs';
  4. import {loadPublicBoard} from '../src/services/workshop-data.js';
  5. import {buildModel} from '../src/core/kfs/build.js';
  6. // Read existing technical-test IDs. Never replay writes or manufacture a new test round.
  7. const config={};
  8. for(const line of fs.readFileSync(process.env.KSF_SERVICE_CONFIG||'F:/文档/康师傅数字人受限连接.env','utf8').split(/\r?\n/)){
  9. const m=line.match(/^(KSF_SERVICE_TOKEN|KSF_FUNCTIONS_URL|KSF_PARSE_APP_ID)=(.*)$/);if(m)config[m[1]]=m[2].trim();
  10. }
  11. try{
  12. const ids=JSON.parse(fs.readFileSync('work/workshop-live.json'));
  13. const call=createWorkshopCaller({token:config.KSF_SERVICE_TOKEN,url:config.KSF_FUNCTIONS_URL,appId:config.KSF_PARSE_APP_ID});
  14. const result=await runWorkshop('project-status',{sessionId:ids.sessionId,projectId:ids.projectId},{requestId:'KSF-workshop-readback-20261101',call});
  15. assert.equal(result.project.dataMode,'sample');assert.equal(result.project.progressState,'completed');
  16. assert.equal(result.concept.objectId,ids.conceptId);assert.equal(result.concept.dataMode,'sample');
  17. assert.equal(result.artifacts.length,3);assert.equal(result.formulaItems.length,1);assert.equal(result.events.length,10);
  18. for(const a of result.artifacts){assert.equal(a.dashboardState,'workshop');assert.equal(a.dataMode,'sample');assert.equal(a.agentName,'王刚001(联调模拟)');assert.equal(a.ownerName,'工作坊联调(非学员)');}
  19. const raw=await loadPublicBoard({url:config.KSF_FUNCTIONS_URL,appId:config.KSF_PARSE_APP_ID});
  20. const db=buildModel(raw);
  21. assert.equal(db.projectById[ids.projectId].stage.code,'S5');
  22. assert.equal(db.artifactById[ids.artifactId].projectId,ids.projectId);
  23. const publicProject=raw.project.find(p=>p.objectId===ids.projectId);assert.equal(typeof publicProject.uploadedByKey,'string');
  24. const out={at:new Date().toISOString(),ok:true,readOnly:true,databaseWrites:0,sessionId:ids.sessionId,opportunityId:ids.opportunityId,projectId:ids.projectId,conceptId:ids.conceptId,artifactId:ids.artifactId,dataMode:'sample',stage:'S5',progressState:'completed',projectArtifactCount:3,eventCount:10,formulaItemCount:1,publicBoardVisible:true,employeeName:'工作坊联调(非学员)',agentName:'王刚001(联调模拟)',formalReportPublished:false};
  25. fs.writeFileSync('work/workshop-readback.json',JSON.stringify(out,null,2));console.log(JSON.stringify(out,null,2));
  26. }catch(e){console.error(JSON.stringify({ok:false,code:/^[A-Z][A-Z0-9_]+$/.test(e.code||'')?e.code:'READBACK_FAILED',message:'只读核查失败,未输出原始异常或凭据。'}));process.exitCode=1;}