@manifesto-ai/governance 3.13.1 → 5.0.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 +10 -10
- package/dist/action-payload.d.ts +9 -0
- package/dist/chunk-DKBKAFPQ.js +1 -0
- package/dist/governance-runtime.d.ts +28 -0
- package/dist/index.d.ts +1 -3
- package/dist/index.js +1 -1
- package/dist/provider.js +1 -1
- package/dist/runtime-types.d.ts +5 -5
- package/dist/snapshot-errors.d.ts +2 -0
- package/dist/types.d.ts +6 -2
- package/dist/wait-for-proposal.d.ts +4 -4
- package/package.json +6 -6
- package/dist/chunk-2Q3OH2FH.js +0 -1
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. The current
|
|
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 runtime surface uses governance-mode `action.<name>.submit(...)` plus `waitForSettlement(ref)`.
|
|
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 {
|
|
14
|
+
import { withGovernance } from "@manifesto-ai/governance";
|
|
15
15
|
|
|
16
16
|
const governed = withGovernance(
|
|
17
17
|
withLineage(createManifesto<CounterDomain>(schema, effects), {
|
|
@@ -31,10 +31,10 @@ const governed = withGovernance(
|
|
|
31
31
|
},
|
|
32
32
|
).activate();
|
|
33
33
|
|
|
34
|
-
const
|
|
35
|
-
|
|
36
|
-
)
|
|
37
|
-
|
|
34
|
+
const pending = await governed.action.increment.submit();
|
|
35
|
+
const settlement = pending.ok
|
|
36
|
+
? await pending.waitForSettlement()
|
|
37
|
+
: pending;
|
|
38
38
|
```
|
|
39
39
|
|
|
40
40
|
## What This Package Owns
|
|
@@ -42,16 +42,16 @@ const settlement = await waitForProposal(governed, proposal);
|
|
|
42
42
|
- `withGovernance()` and the activated `GovernanceInstance`
|
|
43
43
|
- proposal lifecycle and authority evaluation
|
|
44
44
|
- pending human/tribunal resolution through `approve()` / `reject()`
|
|
45
|
-
- additive proposal-settlement observation through `
|
|
45
|
+
- additive proposal-settlement observation through `waitForSettlement()`
|
|
46
46
|
- governance decision records and post-commit governance events
|
|
47
47
|
- lineage-preserving query access such as `getWorldSnapshot()`, `getLatestHead()`, and `getBranches()`
|
|
48
48
|
- low-level governance stores, services, authority handlers, and intent-instance helpers via `@manifesto-ai/governance/provider`
|
|
49
49
|
|
|
50
50
|
## What Changes After Governance Activation
|
|
51
51
|
|
|
52
|
-
- direct
|
|
53
|
-
- the canonical state-change path becomes `
|
|
54
|
-
- `
|
|
52
|
+
- direct root write verbs from earlier runtimes no longer exist
|
|
53
|
+
- the canonical state-change path becomes `action.x.submit() -> approve()/reject() -> waitForSettlement()`
|
|
54
|
+
- `waitForSettlement()` is an observation helper, not a state-change verb
|
|
55
55
|
- lineage must be composed before governance activation
|
|
56
56
|
- visible snapshots publish only after approved execution seals successfully
|
|
57
57
|
- `getWorldSnapshot(worldId)` remains the stored sealed canonical snapshot lookup; `restore(worldId)` remains the normalized resume path inherited from lineage
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { ManifestoError } from "@manifesto-ai/sdk";
|
|
2
|
+
export declare function cloneAndFreezeActionPayload<T>(value: T): T;
|
|
3
|
+
export declare function tryCloneAndFreezeActionPayload<T>(value: T): {
|
|
4
|
+
readonly ok: true;
|
|
5
|
+
readonly value: T;
|
|
6
|
+
} | {
|
|
7
|
+
readonly ok: false;
|
|
8
|
+
readonly error: ManifestoError;
|
|
9
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
function E(t){return t??`prop-${crypto.randomUUID()}`}function y(t){return t??`dec-${crypto.randomUUID()}`}function W(t,e=1){return`${t}:${e}`}var Q=({proposalId:t,attempt:e})=>W(t,e);function b(){return{emit(){}}}function X(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 j=["submitted","evaluating"],O=["approved","executing"],$=["rejected","completed","failed","superseded"],J=["approved","rejected"],A={submitted:["evaluating","rejected","superseded"],evaluating:["approved","rejected","superseded"],approved:["executing"],rejected:[],executing:["completed","failed"],completed:[],failed:[],superseded:[]};function x(t){return j.includes(t)}function c(t){return O.includes(t)}function Z(t){return $.includes(t)}function S(t,e){return A[t].includes(e)}function w(t){return[...A[t]]}function R(t,e){return t==="submitted"&&e==="rejected"||t==="evaluating"&&e==="approved"||t==="evaluating"&&e==="rejected"}function l(t){return structuredClone(t)}var m=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 oe(){return new m}var h=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 T(){return new h}var v=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 k(){return new v}var I=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 H(){return new I}var f=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 B(){return new f}var V={auto_approve:"auto",hitl:"human",policy_rules:"policy",tribunal:"tribunal"},g=class{handlers=new Map;autoHandler;policyHandler;hitlHandler;tribunalHandler;constructor(){this.autoHandler=T(),this.policyHandler=H(),this.hitlHandler=k(),this.tribunalHandler=B(),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 V[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 ve(){return new g}function u(t){return t.system.lastError??K(t)}function K(t){let e=t.namespaces?.host;if(e&&typeof e=="object"&&!Array.isArray(e)){let r=e.lastError;if(L(r))return r}return null}function L(t){if(!t||typeof t!="object"||Array.isArray(t))return!1;let e=t;return typeof e.code=="string"&&typeof e.message=="string"&&typeof e.timestamp=="number"&&!!e.source&&typeof e.source=="object"&&typeof e.source.actionId=="string"&&typeof e.source.nodePath=="string"}function D(t){let e=u(t)??void 0,r=t.system.pendingRequirements.map(o=>o.id);return{summary:_(e?1:0,r.length),...e?{currentError:e}:{},...r.length>0?{pendingRequirements:r}:{}}}function _(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 Ae(t){let e=t.sink??b(),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,N(o,n),a,i)),q(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,F(n),i))}}}function N(t,e){return e.kind==="next"?e.edge.from:e.world.parentWorldId??t.proposal.baseWorld}function F(t){return D(t.terminalSnapshot)}function q(t){return t.kind==="next"&&"forkCreated"in t&&t.forkCreated===!0}import{sha256 as M,toJcs as C}from"@manifesto-ai/core";async function z(t,e){let r=[t,e.type,C(e.input??null),C(e.scopeProposal??null)].join(":");return M(r)}async function we(t){let e=t.intentId??`intent-${crypto.randomUUID()}`,r=await z(t.schemaHash,t.body);return U(t.body,e,r,{projectionId:t.projectionId,source:t.source,actor:t.actor,note:t.note})}function U(t,e,r,o){return G({body:t,intentId:e,intentKey:r,meta:{origin:o}})}function G(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"&&G(r)}return Object.freeze(t)}function d(t){return Object.freeze(t)}var P=class{constructor(e,r={}){this.store=e;this.options=r}createProposal(e){if(e.computeEnvelope==null)throw new Error("GOV-REPLAY-1 violation: proposal requires a compute envelope");return d({proposalId:e.proposalId??E(),baseWorld:e.baseWorld,branchId:e.branchId,actorId:e.actorId,authorityId:e.authorityId,intent:d({...e.intent}),computeEnvelope:structuredClone(e.computeEnvelope),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)&&a!==e.baseWorld)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??y(),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??y(),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=>x(i.status)&&i.epoch<n).map(i=>this.prepareSupersede(i,"head_advance"))}shouldDiscardAuthorityResult(e,r){return e.epoch<r}deriveOutcome(e){return u(e)!=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(!S(e.status,r))throw new Error(`GOV-TRANS-1 violation: invalid transition ${e.status} -> ${r}; valid targets are ${w(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(R(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 P(t,e)}export{E as a,y as b,W as c,Q as d,b as e,X as f,j as g,O as h,$ as i,J as j,x as k,c as l,Z as m,S as n,w as o,R as p,m as q,oe as r,h as s,T as t,v as u,k as v,I as w,H as x,f as y,B as z,g as A,ve as B,u as C,Ae as D,z as E,we as F,U as G,P as H,Be as I};
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { Context } from "@manifesto-ai/core";
|
|
2
|
+
import { type ActionName, type GovernanceSettlementResult, type ManifestoDomainShape, type PreviewDiagnosticsMode, type ProposalRef, type SubmitReportMode, type TypedIntent } from "@manifesto-ai/sdk";
|
|
3
|
+
import { type GovernanceRuntimeKernel } from "@manifesto-ai/sdk/provider";
|
|
4
|
+
import type { LineageRuntimeController } from "@manifesto-ai/lineage/provider";
|
|
5
|
+
import type { GovernanceInstance } from "./runtime-types.js";
|
|
6
|
+
import type { ActorAuthorityBinding, ActorId, BranchId, DecisionId, DecisionRecord, IntentScope, Proposal, ProposalId } from "./types.js";
|
|
7
|
+
type RuntimeExecutionView<T extends ManifestoDomainShape> = {
|
|
8
|
+
readonly context?: ReturnType<GovernanceRuntimeKernel<T>["getExternalContext"]>;
|
|
9
|
+
readonly diagnostics?: PreviewDiagnosticsMode;
|
|
10
|
+
readonly report?: SubmitReportMode;
|
|
11
|
+
};
|
|
12
|
+
export type GovernanceRuntimeServices<T extends ManifestoDomainShape> = {
|
|
13
|
+
readonly lineage: LineageRuntimeController<T>;
|
|
14
|
+
readonly ensureReady: () => Promise<void>;
|
|
15
|
+
readonly createSubmission: (intent: TypedIntent<T>, context: Context) => Promise<Proposal>;
|
|
16
|
+
readonly settleSubmission: (proposalId: ProposalId) => Promise<void>;
|
|
17
|
+
readonly resumePendingSettlements: () => Promise<void>;
|
|
18
|
+
readonly waitForSettlement: <Name extends ActionName<T>>(proposalId: ProposalRef, actionName?: Name, reportMode?: SubmitReportMode) => Promise<GovernanceSettlementResult<T, Name>>;
|
|
19
|
+
readonly approve: (proposalId: ProposalId, approvedScope?: IntentScope | null) => Promise<Proposal>;
|
|
20
|
+
readonly reject: (proposalId: ProposalId, reason?: string) => Promise<Proposal>;
|
|
21
|
+
readonly getProposal: (proposalId: ProposalId) => Promise<Proposal | null>;
|
|
22
|
+
readonly getProposals: (branchId?: BranchId) => Promise<readonly Proposal[]>;
|
|
23
|
+
readonly bindActor: (binding: ActorAuthorityBinding) => Promise<void>;
|
|
24
|
+
readonly getActorBinding: (actorId: ActorId) => Promise<ActorAuthorityBinding | null>;
|
|
25
|
+
readonly getDecisionRecord: (decisionId: DecisionId) => Promise<DecisionRecord | null>;
|
|
26
|
+
};
|
|
27
|
+
export declare function createGovernanceRuntimeInstance<T extends ManifestoDomainShape>(kernel: GovernanceRuntimeKernel<T>, services: GovernanceRuntimeServices<T>, view?: RuntimeExecutionView<T>, isView?: boolean): GovernanceInstance<T>;
|
|
28
|
+
export {};
|
package/dist/index.d.ts
CHANGED
|
@@ -1,7 +1,5 @@
|
|
|
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
|
-
export type { GovernanceComposableManifesto, GovernanceConfig, GovernanceExecutionConfig, GovernanceInstance, GovernanceProposalRuntime, } from "./runtime-types.js";
|
|
3
|
-
export type { ProposalSettlement, ProposalSettlementReport, WaitForProposalOptions, } from "./wait-for-proposal.js";
|
|
2
|
+
export type { GovernanceComposableManifesto, GovernanceConfig, GovernanceControlSurface, GovernanceExecutionConfig, GovernanceInstance, GovernanceProposalRuntime, } from "./runtime-types.js";
|
|
4
3
|
export { createNoopGovernanceEventSink, } from "./types.js";
|
|
5
4
|
export { createInMemoryGovernanceStore } from "./store/in-memory-governance-store.js";
|
|
6
5
|
export { withGovernance } from "./with-governance.js";
|
|
7
|
-
export { waitForProposal, waitForProposalWithReport, } from "./wait-for-proposal.js";
|
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{B as C,C as _,D as M,F,I as L,a as O,d as x,e as ie,r as G}from"./chunk-2Q3OH2FH.js";import{DisposedError as P,ManifestoError as R}from"@manifesto-ai/sdk";import{getExtensionKernel as me}from"@manifesto-ai/sdk/extensions";import{activateComposable as fe,assertComposableNotActivated as ye,attachExtensionKernel as he,attachRuntimeKernelFactory as Pe,getActivationState as Ie,getRuntimeKernelFactory as we}from"@manifesto-ai/sdk/provider";import{createLineageRuntimeController as ve,getLineageDecoration as ge}from"@manifesto-ai/lineage/provider";import{DisposedError as le,ManifestoError as v}from"@manifesto-ai/sdk";var U=Symbol("manifesto-governance.wait-for-proposal");function K(e,a){return Object.defineProperty(e,U,{enumerable:!1,configurable:!1,writable:!1,value:a}),e}async function V(e,a,s){let o=typeof a=="string"?a:a.proposalId,i=j(s?.timeoutMs,0),f=j(s?.pollIntervalMs,50),I=Date.now();for(;;){E(e);let p=await e.getProposal(o);if(!p)throw new v("GOVERNANCE_PROPOSAL_NOT_FOUND",`Proposal "${o}" was not found`);if(p.status==="completed"){let c=p,u=ce(c,"completed");return E(e),{kind:"completed",proposal:c,snapshot:e.getSnapshot(),resultWorld:u}}if(p.status==="failed"){let c=p,u=await pe(e,c);return{kind:"failed",proposal:c,...u.resultWorld!==void 0?{resultWorld:u.resultWorld}:{},error:u.error}}if(p.status==="rejected")return{kind:"rejected",proposal:p};if(p.status==="superseded")return{kind:"superseded",proposal:p};if(i===0)return{kind:"pending",proposal:p};let l=i-(Date.now()-I);if(l<=0)return{kind:"timed_out",proposal:p};await ue(Math.min(f,l))}}async function de(e,a,s){let o=await V(e,a,s);if(o.kind==="completed"){let i=await B(e,o.proposal.baseWorld,o.resultWorld);return{kind:"completed",proposal:o.proposal,baseWorld:o.proposal.baseWorld,resultWorld:o.resultWorld,outcome:i}}if(o.kind==="failed"){if(o.resultWorld){let i=await B(e,o.proposal.baseWorld,o.resultWorld);return{kind:"failed",proposal:o.proposal,baseWorld:o.proposal.baseWorld,published:!1,error:o.error,resultWorld:o.resultWorld,sealedOutcome:i}}return{kind:"failed",proposal:o.proposal,baseWorld:o.proposal.baseWorld,published:!1,error:o.error}}return o}async function pe(e,a){if(!a.resultWorld)return{error:{summary:"Execution failed before a result world was recorded"}};let s=a.resultWorld;E(e);let o=await e.getWorldSnapshot(s);if(!o)throw new v("GOVERNANCE_RESULT_WORLD_NOT_FOUND",`Failed proposal "${a.proposalId}" references missing world "${s}"`);return{resultWorld:s,error:_(o)}}async function B(e,a,s){let o=$(e);E(e);let i=await e.getWorldSnapshot(a);if(!i)throw new v("GOVERNANCE_BASE_WORLD_NOT_FOUND",`Proposal references missing base world "${a}"`);E(e);let f=await e.getWorldSnapshot(s);if(!f)throw new v("GOVERNANCE_RESULT_WORLD_NOT_FOUND",`Proposal references missing result world "${s}"`);return o.deriveExecutionOutcome(i,f)}function ce(e,a){if(!e.resultWorld)throw new v("GOVERNANCE_RESULT_WORLD_MISSING",`Proposal "${e.proposalId}" reached ${a} without a result world`);return e.resultWorld}function E(e){if($(e).isDisposed())throw new le}function $(e){let s=e[U];if(!s)throw new v("GOVERNANCE_RUNTIME_UNSUPPORTED","waitForProposal helpers require a runtime created by withGovernance().activate()");return s}function j(e,a){return e===void 0||!Number.isFinite(e)?a:Math.max(0,e)}function ue(e){return new Promise(a=>{globalThis.setTimeout(a,e)})}var Te=Object.freeze({__governanceLaws:!0});function Ee(e,a){ye(e);let s=we(e),o=s,i=ge(e);if(!i)throw new R("GOVERNANCE_LINEAGE_REQUIRED","withGovernance() requires a manifesto already composed with withLineage()");let f=Ie(e),I={_laws:Object.freeze({...e._laws,...Te}),schema:e.schema,activate(){return fe(I),Re(o(),i.config,a)}};return Pe(I,s,f),I}function Re(e,a,s){let o=s.governanceStore??G(),i=L(o,{lineageService:a.service}),f=s.evaluator??C(),I=M({service:i,sink:s.eventSink,now:s.now}),p=s.now??Date.now,l=ve(e,a.service,a),c,u=null;async function g(){return u||(u=Promise.all(s.bindings.map(async t=>{await o.putActorBinding(t)})).then(()=>{}).catch(t=>{throw u=null,t}),u)}async function A(){await l.ensureReady(),await g()}function T(){return p()}async function k(t,n){let r=await i.invalidateStaleIngress(t,n);await Promise.all(r.map(async m=>{await o.putProposal(m)}))}async function H(t){let n=await o.getActorBinding(t);if(n)return n;throw new R("GOVERNANCE_BINDING_NOT_FOUND",`No actor-authority binding exists for actor "${t}"`)}async function z(t,n,r){switch(n.policy.mode){case"hitl":return{kind:"pending",waitingFor:{kind:"human",delegate:n.policy.delegate}};case"tribunal":return{kind:"pending",waitingFor:{kind:"tribunal",members:n.policy.members}};default:return r.evaluate(t,n)}}async function Q(t,n){let r=null,m=null,w=!1;try{r=await l.sealIntent(n,{proposalRef:t.proposalId,decisionRef:t.decisionId,executionKey:t.executionKey,publishOnCompleted:!1,assumeEnqueued:!0});let d=await i.finalize(t,r.preparedCommit,T());if(m=d.proposal,await o.putProposal(d.proposal),w=!0,await o.putDecisionRecord(d.decisionRecord),I.emitSealCompleted(d,r.preparedCommit),r.preparedCommit.branchChange.headAdvanced){let h=e.setVisibleSnapshot(r.hostResult.snapshot);return e.emitEvent("dispatch:completed",{intentId:n.intentId??"",intent:n,snapshot:h}),d.proposal}let y=q(r.hostResult.error);return e.emitEvent("dispatch:failed",{intentId:n.intentId??"",intent:n,error:y}),d.proposal}catch(d){let y=q(d);if(!w)try{if(m)try{await o.putProposal(m)}catch{let h=i.failExecution(t,T(),r?.preparedCommit.worldId);await o.putProposal(h)}else{let h=i.failExecution(t,T(),r?.preparedCommit.worldId);await o.putProposal(h)}}catch{}throw be(y)||e.emitEvent("dispatch:failed",{intentId:n.intentId??"",intent:n,error:y}),y}}async function b(t,n){let r=await i.prepareAuthorityResult(t,n,{decidedAt:T()});if(await o.putProposal(r.proposal),r.decisionRecord&&await o.putDecisionRecord(r.decisionRecord),r.discarded||r.proposal.status==="rejected")return r.proposal;let m=i.beginExecution(r.proposal);return await o.putProposal(m),Q(m,Ae(r.proposal))}async function X(t){if(e.isDisposed())throw new P;return e.enqueue(async()=>{if(e.isDisposed())throw new P;await A();let n=e.ensureIntentId(t);if(!e.isActionAvailable(n.type))return e.rejectUnavailable(n);let r=await l.getActiveBranch();await k(r.id,r.epoch);let m=s.execution.deriveActor(n),w=await H(m.actorId),d=await F({body:{type:n.type,...n.input!==void 0?{input:n.input}:{},...Se(n)?{scopeProposal:n.scopeProposal}:{}},schemaHash:e.schema.hash,projectionId:s.execution.projectionId,source:s.execution.deriveSource(n),actor:m,intentId:n.intentId}),y=O(),h=i.createProposal({proposalId:y,baseWorld:r.head,branchId:r.id,actorId:w.actorId,authorityId:w.authorityId,intent:{type:d.body.type,intentId:d.intentId,...d.body.input!==void 0?{input:d.body.input}:{},...d.body.scopeProposal!==void 0?{scopeProposal:d.body.scopeProposal}:{}},executionKey:x({proposalId:y,actorId:w.actorId,baseWorld:r.head,branchId:r.id,attempt:1}),submittedAt:T(),epoch:r.epoch});await o.putProposal(h);let S=i.beginEvaluating(h);await o.putProposal(S);let N=await z(S,w,f);return N.kind==="pending"?S:b(S,N)})}async function D(t){let n=await o.getProposal(t);if(!n)throw new R("GOVERNANCE_PROPOSAL_NOT_FOUND",`Proposal "${t}" was not found`);if(n.status!=="evaluating")throw new R("GOVERNANCE_PENDING_REQUIRED",`Proposal "${t}" is not pending human resolution`);return n}async function J(t,n){if(e.isDisposed())throw new P;return e.enqueue(async()=>{if(e.isDisposed())throw new P;await A();let r=await D(t);return b(r,{kind:"approved",approvedScope:n!==void 0?n:r.intent.scopeProposal??null})})}async function Y(t,n){if(e.isDisposed())throw new P;return e.enqueue(async()=>{if(e.isDisposed())throw new P;await A();let r=await D(t);return b(r,{kind:"rejected",...n?{reason:n}:{}})})}async function Z(t){return await g(),o.getProposal(t)}async function ee(t){await A();let n=t??(await l.getActiveBranch()).id;return o.getProposalsByBranch(n)}async function oe(t){if(e.isDisposed())throw new P;return e.enqueue(async()=>{if(e.isDisposed())throw new P;await g(),await o.putActorBinding(t)})}async function te(t){return await g(),o.getActorBinding(t)}async function ne(t){return await g(),o.getDecisionRecord(t)}function W(t){return me(c).explainIntentFor(e.getCanonicalSnapshot(),t)}function re(t){return W(t)}function ae(t){let n=W(t);return n.kind==="blocked"?n.blockers:null}let se={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,simulateIntent:e.simulateIntent,explainIntent:W,why:re,whyNot:ae,MEL:e.MEL,schema:e.schema,dispose:e.dispose,restore:l.restore,getWorld:l.getWorld,getWorldSnapshot:l.getWorldSnapshot,getLineage:l.getLineage,getLatestHead:l.getLatestHead,getHeads:l.getHeads,getBranches:l.getBranches,getActiveBranch:l.getActiveBranch,switchActiveBranch:l.switchActiveBranch,createBranch:l.createBranch,proposeAsync:X,approve:J,reject:Y,getProposal:Z,getProposals:ee,bindActor:oe,getActorBinding:te,getDecisionRecord:ne};return c=K(he(se,e),{isDisposed:e.isDisposed,deriveExecutionOutcome:e.deriveExecutionOutcome}),c}function Ae(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 q(e){return e instanceof Error?e:new R("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{G as createInMemoryGovernanceStore,ie as createNoopGovernanceEventSink,V as waitForProposal,de as waitForProposalWithReport,Ee as withGovernance};
|
|
1
|
+
import{B as Te,C as Y,D as Pe,F as Ie,I as be,a as he,d as ge,e as Re,r as ce}from"./chunk-DKBKAFPQ.js";import{DisposedError as x,ManifestoError as v}from"@manifesto-ai/sdk";import{activateComposable as We,assertComposableNotActivated as _e,attachRuntimeKernelFactory as Fe,getActivationState as Me,getRuntimeKernelFactory as ze}from"@manifesto-ai/sdk/provider";import{createLineageRuntimeController as Be,getLineageDecoration as Le}from"@manifesto-ai/lineage/provider";import{DisposedError as ue,ManifestoError as pe,SubmissionFailedError as Oe}from"@manifesto-ai/sdk";import{attachExtensionKernel as xe}from"@manifesto-ai/sdk/provider";import{ManifestoError as Ne}from"@manifesto-ai/sdk";function de(e){let s;try{s=structuredClone(e)}catch(p){throw new Ne("INVALID_INPUT",`Action input must be structured-cloneable: ${p instanceof Error?p.message:String(p)}`)}return we(s)}function le(e){try{return{ok:!0,value:de(e)}}catch(s){if(s instanceof Ne)return{ok:!1,error:s};throw s}}function we(e,s=new WeakSet){if(e==null||typeof e!="object")return e;let p=e;if(s.has(p)||Object.isFrozen(e))return e;s.add(p);for(let d of Reflect.ownKeys(p))we(p[d],s);return Object.freeze(e)}function me(e,s,p={},d=!1){let f=Z(p),A=new Map;for(let n of e.getActionMetadata())A.set(n.name,De(n));let b=Object.create(null);for(let n of A.keys()){let o=C(n);Object.defineProperty(b,n,{enumerable:!0,configurable:!1,writable:!1,value:o})}function U(n,o){if(e.isDisposed())return()=>{};let i;try{i=n(e.getSnapshot())}catch{i=void 0}return e.subscribe(n,c=>{let m=i;i=c,o(c,m)})}let N=Object.freeze({state:U,event(n,o){return e.isDisposed()?()=>{}:e.on(n,o)}}),K={action:Object.freeze(b),state:M(),computed:O(),observe:N,inspect:Object.freeze({graph:e.getSchemaGraph,canonicalSnapshot:e.getCanonicalSnapshot,action(n){return _(n)},availableActions(){return Object.freeze(e.getAvailableActions().map(n=>_(n)))},schemaHash(){return e.getCanonicalSnapshot().meta.schemaHash}}),snapshot:e.getSnapshot,context:G,injectContext(n){if(d){f=Z({...f,context:e.captureExternalContext(n)});return}e.replaceExternalContext(n)},updateContext(n){if(!d)return e.updateExternalContext(n);let o=n(G());return f=Z({...f,context:e.captureExternalContext(o)}),f.context??e.getExternalContext()},with(n){return Object.freeze(me(e,s,L(n),!0))},dispose:e.dispose,waitForSettlement(n){return s.waitForSettlement(n,void 0,f.report)},restore:s.lineage.restore,getWorld:s.lineage.getWorld,getWorldSnapshot:s.lineage.getWorldSnapshot,getLineage:s.lineage.getLineage,getLatestHead:s.lineage.getLatestHead,getHeads:s.lineage.getHeads,getBranches:s.lineage.getBranches,getActiveBranch:s.lineage.getActiveBranch,switchActiveBranch:s.lineage.switchActiveBranch,createBranch:s.lineage.createBranch,approve:$,reject:q,getProposal:s.getProposal,getProposals:s.getProposals,bindActor:s.bindActor,getActorBinding:s.getActorBinding,getDecisionRecord:s.getDecisionRecord};return xe(K,e);function R(n,o,i){return Object.freeze({name:n,ref:o,value:()=>i(e.getSnapshot()),observe:c=>U(i,c)})}function M(){let n=Object.create(null);for(let o of Object.keys(e.MEL.state)){let i=e.MEL.state[o];Object.defineProperty(n,o,{enumerable:!0,configurable:!1,writable:!1,value:R(o,i,c=>c.state[o])})}return Object.freeze(n)}function O(){let n=Object.create(null);for(let o of Object.keys(e.MEL.computed)){let i=e.MEL.computed[o];Object.defineProperty(n,o,{enumerable:!0,configurable:!1,writable:!1,value:R(o,i,c=>c.computed[o])})}return Object.freeze(n)}function C(n){return Object.freeze({info:()=>_(n),available:()=>e.isActionAvailable(n),check:(...o)=>{let i=w(n,o);return z(i)},preview:(...o)=>{let i=w(n,o);return H(i)},submit:(...o)=>{let i=w(n,o);return j(i)},bind:(...o)=>S(n,o)})}function S(n,o){let i=w(n,o),c=le([...o]),m=()=>c.ok?w(n,c.value):i;return Object.freeze({action:n,input:i.input,check:()=>z(m()),preview:()=>H(m()),submit:()=>j(m()),intent:()=>{let y=m();return y.inputError?null:y.intent}})}function w(n,o){let i=e.MEL.actions[n],c=ee(n,o),m=le(c);if(!m.ok)return Object.freeze({actionName:n,input:void 0,intent:null,inputError:m.error});try{let y=de(e.createIntent(i,...o)),h=e.validateIntentInputFor(e.getCanonicalSnapshot(),y);return Object.freeze({actionName:n,input:m.value,intent:y,inputError:h})}catch(y){if(!(y instanceof pe))throw y;return Object.freeze({actionName:n,input:m.value,intent:null,inputError:y})}}function ee(n,o){return o.length===0?void 0:e.getActionMetadata(n).publicArity>1?Object.freeze([...o]):o.length===1?o[0]:Object.freeze([...o])}function z(n){return V(n,e.getCanonicalSnapshot()).admission}function H(n){let o=e.getCanonicalSnapshot(),i=V(n,o);if(!i.admission.ok||i.intent===null)return Object.freeze({admitted:!1,admission:i.admission});let c=i.intent,m=e.createComputeContext(c,B()),y=e.simulateSync(o,c,{context:m}),h=e.deriveExecutionOutcome(o,y.snapshot);return Object.freeze({admitted:!0,status:y.status,before:h.projected.beforeSnapshot,after:h.projected.afterSnapshot,changes:h.projected.changedPaths,requirements:y.requirements,newAvailableActions:e.getAvailableActionsFor(y.snapshot).map(T=>_(T)),...Ce(y.diagnostics,f.diagnostics),error:y.snapshot.system.lastError})}async function j(n){if(e.isDisposed())throw new ue;let o=n.intent?e.createComputeContext(n.intent,B()):null;return e.enqueue(async()=>{if(e.isDisposed())throw new ue;if(await s.ensureReady(),e.isDisposed())throw new ue;let i=e.getCanonicalSnapshot(),c=V(n,i);if(!c.admission.ok||c.intent===null){let T=c.admission;return ne(n.actionName,n.intent,T,i),Object.freeze({ok:!1,mode:"governance",action:n.actionName,admission:T})}let m=c.intent;te(n.actionName,m,c.admission,i),oe(n.actionName,m,i);let y;try{y=await s.createSubmission(m,o??e.createComputeContext(m,B()))}catch(T){let t=Se(T),r=e.getCanonicalSnapshot(),a=ve(t,m,r);throw F(n.actionName,m,a,r,"runtime"),new Oe(t.message,"runtime",{cause:t})}let h=y.proposalId;return re(n.actionName,h,i),ae(n.actionName,m,h,i),e.enqueue(async()=>{await s.settleSubmission(h);let T=await s.getProposal(h);if(!T||T.status==="evaluating"||T.status==="approved"||T.status==="executing")return;let t=e.getCanonicalSnapshot(),r=T?.decisionId?await s.getDecisionRecord(T.decisionId):null;r&&k(n.actionName,h,r,t);let a=await s.waitForSettlement(h,n.actionName,"summary");a.status==="settled"?J(n.actionName,m,a.outcome,t,h,a.world.worldId):a.status==="settlement_failed"?F(n.actionName,m,a.error,t,"settlement",h):!r&&a.decision&&k(n.actionName,h,a.decision,t)}).catch(T=>{let t=Se(T),r=e.getCanonicalSnapshot(),a=ve(t,m,r);F(n.actionName,m,a,r,"settlement",h)}),Object.freeze({ok:!0,mode:"governance",status:"pending",action:n.actionName,proposal:h,waitForSettlement:()=>s.waitForSettlement(h,n.actionName,f.report)})})}function G(){return f.context??e.getExternalContext()}function B(){return f.context??e.captureExternalContext()}function L(n){return Z({...f,...n.context!==void 0?{context:e.captureExternalContext(n.context)}:{},...n.diagnostics!==void 0?{diagnostics:n.diagnostics}:{},...n.report!==void 0?{report:n.report}:{}})}function V(n,o){if(!e.isActionAvailableFor(o,n.actionName))return{admission:Object.freeze({ok:!1,action:n.actionName,layer:"availability",code:"ACTION_UNAVAILABLE",message:`Action "${n.actionName}" is unavailable against the current visible snapshot`,blockers:X(n,o)}),intent:null};if(n.inputError||!n.intent)return{admission:Object.freeze({ok:!1,action:n.actionName,layer:"input",code:"INVALID_INPUT",message:n.inputError?.message??"Invalid action input",blockers:Object.freeze([])}),intent:null};let i=e.evaluateIntentLegalityFor(o,n.intent);if(i.kind==="admitted")return{admission:Object.freeze({ok:!0,action:n.actionName}),intent:i.intent};let c=e.deriveIntentAdmission(o,i);return{admission:Q(n.actionName,c),intent:null}}async function $(n,o){let i=await s.approve(n,o);return await W(i),i}async function q(n,o){let i=await s.reject(n,o);return await W(i),i}async function W(n){let o=n.intent.type,i=e.getCanonicalSnapshot();if(n.decisionId){let c=await s.getDecisionRecord(n.decisionId);c&&k(o,n.proposalId,c,i)}if(n.status==="completed"){let c=await s.waitForSettlement(n.proposalId,o);c.status==="settled"&&J(o,n.intent,c.outcome,i,n.proposalId,c.world.worldId);return}if(n.status==="failed"){let c=await s.waitForSettlement(n.proposalId,o);c.status==="settlement_failed"&&F(o,n.intent,c.error,i,"settlement",n.proposalId)}}function Q(n,o,i){if(o.failure.kind==="invalid_input"){let m=o.failure;return Object.freeze({ok:!1,action:n,layer:"input",code:"INVALID_INPUT",message:m.error.message,blockers:Object.freeze([])})}if(o.failure.kind==="not_dispatchable"){let m=o.failure;return Object.freeze({ok:!1,action:n,layer:"dispatchability",code:"INTENT_NOT_DISPATCHABLE",message:i??`Action "${n}" is not dispatchable against the current visible snapshot`,blockers:m.blockers.map(y=>Ae(y,"INTENT_NOT_DISPATCHABLE"))})}let c=o.failure;return Object.freeze({ok:!1,action:n,layer:"availability",code:"ACTION_UNAVAILABLE",message:i??`Action "${n}" is unavailable against the current visible snapshot`,blockers:(c.blockers??[]).map(m=>Ae(m,"ACTION_UNAVAILABLE"))})}function X(n,o){if(!n.intent)return Object.freeze([]);let i=e.evaluateIntentLegalityFor(o,n.intent),c=e.deriveIntentAdmission(o,i);return c.kind!=="blocked"||c.failure.kind!=="unavailable"?Object.freeze([]):Q(n.actionName,c).blockers}function _(n){let o=A.get(n);if(!o)throw new pe("UNKNOWN_ACTION",`Action "${String(n)}" is not declared by this Manifesto schema`);return o}function te(n,o,i,c){e.emitEvent("submission:admitted",{...E(n,o,c),admission:i})}function ne(n,o,i,c){e.emitEvent("submission:rejected",{...E(n,o,c),admission:i})}function oe(n,o,i){e.emitEvent("submission:submitted",E(n,o,i))}function ae(n,o,i,c){e.emitEvent("submission:pending",{...E(n,o,c),proposal:i})}function F(n,o,i,c,m,y){e.emitEvent("submission:failed",{...E(n,o,c),stage:m,error:i,...y!==void 0?{proposal:y}:{}})}function J(n,o,i,c,m,y){e.emitEvent("submission:settled",{...E(n,o,c),outcome:i,proposal:m,worldId:y})}function re(n,o,i){e.emitEvent("proposal:created",{proposal:o,action:n,schemaHash:i.meta.schemaHash})}function k(n,o,i,c){e.emitEvent("proposal:decided",{proposal:o,action:n,schemaHash:c.meta.schemaHash,decision:Object.freeze({...i})})}function E(n,o,i){return{action:n,mode:"governance",...o?.intentId?{intentId:o.intentId}:{},schemaHash:i.meta.schemaHash,snapshotVersion:i.meta.version}}}function Ce(e,s){return!e||s==="none"?{}:s==="summary"?{diagnostics:{}}:{diagnostics:{trace:e.trace}}}function Z(e){return Object.freeze({...e})}function De(e){let s=e.input?.type==="object"?e.input.fields??{}:{},p=e.params.length>0?e.params:Object.keys(s),d=e.annotations,f=typeof d?.title=="string"?d.title:void 0;return Object.freeze({name:e.name,...f!==void 0?{title:f}:{},...e.description!==void 0?{description:e.description}:{},parameters:Object.freeze(p.map(A=>{let b=s[A];return Object.freeze({name:A,required:b?.required??!0,...b?.type!==void 0?{type:je(b.type)}:{},...b?.description!==void 0?{description:b.description}:{}})})),...d!==void 0?{annotations:d}:{}})}function je(e){return typeof e=="string"?e:typeof e=="object"&&e!==null&&"enum"in e?"enum":"unknown"}function Ae(e,s){return Object.freeze({path:Object.freeze([]),code:s,message:e.description??s,detail:Object.freeze({layer:e.layer,expression:e.expression})})}function ve(e,s,p){return Object.freeze({code:e instanceof pe?e.code:"SUBMISSION_FAILED",message:e.message,source:{actionId:s.intentId??"",nodePath:"governance.submit"},timestamp:p.meta.timestamp})}function Se(e){return e instanceof Error?e:new Error(String(e))}import{DisposedError as rt,ManifestoError as it}from"@manifesto-ai/sdk";var Ge=Symbol("manifesto-governance.wait-for-proposal");function Ee(e,s){return Object.defineProperty(e,Ge,{enumerable:!1,configurable:!1,writable:!1,value:s}),e}var Ve=Object.freeze({__governanceLaws:!0});function ke(e,s){_e(e);let p=ze(e),d=p,f=Le(e);if(!f)throw new v("GOVERNANCE_LINEAGE_REQUIRED","withGovernance() requires a manifesto already composed with withLineage()");let A=Me(e),b={_laws:Object.freeze({...e._laws,...Ve}),schema:e.schema,activate(){return We(b),Ue(d(),f.config,s)}};return Fe(b,p,A),b}function Ue(e,s,p){let d=p.governanceStore??ce(),f=be(d,{lineageService:s.service}),A=p.evaluator??Te(),b=Pe({service:f,sink:p.eventSink,now:p.now}),U=p.now??Date.now,N=Be(e,s.service,s),K,R=null,M=new Map,O=new Set;async function C(){return R||(R=Promise.all(p.bindings.map(async t=>{await d.putActorBinding(t)})).then(()=>{}).catch(t=>{throw R=null,t}),R)}async function S(){await N.ensureReady(),await C()}function w(){return U()}async function ee(t,r){let a=await f.invalidateStaleIngress(t,r);await Promise.all(a.map(async l=>{await d.putProposal(l)}))}async function z(t){let r=await d.getActorBinding(t);if(r)return r;throw new v("GOVERNANCE_BINDING_NOT_FOUND",`No actor-authority binding exists for actor "${t}"`)}async function H(t,r,a){switch(r.policy.mode){case"hitl":return{kind:"pending",waitingFor:{kind:"human",delegate:r.policy.delegate}};case"tribunal":return{kind:"pending",waitingFor:{kind:"tribunal",members:r.policy.members}};default:return a.evaluate(t,r)}}async function j(t,r){let a=null,l=null,u=!1;try{if(a=await N.sealIntent(r,{branchId:t.branchId,baseWorldId:t.baseWorld,proposalRef:t.proposalId,decisionRef:t.decisionId,executionKey:t.executionKey,publishOnCompleted:!1,assumeEnqueued:!0,context:t.computeEnvelope.context}),a.preparedCommit.branchId!==t.branchId||a.preparedCommit.attempt.baseWorldId!==t.baseWorld)throw new v("GOVERNANCE_LINEAGE_TARGET_MISMATCH",`Governance proposal "${t.proposalId}" sealed on a different lineage target`);let g=await f.finalize(t,a.preparedCommit,w()),P=qe(a.hostResult.snapshot,Object.freeze({hostTraces:a.hostResult.traces}),r);l=Object.freeze({...g.proposal,terminalOutcome:P});let I=Object.freeze({...g,proposal:l});await d.putProposal(l),u=!0;let D=await N.getActiveBranch();return a.preparedCommit.branchChange.headAdvanced&&D.id===a.preparedCommit.branchId&&e.setVisibleSnapshot(a.hostResult.snapshot),b.emitSealCompleted(I,a.preparedCommit),l}catch(g){let P=He(g);if(!u)try{if(l)try{await d.putProposal(l)}catch{let I=f.failExecution(t,w(),a?.preparedCommit.worldId);await d.putProposal(I)}else{let I=f.failExecution(t,w(),a?.preparedCommit.worldId);await d.putProposal(I)}}catch{}throw P}}async function G(t,r){let a=await f.prepareAuthorityResult(t,r,{decidedAt:w()});if(a.decisionRecord&&await d.putDecisionRecord(a.decisionRecord),await d.putProposal(a.proposal),a.discarded||a.proposal.status==="rejected")return a.proposal;let l=f.beginExecution(a.proposal);return await d.putProposal(l),j(l,fe(a.proposal))}async function B(t,r){await S();let a=e.ensureIntentId(t),l=await N.getActiveBranch();await ee(l.id,l.epoch);let u=p.execution.deriveActor(a),g=await z(u.actorId),P=await Ie({body:{type:a.type,...a.input!==void 0?{input:a.input}:{},...Ke(a)?{scopeProposal:a.scopeProposal}:{}},schemaHash:e.schema.hash,projectionId:p.execution.projectionId,source:p.execution.deriveSource(a),actor:u,intentId:a.intentId}),I=he(),D={type:P.body.type,intentId:P.intentId,...P.body.input!==void 0?{input:P.body.input}:{}},ie={...D,...P.body.scopeProposal!==void 0?{scopeProposal:P.body.scopeProposal}:{}},se=f.createProposal({proposalId:I,baseWorld:l.head,branchId:l.id,actorId:g.actorId,authorityId:g.authorityId,intent:ie,computeEnvelope:{intent:D,context:r},executionKey:ge({proposalId:I,actorId:g.actorId,baseWorld:l.head,branchId:l.id,attempt:1}),submittedAt:w(),epoch:l.epoch});await d.putProposal(se),M.set(I,g);let ye=f.beginEvaluating(se);try{await d.putProposal(ye)}catch{return se}return ye}async function L(t){if(!O.has(t)){O.add(t);try{await V(t)}finally{O.delete(t)}}}async function V(t){if(e.isDisposed())throw new x;await S();let r=await d.getProposal(t);if(!r)return;let a;if(r.status==="submitted")a=f.beginEvaluating(r),await d.putProposal(a);else if(r.status==="evaluating")a=r;else return;let l=M.get(t)??await z(a.actorId);M.delete(t);try{let u=await H(a,l,A);if(u.kind==="pending")return;await G(a,u)}catch{await W(t,a)}}async function $(t){if(t.status==="submitted"){await L(t.proposalId);return}if(t.status==="evaluating"){await L(t.proposalId);return}if(!(t.status!=="approved"&&t.status!=="executing")&&!O.has(t.proposalId)){O.add(t.proposalId);try{if(t.status==="approved"){let a=f.beginExecution(t);await d.putProposal(a);try{await j(a,fe(t))}catch{await W(t.proposalId,a)}return}let r=t;try{await j(r,fe(r))}catch{await W(r.proposalId,r)}}finally{O.delete(t.proposalId)}}}async function q(){if(e.isDisposed())return;await S();let t=await N.getBranches(),r=new Set;for(let a of t){let l=await d.getProposalsByBranch(a.id);for(let u of l){if(e.isDisposed())return;r.has(u.proposalId)||(r.add(u.proposalId),(u.status==="submitted"||u.status==="evaluating"||u.status==="approved"||u.status==="executing")&&await $(u))}}}async function W(t,r,a){let l=await d.getProposal(t)??r;l.status==="completed"||l.status==="failed"||l.status==="rejected"||l.status==="superseded"||await d.putProposal(await Q(l,a))}async function Q(t,r){if(t.status==="approved"){let a=f.beginExecution(t);return await d.putProposal(a),f.failExecution(a,w(),r)}return t.status==="executing"?f.failExecution(t,w(),r):f.prepareSupersede(t,"manual_cancel")}async function X(t){let r=await d.getProposal(t);if(!r)throw new v("GOVERNANCE_PROPOSAL_NOT_FOUND",`Proposal "${t}" was not found`);if(r.status!=="evaluating")throw new v("GOVERNANCE_PENDING_REQUIRED",`Proposal "${t}" is not pending human resolution`);return r}async function _(t,r){if(e.isDisposed())throw new x;return e.enqueue(async()=>{if(e.isDisposed())throw new x;await S();let a=await X(t);return G(a,{kind:"approved",approvedScope:r!==void 0?r:a.intent.scopeProposal??null})})}async function te(t,r){if(e.isDisposed())throw new x;return e.enqueue(async()=>{if(e.isDisposed())throw new x;await S();let a=await X(t);return G(a,{kind:"rejected",...r?{reason:r}:{}})})}async function ne(t){return await C(),d.getProposal(t)}async function oe(t){await S();let r=t??(await N.getActiveBranch()).id;return d.getProposalsByBranch(r)}async function ae(t){if(e.isDisposed())throw new x;return e.enqueue(async()=>{if(e.isDisposed())throw new x;await C(),await d.putActorBinding(t)})}async function F(t){return await C(),d.getActorBinding(t)}async function J(t){return await C(),d.getDecisionRecord(t)}async function re(t,r,a){let l=new Set;for(;;){if(e.isDisposed())throw new x;let u=await d.getProposal(t);if(!u)throw new v("GOVERNANCE_PROPOSAL_NOT_FOUND",`Proposal "${t}" was not found`);if(u.status==="completed"||o(u))return E(u,r,a);if(u.status==="failed")return c(u,r,a);if(i(u))return k(u,r,a);l.has(u.proposalId)||(l.add(u.proposalId),await e.enqueue(async()=>{let g=await d.getProposal(u.proposalId);g&&await $(g)})),await Xe(10)}}async function k(t,r,a){let l=h(t,r),u=null;if(t.decisionId&&(u=await d.getDecisionRecord(t.decisionId),!u)){let P=m(t);return Object.freeze({ok:!1,mode:"governance",status:"settlement_failed",action:l,proposal:t.proposalId,error:P,...a==="none"?{}:{report:Object.freeze({mode:"governance",status:"settlement_failed",action:l,proposal:t.proposalId,stage:"observation",error:P})}})}let g=u?Object.freeze({...u}):void 0;return Object.freeze({ok:!0,mode:"governance",status:t.status,action:l,proposal:t.proposalId,...g?{decision:g}:{},...a==="none"?{}:{report:Object.freeze({mode:"governance",status:t.status,action:l,proposal:t.proposalId,...g?{decision:g}:{}})}})}async function E(t,r,a){let l=h(t,r),u=await N.getWorldSnapshot(t.baseWorld);if(!u)throw new v("GOVERNANCE_BASE_WORLD_NOT_FOUND",`Proposal references missing base world "${t.baseWorld}"`);let g=await N.getWorldSnapshot(t.resultWorld);if(!g)throw new v("GOVERNANCE_RESULT_WORLD_NOT_FOUND",`Proposal references missing result world "${t.resultWorld}"`);let P=await N.getWorld(t.resultWorld);if(!P)throw new v("GOVERNANCE_RESULT_WORLD_NOT_FOUND",`Proposal references missing result world "${t.resultWorld}"`);let I=e.deriveExecutionOutcome(u,g),D=t.terminalOutcome??$e(I,t),ie=await n(t);return Object.freeze({ok:!0,mode:"governance",status:"settled",action:l,proposal:t.proposalId,world:Object.freeze({...P}),before:I.projected.beforeSnapshot,after:I.projected.afterSnapshot,outcome:D,...a==="none"?{}:{report:Object.freeze({mode:"governance",status:"settled",action:l,proposal:t.proposalId,baseWorldId:t.baseWorld,worldId:t.resultWorld,sealedSnapshotHash:P.snapshotHash,published:ie,outcome:D,changes:I.projected.changedPaths,requirements:I.canonical.pendingRequirements})}})}async function n(t){let r=await N.getActiveBranch();return r.id===t.branchId&&r.head===t.resultWorld}function o(t){return t.status==="failed"&&t.resultWorld!==void 0&&t.terminalOutcome!==void 0}function i(t){return t.status==="rejected"||t.status==="superseded"}async function c(t,r,a){let l=h(t,r),u=await y(t);return Object.freeze({ok:!1,mode:"governance",status:"settlement_failed",action:l,proposal:t.proposalId,error:u,...a==="none"?{}:{report:Object.freeze({mode:"governance",status:"settlement_failed",action:l,proposal:t.proposalId,stage:"settlement",error:u})}})}function m(t){let r=e.getCanonicalSnapshot();return Object.freeze({code:"GOVERNANCE_DECISION_RECORD_NOT_FOUND",message:`Proposal "${t.proposalId}" references missing decision record "${t.decisionId}"`,source:{actionId:t.intent.intentId,nodePath:"governance.waitForSettlement"},timestamp:r.meta.timestamp})}async function y(t){if(t.resultWorld){let a=await N.getWorldSnapshot(t.resultWorld);if(a){let l=Y(a);if(l)return l}}let r=e.getCanonicalSnapshot();return Object.freeze({code:"GOVERNANCE_SETTLEMENT_FAILED",message:`Proposal "${t.proposalId}" failed before settlement completed`,source:{actionId:t.intent.intentId,nodePath:"governance.waitForSettlement"},timestamp:r.meta.timestamp})}function h(t,r){return r??t.intent.type}let T=me(e,{lineage:N,ensureReady:S,createSubmission:B,settleSubmission:L,resumePendingSettlements:q,waitForSettlement:re,approve:_,reject:te,getProposal:ne,getProposals:oe,bindActor:ae,getActorBinding:F,getDecisionRecord:J});return K=Ee(T,{isDisposed:e.isDisposed,deriveExecutionOutcome:e.deriveExecutionOutcome}),e.enqueue(q).catch(()=>{}),Object.freeze(K)}function fe(e){return{type:e.computeEnvelope.intent.type,intentId:e.computeEnvelope.intent.intentId,...e.computeEnvelope.intent.input!==void 0?{input:e.computeEnvelope.intent.input}:{}}}function Ke(e){return"scopeProposal"in e&&e.scopeProposal!==void 0}function He(e){return e instanceof Error?e:new v("GOVERNANCE_EXECUTION_FAILED","Governed proposal execution did not produce a completed result")}function $e(e,s){let p=e.canonical.afterCanonicalSnapshot,d=Y(p);return d?Object.freeze({kind:"fail",error:d}):e.canonical.status==="error"?Object.freeze({kind:"fail",error:Object.freeze({code:"GOVERNANCE_EXECUTION_FAILED",message:"Governed proposal execution completed with error status",source:{actionId:s.intent.intentId,nodePath:"governance.waitForSettlement"},timestamp:p.meta.timestamp})}):Object.freeze({kind:"ok"})}function qe(e,s,p){let d=Qe(s);if(d!==null)return Object.freeze({kind:"stop",reason:d});let f=Y(e);return f?Object.freeze({kind:"fail",error:f}):e.system.status==="error"?Object.freeze({kind:"fail",error:Object.freeze({code:"GOVERNANCE_EXECUTION_FAILED",message:"Governed proposal execution completed with error status",source:{actionId:p.intentId,nodePath:"governance.finalizeExecution"},timestamp:e.meta.timestamp})}):Object.freeze({kind:"ok"})}function Qe(e){let s=e.hostTraces?.slice().reverse().find(p=>p.terminatedBy==="halt");if(!s)return null;for(let p of Object.values(s.nodes))if(p.kind==="halt"){let d=p.inputs.reason;return typeof d=="string"?d:"halted"}return"halted"}function Xe(e){return new Promise(s=>{setTimeout(s,e)})}export{ce as createInMemoryGovernanceStore,Re as createNoopGovernanceEventSink,ke as withGovernance};
|
package/dist/provider.js
CHANGED
|
@@ -1 +1 @@
|
|
|
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-
|
|
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-DKBKAFPQ.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};
|
package/dist/runtime-types.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { ComposableManifesto, BaseLaws, GovernanceLaws, LineageLaws, ManifestoDomainShape, TypedIntent } from "@manifesto-ai/sdk";
|
|
2
|
-
import type { BranchId,
|
|
1
|
+
import type { ComposableManifesto, BaseLaws, GovernanceLaws, LineageLaws, ManifestoApp, ManifestoDomainShape, TypedIntent } from "@manifesto-ai/sdk";
|
|
2
|
+
import type { BranchId, LineageContinuitySurface } from "@manifesto-ai/lineage";
|
|
3
3
|
import type { AuthorityEvaluator } from "./authority/evaluator.js";
|
|
4
4
|
import type { ActorAuthorityBinding, ActorId, ActorRef, DecisionId, DecisionRecord, GovernanceEventSink, GovernanceStore, IntentScope, Proposal, ProposalId, SourceRef } from "./types.js";
|
|
5
5
|
export type GovernanceExecutionConfig<T extends ManifestoDomainShape> = {
|
|
@@ -19,8 +19,7 @@ export type LineageComposableLaws = BaseLaws & LineageLaws & {
|
|
|
19
19
|
readonly __governanceLaws?: never;
|
|
20
20
|
};
|
|
21
21
|
export type GovernedComposableLaws = BaseLaws & LineageLaws & GovernanceLaws;
|
|
22
|
-
export type
|
|
23
|
-
readonly proposeAsync: (intent: TypedIntent<T>) => Promise<Proposal>;
|
|
22
|
+
export type GovernanceControlSurface = {
|
|
24
23
|
readonly approve: (proposalId: ProposalId, approvedScope?: IntentScope | null) => Promise<Proposal>;
|
|
25
24
|
readonly reject: (proposalId: ProposalId, reason?: string) => Promise<Proposal>;
|
|
26
25
|
readonly getProposal: (proposalId: ProposalId) => Promise<Proposal | null>;
|
|
@@ -29,7 +28,8 @@ export type GovernanceInstance<T extends ManifestoDomainShape> = Omit<LineageIns
|
|
|
29
28
|
readonly getActorBinding: (actorId: ActorId) => Promise<ActorAuthorityBinding | null>;
|
|
30
29
|
readonly getDecisionRecord: (decisionId: DecisionId) => Promise<DecisionRecord | null>;
|
|
31
30
|
};
|
|
32
|
-
export type
|
|
31
|
+
export type GovernanceInstance<T extends ManifestoDomainShape> = ManifestoApp<T, "governance"> & LineageContinuitySurface<T> & GovernanceControlSurface;
|
|
32
|
+
export type GovernanceProposalRuntime<T extends ManifestoDomainShape> = Record<never, never>;
|
|
33
33
|
export type GovernanceComposableManifesto<T extends ManifestoDomainShape> = Omit<ComposableManifesto<T, GovernedComposableLaws>, "activate"> & {
|
|
34
34
|
activate(): GovernanceInstance<T>;
|
|
35
35
|
};
|
package/dist/types.d.ts
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import type { ErrorValue, Intent as HostIntent, Snapshot } from "@manifesto-ai/core";
|
|
2
|
-
import type { BranchId, World, WorldId } from "@manifesto-ai/lineage";
|
|
2
|
+
import type { BranchId, ComputeEnvelope, World, WorldId } from "@manifesto-ai/lineage";
|
|
3
3
|
import type { PreparedLineageCommit } from "@manifesto-ai/lineage/provider";
|
|
4
|
+
import type { ExecutionOutcome } from "@manifesto-ai/sdk";
|
|
4
5
|
export type { Snapshot } from "@manifesto-ai/core";
|
|
5
|
-
export type { ArtifactRef, BranchId, World, WorldId, } from "@manifesto-ai/lineage";
|
|
6
|
+
export type { ArtifactRef, BranchId, ComputeEnvelope, World, WorldId, } from "@manifesto-ai/lineage";
|
|
6
7
|
export type ProposalId = string;
|
|
7
8
|
export type DecisionId = string;
|
|
8
9
|
export type ActorId = string;
|
|
@@ -72,6 +73,7 @@ export interface Proposal {
|
|
|
72
73
|
readonly actorId: ActorId;
|
|
73
74
|
readonly authorityId: AuthorityId;
|
|
74
75
|
readonly intent: Intent;
|
|
76
|
+
readonly computeEnvelope: ComputeEnvelope;
|
|
75
77
|
readonly status: ProposalStatus;
|
|
76
78
|
readonly executionKey: ExecutionKey;
|
|
77
79
|
readonly submittedAt: number;
|
|
@@ -80,6 +82,7 @@ export interface Proposal {
|
|
|
80
82
|
readonly decisionId?: DecisionId;
|
|
81
83
|
readonly epoch: number;
|
|
82
84
|
readonly resultWorld?: WorldId;
|
|
85
|
+
readonly terminalOutcome?: ExecutionOutcome;
|
|
83
86
|
readonly supersededReason?: SupersedeReason;
|
|
84
87
|
readonly approvedScope?: unknown;
|
|
85
88
|
}
|
|
@@ -258,6 +261,7 @@ export interface CreateProposalInput {
|
|
|
258
261
|
readonly actorId: ActorId;
|
|
259
262
|
readonly authorityId: AuthorityId;
|
|
260
263
|
readonly intent: Intent;
|
|
264
|
+
readonly computeEnvelope: ComputeEnvelope;
|
|
261
265
|
readonly executionKey: ExecutionKey;
|
|
262
266
|
readonly submittedAt: number;
|
|
263
267
|
readonly epoch: number;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type
|
|
1
|
+
import { type CanonicalSnapshot, type DispatchExecutionOutcome, type ManifestoDomainShape } from "@manifesto-ai/sdk";
|
|
2
2
|
import type { WaitForProposalRuntimeKernel } from "@manifesto-ai/sdk/provider";
|
|
3
3
|
import type { GovernanceInstance } from "./runtime-types.js";
|
|
4
4
|
import type { ErrorInfo, Proposal, ProposalId, WorldId } from "./types.js";
|
|
@@ -13,7 +13,7 @@ export type ProposalSettlement<T extends ManifestoDomainShape = ManifestoDomainS
|
|
|
13
13
|
readonly status: "completed";
|
|
14
14
|
readonly resultWorld: WorldId;
|
|
15
15
|
};
|
|
16
|
-
readonly snapshot:
|
|
16
|
+
readonly snapshot: CanonicalSnapshot<T["state"]>;
|
|
17
17
|
readonly resultWorld: WorldId;
|
|
18
18
|
} | {
|
|
19
19
|
readonly kind: "failed";
|
|
@@ -47,7 +47,7 @@ export type ProposalSettlementReport<T extends ManifestoDomainShape = ManifestoD
|
|
|
47
47
|
};
|
|
48
48
|
readonly baseWorld: WorldId;
|
|
49
49
|
readonly resultWorld: WorldId;
|
|
50
|
-
readonly outcome:
|
|
50
|
+
readonly outcome: DispatchExecutionOutcome<T>;
|
|
51
51
|
} | {
|
|
52
52
|
readonly kind: "failed";
|
|
53
53
|
readonly proposal: Proposal & {
|
|
@@ -57,7 +57,7 @@ export type ProposalSettlementReport<T extends ManifestoDomainShape = ManifestoD
|
|
|
57
57
|
readonly published: false;
|
|
58
58
|
readonly error: ErrorInfo;
|
|
59
59
|
readonly resultWorld?: WorldId;
|
|
60
|
-
readonly sealedOutcome?:
|
|
60
|
+
readonly sealedOutcome?: DispatchExecutionOutcome<T>;
|
|
61
61
|
} | {
|
|
62
62
|
readonly kind: "rejected";
|
|
63
63
|
readonly proposal: Proposal & {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@manifesto-ai/governance",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "5.0.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",
|
|
@@ -34,18 +34,18 @@
|
|
|
34
34
|
}
|
|
35
35
|
},
|
|
36
36
|
"peerDependencies": {
|
|
37
|
-
"@manifesto-ai/core": "^
|
|
37
|
+
"@manifesto-ai/core": "^5.0.0"
|
|
38
38
|
},
|
|
39
39
|
"dependencies": {
|
|
40
|
-
"@manifesto-ai/lineage": "
|
|
41
|
-
"@manifesto-ai/sdk": "
|
|
40
|
+
"@manifesto-ai/lineage": "5.0.0",
|
|
41
|
+
"@manifesto-ai/sdk": "5.0.0"
|
|
42
42
|
},
|
|
43
43
|
"devDependencies": {
|
|
44
44
|
"typescript": "^5.9.3",
|
|
45
45
|
"vite": "^8.0.8",
|
|
46
46
|
"vitest": "^4.1.4",
|
|
47
|
-
"@manifesto-ai/core": "
|
|
48
|
-
"@manifesto-ai/cts-kit": "0.
|
|
47
|
+
"@manifesto-ai/core": "5.0.0",
|
|
48
|
+
"@manifesto-ai/cts-kit": "5.0.0"
|
|
49
49
|
},
|
|
50
50
|
"files": [
|
|
51
51
|
"dist"
|
package/dist/chunk-2Q3OH2FH.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
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};
|