@lssm-tech/module.lssm-os-control-plane 2.1.2 → 2.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/application.d.ts +43 -0
- package/dist/application.js +2 -0
- package/dist/browser/application.js +1 -0
- package/dist/browser/builder-handoff.js +1 -0
- package/dist/browser/in-memory.js +1 -0
- package/dist/browser/index.js +1 -0
- package/dist/browser/ports.js +0 -0
- package/dist/browser/runtime-node-worker.js +1 -0
- package/dist/browser/topology-controller.js +1 -0
- package/dist/browser/types.js +0 -0
- package/dist/browser/worker.js +1 -0
- package/dist/builder-candidate-admission.d.ts +30 -0
- package/dist/builder-candidate-artifacts.d.ts +12 -0
- package/dist/builder-candidate-host-types.d.ts +25 -0
- package/dist/builder-candidate-host.d.ts +14 -0
- package/dist/builder-candidate-operation.d.ts +18 -0
- package/dist/builder-candidate-queue-receipt.d.ts +3 -0
- package/dist/builder-handoff.d.ts +13 -0
- package/dist/builder-handoff.js +2 -0
- package/dist/builder-runtime-execution.d.ts +20 -0
- package/dist/builder-runtime-provider.d.ts +11 -0
- package/dist/builder-runtime-receipt-writer.d.ts +12 -0
- package/dist/in-memory.d.ts +45 -0
- package/dist/in-memory.js +2 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.js +2 -0
- package/dist/lssm-os-control-plane.feature.d.ts +12 -0
- package/dist/node/application.js +1 -0
- package/dist/node/builder-handoff.js +1 -0
- package/dist/node/in-memory.js +1 -0
- package/dist/node/index.js +1 -0
- package/dist/node/ports.js +0 -0
- package/dist/node/runtime-node-worker.js +1 -0
- package/dist/node/topology-controller.js +1 -0
- package/dist/node/types.js +0 -0
- package/dist/node/worker.js +1 -0
- package/dist/ports.d.ts +30 -0
- package/dist/ports.js +1 -0
- package/dist/runtime-node-worker-completion.d.ts +20 -0
- package/dist/runtime-node-worker-deadline.d.ts +16 -0
- package/dist/runtime-node-worker-receipts.d.ts +5 -0
- package/dist/runtime-node-worker-types.d.ts +40 -0
- package/dist/runtime-node-worker-validation.d.ts +16 -0
- package/dist/runtime-node-worker.d.ts +12 -0
- package/dist/runtime-node-worker.js +2 -0
- package/dist/scheduling-authority.d.ts +4 -0
- package/dist/topology-controller-authorization.d.ts +40 -0
- package/dist/topology-controller-commands.d.ts +6 -0
- package/dist/topology-controller-custody.d.ts +2 -0
- package/dist/topology-controller-disposition.d.ts +3 -0
- package/dist/topology-controller-lifecycle-forward.d.ts +2 -0
- package/dist/topology-controller-lifecycle.d.ts +4 -0
- package/dist/topology-controller-recipe-bindings.d.ts +4 -0
- package/dist/topology-controller-recipe.d.ts +6 -0
- package/dist/topology-controller-scale-transition.d.ts +2 -0
- package/dist/topology-controller-scale.d.ts +2 -0
- package/dist/topology-controller-state.d.ts +5 -0
- package/dist/topology-controller-types.d.ts +46 -0
- package/dist/topology-controller-v2.d.ts +8 -0
- package/dist/topology-controller-validation.d.ts +6 -0
- package/dist/topology-controller.d.ts +20 -0
- package/dist/topology-controller.js +2 -0
- package/dist/topology-scale-planner-choice.d.ts +10 -0
- package/dist/topology-scale-planner-composition.d.ts +3 -0
- package/dist/topology-scale-planner-decision.d.ts +14 -0
- package/dist/topology-scale-planner-results.d.ts +64 -0
- package/dist/topology-scale-planner-scope.d.ts +6 -0
- package/dist/topology-scale-planner-types.d.ts +42 -0
- package/dist/topology-scale-planner-validation.d.ts +6 -0
- package/dist/topology-scale-planner.d.ts +4 -0
- package/dist/types.d.ts +44 -0
- package/dist/types.js +1 -0
- package/dist/worker.d.ts +17 -0
- package/dist/worker.js +2 -0
- package/package.json +15 -14
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { type CompilePlanInputV1, type ConnectAuthorityPort, type ConnectAuthorizationRefV1, type ConnectDecisionVerifierPort, type ExecutionRecordV1, type ProviderExecutionPort, type RuntimeClockPort, type RuntimeExecutionPort, type RuntimePlanPort, type RuntimeReceiptPort, type RuntimeScopeV1, type RuntimeStatePort, type WorkOrderLeasePort } from '@lssm-tech/lib.lssm-os-runtime';
|
|
2
|
+
import type { ControlPlaneWorkOrderPort } from './ports.js';
|
|
3
|
+
import type { ScheduleApplyInputV1, ScheduledWorkOrderV1 } from './types.js';
|
|
4
|
+
export interface LssmOsControlPlanePorts {
|
|
5
|
+
readonly state: RuntimeStatePort;
|
|
6
|
+
readonly plans: RuntimePlanPort;
|
|
7
|
+
readonly executions: RuntimeExecutionPort;
|
|
8
|
+
readonly receipts: RuntimeReceiptPort;
|
|
9
|
+
readonly leases: WorkOrderLeasePort;
|
|
10
|
+
readonly provider: ProviderExecutionPort;
|
|
11
|
+
readonly connect: ConnectAuthorityPort;
|
|
12
|
+
readonly connectVerifier: ConnectDecisionVerifierPort;
|
|
13
|
+
readonly clock: RuntimeClockPort;
|
|
14
|
+
readonly workOrders: ControlPlaneWorkOrderPort;
|
|
15
|
+
}
|
|
16
|
+
export declare class LssmOsControlPlane {
|
|
17
|
+
private readonly ports;
|
|
18
|
+
private readonly executor;
|
|
19
|
+
constructor(ports: LssmOsControlPlanePorts);
|
|
20
|
+
validate(input: Pick<CompilePlanInputV1, 'desired' | 'observed'>): import("@lssm-tech/lib.lssm-os-runtime").RuntimeIssueV1[];
|
|
21
|
+
plan(input: CompilePlanInputV1): Promise<import("@lssm-tech/lib.lssm-os-runtime").RuntimePlanV1>;
|
|
22
|
+
authorize(input: {
|
|
23
|
+
readonly scope: RuntimeScopeV1;
|
|
24
|
+
readonly planId: string;
|
|
25
|
+
readonly actorRef: string;
|
|
26
|
+
readonly requestedAt: string;
|
|
27
|
+
}): Promise<ConnectAuthorizationRefV1>;
|
|
28
|
+
apply(input: {
|
|
29
|
+
readonly scope: RuntimeScopeV1;
|
|
30
|
+
readonly planId: string;
|
|
31
|
+
readonly planDigest: string;
|
|
32
|
+
readonly authorizationRef: ConnectAuthorizationRefV1;
|
|
33
|
+
readonly executionId: string;
|
|
34
|
+
readonly idempotencyKey: string;
|
|
35
|
+
readonly holderId: string;
|
|
36
|
+
readonly leaseTtlMs: number;
|
|
37
|
+
}): Promise<ExecutionRecordV1>;
|
|
38
|
+
schedule(input: ScheduleApplyInputV1): Promise<ScheduledWorkOrderV1>;
|
|
39
|
+
status(scope: RuntimeScopeV1, executionId: string): Promise<ExecutionRecordV1 | undefined>;
|
|
40
|
+
drift(scope: RuntimeScopeV1): Promise<import("@lssm-tech/lib.lssm-os-runtime").DriftReportV1>;
|
|
41
|
+
replay(scope: RuntimeScopeV1, executionId: string): Promise<import("@lssm-tech/lib.lssm-os-runtime").ReplayResultV1>;
|
|
42
|
+
private requirePlan;
|
|
43
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
import{compileRuntimePlan as h,detectDrift as m,RuntimeExecutor as w,replayExecution as P,validateDesiredState as f,validateObservedState as R}from"@lssm-tech/lib.lssm-os-runtime";import{ConnectAuthorizationEnvelopeV1Schema as p,verifyPlanAuthorization as y}from"@lssm-tech/lib.lssm-os-runtime";async function d(e,t,r,o){let u=await e.connectVerifier.verify({reference:r,plan:t,verifiedAt:e.clock.now()}),n=p.parse(u);if(n.decisionId!==r.decisionId||n.attestationDigest!==r.attestationDigest||o!==void 0&&n.actorRef!==o)throw Error("Connect authority reference or actor mismatch.");let i=await e.state.getDesired(t),a=await e.state.getObserved(t);if(!i||!a)throw Error("Current state is unavailable.");let c=e.clock.now();if(!Number.isFinite(Date.parse(c)))throw Error("Trusted clock is invalid.");for(let s of[i,a])if(s.tenantId!==t.tenantId||s.workspaceId!==t.workspaceId||s.environmentId!==t.environmentId)throw Error("Current state scope mismatch.");let l=y(t,n,c,{desiredRevisionDigest:i.revision.digest,observedRevisionDigest:a.revision.digest});if(!l.allowed)throw Error(`Scheduling authorization failed: ${l.reason}.`)}class v{ports;executor;constructor(e){this.ports=e;this.executor=new w(e)}validate(e){return[...f(e.desired),...R(e.observed)]}async plan(e){let t=h(e);return await this.ports.state.putDesired(e.desired),await this.ports.state.putObserved(e.observed),await this.ports.plans.put(t),t}async authorize(e){let t=await this.requirePlan(e.planId,e.scope),r=await this.ports.connect.authorize({plan:t,actorRef:e.actorRef,requestedAt:e.requestedAt});return await d(this.ports,t,r,e.actorRef),r}async apply(e){let t=await this.requirePlan(e.planId,e.scope);if(t.digest!==e.planDigest)throw Error("Requested plan digest is stale.");let r=await this.ports.state.getDesired(e.scope),o=await this.ports.state.getObserved(e.scope);if(!r||!o)throw Error("Desired or observed state is unavailable.");return this.executor.execute({plan:t,authorizationRef:e.authorizationRef,desired:r,observed:o,executionId:e.executionId,idempotencyKey:e.idempotencyKey,holderId:e.holderId,leaseTtlMs:e.leaseTtlMs})}async schedule(e){let t=await this.requirePlan(e.plan.id,e.plan);if(t.digest!==e.plan.digest)throw Error("Cannot schedule a stale plan.");await d(this.ports,t,e.authorizationRef);let r={contractVersion:"1.0.0",id:e.id,planId:t.id,planDigest:t.digest,authorizationRef:e.authorizationRef,executionId:e.executionId,idempotencyKey:e.idempotencyKey,tenantId:t.tenantId,workspaceId:t.workspaceId,environmentId:t.environmentId,status:"queued",attempts:0,maxAttempts:e.maxAttempts??3,queuedAt:e.queuedAt};return await this.ports.workOrders.enqueue(r),r}async status(e,t){return this.ports.executions.get(e,t)}async drift(e){let t=await this.ports.state.getDesired(e),r=await this.ports.state.getObserved(e);if(!t||!r)throw Error("Desired or observed state is unavailable.");return m(t,r)}async replay(e,t){let r=await this.status(e,t);if(!r)throw Error("Execution not found.");let o=await this.requirePlan(r.planId,e);return P(o,r,await this.ports.receipts.list(e,t),this.ports.provider)}async requirePlan(e,t){let r=await this.ports.plans.get(t,e);if(!r)throw Error("Resource not found.");return r}}export{v as LssmOsControlPlane};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{compileRuntimePlan as h,detectDrift as m,RuntimeExecutor as w,replayExecution as P,validateDesiredState as f,validateObservedState as R}from"@lssm-tech/lib.lssm-os-runtime";import{ConnectAuthorizationEnvelopeV1Schema as p,verifyPlanAuthorization as y}from"@lssm-tech/lib.lssm-os-runtime";async function d(e,t,r,o){let u=await e.connectVerifier.verify({reference:r,plan:t,verifiedAt:e.clock.now()}),n=p.parse(u);if(n.decisionId!==r.decisionId||n.attestationDigest!==r.attestationDigest||o!==void 0&&n.actorRef!==o)throw Error("Connect authority reference or actor mismatch.");let i=await e.state.getDesired(t),a=await e.state.getObserved(t);if(!i||!a)throw Error("Current state is unavailable.");let c=e.clock.now();if(!Number.isFinite(Date.parse(c)))throw Error("Trusted clock is invalid.");for(let s of[i,a])if(s.tenantId!==t.tenantId||s.workspaceId!==t.workspaceId||s.environmentId!==t.environmentId)throw Error("Current state scope mismatch.");let l=y(t,n,c,{desiredRevisionDigest:i.revision.digest,observedRevisionDigest:a.revision.digest});if(!l.allowed)throw Error(`Scheduling authorization failed: ${l.reason}.`)}class v{ports;executor;constructor(e){this.ports=e;this.executor=new w(e)}validate(e){return[...f(e.desired),...R(e.observed)]}async plan(e){let t=h(e);return await this.ports.state.putDesired(e.desired),await this.ports.state.putObserved(e.observed),await this.ports.plans.put(t),t}async authorize(e){let t=await this.requirePlan(e.planId,e.scope),r=await this.ports.connect.authorize({plan:t,actorRef:e.actorRef,requestedAt:e.requestedAt});return await d(this.ports,t,r,e.actorRef),r}async apply(e){let t=await this.requirePlan(e.planId,e.scope);if(t.digest!==e.planDigest)throw Error("Requested plan digest is stale.");let r=await this.ports.state.getDesired(e.scope),o=await this.ports.state.getObserved(e.scope);if(!r||!o)throw Error("Desired or observed state is unavailable.");return this.executor.execute({plan:t,authorizationRef:e.authorizationRef,desired:r,observed:o,executionId:e.executionId,idempotencyKey:e.idempotencyKey,holderId:e.holderId,leaseTtlMs:e.leaseTtlMs})}async schedule(e){let t=await this.requirePlan(e.plan.id,e.plan);if(t.digest!==e.plan.digest)throw Error("Cannot schedule a stale plan.");await d(this.ports,t,e.authorizationRef);let r={contractVersion:"1.0.0",id:e.id,planId:t.id,planDigest:t.digest,authorizationRef:e.authorizationRef,executionId:e.executionId,idempotencyKey:e.idempotencyKey,tenantId:t.tenantId,workspaceId:t.workspaceId,environmentId:t.environmentId,status:"queued",attempts:0,maxAttempts:e.maxAttempts??3,queuedAt:e.queuedAt};return await this.ports.workOrders.enqueue(r),r}async status(e,t){return this.ports.executions.get(e,t)}async drift(e){let t=await this.ports.state.getDesired(e),r=await this.ports.state.getObserved(e);if(!t||!r)throw Error("Desired or observed state is unavailable.");return m(t,r)}async replay(e,t){let r=await this.status(e,t);if(!r)throw Error("Execution not found.");let o=await this.requirePlan(r.planId,e);return P(o,r,await this.ports.receipts.list(e,t),this.ports.provider)}async requirePlan(e,t){let r=await this.ports.plans.get(t,e);if(!r)throw Error("Resource not found.");return r}}export{v as LssmOsControlPlane};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{builderPlatformDigest as i,builderPlatformId as n}from"@lssm-tech/lib.builder-runtime/planning";import{validatePlatformHandoffPacket as s}from"@lssm-tech/lib.builder-spec";import{digestCanonical as o}from"@lssm-tech/lib.lssm-os-runtime";function y(e){let c=s(e.packet),t=e.packet.digest===e.expectedPacketDigest&&(e.packet.digest===l(e.packet)&&e.packet.id===n("platform-handoff",P(e.packet))||e.packet.digest===m(e.packet)),a=!e.runtimePlan||e.packet.planPreview.planDigest===e.runtimePlan.digest,d=c.length>0?"rejected":t&&a?"accepted_for_review":"stale",r={packetId:e.packet.id,packetDigest:e.packet.digest,consumer:e.consumer,status:d},f={id:`handoff-receipt:${o(r).slice(7,23)}`,packetRef:{id:e.packet.id,kind:"handoff",version:e.packet.version,digest:e.packet.digest},packetDigest:e.packet.digest,status:d,consumer:e.consumer,connectReviewRef:e.packet.authorityBoundary.connectReviewRef,evidenceRefs:e.evidenceRefs??[],receivedAt:e.receivedAt};return{packet:e.packet,receipt:f,...d==="accepted_for_review"&&e.runtimePlan?{acceptedPlanId:e.runtimePlan.id}:{}}}function l(e){let{id:c,digest:t,...a}=e;return i(a)}function m(e){let{digest:c,...t}=e;return o(t)}function P(e){let{id:c,digest:t,...a}=e;return a}export{y as acceptBuilderHandoff,l as digestBuilderHandoffPacket};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{digestConnectAuthorization as a}from"@lssm-tech/lib.lssm-os-runtime";class c{decisions;constructor(e){this.decisions=e}async authorize(e){let t=this.decisions.find((n)=>n.planId===e.plan.id&&n.planDigest===e.plan.digest&&n.actorRef===e.actorRef);if(!t)throw Error("No exact Connect decision is available.");return{decisionId:t.decisionId,attestationDigest:t.attestationDigest}}async verify(e){let t=this.decisions.find((n)=>n.decisionId===e.reference.decisionId&&n.attestationDigest===e.reference.attestationDigest&&n.planId===e.plan.id&&n.planDigest===e.plan.digest);if(!t||a(t)!==t.attestationDigest)return;return t}}class l{records=new Map;tokens=new Map;admissions=new Map;async enqueue(e){let t=`${o(e)}/${e.id}`,n=JSON.stringify([e.contractVersion,e.planId,e.planDigest,e.authorizationRef.decisionId,e.authorizationRef.attestationDigest,e.executionId,e.idempotencyKey,e.maxAttempts]);if(this.admissions.has(t)){if(this.admissions.get(t)!==n)throw Error("Conflicting work-order admission.");return}if(e.status!=="queued"||e.attempts!==0||e.lease||!Number.isSafeInteger(e.maxAttempts)||e.maxAttempts<1)throw Error("Invalid initial work-order state.");this.admissions.set(t,n),this.records.set(t,structuredClone(e))}async claim(e){let t=[...this.records.values()].filter((r)=>u(r,e.scope)&&r.attempts<r.maxAttempts).filter((r)=>r.status==="queued"||r.status==="retry_wait"&&Date.parse(r.nextAttemptAt??e.now)<=Date.parse(e.now)||r.status==="leased"&&Date.parse(r.lease?.expiresAt??e.now)<=Date.parse(e.now)).sort((r,d)=>r.id<d.id?-1:r.id>d.id?1:0)[0];if(!t)return;let n=`${o(t)}/${t.id}`,s=(this.tokens.get(n)??0)+1,i={...t,status:"leased",attempts:t.attempts+1,lease:{holderId:e.holderId,fencingToken:s,expiresAt:new Date(Date.parse(e.now)+e.ttlMs).toISOString()}};return this.tokens.set(n,s),this.records.set(n,i),{workOrder:structuredClone(i),holderId:e.holderId,fencingToken:s}}async complete(e){let t=`${o(e.scope)}/${e.workOrderId}`,n=this.records.get(t);if(n?.status!=="leased"||!n.lease||n.lease.holderId!==e.holderId||n.lease.fencingToken!==e.fencingToken)throw Error("Work-order claim was superseded.");let s={...n,status:e.executionStatus==="succeeded"?"completed":e.executionStatus==="indeterminate"?"indeterminate":"failed",executionStatus:e.executionStatus};return this.records.set(t,s),structuredClone(s)}async retry(e){let t=`${o(e.scope)}/${e.workOrderId}`,n=this.records.get(t);if(n?.status!=="leased"||!n.lease||n.lease.holderId!==e.holderId||n.lease.fencingToken!==e.fencingToken)throw Error("Work-order claim was superseded.");let{lease:s,...i}=n,r={...i,status:"retry_wait",nextAttemptAt:e.nextAttemptAt};return this.records.set(t,r),structuredClone(r)}async get(e,t){let n=this.records.get(`${o(e)}/${t}`);return n?structuredClone(n):void 0}}function u(e,t){return e.tenantId===t.tenantId&&e.workspaceId===t.workspaceId&&e.environmentId===t.environmentId}function o(e){return JSON.stringify([e.tenantId,e.workspaceId,e.environmentId])}export{c as InMemoryConnectDecisionReader,l as InMemoryControlPlaneWorkOrderAdapter};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{compileRuntimePlan as Le,detectDrift as $e,RuntimeExecutor as je,replayExecution as Fe,validateDesiredState as Ke,validateObservedState as Qe}from"@lssm-tech/lib.lssm-os-runtime";import{ConnectAuthorizationEnvelopeV1Schema as Me,verifyPlanAuthorization as He}from"@lssm-tech/lib.lssm-os-runtime";async function H(e,t,o,r){let i=await e.connectVerifier.verify({reference:o,plan:t,verifiedAt:e.clock.now()}),n=Me.parse(i);if(n.decisionId!==o.decisionId||n.attestationDigest!==o.attestationDigest||r!==void 0&&n.actorRef!==r)throw Error("Connect authority reference or actor mismatch.");let a=await e.state.getDesired(t),s=await e.state.getObserved(t);if(!a||!s)throw Error("Current state is unavailable.");let d=e.clock.now();if(!Number.isFinite(Date.parse(d)))throw Error("Trusted clock is invalid.");for(let c of[a,s])if(c.tenantId!==t.tenantId||c.workspaceId!==t.workspaceId||c.environmentId!==t.environmentId)throw Error("Current state scope mismatch.");let l=He(t,n,d,{desiredRevisionDigest:a.revision.digest,observedRevisionDigest:s.revision.digest});if(!l.allowed)throw Error(`Scheduling authorization failed: ${l.reason}.`)}class Ge{ports;executor;constructor(e){this.ports=e;this.executor=new je(e)}validate(e){return[...Ke(e.desired),...Qe(e.observed)]}async plan(e){let t=Le(e);return await this.ports.state.putDesired(e.desired),await this.ports.state.putObserved(e.observed),await this.ports.plans.put(t),t}async authorize(e){let t=await this.requirePlan(e.planId,e.scope),o=await this.ports.connect.authorize({plan:t,actorRef:e.actorRef,requestedAt:e.requestedAt});return await H(this.ports,t,o,e.actorRef),o}async apply(e){let t=await this.requirePlan(e.planId,e.scope);if(t.digest!==e.planDigest)throw Error("Requested plan digest is stale.");let o=await this.ports.state.getDesired(e.scope),r=await this.ports.state.getObserved(e.scope);if(!o||!r)throw Error("Desired or observed state is unavailable.");return this.executor.execute({plan:t,authorizationRef:e.authorizationRef,desired:o,observed:r,executionId:e.executionId,idempotencyKey:e.idempotencyKey,holderId:e.holderId,leaseTtlMs:e.leaseTtlMs})}async schedule(e){let t=await this.requirePlan(e.plan.id,e.plan);if(t.digest!==e.plan.digest)throw Error("Cannot schedule a stale plan.");await H(this.ports,t,e.authorizationRef);let o={contractVersion:"1.0.0",id:e.id,planId:t.id,planDigest:t.digest,authorizationRef:e.authorizationRef,executionId:e.executionId,idempotencyKey:e.idempotencyKey,tenantId:t.tenantId,workspaceId:t.workspaceId,environmentId:t.environmentId,status:"queued",attempts:0,maxAttempts:e.maxAttempts??3,queuedAt:e.queuedAt};return await this.ports.workOrders.enqueue(o),o}async status(e,t){return this.ports.executions.get(e,t)}async drift(e){let t=await this.ports.state.getDesired(e),o=await this.ports.state.getObserved(e);if(!t||!o)throw Error("Desired or observed state is unavailable.");return $e(t,o)}async replay(e,t){let o=await this.status(e,t);if(!o)throw Error("Execution not found.");let r=await this.requirePlan(o.planId,e);return Fe(r,o,await this.ports.receipts.list(e,t),this.ports.provider)}async requirePlan(e,t){let o=await this.ports.plans.get(t,e);if(!o)throw Error("Resource not found.");return o}}import{digestCanonical as I}from"@lssm-tech/lib.lssm-os-runtime";import{DurableQueueEnvelopeV2Schema as Xe,digestDurableQueueEnvelopeV2 as et}from"@lssm-tech/lib.contracts-spec/jobs/durable-queue-v2";import{digestCanonical as X}from"@lssm-tech/lib.lssm-os-runtime";import{validateLssmOsOperationReceiptV1 as Ze,validateLssmOsOperationRecordV1 as Ye}from"@lssm-tech/lib.lssm-os-runtime/runtime-node";async function b(e,t){let o=(l,c)=>({workspaceId:e.workspaceId,planRef:e.planRef,status:l,availableActions:["status"],reasonCodes:c,operationRef:{id:e.operation.operationId,digest:e.operation.requestDigest}}),r=await t.get(e.operation);if(!r)return o("unavailable",["candidate_operation_missing"]);let i=Ye(r);if(i.tenantId!==e.operation.tenantId||i.workspaceId!==e.operation.workspaceId||i.environmentId!==e.operation.environmentId||i.operationId!==e.operation.operationId||i.requestDigest!==e.operation.requestDigest)throw Error("builder_candidate.operation_binding_mismatch");if(i.status==="accepted"||i.status==="authorizing")return o("review_required",["candidate_authorization_pending"]);if(["queued","running","indeterminate"].includes(i.status))return o(i.status,[]);let a=(await t.listReceipts(e.operation)).filter((l)=>{try{let c=Ze(l);return c.tenantId===i.tenantId&&c.workspaceId===i.workspaceId&&c.environmentId===i.environmentId&&c.operationId===i.operationId&&c.operationVersion===i.version&&c.status===i.status&&i.receiptDigests.includes(c.receiptDigest)}catch{return!1}}),s=await t.get(e.operation);if(!s||X(s)!==X(i))return o("indeterminate",["candidate_operation_changed_during_read"]);if(a.length!==1)return o("indeterminate",["candidate_terminal_receipt_unverified"]);let d=a[0];return{...o(i.status==="succeeded"?"succeeded":"failed",i.status==="cancelled"?["candidate_cancelled"]:[]),receiptRef:{id:d.receiptId,digest:d.receiptDigest}}}import{digestQueueAdmissionReceiptV1 as Je,QueueAdmissionReceiptV1Schema as Ue}from"@lssm-tech/lib.contracts-spec/jobs/durable-queue-v2";import{digestCanonical as C}from"@lssm-tech/lib.lssm-os-runtime";function O(e,t){if(e.status!=="ok"&&e.status!=="already_applied")return!1;let o=Ue.safeParse(e.value.value);if(!o.success)return!1;let r=o.data;return Je(r)===r.receiptDigest&&C(e.value.binding)===C(t.binding)&&e.value.queueId===t.queueId&&e.value.partitionId===t.partitionId&&r.status!=="indeterminate"&&r.capabilityProfileDigest===t.binding.capabilityProfileDigest&&r.topologyDigest===t.binding.topologyDigest&&r.topologyGeneration===t.binding.topologyGeneration&&r.dedupeKey===t.envelope.dedupeKey&&C(r.scope)===C(t.envelope.scope)&&r.envelopeRef.id===t.envelope.envelopeId&&r.envelopeRef.digest===t.envelope.envelopeDigest&&r.outboxRef.id===t.outboxRef.id&&r.outboxRef.digest===t.outboxRef.digest}async function ee(e,t){let{signal:o}=e,r=structuredClone(e.candidate),i=structuredClone(e.admission),n=Xe.parse(i.envelope),a=await t.orders.getStandardOrderForOperation(r.operation),s=(p)=>({workspaceId:r.workspaceId,planRef:r.planRef,status:"indeterminate",availableActions:["execute","status"],reasonCodes:[p]});if(!a)return s("candidate_issued_order_unavailable");let d=(p)=>p.tenantId===r.operation.tenantId&&p.workspaceId===r.operation.workspaceId&&p.environmentId===r.operation.environmentId;if(!d(a)||!d(n.scope)||!d(i.binding)||a.operationId!==r.operation.operationId||a.planDigest!==r.planRef.digest||n.envelopeDigest!==et(n)||n.operationRef.id!==r.operation.operationId||n.operationRef.digest!==r.operation.requestDigest||n.orderRef.id!==a.orderId||n.orderRef.digest!==a.workOrderDigest)throw Error("builder_candidate.admission_binding_mismatch");let l=()=>{let p=Date.parse(t.clock.now());return!o.aborted&&Number.isFinite(p)&&p>=Date.parse(a.issuedAt)&&p<Date.parse(a.expiresAt)&&p<Date.parse(n.expiresAt)};if(!l())return s("candidate_authority_expired_or_cancelled");let c=await t.operations.get(r.operation),m;if(!c)throw Error("builder_candidate.operation_missing");if(m=c,!m||m.requestDigest!==r.operation.requestDigest||!d(m))throw Error("builder_candidate.operation_binding_mismatch");if(!["accepted","authorizing","queued"].includes(m.status))return b(r,t.operations);if(!await t.connect.verifyAdmission({order:a,operation:structuredClone(m),verifiedAt:t.clock.now()})||!l())return s("candidate_dispatch_review_required");for(let[p,M]of[["accepted","authorizing"],["authorizing","queued"]]){if(m.status!==p)continue;if(!l())return s("candidate_authority_expired_or_cancelled");let T={...m,status:M,version:m.version+1,updatedAt:t.clock.now()};if(!await t.operations.transition({operation:T,expectedVersion:m.version,expectedStatus:p}))return s("candidate_operation_changed_during_admission");m=T}if(!l())return s("candidate_authority_expired_or_cancelled");let u=await t.queue.admit(i);if(!O(u,i))return s("candidate_queue_admission_unverified");return b(r,t.operations)}import{bindProviderStepExecutionV3 as tt,validateLssmOsOperationReceiptV1 as ot,verifyProviderStepReceiptV2 as rt}from"@lssm-tech/lib.lssm-os-runtime/runtime-node";async function L(e,t){let{candidate:o,state:r,signal:i}=e;if(r.status!=="succeeded")return r;let n=()=>({...r,status:"indeterminate",artifactRefs:void 0,reasonCodes:["candidate_retained_artifact_unverified"],availableActions:["status"]});if(i.aborted||!r.receiptRef)return n();let a=await t.orders.getStandardOrderForOperation(o.operation);if(!a||a.planDigest!==o.planRef.digest)return n();let s=await t.providerReceipts.getForStep({...o.operation,orderId:a.orderId,stepId:a.step.stepId,attemptId:a.attemptId});if(!s||s.status!=="succeeded"||!rt(tt(a),s))return n();let d=await t.operations.getReceipt({...o.operation,receiptId:r.receiptRef.id});if(!d)return n();let l=ot(d);if(l.receiptDigest!==r.receiptRef.digest||l.status!=="succeeded"||l.operationId!==o.operation.operationId||l.tenantId!==o.operation.tenantId||l.workspaceId!==o.operation.workspaceId||l.environmentId!==o.operation.environmentId||!l.evidenceRefs.includes(`provider:${s.attestationDigest.slice(7)}`))return n();let c=s.observedOutput?.headRevision,m=s.observedOutput?.patchHash;if(typeof c!=="string"||typeof m!=="string")return n();let u=await t.artifacts.resolve({workOrderId:a.orderId,baseRevision:e.baseRevision,headRevision:c,patchHash:m,signal:i});if(i.aborted||!u||!u.integrityVerified||u.workOrderId!==a.orderId||u.baseRevision!==e.baseRevision||u.headRevision!==c||u.patchHash!==m||!/^[a-zA-Z0-9_-]{1,128}$/.test(u.id)||!/^sha256:[a-f0-9]{64}$/.test(u.bundleHash))return n();return{...r,artifactRefs:[`builder-patch:${u.id}:${u.patchHash}`,`builder-bundle:${u.id}:${u.bundleHash}`]}}class te{options;constructor(e){this.options=e}prepare(e){return this.run("prepare",e)}approve(e){return this.run("approve",e)}execute(e){return this.run("execute",e)}status(e){return this.run("status",e)}async run(e,t){let{signal:o,...r}=t,i={...structuredClone(r),signal:o},n=(p)=>({workspaceId:i.workspace.id,planRef:i.planRef,status:"unavailable",availableActions:[],reasonCodes:[p]});if(i.signal.aborted)return n("candidate_request_cancelled");let a=await this.options.targets.resolve(i,e),s=a?structuredClone(a):void 0;if(!s)return n("candidate_host_profile_unavailable");if(!s.allowedActions.includes(e))return{...n("candidate_member_action_denied"),status:"denied"};let d=j(i,s),l=await this.options.operations.get(d.operation);if(!l&&e==="prepare")await this.revalidate(i,e,s),l=await this.options.operations.create(s.issuance.operation);if(!l)return{...n("candidate_prepare_required"),availableActions:s.allowedActions.filter((p)=>p==="prepare")};if(l.requestDigest!==d.operation.requestDigest)throw Error("builder_candidate.operation_binding_mismatch");if(e==="approve"&&l.status==="accepted"){let p=await this.options.connect.issueLifecycle({...s.issuance,operation:l});await this.revalidate(i,e,s),await this.options.authority.issueCanaryLifecycle(p)}let c=await this.options.orders.getStandardOrderForOperation(d.operation);if(e==="execute"){if(!c)return{...n("candidate_approval_required"),status:"review_required",availableActions:["approve","status"]};await this.revalidate(i,e,s);let p=await ee({candidate:d,admission:this.options.targets.admission(s,c),signal:i.signal},this.options);return L({candidate:d,state:p,baseRevision:s.issuance.request.scope.baseSha,signal:i.signal},this.options)}let m=await b(d,this.options.operations);if(m.status==="queued"&&c){let p=this.options.targets.admission(s,c),M=await this.options.queue.reconcile({binding:p.binding,queueId:p.queueId,partitionId:p.partitionId,envelopeId:p.envelope.envelopeId});if(!O(M,p))return{...m,status:"indeterminate",reasonCodes:["candidate_queue_admission_unverified"],availableActions:s.allowedActions.filter((T)=>T==="execute"||T==="status")}}if(m.status==="review_required"){if(!c)return{...m,availableActions:s.allowedActions.filter((p)=>p==="approve"||p==="status")};if(!await this.options.connect.verifyAdmission({order:c,operation:l,verifiedAt:this.options.clock.now()}))return{...m,status:"stale",availableActions:["status"],reasonCodes:["candidate_authority_not_current"]};return{...m,status:"approved",availableActions:s.allowedActions.filter((p)=>p==="execute"||p==="status")}}let u=await L({candidate:d,state:m,baseRevision:s.issuance.request.scope.baseSha,signal:i.signal},this.options);return await this.revalidate(i,e,s),u}async revalidate(e,t,o){if(e.signal.aborted)throw Error("builder_candidate.request_cancelled");let r=await this.options.targets.resolve(e,t);if(!r||!r.allowedActions.includes(t)||I(r.profileRef)!==I(o.profileRef)||I(r.issuance)!==I(o.issuance)||I(j(e,r))!==I(j(e,o)))throw Error("builder_candidate.host_profile_changed")}}function j(e,t){let{operation:o,standardOrderDraft:r,request:i}=t.issuance;if(o.tenantId!==e.actor.tenantId||o.tenantId!==e.workspace.tenantId||i.actorRef!==e.actor.principalId||r.operationId!==o.operationId||r.planId!==e.planRef.id||r.planDigest!==e.planRef.digest)throw Error("builder_candidate.host_target_mismatch");return{workspaceId:e.workspace.id,planRef:e.planRef,operation:{tenantId:o.tenantId,workspaceId:o.workspaceId,environmentId:o.environmentId,operationId:o.operationId,requestDigest:o.requestDigest}}}import{builderPlatformDigest as it,builderPlatformId as nt}from"@lssm-tech/lib.builder-runtime/planning";import{validatePlatformHandoffPacket as at}from"@lssm-tech/lib.builder-spec";import{digestCanonical as oe}from"@lssm-tech/lib.lssm-os-runtime";function er(e){let t=at(e.packet),o=e.packet.digest===e.expectedPacketDigest&&(e.packet.digest===st(e.packet)&&e.packet.id===nt("platform-handoff",lt(e.packet))||e.packet.digest===dt(e.packet)),r=!e.runtimePlan||e.packet.planPreview.planDigest===e.runtimePlan.digest,i=t.length>0?"rejected":o&&r?"accepted_for_review":"stale",n={packetId:e.packet.id,packetDigest:e.packet.digest,consumer:e.consumer,status:i},a={id:`handoff-receipt:${oe(n).slice(7,23)}`,packetRef:{id:e.packet.id,kind:"handoff",version:e.packet.version,digest:e.packet.digest},packetDigest:e.packet.digest,status:i,consumer:e.consumer,connectReviewRef:e.packet.authorityBoundary.connectReviewRef,evidenceRefs:e.evidenceRefs??[],receivedAt:e.receivedAt};return{packet:e.packet,receipt:a,...i==="accepted_for_review"&&e.runtimePlan?{acceptedPlanId:e.runtimePlan.id}:{}}}function st(e){let{id:t,digest:o,...r}=e;return it(r)}function dt(e){let{digest:t,...o}=e;return oe(o)}function lt(e){let{id:t,digest:o,...r}=e;return r}import{digestProviderBindingV2 as mt,verifyProviderStepReceiptV2 as ie}from"@lssm-tech/lib.lssm-os-runtime";import{QueueDigestRefV1Schema as ct}from"@lssm-tech/lib.contracts-spec/jobs/durable-queue-v2";import{digestCanonical as pt,validateProviderStepExecutionV2 as ut}from"@lssm-tech/lib.lssm-os-runtime";async function re(e,t,o){if(e=structuredClone(e),ut(e),e.action!=="apply")throw Error("builder.runtime.unsupported_action");let r=await t.loadApprovedInput(e.payloadDigest);if(!r||pt(r)!==e.payloadDigest)throw Error("builder.runtime.payload_mismatch");let i=structuredClone(r.input),n=r.builderPlanRef===void 0?i.authority.deliveryPlanRef:ct.parse(r.builderPlanRef);if(i.workOrderId!==e.orderId||i.authority.scope.tenantRef!==e.tenantId||r.scope.workspaceId!==e.workspaceId||r.scope.tenantId!==e.tenantId||r.scope.environmentId!==e.environmentId||i.authority.scope.environmentRef!==e.environmentId||n.digest!==e.planDigest)throw Error("builder.runtime.scope_mismatch");return t.withActiveClaim(e,()=>o(i))}function gt(e,t){if(mt(e)!==e.bindingDigest)throw Error("builder.runtime.invalid_binding");let o=structuredClone(e);return{binding:o,async execute(r){let i=structuredClone(r);if(i.providerBindingDigest!==o.bindingDigest)throw Error("builder.runtime.binding_mismatch");return re(i,t,async(n)=>{let a=await t.findPersistedResult(i);if(a){if(!ie(i,a)||!await t.verifyPersistedReceipt(a))throw Error("builder.runtime.receipt_unconfirmed");return a}let s=await t.runPatch(n),d=await t.persistResult(i,s);if(!ie(i,d)||!d.evidenceRefs.includes(s.receipt.id)||d.observedOutput?.patchHash!==s.receipt.patchHash||d.observedOutput?.headRevision!==s.receipt.headRevision||!await t.verifyPersistedReceipt(d))throw Error("builder.runtime.receipt_unconfirmed");return d})},async compensate(){throw Error("builder.runtime.compensation_not_qualified")},async observe(){throw Error("builder.runtime.observation_not_qualified")},verifyReceipt:(r)=>t.verifyPersistedReceipt(r)}}import{digestCanonical as S,digestProviderStepReceiptV2 as yt,validateProviderStepReceiptV2 as ne,verifyProviderStepReceiptV2 as ft}from"@lssm-tech/lib.lssm-os-runtime";function vt(e,t){let o=async(r)=>{ne(r);let i=await e.getById({tenantId:r.tenantId,workspaceId:r.workspaceId,environmentId:r.environmentId,receiptId:r.receiptId});return!!i&&S(i)===S(r)};return{findPersistedResult:(r)=>e.getForStep({tenantId:r.tenantId,workspaceId:r.workspaceId,environmentId:r.environmentId,orderId:r.orderId,stepId:r.stepId,attemptId:r.attemptId}),verifyPersistedReceipt:o,async persistResult(r,i){let n=await e.getForStep({tenantId:r.tenantId,workspaceId:r.workspaceId,environmentId:r.environmentId,orderId:r.orderId,stepId:r.stepId,attemptId:r.attemptId});if(n){if(!ft(r,n)||n.observedOutput?.patchHash!==i.receipt.patchHash||n.observedOutput?.headRevision!==i.receipt.headRevision||!n.evidenceRefs.includes(i.receipt.id))throw Error("builder.runtime.receipt_replay_conflict");return n}let a=ae(r,t(),i);ne(a);let s=await e.append(a);if(s.status==="rejected"||S(s.receipt)!==S(a)||!await o(a))throw Error("builder.runtime.receipt_persistence_unconfirmed");return a}}}function ae(e,t,o){let r={contractVersion:"2.0.0",tenantId:e.tenantId,workspaceId:e.workspaceId,environmentId:e.environmentId,receiptId:`builder:${S({order:e.orderId,step:e.stepId,attempt:e.attemptId}).slice(7)}`,orderId:e.orderId,workOrderDigest:e.workOrderDigest,claimId:e.claimId,claimDigest:e.claimDigest,nodeId:e.nodeId,providerId:e.providerId,adapterId:e.adapterId,adapterVersion:e.adapterVersion,adapterDigest:e.adapterDigest,profileId:e.profileId,profileDigest:e.profileDigest,providerBindingDigest:e.providerBindingDigest,environmentDigest:e.environmentDigest,sourceDigest:e.sourceDigest,qualificationBindingDigest:e.qualificationBindingDigest,planDigest:e.planDigest,authorizationDigest:e.authorizationDigest,stepId:e.stepId,action:e.action,effectDigest:e.effectDigest,leaseId:e.leaseId,fencingToken:e.fencingToken,attemptId:e.attemptId,status:o.receipt.riskDecision.reasonCodes.includes("required_check_failed")?"failed":"succeeded",evidenceRefs:[o.receipt.id,...o.receipt.checkReceiptRefs],externalRefs:[],observedOutput:{patchHash:o.receipt.patchHash,headRevision:o.receipt.headRevision},recordedAt:t};return{...r,attestationDigest:yt({...r,attestationDigest:e.effectDigest})}}import{digestConnectAuthorization as ht}from"@lssm-tech/lib.lssm-os-runtime";class Vt{decisions;constructor(e){this.decisions=e}async authorize(e){let t=this.decisions.find((o)=>o.planId===e.plan.id&&o.planDigest===e.plan.digest&&o.actorRef===e.actorRef);if(!t)throw Error("No exact Connect decision is available.");return{decisionId:t.decisionId,attestationDigest:t.attestationDigest}}async verify(e){let t=this.decisions.find((o)=>o.decisionId===e.reference.decisionId&&o.attestationDigest===e.reference.attestationDigest&&o.planId===e.plan.id&&o.planDigest===e.plan.digest);if(!t||ht(t)!==t.attestationDigest)return;return t}}class Rt{records=new Map;tokens=new Map;admissions=new Map;async enqueue(e){let t=`${k(e)}/${e.id}`,o=JSON.stringify([e.contractVersion,e.planId,e.planDigest,e.authorizationRef.decisionId,e.authorizationRef.attestationDigest,e.executionId,e.idempotencyKey,e.maxAttempts]);if(this.admissions.has(t)){if(this.admissions.get(t)!==o)throw Error("Conflicting work-order admission.");return}if(e.status!=="queued"||e.attempts!==0||e.lease||!Number.isSafeInteger(e.maxAttempts)||e.maxAttempts<1)throw Error("Invalid initial work-order state.");this.admissions.set(t,o),this.records.set(t,structuredClone(e))}async claim(e){let t=[...this.records.values()].filter((n)=>It(n,e.scope)&&n.attempts<n.maxAttempts).filter((n)=>n.status==="queued"||n.status==="retry_wait"&&Date.parse(n.nextAttemptAt??e.now)<=Date.parse(e.now)||n.status==="leased"&&Date.parse(n.lease?.expiresAt??e.now)<=Date.parse(e.now)).sort((n,a)=>n.id<a.id?-1:n.id>a.id?1:0)[0];if(!t)return;let o=`${k(t)}/${t.id}`,r=(this.tokens.get(o)??0)+1,i={...t,status:"leased",attempts:t.attempts+1,lease:{holderId:e.holderId,fencingToken:r,expiresAt:new Date(Date.parse(e.now)+e.ttlMs).toISOString()}};return this.tokens.set(o,r),this.records.set(o,i),{workOrder:structuredClone(i),holderId:e.holderId,fencingToken:r}}async complete(e){let t=`${k(e.scope)}/${e.workOrderId}`,o=this.records.get(t);if(o?.status!=="leased"||!o.lease||o.lease.holderId!==e.holderId||o.lease.fencingToken!==e.fencingToken)throw Error("Work-order claim was superseded.");let r={...o,status:e.executionStatus==="succeeded"?"completed":e.executionStatus==="indeterminate"?"indeterminate":"failed",executionStatus:e.executionStatus};return this.records.set(t,r),structuredClone(r)}async retry(e){let t=`${k(e.scope)}/${e.workOrderId}`,o=this.records.get(t);if(o?.status!=="leased"||!o.lease||o.lease.holderId!==e.holderId||o.lease.fencingToken!==e.fencingToken)throw Error("Work-order claim was superseded.");let{lease:r,...i}=o,n={...i,status:"retry_wait",nextAttemptAt:e.nextAttemptAt};return this.records.set(t,n),structuredClone(n)}async get(e,t){let o=this.records.get(`${k(e)}/${t}`);return o?structuredClone(o):void 0}}function It(e,t){return e.tenantId===t.tenantId&&e.workspaceId===t.workspaceId&&e.environmentId===t.environmentId}function k(e){return JSON.stringify([e.tenantId,e.workspaceId,e.environmentId])}import{defineFeature as Pt}from"@lssm-tech/lib.contracts-spec/features";var mr=Pt({meta:{key:"modules.lssm-os-control-plane",version:"1.0.0",title:"LSSM OS control plane",description:"Tenant-safe planning, Connect coordination, scheduling, execution, drift, and replay application services.",domain:"lssm-os",owners:["@contractspec-core"],tags:["package","module","control-plane","governance"],stability:"experimental"}}),gr={id:"modules.lssm-os-control-plane.feature",title:"LSSM OS control-plane application services",body:["Coordinates tenant-safe planning, exact-digest Connect review, scheduling, apply, drift, status, and replay.","Builder packets remain plan-only and are accepted only at the exact reviewed packet and runtime-plan digests.","Connect remains the trust kernel; the module only consumes decisions supplied by an injected authority port."].join(" "),kind:"reference",route:"/modules/lssm-os-control-plane",visibility:"public",version:"1.0.0",owners:["@contractspec-core"],relatedSpecs:["lssm-os.control-plane.*@1.0.0"]};import{bindProviderStepExecutionV2 as xt,executeProviderStepV2 as At}from"@lssm-tech/lib.lssm-os-runtime";import{canonicalize as se,createRuntimeWorkOrderCompletionV2 as Tt}from"@lssm-tech/lib.lssm-os-runtime";function x(e){return{tenantId:e.tenantId,workspaceId:e.workspaceId,environmentId:e.environmentId,orderId:e.orderId}}function P(e,t){return{status:"rejected",phase:e,reason:t}}function g(e,t,o){return{status:"indeterminate",phase:e,reason:t,claim:o}}function bt(e){let t=e.receipts.at(-1);if(!t)throw Error("Completion requires durable receipts.");let o=e.receipts.every((r)=>r.status==="succeeded")?"succeeded":t.status;return Tt({contractVersion:"2.0.0",tenantId:e.order.tenantId,workspaceId:e.order.workspaceId,environmentId:e.order.environmentId,completionId:e.completionId,orderId:e.order.orderId,workOrderDigest:e.order.workOrderDigest,claimId:e.claim.claimId,claimDigest:e.claim.claimDigest,nodeId:e.claim.nodeId,providerBindingDigest:e.claim.providerBindingDigest,leaseId:e.claim.leaseId,fencingToken:e.claim.fencingToken,attemptId:e.claim.attemptId,status:o,receiptDigests:e.receipts.map((r)=>r.attestationDigest),evidenceRefs:[...new Set(e.receipts.flatMap((r)=>r.evidenceRefs))].sort(),completedAt:e.completedAt})}function St(e,t){return se(e)===se(t)}async function de(e){let t;try{t=bt(e)}catch{return g("completion","completion_invalid",e.claim)}let o=await e.deadline.call(()=>e.workOrders.complete({completion:t,expectedClaimDigest:e.claim.claimDigest,expectedFencingToken:e.claim.fencingToken}));if(o.status==="ok"&&o.value)return{status:"completed",completion:t};let r=await e.deadline.call(()=>e.workOrders.getCompletion(x(e.order)));if(r.status==="ok"&&r.value&&St(r.value,t))return{status:"completed",completion:r.value};return g("completion","completion_unconfirmed",e.claim)}class F{scheduler;#e;#t;constructor(e,t){this.scheduler=e;if(!Number.isFinite(t)||t<=0)throw Error("Runtime Node worker timeout must be positive.");let o=e.now();if(!Number.isFinite(o))throw Error("Runtime Node worker scheduler time must be finite.");this.#t=o,this.#e=o+t}async call(e){let t;try{t=this.scheduler.now()}catch{return{status:"failed"}}if(!Number.isFinite(t)||t<this.#t)return{status:"failed"};this.#t=t;let o=this.#e-t;if(o<=0)return{status:"timeout"};return new Promise((r)=>{let i=!1,n,a;try{if(n=this.scheduler.schedule(o,()=>{if(i)return;i=!0,r({status:"timeout"})}),i)return;a=e(),Promise.prototype.then.call(a,(d)=>s({status:"ok",value:d}),()=>s({status:"failed"}))}catch{s({status:"failed"})}function s(d){if(i)return;i=!0;try{n?.cancel()}catch{}r(d)}})}}var le={now:()=>performance.now(),schedule(e,t){let o=setTimeout(t,e);return{cancel:()=>clearTimeout(o)}}};import{validateProviderStepReceiptV2 as kt}from"@lssm-tech/lib.lssm-os-runtime";function K(e){let t=[...e.order.steps].sort((i,n)=>i.sequence-n.sequence),o=e.receipts.map((i)=>kt(i)),r=Number.NEGATIVE_INFINITY;for(let[i,n]of o.entries()){let a=t[i];if(!a||!wt(n,e.order,a))throw Error("Durable receipt prefix is not authorized.");if(i<o.length-1&&n.status!=="succeeded")throw Error("Durable receipt prefix continues after a terminal step.");let s=Date.parse(n.recordedAt);if(s<r)throw Error("Durable receipt chronology is invalid.");r=s}return o}function wt(e,t,o){let r=t.providerBinding;return Dt(e,t)&&e.orderId===t.orderId&&e.workOrderDigest===t.workOrderDigest&&e.nodeId===t.nodeId&&e.providerId===r.providerId&&e.adapterId===r.adapterId&&e.adapterVersion===r.adapterVersion&&e.adapterDigest===r.adapterDigest&&e.profileId===r.profileId&&e.profileDigest===r.profileDigest&&e.providerBindingDigest===r.bindingDigest&&e.environmentDigest===r.environmentDigest&&e.sourceDigest===r.sourceDigest&&e.qualificationBindingDigest===r.qualificationBindingDigest&&e.planDigest===o.planDigest&&e.authorizationDigest===o.authorizationDigest&&e.stepId===o.stepId&&e.action===o.action&&e.effectDigest===o.effectDigest}function Dt(e,t){return e.tenantId===t.tenantId&&e.workspaceId===t.workspaceId&&e.environmentId===t.environmentId}import{canonicalize as A,RuntimeTimestampSchema as _t,validateRuntimeNodeEligibilityDecisionV1 as Ct,validateSignedRuntimeWorkOrderV2 as ce}from"@lssm-tech/lib.lssm-os-runtime";function pe(e){if(e.completionId.length===0)throw Error("Missing completion id.");let t=ce(e.order),o=Ct(e.eligibilityDecision);if(o.orderId!==t.orderId||o.workOrderDigest!==t.workOrderDigest||o.nodeId!==t.nodeId||o.providerBindingDigest!==t.providerBinding.bindingDigest||!Ot(o,t))throw Error("Eligibility decision binding mismatch.");return t}function ue(e){return _t.parse(e)}function me(e){if(!e.result||e.result.revoked)return!1;let t;try{t=ce(e.result.order)}catch{return!1}return A(t)===A(e.order)&&Date.parse(t.issuedAt)<=Date.parse(e.now)&&Date.parse(t.expiresAt)>Date.parse(e.now)}function ge(e,t){return A(e)===A(t)}function Ot(e,t){return e.tenantId===t.tenantId&&e.workspaceId===t.workspaceId&&e.environmentId===t.environmentId}class Bt{dependencies;#e;constructor(e,t){this.dependencies=e;if(!Number.isFinite(t.operationTimeoutMs)||t.operationTimeoutMs<=0)throw Error("Runtime Node worker timeout must be positive.");this.#e=t.operationTimeoutMs}async run(e){let t;try{t=pe(e)}catch{return P("input","invalid_work_order")}let o;try{o=new F(this.dependencies.scheduler??le,this.#e)}catch{return g("state","scheduler_unavailable")}let r=this.readClock();if(!r)return P("connect","invalid_trusted_clock");let i=await o.call(()=>this.dependencies.connectVerifier.verify({order:structuredClone(t),verifiedAt:r}));if(i.status==="timeout")return g("connect","verification_timeout");if(i.status==="failed")return P("connect","verification_failed");let n=this.readClock();if(!n||Date.parse(n)<Date.parse(r)||!me({order:t,result:i.value,now:n}))return P("connect","work_order_untrusted");if((await o.call(()=>this.dependencies.workOrders.putIssued(t))).status!=="ok")return g("state","issue_unconfirmed");let s=await o.call(()=>this.dependencies.workOrders.claim(e));if(s.status!=="ok")return g("claim","claim_unconfirmed");if(s.value.status==="completed")return{status:"completed",completion:s.value.completion};if(s.value.status==="rejected")return P("claim","claim_rejected");let d=s.value.claim;return this.executeClaim({deadline:o,order:t,claim:d,request:e,receiptOnly:s.value.status==="already_claimed"||d.previousClaimDigest!==void 0||d.fencingToken>1})}async executeClaim(e){let t=x(e.order),o=await e.deadline.call(()=>this.dependencies.receipts.list(t));if(o.status!=="ok")return g("receipt","receipt_state_unavailable",e.claim);let r;try{r=K({order:e.order,receipts:o.value})}catch{return g("receipt","receipt_state_untrusted",e.claim)}let i=[...e.order.steps].sort((a,s)=>a.sequence-s.sequence);while(r.length<i.length&&r.every((a)=>a.status==="succeeded")){if(e.receiptOnly)return g("claim",e.claim.previousClaimDigest!==void 0||e.claim.fencingToken>1?"prior_claim_requires_reconciliation":"active_claim_requires_reconciliation",e.claim);let a=i[r.length];if(!a)break;let s=await e.deadline.call(()=>this.dependencies.workOrders.getClaim(t));if(s.status!=="ok"||!s.value||!ge(s.value,e.claim))return g("lease","claim_authority_lost",e.claim);let d=this.readClock();if(!d||Date.parse(e.order.expiresAt)<=Date.parse(d))return g("lease","work_order_expired",e.claim);let l;try{l=xt({order:e.order,claim:e.claim,stepId:a.stepId,now:d})}catch{return g("lease","claim_authority_invalid",e.claim)}let c=await e.deadline.call(()=>At({execution:l,router:this.dependencies.router}));if(c.status!=="ok")return g("provider","provider_outcome_unresolved",e.claim);if((await e.deadline.call(()=>this.dependencies.receipts.append(c.value))).status!=="ok")return g("receipt","receipt_append_unconfirmed",e.claim);let u=await e.deadline.call(()=>this.dependencies.receipts.list(t));if(u.status!=="ok")return g("receipt","receipt_append_unconfirmed",e.claim);try{r=K({order:e.order,receipts:u.value})}catch{return g("receipt","receipt_state_untrusted",e.claim)}if(!r.some((p)=>p.stepId===c.value.stepId&&p.attestationDigest===c.value.attestationDigest))return g("receipt","receipt_append_unconfirmed",e.claim)}let n=this.readClock();if(!n)return g("completion","invalid_trusted_clock",e.claim);return de({deadline:e.deadline,workOrders:this.dependencies.workOrders,order:e.order,claim:e.claim,receipts:r,completionId:e.request.completionId,completedAt:n})}readClock(){try{return ue(this.dependencies.clock.now())}catch{return}}}import{executeAuthorizedTopologyStepV1 as Po}from"@lssm-tech/lib.lssm-os-runtime/runtime-node/scalability";import{verifyAuthorizedTopologyIntentV1 as Wt}from"@lssm-tech/lib.lssm-os-runtime/runtime-node/scalability";import{digestTopologyTransitionReceiptV1 as Et,TopologyTransitionReceiptV1Schema as zt}from"@lssm-tech/lib.lssm-os-spec/runtime-topology";async function ye(e,t,o){let r=await Wt(e,t);if(r.status!=="ok")return r;let i;try{i=e.clock.now()}catch{return{status:"conflict",code:"topology.invalid_clock",evidenceRefs:[]}}let n=[{id:t.order.orderId,digest:t.order.workOrderDigest},{id:t.plan.authorityRef,digest:t.plan.authorizationDigest}].sort((l,c)=>l.id<c.id?-1:l.id>c.id?1:0),a=zt.safeParse({contractVersion:"1.0.0",scope:t.plan.scope,receiptId:`authorized-${t.plan.planId}`,planDigest:t.plan.planDigest,operationId:t.plan.operationId,claimId:t.plan.claimId,attemptId:t.plan.attemptId,fencingToken:t.plan.fencingToken,sourceTopologyDigest:t.plan.sourceTopologyDigest,targetTopologyDigest:t.plan.targetTopologyDigest,state:"authorized",completedStepIds:o.completedStepIds,evidenceRefs:n,recordedAt:i,receiptDigest:t.plan.planDigest});if(!a.success)return{status:"conflict",code:"topology.invalid_authorization_evidence",evidenceRefs:[]};let s=a.data;return{status:"ok",value:{...s,receiptDigest:Et(s)}}}function fe(e,t,o){let r=t.steps.filter((i)=>i.action!=="rollback"&&i.action!=="decommission");return r.at(-1)?.stepId===o&&r.slice(0,-1).every((i)=>e.completedStepIds.includes(i.stepId))}var ve={observed:["proposed","rejected","blocked"],proposed:["simulated","rejected","blocked"],simulated:["authorized","rejected","blocked"],authorized:["provisioning","blocked"],provisioning:["shadowing","rolling_back","indeterminate","manual_custody"],shadowing:["canary","rolling_back","indeterminate","manual_custody"],canary:["active","rolling_back","indeterminate","manual_custody"],active:["stabilizing","rolling_back","indeterminate","manual_custody"],stabilizing:["verified","rolling_back","indeterminate","manual_custody"],rolling_back:["rolled_back","indeterminate","manual_custody"],indeterminate:["rolling_back","manual_custody"],rejected:[],blocked:[],verified:[],rolled_back:[],manual_custody:[]};function B(e,t){if(!ve[e.state].includes(t.state))return!1;return e.completedStepIds.length===t.completedStepIds.length&&e.completedStepIds.every((o,r)=>t.completedStepIds[r]===o)}function W(e,t,o,r){let i=fe(e,o,r);if(!ve[e.state].includes(t.state)&&!(i&&["shadowing","canary","active","stabilizing"].includes(e.state)&&t.state==="verified"))return!1;if(e.completedStepIds.some((a,s)=>t.completedStepIds[s]!==a))return!1;let n=new Set(o.steps.map((a)=>a.stepId));return t.completedStepIds.length===e.completedStepIds.length+1&&t.completedStepIds.at(-1)===r&&new Set(t.completedStepIds).size===t.completedStepIds.length&&t.completedStepIds.every((a)=>n.has(a))&&!e.completedStepIds.includes(r)}function E(e,t,o){if(!["authorized","provisioning","shadowing","canary","active","stabilizing","rolling_back"].includes(e.state))return!1;return!e.completedStepIds.includes(t)&&o.every((r)=>e.completedStepIds.includes(r))}import{isScalabilityPortResultV1 as Zt,parseBoundScalabilityValueV1 as Yt}from"@lssm-tech/lib.lssm-os-runtime/runtime-node/scalability";import{TopologyTransitionReceiptV1Schema as Jt}from"@lssm-tech/lib.lssm-os-spec/runtime-topology";import{hasValidScaleDecisionV1Digest as qt,hasValidScalePolicyV1Digest as Nt,hasValidTopologyTransitionPlanV1Digest as Mt,hasValidTopologyTransitionReceiptV1Digest as Ht,ScaleDecisionV1Schema as Lt,ScalePolicyV1Schema as $t,TopologyTransitionPlanV1Schema as jt,TopologyTransitionReceiptV1Schema as Ft,validateScalePolicyV1 as Kt,validateTopologyTransitionPlanV1 as Qt}from"@lssm-tech/lib.lssm-os-spec/runtime-topology";function he(e,t){let o=$t.safeParse(e);return Boolean(o.success&&Nt(o.data)&&Kt(o.data).length===0&&z(o.data.scope,t)&&o.data.sourceTopologyDigest===t.topologyDigest)}function Ve(e,t,o,r,i,n){let a=Lt.safeParse(e),s=Date.parse(n);return Boolean(a.success&&qt(a.data)&&z(a.data.scope,t)&&a.data.sourceTopologyDigest===t.topologyDigest&&a.data.policyDigest===o.policyDigest&&a.data.observationDigests.length===1&&a.data.observationDigests[0]===i&&Gt(a.data,o,r)&&Number.isFinite(s)&&Date.parse(a.data.decidedAt)<=s&&s<Date.parse(a.data.expiresAt))}function f(e,t){let o=jt.safeParse(e);return Boolean(o.success&&Mt(o.data)&&Qt(o.data).length===0&&z(o.data.scope,t)&&o.data.sourceTopologyDigest===t.topologyDigest)}function Gt(e,t,o){let r=e.targetReplicas-o.runtimeNodeReplicas,i=["scale_in","remove_cache","remove_broker"].includes(e.action),n=["scale_out","add_cache","add_broker"].includes(e.action),a=e.action!=="no_change";return e.estimatedDailyCostEurMicros<=t.dailyCostCeilingEurMicros&&e.targetReplicas>=t.minimumReplicas&&e.targetReplicas<=t.maximumReplicas&&e.targetReplicas<=t.providerQuotaCeiling&&e.targetReplicas<=t.tenantConcurrencyCeiling&&Math.abs(r)<=t.maximumStep&&(e.action!=="scale_out"||r>0)&&(e.action!=="scale_in"||r<0)&&(e.action!=="no_change"||r===0)&&(t.freezeMode==="unfrozen"||!n)&&(t.freezeMode!=="all_frozen"||!a)&&(t.automaticMode==="bidirectional"||!i)&&(t.automaticMode!=="disabled"||!a)&&(!a||t.reversibleTransitionDigests.includes(e.targetTopologyDigest))}function v(e,t,o){let r=Ft.safeParse(e);return Boolean(r.success&&Ht(r.data)&&z(r.data.scope,t)&&r.data.planDigest===o.planDigest&&r.data.operationId===o.operationId&&r.data.claimId===o.claimId&&r.data.attemptId===o.attemptId&&r.data.fencingToken===o.fencingToken&&r.data.sourceTopologyDigest===o.sourceTopologyDigest&&r.data.targetTopologyDigest===o.targetTopologyDigest)}function z(e,t){return e.tenantId===t.tenantId&&e.workspaceId===t.workspaceId&&e.environmentId===t.environmentId&&e.productId===t.productId&&e.applicationId===t.applicationId}async function y(e,t,o,r){let i;try{let n=await Promise.race([Promise.resolve().then(e),new Promise((s)=>{i=setTimeout(()=>s(void 0),t)})]);if(!Zt(n))return Q("invalid_result");if(n.status!=="ok"&&n.status!=="already_applied")return n;let a=Yt(n.value,o,(s)=>{let d=Jt.safeParse(s);return d.success&&v(d.data,o,r)?d.data:void 0});if(!a)return Q("invalid_result");return Re({status:n.status,value:a})}catch{return Q("dependency_failure")}finally{if(i)clearTimeout(i)}}var V=(e,t,o,r)=>y(()=>e.getTransition({...o,planDigest:r.planDigest}),t,o,r),Q=(e)=>({status:"unavailable",code:e,evidenceRefs:[]});function Re(e){if(e&&typeof e==="object"&&!Object.isFrozen(e)){for(let t of Object.values(e))Re(t);Object.freeze(e)}return e}async function w(e,t){if(!f(t.plan,t.binding)||t.receipt.state!=="observed"||!v(t.receipt,t.binding,t.plan))return G("topology.invalid_observation");return y(()=>e.topologyState.recordObservedTransition({...t.binding,receipt:t.receipt}),e.timeoutMs,t.binding,t.plan)}async function Ie(e,t){if(!f(t.plan,t.binding)||!v(t.receipt,t.binding,t.plan)||!["proposed","simulated"].includes(t.receipt.state))return G("topology.invalid_transition");let o=await V(e.topologyState,e.timeoutMs,t.binding,t.plan);if(o.status!=="ok"&&o.status!=="already_applied")return o;if(o.value.value.state!==t.expectedState||!B(o.value.value,t.receipt))return G("topology.state_conflict");return y(()=>e.topologyState.compareAndSetTransition({...t.binding,expectedState:t.expectedState,receipt:t.receipt}),e.timeoutMs,t.binding,t.plan)}var G=(e)=>({status:"conflict",code:e,evidenceRefs:[]});async function D(e,t,o){let r;try{return await Promise.race([Ut(e,t,o),new Promise((i)=>{r=setTimeout(()=>i(!1),e.timeoutMs)})])}catch{return!1}finally{if(r)clearTimeout(r)}}async function Ut(e,t,o){let r=await e.operations.get({tenantId:t.binding.tenantId,workspaceId:t.binding.workspaceId,environmentId:t.binding.environmentId,operationId:t.plan.operationId});if(!r||!Xt(r,t))return!1;if(r.status==="indeterminate")return r.recoveryRef===o;if(r.status!=="running")return!1;let i=e.clock.now();return e.operations.transition({operation:{...r,status:"indeterminate",version:r.version+1,updatedAt:i,recoveryRef:o},expectedVersion:r.version,expectedStatus:"running",expectedAttemptId:t.plan.attemptId,expectedClaimId:t.plan.claimId,expectedFencingToken:t.plan.fencingToken})}function Xt(e,t){return e.attemptId===t.plan.attemptId&&e.claimId===t.plan.claimId&&e.fencingToken===t.plan.fencingToken}var eo=new Set(["rejected","blocked","indeterminate","manual_custody"]);async function Pe(e,t,o){if(!eo.has(t.receipt.state)||!B(o,t.receipt))return;let r;try{r=e.clock.now()}catch{return}let i;try{let n=await Promise.race([Promise.resolve().then(()=>e.dispositionVerifier.verify({current:o,candidate:t.receipt,plan:t.plan,verifiedAt:r})),new Promise((a)=>{i=setTimeout(()=>a(void 0),e.timeoutMs)})]);if(!n||n.receiptDigest!==t.receipt.receiptDigest)return;return v(n,t.binding,t.plan)&&n.state===t.receipt.state?structuredClone(n):void 0}catch{return}finally{if(i)clearTimeout(i)}}import{validateRuntimeTopologyProfileV1 as ke,validateTopologyTransitionPlanV1 as to}from"@lssm-tech/lib.lssm-os-spec/runtime-topology";function Te(e,t,o){if(["promote_state_backend","demote_state_backend"].includes(o))return e.authorityStoreComponentId!==t.authorityStoreComponentId&&e.queueComponentId!==t.queueComponentId&&e.cacheComponentId===t.cacheComponentId;if(o==="add_cache")return!e.cacheComponentId&&Boolean(t.cacheComponentId)&&e.queueComponentId===t.queueComponentId;if(o==="remove_cache")return Boolean(e.cacheComponentId)&&!t.cacheComponentId&&e.queueComponentId===t.queueComponentId;if(["add_broker","remove_broker"].includes(o))return e.queueComponentId!==t.queueComponentId&&e.cacheComponentId===t.cacheComponentId;return!0}function be(e,t,o){let r=e.components.find((n)=>n.componentId===e.authorityStoreComponentId),i=t.components.find((n)=>n.componentId===t.authorityStoreComponentId);if(!r||!i)return!1;if(["promote_state_backend","demote_state_backend"].includes(o))return r.profileDigest!==i.profileDigest;return r.profileDigest===i.profileDigest}function Se(e,t,o){let r=(i)=>Object.values(i.scope).join("\x00");return r(e)===r(t)&&r(e)===r(o)}var oo=new Map([["t0_embedded>t1_database_only","promote_state_backend"],["t1_database_only>t0_embedded","demote_state_backend"],["t1_database_only>t2_cache_accelerated","add_cache"],["t2_cache_accelerated>t1_database_only","remove_cache"],["t1_database_only>t3_broker_backed","add_broker"],["t2_cache_accelerated>t3_broker_backed","add_broker"],["t3_broker_backed>t1_database_only","remove_broker"],["t3_broker_backed>t2_cache_accelerated","remove_broker"]]);function Z(e){let t=[...ke(e.source).map((o)=>`source.${o}`),...ke(e.target).map((o)=>`target.${o}`),...to(e.plan)];if(e.plan.sourceTopologyDigest!==e.source.profileDigest)t.push("recipe.source_digest");if(e.plan.targetTopologyDigest!==e.target.profileDigest)t.push("recipe.target_digest");if(!Se(e.source,e.target,e.plan))t.push("recipe.scope");if(!be(e.source,e.target,e.plan.transitionClass))t.push("recipe.authority_changed");if(e.source.dataClassification!==e.target.dataClassification||e.source.encryptionProfileDigest!==e.target.encryptionProfileDigest||e.source.residencyRegionIds.join("\x00")!==e.target.residencyRegionIds.join("\x00"))t.push("recipe.data_policy_changed");if(!ro(e.source.topologyKind,e.target.topologyKind,e.plan))t.push("recipe.transition_class");if(!Te(e.source,e.target,e.plan.transitionClass))t.push("recipe.component_delta");return[...new Set(t)]}function ro(e,t,o){if(e===t)return["vertical_resize","scale_out","scale_in"].includes(o.transitionClass);return oo.get(`${e}>${t}`)===o.transitionClass}import{invokeCapacityObservationPortV1 as io,invokeScaleDecisionPortV1 as no,invokeTopologyProfilePortV1 as ao}from"@lssm-tech/lib.lssm-os-runtime/runtime-node/scalability";async function q(e,t){if(!he(t.policy,t.binding))return Y("topology.invalid_policy");let o=await ao(()=>e.topologyState.getActive(t.binding),e.timeoutMs,t.binding);if(o.status!=="ok"&&o.status!=="already_applied")return o;let r=await io(()=>e.capacityObservation.observe(t.binding),e.timeoutMs,t.binding);if(r.status!=="ok"&&r.status!=="already_applied")return r;let i=await no(()=>e.scalePlanner.evaluate({...t.binding,profile:o.value.value,policy:t.policy,observations:[r.value.value]}),e.timeoutMs,t.binding);if(i.status!=="ok"&&i.status!=="already_applied")return i;let n;try{n=e.clock.now()}catch{return Y("topology.invalid_clock")}return Ve(i.value.value,t.binding,t.policy,o.value.value,r.value.value.observationDigest,n)?i:Y("topology.invalid_scale_decision")}var Y=(e)=>({status:"conflict",code:e,evidenceRefs:[]});async function we(e,t){let o=await q(e,t);if(o.status!=="ok"&&o.status!=="already_applied")return o;if(!so(t,o.value.value))return co("topology.scale_plan_mismatch");return w(e,t)}function so(e,t){let o=lo(t.action);return Boolean(o&&e.plan.transitionClass===o&&e.plan.scaleDecisionDigest===t.decisionDigest&&e.plan.sourceTopologyDigest===t.sourceTopologyDigest&&e.plan.targetTopologyDigest===t.targetTopologyDigest&&e.plan.dailyCostCeilingEurMicros<=e.policy.dailyCostCeilingEurMicros&&e.plan.observationDigests.length===t.observationDigests.length&&e.plan.observationDigests.every((r,i)=>r===t.observationDigests[i]))}function lo(e){return e==="resize_vertical"?"vertical_resize":e==="no_change"?void 0:e}var co=(e)=>({status:"conflict",code:e,evidenceRefs:[]});function _e(e,t,o,r,i){let n=new Map(o.metrics.map((u)=>[u.name,u.value])),a=Boolean(r&&Date.parse(i)-Date.parse(r.decidedAt)<t.cooldownSeconds*1000),s=t.thresholds.some((u)=>(n.get(u.metric)??-1)>=u.scaleUpAt),d=t.thresholds.every((u)=>(n.get(u.metric)??Number.POSITIVE_INFINITY)<u.scaleDownBelow),l=(n.get("concurrency")??Number.POSITIVE_INFINITY)===0,c=(n.get("queue_depth")??Number.POSITIVE_INFINITY)<=t.scaleDownBacklogCeiling,m=Math.min(t.maximumReplicas,t.providerQuotaCeiling,t.tenantConcurrencyCeiling);if(!a&&s&&t.freezeMode==="unfrozen"&&t.automaticMode!=="disabled"&&e.runtimeNodeReplicas<m)return De("scale_out",e.runtimeNodeReplicas,t.maximumStep,m,"threshold-scale-up");if(!a&&d&&l&&c&&t.freezeMode!=="all_frozen"&&t.automaticMode==="bidirectional"&&e.runtimeNodeReplicas>t.minimumReplicas)return De("scale_in",e.runtimeNodeReplicas,t.maximumStep,t.minimumReplicas,"threshold-scale-down");return{action:"no_change",targetReplicas:e.runtimeNodeReplicas,reasonCodes:[a?"cooldown-active":"within-hysteresis"]}}function De(e,t,o,r,i){let a=t+(e==="scale_out"?1:-1)*o;return{action:e,targetReplicas:e==="scale_out"?Math.min(a,r):Math.max(a,r),reasonCodes:[i]}}function Ce(e){if(!Number.isSafeInteger(e.decisionTtlMs)||e.decisionTtlMs<1||e.decisionTtlMs>300000)throw Error("topology.scale_configuration_invalid");return Object.freeze({clock:Object.freeze({now:e.clock.now.bind(e.clock)}),policyVerifier:Object.freeze({verify:e.policyVerifier.verify.bind(e.policyVerifier)}),targets:Object.freeze({resolve:e.targets.resolve.bind(e.targets)}),history:Object.freeze({getLatest:e.history.getLatest.bind(e.history),recordIfLatest:e.history.recordIfLatest.bind(e.history)}),decisionTtlMs:e.decisionTtlMs})}function Oe(e){if(!/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$/.test(e)||new Date(e).toISOString()!==e)throw Error("invalid clock");return e}import{digestScaleDecisionV1 as po}from"@lssm-tech/lib.lssm-os-spec/runtime-topology";function xe(e,t,o){return{decisionId:`no-change-${o.observationId}`,targetTopologyDigest:e.profileDigest,estimatedDailyCostEurMicros:0,signatureRef:t.signatureRef}}function Ae(e){let t={contractVersion:"1.0.0",scope:e.policy.scope,decisionId:e.target.decisionId,policyDigest:e.policy.policyDigest,observationDigests:[e.observation.observationDigest],sourceTopologyDigest:e.profile.profileDigest,targetTopologyDigest:e.target.targetTopologyDigest,action:e.action,targetReplicas:e.targetReplicas,estimatedDailyCostEurMicros:e.target.estimatedDailyCostEurMicros,reasonCodes:[...e.reasonCodes].sort(),authorityRef:e.policy.authorityRef,signatureRef:e.target.signatureRef,decidedAt:e.decidedAt,expiresAt:e.expiresAt,decisionDigest:e.profile.profileDigest};return{...t,decisionDigest:po(t)}}var J=(e,t)=>({status:"ok",value:{binding:e,value:t}}),Be=(e,t)=>({status:"already_applied",value:{binding:e,value:t}}),R=(e)=>({status:"conflict",code:e,evidenceRefs:[]}),We=(e)=>({status:"unavailable",code:e,evidenceRefs:[]});var _=(e,t)=>e.scope.tenantId===t.tenantId&&e.scope.workspaceId===t.workspaceId&&e.scope.environmentId===t.environmentId&&e.scope.productId===t.productId&&e.scope.applicationId===t.applicationId;function Ee(e,t,o){let r=Date.parse(o),i=Date.parse(e.observedAt);return e.observedAt===e.windowEndedAt&&i<=r&&r-i<=t.sampleWindowSeconds*1000}import{CapacityObservationV1Schema as uo,hasValidCapacityObservationV1Digest as mo,hasValidRuntimeTopologyProfileV1Digest as go,hasValidScaleDecisionV1Digest as yo,hasValidScalePolicyV1Digest as fo,RuntimeTopologyProfileV1Schema as vo,ScaleDecisionV1Schema as ho,ScalePolicyV1Schema as Vo,validateScalePolicyV1 as Ro}from"@lssm-tech/lib.lssm-os-spec/runtime-topology";function ze(e,t,o,r){let i=vo.safeParse(t),n=Vo.safeParse(o);if(!i.success||!n.success||t.profileDigest!==e.topologyDigest||!o.allowedTargetKinds.includes(t.topologyKind)||o.sourceTopologyDigest!==e.topologyDigest||!_(t,e)||!_(o,e)||!fo(o)||!go(t)||Ro(o).length>0||r.length!==1)return!1;let a=r[0];if(!uo.safeParse(a).success)return!1;return _(a,e)&&a.topologyDigest===e.topologyDigest&&mo(a)&&Date.parse(a.windowEndedAt)-Date.parse(a.windowStartedAt)>=Math.max(o.sampleWindowSeconds,o.minimumStableSeconds)*1000}function qe(e,t,o){let r=ho.safeParse(e);if(!r.success||!yo(r.data)||!_(r.data,t)||r.data.policyDigest!==o.policyDigest||r.data.sourceTopologyDigest!==t.topologyDigest)return;return Object.freeze(structuredClone(r.data))}function Ne(e,t,o){if(!e||typeof e!=="object"||Array.isArray(e))return;if(Reflect.ownKeys(e).sort().join(",")!=="decisionId,estimatedDailyCostEurMicros,signatureRef,targetTopologyDigest")return;let r=structuredClone(e);if(/^[A-Za-z0-9][A-Za-z0-9_.:-]{0,127}$/.test(r.decisionId)&&/^sha256:[a-f0-9]{64}$/.test(r.targetTopologyDigest)&&Number.isSafeInteger(r.estimatedDailyCostEurMicros)&&r.estimatedDailyCostEurMicros>=0&&r.estimatedDailyCostEurMicros<=t.dailyCostCeilingEurMicros&&/^[A-Za-z0-9][A-Za-z0-9_.:-]{0,127}$/.test(r.signatureRef)&&(o==="no_change"||t.reversibleTransitionDigests.includes(r.targetTopologyDigest)))return Object.freeze(r)}function Ti(e){let t=Ce(e);return Object.freeze({evaluate:(o)=>Io(t,o)})}async function Io(e,t){try{if(t=structuredClone(t),!ze(t,t.profile,t.policy,t.observations))return R("topology.scale_input_untrusted");let o=t.observations[0],r=Oe(e.clock.now());if(!Ee(o,t.policy,r))return R("topology.scale_observation_stale");if(await e.policyVerifier.verify(structuredClone(t.policy))!==!0)return R("topology.scale_policy_untrusted");let i=await e.history.getLatest({binding:t,policyDigest:t.policy.policyDigest}),n=i?qe(i,t,t.policy):void 0;if(i&&(!n||Date.parse(n.decidedAt)>Date.parse(r)))return R("topology.scale_history_untrusted");let a=_e(t.profile,t.policy,o,n,r),s=a.action==="no_change"?xe(t.profile,t.policy,o):await e.targets.resolve({binding:t,profile:t.profile,policy:t.policy,observation:o,action:a.action,targetReplicas:a.targetReplicas,decidedAt:r}),d=Ne(s,t.policy,a.action);if(!d)return R("topology.scale_target_untrusted");let l=Ae({profile:t.profile,policy:t.policy,observation:o,...a,target:d,decidedAt:r,expiresAt:new Date(Date.parse(r)+e.decisionTtlMs).toISOString()});if(a.action==="no_change")return J(t,l);if(await e.history.recordIfLatest({binding:t,policyDigest:t.policy.policyDigest,expectedDecisionDigest:n?.decisionDigest,decision:l}))return J(t,l);let c=await e.history.getLatest({binding:t,policyDigest:t.policy.policyDigest});return c?.decisionDigest===l.decisionDigest?Be(t,c):R("topology.scale_decision_race")}catch{return We("topology.scale_dependency_unavailable")}}class To{dependencies;constructor(e){this.dependencies=e;if(!Number.isFinite(e.timeoutMs)||e.timeoutMs<=0)throw Error("Topology controller timeout must be positive.")}async evaluateScale(e){return q(this.dependencies,e)}async proposeScaleTransition(e){return we(this.dependencies,e)}async recordObserved(e){return w(this.dependencies,e)}async recordObservedProfileTransition(e){if(Z({plan:e.plan,source:e.sourceProfile,target:e.targetProfile}).length>0)return h("topology.invalid_transition_recipe");return w(this.dependencies,e)}async compareAndSetState(e){return Ie(this.dependencies,e)}async authorizeTransition(e){if(!f(e.plan,e.binding))return h("topology.invalid_plan");let t=await V(this.dependencies.topologyState,this.dependencies.timeoutMs,e.binding,e.plan);if(t.status!=="ok"&&t.status!=="already_applied")return t;if(t.value.value.state!=="simulated")return h("topology.state_conflict");let o=await ye(this.dependencies,e,t.value.value);if(o.status!=="ok")return o;return y(()=>this.dependencies.topologyState.compareAndSetTransition({...e.binding,expectedState:"simulated",receipt:o.value}),this.dependencies.timeoutMs,e.binding,e.plan)}async recordVerifiedDisposition(e){if(!f(e.plan,e.binding)||!v(e.receipt,e.binding,e.plan))return h("topology.invalid_disposition");let t=await V(this.dependencies.topologyState,this.dependencies.timeoutMs,e.binding,e.plan);if(t.status!=="ok"&&t.status!=="already_applied")return t;if(t.value.value.state!==e.expectedState)return h("topology.state_conflict");let o=await Pe(this.dependencies,e,t.value.value);if(!o)return h("topology.disposition_unverified");return y(()=>this.dependencies.topologyState.compareAndSetTransition({...e.binding,expectedState:e.expectedState,receipt:o}),this.dependencies.timeoutMs,e.binding,e.plan)}async executeAuthorizedStep(e){if(!f(e.plan,e.binding))return h("topology.invalid_plan");let t=e.plan.steps.find((a)=>a.stepId===e.stepId);if(!t)return h("topology.step_not_found");let o=await V(this.dependencies.topologyState,this.dependencies.timeoutMs,e.binding,e.plan);if(o.status!=="ok"&&o.status!=="already_applied")return o;if(!E(o.value.value,t.stepId,t.prerequisiteStepIds))return h("topology.step_not_ready");let r=await Po({clock:this.dependencies.clock,operations:this.dependencies.operations,connectVerifier:this.dependencies.connectVerifier,qualificationAuthority:this.dependencies.qualificationAuthority,executor:this.dependencies.executor,timeoutMs:this.dependencies.timeoutMs},e);if(r.status!=="ok"&&r.status!=="already_applied")return r;if(!W(o.value.value,r.value.value,e.plan,e.stepId)){let a=await D(this.dependencies,e,r.value.value.receiptId);return U(a?"topology.invalid_effect_receipt":"topology.effect_custody_unconfirmed",[r.value.value.receiptId])}let i=await y(()=>this.dependencies.topologyState.compareAndSetTransition({...e.binding,expectedState:o.value.value.state,receipt:r.value.value}),this.dependencies.timeoutMs,e.binding,e.plan);if(i.status==="ok"||i.status==="already_applied")return i;return await D(this.dependencies,e,r.value.value.receiptId)?U("topology.effect_persist_unconfirmed",[r.value.value.receiptId]):U("topology.effect_custody_unconfirmed",[r.value.value.receiptId])}}var h=(e)=>({status:"conflict",code:e,evidenceRefs:[]}),U=(e,t=[])=>({status:"indeterminate",code:e,evidenceRefs:t});import{executeAuthorizedTopologyStepV2 as bo}from"@lssm-tech/lib.lssm-os-runtime/runtime-node/scalability";class So{dependencies;constructor(e){this.dependencies=e;if(!Number.isFinite(e.timeoutMs)||e.timeoutMs<=0)throw Error("Topology controller timeout must be positive.")}async executeAuthorizedStep(e){if(!f(e.plan,e.binding))return N("conflict","topology.invalid_plan");let t=e.plan.steps.find((n)=>n.stepId===e.stepId);if(!t)return N("conflict","topology.step_not_found");let o=await V(this.dependencies.topologyState,this.dependencies.timeoutMs,e.binding,e.plan);if(o.status!=="ok"&&o.status!=="already_applied")return o;if(!E(o.value.value,t.stepId,t.prerequisiteStepIds))return N("conflict","topology.step_not_ready");let r=await bo(this.dependencies,{...e,currentReceipt:o.value.value});if(r.status!=="ok"&&r.status!=="already_applied"){if(r.status==="conflict")return r;return this.custody(e,r.code,r.evidenceRefs[0])}if(!W(o.value.value,r.value.value,e.plan,e.stepId))return this.custody(e,"topology.invalid_effect_receipt",r.value.value.receiptId);let i=await y(()=>this.dependencies.topologyState.compareAndSetTransition({...e.binding,expectedState:o.value.value.state,receipt:r.value.value}),this.dependencies.timeoutMs,e.binding,e.plan);return i.status==="ok"||i.status==="already_applied"?i:this.custody(e,"topology.effect_persist_unconfirmed",r.value.value.receiptId)}async custody(e,t,o=`effect-${e.order.step.effectDigest.slice(7,39)}`){let r=await D(this.dependencies,e,o);return N("indeterminate",r?t:"topology.effect_custody_unconfirmed",[o])}}function N(e,t,o=[]){return{status:e,code:t,evidenceRefs:o}}class ko{controlPlane;workOrders;constructor(e,t){this.controlPlane=e;this.workOrders=t}async runNext(e){let t=await this.workOrders.claim({scope:e.scope,holderId:e.holderId,now:e.now,ttlMs:e.leaseTtlMs});if(!t)return;let o="failed";try{let r=await this.controlPlane.apply({scope:e.scope,planId:t.workOrder.planId,planDigest:t.workOrder.planDigest,authorizationRef:t.workOrder.authorizationRef,executionId:t.workOrder.executionId,idempotencyKey:t.workOrder.idempotencyKey,holderId:e.holderId,leaseTtlMs:e.leaseTtlMs});o=wo(r.status)}catch{o="indeterminate"}return await this.workOrders.complete({scope:e.scope,workOrderId:t.workOrder.id,holderId:t.holderId,fencingToken:t.fencingToken,executionStatus:o}),this.workOrders.get(e.scope,t.workOrder.id)}}function wo(e){if(e==="failed"||e==="succeeded"||e==="rolled_back"||e==="indeterminate")return e;return"indeterminate"}export{te as BuilderCandidateHost,Vt as InMemoryConnectDecisionReader,Rt as InMemoryControlPlaneWorkOrderAdapter,Ge as LssmOsControlPlane,mr as LssmOsControlPlaneFeature,gr as LssmOsControlPlaneFeatureDoc,ko as LssmOsControlPlaneWorker,Bt as LssmOsRuntimeNodeWorkerV2,To as LssmOsTopologyControllerV1,So as LssmOsTopologyControllerV2,er as acceptBuilderHandoff,ae as createBuilderProviderReceipt,gt as createBuilderRuntimeProvider,vt as createBuilderRuntimeReceiptWriter,Ti as createDeterministicScalePlannerV1,st as digestBuilderHandoffPacket,g as indeterminateRuntimeNodeWorkV2,P as rejectedRuntimeNodeWorkV2,x as runtimeNodeWorkerLookupV2,Z as validateTopologyTransitionRecipeV1};
|
|
File without changes
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{bindProviderStepExecutionV2 as A,executeProviderStepV2 as E}from"@lssm-tech/lib.lssm-os-runtime";import{canonicalize as v,createRuntimeWorkOrderCompletionV2 as N}from"@lssm-tech/lib.lssm-os-runtime";function u(e){return{tenantId:e.tenantId,workspaceId:e.workspaceId,environmentId:e.environmentId,orderId:e.orderId}}function l(e,r){return{status:"rejected",phase:e,reason:r}}function o(e,r,t){return{status:"indeterminate",phase:e,reason:r,claim:t}}function C(e){let r=e.receipts.at(-1);if(!r)throw Error("Completion requires durable receipts.");let t=e.receipts.every((i)=>i.status==="succeeded")?"succeeded":r.status;return N({contractVersion:"2.0.0",tenantId:e.order.tenantId,workspaceId:e.order.workspaceId,environmentId:e.order.environmentId,completionId:e.completionId,orderId:e.order.orderId,workOrderDigest:e.order.workOrderDigest,claimId:e.claim.claimId,claimDigest:e.claim.claimDigest,nodeId:e.claim.nodeId,providerBindingDigest:e.claim.providerBindingDigest,leaseId:e.claim.leaseId,fencingToken:e.claim.fencingToken,attemptId:e.claim.attemptId,status:t,receiptDigests:e.receipts.map((i)=>i.attestationDigest),evidenceRefs:[...new Set(e.receipts.flatMap((i)=>i.evidenceRefs))].sort(),completedAt:e.completedAt})}function b(e,r){return v(e)===v(r)}async function W(e){let r;try{r=C(e)}catch{return o("completion","completion_invalid",e.claim)}let t=await e.deadline.call(()=>e.workOrders.complete({completion:r,expectedClaimDigest:e.claim.claimDigest,expectedFencingToken:e.claim.fencingToken}));if(t.status==="ok"&&t.value)return{status:"completed",completion:r};let i=await e.deadline.call(()=>e.workOrders.getCompletion(u(e.order)));if(i.status==="ok"&&i.value&&b(i.value,r))return{status:"completed",completion:i.value};return o("completion","completion_unconfirmed",e.claim)}class k{scheduler;#e;#r;constructor(e,r){this.scheduler=e;if(!Number.isFinite(r)||r<=0)throw Error("Runtime Node worker timeout must be positive.");let t=e.now();if(!Number.isFinite(t))throw Error("Runtime Node worker scheduler time must be finite.");this.#r=t,this.#e=t+r}async call(e){let r;try{r=this.scheduler.now()}catch{return{status:"failed"}}if(!Number.isFinite(r)||r<this.#r)return{status:"failed"};this.#r=r;let t=this.#e-r;if(t<=0)return{status:"timeout"};return new Promise((i)=>{let n=!1,a,s;try{if(a=this.scheduler.schedule(t,()=>{if(n)return;n=!0,i({status:"timeout"})}),n)return;s=e(),Promise.prototype.then.call(s,(c)=>d({status:"ok",value:c}),()=>d({status:"failed"}))}catch{d({status:"failed"})}function d(c){if(n)return;n=!0;try{a?.cancel()}catch{}i(c)}})}}var y={now:()=>performance.now(),schedule(e,r){let t=setTimeout(r,e);return{cancel:()=>clearTimeout(t)}}};import{validateProviderStepReceiptV2 as _}from"@lssm-tech/lib.lssm-os-runtime";function R(e){let r=[...e.order.steps].sort((n,a)=>n.sequence-a.sequence),t=e.receipts.map((n)=>_(n)),i=Number.NEGATIVE_INFINITY;for(let[n,a]of t.entries()){let s=r[n];if(!s||!S(a,e.order,s))throw Error("Durable receipt prefix is not authorized.");if(n<t.length-1&&a.status!=="succeeded")throw Error("Durable receipt prefix continues after a terminal step.");let d=Date.parse(a.recordedAt);if(d<i)throw Error("Durable receipt chronology is invalid.");i=d}return t}function S(e,r,t){let i=r.providerBinding;return P(e,r)&&e.orderId===r.orderId&&e.workOrderDigest===r.workOrderDigest&&e.nodeId===r.nodeId&&e.providerId===i.providerId&&e.adapterId===i.adapterId&&e.adapterVersion===i.adapterVersion&&e.adapterDigest===i.adapterDigest&&e.profileId===i.profileId&&e.profileDigest===i.profileDigest&&e.providerBindingDigest===i.bindingDigest&&e.environmentDigest===i.environmentDigest&&e.sourceDigest===i.sourceDigest&&e.qualificationBindingDigest===i.qualificationBindingDigest&&e.planDigest===t.planDigest&&e.authorizationDigest===t.authorizationDigest&&e.stepId===t.stepId&&e.action===t.action&&e.effectDigest===t.effectDigest}function P(e,r){return e.tenantId===r.tenantId&&e.workspaceId===r.workspaceId&&e.environmentId===r.environmentId}import{canonicalize as p,RuntimeTimestampSchema as x,validateRuntimeNodeEligibilityDecisionV1 as T,validateSignedRuntimeWorkOrderV2 as h}from"@lssm-tech/lib.lssm-os-runtime";function w(e){if(e.completionId.length===0)throw Error("Missing completion id.");let r=h(e.order),t=T(e.eligibilityDecision);if(t.orderId!==r.orderId||t.workOrderDigest!==r.workOrderDigest||t.nodeId!==r.nodeId||t.providerBindingDigest!==r.providerBinding.bindingDigest||!q(t,r))throw Error("Eligibility decision binding mismatch.");return r}function I(e){return x.parse(e)}function D(e){if(!e.result||e.result.revoked)return!1;let r;try{r=h(e.result.order)}catch{return!1}return p(r)===p(e.order)&&Date.parse(r.issuedAt)<=Date.parse(e.now)&&Date.parse(r.expiresAt)>Date.parse(e.now)}function O(e,r){return p(e)===p(r)}function q(e,r){return e.tenantId===r.tenantId&&e.workspaceId===r.workspaceId&&e.environmentId===r.environmentId}class B{dependencies;#e;constructor(e,r){this.dependencies=e;if(!Number.isFinite(r.operationTimeoutMs)||r.operationTimeoutMs<=0)throw Error("Runtime Node worker timeout must be positive.");this.#e=r.operationTimeoutMs}async run(e){let r;try{r=w(e)}catch{return l("input","invalid_work_order")}let t;try{t=new k(this.dependencies.scheduler??y,this.#e)}catch{return o("state","scheduler_unavailable")}let i=this.readClock();if(!i)return l("connect","invalid_trusted_clock");let n=await t.call(()=>this.dependencies.connectVerifier.verify({order:structuredClone(r),verifiedAt:i}));if(n.status==="timeout")return o("connect","verification_timeout");if(n.status==="failed")return l("connect","verification_failed");let a=this.readClock();if(!a||Date.parse(a)<Date.parse(i)||!D({order:r,result:n.value,now:a}))return l("connect","work_order_untrusted");if((await t.call(()=>this.dependencies.workOrders.putIssued(r))).status!=="ok")return o("state","issue_unconfirmed");let d=await t.call(()=>this.dependencies.workOrders.claim(e));if(d.status!=="ok")return o("claim","claim_unconfirmed");if(d.value.status==="completed")return{status:"completed",completion:d.value.completion};if(d.value.status==="rejected")return l("claim","claim_rejected");let c=d.value.claim;return this.executeClaim({deadline:t,order:r,claim:c,request:e,receiptOnly:d.value.status==="already_claimed"||c.previousClaimDigest!==void 0||c.fencingToken>1})}async executeClaim(e){let r=u(e.order),t=await e.deadline.call(()=>this.dependencies.receipts.list(r));if(t.status!=="ok")return o("receipt","receipt_state_unavailable",e.claim);let i;try{i=R({order:e.order,receipts:t.value})}catch{return o("receipt","receipt_state_untrusted",e.claim)}let n=[...e.order.steps].sort((s,d)=>s.sequence-d.sequence);while(i.length<n.length&&i.every((s)=>s.status==="succeeded")){if(e.receiptOnly)return o("claim",e.claim.previousClaimDigest!==void 0||e.claim.fencingToken>1?"prior_claim_requires_reconciliation":"active_claim_requires_reconciliation",e.claim);let s=n[i.length];if(!s)break;let d=await e.deadline.call(()=>this.dependencies.workOrders.getClaim(r));if(d.status!=="ok"||!d.value||!O(d.value,e.claim))return o("lease","claim_authority_lost",e.claim);let c=this.readClock();if(!c||Date.parse(e.order.expiresAt)<=Date.parse(c))return o("lease","work_order_expired",e.claim);let f;try{f=A({order:e.order,claim:e.claim,stepId:s.stepId,now:c})}catch{return o("lease","claim_authority_invalid",e.claim)}let m=await e.deadline.call(()=>E({execution:f,router:this.dependencies.router}));if(m.status!=="ok")return o("provider","provider_outcome_unresolved",e.claim);if((await e.deadline.call(()=>this.dependencies.receipts.append(m.value))).status!=="ok")return o("receipt","receipt_append_unconfirmed",e.claim);let V=await e.deadline.call(()=>this.dependencies.receipts.list(r));if(V.status!=="ok")return o("receipt","receipt_append_unconfirmed",e.claim);try{i=R({order:e.order,receipts:V.value})}catch{return o("receipt","receipt_state_untrusted",e.claim)}if(!i.some((g)=>g.stepId===m.value.stepId&&g.attestationDigest===m.value.attestationDigest))return o("receipt","receipt_append_unconfirmed",e.claim)}let a=this.readClock();if(!a)return o("completion","invalid_trusted_clock",e.claim);return W({deadline:e.deadline,workOrders:this.dependencies.workOrders,order:e.order,claim:e.claim,receipts:i,completionId:e.request.completionId,completedAt:a})}readClock(){try{return I(this.dependencies.clock.now())}catch{return}}}export{B as LssmOsRuntimeNodeWorkerV2};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{executeAuthorizedTopologyStepV1 as Ze}from"@lssm-tech/lib.lssm-os-runtime/runtime-node/scalability";import{verifyAuthorizedTopologyIntentV1 as ne}from"@lssm-tech/lib.lssm-os-runtime/runtime-node/scalability";import{digestTopologyTransitionReceiptV1 as re,TopologyTransitionReceiptV1Schema as se}from"@lssm-tech/lib.lssm-os-spec/runtime-topology";async function x(e,o,t){let i=await ne(e,o);if(i.status!=="ok")return i;let a;try{a=e.clock.now()}catch{return{status:"conflict",code:"topology.invalid_clock",evidenceRefs:[]}}let r=[{id:o.order.orderId,digest:o.order.workOrderDigest},{id:o.plan.authorityRef,digest:o.plan.authorizationDigest}].sort((c,m)=>c.id<m.id?-1:c.id>m.id?1:0),n=se.safeParse({contractVersion:"1.0.0",scope:o.plan.scope,receiptId:`authorized-${o.plan.planId}`,planDigest:o.plan.planDigest,operationId:o.plan.operationId,claimId:o.plan.claimId,attemptId:o.plan.attemptId,fencingToken:o.plan.fencingToken,sourceTopologyDigest:o.plan.sourceTopologyDigest,targetTopologyDigest:o.plan.targetTopologyDigest,state:"authorized",completedStepIds:t.completedStepIds,evidenceRefs:r,recordedAt:a,receiptDigest:o.plan.planDigest});if(!n.success)return{status:"conflict",code:"topology.invalid_authorization_evidence",evidenceRefs:[]};let s=n.data;return{status:"ok",value:{...s,receiptDigest:re(s)}}}function M(e,o,t){let i=o.steps.filter((a)=>a.action!=="rollback"&&a.action!=="decommission");return i.at(-1)?.stepId===t&&i.slice(0,-1).every((a)=>e.completedStepIds.includes(a.stepId))}var A={observed:["proposed","rejected","blocked"],proposed:["simulated","rejected","blocked"],simulated:["authorized","rejected","blocked"],authorized:["provisioning","blocked"],provisioning:["shadowing","rolling_back","indeterminate","manual_custody"],shadowing:["canary","rolling_back","indeterminate","manual_custody"],canary:["active","rolling_back","indeterminate","manual_custody"],active:["stabilizing","rolling_back","indeterminate","manual_custody"],stabilizing:["verified","rolling_back","indeterminate","manual_custody"],rolling_back:["rolled_back","indeterminate","manual_custody"],indeterminate:["rolling_back","manual_custody"],rejected:[],blocked:[],verified:[],rolled_back:[],manual_custody:[]};function b(e,o){if(!A[e.state].includes(o.state))return!1;return e.completedStepIds.length===o.completedStepIds.length&&e.completedStepIds.every((t,i)=>o.completedStepIds[i]===t)}function O(e,o,t,i){let a=M(e,t,i);if(!A[e.state].includes(o.state)&&!(a&&["shadowing","canary","active","stabilizing"].includes(e.state)&&o.state==="verified"))return!1;if(e.completedStepIds.some((n,s)=>o.completedStepIds[s]!==n))return!1;let r=new Set(t.steps.map((n)=>n.stepId));return o.completedStepIds.length===e.completedStepIds.length+1&&o.completedStepIds.at(-1)===i&&new Set(o.completedStepIds).size===o.completedStepIds.length&&o.completedStepIds.every((n)=>r.has(n))&&!e.completedStepIds.includes(i)}function z(e,o,t){if(!["authorized","provisioning","shadowing","canary","active","stabilizing","rolling_back"].includes(e.state))return!1;return!e.completedStepIds.includes(o)&&t.every((i)=>e.completedStepIds.includes(i))}import{isScalabilityPortResultV1 as Se,parseBoundScalabilityValueV1 as be}from"@lssm-tech/lib.lssm-os-runtime/runtime-node/scalability";import{TopologyTransitionReceiptV1Schema as ve}from"@lssm-tech/lib.lssm-os-spec/runtime-topology";import{hasValidScaleDecisionV1Digest as le,hasValidScalePolicyV1Digest as ce,hasValidTopologyTransitionPlanV1Digest as pe,hasValidTopologyTransitionReceiptV1Digest as de,ScaleDecisionV1Schema as ge,ScalePolicyV1Schema as ye,TopologyTransitionPlanV1Schema as me,TopologyTransitionReceiptV1Schema as ue,validateScalePolicyV1 as fe,validateTopologyTransitionPlanV1 as Te}from"@lssm-tech/lib.lssm-os-spec/runtime-topology";function E(e,o){let t=ye.safeParse(e);return Boolean(t.success&&ce(t.data)&&fe(t.data).length===0&&v(t.data.scope,o)&&t.data.sourceTopologyDigest===o.topologyDigest)}function B(e,o,t,i,a,r){let n=ge.safeParse(e),s=Date.parse(r);return Boolean(n.success&&le(n.data)&&v(n.data.scope,o)&&n.data.sourceTopologyDigest===o.topologyDigest&&n.data.policyDigest===t.policyDigest&&n.data.observationDigests.length===1&&n.data.observationDigests[0]===a&&Ve(n.data,t,i)&&Number.isFinite(s)&&Date.parse(n.data.decidedAt)<=s&&s<Date.parse(n.data.expiresAt))}function u(e,o){let t=me.safeParse(e);return Boolean(t.success&&pe(t.data)&&Te(t.data).length===0&&v(t.data.scope,o)&&t.data.sourceTopologyDigest===o.topologyDigest)}function Ve(e,o,t){let i=e.targetReplicas-t.runtimeNodeReplicas,a=["scale_in","remove_cache","remove_broker"].includes(e.action),r=["scale_out","add_cache","add_broker"].includes(e.action),n=e.action!=="no_change";return e.estimatedDailyCostEurMicros<=o.dailyCostCeilingEurMicros&&e.targetReplicas>=o.minimumReplicas&&e.targetReplicas<=o.maximumReplicas&&e.targetReplicas<=o.providerQuotaCeiling&&e.targetReplicas<=o.tenantConcurrencyCeiling&&Math.abs(i)<=o.maximumStep&&(e.action!=="scale_out"||i>0)&&(e.action!=="scale_in"||i<0)&&(e.action!=="no_change"||i===0)&&(o.freezeMode==="unfrozen"||!r)&&(o.freezeMode!=="all_frozen"||!n)&&(o.automaticMode==="bidirectional"||!a)&&(o.automaticMode!=="disabled"||!n)&&(!n||o.reversibleTransitionDigests.includes(e.targetTopologyDigest))}function p(e,o,t){let i=ue.safeParse(e);return Boolean(i.success&&de(i.data)&&v(i.data.scope,o)&&i.data.planDigest===t.planDigest&&i.data.operationId===t.operationId&&i.data.claimId===t.claimId&&i.data.attemptId===t.attemptId&&i.data.fencingToken===t.fencingToken&&i.data.sourceTopologyDigest===t.sourceTopologyDigest&&i.data.targetTopologyDigest===t.targetTopologyDigest)}function v(e,o){return e.tenantId===o.tenantId&&e.workspaceId===o.workspaceId&&e.environmentId===o.environmentId&&e.productId===o.productId&&e.applicationId===o.applicationId}async function y(e,o,t,i){let a;try{let r=await Promise.race([Promise.resolve().then(e),new Promise((s)=>{a=setTimeout(()=>s(void 0),o)})]);if(!Se(r))return h("invalid_result");if(r.status!=="ok"&&r.status!=="already_applied")return r;let n=be(r.value,t,(s)=>{let l=ve.safeParse(s);return l.success&&p(l.data,t,i)?l.data:void 0});if(!n)return h("invalid_result");return j({status:r.status,value:n})}catch{return h("dependency_failure")}finally{if(a)clearTimeout(a)}}var T=(e,o,t,i)=>y(()=>e.getTransition({...t,planDigest:i.planDigest}),o,t,i),h=(e)=>({status:"unavailable",code:e,evidenceRefs:[]});function j(e){if(e&&typeof e==="object"&&!Object.isFrozen(e)){for(let o of Object.values(e))j(o);Object.freeze(e)}return e}async function V(e,o){if(!u(o.plan,o.binding)||o.receipt.state!=="observed"||!p(o.receipt,o.binding,o.plan))return _("topology.invalid_observation");return y(()=>e.topologyState.recordObservedTransition({...o.binding,receipt:o.receipt}),e.timeoutMs,o.binding,o.plan)}async function N(e,o){if(!u(o.plan,o.binding)||!p(o.receipt,o.binding,o.plan)||!["proposed","simulated"].includes(o.receipt.state))return _("topology.invalid_transition");let t=await T(e.topologyState,e.timeoutMs,o.binding,o.plan);if(t.status!=="ok"&&t.status!=="already_applied")return t;if(t.value.value.state!==o.expectedState||!b(t.value.value,o.receipt))return _("topology.state_conflict");return y(()=>e.topologyState.compareAndSetTransition({...o.binding,expectedState:o.expectedState,receipt:o.receipt}),e.timeoutMs,o.binding,o.plan)}var _=(e)=>({status:"conflict",code:e,evidenceRefs:[]});async function I(e,o,t){let i;try{return await Promise.race([De(e,o,t),new Promise((a)=>{i=setTimeout(()=>a(!1),e.timeoutMs)})])}catch{return!1}finally{if(i)clearTimeout(i)}}async function De(e,o,t){let i=await e.operations.get({tenantId:o.binding.tenantId,workspaceId:o.binding.workspaceId,environmentId:o.binding.environmentId,operationId:o.plan.operationId});if(!i||!he(i,o))return!1;if(i.status==="indeterminate")return i.recoveryRef===t;if(i.status!=="running")return!1;let a=e.clock.now();return e.operations.transition({operation:{...i,status:"indeterminate",version:i.version+1,updatedAt:a,recoveryRef:t},expectedVersion:i.version,expectedStatus:"running",expectedAttemptId:o.plan.attemptId,expectedClaimId:o.plan.claimId,expectedFencingToken:o.plan.fencingToken})}function he(e,o){return e.attemptId===o.plan.attemptId&&e.claimId===o.plan.claimId&&e.fencingToken===o.plan.fencingToken}var _e=new Set(["rejected","blocked","indeterminate","manual_custody"]);async function L(e,o,t){if(!_e.has(o.receipt.state)||!b(t,o.receipt))return;let i;try{i=e.clock.now()}catch{return}let a;try{let r=await Promise.race([Promise.resolve().then(()=>e.dispositionVerifier.verify({current:t,candidate:o.receipt,plan:o.plan,verifiedAt:i})),new Promise((n)=>{a=setTimeout(()=>n(void 0),e.timeoutMs)})]);if(!r||r.receiptDigest!==o.receipt.receiptDigest)return;return p(r,o.binding,o.plan)&&r.state===o.receipt.state?structuredClone(r):void 0}catch{return}finally{if(a)clearTimeout(a)}}import{validateRuntimeTopologyProfileV1 as Z,validateTopologyTransitionPlanV1 as Ie}from"@lssm-tech/lib.lssm-os-spec/runtime-topology";function F(e,o,t){if(["promote_state_backend","demote_state_backend"].includes(t))return e.authorityStoreComponentId!==o.authorityStoreComponentId&&e.queueComponentId!==o.queueComponentId&&e.cacheComponentId===o.cacheComponentId;if(t==="add_cache")return!e.cacheComponentId&&Boolean(o.cacheComponentId)&&e.queueComponentId===o.queueComponentId;if(t==="remove_cache")return Boolean(e.cacheComponentId)&&!o.cacheComponentId&&e.queueComponentId===o.queueComponentId;if(["add_broker","remove_broker"].includes(t))return e.queueComponentId!==o.queueComponentId&&e.cacheComponentId===o.cacheComponentId;return!0}function q(e,o,t){let i=e.components.find((r)=>r.componentId===e.authorityStoreComponentId),a=o.components.find((r)=>r.componentId===o.authorityStoreComponentId);if(!i||!a)return!1;if(["promote_state_backend","demote_state_backend"].includes(t))return i.profileDigest!==a.profileDigest;return i.profileDigest===a.profileDigest}function K(e,o,t){let i=(a)=>Object.values(a.scope).join("\x00");return i(e)===i(o)&&i(e)===i(t)}var Pe=new Map([["t0_embedded>t1_database_only","promote_state_backend"],["t1_database_only>t0_embedded","demote_state_backend"],["t1_database_only>t2_cache_accelerated","add_cache"],["t2_cache_accelerated>t1_database_only","remove_cache"],["t1_database_only>t3_broker_backed","add_broker"],["t2_cache_accelerated>t3_broker_backed","add_broker"],["t3_broker_backed>t1_database_only","remove_broker"],["t3_broker_backed>t2_cache_accelerated","remove_broker"]]);function P(e){let o=[...Z(e.source).map((t)=>`source.${t}`),...Z(e.target).map((t)=>`target.${t}`),...Ie(e.plan)];if(e.plan.sourceTopologyDigest!==e.source.profileDigest)o.push("recipe.source_digest");if(e.plan.targetTopologyDigest!==e.target.profileDigest)o.push("recipe.target_digest");if(!K(e.source,e.target,e.plan))o.push("recipe.scope");if(!q(e.source,e.target,e.plan.transitionClass))o.push("recipe.authority_changed");if(e.source.dataClassification!==e.target.dataClassification||e.source.encryptionProfileDigest!==e.target.encryptionProfileDigest||e.source.residencyRegionIds.join("\x00")!==e.target.residencyRegionIds.join("\x00"))o.push("recipe.data_policy_changed");if(!Re(e.source.topologyKind,e.target.topologyKind,e.plan))o.push("recipe.transition_class");if(!F(e.source,e.target,e.plan.transitionClass))o.push("recipe.component_delta");return[...new Set(o)]}function Re(e,o,t){if(e===o)return["vertical_resize","scale_out","scale_in"].includes(t.transitionClass);return Pe.get(`${e}>${o}`)===t.transitionClass}import{invokeCapacityObservationPortV1 as Ce,invokeScaleDecisionPortV1 as ke,invokeTopologyProfilePortV1 as we}from"@lssm-tech/lib.lssm-os-runtime/runtime-node/scalability";async function D(e,o){if(!E(o.policy,o.binding))return R("topology.invalid_policy");let t=await we(()=>e.topologyState.getActive(o.binding),e.timeoutMs,o.binding);if(t.status!=="ok"&&t.status!=="already_applied")return t;let i=await Ce(()=>e.capacityObservation.observe(o.binding),e.timeoutMs,o.binding);if(i.status!=="ok"&&i.status!=="already_applied")return i;let a=await ke(()=>e.scalePlanner.evaluate({...o.binding,profile:t.value.value,policy:o.policy,observations:[i.value.value]}),e.timeoutMs,o.binding);if(a.status!=="ok"&&a.status!=="already_applied")return a;let r;try{r=e.clock.now()}catch{return R("topology.invalid_clock")}return B(a.value.value,o.binding,o.policy,t.value.value,i.value.value.observationDigest,r)?a:R("topology.invalid_scale_decision")}var R=(e)=>({status:"conflict",code:e,evidenceRefs:[]});async function Y(e,o){let t=await D(e,o);if(t.status!=="ok"&&t.status!=="already_applied")return t;if(!xe(o,t.value.value))return Ae("topology.scale_plan_mismatch");return V(e,o)}function xe(e,o){let t=Me(o.action);return Boolean(t&&e.plan.transitionClass===t&&e.plan.scaleDecisionDigest===o.decisionDigest&&e.plan.sourceTopologyDigest===o.sourceTopologyDigest&&e.plan.targetTopologyDigest===o.targetTopologyDigest&&e.plan.dailyCostCeilingEurMicros<=e.policy.dailyCostCeilingEurMicros&&e.plan.observationDigests.length===o.observationDigests.length&&e.plan.observationDigests.every((i,a)=>i===o.observationDigests[a]))}function Me(e){return e==="resize_vertical"?"vertical_resize":e==="no_change"?void 0:e}var Ae=(e)=>({status:"conflict",code:e,evidenceRefs:[]});function Q(e,o,t,i,a){let r=new Map(t.metrics.map((g)=>[g.name,g.value])),n=Boolean(i&&Date.parse(a)-Date.parse(i.decidedAt)<o.cooldownSeconds*1000),s=o.thresholds.some((g)=>(r.get(g.metric)??-1)>=g.scaleUpAt),l=o.thresholds.every((g)=>(r.get(g.metric)??Number.POSITIVE_INFINITY)<g.scaleDownBelow),c=(r.get("concurrency")??Number.POSITIVE_INFINITY)===0,m=(r.get("queue_depth")??Number.POSITIVE_INFINITY)<=o.scaleDownBacklogCeiling,w=Math.min(o.maximumReplicas,o.providerQuotaCeiling,o.tenantConcurrencyCeiling);if(!n&&s&&o.freezeMode==="unfrozen"&&o.automaticMode!=="disabled"&&e.runtimeNodeReplicas<w)return H("scale_out",e.runtimeNodeReplicas,o.maximumStep,w,"threshold-scale-up");if(!n&&l&&c&&m&&o.freezeMode!=="all_frozen"&&o.automaticMode==="bidirectional"&&e.runtimeNodeReplicas>o.minimumReplicas)return H("scale_in",e.runtimeNodeReplicas,o.maximumStep,o.minimumReplicas,"threshold-scale-down");return{action:"no_change",targetReplicas:e.runtimeNodeReplicas,reasonCodes:[n?"cooldown-active":"within-hysteresis"]}}function H(e,o,t,i,a){let n=o+(e==="scale_out"?1:-1)*t;return{action:e,targetReplicas:e==="scale_out"?Math.min(n,i):Math.max(n,i),reasonCodes:[a]}}function W(e){if(!Number.isSafeInteger(e.decisionTtlMs)||e.decisionTtlMs<1||e.decisionTtlMs>300000)throw Error("topology.scale_configuration_invalid");return Object.freeze({clock:Object.freeze({now:e.clock.now.bind(e.clock)}),policyVerifier:Object.freeze({verify:e.policyVerifier.verify.bind(e.policyVerifier)}),targets:Object.freeze({resolve:e.targets.resolve.bind(e.targets)}),history:Object.freeze({getLatest:e.history.getLatest.bind(e.history),recordIfLatest:e.history.recordIfLatest.bind(e.history)}),decisionTtlMs:e.decisionTtlMs})}function U(e){if(!/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$/.test(e)||new Date(e).toISOString()!==e)throw Error("invalid clock");return e}import{digestScaleDecisionV1 as Oe}from"@lssm-tech/lib.lssm-os-spec/runtime-topology";function X(e,o,t){return{decisionId:`no-change-${t.observationId}`,targetTopologyDigest:e.profileDigest,estimatedDailyCostEurMicros:0,signatureRef:o.signatureRef}}function G(e){let o={contractVersion:"1.0.0",scope:e.policy.scope,decisionId:e.target.decisionId,policyDigest:e.policy.policyDigest,observationDigests:[e.observation.observationDigest],sourceTopologyDigest:e.profile.profileDigest,targetTopologyDigest:e.target.targetTopologyDigest,action:e.action,targetReplicas:e.targetReplicas,estimatedDailyCostEurMicros:e.target.estimatedDailyCostEurMicros,reasonCodes:[...e.reasonCodes].sort(),authorityRef:e.policy.authorityRef,signatureRef:e.target.signatureRef,decidedAt:e.decidedAt,expiresAt:e.expiresAt,decisionDigest:e.profile.profileDigest};return{...o,decisionDigest:Oe(o)}}var C=(e,o)=>({status:"ok",value:{binding:e,value:o}}),J=(e,o)=>({status:"already_applied",value:{binding:e,value:o}}),f=(e)=>({status:"conflict",code:e,evidenceRefs:[]}),ee=(e)=>({status:"unavailable",code:e,evidenceRefs:[]});var S=(e,o)=>e.scope.tenantId===o.tenantId&&e.scope.workspaceId===o.workspaceId&&e.scope.environmentId===o.environmentId&&e.scope.productId===o.productId&&e.scope.applicationId===o.applicationId;function oe(e,o,t){let i=Date.parse(t),a=Date.parse(e.observedAt);return e.observedAt===e.windowEndedAt&&a<=i&&i-a<=o.sampleWindowSeconds*1000}import{CapacityObservationV1Schema as ze,hasValidCapacityObservationV1Digest as Ee,hasValidRuntimeTopologyProfileV1Digest as Be,hasValidScaleDecisionV1Digest as je,hasValidScalePolicyV1Digest as Ne,RuntimeTopologyProfileV1Schema as $e,ScaleDecisionV1Schema as Le,ScalePolicyV1Schema as Fe,validateScalePolicyV1 as qe}from"@lssm-tech/lib.lssm-os-spec/runtime-topology";function te(e,o,t,i){let a=$e.safeParse(o),r=Fe.safeParse(t);if(!a.success||!r.success||o.profileDigest!==e.topologyDigest||!t.allowedTargetKinds.includes(o.topologyKind)||t.sourceTopologyDigest!==e.topologyDigest||!S(o,e)||!S(t,e)||!Ne(t)||!Be(o)||qe(t).length>0||i.length!==1)return!1;let n=i[0];if(!ze.safeParse(n).success)return!1;return S(n,e)&&n.topologyDigest===e.topologyDigest&&Ee(n)&&Date.parse(n.windowEndedAt)-Date.parse(n.windowStartedAt)>=Math.max(t.sampleWindowSeconds,t.minimumStableSeconds)*1000}function ie(e,o,t){let i=Le.safeParse(e);if(!i.success||!je(i.data)||!S(i.data,o)||i.data.policyDigest!==t.policyDigest||i.data.sourceTopologyDigest!==o.topologyDigest)return;return Object.freeze(structuredClone(i.data))}function ae(e,o,t){if(!e||typeof e!=="object"||Array.isArray(e))return;if(Reflect.ownKeys(e).sort().join(",")!=="decisionId,estimatedDailyCostEurMicros,signatureRef,targetTopologyDigest")return;let i=structuredClone(e);if(/^[A-Za-z0-9][A-Za-z0-9_.:-]{0,127}$/.test(i.decisionId)&&/^sha256:[a-f0-9]{64}$/.test(i.targetTopologyDigest)&&Number.isSafeInteger(i.estimatedDailyCostEurMicros)&&i.estimatedDailyCostEurMicros>=0&&i.estimatedDailyCostEurMicros<=o.dailyCostCeilingEurMicros&&/^[A-Za-z0-9][A-Za-z0-9_.:-]{0,127}$/.test(i.signatureRef)&&(t==="no_change"||o.reversibleTransitionDigests.includes(i.targetTopologyDigest)))return Object.freeze(i)}function No(e){let o=W(e);return Object.freeze({evaluate:(t)=>Ke(o,t)})}async function Ke(e,o){try{if(o=structuredClone(o),!te(o,o.profile,o.policy,o.observations))return f("topology.scale_input_untrusted");let t=o.observations[0],i=U(e.clock.now());if(!oe(t,o.policy,i))return f("topology.scale_observation_stale");if(await e.policyVerifier.verify(structuredClone(o.policy))!==!0)return f("topology.scale_policy_untrusted");let a=await e.history.getLatest({binding:o,policyDigest:o.policy.policyDigest}),r=a?ie(a,o,o.policy):void 0;if(a&&(!r||Date.parse(r.decidedAt)>Date.parse(i)))return f("topology.scale_history_untrusted");let n=Q(o.profile,o.policy,t,r,i),s=n.action==="no_change"?X(o.profile,o.policy,t):await e.targets.resolve({binding:o,profile:o.profile,policy:o.policy,observation:t,action:n.action,targetReplicas:n.targetReplicas,decidedAt:i}),l=ae(s,o.policy,n.action);if(!l)return f("topology.scale_target_untrusted");let c=G({profile:o.profile,policy:o.policy,observation:t,...n,target:l,decidedAt:i,expiresAt:new Date(Date.parse(i)+e.decisionTtlMs).toISOString()});if(n.action==="no_change")return C(o,c);if(await e.history.recordIfLatest({binding:o,policyDigest:o.policy.policyDigest,expectedDecisionDigest:r?.decisionDigest,decision:c}))return C(o,c);let m=await e.history.getLatest({binding:o,policyDigest:o.policy.policyDigest});return m?.decisionDigest===c.decisionDigest?J(o,m):f("topology.scale_decision_race")}catch{return ee("topology.scale_dependency_unavailable")}}class Ye{dependencies;constructor(e){this.dependencies=e;if(!Number.isFinite(e.timeoutMs)||e.timeoutMs<=0)throw Error("Topology controller timeout must be positive.")}async evaluateScale(e){return D(this.dependencies,e)}async proposeScaleTransition(e){return Y(this.dependencies,e)}async recordObserved(e){return V(this.dependencies,e)}async recordObservedProfileTransition(e){if(P({plan:e.plan,source:e.sourceProfile,target:e.targetProfile}).length>0)return d("topology.invalid_transition_recipe");return V(this.dependencies,e)}async compareAndSetState(e){return N(this.dependencies,e)}async authorizeTransition(e){if(!u(e.plan,e.binding))return d("topology.invalid_plan");let o=await T(this.dependencies.topologyState,this.dependencies.timeoutMs,e.binding,e.plan);if(o.status!=="ok"&&o.status!=="already_applied")return o;if(o.value.value.state!=="simulated")return d("topology.state_conflict");let t=await x(this.dependencies,e,o.value.value);if(t.status!=="ok")return t;return y(()=>this.dependencies.topologyState.compareAndSetTransition({...e.binding,expectedState:"simulated",receipt:t.value}),this.dependencies.timeoutMs,e.binding,e.plan)}async recordVerifiedDisposition(e){if(!u(e.plan,e.binding)||!p(e.receipt,e.binding,e.plan))return d("topology.invalid_disposition");let o=await T(this.dependencies.topologyState,this.dependencies.timeoutMs,e.binding,e.plan);if(o.status!=="ok"&&o.status!=="already_applied")return o;if(o.value.value.state!==e.expectedState)return d("topology.state_conflict");let t=await L(this.dependencies,e,o.value.value);if(!t)return d("topology.disposition_unverified");return y(()=>this.dependencies.topologyState.compareAndSetTransition({...e.binding,expectedState:e.expectedState,receipt:t}),this.dependencies.timeoutMs,e.binding,e.plan)}async executeAuthorizedStep(e){if(!u(e.plan,e.binding))return d("topology.invalid_plan");let o=e.plan.steps.find((n)=>n.stepId===e.stepId);if(!o)return d("topology.step_not_found");let t=await T(this.dependencies.topologyState,this.dependencies.timeoutMs,e.binding,e.plan);if(t.status!=="ok"&&t.status!=="already_applied")return t;if(!z(t.value.value,o.stepId,o.prerequisiteStepIds))return d("topology.step_not_ready");let i=await Ze({clock:this.dependencies.clock,operations:this.dependencies.operations,connectVerifier:this.dependencies.connectVerifier,qualificationAuthority:this.dependencies.qualificationAuthority,executor:this.dependencies.executor,timeoutMs:this.dependencies.timeoutMs},e);if(i.status!=="ok"&&i.status!=="already_applied")return i;if(!O(t.value.value,i.value.value,e.plan,e.stepId)){let n=await I(this.dependencies,e,i.value.value.receiptId);return k(n?"topology.invalid_effect_receipt":"topology.effect_custody_unconfirmed",[i.value.value.receiptId])}let a=await y(()=>this.dependencies.topologyState.compareAndSetTransition({...e.binding,expectedState:t.value.value.state,receipt:i.value.value}),this.dependencies.timeoutMs,e.binding,e.plan);if(a.status==="ok"||a.status==="already_applied")return a;return await I(this.dependencies,e,i.value.value.receiptId)?k("topology.effect_persist_unconfirmed",[i.value.value.receiptId]):k("topology.effect_custody_unconfirmed",[i.value.value.receiptId])}}var d=(e)=>({status:"conflict",code:e,evidenceRefs:[]}),k=(e,o=[])=>({status:"indeterminate",code:e,evidenceRefs:o});export{Ye as LssmOsTopologyControllerV1,No as createDeterministicScalePlannerV1,P as validateTopologyTransitionRecipeV1};
|
|
File without changes
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
class n{controlPlane;workOrders;constructor(e,r){this.controlPlane=e;this.workOrders=r}async runNext(e){let r=await this.workOrders.claim({scope:e.scope,holderId:e.holderId,now:e.now,ttlMs:e.leaseTtlMs});if(!r)return;let o="failed";try{let t=await this.controlPlane.apply({scope:e.scope,planId:r.workOrder.planId,planDigest:r.workOrder.planDigest,authorizationRef:r.workOrder.authorizationRef,executionId:r.workOrder.executionId,idempotencyKey:r.workOrder.idempotencyKey,holderId:e.holderId,leaseTtlMs:e.leaseTtlMs});o=d(t.status)}catch{o="indeterminate"}return await this.workOrders.complete({scope:e.scope,workOrderId:r.workOrder.id,holderId:r.holderId,fencingToken:r.fencingToken,executionStatus:o}),this.workOrders.get(e.scope,r.workOrder.id)}}function d(e){if(e==="failed"||e==="succeeded"||e==="rolled_back"||e==="indeterminate")return e;return"indeterminate"}export{n as LssmOsControlPlaneWorker};
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { ConnectRuntimeV3AuthorityPort } from '@lssm-tech/lib.contractspec-connect/runtime-v3';
|
|
2
|
+
import type { DurableQueuePortV2, LssmOsOperationStatePort, QualificationAuthorityOrderReadPortV3 } from '@lssm-tech/lib.lssm-os-runtime/runtime-node';
|
|
3
|
+
import { type BuilderCandidateOperationBinding } from './builder-candidate-operation.js';
|
|
4
|
+
export interface BuilderCandidateAdmissionPorts {
|
|
5
|
+
readonly operations: LssmOsOperationStatePort;
|
|
6
|
+
readonly orders: QualificationAuthorityOrderReadPortV3;
|
|
7
|
+
readonly connect: Pick<ConnectRuntimeV3AuthorityPort, 'verifyAdmission'>;
|
|
8
|
+
readonly queue: Pick<DurableQueuePortV2, 'admit'>;
|
|
9
|
+
readonly clock: {
|
|
10
|
+
now(): string;
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
/** Resume admission of an already-issued operation. This is deliberately not pristine co-atomic admission.
|
|
14
|
+
* A crash after the queued CAS leaves a retryable operation; replay uses the exact immutable envelope.
|
|
15
|
+
* Provider execution remains exclusively owned by Agent Host and its dispatch authority.
|
|
16
|
+
*/
|
|
17
|
+
export declare function admitBuilderCandidateOperation(input: {
|
|
18
|
+
readonly candidate: BuilderCandidateOperationBinding;
|
|
19
|
+
readonly admission: Parameters<DurableQueuePortV2['admit']>[0];
|
|
20
|
+
readonly signal: AbortSignal;
|
|
21
|
+
}, ports: BuilderCandidateAdmissionPorts): Promise<import("@lssm-tech/lib.builder-spec").BuilderCandidateState | {
|
|
22
|
+
workspaceId: string;
|
|
23
|
+
planRef: {
|
|
24
|
+
id: string;
|
|
25
|
+
digest: string;
|
|
26
|
+
};
|
|
27
|
+
status: 'indeterminate';
|
|
28
|
+
availableActions: readonly ['execute', 'status'];
|
|
29
|
+
reasonCodes: string[];
|
|
30
|
+
}>;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { BuilderCandidateState } from '@lssm-tech/lib.builder-spec';
|
|
2
|
+
import type { BuilderCandidateHostOptions } from './builder-candidate-host-types.js';
|
|
3
|
+
import type { BuilderCandidateOperationBinding } from './builder-candidate-operation.js';
|
|
4
|
+
/** A terminal state, persisted provider evidence and retained bytes must all identify the same candidate. */
|
|
5
|
+
export declare function verifyBuilderCandidateArtifacts(input: {
|
|
6
|
+
readonly candidate: BuilderCandidateOperationBinding;
|
|
7
|
+
readonly state: BuilderCandidateState;
|
|
8
|
+
readonly baseRevision: string;
|
|
9
|
+
readonly signal: AbortSignal;
|
|
10
|
+
}, ports: Pick<BuilderCandidateHostOptions, 'orders' | 'providerReceipts' | 'artifacts'> & {
|
|
11
|
+
operations: Pick<BuilderCandidateHostOptions['operations'], 'getReceipt'>;
|
|
12
|
+
}): Promise<BuilderCandidateState>;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { BuilderCandidateServiceInput } from '@lssm-tech/lib.builder-runtime';
|
|
2
|
+
import type { BuilderRetainedPatchArtifactReadPort } from '@lssm-tech/lib.builder-runtime/production';
|
|
3
|
+
import type { BuilderCandidateAction } from '@lssm-tech/lib.builder-spec';
|
|
4
|
+
import type { QueueDigestRefV1 } from '@lssm-tech/lib.contracts-spec/jobs/durable-queue-v2';
|
|
5
|
+
import type { ConnectRuntimeV3AuthorityPort, ConnectRuntimeV3IssuanceInputV1 } from '@lssm-tech/lib.contractspec-connect/runtime-v3';
|
|
6
|
+
import type { DurableQueuePortV2, QualificationAuthorityStatePortV2, RuntimeV3ProviderReceiptPortV1 } from '@lssm-tech/lib.lssm-os-runtime/runtime-node';
|
|
7
|
+
import type { BuilderCandidateAdmissionPorts } from './builder-candidate-admission.js';
|
|
8
|
+
/** Immutable server project profile resolved under the current member policy. Never accept it from a request body. */
|
|
9
|
+
export interface BuilderCandidateHostTarget {
|
|
10
|
+
readonly profileRef: QueueDigestRefV1;
|
|
11
|
+
readonly allowedActions: readonly BuilderCandidateAction[];
|
|
12
|
+
readonly issuance: ConnectRuntimeV3IssuanceInputV1;
|
|
13
|
+
}
|
|
14
|
+
export interface BuilderCandidateHostOptions extends Omit<BuilderCandidateAdmissionPorts, 'connect' | 'queue'> {
|
|
15
|
+
readonly connect: ConnectRuntimeV3AuthorityPort;
|
|
16
|
+
readonly queue: Pick<DurableQueuePortV2, 'admit' | 'reconcile'>;
|
|
17
|
+
readonly artifacts: BuilderRetainedPatchArtifactReadPort;
|
|
18
|
+
readonly authority: Pick<QualificationAuthorityStatePortV2, 'issueCanaryLifecycle'>;
|
|
19
|
+
readonly providerReceipts: Pick<RuntimeV3ProviderReceiptPortV1, 'getForStep'>;
|
|
20
|
+
readonly targets: {
|
|
21
|
+
resolve(input: BuilderCandidateServiceInput, action: BuilderCandidateAction): Promise<BuilderCandidateHostTarget | undefined>;
|
|
22
|
+
/** Deterministic reconstruction from the persisted issued order; never a new envelope on retry. */
|
|
23
|
+
admission(target: BuilderCandidateHostTarget, order: Awaited<ReturnType<BuilderCandidateHostOptions['orders']['getStandardOrderForOperation']>> & {}): Parameters<DurableQueuePortV2['admit']>[0];
|
|
24
|
+
};
|
|
25
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { BuilderCandidateService, BuilderCandidateServiceInput } from '@lssm-tech/lib.builder-runtime';
|
|
2
|
+
import type { BuilderCandidateState } from '@lssm-tech/lib.builder-spec';
|
|
3
|
+
import type { BuilderCandidateHostOptions } from './builder-candidate-host-types.js';
|
|
4
|
+
/** Concrete canonical-state orchestration; Connect issues authority and Agent Host owns provider effects. */
|
|
5
|
+
export declare class BuilderCandidateHost implements BuilderCandidateService {
|
|
6
|
+
private readonly options;
|
|
7
|
+
constructor(options: BuilderCandidateHostOptions);
|
|
8
|
+
prepare(input: BuilderCandidateServiceInput): Promise<BuilderCandidateState>;
|
|
9
|
+
approve(input: BuilderCandidateServiceInput): Promise<BuilderCandidateState>;
|
|
10
|
+
execute(input: BuilderCandidateServiceInput): Promise<BuilderCandidateState>;
|
|
11
|
+
status(input: BuilderCandidateServiceInput): Promise<BuilderCandidateState>;
|
|
12
|
+
private run;
|
|
13
|
+
private revalidate;
|
|
14
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { BuilderCandidateState } from '@lssm-tech/lib.builder-spec';
|
|
2
|
+
import type { QueueDigestRefV1 } from '@lssm-tech/lib.contracts-spec/jobs/durable-queue-v2';
|
|
3
|
+
import { type Sha256Digest } from '@lssm-tech/lib.lssm-os-runtime';
|
|
4
|
+
import { type LssmOsOperationStatePort } from '@lssm-tech/lib.lssm-os-runtime/runtime-node';
|
|
5
|
+
/** Host-owned binding to one accepted request; never deserialize this from member input. */
|
|
6
|
+
export interface BuilderCandidateOperationBinding {
|
|
7
|
+
readonly workspaceId: string;
|
|
8
|
+
readonly planRef: QueueDigestRefV1;
|
|
9
|
+
readonly operation: {
|
|
10
|
+
readonly tenantId: string;
|
|
11
|
+
readonly workspaceId: string;
|
|
12
|
+
readonly environmentId: string;
|
|
13
|
+
readonly operationId: string;
|
|
14
|
+
readonly requestDigest: Sha256Digest;
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
/** Read canonical state and terminal evidence without turning an acknowledgement into completion. */
|
|
18
|
+
export declare function readBuilderCandidateOperation(binding: BuilderCandidateOperationBinding, operations: Pick<LssmOsOperationStatePort, 'get' | 'listReceipts'>): Promise<BuilderCandidateState>;
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { DurableQueuePortV2 } from '@lssm-tech/lib.lssm-os-runtime/runtime-node';
|
|
2
|
+
/** Admission and subsequent reads apply the same exact immutable evidence checks. */
|
|
3
|
+
export declare function isBuilderCandidateQueueAdmission(result: Awaited<ReturnType<DurableQueuePortV2['admit']>>, admission: Parameters<DurableQueuePortV2['admit']>[0]): boolean;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { BuilderPlatformRef, PlatformHandoffPacket } from '@lssm-tech/lib.builder-spec';
|
|
2
|
+
import { type RuntimePlanV1 } from '@lssm-tech/lib.lssm-os-runtime';
|
|
3
|
+
import type { BuilderHandoffAcceptanceV1 } from './types.js';
|
|
4
|
+
/** Consume a Builder plan-only packet without treating it as apply authority. */
|
|
5
|
+
export declare function acceptBuilderHandoff(input: {
|
|
6
|
+
readonly packet: PlatformHandoffPacket;
|
|
7
|
+
readonly expectedPacketDigest: string;
|
|
8
|
+
readonly runtimePlan?: RuntimePlanV1;
|
|
9
|
+
readonly consumer: string;
|
|
10
|
+
readonly receivedAt: string;
|
|
11
|
+
readonly evidenceRefs?: readonly BuilderPlatformRef[];
|
|
12
|
+
}): BuilderHandoffAcceptanceV1;
|
|
13
|
+
export declare function digestBuilderHandoffPacket(packet: Omit<PlatformHandoffPacket, 'digest'> | PlatformHandoffPacket): string;
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
import{builderPlatformDigest as i,builderPlatformId as n}from"@lssm-tech/lib.builder-runtime/planning";import{validatePlatformHandoffPacket as s}from"@lssm-tech/lib.builder-spec";import{digestCanonical as o}from"@lssm-tech/lib.lssm-os-runtime";function y(e){let c=s(e.packet),t=e.packet.digest===e.expectedPacketDigest&&(e.packet.digest===l(e.packet)&&e.packet.id===n("platform-handoff",P(e.packet))||e.packet.digest===m(e.packet)),a=!e.runtimePlan||e.packet.planPreview.planDigest===e.runtimePlan.digest,d=c.length>0?"rejected":t&&a?"accepted_for_review":"stale",r={packetId:e.packet.id,packetDigest:e.packet.digest,consumer:e.consumer,status:d},f={id:`handoff-receipt:${o(r).slice(7,23)}`,packetRef:{id:e.packet.id,kind:"handoff",version:e.packet.version,digest:e.packet.digest},packetDigest:e.packet.digest,status:d,consumer:e.consumer,connectReviewRef:e.packet.authorityBoundary.connectReviewRef,evidenceRefs:e.evidenceRefs??[],receivedAt:e.receivedAt};return{packet:e.packet,receipt:f,...d==="accepted_for_review"&&e.runtimePlan?{acceptedPlanId:e.runtimePlan.id}:{}}}function l(e){let{id:c,digest:t,...a}=e;return i(a)}function m(e){let{digest:c,...t}=e;return o(t)}function P(e){let{id:c,digest:t,...a}=e;return a}export{y as acceptBuilderHandoff,l as digestBuilderHandoffPacket};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { BuilderGovernedPatchRunInput, BuilderGovernedPatchRunOutput } from '@lssm-tech/lib.builder-runtime/production';
|
|
2
|
+
import { type QueueDigestRefV1 } from '@lssm-tech/lib.contracts-spec/jobs/durable-queue-v2';
|
|
3
|
+
import { type ProviderStepExecutionV2, type RuntimeScopeV1, type Sha256Digest } from '@lssm-tech/lib.lssm-os-runtime';
|
|
4
|
+
export interface BuilderRuntimePatchPayload {
|
|
5
|
+
/** Reviewed Builder plan identity, distinct from Connect and delivery packet identities.
|
|
6
|
+
* Omitted legacy payloads retain their delivery-plan binding.
|
|
7
|
+
*/
|
|
8
|
+
readonly builderPlanRef?: QueueDigestRefV1;
|
|
9
|
+
readonly scope: RuntimeScopeV1;
|
|
10
|
+
readonly input: BuilderGovernedPatchRunInput;
|
|
11
|
+
}
|
|
12
|
+
/** Runtime-owned claim fencing stays held across the delegated effect. */
|
|
13
|
+
export interface BuilderRuntimeExecutionPorts {
|
|
14
|
+
loadApprovedInput(digest: Sha256Digest): Promise<BuilderRuntimePatchPayload | undefined>;
|
|
15
|
+
withActiveClaim<T>(execution: ProviderStepExecutionV2, run: () => Promise<T>): Promise<T>;
|
|
16
|
+
runPatch(input: BuilderGovernedPatchRunInput): Promise<BuilderGovernedPatchRunOutput>;
|
|
17
|
+
}
|
|
18
|
+
/** Bind a Runtime Node apply step to an existing governed Builder patch run. */
|
|
19
|
+
export declare function executeBuilderRuntimePatch(execution: ProviderStepExecutionV2, ports: BuilderRuntimeExecutionPorts): Promise<BuilderGovernedPatchRunOutput>;
|
|
20
|
+
export declare function withBuilderRuntimePatchInput<T>(execution: ProviderStepExecutionV2, ports: BuilderRuntimeExecutionPorts, run: (input: BuilderGovernedPatchRunInput) => Promise<T>): Promise<T>;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { BuilderGovernedPatchRunOutput } from '@lssm-tech/lib.builder-runtime/production';
|
|
2
|
+
import { type ProviderBindingV2, type ProviderLifecyclePortV1, type ProviderStepExecutionV2, type ProviderStepReceiptV2 } from '@lssm-tech/lib.lssm-os-runtime';
|
|
3
|
+
import { type BuilderRuntimeExecutionPorts } from './builder-runtime-execution.js';
|
|
4
|
+
/** Host receipt writer must durably store evidence before returning its attestation. */
|
|
5
|
+
export interface BuilderRuntimeProviderPorts extends BuilderRuntimeExecutionPorts {
|
|
6
|
+
persistResult(execution: ProviderStepExecutionV2, result: BuilderGovernedPatchRunOutput): Promise<ProviderStepReceiptV2>;
|
|
7
|
+
findPersistedResult(execution: ProviderStepExecutionV2): Promise<ProviderStepReceiptV2 | undefined>;
|
|
8
|
+
verifyPersistedReceipt(receipt: ProviderStepReceiptV2): Promise<boolean>;
|
|
9
|
+
}
|
|
10
|
+
/** Apply-only Builder lifecycle adapter for the existing exact provider router. */
|
|
11
|
+
export declare function createBuilderRuntimeProvider(binding: ProviderBindingV2, ports: BuilderRuntimeProviderPorts): ProviderLifecyclePortV1;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { BuilderGovernedPatchRunOutput } from '@lssm-tech/lib.builder-runtime/production';
|
|
2
|
+
import { type ProviderStepExecutionV2, type ProviderStepReceiptV2, type RuntimeWorkOrderReceiptPort } from '@lssm-tech/lib.lssm-os-runtime';
|
|
3
|
+
/** Reuse the Runtime Node store's atomic, scoped append and authority verification. */
|
|
4
|
+
export declare function createBuilderRuntimeReceiptWriter(store: RuntimeWorkOrderReceiptPort, now: () => string): {
|
|
5
|
+
findPersistedResult: (execution: ProviderStepExecutionV2) => Promise<ProviderStepReceiptV2 | undefined>;
|
|
6
|
+
verifyPersistedReceipt: (receipt: ProviderStepReceiptV2) => Promise<boolean>;
|
|
7
|
+
persistResult(execution: ProviderStepExecutionV2, result: BuilderGovernedPatchRunOutput): Promise<ProviderStepReceiptV2>;
|
|
8
|
+
};
|
|
9
|
+
/** Construct receipt data only; durable V2/V3 authority must independently accept it.
|
|
10
|
+
* A required QA failure is a failed provider result; retained artifacts do not override it.
|
|
11
|
+
*/
|
|
12
|
+
export declare function createBuilderProviderReceipt(execution: ProviderStepExecutionV2, recordedAt: string, result: BuilderGovernedPatchRunOutput): ProviderStepReceiptV2;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { ConnectAuthorityPort, ConnectAuthorizationEnvelopeV1, ConnectAuthorizationRefV1, ConnectDecisionVerifierPort, RuntimePlanV1, RuntimeScopeV1 } from '@lssm-tech/lib.lssm-os-runtime';
|
|
2
|
+
import type { ControlPlaneWorkOrderPort } from './ports.js';
|
|
3
|
+
import type { ClaimedWorkOrderV1, ScheduledWorkOrderV1 } from './types.js';
|
|
4
|
+
/** Reads pre-issued Connect decisions; it cannot create new authorization. */
|
|
5
|
+
export declare class InMemoryConnectDecisionReader implements ConnectAuthorityPort, ConnectDecisionVerifierPort {
|
|
6
|
+
private readonly decisions;
|
|
7
|
+
constructor(decisions: readonly ConnectAuthorizationEnvelopeV1[]);
|
|
8
|
+
authorize(input: {
|
|
9
|
+
plan: RuntimePlanV1;
|
|
10
|
+
actorRef: string;
|
|
11
|
+
requestedAt: string;
|
|
12
|
+
}): Promise<ConnectAuthorizationRefV1>;
|
|
13
|
+
verify(input: {
|
|
14
|
+
reference: ConnectAuthorizationRefV1;
|
|
15
|
+
plan: RuntimePlanV1;
|
|
16
|
+
verifiedAt: string;
|
|
17
|
+
}): Promise<ConnectAuthorizationEnvelopeV1 | undefined>;
|
|
18
|
+
}
|
|
19
|
+
export declare class InMemoryControlPlaneWorkOrderAdapter implements ControlPlaneWorkOrderPort {
|
|
20
|
+
private readonly records;
|
|
21
|
+
private readonly tokens;
|
|
22
|
+
private readonly admissions;
|
|
23
|
+
enqueue(workOrder: ScheduledWorkOrderV1): Promise<void>;
|
|
24
|
+
claim(input: {
|
|
25
|
+
scope: RuntimeScopeV1;
|
|
26
|
+
holderId: string;
|
|
27
|
+
now: string;
|
|
28
|
+
ttlMs: number;
|
|
29
|
+
}): Promise<ClaimedWorkOrderV1 | undefined>;
|
|
30
|
+
complete(input: {
|
|
31
|
+
scope: RuntimeScopeV1;
|
|
32
|
+
workOrderId: string;
|
|
33
|
+
holderId: string;
|
|
34
|
+
fencingToken: number;
|
|
35
|
+
executionStatus: 'succeeded' | 'failed' | 'rolled_back' | 'indeterminate';
|
|
36
|
+
}): Promise<ScheduledWorkOrderV1>;
|
|
37
|
+
retry(input: {
|
|
38
|
+
scope: RuntimeScopeV1;
|
|
39
|
+
workOrderId: string;
|
|
40
|
+
holderId: string;
|
|
41
|
+
fencingToken: number;
|
|
42
|
+
nextAttemptAt: string;
|
|
43
|
+
}): Promise<ScheduledWorkOrderV1>;
|
|
44
|
+
get(scope: RuntimeScopeV1, workOrderId: string): Promise<ScheduledWorkOrderV1 | undefined>;
|
|
45
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
import{digestConnectAuthorization as a}from"@lssm-tech/lib.lssm-os-runtime";class c{decisions;constructor(e){this.decisions=e}async authorize(e){let t=this.decisions.find((n)=>n.planId===e.plan.id&&n.planDigest===e.plan.digest&&n.actorRef===e.actorRef);if(!t)throw Error("No exact Connect decision is available.");return{decisionId:t.decisionId,attestationDigest:t.attestationDigest}}async verify(e){let t=this.decisions.find((n)=>n.decisionId===e.reference.decisionId&&n.attestationDigest===e.reference.attestationDigest&&n.planId===e.plan.id&&n.planDigest===e.plan.digest);if(!t||a(t)!==t.attestationDigest)return;return t}}class l{records=new Map;tokens=new Map;admissions=new Map;async enqueue(e){let t=`${o(e)}/${e.id}`,n=JSON.stringify([e.contractVersion,e.planId,e.planDigest,e.authorizationRef.decisionId,e.authorizationRef.attestationDigest,e.executionId,e.idempotencyKey,e.maxAttempts]);if(this.admissions.has(t)){if(this.admissions.get(t)!==n)throw Error("Conflicting work-order admission.");return}if(e.status!=="queued"||e.attempts!==0||e.lease||!Number.isSafeInteger(e.maxAttempts)||e.maxAttempts<1)throw Error("Invalid initial work-order state.");this.admissions.set(t,n),this.records.set(t,structuredClone(e))}async claim(e){let t=[...this.records.values()].filter((r)=>u(r,e.scope)&&r.attempts<r.maxAttempts).filter((r)=>r.status==="queued"||r.status==="retry_wait"&&Date.parse(r.nextAttemptAt??e.now)<=Date.parse(e.now)||r.status==="leased"&&Date.parse(r.lease?.expiresAt??e.now)<=Date.parse(e.now)).sort((r,d)=>r.id<d.id?-1:r.id>d.id?1:0)[0];if(!t)return;let n=`${o(t)}/${t.id}`,s=(this.tokens.get(n)??0)+1,i={...t,status:"leased",attempts:t.attempts+1,lease:{holderId:e.holderId,fencingToken:s,expiresAt:new Date(Date.parse(e.now)+e.ttlMs).toISOString()}};return this.tokens.set(n,s),this.records.set(n,i),{workOrder:structuredClone(i),holderId:e.holderId,fencingToken:s}}async complete(e){let t=`${o(e.scope)}/${e.workOrderId}`,n=this.records.get(t);if(n?.status!=="leased"||!n.lease||n.lease.holderId!==e.holderId||n.lease.fencingToken!==e.fencingToken)throw Error("Work-order claim was superseded.");let s={...n,status:e.executionStatus==="succeeded"?"completed":e.executionStatus==="indeterminate"?"indeterminate":"failed",executionStatus:e.executionStatus};return this.records.set(t,s),structuredClone(s)}async retry(e){let t=`${o(e.scope)}/${e.workOrderId}`,n=this.records.get(t);if(n?.status!=="leased"||!n.lease||n.lease.holderId!==e.holderId||n.lease.fencingToken!==e.fencingToken)throw Error("Work-order claim was superseded.");let{lease:s,...i}=n,r={...i,status:"retry_wait",nextAttemptAt:e.nextAttemptAt};return this.records.set(t,r),structuredClone(r)}async get(e,t){let n=this.records.get(`${o(e)}/${t}`);return n?structuredClone(n):void 0}}function u(e,t){return e.tenantId===t.tenantId&&e.workspaceId===t.workspaceId&&e.environmentId===t.environmentId}function o(e){return JSON.stringify([e.tenantId,e.workspaceId,e.environmentId])}export{c as InMemoryConnectDecisionReader,l as InMemoryControlPlaneWorkOrderAdapter};
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export * from './application.js';
|
|
2
|
+
export { BuilderCandidateHost } from './builder-candidate-host.js';
|
|
3
|
+
export type { BuilderCandidateHostOptions, BuilderCandidateHostTarget, } from './builder-candidate-host-types.js';
|
|
4
|
+
export * from './builder-handoff.js';
|
|
5
|
+
export type { BuilderRuntimePatchPayload } from './builder-runtime-execution.js';
|
|
6
|
+
export { type BuilderRuntimeProviderPorts, createBuilderRuntimeProvider, } from './builder-runtime-provider.js';
|
|
7
|
+
export { createBuilderProviderReceipt, createBuilderRuntimeReceiptWriter, } from './builder-runtime-receipt-writer.js';
|
|
8
|
+
export * from './in-memory.js';
|
|
9
|
+
export * from './lssm-os-control-plane.feature.js';
|
|
10
|
+
export * from './ports.js';
|
|
11
|
+
export * from './runtime-node-worker.js';
|
|
12
|
+
export * from './runtime-node-worker-types.js';
|
|
13
|
+
export * from './topology-controller.js';
|
|
14
|
+
export * from './topology-controller-recipe.js';
|
|
15
|
+
export * from './topology-controller-types.js';
|
|
16
|
+
export * from './topology-controller-v2.js';
|
|
17
|
+
export * from './types.js';
|
|
18
|
+
export * from './worker.js';
|