@xenosystem/agent-sdk 0.9.37 → 0.9.39
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/artifacts/browser.cjs +1 -1
- package/dist/artifacts/browser.d.cts +2 -2
- package/dist/artifacts/browser.d.ts +2 -2
- package/dist/artifacts/browser.js +1 -1
- package/dist/artifacts/{diff-artifact-CmhmeSu5.d.cts → diff-artifact--7QTtOxh.d.cts} +2 -1
- package/dist/artifacts/{diff-artifact-CmhmeSu5.d.ts → diff-artifact--7QTtOxh.d.ts} +2 -1
- package/dist/artifacts/index.cjs +10 -9
- package/dist/artifacts/index.d.cts +94 -3
- package/dist/artifacts/index.d.ts +94 -3
- package/dist/artifacts/index.js +10 -9
- package/dist/artifacts/metafile-cjs.json +1 -1
- package/dist/artifacts/metafile-esm.json +1 -1
- package/dist/automation/index.cjs +2 -2
- package/dist/automation/index.d.cts +2 -1
- package/dist/automation/index.d.ts +2 -1
- package/dist/automation/index.js +2 -2
- package/dist/automation/metafile-cjs.json +1 -1
- package/dist/automation/metafile-esm.json +1 -1
- package/dist/control-plane/index.cjs +8 -7
- package/dist/control-plane/index.d.cts +171 -1
- package/dist/control-plane/index.d.ts +171 -1
- package/dist/control-plane/index.js +8 -7
- package/dist/control-plane/metafile-cjs.json +1 -1
- package/dist/control-plane/metafile-esm.json +1 -1
- package/dist/coordination/index.cjs +2 -2
- package/dist/coordination/index.d.cts +85 -2
- package/dist/coordination/index.d.ts +85 -2
- package/dist/coordination/index.js +2 -2
- package/dist/coordination/metafile-cjs.json +1 -1
- package/dist/coordination/metafile-esm.json +1 -1
- package/dist/electron/index.cjs +48 -48
- package/dist/electron/index.d.cts +7 -1
- package/dist/electron/index.d.ts +7 -1
- package/dist/electron/index.js +48 -48
- package/dist/electron/metafile-cjs.json +1 -1
- package/dist/electron/metafile-esm.json +1 -1
- package/dist/index.cjs +345 -343
- package/dist/index.d.cts +443 -5
- package/dist/index.d.ts +443 -5
- package/dist/index.js +345 -343
- package/dist/metafile-cjs.json +1 -1
- package/dist/metafile-esm.json +1 -1
- package/dist/oracle/index.cjs +1 -1
- package/dist/oracle/index.d.cts +2 -1
- package/dist/oracle/index.d.ts +2 -1
- package/dist/oracle/index.js +1 -1
- package/dist/oracle/metafile-cjs.json +1 -1
- package/dist/oracle/metafile-esm.json +1 -1
- package/dist/recipes/index.cjs +2 -2
- package/dist/recipes/index.js +2 -2
- package/dist/recipes/metafile-cjs.json +1 -1
- package/dist/recipes/metafile-esm.json +1 -1
- package/dist/research/index.cjs +3 -3
- package/dist/research/index.d.cts +2 -1
- package/dist/research/index.d.ts +2 -1
- package/dist/research/index.js +3 -3
- package/dist/research/metafile-cjs.json +1 -1
- package/dist/research/metafile-esm.json +1 -1
- package/dist/session/index.cjs +12 -12
- package/dist/session/index.d.cts +7 -1
- package/dist/session/index.d.ts +7 -1
- package/dist/session/index.js +9 -9
- package/dist/session/metafile-cjs.json +1 -1
- package/dist/session/metafile-esm.json +1 -1
- package/ownership/audit.mjs +6 -0
- package/package.json +2 -1
package/dist/oracle/index.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var R=Object.defineProperty;var ae=Object.getOwnPropertyDescriptor;var ce=Object.getOwnPropertyNames;var de=Object.prototype.hasOwnProperty;var ue=(e,t)=>{for(var n in t)R(e,n,{get:t[n],enumerable:!0})},pe=(e,t,n,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of ce(t))!de.call(e,r)&&r!==n&&R(e,r,{get:()=>t[r],enumerable:!(i=ae(t,r))||i.enumerable});return e};var le=e=>pe(R({},"__esModule",{value:!0}),e);var ke={};ue(ke,{XENO_ORACLE_REPORT_SCHEMA_VERSION:()=>q,XenoOracleCoordinator:()=>$,XenoOracleValidationError:()=>u,assertValidXenoOracleReport:()=>O,xenoArtifactToOracleReport:()=>xe,xenoOracleReportToArtifact:()=>Te});module.exports=le(ke);var k=require("node:crypto");var M=require("node:crypto");function A(e){return{algorithm:"sha256",value:(0,M.createHash)("sha256").update(e).digest("hex")}}function x(e){return JSON.stringify(T(e,new Set))}function S(e){return A(x(e))}function T(e,t){if(e===null||typeof e!="object"){if(typeof e=="number"&&!Number.isFinite(e))throw new TypeError("Artifact JSON cannot contain non-finite numbers");return e}if(t.has(e))throw new TypeError("Artifact JSON cannot contain cycles");if(t.add(e),Array.isArray(e)){let i=e.map(r=>T(r,t));return t.delete(e),i}let n={};for(let i of Object.keys(e).sort((r,a)=>r.localeCompare(a))){let r=e[i];if(r===void 0)throw new TypeError(`Artifact JSON property ${i} is undefined`);n[i]=T(r,t)}return t.delete(e),n}var F=["plan","requirements","design","task-graph","patch","diff","file","document","diagram","screenshot","recording","browser-snapshot","test-report","review-report","security-report","performance-report","release-report","sbom","provenance","attestation"],P=["draft","pending_review","approved","rejected","superseded","archived"],L=["public","internal","confidential","restricted"],J=["agent","tool","user","system","integration"],z=["requirement","design-decision","risk","task","agent","run","tool-call","edit","commit","test-case","test-run","finding","approval","artifact","release","claim"],B=["decomposes","depends_on","implements","changes","tests","verifies","finds","fixes","reviews","approves","rejects","supersedes","derived_from","produced_by","supports_claim","contradicts_claim","released_as"];var C=require("node:buffer");var fe=/^[a-z0-9][a-z0-9._/-]{0,127}$/,me="custom:";function U(e,t=me){return e.startsWith(t)?fe.test(e.slice(t.length)):!1}var N=class extends Error{code="ARTIFACT_INVALID";issues;constructor(t,n){super(t),this.name="XenoArtifactValidationError",this.issues=n.map(i=>({...i}))}};var ge="[\\u0000-\\u001f\\u007f]",he=new RegExp(ge),Ae=/^[a-f0-9]{64}$/,ye=/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/,Ie=new Set(P),ve=new Set(L),Xe=new Set(J),_e=new Set(F),be=new Set(z),Ee=new Set(B);function o(e,t,n,i){e.push({path:t,code:n,message:i})}function s(e,t,n,i=1024){return typeof e!="string"||e.trim().length===0?(o(n,t,"required_string","Value must be a non-empty string"),!1):(e.length>i&&o(n,t,"string_too_long",`Value must not exceed ${i} characters`),he.test(e)&&o(n,t,"control_character","Value must not contain control characters"),!0)}function _(e,t,n){e!==void 0&&(!Number.isFinite(Date.parse(e))||!e.includes("T"))&&o(n,t,"invalid_timestamp","Value must be an ISO 8601 timestamp")}function y(e,t,n,i){typeof e=="string"&&e.startsWith(t)&&(U(e,t)||o(i,n,"invalid_custom_name",`Custom name after ${t} is invalid`))}function Oe(e,t,n){if(!e||typeof e!="object"){o(n,t,"missing_actor","Actor is required");return}s(e.kind,`${t}.kind`,n,64),Xe.has(e.kind)||o(n,`${t}.kind`,"unknown_actor_kind","Actor kind is not supported"),s(e.id,`${t}.id`,n,512),e?.displayName!==void 0&&s(e.displayName,`${t}.displayName`,n,512),e?.profileFingerprint!==void 0&&!/^[a-f0-9]{64}$/.test(e.profileFingerprint)&&o(n,`${t}.profileFingerprint`,"invalid_fingerprint","Profile fingerprint must be 64 lowercase hexadecimal characters")}function we(e,t,n){if(!e||typeof e!="object"){o(n,t,"invalid_anchor","Anchor must be an object");return}switch(e.kind){case"file":s(e.path,`${t}.path`,n,4096);break;case"source-line":s(e.path,`${t}.path`,n,4096),(!Number.isInteger(e.startLine)||e.startLine<1)&&o(n,`${t}.startLine`,"invalid_line","startLine must be a positive integer"),e.endLine!==void 0&&(!Number.isInteger(e.endLine)||e.endLine<e.startLine)&&o(n,`${t}.endLine`,"invalid_line_range","endLine must be greater than or equal to startLine");break;case"diff-hunk":s(e.path,`${t}.path`,n,4096),s(e.hunkId,`${t}.hunkId`,n,512);break;case"symbol":s(e.path,`${t}.path`,n,4096),s(e.symbol,`${t}.symbol`,n,1024);break;case"dom-node":s(e.pageId,`${t}.pageId`,n,512),!e.selector&&!e.accessibilityId&&!e.snapshotArtifactId&&o(n,t,"missing_dom_locator","DOM anchors require a selector, accessibility ID, or snapshot artifact ID");break;case"timeline":s(e.recordingArtifactId,`${t}.recordingArtifactId`,n,512),(!Number.isFinite(e.startMs)||e.startMs<0)&&o(n,`${t}.startMs`,"invalid_time","startMs must be a non-negative finite number"),e.endMs!==void 0&&(!Number.isFinite(e.endMs)||e.endMs<e.startMs)&&o(n,`${t}.endMs`,"invalid_time_range","endMs must be greater than or equal to startMs");break;case"region":s(e.mediaArtifactId,`${t}.mediaArtifactId`,n,512),[e.x,e.y,e.width,e.height].every(Number.isFinite)?(e.width<=0||e.height<=0)&&o(n,t,"invalid_region_size","Region width and height must be positive"):o(n,t,"invalid_region","Region coordinates must be finite numbers");break;case"artifact":s(e.artifactId,`${t}.artifactId`,n,512);break;default:typeof e.kind!="string"||!e.kind.startsWith("custom:")?o(n,`${t}.kind`,"unknown_anchor","Anchor kind is not supported"):y(e.kind,"custom:",`${t}.kind`,n)}}function I(e,t,n,i){if(!(e===null||typeof e=="string"||typeof e=="boolean")){if(typeof e=="number"){Number.isFinite(e)||o(n,t,"non_finite_number","JSON numbers must be finite");return}if(typeof e!="object"){o(n,t,"non_json_value","Value must be JSON-serializable");return}if(i.has(e)){o(n,t,"cyclic_value","Value must not contain cycles");return}if(i.add(e),Array.isArray(e))e.forEach((r,a)=>I(r,`${t}[${a}]`,n,i));else for(let[r,a]of Object.entries(e))a===void 0?o(n,`${t}.${r}`,"undefined_value","Undefined is not valid JSON"):I(a,`${t}.${r}`,n,i);i.delete(e)}}function Re(e){let t=[];if(!e||typeof e!="object")return[{path:"$",code:"invalid_artifact",message:"Artifact must be an object"}];if(e.schemaVersion!==1&&o(t,"schemaVersion","unsupported_schema",`schemaVersion must be ${1}`),s(e.artifactId,"artifactId",t,512),(!Number.isInteger(e.revision)||e.revision<1)&&o(t,"revision","invalid_revision","revision must be a positive integer"),s(e.kind,"kind",t,160),typeof e.kind=="string"&&!_e.has(e.kind)&&!e.kind.startsWith("custom:")&&o(t,"kind","unknown_artifact_kind","Artifact kind is not supported"),y(e.kind,"custom:","kind",t),s(e.title,"title",t,1024),e.description!==void 0&&s(e.description,"description",t,32768),s(e.state,"state",t,64),Ie.has(e.state)||o(t,"state","unknown_state","Artifact state is not supported"),s(e.createdAt,"createdAt",t,128),_(e.createdAt,"createdAt",t),_(e.updatedAt,"updatedAt",t),e.updatedAt&&Number.isFinite(Date.parse(e.createdAt))&&Date.parse(e.updatedAt)<Date.parse(e.createdAt)&&o(t,"updatedAt","timestamp_order","updatedAt must not precede createdAt"),s(e.mediaType,"mediaType",t,255),s(e.sensitivity,"sensitivity",t,64),ve.has(e.sensitivity)||o(t,"sensitivity","unknown_sensitivity","Sensitivity is not supported"),e.identity)for(let[i,r]of Object.entries(e.identity))r!==void 0&&s(r,`identity.${i}`,t,512);if(!e.content||typeof e.content!="object")o(t,"content","missing_content","content descriptor is required");else{!e.content.hash||typeof e.content.hash!="object"?o(t,"content.hash","missing_hash","content hash is required"):(s(e.content.hash.algorithm,"content.hash.algorithm",t,128),y(e.content.hash.algorithm,"custom:","content.hash.algorithm",t),typeof e.content.hash.algorithm=="string"&&e.content.hash.algorithm!=="sha256"&&!e.content.hash.algorithm.startsWith("custom:")&&o(t,"content.hash.algorithm","unknown_hash_algorithm","Hash algorithm is not supported"),s(e.content.hash.value,"content.hash.value",t,512),e.content.hash.algorithm==="sha256"&&!Ae.test(e.content.hash.value)&&o(t,"content.hash.value","invalid_sha256","SHA-256 hash must be 64 lowercase hexadecimal characters")),(!Number.isSafeInteger(e.content.sizeBytes)||e.content.sizeBytes<0)&&o(t,"content.sizeBytes","invalid_size","sizeBytes must be a non-negative safe integer");let i=e.content.storage;if(!i||typeof i!="object")o(t,"content.storage","missing_storage","storage reference is required");else if(i.type==="inline")if(i.text===void 0==(i.base64===void 0))o(t,"content.storage","invalid_inline_storage","Inline storage requires exactly one of text or base64");else{let r;i.text!==void 0?r=C.Buffer.from(i.text,"utf8"):i.base64!==void 0&&(ye.test(i.base64)?r=C.Buffer.from(i.base64,"base64"):o(t,"content.storage.base64","invalid_base64","Inline base64 content is malformed")),r&&e.content.sizeBytes!==r.byteLength&&o(t,"content.sizeBytes","content_size_mismatch","sizeBytes does not match inline content"),r&&e.content.hash.algorithm==="sha256"&&A(r).value!==e.content.hash.value&&o(t,"content.hash.value","content_hash_mismatch","Hash does not match inline content")}else i.type==="file"?s(i.path,"content.storage.path",t,4096):i.type==="blob"?s(i.uri,"content.storage.uri",t,8192):i.type==="git"?(s(i.commit,"content.storage.commit",t,512),s(i.path,"content.storage.path",t,4096)):i.type==="url"?(s(i.url,"content.storage.url",t,8192),_(i.expiresAt,"content.storage.expiresAt",t)):i.type==="external"?(s(i.provider,"content.storage.provider",t,255),s(i.locator,"content.storage.locator",t,8192)):o(t,"content.storage.type","unknown_storage","Storage type is not supported");e.content.encoding!==void 0&&(typeof e.content.encoding!="string"||e.content.encoding!=="utf8"&&e.content.encoding!=="base64"&&e.content.encoding!=="binary"&&!e.content.encoding.startsWith("custom:"))&&o(t,"content.encoding","unknown_encoding","Content encoding is not supported"),y(e.content.encoding,"custom:","content.encoding",t)}!e.provenance||typeof e.provenance!="object"?o(t,"provenance","missing_provenance","provenance is required"):(Oe(e.provenance.producer,"provenance.producer",t),e.provenance.capabilityLeaseIds?.forEach((i,r)=>s(i,`provenance.capabilityLeaseIds[${r}]`,t,512)),e.provenance.sourceArtifactIds?.forEach((i,r)=>s(i,`provenance.sourceArtifactIds[${r}]`,t,512)),e.provenance.attributes&&I(e.provenance.attributes,"provenance.attributes",t,new Set));let n=new Set;return e.relationships?.forEach((i,r)=>{let a=`relationships[${r}]`;s(i.relation,`${a}.relation`,t,160),typeof i.relation=="string"&&!Ee.has(i.relation)&&!i.relation.startsWith("custom:")&&o(t,`${a}.relation`,"unknown_relationship","Relationship type is not supported"),y(i.relation,"custom:",`${a}.relation`,t),s(i.target?.type,`${a}.target.type`,t,160),typeof i.target?.type=="string"&&!be.has(i.target.type)&&!i.target.type.startsWith("custom:")&&o(t,`${a}.target.type`,"unknown_reference_type","Evidence reference type is not supported"),y(i.target?.type,"custom:",`${a}.target.type`,t),s(i.target?.id,`${a}.target.id`,t,512);let d=`${i.relation}:${i.target?.type}:${i.target?.id}:${i.target?.revision??""}`;n.has(d)&&o(t,a,"duplicate_relationship","Duplicate relationship"),n.add(d),i.attributes&&I(i.attributes,`${a}.attributes`,t,new Set)}),e.anchors?.forEach((i,r)=>we(i,`anchors[${r}]`,t)),e.revision===1&&e.predecessorRevision!==void 0&&o(t,"predecessorRevision","unexpected_predecessor","First revision cannot have a predecessor"),e.revision>1&&(!Number.isInteger(e.predecessorRevision)||(e.predecessorRevision??0)>=e.revision)&&o(t,"predecessorRevision","invalid_predecessor","Later revisions require an earlier predecessor revision"),_(e.retention?.retainUntil,"retention.retainUntil",t),e.retention?.legalHold!==void 0&&typeof e.retention.legalHold!="boolean"&&o(t,"retention.legalHold","invalid_boolean","legalHold must be a boolean"),e.extensions&&I(e.extensions,"extensions",t,new Set),t}function K(e){let t=Re(e);if(t.length>0)throw new N("XENO artifact validation failed",t)}function W(e,t={}){for(let n of e){let i=n.codePointAt(0);if(i===127)return!0;if(!(i>31)&&!(i===9&&t.allowTab===!0)&&!((i===10||i===13)&&t.allowLineBreaks===!0))return!0}return!1}var q="xeno.oracle-report.v1",u=class extends Error{constructor(n){super(`XENO Oracle report is invalid: ${n.join("; ")}`);this.issues=n;this.name="XenoOracleValidationError"}issues;code="XENO_ORACLE_INVALID"},$=class{execute;adjudicate;now;idFactory;constructor(t){if(typeof t?.execute!="function"||typeof t?.adjudicate!="function")throw new TypeError("Oracle execution and adjudication functions are required");this.execute=t.execute,this.adjudicate=t.adjudicate,this.now=t.now??(()=>new Date().toISOString()),this.idFactory=t.idFactory??(n=>`${n}_${(0,k.randomUUID)()}`)}async run(t){let n=ne(t.question,"question",128e3),i=t.runId??`oracle_run_${(0,k.randomUUID)()}`;ie(i,"runId");let r=[t.primary,...t.critics,t.adjudicator];Ce(r,t.primary,t.critics,t.adjudicator);let a=this.now(),d=await this.execute({runId:i,question:n,participant:structuredClone(t.primary)}),p=Y(d,t.primary,this.idFactory("opinion"),this.now()),w=await Promise.all(t.critics.map(async l=>{let h=await this.execute({runId:i,question:n,participant:structuredClone(l),primaryOpinion:structuredClone(p)});return Y(h,l,this.idFactory("opinion"),this.now())})),c=[p,...w],g=await this.adjudicate({runId:i,question:n,participant:structuredClone(t.adjudicator),opinions:structuredClone(c)}),X=Se(g,t.adjudicator,this.now()),re=this.now(),oe=new Set(r.map(E)),se=new Set(c.flatMap(l=>l.citations.map(h=>h.citationId))),D={schemaVersion:q,reportId:this.idFactory("oracle"),runId:i,question:n,questionHash:A(n),startedAt:a,completedAt:re,opinions:c,adjudication:X,summary:{participantCount:r.length,distinctModelCount:oe.size,totalInputTokens:c.reduce((l,h)=>l+h.usage.inputTokens,X.usage.inputTokens),totalOutputTokens:c.reduce((l,h)=>l+h.usage.outputTokens,X.usage.outputTokens),unresolvedDisagreements:X.disagreements.filter(l=>l.resolution==="unresolved").length,citationCount:se.size}};return O(D),D}};function O(e){let t=[];e?.schemaVersion!==q&&t.push("schemaVersion must be xeno.oracle-report.v1"),f(e?.reportId,"reportId",t),f(e?.runId,"runId",t),m(e?.question,"question",t,128e3),(e?.questionHash?.algorithm!=="sha256"||e.questionHash.value!==A(e.question??"").value)&&t.push("questionHash does not match question"),v(e?.startedAt,"startedAt",t),v(e?.completedAt,"completedAt",t),Date.parse(e?.completedAt)<Date.parse(e?.startedAt)&&t.push("completedAt cannot precede startedAt"),(!Array.isArray(e?.opinions)||e.opinions.length<2)&&t.push("at least two independent opinions are required");let n=new Set,i=new Set,r=new Set;for(let c of e?.opinions??[]){Z(c,t),n.has(c.participant.participantId)&&t.push(`duplicate participant ${c.participant.participantId}`),n.add(c.participant.participantId),i.add(E(c.participant));for(let g of c.citations)r.add(g.citationId)}i.size<2&&t.push("Oracle requires at least two distinct provider/model identities"),Q(e?.adjudication,r,t),e?.adjudication?.participant&&(n.add(e.adjudication.participant.participantId),i.add(E(e.adjudication.participant)));let a=[...(e?.opinions??[]).map(c=>c.usage),e?.adjudication?.usage].filter(Boolean),d=a.reduce((c,g)=>c+g.inputTokens,0),p=a.reduce((c,g)=>c+g.outputTokens,0);e?.summary?.participantCount!==n.size&&t.push("summary participantCount is inconsistent"),e?.summary?.distinctModelCount!==i.size&&t.push("summary distinctModelCount is inconsistent"),(e?.summary?.totalInputTokens!==d||e?.summary?.totalOutputTokens!==p)&&t.push("summary token usage is inconsistent"),e?.summary?.citationCount!==r.size&&t.push("summary citationCount is inconsistent");let w=e?.adjudication?.disagreements?.filter(c=>c.resolution==="unresolved").length??0;if(e?.summary?.unresolvedDisagreements!==w&&t.push("summary unresolvedDisagreements is inconsistent"),t.length>0)throw new u([...new Set(t)])}function Te(e,t){O(e);let n=e,i=x(n),r={schemaVersion:1,artifactId:t.artifactId??`oracle_${A(`${e.runId}:${e.questionHash.value}`).value.slice(0,24)}`,revision:1,kind:"custom:oracle-report",title:"Cross-model Oracle report",description:`${e.summary.distinctModelCount} distinct models; ${e.summary.unresolvedDisagreements} unresolved disagreements`,state:"pending_review",createdAt:e.completedAt,mediaType:"application/vnd.xeno.oracle-report+json",sensitivity:t.sensitivity??"internal",...t.identity?{identity:structuredClone(t.identity)}:{},content:{hash:S(n),sizeBytes:Buffer.byteLength(i,"utf8"),encoding:"utf8",storage:{type:"inline",text:i},redactedPreview:`${e.adjudication.verdict}: ${e.adjudication.conclusion.slice(0,240)}`},provenance:{producer:structuredClone(t.producer),attributes:{distinctModelCount:e.summary.distinctModelCount,participants:e.opinions.map(a=>`${a.participant.providerId}:${a.participant.model}`),adjudicator:`${e.adjudication.participant.providerId}:${e.adjudication.participant.model}`}},...t.accessPolicyId?{accessPolicyId:t.accessPolicyId}:{},extensions:{"xeno.oracle.verdict":e.adjudication.verdict,"xeno.oracle.confidence":e.adjudication.confidence,"xeno.oracle.unresolved":e.summary.unresolvedDisagreements,"xeno.oracle.questionHash":e.questionHash.value}};return K(r),r}function xe(e){if(e.kind!=="custom:oracle-report"||e.mediaType!=="application/vnd.xeno.oracle-report+json")throw new u([`Artifact ${e.artifactId} is not an Oracle report`]);if(e.content.storage.type!=="inline"||typeof e.content.storage.text!="string")throw new u(["Oracle reports require inline JSON content"]);let t;try{t=JSON.parse(e.content.storage.text)}catch{throw new u(["Oracle report content is invalid JSON"])}if(O(t),S(t).value!==e.content.hash.value)throw new u(["Oracle report content hash does not match the artifact"]);return structuredClone(t)}function Y(e,t,n,i){let r=ee(e.usage),a={...structuredClone(e.opinion),opinionId:n,participant:structuredClone(t),completedAt:i,usage:r},d=[];if(Z(a,d),d.length>0)throw new u(d);return a}function Se(e,t,n){let i={...structuredClone(e.adjudication),participant:structuredClone(t),completedAt:n,usage:ee(e.usage)},r=[];if(Q(i,void 0,r),r.length>0)throw new u(r);return i}function Ce(e,t,n,i){let r=[];(n.length<1||n.length>8)&&r.push("Oracle requires one through eight critic models"),t.role!=="primary"&&r.push("primary participant role must be primary"),n.some(p=>p.role!=="critic")&&r.push("critic participant roles must be critic"),i.role!=="adjudicator"&&r.push("adjudicator participant role must be adjudicator");let a=new Set,d=new Set;for(let p of e)H(p,r),a.has(p.participantId)&&r.push(`duplicate participant ${p.participantId}`),a.add(p.participantId),d.add(E(p));if(d.size<2&&r.push("Oracle requires at least two distinct provider/model identities"),r.length>0)throw new u([...new Set(r)])}function Z(e,t){f(e?.opinionId,"opinionId",t),H(e?.participant,t),m(e?.answer,"opinion answer",t,256e3),m(e?.publicRationale,"opinion publicRationale",t,128e3),V(e?.verdict)||t.push("opinion verdict is invalid"),j(e?.confidence,"opinion confidence",t),v(e?.completedAt,"opinion completedAt",t),te(e?.usage,"opinion usage",t);let n=new Set;for(let r of e?.citations??[])Ne(r,t),n.has(r.citationId)&&t.push(`duplicate citation ${r.citationId}`),n.add(r.citationId);let i=new Set;for(let r of e?.claims??[]){f(r?.claimId,"claimId",t),i.has(r.claimId)&&t.push(`duplicate claim ${r.claimId}`),i.add(r.claimId),m(r?.statement,`claim ${r.claimId} statement`,t,32e3),V(r?.verdict)||t.push(`claim ${r.claimId} verdict is invalid`),j(r?.confidence,`claim ${r.claimId} confidence`,t);for(let a of r?.citationIds??[])n.has(a)||t.push(`claim ${r.claimId} references unknown citation ${a}`)}}function Q(e,t,n){H(e?.participant,n),e?.participant?.role!=="adjudicator"&&n.push("adjudication participant role must be adjudicator"),m(e?.conclusion,"adjudication conclusion",n,256e3),m(e?.publicRationale,"adjudication publicRationale",n,128e3),V(e?.verdict)||n.push("adjudication verdict is invalid"),j(e?.confidence,"adjudication confidence",n),v(e?.completedAt,"adjudication completedAt",n),te(e?.usage,"adjudication usage",n);let i=new Set;for(let r of e?.disagreements??[])f(r?.disagreementId,"disagreementId",n),i.has(r.disagreementId)&&n.push(`duplicate disagreement ${r.disagreementId}`),i.add(r.disagreementId),m(r?.summary,`disagreement ${r.disagreementId} summary`,n,32e3),(!Array.isArray(r?.participantIds)||r.participantIds.length<2)&&n.push(`disagreement ${r.disagreementId} requires at least two participants`),["low","medium","high"].includes(r?.severity)||n.push(`disagreement ${r.disagreementId} severity is invalid`),r?.resolution!=="resolved"&&r?.resolution!=="unresolved"&&n.push(`disagreement ${r.disagreementId} resolution is invalid`);if(t)for(let r of e?.citationIds??[])t.has(r)||n.push(`adjudication references unknown citation ${r}`)}function H(e,t){f(e?.participantId,"participantId",t),f(e?.providerId,"providerId",t),m(e?.model,"participant model",t,512),e?.connectionId!==void 0&&f(e.connectionId,"connectionId",t),["primary","critic","adjudicator"].includes(e?.role)||t.push("participant role is invalid")}function Ne(e,t){f(e?.citationId,"citationId",t);try{let n=new URL(e?.uri);n.protocol!=="https:"&&n.protocol!=="http:"&&t.push(`citation ${e.citationId} must use HTTP(S)`),(n.username||n.password)&&t.push(`citation ${e.citationId} cannot contain credentials`)}catch{t.push(`citation ${e?.citationId??"(unknown)"} URI is invalid`)}e?.retrievedAt!==void 0&&v(e.retrievedAt,`citation ${e.citationId} retrievedAt`,t),e?.contentHash&&(e.contentHash.algorithm!=="sha256"||!/^[a-f0-9]{64}$/u.test(e.contentHash.value))&&t.push(`citation ${e.citationId} contentHash is invalid`)}function ee(e){return{inputTokens:G(e?.inputTokens),outputTokens:G(e?.outputTokens)}}function te(e,t,n){(!Number.isInteger(e?.inputTokens)||e.inputTokens<0)&&n.push(`${t} inputTokens must be a non-negative integer`),(!Number.isInteger(e?.outputTokens)||e.outputTokens<0)&&n.push(`${t} outputTokens must be a non-negative integer`)}function G(e){return Number.isInteger(e)&&(e??-1)>=0?e:0}function E(e){return`${e.providerId.trim().toLowerCase()}\0${e.model.trim().toLowerCase()}`}function ne(e,t,n){let i=typeof e=="string"?e.trim():"";if(!i||i.length>n||W(i,{allowTab:!0,allowLineBreaks:!0}))throw new u([`${t} must be non-empty bounded text`]);return i}function ie(e,t){let n=typeof e=="string"?e.trim():"";if(!/^[A-Za-z0-9][A-Za-z0-9._:@/-]{0,255}$/u.test(n))throw new u([`${t} is invalid`]);return n}function f(e,t,n){try{ie(e,t)}catch{n.push(`${t} is invalid`)}}function m(e,t,n,i){try{ne(e,t,i)}catch{n.push(`${t} must be non-empty bounded text`)}}function j(e,t,n){(typeof e!="number"||!Number.isFinite(e)||e<0||e>1)&&n.push(`${t} must be between 0 and 1`)}function v(e,t,n){(typeof e!="string"||!Number.isFinite(Date.parse(e)))&&n.push(`${t} must be an ISO timestamp`)}function V(e){return e==="supported"||e==="contested"||e==="unsupported"||e==="insufficient-evidence"}0&&(module.exports={XENO_ORACLE_REPORT_SCHEMA_VERSION,XenoOracleCoordinator,XenoOracleValidationError,assertValidXenoOracleReport,xenoArtifactToOracleReport,xenoOracleReportToArtifact});
|
|
1
|
+
"use strict";var R=Object.defineProperty;var ae=Object.getOwnPropertyDescriptor;var ce=Object.getOwnPropertyNames;var de=Object.prototype.hasOwnProperty;var ue=(e,t)=>{for(var n in t)R(e,n,{get:t[n],enumerable:!0})},pe=(e,t,n,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of ce(t))!de.call(e,r)&&r!==n&&R(e,r,{get:()=>t[r],enumerable:!(i=ae(t,r))||i.enumerable});return e};var le=e=>pe(R({},"__esModule",{value:!0}),e);var ke={};ue(ke,{XENO_ORACLE_REPORT_SCHEMA_VERSION:()=>q,XenoOracleCoordinator:()=>$,XenoOracleValidationError:()=>u,assertValidXenoOracleReport:()=>O,xenoArtifactToOracleReport:()=>xe,xenoOracleReportToArtifact:()=>Te});module.exports=le(ke);var k=require("node:crypto");var M=require("node:crypto");function A(e){return{algorithm:"sha256",value:(0,M.createHash)("sha256").update(e).digest("hex")}}function x(e){return JSON.stringify(T(e,new Set))}function S(e){return A(x(e))}function T(e,t){if(e===null||typeof e!="object"){if(typeof e=="number"&&!Number.isFinite(e))throw new TypeError("Artifact JSON cannot contain non-finite numbers");return e}if(t.has(e))throw new TypeError("Artifact JSON cannot contain cycles");if(t.add(e),Array.isArray(e)){let i=e.map(r=>T(r,t));return t.delete(e),i}let n={};for(let i of Object.keys(e).sort((r,a)=>r.localeCompare(a))){let r=e[i];if(r===void 0)throw new TypeError(`Artifact JSON property ${i} is undefined`);n[i]=T(r,t)}return t.delete(e),n}var F=["plan","requirements","design","task-graph","patch","diff","file","document","diagram","screenshot","recording","browser-snapshot","test-report","review-report","security-report","performance-report","release-report","sbom","provenance","attestation","page"],P=["draft","pending_review","approved","rejected","superseded","archived"],L=["public","internal","confidential","restricted"],J=["agent","tool","user","system","integration"],z=["requirement","design-decision","risk","task","agent","run","tool-call","edit","commit","test-case","test-run","finding","approval","artifact","release","claim"],B=["decomposes","depends_on","implements","changes","tests","verifies","finds","fixes","reviews","approves","rejects","supersedes","derived_from","produced_by","supports_claim","contradicts_claim","released_as"];var C=require("node:buffer");var fe=/^[a-z0-9][a-z0-9._/-]{0,127}$/,me="custom:";function U(e,t=me){return e.startsWith(t)?fe.test(e.slice(t.length)):!1}var N=class extends Error{code="ARTIFACT_INVALID";issues;constructor(t,n){super(t),this.name="XenoArtifactValidationError",this.issues=n.map(i=>({...i}))}};var ge="[\\u0000-\\u001f\\u007f]",he=new RegExp(ge),Ae=/^[a-f0-9]{64}$/,ye=/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/,Ie=new Set(P),ve=new Set(L),Xe=new Set(J),_e=new Set(F),be=new Set(z),Ee=new Set(B);function o(e,t,n,i){e.push({path:t,code:n,message:i})}function s(e,t,n,i=1024){return typeof e!="string"||e.trim().length===0?(o(n,t,"required_string","Value must be a non-empty string"),!1):(e.length>i&&o(n,t,"string_too_long",`Value must not exceed ${i} characters`),he.test(e)&&o(n,t,"control_character","Value must not contain control characters"),!0)}function _(e,t,n){e!==void 0&&(!Number.isFinite(Date.parse(e))||!e.includes("T"))&&o(n,t,"invalid_timestamp","Value must be an ISO 8601 timestamp")}function y(e,t,n,i){typeof e=="string"&&e.startsWith(t)&&(U(e,t)||o(i,n,"invalid_custom_name",`Custom name after ${t} is invalid`))}function Oe(e,t,n){if(!e||typeof e!="object"){o(n,t,"missing_actor","Actor is required");return}s(e.kind,`${t}.kind`,n,64),Xe.has(e.kind)||o(n,`${t}.kind`,"unknown_actor_kind","Actor kind is not supported"),s(e.id,`${t}.id`,n,512),e?.displayName!==void 0&&s(e.displayName,`${t}.displayName`,n,512),e?.profileFingerprint!==void 0&&!/^[a-f0-9]{64}$/.test(e.profileFingerprint)&&o(n,`${t}.profileFingerprint`,"invalid_fingerprint","Profile fingerprint must be 64 lowercase hexadecimal characters")}function we(e,t,n){if(!e||typeof e!="object"){o(n,t,"invalid_anchor","Anchor must be an object");return}switch(e.kind){case"file":s(e.path,`${t}.path`,n,4096);break;case"source-line":s(e.path,`${t}.path`,n,4096),(!Number.isInteger(e.startLine)||e.startLine<1)&&o(n,`${t}.startLine`,"invalid_line","startLine must be a positive integer"),e.endLine!==void 0&&(!Number.isInteger(e.endLine)||e.endLine<e.startLine)&&o(n,`${t}.endLine`,"invalid_line_range","endLine must be greater than or equal to startLine");break;case"diff-hunk":s(e.path,`${t}.path`,n,4096),s(e.hunkId,`${t}.hunkId`,n,512);break;case"symbol":s(e.path,`${t}.path`,n,4096),s(e.symbol,`${t}.symbol`,n,1024);break;case"dom-node":s(e.pageId,`${t}.pageId`,n,512),!e.selector&&!e.accessibilityId&&!e.snapshotArtifactId&&o(n,t,"missing_dom_locator","DOM anchors require a selector, accessibility ID, or snapshot artifact ID");break;case"timeline":s(e.recordingArtifactId,`${t}.recordingArtifactId`,n,512),(!Number.isFinite(e.startMs)||e.startMs<0)&&o(n,`${t}.startMs`,"invalid_time","startMs must be a non-negative finite number"),e.endMs!==void 0&&(!Number.isFinite(e.endMs)||e.endMs<e.startMs)&&o(n,`${t}.endMs`,"invalid_time_range","endMs must be greater than or equal to startMs");break;case"region":s(e.mediaArtifactId,`${t}.mediaArtifactId`,n,512),[e.x,e.y,e.width,e.height].every(Number.isFinite)?(e.width<=0||e.height<=0)&&o(n,t,"invalid_region_size","Region width and height must be positive"):o(n,t,"invalid_region","Region coordinates must be finite numbers");break;case"artifact":s(e.artifactId,`${t}.artifactId`,n,512);break;default:typeof e.kind!="string"||!e.kind.startsWith("custom:")?o(n,`${t}.kind`,"unknown_anchor","Anchor kind is not supported"):y(e.kind,"custom:",`${t}.kind`,n)}}function I(e,t,n,i){if(!(e===null||typeof e=="string"||typeof e=="boolean")){if(typeof e=="number"){Number.isFinite(e)||o(n,t,"non_finite_number","JSON numbers must be finite");return}if(typeof e!="object"){o(n,t,"non_json_value","Value must be JSON-serializable");return}if(i.has(e)){o(n,t,"cyclic_value","Value must not contain cycles");return}if(i.add(e),Array.isArray(e))e.forEach((r,a)=>I(r,`${t}[${a}]`,n,i));else for(let[r,a]of Object.entries(e))a===void 0?o(n,`${t}.${r}`,"undefined_value","Undefined is not valid JSON"):I(a,`${t}.${r}`,n,i);i.delete(e)}}function Re(e){let t=[];if(!e||typeof e!="object")return[{path:"$",code:"invalid_artifact",message:"Artifact must be an object"}];if(e.schemaVersion!==1&&o(t,"schemaVersion","unsupported_schema",`schemaVersion must be ${1}`),s(e.artifactId,"artifactId",t,512),(!Number.isInteger(e.revision)||e.revision<1)&&o(t,"revision","invalid_revision","revision must be a positive integer"),s(e.kind,"kind",t,160),typeof e.kind=="string"&&!_e.has(e.kind)&&!e.kind.startsWith("custom:")&&o(t,"kind","unknown_artifact_kind","Artifact kind is not supported"),y(e.kind,"custom:","kind",t),s(e.title,"title",t,1024),e.description!==void 0&&s(e.description,"description",t,32768),s(e.state,"state",t,64),Ie.has(e.state)||o(t,"state","unknown_state","Artifact state is not supported"),s(e.createdAt,"createdAt",t,128),_(e.createdAt,"createdAt",t),_(e.updatedAt,"updatedAt",t),e.updatedAt&&Number.isFinite(Date.parse(e.createdAt))&&Date.parse(e.updatedAt)<Date.parse(e.createdAt)&&o(t,"updatedAt","timestamp_order","updatedAt must not precede createdAt"),s(e.mediaType,"mediaType",t,255),s(e.sensitivity,"sensitivity",t,64),ve.has(e.sensitivity)||o(t,"sensitivity","unknown_sensitivity","Sensitivity is not supported"),e.identity)for(let[i,r]of Object.entries(e.identity))r!==void 0&&s(r,`identity.${i}`,t,512);if(!e.content||typeof e.content!="object")o(t,"content","missing_content","content descriptor is required");else{!e.content.hash||typeof e.content.hash!="object"?o(t,"content.hash","missing_hash","content hash is required"):(s(e.content.hash.algorithm,"content.hash.algorithm",t,128),y(e.content.hash.algorithm,"custom:","content.hash.algorithm",t),typeof e.content.hash.algorithm=="string"&&e.content.hash.algorithm!=="sha256"&&!e.content.hash.algorithm.startsWith("custom:")&&o(t,"content.hash.algorithm","unknown_hash_algorithm","Hash algorithm is not supported"),s(e.content.hash.value,"content.hash.value",t,512),e.content.hash.algorithm==="sha256"&&!Ae.test(e.content.hash.value)&&o(t,"content.hash.value","invalid_sha256","SHA-256 hash must be 64 lowercase hexadecimal characters")),(!Number.isSafeInteger(e.content.sizeBytes)||e.content.sizeBytes<0)&&o(t,"content.sizeBytes","invalid_size","sizeBytes must be a non-negative safe integer");let i=e.content.storage;if(!i||typeof i!="object")o(t,"content.storage","missing_storage","storage reference is required");else if(i.type==="inline")if(i.text===void 0==(i.base64===void 0))o(t,"content.storage","invalid_inline_storage","Inline storage requires exactly one of text or base64");else{let r;i.text!==void 0?r=C.Buffer.from(i.text,"utf8"):i.base64!==void 0&&(ye.test(i.base64)?r=C.Buffer.from(i.base64,"base64"):o(t,"content.storage.base64","invalid_base64","Inline base64 content is malformed")),r&&e.content.sizeBytes!==r.byteLength&&o(t,"content.sizeBytes","content_size_mismatch","sizeBytes does not match inline content"),r&&e.content.hash.algorithm==="sha256"&&A(r).value!==e.content.hash.value&&o(t,"content.hash.value","content_hash_mismatch","Hash does not match inline content")}else i.type==="file"?s(i.path,"content.storage.path",t,4096):i.type==="blob"?s(i.uri,"content.storage.uri",t,8192):i.type==="git"?(s(i.commit,"content.storage.commit",t,512),s(i.path,"content.storage.path",t,4096)):i.type==="url"?(s(i.url,"content.storage.url",t,8192),_(i.expiresAt,"content.storage.expiresAt",t)):i.type==="external"?(s(i.provider,"content.storage.provider",t,255),s(i.locator,"content.storage.locator",t,8192)):o(t,"content.storage.type","unknown_storage","Storage type is not supported");e.content.encoding!==void 0&&(typeof e.content.encoding!="string"||e.content.encoding!=="utf8"&&e.content.encoding!=="base64"&&e.content.encoding!=="binary"&&!e.content.encoding.startsWith("custom:"))&&o(t,"content.encoding","unknown_encoding","Content encoding is not supported"),y(e.content.encoding,"custom:","content.encoding",t)}!e.provenance||typeof e.provenance!="object"?o(t,"provenance","missing_provenance","provenance is required"):(Oe(e.provenance.producer,"provenance.producer",t),e.provenance.capabilityLeaseIds?.forEach((i,r)=>s(i,`provenance.capabilityLeaseIds[${r}]`,t,512)),e.provenance.sourceArtifactIds?.forEach((i,r)=>s(i,`provenance.sourceArtifactIds[${r}]`,t,512)),e.provenance.attributes&&I(e.provenance.attributes,"provenance.attributes",t,new Set));let n=new Set;return e.relationships?.forEach((i,r)=>{let a=`relationships[${r}]`;s(i.relation,`${a}.relation`,t,160),typeof i.relation=="string"&&!Ee.has(i.relation)&&!i.relation.startsWith("custom:")&&o(t,`${a}.relation`,"unknown_relationship","Relationship type is not supported"),y(i.relation,"custom:",`${a}.relation`,t),s(i.target?.type,`${a}.target.type`,t,160),typeof i.target?.type=="string"&&!be.has(i.target.type)&&!i.target.type.startsWith("custom:")&&o(t,`${a}.target.type`,"unknown_reference_type","Evidence reference type is not supported"),y(i.target?.type,"custom:",`${a}.target.type`,t),s(i.target?.id,`${a}.target.id`,t,512);let d=`${i.relation}:${i.target?.type}:${i.target?.id}:${i.target?.revision??""}`;n.has(d)&&o(t,a,"duplicate_relationship","Duplicate relationship"),n.add(d),i.attributes&&I(i.attributes,`${a}.attributes`,t,new Set)}),e.anchors?.forEach((i,r)=>we(i,`anchors[${r}]`,t)),e.revision===1&&e.predecessorRevision!==void 0&&o(t,"predecessorRevision","unexpected_predecessor","First revision cannot have a predecessor"),e.revision>1&&(!Number.isInteger(e.predecessorRevision)||(e.predecessorRevision??0)>=e.revision)&&o(t,"predecessorRevision","invalid_predecessor","Later revisions require an earlier predecessor revision"),_(e.retention?.retainUntil,"retention.retainUntil",t),e.retention?.legalHold!==void 0&&typeof e.retention.legalHold!="boolean"&&o(t,"retention.legalHold","invalid_boolean","legalHold must be a boolean"),e.extensions&&I(e.extensions,"extensions",t,new Set),t}function K(e){let t=Re(e);if(t.length>0)throw new N("XENO artifact validation failed",t)}function W(e,t={}){for(let n of e){let i=n.codePointAt(0);if(i===127)return!0;if(!(i>31)&&!(i===9&&t.allowTab===!0)&&!((i===10||i===13)&&t.allowLineBreaks===!0))return!0}return!1}var q="xeno.oracle-report.v1",u=class extends Error{constructor(n){super(`XENO Oracle report is invalid: ${n.join("; ")}`);this.issues=n;this.name="XenoOracleValidationError"}issues;code="XENO_ORACLE_INVALID"},$=class{execute;adjudicate;now;idFactory;constructor(t){if(typeof t?.execute!="function"||typeof t?.adjudicate!="function")throw new TypeError("Oracle execution and adjudication functions are required");this.execute=t.execute,this.adjudicate=t.adjudicate,this.now=t.now??(()=>new Date().toISOString()),this.idFactory=t.idFactory??(n=>`${n}_${(0,k.randomUUID)()}`)}async run(t){let n=ne(t.question,"question",128e3),i=t.runId??`oracle_run_${(0,k.randomUUID)()}`;ie(i,"runId");let r=[t.primary,...t.critics,t.adjudicator];Ce(r,t.primary,t.critics,t.adjudicator);let a=this.now(),d=await this.execute({runId:i,question:n,participant:structuredClone(t.primary)}),p=Y(d,t.primary,this.idFactory("opinion"),this.now()),w=await Promise.all(t.critics.map(async l=>{let h=await this.execute({runId:i,question:n,participant:structuredClone(l),primaryOpinion:structuredClone(p)});return Y(h,l,this.idFactory("opinion"),this.now())})),c=[p,...w],g=await this.adjudicate({runId:i,question:n,participant:structuredClone(t.adjudicator),opinions:structuredClone(c)}),X=Se(g,t.adjudicator,this.now()),re=this.now(),oe=new Set(r.map(E)),se=new Set(c.flatMap(l=>l.citations.map(h=>h.citationId))),D={schemaVersion:q,reportId:this.idFactory("oracle"),runId:i,question:n,questionHash:A(n),startedAt:a,completedAt:re,opinions:c,adjudication:X,summary:{participantCount:r.length,distinctModelCount:oe.size,totalInputTokens:c.reduce((l,h)=>l+h.usage.inputTokens,X.usage.inputTokens),totalOutputTokens:c.reduce((l,h)=>l+h.usage.outputTokens,X.usage.outputTokens),unresolvedDisagreements:X.disagreements.filter(l=>l.resolution==="unresolved").length,citationCount:se.size}};return O(D),D}};function O(e){let t=[];e?.schemaVersion!==q&&t.push("schemaVersion must be xeno.oracle-report.v1"),f(e?.reportId,"reportId",t),f(e?.runId,"runId",t),m(e?.question,"question",t,128e3),(e?.questionHash?.algorithm!=="sha256"||e.questionHash.value!==A(e.question??"").value)&&t.push("questionHash does not match question"),v(e?.startedAt,"startedAt",t),v(e?.completedAt,"completedAt",t),Date.parse(e?.completedAt)<Date.parse(e?.startedAt)&&t.push("completedAt cannot precede startedAt"),(!Array.isArray(e?.opinions)||e.opinions.length<2)&&t.push("at least two independent opinions are required");let n=new Set,i=new Set,r=new Set;for(let c of e?.opinions??[]){Z(c,t),n.has(c.participant.participantId)&&t.push(`duplicate participant ${c.participant.participantId}`),n.add(c.participant.participantId),i.add(E(c.participant));for(let g of c.citations)r.add(g.citationId)}i.size<2&&t.push("Oracle requires at least two distinct provider/model identities"),Q(e?.adjudication,r,t),e?.adjudication?.participant&&(n.add(e.adjudication.participant.participantId),i.add(E(e.adjudication.participant)));let a=[...(e?.opinions??[]).map(c=>c.usage),e?.adjudication?.usage].filter(Boolean),d=a.reduce((c,g)=>c+g.inputTokens,0),p=a.reduce((c,g)=>c+g.outputTokens,0);e?.summary?.participantCount!==n.size&&t.push("summary participantCount is inconsistent"),e?.summary?.distinctModelCount!==i.size&&t.push("summary distinctModelCount is inconsistent"),(e?.summary?.totalInputTokens!==d||e?.summary?.totalOutputTokens!==p)&&t.push("summary token usage is inconsistent"),e?.summary?.citationCount!==r.size&&t.push("summary citationCount is inconsistent");let w=e?.adjudication?.disagreements?.filter(c=>c.resolution==="unresolved").length??0;if(e?.summary?.unresolvedDisagreements!==w&&t.push("summary unresolvedDisagreements is inconsistent"),t.length>0)throw new u([...new Set(t)])}function Te(e,t){O(e);let n=e,i=x(n),r={schemaVersion:1,artifactId:t.artifactId??`oracle_${A(`${e.runId}:${e.questionHash.value}`).value.slice(0,24)}`,revision:1,kind:"custom:oracle-report",title:"Cross-model Oracle report",description:`${e.summary.distinctModelCount} distinct models; ${e.summary.unresolvedDisagreements} unresolved disagreements`,state:"pending_review",createdAt:e.completedAt,mediaType:"application/vnd.xeno.oracle-report+json",sensitivity:t.sensitivity??"internal",...t.identity?{identity:structuredClone(t.identity)}:{},content:{hash:S(n),sizeBytes:Buffer.byteLength(i,"utf8"),encoding:"utf8",storage:{type:"inline",text:i},redactedPreview:`${e.adjudication.verdict}: ${e.adjudication.conclusion.slice(0,240)}`},provenance:{producer:structuredClone(t.producer),attributes:{distinctModelCount:e.summary.distinctModelCount,participants:e.opinions.map(a=>`${a.participant.providerId}:${a.participant.model}`),adjudicator:`${e.adjudication.participant.providerId}:${e.adjudication.participant.model}`}},...t.accessPolicyId?{accessPolicyId:t.accessPolicyId}:{},extensions:{"xeno.oracle.verdict":e.adjudication.verdict,"xeno.oracle.confidence":e.adjudication.confidence,"xeno.oracle.unresolved":e.summary.unresolvedDisagreements,"xeno.oracle.questionHash":e.questionHash.value}};return K(r),r}function xe(e){if(e.kind!=="custom:oracle-report"||e.mediaType!=="application/vnd.xeno.oracle-report+json")throw new u([`Artifact ${e.artifactId} is not an Oracle report`]);if(e.content.storage.type!=="inline"||typeof e.content.storage.text!="string")throw new u(["Oracle reports require inline JSON content"]);let t;try{t=JSON.parse(e.content.storage.text)}catch{throw new u(["Oracle report content is invalid JSON"])}if(O(t),S(t).value!==e.content.hash.value)throw new u(["Oracle report content hash does not match the artifact"]);return structuredClone(t)}function Y(e,t,n,i){let r=ee(e.usage),a={...structuredClone(e.opinion),opinionId:n,participant:structuredClone(t),completedAt:i,usage:r},d=[];if(Z(a,d),d.length>0)throw new u(d);return a}function Se(e,t,n){let i={...structuredClone(e.adjudication),participant:structuredClone(t),completedAt:n,usage:ee(e.usage)},r=[];if(Q(i,void 0,r),r.length>0)throw new u(r);return i}function Ce(e,t,n,i){let r=[];(n.length<1||n.length>8)&&r.push("Oracle requires one through eight critic models"),t.role!=="primary"&&r.push("primary participant role must be primary"),n.some(p=>p.role!=="critic")&&r.push("critic participant roles must be critic"),i.role!=="adjudicator"&&r.push("adjudicator participant role must be adjudicator");let a=new Set,d=new Set;for(let p of e)H(p,r),a.has(p.participantId)&&r.push(`duplicate participant ${p.participantId}`),a.add(p.participantId),d.add(E(p));if(d.size<2&&r.push("Oracle requires at least two distinct provider/model identities"),r.length>0)throw new u([...new Set(r)])}function Z(e,t){f(e?.opinionId,"opinionId",t),H(e?.participant,t),m(e?.answer,"opinion answer",t,256e3),m(e?.publicRationale,"opinion publicRationale",t,128e3),V(e?.verdict)||t.push("opinion verdict is invalid"),j(e?.confidence,"opinion confidence",t),v(e?.completedAt,"opinion completedAt",t),te(e?.usage,"opinion usage",t);let n=new Set;for(let r of e?.citations??[])Ne(r,t),n.has(r.citationId)&&t.push(`duplicate citation ${r.citationId}`),n.add(r.citationId);let i=new Set;for(let r of e?.claims??[]){f(r?.claimId,"claimId",t),i.has(r.claimId)&&t.push(`duplicate claim ${r.claimId}`),i.add(r.claimId),m(r?.statement,`claim ${r.claimId} statement`,t,32e3),V(r?.verdict)||t.push(`claim ${r.claimId} verdict is invalid`),j(r?.confidence,`claim ${r.claimId} confidence`,t);for(let a of r?.citationIds??[])n.has(a)||t.push(`claim ${r.claimId} references unknown citation ${a}`)}}function Q(e,t,n){H(e?.participant,n),e?.participant?.role!=="adjudicator"&&n.push("adjudication participant role must be adjudicator"),m(e?.conclusion,"adjudication conclusion",n,256e3),m(e?.publicRationale,"adjudication publicRationale",n,128e3),V(e?.verdict)||n.push("adjudication verdict is invalid"),j(e?.confidence,"adjudication confidence",n),v(e?.completedAt,"adjudication completedAt",n),te(e?.usage,"adjudication usage",n);let i=new Set;for(let r of e?.disagreements??[])f(r?.disagreementId,"disagreementId",n),i.has(r.disagreementId)&&n.push(`duplicate disagreement ${r.disagreementId}`),i.add(r.disagreementId),m(r?.summary,`disagreement ${r.disagreementId} summary`,n,32e3),(!Array.isArray(r?.participantIds)||r.participantIds.length<2)&&n.push(`disagreement ${r.disagreementId} requires at least two participants`),["low","medium","high"].includes(r?.severity)||n.push(`disagreement ${r.disagreementId} severity is invalid`),r?.resolution!=="resolved"&&r?.resolution!=="unresolved"&&n.push(`disagreement ${r.disagreementId} resolution is invalid`);if(t)for(let r of e?.citationIds??[])t.has(r)||n.push(`adjudication references unknown citation ${r}`)}function H(e,t){f(e?.participantId,"participantId",t),f(e?.providerId,"providerId",t),m(e?.model,"participant model",t,512),e?.connectionId!==void 0&&f(e.connectionId,"connectionId",t),["primary","critic","adjudicator"].includes(e?.role)||t.push("participant role is invalid")}function Ne(e,t){f(e?.citationId,"citationId",t);try{let n=new URL(e?.uri);n.protocol!=="https:"&&n.protocol!=="http:"&&t.push(`citation ${e.citationId} must use HTTP(S)`),(n.username||n.password)&&t.push(`citation ${e.citationId} cannot contain credentials`)}catch{t.push(`citation ${e?.citationId??"(unknown)"} URI is invalid`)}e?.retrievedAt!==void 0&&v(e.retrievedAt,`citation ${e.citationId} retrievedAt`,t),e?.contentHash&&(e.contentHash.algorithm!=="sha256"||!/^[a-f0-9]{64}$/u.test(e.contentHash.value))&&t.push(`citation ${e.citationId} contentHash is invalid`)}function ee(e){return{inputTokens:G(e?.inputTokens),outputTokens:G(e?.outputTokens)}}function te(e,t,n){(!Number.isInteger(e?.inputTokens)||e.inputTokens<0)&&n.push(`${t} inputTokens must be a non-negative integer`),(!Number.isInteger(e?.outputTokens)||e.outputTokens<0)&&n.push(`${t} outputTokens must be a non-negative integer`)}function G(e){return Number.isInteger(e)&&(e??-1)>=0?e:0}function E(e){return`${e.providerId.trim().toLowerCase()}\0${e.model.trim().toLowerCase()}`}function ne(e,t,n){let i=typeof e=="string"?e.trim():"";if(!i||i.length>n||W(i,{allowTab:!0,allowLineBreaks:!0}))throw new u([`${t} must be non-empty bounded text`]);return i}function ie(e,t){let n=typeof e=="string"?e.trim():"";if(!/^[A-Za-z0-9][A-Za-z0-9._:@/-]{0,255}$/u.test(n))throw new u([`${t} is invalid`]);return n}function f(e,t,n){try{ie(e,t)}catch{n.push(`${t} is invalid`)}}function m(e,t,n,i){try{ne(e,t,i)}catch{n.push(`${t} must be non-empty bounded text`)}}function j(e,t,n){(typeof e!="number"||!Number.isFinite(e)||e<0||e>1)&&n.push(`${t} must be between 0 and 1`)}function v(e,t,n){(typeof e!="string"||!Number.isFinite(Date.parse(e)))&&n.push(`${t} must be an ISO timestamp`)}function V(e){return e==="supported"||e==="contested"||e==="unsupported"||e==="insufficient-evidence"}0&&(module.exports={XENO_ORACLE_REPORT_SCHEMA_VERSION,XenoOracleCoordinator,XenoOracleValidationError,assertValidXenoOracleReport,xenoArtifactToOracleReport,xenoOracleReportToArtifact});
|
package/dist/oracle/index.d.cts
CHANGED
|
@@ -24,7 +24,8 @@ declare const XENO_BUILTIN_ARTIFACT_KINDS: readonly [
|
|
|
24
24
|
"release-report",
|
|
25
25
|
"sbom",
|
|
26
26
|
"provenance",
|
|
27
|
-
"attestation"
|
|
27
|
+
"attestation",
|
|
28
|
+
"page"
|
|
28
29
|
];
|
|
29
30
|
type XenoArtifactKind = (typeof XENO_BUILTIN_ARTIFACT_KINDS)[number] | `custom:${string}`;
|
|
30
31
|
declare const XENO_ARTIFACT_STATES: readonly [
|
package/dist/oracle/index.d.ts
CHANGED
|
@@ -24,7 +24,8 @@ declare const XENO_BUILTIN_ARTIFACT_KINDS: readonly [
|
|
|
24
24
|
"release-report",
|
|
25
25
|
"sbom",
|
|
26
26
|
"provenance",
|
|
27
|
-
"attestation"
|
|
27
|
+
"attestation",
|
|
28
|
+
"page"
|
|
28
29
|
];
|
|
29
30
|
type XenoArtifactKind = (typeof XENO_BUILTIN_ARTIFACT_KINDS)[number] | `custom:${string}`;
|
|
30
31
|
declare const XENO_ARTIFACT_STATES: readonly [
|
package/dist/oracle/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{randomUUID as z}from"node:crypto";import{createHash as oe}from"node:crypto";function A(e){return{algorithm:"sha256",value:oe("sha256").update(e).digest("hex")}}function R(e){return JSON.stringify(w(e,new Set))}function T(e){return A(R(e))}function w(e,t){if(e===null||typeof e!="object"){if(typeof e=="number"&&!Number.isFinite(e))throw new TypeError("Artifact JSON cannot contain non-finite numbers");return e}if(t.has(e))throw new TypeError("Artifact JSON cannot contain cycles");if(t.add(e),Array.isArray(e)){let i=e.map(r=>w(r,t));return t.delete(e),i}let n={};for(let i of Object.keys(e).sort((r,a)=>r.localeCompare(a))){let r=e[i];if(r===void 0)throw new TypeError(`Artifact JSON property ${i} is undefined`);n[i]=w(r,t)}return t.delete(e),n}var j=["plan","requirements","design","task-graph","patch","diff","file","document","diagram","screenshot","recording","browser-snapshot","test-report","review-report","security-report","performance-report","release-report","sbom","provenance","attestation"],V=["draft","pending_review","approved","rejected","superseded","archived"],q=["public","internal","confidential","restricted"],H=["agent","tool","user","system","integration"],D=["requirement","design-decision","risk","task","agent","run","tool-call","edit","commit","test-case","test-run","finding","approval","artifact","release","claim"],M=["decomposes","depends_on","implements","changes","tests","verifies","finds","fixes","reviews","approves","rejects","supersedes","derived_from","produced_by","supports_claim","contradicts_claim","released_as"];import{Buffer as P}from"node:buffer";var se=/^[a-z0-9][a-z0-9._/-]{0,127}$/,ae="custom:";function F(e,t=ae){return e.startsWith(t)?se.test(e.slice(t.length)):!1}var x=class extends Error{code="ARTIFACT_INVALID";issues;constructor(t,n){super(t),this.name="XenoArtifactValidationError",this.issues=n.map(i=>({...i}))}};var ce="[\\u0000-\\u001f\\u007f]",de=new RegExp(ce),ue=/^[a-f0-9]{64}$/,pe=/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/,le=new Set(V),fe=new Set(q),me=new Set(H),ge=new Set(j),he=new Set(D),Ae=new Set(M);function o(e,t,n,i){e.push({path:t,code:n,message:i})}function s(e,t,n,i=1024){return typeof e!="string"||e.trim().length===0?(o(n,t,"required_string","Value must be a non-empty string"),!1):(e.length>i&&o(n,t,"string_too_long",`Value must not exceed ${i} characters`),de.test(e)&&o(n,t,"control_character","Value must not contain control characters"),!0)}function _(e,t,n){e!==void 0&&(!Number.isFinite(Date.parse(e))||!e.includes("T"))&&o(n,t,"invalid_timestamp","Value must be an ISO 8601 timestamp")}function y(e,t,n,i){typeof e=="string"&&e.startsWith(t)&&(F(e,t)||o(i,n,"invalid_custom_name",`Custom name after ${t} is invalid`))}function ye(e,t,n){if(!e||typeof e!="object"){o(n,t,"missing_actor","Actor is required");return}s(e.kind,`${t}.kind`,n,64),me.has(e.kind)||o(n,`${t}.kind`,"unknown_actor_kind","Actor kind is not supported"),s(e.id,`${t}.id`,n,512),e?.displayName!==void 0&&s(e.displayName,`${t}.displayName`,n,512),e?.profileFingerprint!==void 0&&!/^[a-f0-9]{64}$/.test(e.profileFingerprint)&&o(n,`${t}.profileFingerprint`,"invalid_fingerprint","Profile fingerprint must be 64 lowercase hexadecimal characters")}function Ie(e,t,n){if(!e||typeof e!="object"){o(n,t,"invalid_anchor","Anchor must be an object");return}switch(e.kind){case"file":s(e.path,`${t}.path`,n,4096);break;case"source-line":s(e.path,`${t}.path`,n,4096),(!Number.isInteger(e.startLine)||e.startLine<1)&&o(n,`${t}.startLine`,"invalid_line","startLine must be a positive integer"),e.endLine!==void 0&&(!Number.isInteger(e.endLine)||e.endLine<e.startLine)&&o(n,`${t}.endLine`,"invalid_line_range","endLine must be greater than or equal to startLine");break;case"diff-hunk":s(e.path,`${t}.path`,n,4096),s(e.hunkId,`${t}.hunkId`,n,512);break;case"symbol":s(e.path,`${t}.path`,n,4096),s(e.symbol,`${t}.symbol`,n,1024);break;case"dom-node":s(e.pageId,`${t}.pageId`,n,512),!e.selector&&!e.accessibilityId&&!e.snapshotArtifactId&&o(n,t,"missing_dom_locator","DOM anchors require a selector, accessibility ID, or snapshot artifact ID");break;case"timeline":s(e.recordingArtifactId,`${t}.recordingArtifactId`,n,512),(!Number.isFinite(e.startMs)||e.startMs<0)&&o(n,`${t}.startMs`,"invalid_time","startMs must be a non-negative finite number"),e.endMs!==void 0&&(!Number.isFinite(e.endMs)||e.endMs<e.startMs)&&o(n,`${t}.endMs`,"invalid_time_range","endMs must be greater than or equal to startMs");break;case"region":s(e.mediaArtifactId,`${t}.mediaArtifactId`,n,512),[e.x,e.y,e.width,e.height].every(Number.isFinite)?(e.width<=0||e.height<=0)&&o(n,t,"invalid_region_size","Region width and height must be positive"):o(n,t,"invalid_region","Region coordinates must be finite numbers");break;case"artifact":s(e.artifactId,`${t}.artifactId`,n,512);break;default:typeof e.kind!="string"||!e.kind.startsWith("custom:")?o(n,`${t}.kind`,"unknown_anchor","Anchor kind is not supported"):y(e.kind,"custom:",`${t}.kind`,n)}}function I(e,t,n,i){if(!(e===null||typeof e=="string"||typeof e=="boolean")){if(typeof e=="number"){Number.isFinite(e)||o(n,t,"non_finite_number","JSON numbers must be finite");return}if(typeof e!="object"){o(n,t,"non_json_value","Value must be JSON-serializable");return}if(i.has(e)){o(n,t,"cyclic_value","Value must not contain cycles");return}if(i.add(e),Array.isArray(e))e.forEach((r,a)=>I(r,`${t}[${a}]`,n,i));else for(let[r,a]of Object.entries(e))a===void 0?o(n,`${t}.${r}`,"undefined_value","Undefined is not valid JSON"):I(a,`${t}.${r}`,n,i);i.delete(e)}}function ve(e){let t=[];if(!e||typeof e!="object")return[{path:"$",code:"invalid_artifact",message:"Artifact must be an object"}];if(e.schemaVersion!==1&&o(t,"schemaVersion","unsupported_schema",`schemaVersion must be ${1}`),s(e.artifactId,"artifactId",t,512),(!Number.isInteger(e.revision)||e.revision<1)&&o(t,"revision","invalid_revision","revision must be a positive integer"),s(e.kind,"kind",t,160),typeof e.kind=="string"&&!ge.has(e.kind)&&!e.kind.startsWith("custom:")&&o(t,"kind","unknown_artifact_kind","Artifact kind is not supported"),y(e.kind,"custom:","kind",t),s(e.title,"title",t,1024),e.description!==void 0&&s(e.description,"description",t,32768),s(e.state,"state",t,64),le.has(e.state)||o(t,"state","unknown_state","Artifact state is not supported"),s(e.createdAt,"createdAt",t,128),_(e.createdAt,"createdAt",t),_(e.updatedAt,"updatedAt",t),e.updatedAt&&Number.isFinite(Date.parse(e.createdAt))&&Date.parse(e.updatedAt)<Date.parse(e.createdAt)&&o(t,"updatedAt","timestamp_order","updatedAt must not precede createdAt"),s(e.mediaType,"mediaType",t,255),s(e.sensitivity,"sensitivity",t,64),fe.has(e.sensitivity)||o(t,"sensitivity","unknown_sensitivity","Sensitivity is not supported"),e.identity)for(let[i,r]of Object.entries(e.identity))r!==void 0&&s(r,`identity.${i}`,t,512);if(!e.content||typeof e.content!="object")o(t,"content","missing_content","content descriptor is required");else{!e.content.hash||typeof e.content.hash!="object"?o(t,"content.hash","missing_hash","content hash is required"):(s(e.content.hash.algorithm,"content.hash.algorithm",t,128),y(e.content.hash.algorithm,"custom:","content.hash.algorithm",t),typeof e.content.hash.algorithm=="string"&&e.content.hash.algorithm!=="sha256"&&!e.content.hash.algorithm.startsWith("custom:")&&o(t,"content.hash.algorithm","unknown_hash_algorithm","Hash algorithm is not supported"),s(e.content.hash.value,"content.hash.value",t,512),e.content.hash.algorithm==="sha256"&&!ue.test(e.content.hash.value)&&o(t,"content.hash.value","invalid_sha256","SHA-256 hash must be 64 lowercase hexadecimal characters")),(!Number.isSafeInteger(e.content.sizeBytes)||e.content.sizeBytes<0)&&o(t,"content.sizeBytes","invalid_size","sizeBytes must be a non-negative safe integer");let i=e.content.storage;if(!i||typeof i!="object")o(t,"content.storage","missing_storage","storage reference is required");else if(i.type==="inline")if(i.text===void 0==(i.base64===void 0))o(t,"content.storage","invalid_inline_storage","Inline storage requires exactly one of text or base64");else{let r;i.text!==void 0?r=P.from(i.text,"utf8"):i.base64!==void 0&&(pe.test(i.base64)?r=P.from(i.base64,"base64"):o(t,"content.storage.base64","invalid_base64","Inline base64 content is malformed")),r&&e.content.sizeBytes!==r.byteLength&&o(t,"content.sizeBytes","content_size_mismatch","sizeBytes does not match inline content"),r&&e.content.hash.algorithm==="sha256"&&A(r).value!==e.content.hash.value&&o(t,"content.hash.value","content_hash_mismatch","Hash does not match inline content")}else i.type==="file"?s(i.path,"content.storage.path",t,4096):i.type==="blob"?s(i.uri,"content.storage.uri",t,8192):i.type==="git"?(s(i.commit,"content.storage.commit",t,512),s(i.path,"content.storage.path",t,4096)):i.type==="url"?(s(i.url,"content.storage.url",t,8192),_(i.expiresAt,"content.storage.expiresAt",t)):i.type==="external"?(s(i.provider,"content.storage.provider",t,255),s(i.locator,"content.storage.locator",t,8192)):o(t,"content.storage.type","unknown_storage","Storage type is not supported");e.content.encoding!==void 0&&(typeof e.content.encoding!="string"||e.content.encoding!=="utf8"&&e.content.encoding!=="base64"&&e.content.encoding!=="binary"&&!e.content.encoding.startsWith("custom:"))&&o(t,"content.encoding","unknown_encoding","Content encoding is not supported"),y(e.content.encoding,"custom:","content.encoding",t)}!e.provenance||typeof e.provenance!="object"?o(t,"provenance","missing_provenance","provenance is required"):(ye(e.provenance.producer,"provenance.producer",t),e.provenance.capabilityLeaseIds?.forEach((i,r)=>s(i,`provenance.capabilityLeaseIds[${r}]`,t,512)),e.provenance.sourceArtifactIds?.forEach((i,r)=>s(i,`provenance.sourceArtifactIds[${r}]`,t,512)),e.provenance.attributes&&I(e.provenance.attributes,"provenance.attributes",t,new Set));let n=new Set;return e.relationships?.forEach((i,r)=>{let a=`relationships[${r}]`;s(i.relation,`${a}.relation`,t,160),typeof i.relation=="string"&&!Ae.has(i.relation)&&!i.relation.startsWith("custom:")&&o(t,`${a}.relation`,"unknown_relationship","Relationship type is not supported"),y(i.relation,"custom:",`${a}.relation`,t),s(i.target?.type,`${a}.target.type`,t,160),typeof i.target?.type=="string"&&!he.has(i.target.type)&&!i.target.type.startsWith("custom:")&&o(t,`${a}.target.type`,"unknown_reference_type","Evidence reference type is not supported"),y(i.target?.type,"custom:",`${a}.target.type`,t),s(i.target?.id,`${a}.target.id`,t,512);let d=`${i.relation}:${i.target?.type}:${i.target?.id}:${i.target?.revision??""}`;n.has(d)&&o(t,a,"duplicate_relationship","Duplicate relationship"),n.add(d),i.attributes&&I(i.attributes,`${a}.attributes`,t,new Set)}),e.anchors?.forEach((i,r)=>Ie(i,`anchors[${r}]`,t)),e.revision===1&&e.predecessorRevision!==void 0&&o(t,"predecessorRevision","unexpected_predecessor","First revision cannot have a predecessor"),e.revision>1&&(!Number.isInteger(e.predecessorRevision)||(e.predecessorRevision??0)>=e.revision)&&o(t,"predecessorRevision","invalid_predecessor","Later revisions require an earlier predecessor revision"),_(e.retention?.retainUntil,"retention.retainUntil",t),e.retention?.legalHold!==void 0&&typeof e.retention.legalHold!="boolean"&&o(t,"retention.legalHold","invalid_boolean","legalHold must be a boolean"),e.extensions&&I(e.extensions,"extensions",t,new Set),t}function L(e){let t=ve(e);if(t.length>0)throw new x("XENO artifact validation failed",t)}function J(e,t={}){for(let n of e){let i=n.codePointAt(0);if(i===127)return!0;if(!(i>31)&&!(i===9&&t.allowTab===!0)&&!((i===10||i===13)&&t.allowLineBreaks===!0))return!0}return!1}var W="xeno.oracle-report.v1",p=class extends Error{constructor(n){super(`XENO Oracle report is invalid: ${n.join("; ")}`);this.issues=n;this.name="XenoOracleValidationError"}issues;code="XENO_ORACLE_INVALID"},B=class{execute;adjudicate;now;idFactory;constructor(t){if(typeof t?.execute!="function"||typeof t?.adjudicate!="function")throw new TypeError("Oracle execution and adjudication functions are required");this.execute=t.execute,this.adjudicate=t.adjudicate,this.now=t.now??(()=>new Date().toISOString()),this.idFactory=t.idFactory??(n=>`${n}_${z()}`)}async run(t){let n=ee(t.question,"question",128e3),i=t.runId??`oracle_run_${z()}`;te(i,"runId");let r=[t.primary,...t.critics,t.adjudicator];_e(r,t.primary,t.critics,t.adjudicator);let a=this.now(),d=await this.execute({runId:i,question:n,participant:structuredClone(t.primary)}),u=U(d,t.primary,this.idFactory("opinion"),this.now()),O=await Promise.all(t.critics.map(async l=>{let h=await this.execute({runId:i,question:n,participant:structuredClone(l),primaryOpinion:structuredClone(u)});return U(h,l,this.idFactory("opinion"),this.now())})),c=[u,...O],g=await this.adjudicate({runId:i,question:n,participant:structuredClone(t.adjudicator),opinions:structuredClone(c)}),X=Xe(g,t.adjudicator,this.now()),ne=this.now(),ie=new Set(r.map(E)),re=new Set(c.flatMap(l=>l.citations.map(h=>h.citationId))),$={schemaVersion:W,reportId:this.idFactory("oracle"),runId:i,question:n,questionHash:A(n),startedAt:a,completedAt:ne,opinions:c,adjudication:X,summary:{participantCount:r.length,distinctModelCount:ie.size,totalInputTokens:c.reduce((l,h)=>l+h.usage.inputTokens,X.usage.inputTokens),totalOutputTokens:c.reduce((l,h)=>l+h.usage.outputTokens,X.usage.outputTokens),unresolvedDisagreements:X.disagreements.filter(l=>l.resolution==="unresolved").length,citationCount:re.size}};return N($),$}};function N(e){let t=[];e?.schemaVersion!==W&&t.push("schemaVersion must be xeno.oracle-report.v1"),f(e?.reportId,"reportId",t),f(e?.runId,"runId",t),m(e?.question,"question",t,128e3),(e?.questionHash?.algorithm!=="sha256"||e.questionHash.value!==A(e.question??"").value)&&t.push("questionHash does not match question"),v(e?.startedAt,"startedAt",t),v(e?.completedAt,"completedAt",t),Date.parse(e?.completedAt)<Date.parse(e?.startedAt)&&t.push("completedAt cannot precede startedAt"),(!Array.isArray(e?.opinions)||e.opinions.length<2)&&t.push("at least two independent opinions are required");let n=new Set,i=new Set,r=new Set;for(let c of e?.opinions??[]){Y(c,t),n.has(c.participant.participantId)&&t.push(`duplicate participant ${c.participant.participantId}`),n.add(c.participant.participantId),i.add(E(c.participant));for(let g of c.citations)r.add(g.citationId)}i.size<2&&t.push("Oracle requires at least two distinct provider/model identities"),G(e?.adjudication,r,t),e?.adjudication?.participant&&(n.add(e.adjudication.participant.participantId),i.add(E(e.adjudication.participant)));let a=[...(e?.opinions??[]).map(c=>c.usage),e?.adjudication?.usage].filter(Boolean),d=a.reduce((c,g)=>c+g.inputTokens,0),u=a.reduce((c,g)=>c+g.outputTokens,0);e?.summary?.participantCount!==n.size&&t.push("summary participantCount is inconsistent"),e?.summary?.distinctModelCount!==i.size&&t.push("summary distinctModelCount is inconsistent"),(e?.summary?.totalInputTokens!==d||e?.summary?.totalOutputTokens!==u)&&t.push("summary token usage is inconsistent"),e?.summary?.citationCount!==r.size&&t.push("summary citationCount is inconsistent");let O=e?.adjudication?.disagreements?.filter(c=>c.resolution==="unresolved").length??0;if(e?.summary?.unresolvedDisagreements!==O&&t.push("summary unresolvedDisagreements is inconsistent"),t.length>0)throw new p([...new Set(t)])}function Me(e,t){N(e);let n=e,i=R(n),r={schemaVersion:1,artifactId:t.artifactId??`oracle_${A(`${e.runId}:${e.questionHash.value}`).value.slice(0,24)}`,revision:1,kind:"custom:oracle-report",title:"Cross-model Oracle report",description:`${e.summary.distinctModelCount} distinct models; ${e.summary.unresolvedDisagreements} unresolved disagreements`,state:"pending_review",createdAt:e.completedAt,mediaType:"application/vnd.xeno.oracle-report+json",sensitivity:t.sensitivity??"internal",...t.identity?{identity:structuredClone(t.identity)}:{},content:{hash:T(n),sizeBytes:Buffer.byteLength(i,"utf8"),encoding:"utf8",storage:{type:"inline",text:i},redactedPreview:`${e.adjudication.verdict}: ${e.adjudication.conclusion.slice(0,240)}`},provenance:{producer:structuredClone(t.producer),attributes:{distinctModelCount:e.summary.distinctModelCount,participants:e.opinions.map(a=>`${a.participant.providerId}:${a.participant.model}`),adjudicator:`${e.adjudication.participant.providerId}:${e.adjudication.participant.model}`}},...t.accessPolicyId?{accessPolicyId:t.accessPolicyId}:{},extensions:{"xeno.oracle.verdict":e.adjudication.verdict,"xeno.oracle.confidence":e.adjudication.confidence,"xeno.oracle.unresolved":e.summary.unresolvedDisagreements,"xeno.oracle.questionHash":e.questionHash.value}};return L(r),r}function Fe(e){if(e.kind!=="custom:oracle-report"||e.mediaType!=="application/vnd.xeno.oracle-report+json")throw new p([`Artifact ${e.artifactId} is not an Oracle report`]);if(e.content.storage.type!=="inline"||typeof e.content.storage.text!="string")throw new p(["Oracle reports require inline JSON content"]);let t;try{t=JSON.parse(e.content.storage.text)}catch{throw new p(["Oracle report content is invalid JSON"])}if(N(t),T(t).value!==e.content.hash.value)throw new p(["Oracle report content hash does not match the artifact"]);return structuredClone(t)}function U(e,t,n,i){let r=Z(e.usage),a={...structuredClone(e.opinion),opinionId:n,participant:structuredClone(t),completedAt:i,usage:r},d=[];if(Y(a,d),d.length>0)throw new p(d);return a}function Xe(e,t,n){let i={...structuredClone(e.adjudication),participant:structuredClone(t),completedAt:n,usage:Z(e.usage)},r=[];if(G(i,void 0,r),r.length>0)throw new p(r);return i}function _e(e,t,n,i){let r=[];(n.length<1||n.length>8)&&r.push("Oracle requires one through eight critic models"),t.role!=="primary"&&r.push("primary participant role must be primary"),n.some(u=>u.role!=="critic")&&r.push("critic participant roles must be critic"),i.role!=="adjudicator"&&r.push("adjudicator participant role must be adjudicator");let a=new Set,d=new Set;for(let u of e)k(u,r),a.has(u.participantId)&&r.push(`duplicate participant ${u.participantId}`),a.add(u.participantId),d.add(E(u));if(d.size<2&&r.push("Oracle requires at least two distinct provider/model identities"),r.length>0)throw new p([...new Set(r)])}function Y(e,t){f(e?.opinionId,"opinionId",t),k(e?.participant,t),m(e?.answer,"opinion answer",t,256e3),m(e?.publicRationale,"opinion publicRationale",t,128e3),C(e?.verdict)||t.push("opinion verdict is invalid"),S(e?.confidence,"opinion confidence",t),v(e?.completedAt,"opinion completedAt",t),Q(e?.usage,"opinion usage",t);let n=new Set;for(let r of e?.citations??[])be(r,t),n.has(r.citationId)&&t.push(`duplicate citation ${r.citationId}`),n.add(r.citationId);let i=new Set;for(let r of e?.claims??[]){f(r?.claimId,"claimId",t),i.has(r.claimId)&&t.push(`duplicate claim ${r.claimId}`),i.add(r.claimId),m(r?.statement,`claim ${r.claimId} statement`,t,32e3),C(r?.verdict)||t.push(`claim ${r.claimId} verdict is invalid`),S(r?.confidence,`claim ${r.claimId} confidence`,t);for(let a of r?.citationIds??[])n.has(a)||t.push(`claim ${r.claimId} references unknown citation ${a}`)}}function G(e,t,n){k(e?.participant,n),e?.participant?.role!=="adjudicator"&&n.push("adjudication participant role must be adjudicator"),m(e?.conclusion,"adjudication conclusion",n,256e3),m(e?.publicRationale,"adjudication publicRationale",n,128e3),C(e?.verdict)||n.push("adjudication verdict is invalid"),S(e?.confidence,"adjudication confidence",n),v(e?.completedAt,"adjudication completedAt",n),Q(e?.usage,"adjudication usage",n);let i=new Set;for(let r of e?.disagreements??[])f(r?.disagreementId,"disagreementId",n),i.has(r.disagreementId)&&n.push(`duplicate disagreement ${r.disagreementId}`),i.add(r.disagreementId),m(r?.summary,`disagreement ${r.disagreementId} summary`,n,32e3),(!Array.isArray(r?.participantIds)||r.participantIds.length<2)&&n.push(`disagreement ${r.disagreementId} requires at least two participants`),["low","medium","high"].includes(r?.severity)||n.push(`disagreement ${r.disagreementId} severity is invalid`),r?.resolution!=="resolved"&&r?.resolution!=="unresolved"&&n.push(`disagreement ${r.disagreementId} resolution is invalid`);if(t)for(let r of e?.citationIds??[])t.has(r)||n.push(`adjudication references unknown citation ${r}`)}function k(e,t){f(e?.participantId,"participantId",t),f(e?.providerId,"providerId",t),m(e?.model,"participant model",t,512),e?.connectionId!==void 0&&f(e.connectionId,"connectionId",t),["primary","critic","adjudicator"].includes(e?.role)||t.push("participant role is invalid")}function be(e,t){f(e?.citationId,"citationId",t);try{let n=new URL(e?.uri);n.protocol!=="https:"&&n.protocol!=="http:"&&t.push(`citation ${e.citationId} must use HTTP(S)`),(n.username||n.password)&&t.push(`citation ${e.citationId} cannot contain credentials`)}catch{t.push(`citation ${e?.citationId??"(unknown)"} URI is invalid`)}e?.retrievedAt!==void 0&&v(e.retrievedAt,`citation ${e.citationId} retrievedAt`,t),e?.contentHash&&(e.contentHash.algorithm!=="sha256"||!/^[a-f0-9]{64}$/u.test(e.contentHash.value))&&t.push(`citation ${e.citationId} contentHash is invalid`)}function Z(e){return{inputTokens:K(e?.inputTokens),outputTokens:K(e?.outputTokens)}}function Q(e,t,n){(!Number.isInteger(e?.inputTokens)||e.inputTokens<0)&&n.push(`${t} inputTokens must be a non-negative integer`),(!Number.isInteger(e?.outputTokens)||e.outputTokens<0)&&n.push(`${t} outputTokens must be a non-negative integer`)}function K(e){return Number.isInteger(e)&&(e??-1)>=0?e:0}function E(e){return`${e.providerId.trim().toLowerCase()}\0${e.model.trim().toLowerCase()}`}function ee(e,t,n){let i=typeof e=="string"?e.trim():"";if(!i||i.length>n||J(i,{allowTab:!0,allowLineBreaks:!0}))throw new p([`${t} must be non-empty bounded text`]);return i}function te(e,t){let n=typeof e=="string"?e.trim():"";if(!/^[A-Za-z0-9][A-Za-z0-9._:@/-]{0,255}$/u.test(n))throw new p([`${t} is invalid`]);return n}function f(e,t,n){try{te(e,t)}catch{n.push(`${t} is invalid`)}}function m(e,t,n,i){try{ee(e,t,i)}catch{n.push(`${t} must be non-empty bounded text`)}}function S(e,t,n){(typeof e!="number"||!Number.isFinite(e)||e<0||e>1)&&n.push(`${t} must be between 0 and 1`)}function v(e,t,n){(typeof e!="string"||!Number.isFinite(Date.parse(e)))&&n.push(`${t} must be an ISO timestamp`)}function C(e){return e==="supported"||e==="contested"||e==="unsupported"||e==="insufficient-evidence"}export{W as XENO_ORACLE_REPORT_SCHEMA_VERSION,B as XenoOracleCoordinator,p as XenoOracleValidationError,N as assertValidXenoOracleReport,Fe as xenoArtifactToOracleReport,Me as xenoOracleReportToArtifact};
|
|
1
|
+
import{randomUUID as z}from"node:crypto";import{createHash as oe}from"node:crypto";function A(e){return{algorithm:"sha256",value:oe("sha256").update(e).digest("hex")}}function R(e){return JSON.stringify(w(e,new Set))}function T(e){return A(R(e))}function w(e,t){if(e===null||typeof e!="object"){if(typeof e=="number"&&!Number.isFinite(e))throw new TypeError("Artifact JSON cannot contain non-finite numbers");return e}if(t.has(e))throw new TypeError("Artifact JSON cannot contain cycles");if(t.add(e),Array.isArray(e)){let i=e.map(r=>w(r,t));return t.delete(e),i}let n={};for(let i of Object.keys(e).sort((r,a)=>r.localeCompare(a))){let r=e[i];if(r===void 0)throw new TypeError(`Artifact JSON property ${i} is undefined`);n[i]=w(r,t)}return t.delete(e),n}var j=["plan","requirements","design","task-graph","patch","diff","file","document","diagram","screenshot","recording","browser-snapshot","test-report","review-report","security-report","performance-report","release-report","sbom","provenance","attestation","page"],V=["draft","pending_review","approved","rejected","superseded","archived"],q=["public","internal","confidential","restricted"],H=["agent","tool","user","system","integration"],D=["requirement","design-decision","risk","task","agent","run","tool-call","edit","commit","test-case","test-run","finding","approval","artifact","release","claim"],M=["decomposes","depends_on","implements","changes","tests","verifies","finds","fixes","reviews","approves","rejects","supersedes","derived_from","produced_by","supports_claim","contradicts_claim","released_as"];import{Buffer as P}from"node:buffer";var se=/^[a-z0-9][a-z0-9._/-]{0,127}$/,ae="custom:";function F(e,t=ae){return e.startsWith(t)?se.test(e.slice(t.length)):!1}var x=class extends Error{code="ARTIFACT_INVALID";issues;constructor(t,n){super(t),this.name="XenoArtifactValidationError",this.issues=n.map(i=>({...i}))}};var ce="[\\u0000-\\u001f\\u007f]",de=new RegExp(ce),ue=/^[a-f0-9]{64}$/,pe=/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/,le=new Set(V),fe=new Set(q),me=new Set(H),ge=new Set(j),he=new Set(D),Ae=new Set(M);function o(e,t,n,i){e.push({path:t,code:n,message:i})}function s(e,t,n,i=1024){return typeof e!="string"||e.trim().length===0?(o(n,t,"required_string","Value must be a non-empty string"),!1):(e.length>i&&o(n,t,"string_too_long",`Value must not exceed ${i} characters`),de.test(e)&&o(n,t,"control_character","Value must not contain control characters"),!0)}function _(e,t,n){e!==void 0&&(!Number.isFinite(Date.parse(e))||!e.includes("T"))&&o(n,t,"invalid_timestamp","Value must be an ISO 8601 timestamp")}function y(e,t,n,i){typeof e=="string"&&e.startsWith(t)&&(F(e,t)||o(i,n,"invalid_custom_name",`Custom name after ${t} is invalid`))}function ye(e,t,n){if(!e||typeof e!="object"){o(n,t,"missing_actor","Actor is required");return}s(e.kind,`${t}.kind`,n,64),me.has(e.kind)||o(n,`${t}.kind`,"unknown_actor_kind","Actor kind is not supported"),s(e.id,`${t}.id`,n,512),e?.displayName!==void 0&&s(e.displayName,`${t}.displayName`,n,512),e?.profileFingerprint!==void 0&&!/^[a-f0-9]{64}$/.test(e.profileFingerprint)&&o(n,`${t}.profileFingerprint`,"invalid_fingerprint","Profile fingerprint must be 64 lowercase hexadecimal characters")}function Ie(e,t,n){if(!e||typeof e!="object"){o(n,t,"invalid_anchor","Anchor must be an object");return}switch(e.kind){case"file":s(e.path,`${t}.path`,n,4096);break;case"source-line":s(e.path,`${t}.path`,n,4096),(!Number.isInteger(e.startLine)||e.startLine<1)&&o(n,`${t}.startLine`,"invalid_line","startLine must be a positive integer"),e.endLine!==void 0&&(!Number.isInteger(e.endLine)||e.endLine<e.startLine)&&o(n,`${t}.endLine`,"invalid_line_range","endLine must be greater than or equal to startLine");break;case"diff-hunk":s(e.path,`${t}.path`,n,4096),s(e.hunkId,`${t}.hunkId`,n,512);break;case"symbol":s(e.path,`${t}.path`,n,4096),s(e.symbol,`${t}.symbol`,n,1024);break;case"dom-node":s(e.pageId,`${t}.pageId`,n,512),!e.selector&&!e.accessibilityId&&!e.snapshotArtifactId&&o(n,t,"missing_dom_locator","DOM anchors require a selector, accessibility ID, or snapshot artifact ID");break;case"timeline":s(e.recordingArtifactId,`${t}.recordingArtifactId`,n,512),(!Number.isFinite(e.startMs)||e.startMs<0)&&o(n,`${t}.startMs`,"invalid_time","startMs must be a non-negative finite number"),e.endMs!==void 0&&(!Number.isFinite(e.endMs)||e.endMs<e.startMs)&&o(n,`${t}.endMs`,"invalid_time_range","endMs must be greater than or equal to startMs");break;case"region":s(e.mediaArtifactId,`${t}.mediaArtifactId`,n,512),[e.x,e.y,e.width,e.height].every(Number.isFinite)?(e.width<=0||e.height<=0)&&o(n,t,"invalid_region_size","Region width and height must be positive"):o(n,t,"invalid_region","Region coordinates must be finite numbers");break;case"artifact":s(e.artifactId,`${t}.artifactId`,n,512);break;default:typeof e.kind!="string"||!e.kind.startsWith("custom:")?o(n,`${t}.kind`,"unknown_anchor","Anchor kind is not supported"):y(e.kind,"custom:",`${t}.kind`,n)}}function I(e,t,n,i){if(!(e===null||typeof e=="string"||typeof e=="boolean")){if(typeof e=="number"){Number.isFinite(e)||o(n,t,"non_finite_number","JSON numbers must be finite");return}if(typeof e!="object"){o(n,t,"non_json_value","Value must be JSON-serializable");return}if(i.has(e)){o(n,t,"cyclic_value","Value must not contain cycles");return}if(i.add(e),Array.isArray(e))e.forEach((r,a)=>I(r,`${t}[${a}]`,n,i));else for(let[r,a]of Object.entries(e))a===void 0?o(n,`${t}.${r}`,"undefined_value","Undefined is not valid JSON"):I(a,`${t}.${r}`,n,i);i.delete(e)}}function ve(e){let t=[];if(!e||typeof e!="object")return[{path:"$",code:"invalid_artifact",message:"Artifact must be an object"}];if(e.schemaVersion!==1&&o(t,"schemaVersion","unsupported_schema",`schemaVersion must be ${1}`),s(e.artifactId,"artifactId",t,512),(!Number.isInteger(e.revision)||e.revision<1)&&o(t,"revision","invalid_revision","revision must be a positive integer"),s(e.kind,"kind",t,160),typeof e.kind=="string"&&!ge.has(e.kind)&&!e.kind.startsWith("custom:")&&o(t,"kind","unknown_artifact_kind","Artifact kind is not supported"),y(e.kind,"custom:","kind",t),s(e.title,"title",t,1024),e.description!==void 0&&s(e.description,"description",t,32768),s(e.state,"state",t,64),le.has(e.state)||o(t,"state","unknown_state","Artifact state is not supported"),s(e.createdAt,"createdAt",t,128),_(e.createdAt,"createdAt",t),_(e.updatedAt,"updatedAt",t),e.updatedAt&&Number.isFinite(Date.parse(e.createdAt))&&Date.parse(e.updatedAt)<Date.parse(e.createdAt)&&o(t,"updatedAt","timestamp_order","updatedAt must not precede createdAt"),s(e.mediaType,"mediaType",t,255),s(e.sensitivity,"sensitivity",t,64),fe.has(e.sensitivity)||o(t,"sensitivity","unknown_sensitivity","Sensitivity is not supported"),e.identity)for(let[i,r]of Object.entries(e.identity))r!==void 0&&s(r,`identity.${i}`,t,512);if(!e.content||typeof e.content!="object")o(t,"content","missing_content","content descriptor is required");else{!e.content.hash||typeof e.content.hash!="object"?o(t,"content.hash","missing_hash","content hash is required"):(s(e.content.hash.algorithm,"content.hash.algorithm",t,128),y(e.content.hash.algorithm,"custom:","content.hash.algorithm",t),typeof e.content.hash.algorithm=="string"&&e.content.hash.algorithm!=="sha256"&&!e.content.hash.algorithm.startsWith("custom:")&&o(t,"content.hash.algorithm","unknown_hash_algorithm","Hash algorithm is not supported"),s(e.content.hash.value,"content.hash.value",t,512),e.content.hash.algorithm==="sha256"&&!ue.test(e.content.hash.value)&&o(t,"content.hash.value","invalid_sha256","SHA-256 hash must be 64 lowercase hexadecimal characters")),(!Number.isSafeInteger(e.content.sizeBytes)||e.content.sizeBytes<0)&&o(t,"content.sizeBytes","invalid_size","sizeBytes must be a non-negative safe integer");let i=e.content.storage;if(!i||typeof i!="object")o(t,"content.storage","missing_storage","storage reference is required");else if(i.type==="inline")if(i.text===void 0==(i.base64===void 0))o(t,"content.storage","invalid_inline_storage","Inline storage requires exactly one of text or base64");else{let r;i.text!==void 0?r=P.from(i.text,"utf8"):i.base64!==void 0&&(pe.test(i.base64)?r=P.from(i.base64,"base64"):o(t,"content.storage.base64","invalid_base64","Inline base64 content is malformed")),r&&e.content.sizeBytes!==r.byteLength&&o(t,"content.sizeBytes","content_size_mismatch","sizeBytes does not match inline content"),r&&e.content.hash.algorithm==="sha256"&&A(r).value!==e.content.hash.value&&o(t,"content.hash.value","content_hash_mismatch","Hash does not match inline content")}else i.type==="file"?s(i.path,"content.storage.path",t,4096):i.type==="blob"?s(i.uri,"content.storage.uri",t,8192):i.type==="git"?(s(i.commit,"content.storage.commit",t,512),s(i.path,"content.storage.path",t,4096)):i.type==="url"?(s(i.url,"content.storage.url",t,8192),_(i.expiresAt,"content.storage.expiresAt",t)):i.type==="external"?(s(i.provider,"content.storage.provider",t,255),s(i.locator,"content.storage.locator",t,8192)):o(t,"content.storage.type","unknown_storage","Storage type is not supported");e.content.encoding!==void 0&&(typeof e.content.encoding!="string"||e.content.encoding!=="utf8"&&e.content.encoding!=="base64"&&e.content.encoding!=="binary"&&!e.content.encoding.startsWith("custom:"))&&o(t,"content.encoding","unknown_encoding","Content encoding is not supported"),y(e.content.encoding,"custom:","content.encoding",t)}!e.provenance||typeof e.provenance!="object"?o(t,"provenance","missing_provenance","provenance is required"):(ye(e.provenance.producer,"provenance.producer",t),e.provenance.capabilityLeaseIds?.forEach((i,r)=>s(i,`provenance.capabilityLeaseIds[${r}]`,t,512)),e.provenance.sourceArtifactIds?.forEach((i,r)=>s(i,`provenance.sourceArtifactIds[${r}]`,t,512)),e.provenance.attributes&&I(e.provenance.attributes,"provenance.attributes",t,new Set));let n=new Set;return e.relationships?.forEach((i,r)=>{let a=`relationships[${r}]`;s(i.relation,`${a}.relation`,t,160),typeof i.relation=="string"&&!Ae.has(i.relation)&&!i.relation.startsWith("custom:")&&o(t,`${a}.relation`,"unknown_relationship","Relationship type is not supported"),y(i.relation,"custom:",`${a}.relation`,t),s(i.target?.type,`${a}.target.type`,t,160),typeof i.target?.type=="string"&&!he.has(i.target.type)&&!i.target.type.startsWith("custom:")&&o(t,`${a}.target.type`,"unknown_reference_type","Evidence reference type is not supported"),y(i.target?.type,"custom:",`${a}.target.type`,t),s(i.target?.id,`${a}.target.id`,t,512);let d=`${i.relation}:${i.target?.type}:${i.target?.id}:${i.target?.revision??""}`;n.has(d)&&o(t,a,"duplicate_relationship","Duplicate relationship"),n.add(d),i.attributes&&I(i.attributes,`${a}.attributes`,t,new Set)}),e.anchors?.forEach((i,r)=>Ie(i,`anchors[${r}]`,t)),e.revision===1&&e.predecessorRevision!==void 0&&o(t,"predecessorRevision","unexpected_predecessor","First revision cannot have a predecessor"),e.revision>1&&(!Number.isInteger(e.predecessorRevision)||(e.predecessorRevision??0)>=e.revision)&&o(t,"predecessorRevision","invalid_predecessor","Later revisions require an earlier predecessor revision"),_(e.retention?.retainUntil,"retention.retainUntil",t),e.retention?.legalHold!==void 0&&typeof e.retention.legalHold!="boolean"&&o(t,"retention.legalHold","invalid_boolean","legalHold must be a boolean"),e.extensions&&I(e.extensions,"extensions",t,new Set),t}function L(e){let t=ve(e);if(t.length>0)throw new x("XENO artifact validation failed",t)}function J(e,t={}){for(let n of e){let i=n.codePointAt(0);if(i===127)return!0;if(!(i>31)&&!(i===9&&t.allowTab===!0)&&!((i===10||i===13)&&t.allowLineBreaks===!0))return!0}return!1}var W="xeno.oracle-report.v1",p=class extends Error{constructor(n){super(`XENO Oracle report is invalid: ${n.join("; ")}`);this.issues=n;this.name="XenoOracleValidationError"}issues;code="XENO_ORACLE_INVALID"},B=class{execute;adjudicate;now;idFactory;constructor(t){if(typeof t?.execute!="function"||typeof t?.adjudicate!="function")throw new TypeError("Oracle execution and adjudication functions are required");this.execute=t.execute,this.adjudicate=t.adjudicate,this.now=t.now??(()=>new Date().toISOString()),this.idFactory=t.idFactory??(n=>`${n}_${z()}`)}async run(t){let n=ee(t.question,"question",128e3),i=t.runId??`oracle_run_${z()}`;te(i,"runId");let r=[t.primary,...t.critics,t.adjudicator];_e(r,t.primary,t.critics,t.adjudicator);let a=this.now(),d=await this.execute({runId:i,question:n,participant:structuredClone(t.primary)}),u=U(d,t.primary,this.idFactory("opinion"),this.now()),O=await Promise.all(t.critics.map(async l=>{let h=await this.execute({runId:i,question:n,participant:structuredClone(l),primaryOpinion:structuredClone(u)});return U(h,l,this.idFactory("opinion"),this.now())})),c=[u,...O],g=await this.adjudicate({runId:i,question:n,participant:structuredClone(t.adjudicator),opinions:structuredClone(c)}),X=Xe(g,t.adjudicator,this.now()),ne=this.now(),ie=new Set(r.map(E)),re=new Set(c.flatMap(l=>l.citations.map(h=>h.citationId))),$={schemaVersion:W,reportId:this.idFactory("oracle"),runId:i,question:n,questionHash:A(n),startedAt:a,completedAt:ne,opinions:c,adjudication:X,summary:{participantCount:r.length,distinctModelCount:ie.size,totalInputTokens:c.reduce((l,h)=>l+h.usage.inputTokens,X.usage.inputTokens),totalOutputTokens:c.reduce((l,h)=>l+h.usage.outputTokens,X.usage.outputTokens),unresolvedDisagreements:X.disagreements.filter(l=>l.resolution==="unresolved").length,citationCount:re.size}};return N($),$}};function N(e){let t=[];e?.schemaVersion!==W&&t.push("schemaVersion must be xeno.oracle-report.v1"),f(e?.reportId,"reportId",t),f(e?.runId,"runId",t),m(e?.question,"question",t,128e3),(e?.questionHash?.algorithm!=="sha256"||e.questionHash.value!==A(e.question??"").value)&&t.push("questionHash does not match question"),v(e?.startedAt,"startedAt",t),v(e?.completedAt,"completedAt",t),Date.parse(e?.completedAt)<Date.parse(e?.startedAt)&&t.push("completedAt cannot precede startedAt"),(!Array.isArray(e?.opinions)||e.opinions.length<2)&&t.push("at least two independent opinions are required");let n=new Set,i=new Set,r=new Set;for(let c of e?.opinions??[]){Y(c,t),n.has(c.participant.participantId)&&t.push(`duplicate participant ${c.participant.participantId}`),n.add(c.participant.participantId),i.add(E(c.participant));for(let g of c.citations)r.add(g.citationId)}i.size<2&&t.push("Oracle requires at least two distinct provider/model identities"),G(e?.adjudication,r,t),e?.adjudication?.participant&&(n.add(e.adjudication.participant.participantId),i.add(E(e.adjudication.participant)));let a=[...(e?.opinions??[]).map(c=>c.usage),e?.adjudication?.usage].filter(Boolean),d=a.reduce((c,g)=>c+g.inputTokens,0),u=a.reduce((c,g)=>c+g.outputTokens,0);e?.summary?.participantCount!==n.size&&t.push("summary participantCount is inconsistent"),e?.summary?.distinctModelCount!==i.size&&t.push("summary distinctModelCount is inconsistent"),(e?.summary?.totalInputTokens!==d||e?.summary?.totalOutputTokens!==u)&&t.push("summary token usage is inconsistent"),e?.summary?.citationCount!==r.size&&t.push("summary citationCount is inconsistent");let O=e?.adjudication?.disagreements?.filter(c=>c.resolution==="unresolved").length??0;if(e?.summary?.unresolvedDisagreements!==O&&t.push("summary unresolvedDisagreements is inconsistent"),t.length>0)throw new p([...new Set(t)])}function Me(e,t){N(e);let n=e,i=R(n),r={schemaVersion:1,artifactId:t.artifactId??`oracle_${A(`${e.runId}:${e.questionHash.value}`).value.slice(0,24)}`,revision:1,kind:"custom:oracle-report",title:"Cross-model Oracle report",description:`${e.summary.distinctModelCount} distinct models; ${e.summary.unresolvedDisagreements} unresolved disagreements`,state:"pending_review",createdAt:e.completedAt,mediaType:"application/vnd.xeno.oracle-report+json",sensitivity:t.sensitivity??"internal",...t.identity?{identity:structuredClone(t.identity)}:{},content:{hash:T(n),sizeBytes:Buffer.byteLength(i,"utf8"),encoding:"utf8",storage:{type:"inline",text:i},redactedPreview:`${e.adjudication.verdict}: ${e.adjudication.conclusion.slice(0,240)}`},provenance:{producer:structuredClone(t.producer),attributes:{distinctModelCount:e.summary.distinctModelCount,participants:e.opinions.map(a=>`${a.participant.providerId}:${a.participant.model}`),adjudicator:`${e.adjudication.participant.providerId}:${e.adjudication.participant.model}`}},...t.accessPolicyId?{accessPolicyId:t.accessPolicyId}:{},extensions:{"xeno.oracle.verdict":e.adjudication.verdict,"xeno.oracle.confidence":e.adjudication.confidence,"xeno.oracle.unresolved":e.summary.unresolvedDisagreements,"xeno.oracle.questionHash":e.questionHash.value}};return L(r),r}function Fe(e){if(e.kind!=="custom:oracle-report"||e.mediaType!=="application/vnd.xeno.oracle-report+json")throw new p([`Artifact ${e.artifactId} is not an Oracle report`]);if(e.content.storage.type!=="inline"||typeof e.content.storage.text!="string")throw new p(["Oracle reports require inline JSON content"]);let t;try{t=JSON.parse(e.content.storage.text)}catch{throw new p(["Oracle report content is invalid JSON"])}if(N(t),T(t).value!==e.content.hash.value)throw new p(["Oracle report content hash does not match the artifact"]);return structuredClone(t)}function U(e,t,n,i){let r=Z(e.usage),a={...structuredClone(e.opinion),opinionId:n,participant:structuredClone(t),completedAt:i,usage:r},d=[];if(Y(a,d),d.length>0)throw new p(d);return a}function Xe(e,t,n){let i={...structuredClone(e.adjudication),participant:structuredClone(t),completedAt:n,usage:Z(e.usage)},r=[];if(G(i,void 0,r),r.length>0)throw new p(r);return i}function _e(e,t,n,i){let r=[];(n.length<1||n.length>8)&&r.push("Oracle requires one through eight critic models"),t.role!=="primary"&&r.push("primary participant role must be primary"),n.some(u=>u.role!=="critic")&&r.push("critic participant roles must be critic"),i.role!=="adjudicator"&&r.push("adjudicator participant role must be adjudicator");let a=new Set,d=new Set;for(let u of e)k(u,r),a.has(u.participantId)&&r.push(`duplicate participant ${u.participantId}`),a.add(u.participantId),d.add(E(u));if(d.size<2&&r.push("Oracle requires at least two distinct provider/model identities"),r.length>0)throw new p([...new Set(r)])}function Y(e,t){f(e?.opinionId,"opinionId",t),k(e?.participant,t),m(e?.answer,"opinion answer",t,256e3),m(e?.publicRationale,"opinion publicRationale",t,128e3),C(e?.verdict)||t.push("opinion verdict is invalid"),S(e?.confidence,"opinion confidence",t),v(e?.completedAt,"opinion completedAt",t),Q(e?.usage,"opinion usage",t);let n=new Set;for(let r of e?.citations??[])be(r,t),n.has(r.citationId)&&t.push(`duplicate citation ${r.citationId}`),n.add(r.citationId);let i=new Set;for(let r of e?.claims??[]){f(r?.claimId,"claimId",t),i.has(r.claimId)&&t.push(`duplicate claim ${r.claimId}`),i.add(r.claimId),m(r?.statement,`claim ${r.claimId} statement`,t,32e3),C(r?.verdict)||t.push(`claim ${r.claimId} verdict is invalid`),S(r?.confidence,`claim ${r.claimId} confidence`,t);for(let a of r?.citationIds??[])n.has(a)||t.push(`claim ${r.claimId} references unknown citation ${a}`)}}function G(e,t,n){k(e?.participant,n),e?.participant?.role!=="adjudicator"&&n.push("adjudication participant role must be adjudicator"),m(e?.conclusion,"adjudication conclusion",n,256e3),m(e?.publicRationale,"adjudication publicRationale",n,128e3),C(e?.verdict)||n.push("adjudication verdict is invalid"),S(e?.confidence,"adjudication confidence",n),v(e?.completedAt,"adjudication completedAt",n),Q(e?.usage,"adjudication usage",n);let i=new Set;for(let r of e?.disagreements??[])f(r?.disagreementId,"disagreementId",n),i.has(r.disagreementId)&&n.push(`duplicate disagreement ${r.disagreementId}`),i.add(r.disagreementId),m(r?.summary,`disagreement ${r.disagreementId} summary`,n,32e3),(!Array.isArray(r?.participantIds)||r.participantIds.length<2)&&n.push(`disagreement ${r.disagreementId} requires at least two participants`),["low","medium","high"].includes(r?.severity)||n.push(`disagreement ${r.disagreementId} severity is invalid`),r?.resolution!=="resolved"&&r?.resolution!=="unresolved"&&n.push(`disagreement ${r.disagreementId} resolution is invalid`);if(t)for(let r of e?.citationIds??[])t.has(r)||n.push(`adjudication references unknown citation ${r}`)}function k(e,t){f(e?.participantId,"participantId",t),f(e?.providerId,"providerId",t),m(e?.model,"participant model",t,512),e?.connectionId!==void 0&&f(e.connectionId,"connectionId",t),["primary","critic","adjudicator"].includes(e?.role)||t.push("participant role is invalid")}function be(e,t){f(e?.citationId,"citationId",t);try{let n=new URL(e?.uri);n.protocol!=="https:"&&n.protocol!=="http:"&&t.push(`citation ${e.citationId} must use HTTP(S)`),(n.username||n.password)&&t.push(`citation ${e.citationId} cannot contain credentials`)}catch{t.push(`citation ${e?.citationId??"(unknown)"} URI is invalid`)}e?.retrievedAt!==void 0&&v(e.retrievedAt,`citation ${e.citationId} retrievedAt`,t),e?.contentHash&&(e.contentHash.algorithm!=="sha256"||!/^[a-f0-9]{64}$/u.test(e.contentHash.value))&&t.push(`citation ${e.citationId} contentHash is invalid`)}function Z(e){return{inputTokens:K(e?.inputTokens),outputTokens:K(e?.outputTokens)}}function Q(e,t,n){(!Number.isInteger(e?.inputTokens)||e.inputTokens<0)&&n.push(`${t} inputTokens must be a non-negative integer`),(!Number.isInteger(e?.outputTokens)||e.outputTokens<0)&&n.push(`${t} outputTokens must be a non-negative integer`)}function K(e){return Number.isInteger(e)&&(e??-1)>=0?e:0}function E(e){return`${e.providerId.trim().toLowerCase()}\0${e.model.trim().toLowerCase()}`}function ee(e,t,n){let i=typeof e=="string"?e.trim():"";if(!i||i.length>n||J(i,{allowTab:!0,allowLineBreaks:!0}))throw new p([`${t} must be non-empty bounded text`]);return i}function te(e,t){let n=typeof e=="string"?e.trim():"";if(!/^[A-Za-z0-9][A-Za-z0-9._:@/-]{0,255}$/u.test(n))throw new p([`${t} is invalid`]);return n}function f(e,t,n){try{te(e,t)}catch{n.push(`${t} is invalid`)}}function m(e,t,n,i){try{ee(e,t,i)}catch{n.push(`${t} must be non-empty bounded text`)}}function S(e,t,n){(typeof e!="number"||!Number.isFinite(e)||e<0||e>1)&&n.push(`${t} must be between 0 and 1`)}function v(e,t,n){(typeof e!="string"||!Number.isFinite(Date.parse(e)))&&n.push(`${t} must be an ISO timestamp`)}function C(e){return e==="supported"||e==="contested"||e==="unsupported"||e==="insufficient-evidence"}export{W as XENO_ORACLE_REPORT_SCHEMA_VERSION,B as XenoOracleCoordinator,p as XenoOracleValidationError,N as assertValidXenoOracleReport,Fe as xenoArtifactToOracleReport,Me as xenoOracleReportToArtifact};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"inputs":{"src/artifacts/hash.ts":{"bytes":1489,"imports":[{"path":"node:crypto","kind":"import-statement","external":true}],"format":"esm"},"src/artifacts/types.ts":{"bytes":
|
|
1
|
+
{"inputs":{"src/artifacts/hash.ts":{"bytes":1489,"imports":[{"path":"node:crypto","kind":"import-statement","external":true}],"format":"esm"},"src/artifacts/types.ts":{"bytes":11227,"imports":[],"format":"esm"},"src/utils/custom-names.ts":{"bytes":2210,"imports":[],"format":"esm"},"src/artifacts/validation.ts":{"bytes":25271,"imports":[{"path":"src/artifacts/types.ts","kind":"import-statement","original":"./types.js"},{"path":"node:buffer","kind":"import-statement","external":true},{"path":"src/artifacts/hash.ts","kind":"import-statement","original":"./hash.js"},{"path":"src/utils/custom-names.ts","kind":"import-statement","original":"../utils/custom-names.js"},{"path":"src/artifacts/types.ts","kind":"import-statement","original":"./types.js"}],"format":"esm"},"src/utils/text-security.ts":{"bytes":809,"imports":[],"format":"esm"},"src/oracle/protocol.ts":{"bytes":23835,"imports":[{"path":"node:crypto","kind":"import-statement","external":true},{"path":"src/artifacts/hash.ts","kind":"import-statement","original":"../artifacts/hash.js"},{"path":"src/artifacts/types.ts","kind":"import-statement","original":"../artifacts/types.js"},{"path":"src/artifacts/validation.ts","kind":"import-statement","original":"../artifacts/validation.js"},{"path":"src/utils/text-security.ts","kind":"import-statement","original":"../utils/text-security.js"}],"format":"esm"},"src/oracle/index.ts":{"bytes":31,"imports":[{"path":"src/oracle/protocol.ts","kind":"import-statement","original":"./protocol.js"}],"format":"esm"}},"outputs":{"dist/oracle/index.cjs":{"imports":[{"path":"node:crypto","kind":"require-call","external":true},{"path":"node:crypto","kind":"require-call","external":true},{"path":"node:buffer","kind":"require-call","external":true}],"exports":[],"entryPoint":"src/oracle/index.ts","inputs":{"src/oracle/index.ts":{"bytesInOutput":243},"src/oracle/protocol.ts":{"bytesInOutput":10804},"src/artifacts/hash.ts":{"bytesInOutput":715},"src/artifacts/types.ts":{"bytesInOutput":819},"src/artifacts/validation.ts":{"bytesInOutput":9795},"src/utils/custom-names.ts":{"bytesInOutput":124},"src/utils/text-security.ts":{"bytesInOutput":179}},"bytes":23301}}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"inputs":{"src/artifacts/hash.ts":{"bytes":1489,"imports":[{"path":"node:crypto","kind":"import-statement","external":true}],"format":"esm"},"src/artifacts/types.ts":{"bytes":
|
|
1
|
+
{"inputs":{"src/artifacts/hash.ts":{"bytes":1489,"imports":[{"path":"node:crypto","kind":"import-statement","external":true}],"format":"esm"},"src/artifacts/types.ts":{"bytes":11227,"imports":[],"format":"esm"},"src/utils/custom-names.ts":{"bytes":2210,"imports":[],"format":"esm"},"src/artifacts/validation.ts":{"bytes":25271,"imports":[{"path":"src/artifacts/types.ts","kind":"import-statement","original":"./types.js"},{"path":"node:buffer","kind":"import-statement","external":true},{"path":"src/artifacts/hash.ts","kind":"import-statement","original":"./hash.js"},{"path":"src/utils/custom-names.ts","kind":"import-statement","original":"../utils/custom-names.js"},{"path":"src/artifacts/types.ts","kind":"import-statement","original":"./types.js"}],"format":"esm"},"src/utils/text-security.ts":{"bytes":809,"imports":[],"format":"esm"},"src/oracle/protocol.ts":{"bytes":23835,"imports":[{"path":"node:crypto","kind":"import-statement","external":true},{"path":"src/artifacts/hash.ts","kind":"import-statement","original":"../artifacts/hash.js"},{"path":"src/artifacts/types.ts","kind":"import-statement","original":"../artifacts/types.js"},{"path":"src/artifacts/validation.ts","kind":"import-statement","original":"../artifacts/validation.js"},{"path":"src/utils/text-security.ts","kind":"import-statement","original":"../utils/text-security.js"}],"format":"esm"},"src/oracle/index.ts":{"bytes":31,"imports":[{"path":"src/oracle/protocol.ts","kind":"import-statement","original":"./protocol.js"}],"format":"esm"}},"outputs":{"dist/oracle/index.js":{"imports":[{"path":"node:crypto","kind":"import-statement","external":true},{"path":"node:crypto","kind":"import-statement","external":true},{"path":"node:buffer","kind":"import-statement","external":true}],"exports":["XENO_ORACLE_REPORT_SCHEMA_VERSION","XenoOracleCoordinator","XenoOracleValidationError","assertValidXenoOracleReport","xenoArtifactToOracleReport","xenoOracleReportToArtifact"],"entryPoint":"src/oracle/index.ts","inputs":{"src/oracle/protocol.ts":{"bytesInOutput":10780},"src/artifacts/hash.ts":{"bytesInOutput":714},"src/artifacts/types.ts":{"bytesInOutput":819},"src/artifacts/validation.ts":{"bytesInOutput":9789},"src/utils/custom-names.ts":{"bytesInOutput":124},"src/utils/text-security.ts":{"bytesInOutput":179},"src/oracle/index.ts":{"bytesInOutput":0}},"bytes":22610}}}
|
package/dist/recipes/index.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var
|
|
2
|
-
`}function z(e,t){let i=
|
|
1
|
+
"use strict";var E=Object.defineProperty;var V=Object.getOwnPropertyDescriptor;var O=Object.getOwnPropertyNames;var D=Object.prototype.hasOwnProperty;var F=(e,t)=>{for(var i in t)E(e,i,{get:t[i],enumerable:!0})},L=(e,t,i,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of O(t))!D.call(e,o)&&o!==i&&E(e,o,{get:()=>t[o],enumerable:!(r=V(t,o))||r.enumerable});return e};var M=e=>L(E({},"__esModule",{value:!0}),e);var oe={};F(oe,{XENO_RECIPE_SCHEMA_VERSION:()=>P,XenoRecipeValidationError:()=>d,assertValidXenoRecipeDefinition:()=>y,compileXenoRecipe:()=>B,parseXenoRecipeDefinition:()=>q,serializeXenoRecipe:()=>J,xenoRecipeFingerprint:()=>$});module.exports=M(oe);var _=["plan","requirements","design","task-graph","patch","diff","file","document","diagram","screenshot","recording","browser-snapshot","test-report","review-report","security-report","performance-report","release-report","sbom","provenance","attestation","page"],x=["draft","pending_review","approved","rejected","superseded","archived"],k=["public","internal","confidential","restricted"],T=["agent","tool","user","system","integration"],A=["requirement","design-decision","risk","task","agent","run","tool-call","edit","commit","test-case","test-run","finding","approval","artifact","release","claim"],I=["decomposes","depends_on","implements","changes","tests","verifies","finds","fixes","reviews","approves","rejects","supersedes","derived_from","produced_by","supports_claim","contradicts_claim","released_as"];var C=require("node:crypto");function p(e){return{algorithm:"sha256",value:(0,C.createHash)("sha256").update(e).digest("hex")}}function u(e){return JSON.stringify(X(e,new Set))}function g(e){return p(u(e))}function X(e,t){if(e===null||typeof e!="object"){if(typeof e=="number"&&!Number.isFinite(e))throw new TypeError("Artifact JSON cannot contain non-finite numbers");return e}if(t.has(e))throw new TypeError("Artifact JSON cannot contain cycles");if(t.add(e),Array.isArray(e)){let r=e.map(o=>X(o,t));return t.delete(e),r}let i={};for(let r of Object.keys(e).sort((o,a)=>o.localeCompare(a))){let o=e[r];if(o===void 0)throw new TypeError(`Artifact JSON property ${r} is undefined`);i[r]=X(o,t)}return t.delete(e),i}var H="[\\u0000-\\u001f\\u007f]",me=new RegExp(H);var he=new Set(x),ge=new Set(k),ve=new Set(T),ye=new Set(_),Ae=new Set(A),Ie=new Set(I);var Se=new Set(A),_e=new Set(I);var ze=64*1024*1024;var Ze=16*1024*1024;var wt=16*1024*1024;function b(e,t={}){for(let i of e){let r=i.codePointAt(0);if(r===127)return!0;if(!(r>31)&&!(r===9&&t.allowTab===!0)&&!((r===10||r===13)&&t.allowLineBreaks===!0))return!0}return!1}var P="xeno.recipe.v1",d=class extends Error{constructor(i){super(`XENO recipe is invalid: ${i.join("; ")}`);this.issues=i;this.name="XenoRecipeValidationError"}issues;code="XENO_RECIPE_INVALID"};function q(e){let t=h(e,"recipe",["schemaVersion","recipeId","name","description","version","modes","inputs","requiredSecretRefs","authority","budget","steps","provenance"]),i=h(t.authority,"authority",["permissionMode","externalActions","network"]),r=h(t.budget,"budget",["maxAgents","maxConcurrency","maxTotalTokens","timeoutMs"]),o={schemaVersion:t.schemaVersion,recipeId:c(t.recipeId,"recipeId"),name:c(t.name,"name"),description:c(t.description,"description"),version:v(t.version,"version"),modes:m(t.modes,"modes").map(a=>a),inputs:m(t.inputs,"inputs").map((a,n)=>z(a,n)),requiredSecretRefs:m(t.requiredSecretRefs,"requiredSecretRefs").map(a=>c(a,"secret ref")),authority:{permissionMode:i.permissionMode,externalActions:i.externalActions,network:i.network},budget:{maxAgents:v(r.maxAgents,"budget.maxAgents"),maxConcurrency:v(r.maxConcurrency,"budget.maxConcurrency"),maxTotalTokens:v(r.maxTotalTokens,"budget.maxTotalTokens"),timeoutMs:v(r.timeoutMs,"budget.timeoutMs")},steps:m(t.steps,"steps").map((a,n)=>U(a,n)),...t.provenance!==void 0?{provenance:W(t.provenance)}:{}};return y(o),o}function y(e){let t=[];e?.schemaVersion!==P&&t.push("schemaVersion must be xeno.recipe.v1"),w(e?.recipeId,"recipeId",t),f(e?.name,"name",t,256),f(e?.description,"description",t,8e3),(!Number.isSafeInteger(e?.version)||e.version<1||e.version>1e6)&&t.push("version must be a positive bounded integer"),(!Array.isArray(e?.modes)||e.modes.length<1)&&t.push("modes must contain at least one execution mode");let i=new Set;for(let n of e?.modes??[])n!=="interactive"&&n!=="headless"&&n!=="ci"&&t.push(`unsupported recipe mode ${String(n)}`),i.has(n)&&t.push(`duplicate recipe mode ${n}`),i.add(n);re(e?.authority?.permissionMode)||t.push("authority.permissionMode is invalid"),e?.authority?.externalActions!=="deny"&&e?.authority?.externalActions!=="approval-required"&&t.push("authority.externalActions is invalid"),e?.authority?.network!=="deny"&&e?.authority?.network!=="environment-policy"&&t.push("authority.network is invalid"),G(e?.budget,t);let r=new Set;for(let n of e?.inputs??[]){if(ne(n?.name,t),r.has(n.name)&&t.push(`duplicate input ${n.name}`),r.add(n.name),f(n?.description,`input ${n.name} description`,t,2e3),typeof n?.required!="boolean"&&t.push(`input ${n.name} required must be boolean`),n?.default!==void 0&&f(n.default,`input ${n.name} default`,t,32e3),n?.required&&n?.default!==void 0&&t.push(`required input ${n.name} cannot define a default`),n?.enum!==void 0){(!Array.isArray(n.enum)||n.enum.length<1||n.enum.length>256)&&t.push(`input ${n.name} enum is invalid`);for(let s of n.enum??[])f(s,`input ${n.name} enum value`,t,2e3);n.default!==void 0&&!n.enum.includes(n.default)&&t.push(`input ${n.name} default is outside its enum`)}if(n?.pattern!==void 0){f(n.pattern,`input ${n.name} pattern`,t,1e3);try{new RegExp(n.pattern,"u")}catch{t.push(`input ${n.name} pattern is invalid`)}}}let o=new Set;for(let n of e?.requiredSecretRefs??[])/^[A-Z_][A-Z0-9_]{0,127}$/u.test(n)||t.push(`required secret ref ${n} is invalid`),o.has(n)&&t.push(`duplicate secret ref ${n}`),o.add(n);(!Array.isArray(e?.steps)||e.steps.length<1||e.steps.length>256)&&t.push("steps must contain 1 through 256 records"),Array.isArray(e?.steps)&&e.steps.length>(e?.budget?.maxAgents??0)&&t.push("budget.maxAgents must cover every recipe step");let a=new Map;for(let n of e?.steps??[]){w(n?.id,"step id",t),a.has(n.id)&&t.push(`duplicate step ${n.id}`),a.set(n.id,n),f(n?.title,`step ${n.id} title`,t,2e3),n?.kind!=="agent"&&n?.kind!=="verification"&&t.push(`step ${n.id} kind is invalid`),f(n?.prompt,`step ${n.id} prompt`,t,128e3),n?.agentProfile!==void 0&&w(n.agentProfile,`step ${n.id} agentProfile`,t);for(let s of n?.dependsOn??[])w(s,`step ${n.id} dependency`,t);n?.approval&&f(n.approval.message,`step ${n.id} approval message`,t,8e3);for(let s of n?.expectedArtifacts??[])ie(s,`step ${n.id} expected artifact`,t);for(let s of ee(n?.prompt??""))r.has(s)||t.push(`step ${n.id} references unknown input ${s}`);/\{\{\s*(?:secret|env)[.:]/iu.test(n?.prompt??"")&&t.push(`step ${n.id} cannot interpolate secrets into prompts`)}for(let n of e?.steps??[])for(let s of n.dependsOn??[])a.has(s)||t.push(`step ${n.id} depends on unknown step ${s}`),s===n.id&&t.push(`step ${n.id} cannot depend on itself`);if(K(e?.steps??[],t),t.length>0)throw new d([...new Set(t)])}function B(e,t){if(y(e),!e.modes.includes(t.mode))throw new d([`recipe does not allow ${t.mode} mode`]);let i=t.inputs??{},r=new Map(e.inputs.map(s=>[s.name,s])),o=Object.keys(i).filter(s=>!r.has(s));if(o.length>0)throw new d(o.map(s=>`unknown recipe input ${s}`));let a={};for(let s of e.inputs){let S=i[s.name]??s.default;if(S===void 0){if(s.required)throw new d([`required recipe input ${s.name} is missing`]);a[s.name]="";continue}a[s.name]=Y(s,S)}let n=e.requiredSecretRefs.filter(s=>t.hasSecretRef&&!t.hasSecretRef(s));if(n.length>0)throw new d(n.map(s=>`required secret reference is unavailable: ${s}`));return{schemaVersion:1,recipeId:e.recipeId,recipeVersion:e.version,recipeFingerprint:$(e),mode:t.mode,inputs:a,requiredSecretRefs:[...e.requiredSecretRefs],authority:structuredClone(e.authority),budget:structuredClone(e.budget),steps:Z(e.steps).map(s=>({...structuredClone(s),prompt:Q(s.prompt,a)}))}}function $(e){return y(e),{algorithm:"sha256",value:g(e).value}}function J(e){return y(e),`${u(e)}
|
|
2
|
+
`}function z(e,t){let i=h(e,`inputs[${t}]`,["name","description","required","default","enum","pattern"]);return{name:c(i.name,`inputs[${t}].name`),description:c(i.description,`inputs[${t}].description`),required:te(i.required,`inputs[${t}].required`),...i.default!==void 0?{default:c(i.default,`inputs[${t}].default`)}:{},...i.enum!==void 0?{enum:m(i.enum,`inputs[${t}].enum`).map(r=>c(r,"enum value"))}:{},...i.pattern!==void 0?{pattern:c(i.pattern,`inputs[${t}].pattern`)}:{}}}function U(e,t){let i=h(e,`steps[${t}]`,["id","title","kind","prompt","dependsOn","agentProfile","approval","expectedArtifacts"]),r=i.approval===void 0?void 0:h(i.approval,`steps[${t}].approval`,["message"]);return{id:c(i.id,`steps[${t}].id`),title:c(i.title,`steps[${t}].title`),kind:i.kind,prompt:c(i.prompt,`steps[${t}].prompt`),...i.dependsOn!==void 0?{dependsOn:m(i.dependsOn,"dependsOn").map(o=>c(o,"dependency"))}:{},...i.agentProfile!==void 0?{agentProfile:c(i.agentProfile,"agentProfile")}:{},...r?{approval:{message:c(r.message,"approval message")}}:{},...i.expectedArtifacts!==void 0?{expectedArtifacts:m(i.expectedArtifacts,"expectedArtifacts").map(o=>c(o,"expected artifact"))}:{}}}function W(e){let t=h(e,"provenance",["publisherId","source","revision"]);return{publisherId:c(t.publisherId,"provenance.publisherId"),...t.source!==void 0?{source:c(t.source,"provenance.source")}:{},...t.revision!==void 0?{revision:c(t.revision,"provenance.revision")}:{}}}function G(e,t){(!Number.isSafeInteger(e?.maxAgents)||e.maxAgents<1||e.maxAgents>256)&&t.push("budget.maxAgents is invalid"),(!Number.isSafeInteger(e?.maxConcurrency)||e.maxConcurrency<1||e.maxConcurrency>64)&&t.push("budget.maxConcurrency is invalid"),e?.maxConcurrency>e?.maxAgents&&t.push("budget.maxConcurrency cannot exceed maxAgents"),(!Number.isSafeInteger(e?.maxTotalTokens)||e.maxTotalTokens<1||e.maxTotalTokens>1e8)&&t.push("budget.maxTotalTokens is invalid"),(!Number.isSafeInteger(e?.timeoutMs)||e.timeoutMs<1e3||e.timeoutMs>10080*60*1e3)&&t.push("budget.timeoutMs is invalid")}function K(e,t){let i=new Map(e.map(n=>[n.id,n])),r=new Set,o=new Set,a=n=>{if(!(o.has(n)||!i.has(n))){if(r.has(n)){t.push(`recipe step dependency cycle includes ${n}`);return}r.add(n);for(let s of i.get(n)?.dependsOn??[])a(s);r.delete(n),o.add(n)}};for(let n of e)a(n.id)}function Z(e){let t=new Map(e.map(o=>[o.id,o])),i=new Map(e.map((o,a)=>[o.id,{step:o,index:a,dependencies:new Set(o.dependsOn??[])}])),r=[];for(;i.size>0;){let o=[...i.values()].filter(({dependencies:a})=>[...a].every(n=>!i.has(n))).sort((a,n)=>a.index-n.index);if(o.length===0)throw new d(["recipe step dependency graph is cyclic"]);for(let a of o)r.push(t.get(a.step.id)),i.delete(a.step.id)}return r}function Y(e,t){let i=t.trim();if(i.length>32e3||b(i,{allowTab:!0,allowLineBreaks:!0}))throw new d([`input ${e.name} is invalid`]);if(e.enum&&!e.enum.includes(i))throw new d([`input ${e.name} is outside its enum`]);if(e.pattern&&!new RegExp(e.pattern,"u").test(i))throw new d([`input ${e.name} does not match its pattern`]);return i}function Q(e,t){return e.replace(/\{\{\s*input\.([A-Za-z_][A-Za-z0-9_-]*)\s*\}\}/gu,(i,r)=>t[r]??"")}function ee(e){return[...e.matchAll(/\{\{\s*input\.([A-Za-z_][A-Za-z0-9_-]*)\s*\}\}/gu)].map(t=>t[1])}function h(e,t,i){if(!e||typeof e!="object"||Array.isArray(e))throw new d([`${t} must be an object`]);let r=e,o=Object.keys(r).filter(a=>!i.includes(a));if(o.length>0)throw new d(o.map(a=>`${t} contains unsupported field ${a}`));return r}function m(e,t){if(!Array.isArray(e))throw new d([`${t} must be an array`]);return e}function c(e,t){if(typeof e!="string")throw new d([`${t} must be text`]);return e}function te(e,t){if(typeof e!="boolean")throw new d([`${t} must be boolean`]);return e}function v(e,t){if(!Number.isSafeInteger(e))throw new d([`${t} must be an integer`]);return e}function w(e,t,i){(typeof e!="string"||!/^[A-Za-z0-9][A-Za-z0-9._:@/-]{0,255}$/u.test(e))&&i.push(`${t} is invalid`)}function ne(e,t){(typeof e!="string"||!/^[A-Za-z_][A-Za-z0-9_-]{0,127}$/u.test(e))&&t.push(`input name ${String(e)} is invalid`)}function f(e,t,i,r){(typeof e!="string"||!e.trim()||e.length>r||b(e,{allowTab:!0,allowLineBreaks:!0}))&&i.push(`${t} must be non-empty bounded text`)}function ie(e,t,i){(typeof e!="string"||!e||e.startsWith("/")||/^[A-Za-z]:[\\/]/u.test(e)||e.includes("\\")||e.split("/").some(r=>!r||r==="."||r===".."))&&i.push(`${t} must be workflow-relative`)}function re(e){return e==="default"||e==="plan"||e==="acceptEdits"||e==="auto"||e==="dontAsk"}0&&(module.exports={XENO_RECIPE_SCHEMA_VERSION,XenoRecipeValidationError,assertValidXenoRecipeDefinition,compileXenoRecipe,parseXenoRecipeDefinition,serializeXenoRecipe,xenoRecipeFingerprint});
|
package/dist/recipes/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var S=["plan","requirements","design","task-graph","patch","diff","file","document","diagram","screenshot","recording","browser-snapshot","test-report","review-report","security-report","performance-report","release-report","sbom","provenance","attestation"],_=["draft","pending_review","approved","rejected","superseded","archived"],
|
|
2
|
-
`}function O(e,t){let i=
|
|
1
|
+
var S=["plan","requirements","design","task-graph","patch","diff","file","document","diagram","screenshot","recording","browser-snapshot","test-report","review-report","security-report","performance-report","release-report","sbom","provenance","attestation","page"],_=["draft","pending_review","approved","rejected","superseded","archived"],x=["public","internal","confidential","restricted"],k=["agent","tool","user","system","integration"],y=["requirement","design-decision","risk","task","agent","run","tool-call","edit","commit","test-case","test-run","finding","approval","artifact","release","claim"],A=["decomposes","depends_on","implements","changes","tests","verifies","finds","fixes","reviews","approves","rejects","supersedes","derived_from","produced_by","supports_claim","contradicts_claim","released_as"];import{createHash as C}from"node:crypto";function p(e){return{algorithm:"sha256",value:C("sha256").update(e).digest("hex")}}function u(e){return JSON.stringify(E(e,new Set))}function g(e){return p(u(e))}function E(e,t){if(e===null||typeof e!="object"){if(typeof e=="number"&&!Number.isFinite(e))throw new TypeError("Artifact JSON cannot contain non-finite numbers");return e}if(t.has(e))throw new TypeError("Artifact JSON cannot contain cycles");if(t.add(e),Array.isArray(e)){let r=e.map(s=>E(s,t));return t.delete(e),r}let i={};for(let r of Object.keys(e).sort((s,a)=>s.localeCompare(a))){let s=e[r];if(s===void 0)throw new TypeError(`Artifact JSON property ${r} is undefined`);i[r]=E(s,t)}return t.delete(e),i}var N="[\\u0000-\\u001f\\u007f]",ie=new RegExp(N);var re=new Set(_),oe=new Set(x),se=new Set(k),ae=new Set(S),ce=new Set(y),de=new Set(A);var he=new Set(y),ge=new Set(A);var Ve=64*1024*1024;var Me=16*1024*1024;var ft=16*1024*1024;function R(e,t={}){for(let i of e){let r=i.codePointAt(0);if(r===127)return!0;if(!(r>31)&&!(r===9&&t.allowTab===!0)&&!((r===10||r===13)&&t.allowLineBreaks===!0))return!0}return!1}var $="xeno.recipe.v1",d=class extends Error{constructor(i){super(`XENO recipe is invalid: ${i.join("; ")}`);this.issues=i;this.name="XenoRecipeValidationError"}issues;code="XENO_RECIPE_INVALID"};function xt(e){let t=h(e,"recipe",["schemaVersion","recipeId","name","description","version","modes","inputs","requiredSecretRefs","authority","budget","steps","provenance"]),i=h(t.authority,"authority",["permissionMode","externalActions","network"]),r=h(t.budget,"budget",["maxAgents","maxConcurrency","maxTotalTokens","timeoutMs"]),s={schemaVersion:t.schemaVersion,recipeId:c(t.recipeId,"recipeId"),name:c(t.name,"name"),description:c(t.description,"description"),version:v(t.version,"version"),modes:m(t.modes,"modes").map(a=>a),inputs:m(t.inputs,"inputs").map((a,n)=>O(a,n)),requiredSecretRefs:m(t.requiredSecretRefs,"requiredSecretRefs").map(a=>c(a,"secret ref")),authority:{permissionMode:i.permissionMode,externalActions:i.externalActions,network:i.network},budget:{maxAgents:v(r.maxAgents,"budget.maxAgents"),maxConcurrency:v(r.maxConcurrency,"budget.maxConcurrency"),maxTotalTokens:v(r.maxTotalTokens,"budget.maxTotalTokens"),timeoutMs:v(r.timeoutMs,"budget.timeoutMs")},steps:m(t.steps,"steps").map((a,n)=>D(a,n)),...t.provenance!==void 0?{provenance:F(t.provenance)}:{}};return w(s),s}function w(e){let t=[];e?.schemaVersion!==$&&t.push("schemaVersion must be xeno.recipe.v1"),I(e?.recipeId,"recipeId",t),f(e?.name,"name",t,256),f(e?.description,"description",t,8e3),(!Number.isSafeInteger(e?.version)||e.version<1||e.version>1e6)&&t.push("version must be a positive bounded integer"),(!Array.isArray(e?.modes)||e.modes.length<1)&&t.push("modes must contain at least one execution mode");let i=new Set;for(let n of e?.modes??[])n!=="interactive"&&n!=="headless"&&n!=="ci"&&t.push(`unsupported recipe mode ${String(n)}`),i.has(n)&&t.push(`duplicate recipe mode ${n}`),i.add(n);W(e?.authority?.permissionMode)||t.push("authority.permissionMode is invalid"),e?.authority?.externalActions!=="deny"&&e?.authority?.externalActions!=="approval-required"&&t.push("authority.externalActions is invalid"),e?.authority?.network!=="deny"&&e?.authority?.network!=="environment-policy"&&t.push("authority.network is invalid"),L(e?.budget,t);let r=new Set;for(let n of e?.inputs??[]){if(z(n?.name,t),r.has(n.name)&&t.push(`duplicate input ${n.name}`),r.add(n.name),f(n?.description,`input ${n.name} description`,t,2e3),typeof n?.required!="boolean"&&t.push(`input ${n.name} required must be boolean`),n?.default!==void 0&&f(n.default,`input ${n.name} default`,t,32e3),n?.required&&n?.default!==void 0&&t.push(`required input ${n.name} cannot define a default`),n?.enum!==void 0){(!Array.isArray(n.enum)||n.enum.length<1||n.enum.length>256)&&t.push(`input ${n.name} enum is invalid`);for(let o of n.enum??[])f(o,`input ${n.name} enum value`,t,2e3);n.default!==void 0&&!n.enum.includes(n.default)&&t.push(`input ${n.name} default is outside its enum`)}if(n?.pattern!==void 0){f(n.pattern,`input ${n.name} pattern`,t,1e3);try{new RegExp(n.pattern,"u")}catch{t.push(`input ${n.name} pattern is invalid`)}}}let s=new Set;for(let n of e?.requiredSecretRefs??[])/^[A-Z_][A-Z0-9_]{0,127}$/u.test(n)||t.push(`required secret ref ${n} is invalid`),s.has(n)&&t.push(`duplicate secret ref ${n}`),s.add(n);(!Array.isArray(e?.steps)||e.steps.length<1||e.steps.length>256)&&t.push("steps must contain 1 through 256 records"),Array.isArray(e?.steps)&&e.steps.length>(e?.budget?.maxAgents??0)&&t.push("budget.maxAgents must cover every recipe step");let a=new Map;for(let n of e?.steps??[]){I(n?.id,"step id",t),a.has(n.id)&&t.push(`duplicate step ${n.id}`),a.set(n.id,n),f(n?.title,`step ${n.id} title`,t,2e3),n?.kind!=="agent"&&n?.kind!=="verification"&&t.push(`step ${n.id} kind is invalid`),f(n?.prompt,`step ${n.id} prompt`,t,128e3),n?.agentProfile!==void 0&&I(n.agentProfile,`step ${n.id} agentProfile`,t);for(let o of n?.dependsOn??[])I(o,`step ${n.id} dependency`,t);n?.approval&&f(n.approval.message,`step ${n.id} approval message`,t,8e3);for(let o of n?.expectedArtifacts??[])U(o,`step ${n.id} expected artifact`,t);for(let o of B(n?.prompt??""))r.has(o)||t.push(`step ${n.id} references unknown input ${o}`);/\{\{\s*(?:secret|env)[.:]/iu.test(n?.prompt??"")&&t.push(`step ${n.id} cannot interpolate secrets into prompts`)}for(let n of e?.steps??[])for(let o of n.dependsOn??[])a.has(o)||t.push(`step ${n.id} depends on unknown step ${o}`),o===n.id&&t.push(`step ${n.id} cannot depend on itself`);if(M(e?.steps??[],t),t.length>0)throw new d([...new Set(t)])}function kt(e,t){if(w(e),!e.modes.includes(t.mode))throw new d([`recipe does not allow ${t.mode} mode`]);let i=t.inputs??{},r=new Map(e.inputs.map(o=>[o.name,o])),s=Object.keys(i).filter(o=>!r.has(o));if(s.length>0)throw new d(s.map(o=>`unknown recipe input ${o}`));let a={};for(let o of e.inputs){let b=i[o.name]??o.default;if(b===void 0){if(o.required)throw new d([`required recipe input ${o.name} is missing`]);a[o.name]="";continue}a[o.name]=j(o,b)}let n=e.requiredSecretRefs.filter(o=>t.hasSecretRef&&!t.hasSecretRef(o));if(n.length>0)throw new d(n.map(o=>`required secret reference is unavailable: ${o}`));return{schemaVersion:1,recipeId:e.recipeId,recipeVersion:e.version,recipeFingerprint:V(e),mode:t.mode,inputs:a,requiredSecretRefs:[...e.requiredSecretRefs],authority:structuredClone(e.authority),budget:structuredClone(e.budget),steps:H(e.steps).map(o=>({...structuredClone(o),prompt:q(o.prompt,a)}))}}function V(e){return w(e),{algorithm:"sha256",value:g(e).value}}function Tt(e){return w(e),`${u(e)}
|
|
2
|
+
`}function O(e,t){let i=h(e,`inputs[${t}]`,["name","description","required","default","enum","pattern"]);return{name:c(i.name,`inputs[${t}].name`),description:c(i.description,`inputs[${t}].description`),required:J(i.required,`inputs[${t}].required`),...i.default!==void 0?{default:c(i.default,`inputs[${t}].default`)}:{},...i.enum!==void 0?{enum:m(i.enum,`inputs[${t}].enum`).map(r=>c(r,"enum value"))}:{},...i.pattern!==void 0?{pattern:c(i.pattern,`inputs[${t}].pattern`)}:{}}}function D(e,t){let i=h(e,`steps[${t}]`,["id","title","kind","prompt","dependsOn","agentProfile","approval","expectedArtifacts"]),r=i.approval===void 0?void 0:h(i.approval,`steps[${t}].approval`,["message"]);return{id:c(i.id,`steps[${t}].id`),title:c(i.title,`steps[${t}].title`),kind:i.kind,prompt:c(i.prompt,`steps[${t}].prompt`),...i.dependsOn!==void 0?{dependsOn:m(i.dependsOn,"dependsOn").map(s=>c(s,"dependency"))}:{},...i.agentProfile!==void 0?{agentProfile:c(i.agentProfile,"agentProfile")}:{},...r?{approval:{message:c(r.message,"approval message")}}:{},...i.expectedArtifacts!==void 0?{expectedArtifacts:m(i.expectedArtifacts,"expectedArtifacts").map(s=>c(s,"expected artifact"))}:{}}}function F(e){let t=h(e,"provenance",["publisherId","source","revision"]);return{publisherId:c(t.publisherId,"provenance.publisherId"),...t.source!==void 0?{source:c(t.source,"provenance.source")}:{},...t.revision!==void 0?{revision:c(t.revision,"provenance.revision")}:{}}}function L(e,t){(!Number.isSafeInteger(e?.maxAgents)||e.maxAgents<1||e.maxAgents>256)&&t.push("budget.maxAgents is invalid"),(!Number.isSafeInteger(e?.maxConcurrency)||e.maxConcurrency<1||e.maxConcurrency>64)&&t.push("budget.maxConcurrency is invalid"),e?.maxConcurrency>e?.maxAgents&&t.push("budget.maxConcurrency cannot exceed maxAgents"),(!Number.isSafeInteger(e?.maxTotalTokens)||e.maxTotalTokens<1||e.maxTotalTokens>1e8)&&t.push("budget.maxTotalTokens is invalid"),(!Number.isSafeInteger(e?.timeoutMs)||e.timeoutMs<1e3||e.timeoutMs>10080*60*1e3)&&t.push("budget.timeoutMs is invalid")}function M(e,t){let i=new Map(e.map(n=>[n.id,n])),r=new Set,s=new Set,a=n=>{if(!(s.has(n)||!i.has(n))){if(r.has(n)){t.push(`recipe step dependency cycle includes ${n}`);return}r.add(n);for(let o of i.get(n)?.dependsOn??[])a(o);r.delete(n),s.add(n)}};for(let n of e)a(n.id)}function H(e){let t=new Map(e.map(s=>[s.id,s])),i=new Map(e.map((s,a)=>[s.id,{step:s,index:a,dependencies:new Set(s.dependsOn??[])}])),r=[];for(;i.size>0;){let s=[...i.values()].filter(({dependencies:a})=>[...a].every(n=>!i.has(n))).sort((a,n)=>a.index-n.index);if(s.length===0)throw new d(["recipe step dependency graph is cyclic"]);for(let a of s)r.push(t.get(a.step.id)),i.delete(a.step.id)}return r}function j(e,t){let i=t.trim();if(i.length>32e3||R(i,{allowTab:!0,allowLineBreaks:!0}))throw new d([`input ${e.name} is invalid`]);if(e.enum&&!e.enum.includes(i))throw new d([`input ${e.name} is outside its enum`]);if(e.pattern&&!new RegExp(e.pattern,"u").test(i))throw new d([`input ${e.name} does not match its pattern`]);return i}function q(e,t){return e.replace(/\{\{\s*input\.([A-Za-z_][A-Za-z0-9_-]*)\s*\}\}/gu,(i,r)=>t[r]??"")}function B(e){return[...e.matchAll(/\{\{\s*input\.([A-Za-z_][A-Za-z0-9_-]*)\s*\}\}/gu)].map(t=>t[1])}function h(e,t,i){if(!e||typeof e!="object"||Array.isArray(e))throw new d([`${t} must be an object`]);let r=e,s=Object.keys(r).filter(a=>!i.includes(a));if(s.length>0)throw new d(s.map(a=>`${t} contains unsupported field ${a}`));return r}function m(e,t){if(!Array.isArray(e))throw new d([`${t} must be an array`]);return e}function c(e,t){if(typeof e!="string")throw new d([`${t} must be text`]);return e}function J(e,t){if(typeof e!="boolean")throw new d([`${t} must be boolean`]);return e}function v(e,t){if(!Number.isSafeInteger(e))throw new d([`${t} must be an integer`]);return e}function I(e,t,i){(typeof e!="string"||!/^[A-Za-z0-9][A-Za-z0-9._:@/-]{0,255}$/u.test(e))&&i.push(`${t} is invalid`)}function z(e,t){(typeof e!="string"||!/^[A-Za-z_][A-Za-z0-9_-]{0,127}$/u.test(e))&&t.push(`input name ${String(e)} is invalid`)}function f(e,t,i,r){(typeof e!="string"||!e.trim()||e.length>r||R(e,{allowTab:!0,allowLineBreaks:!0}))&&i.push(`${t} must be non-empty bounded text`)}function U(e,t,i){(typeof e!="string"||!e||e.startsWith("/")||/^[A-Za-z]:[\\/]/u.test(e)||e.includes("\\")||e.split("/").some(r=>!r||r==="."||r===".."))&&i.push(`${t} must be workflow-relative`)}function W(e){return e==="default"||e==="plan"||e==="acceptEdits"||e==="auto"||e==="dontAsk"}export{$ as XENO_RECIPE_SCHEMA_VERSION,d as XenoRecipeValidationError,w as assertValidXenoRecipeDefinition,kt as compileXenoRecipe,xt as parseXenoRecipeDefinition,Tt as serializeXenoRecipe,V as xenoRecipeFingerprint};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"inputs":{"src/artifacts/types.ts":{"bytes":
|
|
1
|
+
{"inputs":{"src/artifacts/types.ts":{"bytes":11227,"imports":[],"format":"esm"},"src/artifacts/hash.ts":{"bytes":1489,"imports":[{"path":"node:crypto","kind":"import-statement","external":true}],"format":"esm"},"src/utils/custom-names.ts":{"bytes":2210,"imports":[],"format":"esm"},"src/artifacts/validation.ts":{"bytes":25271,"imports":[{"path":"src/artifacts/types.ts","kind":"import-statement","original":"./types.js"},{"path":"node:buffer","kind":"import-statement","external":true},{"path":"src/artifacts/hash.ts","kind":"import-statement","original":"./hash.js"},{"path":"src/utils/custom-names.ts","kind":"import-statement","original":"../utils/custom-names.js"},{"path":"src/artifacts/types.ts","kind":"import-statement","original":"./types.js"}],"format":"esm"},"src/artifacts/evidence-graph.ts":{"bytes":8778,"imports":[{"path":"src/artifacts/types.ts","kind":"import-statement","original":"./types.js"},{"path":"src/utils/custom-names.ts","kind":"import-statement","original":"../utils/custom-names.js"}],"format":"esm"},"src/artifacts/repository.ts":{"bytes":29289,"imports":[{"path":"src/artifacts/types.ts","kind":"import-statement","original":"./types.js"},{"path":"src/artifacts/validation.ts","kind":"import-statement","original":"./validation.js"}],"format":"esm"},"src/control-plane/lock.ts":{"bytes":2496,"imports":[{"path":"node:fs","kind":"import-statement","external":true},{"path":"node:os","kind":"import-statement","external":true},{"path":"node:path","kind":"import-statement","external":true}],"format":"esm"},"src/version.ts":{"bytes":195,"imports":[],"format":"esm"},"src/artifacts/file-repository.ts":{"bytes":16334,"imports":[{"path":"node:crypto","kind":"import-statement","external":true},{"path":"node:fs/promises","kind":"import-statement","external":true},{"path":"node:path","kind":"import-statement","external":true},{"path":"src/control-plane/lock.ts","kind":"import-statement","original":"../control-plane/lock.js"},{"path":"src/version.ts","kind":"import-statement","original":"../version.js"},{"path":"src/artifacts/hash.ts","kind":"import-statement","original":"./hash.js"},{"path":"src/artifacts/repository.ts","kind":"import-statement","original":"./repository.js"},{"path":"src/artifacts/types.ts","kind":"import-statement","original":"./types.js"}],"format":"esm"},"src/artifacts/diff-artifact.ts":{"bytes":17998,"imports":[{"path":"node:buffer","kind":"import-statement","external":true},{"path":"src/artifacts/hash.ts","kind":"import-statement","original":"./hash.js"},{"path":"src/artifacts/types.ts","kind":"import-statement","original":"./types.js"},{"path":"src/artifacts/validation.ts","kind":"import-statement","original":"./validation.js"}],"format":"esm"},"src/artifacts/review-service.ts":{"bytes":8672,"imports":[{"path":"node:crypto","kind":"import-statement","external":true},{"path":"src/artifacts/diff-artifact.ts","kind":"import-statement","original":"./diff-artifact.js"},{"path":"src/artifacts/repository.ts","kind":"import-statement","original":"./repository.js"}],"format":"esm"},"src/artifacts/spec-lifecycle.ts":{"bytes":31007,"imports":[{"path":"node:crypto","kind":"import-statement","external":true},{"path":"src/artifacts/hash.ts","kind":"import-statement","original":"./hash.js"},{"path":"src/artifacts/review-service.ts","kind":"import-statement","original":"./review-service.js"},{"path":"src/artifacts/types.ts","kind":"import-statement","original":"./types.js"}],"format":"esm"},"src/artifacts/multi-agent-review.ts":{"bytes":30649,"imports":[{"path":"node:crypto","kind":"import-statement","external":true},{"path":"src/artifacts/hash.ts","kind":"import-statement","original":"./hash.js"},{"path":"src/artifacts/types.ts","kind":"import-statement","original":"./types.js"},{"path":"src/artifacts/validation.ts","kind":"import-statement","original":"./validation.js"},{"path":"src/utils/custom-names.ts","kind":"import-statement","original":"../utils/custom-names.js"}],"format":"esm"},"src/artifacts/legacy-adapters.ts":{"bytes":10908,"imports":[{"path":"node:buffer","kind":"import-statement","external":true},{"path":"src/artifacts/hash.ts","kind":"import-statement","original":"./hash.js"},{"path":"src/artifacts/types.ts","kind":"import-statement","original":"./types.js"},{"path":"src/artifacts/validation.ts","kind":"import-statement","original":"./validation.js"},{"path":"src/artifacts/diff-artifact.ts","kind":"import-statement","original":"./diff-artifact.js"}],"format":"esm"},"src/artifacts/pages.ts":{"bytes":20179,"imports":[{"path":"node:crypto","kind":"import-statement","external":true},{"path":"node:fs","kind":"import-statement","external":true},{"path":"node:path","kind":"import-statement","external":true},{"path":"node:crypto","kind":"import-statement","external":true},{"path":"src/artifacts/hash.ts","kind":"import-statement","original":"./hash.js"},{"path":"src/artifacts/types.ts","kind":"import-statement","original":"./types.js"}],"format":"esm"},"src/artifacts/index.ts":{"bytes":413,"imports":[{"path":"src/artifacts/types.ts","kind":"import-statement","original":"./types.js"},{"path":"src/artifacts/validation.ts","kind":"import-statement","original":"./validation.js"},{"path":"src/artifacts/hash.ts","kind":"import-statement","original":"./hash.js"},{"path":"src/artifacts/evidence-graph.ts","kind":"import-statement","original":"./evidence-graph.js"},{"path":"src/artifacts/repository.ts","kind":"import-statement","original":"./repository.js"},{"path":"src/artifacts/file-repository.ts","kind":"import-statement","original":"./file-repository.js"},{"path":"src/artifacts/diff-artifact.ts","kind":"import-statement","original":"./diff-artifact.js"},{"path":"src/artifacts/review-service.ts","kind":"import-statement","original":"./review-service.js"},{"path":"src/artifacts/spec-lifecycle.ts","kind":"import-statement","original":"./spec-lifecycle.js"},{"path":"src/artifacts/multi-agent-review.ts","kind":"import-statement","original":"./multi-agent-review.js"},{"path":"src/artifacts/legacy-adapters.ts","kind":"import-statement","original":"./legacy-adapters.js"},{"path":"src/artifacts/pages.ts","kind":"import-statement","original":"./pages.js"}],"format":"esm"},"src/utils/text-security.ts":{"bytes":809,"imports":[],"format":"esm"},"src/recipes/protocol.ts":{"bytes":21365,"imports":[{"path":"src/artifacts/index.ts","kind":"import-statement","original":"../artifacts/index.js"},{"path":"src/utils/text-security.ts","kind":"import-statement","original":"../utils/text-security.js"}],"format":"esm"},"src/recipes/index.ts":{"bytes":31,"imports":[{"path":"src/recipes/protocol.ts","kind":"import-statement","original":"./protocol.js"}],"format":"esm"}},"outputs":{"dist/recipes/index.cjs":{"imports":[{"path":"node:crypto","kind":"require-call","external":true}],"exports":[],"entryPoint":"src/recipes/index.ts","inputs":{"src/recipes/index.ts":{"bytesInOutput":252},"src/artifacts/types.ts":{"bytesInOutput":819},"src/artifacts/index.ts":{"bytesInOutput":0},"src/artifacts/hash.ts":{"bytesInOutput":715},"src/artifacts/validation.ts":{"bytesInOutput":138},"src/artifacts/evidence-graph.ts":{"bytesInOutput":32},"src/artifacts/file-repository.ts":{"bytesInOutput":20},"src/artifacts/diff-artifact.ts":{"bytesInOutput":20},"src/artifacts/pages.ts":{"bytesInOutput":20},"src/utils/text-security.ts":{"bytesInOutput":179},"src/recipes/protocol.ts":{"bytesInOutput":10079}},"bytes":12893}}}
|