@manifesto-ai/governance 3.6.0 → 3.8.0

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 CHANGED
@@ -4,14 +4,14 @@
4
4
 
5
5
  `@manifesto-ai/governance` is the package that turns a composable manifesto into a governed world. Its canonical public entry is `withGovernance(manifesto, config)`.
6
6
 
7
- > **Current Contract Note:** The current package contract is [docs/governance-SPEC.md](docs/governance-SPEC.md). The v2.0.0 governance spec remains as the historical service-first baseline.
7
+ > **Current Contract Note:** The current package contract is [docs/governance-SPEC.md](docs/governance-SPEC.md). The v2.0.0 governance spec remains as the historical service-first baseline. The current root surface also includes the additive `waitForProposal()` observer helper.
8
8
 
9
9
  ## Canonical Runtime Path
10
10
 
11
11
  ```ts
12
12
  import { createManifesto } from "@manifesto-ai/sdk";
13
13
  import { createInMemoryLineageStore, withLineage } from "@manifesto-ai/lineage";
14
- import { withGovernance } from "@manifesto-ai/governance";
14
+ import { waitForProposal, withGovernance } from "@manifesto-ai/governance";
15
15
 
16
16
  const governed = withGovernance(
17
17
  withLineage(createManifesto<CounterDomain>(schema, effects), {
@@ -34,6 +34,7 @@ const governed = withGovernance(
34
34
  const proposal = await governed.proposeAsync(
35
35
  governed.createIntent(governed.MEL.actions.increment),
36
36
  );
37
+ const settlement = await waitForProposal(governed, proposal);
37
38
  ```
38
39
 
39
40
  ## What This Package Owns
