1import{a as pe,b as ge}from"./chunk-ATUBUXPX.js";import{a as se}from"./chunk-EWCSPE2Q.js";import{a as Z}from"./chunk-5JN7F7FY.js";import{o as le}from"./chunk-IWDP7PKU.js";import{a as de,b as me,c as ce}from"./chunk-TA52GWVR.js";import{ba as oe,d as re,i as ae}from"./chunk-S6NOG6GR.js";import"./chunk-CS5OIP4H.js";import{A as ne,d as ee,g as te,k as ie}from"./chunk-SCQS7PRT.js";import{$a as _,Bb as U,Hc as W,Ja as p,Kb as P,Mb as O,Nb as B,Oa as l,Qa as j,T as G,U as I,X as y,Y as b,Za as r,_a as n,ab as T,ac as K,bb as w,bc as J,ca as C,db as D,fb as x,gb as c,ic as Q,kc as X,n as S,qb as R,rb as o,sa as V,sb as g,tb as A,ub as M,va as a,wa as E,wb as L,xb as F,yb as N}from"./chunk-4RM5XAMP.js";import{a as $,h as Y}from"./chunk-RVFOIZLJ.js";function ye(e,s){if(e&1&&(r(0,"div",17)(1,"div",18)(2,"div")(3,"h5",19),_(4,"i",20),o(5),n(),r(6,"p",21),o(7,"Accredited by "),r(8,"strong"),o(9),n()(),r(10,"small",22),o(11),n()(),_(12,"p-tag",23),n()()),e&2){let t=c();a(5),M("",t.me.role," \xB7 ",t.me.domain,""),a(4),g(t.me.org_name),a(2),g(t.me.did),a(),l("severity",t.me.custody_tier==="self_passkey"?"success":"info")("value",t.tierLabel())}}function be(e,s){if(e&1&&(r(0,"span",30),o(1),n()),e&2){let t=c(2);a(),g(t.pendingCount)}}function Se(e,s){e&1&&(r(0,"div",31),o(1,"Loading requests\u2026"),n())}function Ie(e,s){if(e&1&&(r(0,"div",38),o(1),n()),e&2){let t=c().$implicit;a(),A("\u201C",t.message,"\u201D")}}function Ce(e,s){if(e&1){let t=D();r(0,"div")(1,"button",39),x("click",function(){y(t);let m=c().$implicit,d=c(2);return b(d.review(m))}),o(2,"Review"),n(),r(3,"button",40),x("click",function(){y(t);let m=c().$implicit,d=c(2);return b(d.decline(m))}),o(4,"Decline"),n()()}if(e&2){let t=c(3);a(),l("disabled",t.loadingTarget)}}function Ee(e,s){if(e&1&&(r(0,"span",41),o(1),n()),e&2){let t=c().$implicit;j("bg-success",t.status==="attested")("bg-secondary",t.status==="declined"),a(),g(t.status)}}function Te(e,s){if(e&1&&(r(0,"div",32)(1,"div",33)(2,"div")(3,"strong"),o(4),n(),r(5,"span",31),o(6," requests your attestation on "),n(),r(7,"strong"),o(8),n(),r(9,"div",34),o(10),P(11,"date"),n(),p(12,Ie,2,1,"div",35),n(),p(13,Ce,5,1,"div",36)(14,Ee,2,5,"ng-template",null,37,B),n()()),e&2){let t=s.$implicit,i=R(15);j("opacity-50",t.status!=="pending"),a(4),g(t.student_name||"A student"),a(4),g(t.credential_type||"a credential"),a(2),g(O(11,8,t.created_at,"medium")),a(2),l("ngIf",t.message),a(),l("ngIf",t.status==="pending")("ngIfElse",i)}}function we(e,s){if(e&1&&(r(0,"div",24)(1,"h6",25),_(2,"i",26),o(3,"Requests "),p(4,be,2,1,"span",27),n(),p(5,Se,2,0,"div",28)(6,Te,16,11,"div",29),n()),e&2){let t=c();a(4),l("ngIf",t.pendingCount),a(),l("ngIf",t.loadingRequests),a(),l("ngForOf",t.requests)}}function Ae(e,s){e&1&&_(0,"span",42)}function qe(e,s){e&1&&(r(0,"span"),o(1,"Look up"),n())}function ke(e,s){if(e&1&&(r(0,"small",43),o(1),n()),e&2){let t=c();a(),g(t.targetError)}}function He(e,s){if(e&1&&_(0,"img",62),e&2){let t=c(2);l("src",t.targetSubject.s3_url,V)}}function Ve(e,s){e&1&&(r(0,"div",63),_(1,"i",64),o(2,"Certificate image not available "),n())}function je(e,s){if(e&1&&(r(0,"div",34),o(1),n()),e&2){let t=c(2);a(),g(t.targetSubject.email)}}function De(e,s){if(e&1&&(T(0),r(1,"dt",51),o(2,"Issued on"),n(),r(3,"dd",52),o(4),P(5,"date"),n(),w()),e&2){let t=c(2);a(4),g(O(5,1,t.target.issuanceDate||t.target.validFrom,"mediumDate"))}}function Re(e,s){if(e&1&&(T(0),r(1,"dt",51),o(2,"Description"),n(),r(3,"dd",65),o(4),n(),w()),e&2){let t=c(2);a(4),g(t.targetSubject.narrative)}}function Me(e,s){if(e&1&&(r(0,"a",68),o(1,"View artifact"),n()),e&2){let t=c().$implicit;l("href",t.locator,V)}}function Le(e,s){if(e&1&&(r(0,"div"),o(1),p(2,Me,2,1,"a",67),n()),e&2){let t=s.$implicit;a(),A(" ",(t.metadata==null?null:t.metadata.label)||(t.type==null?null:t.type[0])||"Evidence"," "),a(),l("ngIf",t.locator)}}function Fe(e,s){if(e&1&&(T(0),r(1,"dt",51),o(2,"Evidence"),n(),r(3,"dd",52),p(4,Le,3,2,"div",66),n(),w()),e&2){let t=c(2);a(4),l("ngForOf",t.target.evidence)}}function Ne(e,s){e&1&&_(0,"span",69)}function Pe(e,s){e&1&&_(0,"i",70)}function Oe(e,s){if(e&1&&(r(0,"span",74),_(1,"p-tag",23),o(2," \u2014 verified via the trust chain "),n()),e&2){let t=c(3);a(),l("severity",t.signedStrength==="STRONG"?"success":"warning")("value",t.signedStrength)}}function Be(e,s){if(e&1&&(r(0,"div",71),_(1,"i",72),o(2," Signed. Attestation ID: "),r(3,"code"),o(4),n(),p(5,Oe,3,2,"span",73),n()),e&2){let t=c(2);a(4),g(t.signedVcId),a(),l("ngIf",t.signedStrength)}}var We=()=>[];function ze(e,s){if(e&1){let t=D();r(0,"div",44)(1,"h6"),_(2,"i",45),o(3,"You are attesting:"),n(),r(4,"div",4)(5,"div",46),p(6,He,1,1,"img",47)(7,Ve,3,0,"ng-template",null,48,B),n(),r(9,"div",49)(10,"dl",50)(11,"dt",51),o(12,"Student"),n(),r(13,"dd",52),o(14),p(15,je,2,1,"div",53),n(),r(16,"dt",51),o(17,"Credential"),n(),r(18,"dd",52),o(19),n(),r(20,"dt",51),o(21,"Issued by"),n(),r(22,"dd",54),o(23),n(),p(24,De,6,4,"ng-container",11)(25,Re,5,1,"ng-container",11)(26,Fe,5,1,"ng-container",11),n()()(),r(27,"div",55)(28,"label",6),o(29,"Your statement"),n(),r(30,"textarea",56),N("ngModelChange",function(m){
1y(t);let d=c();return F(d.statement,m)||(d.statement=m),b(m)}),n()(),r(31,"button",57),x("click",function(){y(t);let m=c();return b(m.sign())}),p(32,Ne,1,0,"span",58)(33,Pe,1,0,"i",59),o(34," Sign attestation "),n(),r(35,"small",60),o(36,"You'll be asked for your passkey \u2014 you sign this, not qseverse."),n(),p(37,Be,6,2,"div",61),n()}if(e&2){let t=R(8),i=c();a(6),l("ngIf",i.targetSubject.s3_url)("ngIfElse",t),a(8),A(" ",i.targetSubject.full_name||i.targetSubject.name||i.targetSubject.email||i.targetStudentDid||"\u2014"," "),a(),l("ngIf",(i.targetSubject.full_name||i.targetSubject.name)&&i.targetSubject.email),a(4),g(i.targetSubject.credential_type||i.targetSubject.title||i.targetSubject.credential_name||(i.target.type||U(15,We)).join(", ")),a(3),l("title",i.issuerDid),a(),g(i.targetSubject.publisher_name||i.issuerDid),a(),l("ngIf",i.target.issuanceDate||i.target.validFrom),a(),l("ngIf",i.targetSubject.narrative),a(),l("ngIf",i.target.evidence==null?null:i.target.evidence.length),a(4),L("ngModel",i.statement),a(),l("disabled",i.signing||!i.statement.trim()||!i.targetStudentDid),a(),l("ngIf",i.signing),a(),l("ngIf",!i.signing),a(4),l("ngIf",i.signedVcId)}}function $e(e,s){e&1&&(r(0,"div",75)(1,"div",76)(2,"span",77),o(3,"Loading..."),n()()())}function Ye(e,s){e&1&&(r(0,"tr")(1,"th"),o(2,"Attested credential"),n(),r(3,"th"),o(4,"Statement"),n(),r(5,"th"),o(6,"Date"),n(),r(7,"th"),o(8,"Strength"),n()())}function Ge(e,s){if(e&1&&(r(0,"tr")(1,"td")(2,"code"),o(3),n()(),r(4,"td"),o(5),n(),r(6,"td"),o(7),n(),r(8,"td"),_(9,"p-tag",23),n()()),e&2){let t=s.$implicit;a(3),g(t.attestation_of),a(2),M("",(t.statement||"").slice(0,120),"",(t.statement||"").length>120?"\u2026":"",""),a(2),g(t.created),a(2),l("severity",t.strength==="STRONG"?"success":t.strength==="WEAK"?"warning":"danger")("value",t.strength||"\u2026")}}function Ue(e,s){e&1&&(r(0,"tr")(1,"td",82)(2,"div",83),o(3,"No attestations yet."),n()()())}function Ke(e,s){if(e&1&&(r(0,"p-table",78),p(1,Ye,9,0,"ng-template",79)(2,Ge,10,6,"ng-template",80)(3,Ue,4,0,"ng-template",81),n()),e&2){let t=c();l("value",t.myAttestations)("paginator",t.myAttestations.length>10)("rows",10)}}var _e=(()=>{let s=class s{constructor(i,m,d){this.attester=i,this.signer=m,this.messageService=d,this.me=null,this.targetVcId="",this.loadingTarget=!1,this.target=null,this.targetError=null,this.statement="",this.signing=!1,this.signedVcId=null,this.signedStrength=null,this.myAttestations=[],this.loadingList=!0,this.requests=[],this.loadingRequests=!0,this.activeRequestId=null,this.activeRequestVcId=null}ngOnInit(){this.attester.me().subscribe({next:i=>{this.me=i,this.loadList()},error:()=>{this.loadList()}}),this.loadRequests()}get pendingCount(){return this.requests.filter(i=>i.status==="pending").length}loadRequests(){this.loadingRequests=!0,this.attester.requests().subscribe({next:i=>{this.requests=i||[],this.loadingRequests=!1},error:()=>{this.loadingRequests=!1}})}review(i){this.activeRequestId=i.id,this.activeRequestVcId=i.vc_id,this.targetVcId=i.vc_id,this.loadTarget()}decline(i){this.attester.declineRequest(i.id).subscribe({next:()=>this.loadRequests(),error:()=>this.messageService.add({severity:"error",summary:"Error",detail:"Could not decline the request."})})}loadList(){this.loadingList=!0,this.attester.attestations().subscribe({next:i=>{this.myAttestations=i,this.loadingList=!1,i.forEach(m=>this._enrichRowStrength(m))},error:()=>{this.loadingList=!1}})}_enrichRowStrength(i){this.attester.credentialAttestations(i.attestation_of).subscribe({next:m=>{let d=this.me?.did;if(!d||!m?.length)return;let u=m.filter(v=>{let h=v?.attestation?.issuer;return(typeof h=="string"?h:h?.id)===d});if(!u.length)return;let f=u.find(v=>(v?.attestation?.issuanceDate||v?.attestation?.validFrom)===i.created)||u[u.length-1];i.strength=f?.verdict?.strength,i.trusted=f?.verdict?.trusted},error:()=>{}})}loadTarget(){let i=this.targetVcId.trim();i&&(this.loadingTarget=!0,this.target=null,this.targetError=null,this.signedVcId=null,this.attester.getCredential(i).subscribe({next:m=>{this.loadingTarget=!1,this.target=m},error:()=>{this.loadingTarget=!1,this.targetError="Credential not found \u2014 check the ID with the student."}}))}get targetSubject(){return this.target?.credentialSubject||{}}get targetStudentDid(){return this.targetSubject?.id||null}get issuerDid(){let i=this.target?.issuer;return(typeof i=="string"?i:i?.id)||""}sign(){return Y(this,null,function*(){let i=this.targetVcId.trim(),m=this.targetStudentDid;if(!(!i||!this.target||!this.statement.trim()||!this.me)){if(!m){this.targetError="This credential has no student DID \u2014 attestations require a DID-bound credential (issued to a wallet identity).";return}this.signing=!0;try{let d=yield S(this.attester.prepareAttestation({student_did:m,attestation_of:i,attestation_statement:this.statement.trim()})),u=null;this.me.custody_tier==="self_passkey"&&(u=(yield S(this.attester.custodyEnvelope()))?.envelope||null);
1let f=yield this.signer.signMessage(d.canonical_message_b64,u),v=this.activeRequestId&&this.activeRequestVcId===i?this.activeRequestId:void 0,h=yield S(this.attester.submitAttestation($({unsigned_vc:d.unsigned_vc,signature_raw_b64:f},v?{request_id:v}:{})));this.signedVcId=h?.vc_id||null,this.signedStrength=null,this.statement="",this.messageService.add({severity:"success",summary:"Signed",detail:"Attestation signed and recorded."}),this.loadList(),v&&(this.activeRequestId=null,this.activeRequestVcId=null,this.loadRequests());let ve=this.targetVcId.trim();this.attester.credentialAttestations(ve).subscribe({next:q=>{let z=this.me?.did;if(!z||!q?.length)return;let k=q.filter(he=>{let H=he?.attestation?.issuer;return(typeof H=="string"?H:H?.id)===z});if(!k.length)return;let xe=k[k.length-1];this.signedStrength=xe?.verdict?.strength||null},error:()=>{}})}catch(d){let u=d?.error?.error||d?.message||"Signing failed.";this.messageService.add({severity:"error",summary:"Error",detail:u==="signature_invalid"||String(u).includes("unlock")?"This passkey cannot unlock your signing key \u2014 use the device/passkey you enrolled with, or ask your organization for a re-invite.":u})}finally{this.signing=!1}}})}tierLabel(){return this.me?.custody_tier==="self_passkey"?"Passkey (self-custody)":this.me?.custody_tier==="self_webcrypto_local"?"Browser key (this device only)":this.me?.custody_tier||""}};s.\u0275fac=function(m){return new(m||s)(E(Z),E(se),E(re))},s.\u0275cmp=G({type:s,selectors:[["app-attester-home"]],decls:19,vars:10,consts:[[1,"container-fluid","p-3"],["class","card p-3 mb-3",4,"ngIf"],["header","New attestation"],["class","mb-4",4,"ngIf"],[1,"row","g-3"],[1,"col-md-6"],[1,"form-label"],[1,"input-group"],["placeholder","e.g. 3f2a9c\u2026",1,"form-control",3,"ngModel","ngModelChange","keyup.enter"],[1,"btn","btn-primary",3,"disabled","click"],["class","spinner-border spinner-border-sm","role","status",4,"ngIf"],[4,"ngIf"],["class","text-danger",4,"ngIf"],["class","card p-3 mt-3",4,"ngIf"],["header","My attestations"],["class","text-center py-5",4,"ngIf"],["styleClass","p-datatable-striped",3,"value","paginator","rows",4,"ngIf"],[1,"card","p-3","mb-3"],[1,"d-flex","justify-content-between","align-items-center","flex-wrap"],[1,"mb-1"],[1,"ri-user-star-line","me-2"],[1,"text-muted","mb-0"],[1,"text-muted","text-break"],[3,"severity","value"],[1,"mb-4"],[1,"mb-2"],[1,"ri-inbox-line","me-1"],["class","badge bg-primary ms-1",4,"ngIf"],["class","text-muted",4,"ngIf"],["class","card p-3 mb-2",3,"opacity-50",4,"ngFor","ngForOf"],[1,"badge","bg-primary","ms-1"],[1,"text-muted"],[1,"card","p-3","mb-2"],[1,"d-flex","justify-content-between","align-items-start","flex-wrap","gap-2"],[1,"text-muted",2,"font-size","12px"],["class","fst-italic mt-1",4,"ngIf"],[4,"ngIf","ngIfElse"],["actedBadge",""],[1,"fst-italic","mt-1"],[1,"btn","btn-sm","btn-primary","me-2",3,"disabled","click"],[1,"btn","btn-sm","btn-secondary",3,"click"],[1,"badge"],["role","status",1,"spinner-border","spinner-border-sm"],[1,"text-danger"],[1,"card","p-3","mt-3"],[1,"ri-award-line","me-1"],[1,"col-md-5"],["class","credential-image","alt","credential",3,"src",4,"ngIf","ngIfElse"],["noImage",""],[1,"col-md-7"],[1,"row","mb-0"],[1,"col-sm-4"],[1,"col-sm-8"],["class","text-muted","style","font-size: 12px;",4,"ngIf"],[1,"col-sm-8","text-break",3,"title"],[1,"mt-3"],["rows","4","placeholder","e.g. I supervised this project and confirm the work is the student's own\u2026",1,"form-control",3,"ngModel","ngModelChange"],[1,"btn","btn-primary","mt-3",3,"disabled","click"],["class","spinner-border spinner-border-sm me-1","role","status",4,"ngIf"],["class","ri-quill-pen-line me-1",4,"ngIf"],[1,"text-muted","d-block","mt-1"],["class","alert alert-success mt-3",4,"ngIf"],["alt","credential",1,"credential-image",3,"src"],[1,"credential-image-empty","text-muted"],[1,"ri-image-line","me-1"],[1,"col-sm-8",2,"white-space","pre-line"],[4,"ngFor","ngForOf"],["class","ms-1","target","_blank","rel","noopener noreferrer",3,"href",4,"ngIf"],["target","_blank","rel","noopener noreferrer",1,"ms-1",3,"href"],["role","status",1,"spinner-border","spinner-border-sm","me-1"],[1,"ri-quill-pen-line","me-1"],[1,"alert","alert-success","mt-3"],[1,"ri-checkbox-circle-line","me-1"],["class","ms-2",4,"ngIf"],[1,"ms-2"],[1,"text-center","py-5"],["role","status",1,"spinner-border","text-primary"],[1,"visually-hidden"],["styleClass","p-datatable-striped",3,"value","paginator","rows"],["pTemplate","header"],["pTemplate","body"],["pTemplate","emptymessage"],["colspan","4"],[1,"text-center","py-5","text-muted"]],template:function(m,d){m&1&&(r(0,"div",0),p(1,ye,13,6,"div",1),r(2,"p-tabView")(3,"p-tabPanel",2),p(4,we,7,3,"div",3),r(5,"div",4)(6,"div",5)(7,"label",6),o(8,"Credential ID (ask the student for it)"),n(),r(9,"div",7)(10,"input",8),N("ngModelChange",function(f){return F(d.targetVcId,f)||(d.targetVcId=f),f}),x("keyup.enter",function(){return d.loadTarget()}),n(),r(11,"button",9),x("click",function(){return d.loadTarget()}),p(12,Ae,1,0,"span",10)(13,qe,2,0,"span",11),n()(),p(14,ke,2,1,"small",12),n()(),p(15,ze,38,16,"div",13),n(),r(16,"p-tabPanel",14),p(17,$e,4,0,"div",15)(18,Ke,4,3,"p-table",16),n()()()),m&2&&(a(),l("ngIf",d.me),a(3),l("ngIf",d.loadingRequests||d.requests.length),a(6),L("ngModel",d.targetVcId),a(),l("disabled",d.loadingTarget||!d.targetVcId.trim()),a(),l("ngIf",d.loadingTarget),a(),l("ngIf",!d.loadingTarget),a(),l("ngIf",d.targetError),a(),l("ngIf",d.target),a(2),l("ngIf",d.loadingList),a(),l("ngIf",!d.loadingList))},dependencies:[K,J,ee,te,ie,me,de,ae,pe,oe,Q],styles:[".credential-image[_ngcontent-%COMP%]{width:100%;border:1px solid #e9ebec;border-radius:4px}.credential-image-empty[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:center;min-height:160px;border:1px dashed #ced4da;border-radius:4px;font-size:13px}"]});let e=s;return e})();var Je=[{path:"",component:_e}],fe=(()=>{let s=class s{};s.\u0275fac=function(m){return new(m||s)},s.\u0275mod=I({type:s}),s.\u0275inj=C({imports:[W.forChild(Je),W]});let e=s;return e})();var ht=(()=>{let s=class s{};s.\u0275fac=function(m){return new(m||s)},s.\u0275mod=I({type:s}),s.\u0275inj=C({imports:[X,ne,ce,ge,le,fe]});let e=s;return e})();export{ht as AttesterModule};
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.