| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950 |
- // Exact read-only lookup; never calls start/save/search.
- import fs from 'node:fs';
- import crypto from 'node:crypto';
- import assert from 'node:assert/strict';
- import {invoke,classRows} from '../server/scripts/platform-client.mjs';
- import {loadPublicBoard} from '../src/services/workshop-data.js';
- const sessionId='btrFqkz0yw',artifactId='cOm6c8gg7z',sourceId='CI8dFPUdTz',workshopKey='KSF-真实资料-20261102-01';
- const template=JSON.parse(fs.readFileSync(new URL('../server/test/fixtures/first-live-S1-20261102.json',import.meta.url)));
- const call=async(name,p)=>{const r=await invoke(name,p);assert.equal(r.http,200);assert.equal(r.body?.result?.ok,true);return r.body.result.data;};
- try{
- const [a,s,output,origins,history]=await Promise.all([
- call('ksfGetRecord',{className:'KfArtifact',objectId:artifactId}),call('ksfGetRecord',{className:'KfSession',objectId:sessionId}),
- call('ksfGetRecord',{className:'KfSource',objectId:sourceId}),Promise.all(template.sourceIds.map(objectId=>call('ksfGetRecord',{className:'KfSource',objectId}))),
- classRows('KfArtifact',{workshopKey})
- ]);
- const artifact=a.record,session=s.record;
- assert.equal(session.workshopKey,workshopKey);assert.equal(session.dataMode,'live');
- assert.equal(artifact.sessionRef?.objectId,sessionId);assert.equal(artifact.sourceRef?.objectId,sourceId);
- for(const k of ['title','rawText','version','stageCode','artifactType'])assert.deepEqual(artifact[k],template[k]);
- assert.equal(artifact.report.title,template.title);assert.ok(Number.isFinite(Date.parse(artifact.report.generatedAt)));
- assert.equal(artifact.report.executive[0],'课堂过程成果,未经员工正式确认;待验证项不作为市场结论。');
- assert.deepEqual(artifact.report.executive.slice(1),template.report.executive);
- for(const k of ['chapters','evidence'])assert.deepEqual(artifact.report[k],template.report[k]);
- assert.equal(output.record.rawText,template.rawText);assert.equal(output.record.sourceKind,'dataset');assert.equal(output.record.dataMode,'live');
- assert.equal(artifact.dataMode,'live');assert.equal(artifact.dashboardState,'workshop');
- assert.equal(artifact.projectRef??null,null);assert.equal(artifact.projectId??null,null);
- assert.equal(artifact.contentConfirmedAt??null,null);assert.equal(artifact.dashboardPublishedAt??null,null);
- assert.deepEqual(artifact.meta.workshop.sourceIds,template.sourceIds);assert.deepEqual(artifact.meta.workshop.pendingQuestions,template.pendingQuestions);
- assert.equal(artifact.meta.workshop.formalConfirmation,false);assert.equal(artifact.evidenceCount,2);assert.equal(artifact.sources.length,2);
- assert.equal(artifact.agentName,'王刚001');assert.equal(artifact.agentId,'agent-account:7c9f85363ca4c5a529a5b363308b065998924e2394e846145a5c62c904506d2e');
- assert.deepEqual(artifact.meta.attribution,session.meta.attribution);
- const attribution=session.meta.attribution;
- assert.equal(attribution.identityBasis,'channel_context');
- const expectedParticipant='participant:'+crypto.createHash('sha256').update(JSON.stringify([workshopKey,'participant-account:f83edd27dda7e0989a0d313c158314043fd129efb86b8f6a07db8140033c5708'])).digest('hex');
- assert.equal(attribution.participantKey,expectedParticipant);
- assert.equal(attribution.participantAccount.scopeId,attribution.agentAccount.accountId);
- for(const entry of Object.values(artifact.report.evidence)){
- const origin=origins.find(x=>x.record.objectId===entry.sourceId)?.record;assert.ok(origin);assert.equal(origin.dataMode,'live');
- for(const q of entry.quotes)assert.ok(origin.rawText.includes(q.text));
- }
- assert.equal(history.length,1);assert.equal(history[0].objectId,artifactId);
- const sessions=await classRows('KfSession',{workshopKey});assert.equal(sessions.length,1);assert.equal(sessions[0].objectId,sessionId);
- const raw=await loadPublicBoard({url:'https://kangshifu.fmode.cn/api/functions',appId:'FKieRbIoGt_main'});
- assert.ok(raw.artifact.some(x=>x.objectId===artifactId&&x.dataMode==='live'));
- // The public session projection omits dataMode; it was checked on the private record above.
- assert.ok(raw.session.some(x=>x.objectId===sessionId&&x.workshopKey===workshopKey));
- for(const v of [attribution.participantAccount.accountId,attribution.participantAccount.scopeId,session.meta.conversationKey].filter(Boolean))assert.equal(JSON.stringify(raw).includes(v),false);
- const result={ok:true,operation:'first-live-S1-independently-verified',at:new Date().toISOString(),readOnly:true,businessWrites:0,sessionId,artifactId,outputSourceId:sourceId,originalSourceIds:template.sourceIds,reportUrl:'https://kangshifu.fmode.cn/report/'+artifactId,stageCode:'S1',dataMode:'live',dashboardState:'workshop',productFlavorEntries:9,linkedProductEvidenceEntities:9,independentSourcePages:2,reportQuoteCount:2,independentManufacturerCount:1,pendingQuestionCount:6,privateAttributionMatched:true,templateMatched:true,publicBoardDataVerified:true,matchingSessionCount:1,matchingArtifactCount:1,formalReportPublished:false,employeeConfirmed:false,browserVerified:false};
- fs.writeFileSync('work/first-live-S1-readback-20261102.json',JSON.stringify(result,null,2));console.log(JSON.stringify(result,null,2));
- }catch(e){console.error(JSON.stringify({ok:false,error:'FIRST_LIVE_S1_READBACK_FAILED',checkLine:e.stack?.match(/verify-first-live-S1-readback\.mjs:(\d+):/)?.[1],message:'独立只读核验停止,未输出原始异常或私有身份。'}));process.exitCode=1;}
|