@@ -41,6 +42,7 @@ const proposal = await governed.proposeAsync(
41
42
  - `withGovernance()` and the activated `GovernanceInstance`
42
43
  - proposal lifecycle and authority evaluation
43
44
  - pending human/tribunal resolution through `approve()` / `reject()`
45
+ - additive proposal-settlement observation through `waitForProposal()`
44
46
  - governance decision records and post-commit governance events
45
47
  - lineage-preserving query access such as `getWorldSnapshot()`, `getLatestHead()`, and `getBranches()`
46
48
  - low-level governance stores, services, authority handlers, and intent-instance helpers via `@manifesto-ai/governance/provider`
@@ -49,6 +51,7 @@ const proposal = await governed.proposeAsync(
49
51
 
50
52
  - direct `dispatchAsync` and `commitAsync` no longer exist
51
53
  - the canonical state-change path becomes `proposeAsync() -> approve()/reject()`
54
+ - `waitForProposal()` is an additive observation helper, not a replacement for `proposeAsync()`
52
55
  - lineage must be composed before governance activation
53
56
  - visible snapshots publish only after approved execution seals successfully
54
57
  - `getWorldSnapshot(worldId)` remains the stored sealed canonical snapshot lookup; `restore(worldId)` remains the normalized resume path inherited from lineage
@@ -0,0 +1 @@
1
+ function P(t){return t??`prop-${crypto.randomUUID()}`}function u(t){return t??`dec-${crypto.randomUUID()}`}function G(t,e=1){return`${t}:${e}`}var M=({proposalId:t,attempt:e})=>G(t,e);function E(){return{emit(){}}}function z(t){return"body"in t?{type:t.body.type,input:t.body.input,intentId:t.intentId}:{type:t.type,input:t.input,intentId:t.intentId}}var W=["submitted","evaluating"],j=["approved","executing"],O=["rejected","completed","failed","superseded"],Q=["approved","rejected"],b={submitted:["evaluating","rejected","superseded"],evaluating:["approved","rejected","superseded"],approved:["executing"],rejected:[],executing:["completed","failed"],completed:[],failed:[],superseded:[]};function A(t){return W.includes(t)}function c(t){return j.includes(t)}function X(t){return O.includes(t)}function x(t,e){return b[t].includes(e)}function S(t){return[...b[t]]}function w(t,e){return t==="submitted"&&e==="rejected"||t==="evaluating"&&e==="approved"||t==="evaluating"&&e==="rejected"}function l(t){return structuredClone(t)}var y=class{proposals=new Map;decisions=new Map;actorBindings=new Map;async putProposal(e){this.proposals.set(e.proposalId,l(e))}async getProposal(e){return l(this.proposals.get(e)??null)}async getProposalsByBranch(e){return[...this.proposals.values()].filter(r=>r.branchId===e).sort((r,o)=>r.submittedAt!==o.submittedAt?r.submittedAt-o.submittedAt:r.proposalId.localeCompare(o.proposalId)).map(r=>l(r))}async getExecutionStageProposal(e){let r=(await this.getProposalsByBranch(e)).filter(o=>c(o.status));if(r.length>1)throw new Error(`GOV-STORE-4 violation: multiple execution-stage proposals found for branch ${e}`);return r[0]??null}async putDecisionRecord(e){this.decisions.set(e.decisionId,l(e))}async getDecisionRecord(e){return l(this.decisions.get(e)??null)}async putActorBinding(e){this.actorBindings.set(e.actorId,l(e))}async getActorBinding(e){return l(this.actorBindings.get(e)??null)}async getActorBindings(){return[...this.actorBindings.values()].sort((e,r)=>e.actorId.localeCompare(r.actorId)).map(e=>l(e))}snapshotState(){return{proposals:l(this.proposals),decisions:l(this.decisions),actorBindings:l(this.actorBindings)}}restoreState(e){this.proposals.clear();for(let[r,o]of e.proposals)this.proposals.set(r,l(o));this.decisions.clear();for(let[r,o]of e.decisions)this.decisions.set(r,l(o));this.actorBindings.clear();for(let[r,o]of e.actorBindings)this.actorBindings.set(r,l(o))}};function Z(){return new y}var m=class{async evaluate(e,r){if(r.policy.mode!=="auto_approve")throw new Error(`AutoApproveHandler received non-auto_approve policy: ${r.policy.mode}`);return{kind:"approved",approvedScope:e.intent.scopeProposal??null}}};function R(){return new m}var h=class{pendingDecisions=new Map;notificationCallbacks=new Set;onPendingDecision(e){return this.notificationCallbacks.add(e),()=>{this.notificationCallbacks.delete(e)}}async evaluate(e,r){if(r.policy.mode!=="hitl")throw new Error(`HITLHandler received non-hitl policy: ${r.policy.mode}`);let o=r.policy,n=e.proposalId;if(this.pendingDecisions.has(n))throw new Error(`Proposal ${n} already has a pending HITL decision`);return new Promise((i,a)=>{let s={proposalId:n,proposal:e,resolve:i,reject:a};o.timeout!=null&&(s.timeoutId=setTimeout(()=>{if(this.pendingDecisions.delete(n),o.onTimeout==="approve"){i({kind:"approved",approvedScope:e.intent.scopeProposal??null});return}a(new Error(`HITL decision timed out after ${o.timeout}ms for proposal '${n}'`))},o.timeout)),this.pendingDecisions.set(n,s);for(let p of this.notificationCallbacks)p(n,e,r)})}submitDecision(e,r,o,n){let i=this.pendingDecisions.get(e);if(!i)throw new Error(`No pending HITL decision for proposal ${e}`);if(i.timeoutId&&clearTimeout(i.timeoutId),this.pendingDecisions.delete(e),r==="approved"){i.resolve({kind:"approved",approvedScope:n!==void 0?n:i.proposal?.intent.scopeProposal??null});return}i.resolve({kind:"rejected",reason:o??"Human rejected"})}isPending(e){return this.pendingDecisions.has(e)}getPendingIds(){return[...this.pendingDecisions.keys()]}clearAllPending(){for(let[e,r]of this.pendingDecisions)r.timeoutId&&clearTimeout(r.timeoutId),r.reject(new Error(`HITL handler cleared pending proposal ${e}`));this.pendingDecisions.clear()}};function T(){return new h}var v=class{customEvaluators=new Map;registerCustomEvaluator(e,r){this.customEvaluators.set(e,r)}async evaluate(e,r){if(r.policy.mode!=="policy_rules")throw new Error(`PolicyRulesHandler received non-policy_rules policy: ${r.policy.mode}`);let o=e.intent.scopeProposal??null;for(let n of r.policy.rules)if(this.evaluateCondition(n.condition,e,r))return this.applyDecision(n,o);return this.applyDecision({decision:r.policy.defaultDecision,reason:"Default policy decision"},o)}evaluateCondition(e,r,o){switch(e.kind){case"intent_type":return e.types.includes(r.intent.type);case"scope_pattern":return this.matchPattern(r.intent.type,e.pattern);case"custom":{let n=this.customEvaluators.get(e.evaluator);return n?n(r,o):!1}}}matchPattern(e,r){return new RegExp(`^${r.replace(/\*/g,".*").replace(/\?/g,".")}$`).test(e)}applyDecision(e,r){switch(e.decision){case"approve":return{kind:"approved",approvedScope:r};case"reject":return{kind:"rejected",reason:e.reason??"Policy rejection"};case"escalate":return{kind:"rejected",reason:e.reason??"Policy requires escalation (not implemented)"}}}};function k(){return new v}var I=class{pendingTribunals=new Map;notificationCallback;onPendingTribunal(e){this.notificationCallback=e}async evaluate(e,r){if(r.policy.mode!=="tribunal")throw new Error(`TribunalHandler received non-tribunal policy: ${r.policy.mode}`);let o=r.policy,n=e.proposalId;if(this.pendingTribunals.has(n))throw new Error(`Proposal ${n} already has a pending tribunal`);return new Promise((i,a)=>{let s={proposalId:n,proposal:e,binding:r,votes:new Map,resolve:i,reject:a};o.timeout!=null&&(s.timeoutId=setTimeout(()=>{if(this.pendingTribunals.delete(n),o.onTimeout==="approve"){i({kind:"approved",approvedScope:e.intent.scopeProposal??null});return}a(new Error(`Tribunal decision timed out after ${o.timeout}ms for proposal '${n}'`))},o.timeout)),this.pendingTribunals.set(n,s),this.notificationCallback?.(n,e,o.members)})}submitVote(e,r,o,n){let i=this.pendingTribunals.get(e);if(!i)throw new Error(`No pending tribunal for proposal ${e}`);if(i.votes.has(r.actorId))throw new Error(`Actor ${r.actorId} already voted on proposal ${e}`);if(!(i.binding.policy.mode==="tribunal"?i.binding.policy.members.some(({actorId:s})=>s===r.actorId):!1))throw new Error(`Actor ${r.actorId} is not a tribunal member for proposal ${e}`);i.votes.set(r.actorId,{voter:r,decision:o,reasoning:n,votedAt:Date.now()}),this.checkQuorum(i)}isPending(e){return this.pendingTribunals.has(e)}getVotes(e){let r=this.pendingTribunals.get(e);return r?[...r.votes.values()]:[]}getPendingIds(){return[...this.pendingTribunals.keys()]}clearAllPending(){for(let[e,r]of this.pendingTribunals)r.timeoutId&&clearTimeout(r.timeoutId),r.reject(new Error(`Tribunal handler cleared pending proposal ${e}`));this.pendingTribunals.clear()}checkQuorum(e){let r=e.binding.policy;if(r.mode!=="tribunal")return;let o=r.members.length,n=0,i=0;for(let p of e.votes.values())p.decision==="approve"?n++:p.decision==="reject"&&i++;let a=!1,s=!1;switch(r.quorum.kind){case"unanimous":n===o?(a=!0,s=!0):(i>0||e.votes.size===o)&&(a=!0);break;case"majority":{let p=Math.floor(o/2)+1;n>=p?(a=!0,s=!0):i>=p?a=!0:e.votes.size===o&&(a=!0,s=n>i);break}case"threshold":n>=r.quorum.count?(a=!0,s=!0):i>o-r.quorum.count?a=!0:e.votes.size===o&&(a=!0,s=n>=r.quorum.count);break}if(a){if(e.timeoutId&&clearTimeout(e.timeoutId),this.pendingTribunals.delete(e.proposalId),s){e.resolve({kind:"approved",approvedScope:e.proposal.intent.scopeProposal??null});return}e.resolve({kind:"rejected",reason:`Tribunal rejected (${n}/${o} approved)`})}}};function H(){return new I}var $={auto_approve:"auto",hitl:"human",policy_rules:"policy",tribunal:"tribunal"},f=class{handlers=new Map;autoHandler;policyHandler;hitlHandler;tribunalHandler;constructor(){this.autoHandler=R(),this.policyHandler=k(),this.hitlHandler=T(),this.tribunalHandler=H(),this.handlers.set("auto_approve",this.autoHandler),this.handlers.set("hitl",this.hitlHandler),this.handlers.set("policy_rules",this.policyHandler),this.handlers.set("tribunal",this.tribunalHandler)}async evaluate(e,r){let o=this.handlers.get(r.policy.mode);if(!o)throw new Error(`Unknown policy mode: ${r.policy.mode}`);return o.evaluate(e,r)}registerHandler(e,r){this.handlers.set(e,r)}getAutoHandler(){return this.autoHandler}getPolicyHandler(){return this.policyHandler}getHITLHandler(){return this.hitlHandler}getTribunalHandler(){return this.tribunalHandler}getAuthorityKind(e){return $[e]??null}submitHITLDecision(e,r,o,n){this.hitlHandler.submitDecision(e,r,o,n)}submitTribunalVote(e,r,o,n){this.tribunalHandler.submitVote(e,r,o,n)}hasPendingHITL(){return this.hitlHandler.getPendingIds().length>0}hasPendingTribunal(){return this.tribunalHandler.getPendingIds().length>0}getPendingHITLIds(){return this.hitlHandler.getPendingIds()}getPendingTribunalIds(){return this.tribunalHandler.getPendingIds()}clearAllPending(){this.hitlHandler.clearAllPending(),this.tribunalHandler.clearAllPending()}};function ye(){return new f}function B(t){let e=t.system.lastError??void 0,r=t.system.pendingRequirements.map(o=>o.id);return{summary:K(e?1:0,r.length),...e?{currentError:e}:{},...r.length>0?{pendingRequirements:r}:{}}}function K(t,e){return t>0&&e>0?`Execution failed with ${t} error(s) and ${e} pending requirement(s)`:t>0?`Execution failed with ${t} error(s)`:e>0?`Execution failed with ${e} pending requirement(s)`:"Execution failed"}function fe(t){let e=t.sink??E(),r=t.now??Date.now;return{emitSealCompleted(o,n){let i=r(),a=o.proposal.status==="completed"?"completed":"failed";if(e.emit(t.service.createWorldCreatedEvent(n.world,o.proposal.proposalId,L(o,n),a,i)),_(n)&&e.emit(t.service.createWorldForkedEvent(o.proposal.branchId,n.edge.from,i)),a==="completed"){e.emit(t.service.createExecutionCompletedEvent(o.proposal,i));return}e.emit(t.service.createExecutionFailedEvent(o.proposal,V(n),i))}}}function L(t,e){return e.kind==="next"?e.edge.from:e.world.parentWorldId??t.proposal.baseWorld}function V(t){return B(t.terminalSnapshot)}function _(t){return t.kind==="next"&&"forkCreated"in t&&t.forkCreated===!0}import{sha256 as F,toJcs as D}from"@manifesto-ai/core";async function N(t,e){let r=[t,e.type,D(e.input??null),D(e.scopeProposal??null)].join(":");return F(r)}async function Ee(t){let e=t.intentId??`intent-${crypto.randomUUID()}`,r=await N(t.schemaHash,t.body);return q(t.body,e,r,{projectionId:t.projectionId,source:t.source,actor:t.actor,note:t.note})}function q(t,e,r,o){return C({body:t,intentId:e,intentKey:r,meta:{origin:o}})}function C(t){if(t===null||typeof t!="object")return t;for(let e of Object.getOwnPropertyNames(t)){let r=t[e];r!==null&&typeof r=="object"&&C(r)}return Object.freeze(t)}function d(t){return Object.freeze(t)}var g=class{constructor(e,r={}){this.store=e;this.options=r}createProposal(e){return d({proposalId:e.proposalId??P(),baseWorld:e.baseWorld,branchId:e.branchId,actorId:e.actorId,authorityId:e.authorityId,intent:d({...e.intent}),status:"submitted",executionKey:e.executionKey,submittedAt:e.submittedAt,epoch:e.epoch})}beginEvaluating(e){return this.transitionProposal(e,"evaluating")}beginExecution(e){if(!e.decisionId)throw new Error("GOV-EXEC-1 violation: approved proposal requires decisionId before execution can begin");return this.transitionProposal(e,"executing")}failExecution(e,r,o){return this.transitionProposal(e,"failed",{completedAt:r,...o!==void 0?{resultWorld:o}:{}})}async prepareAuthorityResult(e,r,o){if(e.status!=="submitted"&&e.status!=="evaluating")throw new Error(`GOV-TRANS-1 violation: authority result requires ingress proposal, received ${e.status}`);let n=await this.resolveBranchInfo(e.branchId),i=o.currentEpoch??n?.epoch??e.epoch,a=o.currentBranchHead??n?.head??e.baseWorld;if(this.shouldDiscardAuthorityResult(e,i))return{proposal:this.prepareSupersede(e,"head_advance"),discarded:!0};if(r.kind==="approved"){if(await this.assertBranchGateAvailable(e),a!==e.baseWorld)return{proposal:this.prepareSupersede(e,"head_advance"),discarded:!0};let p=d({decisionId:o.decisionId??u(),proposalId:e.proposalId,authorityId:e.authorityId,decision:d({kind:"approved"}),decidedAt:o.decidedAt});return{proposal:this.transitionProposal(e,"approved",{decisionId:p.decisionId,decidedAt:p.decidedAt,approvedScope:r.approvedScope}),decisionRecord:p,discarded:!1}}let s=d({decisionId:o.decisionId??u(),proposalId:e.proposalId,authorityId:e.authorityId,decision:d({kind:"rejected",...r.reason?{reason:r.reason}:{}}),decidedAt:o.decidedAt});return{proposal:this.transitionProposal(e,"rejected",{decisionId:s.decisionId,decidedAt:s.decidedAt}),decisionRecord:s,discarded:!1}}prepareSupersede(e,r){return this.transitionProposal(e,"superseded",{supersededReason:r})}async invalidateStaleIngress(e,r){let o=await this.resolveBranchInfo(e),n=r??o?.epoch;if(n==null)throw new Error(`Cannot invalidate stale ingress without branch epoch for ${e}`);return(await this.store.getProposalsByBranch(e)).filter(i=>A(i.status)&&i.epoch<n).map(i=>this.prepareSupersede(i,"head_advance"))}shouldDiscardAuthorityResult(e,r){return e.epoch<r}deriveOutcome(e){return e.system.lastError!=null||e.system.pendingRequirements.length>0?"failed":"completed"}async finalize(e,r,o){if(e.status!=="executing")throw new Error(`GOV-SEAL-6 violation: finalize() requires executing proposal, received ${e.status}`);if(!e.decisionId)throw new Error("GOV-SEAL-6 violation: executing proposal is missing decisionId");let n=await this.store.getDecisionRecord(e.decisionId);if(!n)throw new Error(`GOV-SEAL-6 violation: decision record ${e.decisionId} not found`);let i=this.deriveOutcome(r.terminalSnapshot);if(i!==r.terminalStatus)throw new Error(`GOV-SEAL-1 violation: deriveOutcome=${i} but lineageCommit.terminalStatus=${r.terminalStatus}`);let a=this.transitionProposal(e,i,{resultWorld:r.worldId,completedAt:o});return d({proposal:a,decisionRecord:n})}createProposalSubmittedEvent(e,r=Date.now()){return d({type:"proposal:submitted",timestamp:r,proposalId:e.proposalId,actorId:e.actorId,baseWorld:e.baseWorld,branchId:e.branchId,intent:d({type:e.intent.type,intentId:e.intent.intentId,...e.intent.input!==void 0?{input:e.intent.input}:{}}),executionKey:e.executionKey,epoch:e.epoch})}createProposalEvaluatingEvent(e,r=Date.now()){return d({type:"proposal:evaluating",timestamp:r,proposalId:e.proposalId})}createProposalDecidedEvent(e,r,o=Date.now()){return d({type:"proposal:decided",timestamp:o,proposalId:e.proposalId,decisionId:r.decisionId,decision:r.decision.kind,...r.decision.kind==="rejected"&&r.decision.reason?{reason:r.decision.reason}:{}})}createProposalSupersededEvent(e,r,o=Date.now()){if(e.status!=="superseded"||!e.supersededReason)throw new Error("GOV-EPOCH-5 violation: superseded event requires proposal.status='superseded' with supersededReason");return d({type:"proposal:superseded",timestamp:o,proposalId:e.proposalId,currentEpoch:r,proposalEpoch:e.epoch,reason:e.supersededReason})}createExecutionCompletedEvent(e,r=Date.now()){if(!e.resultWorld)throw new Error("GOV-EVT-6 violation: execution:completed requires proposal.resultWorld");return d({type:"execution:completed",timestamp:r,proposalId:e.proposalId,executionKey:e.executionKey,resultWorld:e.resultWorld})}createExecutionFailedEvent(e,r,o=Date.now()){if(!e.resultWorld)throw new Error("GOV-EVT-7 violation: execution:failed requires proposal.resultWorld");return d({type:"execution:failed",timestamp:o,proposalId:e.proposalId,executionKey:e.executionKey,resultWorld:e.resultWorld,error:d({summary:r.summary,...r.currentError!==void 0?{currentError:r.currentError}:{},...r.pendingRequirements!==void 0?{pendingRequirements:r.pendingRequirements}:{}})})}createWorldCreatedEvent(e,r,o,n,i=Date.now()){return d({type:"world:created",timestamp:i,world:e,from:o,proposalId:r,outcome:n})}createWorldForkedEvent(e,r,o=Date.now()){return d({type:"world:forked",timestamp:o,branchId:e,forkPoint:r})}async resolveBranchInfo(e){return this.options.lineageService?.getBranch(e)??null}async assertBranchGateAvailable(e){let r=await this.store.getExecutionStageProposal(e.branchId);if(r&&r.proposalId!==e.proposalId)throw new Error(`GOV-BRANCH-GATE-1 violation: branch ${e.branchId} already occupied by ${r.proposalId}`)}transitionProposal(e,r,o={}){if(!x(e.status,r))throw new Error(`GOV-TRANS-1 violation: invalid transition ${e.status} -> ${r}; valid targets are ${S(e.status).join(", ")}`);if(r==="superseded"){if(o.decisionId!=null)throw new Error("GOV-TRANS-3 violation: superseded transition must not create DecisionRecord");if(!o.supersededReason)throw new Error("GOV-STAGE-7 violation: superseded proposal must record supersededReason")}if(w(e.status,r)&&o.decisionId==null)throw new Error(`GOV-TRANS-2 violation: transition ${e.status} -> ${r} requires decisionId`);if(r!=="superseded"&&o.supersededReason!=null)throw new Error("GOV-TRANS-4 violation: supersededReason is only valid on superseded proposals");if(c(e.status)&&r==="superseded")throw new Error("GOV-STAGE-4 violation: execution-stage proposals must not be superseded");return d({...e,status:r,...o.decisionId!==void 0?{decisionId:o.decisionId}:{},...o.decidedAt!==void 0?{decidedAt:o.decidedAt}:{},...o.completedAt!==void 0?{completedAt:o.completedAt}:{},...o.resultWorld!==void 0?{resultWorld:o.resultWorld}:{},...o.approvedScope!==void 0?{approvedScope:o.approvedScope}:{},...o.supersededReason!==void 0?{supersededReason:o.supersededReason}:{},...r!=="superseded"?{supersededReason:void 0}:{}})}};function Se(t,e){return new g(t,e)}export{P as a,u as b,G as c,M as d,E as e,z as f,W as g,j as h,O as i,Q as j,A as k,c as l,X as m,x as n,S as o,w as p,y as q,Z as r,m as s,R as t,h as u,T as v,v as w,k as x,I as y,H as z,f as A,ye as B,B as C,fe as D,N as E,Ee as F,q as G,g as H,Se as I};
@@ -0,0 +1,3 @@
1
+ import type { Snapshot } from "@manifesto-ai/core";
2
+ import type { ErrorInfo } from "./types.js";
3
+ export declare function deriveErrorInfo(snapshot: Snapshot): ErrorInfo;
package/dist/index.d.ts CHANGED
@@ -1,5 +1,7 @@
1
1
  export type { ActorAuthorityBinding, ActorId, ActorKind, ActorRef, AuthorityId, AuthorityKind, AuthorityPolicy, AuthorityRef, DecisionId, DecisionRecord, ErrorInfo, FinalDecision, GovernanceEvent, GovernanceEventSink, GovernanceEventType, IntentScope, PolicyCondition, PolicyRule, Proposal, ProposalId, ProposalStatus, QuorumRule, SourceKind, SourceRef, SupersedeReason, Vote, WaitingFor, } from "./types.js";
2
2
  export type { GovernanceComposableManifesto, GovernanceConfig, GovernanceExecutionConfig, GovernanceInstance, } from "./runtime-types.js";
3
+ export type { ProposalSettlement, WaitForProposalOptions, } from "./wait-for-proposal.js";
3
4
  export { createNoopGovernanceEventSink, } from "./types.js";
4
5
  export { createInMemoryGovernanceStore } from "./store/in-memory-governance-store.js";
5
6
  export { withGovernance } from "./with-governance.js";
7
+ export { waitForProposal } from "./wait-for-proposal.js";
package/dist/index.js CHANGED
@@ -1,2 +1 @@
1
- import{B as C,C as T,E as D,H as B,a as G,d as S,e as $,r as b}from"./chunk-GIPNAEHI.js";import{DisposedError as l,ManifestoError as g}from"@manifesto-ai/sdk";import{activateComposable as X,assertComposableNotActivated as J,attachExtensionKernel as Y,attachRuntimeKernelFactory as Z,getActivationState as k,getRuntimeKernelFactory as ee}from"@manifesto-ai/sdk/provider";import{createLineageRuntimeController as te,getLineageDecoration as oe}from"@manifesto-ai/lineage/provider";var ne=Object.freeze({__governanceLaws:!0});function ae(e,h){J(e);let s=ee(e),a=oe(e);if(!a)throw new g("GOVERNANCE_LINEAGE_REQUIRED","withGovernance() requires a manifesto already composed with withLineage()");let c=k(e),y={_laws:Object.freeze({...e._laws,...ne}),schema:e.schema,activate(){return X(y),ie(s(),a.config,h)}};return Z(y,s,c),y}function ie(e,h,s){let a=s.governanceStore??b(),c=B(a,{lineageService:h.service}),y=s.evaluator??C(),L=T({service:c,sink:s.eventSink,now:s.now}),x=s.now??Date.now,r=te(e,h.service,h),f=null;async function v(){return f||(f=Promise.all(s.bindings.map(async o=>{await a.putActorBinding(o)})).then(()=>{}).catch(o=>{throw f=null,o}),f)}async function I(){await r.ensureReady(),await v()}function w(){return x()}async function M(o,t){let n=await c.invalidateStaleIngress(o,t);await Promise.all(n.map(async p=>{await a.putProposal(p)}))}async function _(o){let t=await a.getActorBinding(o);if(t)return t;throw new g("GOVERNANCE_BINDING_NOT_FOUND",`No actor-authority binding exists for actor "${o}"`)}async function O(o,t,n){switch(t.policy.mode){case"hitl":return{kind:"pending",waitingFor:{kind:"human",delegate:t.policy.delegate}};case"tribunal":return{kind:"pending",waitingFor:{kind:"tribunal",members:t.policy.members}};default:return n.evaluate(o,t)}}async function j(o,t){let n=null,p=null,m=!1;try{n=await r.sealIntent(t,{proposalRef:o.proposalId,decisionRef:o.decisionId,executionKey:o.executionKey,publishOnCompleted:!1,assumeEnqueued:!0});let i=await c.finalize(o,n.preparedCommit,w());if(p=i.proposal,await a.putProposal(i.proposal),m=!0,await a.putDecisionRecord(i.decisionRecord),L.emitSealCompleted(i,n.preparedCommit),n.preparedCommit.branchChange.headAdvanced){let u=e.setVisibleSnapshot(n.hostResult.snapshot);return e.emitEvent("dispatch:completed",{intentId:t.intentId??"",intent:t,snapshot:u}),i.proposal}let d=N(n.hostResult.error);return e.emitEvent("dispatch:failed",{intentId:t.intentId??"",intent:t,error:d}),i.proposal}catch(i){let d=N(i);if(!m)try{if(p)try{await a.putProposal(p)}catch{let u=c.failExecution(o,w(),n?.preparedCommit.worldId);await a.putProposal(u)}else{let u=c.failExecution(o,w(),n?.preparedCommit.worldId);await a.putProposal(u)}}catch{}throw ce(d)||e.emitEvent("dispatch:failed",{intentId:t.intentId??"",intent:t,error:d}),d}}async function A(o,t){let n=await c.prepareAuthorityResult(o,t,{decidedAt:w()});if(await a.putProposal(n.proposal),n.decisionRecord&&await a.putDecisionRecord(n.decisionRecord),n.discarded||n.proposal.status==="rejected")return n.proposal;let p=c.beginExecution(n.proposal);return await a.putProposal(p),j(p,re(n.proposal))}async function K(o){if(e.isDisposed())throw new l;return e.enqueue(async()=>{if(e.isDisposed())throw new l;await I();let t=e.ensureIntentId(o);if(!e.isActionAvailable(t.type))return e.rejectUnavailable(t);let n=await r.getActiveBranch();await M(n.id,n.epoch);let p=s.execution.deriveActor(t),m=await _(p.actorId),i=await D({body:{type:t.type,...t.input!==void 0?{input:t.input}:{},...se(t)?{scopeProposal:t.scopeProposal}:{}},schemaHash:e.schema.hash,projectionId:s.execution.projectionId,source:s.execution.deriveSource(t),actor:p,intentId:t.intentId}),d=G(),u=c.createProposal({proposalId:d,baseWorld:n.head,branchId:n.id,actorId:m.actorId,authorityId:m.authorityId,intent:{type:i.body.type,intentId:i.intentId,...i.body.input!==void 0?{input:i.body.input}:{},...i.body.scopeProposal!==void 0?{scopeProposal:i.body.scopeProposal}:{}},executionKey:S({proposalId:d,actorId:m.actorId,baseWorld:n.head,branchId:n.id,attempt:1}),submittedAt:w(),epoch:n.epoch});await a.putProposal(u);let P=c.beginEvaluating(u);await a.putProposal(P);let R=await O(P,m,y);return R.kind==="pending"?P:A(P,R)})}async function E(o){let t=await a.getProposal(o);if(!t)throw new g("GOVERNANCE_PROPOSAL_NOT_FOUND",`Proposal "${o}" was not found`);if(t.status!=="evaluating")throw new g("GOVERNANCE_PENDING_REQUIRED",`Proposal "${o}" is not pending human resolution`);return t}async function F(o,t){if(e.isDisposed())throw new l;return e.enqueue(async()=>{if(e.isDisposed())throw new l;await I();let n=await E(o);return A(n,{kind:"approved",approvedScope:t!==void 0?t:n.intent.scopeProposal??null})})}async function V(o,t){if(e.isDisposed())throw new l;return e.enqueue(async()=>{if(e.isDisposed())throw new l;await I();let n=await E(o);return A(n,{kind:"rejected",...t?{reason:t}:{}})})}async function U(o){return await v(),a.getProposal(o)}async function W(o){await I();let t=o??(await r.getActiveBranch()).id;return a.getProposalsByBranch(t)}async function q(o){if(e.isDisposed())throw new l;return e.enqueue(async()=>{if(e.isDisposed())throw new l;await v(),await a.putActorBinding(o)})}async function H(o){return await v(),a.getActorBinding(o)}async function z(o){return await v(),a.getDecisionRecord(o)}let Q={createIntent:e.createIntent,subscribe:e.subscribe,on:e.on,getSnapshot:e.getSnapshot,getCanonicalSnapshot:e.getCanonicalSnapshot,getSchemaGraph:e.getSchemaGraph,getAvailableActions:e.getAvailableActions,isIntentDispatchable:e.isIntentDispatchable,getIntentBlockers:e.getIntentBlockers,getActionMetadata:e.getActionMetadata,isActionAvailable:e.isActionAvailable,simulate:e.simulate,MEL:e.MEL,schema:e.schema,dispose:e.dispose,restore:r.restore,getWorld:r.getWorld,getWorldSnapshot:r.getWorldSnapshot,getLineage:r.getLineage,getLatestHead:r.getLatestHead,getHeads:r.getHeads,getBranches:r.getBranches,getActiveBranch:r.getActiveBranch,switchActiveBranch:r.switchActiveBranch,createBranch:r.createBranch,proposeAsync:K,approve:F,reject:V,getProposal:U,getProposals:W,bindActor:q,getActorBinding:H,getDecisionRecord:z};return Y(Q,e)}function re(e){return{type:e.intent.type,intentId:e.intent.intentId,...e.intent.input!==void 0?{input:e.intent.input}:{}}}function se(e){return"scopeProposal"in e&&e.scopeProposal!==void 0}function N(e){return e instanceof Error?e:new g("GOVERNANCE_EXECUTION_FAILED","Governed proposal execution did not produce a completed result")}function ce(e){return"code"in e&&typeof e.code=="string"&&(e.code==="ACTION_UNAVAILABLE"||e.code==="INTENT_NOT_DISPATCHABLE"||e.code==="INVALID_INPUT")}export{b as createInMemoryGovernanceStore,$ as createNoopGovernanceEventSink,ae as withGovernance};
2
- //# sourceMappingURL=index.js.map
1
+ import{B as M,C as _,D as L,F as O,I as B,a as x,d as W,e as ae,r as S}from"./chunk-2Q3OH2FH.js";import{DisposedError as h,ManifestoError as g}from"@manifesto-ai/sdk";import{getExtensionKernel as de}from"@manifesto-ai/sdk/extensions";import{activateComposable as le,assertComposableNotActivated as ue,attachExtensionKernel as me,attachRuntimeKernelFactory as fe,getActivationState as ye,getRuntimeKernelFactory as he}from"@manifesto-ai/sdk/provider";import{createLineageRuntimeController as Ie,getLineageDecoration as Pe}from"@manifesto-ai/lineage/provider";import{DisposedError as re,ManifestoError as D}from"@manifesto-ai/sdk";var j=Symbol("manifesto-governance.wait-for-proposal");function K(e,r){return Object.defineProperty(e,j,{enumerable:!1,configurable:!1,writable:!1,value:r}),e}async function se(e,r,s){let a=typeof r=="string"?r:r.proposalId,p=F(s?.timeoutMs,0),I=F(s?.pollIntervalMs,50),b=Date.now();for(;;){G(e);let d=await e.getProposal(a);if(!d)throw new D("GOVERNANCE_PROPOSAL_NOT_FOUND",`Proposal "${a}" was not found`);if(d.status==="completed"){let l=d,u=ce(l,"completed");return G(e),{kind:"completed",proposal:l,snapshot:e.getSnapshot(),resultWorld:u}}if(d.status==="failed"){let l=d,u=await ie(e,l);return{kind:"failed",proposal:l,...u.resultWorld!==void 0?{resultWorld:u.resultWorld}:{},error:u.error}}if(d.status==="rejected")return{kind:"rejected",proposal:d};if(d.status==="superseded")return{kind:"superseded",proposal:d};if(p===0)return{kind:"pending",proposal:d};let i=p-(Date.now()-b);if(i<=0)return{kind:"timed_out",proposal:d};await pe(Math.min(I,i))}}async function ie(e,r){if(!r.resultWorld)return{error:{summary:"Execution failed before a result world was recorded"}};let s=r.resultWorld;G(e);let a=await e.getWorldSnapshot(s);if(!a)throw new D("GOVERNANCE_RESULT_WORLD_NOT_FOUND",`Failed proposal "${r.proposalId}" references missing world "${s}"`);return{resultWorld:s,error:_(a)}}function ce(e,r){if(!e.resultWorld)throw new D("GOVERNANCE_RESULT_WORLD_MISSING",`Proposal "${e.proposalId}" reached ${r} without a result world`);return e.resultWorld}function G(e){if(e[j]?.isDisposed())throw new re}function F(e,r){return e===void 0||!Number.isFinite(e)?r:Math.max(0,e)}function pe(e){return new Promise(r=>{globalThis.setTimeout(r,e)})}var we=Object.freeze({__governanceLaws:!0});function ve(e,r){ue(e);let s=he(e),a=Pe(e);if(!a)throw new g("GOVERNANCE_LINEAGE_REQUIRED","withGovernance() requires a manifesto already composed with withLineage()");let p=ye(e),I={_laws:Object.freeze({...e._laws,...we}),schema:e.schema,activate(){return le(I),ge(s(),a.config,r)}};return fe(I,s,p),I}function ge(e,r,s){let a=s.governanceStore??S(),p=B(a,{lineageService:r.service}),I=s.evaluator??M(),b=L({service:p,sink:s.eventSink,now:s.now}),d=s.now??Date.now,i=Ie(e,r.service,r),l,u=null;async function w(){return u||(u=Promise.all(s.bindings.map(async o=>{await a.putActorBinding(o)})).then(()=>{}).catch(o=>{throw u=null,o}),u)}async function A(){await i.ensureReady(),await w()}function v(){return d()}async function V(o,t){let n=await p.invalidateStaleIngress(o,t);await Promise.all(n.map(async m=>{await a.putProposal(m)}))}async function $(o){let t=await a.getActorBinding(o);if(t)return t;throw new g("GOVERNANCE_BINDING_NOT_FOUND",`No actor-authority binding exists for actor "${o}"`)}async function q(o,t,n){switch(t.policy.mode){case"hitl":return{kind:"pending",waitingFor:{kind:"human",delegate:t.policy.delegate}};case"tribunal":return{kind:"pending",waitingFor:{kind:"tribunal",members:t.policy.members}};default:return n.evaluate(o,t)}}async function H(o,t){let n=null,m=null,P=!1;try{n=await i.sealIntent(t,{proposalRef:o.proposalId,decisionRef:o.decisionId,executionKey:o.executionKey,publishOnCompleted:!1,assumeEnqueued:!0});let c=await p.finalize(o,n.preparedCommit,v());if(m=c.proposal,await a.putProposal(c.proposal),P=!0,await a.putDecisionRecord(c.decisionRecord),b.emitSealCompleted(c,n.preparedCommit),n.preparedCommit.branchChange.headAdvanced){let y=e.setVisibleSnapshot(n.hostResult.snapshot);return e.emitEvent("dispatch:completed",{intentId:t.intentId??"",intent:t,snapshot:y}),c.proposal}let f=U(n.hostResult.error);return e.emitEvent("dispatch:failed",{intentId:t.intentId??"",intent:t,error:f}),c.proposal}catch(c){let f=U(c);if(!P)try{if(m)try{await a.putProposal(m)}catch{let y=p.failExecution(o,v(),n?.preparedCommit.worldId);await a.putProposal(y)}else{let y=p.failExecution(o,v(),n?.preparedCommit.worldId);await a.putProposal(y)}}catch{}throw be(f)||e.emitEvent("dispatch:failed",{intentId:t.intentId??"",intent:t,error:f}),f}}async function E(o,t){let n=await p.prepareAuthorityResult(o,t,{decidedAt:v()});if(await a.putProposal(n.proposal),n.decisionRecord&&await a.putDecisionRecord(n.decisionRecord),n.discarded||n.proposal.status==="rejected")return n.proposal;let m=p.beginExecution(n.proposal);return await a.putProposal(m),H(m,Ae(n.proposal))}async function z(o){if(e.isDisposed())throw new h;return e.enqueue(async()=>{if(e.isDisposed())throw new h;await A();let t=e.ensureIntentId(o);if(!e.isActionAvailable(t.type))return e.rejectUnavailable(t);let n=await i.getActiveBranch();await V(n.id,n.epoch);let m=s.execution.deriveActor(t),P=await $(m.actorId),c=await O({body:{type:t.type,...t.input!==void 0?{input:t.input}:{},...Te(t)?{scopeProposal:t.scopeProposal}:{}},schemaHash:e.schema.hash,projectionId:s.execution.projectionId,source:s.execution.deriveSource(t),actor:m,intentId:t.intentId}),f=x(),y=p.createProposal({proposalId:f,baseWorld:n.head,branchId:n.id,actorId:P.actorId,authorityId:P.authorityId,intent:{type:c.body.type,intentId:c.intentId,...c.body.input!==void 0?{input:c.body.input}:{},...c.body.scopeProposal!==void 0?{scopeProposal:c.body.scopeProposal}:{}},executionKey:W({proposalId:f,actorId:P.actorId,baseWorld:n.head,branchId:n.id,attempt:1}),submittedAt:v(),epoch:n.epoch});await a.putProposal(y);let T=p.beginEvaluating(y);await a.putProposal(T);let C=await q(T,P,I);return C.kind==="pending"?T:E(T,C)})}async function N(o){let t=await a.getProposal(o);if(!t)throw new g("GOVERNANCE_PROPOSAL_NOT_FOUND",`Proposal "${o}" was not found`);if(t.status!=="evaluating")throw new g("GOVERNANCE_PENDING_REQUIRED",`Proposal "${o}" is not pending human resolution`);return t}async function Q(o,t){if(e.isDisposed())throw new h;return e.enqueue(async()=>{if(e.isDisposed())throw new h;await A();let n=await N(o);return E(n,{kind:"approved",approvedScope:t!==void 0?t:n.intent.scopeProposal??null})})}async function X(o,t){if(e.isDisposed())throw new h;return e.enqueue(async()=>{if(e.isDisposed())throw new h;await A();let n=await N(o);return E(n,{kind:"rejected",...t?{reason:t}:{}})})}async function J(o){return await w(),a.getProposal(o)}async function Y(o){await A();let t=o??(await i.getActiveBranch()).id;return a.getProposalsByBranch(t)}async function Z(o){if(e.isDisposed())throw new h;return e.enqueue(async()=>{if(e.isDisposed())throw new h;await w(),await a.putActorBinding(o)})}async function k(o){return await w(),a.getActorBinding(o)}async function ee(o){return await w(),a.getDecisionRecord(o)}function R(o){return de(l).explainIntentFor(e.getCanonicalSnapshot(),o)}function oe(o){return R(o)}function te(o){let t=R(o);return t.kind==="blocked"?t.blockers:null}let ne={createIntent:e.createIntent,subscribe:e.subscribe,on:e.on,getSnapshot:e.getSnapshot,getCanonicalSnapshot:e.getCanonicalSnapshot,getSchemaGraph:e.getSchemaGraph,getAvailableActions:e.getAvailableActions,isIntentDispatchable:e.isIntentDispatchable,getIntentBlockers:e.getIntentBlockers,getActionMetadata:e.getActionMetadata,isActionAvailable:e.isActionAvailable,simulate:e.simulate,explainIntent:R,why:oe,whyNot:te,MEL:e.MEL,schema:e.schema,dispose:e.dispose,restore:i.restore,getWorld:i.getWorld,getWorldSnapshot:i.getWorldSnapshot,getLineage:i.getLineage,getLatestHead:i.getLatestHead,getHeads:i.getHeads,getBranches:i.getBranches,getActiveBranch:i.getActiveBranch,switchActiveBranch:i.switchActiveBranch,createBranch:i.createBranch,proposeAsync:z,approve:Q,reject:X,getProposal:J,getProposals:Y,bindActor:Z,getActorBinding:k,getDecisionRecord:ee};return l=K(me(ne,e),{isDisposed:e.isDisposed}),l}function Ae(e){return{type:e.intent.type,intentId:e.intent.intentId,...e.intent.input!==void 0?{input:e.intent.input}:{}}}function Te(e){return"scopeProposal"in e&&e.scopeProposal!==void 0}function U(e){return e instanceof Error?e:new g("GOVERNANCE_EXECUTION_FAILED","Governed proposal execution did not produce a completed result")}function be(e){return"code"in e&&typeof e.code=="string"&&(e.code==="ACTION_UNAVAILABLE"||e.code==="INTENT_NOT_DISPATCHABLE"||e.code==="INVALID_INPUT")}export{S as createInMemoryGovernanceStore,ae as createNoopGovernanceEventSink,se as waitForProposal,ve as withGovernance};
package/dist/provider.js CHANGED
@@ -1,2 +1 @@
1
- import{A as h,B as C,C as P,D,E as K,F as N,G as g,H as b,a as e,b as t,c as o,d as n,e as r,f as a,g as i,h as c,i as s,j as p,k as l,l as u,m as y,n as I,o as S,p as d,q as v,r as E,s as T,t as f,u as m,v as A,w as x,x as G,y as H,z as R}from"./chunk-GIPNAEHI.js";export{h as AuthorityEvaluator,T as AutoApproveHandler,p as DECISION_TRANSITION_TARGETS,g as DefaultGovernanceService,c as EXECUTION_STAGE_STATUSES,m as HITLHandler,i as INGRESS_STATUSES,v as InMemoryGovernanceStore,x as PolicyRulesHandler,s as TERMINAL_STATUSES,H as TribunalHandler,D as computeIntentKey,C as createAuthorityEvaluator,f as createAutoApproveHandler,t as createDecisionId,o as createExecutionKey,P as createGovernanceEventDispatcher,b as createGovernanceService,A as createHITLHandler,E as createInMemoryGovernanceStore,K as createIntentInstance,N as createIntentInstanceSync,r as createNoopGovernanceEventSink,G as createPolicyRulesHandler,e as createProposalId,R as createTribunalHandler,n as defaultExecutionKeyPolicy,S as getValidTransitions,u as isExecutionStageStatus,l as isIngressStatus,y as isTerminalStatus,I as isValidTransition,a as toHostIntent,d as transitionCreatesDecisionRecord};
2
- //# sourceMappingURL=provider.js.map
1
+ import{A as h,B as C,D as P,E as D,F as K,G as N,H as g,I as b,a as e,b as t,c as o,d as n,e as r,f as a,g as i,h as c,i as s,j as p,k as l,l as u,m as y,n as I,o as S,p as d,q as v,r as E,s as T,t as f,u as m,v as A,w as x,x as G,y as H,z as R}from"./chunk-2Q3OH2FH.js";export{h as AuthorityEvaluator,T as AutoApproveHandler,p as DECISION_TRANSITION_TARGETS,g as DefaultGovernanceService,c as EXECUTION_STAGE_STATUSES,m as HITLHandler,i as INGRESS_STATUSES,v as InMemoryGovernanceStore,x as PolicyRulesHandler,s as TERMINAL_STATUSES,H as TribunalHandler,D as computeIntentKey,C as createAuthorityEvaluator,f as createAutoApproveHandler,t as createDecisionId,o as createExecutionKey,P as createGovernanceEventDispatcher,b as createGovernanceService,A as createHITLHandler,E as createInMemoryGovernanceStore,K as createIntentInstance,N as createIntentInstanceSync,r as createNoopGovernanceEventSink,G as createPolicyRulesHandler,e as createProposalId,R as createTribunalHandler,n as defaultExecutionKeyPolicy,S as getValidTransitions,u as isExecutionStageStatus,l as isIngressStatus,y as isTerminalStatus,I as isValidTransition,a as toHostIntent,d as transitionCreatesDecisionRecord};
@@ -0,0 +1,45 @@
1
+ import { type ManifestoDomainShape, type Snapshot } from "@manifesto-ai/sdk";
2
+ import type { GovernanceInstance } from "./runtime-types.js";
3
+ import type { ErrorInfo, Proposal, ProposalId, WorldId } from "./types.js";
4
+ type WaitForProposalRuntimeState = {
5
+ readonly isDisposed: () => boolean;
6
+ };
7
+ export type WaitForProposalOptions = {
8
+ readonly timeoutMs?: number;
9
+ readonly pollIntervalMs?: number;
10
+ };
11
+ export type ProposalSettlement<T extends ManifestoDomainShape = ManifestoDomainShape> = {
12
+ readonly kind: "completed";
13
+ readonly proposal: Proposal & {
14
+ readonly status: "completed";
15
+ readonly resultWorld: WorldId;
16
+ };
17
+ readonly snapshot: Snapshot<T["state"]>;
18
+ readonly resultWorld: WorldId;
19
+ } | {
20
+ readonly kind: "failed";
21
+ readonly proposal: Proposal & {
22
+ readonly status: "failed";
23
+ };
24
+ readonly resultWorld?: WorldId;
25
+ readonly error: ErrorInfo;
26
+ } | {
27
+ readonly kind: "rejected";
28
+ readonly proposal: Proposal & {
29
+ readonly status: "rejected";
30
+ };
31
+ } | {
32
+ readonly kind: "superseded";
33
+ readonly proposal: Proposal & {
34
+ readonly status: "superseded";
35
+ };
36
+ } | {
37
+ readonly kind: "pending";
38
+ readonly proposal: Proposal;
39
+ } | {
40
+ readonly kind: "timed_out";
41
+ readonly proposal: Proposal;
42
+ };
43
+ export declare function attachWaitForProposalRuntime<T extends ManifestoDomainShape>(runtime: GovernanceInstance<T>, state: WaitForProposalRuntimeState): GovernanceInstance<T>;
44
+ export declare function waitForProposal<T extends ManifestoDomainShape>(app: GovernanceInstance<T>, proposalOrId: Proposal | ProposalId, options?: WaitForProposalOptions): Promise<ProposalSettlement<T>>;
45
+ export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@manifesto-ai/governance",
3
- "version": "3.6.0",
3
+ "version": "3.8.0",
4
4
  "description": "Manifesto Governance - decorator runtime for legitimacy, approval, and governed execution",
5
5
  "author": "eggplantiny <eggplantiny@gmail.com>",
6
6
  "license": "MIT",
@@ -37,8 +37,8 @@
37
37
  "@manifesto-ai/core": "^2.11.0"
38
38
  },
39
39
  "dependencies": {
40
- "@manifesto-ai/lineage": "3.6.0",
41
- "@manifesto-ai/sdk": "3.7.0"
40
+ "@manifesto-ai/lineage": "3.7.1",
41
+ "@manifesto-ai/sdk": "3.9.0"
42
42
  },
43
43
  "devDependencies": {
44
44
  "typescript": "^5.9.3",
@@ -1,2 +0,0 @@
1
- function P(t){return t??`prop-${crypto.randomUUID()}`}function u(t){return t??`dec-${crypto.randomUUID()}`}function C(t,e=1){return`${t}:${e}`}var q=({proposalId:t,attempt:e})=>C(t,e);function E(){return{emit(){}}}function M(t){return"body"in t?{type:t.body.type,input:t.body.input,intentId:t.intentId}:{type:t.type,input:t.input,intentId:t.intentId}}var G=["submitted","evaluating"],W=["approved","executing"],j=["rejected","completed","failed","superseded"],U=["approved","rejected"],b={submitted:["evaluating","rejected","superseded"],evaluating:["approved","rejected","superseded"],approved:["executing"],rejected:[],executing:["completed","failed"],completed:[],failed:[],superseded:[]};function A(t){return G.includes(t)}function c(t){return W.includes(t)}function Q(t){return j.includes(t)}function x(t,e){return b[t].includes(e)}function S(t){return[...b[t]]}function w(t,e){return t==="submitted"&&e==="rejected"||t==="evaluating"&&e==="approved"||t==="evaluating"&&e==="rejected"}function l(t){return structuredClone(t)}var y=class{proposals=new Map;decisions=new Map;actorBindings=new Map;async putProposal(e){this.proposals.set(e.proposalId,l(e))}async getProposal(e){return l(this.proposals.get(e)??null)}async getProposalsByBranch(e){return[...this.proposals.values()].filter(r=>r.branchId===e).sort((r,o)=>r.submittedAt!==o.submittedAt?r.submittedAt-o.submittedAt:r.proposalId.localeCompare(o.proposalId)).map(r=>l(r))}async getExecutionStageProposal(e){let r=(await this.getProposalsByBranch(e)).filter(o=>c(o.status));if(r.length>1)throw new Error(`GOV-STORE-4 violation: multiple execution-stage proposals found for branch ${e}`);return r[0]??null}async putDecisionRecord(e){this.decisions.set(e.decisionId,l(e))}async getDecisionRecord(e){return l(this.decisions.get(e)??null)}async putActorBinding(e){this.actorBindings.set(e.actorId,l(e))}async getActorBinding(e){return l(this.actorBindings.get(e)??null)}async getActorBindings(){return[...this.actorBindings.values()].sort((e,r)=>e.actorId.localeCompare(r.actorId)).map(e=>l(e))}snapshotState(){return{proposals:l(this.proposals),decisions:l(this.decisions),actorBindings:l(this.actorBindings)}}restoreState(e){this.proposals.clear();for(let[r,o]of e.proposals)this.proposals.set(r,l(o));this.decisions.clear();for(let[r,o]of e.decisions)this.decisions.set(r,l(o));this.actorBindings.clear();for(let[r,o]of e.actorBindings)this.actorBindings.set(r,l(o))}};function Y(){return new y}var m=class{async evaluate(e,r){if(r.policy.mode!=="auto_approve")throw new Error(`AutoApproveHandler received non-auto_approve policy: ${r.policy.mode}`);return{kind:"approved",approvedScope:e.intent.scopeProposal??null}}};function R(){return new m}var h=class{pendingDecisions=new Map;notificationCallbacks=new Set;onPendingDecision(e){return this.notificationCallbacks.add(e),()=>{this.notificationCallbacks.delete(e)}}async evaluate(e,r){if(r.policy.mode!=="hitl")throw new Error(`HITLHandler received non-hitl policy: ${r.policy.mode}`);let o=r.policy,n=e.proposalId;if(this.pendingDecisions.has(n))throw new Error(`Proposal ${n} already has a pending HITL decision`);return new Promise((i,a)=>{let s={proposalId:n,proposal:e,resolve:i,reject:a};o.timeout!=null&&(s.timeoutId=setTimeout(()=>{if(this.pendingDecisions.delete(n),o.onTimeout==="approve"){i({kind:"approved",approvedScope:e.intent.scopeProposal??null});return}a(new Error(`HITL decision timed out after ${o.timeout}ms for proposal '${n}'`))},o.timeout)),this.pendingDecisions.set(n,s);for(let p of this.notificationCallbacks)p(n,e,r)})}submitDecision(e,r,o,n){let i=this.pendingDecisions.get(e);if(!i)throw new Error(`No pending HITL decision for proposal ${e}`);if(i.timeoutId&&clearTimeout(i.timeoutId),this.pendingDecisions.delete(e),r==="approved"){i.resolve({kind:"approved",approvedScope:n!==void 0?n:i.proposal?.intent.scopeProposal??null});return}i.resolve({kind:"rejected",reason:o??"Human rejected"})}isPending(e){return this.pendingDecisions.has(e)}getPendingIds(){return[...this.pendingDecisions.keys()]}clearAllPending(){for(let[e,r]of this.pendingDecisions)r.timeoutId&&clearTimeout(r.timeoutId),r.reject(new Error(`HITL handler cleared pending proposal ${e}`));this.pendingDecisions.clear()}};function T(){return new h}var v=class{customEvaluators=new Map;registerCustomEvaluator(e,r){this.customEvaluators.set(e,r)}async evaluate(e,r){if(r.policy.mode!=="policy_rules")throw new Error(`PolicyRulesHandler received non-policy_rules policy: ${r.policy.mode}`);let o=e.intent.scopeProposal??null;for(let n of r.policy.rules)if(this.evaluateCondition(n.condition,e,r))return this.applyDecision(n,o);return this.applyDecision({decision:r.policy.defaultDecision,reason:"Default policy decision"},o)}evaluateCondition(e,r,o){switch(e.kind){case"intent_type":return e.types.includes(r.intent.type);case"scope_pattern":return this.matchPattern(r.intent.type,e.pattern);case"custom":{let n=this.customEvaluators.get(e.evaluator);return n?n(r,o):!1}}}matchPattern(e,r){return new RegExp(`^${r.replace(/\*/g,".*").replace(/\?/g,".")}$`).test(e)}applyDecision(e,r){switch(e.decision){case"approve":return{kind:"approved",approvedScope:r};case"reject":return{kind:"rejected",reason:e.reason??"Policy rejection"};case"escalate":return{kind:"rejected",reason:e.reason??"Policy requires escalation (not implemented)"}}}};function k(){return new v}var I=class{pendingTribunals=new Map;notificationCallback;onPendingTribunal(e){this.notificationCallback=e}async evaluate(e,r){if(r.policy.mode!=="tribunal")throw new Error(`TribunalHandler received non-tribunal policy: ${r.policy.mode}`);let o=r.policy,n=e.proposalId;if(this.pendingTribunals.has(n))throw new Error(`Proposal ${n} already has a pending tribunal`);return new Promise((i,a)=>{let s={proposalId:n,proposal:e,binding:r,votes:new Map,resolve:i,reject:a};o.timeout!=null&&(s.timeoutId=setTimeout(()=>{if(this.pendingTribunals.delete(n),o.onTimeout==="approve"){i({kind:"approved",approvedScope:e.intent.scopeProposal??null});return}a(new Error(`Tribunal decision timed out after ${o.timeout}ms for proposal '${n}'`))},o.timeout)),this.pendingTribunals.set(n,s),this.notificationCallback?.(n,e,o.members)})}submitVote(e,r,o,n){let i=this.pendingTribunals.get(e);if(!i)throw new Error(`No pending tribunal for proposal ${e}`);if(i.votes.has(r.actorId))throw new Error(`Actor ${r.actorId} already voted on proposal ${e}`);if(!(i.binding.policy.mode==="tribunal"?i.binding.policy.members.some(({actorId:s})=>s===r.actorId):!1))throw new Error(`Actor ${r.actorId} is not a tribunal member for proposal ${e}`);i.votes.set(r.actorId,{voter:r,decision:o,reasoning:n,votedAt:Date.now()}),this.checkQuorum(i)}isPending(e){return this.pendingTribunals.has(e)}getVotes(e){let r=this.pendingTribunals.get(e);return r?[...r.votes.values()]:[]}getPendingIds(){return[...this.pendingTribunals.keys()]}clearAllPending(){for(let[e,r]of this.pendingTribunals)r.timeoutId&&clearTimeout(r.timeoutId),r.reject(new Error(`Tribunal handler cleared pending proposal ${e}`));this.pendingTribunals.clear()}checkQuorum(e){let r=e.binding.policy;if(r.mode!=="tribunal")return;let o=r.members.length,n=0,i=0;for(let p of e.votes.values())p.decision==="approve"?n++:p.decision==="reject"&&i++;let a=!1,s=!1;switch(r.quorum.kind){case"unanimous":n===o?(a=!0,s=!0):(i>0||e.votes.size===o)&&(a=!0);break;case"majority":{let p=Math.floor(o/2)+1;n>=p?(a=!0,s=!0):i>=p?a=!0:e.votes.size===o&&(a=!0,s=n>i);break}case"threshold":n>=r.quorum.count?(a=!0,s=!0):i>o-r.quorum.count?a=!0:e.votes.size===o&&(a=!0,s=n>=r.quorum.count);break}if(a){if(e.timeoutId&&clearTimeout(e.timeoutId),this.pendingTribunals.delete(e.proposalId),s){e.resolve({kind:"approved",approvedScope:e.proposal.intent.scopeProposal??null});return}e.resolve({kind:"rejected",reason:`Tribunal rejected (${n}/${o} approved)`})}}};function H(){return new I}var O={auto_approve:"auto",hitl:"human",policy_rules:"policy",tribunal:"tribunal"},f=class{handlers=new Map;autoHandler;policyHandler;hitlHandler;tribunalHandler;constructor(){this.autoHandler=R(),this.policyHandler=k(),this.hitlHandler=T(),this.tribunalHandler=H(),this.handlers.set("auto_approve",this.autoHandler),this.handlers.set("hitl",this.hitlHandler),this.handlers.set("policy_rules",this.policyHandler),this.handlers.set("tribunal",this.tribunalHandler)}async evaluate(e,r){let o=this.handlers.get(r.policy.mode);if(!o)throw new Error(`Unknown policy mode: ${r.policy.mode}`);return o.evaluate(e,r)}registerHandler(e,r){this.handlers.set(e,r)}getAutoHandler(){return this.autoHandler}getPolicyHandler(){return this.policyHandler}getHITLHandler(){return this.hitlHandler}getTribunalHandler(){return this.tribunalHandler}getAuthorityKind(e){return O[e]??null}submitHITLDecision(e,r,o,n){this.hitlHandler.submitDecision(e,r,o,n)}submitTribunalVote(e,r,o,n){this.tribunalHandler.submitVote(e,r,o,n)}hasPendingHITL(){return this.hitlHandler.getPendingIds().length>0}hasPendingTribunal(){return this.tribunalHandler.getPendingIds().length>0}getPendingHITLIds(){return this.hitlHandler.getPendingIds()}getPendingTribunalIds(){return this.tribunalHandler.getPendingIds()}clearAllPending(){this.hitlHandler.clearAllPending(),this.tribunalHandler.clearAllPending()}};function ue(){return new f}function he(t){let e=t.sink??E(),r=t.now??Date.now;return{emitSealCompleted(o,n){let i=r(),a=o.proposal.status==="completed"?"completed":"failed";if(e.emit(t.service.createWorldCreatedEvent(n.world,o.proposal.proposalId,$(o,n),a,i)),L(n)&&e.emit(t.service.createWorldForkedEvent(o.proposal.branchId,n.edge.from,i)),a==="completed"){e.emit(t.service.createExecutionCompletedEvent(o.proposal,i));return}e.emit(t.service.createExecutionFailedEvent(o.proposal,K(n),i))}}}function $(t,e){return e.kind==="next"?e.edge.from:e.world.parentWorldId??t.proposal.baseWorld}function K(t){let e=t.terminalSnapshot.system.lastError??void 0,r=t.terminalSnapshot.system.pendingRequirements.map(o=>o.id);return{summary:V(e?1:0,r.length),...e?{currentError:e}:{},...r.length>0?{pendingRequirements:r}:{}}}function L(t){return t.kind==="next"&&"forkCreated"in t&&t.forkCreated===!0}function V(t,e){return t>0&&e>0?`Execution failed with ${t} error(s) and ${e} pending requirement(s)`:t>0?`Execution failed with ${t} error(s)`:e>0?`Execution failed with ${e} pending requirement(s)`:"Execution failed"}import{sha256 as _,toJcs as B}from"@manifesto-ai/core";async function F(t,e){let r=[t,e.type,B(e.input??null),B(e.scopeProposal??null)].join(":");return _(r)}async function fe(t){let e=t.intentId??`intent-${crypto.randomUUID()}`,r=await F(t.schemaHash,t.body);return N(t.body,e,r,{projectionId:t.projectionId,source:t.source,actor:t.actor,note:t.note})}function N(t,e,r,o){return D({body:t,intentId:e,intentKey:r,meta:{origin:o}})}function D(t){if(t===null||typeof t!="object")return t;for(let e of Object.getOwnPropertyNames(t)){let r=t[e];r!==null&&typeof r=="object"&&D(r)}return Object.freeze(t)}function d(t){return Object.freeze(t)}var g=class{constructor(e,r={}){this.store=e;this.options=r}createProposal(e){return d({proposalId:e.proposalId??P(),baseWorld:e.baseWorld,branchId:e.branchId,actorId:e.actorId,authorityId:e.authorityId,intent:d({...e.intent}),status:"submitted",executionKey:e.executionKey,submittedAt:e.submittedAt,epoch:e.epoch})}beginEvaluating(e){return this.transitionProposal(e,"evaluating")}beginExecution(e){if(!e.decisionId)throw new Error("GOV-EXEC-1 violation: approved proposal requires decisionId before execution can begin");return this.transitionProposal(e,"executing")}failExecution(e,r,o){return this.transitionProposal(e,"failed",{completedAt:r,...o!==void 0?{resultWorld:o}:{}})}async prepareAuthorityResult(e,r,o){if(e.status!=="submitted"&&e.status!=="evaluating")throw new Error(`GOV-TRANS-1 violation: authority result requires ingress proposal, received ${e.status}`);let n=await this.resolveBranchInfo(e.branchId),i=o.currentEpoch??n?.epoch??e.epoch,a=o.currentBranchHead??n?.head??e.baseWorld;if(this.shouldDiscardAuthorityResult(e,i))return{proposal:this.prepareSupersede(e,"head_advance"),discarded:!0};if(r.kind==="approved"){if(await this.assertBranchGateAvailable(e),a!==e.baseWorld)return{proposal:this.prepareSupersede(e,"head_advance"),discarded:!0};let p=d({decisionId:o.decisionId??u(),proposalId:e.proposalId,authorityId:e.authorityId,decision:d({kind:"approved"}),decidedAt:o.decidedAt});return{proposal:this.transitionProposal(e,"approved",{decisionId:p.decisionId,decidedAt:p.decidedAt,approvedScope:r.approvedScope}),decisionRecord:p,discarded:!1}}let s=d({decisionId:o.decisionId??u(),proposalId:e.proposalId,authorityId:e.authorityId,decision:d({kind:"rejected",...r.reason?{reason:r.reason}:{}}),decidedAt:o.decidedAt});return{proposal:this.transitionProposal(e,"rejected",{decisionId:s.decisionId,decidedAt:s.decidedAt}),decisionRecord:s,discarded:!1}}prepareSupersede(e,r){return this.transitionProposal(e,"superseded",{supersededReason:r})}async invalidateStaleIngress(e,r){let o=await this.resolveBranchInfo(e),n=r??o?.epoch;if(n==null)throw new Error(`Cannot invalidate stale ingress without branch epoch for ${e}`);return(await this.store.getProposalsByBranch(e)).filter(i=>A(i.status)&&i.epoch<n).map(i=>this.prepareSupersede(i,"head_advance"))}shouldDiscardAuthorityResult(e,r){return e.epoch<r}deriveOutcome(e){return e.system.lastError!=null||e.system.pendingRequirements.length>0?"failed":"completed"}async finalize(e,r,o){if(e.status!=="executing")throw new Error(`GOV-SEAL-6 violation: finalize() requires executing proposal, received ${e.status}`);if(!e.decisionId)throw new Error("GOV-SEAL-6 violation: executing proposal is missing decisionId");let n=await this.store.getDecisionRecord(e.decisionId);if(!n)throw new Error(`GOV-SEAL-6 violation: decision record ${e.decisionId} not found`);let i=this.deriveOutcome(r.terminalSnapshot);if(i!==r.terminalStatus)throw new Error(`GOV-SEAL-1 violation: deriveOutcome=${i} but lineageCommit.terminalStatus=${r.terminalStatus}`);let a=this.transitionProposal(e,i,{resultWorld:r.worldId,completedAt:o});return d({proposal:a,decisionRecord:n})}createProposalSubmittedEvent(e,r=Date.now()){return d({type:"proposal:submitted",timestamp:r,proposalId:e.proposalId,actorId:e.actorId,baseWorld:e.baseWorld,branchId:e.branchId,intent:d({type:e.intent.type,intentId:e.intent.intentId,...e.intent.input!==void 0?{input:e.intent.input}:{}}),executionKey:e.executionKey,epoch:e.epoch})}createProposalEvaluatingEvent(e,r=Date.now()){return d({type:"proposal:evaluating",timestamp:r,proposalId:e.proposalId})}createProposalDecidedEvent(e,r,o=Date.now()){return d({type:"proposal:decided",timestamp:o,proposalId:e.proposalId,decisionId:r.decisionId,decision:r.decision.kind,...r.decision.kind==="rejected"&&r.decision.reason?{reason:r.decision.reason}:{}})}createProposalSupersededEvent(e,r,o=Date.now()){if(e.status!=="superseded"||!e.supersededReason)throw new Error("GOV-EPOCH-5 violation: superseded event requires proposal.status='superseded' with supersededReason");return d({type:"proposal:superseded",timestamp:o,proposalId:e.proposalId,currentEpoch:r,proposalEpoch:e.epoch,reason:e.supersededReason})}createExecutionCompletedEvent(e,r=Date.now()){if(!e.resultWorld)throw new Error("GOV-EVT-6 violation: execution:completed requires proposal.resultWorld");return d({type:"execution:completed",timestamp:r,proposalId:e.proposalId,executionKey:e.executionKey,resultWorld:e.resultWorld})}createExecutionFailedEvent(e,r,o=Date.now()){if(!e.resultWorld)throw new Error("GOV-EVT-7 violation: execution:failed requires proposal.resultWorld");return d({type:"execution:failed",timestamp:o,proposalId:e.proposalId,executionKey:e.executionKey,resultWorld:e.resultWorld,error:d({summary:r.summary,...r.currentError!==void 0?{currentError:r.currentError}:{},...r.pendingRequirements!==void 0?{pendingRequirements:r.pendingRequirements}:{}})})}createWorldCreatedEvent(e,r,o,n,i=Date.now()){return d({type:"world:created",timestamp:i,world:e,from:o,proposalId:r,outcome:n})}createWorldForkedEvent(e,r,o=Date.now()){return d({type:"world:forked",timestamp:o,branchId:e,forkPoint:r})}async resolveBranchInfo(e){return this.options.lineageService?.getBranch(e)??null}async assertBranchGateAvailable(e){let r=await this.store.getExecutionStageProposal(e.branchId);if(r&&r.proposalId!==e.proposalId)throw new Error(`GOV-BRANCH-GATE-1 violation: branch ${e.branchId} already occupied by ${r.proposalId}`)}transitionProposal(e,r,o={}){if(!x(e.status,r))throw new Error(`GOV-TRANS-1 violation: invalid transition ${e.status} -> ${r}; valid targets are ${S(e.status).join(", ")}`);if(r==="superseded"){if(o.decisionId!=null)throw new Error("GOV-TRANS-3 violation: superseded transition must not create DecisionRecord");if(!o.supersededReason)throw new Error("GOV-STAGE-7 violation: superseded proposal must record supersededReason")}if(w(e.status,r)&&o.decisionId==null)throw new Error(`GOV-TRANS-2 violation: transition ${e.status} -> ${r} requires decisionId`);if(r!=="superseded"&&o.supersededReason!=null)throw new Error("GOV-TRANS-4 violation: supersededReason is only valid on superseded proposals");if(c(e.status)&&r==="superseded")throw new Error("GOV-STAGE-4 violation: execution-stage proposals must not be superseded");return d({...e,status:r,...o.decisionId!==void 0?{decisionId:o.decisionId}:{},...o.decidedAt!==void 0?{decidedAt:o.decidedAt}:{},...o.completedAt!==void 0?{completedAt:o.completedAt}:{},...o.resultWorld!==void 0?{resultWorld:o.resultWorld}:{},...o.approvedScope!==void 0?{approvedScope:o.approvedScope}:{},...o.supersededReason!==void 0?{supersededReason:o.supersededReason}:{},...r!=="superseded"?{supersededReason:void 0}:{}})}};function be(t,e){return new g(t,e)}export{P as a,u as b,C as c,q as d,E as e,M as f,G as g,W as h,j as i,U as j,A as k,c as l,Q as m,x as n,S as o,w as p,y as q,Y as r,m as s,R as t,h as u,T as v,v as w,k as x,I as y,H as z,f as A,ue as B,he as C,F as D,fe as E,N as F,g as G,be as H};
2
- //# sourceMappingURL=chunk-GIPNAEHI.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/types.ts","../src/state-machine.ts","../src/store/in-memory-governance-store.ts","../src/authority/auto.ts","../src/authority/hitl.ts","../src/authority/policy.ts","../src/authority/tribunal.ts","../src/authority/evaluator.ts","../src/event-dispatcher.ts","../src/intent-instance.ts","../src/service/governance-service.ts"],"sourcesContent":["import type { ErrorValue, Intent as HostIntent, Snapshot } from \"@manifesto-ai/core\";\nimport type { ArtifactRef, BranchId, World, WorldId } from \"@manifesto-ai/lineage\";\nimport type { PreparedLineageCommit } from \"@manifesto-ai/lineage/provider\";\n\nexport type { Snapshot } from \"@manifesto-ai/core\";\nexport type {\n ArtifactRef,\n BranchId,\n World,\n WorldId,\n} from \"@manifesto-ai/lineage\";\n\nexport type ProposalId = string;\nexport type DecisionId = string;\nexport type ActorId = string;\nexport type AuthorityId = string;\nexport type ExecutionKey = string;\n\nexport type ActorKind = \"human\" | \"agent\" | \"system\";\nexport type AuthorityKind = \"auto\" | \"human\" | \"policy\" | \"tribunal\";\nexport type ProposalStatus =\n | \"submitted\"\n | \"evaluating\"\n | \"approved\"\n | \"rejected\"\n | \"executing\"\n | \"completed\"\n | \"failed\"\n | \"superseded\";\n\nexport type SupersedeReason =\n | \"branch_switch\"\n | \"head_advance\"\n | \"manual_cancel\";\n\nexport interface ActorRef {\n readonly actorId: ActorId;\n readonly kind: ActorKind;\n readonly name?: string;\n readonly meta?: Record<string, unknown>;\n}\n\nexport interface AuthorityRef {\n readonly authorityId: AuthorityId;\n readonly kind: AuthorityKind;\n readonly name?: string;\n}\n\nexport interface IntentScope {\n readonly allowedPaths?: readonly string[];\n readonly note?: string;\n}\n\nexport type SourceKind = \"ui\" | \"api\" | \"agent\" | \"system\";\n\nexport interface SourceRef {\n readonly kind: SourceKind;\n readonly eventId: string;\n}\n\nexport interface IntentOrigin {\n readonly projectionId: string;\n readonly source: SourceRef;\n readonly actor: ActorRef;\n readonly note?: string;\n}\n\nexport interface IntentBody {\n readonly type: string;\n readonly input?: unknown;\n readonly scopeProposal?: IntentScope;\n}\n\nexport interface IntentInstance {\n readonly body: IntentBody;\n readonly intentId: string;\n readonly intentKey: string;\n readonly meta: {\n readonly origin: IntentOrigin;\n };\n}\n\nexport interface Intent {\n readonly type: string;\n readonly intentId: string;\n readonly input?: unknown;\n readonly scopeProposal?: IntentScope;\n}\n\nexport interface ExecutionKeyContext {\n readonly proposalId: ProposalId;\n readonly actorId: ActorId;\n readonly baseWorld: WorldId;\n readonly branchId: BranchId;\n readonly attempt: number;\n}\n\nexport type ExecutionKeyPolicy = (context: ExecutionKeyContext) => ExecutionKey;\n\nexport interface Proposal {\n readonly proposalId: ProposalId;\n readonly baseWorld: WorldId;\n readonly branchId: BranchId;\n readonly actorId: ActorId;\n readonly authorityId: AuthorityId;\n readonly intent: Intent;\n readonly status: ProposalStatus;\n readonly executionKey: ExecutionKey;\n readonly submittedAt: number;\n readonly decidedAt?: number;\n readonly completedAt?: number;\n readonly decisionId?: DecisionId;\n readonly epoch: number;\n readonly resultWorld?: WorldId;\n readonly supersededReason?: SupersedeReason;\n readonly approvedScope?: unknown;\n}\n\nexport type FinalDecision =\n | { readonly kind: \"approved\" }\n | { readonly kind: \"rejected\"; readonly reason?: string };\n\nexport interface DecisionRecord {\n readonly decisionId: DecisionId;\n readonly proposalId: ProposalId;\n readonly authorityId: AuthorityId;\n readonly decision: FinalDecision;\n readonly decidedAt: number;\n}\n\nexport type AuthorityPolicy =\n | { readonly mode: \"auto_approve\"; readonly reason?: string }\n | {\n readonly mode: \"hitl\";\n readonly delegate: ActorRef;\n readonly timeout?: number;\n readonly onTimeout?: \"approve\" | \"reject\";\n }\n | {\n readonly mode: \"policy_rules\";\n readonly rules: readonly PolicyRule[];\n readonly defaultDecision: \"approve\" | \"reject\" | \"escalate\";\n readonly escalateTo?: AuthorityRef;\n }\n | {\n readonly mode: \"tribunal\";\n readonly members: readonly ActorRef[];\n readonly quorum: QuorumRule;\n readonly timeout?: number;\n readonly onTimeout?: \"approve\" | \"reject\";\n };\n\nexport interface ActorAuthorityBinding {\n readonly actorId: ActorId;\n readonly authorityId: AuthorityId;\n readonly policy: AuthorityPolicy;\n}\n\nexport type PolicyCondition =\n | { readonly kind: \"intent_type\"; readonly types: readonly string[] }\n | { readonly kind: \"scope_pattern\"; readonly pattern: string }\n | { readonly kind: \"custom\"; readonly evaluator: string };\n\nexport interface PolicyRule {\n readonly condition: PolicyCondition;\n readonly decision: \"approve\" | \"reject\" | \"escalate\";\n readonly reason?: string;\n}\n\nexport type QuorumRule =\n | { readonly kind: \"unanimous\" }\n | { readonly kind: \"majority\" }\n | { readonly kind: \"threshold\"; readonly count: number };\n\nexport type WaitingFor =\n | { readonly kind: \"human\"; readonly delegate: ActorRef }\n | { readonly kind: \"tribunal\"; readonly members: readonly ActorRef[] }\n | { readonly kind: \"timeout\"; readonly until: number };\n\nexport type AuthorityResponse =\n | { readonly kind: \"approved\"; readonly approvedScope: IntentScope | null }\n | { readonly kind: \"rejected\"; readonly reason?: string }\n | { readonly kind: \"pending\"; readonly waitingFor: WaitingFor };\n\nexport interface Vote {\n readonly voter: ActorRef;\n readonly decision: \"approve\" | \"reject\" | \"abstain\";\n readonly reasoning?: string;\n readonly votedAt: number;\n}\n\nexport type GovernanceEventType =\n | \"proposal:submitted\"\n | \"proposal:evaluating\"\n | \"proposal:decided\"\n | \"proposal:superseded\"\n | \"execution:completed\"\n | \"execution:failed\"\n | \"world:created\"\n | \"world:forked\";\n\nexport interface BaseGovernanceEvent<T extends GovernanceEventType> {\n readonly type: T;\n readonly timestamp: number;\n}\n\nexport interface ErrorInfo {\n readonly summary: string;\n readonly currentError?: ErrorValue;\n readonly pendingRequirements?: readonly string[];\n}\n\nexport interface ProposalSubmittedEvent\n extends BaseGovernanceEvent<\"proposal:submitted\"> {\n readonly proposalId: ProposalId;\n readonly actorId: ActorId;\n readonly baseWorld: WorldId;\n readonly branchId: BranchId;\n readonly intent: {\n readonly type: string;\n readonly intentId: string;\n readonly input?: unknown;\n };\n readonly executionKey: ExecutionKey;\n readonly epoch: number;\n}\n\nexport interface ProposalEvaluatingEvent\n extends BaseGovernanceEvent<\"proposal:evaluating\"> {\n readonly proposalId: ProposalId;\n}\n\nexport interface ProposalDecidedEvent\n extends BaseGovernanceEvent<\"proposal:decided\"> {\n readonly proposalId: ProposalId;\n readonly decisionId: DecisionId;\n readonly decision: \"approved\" | \"rejected\";\n readonly reason?: string;\n}\n\nexport interface ProposalSupersededEvent\n extends BaseGovernanceEvent<\"proposal:superseded\"> {\n readonly proposalId: ProposalId;\n readonly currentEpoch: number;\n readonly proposalEpoch: number;\n readonly reason: SupersedeReason;\n}\n\nexport interface ExecutionCompletedEvent\n extends BaseGovernanceEvent<\"execution:completed\"> {\n readonly proposalId: ProposalId;\n readonly executionKey: ExecutionKey;\n readonly resultWorld: WorldId;\n}\n\nexport interface ExecutionFailedEvent\n extends BaseGovernanceEvent<\"execution:failed\"> {\n readonly proposalId: ProposalId;\n readonly executionKey: ExecutionKey;\n readonly resultWorld: WorldId;\n readonly error: ErrorInfo;\n}\n\nexport interface WorldCreatedEvent\n extends BaseGovernanceEvent<\"world:created\"> {\n readonly world: World;\n readonly from: WorldId;\n readonly proposalId: ProposalId;\n readonly outcome: \"completed\" | \"failed\";\n}\n\nexport interface WorldForkedEvent\n extends BaseGovernanceEvent<\"world:forked\"> {\n readonly branchId: BranchId;\n readonly forkPoint: WorldId;\n}\n\nexport type GovernanceEvent =\n | ProposalSubmittedEvent\n | ProposalEvaluatingEvent\n | ProposalDecidedEvent\n | ProposalSupersededEvent\n | ExecutionCompletedEvent\n | ExecutionFailedEvent\n | WorldCreatedEvent\n | WorldForkedEvent;\n\nexport interface GovernanceEventSink {\n emit(event: GovernanceEvent): void;\n}\n\nexport interface GovernanceEventDispatcher {\n emitSealCompleted(\n governanceCommit: PreparedGovernanceCommit,\n lineageCommit: PreparedLineageCommit\n ): void;\n}\n\nexport interface PreparedGovernanceCommit {\n readonly proposal: Proposal;\n readonly decisionRecord: DecisionRecord;\n}\n\nexport interface GovernanceStore {\n putProposal(proposal: Proposal): Promise<void>;\n getProposal(proposalId: ProposalId): Promise<Proposal | null>;\n getProposalsByBranch(branchId: BranchId): Promise<readonly Proposal[]>;\n getExecutionStageProposal(branchId: BranchId): Promise<Proposal | null>;\n putDecisionRecord(record: DecisionRecord): Promise<void>;\n getDecisionRecord(decisionId: DecisionId): Promise<DecisionRecord | null>;\n putActorBinding(binding: ActorAuthorityBinding): Promise<void>;\n getActorBinding(actorId: ActorId): Promise<ActorAuthorityBinding | null>;\n getActorBindings(): Promise<readonly ActorAuthorityBinding[]>;\n}\n\nexport interface CreateProposalInput {\n readonly proposalId?: ProposalId;\n readonly baseWorld: WorldId;\n readonly branchId: BranchId;\n readonly actorId: ActorId;\n readonly authorityId: AuthorityId;\n readonly intent: Intent;\n readonly executionKey: ExecutionKey;\n readonly submittedAt: number;\n readonly epoch: number;\n}\n\nexport interface PrepareAuthorityResultOptions {\n readonly currentEpoch?: number;\n readonly currentBranchHead?: WorldId;\n readonly decisionId?: DecisionId;\n readonly decidedAt: number;\n}\n\nexport interface PreparedAuthorityResult {\n readonly proposal: Proposal;\n readonly decisionRecord?: DecisionRecord;\n readonly discarded: boolean;\n}\n\nexport interface GovernanceService {\n createProposal(input: CreateProposalInput): Proposal;\n beginEvaluating(proposal: Proposal): Proposal & { readonly status: \"evaluating\" };\n beginExecution(proposal: Proposal): Proposal & { readonly status: \"executing\" };\n failExecution(\n proposal: Proposal,\n completedAt: number,\n resultWorld?: WorldId\n ): Proposal & { readonly status: \"failed\" };\n prepareAuthorityResult(\n proposal: Proposal,\n response: Extract<AuthorityResponse, { kind: \"approved\" | \"rejected\" }>,\n options: PrepareAuthorityResultOptions\n ): Promise<PreparedAuthorityResult>;\n prepareSupersede(proposal: Proposal, reason: SupersedeReason): Proposal;\n invalidateStaleIngress(\n branchId: BranchId,\n currentEpoch?: number\n ): Promise<readonly Proposal[]>;\n shouldDiscardAuthorityResult(proposal: Proposal, currentEpoch: number): boolean;\n deriveOutcome(terminalSnapshot: Snapshot): \"completed\" | \"failed\";\n finalize(\n executingProposal: Proposal,\n lineageCommit: PreparedLineageCommit,\n completedAt: number\n ): Promise<PreparedGovernanceCommit>;\n createProposalSubmittedEvent(\n proposal: Proposal,\n timestamp?: number\n ): ProposalSubmittedEvent;\n createProposalEvaluatingEvent(\n proposal: Proposal,\n timestamp?: number\n ): ProposalEvaluatingEvent;\n createProposalDecidedEvent(\n proposal: Proposal,\n decisionRecord: DecisionRecord,\n timestamp?: number\n ): ProposalDecidedEvent;\n createProposalSupersededEvent(\n proposal: Proposal,\n currentEpoch: number,\n timestamp?: number\n ): ProposalSupersededEvent;\n createExecutionCompletedEvent(\n proposal: Proposal,\n timestamp?: number\n ): ExecutionCompletedEvent;\n createExecutionFailedEvent(\n proposal: Proposal,\n error: ErrorInfo,\n timestamp?: number\n ): ExecutionFailedEvent;\n createWorldCreatedEvent(\n world: World,\n proposalId: ProposalId,\n from: WorldId,\n outcome: \"completed\" | \"failed\",\n timestamp?: number\n ): WorldCreatedEvent;\n createWorldForkedEvent(\n branchId: BranchId,\n forkPoint: WorldId,\n timestamp?: number\n ): WorldForkedEvent;\n}\n\nexport function createProposalId(value?: string): ProposalId {\n return value ?? `prop-${crypto.randomUUID()}`;\n}\n\nexport function createDecisionId(value?: string): DecisionId {\n return value ?? `dec-${crypto.randomUUID()}`;\n}\n\nexport function createExecutionKey(proposalId: ProposalId, attempt = 1): ExecutionKey {\n return `${proposalId}:${attempt}`;\n}\n\nexport const defaultExecutionKeyPolicy: ExecutionKeyPolicy = ({\n proposalId,\n attempt,\n}) => createExecutionKey(proposalId, attempt);\n\nexport function createNoopGovernanceEventSink(): GovernanceEventSink {\n return {\n emit(): void {\n // no-op\n },\n };\n}\n\nexport function toHostIntent(intent: Intent | IntentInstance): HostIntent {\n if (\"body\" in intent) {\n return {\n type: intent.body.type,\n input: intent.body.input,\n intentId: intent.intentId,\n };\n }\n\n return {\n type: intent.type,\n input: intent.input,\n intentId: intent.intentId,\n };\n}\n","import type { ProposalStatus } from \"./types.js\";\n\nexport const INGRESS_STATUSES = [\"submitted\", \"evaluating\"] as const satisfies readonly ProposalStatus[];\nexport const EXECUTION_STAGE_STATUSES = [\"approved\", \"executing\"] as const satisfies readonly ProposalStatus[];\nexport const TERMINAL_STATUSES = [\"rejected\", \"completed\", \"failed\", \"superseded\"] as const satisfies readonly ProposalStatus[];\nexport const DECISION_TRANSITION_TARGETS = [\"approved\", \"rejected\"] as const satisfies readonly ProposalStatus[];\n\nconst VALID_TRANSITIONS: Record<ProposalStatus, readonly ProposalStatus[]> = {\n submitted: [\"evaluating\", \"rejected\", \"superseded\"],\n evaluating: [\"approved\", \"rejected\", \"superseded\"],\n approved: [\"executing\"],\n rejected: [],\n executing: [\"completed\", \"failed\"],\n completed: [],\n failed: [],\n superseded: [],\n};\n\nexport function isIngressStatus(status: ProposalStatus): boolean {\n return (INGRESS_STATUSES as readonly ProposalStatus[]).includes(status);\n}\n\nexport function isExecutionStageStatus(status: ProposalStatus): boolean {\n return (EXECUTION_STAGE_STATUSES as readonly ProposalStatus[]).includes(status);\n}\n\nexport function isTerminalStatus(status: ProposalStatus): boolean {\n return (TERMINAL_STATUSES as readonly ProposalStatus[]).includes(status);\n}\n\nexport function isValidTransition(\n from: ProposalStatus,\n to: ProposalStatus\n): boolean {\n return VALID_TRANSITIONS[from].includes(to);\n}\n\nexport function getValidTransitions(status: ProposalStatus): ProposalStatus[] {\n return [...VALID_TRANSITIONS[status]];\n}\n\nexport function transitionCreatesDecisionRecord(\n from: ProposalStatus,\n to: ProposalStatus\n): boolean {\n return (\n (from === \"submitted\" && to === \"rejected\") ||\n (from === \"evaluating\" && to === \"approved\") ||\n (from === \"evaluating\" && to === \"rejected\")\n );\n}\n","import { isExecutionStageStatus } from \"../state-machine.js\";\nimport type {\n ActorAuthorityBinding,\n ActorId,\n BranchId,\n DecisionId,\n DecisionRecord,\n GovernanceStore,\n Proposal,\n ProposalId,\n} from \"../types.js\";\n\nfunction cloneValue<T>(value: T): T {\n return structuredClone(value);\n}\n\ntype InMemoryGovernanceStoreState = {\n proposals: Map<ProposalId, Proposal>;\n decisions: Map<DecisionId, DecisionRecord>;\n actorBindings: Map<ActorId, ActorAuthorityBinding>;\n};\n\nexport class InMemoryGovernanceStore implements GovernanceStore {\n private readonly proposals = new Map<ProposalId, Proposal>();\n private readonly decisions = new Map<DecisionId, DecisionRecord>();\n private readonly actorBindings = new Map<ActorId, ActorAuthorityBinding>();\n\n async putProposal(proposal: Proposal): Promise<void> {\n this.proposals.set(proposal.proposalId, cloneValue(proposal));\n }\n\n async getProposal(proposalId: ProposalId): Promise<Proposal | null> {\n return cloneValue(this.proposals.get(proposalId) ?? null);\n }\n\n async getProposalsByBranch(branchId: BranchId): Promise<readonly Proposal[]> {\n return [...this.proposals.values()]\n .filter((proposal) => proposal.branchId === branchId)\n .sort((left, right) => {\n if (left.submittedAt !== right.submittedAt) {\n return left.submittedAt - right.submittedAt;\n }\n return left.proposalId.localeCompare(right.proposalId);\n })\n .map((proposal) => cloneValue(proposal));\n }\n\n async getExecutionStageProposal(branchId: BranchId): Promise<Proposal | null> {\n const matches = (await this.getProposalsByBranch(branchId)).filter((proposal) =>\n isExecutionStageStatus(proposal.status)\n );\n if (matches.length > 1) {\n throw new Error(\n `GOV-STORE-4 violation: multiple execution-stage proposals found for branch ${branchId}`\n );\n }\n return matches[0] ?? null;\n }\n\n async putDecisionRecord(record: DecisionRecord): Promise<void> {\n this.decisions.set(record.decisionId, cloneValue(record));\n }\n\n async getDecisionRecord(decisionId: DecisionId): Promise<DecisionRecord | null> {\n return cloneValue(this.decisions.get(decisionId) ?? null);\n }\n\n async putActorBinding(binding: ActorAuthorityBinding): Promise<void> {\n this.actorBindings.set(binding.actorId, cloneValue(binding));\n }\n\n async getActorBinding(actorId: ActorId): Promise<ActorAuthorityBinding | null> {\n return cloneValue(this.actorBindings.get(actorId) ?? null);\n }\n\n async getActorBindings(): Promise<readonly ActorAuthorityBinding[]> {\n return [...this.actorBindings.values()]\n .sort((left, right) => left.actorId.localeCompare(right.actorId))\n .map((binding) => cloneValue(binding));\n }\n\n snapshotState(): InMemoryGovernanceStoreState {\n return {\n proposals: cloneValue(this.proposals),\n decisions: cloneValue(this.decisions),\n actorBindings: cloneValue(this.actorBindings),\n };\n }\n\n restoreState(state: InMemoryGovernanceStoreState): void {\n this.proposals.clear();\n for (const [proposalId, proposal] of state.proposals) {\n this.proposals.set(proposalId, cloneValue(proposal));\n }\n\n this.decisions.clear();\n for (const [decisionId, record] of state.decisions) {\n this.decisions.set(decisionId, cloneValue(record));\n }\n\n this.actorBindings.clear();\n for (const [actorId, binding] of state.actorBindings) {\n this.actorBindings.set(actorId, cloneValue(binding));\n }\n }\n}\n\nexport function createInMemoryGovernanceStore(): InMemoryGovernanceStore {\n return new InMemoryGovernanceStore();\n}\n","import type { ActorAuthorityBinding, AuthorityResponse, Proposal } from \"../types.js\";\nimport type { AuthorityHandler } from \"./types.js\";\n\nexport class AutoApproveHandler implements AuthorityHandler {\n async evaluate(\n proposal: Proposal,\n binding: ActorAuthorityBinding\n ): Promise<AuthorityResponse> {\n if (binding.policy.mode !== \"auto_approve\") {\n throw new Error(\n `AutoApproveHandler received non-auto_approve policy: ${binding.policy.mode}`\n );\n }\n\n return {\n kind: \"approved\",\n approvedScope: proposal.intent.scopeProposal ?? null,\n };\n }\n}\n\nexport function createAutoApproveHandler(): AutoApproveHandler {\n return new AutoApproveHandler();\n}\n","import type {\n ActorAuthorityBinding,\n AuthorityResponse,\n IntentScope,\n Proposal,\n} from \"../types.js\";\nimport type { AuthorityHandler, HITLPendingState } from \"./types.js\";\n\nexport type HITLNotificationCallback = (\n proposalId: string,\n proposal: Proposal,\n binding: ActorAuthorityBinding\n) => void;\n\nexport class HITLHandler implements AuthorityHandler {\n private readonly pendingDecisions = new Map<string, HITLPendingState>();\n private readonly notificationCallbacks = new Set<HITLNotificationCallback>();\n\n onPendingDecision(callback: HITLNotificationCallback): () => void {\n this.notificationCallbacks.add(callback);\n return () => {\n this.notificationCallbacks.delete(callback);\n };\n }\n\n async evaluate(\n proposal: Proposal,\n binding: ActorAuthorityBinding\n ): Promise<AuthorityResponse> {\n if (binding.policy.mode !== \"hitl\") {\n throw new Error(`HITLHandler received non-hitl policy: ${binding.policy.mode}`);\n }\n const policy = binding.policy;\n\n const proposalId = proposal.proposalId;\n if (this.pendingDecisions.has(proposalId)) {\n throw new Error(`Proposal ${proposalId} already has a pending HITL decision`);\n }\n\n return new Promise((resolve, reject) => {\n const state: HITLPendingState = {\n proposalId,\n proposal,\n resolve,\n reject,\n };\n\n if (policy.timeout != null) {\n state.timeoutId = setTimeout(() => {\n this.pendingDecisions.delete(proposalId);\n if (policy.onTimeout === \"approve\") {\n resolve({\n kind: \"approved\",\n approvedScope: proposal.intent.scopeProposal ?? null,\n });\n return;\n }\n reject(\n new Error(\n `HITL decision timed out after ${policy.timeout}ms for proposal '${proposalId}'`\n )\n );\n }, policy.timeout);\n }\n\n this.pendingDecisions.set(proposalId, state);\n for (const callback of this.notificationCallbacks) {\n callback(proposalId, proposal, binding);\n }\n });\n }\n\n submitDecision(\n proposalId: string,\n decision: \"approved\" | \"rejected\",\n reasoning?: string,\n approvedScope?: IntentScope | null\n ): void {\n const state = this.pendingDecisions.get(proposalId);\n if (!state) {\n throw new Error(`No pending HITL decision for proposal ${proposalId}`);\n }\n\n if (state.timeoutId) {\n clearTimeout(state.timeoutId);\n }\n this.pendingDecisions.delete(proposalId);\n\n if (decision === \"approved\") {\n state.resolve({\n kind: \"approved\",\n approvedScope:\n approvedScope !== undefined\n ? approvedScope\n : state.proposal?.intent.scopeProposal ?? null,\n });\n return;\n }\n\n state.resolve({\n kind: \"rejected\",\n reason: reasoning ?? \"Human rejected\",\n });\n }\n\n isPending(proposalId: string): boolean {\n return this.pendingDecisions.has(proposalId);\n }\n\n getPendingIds(): string[] {\n return [...this.pendingDecisions.keys()];\n }\n\n clearAllPending(): void {\n for (const [proposalId, state] of this.pendingDecisions) {\n if (state.timeoutId) {\n clearTimeout(state.timeoutId);\n }\n state.reject(new Error(`HITL handler cleared pending proposal ${proposalId}`));\n }\n this.pendingDecisions.clear();\n }\n}\n\nexport function createHITLHandler(): HITLHandler {\n return new HITLHandler();\n}\n","import type {\n ActorAuthorityBinding,\n AuthorityResponse,\n IntentScope,\n PolicyCondition,\n PolicyRule,\n Proposal,\n} from \"../types.js\";\nimport type { AuthorityHandler } from \"./types.js\";\n\nexport type CustomConditionEvaluator = (\n proposal: Proposal,\n binding: ActorAuthorityBinding\n) => boolean;\n\nexport class PolicyRulesHandler implements AuthorityHandler {\n private readonly customEvaluators = new Map<string, CustomConditionEvaluator>();\n\n registerCustomEvaluator(\n name: string,\n evaluator: CustomConditionEvaluator\n ): void {\n this.customEvaluators.set(name, evaluator);\n }\n\n async evaluate(\n proposal: Proposal,\n binding: ActorAuthorityBinding\n ): Promise<AuthorityResponse> {\n if (binding.policy.mode !== \"policy_rules\") {\n throw new Error(\n `PolicyRulesHandler received non-policy_rules policy: ${binding.policy.mode}`\n );\n }\n\n const approvedScope = proposal.intent.scopeProposal ?? null;\n for (const rule of binding.policy.rules) {\n if (this.evaluateCondition(rule.condition, proposal, binding)) {\n return this.applyDecision(rule, approvedScope);\n }\n }\n\n return this.applyDecision(\n {\n decision: binding.policy.defaultDecision,\n reason: \"Default policy decision\",\n },\n approvedScope\n );\n }\n\n private evaluateCondition(\n condition: PolicyCondition,\n proposal: Proposal,\n binding: ActorAuthorityBinding\n ): boolean {\n switch (condition.kind) {\n case \"intent_type\":\n return condition.types.includes(proposal.intent.type);\n case \"scope_pattern\":\n return this.matchPattern(proposal.intent.type, condition.pattern);\n case \"custom\": {\n const evaluator = this.customEvaluators.get(condition.evaluator);\n return evaluator ? evaluator(proposal, binding) : false;\n }\n }\n }\n\n private matchPattern(value: string, pattern: string): boolean {\n const regex = new RegExp(\n `^${pattern.replace(/\\*/g, \".*\").replace(/\\?/g, \".\")}$`\n );\n return regex.test(value);\n }\n\n private applyDecision(\n rule: Pick<PolicyRule, \"decision\" | \"reason\">,\n approvedScope: IntentScope | null\n ): AuthorityResponse {\n switch (rule.decision) {\n case \"approve\":\n return { kind: \"approved\", approvedScope };\n case \"reject\":\n return { kind: \"rejected\", reason: rule.reason ?? \"Policy rejection\" };\n case \"escalate\":\n return {\n kind: \"rejected\",\n reason: rule.reason ?? \"Policy requires escalation (not implemented)\",\n };\n }\n }\n}\n\nexport function createPolicyRulesHandler(): PolicyRulesHandler {\n return new PolicyRulesHandler();\n}\n","import type {\n ActorAuthorityBinding,\n ActorRef,\n AuthorityResponse,\n Proposal,\n Vote,\n} from \"../types.js\";\nimport type { AuthorityHandler } from \"./types.js\";\n\nexport type TribunalNotificationCallback = (\n proposalId: string,\n proposal: Proposal,\n members: readonly ActorRef[]\n) => void;\n\ninterface TribunalPendingState {\n proposalId: string;\n proposal: Proposal;\n binding: Extract<ActorAuthorityBinding, { policy: { mode: \"tribunal\" } }> | ActorAuthorityBinding;\n votes: Map<string, Vote>;\n resolve: (response: AuthorityResponse) => void;\n reject: (error: Error) => void;\n timeoutId?: ReturnType<typeof setTimeout>;\n}\n\nexport class TribunalHandler implements AuthorityHandler {\n private readonly pendingTribunals = new Map<string, TribunalPendingState>();\n private notificationCallback?: TribunalNotificationCallback;\n\n onPendingTribunal(callback: TribunalNotificationCallback): void {\n this.notificationCallback = callback;\n }\n\n async evaluate(\n proposal: Proposal,\n binding: ActorAuthorityBinding\n ): Promise<AuthorityResponse> {\n if (binding.policy.mode !== \"tribunal\") {\n throw new Error(\n `TribunalHandler received non-tribunal policy: ${binding.policy.mode}`\n );\n }\n const policy = binding.policy;\n\n const proposalId = proposal.proposalId;\n if (this.pendingTribunals.has(proposalId)) {\n throw new Error(`Proposal ${proposalId} already has a pending tribunal`);\n }\n\n return new Promise((resolve, reject) => {\n const state: TribunalPendingState = {\n proposalId,\n proposal,\n binding,\n votes: new Map(),\n resolve,\n reject,\n };\n\n if (policy.timeout != null) {\n state.timeoutId = setTimeout(() => {\n this.pendingTribunals.delete(proposalId);\n if (policy.onTimeout === \"approve\") {\n resolve({\n kind: \"approved\",\n approvedScope: proposal.intent.scopeProposal ?? null,\n });\n return;\n }\n reject(\n new Error(\n `Tribunal decision timed out after ${policy.timeout}ms for proposal '${proposalId}'`\n )\n );\n }, policy.timeout);\n }\n\n this.pendingTribunals.set(proposalId, state);\n this.notificationCallback?.(\n proposalId,\n proposal,\n policy.members\n );\n });\n }\n\n submitVote(\n proposalId: string,\n voter: ActorRef,\n decision: \"approve\" | \"reject\" | \"abstain\",\n reasoning?: string\n ): void {\n const state = this.pendingTribunals.get(proposalId);\n if (!state) {\n throw new Error(`No pending tribunal for proposal ${proposalId}`);\n }\n\n if (state.votes.has(voter.actorId)) {\n throw new Error(`Actor ${voter.actorId} already voted on proposal ${proposalId}`);\n }\n\n const member = state.binding.policy.mode === \"tribunal\"\n ? state.binding.policy.members.some(({ actorId }) => actorId === voter.actorId)\n : false;\n if (!member) {\n throw new Error(`Actor ${voter.actorId} is not a tribunal member for proposal ${proposalId}`);\n }\n\n state.votes.set(voter.actorId, {\n voter,\n decision,\n reasoning,\n votedAt: Date.now(),\n });\n this.checkQuorum(state);\n }\n\n isPending(proposalId: string): boolean {\n return this.pendingTribunals.has(proposalId);\n }\n\n getVotes(proposalId: string): Vote[] {\n const state = this.pendingTribunals.get(proposalId);\n return state ? [...state.votes.values()] : [];\n }\n\n getPendingIds(): string[] {\n return [...this.pendingTribunals.keys()];\n }\n\n clearAllPending(): void {\n for (const [proposalId, state] of this.pendingTribunals) {\n if (state.timeoutId) {\n clearTimeout(state.timeoutId);\n }\n state.reject(new Error(`Tribunal handler cleared pending proposal ${proposalId}`));\n }\n this.pendingTribunals.clear();\n }\n\n private checkQuorum(state: TribunalPendingState): void {\n const policy = state.binding.policy;\n if (policy.mode !== \"tribunal\") {\n return;\n }\n\n const memberCount = policy.members.length;\n let approveCount = 0;\n let rejectCount = 0;\n for (const vote of state.votes.values()) {\n if (vote.decision === \"approve\") {\n approveCount++;\n } else if (vote.decision === \"reject\") {\n rejectCount++;\n }\n }\n\n let isComplete = false;\n let isApproved = false;\n switch (policy.quorum.kind) {\n case \"unanimous\":\n if (approveCount === memberCount) {\n isComplete = true;\n isApproved = true;\n } else if (rejectCount > 0 || state.votes.size === memberCount) {\n isComplete = true;\n }\n break;\n case \"majority\": {\n const majorityNeeded = Math.floor(memberCount / 2) + 1;\n if (approveCount >= majorityNeeded) {\n isComplete = true;\n isApproved = true;\n } else if (rejectCount >= majorityNeeded) {\n isComplete = true;\n } else if (state.votes.size === memberCount) {\n isComplete = true;\n isApproved = approveCount > rejectCount;\n }\n break;\n }\n case \"threshold\":\n if (approveCount >= policy.quorum.count) {\n isComplete = true;\n isApproved = true;\n } else if (rejectCount > memberCount - policy.quorum.count) {\n isComplete = true;\n } else if (state.votes.size === memberCount) {\n isComplete = true;\n isApproved = approveCount >= policy.quorum.count;\n }\n break;\n }\n\n if (!isComplete) {\n return;\n }\n\n if (state.timeoutId) {\n clearTimeout(state.timeoutId);\n }\n this.pendingTribunals.delete(state.proposalId);\n\n if (isApproved) {\n state.resolve({\n kind: \"approved\",\n approvedScope: state.proposal.intent.scopeProposal ?? null,\n });\n return;\n }\n\n state.resolve({\n kind: \"rejected\",\n reason: `Tribunal rejected (${approveCount}/${memberCount} approved)`,\n });\n }\n}\n\nexport function createTribunalHandler(): TribunalHandler {\n return new TribunalHandler();\n}\n","import type {\n ActorAuthorityBinding,\n AuthorityKind,\n AuthorityResponse,\n IntentScope,\n Proposal,\n} from \"../types.js\";\nimport type { AuthorityHandler } from \"./types.js\";\nimport { AutoApproveHandler, createAutoApproveHandler } from \"./auto.js\";\nimport { HITLHandler, createHITLHandler } from \"./hitl.js\";\nimport { PolicyRulesHandler, createPolicyRulesHandler } from \"./policy.js\";\nimport { TribunalHandler, createTribunalHandler } from \"./tribunal.js\";\n\nconst POLICY_MODE_TO_KIND: Record<string, AuthorityKind> = {\n auto_approve: \"auto\",\n hitl: \"human\",\n policy_rules: \"policy\",\n tribunal: \"tribunal\",\n};\n\nexport class AuthorityEvaluator {\n private readonly handlers = new Map<string, AuthorityHandler>();\n private readonly autoHandler: AutoApproveHandler;\n private readonly policyHandler: PolicyRulesHandler;\n private readonly hitlHandler: HITLHandler;\n private readonly tribunalHandler: TribunalHandler;\n\n constructor() {\n this.autoHandler = createAutoApproveHandler();\n this.policyHandler = createPolicyRulesHandler();\n this.hitlHandler = createHITLHandler();\n this.tribunalHandler = createTribunalHandler();\n\n this.handlers.set(\"auto_approve\", this.autoHandler);\n this.handlers.set(\"hitl\", this.hitlHandler);\n this.handlers.set(\"policy_rules\", this.policyHandler);\n this.handlers.set(\"tribunal\", this.tribunalHandler);\n }\n\n async evaluate(\n proposal: Proposal,\n binding: ActorAuthorityBinding\n ): Promise<AuthorityResponse> {\n const handler = this.handlers.get(binding.policy.mode);\n if (!handler) {\n throw new Error(`Unknown policy mode: ${binding.policy.mode}`);\n }\n return handler.evaluate(proposal, binding);\n }\n\n registerHandler(policyMode: string, handler: AuthorityHandler): void {\n this.handlers.set(policyMode, handler);\n }\n\n getAutoHandler(): AutoApproveHandler {\n return this.autoHandler;\n }\n\n getPolicyHandler(): PolicyRulesHandler {\n return this.policyHandler;\n }\n\n getHITLHandler(): HITLHandler {\n return this.hitlHandler;\n }\n\n getTribunalHandler(): TribunalHandler {\n return this.tribunalHandler;\n }\n\n getAuthorityKind(policyMode: string): AuthorityKind | null {\n return POLICY_MODE_TO_KIND[policyMode] ?? null;\n }\n\n submitHITLDecision(\n proposalId: string,\n decision: \"approved\" | \"rejected\",\n reasoning?: string,\n approvedScope?: IntentScope | null\n ): void {\n this.hitlHandler.submitDecision(proposalId, decision, reasoning, approvedScope);\n }\n\n submitTribunalVote(\n proposalId: string,\n voter: {\n actorId: string;\n kind: \"human\" | \"agent\" | \"system\";\n name?: string;\n },\n decision: \"approve\" | \"reject\" | \"abstain\",\n reasoning?: string\n ): void {\n this.tribunalHandler.submitVote(proposalId, voter, decision, reasoning);\n }\n\n hasPendingHITL(): boolean {\n return this.hitlHandler.getPendingIds().length > 0;\n }\n\n hasPendingTribunal(): boolean {\n return this.tribunalHandler.getPendingIds().length > 0;\n }\n\n getPendingHITLIds(): string[] {\n return this.hitlHandler.getPendingIds();\n }\n\n getPendingTribunalIds(): string[] {\n return this.tribunalHandler.getPendingIds();\n }\n\n clearAllPending(): void {\n this.hitlHandler.clearAllPending();\n this.tribunalHandler.clearAllPending();\n }\n}\n\nexport function createAuthorityEvaluator(): AuthorityEvaluator {\n return new AuthorityEvaluator();\n}\n","import type {\n ErrorInfo,\n PreparedGovernanceCommit,\n} from \"./types.js\";\nimport type { PreparedLineageCommit } from \"@manifesto-ai/lineage/provider\";\nimport { createNoopGovernanceEventSink, type GovernanceEventDispatcher, type GovernanceEventSink, type GovernanceService } from \"./types.js\";\n\nexport interface CreateGovernanceEventDispatcherOptions {\n readonly service: Pick<\n GovernanceService,\n | \"createExecutionCompletedEvent\"\n | \"createExecutionFailedEvent\"\n | \"createWorldCreatedEvent\"\n | \"createWorldForkedEvent\"\n >;\n readonly sink?: GovernanceEventSink;\n readonly now?: () => number;\n}\n\nexport function createGovernanceEventDispatcher(\n options: CreateGovernanceEventDispatcherOptions\n): GovernanceEventDispatcher {\n const sink = options.sink ?? createNoopGovernanceEventSink();\n const now = options.now ?? Date.now;\n\n return {\n emitSealCompleted(\n governanceCommit: PreparedGovernanceCommit,\n lineageCommit: PreparedLineageCommit\n ): void {\n const timestamp = now();\n const outcome =\n governanceCommit.proposal.status === \"completed\" ? \"completed\" : \"failed\";\n\n sink.emit(\n options.service.createWorldCreatedEvent(\n lineageCommit.world,\n governanceCommit.proposal.proposalId,\n deriveWorldCreatedFrom(governanceCommit, lineageCommit),\n outcome,\n timestamp\n )\n );\n\n if (isTrueForkCommit(lineageCommit)) {\n sink.emit(\n options.service.createWorldForkedEvent(\n governanceCommit.proposal.branchId,\n lineageCommit.edge.from,\n timestamp\n )\n );\n }\n\n if (outcome === \"completed\") {\n sink.emit(options.service.createExecutionCompletedEvent(governanceCommit.proposal, timestamp));\n return;\n }\n\n sink.emit(\n options.service.createExecutionFailedEvent(\n governanceCommit.proposal,\n deriveExecutionFailure(lineageCommit),\n timestamp\n )\n );\n },\n };\n}\n\nfunction deriveWorldCreatedFrom(\n governanceCommit: PreparedGovernanceCommit,\n lineageCommit: PreparedLineageCommit\n): string {\n if (lineageCommit.kind === \"next\") {\n return lineageCommit.edge.from;\n }\n\n return lineageCommit.world.parentWorldId ?? governanceCommit.proposal.baseWorld;\n}\n\nfunction deriveExecutionFailure(lineageCommit: PreparedLineageCommit): ErrorInfo {\n const currentError = lineageCommit.terminalSnapshot.system.lastError ?? undefined;\n const pendingRequirements = lineageCommit.terminalSnapshot.system.pendingRequirements.map(\n (requirement) => requirement.id\n );\n\n return {\n summary: summarizeFailure(currentError ? 1 : 0, pendingRequirements.length),\n ...(currentError ? { currentError } : {}),\n ...(pendingRequirements.length > 0 ? { pendingRequirements } : {}),\n };\n}\n\nfunction isTrueForkCommit(\n lineageCommit: PreparedLineageCommit\n): lineageCommit is Extract<PreparedLineageCommit, { kind: \"next\" }> & {\n readonly forkCreated: true;\n} {\n return lineageCommit.kind === \"next\"\n && \"forkCreated\" in lineageCommit\n && lineageCommit.forkCreated === true;\n}\n\nfunction summarizeFailure(errorCount: number, pendingRequirementCount: number): string {\n if (errorCount > 0 && pendingRequirementCount > 0) {\n return `Execution failed with ${errorCount} error(s) and ${pendingRequirementCount} pending requirement(s)`;\n }\n if (errorCount > 0) {\n return `Execution failed with ${errorCount} error(s)`;\n }\n if (pendingRequirementCount > 0) {\n return `Execution failed with ${pendingRequirementCount} pending requirement(s)`;\n }\n return \"Execution failed\";\n}\n","import { sha256, toJcs } from \"@manifesto-ai/core\";\nimport type {\n ActorRef,\n IntentBody,\n IntentInstance,\n IntentOrigin,\n SourceRef,\n} from \"./types.js\";\n\nexport interface CreateIntentInstanceOptions {\n readonly body: IntentBody;\n readonly schemaHash: string;\n readonly projectionId: string;\n readonly source: SourceRef;\n readonly actor: ActorRef;\n readonly note?: string;\n readonly intentId?: string;\n}\n\nexport async function computeIntentKey(\n schemaHash: string,\n body: IntentBody\n): Promise<string> {\n const input = [\n schemaHash,\n body.type,\n toJcs(body.input ?? null),\n toJcs(body.scopeProposal ?? null),\n ].join(\":\");\n\n return sha256(input);\n}\n\nexport async function createIntentInstance(\n options: CreateIntentInstanceOptions\n): Promise<IntentInstance> {\n const intentId = options.intentId ?? `intent-${crypto.randomUUID()}`;\n const intentKey = await computeIntentKey(options.schemaHash, options.body);\n\n return createIntentInstanceSync(\n options.body,\n intentId,\n intentKey,\n {\n projectionId: options.projectionId,\n source: options.source,\n actor: options.actor,\n note: options.note,\n }\n );\n}\n\nexport function createIntentInstanceSync(\n body: IntentBody,\n intentId: string,\n intentKey: string,\n origin: IntentOrigin\n): IntentInstance {\n return deepFreeze({\n body,\n intentId,\n intentKey,\n meta: {\n origin,\n },\n });\n}\n\nfunction deepFreeze<T>(value: T): T {\n if (value === null || typeof value !== \"object\") {\n return value;\n }\n\n for (const key of Object.getOwnPropertyNames(value)) {\n const nested = (value as Record<string, unknown>)[key];\n if (nested !== null && typeof nested === \"object\") {\n deepFreeze(nested);\n }\n }\n\n return Object.freeze(value);\n}\n","import type {\n BranchInfo,\n LineageService,\n PreparedLineageCommit,\n World,\n WorldId,\n} from \"@manifesto-ai/lineage/provider\";\nimport {\n getValidTransitions,\n isExecutionStageStatus,\n isIngressStatus,\n isValidTransition,\n transitionCreatesDecisionRecord,\n} from \"../state-machine.js\";\nimport {\n createDecisionId,\n createProposalId,\n type AuthorityResponse,\n type BranchId,\n type CreateProposalInput,\n type DecisionRecord,\n type GovernanceService,\n type GovernanceStore,\n type ExecutionCompletedEvent,\n type ExecutionFailedEvent,\n type PreparedAuthorityResult,\n type PrepareAuthorityResultOptions,\n type PreparedGovernanceCommit,\n type Proposal,\n type ProposalDecidedEvent,\n type ProposalEvaluatingEvent,\n type ProposalId,\n type ProposalSubmittedEvent,\n type ProposalSupersededEvent,\n type WorldCreatedEvent,\n type WorldForkedEvent,\n type Snapshot,\n type SupersedeReason,\n type ErrorInfo,\n} from \"../types.js\";\n\nfunction freeze<T>(value: T): T {\n return Object.freeze(value);\n}\n\nexport interface GovernanceServiceOptions {\n readonly lineageService?: Pick<LineageService, \"getBranch\">;\n}\n\nexport class DefaultGovernanceService implements GovernanceService {\n public constructor(\n private readonly store: GovernanceStore,\n private readonly options: GovernanceServiceOptions = {}\n ) {}\n\n createProposal(input: CreateProposalInput): Proposal {\n return freeze({\n proposalId: input.proposalId ?? createProposalId(),\n baseWorld: input.baseWorld,\n branchId: input.branchId,\n actorId: input.actorId,\n authorityId: input.authorityId,\n intent: freeze({ ...input.intent }),\n status: \"submitted\" as const,\n executionKey: input.executionKey,\n submittedAt: input.submittedAt,\n epoch: input.epoch,\n });\n }\n\n beginEvaluating(proposal: Proposal): Proposal & { readonly status: \"evaluating\" } {\n return this.transitionProposal(proposal, \"evaluating\") as Proposal & {\n readonly status: \"evaluating\";\n };\n }\n\n beginExecution(proposal: Proposal): Proposal & { readonly status: \"executing\" } {\n if (!proposal.decisionId) {\n throw new Error(\n \"GOV-EXEC-1 violation: approved proposal requires decisionId before execution can begin\"\n );\n }\n\n return this.transitionProposal(proposal, \"executing\") as Proposal & {\n readonly status: \"executing\";\n };\n }\n\n failExecution(\n proposal: Proposal,\n completedAt: number,\n resultWorld?: WorldId\n ): Proposal & { readonly status: \"failed\" } {\n return this.transitionProposal(proposal, \"failed\", {\n completedAt,\n ...(resultWorld !== undefined ? { resultWorld } : {}),\n }) as Proposal & {\n readonly status: \"failed\";\n };\n }\n\n async prepareAuthorityResult(\n proposal: Proposal,\n response: Extract<AuthorityResponse, { kind: \"approved\" | \"rejected\" }>,\n options: PrepareAuthorityResultOptions\n ): Promise<PreparedAuthorityResult> {\n if (proposal.status !== \"submitted\" && proposal.status !== \"evaluating\") {\n throw new Error(\n `GOV-TRANS-1 violation: authority result requires ingress proposal, received ${proposal.status}`\n );\n }\n\n const branchInfo = await this.resolveBranchInfo(proposal.branchId);\n const currentEpoch = options.currentEpoch ?? branchInfo?.epoch ?? proposal.epoch;\n const currentHead = options.currentBranchHead ?? branchInfo?.head ?? proposal.baseWorld;\n\n if (this.shouldDiscardAuthorityResult(proposal, currentEpoch)) {\n return {\n proposal: this.prepareSupersede(proposal, \"head_advance\"),\n discarded: true,\n };\n }\n\n if (response.kind === \"approved\") {\n await this.assertBranchGateAvailable(proposal);\n if (currentHead !== proposal.baseWorld) {\n return {\n proposal: this.prepareSupersede(proposal, \"head_advance\"),\n discarded: true,\n };\n }\n\n const decisionRecord = freeze({\n decisionId: options.decisionId ?? createDecisionId(),\n proposalId: proposal.proposalId,\n authorityId: proposal.authorityId,\n decision: freeze({ kind: \"approved\" as const }),\n decidedAt: options.decidedAt,\n });\n\n return {\n proposal: this.transitionProposal(proposal, \"approved\", {\n decisionId: decisionRecord.decisionId,\n decidedAt: decisionRecord.decidedAt,\n approvedScope: response.approvedScope,\n }),\n decisionRecord,\n discarded: false,\n };\n }\n\n const decisionRecord = freeze({\n decisionId: options.decisionId ?? createDecisionId(),\n proposalId: proposal.proposalId,\n authorityId: proposal.authorityId,\n decision: freeze({\n kind: \"rejected\" as const,\n ...(response.reason ? { reason: response.reason } : {}),\n }),\n decidedAt: options.decidedAt,\n });\n\n return {\n proposal: this.transitionProposal(proposal, \"rejected\", {\n decisionId: decisionRecord.decisionId,\n decidedAt: decisionRecord.decidedAt,\n }),\n decisionRecord,\n discarded: false,\n };\n }\n\n prepareSupersede(proposal: Proposal, reason: SupersedeReason): Proposal {\n return this.transitionProposal(proposal, \"superseded\", {\n supersededReason: reason,\n });\n }\n\n async invalidateStaleIngress(\n branchId: string,\n currentEpoch?: number\n ): Promise<readonly Proposal[]> {\n const branchInfo = await this.resolveBranchInfo(branchId);\n const nextEpoch = currentEpoch ?? branchInfo?.epoch;\n if (nextEpoch == null) {\n throw new Error(`Cannot invalidate stale ingress without branch epoch for ${branchId}`);\n }\n\n return (await this.store\n .getProposalsByBranch(branchId))\n .filter((proposal) => isIngressStatus(proposal.status) && proposal.epoch < nextEpoch)\n .map((proposal) => this.prepareSupersede(proposal, \"head_advance\"));\n }\n\n shouldDiscardAuthorityResult(\n proposal: Proposal,\n currentEpoch: number\n ): boolean {\n return proposal.epoch < currentEpoch;\n }\n\n deriveOutcome(terminalSnapshot: Snapshot): \"completed\" | \"failed\" {\n if (terminalSnapshot.system.lastError != null) {\n return \"failed\";\n }\n if (terminalSnapshot.system.pendingRequirements.length > 0) {\n return \"failed\";\n }\n return \"completed\";\n }\n\n async finalize(\n executingProposal: Proposal,\n lineageCommit: PreparedLineageCommit,\n completedAt: number\n ): Promise<PreparedGovernanceCommit> {\n if (executingProposal.status !== \"executing\") {\n throw new Error(\n `GOV-SEAL-6 violation: finalize() requires executing proposal, received ${executingProposal.status}`\n );\n }\n if (!executingProposal.decisionId) {\n throw new Error(\"GOV-SEAL-6 violation: executing proposal is missing decisionId\");\n }\n\n const decisionRecord = await this.store.getDecisionRecord(executingProposal.decisionId);\n if (!decisionRecord) {\n throw new Error(\n `GOV-SEAL-6 violation: decision record ${executingProposal.decisionId} not found`\n );\n }\n\n const derivedOutcome = this.deriveOutcome(lineageCommit.terminalSnapshot);\n if (derivedOutcome !== lineageCommit.terminalStatus) {\n throw new Error(\n `GOV-SEAL-1 violation: deriveOutcome=${derivedOutcome} but lineageCommit.terminalStatus=${lineageCommit.terminalStatus}`\n );\n }\n\n const proposal = this.transitionProposal(executingProposal, derivedOutcome, {\n resultWorld: lineageCommit.worldId,\n completedAt,\n });\n\n return freeze({\n proposal,\n decisionRecord,\n });\n }\n\n createProposalSubmittedEvent(\n proposal: Proposal,\n timestamp = Date.now()\n ): ProposalSubmittedEvent {\n return freeze({\n type: \"proposal:submitted\",\n timestamp,\n proposalId: proposal.proposalId,\n actorId: proposal.actorId,\n baseWorld: proposal.baseWorld,\n branchId: proposal.branchId,\n intent: freeze({\n type: proposal.intent.type,\n intentId: proposal.intent.intentId,\n ...(proposal.intent.input !== undefined ? { input: proposal.intent.input } : {}),\n }),\n executionKey: proposal.executionKey,\n epoch: proposal.epoch,\n });\n }\n\n createProposalEvaluatingEvent(\n proposal: Proposal,\n timestamp = Date.now()\n ): ProposalEvaluatingEvent {\n return freeze({\n type: \"proposal:evaluating\",\n timestamp,\n proposalId: proposal.proposalId,\n });\n }\n\n createProposalDecidedEvent(\n proposal: Proposal,\n decisionRecord: DecisionRecord,\n timestamp = Date.now()\n ): ProposalDecidedEvent {\n return freeze({\n type: \"proposal:decided\",\n timestamp,\n proposalId: proposal.proposalId,\n decisionId: decisionRecord.decisionId,\n decision: decisionRecord.decision.kind,\n ...(decisionRecord.decision.kind === \"rejected\" && decisionRecord.decision.reason\n ? { reason: decisionRecord.decision.reason }\n : {}),\n });\n }\n\n createProposalSupersededEvent(\n proposal: Proposal,\n currentEpoch: number,\n timestamp = Date.now()\n ): ProposalSupersededEvent {\n if (proposal.status !== \"superseded\" || !proposal.supersededReason) {\n throw new Error(\n \"GOV-EPOCH-5 violation: superseded event requires proposal.status='superseded' with supersededReason\"\n );\n }\n\n return freeze({\n type: \"proposal:superseded\",\n timestamp,\n proposalId: proposal.proposalId,\n currentEpoch,\n proposalEpoch: proposal.epoch,\n reason: proposal.supersededReason,\n });\n }\n\n createExecutionCompletedEvent(\n proposal: Proposal,\n timestamp = Date.now()\n ): ExecutionCompletedEvent {\n if (!proposal.resultWorld) {\n throw new Error(\n \"GOV-EVT-6 violation: execution:completed requires proposal.resultWorld\"\n );\n }\n\n return freeze({\n type: \"execution:completed\",\n timestamp,\n proposalId: proposal.proposalId,\n executionKey: proposal.executionKey,\n resultWorld: proposal.resultWorld,\n });\n }\n\n createExecutionFailedEvent(\n proposal: Proposal,\n error: ErrorInfo,\n timestamp = Date.now()\n ): ExecutionFailedEvent {\n if (!proposal.resultWorld) {\n throw new Error(\n \"GOV-EVT-7 violation: execution:failed requires proposal.resultWorld\"\n );\n }\n\n return freeze({\n type: \"execution:failed\",\n timestamp,\n proposalId: proposal.proposalId,\n executionKey: proposal.executionKey,\n resultWorld: proposal.resultWorld,\n error: freeze({\n summary: error.summary,\n ...(error.currentError !== undefined ? { currentError: error.currentError } : {}),\n ...(error.pendingRequirements !== undefined\n ? { pendingRequirements: error.pendingRequirements }\n : {}),\n }),\n });\n }\n\n createWorldCreatedEvent(\n world: World,\n proposalId: ProposalId,\n from: WorldId,\n outcome: \"completed\" | \"failed\",\n timestamp = Date.now()\n ): WorldCreatedEvent {\n return freeze({\n type: \"world:created\",\n timestamp,\n world,\n from,\n proposalId,\n outcome,\n });\n }\n\n createWorldForkedEvent(\n branchId: BranchId,\n forkPoint: WorldId,\n timestamp = Date.now()\n ): WorldForkedEvent {\n return freeze({\n type: \"world:forked\",\n timestamp,\n branchId,\n forkPoint,\n });\n }\n\n private async resolveBranchInfo(branchId: string): Promise<BranchInfo | null> {\n return this.options.lineageService?.getBranch(branchId) ?? null;\n }\n\n private async assertBranchGateAvailable(proposal: Proposal): Promise<void> {\n const occupant = await this.store.getExecutionStageProposal(proposal.branchId);\n if (occupant && occupant.proposalId !== proposal.proposalId) {\n throw new Error(\n `GOV-BRANCH-GATE-1 violation: branch ${proposal.branchId} already occupied by ${occupant.proposalId}`\n );\n }\n }\n\n private transitionProposal(\n proposal: Proposal,\n to: Proposal[\"status\"],\n updates: {\n decisionId?: string;\n decidedAt?: number;\n completedAt?: number;\n resultWorld?: WorldId;\n supersededReason?: SupersedeReason;\n approvedScope?: unknown;\n } = {}\n ): Proposal {\n if (!isValidTransition(proposal.status, to)) {\n throw new Error(\n `GOV-TRANS-1 violation: invalid transition ${proposal.status} -> ${to}; valid targets are ${getValidTransitions(proposal.status).join(\", \")}`\n );\n }\n\n if (to === \"superseded\") {\n if (updates.decisionId != null) {\n throw new Error(\"GOV-TRANS-3 violation: superseded transition must not create DecisionRecord\");\n }\n if (!updates.supersededReason) {\n throw new Error(\"GOV-STAGE-7 violation: superseded proposal must record supersededReason\");\n }\n }\n\n if (\n transitionCreatesDecisionRecord(proposal.status, to) &&\n updates.decisionId == null\n ) {\n throw new Error(\n `GOV-TRANS-2 violation: transition ${proposal.status} -> ${to} requires decisionId`\n );\n }\n\n if (to !== \"superseded\" && updates.supersededReason != null) {\n throw new Error(\"GOV-TRANS-4 violation: supersededReason is only valid on superseded proposals\");\n }\n\n if (isExecutionStageStatus(proposal.status) && to === \"superseded\") {\n throw new Error(\"GOV-STAGE-4 violation: execution-stage proposals must not be superseded\");\n }\n\n return freeze({\n ...proposal,\n status: to,\n ...(updates.decisionId !== undefined ? { decisionId: updates.decisionId } : {}),\n ...(updates.decidedAt !== undefined ? { decidedAt: updates.decidedAt } : {}),\n ...(updates.completedAt !== undefined ? { completedAt: updates.completedAt } : {}),\n ...(updates.resultWorld !== undefined ? { resultWorld: updates.resultWorld } : {}),\n ...(updates.approvedScope !== undefined ? { approvedScope: updates.approvedScope } : {}),\n ...(updates.supersededReason !== undefined\n ? { supersededReason: updates.supersededReason }\n : {}),\n ...(to !== \"superseded\" ? { supersededReason: undefined } : {}),\n });\n }\n}\n\nexport function createGovernanceService(\n store: GovernanceStore,\n options?: GovernanceServiceOptions\n): DefaultGovernanceService {\n return new DefaultGovernanceService(store, options);\n}\n"],"mappings":"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","names":["createProposalId","value","createDecisionId","createExecutionKey","proposalId","attempt","defaultExecutionKeyPolicy","createNoopGovernanceEventSink","toHostIntent","intent","INGRESS_STATUSES","EXECUTION_STAGE_STATUSES","TERMINAL_STATUSES","DECISION_TRANSITION_TARGETS","VALID_TRANSITIONS","isIngressStatus","status","isExecutionStageStatus","isTerminalStatus","isValidTransition","from","to","getValidTransitions","transitionCreatesDecisionRecord","cloneValue","value","InMemoryGovernanceStore","proposal","proposalId","branchId","left","right","matches","isExecutionStageStatus","record","decisionId","binding","actorId","state","createInMemoryGovernanceStore","AutoApproveHandler","proposal","binding","createAutoApproveHandler","HITLHandler","callback","proposal","binding","policy","proposalId","resolve","reject","state","decision","reasoning","approvedScope","createHITLHandler","PolicyRulesHandler","name","evaluator","proposal","binding","approvedScope","rule","condition","value","pattern","createPolicyRulesHandler","TribunalHandler","callback","proposal","binding","policy","proposalId","resolve","reject","state","voter","decision","reasoning","actorId","memberCount","approveCount","rejectCount","vote","isComplete","isApproved","majorityNeeded","createTribunalHandler","POLICY_MODE_TO_KIND","AuthorityEvaluator","createAutoApproveHandler","createPolicyRulesHandler","createHITLHandler","createTribunalHandler","proposal","binding","handler","policyMode","proposalId","decision","reasoning","approvedScope","voter","createAuthorityEvaluator","createGovernanceEventDispatcher","options","sink","createNoopGovernanceEventSink","now","governanceCommit","lineageCommit","timestamp","outcome","deriveWorldCreatedFrom","isTrueForkCommit","deriveExecutionFailure","currentError","pendingRequirements","requirement","summarizeFailure","errorCount","pendingRequirementCount","sha256","toJcs","computeIntentKey","schemaHash","body","input","createIntentInstance","options","intentId","intentKey","createIntentInstanceSync","origin","deepFreeze","value","key","nested","freeze","value","DefaultGovernanceService","store","options","input","createProposalId","proposal","completedAt","resultWorld","response","branchInfo","currentEpoch","currentHead","decisionRecord","createDecisionId","reason","branchId","nextEpoch","isIngressStatus","terminalSnapshot","executingProposal","lineageCommit","derivedOutcome","timestamp","error","world","proposalId","from","outcome","forkPoint","occupant","to","updates","isValidTransition","getValidTransitions","transitionCreatesDecisionRecord","isExecutionStageStatus","createGovernanceService"]}
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/with-governance.ts"],"sourcesContent":["import type {\n ComposableManifesto,\n GovernanceLaws,\n ManifestoDomainShape,\n TypedIntent,\n} from \"@manifesto-ai/sdk\";\nimport {\n DisposedError,\n ManifestoError,\n} from \"@manifesto-ai/sdk\";\nimport {\n activateComposable,\n assertComposableNotActivated,\n attachExtensionKernel,\n attachRuntimeKernelFactory,\n getActivationState,\n getRuntimeKernelFactory,\n type RuntimeKernel,\n} from \"@manifesto-ai/sdk/provider\";\nimport {\n type BranchId,\n} from \"@manifesto-ai/lineage\";\nimport {\n createLineageRuntimeController,\n getLineageDecoration,\n type ResolvedLineageConfig,\n} from \"@manifesto-ai/lineage/provider\";\n\nimport { createAuthorityEvaluator, type AuthorityEvaluator } from \"./authority/evaluator.js\";\nimport { createGovernanceEventDispatcher } from \"./event-dispatcher.js\";\nimport { createIntentInstance } from \"./intent-instance.js\";\nimport { createGovernanceService } from \"./service/governance-service.js\";\nimport { createInMemoryGovernanceStore } from \"./store/in-memory-governance-store.js\";\nimport type {\n GovernanceComposableManifesto,\n GovernanceConfig,\n GovernedComposableLaws,\n GovernanceInstance,\n LineageComposableManifestoInput,\n} from \"./runtime-types.js\";\nimport type {\n ActorAuthorityBinding,\n AuthorityResponse,\n DecisionRecord,\n GovernanceStore,\n IntentScope,\n Proposal,\n ProposalId,\n} from \"./types.js\";\nimport {\n createProposalId,\n defaultExecutionKeyPolicy,\n} from \"./types.js\";\n\nconst GOVERNANCE_LAWS: GovernanceLaws = Object.freeze({ __governanceLaws: true });\n\nexport function withGovernance<\n T extends ManifestoDomainShape,\n>(\n manifesto: LineageComposableManifestoInput<T>,\n config: GovernanceConfig<T>,\n): GovernanceComposableManifesto<T> {\n assertComposableNotActivated(manifesto);\n\n const createKernel = getRuntimeKernelFactory(manifesto);\n const explicitLineage = getLineageDecoration(manifesto);\n if (!explicitLineage) {\n throw new ManifestoError(\n \"GOVERNANCE_LINEAGE_REQUIRED\",\n \"withGovernance() requires a manifesto already composed with withLineage()\",\n );\n }\n const activationState = getActivationState(manifesto);\n\n const decorated: GovernanceComposableManifesto<T> = {\n _laws: Object.freeze({\n ...manifesto._laws,\n ...GOVERNANCE_LAWS,\n }) as GovernedComposableLaws,\n schema: manifesto.schema,\n activate() {\n activateComposable(\n decorated as unknown as ComposableManifesto<T, GovernedComposableLaws>,\n );\n return activateGovernanceRuntime<T>(\n createKernel(),\n explicitLineage.config,\n config,\n );\n },\n };\n\n attachRuntimeKernelFactory(\n decorated as unknown as ComposableManifesto<T, GovernedComposableLaws>,\n createKernel,\n activationState,\n );\n\n return decorated;\n}\n\nfunction activateGovernanceRuntime<T extends ManifestoDomainShape>(\n kernel: RuntimeKernel<T>,\n lineageConfig: ResolvedLineageConfig,\n config: GovernanceConfig<T>,\n): GovernanceInstance<T> {\n const governanceStore = config.governanceStore ?? createInMemoryGovernanceStore();\n const governanceService = createGovernanceService(governanceStore, {\n lineageService: lineageConfig.service,\n });\n const evaluator = config.evaluator ?? createAuthorityEvaluator();\n const eventDispatcher = createGovernanceEventDispatcher({\n service: governanceService,\n sink: config.eventSink,\n now: config.now,\n });\n const now = config.now ?? Date.now;\n const lineage = createLineageRuntimeController(kernel, lineageConfig.service, lineageConfig);\n\n let bindingsReady: Promise<void> | null = null;\n\n async function ensureBindings(): Promise<void> {\n if (bindingsReady) {\n return bindingsReady;\n }\n\n bindingsReady = Promise\n .all(config.bindings.map(async (binding) => {\n await governanceStore.putActorBinding(binding);\n }))\n .then(() => undefined)\n .catch((error) => {\n bindingsReady = null;\n throw error;\n });\n\n return bindingsReady;\n }\n\n async function ensureReady(): Promise<void> {\n await lineage.ensureReady();\n await ensureBindings();\n }\n\n function getCurrentTimestamp(): number {\n return now();\n }\n\n async function invalidateStaleIngress(branchId: BranchId, epoch: number): Promise<void> {\n const stale = await governanceService.invalidateStaleIngress(branchId, epoch);\n await Promise.all(stale.map(async (proposal) => {\n await governanceStore.putProposal(proposal);\n }));\n }\n\n async function resolveBinding(\n actorId: string,\n ): Promise<ActorAuthorityBinding> {\n const binding = await governanceStore.getActorBinding(actorId);\n if (binding) {\n return binding;\n }\n\n throw new ManifestoError(\n \"GOVERNANCE_BINDING_NOT_FOUND\",\n `No actor-authority binding exists for actor \"${actorId}\"`,\n );\n }\n\n async function evaluateProposal(\n proposal: Proposal,\n binding: ActorAuthorityBinding,\n activeEvaluator: AuthorityEvaluator,\n ): Promise<AuthorityResponse> {\n switch (binding.policy.mode) {\n case \"hitl\":\n return {\n kind: \"pending\",\n waitingFor: {\n kind: \"human\",\n delegate: binding.policy.delegate,\n },\n };\n case \"tribunal\":\n return {\n kind: \"pending\",\n waitingFor: {\n kind: \"tribunal\",\n members: binding.policy.members,\n },\n };\n default:\n return activeEvaluator.evaluate(proposal, binding);\n }\n }\n\n async function finalizeApprovedExecution(\n executingProposal: Proposal & { readonly status: \"executing\" },\n intent: TypedIntent<T>,\n ): Promise<Proposal> {\n let sealed: Awaited<ReturnType<typeof lineage.sealIntent>> | null = null;\n let terminalProposal: Proposal | null = null;\n let proposalPersisted = false;\n\n try {\n sealed = await lineage.sealIntent(intent, {\n proposalRef: executingProposal.proposalId,\n decisionRef: executingProposal.decisionId,\n executionKey: executingProposal.executionKey,\n publishOnCompleted: false,\n assumeEnqueued: true,\n });\n\n const governanceCommit = await governanceService.finalize(\n executingProposal,\n sealed.preparedCommit,\n getCurrentTimestamp(),\n );\n terminalProposal = governanceCommit.proposal;\n\n await governanceStore.putProposal(governanceCommit.proposal);\n proposalPersisted = true;\n await governanceStore.putDecisionRecord(governanceCommit.decisionRecord);\n eventDispatcher.emitSealCompleted(governanceCommit, sealed.preparedCommit);\n\n if (sealed.preparedCommit.branchChange.headAdvanced) {\n const publishedSnapshot = kernel.setVisibleSnapshot(sealed.hostResult.snapshot);\n kernel.emitEvent(\"dispatch:completed\", {\n intentId: intent.intentId ?? \"\",\n intent,\n snapshot: publishedSnapshot,\n });\n return governanceCommit.proposal;\n }\n\n const failure = toGovernanceFailure(sealed.hostResult.error);\n kernel.emitEvent(\"dispatch:failed\", {\n intentId: intent.intentId ?? \"\",\n intent,\n error: failure,\n });\n return governanceCommit.proposal;\n } catch (error) {\n const failure = toGovernanceFailure(error);\n if (!proposalPersisted) {\n try {\n if (terminalProposal) {\n try {\n await governanceStore.putProposal(terminalProposal);\n } catch {\n const failedProposal = governanceService.failExecution(\n executingProposal,\n getCurrentTimestamp(),\n sealed?.preparedCommit.worldId,\n );\n await governanceStore.putProposal(failedProposal);\n }\n } else {\n const failedProposal = governanceService.failExecution(\n executingProposal,\n getCurrentTimestamp(),\n sealed?.preparedCommit.worldId,\n );\n await governanceStore.putProposal(failedProposal);\n }\n } catch {\n // Preserve the original execution failure if compensating persistence also fails.\n }\n }\n if (!isRejectedDispatchError(failure)) {\n kernel.emitEvent(\"dispatch:failed\", {\n intentId: intent.intentId ?? \"\",\n intent,\n error: failure,\n });\n }\n throw failure;\n }\n }\n\n async function applyAuthorityDecision(\n proposal: Proposal & { readonly status: \"evaluating\" },\n response: Extract<AuthorityResponse, { kind: \"approved\" | \"rejected\" }>,\n ): Promise<Proposal> {\n const prepared = await governanceService.prepareAuthorityResult(\n proposal,\n response,\n {\n decidedAt: getCurrentTimestamp(),\n },\n );\n\n await governanceStore.putProposal(prepared.proposal);\n if (prepared.decisionRecord) {\n await governanceStore.putDecisionRecord(prepared.decisionRecord);\n }\n\n if (prepared.discarded || prepared.proposal.status === \"rejected\") {\n return prepared.proposal;\n }\n\n const executingProposal = governanceService.beginExecution(prepared.proposal);\n await governanceStore.putProposal(executingProposal);\n\n return finalizeApprovedExecution(executingProposal, toTypedIntent<T>(prepared.proposal));\n }\n\n async function proposeAsync(intent: TypedIntent<T>): Promise<Proposal> {\n if (kernel.isDisposed()) {\n throw new DisposedError();\n }\n\n return kernel.enqueue(async () => {\n if (kernel.isDisposed()) {\n throw new DisposedError();\n }\n\n await ensureReady();\n\n const enrichedIntent = kernel.ensureIntentId(intent);\n if (!kernel.isActionAvailable(enrichedIntent.type as keyof T[\"actions\"])) {\n return kernel.rejectUnavailable(enrichedIntent);\n }\n\n const branch = await lineage.getActiveBranch();\n await invalidateStaleIngress(branch.id, branch.epoch);\n\n const actor = config.execution.deriveActor(enrichedIntent);\n const binding = await resolveBinding(actor.actorId);\n const intentInstance = await createIntentInstance({\n body: {\n type: enrichedIntent.type,\n ...(enrichedIntent.input !== undefined ? { input: enrichedIntent.input } : {}),\n ...(hasScopeProposal(enrichedIntent)\n ? { scopeProposal: enrichedIntent.scopeProposal }\n : {}),\n },\n schemaHash: kernel.schema.hash,\n projectionId: config.execution.projectionId,\n source: config.execution.deriveSource(enrichedIntent),\n actor,\n intentId: enrichedIntent.intentId,\n });\n\n const proposalId = createProposalId();\n const proposal = governanceService.createProposal({\n proposalId,\n baseWorld: branch.head,\n branchId: branch.id,\n actorId: binding.actorId,\n authorityId: binding.authorityId,\n intent: {\n type: intentInstance.body.type,\n intentId: intentInstance.intentId,\n ...(intentInstance.body.input !== undefined\n ? { input: intentInstance.body.input }\n : {}),\n ...(intentInstance.body.scopeProposal !== undefined\n ? { scopeProposal: intentInstance.body.scopeProposal }\n : {}),\n },\n executionKey: defaultExecutionKeyPolicy({\n proposalId,\n actorId: binding.actorId,\n baseWorld: branch.head,\n branchId: branch.id,\n attempt: 1,\n }),\n submittedAt: getCurrentTimestamp(),\n epoch: branch.epoch,\n });\n\n await governanceStore.putProposal(proposal);\n\n const evaluatingProposal = governanceService.beginEvaluating(proposal);\n await governanceStore.putProposal(evaluatingProposal);\n\n const response = await evaluateProposal(evaluatingProposal, binding, evaluator);\n if (response.kind === \"pending\") {\n return evaluatingProposal;\n }\n\n return applyAuthorityDecision(evaluatingProposal, response);\n });\n }\n\n async function getEvaluatingProposal(proposalId: ProposalId) {\n const proposal = await governanceStore.getProposal(proposalId);\n if (!proposal) {\n throw new ManifestoError(\n \"GOVERNANCE_PROPOSAL_NOT_FOUND\",\n `Proposal \"${proposalId}\" was not found`,\n );\n }\n\n if (proposal.status !== \"evaluating\") {\n throw new ManifestoError(\n \"GOVERNANCE_PENDING_REQUIRED\",\n `Proposal \"${proposalId}\" is not pending human resolution`,\n );\n }\n\n return proposal as Proposal & { readonly status: \"evaluating\" };\n }\n\n async function approve(\n proposalId: ProposalId,\n approvedScope?: IntentScope | null,\n ): Promise<Proposal> {\n if (kernel.isDisposed()) {\n throw new DisposedError();\n }\n\n return kernel.enqueue(async () => {\n if (kernel.isDisposed()) {\n throw new DisposedError();\n }\n\n await ensureReady();\n const proposal = await getEvaluatingProposal(proposalId);\n return applyAuthorityDecision(proposal, {\n kind: \"approved\",\n approvedScope:\n approvedScope !== undefined\n ? approvedScope\n : proposal.intent.scopeProposal ?? null,\n });\n });\n }\n\n async function reject(proposalId: ProposalId, reason?: string): Promise<Proposal> {\n if (kernel.isDisposed()) {\n throw new DisposedError();\n }\n\n return kernel.enqueue(async () => {\n if (kernel.isDisposed()) {\n throw new DisposedError();\n }\n\n await ensureReady();\n const proposal = await getEvaluatingProposal(proposalId);\n return applyAuthorityDecision(proposal, {\n kind: \"rejected\",\n ...(reason ? { reason } : {}),\n });\n });\n }\n\n async function getProposal(proposalId: ProposalId): Promise<Proposal | null> {\n await ensureBindings();\n return governanceStore.getProposal(proposalId);\n }\n\n async function getProposals(branchId?: BranchId): Promise<readonly Proposal[]> {\n await ensureReady();\n const resolvedBranchId = branchId ?? (await lineage.getActiveBranch()).id;\n return governanceStore.getProposalsByBranch(resolvedBranchId);\n }\n\n async function bindActor(binding: ActorAuthorityBinding): Promise<void> {\n if (kernel.isDisposed()) {\n throw new DisposedError();\n }\n\n return kernel.enqueue(async () => {\n if (kernel.isDisposed()) {\n throw new DisposedError();\n }\n\n await ensureBindings();\n await governanceStore.putActorBinding(binding);\n });\n }\n\n async function getActorBinding(actorId: string): Promise<ActorAuthorityBinding | null> {\n await ensureBindings();\n return governanceStore.getActorBinding(actorId);\n }\n\n async function getDecisionRecord(\n decisionId: DecisionRecord[\"decisionId\"],\n ): Promise<DecisionRecord | null> {\n await ensureBindings();\n return governanceStore.getDecisionRecord(decisionId);\n }\n\n const governed = {\n createIntent: kernel.createIntent,\n subscribe: kernel.subscribe,\n on: kernel.on,\n getSnapshot: kernel.getSnapshot,\n getCanonicalSnapshot: kernel.getCanonicalSnapshot,\n getSchemaGraph: kernel.getSchemaGraph,\n getAvailableActions: kernel.getAvailableActions,\n isIntentDispatchable: kernel.isIntentDispatchable,\n getIntentBlockers: kernel.getIntentBlockers,\n getActionMetadata: kernel.getActionMetadata,\n isActionAvailable: kernel.isActionAvailable,\n simulate: kernel.simulate,\n MEL: kernel.MEL,\n schema: kernel.schema,\n dispose: kernel.dispose,\n restore: lineage.restore,\n getWorld: lineage.getWorld,\n getWorldSnapshot: lineage.getWorldSnapshot,\n getLineage: lineage.getLineage,\n getLatestHead: lineage.getLatestHead,\n getHeads: lineage.getHeads,\n getBranches: lineage.getBranches,\n getActiveBranch: lineage.getActiveBranch,\n switchActiveBranch: lineage.switchActiveBranch,\n createBranch: lineage.createBranch,\n proposeAsync,\n approve,\n reject,\n getProposal,\n getProposals,\n bindActor,\n getActorBinding,\n getDecisionRecord,\n };\n\n return attachExtensionKernel(\n governed satisfies GovernanceInstance<T>,\n kernel,\n );\n}\n\nfunction toTypedIntent<T extends ManifestoDomainShape>(proposal: Proposal): TypedIntent<T> {\n return {\n type: proposal.intent.type,\n intentId: proposal.intent.intentId,\n ...(proposal.intent.input !== undefined ? { input: proposal.intent.input } : {}),\n } as TypedIntent<T>;\n}\n\nfunction hasScopeProposal<T extends ManifestoDomainShape>(intent: TypedIntent<T>): intent is TypedIntent<T> & {\n readonly scopeProposal: IntentScope;\n} {\n return \"scopeProposal\" in intent && intent.scopeProposal !== undefined;\n}\n\nfunction toGovernanceFailure(error: unknown): Error {\n if (error instanceof Error) {\n return error;\n }\n\n return new ManifestoError(\n \"GOVERNANCE_EXECUTION_FAILED\",\n \"Governed proposal execution did not produce a completed result\",\n );\n}\n\nfunction isRejectedDispatchError(error: Error): boolean {\n return \"code\" in error\n && typeof error.code === \"string\"\n && (\n error.code === \"ACTION_UNAVAILABLE\"\n || error.code === \"INTENT_NOT_DISPATCHABLE\"\n || error.code === \"INVALID_INPUT\"\n );\n}\n"],"mappings":"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","names":["DisposedError","ManifestoError","activateComposable","assertComposableNotActivated","attachExtensionKernel","attachRuntimeKernelFactory","getActivationState","getRuntimeKernelFactory","createLineageRuntimeController","getLineageDecoration","GOVERNANCE_LAWS","withGovernance","manifesto","config","assertComposableNotActivated","createKernel","getRuntimeKernelFactory","explicitLineage","getLineageDecoration","ManifestoError","activationState","getActivationState","decorated","activateComposable","activateGovernanceRuntime","attachRuntimeKernelFactory","kernel","lineageConfig","governanceStore","createInMemoryGovernanceStore","governanceService","createGovernanceService","evaluator","createAuthorityEvaluator","eventDispatcher","createGovernanceEventDispatcher","now","lineage","createLineageRuntimeController","bindingsReady","ensureBindings","binding","error","ensureReady","getCurrentTimestamp","invalidateStaleIngress","branchId","epoch","stale","proposal","resolveBinding","actorId","evaluateProposal","activeEvaluator","finalizeApprovedExecution","executingProposal","intent","sealed","terminalProposal","proposalPersisted","governanceCommit","publishedSnapshot","failure","toGovernanceFailure","failedProposal","isRejectedDispatchError","applyAuthorityDecision","response","prepared","toTypedIntent","proposeAsync","DisposedError","enrichedIntent","branch","actor","intentInstance","createIntentInstance","hasScopeProposal","proposalId","createProposalId","defaultExecutionKeyPolicy","evaluatingProposal","getEvaluatingProposal","approve","approvedScope","reject","reason","getProposal","getProposals","resolvedBranchId","bindActor","getActorBinding","getDecisionRecord","decisionId","governed","attachExtensionKernel"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}