import fs from 'node:fs'; import assert from 'node:assert/strict'; import {runWorkshop,createWorkshopCaller} from '../skills/ksf-workshop-runtime/scripts/ksf-workshop.mjs'; import {loadPublicBoard} from '../src/services/workshop-data.js'; import {buildModel} from '../src/core/kfs/build.js'; // Read existing technical-test IDs. Never replay writes or manufacture a new test round. const config={}; for(const line of fs.readFileSync(process.env.KSF_SERVICE_CONFIG||'F:/文档/康师傅数字人受限连接.env','utf8').split(/\r?\n/)){ const m=line.match(/^(KSF_SERVICE_TOKEN|KSF_FUNCTIONS_URL|KSF_PARSE_APP_ID)=(.*)$/);if(m)config[m[1]]=m[2].trim(); } try{ const ids=JSON.parse(fs.readFileSync('work/workshop-live.json')); const call=createWorkshopCaller({token:config.KSF_SERVICE_TOKEN,url:config.KSF_FUNCTIONS_URL,appId:config.KSF_PARSE_APP_ID}); const result=await runWorkshop('project-status',{sessionId:ids.sessionId,projectId:ids.projectId},{requestId:'KSF-workshop-readback-20261101',call}); assert.equal(result.project.dataMode,'sample');assert.equal(result.project.progressState,'completed'); assert.equal(result.concept.objectId,ids.conceptId);assert.equal(result.concept.dataMode,'sample'); assert.equal(result.artifacts.length,3);assert.equal(result.formulaItems.length,1);assert.equal(result.events.length,10); 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,'工作坊联调(非学员)');} const raw=await loadPublicBoard({url:config.KSF_FUNCTIONS_URL,appId:config.KSF_PARSE_APP_ID}); const db=buildModel(raw); assert.equal(db.projectById[ids.projectId].stage.code,'S5'); assert.equal(db.artifactById[ids.artifactId].projectId,ids.projectId); const publicProject=raw.project.find(p=>p.objectId===ids.projectId);assert.equal(typeof publicProject.uploadedByKey,'string'); 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}; fs.writeFileSync('work/workshop-readback.json',JSON.stringify(out,null,2));console.log(JSON.stringify(out,null,2)); }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;}