@popmelt.com/core 0.8.7 → 0.8.9
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/README.md +3 -18
- package/dist/bridge-entry.mjs +47 -107
- package/dist/{chunk-ETDSTV4E.mjs → chunk-AX3C7GUE.mjs} +1 -1
- package/dist/cli.mjs +47 -107
- package/dist/index.d.mts +10 -1
- package/dist/index.mjs +68 -47
- package/dist/memory-legacy.d.mts +5 -1
- package/dist/memory-legacy.mjs +1 -1
- package/dist/memory-store.d.mts +6 -94
- package/dist/memory-store.mjs +3 -3
- package/dist/memory.d.mts +5 -10
- package/dist/memory.mjs +1 -1
- package/dist/plugin-astro.mjs +1 -1
- package/dist/plugin-vite.mjs +1 -1
- package/dist/server-6UNEV3DE.mjs +182 -0
- package/dist/server.d.mts +1 -1
- package/dist/server.mjs +48 -108
- package/package.json +1 -1
- package/dist/server-FZ2YAIA5.mjs +0 -242
package/dist/memory-store.mjs
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import{createHash as Tt}from"crypto";import{mkdir as tt,open as qe,readFile as ze,readdir as xt,rename as kt,unlink as Ve}from"fs/promises";import{join as H}from"path";var gt=/^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;function ce(n){return gt.test(n)}function vt(n){return{valid:!n.some(e=>e.severity==="error"),issues:n}}function k(n,e,t,i){n.push({path:e,code:t,message:i,severity:"error"})}function Je(n,e,t,i){n.push({path:e,code:t,message:i,severity:"warning"})}function D(n,e,t){ce(t)||k(n,e,"invalid_uuid_v7","Canonical IDs must be UUIDv7 values.")}function N(n,e,t){(!t||Number.isNaN(Date.parse(t)))&&k(n,e,"invalid_timestamp","Timestamps must be parseable ISO-8601 strings.")}function Y(n,e,t,i=!1){i&&t.level==="contributor"&&k(n,`${e}.level`,"insufficient_authority","Contributors cannot accept or change normative product truth."),t.level==="delegate"&&!t.grantId&&k(n,`${e}.grantId`,"missing_authority_grant","Delegate authority must reference the grant used for this action.")}var wt={observation:new Set(["null->open","open->resolved","open->dismissed","resolved->open","dismissed->open"]),proposal:new Set(["null->draft","draft->pending","pending->accepted","pending->rejected","pending->withdrawn","pending->deferred","deferred->pending"]),decision:new Set(["null->active","active->superseded","active->revoked"]),advisory_explanation:new Set(["null->emerging","null->testing","null->grounded","null->challenged","null->retired","emerging->testing","emerging->grounded","emerging->challenged","emerging->retired","testing->grounded","testing->challenged","testing->retired","grounded->challenged","grounded->retired","challenged->testing","challenged->retired"]),implementation_attempt:new Set(["null->planned","planned->in_progress","planned->abandoned","in_progress->completed","in_progress->failed","in_progress->abandoned"]),eval_spec:new Set(["null->draft","null->active","draft->active","draft->retired","active->retired"]),verification_attempt:new Set(["null->queued","queued->running","queued->cancelled","running->passed","running->failed","running->inconclusive","running->error","running->cancelled"]),freshness_signal:new Set(["null->open","open->resolved"])},bt=new Set(["proposal:accepted","proposal:rejected","decision:superseded","decision:revoked"]);function jt(n,e,t){D(n,`${t}.id`,e.id),D(n,`${t}.projectId`,e.projectId),D(n,`${t}.participantId`,e.participantId),D(n,`${t}.entity.entityId`,e.entity.entityId),N(n,`${t}.createdAt`,e.createdAt),Y(n,`${t}.authority`,e.authority);let i=wt[e.entity.entityType],r=`${e.fromState??"null"}->${e.toState}`;i&&!i.has(r)&&k(n,t,"invalid_lifecycle_transition",`${e.entity.entityType} does not allow ${r}.`);let c=`${e.entity.entityType}:${e.toState}`;if(bt.has(c)&&(Y(n,`${t}.authority`,e.authority,!0),e.reason?.trim()||k(n,`${t}.reason`,"missing_normative_reason","Normative acceptance, rejection, supersession, and revocation require a reason.")),e.entity.entityType==="proposal"&&e.toState==="deferred"){let o=e.transitionContext;(o?.kind!=="proposal_deferral"||o.resurfaceWhen.length===0)&&k(n,`${t}.transitionContext`,"missing_deferral_policy","Deferred proposals require structured resurfacing conditions."),o?.resurfaceWhen.includes("after_date")&&!o.revisitAfter&&k(n,`${t}.transitionContext.revisitAfter`,"missing_revisit_date","after_date resurfacing requires revisitAfter."),o?.revisitAfter&&N(n,`${t}.transitionContext.revisitAfter`,o.revisitAfter)}}function Rt(n,e,t,i){D(n,`${t}.id`,e.id),D(n,`${t}.projectId`,e.projectId),D(n,`${t}.participantId`,e.participantId),N(n,`${t}.createdAt`,e.createdAt),e.projectId!==i&&k(n,`${t}.projectId`,"project_mismatch","Record belongs to another project."),"subjects"in e&&e.subjects.length===0&&k(n,`${t}.subjects`,"missing_subject","Proposals and decisions need a subject."),"subjects"in e&&e.subjects.length>1&&!e.subjectSemantics?.trim()&&k(n,`${t}.subjectSemantics`,"missing_subject_semantics","Multi-subject claims must explain why the subjects are inseparable."),e.recordType==="proposal"&&e.origin.mode==="inferred"&&(!e.origin.sourceText||!e.origin.iterationId||!e.origin.inferredById)&&k(n,`${t}.origin`,"incomplete_inference_provenance","Inferred structure requires source text, iteration, and inferring participant."),e.recordType==="decision"&&(Y(n,`${t}.authority`,e.authority,!0),e.claim.trim()||k(n,`${t}.claim`,"empty_claim","Accepted decisions require a claim.")),e.recordType==="authority_grant"&&e.level==="owner"&&Je(n,`${t}.level`,"owner_grant_requires_policy_review","Owner grants are valid but should receive explicit policy review."),e.recordType==="advisory_explanation"&&((!e.statement.trim()||!e.rationale.trim())&&k(n,t,"incomplete_advisory_explanation","Advisory explanations need a statement and rationale."),N(n,`${t}.updatedAt`,e.updatedAt),e.subjectIds.length===0&&k(n,`${t}.subjectIds`,"missing_subject","Advisory explanations need a subject."),e.scope.values.some(r=>!r.trim())&&k(n,`${t}.scope.values`,"empty_scope_value","Advisory scope values cannot be empty."),e.concreteBindings.forEach((r,c)=>{(!r.id.trim()||!r.modelPath.trim())&&k(n,`${t}.concreteBindings[${c}]`,"incomplete_concrete_binding","Concrete bindings need an id and model path."),N(n,`${t}.concreteBindings[${c}].createdAt`,r.createdAt),N(n,`${t}.concreteBindings[${c}].updatedAt`,r.updatedAt)})),e.recordType==="freshness_signal"&&e.state==="resolved"&&(!e.resolvedAt||!e.resolvedByEventId)&&k(n,t,"incomplete_freshness_resolution","Resolved freshness signals need a time and resolving event."),e.recordType==="model_projection"&&(N(n,`${t}.appliedAt`,e.appliedAt),Y(n,`${t}.authority`,e.authority,!0),e.entryIds.length===0&&k(n,`${t}.entryIds`,"empty_model_projection","Applied model projections need at least one model entry.")),e.recordType==="eval_spec"&&((!e.legacyId.trim()||!e.title.trim()||!e.prompt.trim())&&k(n,t,"incomplete_eval_spec","Eval specs need a stable id, title, and prompt."),(e.assertions.length===0||e.assertions.some(r=>!r.trim()))&&k(n,`${t}.assertions`,"empty_eval_assertions","Eval specs need at least one non-empty assertion."),e.targets.length===0&&e.decisionIds.length===0&&Je(n,t,"unbound_eval_spec","Eval spec is not yet bound to canonical product truth."),(e.dependencies?.length??0)===0&&Je(n,`${t}.dependencies`,"unscoped_eval_spec","Eval spec has no freshness dependencies."))}function St(n,e,t){if(D(n,`${t}.id`,e.id),D(n,`${t}.projectId`,e.projectId),D(n,`${t}.participantId`,e.participantId),D(n,`${t}.from.entityId`,e.from.entityId),D(n,`${t}.to.entityId`,e.to.entityId),N(n,`${t}.createdAt`,e.createdAt),e.reason.trim()||k(n,`${t}.reason`,"missing_relationship_reason","Relationships need a reason."),new Set(["supports","contradicts","supersedes","excepts"]).has(e.relationshipType)){let r=e.from.entityType==="decision"&&e.to.entityType==="decision",c=e.from.entityType==="advisory_explanation"&&e.to.entityType==="advisory_explanation";!r&&!c&&k(n,t,"invalid_normative_relationship","These relationships connect decisions to decisions or advisory explanations to advisory explanations."),r&&!e.authority?k(n,`${t}.authority`,"missing_relationship_authority","Normative relationships require explicit authority context."):r&&e.authority&&Y(n,`${t}.authority`,e.authority,!0)}["operationalizes","refines","instantiates"].includes(e.relationshipType)&&(e.from.entityType!=="advisory_explanation"||e.to.entityType!=="advisory_explanation")&&k(n,t,"invalid_advisory_relationship","Advisory topology relationships connect advisory explanations."),e.relationshipType==="implements"&&(e.from.entityType!=="implementation_attempt"||e.to.entityType!=="decision")&&k(n,t,"invalid_implements_relationship","`implements` points from an implementation attempt to a decision."),e.relationshipType==="verifies"&&(e.from.entityType!=="verification_attempt"||!["decision","implementation_attempt","model_entry"].includes(e.to.entityType))&&k(n,t,"invalid_verifies_relationship","`verifies` points from a verification attempt to a verifiable target."),e.relationshipType==="replaces"&&e.from.entityType!==e.to.entityType&&k(n,t,"invalid_replaces_relationship","`replaces` connects records of the same entity type.")}function Z(n){let e=[];D(e,"manifest.projectId",n.manifest.projectId),N(e,"manifest.createdAt",n.manifest.createdAt),N(e,"manifest.updatedAt",n.manifest.updatedAt);let t=new Map,i=(s,y)=>{let m=t.get(s);m?k(e,y,"duplicate_id",`ID is already used at ${m}.`):t.set(s,y)};n.records.forEach((s,y)=>{let m=`records[${y}]`;i(s.id,m),Rt(e,s,m,n.manifest.projectId)}),n.events.forEach((s,y)=>{let m=`events[${y}]`;i(s.id,m),jt(e,s,m),s.projectId!==n.manifest.projectId&&k(e,`${m}.projectId`,"project_mismatch","Event belongs to another project.")}),n.relationships.forEach((s,y)=>{let m=`relationships[${y}]`;i(s.id,m),St(e,s,m),s.projectId!==n.manifest.projectId&&k(e,`${m}.projectId`,"project_mismatch","Relationship belongs to another project.")}),n.artifacts.forEach((s,y)=>{i(s.id,`artifacts[${y}]`),D(e,`artifacts[${y}].id`,s.id)}),n.tombstones.forEach((s,y)=>{let m=`tombstones[${y}]`;i(s.id,m),D(e,`${m}.id`,s.id),D(e,`${m}.objectId`,s.objectId),D(e,`${m}.deletedById`,s.deletedById),N(e,`${m}.deletedAt`,s.deletedAt),Y(e,`${m}.authority`,s.authority,!0)});let r=new Set(n.records.map(s=>`${s.recordType}:${s.id}`)),c=new Set(n.tombstones.map(s=>`${s.objectType}:${s.objectId}`)),o=(s,y)=>{let m=`${s.entityType}:${s.entityId}`;!r.has(m)&&!c.has(m)&&k(e,y,"dangling_entity_reference",`No record or tombstone exists for ${m}.`)};n.events.forEach((s,y)=>o(s.entity,`events[${y}].entity`)),n.relationships.forEach((s,y)=>{o(s.from,`relationships[${y}].from`),o(s.to,`relationships[${y}].to`)});let l=new Set(n.artifacts.map(s=>s.id)),u=(s,y)=>{l.has(s)||k(e,y,"dangling_artifact_reference","No artifact manifest entry exists.")},p=(s,y,m)=>{!r.has(`${s}:${y}`)&&!c.has(`${s}:${y}`)&&k(e,m,"dangling_entity_reference",`No ${s} record or tombstone exists.`)};n.records.forEach((s,y)=>{let m=`records[${y}]`;switch(s.recordType){case"authority_grant":p("participant",s.granteeId,`${m}.granteeId`),p("participant",s.grantedById,`${m}.grantedById`),s.subjectIds.forEach((d,a)=>p("subject",d,`${m}.subjectIds[${a}]`));break;case"observation":s.captureContext.subjectIds.forEach((d,a)=>p("subject",d,`${m}.captureContext.subjectIds[${a}]`)),s.captureContext.artifactIds.forEach((d,a)=>u(d,`${m}.captureContext.artifactIds[${a}]`));break;case"proposal":case"decision":s.subjects.forEach((d,a)=>p("subject",d.subjectId,`${m}.subjects[${a}].subjectId`));break;case"thread":s.messageArtifactIds.forEach((d,a)=>u(d,`${m}.messageArtifactIds[${a}]`)),s.resultRefs.forEach((d,a)=>o(d,`${m}.resultRefs[${a}]`));break;case"iteration":s.threadIds.forEach((d,a)=>p("thread",d,`${m}.threadIds[${a}]`)),s.artifactIds.forEach((d,a)=>u(d,`${m}.artifactIds[${a}]`));break;case"evidence":s.artifactIds.forEach((d,a)=>u(d,`${m}.artifactIds[${a}]`));break;case"advisory_explanation":s.subjectIds.forEach((d,a)=>p("subject",d,`${m}.subjectIds[${a}]`)),s.evidenceIds.forEach((d,a)=>p("evidence",d,`${m}.evidenceIds[${a}]`)),s.supersededById&&p("advisory_explanation",s.supersededById,`${m}.supersededById`);break;case"implementation_attempt":s.iterationIds.forEach((d,a)=>p("iteration",d,`${m}.iterationIds[${a}]`)),s.coverageClaims.forEach((d,a)=>p("decision",d.decisionId,`${m}.coverageClaims[${a}].decisionId`)),s.artifactIds.forEach((d,a)=>u(d,`${m}.artifactIds[${a}]`));break;case"eval_spec":s.replacesSpecId&&p("eval_spec",s.replacesSpecId,`${m}.replacesSpecId`),s.decisionIds.forEach((d,a)=>p("decision",d,`${m}.decisionIds[${a}]`)),s.subjectIds.forEach((d,a)=>p("subject",d,`${m}.subjectIds[${a}]`)),(s.dependencies??[]).forEach((d,a)=>{d.kind==="subject"&&d.subjectId&&p("subject",d.subjectId,`${m}.dependencies[${a}].subjectId`)}),(s.scenarios??[]).forEach((d,a)=>{d.subjectIds?.forEach((g,T)=>p("subject",g,`${m}.scenarios[${a}].subjectIds[${T}]`))}),s.targets.forEach((d,a)=>p(d.entityType,d.entityId,`${m}.targets[${a}]`));break;case"verification_attempt":s.evalSpecId&&p("eval_spec",s.evalSpecId,`${m}.evalSpecId`),s.targets.forEach((d,a)=>p(d.entityType,d.entityId,`${m}.targets[${a}]`)),s.evidenceIds.forEach((d,a)=>p("evidence",d,`${m}.evidenceIds[${a}]`));break;case"model_entry":s.subjectIds.forEach((d,a)=>p("subject",d,`${m}.subjectIds[${a}]`)),s.decisionIds.forEach((d,a)=>p("decision",d,`${m}.decisionIds[${a}]`));break;case"model_projection":Y(e,`${m}.authority`,s.authority,!0),p("participant",s.appliedById,`${m}.appliedById`),s.decisionIds.forEach((d,a)=>p("decision",d,`${m}.decisionIds[${a}]`)),s.entryIds.forEach((d,a)=>p("model_entry",d,`${m}.entryIds[${a}]`)),s.coverage.forEach((d,a)=>p("decision",d.decisionId,`${m}.coverage[${a}].decisionId`));break;case"freshness_signal":o(s.target,`${m}.target`),s.evidenceIds.forEach((d,a)=>p("evidence",d,`${m}.evidenceIds[${a}]`));break;default:break}});let b=new Map(n.events.map(s=>[s.id,s])),S=new Map(n.records.map(s=>[`${s.recordType}:${s.id}`,s])),w=new Map;n.events.forEach((s,y)=>{let m=`${s.entity.entityType}:${s.entity.entityId}:${s.fromState??"null"}`,d=w.get(m)??new Set;d.add(s.toState),w.set(m,d),d.size>1&&k(e,`events[${y}]`,"concurrent_incompatible_transitions","The same entity state has multiple incompatible successor states.")});let R=new Map(n.records.flatMap(s=>s.recordType==="authority_grant"?[[s.id,s]]:[])),I=(s,y,m,d,a)=>{if(s.level!=="delegate"||!s.grantId)return;let g=R.get(s.grantId);if(!g){k(e,a,"invalid_authority_grant","Delegated authority references a missing grant.");return}(g.granteeId!==y||g.level!=="delegate")&&k(e,a,"authority_grantee_mismatch","The grant does not authorize this participant as a delegate.");let T=Date.parse(m);(T<Date.parse(g.startsAt)||g.endsAt&&T>Date.parse(g.endsAt)||g.revokedAt&&T>=Date.parse(g.revokedAt))&&k(e,a,"inactive_authority_grant","The delegated authority grant was not active at this time."),g.subjectIds.length&&d.length&&!d.every(f=>g.subjectIds.includes(f))&&k(e,a,"authority_scope_mismatch","The delegated action exceeds the grant subject scope.")};for(let s of n.records)s.recordType==="decision"&&I(s.authority,s.acceptedById,s.createdAt,s.subjects.map(y=>y.subjectId),`records:${s.id}.authority`);n.events.forEach((s,y)=>{let m=S.get(`${s.entity.entityType}:${s.entity.entityId}`),d=m&&"subjects"in m?m.subjects.map(a=>a.subjectId):[];I(s.authority,s.participantId,s.createdAt,d,`events[${y}].authority`)}),n.relationships.forEach((s,y)=>{if(!s.authority)return;let m=[s.from,s.to].flatMap(d=>{let a=S.get(`${d.entityType}:${d.entityId}`);return a&&"subjects"in a?a.subjects.map(g=>g.subjectId):[]});I(s.authority,s.participantId,s.createdAt,m,`relationships[${y}].authority`)});for(let s of n.records){if(s.recordType!=="decision")continue;let y=b.get(s.acceptanceEventId);(!y||y.entity.entityType!=="proposal"||y.entity.entityId!==s.proposalId||y.toState!=="accepted")&&k(e,`records:${s.id}.acceptanceEventId`,"invalid_acceptance_event","A decision must reference the proposal event that explicitly accepted it."),y&&y.participantId!==s.acceptedById&&k(e,`records:${s.id}.acceptedById`,"acceptor_mismatch","Decision acceptor must match the acceptance event participant."),S.has(`proposal:${s.proposalId}`)||k(e,`records:${s.id}.proposalId`,"missing_proposal","Accepted decisions must retain their proposal."),s.state==="superseded"&&(n.relationships.some(d=>d.relationshipType==="supersedes"&&d.to.entityType==="decision"&&d.to.entityId===s.id)||k(e,`records:${s.id}.state`,"missing_successor","Superseded decisions require an explicit successor relationship.")),s.state==="revoked"&&(n.events.some(d=>d.entity.entityType==="decision"&&d.entity.entityId===s.id&&d.toState==="revoked"&&!!d.reason?.trim())||k(e,`records:${s.id}.state`,"missing_revocation_event","Revoked decisions require an authorized event with a reason."))}for(let s of n.records){if(s.recordType!=="proposal"||s.state!=="accepted")continue;n.records.some(m=>m.recordType==="decision"&&m.proposalId===s.id)||k(e,`records:${s.id}.state`,"accepted_proposal_without_decision","Every accepted proposal must produce an immutable decision.")}return vt(e)}var At={records:[],events:[],relationships:[],artifacts:[],tombstones:[],projectionUpdates:[]};function _e(n){return Tt("sha256").update(JSON.stringify(n)).digest("hex")}function Le(n){return _e(n)}function it(n,e,t){[...e.records,...e.recordReplacements??[]].some(i=>i.recordType==="advisory_explanation")&&!n.manifest.features.includes("advisory_explanations")&&n.manifest.features.push("advisory_explanations");for(let i of e.recordReplacements??[]){if(i.recordType!=="advisory_explanation")throw new Error(`Record replacement is not supported for ${i.recordType}.`);let r=n.records.findIndex(o=>o.recordType===i.recordType&&o.id===i.id);if(r<0)throw new Error(`Record replacement target not found: ${i.recordType} ${i.id}`);let c=n.records[r];if(c.projectId!==i.projectId||c.createdAt!==i.createdAt||c.participantId!==i.participantId)throw new Error(`Record replacement changed immutable identity for ${i.id}.`);n.records[r]=structuredClone(i)}for(let i of e.projectionUpdates){let r=n.records.find(c=>c.recordType===i.entityType&&c.id===i.entityId);if(!r||r.recordType!=="proposal"&&r.recordType!=="decision")throw new Error(`Projection target not found: ${i.entityType} ${i.entityId}`);if(r.state!==i.fromState)throw new Error(`Projection state conflict for ${i.entityType} ${i.entityId}: expected ${i.fromState}, found ${r.state}`);r.state=i.state}return n.records.push(...e.records),n.events.push(...e.events),n.relationships.push(...e.relationships),n.artifacts.push(...e.artifacts),n.tombstones.push(...e.tombstones),n.manifest.updatedAt=t,n}function _t(n,e,t){return it(structuredClone(n),e,t)}async function ee(n,e){let t=`${n}.${process.pid}.${Date.now()}.tmp`,i=await qe(t,"w");try{await i.writeFile(`${JSON.stringify(e,null,2)}
|
|
2
|
-
`,"utf8"),await i.sync()}finally{await i.close()}try{await kt(t,n)}catch(r){throw await Ve(t).catch(()=>{}),r}}async function Ae(n){return JSON.parse(await ze(n,"utf8"))}var we=class{constructor(e){this.writeChain=Promise.resolve();this.memoryDir=H(e,".popmelt","memory"),this.journalDir=H(this.memoryDir,"journal"),this.manifestPath=H(this.memoryDir,"manifest.json"),this.checkpointPath=H(this.memoryDir,"checkpoint.json"),this.lockPath=H(this.memoryDir,"writer.lock")}async initialize(e){let t=Z(e);if(!t.valid)throw new Error(`Cannot initialize invalid memory bundle: ${JSON.stringify(t.issues)}`);await tt(this.journalDir,{recursive:!0});try{throw await ze(this.manifestPath,"utf8"),new Error("Memory journal is already initialized.")}catch(i){if(i instanceof Error&&i.message==="Memory journal is already initialized."||i.code!=="ENOENT")throw i}await this.withWriterLock(async()=>{try{throw await ze(this.manifestPath,"utf8"),new Error("Memory journal is already initialized.")}catch(o){if(o instanceof Error&&o.message==="Memory journal is already initialized."||o.code!=="ENOENT")throw o}let i=_e(e),r={storageVersion:1,sequence:0,hash:i,journalHash:null,bundle:e},c={storageVersion:1,projectId:e.manifest.projectId,checkpoint:{file:"checkpoint.json",sequence:0,hash:i},head:{sequence:0,hash:null},updatedAt:e.manifest.updatedAt};await ee(this.checkpointPath,r),await ee(this.manifestPath,c)})}async load(){let e=await this.loadInternal();return{bundle:e.bundle,report:e.report}}async recover(){return this.enqueueWrite(async()=>this.withWriterLock(async()=>{let e=await this.loadInternal();return e.report.recoveredTransactions>0&&(e.manifest.head={sequence:e.report.headSequence,hash:e.report.headHash},e.manifest.updatedAt=e.bundle.manifest.updatedAt,await ee(this.manifestPath,e.manifest)),{bundle:e.bundle,report:e.report}}))}async rotateCheckpoint(){return this.enqueueWrite(async()=>this.withWriterLock(async()=>{let e=await this.loadInternal();if(e.report.headSequence===e.report.checkpointSequence)return{bundle:e.bundle,report:e.report};let t=_e(e.bundle),i=`checkpoint-${String(e.report.headSequence).padStart(12,"0")}.json`,r={storageVersion:1,sequence:e.report.headSequence,hash:t,journalHash:e.report.headHash,bundle:e.bundle};return await ee(H(this.memoryDir,i),r),e.manifest.checkpoint={file:i,sequence:r.sequence,hash:t},await ee(this.manifestPath,e.manifest),{bundle:e.bundle,report:{...e.report,checkpointSequence:r.sequence,appliedTransactions:0}}}))}async maintain(e=250){let t=await this.load();return t.report.headSequence-t.report.checkpointSequence>=e?this.rotateCheckpoint():t}async commit(e,t){return this.enqueueWrite(async()=>this.withWriterLock(async()=>{if(!ce(t.transactionId))throw new Error("Transaction ID must be UUIDv7.");if(Number.isNaN(Date.parse(t.committedAt)))throw new Error("committedAt must be ISO-8601.");let i=await this.loadInternal();if(i.transactionIds.has(t.transactionId))throw new Error(`Transaction already exists: ${t.transactionId}`);let r=i.report.headSequence+1,c={storageVersion:1,sequence:r,transactionId:t.transactionId,projectId:i.bundle.manifest.projectId,committedAt:t.committedAt,previousHash:i.report.headHash,mutation:e},o={...c,hash:Le(c)},l=_t(i.bundle,e,t.committedAt),u=Z(l);if(!u.valid)throw new Error(`Journal mutation produces invalid memory: ${JSON.stringify(u.issues)}`);let p=`${String(r).padStart(12,"0")}-${t.transactionId}.json`;return await ee(H(this.journalDir,p),o),i.manifest.head={sequence:r,hash:o.hash},i.manifest.updatedAt=t.committedAt,await ee(this.manifestPath,i.manifest),{bundle:l,report:{checkpointSequence:i.report.checkpointSequence,appliedTransactions:i.report.appliedTransactions+1,recoveredTransactions:0,ignoredTemporaryFiles:i.report.ignoredTemporaryFiles,headSequence:r,headHash:o.hash}}}))}async commitReviewPlan(e,t){return this.commit({...At,records:e.append.records,events:e.append.events,relationships:e.append.relationships,projectionUpdates:e.projectionUpdates},t)}async loadInternal(){let e=await Ae(this.manifestPath),t=await Ae(H(this.memoryDir,e.checkpoint.file));if(e.storageVersion!==1||t.storageVersion!==1)throw new Error("Unsupported memory journal storage version.");if(e.projectId!==t.bundle.manifest.projectId)throw new Error("Checkpoint project does not match journal manifest.");if(t.hash!==_e(t.bundle)||t.hash!==e.checkpoint.hash)throw new Error("Memory checkpoint hash mismatch.");let i=await xt(this.journalDir),r=i.filter(w=>w.endsWith(".tmp")),o=i.filter(w=>/^\d{12}-[0-9a-f-]+\.json$/i.test(w)).sort().filter(w=>Number(w.slice(0,12))>t.sequence),l=structuredClone(t.bundle),u=t.sequence,p=t.journalHash??null,b=new Set;for(let w of o){let R=await Ae(H(this.journalDir,w)),{hash:I,...s}=R;if(I!==Le(s))throw new Error(`Journal hash mismatch: ${w}`);if(R.sequence!==u+1)throw new Error(`Journal sequence gap at ${w}`);if(R.previousHash!==p)throw new Error(`Journal chain mismatch at ${w}`);if(R.projectId!==e.projectId)throw new Error(`Journal project mismatch at ${w}`);if(b.has(R.transactionId))throw new Error(`Duplicate transaction ID: ${R.transactionId}`);it(l,R.mutation,R.committedAt),u=R.sequence,p=R.hash,b.add(R.transactionId)}if(e.head.sequence>u)throw new Error("Journal manifest points beyond available transactions.");if(e.head.sequence===u&&e.head.hash!==p)throw new Error("Journal manifest head hash mismatch.");let S=Z(l);if(!S.valid)throw new Error(`Loaded journal is invalid: ${JSON.stringify(S.issues)}`);return{bundle:l,manifest:e,transactionIds:b,report:{checkpointSequence:t.sequence,appliedTransactions:o.length,recoveredTransactions:Math.max(0,u-e.head.sequence),ignoredTemporaryFiles:r.length,headSequence:u,headHash:p}}}enqueueWrite(e){let t=this.writeChain.then(e,e);return this.writeChain=t.then(()=>{},()=>{}),t}async withWriterLock(e){await tt(this.memoryDir,{recursive:!0});let t;try{t=await qe(this.lockPath,"wx")}catch(i){if(i.code!=="EEXIST")throw i;let r=await Ae(this.lockPath).catch(()=>({})),c=!0;if(typeof r.pid=="number")try{process.kill(r.pid,0)}catch(o){c=o.code!=="ESRCH"}if(c)throw new Error("Memory journal is locked by another writer.");await Ve(this.lockPath),t=await qe(this.lockPath,"wx")}try{return await t.writeFile(JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()})),await e()}finally{await t.close(),await Ve(this.lockPath).catch(()=>{})}}};import{mkdir as Ke,readFile as W,writeFile as We}from"fs/promises";import{join as U}from"path";var Mt=new Set(["about","after","again","before","being","change","from","have","into","make","should","that","the","their","this","with","would","here","only"]);function Ne(n){return n.toLowerCase().replace(/[^a-z0-9]+/g," ").trim().replace(/\s+/g," ")}function Me(n){return new Set(Ne(n).split(" ").filter(e=>e.length>2&&!Mt.has(e)))}function nt(n,e){if(!n.size||!e.size)return 0;let t=0;for(let i of n)e.has(i)&&(t+=1);return t/Math.min(n.size,e.size)}function Et(n){return[{value:n.label,by:"label"},...n.aliases.map(e=>({value:e,by:"alias"})),...n.locators.map(e=>({value:e.value,by:"locator"}))]}function Pt(n,e){let t=new Map,i=new Set(e.subjectIds??[]),r=(e.subjectHints??[]).map(Ne).filter(Boolean),c=Me([e.action,e.text].filter(Boolean).join(" "));for(let o of n){if(i.has(o.id)){t.set(o.id,{subjectId:o.id,label:o.label,confidence:"exact",matchedBy:"id",score:100});continue}let l;for(let u of Et(o)){let p=Ne(u.value);for(let w of r){let R=p===w?95:p.includes(w)||w.includes(p)?75:0;R>(l?.score??0)&&(l={subjectId:o.id,label:o.label,confidence:R>=90?"exact":"strong",matchedBy:u.by,score:R})}let S=["/","#","[","]","="].some(w=>u.value.includes(w))?0:Math.round(nt(Me(p),c)*55);S>=30&&S>(l?.score??0)&&(l={subjectId:o.id,label:o.label,confidence:S>=45?"strong":"weak",matchedBy:"query_text",score:S})}l&&t.set(o.id,l)}return t}function $t(n,e){let t=new Set(n.sourceRefs.filter(o=>o.kind==="iteration").map(o=>o.id)),i=new Set(n.sourceRefs.filter(o=>o.kind==="thread").map(o=>o.id)),r=e.filter(o=>o.iterationIds.some(l=>t.has(l))||o.sourceRefs.some(l=>l.kind==="thread"&&i.has(l.id)));if(!r.length)return{state:"none_found",attemptIds:[]};let c=new Set(r.map(o=>o.state));return{state:c.size>1?"mixed":c.has("completed")?"completed":"attempted",attemptIds:r.map(o=>o.id)}}function Ct(n){return Math.ceil(JSON.stringify(n).length/4)}function Fe(n,e){let t=n.records.filter(y=>y.recordType==="subject"),i=e.generatedAt??new Date().toISOString(),r=e.candidateProposalIds?new Set(e.candidateProposalIds):void 0,c=n.records.filter(y=>{if(y.recordType!=="proposal"||r&&!r.has(y.id))return!1;if(y.state==="pending")return!0;if(y.state!=="deferred")return!1;let m=[...n.events].reverse().find(d=>d.entity.entityType==="proposal"&&d.entity.entityId===y.id&&d.toState==="deferred"&&d.transitionContext?.kind==="proposal_deferral")?.transitionContext;return m?m.resurfaceWhen.includes("different_action")&&e.resurface?.differentAction||m.resurfaceWhen.includes("new_evidence")&&e.resurface?.newEvidence||m.resurfaceWhen.includes("new_conflict")&&e.resurface?.newConflict||m.resurfaceWhen.includes("owner_request")&&e.resurface?.ownerRequested||m.resurfaceWhen.includes("after_date")&&!!(m.revisitAfter&&Date.parse(i)>=Date.parse(m.revisitAfter)):!1}),o=n.records.filter(y=>y.recordType==="implementation_attempt"),l=Pt(t,e),u=[...l.values()].sort((y,m)=>m.score-y.score),p=Me([e.action,e.text].filter(Boolean).join(" ")),b=c.flatMap(y=>{let m=y.subjects.map(T=>l.get(T.subjectId)).filter(T=>!!T),d=Math.max(0,...m.map(T=>T.score)),a=Math.round(nt(Me(y.claim),p)*35),g=d+a;return g>=50?[{proposal:y,proposalMatches:m,score:g}]:[]}).sort((y,m)=>m.score-y.score||y.proposal.id.localeCompare(m.proposal.id)),S=Math.max(1,e.maxPackets??3),w=Math.max(200,e.maxEstimatedTokens??1200),R=[],I=0;for(let y of b){if(R.length>=S)break;let m=y.proposal.sourceRefs.slice(0,4),d={contractVersion:1,packetId:`review:${y.proposal.id}`,projectId:n.manifest.projectId,generatedAt:i,trigger:{action:e.action,reason:y.proposalMatches.length?`Historical proposal intersects ${y.proposalMatches.map(g=>g.label).join(", ")}.`:"Historical proposal materially overlaps the current task.",subjectMatches:y.proposalMatches.map(({score:g,...T})=>T)},proposal:{id:y.proposal.id,claim:y.proposal.claim,state:y.proposal.state,proposedKind:y.proposal.proposedKind,subjectIds:y.proposal.subjects.map(g=>g.subjectId),origin:y.proposal.origin.mode},authority:"unaccepted",presentation:y.score>=100&&["constraint","rule"].includes(y.proposal.proposedKind??"")?"surface_before_action":"advisory",implementation:$t(y.proposal,o),evidence:{sourceCount:y.proposal.sourceRefs.length,sourceRefs:m},actions:["accept","edit_and_accept","split","bundle","reject","defer","request_evidence"],expansionRefs:[{kind:"record",id:y.proposal.id},...m]},a={...d,estimatedTokens:Ct(d)};if(I+a.estimatedTokens>w)break;R.push(a),I+=a.estimatedTokens}let s=Math.max(0,b.length-R.length);return{packets:R,subjectMatches:u.map(({score:y,...m})=>m),completeness:{status:s>0?"truncated":"complete",consideredProposalCount:b.length,omittedPacketCount:s,maxEstimatedTokens:w,estimatedTokens:I},uncertainty:l.size===0?"subject_unresolved":b.length===0?"no_relevant_pending_proposal":void 0}}var Dt=new Set(["about","after","again","before","being","change","from","have","into","make","should","that","the","their","this","with","would","here","only"]);function Ue(n){return n.toLowerCase().replace(/[^a-z0-9]+/g," ").trim().replace(/\s+/g," ")}function Ee(n){return new Set(Ue(n).split(" ").filter(e=>e.length>2&&!Dt.has(e)))}function rt(n,e){if(!n.size||!e.size)return 0;let t=0;for(let i of n)e.has(i)&&(t+=1);return t/Math.min(n.size,e.size)}function Bt(n,e){let t=new Set(e.subjectIds??[]),i=(e.subjectHints??[]).map(Ue).filter(Boolean),r=Ee([e.action,e.text].filter(Boolean).join(" ")),c=[];for(let o of n){if(t.has(o.id)){c.push({subjectId:o.id,subjectType:o.subjectType,label:o.label,confidence:"exact",matchedBy:"id",score:100});continue}let l,u=[{value:o.label,by:"semantic"},...o.aliases.map(p=>({value:p,by:"alias"})),...o.locators.map(p=>({value:p.value,by:"locator"}))];for(let p of u){let b=Ue(p.value);for(let R of i){let I=b===R?95:b.includes(R)||R.includes(b)?75:0;I>(l?.score??0)&&(l={subjectId:o.id,subjectType:o.subjectType,label:o.label,confidence:I>=90?"exact":"strong",matchedBy:p.by,score:I})}let w=["/","#","[","]","="].some(R=>p.value.includes(R))?0:Math.round(rt(Ee(b),r)*55);w>=30&&w>(l?.score??0)&&(l={subjectId:o.id,subjectType:o.subjectType,label:o.label,confidence:w>=45?"strong":"weak",matchedBy:"semantic",score:w})}l&&c.push(l)}return c.sort((o,l)=>l.score-o.score||o.subjectId.localeCompare(l.subjectId))}function Ot(n){return Math.ceil(JSON.stringify(n).length/4)}function de(n,e){return n.relationshipType===e&&n.from.entityType==="decision"&&n.to.entityType==="decision"}function Jt(n,e){let t=e.filter(c=>c.coverageClaims.some(o=>o.decisionId===n));if(!t.length)return{decisionId:n,state:"unimplemented",attemptIds:[]};let i=t.filter(c=>c.state==="completed"),r=i.some(c=>c.coverageClaims.some(o=>o.decisionId===n&&o.coverage==="full"));return{decisionId:n,state:r?"implemented":i.length?"partial":"unknown",attemptIds:t.map(c=>c.id)}}function qt(n,e,t){let i=e.filter(l=>l.targets.some(u=>u.entityType==="decision"&&u.entityId===n)).sort((l,u)=>u.createdAt.localeCompare(l.createdAt)),r=t.some(l=>l.signalType==="verification_expired"&&l.target.entityType==="decision"&&l.target.entityId===n),c=i[0],o=r?"stale":c?c.state==="passed"?"passing":c.state==="failed"?"failing":["inconclusive","error","cancelled"].includes(c.state)?"blocked":"unverified":"unverified";return{target:{entityType:"decision",entityId:n},state:o,attemptIds:i.map(l=>l.id)}}function st(n,e){let t=Math.max(300,e.maxEstimatedTokens??1200),i=Math.max(1,e.maxDecisions??6),r=n.records.filter(v=>v.recordType==="subject"),c=e.candidateDecisionIds?new Set(e.candidateDecisionIds):void 0,o=n.records.filter(v=>v.recordType==="decision"&&v.state==="active"),l=c?o.filter(v=>c.has(v.id)):o,u=n.records.filter(v=>v.recordType==="implementation_attempt"),p=n.records.filter(v=>v.recordType==="verification_attempt"),b=n.records.filter(v=>v.recordType==="freshness_signal"&&v.state==="open"),S=n.records.filter(v=>v.recordType==="evidence"),w=n.records.filter(v=>v.recordType==="model_entry"),R=[...n.records].reverse().filter(v=>v.recordType==="eval_spec").filter((v,A,j)=>j.findIndex(P=>P.legacyId===v.legacyId)===A),I=Bt(r,e),s=new Map(I.map(v=>[v.subjectId,v.score])),y=Ee([e.action,e.text].filter(Boolean).join(" ")),m=l.flatMap(v=>{let A=Math.max(0,...v.subjects.map(O=>s.get(O.subjectId)??0)),j=Math.round(rt(Ee(v.claim),y)*35),P=A+j;return P>=50?[{decision:v,score:P}]:[]}).sort((v,A)=>A.score-v.score||v.decision.id.localeCompare(A.decision.id)),d=new Map;for(let v of m.slice(0,i))d.set(v.decision.id,v.decision);for(let v of n.relationships){if(!de(v,"excepts")&&!de(v,"contradicts"))continue;let A=o.find(P=>P.id===v.from.entityId),j=o.find(P=>P.id===v.to.entityId);!A||!j||!d.has(A.id)&&!d.has(j.id)||(d.size<i&&d.set(A.id,A),d.size<i&&d.set(j.id,j))}let a=[...d.values()],g=v=>v.from.entityType==="decision"&&v.to.entityType==="decision"&&d.has(v.from.entityId)&&d.has(v.to.entityId),T=(v,A=!1)=>{let j=new Set(v.map(h=>h.id)),P=b.filter(h=>h.target.entityType==="decision"&&j.has(h.target.entityId)),O=new Set(n.relationships.filter(h=>de(h,"excepts")&&j.has(h.from.entityId)&&j.has(h.to.entityId)).flatMap(h=>[h.from.entityId,h.to.entityId])),te=n.relationships.filter(h=>de(h,"contradicts")&&j.has(h.from.entityId)&&j.has(h.to.entityId)).map(h=>({id:h.id,decisionIds:[h.from.entityId,h.to.entityId],unresolvedQuestion:h.reason,expansionRefs:[{kind:"record",id:h.id}]})),Te=new Set(te.flatMap(h=>h.decisionIds)),ie=S.filter(h=>h.sourceRefs.some(x=>x.kind==="record"&&j.has(x.id))||n.relationships.some(x=>x.relationshipType==="supports"&&x.from.entityType==="evidence"&&x.from.entityId===h.id&&x.to.entityType==="decision"&&j.has(x.to.entityId))),Q=Math.max(0,m.length-v.length),ye=n.relationships.some(h=>de(h,"contradicts")&&g(h)&&(!j.has(h.from.entityId)||!j.has(h.to.entityId))),xe=A||Q>0||ye,G=[];I.length===0&&(e.subjectHints?.length??0)>0?G.push({code:"subject_unresolved",message:"No canonical subject matched the supplied task hints.",expansionRefs:[]}):v.length===0&&G.push({code:"no_applicable_decision",message:"No accepted decision applies to the resolved task subjects.",expansionRefs:[]}),te.length&&G.push({code:"known_conflict",message:"Applicable accepted decisions contain an unresolved contradiction.",expansionRefs:te.flatMap(h=>h.expansionRefs)}),ie.some(h=>h.availability!=="available")&&G.push({code:"evidence_unavailable",message:"Some supporting evidence is unavailable.",expansionRefs:ie.map(h=>({kind:"record",id:h.id}))}),xe&&G.push({code:"retrieval_truncated",message:"Additional applicable memory exists outside this packet.",expansionRefs:[{kind:"record",id:n.manifest.projectId}]});let he={contractVersion:1,projectId:n.manifest.projectId,retrievedAt:e.retrievedAt??new Date().toISOString(),query:{text:e.text,action:e.action,subjectHints:e.subjectHints??[]},budget:{maxEstimatedTokens:t,estimatedTokens:0},subjectMatches:I.map(({score:h,...x})=>x),modelEntries:w.filter(h=>h.decisionIds.some(x=>j.has(x))).map(h=>({id:h.id,key:h.key,value:h.value,decisionIds:h.decisionIds})),evalSpecs:R.filter(h=>h.decisionIds.some(x=>j.has(x))).map(h=>({id:h.id,legacyId:h.legacyId,state:h.state,title:h.title,assertionCount:h.assertions.length,decisionIds:h.decisionIds,expansionRef:{kind:"record",id:h.id}})),decisions:v.map(h=>({id:h.id,kind:h.kind,claim:h.claim,subjectIds:h.subjects.map(x=>x.subjectId),authority:h.authority,effectiveState:Te.has(h.id)?"conflicted":O.has(h.id)?"excepted":"active",freshness:P.filter(x=>x.target.entityId===h.id).map(x=>x.signalType),expansionRef:{kind:"record",id:h.id}})),conflicts:te,uncertainties:G,implementation:v.map(h=>Jt(h.id,u)),verification:v.map(h=>qt(h.id,p,P)),evidence:ie.map(h=>({evidenceId:h.id,summary:h.summary,availability:h.availability,sourceRefs:h.sourceRefs})),completeness:{status:xe?"truncated":"complete",omittedDecisionCount:Q,omittedEvidenceCount:0,conflictsComplete:!ye}};return he.budget.estimatedTokens=Ot(he),he},f=T(a);for(;f.budget.estimatedTokens>t&&a.length>0;){let v=a.pop(),A=n.relationships.filter(j=>de(j,"contradicts")&&(j.from.entityId===v.id||j.to.entityId===v.id)).flatMap(j=>[j.from.entityId,j.to.entityId]);a=a.filter(j=>!A.includes(j.id)),f=T(a,!0)}return f}function be(n,e,t,i){return{id:i,schemaVersion:1,projectId:n.manifest.projectId,createdAt:t.occurredAt,participantId:t.participantId,sourceRefs:[{kind:"record",id:e.id},...t.sourceRefs??[]],recordType:"lifecycle_event",authority:t.authority}}function ot(n,e,t,i,r){return{id:r,schemaVersion:1,projectId:n.manifest.projectId,createdAt:t.occurredAt,participantId:t.participantId,sourceRefs:[{kind:"record",id:e.id},...t.sourceRefs??[]],recordType:"decision",proposalId:e.id,acceptanceEventId:i,acceptedById:t.participantId,authority:t.authority,state:"active",kind:t.kind,claim:e.claim,rationale:t.rationale??e.rationale,subjects:e.subjects,subjectSemantics:e.subjectSemantics,noChange:!1}}function zt(n){switch(n.action){case"accept":return[n.eventId,n.decisionId];case"edit_and_accept":return[n.withdrawalEventId,n.replacementProposalId,n.acceptanceEventId,n.decisionId,n.relationshipId];case"reject":case"defer":return[n.eventId]}}function Pe(n,e){let t=[],i=n.records.find(c=>c.recordType==="proposal"&&c.id===e.proposalId);i?i.state!=="pending"&&t.push({code:"proposal_not_pending",message:`Proposal is ${i.state}, not pending.`}):t.push({code:"proposal_not_found",message:"Proposal does not exist."}),e.authority.level==="contributor"&&t.push({code:"insufficient_authority",message:"Contributors cannot resolve owner review."}),e.authority.level==="delegate"&&!e.authority.grantId&&t.push({code:"missing_authority_grant",message:"Delegate review requires a grant ID."}),ce(e.participantId)||t.push({code:"invalid_participant_id",message:"Participant ID must be UUIDv7."});for(let c of zt(e))ce(c)||t.push({code:"invalid_generated_id",message:`${c} is not UUIDv7.`});if(Number.isNaN(Date.parse(e.occurredAt))&&t.push({code:"invalid_timestamp",message:"occurredAt must be ISO-8601."}),t.length||!i)return{ok:!1,errors:t};if(e.action==="accept"){if(!e.reason.trim())return{ok:!1,errors:[{code:"reason_required",message:"Acceptance requires a reason."}]};let c={...be(n,i,e,e.eventId),entity:{entityType:"proposal",entityId:i.id},eventType:"proposal.accepted",fromState:"pending",toState:"accepted",reason:e.reason},o=ot(n,i,e,c.id,e.decisionId);return{ok:!0,plan:{action:e.action,proposalId:i.id,append:{records:[o],events:[c],relationships:[]},projectionUpdates:[{entityType:"proposal",entityId:i.id,fromState:"pending",state:"accepted"}],resultRefs:[{entityType:"decision",entityId:o.id}]}}}if(e.action==="edit_and_accept"){if(!e.claim.trim()||!e.reason.trim())return{ok:!1,errors:[{code:"claim_and_reason_required",message:"Edited acceptance requires claim and reason."}]};if(e.subjects.length>1&&!e.subjectSemantics?.trim())return{ok:!1,errors:[{code:"subject_semantics_required",message:"Multi-subject edits require semantics."}]};let c={id:e.replacementProposalId,schemaVersion:1,projectId:n.manifest.projectId,createdAt:e.occurredAt,participantId:e.participantId,sourceRefs:[{kind:"record",id:i.id},...e.sourceRefs??[]],recordType:"proposal",state:"accepted",claim:e.claim,rationale:e.rationale,proposedKind:e.kind,subjects:e.subjects,subjectSemantics:e.subjectSemantics,origin:{mode:"declared"}},o={...be(n,i,e,e.withdrawalEventId),entity:{entityType:"proposal",entityId:i.id},eventType:"proposal.withdrawn",fromState:"pending",toState:"withdrawn",reason:"Owner replaced the inferred proposal with edited wording during review."},l={...be(n,c,e,e.acceptanceEventId),entity:{entityType:"proposal",entityId:c.id},eventType:"proposal.accepted",fromState:"pending",toState:"accepted",reason:e.reason},u=ot(n,c,e,l.id,e.decisionId),p={id:e.relationshipId,schemaVersion:1,projectId:n.manifest.projectId,createdAt:e.occurredAt,participantId:e.participantId,sourceRefs:[{kind:"record",id:i.id}],recordType:"relationship",relationshipType:"derived_from",from:{entityType:"proposal",entityId:c.id},to:{entityType:"proposal",entityId:i.id},reason:"Owner-edited proposal derives from the historical review candidate."};return{ok:!0,plan:{action:e.action,proposalId:i.id,append:{records:[c,u],events:[o,l],relationships:[p]},projectionUpdates:[{entityType:"proposal",entityId:i.id,fromState:"pending",state:"withdrawn"}],resultRefs:[{entityType:"proposal",entityId:c.id},{entityType:"decision",entityId:u.id}]}}}if(e.action==="reject"){if(!e.reason.trim())return{ok:!1,errors:[{code:"reason_required",message:"Rejection requires a reason."}]};let c={...be(n,i,e,e.eventId),entity:{entityType:"proposal",entityId:i.id},eventType:"proposal.rejected",fromState:"pending",toState:"rejected",reason:e.reason};return{ok:!0,plan:{action:e.action,proposalId:i.id,append:{records:[],events:[c],relationships:[]},projectionUpdates:[{entityType:"proposal",entityId:i.id,fromState:"pending",state:"rejected"}],resultRefs:[{entityType:"proposal",entityId:i.id}]}}}let r={...be(n,i,e,e.eventId),entity:{entityType:"proposal",entityId:i.id},eventType:"proposal.deferred",fromState:"pending",toState:"deferred",reason:e.reason,transitionContext:{kind:"proposal_deferral",...e.context}};return{ok:!0,plan:{action:e.action,proposalId:i.id,append:{records:[],events:[r],relationships:[]},projectionUpdates:[{entityType:"proposal",entityId:i.id,fromState:"pending",state:"deferred"}],resultRefs:[{entityType:"proposal",entityId:i.id}]}}}import{createHash as Vt}from"crypto";import{readFile as Lt,readdir as Nt,realpath as Ft}from"fs/promises";import{join as je,relative as Ut}from"path";var Ht=["f5258a13","31ffc15e","3eae3a70","c185e614","33930045","55e04c59","f3bb881b","f8a55928","eac95a7d","e402bdc2","2854624b","cf28ad45","6a494fab","987e901b","ad7293aa","dd1d5d77","14c429d6","48494ad3","d6bbe932","e8b94260","f56fa283","7f1f6cb3","f239f4ac","bd671e61","dbe032ec","c0808b95"];function pe(n){return n!==null&&typeof n=="object"&&!Array.isArray(n)?n:null}function q(n,e=0){return new Date(Number.isFinite(n)?n:e).toISOString()}function at(...n){return n.find(e=>!!e?.trim())?.trim()}function _(n,e,t,i){let c=Math.max(0,Math.min(Math.floor(i),0xffffffffffff)).toString(16).padStart(12,"0"),o=Vt("sha256").update(`${n}\0${e}\0${t}`).digest("hex"),l=(Number.parseInt(o[3],16)&3|8).toString(16);return`${c.slice(0,8)}-${c.slice(8)}-7${o.slice(0,3)}-${l}${o.slice(4,7)}-${o.slice(7,19)}`}async function He(n,e){try{return JSON.parse(await Lt(n,"utf8"))}catch(t){return e.push({severity:"warning",code:"source_unavailable",source:n,message:t instanceof Error?t.message:String(t)}),null}}function Kt(n){let e=pe(n);if(!e)return 0;let t=0,i=r=>{let c=pe(r);if(!c){t+=1;return}for(let o of Object.values(c))i(o)};for(let r of Object.values(e))i(r);return t}function Wt(n){let e={};for(let t of n)e[t.recordType]=(e[t.recordType]??0)+1;return e}async function Re(n){let e=[],t=await Ft(n.projectRoot).catch(()=>n.projectRoot),i=je(t,".popmelt"),r=await He(je(i,"threads.json"),e),c=await He(je(i,"model.json"),e),o=pe(r),l=pe(o?.threads)??{},u=Object.entries(l).map(([h,x])=>({key:h,value:pe(x)})).filter(h=>!!h.value),p=je(i,"decisions"),b=await Nt(p).catch(()=>[]),S=[];for(let h of b.filter(x=>x.endsWith(".json")).sort()){let x=pe(await He(je(p,h),e));x&&S.push({file:h,value:x})}let w=u.flatMap(({value:h})=>[h.createdAt,h.updatedAt]).filter(h=>typeof h=="number"&&Number.isFinite(h)),R=w.length?Math.min(...w):0,I=n.projectKey??t;n.projectKey||e.push({severity:"info",code:"path_derived_project_identity",message:"Canonical project identity is stable for this path; pass projectKey to preserve it across moves."});let s=_(I,"project",I,R),y=_(I,"participant","legacy-owner",R),m=_(I,"participant","legacy-agent",R),d=_(I,"subject","project",R),a=q(Math.max(R,...w)),g=[],T=[],f=new Map,v=new Map,A=new Map(S.map(h=>[h.value.id??h.file.replace(/^d-|\.json$/g,""),h.value])),j=new Map,P=(h,x,E,B,z)=>{let F=f.get(E);if(F)return F;let K=_(I,"artifact",h,B);return T.push({id:K,kind:x,mediaType:z,location:E,availability:"available"}),f.set(E,K),K};for(let{file:h,value:x}of S){let E=x.id??h.replace(/^d-|\.json$/g,""),B=x.createdAt??R,z=[P(`${E}:envelope`,"other",`.popmelt/decisions/${h}`,B,"application/json")];x.screenshotPath&&z.push(P(`${E}:screenshot`,"screenshot",`.popmelt/${x.screenshotPath.replace(/^\.popmelt\//,"")}`,B,x.screenshotPath.endsWith(".png")?"image/png":"image/webp"));for(let[F,K]of(x.pastedImagePaths??[]).entries())z.push(P(`${E}:image:${F}`,"image",K,B));j.set(E,z)}let O=(h,x,E)=>({id:h,schemaVersion:1,projectId:s,createdAt:a,participantId:x,sourceRefs:E}),fe=(h,x)=>{g.push(x);let E=v.get(h)??[];E.push(x.id),v.set(h,E)},te=[{...O(y,y,[]),recordType:"participant",kind:"human",displayName:"Legacy project owner",status:"active"},{...O(m,m,[]),recordType:"participant",kind:"ai",displayName:"Legacy coding agent",status:"active"}];g.push(...te),g.push({...O(d,y,[]),recordType:"subject",subjectType:"project",label:Ut(process.cwd(),t)||t,aliases:[],locators:[{id:_(I,"locator",t,R),kind:"project_root",value:t,status:"current",validFrom:q(R),sourceRefs:[]}]});let Te=new Map,ie=(h,x)=>{let E=Te.get(h);if(E)return E;let B=_(I,"subject",h,x),z={...O(B,y,[{kind:"external",id:h}]),createdAt:q(x),recordType:"subject",subjectType:"element",label:h,aliases:[],locators:[{id:_(I,"locator",h,x),kind:"dom_selector",value:h,status:"current",validFrom:q(x),sourceRefs:[{kind:"external",id:h}]}]};return g.push(z),Te.set(h,B),B};for(let{key:h,value:x}of u){let E=x.id??h,B=x.createdAt??R,z=_(I,"thread",E,B),F={kind:"thread",id:E},K=[],Ie=[],Xe=Array.isArray(x.messages)?x.messages:[],ne,Be,Ye=0;Xe.forEach(($,re)=>{let J=$.timestamp??B,X=_(I,"artifact",`${E}:message:${re}`,J);if(K.push(X),T.push({id:X,kind:"message",mediaType:"application/json",location:`.popmelt/threads.json#/threads/${E}/messages/${re}`,availability:"available"}),f.set(`.popmelt/threads.json#/threads/${E}/messages/${re}`,X),$.screenshotPath&&P(`${E}:message:${re}:screenshot`,"screenshot",$.screenshotPath,J),$.role==="human"){ne=$;let V=$.feedbackSummary??$.replyToQuestion;if(V?.trim()){let L=_(I,"observation",`${E}:${re}`,J),ae=x.elementIdentifiers??[],ke={...O(L,y,[F,{kind:"message",id:X}]),createdAt:q(J),recordType:"observation",state:"open",statement:V,captureContext:{subjectIds:ae.map(ve=>ie(ve,B)),artifactIds:[X]},resolvedByIds:[]};fe(E,ke),Be=L,Ie.push({entityType:"observation",entityId:L})}return}if($.role!=="assistant")return;let se=$.jobId??`${E}:${re}`,oe=_(I,"iteration",se,J),ge=A.get(se),yt=$.cancelled?"cancelled":$.error?"failed":$.question?"question_asked":($.resolutions?.length??0)>0?"completed":"no_change",ht={...O(oe,m,[F,{kind:"message",id:X},...(j.get(se)??[]).map(V=>({kind:"artifact",id:V}))]),createdAt:q(J),recordType:"iteration",threadIds:[z],startedAt:q(ne?.timestamp,J),completedAt:q(J),requestSummary:at(ne?.feedbackSummary,ne?.replyToQuestion)??"[legacy request unavailable]",responseSummary:$.question??$.error??$.responseText?.slice(0,1e3),outcome:yt,execution:{provider:$.provider??ge?.provider,model:$.model??ge?.model,sessionId:$.sessionId??ge?.sessionId},artifactIds:[X,...j.get(se)??[]]};fe(E,ht),Ie.push({entityType:"iteration",entityId:oe});let Oe=$.resolutions??ge?.resolutions??[];for(let[V,L]of Oe.entries()){if(L.status!=="resolved"||!L.summary?.trim())continue;let ae=x.elementIdentifiers??[],ke=(ae.length?ae:[t]).map(et=>({subjectId:et===t?d:ie(et,B),role:"governed"})),ve=_(I,"proposal",`${se}:${L.annotationId??"resolution"}:${V}`,J),It={...O(ve,m,[F,{kind:"iteration",id:oe}]),createdAt:q(J),recordType:"proposal",state:"pending",claim:L.summary,subjects:ke,subjectSemantics:ke.length>1?"Legacy thread grouped these selected elements; independent scope requires owner review.":void 0,origin:{mode:"inferred",sourceText:at(ne?.feedbackSummary,ne?.replyToQuestion,L.summary),iterationId:oe,inferredById:m}};fe(E,It),Ie.push({entityType:"proposal",entityId:ve}),e.push({severity:"warning",code:"acceptance_unresolved",source:E,message:`Proposal ${ve} remains pending; legacy resolved status proves an outcome, not explicit acceptance.`})}if(Oe.some(V=>V.status==="resolved")||ge?.gitDiff){let V=_(I,"implementation",se,J),L={...O(V,m,[F,{kind:"iteration",id:oe}]),createdAt:q(J),recordType:"implementation_attempt",state:"completed",iterationIds:[oe],coverageClaims:[],summary:Oe.map(ae=>ae.summary).filter(Boolean).join(" ")||"Legacy implementation outcome.",artifactIds:[]};fe(E,L),Ie.push({entityType:"implementation_attempt",entityId:V}),Ye+=1}Be&&(Be=void 0)});let Ze=Xe.at(-1),ft={...O(z,y,[F]),createdAt:q(B),recordType:"thread",state:Ze?.question?"open":"resolved",messageArtifactIds:K,outcome:Ze?.question?"question_unresolved":Ye?"implementation_only":"no_outcome",resultRefs:Ie};g.push(ft),v.set(E,[z,...v.get(E)??[]])}let Q=Kt(c);Q&&e.push({severity:"warning",code:"model_entries_deferred",source:".popmelt/model.json",message:`${Q} model values were not promoted because their accepted decision provenance is unresolved.`});let ye={manifest:{formatVersion:1,projectId:s,createdAt:q(R),updatedAt:a,features:["authority","subjects","implementations","eval_specs","portable_artifacts","bounded_retrieval"],writer:{name:"@popmelt.com/core legacy importer",version:n.writerVersion??"0.8.4-dev"}},records:g,events:[],relationships:[],artifacts:T,tombstones:[]},xe=Z(ye),he=(n.proofCaseIds??Ht).map(h=>({legacyId:h,threadFound:u.some(({key:x,value:E})=>(E.id??x)===h),decisionEnvelopeFound:A.has(h),recordIds:v.get(h)??[]}));return{bundle:ye,report:{projectRoot:t,source:{threads:u.length,messages:u.reduce((h,x)=>h+(x.value.messages?.length??0),0),decisionEnvelopes:S.length,modelEntries:Q,artifactsReferenced:T.length},imported:Wt(g),unresolvedAcceptance:e.filter(h=>h.code==="acceptance_unresolved").length,deferredModelEntries:Q,proofCases:he,issues:e,schemaIssues:xe.issues}}}import{randomBytes as Qt}from"crypto";function M(n=Date.now()){let t=Math.max(0,Math.min(Math.floor(n),0xffffffffffff)).toString(16).padStart(12,"0"),i=Qt(10).toString("hex"),r=(Number.parseInt(i[3],16)&3|8).toString(16);return`${t.slice(0,8)}-${t.slice(8)}-7${i.slice(0,3)}-${r}${i.slice(4,7)}-${i.slice(7,19)}`}var Gt=()=>({records:[],events:[],relationships:[],artifacts:[],tombstones:[],projectionUpdates:[]});function ct(n,e){let t=n.records.find(a=>a.recordType==="participant"&&a.kind==="human"&&a.status==="active"),i=n.records.find(a=>a.recordType==="participant"&&a.kind==="ai"&&a.status==="active");if(!t||!i)throw new Error("Canonical memory requires active human and AI participants before job capture.");let r=n.manifest.projectId,c=`${e.threadId}:${e.jobId}`,o=new Date(e.createdAt).toISOString(),l=new Date(e.completedAt).toISOString(),u=Gt(),p=u.records,b=n.records.find(a=>a.recordType==="thread"&&a.sourceRefs.some(g=>g.kind==="thread"&&g.id===e.threadId));b||(b={id:_(r,"live-thread",e.threadId,e.createdAt),schemaVersion:1,projectId:n.manifest.projectId,createdAt:o,participantId:t.id,sourceRefs:[{kind:"thread",id:e.threadId}],recordType:"thread",state:e.outcome==="question_asked"?"open":"resolved",messageArtifactIds:[],outcome:e.outcome==="question_asked"?"question_unresolved":e.resolutions.some(a=>a.status==="resolved")?"implementation_only":"no_outcome",resultRefs:[]},p.push(b));let S=[];for(let a of[...new Set(e.subjectHints.filter(Boolean))]){let g=n.records.find(T=>T.recordType==="subject"&&T.locators.some(f=>f.value===a&&f.status==="current"));g||(g={id:_(r,"live-subject",a,e.createdAt),schemaVersion:1,projectId:n.manifest.projectId,createdAt:o,participantId:t.id,sourceRefs:[{kind:"external",id:a}],recordType:"subject",subjectType:"element",label:a,aliases:[],locators:[{id:_(r,"live-locator",a,e.createdAt),kind:"dom_selector",value:a,status:"current",validFrom:o,sourceRefs:[{kind:"external",id:a}]}]},p.push(g)),S.push(g)}for(let a of[...new Set((e.filePaths??[]).filter(Boolean))]){let g=n.records.find(T=>T.recordType==="subject"&&T.locators.some(f=>f.kind==="source_file"&&f.value===a&&f.status==="current"));g||(g={id:_(r,"live-file-subject",a,e.createdAt),schemaVersion:1,projectId:n.manifest.projectId,createdAt:o,participantId:t.id,sourceRefs:[{kind:"external",id:a}],recordType:"subject",subjectType:"file",label:a,aliases:[],locators:[{id:_(r,"live-file-locator",a,e.createdAt),kind:"source_file",value:a,status:"current",validFrom:o,sourceRefs:[{kind:"external",id:a}]}]},p.push(g)),S.push(g)}let w=(e.semanticCandidates??[]).filter(a=>a.claim.trim()),R;if(w.length>0){R=_(r,"live-observation",c,e.createdAt);let a={id:R,schemaVersion:1,projectId:n.manifest.projectId,createdAt:o,participantId:t.id,sourceRefs:[{kind:"thread",id:e.threadId}],recordType:"observation",state:"open",statement:w.map(g=>g.claim.trim()).join(" "),captureContext:{subjectIds:S.map(g=>g.id),artifactIds:[]},resolvedByIds:[]};p.push(a)}let I=_(r,"live-iteration",c,e.completedAt),s={id:I,schemaVersion:1,projectId:n.manifest.projectId,createdAt:o,participantId:i.id,sourceRefs:[{kind:"thread",id:e.threadId},...R?[{kind:"record",id:R}]:[]],recordType:"iteration",threadIds:[b.id],startedAt:o,completedAt:l,requestSummary:e.requestSummary||"[request unavailable]",responseSummary:e.responseSummary?.slice(0,2e3),outcome:e.outcome,execution:e.execution,artifactIds:[]};p.push(s);let y=[],m=e.resolutions.filter(a=>a.status==="resolved"&&a.summary.trim()),d=S.length>0?S:n.records.filter(a=>a.recordType==="subject"&&a.subjectType==="project").slice(0,1);if(w.length>0&&d.length===0)throw new Error("Canonical memory has no project subject for an unscoped proposal.");for(let[a,g]of w.entries()){let T=_(r,"live-proposal",`${c}:${a}`,e.completedAt),f=d.map(A=>({subjectId:A.id,role:"governed"})),v={id:T,schemaVersion:1,projectId:n.manifest.projectId,createdAt:l,participantId:i.id,sourceRefs:[{kind:"iteration",id:I},{kind:"thread",id:e.threadId}],recordType:"proposal",state:"pending",claim:g.claim.trim(),rationale:g.rationale?.trim()||void 0,proposedKind:g.proposedKind,subjects:f,subjectSemantics:f.length>1?"The task selected these subjects together; independent authority remains unresolved.":void 0,origin:{mode:"inferred",sourceText:g.sourceText?.trim()||e.requestSummary,iterationId:I,inferredById:i.id}};p.push(v),y.push(T)}if(m.length>0){let a=new Set(e.governingDecisionIds??[]),g=n.records.filter(f=>f.recordType==="decision"&&f.state==="active"&&a.has(f.id)),T={id:_(r,"live-implementation",c,e.completedAt),schemaVersion:1,projectId:n.manifest.projectId,createdAt:l,participantId:i.id,sourceRefs:[{kind:"iteration",id:I}],recordType:"implementation_attempt",state:"completed",iterationIds:[I],coverageClaims:g.map(f=>({decisionId:f.id,coverage:"partial",claim:`This iteration applied the decision while completing: ${m.map(v=>v.summary).join(" ")}`,sourceRefs:[{kind:"iteration",id:I}]})),summary:m.map(f=>f.summary).join(" "),artifactIds:[]};p.push(T)}return{mutation:u,iterationId:I,proposalIds:y,observationId:R}}import{createHash as Xt}from"crypto";import{mkdir as Yt,open as Zt,readFile as ei,rename as ti,unlink as ii}from"fs/promises";import{join as dt}from"path";function pt(n){return n.toLowerCase().replace(/[^a-z0-9]+/g," ").trim().replace(/\s+/g," ")}function lt(n){return Xt("sha256").update(JSON.stringify(n)).digest("hex")}async function ni(n,e){let t=`${n}.${process.pid}.${Date.now()}.tmp`,i=await Zt(t,"w");try{await i.writeFile(`${JSON.stringify(e,null,2)}
|
|
3
|
-
`,"utf8"),await i.sync()}finally{await i.close()}try{await ti(t,n)}catch(r){throw await ii(t).catch(()=>{}),r}}function ri(n,e,t=new Date().toISOString()){let i={},r={},c={},o=(u,p,b)=>{let S=u[p]??=[];S.includes(b)||S.push(b)};for(let u of n.records)if(u.recordType==="subject"){let p=u;for(let b of[p.label,...p.aliases,...p.locators.filter(S=>S.status==="current").map(S=>S.value)]){let S=pt(b);S&&o(i,S,p.id)}}else if(u.recordType==="decision"&&u.state==="active")for(let p of u.subjects)o(r,p.subjectId,u.id);else if(u.recordType==="proposal"&&["pending","deferred"].includes(u.state))for(let p of u.subjects)o(c,p.subjectId,u.id);let l={version:1,projectId:n.manifest.projectId,journalHead:e,generatedAt:t,subjectIdsByValue:i,decisionIdsBySubject:r,proposalIdsBySubject:c};return{...l,checksum:lt(l)}}function ut(n,e){let t=[...new Set(e.flatMap(i=>n.subjectIdsByValue[pt(i)]??[]))];if(t.length)return{subjectIds:t,decisionIds:[...new Set(t.flatMap(i=>n.decisionIdsBySubject[i]??[]))],proposalIds:[...new Set(t.flatMap(i=>n.proposalIdsBySubject[i]??[]))]}}var $e=class{constructor(e){this.indexDir=dt(e,".popmelt","memory","indexes"),this.indexPath=dt(this.indexDir,"retrieval-v1.json")}async ensure(e,t){try{let r=JSON.parse(await ei(this.indexPath,"utf8")),{checksum:c,...o}=r;if(r.version===1&&r.projectId===e.manifest.projectId&&r.journalHead.sequence===t.sequence&&r.journalHead.hash===t.hash&&c===lt(o))return r}catch(r){if(r.code!=="ENOENT"&&!(r instanceof SyntaxError))throw r}let i=ri(e,t);return await Yt(this.indexDir,{recursive:!0}),await ni(this.indexPath,i),i}};var Se="popmelt:imprint",mt="popmelt:imprint-evidence",le="popmelt:imprint-relation";function Ce(n){return n.sourceRefs.find(e=>e.kind==="external"&&e.uri===Se)?.id}function Qe(n){let e=new Set;return n.filter(t=>{let i=`${t.kind}:${t.id}:${t.uri??""}`;return e.has(i)?!1:(e.add(i),!0)})}function De(n,e){if(!n)return[];let t=new Set(n.relations.flatMap(i=>i.type==="instantiates"&&i.fromId===e?[i.toId]:[]));return n.concrete.filter(i=>t.has(i.id)).map(i=>({id:i.id,modelPath:i.modelPath,value:structuredClone(i.value),createdAt:i.createdAt,updatedAt:i.updatedAt}))}var Ge=class{constructor(e){this.projectRoot=e;this.store=new we(e),this.indexStore=new $e(e),this.manifestPath=U(e,".popmelt","memory","manifest.json")}async status(){try{let e=JSON.parse(await W(this.manifestPath,"utf8"));return{initialized:!0,state:"ready",projectId:e.projectId,headSequence:e.head.sequence,updatedAt:e.updatedAt}}catch(e){if(e.code==="ENOENT")return{initialized:!1,state:this.runtimeState?.state??"absent",phase:this.runtimeState?.phase,error:this.runtimeState?.error};throw e}}beginAutomaticInitialization(e={}){return this.initializationPromise?this.initializationPromise:(this.initializationPromise=(async()=>{this.runtimeState={state:"initializing",phase:"analyzing_legacy"};try{if((await this.status()).initialized){let r=await this.store.load();return r.report.recoveredTransactions>0&&(r=await this.store.recover()),await this.refreshIndex(r),await this.status()}let i=await Re({...e,projectRoot:this.projectRoot});if(i.report.schemaIssues.some(r=>r.severity==="error"))throw new Error("Legacy analysis produced schema errors; automatic initialization refused.");this.runtimeState={state:"initializing",phase:"writing_checkpoint"};try{await this.store.initialize(i.bundle)}catch(r){if(!(r instanceof Error)||!r.message.includes("already initialized"))throw r}return await this.refreshIndex(await this.store.load()),this.runtimeState={state:"ready"},await this.status()}catch(t){return this.runtimeState={state:"degraded",error:t instanceof Error?t.message:String(t)},await this.status()}})(),this.initializationPromise)}async analyzeLegacy(e={}){return(await Re({...e,projectRoot:this.projectRoot})).report}async migrateLegacyEvals(){if(this.initializationPromise&&await this.initializationPromise,!(await this.status()).initialized)return{migrated:!1,specs:0,runs:0};let e=U(this.projectRoot,".popmelt","memory","migrations"),t=U(e,"legacy-evals-v1.json");try{let c=JSON.parse(await W(t,"utf8"));return{migrated:!1,specs:c.specs??0,runs:c.runs??0}}catch{}let i=[],r=[];try{let c=JSON.parse(await W(U(this.projectRoot,".popmelt","evals","evals.json"),"utf8"));i=Array.isArray(c.cases)?c.cases:[]}catch{}try{let c=JSON.parse(await W(U(this.projectRoot,".popmelt","evals","runs.json"),"utf8"));r=Array.isArray(c.runs)?c.runs:[]}catch{}return i.length>0&&(i=(await this.reconcileEvalCases(i)).valid,await this.syncEvalSpecs(i),await this.syncLegacyEvalRuns(i,r)),await Ke(e,{recursive:!0}),await We(t,JSON.stringify({version:1,migratedAt:new Date().toISOString(),specs:i.length,runs:r.length,source:".popmelt/evals (frozen)"},null,2)),{migrated:!0,specs:i.length,runs:r.length}}async migrateImprintSnapshot(){if(this.initializationPromise&&await this.initializationPromise,!(await this.status()).initialized)return{migrated:!1,explanations:0,evidence:0};let e=U(this.projectRoot,".popmelt","memory","migrations"),t=U(e,"imprint-advisories-v2.json");try{let a=JSON.parse(await W(t,"utf8"));return{migrated:!1,explanations:a.explanations??0,evidence:a.evidence??0}}catch{}let i;try{i=JSON.parse(await W(U(this.projectRoot,".popmelt","imprint","graph.json"),"utf8"))}catch{}if(!i?.explanations)return await Ke(e,{recursive:!0}),await We(t,JSON.stringify({version:2,migratedAt:new Date().toISOString(),explanations:0,evidence:0},null,2)),{migrated:!0,explanations:0,evidence:0};let r=await this.store.load(),c=r.bundle.records.find(a=>a.recordType==="participant"&&a.kind==="human"&&a.status==="active"),l=r.bundle.records.find(a=>a.recordType==="participant"&&a.kind==="ai"&&a.status==="active")??c,u=r.bundle.records.find(a=>a.recordType==="subject"&&a.subjectType==="project");if(!l||!u)return{migrated:!1,explanations:0,evidence:0};let p=r.bundle.manifest.projectId,b=new Set(r.bundle.records.map(a=>a.id)),S=new Set(r.bundle.relationships.flatMap(a=>a.sourceRefs.flatMap(g=>g.kind==="external"&&g.uri===le?[g.id]:[]))),w=new Map,R=r.bundle.records.filter(a=>a.recordType==="advisory_explanation");for(let a of i.explanations){let g=R.find(T=>Ce(T)===a.id);w.set(a.id,g?.id??_(p,"imprint-explanation",a.id,Date.parse(a.createdAt)))}let I=[],s=[],y=[],m=0;for(let a of i.explanations){let g=w.get(a.id),T=R.find(j=>j.id===g),f=[],v=a.evidence.length?a.evidence:[{id:`fallback:${a.id}`,kind:"observation",stance:"supports",summary:a.rationale,threadId:"imprint-migration",jobId:"imprint-migration",createdAt:a.createdAt}];for(let j of v){let P=_(p,"imprint-evidence-record",j.id,Date.parse(j.createdAt));f.push(P),!b.has(P)&&(I.push({id:P,schemaVersion:1,projectId:p,createdAt:j.createdAt,participantId:l.id,sourceRefs:Qe([{kind:"external",id:j.id,uri:mt},{kind:"external",id:a.id,uri:Se},{kind:"thread",id:j.threadId},{kind:"message",id:j.jobId}]),recordType:"evidence",kind:["confirmation","correction","exception","rejection"].includes(j.kind)?"user_feedback":"judgment",summary:j.summary,availability:"available",artifactIds:[]}),y.push({id:_(p,"imprint-evidence-link",`${a.id}:${j.id}`,Date.parse(j.createdAt)),schemaVersion:1,projectId:p,createdAt:j.createdAt,participantId:l.id,sourceRefs:[{kind:"external",id:j.id,uri:mt}],recordType:"relationship",relationshipType:"derived_from",from:{entityType:"advisory_explanation",entityId:g},to:{entityType:"evidence",entityId:P},reason:"This advisory explanation was derived from collaboration evidence."}),m+=1)}let A={id:g,schemaVersion:1,projectId:p,createdAt:T?.createdAt??a.createdAt,participantId:T?.participantId??l.id,sourceRefs:Qe([...T?.sourceRefs??[],{kind:"external",id:a.id,uri:Se}]),recordType:"advisory_explanation",kind:a.kind,state:a.state,statement:a.statement,rationale:a.rationale,scope:structuredClone(a.scope),subjectIds:[u.id],evidenceIds:[...new Set([...T?.evidenceIds??[],...f])],concreteBindings:De(i,a.id),supersededById:a.supersededBy?w.get(a.supersededBy):void 0,updatedAt:a.updatedAt};T?s.push(A):I.push(A)}for(let a of i.relations){let g=w.get(a.fromId),T=w.get(a.toId);!g||!T||S.has(a.id)||y.push({id:_(p,"imprint-relation",a.id,Date.parse(a.createdAt)),schemaVersion:1,projectId:p,createdAt:a.createdAt,participantId:l.id,sourceRefs:[{kind:"external",id:a.id,uri:le}],recordType:"relationship",relationshipType:a.type,from:{entityType:"advisory_explanation",entityId:g},to:{entityType:"advisory_explanation",entityId:T},reason:a.rationale||"The Imprint graph connected these explanations."})}let d=new Date().toISOString();if(I.length||s.length||y.length)try{let a=await this.store.commit({records:I,recordReplacements:s,events:[],relationships:y,artifacts:[],tombstones:[],projectionUpdates:[]},{transactionId:_(p,"imprint-advisories-v2",i.projectId,Date.parse(i.updatedAt)),committedAt:d});await this.refreshIndex(a)}catch(a){if(!(a instanceof Error)||!a.message.includes("Transaction already exists"))throw a}return await Ke(e,{recursive:!0}),await We(t,JSON.stringify({version:2,migratedAt:d,explanations:i.explanations.length,evidence:m,source:".popmelt/imprint (canonical cutover)"},null,2)),{migrated:!0,explanations:i.explanations.length,evidence:m}}async review(e,t={}){let i=await this.loadSource(t),r=await this.withIndexedCandidates(i,e);return{source:i.source,selection:Fe(i.bundle,r)}}async contextualize(e,t={}){let i=await this.loadSource(t),r=await this.withIndexedCandidates(i,e);return{source:i.source,actionPacket:st(i.bundle,r),reviewSelection:Fe(i.bundle,r)}}async planReview(e,t={}){let i=await this.loadSource(t);return{source:i.source,result:Pe(i.bundle,e)}}async initializeFromLegacy(e){if(!e.confirmed)throw new Error("Explicit confirmation is required to initialize memory storage.");if((await this.status()).initialized)throw new Error("Memory storage is already initialized.");let t=await Re({projectRoot:this.projectRoot,projectKey:e.projectKey,proofCaseIds:e.proofCaseIds,writerVersion:e.writerVersion});if(t.report.schemaIssues.some(i=>i.severity==="error"))throw new Error("Legacy analysis produced schema errors; initialization refused.");return await this.store.initialize(t.bundle),await this.refreshIndex(await this.store.load()),{status:await this.status(),report:t.report}}async commitReview(e,t){if(!(await this.status()).initialized)throw new Error("Memory storage is not initialized.");let i=await this.store.load(),r=Pe(i.bundle,e);if(!r.ok)throw new Error(`Owner review action is invalid: ${JSON.stringify(r.errors)}`);let c=await this.store.commitReviewPlan(r.plan,t);return await this.refreshIndex(c),c}async commitConversationalReview(e){if(this.initializationPromise&&await this.initializationPromise,!(await this.status()).initialized)return{status:"not_ready",action:e.action,proposalId:e.proposalId,message:"Canonical memory is not ready; the review was not committed."};let t=await this.store.load(),i=t.bundle.records.find(w=>w.recordType==="proposal"&&w.id===e.proposalId),r=t.bundle.records.find(w=>w.recordType==="participant"&&w.kind==="human"&&w.status==="active");if(!i||i.state!=="pending"||!r)return{status:"rejected",action:e.action,proposalId:e.proposalId,message:i?i.state!=="pending"?`The proposal is already ${i.state}.`:"No active local owner participant is available.":"The reviewed proposal no longer exists."};let c=Date.now(),o=new Date(c).toISOString(),l={proposalId:i.id,participantId:r.id,authority:{level:"owner",mode:"local_trusted"},occurredAt:o},u=e.action==="accept"?{...l,action:"accept",eventId:M(c),decisionId:M(c),kind:e.kind,reason:e.reason}:e.action==="edit_and_accept"?{...l,action:"edit_and_accept",withdrawalEventId:M(c),replacementProposalId:M(c),acceptanceEventId:M(c),decisionId:M(c),relationshipId:M(c),claim:e.claim,kind:e.kind,subjects:i.subjects,subjectSemantics:i.subjectSemantics,reason:e.reason}:e.action==="reject"?{...l,action:"reject",eventId:M(c),reason:e.reason}:{...l,action:"defer",eventId:M(c),reason:e.reason,context:{taskContext:e.taskContext,subjectIds:i.subjects.map(w=>w.subjectId),resurfaceWhen:e.resurfaceWhen?.length?e.resurfaceWhen:["different_action","owner_request"]}},p=Pe(t.bundle,u);if(!p.ok)return{status:"rejected",action:e.action,proposalId:e.proposalId,message:p.errors.map(w=>w.message).join(" ")};let b=await this.store.commitReviewPlan(p.plan,{transactionId:M(c),committedAt:o});await this.refreshIndex(b);let S=p.plan.resultRefs.find(w=>w.entityType==="decision")?.entityId;return{status:"committed",action:e.action,proposalId:e.proposalId,decisionId:S,message:e.action==="accept"||e.action==="edit_and_accept"?"Accepted product memory was committed.":e.action==="reject"?"Historical candidate was rejected.":"Historical candidate was deferred.",headSequence:b.report.headSequence}}async captureCompletedJob(e){if(this.initializationPromise&&await this.initializationPromise,!(await this.status()).initialized)return{status:"not_ready",proposalIds:[]};let t=await this.store.load(),i=ct(t.bundle,e),r=_(t.bundle.manifest.projectId,"live-capture-transaction",`${e.threadId}:${e.jobId}`,e.completedAt);try{let c=await this.store.commit(i.mutation,{transactionId:r,committedAt:new Date(e.completedAt).toISOString()});return await this.refreshIndex(c),{status:"captured",iterationId:i.iterationId,proposalIds:i.proposalIds,headSequence:c.report.headSequence}}catch(c){if(c instanceof Error&&c.message.includes("Transaction already exists"))return{status:"duplicate",iterationId:i.iterationId,proposalIds:i.proposalIds};throw c}}async recordImprintEvidence(e){if(this.initializationPromise&&await this.initializationPromise,!(await this.status()).initialized||e.summary.changes.length===0)return;let t;try{t=JSON.parse(await W(U(this.projectRoot,".popmelt","imprint","graph.json"),"utf8"))}catch{}let i=await this.store.load(),r=i.bundle.records.find(d=>d.recordType==="participant"&&d.kind==="human"&&d.status==="active"),c=i.bundle.records.find(d=>d.recordType==="participant"&&d.kind==="ai"&&d.status==="active"),o=e.action?r:c??r,l=i.bundle.records.find(d=>d.recordType==="subject"&&d.subjectType==="project");if(!o||!l)return;let u=e.occurredAt??new Date().toISOString(),p=Date.parse(u),b=i.bundle.manifest.projectId,S=[],w=[],R=[],I=i.bundle.records.filter(d=>d.recordType==="advisory_explanation"),s=new Map(I.flatMap(d=>{let a=Ce(d);return a?[[a,d.id]]:[]}));for(let d of e.summary.changes)if(!s.has(d.explanationId)){let a=t?.explanations.find(g=>g.id===d.explanationId);s.set(d.explanationId,_(b,"imprint-explanation",d.explanationId,Date.parse(a?.createdAt??u)))}for(let d of e.summary.changes){let a={kind:"external",id:d.explanationId,uri:Se},g=s.get(d.explanationId),T=I.find(j=>j.id===g),f=t?.explanations.find(j=>j.id===d.explanationId),v={id:_(b,"imprint-live-evidence",`${e.summary.transactionId}:${d.explanationId}:${e.action??"automatic"}`,p),schemaVersion:1,projectId:b,createdAt:u,participantId:o.id,sourceRefs:[a,{kind:"thread",id:e.threadId},{kind:"message",id:e.jobId}],recordType:"evidence",kind:e.action?"user_feedback":"judgment",summary:e.action?`${e.action}: ${e.summary.detail}`:`${e.summary.kind}: ${e.summary.detail}`,availability:"available",artifactIds:[]};S.push(v);let A={id:g,schemaVersion:1,projectId:b,createdAt:T?.createdAt??f?.createdAt??u,participantId:T?.participantId??o.id,sourceRefs:Qe([...T?.sourceRefs??[],a,{kind:"thread",id:e.threadId},{kind:"message",id:e.jobId}]),recordType:"advisory_explanation",kind:f?.kind??T?.kind??"pattern",state:f?.state??d.state,statement:f?.statement??d.statement,rationale:f?.rationale??T?.rationale??e.summary.detail,scope:structuredClone(f?.scope??T?.scope??{kind:"project",values:[]}),subjectIds:T?.subjectIds??[l.id],evidenceIds:[...new Set([...T?.evidenceIds??[],v.id])],concreteBindings:f?De(t,d.explanationId):T?.concreteBindings??[],supersededById:f?.supersededBy?s.get(f.supersededBy):T?.supersededById,updatedAt:f?.updatedAt??u};T?w.push(A):S.push(A),R.push({id:_(b,"imprint-live-evidence-link",`${e.summary.transactionId}:${d.explanationId}:${e.action??"automatic"}`,p),schemaVersion:1,projectId:b,createdAt:u,participantId:o.id,sourceRefs:[a],recordType:"relationship",relationshipType:"derived_from",from:{entityType:"advisory_explanation",entityId:A.id},to:{entityType:"evidence",entityId:v.id},reason:e.action?"The developer grounding response updates this advisory explanation.":"The Imprint explanation was derived from this collaboration evidence."})}let y=new Set(i.bundle.relationships.flatMap(d=>d.sourceRefs.flatMap(a=>a.kind==="external"&&a.uri===le?[a.id]:[])));for(let d of t?.relations??[]){let a=s.get(d.fromId),g=s.get(d.toId);!a||!g||y.has(d.id)||R.push({id:_(b,"imprint-relation",d.id,Date.parse(d.createdAt)),schemaVersion:1,projectId:b,createdAt:d.createdAt,participantId:o.id,sourceRefs:[{kind:"external",id:d.id,uri:le}],recordType:"relationship",relationshipType:d.type,from:{entityType:"advisory_explanation",entityId:a},to:{entityType:"advisory_explanation",entityId:g},reason:d.rationale||"The Imprint graph connected these explanations."})}let m=_(i.bundle.manifest.projectId,"imprint-evidence",`${e.summary.transactionId}:${e.action??"automatic"}`,p);try{let d=await this.store.commit({records:S,recordReplacements:w,events:[],relationships:R,artifacts:[],tombstones:[],projectionUpdates:[]},{transactionId:m,committedAt:u});await this.refreshIndex(d)}catch(d){if(!(d instanceof Error)||!d.message.includes("Transaction already exists"))throw d}}async syncImprintGraph(){if(this.initializationPromise&&await this.initializationPromise,!(await this.status()).initialized)return{status:"not_ready",relationships:0,explanations:0};let e;try{e=JSON.parse(await W(U(this.projectRoot,".popmelt","imprint","graph.json"),"utf8"))}catch{return{status:"no_change",relationships:0,explanations:0}}let t=await this.store.load(),i=t.bundle.records.find(f=>f.recordType==="participant"&&f.kind==="human"&&f.status==="active"),c=t.bundle.records.find(f=>f.recordType==="participant"&&f.kind==="ai"&&f.status==="active")??i;if(!c)return{status:"not_ready",relationships:0,explanations:0};let o=t.bundle.records.find(f=>f.recordType==="subject"&&f.subjectType==="project");if(!o)return{status:"not_ready",relationships:0,explanations:0};let l=t.bundle.manifest.projectId,u=t.bundle.records.filter(f=>f.recordType==="advisory_explanation"),p=new Map(u.flatMap(f=>{let v=Ce(f);return v?[[v,f]]:[]})),b=new Map([...[...p].map(([f,v])=>[f,v.id]),...e.explanations.filter(f=>!p.has(f.id)).map(f=>[f.id,_(l,"imprint-explanation",f.id,Date.parse(f.createdAt))])]),S=[],w=[],R=new Set(e.explanations.map(f=>f.id));for(let f of e.explanations){let v=p.get(f.id);if(!v){S.push({id:b.get(f.id),schemaVersion:1,projectId:l,createdAt:f.createdAt,participantId:c.id,sourceRefs:[{kind:"external",id:f.id,uri:Se}],recordType:"advisory_explanation",kind:f.kind,state:f.state,statement:f.statement,rationale:f.rationale,scope:structuredClone(f.scope),subjectIds:[o.id],evidenceIds:[],concreteBindings:De(e,f.id),supersededById:f.supersededBy?b.get(f.supersededBy):void 0,updatedAt:f.updatedAt});continue}let A={...structuredClone(v),kind:f.kind,state:f.state,statement:f.statement,rationale:f.rationale,scope:structuredClone(f.scope),concreteBindings:De(e,f.id),supersededById:f.supersededBy?b.get(f.supersededBy):void 0,updatedAt:f.updatedAt},j=P=>JSON.stringify({kind:P.kind,state:P.state,statement:P.statement,rationale:P.rationale,scope:P.scope,concreteBindings:P.concreteBindings,supersededById:P.supersededById,updatedAt:P.updatedAt});j(v)!==j(A)&&w.push(A)}for(let[f,v]of p)R.has(f)||v.state==="retired"||w.push({...structuredClone(v),state:"retired",supersededById:void 0,updatedAt:e.updatedAt});let I=new Set(t.bundle.tombstones.flatMap(f=>f.objectType==="relationship"?[f.objectId]:[])),s=new Map(t.bundle.relationships.flatMap(f=>{if(I.has(f.id))return[];let v=f.sourceRefs.find(A=>A.kind==="external"&&A.uri===le)?.id;return v?[[v,f]]:[]})),y=new Set(s.keys()),m=[];for(let f of e.relations){let v=b.get(f.fromId),A=b.get(f.toId);!v||!A||y.has(f.id)||m.push({id:_(l,"imprint-relation",f.id,Date.parse(f.createdAt)),schemaVersion:1,projectId:l,createdAt:f.createdAt,participantId:c.id,sourceRefs:[{kind:"external",id:f.id,uri:le}],recordType:"relationship",relationshipType:f.type,from:{entityType:"advisory_explanation",entityId:v},to:{entityType:"advisory_explanation",entityId:A},reason:f.rationale||"The Imprint graph connected these explanations."})}let d=new Set(e.relations.map(f=>f.id)),a=i?[...s].filter(([f])=>!d.has(f)).map(([,f])=>({id:_(l,"imprint-relationship-tombstone",f.id,Date.parse(e.updatedAt)),schemaVersion:1,projectId:l,objectId:f.id,objectType:"relationship",deletedAt:e.updatedAt,deletedById:i.id,authority:{level:"owner",mode:"local_trusted"},reasonCategory:"serious_error",erasureLevel:"content",invalidates:[]})):[];if(!S.length&&!w.length&&!m.length&&!a.length)return{status:"no_change",relationships:0,explanations:0,headSequence:t.report.headSequence};let g=e.updatedAt,T=_(l,"imprint-graph-sync",e.head.hash??String(e.head.sequence),Date.parse(g));try{let f=await this.store.commit({records:S,recordReplacements:w,events:[],relationships:m,artifacts:[],tombstones:a,projectionUpdates:[]},{transactionId:T,committedAt:g});return await this.refreshIndex(f),{status:"synced",relationships:m.length+a.length,explanations:S.length+w.length,headSequence:f.report.headSequence}}catch(f){if(!(f instanceof Error)||!f.message.includes("Transaction already exists"))throw f;return{status:"no_change",relationships:0,explanations:0,headSequence:t.report.headSequence}}}async recover(e){if(!e)throw new Error("Explicit confirmation is required to recover the journal head.");if(!(await this.status()).initialized)throw new Error("Memory storage is not initialized.");let t=await this.store.recover();return await this.refreshIndex(t),t}async diagnostics(){let e=await this.status();if(!e.initialized)return{status:e};let t=await this.store.load();await this.refreshIndex(t);let i={};for(let r of t.bundle.records)i[r.recordType]=(i[r.recordType]??0)+1;return{status:e,journal:t.report,records:i,openFreshnessSignals:t.bundle.records.filter(r=>r.recordType==="freshness_signal"&&r.state==="open").length,unavailableEvidence:t.bundle.records.filter(r=>r.recordType==="evidence"&&r.availability!=="available").length}}async getProjectableDecisions(e=12){if(this.initializationPromise&&await this.initializationPromise,!(await this.status()).initialized)return[];let{bundle:t}=await this.store.load(),i=new Set(t.records.flatMap(o=>o.recordType==="model_projection"&&o.state==="applied"?o.coverage.filter(l=>l.status==="projected").map(l=>l.decisionId):[])),r=new Set(t.relationships.flatMap(o=>o.relationshipType==="contradicts"&&o.from.entityType==="decision"&&o.to.entityType==="decision"?[o.from.entityId,o.to.entityId]:[])),c=new Set(t.records.flatMap(o=>o.recordType==="freshness_signal"&&o.state==="open"&&o.target.entityType==="decision"?[o.target.entityId]:[]));return t.records.filter(o=>o.recordType==="decision"&&o.state==="active"&&!i.has(o.id)&&!r.has(o.id)&&!c.has(o.id)).sort((o,l)=>l.createdAt.localeCompare(o.createdAt)).slice(0,Math.max(1,e))}async getCanonicalModelEntries(){if(!(await this.status()).initialized)return[];let{bundle:e}=await this.store.load(),t=new Set(e.records.flatMap(r=>r.recordType==="decision"&&r.state==="active"?[r.id]:[])),i=new Map;for(let r of e.records.filter(c=>c.recordType==="model_entry").sort((c,o)=>c.createdAt.localeCompare(o.createdAt)))r.decisionIds.some(c=>t.has(c))&&i.set(r.key,r);return[...i.values()]}async getImprintView(e=[]){let t=()=>({head:{sequence:0,updatedAt:new Date(0).toISOString()},counts:{total:0,emerging:0,testing:0,grounded:0,challenged:0,retired:0,needsGrounding:0},explanations:[]});if(!(await this.status()).initialized)return t();let i=await this.store.load(),r=i.bundle.records.filter(s=>s.recordType==="advisory_explanation"),c=new Map(r.map(s=>[s.id,s])),o=new Map(r.flatMap(s=>{let y=Ce(s);return y?[[y,s.id]]:[]})),l=new Set(e.map(s=>o.get(s)??s)),u=new Map(i.bundle.records.flatMap(s=>s.recordType==="participant"?[[s.id,s.kind]]:[])),p=new Map(i.bundle.records.flatMap(s=>s.recordType==="evidence"?[[s.id,s]]:[])),b=new Set(i.bundle.tombstones.flatMap(s=>s.objectType==="relationship"?[s.objectId]:[])),S=new Set(["operationalizes","refines","supports","contradicts","excepts","instantiates","supersedes"]),w={testing:0,emerging:1,grounded:2,challenged:3,retired:4},R=r.map(s=>{let y=s.evidenceIds.flatMap(a=>{let g=p.get(a);if(!g)return[];let T=g.sourceRefs.find(j=>j.kind==="thread")?.id,f=g.sourceRefs.find(j=>j.kind==="message")?.id,v=g.kind==="judgment"||g.kind==="user_feedback"||g.kind==="project_state"?g.kind:"other",A=u.get(g.participantId)??"unknown";return[{id:g.id,kind:v,summary:g.summary,createdAt:g.createdAt,participantKind:A,threadId:T,jobId:f}]}).sort((a,g)=>g.createdAt.localeCompare(a.createdAt)),m=i.bundle.relationships.flatMap(a=>{if(b.has(a.id))return[];if(!S.has(a.relationshipType))return[];let g=a.from.entityType==="advisory_explanation"&&a.from.entityId===s.id&&a.to.entityType==="advisory_explanation",T=a.to.entityType==="advisory_explanation"&&a.to.entityId===s.id&&a.from.entityType==="advisory_explanation";if(!g&&!T)return[];let f=g?a.to.entityId:a.from.entityId,v=c.get(f);return v?[{id:a.id,type:a.relationshipType,direction:g?"outgoing":"incoming",explanationId:v.id,statement:v.statement,rationale:a.reason}]:[]}),d=[...new Set([...s.sourceRefs.flatMap(a=>a.kind==="thread"?[a.id]:[]),...y.flatMap(a=>a.threadId?[a.threadId]:[])])];return{id:s.id,kind:s.kind,state:s.state,statement:s.statement,rationale:s.rationale,scope:structuredClone(s.scope),createdAt:s.createdAt,updatedAt:s.updatedAt,evidenceCount:y.length,recentEvidence:y.slice(0,4),concrete:s.concreteBindings.map(a=>({...structuredClone(a)})),relations:m,sourceThreadIds:d,needsGrounding:s.state==="testing"&&l.has(s.id)}}).sort((s,y)=>Number(y.needsGrounding)-Number(s.needsGrounding)||w[s.state]-w[y.state]||y.updatedAt.localeCompare(s.updatedAt)),I={total:R.filter(s=>s.state!=="retired").length,emerging:R.filter(s=>s.state==="emerging").length,testing:R.filter(s=>s.state==="testing").length,grounded:R.filter(s=>s.state==="grounded").length,challenged:R.filter(s=>s.state==="challenged").length,retired:R.filter(s=>s.state==="retired").length,needsGrounding:R.filter(s=>s.needsGrounding).length};return{head:{sequence:i.report.headSequence,updatedAt:i.bundle.manifest.updatedAt},counts:I,explanations:R}}async getModelView(){if(!(await this.status()).initialized)return{decisions:[],entries:[]};let{bundle:e}=await this.store.load(),t=new Set(e.records.flatMap(l=>l.recordType==="decision"&&l.state==="active"?[l.id]:[])),i=new Map;for(let l of e.records.filter(u=>u.recordType==="model_entry").sort((u,p)=>u.createdAt.localeCompare(p.createdAt)))l.decisionIds.some(u=>t.has(u))&&i.set(l.key,l);let r=[...i.values()],c=e.records.filter(l=>l.recordType==="verification_attempt");return{decisions:e.records.filter(l=>l.recordType==="decision"&&l.state==="active").map(l=>{let u=c.filter(p=>p.targets.some(b=>b.entityType==="decision"&&b.entityId===l.id)).sort((p,b)=>b.createdAt.localeCompare(p.createdAt))[0];return{id:l.id,kind:l.kind,claim:l.claim,projected:r.some(p=>p.decisionIds.includes(l.id)),verification:u?u.state:"unverified"}}),entries:r.map(l=>({id:l.id,key:l.key,value:l.value,decisionIds:l.decisionIds}))}}async getEvalDependenciesForDecisions(e){if(!(await this.status()).initialized)return[];let{bundle:t}=await this.store.load(),i=new Set(t.records.flatMap(c=>c.recordType==="decision"&&e.includes(c.id)?c.subjects.map(o=>o.subjectId):[])),r=[];for(let c of t.records)if(!(c.recordType!=="subject"||!i.has(c.id)))for(let o of c.locators.filter(l=>l.status==="current"))o.kind==="source_file"?r.push({kind:"source_file",value:o.value,subjectId:c.id}):o.kind==="route_pattern"?r.push({kind:"route",value:o.value,subjectId:c.id}):o.kind==="token_path"?r.push({kind:"model_path",value:o.value,subjectId:c.id}):(o.kind==="dom_selector"||o.kind==="file_export"||o.kind==="source_span")&&r.push({kind:"subject",value:o.value,subjectId:c.id});return[...new Map(r.map(c=>[`${c.kind}:${c.value}:${c.subjectId??""}`,c])).values()]}async recordDirectModelMutation(e){if(this.initializationPromise&&await this.initializationPromise,!(await this.status()).initialized)throw new Error("Canonical memory is not ready.");let t=await this.store.load(),i=t.bundle.records.find(j=>j.recordType==="participant"&&j.kind==="human"&&j.status==="active"),r=t.bundle.records.find(j=>j.recordType==="subject"&&j.subjectType==="project");if(!i||!r)throw new Error("Canonical owner or project subject is unavailable.");let c=Date.now(),o=new Date(c).toISOString(),l=M(c),u=M(c),p=M(c),b=M(c),S=M(c),w=new Set(t.bundle.records.flatMap(j=>j.recordType==="model_entry"&&j.key===e.key?j.decisionIds:[])),R=t.bundle.records.filter(j=>j.recordType==="decision"&&j.state==="active"&&w.has(j.id)),I={schemaVersion:1,projectId:t.bundle.manifest.projectId,createdAt:o,participantId:i.id,sourceRefs:[{kind:"external",id:e.key,uri:"popmelt:model-pane"}]},s=[{subjectId:r.id,role:"governed"}],y={...I,id:l,recordType:"proposal",state:"accepted",claim:e.claim,proposedKind:"rule",subjects:s,origin:{mode:"declared",sourceText:e.claim,reviewedById:i.id}},m={...I,id:u,recordType:"lifecycle_event",entity:{entityType:"proposal",entityId:l},eventType:"accept",fromState:"pending",toState:"accepted",authority:{level:"owner",mode:"local_trusted"},reason:"The owner explicitly changed the projected model in the Model pane."},d={...I,id:p,recordType:"decision",proposalId:l,acceptanceEventId:u,acceptedById:i.id,authority:{level:"owner",mode:"local_trusted"},state:"active",kind:"rule",claim:e.claim,subjects:s,noChange:!1,effectiveAt:o},a={...I,id:b,recordType:"model_entry",key:e.key,subjectIds:[r.id],decisionIds:[p],value:e.value},g={...I,id:S,recordType:"model_projection",state:"applied",runId:`model-pane:${e.key}:${c}`,appliedById:i.id,authority:{level:"owner",mode:"local_trusted"},appliedAt:o,decisionIds:[p],entryIds:[b],coverage:[{decisionId:p,status:"projected"}]},T={...I,id:M(c),recordType:"relationship",relationshipType:"derived_from",from:{entityType:"model_entry",entityId:b},to:{entityType:"decision",entityId:p},reason:"The model change is projected from the owner-confirmed decision."},f=R.map(j=>({...I,id:M(c),recordType:"lifecycle_event",entity:{entityType:"decision",entityId:j.id},eventType:"decision.superseded",fromState:"active",toState:"superseded",authority:{level:"owner",mode:"local_trusted"},reason:`A newer explicit model declaration replaced ${e.key}.`})),v=R.map(j=>({...I,id:M(c),recordType:"relationship",relationshipType:"supersedes",from:{entityType:"decision",entityId:d.id},to:{entityType:"decision",entityId:j.id},reason:`The owner replaced the previous declaration for ${e.key}.`,authority:{level:"owner",mode:"local_trusted"}})),A=await this.store.commit({records:[y,d,a,g],events:[m,...f],relationships:[T,...v],artifacts:[],tombstones:[],projectionUpdates:R.map(j=>({entityType:"decision",entityId:j.id,fromState:"active",state:"superseded"}))},{transactionId:M(c),committedAt:o});return await this.refreshIndex(A),{decisionId:p,entryId:b}}async syncEvalSpecs(e){if(this.initializationPromise&&await this.initializationPromise,!(await this.status()).initialized||e.length===0)return[];let t=await this.store.load();for(let i of e){let r=this.latestEvalSpec(t.bundle,i.id),c=t.bundle.records.flatMap(I=>I.recordType!=="decision"?[]:i.sourceDecisionIds.some(s=>s===I.id||I.sourceRefs.some(y=>y.id===s))?[I.id]:[]),o=[...new Set(t.bundle.records.flatMap(I=>I.recordType==="decision"&&c.includes(I.id)?I.subjects.map(s=>s.subjectId):[]))],u={state:i.status==="pending"?"draft":i.status==="approved"?"active":"retired",title:i.title,category:i.category,prompt:i.prompt,assertions:i.assertions,rationale:i.rationale,decisionIds:c,subjectIds:o,threadRefs:i.sourceThreadIds,dependencies:i.dependencies??[],scenarios:i.scenarios??[]};if(r&&JSON.stringify({state:r.state,title:r.title,category:r.category,prompt:r.prompt,assertions:r.assertions,rationale:r.rationale,decisionIds:r.decisionIds,subjectIds:r.subjectIds,threadRefs:r.threadRefs,dependencies:r.dependencies??[],scenarios:r.scenarios??[]})===JSON.stringify(u))continue;let p=t.bundle.records.find(I=>I.recordType==="participant"&&I.kind==="human"&&I.status==="active");if(!p)throw new Error("No active local owner participant is available.");let b=Date.now(),S=new Date(b).toISOString(),w={id:M(b),schemaVersion:1,projectId:t.bundle.manifest.projectId,createdAt:S,participantId:p.id,sourceRefs:[{kind:"external",id:i.id,uri:"popmelt:eval-spec"},...c.map(I=>({kind:"record",id:I}))],recordType:"eval_spec",legacyId:i.id,replacesSpecId:r?.id,...u,targets:c.map(I=>({entityType:"decision",entityId:I})),evaluator:{kind:"ai",name:"Popmelt eval runner",evidenceTypes:["screenshot","dom","code"]},scope:{kind:"current_page"}},R=r?[{id:M(b),schemaVersion:1,projectId:t.bundle.manifest.projectId,createdAt:S,participantId:p.id,sourceRefs:[{kind:"record",id:w.id}],recordType:"relationship",relationshipType:"replaces",from:{entityType:"eval_spec",entityId:w.id},to:{entityType:"eval_spec",entityId:r.id},reason:"A reviewed eval change creates an immutable replacement specification."}]:[];t=await this.store.commit({records:[w],events:[],relationships:R,artifacts:[],tombstones:[],projectionUpdates:[]},{transactionId:M(b),committedAt:S})}return await this.refreshIndex(t),this.getJournalEvalCases()}async getJournalEvalCases(){if(!(await this.status()).initialized)return[];let{bundle:e}=await this.store.load(),t=new Set(e.tombstones.filter(o=>o.objectType==="eval_spec").map(o=>o.objectId)),i=e.records.filter(o=>o.recordType==="eval_spec").reverse().filter((o,l,u)=>u.findIndex(p=>p.legacyId===o.legacyId)===l).filter(o=>!t.has(o.id)),r=e.records.filter(o=>o.recordType==="verification_attempt"),c=e.records.filter(o=>o.recordType==="freshness_signal"&&o.state==="open"&&o.targetKind==="verification_result");return i.map(o=>{let l=r.filter(b=>b.evalSpecId===o.id).sort((b,S)=>S.createdAt.localeCompare(b.createdAt))[0],u=l&&c.some(b=>b.target.entityType==="verification_attempt"&&b.target.entityId===l.id),p=o.state==="draft"?"draft":o.state==="retired"?"retired":l?u?"stale":l.state==="passed"?"passing":l.state==="failed"?"failing":"needs_review":"unverified";return{id:o.legacyId,canonicalSpecId:o.id,verificationState:p,title:o.title,status:o.state==="draft"?"pending":o.state==="active"?"approved":"rejected",category:o.category,prompt:o.prompt,assertions:o.assertions,rationale:o.rationale,sourceDecisionIds:o.decisionIds,sourceThreadIds:o.threadRefs,dependencies:o.dependencies??[],scenarios:o.scenarios??[],verifiedScopeFingerprint:l?.scopeFingerprint,verificationAttemptId:l?.id}})}async findJournalEvalCase(e){return(await this.getJournalEvalCases()).find(t=>t.id===e)??null}async updateJournalEvalCase(e,t){let i=await this.findJournalEvalCase(e);if(!i)return null;let[r]=await this.syncEvalSpecs([{...i,...t}]);return r??null}async getJournalEvalRuns(){if(!(await this.status()).initialized)return[];let{bundle:e}=await this.store.load(),t=new Map(e.records.flatMap(i=>i.recordType==="eval_spec"?[[i.id,i]]:[]));return e.records.flatMap(i=>{if(i.recordType!=="verification_attempt"||!i.evalSpecId)return[];let r=t.get(i.evalSpecId);if(!r)return[];let c=i.evalRun,o=Date.parse(i.createdAt);return[{id:c?.id??i.id,evalId:r.legacyId,threadId:c?.threadId,status:i.state==="passed"?"pass":i.state==="failed"?"fail":"needs_review",createdAt:c?.createdAt??o,completedAt:c?.completedAt??o,durationMs:c?.durationMs??0,scope:c?.scope??{type:"current_page",url:"",viewport:{width:0,height:0}},summary:i.summary??"",assertionResults:c?.assertionResults??r.assertions.map(l=>({assertion:l,status:"needs_review",summary:i.summary??"",evidence:[]})),tooling:c?.tooling??{chromeDevtools:"unknown",evidenceTypes:[]},provider:c?.provider,model:c?.model,screenshotPath:c?.screenshotPath,codeFingerprint:c?.codeFingerprint,scopeFingerprint:i.scopeFingerprint}]}).sort((i,r)=>i.completedAt-r.completedAt)}async recordEvalVerification(e,t){if(!(await this.status()).initialized)return;let i=await this.store.load();if(i.bundle.records.some(w=>w.recordType==="verification_attempt"&&w.evalRun?.id===t.id))return;let r=this.latestEvalSpec(i.bundle,e.id);if(!r)return;let c=i.bundle.records.find(w=>w.recordType==="participant"&&w.status==="active"&&w.kind==="ai")??i.bundle.records.find(w=>w.recordType==="participant"&&w.status==="active");if(!c)return;let o=t.completedAt,l=new Date(o).toISOString(),u={id:M(o),schemaVersion:1,projectId:i.bundle.manifest.projectId,createdAt:l,participantId:c.id,sourceRefs:[{kind:"record",id:r.id},{kind:"external",id:t.id,uri:"popmelt:eval-run"}],recordType:"evidence",kind:"eval",summary:t.summary,availability:"available",artifactIds:[]},p={id:M(o),schemaVersion:1,projectId:i.bundle.manifest.projectId,createdAt:l,participantId:c.id,sourceRefs:[{kind:"record",id:r.id}],recordType:"verification_attempt",evalSpecId:r.id,scopeFingerprint:t.scopeFingerprint,state:t.status==="pass"?"passed":t.status==="fail"?"failed":"inconclusive",evaluator:{kind:"eval",participantId:c.id,name:t.model??t.provider??"Popmelt eval runner"},targets:r.targets,summary:t.summary,evidenceIds:[u.id],evalRun:{id:t.id,threadId:t.threadId,createdAt:t.createdAt,completedAt:t.completedAt,durationMs:t.durationMs,scope:t.scope,assertionResults:t.assertionResults,tooling:t.tooling,provider:t.provider,model:t.model,screenshotPath:t.screenshotPath,codeFingerprint:t.codeFingerprint}},b=r.targets.map(w=>({id:M(o),schemaVersion:1,projectId:i.bundle.manifest.projectId,createdAt:l,participantId:c.id,sourceRefs:[{kind:"record",id:u.id}],recordType:"relationship",relationshipType:"verifies",from:{entityType:"verification_attempt",entityId:p.id},to:w,reason:t.summary})),S=await this.store.commit({records:[u,p],events:[],relationships:b,artifacts:[],tombstones:[],projectionUpdates:[]},{transactionId:M(o),committedAt:l});await this.refreshIndex(S)}async syncLegacyEvalRuns(e,t){let i=new Map(e.map(r=>[r.id,r]));for(let r of[...t].sort((c,o)=>c.completedAt-o.completedAt)){let c=i.get(r.evalId);c&&await this.recordEvalVerification(c,r)}}async markEvalVerificationExpired(e){if(!(await this.status()).initialized)return;let t=await this.store.load();if(t.bundle.records.some(p=>p.recordType==="freshness_signal"&&p.state==="open"&&p.targetKind==="verification_result"&&p.target.entityType==="verification_attempt"&&p.target.entityId===e.verificationAttemptId))return;let i=t.bundle.records.find(p=>p.recordType==="verification_attempt"&&p.id===e.verificationAttemptId&&p.evalSpecId===e.evalSpecId),r=t.bundle.records.find(p=>p.recordType==="participant"&&p.status==="active"&&p.kind==="system")??t.bundle.records.find(p=>p.recordType==="participant"&&p.status==="active");if(!i||!r)return;let c=Date.now(),o=new Date(c).toISOString(),l={id:M(c),schemaVersion:1,projectId:t.bundle.manifest.projectId,createdAt:o,participantId:r.id,sourceRefs:[{kind:"record",id:e.evalSpecId},{kind:"record",id:i.id}],recordType:"freshness_signal",signalType:"verification_expired",state:"open",targetKind:"verification_result",target:{entityType:"verification_attempt",entityId:i.id},reason:`A dependency changed after this eval passed (${e.previousFingerprint??"unknown"} \u2192 ${e.currentFingerprint??"unknown"}).`,evidenceIds:i.evidenceIds},u=await this.store.commit({records:[l],events:[],relationships:[],artifacts:[],tombstones:[],projectionUpdates:[]},{transactionId:M(c),committedAt:o});await this.refreshIndex(u)}async reconcileEvalCases(e){if(!(await this.status()).initialized)return{valid:e,discardedIds:[]};let t=await this.store.load(),i=new Set(t.bundle.records.flatMap(u=>u.recordType==="decision"&&u.state==="active"?[u.id,...u.sourceRefs.map(p=>p.id)]:[])),r=e.filter(u=>(u.dependencies?.length??0)>0||u.sourceDecisionIds.some(p=>i.has(p))),c=e.filter(u=>!r.includes(u)).map(u=>u.id);if(c.length===0)return{valid:r,discardedIds:c};let o=t.bundle.records.find(u=>u.recordType==="participant"&&u.kind==="human"&&u.status==="active");if(!o)return{valid:r,discardedIds:c};let l=c.flatMap(u=>{let p=this.latestEvalSpec(t.bundle,u);return p?[p]:[]}).filter(u=>!t.bundle.tombstones.some(p=>p.objectType==="eval_spec"&&p.objectId===u.id));if(l.length>0){let u=Date.now(),p=new Date(u).toISOString();t=await this.store.commit({records:[],events:[],relationships:[],artifacts:[],projectionUpdates:[],tombstones:l.map(b=>({id:M(u),schemaVersion:1,projectId:t.bundle.manifest.projectId,objectId:b.id,objectType:"eval_spec",deletedAt:p,deletedById:o.id,authority:{level:"owner",mode:"local_trusted"},reasonCategory:"serious_error",erasureLevel:"content",invalidates:[]}))},{transactionId:M(u),committedAt:p}),await this.refreshIndex(t)}return{valid:r,discardedIds:c}}latestEvalSpec(e,t){return[...e.records].reverse().find(i=>i.recordType==="eval_spec"&&i.legacyId===t)}async findPendingProposalForLegacyDecision(e){if(!(await this.status()).initialized)return null;let{bundle:t}=await this.store.load(),i=t.records.find(r=>r.recordType==="proposal"&&r.state==="pending"&&r.sourceRefs.some(c=>c.id===e));return i?{proposalId:i.id,claim:i.claim}:null}async applyModelProjection(e){if(this.initializationPromise&&await this.initializationPromise,!(await this.status()).initialized)throw new Error("Canonical memory is not ready.");if(e.changes.length===0)throw new Error("A model projection requires selected changes.");let t=await this.store.load(),i=t.bundle.records.find(I=>I.recordType==="model_projection"&&I.state==="applied"&&I.runId===e.runId);if(i)return{projectionId:i.id,entryIds:i.entryIds,headSequence:t.report.headSequence};let r=t.bundle.records.filter(I=>I.recordType==="decision"&&e.decisionIds.includes(I.id)&&I.state==="active");if(r.length!==new Set(e.decisionIds).size)throw new Error("Model projection references a missing or inactive canonical decision.");let c=t.bundle.records.find(I=>I.recordType==="participant"&&I.kind==="human"&&I.status==="active");if(!c)throw new Error("No active local owner participant is available.");let o=Date.now(),l=new Date(o).toISOString(),u=M(o),p=e.changes.map(I=>{let s=I.decisionIds?.filter(d=>e.decisionIds.includes(d)),y=s?.length?s:e.decisionIds,m=[...new Set(r.filter(d=>y.includes(d.id)).flatMap(d=>d.subjects.map(a=>a.subjectId)))];return{id:M(o),schemaVersion:1,projectId:t.bundle.manifest.projectId,createdAt:l,participantId:c.id,sourceRefs:y.map(d=>({kind:"record",id:d})),recordType:"model_entry",key:I.path.map(String).join("."),subjectIds:m,decisionIds:y,value:I.value}}),b=new Set(p.flatMap(I=>I.decisionIds)),S={id:u,schemaVersion:1,projectId:t.bundle.manifest.projectId,createdAt:l,participantId:c.id,sourceRefs:e.decisionIds.map(I=>({kind:"record",id:I})),recordType:"model_projection",state:"applied",runId:e.runId,presentationJobId:e.presentationJobId,appliedById:c.id,authority:{level:"owner",mode:"local_trusted"},appliedAt:l,decisionIds:e.decisionIds,entryIds:p.map(I=>I.id),coverage:e.decisionIds.map(I=>e.coverage?.find(s=>s.decisionId===I)??{decisionId:I,status:b.has(I)?"projected":"unprojected"})},w=p.flatMap(I=>I.decisionIds.map(s=>({id:M(o),schemaVersion:1,projectId:t.bundle.manifest.projectId,createdAt:l,participantId:c.id,sourceRefs:[{kind:"record",id:S.id}],recordType:"relationship",relationshipType:"derived_from",from:{entityType:"model_entry",entityId:I.id},to:{entityType:"decision",entityId:s},reason:"The owner applied this model entry as a projection of accepted product truth."}))),R=await this.store.commit({records:[...p,S],events:[],relationships:w,artifacts:[],tombstones:[],projectionUpdates:[]},{transactionId:M(o),committedAt:l});return await this.refreshIndex(R),{projectionId:u,entryIds:p.map(I=>I.id),headSequence:R.report.headSequence}}async loadSource(e){if((await this.status()).initialized){let t=await this.store.load();return{source:"journal",bundle:t.bundle,journal:t.report}}return{source:"legacy_preview",bundle:(await Re({...e,projectRoot:this.projectRoot})).bundle}}async withIndexedCandidates(e,t){if(e.source!=="journal"||!e.journal)return t;let i=await this.indexStore.ensure(e.bundle,{sequence:e.journal.headSequence,hash:e.journal.headHash}),r=ut(i,t.subjectHints??[]);return r?{...t,subjectIds:[...new Set([...t.subjectIds??[],...r.subjectIds])],candidateDecisionIds:r.decisionIds,candidateProposalIds:r.proposalIds}:t}async refreshIndex(e){await this.indexStore.ensure(e.bundle,{sequence:e.report.headSequence,hash:e.report.headHash}),e.report.headSequence-e.report.checkpointSequence>=250&&await this.store.rotateCheckpoint()}};function me(n){if(!n||typeof n!="object"||Array.isArray(n))throw new Error("Expected a JSON object.");return n}function C(n,e){if(typeof n!="string"||!n.trim())throw new Error(`${e} must be a non-empty string.`);return n}function ue(n,e,t){let i=C(n,e);if(!t.includes(i))throw new Error(`${e} is invalid.`);return i}function si(n){let e=me(n),t=me(e.authority),i=t.level,r=t.mode,c=ue(i,"authority.level",["owner","delegate","contributor"]),o=ue(r,"authority.mode",["local_trusted","hosted"]),l={proposalId:C(e.proposalId,"proposalId"),participantId:C(e.participantId,"participantId"),occurredAt:C(e.occurredAt,"occurredAt"),authority:{level:c,mode:o,grantId:typeof t.grantId=="string"?t.grantId:void 0}};switch(e.action){case"accept":return{...l,action:"accept",eventId:C(e.eventId,"eventId"),decisionId:C(e.decisionId,"decisionId"),kind:ue(e.kind,"kind",["principle","preference","rule","constraint"]),reason:C(e.reason,"reason"),rationale:typeof e.rationale=="string"?e.rationale:void 0};case"reject":return{...l,action:"reject",eventId:C(e.eventId,"eventId"),reason:C(e.reason,"reason")};case"defer":{let u=me(e.context);if(!Array.isArray(u.subjectIds)||!Array.isArray(u.resurfaceWhen))throw new Error("Deferral context requires subjectIds and resurfaceWhen arrays.");return{...l,action:"defer",eventId:C(e.eventId,"eventId"),reason:typeof e.reason=="string"?e.reason:void 0,context:{taskContext:typeof u.taskContext=="string"?u.taskContext:void 0,subjectIds:u.subjectIds.map(p=>C(p,"subjectId")),resurfaceWhen:u.resurfaceWhen.map(p=>ue(p,"resurfaceWhen",["different_action","new_evidence","new_conflict","owner_request","after_date"])),revisitAfter:typeof u.revisitAfter=="string"?u.revisitAfter:void 0}}}case"edit_and_accept":{if(!Array.isArray(e.subjects))throw new Error("subjects must be an array.");return{...l,action:"edit_and_accept",withdrawalEventId:C(e.withdrawalEventId,"withdrawalEventId"),replacementProposalId:C(e.replacementProposalId,"replacementProposalId"),acceptanceEventId:C(e.acceptanceEventId,"acceptanceEventId"),decisionId:C(e.decisionId,"decisionId"),relationshipId:C(e.relationshipId,"relationshipId"),claim:C(e.claim,"claim"),kind:ue(e.kind,"kind",["principle","preference","rule","constraint"]),subjects:e.subjects.map(u=>{let p=me(u);return{subjectId:C(p.subjectId,"subjectId"),role:ue(p.role,"role",["governed","consumer","provider","context"])}}),subjectSemantics:typeof e.subjectSemantics=="string"?e.subjectSemantics:void 0,rationale:typeof e.rationale=="string"?e.rationale:void 0,reason:C(e.reason,"reason")}}default:throw new Error("Unsupported owner review action.")}}function oi(n){let e=me(n),t=(c,o)=>{if(c!==void 0){if(!Array.isArray(c))throw new Error(`${o} must be an array.`);return c.map(l=>C(l,o))}},i=(c,o)=>{if(c!==void 0){if(typeof c!="number"||!Number.isFinite(c)||c<=0)throw new Error(`${o} must be a positive number.`);return c}},r=e.resurface===void 0?void 0:me(e.resurface);if(e.generatedAt!==void 0&&(typeof e.generatedAt!="string"||Number.isNaN(Date.parse(e.generatedAt))))throw new Error("generatedAt must be an ISO-8601 timestamp.");return{action:typeof e.action=="string"?e.action:void 0,text:typeof e.text=="string"?e.text:void 0,subjectIds:t(e.subjectIds,"subjectIds"),subjectHints:t(e.subjectHints,"subjectHints"),maxPackets:i(e.maxPackets,"maxPackets"),maxEstimatedTokens:i(e.maxEstimatedTokens,"maxEstimatedTokens"),generatedAt:typeof e.generatedAt=="string"?e.generatedAt:void 0,resurface:r?{differentAction:r.differentAction===!0,newEvidence:r.newEvidence===!0,newConflict:r.newConflict===!0,ownerRequested:r.ownerRequested===!0}:void 0}}export{we as MemoryJournalStore,Ge as MemoryService,Le as computeTransactionHash,oi as parseContextualReviewQuery,si as parseOwnerReviewCommand};
|
|
1
|
+
import{createHash as Tt}from"crypto";import{mkdir as Ze,open as Je,readFile as ze,readdir as St,rename as kt,unlink as Le}from"fs/promises";import{join as K}from"path";var gt=/^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;function ae(i){return gt.test(i)}function vt(i){return{valid:!i.some(e=>e.severity==="error"),issues:i}}function A(i,e,t,n){i.push({path:e,code:t,message:n,severity:"error"})}function qe(i,e,t,n){i.push({path:e,code:t,message:n,severity:"warning"})}function B(i,e,t){ae(t)||A(i,e,"invalid_uuid_v7","Canonical IDs must be UUIDv7 values.")}function N(i,e,t){(!t||Number.isNaN(Date.parse(t)))&&A(i,e,"invalid_timestamp","Timestamps must be parseable ISO-8601 strings.")}function Y(i,e,t,n=!1){n&&t.level==="contributor"&&A(i,`${e}.level`,"insufficient_authority","Contributors cannot accept or change normative product truth."),t.level==="delegate"&&!t.grantId&&A(i,`${e}.grantId`,"missing_authority_grant","Delegate authority must reference the grant used for this action.")}var wt={observation:new Set(["null->open","open->resolved","open->dismissed","resolved->open","dismissed->open"]),proposal:new Set(["null->draft","draft->pending","pending->accepted","pending->rejected","pending->withdrawn","pending->deferred","deferred->pending"]),decision:new Set(["null->active","active->superseded","active->revoked"]),advisory_explanation:new Set(["null->emerging","null->testing","null->grounded","null->challenged","null->retired","emerging->testing","emerging->grounded","emerging->challenged","emerging->retired","testing->grounded","testing->challenged","testing->retired","grounded->challenged","grounded->retired","challenged->testing","challenged->retired"]),implementation_attempt:new Set(["null->planned","planned->in_progress","planned->abandoned","in_progress->completed","in_progress->failed","in_progress->abandoned"]),eval_spec:new Set(["null->draft","null->active","draft->active","draft->retired","active->retired"]),verification_attempt:new Set(["null->queued","queued->running","queued->cancelled","running->passed","running->failed","running->inconclusive","running->error","running->cancelled"]),freshness_signal:new Set(["null->open","open->resolved"])},bt=new Set(["proposal:accepted","proposal:rejected","decision:superseded","decision:revoked"]);function jt(i,e,t){B(i,`${t}.id`,e.id),B(i,`${t}.projectId`,e.projectId),B(i,`${t}.participantId`,e.participantId),B(i,`${t}.entity.entityId`,e.entity.entityId),N(i,`${t}.createdAt`,e.createdAt),Y(i,`${t}.authority`,e.authority);let n=wt[e.entity.entityType],s=`${e.fromState??"null"}->${e.toState}`;n&&!n.has(s)&&A(i,t,"invalid_lifecycle_transition",`${e.entity.entityType} does not allow ${s}.`);let p=`${e.entity.entityType}:${e.toState}`;if(bt.has(p)&&(Y(i,`${t}.authority`,e.authority,!0),e.reason?.trim()||A(i,`${t}.reason`,"missing_normative_reason","Normative acceptance, rejection, supersession, and revocation require a reason.")),e.entity.entityType==="proposal"&&e.toState==="deferred"){let c=e.transitionContext;(c?.kind!=="proposal_deferral"||c.resurfaceWhen.length===0)&&A(i,`${t}.transitionContext`,"missing_deferral_policy","Deferred proposals require structured resurfacing conditions."),c?.resurfaceWhen.includes("after_date")&&!c.revisitAfter&&A(i,`${t}.transitionContext.revisitAfter`,"missing_revisit_date","after_date resurfacing requires revisitAfter."),c?.revisitAfter&&N(i,`${t}.transitionContext.revisitAfter`,c.revisitAfter)}}function Rt(i,e,t,n){B(i,`${t}.id`,e.id),B(i,`${t}.projectId`,e.projectId),B(i,`${t}.participantId`,e.participantId),N(i,`${t}.createdAt`,e.createdAt),e.projectId!==n&&A(i,`${t}.projectId`,"project_mismatch","Record belongs to another project."),"subjects"in e&&e.subjects.length===0&&A(i,`${t}.subjects`,"missing_subject","Proposals and decisions need a subject."),"subjects"in e&&e.subjects.length>1&&!e.subjectSemantics?.trim()&&A(i,`${t}.subjectSemantics`,"missing_subject_semantics","Multi-subject claims must explain why the subjects are inseparable."),e.recordType==="proposal"&&e.origin.mode==="inferred"&&(!e.origin.sourceText||!e.origin.iterationId||!e.origin.inferredById)&&A(i,`${t}.origin`,"incomplete_inference_provenance","Inferred structure requires source text, iteration, and inferring participant."),e.recordType==="decision"&&(Y(i,`${t}.authority`,e.authority,!0),e.claim.trim()||A(i,`${t}.claim`,"empty_claim","Accepted decisions require a claim.")),e.recordType==="authority_grant"&&e.level==="owner"&&qe(i,`${t}.level`,"owner_grant_requires_policy_review","Owner grants are valid but should receive explicit policy review."),e.recordType==="advisory_explanation"&&((!e.statement.trim()||!e.rationale.trim())&&A(i,t,"incomplete_advisory_explanation","Advisory explanations need a statement and rationale."),N(i,`${t}.updatedAt`,e.updatedAt),e.subjectIds.length===0&&A(i,`${t}.subjectIds`,"missing_subject","Advisory explanations need a subject."),e.scope.values.some(s=>!s.trim())&&A(i,`${t}.scope.values`,"empty_scope_value","Advisory scope values cannot be empty."),e.concreteBindings.forEach((s,p)=>{(!s.id.trim()||!s.modelPath.trim())&&A(i,`${t}.concreteBindings[${p}]`,"incomplete_concrete_binding","Concrete bindings need an id and model path."),N(i,`${t}.concreteBindings[${p}].createdAt`,s.createdAt),N(i,`${t}.concreteBindings[${p}].updatedAt`,s.updatedAt)})),e.recordType==="freshness_signal"&&e.state==="resolved"&&(!e.resolvedAt||!e.resolvedByEventId)&&A(i,t,"incomplete_freshness_resolution","Resolved freshness signals need a time and resolving event."),e.recordType==="model_projection"&&(N(i,`${t}.appliedAt`,e.appliedAt),Y(i,`${t}.authority`,e.authority,!0),e.entryIds.length===0&&A(i,`${t}.entryIds`,"empty_model_projection","Applied model projections need at least one model entry.")),e.recordType==="eval_spec"&&((!e.legacyId.trim()||!e.title.trim()||!e.prompt.trim())&&A(i,t,"incomplete_eval_spec","Eval specs need a stable id, title, and prompt."),(e.assertions.length===0||e.assertions.some(s=>!s.trim()))&&A(i,`${t}.assertions`,"empty_eval_assertions","Eval specs need at least one non-empty assertion."),e.targets.length===0&&e.decisionIds.length===0&&qe(i,t,"unbound_eval_spec","Eval spec is not yet bound to canonical product truth."),(e.dependencies?.length??0)===0&&qe(i,`${t}.dependencies`,"unscoped_eval_spec","Eval spec has no freshness dependencies."))}function xt(i,e,t){if(B(i,`${t}.id`,e.id),B(i,`${t}.projectId`,e.projectId),B(i,`${t}.participantId`,e.participantId),B(i,`${t}.from.entityId`,e.from.entityId),B(i,`${t}.to.entityId`,e.to.entityId),N(i,`${t}.createdAt`,e.createdAt),e.reason.trim()||A(i,`${t}.reason`,"missing_relationship_reason","Relationships need a reason."),new Set(["supports","contradicts","supersedes","excepts"]).has(e.relationshipType)){let s=e.from.entityType==="decision"&&e.to.entityType==="decision",p=e.from.entityType==="advisory_explanation"&&e.to.entityType==="advisory_explanation";!s&&!p&&A(i,t,"invalid_normative_relationship","These relationships connect decisions to decisions or advisory explanations to advisory explanations."),s&&!e.authority?A(i,`${t}.authority`,"missing_relationship_authority","Normative relationships require explicit authority context."):s&&e.authority&&Y(i,`${t}.authority`,e.authority,!0)}["operationalizes","refines","instantiates"].includes(e.relationshipType)&&(e.from.entityType!=="advisory_explanation"||e.to.entityType!=="advisory_explanation")&&A(i,t,"invalid_advisory_relationship","Advisory topology relationships connect advisory explanations."),e.relationshipType==="implements"&&(e.from.entityType!=="implementation_attempt"||e.to.entityType!=="decision")&&A(i,t,"invalid_implements_relationship","`implements` points from an implementation attempt to a decision."),e.relationshipType==="verifies"&&(e.from.entityType!=="verification_attempt"||!["decision","implementation_attempt","model_entry"].includes(e.to.entityType))&&A(i,t,"invalid_verifies_relationship","`verifies` points from a verification attempt to a verifiable target."),e.relationshipType==="replaces"&&e.from.entityType!==e.to.entityType&&A(i,t,"invalid_replaces_relationship","`replaces` connects records of the same entity type.")}function Z(i){let e=[];B(e,"manifest.projectId",i.manifest.projectId),N(e,"manifest.createdAt",i.manifest.createdAt),N(e,"manifest.updatedAt",i.manifest.updatedAt);let t=new Map,n=(r,f)=>{let l=t.get(r);l?A(e,f,"duplicate_id",`ID is already used at ${l}.`):t.set(r,f)};i.records.forEach((r,f)=>{let l=`records[${f}]`;n(r.id,l),Rt(e,r,l,i.manifest.projectId)}),i.events.forEach((r,f)=>{let l=`events[${f}]`;n(r.id,l),jt(e,r,l),r.projectId!==i.manifest.projectId&&A(e,`${l}.projectId`,"project_mismatch","Event belongs to another project.")}),i.relationships.forEach((r,f)=>{let l=`relationships[${f}]`;n(r.id,l),xt(e,r,l),r.projectId!==i.manifest.projectId&&A(e,`${l}.projectId`,"project_mismatch","Relationship belongs to another project.")}),i.artifacts.forEach((r,f)=>{n(r.id,`artifacts[${f}]`),B(e,`artifacts[${f}].id`,r.id)}),i.tombstones.forEach((r,f)=>{let l=`tombstones[${f}]`;n(r.id,l),B(e,`${l}.id`,r.id),B(e,`${l}.objectId`,r.objectId),B(e,`${l}.deletedById`,r.deletedById),N(e,`${l}.deletedAt`,r.deletedAt),Y(e,`${l}.authority`,r.authority,!0)});let s=new Set(i.records.map(r=>`${r.recordType}:${r.id}`)),p=new Set(i.tombstones.map(r=>`${r.objectType}:${r.objectId}`)),c=(r,f)=>{let l=`${r.entityType}:${r.entityId}`;!s.has(l)&&!p.has(l)&&A(e,f,"dangling_entity_reference",`No record or tombstone exists for ${l}.`)};i.events.forEach((r,f)=>c(r.entity,`events[${f}].entity`)),i.relationships.forEach((r,f)=>{c(r.from,`relationships[${f}].from`),c(r.to,`relationships[${f}].to`)});let u=new Set(i.artifacts.map(r=>r.id)),h=(r,f)=>{u.has(r)||A(e,f,"dangling_artifact_reference","No artifact manifest entry exists.")},m=(r,f,l)=>{!s.has(`${r}:${f}`)&&!p.has(`${r}:${f}`)&&A(e,l,"dangling_entity_reference",`No ${r} record or tombstone exists.`)};i.records.forEach((r,f)=>{let l=`records[${f}]`;switch(r.recordType){case"authority_grant":m("participant",r.granteeId,`${l}.granteeId`),m("participant",r.grantedById,`${l}.grantedById`),r.subjectIds.forEach((d,o)=>m("subject",d,`${l}.subjectIds[${o}]`));break;case"observation":r.captureContext.subjectIds.forEach((d,o)=>m("subject",d,`${l}.captureContext.subjectIds[${o}]`)),r.captureContext.artifactIds.forEach((d,o)=>h(d,`${l}.captureContext.artifactIds[${o}]`));break;case"proposal":case"decision":r.subjects.forEach((d,o)=>m("subject",d.subjectId,`${l}.subjects[${o}].subjectId`));break;case"thread":r.messageArtifactIds.forEach((d,o)=>h(d,`${l}.messageArtifactIds[${o}]`)),r.resultRefs.forEach((d,o)=>c(d,`${l}.resultRefs[${o}]`));break;case"iteration":r.threadIds.forEach((d,o)=>m("thread",d,`${l}.threadIds[${o}]`)),r.artifactIds.forEach((d,o)=>h(d,`${l}.artifactIds[${o}]`));break;case"evidence":r.artifactIds.forEach((d,o)=>h(d,`${l}.artifactIds[${o}]`));break;case"advisory_explanation":r.subjectIds.forEach((d,o)=>m("subject",d,`${l}.subjectIds[${o}]`)),r.evidenceIds.forEach((d,o)=>m("evidence",d,`${l}.evidenceIds[${o}]`)),r.supersededById&&m("advisory_explanation",r.supersededById,`${l}.supersededById`);break;case"implementation_attempt":r.iterationIds.forEach((d,o)=>m("iteration",d,`${l}.iterationIds[${o}]`)),r.coverageClaims.forEach((d,o)=>m("decision",d.decisionId,`${l}.coverageClaims[${o}].decisionId`)),r.artifactIds.forEach((d,o)=>h(d,`${l}.artifactIds[${o}]`));break;case"eval_spec":r.replacesSpecId&&m("eval_spec",r.replacesSpecId,`${l}.replacesSpecId`),r.decisionIds.forEach((d,o)=>m("decision",d,`${l}.decisionIds[${o}]`)),r.subjectIds.forEach((d,o)=>m("subject",d,`${l}.subjectIds[${o}]`)),(r.dependencies??[]).forEach((d,o)=>{d.kind==="subject"&&d.subjectId&&m("subject",d.subjectId,`${l}.dependencies[${o}].subjectId`)}),(r.scenarios??[]).forEach((d,o)=>{d.subjectIds?.forEach((y,R)=>m("subject",y,`${l}.scenarios[${o}].subjectIds[${R}]`))}),r.targets.forEach((d,o)=>m(d.entityType,d.entityId,`${l}.targets[${o}]`));break;case"verification_attempt":r.evalSpecId&&m("eval_spec",r.evalSpecId,`${l}.evalSpecId`),r.targets.forEach((d,o)=>m(d.entityType,d.entityId,`${l}.targets[${o}]`)),r.evidenceIds.forEach((d,o)=>m("evidence",d,`${l}.evidenceIds[${o}]`));break;case"model_entry":r.subjectIds.forEach((d,o)=>m("subject",d,`${l}.subjectIds[${o}]`)),r.decisionIds.forEach((d,o)=>m("decision",d,`${l}.decisionIds[${o}]`));break;case"model_projection":Y(e,`${l}.authority`,r.authority,!0),m("participant",r.appliedById,`${l}.appliedById`),r.decisionIds.forEach((d,o)=>m("decision",d,`${l}.decisionIds[${o}]`)),r.entryIds.forEach((d,o)=>m("model_entry",d,`${l}.entryIds[${o}]`)),r.coverage.forEach((d,o)=>m("decision",d.decisionId,`${l}.coverage[${o}].decisionId`));break;case"freshness_signal":c(r.target,`${l}.target`),r.evidenceIds.forEach((d,o)=>m("evidence",d,`${l}.evidenceIds[${o}]`));break;default:break}});let j=new Map(i.events.map(r=>[r.id,r])),T=new Map(i.records.map(r=>[`${r.recordType}:${r.id}`,r])),g=new Map;i.events.forEach((r,f)=>{let l=`${r.entity.entityType}:${r.entity.entityId}:${r.fromState??"null"}`,d=g.get(l)??new Set;d.add(r.toState),g.set(l,d),d.size>1&&A(e,`events[${f}]`,"concurrent_incompatible_transitions","The same entity state has multiple incompatible successor states.")});let v=new Map(i.records.flatMap(r=>r.recordType==="authority_grant"?[[r.id,r]]:[])),I=(r,f,l,d,o)=>{if(r.level!=="delegate"||!r.grantId)return;let y=v.get(r.grantId);if(!y){A(e,o,"invalid_authority_grant","Delegated authority references a missing grant.");return}(y.granteeId!==f||y.level!=="delegate")&&A(e,o,"authority_grantee_mismatch","The grant does not authorize this participant as a delegate.");let R=Date.parse(l);(R<Date.parse(y.startsAt)||y.endsAt&&R>Date.parse(y.endsAt)||y.revokedAt&&R>=Date.parse(y.revokedAt))&&A(e,o,"inactive_authority_grant","The delegated authority grant was not active at this time."),y.subjectIds.length&&d.length&&!d.every(a=>y.subjectIds.includes(a))&&A(e,o,"authority_scope_mismatch","The delegated action exceeds the grant subject scope.")};for(let r of i.records)r.recordType==="decision"&&I(r.authority,r.acceptedById,r.createdAt,r.subjects.map(f=>f.subjectId),`records:${r.id}.authority`);i.events.forEach((r,f)=>{let l=T.get(`${r.entity.entityType}:${r.entity.entityId}`),d=l&&"subjects"in l?l.subjects.map(o=>o.subjectId):[];I(r.authority,r.participantId,r.createdAt,d,`events[${f}].authority`)}),i.relationships.forEach((r,f)=>{if(!r.authority)return;let l=[r.from,r.to].flatMap(d=>{let o=T.get(`${d.entityType}:${d.entityId}`);return o&&"subjects"in o?o.subjects.map(y=>y.subjectId):[]});I(r.authority,r.participantId,r.createdAt,l,`relationships[${f}].authority`)});for(let r of i.records){if(r.recordType!=="decision")continue;let f=j.get(r.acceptanceEventId);(!f||f.entity.entityType!=="proposal"||f.entity.entityId!==r.proposalId||f.toState!=="accepted")&&A(e,`records:${r.id}.acceptanceEventId`,"invalid_acceptance_event","A decision must reference the proposal event that explicitly accepted it."),f&&f.participantId!==r.acceptedById&&A(e,`records:${r.id}.acceptedById`,"acceptor_mismatch","Decision acceptor must match the acceptance event participant."),T.has(`proposal:${r.proposalId}`)||A(e,`records:${r.id}.proposalId`,"missing_proposal","Accepted decisions must retain their proposal."),r.state==="superseded"&&(i.relationships.some(d=>d.relationshipType==="supersedes"&&d.to.entityType==="decision"&&d.to.entityId===r.id)||A(e,`records:${r.id}.state`,"missing_successor","Superseded decisions require an explicit successor relationship.")),r.state==="revoked"&&(i.events.some(d=>d.entity.entityType==="decision"&&d.entity.entityId===r.id&&d.toState==="revoked"&&!!d.reason?.trim())||A(e,`records:${r.id}.state`,"missing_revocation_event","Revoked decisions require an authorized event with a reason."))}for(let r of i.records){if(r.recordType!=="proposal"||r.state!=="accepted")continue;i.records.some(l=>l.recordType==="decision"&&l.proposalId===r.id)||A(e,`records:${r.id}.state`,"accepted_proposal_without_decision","Every accepted proposal must produce an immutable decision.")}return vt(e)}var At={records:[],events:[],relationships:[],artifacts:[],tombstones:[],projectionUpdates:[]};function Ae(i){return Tt("sha256").update(JSON.stringify(i)).digest("hex")}function Ve(i){return Ae(i)}function et(i,e,t){[...e.records,...e.recordReplacements??[]].some(n=>n.recordType==="advisory_explanation")&&!i.manifest.features.includes("advisory_explanations")&&i.manifest.features.push("advisory_explanations");for(let n of e.recordReplacements??[]){if(n.recordType!=="advisory_explanation")throw new Error(`Record replacement is not supported for ${n.recordType}.`);let s=i.records.findIndex(c=>c.recordType===n.recordType&&c.id===n.id);if(s<0)throw new Error(`Record replacement target not found: ${n.recordType} ${n.id}`);let p=i.records[s];if(p.projectId!==n.projectId||p.createdAt!==n.createdAt||p.participantId!==n.participantId)throw new Error(`Record replacement changed immutable identity for ${n.id}.`);i.records[s]=structuredClone(n)}for(let n of e.projectionUpdates){let s=i.records.find(p=>p.recordType===n.entityType&&p.id===n.entityId);if(!s||s.recordType!=="proposal"&&s.recordType!=="decision")throw new Error(`Projection target not found: ${n.entityType} ${n.entityId}`);if(s.state!==n.fromState)throw new Error(`Projection state conflict for ${n.entityType} ${n.entityId}: expected ${n.fromState}, found ${s.state}`);s.state=n.state}return i.records.push(...e.records),i.events.push(...e.events),i.relationships.push(...e.relationships),i.artifacts.push(...e.artifacts),i.tombstones.push(...e.tombstones),i.manifest.updatedAt=t,i}function Mt(i,e,t){return et(structuredClone(i),e,t)}async function ee(i,e){let t=`${i}.${process.pid}.${Date.now()}.tmp`,n=await Je(t,"w");try{await n.writeFile(`${JSON.stringify(e,null,2)}
|
|
2
|
+
`,"utf8"),await n.sync()}finally{await n.close()}try{await kt(t,i)}catch(s){throw await Le(t).catch(()=>{}),s}}async function ke(i){return JSON.parse(await ze(i,"utf8"))}var ve=class{constructor(e){this.writeChain=Promise.resolve();this.memoryDir=K(e,".popmelt","memory"),this.journalDir=K(this.memoryDir,"journal"),this.manifestPath=K(this.memoryDir,"manifest.json"),this.checkpointPath=K(this.memoryDir,"checkpoint.json"),this.lockPath=K(this.memoryDir,"writer.lock")}async initialize(e){let t=Z(e);if(!t.valid)throw new Error(`Cannot initialize invalid memory bundle: ${JSON.stringify(t.issues)}`);await Ze(this.journalDir,{recursive:!0});try{throw await ze(this.manifestPath,"utf8"),new Error("Memory journal is already initialized.")}catch(n){if(n instanceof Error&&n.message==="Memory journal is already initialized."||n.code!=="ENOENT")throw n}await this.withWriterLock(async()=>{try{throw await ze(this.manifestPath,"utf8"),new Error("Memory journal is already initialized.")}catch(c){if(c instanceof Error&&c.message==="Memory journal is already initialized."||c.code!=="ENOENT")throw c}let n=Ae(e),s={storageVersion:1,sequence:0,hash:n,journalHash:null,bundle:e},p={storageVersion:1,projectId:e.manifest.projectId,checkpoint:{file:"checkpoint.json",sequence:0,hash:n},head:{sequence:0,hash:null},updatedAt:e.manifest.updatedAt};await ee(this.checkpointPath,s),await ee(this.manifestPath,p)})}async load(){let e=await this.loadInternal();return{bundle:e.bundle,report:e.report}}async recover(){return this.enqueueWrite(async()=>this.withWriterLock(async()=>{let e=await this.loadInternal();return e.report.recoveredTransactions>0&&(e.manifest.head={sequence:e.report.headSequence,hash:e.report.headHash},e.manifest.updatedAt=e.bundle.manifest.updatedAt,await ee(this.manifestPath,e.manifest)),{bundle:e.bundle,report:e.report}}))}async rotateCheckpoint(){return this.enqueueWrite(async()=>this.withWriterLock(async()=>{let e=await this.loadInternal();if(e.report.headSequence===e.report.checkpointSequence)return{bundle:e.bundle,report:e.report};let t=Ae(e.bundle),n=`checkpoint-${String(e.report.headSequence).padStart(12,"0")}.json`,s={storageVersion:1,sequence:e.report.headSequence,hash:t,journalHash:e.report.headHash,bundle:e.bundle};return await ee(K(this.memoryDir,n),s),e.manifest.checkpoint={file:n,sequence:s.sequence,hash:t},await ee(this.manifestPath,e.manifest),{bundle:e.bundle,report:{...e.report,checkpointSequence:s.sequence,appliedTransactions:0}}}))}async maintain(e=250){let t=await this.load();return t.report.headSequence-t.report.checkpointSequence>=e?this.rotateCheckpoint():t}async commit(e,t){return this.enqueueWrite(async()=>this.withWriterLock(async()=>{if(!ae(t.transactionId))throw new Error("Transaction ID must be UUIDv7.");if(Number.isNaN(Date.parse(t.committedAt)))throw new Error("committedAt must be ISO-8601.");let n=await this.loadInternal();if(n.transactionIds.has(t.transactionId))throw new Error(`Transaction already exists: ${t.transactionId}`);let s=n.report.headSequence+1,p={storageVersion:1,sequence:s,transactionId:t.transactionId,projectId:n.bundle.manifest.projectId,committedAt:t.committedAt,previousHash:n.report.headHash,mutation:e},c={...p,hash:Ve(p)},u=Mt(n.bundle,e,t.committedAt),h=Z(u);if(!h.valid)throw new Error(`Journal mutation produces invalid memory: ${JSON.stringify(h.issues)}`);let m=`${String(s).padStart(12,"0")}-${t.transactionId}.json`;return await ee(K(this.journalDir,m),c),n.manifest.head={sequence:s,hash:c.hash},n.manifest.updatedAt=t.committedAt,await ee(this.manifestPath,n.manifest),{bundle:u,report:{checkpointSequence:n.report.checkpointSequence,appliedTransactions:n.report.appliedTransactions+1,recoveredTransactions:0,ignoredTemporaryFiles:n.report.ignoredTemporaryFiles,headSequence:s,headHash:c.hash}}}))}async commitReviewPlan(e,t){return this.commit({...At,records:e.append.records,events:e.append.events,relationships:e.append.relationships,projectionUpdates:e.projectionUpdates},t)}async loadInternal(){let e=await ke(this.manifestPath),t=await ke(K(this.memoryDir,e.checkpoint.file));if(e.storageVersion!==1||t.storageVersion!==1)throw new Error("Unsupported memory journal storage version.");if(e.projectId!==t.bundle.manifest.projectId)throw new Error("Checkpoint project does not match journal manifest.");if(t.hash!==Ae(t.bundle)||t.hash!==e.checkpoint.hash)throw new Error("Memory checkpoint hash mismatch.");let n=await St(this.journalDir),s=n.filter(g=>g.endsWith(".tmp")),c=n.filter(g=>/^\d{12}-[0-9a-f-]+\.json$/i.test(g)).sort().filter(g=>Number(g.slice(0,12))>t.sequence),u=structuredClone(t.bundle),h=t.sequence,m=t.journalHash??null,j=new Set;for(let g of c){let v=await ke(K(this.journalDir,g)),{hash:I,...r}=v;if(I!==Ve(r))throw new Error(`Journal hash mismatch: ${g}`);if(v.sequence!==h+1)throw new Error(`Journal sequence gap at ${g}`);if(v.previousHash!==m)throw new Error(`Journal chain mismatch at ${g}`);if(v.projectId!==e.projectId)throw new Error(`Journal project mismatch at ${g}`);if(j.has(v.transactionId))throw new Error(`Duplicate transaction ID: ${v.transactionId}`);et(u,v.mutation,v.committedAt),h=v.sequence,m=v.hash,j.add(v.transactionId)}if(e.head.sequence>h)throw new Error("Journal manifest points beyond available transactions.");if(e.head.sequence===h&&e.head.hash!==m)throw new Error("Journal manifest head hash mismatch.");let T=Z(u);if(!T.valid)throw new Error(`Loaded journal is invalid: ${JSON.stringify(T.issues)}`);return{bundle:u,manifest:e,transactionIds:j,report:{checkpointSequence:t.sequence,appliedTransactions:c.length,recoveredTransactions:Math.max(0,h-e.head.sequence),ignoredTemporaryFiles:s.length,headSequence:h,headHash:m}}}enqueueWrite(e){let t=this.writeChain.then(e,e);return this.writeChain=t.then(()=>{},()=>{}),t}async withWriterLock(e){await Ze(this.memoryDir,{recursive:!0});let t;try{t=await Je(this.lockPath,"wx")}catch(n){if(n.code!=="EEXIST")throw n;let s=await ke(this.lockPath).catch(()=>({})),p=!0;if(typeof s.pid=="number")try{process.kill(s.pid,0)}catch(c){p=c.code!=="ESRCH"}if(p)throw new Error("Memory journal is locked by another writer.");await Le(this.lockPath),t=await Je(this.lockPath,"wx")}try{return await t.writeFile(JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()})),await e()}finally{await t.close(),await Le(this.lockPath).catch(()=>{})}}};import{mkdir as lt,readFile as Re,writeFile as ut}from"fs/promises";import{join as pe}from"path";var _t=new Set(["about","after","again","before","being","change","from","have","into","make","should","that","the","their","this","with","would","here","only"]);function Ne(i){return i.toLowerCase().replace(/[^a-z0-9]+/g," ").trim().replace(/\s+/g," ")}function Me(i){return new Set(Ne(i).split(" ").filter(e=>e.length>2&&!_t.has(e)))}function tt(i,e){if(!i.size||!e.size)return 0;let t=0;for(let n of i)e.has(n)&&(t+=1);return t/Math.min(i.size,e.size)}function Pt(i){return[{value:i.label,by:"label"},...i.aliases.map(e=>({value:e,by:"alias"})),...i.locators.map(e=>({value:e.value,by:"locator"}))]}function $t(i,e){let t=new Map,n=new Set(e.subjectIds??[]),s=(e.subjectHints??[]).map(Ne).filter(Boolean),p=Me([e.action,e.text].filter(Boolean).join(" "));for(let c of i){if(n.has(c.id)){t.set(c.id,{subjectId:c.id,label:c.label,confidence:"exact",matchedBy:"id",score:100});continue}let u;for(let h of Pt(c)){let m=Ne(h.value);for(let g of s){let v=m===g?95:m.includes(g)||g.includes(m)?75:0;v>(u?.score??0)&&(u={subjectId:c.id,label:c.label,confidence:v>=90?"exact":"strong",matchedBy:h.by,score:v})}let T=["/","#","[","]","="].some(g=>h.value.includes(g))?0:Math.round(tt(Me(m),p)*55);T>=30&&T>(u?.score??0)&&(u={subjectId:c.id,label:c.label,confidence:T>=45?"strong":"weak",matchedBy:"query_text",score:T})}u&&t.set(c.id,u)}return t}function Et(i,e){let t=new Set(i.sourceRefs.filter(c=>c.kind==="iteration").map(c=>c.id)),n=new Set(i.sourceRefs.filter(c=>c.kind==="thread").map(c=>c.id)),s=e.filter(c=>c.iterationIds.some(u=>t.has(u))||c.sourceRefs.some(u=>u.kind==="thread"&&n.has(u.id)));if(!s.length)return{state:"none_found",attemptIds:[]};let p=new Set(s.map(c=>c.state));return{state:p.size>1?"mixed":p.has("completed")?"completed":"attempted",attemptIds:s.map(c=>c.id)}}function Ct(i){return Math.ceil(JSON.stringify(i).length/4)}function Ue(i,e){let t=i.records.filter(f=>f.recordType==="subject"),n=e.generatedAt??new Date().toISOString(),s=e.candidateProposalIds?new Set(e.candidateProposalIds):void 0,p=i.records.filter(f=>{if(f.recordType!=="proposal"||s&&!s.has(f.id))return!1;if(f.state==="pending")return!0;if(f.state!=="deferred")return!1;let l=[...i.events].reverse().find(d=>d.entity.entityType==="proposal"&&d.entity.entityId===f.id&&d.toState==="deferred"&&d.transitionContext?.kind==="proposal_deferral")?.transitionContext;return l?l.resurfaceWhen.includes("different_action")&&e.resurface?.differentAction||l.resurfaceWhen.includes("new_evidence")&&e.resurface?.newEvidence||l.resurfaceWhen.includes("new_conflict")&&e.resurface?.newConflict||l.resurfaceWhen.includes("owner_request")&&e.resurface?.ownerRequested||l.resurfaceWhen.includes("after_date")&&!!(l.revisitAfter&&Date.parse(n)>=Date.parse(l.revisitAfter)):!1}),c=i.records.filter(f=>f.recordType==="implementation_attempt"),u=$t(t,e),h=[...u.values()].sort((f,l)=>l.score-f.score),m=Me([e.action,e.text].filter(Boolean).join(" ")),j=p.flatMap(f=>{let l=f.subjects.map(R=>u.get(R.subjectId)).filter(R=>!!R),d=Math.max(0,...l.map(R=>R.score)),o=Math.round(tt(Me(f.claim),m)*35),y=d+o;return y>=50?[{proposal:f,proposalMatches:l,score:y}]:[]}).sort((f,l)=>l.score-f.score||f.proposal.id.localeCompare(l.proposal.id)),T=Math.max(1,e.maxPackets??3),g=Math.max(200,e.maxEstimatedTokens??1200),v=[],I=0;for(let f of j){if(v.length>=T)break;let l=f.proposal.sourceRefs.slice(0,4),d={contractVersion:1,packetId:`review:${f.proposal.id}`,projectId:i.manifest.projectId,generatedAt:n,trigger:{action:e.action,reason:f.proposalMatches.length?`Historical proposal intersects ${f.proposalMatches.map(y=>y.label).join(", ")}.`:"Historical proposal materially overlaps the current task.",subjectMatches:f.proposalMatches.map(({score:y,...R})=>R)},proposal:{id:f.proposal.id,claim:f.proposal.claim,state:f.proposal.state,proposedKind:f.proposal.proposedKind,subjectIds:f.proposal.subjects.map(y=>y.subjectId),origin:f.proposal.origin.mode},authority:"unaccepted",presentation:f.score>=100&&["constraint","rule"].includes(f.proposal.proposedKind??"")?"surface_before_action":"advisory",implementation:Et(f.proposal,c),evidence:{sourceCount:f.proposal.sourceRefs.length,sourceRefs:l},actions:["accept","edit_and_accept","split","bundle","reject","defer","request_evidence"],expansionRefs:[{kind:"record",id:f.proposal.id},...l]},o={...d,estimatedTokens:Ct(d)};if(I+o.estimatedTokens>g)break;v.push(o),I+=o.estimatedTokens}let r=Math.max(0,j.length-v.length);return{packets:v,subjectMatches:h.map(({score:f,...l})=>l),completeness:{status:r>0?"truncated":"complete",consideredProposalCount:j.length,omittedPacketCount:r,maxEstimatedTokens:g,estimatedTokens:I},uncertainty:u.size===0?"subject_unresolved":j.length===0?"no_relevant_pending_proposal":void 0}}var Dt=new Set(["about","after","again","before","being","change","from","have","into","make","should","that","the","their","this","with","would","here","only"]);function He(i){return i.toLowerCase().replace(/[^a-z0-9]+/g," ").trim().replace(/\s+/g," ")}function _e(i){return new Set(He(i).split(" ").filter(e=>e.length>2&&!Dt.has(e)))}function it(i,e){if(!i.size||!e.size)return 0;let t=0;for(let n of i)e.has(n)&&(t+=1);return t/Math.min(i.size,e.size)}function Bt(i,e){let t=new Set(e.subjectIds??[]),n=(e.subjectHints??[]).map(He).filter(Boolean),s=_e([e.action,e.text].filter(Boolean).join(" ")),p=[];for(let c of i){if(t.has(c.id)){p.push({subjectId:c.id,subjectType:c.subjectType,label:c.label,confidence:"exact",matchedBy:"id",score:100});continue}let u,h=[{value:c.label,by:"semantic"},...c.aliases.map(m=>({value:m,by:"alias"})),...c.locators.map(m=>({value:m.value,by:"locator"}))];for(let m of h){let j=He(m.value);for(let v of n){let I=j===v?95:j.includes(v)||v.includes(j)?75:0;I>(u?.score??0)&&(u={subjectId:c.id,subjectType:c.subjectType,label:c.label,confidence:I>=90?"exact":"strong",matchedBy:m.by,score:I})}let g=["/","#","[","]","="].some(v=>m.value.includes(v))?0:Math.round(it(_e(j),s)*55);g>=30&&g>(u?.score??0)&&(u={subjectId:c.id,subjectType:c.subjectType,label:c.label,confidence:g>=45?"strong":"weak",matchedBy:"semantic",score:g})}u&&p.push(u)}return p.sort((c,u)=>u.score-c.score||c.subjectId.localeCompare(u.subjectId))}function Ot(i){return Math.ceil(JSON.stringify(i).length/4)}function ce(i,e){return i.relationshipType===e&&i.from.entityType==="decision"&&i.to.entityType==="decision"}function qt(i,e){let t=e.filter(p=>p.coverageClaims.some(c=>c.decisionId===i));if(!t.length)return{decisionId:i,state:"unimplemented",attemptIds:[]};let n=t.filter(p=>p.state==="completed"),s=n.some(p=>p.coverageClaims.some(c=>c.decisionId===i&&c.coverage==="full"));return{decisionId:i,state:s?"implemented":n.length?"partial":"unknown",attemptIds:t.map(p=>p.id)}}function Jt(i,e,t){let n=e.filter(u=>u.targets.some(h=>h.entityType==="decision"&&h.entityId===i)).sort((u,h)=>h.createdAt.localeCompare(u.createdAt)),s=t.some(u=>u.signalType==="verification_expired"&&u.target.entityType==="decision"&&u.target.entityId===i),p=n[0],c=s?"stale":p?p.state==="passed"?"passing":p.state==="failed"?"failing":["inconclusive","error","cancelled"].includes(p.state)?"blocked":"unverified":"unverified";return{target:{entityType:"decision",entityId:i},state:c,attemptIds:n.map(u=>u.id)}}function nt(i,e){let t=Math.max(300,e.maxEstimatedTokens??1200),n=Math.max(1,e.maxDecisions??6),s=i.records.filter(a=>a.recordType==="subject"),p=e.candidateDecisionIds?new Set(e.candidateDecisionIds):void 0,c=i.records.filter(a=>a.recordType==="decision"&&a.state==="active"),u=p?c.filter(a=>p.has(a.id)):c,h=i.records.filter(a=>a.recordType==="implementation_attempt"),m=i.records.filter(a=>a.recordType==="verification_attempt"),j=i.records.filter(a=>a.recordType==="freshness_signal"&&a.state==="open"),T=i.records.filter(a=>a.recordType==="evidence"),g=i.records.filter(a=>a.recordType==="model_entry"),v=Bt(s,e),I=new Map(v.map(a=>[a.subjectId,a.score])),r=_e([e.action,e.text].filter(Boolean).join(" ")),f=u.flatMap(a=>{let S=Math.max(0,...a.subjects.map(E=>I.get(E.subjectId)??0)),k=Math.round(it(_e(a.claim),r)*35),x=S+k;return x>=50?[{decision:a,score:x}]:[]}).sort((a,S)=>S.score-a.score||a.decision.id.localeCompare(S.decision.id)),l=new Map;for(let a of f.slice(0,n))l.set(a.decision.id,a.decision);for(let a of i.relationships){if(!ce(a,"excepts")&&!ce(a,"contradicts"))continue;let S=c.find(x=>x.id===a.from.entityId),k=c.find(x=>x.id===a.to.entityId);!S||!k||!l.has(S.id)&&!l.has(k.id)||(l.size<n&&l.set(S.id,S),l.size<n&&l.set(k.id,k))}let d=[...l.values()],o=a=>a.from.entityType==="decision"&&a.to.entityType==="decision"&&l.has(a.from.entityId)&&l.has(a.to.entityId),y=(a,S=!1)=>{let k=new Set(a.map(w=>w.id)),x=j.filter(w=>w.target.entityType==="decision"&&k.has(w.target.entityId)),E=new Set(i.relationships.filter(w=>ce(w,"excepts")&&k.has(w.from.entityId)&&k.has(w.to.entityId)).flatMap(w=>[w.from.entityId,w.to.entityId])),F=i.relationships.filter(w=>ce(w,"contradicts")&&k.has(w.from.entityId)&&k.has(w.to.entityId)).map(w=>({id:w.id,decisionIds:[w.from.entityId,w.to.entityId],unresolvedQuestion:w.reason,expansionRefs:[{kind:"record",id:w.id}]})),De=new Set(F.flatMap(w=>w.decisionIds)),te=T.filter(w=>w.sourceRefs.some(b=>b.kind==="record"&&k.has(b.id))||i.relationships.some(b=>b.relationshipType==="supports"&&b.from.entityType==="evidence"&&b.from.entityId===w.id&&b.to.entityType==="decision"&&k.has(b.to.entityId))),fe=Math.max(0,f.length-a.length),G=i.relationships.some(w=>ce(w,"contradicts")&&o(w)&&(!k.has(w.from.entityId)||!k.has(w.to.entityId))),ye=S||fe>0||G,W=[];v.length===0&&(e.subjectHints?.length??0)>0?W.push({code:"subject_unresolved",message:"No canonical subject matched the supplied task hints.",expansionRefs:[]}):a.length===0&&W.push({code:"no_applicable_decision",message:"No accepted decision applies to the resolved task subjects.",expansionRefs:[]}),F.length&&W.push({code:"known_conflict",message:"Applicable accepted decisions contain an unresolved contradiction.",expansionRefs:F.flatMap(w=>w.expansionRefs)}),te.some(w=>w.availability!=="available")&&W.push({code:"evidence_unavailable",message:"Some supporting evidence is unavailable.",expansionRefs:te.map(w=>({kind:"record",id:w.id}))}),ye&&W.push({code:"retrieval_truncated",message:"Additional applicable memory exists outside this packet.",expansionRefs:[{kind:"record",id:i.manifest.projectId}]});let Te={contractVersion:1,projectId:i.manifest.projectId,retrievedAt:e.retrievedAt??new Date().toISOString(),query:{text:e.text,action:e.action,subjectHints:e.subjectHints??[]},budget:{maxEstimatedTokens:t,estimatedTokens:0},subjectMatches:v.map(({score:w,...b})=>b),modelEntries:g.filter(w=>w.decisionIds.some(b=>k.has(b))).map(w=>({id:w.id,key:w.key,value:w.value,decisionIds:w.decisionIds})),decisions:a.map(w=>({id:w.id,kind:w.kind,claim:w.claim,subjectIds:w.subjects.map(b=>b.subjectId),authority:w.authority,effectiveState:De.has(w.id)?"conflicted":E.has(w.id)?"excepted":"active",freshness:x.filter(b=>b.target.entityId===w.id).map(b=>b.signalType),expansionRef:{kind:"record",id:w.id}})),conflicts:F,uncertainties:W,implementation:a.map(w=>qt(w.id,h)),verification:a.map(w=>Jt(w.id,m,x)),evidence:te.map(w=>({evidenceId:w.id,summary:w.summary,availability:w.availability,sourceRefs:w.sourceRefs})),completeness:{status:ye?"truncated":"complete",omittedDecisionCount:fe,omittedEvidenceCount:0,conflictsComplete:!G}};return Te.budget.estimatedTokens=Ot(Te),Te},R=y(d);for(;R.budget.estimatedTokens>t&&d.length>0;){let a=d.pop(),S=i.relationships.filter(k=>ce(k,"contradicts")&&(k.from.entityId===a.id||k.to.entityId===a.id)).flatMap(k=>[k.from.entityId,k.to.entityId]);d=d.filter(k=>!S.includes(k.id)),R=y(d,!0)}return R}function we(i,e,t,n){return{id:n,schemaVersion:1,projectId:i.manifest.projectId,createdAt:t.occurredAt,participantId:t.participantId,sourceRefs:[{kind:"record",id:e.id},...t.sourceRefs??[]],recordType:"lifecycle_event",authority:t.authority}}function rt(i,e,t,n,s){return{id:s,schemaVersion:1,projectId:i.manifest.projectId,createdAt:t.occurredAt,participantId:t.participantId,sourceRefs:[{kind:"record",id:e.id},...t.sourceRefs??[]],recordType:"decision",proposalId:e.id,acceptanceEventId:n,acceptedById:t.participantId,authority:t.authority,state:"active",kind:t.kind,claim:e.claim,rationale:t.rationale??e.rationale,subjects:e.subjects,subjectSemantics:e.subjectSemantics,noChange:!1}}function zt(i){switch(i.action){case"accept":return[i.eventId,i.decisionId];case"edit_and_accept":return[i.withdrawalEventId,i.replacementProposalId,i.acceptanceEventId,i.decisionId,i.relationshipId];case"reject":case"defer":return[i.eventId]}}function Pe(i,e){let t=[],n=i.records.find(p=>p.recordType==="proposal"&&p.id===e.proposalId);n?n.state!=="pending"&&t.push({code:"proposal_not_pending",message:`Proposal is ${n.state}, not pending.`}):t.push({code:"proposal_not_found",message:"Proposal does not exist."}),e.authority.level==="contributor"&&t.push({code:"insufficient_authority",message:"Contributors cannot resolve owner review."}),e.authority.level==="delegate"&&!e.authority.grantId&&t.push({code:"missing_authority_grant",message:"Delegate review requires a grant ID."}),ae(e.participantId)||t.push({code:"invalid_participant_id",message:"Participant ID must be UUIDv7."});for(let p of zt(e))ae(p)||t.push({code:"invalid_generated_id",message:`${p} is not UUIDv7.`});if(Number.isNaN(Date.parse(e.occurredAt))&&t.push({code:"invalid_timestamp",message:"occurredAt must be ISO-8601."}),t.length||!n)return{ok:!1,errors:t};if(e.action==="accept"){if(!e.reason.trim())return{ok:!1,errors:[{code:"reason_required",message:"Acceptance requires a reason."}]};let p={...we(i,n,e,e.eventId),entity:{entityType:"proposal",entityId:n.id},eventType:"proposal.accepted",fromState:"pending",toState:"accepted",reason:e.reason},c=rt(i,n,e,p.id,e.decisionId);return{ok:!0,plan:{action:e.action,proposalId:n.id,append:{records:[c],events:[p],relationships:[]},projectionUpdates:[{entityType:"proposal",entityId:n.id,fromState:"pending",state:"accepted"}],resultRefs:[{entityType:"decision",entityId:c.id}]}}}if(e.action==="edit_and_accept"){if(!e.claim.trim()||!e.reason.trim())return{ok:!1,errors:[{code:"claim_and_reason_required",message:"Edited acceptance requires claim and reason."}]};if(e.subjects.length>1&&!e.subjectSemantics?.trim())return{ok:!1,errors:[{code:"subject_semantics_required",message:"Multi-subject edits require semantics."}]};let p={id:e.replacementProposalId,schemaVersion:1,projectId:i.manifest.projectId,createdAt:e.occurredAt,participantId:e.participantId,sourceRefs:[{kind:"record",id:n.id},...e.sourceRefs??[]],recordType:"proposal",state:"accepted",claim:e.claim,rationale:e.rationale,proposedKind:e.kind,subjects:e.subjects,subjectSemantics:e.subjectSemantics,origin:{mode:"declared"}},c={...we(i,n,e,e.withdrawalEventId),entity:{entityType:"proposal",entityId:n.id},eventType:"proposal.withdrawn",fromState:"pending",toState:"withdrawn",reason:"Owner replaced the inferred proposal with edited wording during review."},u={...we(i,p,e,e.acceptanceEventId),entity:{entityType:"proposal",entityId:p.id},eventType:"proposal.accepted",fromState:"pending",toState:"accepted",reason:e.reason},h=rt(i,p,e,u.id,e.decisionId),m={id:e.relationshipId,schemaVersion:1,projectId:i.manifest.projectId,createdAt:e.occurredAt,participantId:e.participantId,sourceRefs:[{kind:"record",id:n.id}],recordType:"relationship",relationshipType:"derived_from",from:{entityType:"proposal",entityId:p.id},to:{entityType:"proposal",entityId:n.id},reason:"Owner-edited proposal derives from the historical review candidate."};return{ok:!0,plan:{action:e.action,proposalId:n.id,append:{records:[p,h],events:[c,u],relationships:[m]},projectionUpdates:[{entityType:"proposal",entityId:n.id,fromState:"pending",state:"withdrawn"}],resultRefs:[{entityType:"proposal",entityId:p.id},{entityType:"decision",entityId:h.id}]}}}if(e.action==="reject"){if(!e.reason.trim())return{ok:!1,errors:[{code:"reason_required",message:"Rejection requires a reason."}]};let p={...we(i,n,e,e.eventId),entity:{entityType:"proposal",entityId:n.id},eventType:"proposal.rejected",fromState:"pending",toState:"rejected",reason:e.reason};return{ok:!0,plan:{action:e.action,proposalId:n.id,append:{records:[],events:[p],relationships:[]},projectionUpdates:[{entityType:"proposal",entityId:n.id,fromState:"pending",state:"rejected"}],resultRefs:[{entityType:"proposal",entityId:n.id}]}}}let s={...we(i,n,e,e.eventId),entity:{entityType:"proposal",entityId:n.id},eventType:"proposal.deferred",fromState:"pending",toState:"deferred",reason:e.reason,transitionContext:{kind:"proposal_deferral",...e.context}};return{ok:!0,plan:{action:e.action,proposalId:n.id,append:{records:[],events:[s],relationships:[]},projectionUpdates:[{entityType:"proposal",entityId:n.id,fromState:"pending",state:"deferred"}],resultRefs:[{entityType:"proposal",entityId:n.id}]}}}import{createHash as Lt}from"crypto";import{readFile as Vt,readdir as Nt,realpath as Ut}from"fs/promises";import{join as be,relative as Ht}from"path";var Ft=["f5258a13","31ffc15e","3eae3a70","c185e614","33930045","55e04c59","f3bb881b","f8a55928","eac95a7d","e402bdc2","2854624b","cf28ad45","6a494fab","987e901b","ad7293aa","dd1d5d77","14c429d6","48494ad3","d6bbe932","e8b94260","f56fa283","7f1f6cb3","f239f4ac","bd671e61","dbe032ec","c0808b95"];function de(i){return i!==null&&typeof i=="object"&&!Array.isArray(i)?i:null}function J(i,e=0){return new Date(Number.isFinite(i)?i:e).toISOString()}function ot(...i){return i.find(e=>!!e?.trim())?.trim()}function M(i,e,t,n){let p=Math.max(0,Math.min(Math.floor(n),0xffffffffffff)).toString(16).padStart(12,"0"),c=Lt("sha256").update(`${i}\0${e}\0${t}`).digest("hex"),u=(Number.parseInt(c[3],16)&3|8).toString(16);return`${p.slice(0,8)}-${p.slice(8)}-7${c.slice(0,3)}-${u}${c.slice(4,7)}-${c.slice(7,19)}`}async function Fe(i,e){try{return JSON.parse(await Vt(i,"utf8"))}catch(t){return e.push({severity:"warning",code:"source_unavailable",source:i,message:t instanceof Error?t.message:String(t)}),null}}function Kt(i){let e=de(i);if(!e)return 0;let t=0,n=s=>{let p=de(s);if(!p){t+=1;return}for(let c of Object.values(p))n(c)};for(let s of Object.values(e))n(s);return t}function Wt(i){let e={};for(let t of i)e[t.recordType]=(e[t.recordType]??0)+1;return e}async function je(i){let e=[],t=await Ut(i.projectRoot).catch(()=>i.projectRoot),n=be(t,".popmelt"),s=await Fe(be(n,"threads.json"),e),p=await Fe(be(n,"model.json"),e),c=de(s),u=de(c?.threads)??{},h=Object.entries(u).map(([b,_])=>({key:b,value:de(_)})).filter(b=>!!b.value),m=be(n,"decisions"),j=await Nt(m).catch(()=>[]),T=[];for(let b of j.filter(_=>_.endsWith(".json")).sort()){let _=de(await Fe(be(m,b),e));_&&T.push({file:b,value:_})}let g=h.flatMap(({value:b})=>[b.createdAt,b.updatedAt]).filter(b=>typeof b=="number"&&Number.isFinite(b)),v=g.length?Math.min(...g):0,I=i.projectKey??t;i.projectKey||e.push({severity:"info",code:"path_derived_project_identity",message:"Canonical project identity is stable for this path; pass projectKey to preserve it across moves."});let r=M(I,"project",I,v),f=M(I,"participant","legacy-owner",v),l=M(I,"participant","legacy-agent",v),d=M(I,"subject","project",v),o=J(Math.max(v,...g)),y=[],R=[],a=new Map,S=new Map,k=new Map(T.map(b=>[b.value.id??b.file.replace(/^d-|\.json$/g,""),b.value])),x=new Map,E=(b,_,P,O,z)=>{let H=a.get(P);if(H)return H;let Q=M(I,"artifact",b,O);return R.push({id:Q,kind:_,mediaType:z,location:P,availability:"available"}),a.set(P,Q),Q};for(let{file:b,value:_}of T){let P=_.id??b.replace(/^d-|\.json$/g,""),O=_.createdAt??v,z=[E(`${P}:envelope`,"other",`.popmelt/decisions/${b}`,O,"application/json")];_.screenshotPath&&z.push(E(`${P}:screenshot`,"screenshot",`.popmelt/${_.screenshotPath.replace(/^\.popmelt\//,"")}`,O,_.screenshotPath.endsWith(".png")?"image/png":"image/webp"));for(let[H,Q]of(_.pastedImagePaths??[]).entries())z.push(E(`${P}:image:${H}`,"image",Q,O));x.set(P,z)}let U=(b,_,P)=>({id:b,schemaVersion:1,projectId:r,createdAt:o,participantId:_,sourceRefs:P}),F=(b,_)=>{y.push(_);let P=S.get(b)??[];P.push(_.id),S.set(b,P)},De=[{...U(f,f,[]),recordType:"participant",kind:"human",displayName:"Legacy project owner",status:"active"},{...U(l,l,[]),recordType:"participant",kind:"ai",displayName:"Legacy coding agent",status:"active"}];y.push(...De),y.push({...U(d,f,[]),recordType:"subject",subjectType:"project",label:Ht(process.cwd(),t)||t,aliases:[],locators:[{id:M(I,"locator",t,v),kind:"project_root",value:t,status:"current",validFrom:J(v),sourceRefs:[]}]});let te=new Map,fe=(b,_)=>{let P=te.get(b);if(P)return P;let O=M(I,"subject",b,_),z={...U(O,f,[{kind:"external",id:b}]),createdAt:J(_),recordType:"subject",subjectType:"element",label:b,aliases:[],locators:[{id:M(I,"locator",b,_),kind:"dom_selector",value:b,status:"current",validFrom:J(_),sourceRefs:[{kind:"external",id:b}]}]};return y.push(z),te.set(b,O),O};for(let{key:b,value:_}of h){let P=_.id??b,O=_.createdAt??v,z=M(I,"thread",P,O),H={kind:"thread",id:P},Q=[],he=[],Qe=Array.isArray(_.messages)?_.messages:[],ie,Be,Ge=0;Qe.forEach((C,ne)=>{let q=C.timestamp??O,X=M(I,"artifact",`${P}:message:${ne}`,q);if(Q.push(X),R.push({id:X,kind:"message",mediaType:"application/json",location:`.popmelt/threads.json#/threads/${P}/messages/${ne}`,availability:"available"}),a.set(`.popmelt/threads.json#/threads/${P}/messages/${ne}`,X),C.screenshotPath&&E(`${P}:message:${ne}:screenshot`,"screenshot",C.screenshotPath,q),C.role==="human"){ie=C;let L=C.feedbackSummary??C.replyToQuestion;if(L?.trim()){let V=M(I,"observation",`${P}:${ne}`,q),se=_.elementIdentifiers??[],Se={...U(V,f,[H,{kind:"message",id:X}]),createdAt:J(q),recordType:"observation",state:"open",statement:L,captureContext:{subjectIds:se.map(ge=>fe(ge,O)),artifactIds:[X]},resolvedByIds:[]};F(P,Se),Be=V,he.push({entityType:"observation",entityId:V})}return}if(C.role!=="assistant")return;let re=C.jobId??`${P}:${ne}`,oe=M(I,"iteration",re,q),Ie=k.get(re),yt=C.cancelled?"cancelled":C.error?"failed":C.question?"question_asked":(C.resolutions?.length??0)>0?"completed":"no_change",ht={...U(oe,l,[H,{kind:"message",id:X},...(x.get(re)??[]).map(L=>({kind:"artifact",id:L}))]),createdAt:J(q),recordType:"iteration",threadIds:[z],startedAt:J(ie?.timestamp,q),completedAt:J(q),requestSummary:ot(ie?.feedbackSummary,ie?.replyToQuestion)??"[legacy request unavailable]",responseSummary:C.question??C.error??C.responseText?.slice(0,1e3),outcome:yt,execution:{provider:C.provider??Ie?.provider,model:C.model??Ie?.model,sessionId:C.sessionId??Ie?.sessionId},artifactIds:[X,...x.get(re)??[]]};F(P,ht),he.push({entityType:"iteration",entityId:oe});let Oe=C.resolutions??Ie?.resolutions??[];for(let[L,V]of Oe.entries()){if(V.status!=="resolved"||!V.summary?.trim())continue;let se=_.elementIdentifiers??[],Se=(se.length?se:[t]).map(Ye=>({subjectId:Ye===t?d:fe(Ye,O),role:"governed"})),ge=M(I,"proposal",`${re}:${V.annotationId??"resolution"}:${L}`,q),It={...U(ge,l,[H,{kind:"iteration",id:oe}]),createdAt:J(q),recordType:"proposal",state:"pending",claim:V.summary,subjects:Se,subjectSemantics:Se.length>1?"Legacy thread grouped these selected elements; independent scope requires owner review.":void 0,origin:{mode:"inferred",sourceText:ot(ie?.feedbackSummary,ie?.replyToQuestion,V.summary),iterationId:oe,inferredById:l}};F(P,It),he.push({entityType:"proposal",entityId:ge}),e.push({severity:"warning",code:"acceptance_unresolved",source:P,message:`Proposal ${ge} remains pending; legacy resolved status proves an outcome, not explicit acceptance.`})}if(Oe.some(L=>L.status==="resolved")||Ie?.gitDiff){let L=M(I,"implementation",re,q),V={...U(L,l,[H,{kind:"iteration",id:oe}]),createdAt:J(q),recordType:"implementation_attempt",state:"completed",iterationIds:[oe],coverageClaims:[],summary:Oe.map(se=>se.summary).filter(Boolean).join(" ")||"Legacy implementation outcome.",artifactIds:[]};F(P,V),he.push({entityType:"implementation_attempt",entityId:L}),Ge+=1}Be&&(Be=void 0)});let Xe=Qe.at(-1),ft={...U(z,f,[H]),createdAt:J(O),recordType:"thread",state:Xe?.question?"open":"resolved",messageArtifactIds:Q,outcome:Xe?.question?"question_unresolved":Ge?"implementation_only":"no_outcome",resultRefs:he};y.push(ft),S.set(P,[z,...S.get(P)??[]])}let G=Kt(p);G&&e.push({severity:"warning",code:"model_entries_deferred",source:".popmelt/model.json",message:`${G} model values were not promoted because their accepted decision provenance is unresolved.`});let ye={manifest:{formatVersion:1,projectId:r,createdAt:J(v),updatedAt:o,features:["authority","subjects","implementations","portable_artifacts","bounded_retrieval"],writer:{name:"@popmelt.com/core legacy importer",version:i.writerVersion??"0.8.4-dev"}},records:y,events:[],relationships:[],artifacts:R,tombstones:[]},W=Z(ye),w=(i.proofCaseIds??Ft).map(b=>({legacyId:b,threadFound:h.some(({key:_,value:P})=>(P.id??_)===b),decisionEnvelopeFound:k.has(b),recordIds:S.get(b)??[]}));return{bundle:ye,report:{projectRoot:t,source:{threads:h.length,messages:h.reduce((b,_)=>b+(_.value.messages?.length??0),0),decisionEnvelopes:T.length,modelEntries:G,artifactsReferenced:R.length},imported:Wt(y),unresolvedAcceptance:e.filter(b=>b.code==="acceptance_unresolved").length,deferredModelEntries:G,proofCases:w,issues:e,schemaIssues:W.issues}}}import{randomBytes as Qt}from"crypto";function $(i=Date.now()){let t=Math.max(0,Math.min(Math.floor(i),0xffffffffffff)).toString(16).padStart(12,"0"),n=Qt(10).toString("hex"),s=(Number.parseInt(n[3],16)&3|8).toString(16);return`${t.slice(0,8)}-${t.slice(8)}-7${n.slice(0,3)}-${s}${n.slice(4,7)}-${n.slice(7,19)}`}var Gt=()=>({records:[],events:[],relationships:[],artifacts:[],tombstones:[],projectionUpdates:[]});function st(i,e){let t=i.records.find(o=>o.recordType==="participant"&&o.kind==="human"&&o.status==="active"),n=i.records.find(o=>o.recordType==="participant"&&o.kind==="ai"&&o.status==="active");if(!t||!n)throw new Error("Canonical memory requires active human and AI participants before job capture.");let s=i.manifest.projectId,p=`${e.threadId}:${e.jobId}`,c=new Date(e.createdAt).toISOString(),u=new Date(e.completedAt).toISOString(),h=Gt(),m=h.records,j=i.records.find(o=>o.recordType==="thread"&&o.sourceRefs.some(y=>y.kind==="thread"&&y.id===e.threadId));j||(j={id:M(s,"live-thread",e.threadId,e.createdAt),schemaVersion:1,projectId:i.manifest.projectId,createdAt:c,participantId:t.id,sourceRefs:[{kind:"thread",id:e.threadId}],recordType:"thread",state:e.outcome==="question_asked"?"open":"resolved",messageArtifactIds:[],outcome:e.outcome==="question_asked"?"question_unresolved":e.resolutions.some(o=>o.status==="resolved")?"implementation_only":"no_outcome",resultRefs:[]},m.push(j));let T=[];for(let o of[...new Set(e.subjectHints.filter(Boolean))]){let y=i.records.find(R=>R.recordType==="subject"&&R.locators.some(a=>a.value===o&&a.status==="current"));y||(y={id:M(s,"live-subject",o,e.createdAt),schemaVersion:1,projectId:i.manifest.projectId,createdAt:c,participantId:t.id,sourceRefs:[{kind:"external",id:o}],recordType:"subject",subjectType:"element",label:o,aliases:[],locators:[{id:M(s,"live-locator",o,e.createdAt),kind:"dom_selector",value:o,status:"current",validFrom:c,sourceRefs:[{kind:"external",id:o}]}]},m.push(y)),T.push(y)}for(let o of[...new Set((e.filePaths??[]).filter(Boolean))]){let y=i.records.find(R=>R.recordType==="subject"&&R.locators.some(a=>a.kind==="source_file"&&a.value===o&&a.status==="current"));y||(y={id:M(s,"live-file-subject",o,e.createdAt),schemaVersion:1,projectId:i.manifest.projectId,createdAt:c,participantId:t.id,sourceRefs:[{kind:"external",id:o}],recordType:"subject",subjectType:"file",label:o,aliases:[],locators:[{id:M(s,"live-file-locator",o,e.createdAt),kind:"source_file",value:o,status:"current",validFrom:c,sourceRefs:[{kind:"external",id:o}]}]},m.push(y)),T.push(y)}let g=(e.semanticCandidates??[]).filter(o=>o.claim.trim()),v;if(g.length>0){v=M(s,"live-observation",p,e.createdAt);let o={id:v,schemaVersion:1,projectId:i.manifest.projectId,createdAt:c,participantId:t.id,sourceRefs:[{kind:"thread",id:e.threadId}],recordType:"observation",state:"open",statement:g.map(y=>y.claim.trim()).join(" "),captureContext:{subjectIds:T.map(y=>y.id),artifactIds:[]},resolvedByIds:[]};m.push(o)}let I=M(s,"live-iteration",p,e.completedAt),r={id:I,schemaVersion:1,projectId:i.manifest.projectId,createdAt:c,participantId:n.id,sourceRefs:[{kind:"thread",id:e.threadId},...v?[{kind:"record",id:v}]:[]],recordType:"iteration",threadIds:[j.id],startedAt:c,completedAt:u,requestSummary:e.requestSummary||"[request unavailable]",responseSummary:e.responseSummary?.slice(0,2e3),outcome:e.outcome,execution:e.execution,artifactIds:[]};m.push(r);let f=[],l=e.resolutions.filter(o=>o.status==="resolved"&&o.summary.trim()),d=T.length>0?T:i.records.filter(o=>o.recordType==="subject"&&o.subjectType==="project").slice(0,1);if(g.length>0&&d.length===0)throw new Error("Canonical memory has no project subject for an unscoped proposal.");for(let[o,y]of g.entries()){let R=M(s,"live-proposal",`${p}:${o}`,e.completedAt),a=d.map(k=>({subjectId:k.id,role:"governed"})),S={id:R,schemaVersion:1,projectId:i.manifest.projectId,createdAt:u,participantId:n.id,sourceRefs:[{kind:"iteration",id:I},{kind:"thread",id:e.threadId}],recordType:"proposal",state:"pending",claim:y.claim.trim(),rationale:y.rationale?.trim()||void 0,proposedKind:y.proposedKind,subjects:a,subjectSemantics:a.length>1?"The task selected these subjects together; independent authority remains unresolved.":void 0,origin:{mode:"inferred",sourceText:y.sourceText?.trim()||e.requestSummary,iterationId:I,inferredById:n.id}};m.push(S),f.push(R)}if(l.length>0){let o=new Set(e.governingDecisionIds??[]),y=i.records.filter(a=>a.recordType==="decision"&&a.state==="active"&&o.has(a.id)),R={id:M(s,"live-implementation",p,e.completedAt),schemaVersion:1,projectId:i.manifest.projectId,createdAt:u,participantId:n.id,sourceRefs:[{kind:"iteration",id:I}],recordType:"implementation_attempt",state:"completed",iterationIds:[I],coverageClaims:y.map(a=>({decisionId:a.id,coverage:"partial",claim:`This iteration applied the decision while completing: ${l.map(S=>S.summary).join(" ")}`,sourceRefs:[{kind:"iteration",id:I}]})),summary:l.map(a=>a.summary).join(" "),artifactIds:[]};m.push(R)}return{mutation:h,iterationId:I,proposalIds:f,observationId:v}}import{createHash as Xt}from"crypto";import{mkdir as Yt,open as Zt,readFile as ei,rename as ti,unlink as ii}from"fs/promises";import{join as at}from"path";function ct(i){return i.toLowerCase().replace(/[^a-z0-9]+/g," ").trim().replace(/\s+/g," ")}function dt(i){return Xt("sha256").update(JSON.stringify(i)).digest("hex")}async function ni(i,e){let t=`${i}.${process.pid}.${Date.now()}.tmp`,n=await Zt(t,"w");try{await n.writeFile(`${JSON.stringify(e,null,2)}
|
|
3
|
+
`,"utf8"),await n.sync()}finally{await n.close()}try{await ti(t,i)}catch(s){throw await ii(t).catch(()=>{}),s}}function ri(i,e,t=new Date().toISOString()){let n={},s={},p={},c=(h,m,j)=>{let T=h[m]??=[];T.includes(j)||T.push(j)};for(let h of i.records)if(h.recordType==="subject"){let m=h;for(let j of[m.label,...m.aliases,...m.locators.filter(T=>T.status==="current").map(T=>T.value)]){let T=ct(j);T&&c(n,T,m.id)}}else if(h.recordType==="decision"&&h.state==="active")for(let m of h.subjects)c(s,m.subjectId,h.id);else if(h.recordType==="proposal"&&["pending","deferred"].includes(h.state))for(let m of h.subjects)c(p,m.subjectId,h.id);let u={version:1,projectId:i.manifest.projectId,journalHead:e,generatedAt:t,subjectIdsByValue:n,decisionIdsBySubject:s,proposalIdsBySubject:p};return{...u,checksum:dt(u)}}function pt(i,e){let t=[...new Set(e.flatMap(n=>i.subjectIdsByValue[ct(n)]??[]))];if(t.length)return{subjectIds:t,decisionIds:[...new Set(t.flatMap(n=>i.decisionIdsBySubject[n]??[]))],proposalIds:[...new Set(t.flatMap(n=>i.proposalIdsBySubject[n]??[]))]}}var $e=class{constructor(e){this.indexDir=at(e,".popmelt","memory","indexes"),this.indexPath=at(this.indexDir,"retrieval-v1.json")}async ensure(e,t){try{let s=JSON.parse(await ei(this.indexPath,"utf8")),{checksum:p,...c}=s;if(s.version===1&&s.projectId===e.manifest.projectId&&s.journalHead.sequence===t.sequence&&s.journalHead.hash===t.hash&&p===dt(c))return s}catch(s){if(s.code!=="ENOENT"&&!(s instanceof SyntaxError))throw s}let n=ri(e,t);return await Yt(this.indexDir,{recursive:!0}),await ni(this.indexPath,n),n}};var xe="popmelt:imprint",mt="popmelt:imprint-evidence",le="popmelt:imprint-relation";function Ee(i){return i.sourceRefs.find(e=>e.kind==="external"&&e.uri===xe)?.id}function Ke(i){let e=new Set;return i.filter(t=>{let n=`${t.kind}:${t.id}:${t.uri??""}`;return e.has(n)?!1:(e.add(n),!0)})}function Ce(i,e){if(!i)return[];let t=new Set(i.relations.flatMap(n=>n.type==="instantiates"&&n.fromId===e?[n.toId]:[]));return i.concrete.filter(n=>t.has(n.id)).map(n=>({id:n.id,modelPath:n.modelPath,value:structuredClone(n.value),createdAt:n.createdAt,updatedAt:n.updatedAt}))}var We=class{constructor(e){this.projectRoot=e;this.store=new ve(e),this.indexStore=new $e(e),this.manifestPath=pe(e,".popmelt","memory","manifest.json")}async status(){try{let e=JSON.parse(await Re(this.manifestPath,"utf8"));return{initialized:!0,state:"ready",projectId:e.projectId,headSequence:e.head.sequence,updatedAt:e.updatedAt}}catch(e){if(e.code==="ENOENT")return{initialized:!1,state:this.runtimeState?.state??"absent",phase:this.runtimeState?.phase,error:this.runtimeState?.error};throw e}}beginAutomaticInitialization(e={}){return this.initializationPromise?this.initializationPromise:(this.initializationPromise=(async()=>{this.runtimeState={state:"initializing",phase:"analyzing_legacy"};try{if((await this.status()).initialized){let s=await this.store.load();return s.report.recoveredTransactions>0&&(s=await this.store.recover()),await this.refreshIndex(s),await this.status()}let n=await je({...e,projectRoot:this.projectRoot});if(n.report.schemaIssues.some(s=>s.severity==="error"))throw new Error("Legacy analysis produced schema errors; automatic initialization refused.");this.runtimeState={state:"initializing",phase:"writing_checkpoint"};try{await this.store.initialize(n.bundle)}catch(s){if(!(s instanceof Error)||!s.message.includes("already initialized"))throw s}return await this.refreshIndex(await this.store.load()),this.runtimeState={state:"ready"},await this.status()}catch(t){return this.runtimeState={state:"degraded",error:t instanceof Error?t.message:String(t)},await this.status()}})(),this.initializationPromise)}async analyzeLegacy(e={}){return(await je({...e,projectRoot:this.projectRoot})).report}async migrateImprintSnapshot(){if(this.initializationPromise&&await this.initializationPromise,!(await this.status()).initialized)return{migrated:!1,explanations:0,evidence:0};let e=pe(this.projectRoot,".popmelt","memory","migrations"),t=pe(e,"imprint-advisories-v2.json");try{let o=JSON.parse(await Re(t,"utf8"));return{migrated:!1,explanations:o.explanations??0,evidence:o.evidence??0}}catch{}let n;try{n=JSON.parse(await Re(pe(this.projectRoot,".popmelt","imprint","graph.json"),"utf8"))}catch{}if(!n?.explanations)return await lt(e,{recursive:!0}),await ut(t,JSON.stringify({version:2,migratedAt:new Date().toISOString(),explanations:0,evidence:0},null,2)),{migrated:!0,explanations:0,evidence:0};let s=await this.store.load(),p=s.bundle.records.find(o=>o.recordType==="participant"&&o.kind==="human"&&o.status==="active"),u=s.bundle.records.find(o=>o.recordType==="participant"&&o.kind==="ai"&&o.status==="active")??p,h=s.bundle.records.find(o=>o.recordType==="subject"&&o.subjectType==="project");if(!u||!h)return{migrated:!1,explanations:0,evidence:0};let m=s.bundle.manifest.projectId,j=new Set(s.bundle.records.map(o=>o.id)),T=new Set(s.bundle.relationships.flatMap(o=>o.sourceRefs.flatMap(y=>y.kind==="external"&&y.uri===le?[y.id]:[]))),g=new Map,v=s.bundle.records.filter(o=>o.recordType==="advisory_explanation");for(let o of n.explanations){let y=v.find(R=>Ee(R)===o.id);g.set(o.id,y?.id??M(m,"imprint-explanation",o.id,Date.parse(o.createdAt)))}let I=[],r=[],f=[],l=0;for(let o of n.explanations){let y=g.get(o.id),R=v.find(x=>x.id===y),a=[],S=o.evidence.length?o.evidence:[{id:`fallback:${o.id}`,kind:"observation",stance:"supports",summary:o.rationale,threadId:"imprint-migration",jobId:"imprint-migration",createdAt:o.createdAt}];for(let x of S){let E=M(m,"imprint-evidence-record",x.id,Date.parse(x.createdAt));a.push(E),!j.has(E)&&(I.push({id:E,schemaVersion:1,projectId:m,createdAt:x.createdAt,participantId:u.id,sourceRefs:Ke([{kind:"external",id:x.id,uri:mt},{kind:"external",id:o.id,uri:xe},{kind:"thread",id:x.threadId},{kind:"message",id:x.jobId}]),recordType:"evidence",kind:["confirmation","correction","exception","rejection"].includes(x.kind)?"user_feedback":"judgment",summary:x.summary,availability:"available",artifactIds:[]}),f.push({id:M(m,"imprint-evidence-link",`${o.id}:${x.id}`,Date.parse(x.createdAt)),schemaVersion:1,projectId:m,createdAt:x.createdAt,participantId:u.id,sourceRefs:[{kind:"external",id:x.id,uri:mt}],recordType:"relationship",relationshipType:"derived_from",from:{entityType:"advisory_explanation",entityId:y},to:{entityType:"evidence",entityId:E},reason:"This advisory explanation was derived from collaboration evidence."}),l+=1)}let k={id:y,schemaVersion:1,projectId:m,createdAt:R?.createdAt??o.createdAt,participantId:R?.participantId??u.id,sourceRefs:Ke([...R?.sourceRefs??[],{kind:"external",id:o.id,uri:xe}]),recordType:"advisory_explanation",kind:o.kind,state:o.state,statement:o.statement,rationale:o.rationale,scope:structuredClone(o.scope),subjectIds:[h.id],evidenceIds:[...new Set([...R?.evidenceIds??[],...a])],concreteBindings:Ce(n,o.id),supersededById:o.supersededBy?g.get(o.supersededBy):void 0,updatedAt:o.updatedAt};R?r.push(k):I.push(k)}for(let o of n.relations){let y=g.get(o.fromId),R=g.get(o.toId);!y||!R||T.has(o.id)||f.push({id:M(m,"imprint-relation",o.id,Date.parse(o.createdAt)),schemaVersion:1,projectId:m,createdAt:o.createdAt,participantId:u.id,sourceRefs:[{kind:"external",id:o.id,uri:le}],recordType:"relationship",relationshipType:o.type,from:{entityType:"advisory_explanation",entityId:y},to:{entityType:"advisory_explanation",entityId:R},reason:o.rationale||"The Imprint graph connected these explanations."})}let d=new Date().toISOString();if(I.length||r.length||f.length)try{let o=await this.store.commit({records:I,recordReplacements:r,events:[],relationships:f,artifacts:[],tombstones:[],projectionUpdates:[]},{transactionId:M(m,"imprint-advisories-v2",n.projectId,Date.parse(n.updatedAt)),committedAt:d});await this.refreshIndex(o)}catch(o){if(!(o instanceof Error)||!o.message.includes("Transaction already exists"))throw o}return await lt(e,{recursive:!0}),await ut(t,JSON.stringify({version:2,migratedAt:d,explanations:n.explanations.length,evidence:l,source:".popmelt/imprint (canonical cutover)"},null,2)),{migrated:!0,explanations:n.explanations.length,evidence:l}}async review(e,t={}){let n=await this.loadSource(t),s=await this.withIndexedCandidates(n,e);return{source:n.source,selection:Ue(n.bundle,s)}}async contextualize(e,t={}){let n=await this.loadSource(t),s=await this.withIndexedCandidates(n,e);return{source:n.source,actionPacket:nt(n.bundle,s),reviewSelection:Ue(n.bundle,s)}}async planReview(e,t={}){let n=await this.loadSource(t);return{source:n.source,result:Pe(n.bundle,e)}}async initializeFromLegacy(e){if(!e.confirmed)throw new Error("Explicit confirmation is required to initialize memory storage.");if((await this.status()).initialized)throw new Error("Memory storage is already initialized.");let t=await je({projectRoot:this.projectRoot,projectKey:e.projectKey,proofCaseIds:e.proofCaseIds,writerVersion:e.writerVersion});if(t.report.schemaIssues.some(n=>n.severity==="error"))throw new Error("Legacy analysis produced schema errors; initialization refused.");return await this.store.initialize(t.bundle),await this.refreshIndex(await this.store.load()),{status:await this.status(),report:t.report}}async commitReview(e,t){if(!(await this.status()).initialized)throw new Error("Memory storage is not initialized.");let n=await this.store.load(),s=Pe(n.bundle,e);if(!s.ok)throw new Error(`Owner review action is invalid: ${JSON.stringify(s.errors)}`);let p=await this.store.commitReviewPlan(s.plan,t);return await this.refreshIndex(p),p}async commitConversationalReview(e){if(this.initializationPromise&&await this.initializationPromise,!(await this.status()).initialized)return{status:"not_ready",action:e.action,proposalId:e.proposalId,message:"Canonical memory is not ready; the review was not committed."};let t=await this.store.load(),n=t.bundle.records.find(g=>g.recordType==="proposal"&&g.id===e.proposalId),s=t.bundle.records.find(g=>g.recordType==="participant"&&g.kind==="human"&&g.status==="active");if(!n||n.state!=="pending"||!s)return{status:"rejected",action:e.action,proposalId:e.proposalId,message:n?n.state!=="pending"?`The proposal is already ${n.state}.`:"No active local owner participant is available.":"The reviewed proposal no longer exists."};let p=Date.now(),c=new Date(p).toISOString(),u={proposalId:n.id,participantId:s.id,authority:{level:"owner",mode:"local_trusted"},occurredAt:c},h=e.action==="accept"?{...u,action:"accept",eventId:$(p),decisionId:$(p),kind:e.kind,reason:e.reason}:e.action==="edit_and_accept"?{...u,action:"edit_and_accept",withdrawalEventId:$(p),replacementProposalId:$(p),acceptanceEventId:$(p),decisionId:$(p),relationshipId:$(p),claim:e.claim,kind:e.kind,subjects:n.subjects,subjectSemantics:n.subjectSemantics,reason:e.reason}:e.action==="reject"?{...u,action:"reject",eventId:$(p),reason:e.reason}:{...u,action:"defer",eventId:$(p),reason:e.reason,context:{taskContext:e.taskContext,subjectIds:n.subjects.map(g=>g.subjectId),resurfaceWhen:e.resurfaceWhen?.length?e.resurfaceWhen:["different_action","owner_request"]}},m=Pe(t.bundle,h);if(!m.ok)return{status:"rejected",action:e.action,proposalId:e.proposalId,message:m.errors.map(g=>g.message).join(" ")};let j=await this.store.commitReviewPlan(m.plan,{transactionId:$(p),committedAt:c});await this.refreshIndex(j);let T=m.plan.resultRefs.find(g=>g.entityType==="decision")?.entityId;return{status:"committed",action:e.action,proposalId:e.proposalId,decisionId:T,message:e.action==="accept"||e.action==="edit_and_accept"?"Accepted product memory was committed.":e.action==="reject"?"Historical candidate was rejected.":"Historical candidate was deferred.",headSequence:j.report.headSequence}}async captureCompletedJob(e){if(this.initializationPromise&&await this.initializationPromise,!(await this.status()).initialized)return{status:"not_ready",proposalIds:[]};let t=await this.store.load(),n=st(t.bundle,e),s=M(t.bundle.manifest.projectId,"live-capture-transaction",`${e.threadId}:${e.jobId}`,e.completedAt);try{let p=await this.store.commit(n.mutation,{transactionId:s,committedAt:new Date(e.completedAt).toISOString()});return await this.refreshIndex(p),{status:"captured",iterationId:n.iterationId,proposalIds:n.proposalIds,headSequence:p.report.headSequence}}catch(p){if(p instanceof Error&&p.message.includes("Transaction already exists"))return{status:"duplicate",iterationId:n.iterationId,proposalIds:n.proposalIds};throw p}}async recordImprintEvidence(e){if(this.initializationPromise&&await this.initializationPromise,!(await this.status()).initialized||e.summary.changes.length===0)return;let t;try{t=JSON.parse(await Re(pe(this.projectRoot,".popmelt","imprint","graph.json"),"utf8"))}catch{}let n=await this.store.load(),s=n.bundle.records.find(d=>d.recordType==="participant"&&d.kind==="human"&&d.status==="active"),p=n.bundle.records.find(d=>d.recordType==="participant"&&d.kind==="ai"&&d.status==="active"),c=e.action?s:p??s,u=n.bundle.records.find(d=>d.recordType==="subject"&&d.subjectType==="project");if(!c||!u)return;let h=e.occurredAt??new Date().toISOString(),m=Date.parse(h),j=n.bundle.manifest.projectId,T=[],g=[],v=[],I=n.bundle.records.filter(d=>d.recordType==="advisory_explanation"),r=new Map(I.flatMap(d=>{let o=Ee(d);return o?[[o,d.id]]:[]}));for(let d of e.summary.changes)if(!r.has(d.explanationId)){let o=t?.explanations.find(y=>y.id===d.explanationId);r.set(d.explanationId,M(j,"imprint-explanation",d.explanationId,Date.parse(o?.createdAt??h)))}for(let d of e.summary.changes){let o={kind:"external",id:d.explanationId,uri:xe},y=r.get(d.explanationId),R=I.find(x=>x.id===y),a=t?.explanations.find(x=>x.id===d.explanationId),S={id:M(j,"imprint-live-evidence",`${e.summary.transactionId}:${d.explanationId}:${e.action??"automatic"}`,m),schemaVersion:1,projectId:j,createdAt:h,participantId:c.id,sourceRefs:[o,{kind:"thread",id:e.threadId},{kind:"message",id:e.jobId}],recordType:"evidence",kind:e.action?"user_feedback":"judgment",summary:e.action?`${e.action}: ${e.summary.detail}`:`${e.summary.kind}: ${e.summary.detail}`,availability:"available",artifactIds:[]};T.push(S);let k={id:y,schemaVersion:1,projectId:j,createdAt:R?.createdAt??a?.createdAt??h,participantId:R?.participantId??c.id,sourceRefs:Ke([...R?.sourceRefs??[],o,{kind:"thread",id:e.threadId},{kind:"message",id:e.jobId}]),recordType:"advisory_explanation",kind:a?.kind??R?.kind??"pattern",state:a?.state??d.state,statement:a?.statement??d.statement,rationale:a?.rationale??R?.rationale??e.summary.detail,scope:structuredClone(a?.scope??R?.scope??{kind:"project",values:[]}),subjectIds:R?.subjectIds??[u.id],evidenceIds:[...new Set([...R?.evidenceIds??[],S.id])],concreteBindings:a?Ce(t,d.explanationId):R?.concreteBindings??[],supersededById:a?.supersededBy?r.get(a.supersededBy):R?.supersededById,updatedAt:a?.updatedAt??h};R?g.push(k):T.push(k),v.push({id:M(j,"imprint-live-evidence-link",`${e.summary.transactionId}:${d.explanationId}:${e.action??"automatic"}`,m),schemaVersion:1,projectId:j,createdAt:h,participantId:c.id,sourceRefs:[o],recordType:"relationship",relationshipType:"derived_from",from:{entityType:"advisory_explanation",entityId:k.id},to:{entityType:"evidence",entityId:S.id},reason:e.action?"The developer grounding response updates this advisory explanation.":"The Imprint explanation was derived from this collaboration evidence."})}let f=new Set(n.bundle.relationships.flatMap(d=>d.sourceRefs.flatMap(o=>o.kind==="external"&&o.uri===le?[o.id]:[])));for(let d of t?.relations??[]){let o=r.get(d.fromId),y=r.get(d.toId);!o||!y||f.has(d.id)||v.push({id:M(j,"imprint-relation",d.id,Date.parse(d.createdAt)),schemaVersion:1,projectId:j,createdAt:d.createdAt,participantId:c.id,sourceRefs:[{kind:"external",id:d.id,uri:le}],recordType:"relationship",relationshipType:d.type,from:{entityType:"advisory_explanation",entityId:o},to:{entityType:"advisory_explanation",entityId:y},reason:d.rationale||"The Imprint graph connected these explanations."})}let l=M(n.bundle.manifest.projectId,"imprint-evidence",`${e.summary.transactionId}:${e.action??"automatic"}`,m);try{let d=await this.store.commit({records:T,recordReplacements:g,events:[],relationships:v,artifacts:[],tombstones:[],projectionUpdates:[]},{transactionId:l,committedAt:h});await this.refreshIndex(d)}catch(d){if(!(d instanceof Error)||!d.message.includes("Transaction already exists"))throw d}}async syncImprintGraph(){if(this.initializationPromise&&await this.initializationPromise,!(await this.status()).initialized)return{status:"not_ready",relationships:0,explanations:0};let e;try{e=JSON.parse(await Re(pe(this.projectRoot,".popmelt","imprint","graph.json"),"utf8"))}catch{return{status:"no_change",relationships:0,explanations:0}}let t=await this.store.load(),n=t.bundle.records.find(a=>a.recordType==="participant"&&a.kind==="human"&&a.status==="active"),p=t.bundle.records.find(a=>a.recordType==="participant"&&a.kind==="ai"&&a.status==="active")??n;if(!p)return{status:"not_ready",relationships:0,explanations:0};let c=t.bundle.records.find(a=>a.recordType==="subject"&&a.subjectType==="project");if(!c)return{status:"not_ready",relationships:0,explanations:0};let u=t.bundle.manifest.projectId,h=t.bundle.records.filter(a=>a.recordType==="advisory_explanation"),m=new Map(h.flatMap(a=>{let S=Ee(a);return S?[[S,a]]:[]})),j=new Map([...[...m].map(([a,S])=>[a,S.id]),...e.explanations.filter(a=>!m.has(a.id)).map(a=>[a.id,M(u,"imprint-explanation",a.id,Date.parse(a.createdAt))])]),T=[],g=[],v=new Set(e.explanations.map(a=>a.id));for(let a of e.explanations){let S=m.get(a.id);if(!S){T.push({id:j.get(a.id),schemaVersion:1,projectId:u,createdAt:a.createdAt,participantId:p.id,sourceRefs:[{kind:"external",id:a.id,uri:xe}],recordType:"advisory_explanation",kind:a.kind,state:a.state,statement:a.statement,rationale:a.rationale,scope:structuredClone(a.scope),subjectIds:[c.id],evidenceIds:[],concreteBindings:Ce(e,a.id),supersededById:a.supersededBy?j.get(a.supersededBy):void 0,updatedAt:a.updatedAt});continue}let k={...structuredClone(S),kind:a.kind,state:a.state,statement:a.statement,rationale:a.rationale,scope:structuredClone(a.scope),concreteBindings:Ce(e,a.id),supersededById:a.supersededBy?j.get(a.supersededBy):void 0,updatedAt:a.updatedAt},x=E=>JSON.stringify({kind:E.kind,state:E.state,statement:E.statement,rationale:E.rationale,scope:E.scope,concreteBindings:E.concreteBindings,supersededById:E.supersededById,updatedAt:E.updatedAt});x(S)!==x(k)&&g.push(k)}for(let[a,S]of m)v.has(a)||S.state==="retired"||g.push({...structuredClone(S),state:"retired",supersededById:void 0,updatedAt:e.updatedAt});let I=new Set(t.bundle.tombstones.flatMap(a=>a.objectType==="relationship"?[a.objectId]:[])),r=new Map(t.bundle.relationships.flatMap(a=>{if(I.has(a.id))return[];let S=a.sourceRefs.find(k=>k.kind==="external"&&k.uri===le)?.id;return S?[[S,a]]:[]})),f=new Set(r.keys()),l=[];for(let a of e.relations){let S=j.get(a.fromId),k=j.get(a.toId);!S||!k||f.has(a.id)||l.push({id:M(u,"imprint-relation",a.id,Date.parse(a.createdAt)),schemaVersion:1,projectId:u,createdAt:a.createdAt,participantId:p.id,sourceRefs:[{kind:"external",id:a.id,uri:le}],recordType:"relationship",relationshipType:a.type,from:{entityType:"advisory_explanation",entityId:S},to:{entityType:"advisory_explanation",entityId:k},reason:a.rationale||"The Imprint graph connected these explanations."})}let d=new Set(e.relations.map(a=>a.id)),o=n?[...r].filter(([a])=>!d.has(a)).map(([,a])=>({id:M(u,"imprint-relationship-tombstone",a.id,Date.parse(e.updatedAt)),schemaVersion:1,projectId:u,objectId:a.id,objectType:"relationship",deletedAt:e.updatedAt,deletedById:n.id,authority:{level:"owner",mode:"local_trusted"},reasonCategory:"serious_error",erasureLevel:"content",invalidates:[]})):[];if(!T.length&&!g.length&&!l.length&&!o.length)return{status:"no_change",relationships:0,explanations:0,headSequence:t.report.headSequence};let y=e.updatedAt,R=M(u,"imprint-graph-sync",e.head.hash??String(e.head.sequence),Date.parse(y));try{let a=await this.store.commit({records:T,recordReplacements:g,events:[],relationships:l,artifacts:[],tombstones:o,projectionUpdates:[]},{transactionId:R,committedAt:y});return await this.refreshIndex(a),{status:"synced",relationships:l.length+o.length,explanations:T.length+g.length,headSequence:a.report.headSequence}}catch(a){if(!(a instanceof Error)||!a.message.includes("Transaction already exists"))throw a;return{status:"no_change",relationships:0,explanations:0,headSequence:t.report.headSequence}}}async recover(e){if(!e)throw new Error("Explicit confirmation is required to recover the journal head.");if(!(await this.status()).initialized)throw new Error("Memory storage is not initialized.");let t=await this.store.recover();return await this.refreshIndex(t),t}async diagnostics(){let e=await this.status();if(!e.initialized)return{status:e};let t=await this.store.load();await this.refreshIndex(t);let n={};for(let s of t.bundle.records)n[s.recordType]=(n[s.recordType]??0)+1;return{status:e,journal:t.report,records:n,openFreshnessSignals:t.bundle.records.filter(s=>s.recordType==="freshness_signal"&&s.state==="open").length,unavailableEvidence:t.bundle.records.filter(s=>s.recordType==="evidence"&&s.availability!=="available").length}}async getProjectableDecisions(e=12){if(this.initializationPromise&&await this.initializationPromise,!(await this.status()).initialized)return[];let{bundle:t}=await this.store.load(),n=new Set(t.records.flatMap(c=>c.recordType==="model_projection"&&c.state==="applied"?c.coverage.filter(u=>u.status==="projected").map(u=>u.decisionId):[])),s=new Set(t.relationships.flatMap(c=>c.relationshipType==="contradicts"&&c.from.entityType==="decision"&&c.to.entityType==="decision"?[c.from.entityId,c.to.entityId]:[])),p=new Set(t.records.flatMap(c=>c.recordType==="freshness_signal"&&c.state==="open"&&c.target.entityType==="decision"?[c.target.entityId]:[]));return t.records.filter(c=>c.recordType==="decision"&&c.state==="active"&&!n.has(c.id)&&!s.has(c.id)&&!p.has(c.id)).sort((c,u)=>u.createdAt.localeCompare(c.createdAt)).slice(0,Math.max(1,e))}async getCanonicalModelEntries(){if(!(await this.status()).initialized)return[];let{bundle:e}=await this.store.load(),t=new Set(e.records.flatMap(s=>s.recordType==="decision"&&s.state==="active"?[s.id]:[])),n=new Map;for(let s of e.records.filter(p=>p.recordType==="model_entry").sort((p,c)=>p.createdAt.localeCompare(c.createdAt)))s.decisionIds.some(p=>t.has(p))&&n.set(s.key,s);return[...n.values()]}async getImprintView(e=[]){let t=()=>({head:{sequence:0,updatedAt:new Date(0).toISOString()},counts:{total:0,emerging:0,testing:0,grounded:0,challenged:0,retired:0,needsGrounding:0},explanations:[]});if(!(await this.status()).initialized)return t();let n=await this.store.load(),s=n.bundle.records.filter(r=>r.recordType==="advisory_explanation"),p=new Map(s.map(r=>[r.id,r])),c=new Map(s.flatMap(r=>{let f=Ee(r);return f?[[f,r.id]]:[]})),u=new Set(e.map(r=>c.get(r)??r)),h=new Map(n.bundle.records.flatMap(r=>r.recordType==="participant"?[[r.id,r.kind]]:[])),m=new Map(n.bundle.records.flatMap(r=>r.recordType==="evidence"?[[r.id,r]]:[])),j=new Set(n.bundle.tombstones.flatMap(r=>r.objectType==="relationship"?[r.objectId]:[])),T=new Set(["operationalizes","refines","supports","contradicts","excepts","instantiates","supersedes"]),g={testing:0,emerging:1,grounded:2,challenged:3,retired:4},v=s.map(r=>{let f=r.evidenceIds.flatMap(o=>{let y=m.get(o);if(!y)return[];let R=y.sourceRefs.find(x=>x.kind==="thread")?.id,a=y.sourceRefs.find(x=>x.kind==="message")?.id,S=y.kind==="judgment"||y.kind==="user_feedback"||y.kind==="project_state"?y.kind:"other",k=h.get(y.participantId)??"unknown";return[{id:y.id,kind:S,summary:y.summary,createdAt:y.createdAt,participantKind:k,threadId:R,jobId:a}]}).sort((o,y)=>y.createdAt.localeCompare(o.createdAt)),l=n.bundle.relationships.flatMap(o=>{if(j.has(o.id))return[];if(!T.has(o.relationshipType))return[];let y=o.from.entityType==="advisory_explanation"&&o.from.entityId===r.id&&o.to.entityType==="advisory_explanation",R=o.to.entityType==="advisory_explanation"&&o.to.entityId===r.id&&o.from.entityType==="advisory_explanation";if(!y&&!R)return[];let a=y?o.to.entityId:o.from.entityId,S=p.get(a);return S?[{id:o.id,type:o.relationshipType,direction:y?"outgoing":"incoming",explanationId:S.id,statement:S.statement,rationale:o.reason}]:[]}),d=[...new Set([...r.sourceRefs.flatMap(o=>o.kind==="thread"?[o.id]:[]),...f.flatMap(o=>o.threadId?[o.threadId]:[])])];return{id:r.id,kind:r.kind,state:r.state,statement:r.statement,rationale:r.rationale,scope:structuredClone(r.scope),createdAt:r.createdAt,updatedAt:r.updatedAt,evidenceCount:f.length,recentEvidence:f.slice(0,4),concrete:r.concreteBindings.map(o=>({...structuredClone(o)})),relations:l,sourceThreadIds:d,needsGrounding:r.state==="testing"&&u.has(r.id)}}).sort((r,f)=>Number(f.needsGrounding)-Number(r.needsGrounding)||g[r.state]-g[f.state]||f.updatedAt.localeCompare(r.updatedAt)),I={total:v.filter(r=>r.state!=="retired").length,emerging:v.filter(r=>r.state==="emerging").length,testing:v.filter(r=>r.state==="testing").length,grounded:v.filter(r=>r.state==="grounded").length,challenged:v.filter(r=>r.state==="challenged").length,retired:v.filter(r=>r.state==="retired").length,needsGrounding:v.filter(r=>r.needsGrounding).length};return{head:{sequence:n.report.headSequence,updatedAt:n.bundle.manifest.updatedAt},counts:I,explanations:v}}async getModelView(){if(!(await this.status()).initialized)return{decisions:[],entries:[]};let{bundle:e}=await this.store.load(),t=new Set(e.records.flatMap(u=>u.recordType==="decision"&&u.state==="active"?[u.id]:[])),n=new Map;for(let u of e.records.filter(h=>h.recordType==="model_entry").sort((h,m)=>h.createdAt.localeCompare(m.createdAt)))u.decisionIds.some(h=>t.has(h))&&n.set(u.key,u);let s=[...n.values()],p=e.records.filter(u=>u.recordType==="verification_attempt");return{decisions:e.records.filter(u=>u.recordType==="decision"&&u.state==="active").map(u=>{let h=p.filter(m=>m.targets.some(j=>j.entityType==="decision"&&j.entityId===u.id)).sort((m,j)=>j.createdAt.localeCompare(m.createdAt))[0];return{id:u.id,kind:u.kind,claim:u.claim,projected:s.some(m=>m.decisionIds.includes(u.id)),verification:h?h.state:"unverified"}}),entries:s.map(u=>({id:u.id,key:u.key,value:u.value,decisionIds:u.decisionIds}))}}async recordDirectModelMutation(e){if(this.initializationPromise&&await this.initializationPromise,!(await this.status()).initialized)throw new Error("Canonical memory is not ready.");let t=await this.store.load(),n=t.bundle.records.find(x=>x.recordType==="participant"&&x.kind==="human"&&x.status==="active"),s=t.bundle.records.find(x=>x.recordType==="subject"&&x.subjectType==="project");if(!n||!s)throw new Error("Canonical owner or project subject is unavailable.");let p=Date.now(),c=new Date(p).toISOString(),u=$(p),h=$(p),m=$(p),j=$(p),T=$(p),g=new Set(t.bundle.records.flatMap(x=>x.recordType==="model_entry"&&x.key===e.key?x.decisionIds:[])),v=t.bundle.records.filter(x=>x.recordType==="decision"&&x.state==="active"&&g.has(x.id)),I={schemaVersion:1,projectId:t.bundle.manifest.projectId,createdAt:c,participantId:n.id,sourceRefs:[{kind:"external",id:e.key,uri:"popmelt:model-pane"}]},r=[{subjectId:s.id,role:"governed"}],f={...I,id:u,recordType:"proposal",state:"accepted",claim:e.claim,proposedKind:"rule",subjects:r,origin:{mode:"declared",sourceText:e.claim,reviewedById:n.id}},l={...I,id:h,recordType:"lifecycle_event",entity:{entityType:"proposal",entityId:u},eventType:"accept",fromState:"pending",toState:"accepted",authority:{level:"owner",mode:"local_trusted"},reason:"The owner explicitly changed the projected model in the Model pane."},d={...I,id:m,recordType:"decision",proposalId:u,acceptanceEventId:h,acceptedById:n.id,authority:{level:"owner",mode:"local_trusted"},state:"active",kind:"rule",claim:e.claim,subjects:r,noChange:!1,effectiveAt:c},o={...I,id:j,recordType:"model_entry",key:e.key,subjectIds:[s.id],decisionIds:[m],value:e.value},y={...I,id:T,recordType:"model_projection",state:"applied",runId:`model-pane:${e.key}:${p}`,appliedById:n.id,authority:{level:"owner",mode:"local_trusted"},appliedAt:c,decisionIds:[m],entryIds:[j],coverage:[{decisionId:m,status:"projected"}]},R={...I,id:$(p),recordType:"relationship",relationshipType:"derived_from",from:{entityType:"model_entry",entityId:j},to:{entityType:"decision",entityId:m},reason:"The model change is projected from the owner-confirmed decision."},a=v.map(x=>({...I,id:$(p),recordType:"lifecycle_event",entity:{entityType:"decision",entityId:x.id},eventType:"decision.superseded",fromState:"active",toState:"superseded",authority:{level:"owner",mode:"local_trusted"},reason:`A newer explicit model declaration replaced ${e.key}.`})),S=v.map(x=>({...I,id:$(p),recordType:"relationship",relationshipType:"supersedes",from:{entityType:"decision",entityId:d.id},to:{entityType:"decision",entityId:x.id},reason:`The owner replaced the previous declaration for ${e.key}.`,authority:{level:"owner",mode:"local_trusted"}})),k=await this.store.commit({records:[f,d,o,y],events:[l,...a],relationships:[R,...S],artifacts:[],tombstones:[],projectionUpdates:v.map(x=>({entityType:"decision",entityId:x.id,fromState:"active",state:"superseded"}))},{transactionId:$(p),committedAt:c});return await this.refreshIndex(k),{decisionId:m,entryId:j}}async findPendingProposalForLegacyDecision(e){if(!(await this.status()).initialized)return null;let{bundle:t}=await this.store.load(),n=t.records.find(s=>s.recordType==="proposal"&&s.state==="pending"&&s.sourceRefs.some(p=>p.id===e));return n?{proposalId:n.id,claim:n.claim}:null}async applyModelProjection(e){if(this.initializationPromise&&await this.initializationPromise,!(await this.status()).initialized)throw new Error("Canonical memory is not ready.");if(e.changes.length===0)throw new Error("A model projection requires selected changes.");let t=await this.store.load(),n=t.bundle.records.find(I=>I.recordType==="model_projection"&&I.state==="applied"&&I.runId===e.runId);if(n)return{projectionId:n.id,entryIds:n.entryIds,headSequence:t.report.headSequence};let s=t.bundle.records.filter(I=>I.recordType==="decision"&&e.decisionIds.includes(I.id)&&I.state==="active");if(s.length!==new Set(e.decisionIds).size)throw new Error("Model projection references a missing or inactive canonical decision.");let p=t.bundle.records.find(I=>I.recordType==="participant"&&I.kind==="human"&&I.status==="active");if(!p)throw new Error("No active local owner participant is available.");let c=Date.now(),u=new Date(c).toISOString(),h=$(c),m=e.changes.map(I=>{let r=I.decisionIds?.filter(d=>e.decisionIds.includes(d)),f=r?.length?r:e.decisionIds,l=[...new Set(s.filter(d=>f.includes(d.id)).flatMap(d=>d.subjects.map(o=>o.subjectId)))];return{id:$(c),schemaVersion:1,projectId:t.bundle.manifest.projectId,createdAt:u,participantId:p.id,sourceRefs:f.map(d=>({kind:"record",id:d})),recordType:"model_entry",key:I.path.map(String).join("."),subjectIds:l,decisionIds:f,value:I.value}}),j=new Set(m.flatMap(I=>I.decisionIds)),T={id:h,schemaVersion:1,projectId:t.bundle.manifest.projectId,createdAt:u,participantId:p.id,sourceRefs:e.decisionIds.map(I=>({kind:"record",id:I})),recordType:"model_projection",state:"applied",runId:e.runId,presentationJobId:e.presentationJobId,appliedById:p.id,authority:{level:"owner",mode:"local_trusted"},appliedAt:u,decisionIds:e.decisionIds,entryIds:m.map(I=>I.id),coverage:e.decisionIds.map(I=>e.coverage?.find(r=>r.decisionId===I)??{decisionId:I,status:j.has(I)?"projected":"unprojected"})},g=m.flatMap(I=>I.decisionIds.map(r=>({id:$(c),schemaVersion:1,projectId:t.bundle.manifest.projectId,createdAt:u,participantId:p.id,sourceRefs:[{kind:"record",id:T.id}],recordType:"relationship",relationshipType:"derived_from",from:{entityType:"model_entry",entityId:I.id},to:{entityType:"decision",entityId:r},reason:"The owner applied this model entry as a projection of accepted product truth."}))),v=await this.store.commit({records:[...m,T],events:[],relationships:g,artifacts:[],tombstones:[],projectionUpdates:[]},{transactionId:$(c),committedAt:u});return await this.refreshIndex(v),{projectionId:h,entryIds:m.map(I=>I.id),headSequence:v.report.headSequence}}async loadSource(e){if((await this.status()).initialized){let t=await this.store.load();return{source:"journal",bundle:t.bundle,journal:t.report}}return{source:"legacy_preview",bundle:(await je({...e,projectRoot:this.projectRoot})).bundle}}async withIndexedCandidates(e,t){if(e.source!=="journal"||!e.journal)return t;let n=await this.indexStore.ensure(e.bundle,{sequence:e.journal.headSequence,hash:e.journal.headHash}),s=pt(n,t.subjectHints??[]);return s?{...t,subjectIds:[...new Set([...t.subjectIds??[],...s.subjectIds])],candidateDecisionIds:s.decisionIds,candidateProposalIds:s.proposalIds}:t}async refreshIndex(e){await this.indexStore.ensure(e.bundle,{sequence:e.report.headSequence,hash:e.report.headHash}),e.report.headSequence-e.report.checkpointSequence>=250&&await this.store.rotateCheckpoint()}};function me(i){if(!i||typeof i!="object"||Array.isArray(i))throw new Error("Expected a JSON object.");return i}function D(i,e){if(typeof i!="string"||!i.trim())throw new Error(`${e} must be a non-empty string.`);return i}function ue(i,e,t){let n=D(i,e);if(!t.includes(n))throw new Error(`${e} is invalid.`);return n}function oi(i){let e=me(i),t=me(e.authority),n=t.level,s=t.mode,p=ue(n,"authority.level",["owner","delegate","contributor"]),c=ue(s,"authority.mode",["local_trusted","hosted"]),u={proposalId:D(e.proposalId,"proposalId"),participantId:D(e.participantId,"participantId"),occurredAt:D(e.occurredAt,"occurredAt"),authority:{level:p,mode:c,grantId:typeof t.grantId=="string"?t.grantId:void 0}};switch(e.action){case"accept":return{...u,action:"accept",eventId:D(e.eventId,"eventId"),decisionId:D(e.decisionId,"decisionId"),kind:ue(e.kind,"kind",["principle","preference","rule","constraint"]),reason:D(e.reason,"reason"),rationale:typeof e.rationale=="string"?e.rationale:void 0};case"reject":return{...u,action:"reject",eventId:D(e.eventId,"eventId"),reason:D(e.reason,"reason")};case"defer":{let h=me(e.context);if(!Array.isArray(h.subjectIds)||!Array.isArray(h.resurfaceWhen))throw new Error("Deferral context requires subjectIds and resurfaceWhen arrays.");return{...u,action:"defer",eventId:D(e.eventId,"eventId"),reason:typeof e.reason=="string"?e.reason:void 0,context:{taskContext:typeof h.taskContext=="string"?h.taskContext:void 0,subjectIds:h.subjectIds.map(m=>D(m,"subjectId")),resurfaceWhen:h.resurfaceWhen.map(m=>ue(m,"resurfaceWhen",["different_action","new_evidence","new_conflict","owner_request","after_date"])),revisitAfter:typeof h.revisitAfter=="string"?h.revisitAfter:void 0}}}case"edit_and_accept":{if(!Array.isArray(e.subjects))throw new Error("subjects must be an array.");return{...u,action:"edit_and_accept",withdrawalEventId:D(e.withdrawalEventId,"withdrawalEventId"),replacementProposalId:D(e.replacementProposalId,"replacementProposalId"),acceptanceEventId:D(e.acceptanceEventId,"acceptanceEventId"),decisionId:D(e.decisionId,"decisionId"),relationshipId:D(e.relationshipId,"relationshipId"),claim:D(e.claim,"claim"),kind:ue(e.kind,"kind",["principle","preference","rule","constraint"]),subjects:e.subjects.map(h=>{let m=me(h);return{subjectId:D(m.subjectId,"subjectId"),role:ue(m.role,"role",["governed","consumer","provider","context"])}}),subjectSemantics:typeof e.subjectSemantics=="string"?e.subjectSemantics:void 0,rationale:typeof e.rationale=="string"?e.rationale:void 0,reason:D(e.reason,"reason")}}default:throw new Error("Unsupported owner review action.")}}function si(i){let e=me(i),t=(p,c)=>{if(p!==void 0){if(!Array.isArray(p))throw new Error(`${c} must be an array.`);return p.map(u=>D(u,c))}},n=(p,c)=>{if(p!==void 0){if(typeof p!="number"||!Number.isFinite(p)||p<=0)throw new Error(`${c} must be a positive number.`);return p}},s=e.resurface===void 0?void 0:me(e.resurface);if(e.generatedAt!==void 0&&(typeof e.generatedAt!="string"||Number.isNaN(Date.parse(e.generatedAt))))throw new Error("generatedAt must be an ISO-8601 timestamp.");return{action:typeof e.action=="string"?e.action:void 0,text:typeof e.text=="string"?e.text:void 0,subjectIds:t(e.subjectIds,"subjectIds"),subjectHints:t(e.subjectHints,"subjectHints"),maxPackets:n(e.maxPackets,"maxPackets"),maxEstimatedTokens:n(e.maxEstimatedTokens,"maxEstimatedTokens"),generatedAt:typeof e.generatedAt=="string"?e.generatedAt:void 0,resurface:s?{differentAction:s.differentAction===!0,newEvidence:s.newEvidence===!0,newConflict:s.newConflict===!0,ownerRequested:s.ownerRequested===!0}:void 0}}export{ve as MemoryJournalStore,We as MemoryService,Ve as computeTransactionHash,si as parseContextualReviewQuery,oi as parseOwnerReviewCommand};
|
package/dist/memory.d.mts
CHANGED
|
@@ -216,12 +216,15 @@ type VerificationTarget = {
|
|
|
216
216
|
entityType: 'decision' | 'implementation_attempt' | 'model_entry';
|
|
217
217
|
entityId: MemoryId;
|
|
218
218
|
};
|
|
219
|
+
/** @deprecated Retained only so existing memory journals remain readable. */
|
|
219
220
|
type EvalSpecState = 'draft' | 'active' | 'retired';
|
|
221
|
+
/** @deprecated Retained only so existing memory journals remain readable. */
|
|
220
222
|
type EvalDependency = {
|
|
221
223
|
kind: 'model_path' | 'source_file' | 'route' | 'subject';
|
|
222
224
|
value: string;
|
|
223
225
|
subjectId?: MemoryId;
|
|
224
226
|
};
|
|
227
|
+
/** @deprecated Retained only so existing memory journals remain readable. */
|
|
225
228
|
type EvalScenario = {
|
|
226
229
|
id: string;
|
|
227
230
|
label?: string;
|
|
@@ -244,6 +247,7 @@ type EvalScenario = {
|
|
|
244
247
|
value?: string;
|
|
245
248
|
}>;
|
|
246
249
|
};
|
|
250
|
+
/** @deprecated Retained only so existing memory journals remain readable. */
|
|
247
251
|
type EvalSpecRecord = Provenance & {
|
|
248
252
|
recordType: 'eval_spec';
|
|
249
253
|
state: EvalSpecState;
|
|
@@ -283,7 +287,7 @@ type VerificationAttemptRecord = Provenance & {
|
|
|
283
287
|
targets: VerificationTarget[];
|
|
284
288
|
summary?: string;
|
|
285
289
|
evidenceIds: MemoryId[];
|
|
286
|
-
/**
|
|
290
|
+
/** @deprecated Historical presentation data retained for journal compatibility. */
|
|
287
291
|
evalRun?: {
|
|
288
292
|
id: string;
|
|
289
293
|
threadId?: string;
|
|
@@ -481,15 +485,6 @@ type RetrievalPacket = {
|
|
|
481
485
|
value: JsonValue;
|
|
482
486
|
decisionIds: MemoryId[];
|
|
483
487
|
}>;
|
|
484
|
-
evalSpecs: Array<{
|
|
485
|
-
id: MemoryId;
|
|
486
|
-
legacyId: string;
|
|
487
|
-
state: EvalSpecState;
|
|
488
|
-
title: string;
|
|
489
|
-
assertionCount: number;
|
|
490
|
-
decisionIds: MemoryId[];
|
|
491
|
-
expansionRef: SourceReference;
|
|
492
|
-
}>;
|
|
493
488
|
decisions: RetrievalDecision[];
|
|
494
489
|
conflicts: RetrievalConflict[];
|
|
495
490
|
uncertainties: RetrievalUncertainty[];
|