// Read this existing real-message sample round only. Never call a write function. import fs from 'node:fs'; import assert from 'node:assert/strict'; import crypto from 'node:crypto'; import {invoke} from '../server/scripts/platform-client.mjs'; import {loadPublicBoard} from '../src/services/workshop-data.js'; import {buildModel} from '../src/core/kfs/build.js'; const ids={sessionId:'2InAdyzimm',opportunityId:'rFRWpVPnjk',projectId:'U7x82sQQtE',conceptId:'JpVxAIJ8Fc',artifactId:'f7mUZET0WK',categoryId:'kvhwLIEYiq',productId:'8rot-C7B28',materialId:'YNivtOrBiA',processId:'RaxsJKEUS7'}; const artifacts=['dRJolNV70A','InnEBEIaxP','2v6pE9224g','zaIA2LCNsn','pD51dQMRXm',ids.artifactId]; const call=async(name,p)=>{const result=await invoke(name,p);if(result.http!==200||!result.body?.result?.ok)throw Error('READBACK_FAILED');return result.body.result.data;}; try{ const result=await call('ksfGetWorkshopProject',{sessionId:ids.sessionId,projectId:ids.projectId}); assert.equal(result.project.dataMode,'sample');assert.equal(result.project.progressState,'completed');assert.equal(result.project.stageCode,'S5'); 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); assert.equal(result.formulaItems[0].materialRef.objectId,ids.materialId); assert.ok(result.concept.productionSteps.some(p=>p.processId===ids.processId)); assert.equal(result.concept.specification.categoryId,ids.categoryId);assert.equal(result.concept.specification.referenceProductId,ids.productId); const session=(await call('ksfGetRecord',{className:'KfSession',objectId:ids.sessionId})).record; const attribution=session.meta.attribution; assert.equal(session.workshopKey,'KSF-企微实测-20261101-K');assert.equal(attribution.agentName,'王刚001'); assert.equal(attribution.identityBasis,'channel_context'); assert.equal(attribution.agentKey,'agent-account:7c9f85363ca4c5a529a5b363308b065998924e2394e846145a5c62c904506d2e'); const expectedParticipant='participant:'+crypto.createHash('sha256').update(JSON.stringify(['KSF-企微实测-20261101-K','participant-account:f83edd27dda7e0989a0d313c158314043fd129efb86b8f6a07db8140033c5708'])).digest('hex'); assert.equal(attribution.participantKey,expectedParticipant);assert.equal(session.userRef??null,null); const account=attribution.participantAccount,agentAccount=attribution.agentAccount; assert.equal(account.platform,'wecom');assert.equal(account.identifierType,'wecom_aibot_sender');assert.equal(account.scopeId,agentAccount.accountId); assert.equal(attribution.participantAccount.accountId?.length>0,true); const all=[]; for(const objectId of artifacts){ const record=(await call('ksfGetRecord',{className:'KfArtifact',objectId})).record; assert.equal(record.dataMode,'sample');assert.equal(record.dashboardState,'workshop');assert.equal(record.sessionRef.objectId,ids.sessionId); assert.equal(record.agentName,'王刚001');assert.deepEqual(record.meta.attribution,attribution);all.push(record); } for(const [className,id]of [['KfCategory',ids.categoryId],['KfProduct',ids.productId],['KfMaterial',ids.materialId],['KfProcess',ids.processId]])assert.equal((await call('ksfGetRecord',{className,objectId:id})).record.dataMode,'sample'); const raw=await loadPublicBoard({url:'https://kangshifu.fmode.cn/api/functions',appId:'FKieRbIoGt_main'}),db=buildModel(raw); assert.equal(db.projectById[ids.projectId].stage.code,'S5');assert.equal(db.artifactById[ids.artifactId].projectId,ids.projectId); for(const id of artifacts)assert.ok(raw.artifact.some(a=>a.objectId===id&&a.dataMode==='sample')); assert.ok(raw.opportunity.some(o=>o.objectId===ids.opportunityId)); for(const secret of [account.accountId,account.scopeId,session.meta.conversationKey].filter(Boolean))assert.equal(JSON.stringify(raw).includes(secret),false); const out={ok:true,at:new Date().toISOString(),readOnly:true,businessWrites:0,...ids,artifactIds:artifacts,reportUrl:'https://kangshifu.fmode.cn/report/'+ids.artifactId,stage:'S5',progressState:'completed',dataMode:'sample',projectArtifactCount:3,sessionArtifactCount:6,eventCount:10,formulaItemCount:1,privateAttributionMatched:true,publicBoardDataVerified:true,agentName:'王刚001',participantDisplayName:session.studentName,formalReportPublished:false,actualPlatformCollectionPerformed:false,browserVerified:false}; fs.writeFileSync('work/workshop-K-readback-20261102.json',JSON.stringify(out,null,2));console.log(JSON.stringify(out,null,2)); }catch(e){console.error(JSON.stringify({ok:false,error:'K_READBACK_FAILED',step:e.code==='ERR_ASSERTION'?e.message:'读取失败;不输出原始异常或账号'}));process.exitCode=1;}