51 lines
4.8 KiB
TypeScript
51 lines
4.8 KiB
TypeScript
import { randomUUID } from "node:crypto"
|
|
import { encryptSecret,fingerprint,privateSecretFingerprint,redact } from "../modules/mcp/security.js"
|
|
import { serverProbeReceiptMetadata } from "../modules/mcp/server-probe-actions.js"
|
|
import type { ServerProbeReceipt } from "./server-probe-execution.js"
|
|
import type { ServerProbeHistoryBinding } from "./server-probe-journal-history.js"
|
|
export async function serverProbeRetiredFixture(twoSides=false, identity?:{connectionId:string;credentialId:string;ownerId:string},
|
|
historical={base:Date.parse("2025-01-02T00:00:00Z"),retentionDays:365}){
|
|
const operationId=randomUUID(),receiptId=randomUUID(),connectionId=identity?.connectionId??randomUUID(),credentialId=identity?.credentialId??randomUUID(),ownerId=identity?.ownerId??randomUUID()
|
|
const {base,retentionDays}=historical,stamp=(ms:number)=>new Date(base+ms).toISOString()
|
|
const originalTimes={issuedAt:base,authorityExpiresAt:base+15000}
|
|
const tool=twoSides?"bandwidth":"ping",sourceServerId=9,destination=twoSides?{destinationServerId:11}:{}
|
|
const prepared={receiptId,tool,serverId:sourceServerId,...destination,expiresAt:stamp(15000),bindingCiphertext:"inert-private-inner-binding"}
|
|
const binding={version:1,operation:"servers.probes.run",principal:{connectionId,credentialId,credentialExpiresAt:stamp(30000)},
|
|
ownerId,...originalTimes,prepared,bindingProof:"a".repeat(64),stageBudget:twoSides?1:2}
|
|
const proof=(domain:string,value:unknown)=>privateSecretFingerprint(fingerprint(value),domain)
|
|
const input={serverId:sourceServerId,receiptId,inputDigest:await proof("server-probe-mcp-binding-v1",binding),
|
|
bindingCiphertext:await encryptSecret(JSON.stringify(binding))}
|
|
const step={kind:"service",service:binding.operation,input}
|
|
const serverIds=twoSides?[9,11]:[9]
|
|
const evidence={steps:[step],requiresHuman:true,verificationScope:"acknowledgement",mutationCost:binding.stageBudget,
|
|
target:{scope:"servers",serverIds},validUntil:prepared.expiresAt}
|
|
const context:ServerProbeHistoryBinding["context"]={identity:{kind:"mcp",operationName:"servers.probes.run",ownerId,
|
|
connectionId,credentialId,executionId:operationId,issuedAt:base,expiresAt:base+15000},sourceServerId,...destination,tool}
|
|
const receipt:ServerProbeReceipt={receiptId,serverId:sourceServerId,...destination,tool,state:"completed",httpStatus:200,
|
|
attemptedStages:1,completedStages:1,output:"INERT_RESULT_ONLY_IN_ORIGINAL_PAYLOAD",data:{kind:tool},automaticReplay:false,forwardingVerified:false}
|
|
const metadata=serverProbeReceiptMetadata(receipt,operationId,binding.stageBudget)
|
|
const plaintext=JSON.stringify({version:1,context,bindingProof:binding.bindingProof,receipt})
|
|
const payload={receipt_id:receiptId,receipt_proof:await proof("server-probe-journal-v1:receipt",plaintext),receipt_ciphertext:await encryptSecret(plaintext)}
|
|
const anchor={receipt_id:receiptId,binding_proof:binding.bindingProof,identity_kind:"mcp",execution_id:operationId,
|
|
actor_id:ownerId,authentication:"mcp",mcp_connection_id:connectionId,mcp_credential_id:credentialId,request_id:null,
|
|
authority_issued_at:String(base),authority_expires_at:stamp(15000),source_server_id:sourceServerId,
|
|
destination_server_id:destination.destinationServerId??null,tool,state:"completed",receipt_proof:payload.receipt_proof,
|
|
attempted_stages:1,completed_stages:1,created_at:stamp(500),finished_at:stamp(1000)}
|
|
const raw={
|
|
original:{operation_id:operationId,connection_id:connectionId,owner_id:ownerId,plan_id:randomUUID(),
|
|
operation_name:binding.operation,operation_version:1,operation_state:"applied",operation_verification:"inconclusive",operation_error_code:null,
|
|
operation_result:{confirmedWrites:0,verificationScope:"acknowledgement",completedServiceSteps:1,diagnosticReceipt:metadata},
|
|
plan_state:"completed",approved_by:ownerId,evidence:{sealed:await encryptSecret(JSON.stringify(evidence))},
|
|
step_index:0,step_state:"acknowledged",intended_state:redact(step),step_result:metadata,
|
|
operation_created_at:stamp(100),operation_finished_at:stamp(1500),plan_created_at:stamp(10),plan_approved_at:stamp(50),
|
|
plan_expires_at:stamp(16000),step_created_at:stamp(200),step_finished_at:stamp(1400)},
|
|
admission:{receipt_id:receiptId,owner_id:ownerId,identity_kind:"mcp",execution_id:operationId,binding_proof:binding.bindingProof,
|
|
authority_expires_at:stamp(15000),claim_token:null,claim_attempted_at:stamp(400),purged_at:null,cancelled_at:null,created_at:stamp(300),
|
|
retention_days:retentionDays,safety_ms:60000,gc_not_before:stamp(15000+retentionDays*86400000+60000)},
|
|
anchor,payload,stages:[{receipt_id:receiptId,stage_index:1,kind:twoSides?"native-bandwidth":"native-ping",timeout_ms:1000,
|
|
state:"received",outcome:"received",created_at:stamp(600),received_at:stamp(900)}],quarantineCount:0,cancellationCount:0,
|
|
}
|
|
return {raw,context,receipt,serverIds,stamp}
|
|
}
|
|
|