@lssm-tech/module.lssm-os-control-plane 2.1.2 → 2.1.3
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
package/dist/index.js
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
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};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export declare const LssmOsControlPlaneFeature: import("@lssm-tech/lib.contracts-spec").FeatureModuleSpec;
|
|
2
|
+
export declare const LssmOsControlPlaneFeatureDoc: {
|
|
3
|
+
readonly id: 'modules.lssm-os-control-plane.feature';
|
|
4
|
+
readonly title: 'LSSM OS control-plane application services';
|
|
5
|
+
readonly body: string;
|
|
6
|
+
readonly kind: 'reference';
|
|
7
|
+
readonly route: '/modules/lssm-os-control-plane';
|
|
8
|
+
readonly visibility: 'public';
|
|
9
|
+
readonly version: '1.0.0';
|
|
10
|
+
readonly owners: ["@contractspec-core"];
|
|
11
|
+
readonly relatedSpecs: ["lssm-os.control-plane.*@1.0.0"];
|
|
12
|
+
};
|
|
@@ -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};
|
package/dist/ports.d.ts
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { RuntimeScopeV1 } from '@lssm-tech/lib.lssm-os-runtime';
|
|
2
|
+
import type { ClaimedWorkOrderV1, ScheduledWorkOrderV1 } from './types.js';
|
|
3
|
+
/** Queue owns its records. Exact admission retries preserve original identity;
|
|
4
|
+
* conflicting authorization/execution reuse fails. Only an active fenced claim
|
|
5
|
+
* may complete or retry, and scope tuples must remain unambiguous.
|
|
6
|
+
*/
|
|
7
|
+
export interface ControlPlaneWorkOrderPort {
|
|
8
|
+
enqueue(workOrder: ScheduledWorkOrderV1): Promise<void>;
|
|
9
|
+
claim(input: {
|
|
10
|
+
readonly scope: RuntimeScopeV1;
|
|
11
|
+
readonly holderId: string;
|
|
12
|
+
readonly now: string;
|
|
13
|
+
readonly ttlMs: number;
|
|
14
|
+
}): Promise<ClaimedWorkOrderV1 | undefined>;
|
|
15
|
+
complete(input: {
|
|
16
|
+
readonly scope: RuntimeScopeV1;
|
|
17
|
+
readonly workOrderId: string;
|
|
18
|
+
readonly holderId: string;
|
|
19
|
+
readonly fencingToken: number;
|
|
20
|
+
readonly executionStatus: 'succeeded' | 'failed' | 'rolled_back' | 'indeterminate';
|
|
21
|
+
}): Promise<ScheduledWorkOrderV1>;
|
|
22
|
+
retry(input: {
|
|
23
|
+
readonly scope: RuntimeScopeV1;
|
|
24
|
+
readonly workOrderId: string;
|
|
25
|
+
readonly holderId: string;
|
|
26
|
+
readonly fencingToken: number;
|
|
27
|
+
readonly nextAttemptAt: string;
|
|
28
|
+
}): Promise<ScheduledWorkOrderV1>;
|
|
29
|
+
get(scope: RuntimeScopeV1, workOrderId: string): Promise<ScheduledWorkOrderV1 | undefined>;
|
|
30
|
+
}
|
package/dist/ports.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
// @bun
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { type ProviderStepReceiptV2, type RuntimeWorkOrderClaimV2, type RuntimeWorkOrderCompletionV2, type RuntimeWorkOrderPort, type SignedRuntimeWorkOrderV2 } from '@lssm-tech/lib.lssm-os-runtime';
|
|
2
|
+
import type { RuntimeNodeWorkerDeadlineV2 } from './runtime-node-worker-deadline.js';
|
|
3
|
+
import { type RuntimeNodeWorkerResultV2 } from './runtime-node-worker-types.js';
|
|
4
|
+
export declare function createWorkerCompletion(input: {
|
|
5
|
+
order: SignedRuntimeWorkOrderV2;
|
|
6
|
+
claim: RuntimeWorkOrderClaimV2;
|
|
7
|
+
receipts: readonly ProviderStepReceiptV2[];
|
|
8
|
+
completionId: string;
|
|
9
|
+
completedAt: string;
|
|
10
|
+
}): RuntimeWorkOrderCompletionV2;
|
|
11
|
+
export declare function sameCompletion(left: RuntimeWorkOrderCompletionV2, right: RuntimeWorkOrderCompletionV2): boolean;
|
|
12
|
+
export declare function persistWorkerCompletion(input: {
|
|
13
|
+
deadline: RuntimeNodeWorkerDeadlineV2;
|
|
14
|
+
workOrders: RuntimeWorkOrderPort;
|
|
15
|
+
order: SignedRuntimeWorkOrderV2;
|
|
16
|
+
claim: RuntimeWorkOrderClaimV2;
|
|
17
|
+
receipts: readonly ProviderStepReceiptV2[];
|
|
18
|
+
completionId: string;
|
|
19
|
+
completedAt: string;
|
|
20
|
+
}): Promise<RuntimeNodeWorkerResultV2>;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { RuntimeNodeWorkerSchedulerV2 } from './runtime-node-worker-types.js';
|
|
2
|
+
export type DeadlineResult<T> = {
|
|
3
|
+
readonly status: 'ok';
|
|
4
|
+
readonly value: T;
|
|
5
|
+
} | {
|
|
6
|
+
readonly status: 'failed';
|
|
7
|
+
} | {
|
|
8
|
+
readonly status: 'timeout';
|
|
9
|
+
};
|
|
10
|
+
export declare class RuntimeNodeWorkerDeadlineV2 {
|
|
11
|
+
#private;
|
|
12
|
+
private readonly scheduler;
|
|
13
|
+
constructor(scheduler: RuntimeNodeWorkerSchedulerV2, timeoutMs: number);
|
|
14
|
+
call<T>(invoke: () => Promise<T>): Promise<DeadlineResult<T>>;
|
|
15
|
+
}
|
|
16
|
+
export declare const systemRuntimeNodeWorkerSchedulerV2: RuntimeNodeWorkerSchedulerV2;
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { type ProviderStepReceiptV2, type SignedRuntimeWorkOrderV2 } from '@lssm-tech/lib.lssm-os-runtime';
|
|
2
|
+
export declare function validateDurableReceiptPrefix(input: {
|
|
3
|
+
order: SignedRuntimeWorkOrderV2;
|
|
4
|
+
receipts: readonly ProviderStepReceiptV2[];
|
|
5
|
+
}): readonly ProviderStepReceiptV2[];
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { ConnectWorkOrderVerifierPort, ProviderRouterPortV1, RuntimeClockPort, RuntimeWorkOrderClaimRequestV2, RuntimeWorkOrderClaimV2, RuntimeWorkOrderCompletionV2, RuntimeWorkOrderPort, RuntimeWorkOrderReceiptPort, SignedRuntimeWorkOrderV2 } from '@lssm-tech/lib.lssm-os-runtime';
|
|
2
|
+
export interface RuntimeNodeWorkerSchedulerV2 {
|
|
3
|
+
now(): number;
|
|
4
|
+
schedule(delayMs: number, callback: () => void): {
|
|
5
|
+
cancel(): void;
|
|
6
|
+
};
|
|
7
|
+
}
|
|
8
|
+
export interface RuntimeNodeWorkerDependenciesV2 {
|
|
9
|
+
readonly workOrders: RuntimeWorkOrderPort;
|
|
10
|
+
readonly receipts: RuntimeWorkOrderReceiptPort;
|
|
11
|
+
readonly router: ProviderRouterPortV1;
|
|
12
|
+
readonly connectVerifier: ConnectWorkOrderVerifierPort;
|
|
13
|
+
readonly clock: RuntimeClockPort;
|
|
14
|
+
readonly scheduler?: RuntimeNodeWorkerSchedulerV2;
|
|
15
|
+
}
|
|
16
|
+
export interface RuntimeNodeWorkerRequestV2 extends RuntimeWorkOrderClaimRequestV2 {
|
|
17
|
+
readonly completionId: string;
|
|
18
|
+
}
|
|
19
|
+
export type RuntimeNodeWorkerPhaseV2 = 'input' | 'connect' | 'state' | 'claim' | 'lease' | 'provider' | 'receipt' | 'completion';
|
|
20
|
+
export type RuntimeNodeWorkerResultV2 = {
|
|
21
|
+
readonly status: 'completed';
|
|
22
|
+
readonly completion: RuntimeWorkOrderCompletionV2;
|
|
23
|
+
} | {
|
|
24
|
+
readonly status: 'rejected';
|
|
25
|
+
readonly phase: RuntimeNodeWorkerPhaseV2;
|
|
26
|
+
readonly reason: string;
|
|
27
|
+
} | {
|
|
28
|
+
readonly status: 'indeterminate';
|
|
29
|
+
readonly phase: RuntimeNodeWorkerPhaseV2;
|
|
30
|
+
readonly reason: string;
|
|
31
|
+
readonly claim?: RuntimeWorkOrderClaimV2;
|
|
32
|
+
};
|
|
33
|
+
export declare function runtimeNodeWorkerLookupV2(order: SignedRuntimeWorkOrderV2): {
|
|
34
|
+
tenantId: string;
|
|
35
|
+
workspaceId: string;
|
|
36
|
+
environmentId: string;
|
|
37
|
+
orderId: string;
|
|
38
|
+
};
|
|
39
|
+
export declare function rejectedRuntimeNodeWorkV2(phase: RuntimeNodeWorkerPhaseV2, reason: string): RuntimeNodeWorkerResultV2;
|
|
40
|
+
export declare function indeterminateRuntimeNodeWorkV2(phase: RuntimeNodeWorkerPhaseV2, reason: string, claim?: RuntimeWorkOrderClaimV2): RuntimeNodeWorkerResultV2;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { type RuntimeWorkOrderClaimV2, type SignedRuntimeWorkOrderV2 } from '@lssm-tech/lib.lssm-os-runtime';
|
|
2
|
+
export declare function validateWorkerInput(input: {
|
|
3
|
+
order: unknown;
|
|
4
|
+
eligibilityDecision: unknown;
|
|
5
|
+
completionId: string;
|
|
6
|
+
}): SignedRuntimeWorkOrderV2;
|
|
7
|
+
export declare function validateTrustedNow(value: string): string;
|
|
8
|
+
export declare function verifyConnectResult(input: {
|
|
9
|
+
order: SignedRuntimeWorkOrderV2;
|
|
10
|
+
result: {
|
|
11
|
+
readonly order: SignedRuntimeWorkOrderV2;
|
|
12
|
+
readonly revoked: boolean;
|
|
13
|
+
} | undefined;
|
|
14
|
+
now: string;
|
|
15
|
+
}): boolean;
|
|
16
|
+
export declare function sameClaim(left: RuntimeWorkOrderClaimV2, right: RuntimeWorkOrderClaimV2): boolean;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { type RuntimeNodeWorkerDependenciesV2, type RuntimeNodeWorkerRequestV2, type RuntimeNodeWorkerResultV2 } from './runtime-node-worker-types.js';
|
|
2
|
+
export declare class LssmOsRuntimeNodeWorkerV2 {
|
|
3
|
+
#private;
|
|
4
|
+
private readonly dependencies;
|
|
5
|
+
constructor(dependencies: RuntimeNodeWorkerDependenciesV2, options: {
|
|
6
|
+
readonly operationTimeoutMs: number;
|
|
7
|
+
});
|
|
8
|
+
run(request: RuntimeNodeWorkerRequestV2): Promise<RuntimeNodeWorkerResultV2>;
|
|
9
|
+
private executeClaim;
|
|
10
|
+
private readClock;
|
|
11
|
+
}
|
|
12
|
+
export type { RuntimeNodeWorkerDependenciesV2, RuntimeNodeWorkerRequestV2, RuntimeNodeWorkerResultV2, RuntimeNodeWorkerSchedulerV2, } from './runtime-node-worker-types.js';
|