@contractspec/lib.execution-lanes 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +27 -0
- package/dist/adapters/in-process.d.ts +4 -0
- package/dist/adapters/index.d.ts +6 -0
- package/dist/adapters/queue.d.ts +7 -0
- package/dist/adapters/subagent.d.ts +10 -0
- package/dist/adapters/tmux.d.ts +10 -0
- package/dist/adapters/types.d.ts +16 -0
- package/dist/adapters/workflow-engine.d.ts +10 -0
- package/dist/defaults/defaults.test.d.ts +1 -0
- package/dist/defaults/index.d.ts +3 -0
- package/dist/defaults/index.js +2 -0
- package/dist/defaults/lanes.d.ts +2 -0
- package/dist/defaults/roles.d.ts +2 -0
- package/dist/defaults/transitions.d.ts +2 -0
- package/dist/evidence/bundle.d.ts +13 -0
- package/dist/evidence/bundle.test.d.ts +1 -0
- package/dist/evidence/gate.d.ts +10 -0
- package/dist/evidence/gate.test.d.ts +1 -0
- package/dist/index.d.ts +32 -0
- package/dist/index.js +4 -0
- package/dist/interop/commands.d.ts +18 -0
- package/dist/interop/commands.test.d.ts +1 -0
- package/dist/interop/index.d.ts +1 -0
- package/dist/interop/index.js +2 -0
- package/dist/lanes/clarify/clarify.d.ts +11 -0
- package/dist/lanes/clarify/clarify.test.d.ts +1 -0
- package/dist/lanes/complete/completion-loop-authority.test.d.ts +1 -0
- package/dist/lanes/complete/completion-loop-failures.test.d.ts +1 -0
- package/dist/lanes/complete/completion-loop-progress.d.ts +7 -0
- package/dist/lanes/complete/completion-loop-shared.d.ts +24 -0
- package/dist/lanes/complete/completion-loop-terminal.d.ts +12 -0
- package/dist/lanes/complete/completion-loop.d.ts +31 -0
- package/dist/lanes/complete/completion-loop.test.d.ts +1 -0
- package/dist/lanes/complete/failure-class.d.ts +7 -0
- package/dist/lanes/plan/consensus-authority.d.ts +10 -0
- package/dist/lanes/plan/consensus-authority.test.d.ts +1 -0
- package/dist/lanes/plan/consensus.d.ts +54 -0
- package/dist/lanes/plan/consensus.test.d.ts +1 -0
- package/dist/lanes/team/finalize.d.ts +4 -0
- package/dist/lanes/team/team-run-authority.test.d.ts +1 -0
- package/dist/lanes/team/team-run-control.d.ts +4 -0
- package/dist/lanes/team/team-run-control.test.d.ts +1 -0
- package/dist/lanes/team/team-run-core.d.ts +19 -0
- package/dist/lanes/team/team-run-lifecycle.d.ts +7 -0
- package/dist/lanes/team/team-run-operations.d.ts +10 -0
- package/dist/lanes/team/team-run-scope.test.d.ts +1 -0
- package/dist/lanes/team/team-run-shared.d.ts +23 -0
- package/dist/lanes/team/team-run.d.ts +48 -0
- package/dist/lanes/team/team-run.test.d.ts +1 -0
- package/dist/lanes/team/worker-launch.d.ts +3 -0
- package/dist/node/defaults/index.js +1 -0
- package/dist/node/index.js +3 -0
- package/dist/node/interop/index.js +1 -0
- package/dist/node/types/index.js +1 -0
- package/dist/package-exports.test.d.ts +1 -0
- package/dist/registry/execution-lane-registry.d.ts +9 -0
- package/dist/registry/role-profile-registry.d.ts +10 -0
- package/dist/registry/verification-policy-registry.d.ts +10 -0
- package/dist/runtime/authority-hooks.d.ts +14 -0
- package/dist/runtime/in-memory-store.d.ts +34 -0
- package/dist/runtime/lane-runtime-authority.test.d.ts +1 -0
- package/dist/runtime/lane-runtime-options.d.ts +11 -0
- package/dist/runtime/lane-runtime-terminal.d.ts +5 -0
- package/dist/runtime/lane-runtime.d.ts +20 -0
- package/dist/runtime/lane-runtime.test.d.ts +1 -0
- package/dist/runtime/persistence-bundle.d.ts +2 -0
- package/dist/runtime/persistence-bundle.test.d.ts +1 -0
- package/dist/runtime/persistence-files-codec.d.ts +6 -0
- package/dist/runtime/persistence-files.d.ts +4 -0
- package/dist/runtime/persistence-files.test.d.ts +1 -0
- package/dist/runtime/readiness.d.ts +16 -0
- package/dist/runtime/role-guard.d.ts +12 -0
- package/dist/runtime/role-guard.test.d.ts +1 -0
- package/dist/runtime/selector.d.ts +12 -0
- package/dist/runtime/selector.test.d.ts +1 -0
- package/dist/runtime/state-sync.d.ts +5 -0
- package/dist/runtime/status-views.d.ts +5 -0
- package/dist/runtime/store.d.ts +22 -0
- package/dist/types/completion.d.ts +60 -0
- package/dist/types/core.d.ts +19 -0
- package/dist/types/evidence.d.ts +64 -0
- package/dist/types/failures.d.ts +8 -0
- package/dist/types/failures.test.d.ts +1 -0
- package/dist/types/identifiers.d.ts +12 -0
- package/dist/types/index.d.ts +10 -0
- package/dist/types/index.js +2 -0
- package/dist/types/lanes.d.ts +65 -0
- package/dist/types/plan.d.ts +46 -0
- package/dist/types/roles.d.ts +24 -0
- package/dist/types/runtime.d.ts +123 -0
- package/dist/types/team.d.ts +128 -0
- package/dist/utils/deep-clone.d.ts +1 -0
- package/dist/utils/id.d.ts +1 -0
- package/dist/validation/clarification-artifact.d.ts +4 -0
- package/dist/validation/completion-loop-spec.d.ts +4 -0
- package/dist/validation/contracts.test.d.ts +1 -0
- package/dist/validation/issues.d.ts +6 -0
- package/dist/validation/lane-spec.d.ts +3 -0
- package/dist/validation/plan-pack.d.ts +3 -0
- package/dist/validation/role-profile.d.ts +3 -0
- package/dist/validation/team-run-spec.d.ts +4 -0
- package/dist/validation/verification-policy.d.ts +5 -0
- package/package.json +105 -0
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import type { ExecutionPlanPack } from '../../types';
|
|
2
|
+
import { type ConsensusPlanningAuthority } from './consensus-authority';
|
|
3
|
+
export type ConsensusPlanningMode = 'short' | 'deliberate';
|
|
4
|
+
export interface PlanReviewRecord {
|
|
5
|
+
reviewerRole: 'architect' | 'critic';
|
|
6
|
+
verdict: 'approve' | 'revise' | 'reject';
|
|
7
|
+
findings: string[];
|
|
8
|
+
recommendedChanges: string[];
|
|
9
|
+
createdAt: string;
|
|
10
|
+
}
|
|
11
|
+
export interface ConsensusPlanningArtifact {
|
|
12
|
+
id: string;
|
|
13
|
+
type: 'planner_draft' | 'planner_revision' | 'architect_review' | 'critique_verdict' | 'plan_pack' | 'tradeoff_record';
|
|
14
|
+
iteration: number;
|
|
15
|
+
createdAt: string;
|
|
16
|
+
body: unknown;
|
|
17
|
+
}
|
|
18
|
+
export interface ConsensusPlanner {
|
|
19
|
+
draft(): Promise<ExecutionPlanPack>;
|
|
20
|
+
revise(input: {
|
|
21
|
+
iteration: number;
|
|
22
|
+
currentPlan: ExecutionPlanPack;
|
|
23
|
+
reviews: PlanReviewRecord[];
|
|
24
|
+
}): Promise<ExecutionPlanPack>;
|
|
25
|
+
}
|
|
26
|
+
export interface ConsensusReviewer {
|
|
27
|
+
review(plan: ExecutionPlanPack): Promise<PlanReviewRecord>;
|
|
28
|
+
}
|
|
29
|
+
export interface ConsensusPlanningLaneInput {
|
|
30
|
+
planner: ConsensusPlanner;
|
|
31
|
+
architect: ConsensusReviewer;
|
|
32
|
+
critic: ConsensusReviewer;
|
|
33
|
+
mode?: ConsensusPlanningMode;
|
|
34
|
+
maxIterations?: number;
|
|
35
|
+
enforceReadOnly?: boolean;
|
|
36
|
+
purityGuard?: {
|
|
37
|
+
capture(): Promise<unknown> | unknown;
|
|
38
|
+
assertUnchanged(baseline: unknown): Promise<void> | void;
|
|
39
|
+
};
|
|
40
|
+
artifactSink?: {
|
|
41
|
+
persist(artifact: ConsensusPlanningArtifact): Promise<void> | void;
|
|
42
|
+
};
|
|
43
|
+
authority?: ConsensusPlanningAuthority;
|
|
44
|
+
}
|
|
45
|
+
export declare function createConsensusPlanningLane(input: ConsensusPlanningLaneInput): {
|
|
46
|
+
run(): Promise<{
|
|
47
|
+
mode: ConsensusPlanningMode;
|
|
48
|
+
plan: ExecutionPlanPack;
|
|
49
|
+
reviews: PlanReviewRecord[];
|
|
50
|
+
artifacts: ConsensusPlanningArtifact[];
|
|
51
|
+
approved: boolean;
|
|
52
|
+
iterations: number;
|
|
53
|
+
}>;
|
|
54
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { TeamCompletionSnapshot, TeamRunState } from '../../types';
|
|
2
|
+
export declare function canFinalizeTeamRun(state: TeamRunState): boolean;
|
|
3
|
+
export declare function hasRequiredTeamEvidence(state: TeamRunState): boolean;
|
|
4
|
+
export declare function createTeamCompletionSnapshot(state: TeamRunState, followupRecommendation?: string): TeamCompletionSnapshot;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { type TeamRunDependencies } from './team-run-shared';
|
|
2
|
+
export declare function pauseTeamRun(dependencies: TeamRunDependencies, runId: string, actorId?: string): Promise<import("../..").TeamRunState>;
|
|
3
|
+
export declare function resumeTeamRun(dependencies: TeamRunDependencies, runId: string, actorId?: string): Promise<import("../..").TeamRunState>;
|
|
4
|
+
export declare function nudgeTeamWorker(dependencies: TeamRunDependencies, runId: string, workerId: string, message: string, actorId?: string): Promise<import("../..").TeamMailboxMessage>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { TeamRunSpec, TeamRunState } from '../../types';
|
|
2
|
+
import { type TeamRunDependencies } from './team-run-shared';
|
|
3
|
+
export declare function createTeamRuntimeState(dependencies: TeamRunDependencies, spec: TeamRunSpec, actorId?: string): Promise<TeamRunState>;
|
|
4
|
+
export declare function startTeamRuntime(dependencies: TeamRunDependencies, runId: string, actorId?: string): Promise<TeamRunState>;
|
|
5
|
+
export declare function buildTeamStatusViewFromState(dependencies: TeamRunDependencies, runId: string): Promise<{
|
|
6
|
+
runId: string;
|
|
7
|
+
status: "initialized" | "running" | "paused" | "completed" | "blocked" | "failed" | "aborted" | "completed_with_followup_recommended";
|
|
8
|
+
totalTasks: number;
|
|
9
|
+
completedTasks: number;
|
|
10
|
+
activeWorkers: number;
|
|
11
|
+
staleWorkers: number;
|
|
12
|
+
staleLeaseCount: number;
|
|
13
|
+
staleWorkerIds: string[];
|
|
14
|
+
pendingEvidence: number;
|
|
15
|
+
queueSkew: number;
|
|
16
|
+
verificationReady: boolean;
|
|
17
|
+
cleanupStatus: import("../..").TeamCleanupStatus;
|
|
18
|
+
updatedAt: string;
|
|
19
|
+
}>;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { type TeamRunDependencies } from './team-run-shared';
|
|
2
|
+
export declare function rebalanceTeamRun(dependencies: TeamRunDependencies, runId: string, reason: string, now?: Date, actorId?: string): Promise<import("../..").TeamRunState>;
|
|
3
|
+
export declare function reclaimExpiredTeamLeases(dependencies: TeamRunDependencies, runId: string, now?: Date, actorId?: string): Promise<import("../..").TeamRunState>;
|
|
4
|
+
export declare function reconcileTeamWorkerLiveness(dependencies: TeamRunDependencies, runId: string, now?: Date, actorId?: string): Promise<import("../..").TeamRunState>;
|
|
5
|
+
export declare function shutdownTeamRun(dependencies: TeamRunDependencies, runId: string, reason?: string, actorId?: string): Promise<import("../..").TeamRunState>;
|
|
6
|
+
export { pauseTeamRun, resumeTeamRun } from './team-run-control';
|
|
7
|
+
export declare function finalizeTeamRun(dependencies: TeamRunDependencies, runId: string, followupRecommendation?: string, actorId?: string): Promise<import("../..").TeamCompletionSnapshot>;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { TeamMailboxMessage } from '../../types';
|
|
2
|
+
import { type TeamRunDependencies } from './team-run-shared';
|
|
3
|
+
export declare function claimNextTeamTask(dependencies: TeamRunDependencies, runId: string, workerId: string, leaseMs?: number, actorId?: string): Promise<import("../..").TeamTaskRecord | undefined>;
|
|
4
|
+
export declare function renewTeamTaskLease(dependencies: TeamRunDependencies, runId: string, taskId: string, leaseMs?: number, actorId?: string): Promise<import("../..").TeamTaskRecord>;
|
|
5
|
+
export declare function completeTeamTask(dependencies: TeamRunDependencies, runId: string, taskId: string, actorId?: string): Promise<import("../..").TeamRunState>;
|
|
6
|
+
export declare function attachTeamTaskEvidence(dependencies: TeamRunDependencies, runId: string, taskId: string, bundleId: string, actorId?: string): Promise<import("../..").TeamTaskRecord>;
|
|
7
|
+
export declare function attachTeamRunEvidence(dependencies: TeamRunDependencies, runId: string, bundleId: string, actorId?: string): Promise<import("../..").TeamRunState>;
|
|
8
|
+
export declare function failTeamTask(dependencies: TeamRunDependencies, runId: string, taskId: string, reason: string, actorId?: string): Promise<import("../..").TeamRunState>;
|
|
9
|
+
export declare function recordTeamHeartbeat(dependencies: TeamRunDependencies, runId: string, workerId: string, progressSummary?: string, actorId?: string): Promise<import("../..").TeamWorkerState>;
|
|
10
|
+
export declare function sendTeamMessage(dependencies: TeamRunDependencies, runId: string, message: Omit<TeamMailboxMessage, 'id' | 'createdAt'>, actorId?: string): Promise<TeamMailboxMessage>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { TeamBackendAdapter } from '../../adapters/types';
|
|
2
|
+
import { RoleProfileRegistry } from '../../registry/role-profile-registry';
|
|
3
|
+
import { type LaneAuthorityAction, type LaneAuthorityHooks } from '../../runtime/authority-hooks';
|
|
4
|
+
import { createRoleGuard } from '../../runtime/role-guard';
|
|
5
|
+
import type { LaneRuntimeStore } from '../../runtime/store';
|
|
6
|
+
import type { TeamRunState, TeamTaskRecord, TeamWorkerState } from '../../types';
|
|
7
|
+
export interface TeamRunDependencies {
|
|
8
|
+
store: LaneRuntimeStore;
|
|
9
|
+
adapter: TeamBackendAdapter;
|
|
10
|
+
hooks?: LaneAuthorityHooks;
|
|
11
|
+
roleGuard: ReturnType<typeof createRoleGuard>;
|
|
12
|
+
heartbeatStaleMs: number;
|
|
13
|
+
}
|
|
14
|
+
export declare function assertTeamAuthority(dependencies: TeamRunDependencies, action: LaneAuthorityAction, runId: string, actorId?: string, input?: {
|
|
15
|
+
reason?: string;
|
|
16
|
+
metadata?: Record<string, unknown>;
|
|
17
|
+
}): Promise<void>;
|
|
18
|
+
export declare function requireTeamState(store: LaneRuntimeStore, runId: string): Promise<TeamRunState>;
|
|
19
|
+
export declare function persistTeamState(store: LaneRuntimeStore, state: TeamRunState): Promise<void>;
|
|
20
|
+
export declare function releaseWorker(state: TeamRunState, workerId?: string, status?: TeamWorkerState['status']): void;
|
|
21
|
+
export declare function requireTask(state: TeamRunState, taskId: string): TeamTaskRecord;
|
|
22
|
+
export declare function assertTeamWorkerRole(roleGuard: ReturnType<typeof createRoleGuard>, roleKey: string): void;
|
|
23
|
+
export declare function createDefaultRoleRegistry(): RoleProfileRegistry;
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { TeamBackendAdapter } from '../../adapters/types';
|
|
2
|
+
import { RoleProfileRegistry } from '../../registry/role-profile-registry';
|
|
3
|
+
import type { LaneRuntimeStore } from '../../runtime/store';
|
|
4
|
+
import type { TeamMailboxMessage, TeamRunSpec } from '../../types';
|
|
5
|
+
import { releaseWorker, requireTask, requireTeamState, type TeamRunDependencies } from './team-run-shared';
|
|
6
|
+
export declare function createTeamRun(store: LaneRuntimeStore, adapter: TeamBackendAdapter, input?: {
|
|
7
|
+
roleRegistry?: RoleProfileRegistry;
|
|
8
|
+
heartbeatStaleMs?: number;
|
|
9
|
+
hooks?: TeamRunDependencies['hooks'];
|
|
10
|
+
}): {
|
|
11
|
+
create(spec: TeamRunSpec, actorId?: string): Promise<import("../..").TeamRunState>;
|
|
12
|
+
start(runId: string, actorId?: string): Promise<import("../..").TeamRunState>;
|
|
13
|
+
claimNextTask(runId: string, workerId: string, leaseMs?: number, actorId?: string): Promise<import("../..").TeamTaskRecord | undefined>;
|
|
14
|
+
renewLease(runId: string, taskId: string, leaseMs?: number, actorId?: string): Promise<import("../..").TeamTaskRecord>;
|
|
15
|
+
completeTask(runId: string, taskId: string, actorId?: string): Promise<import("../..").TeamRunState>;
|
|
16
|
+
attachTaskEvidence(runId: string, taskId: string, bundleId: string, actorId?: string): Promise<import("../..").TeamTaskRecord>;
|
|
17
|
+
attachRunEvidence(runId: string, bundleId: string, actorId?: string): Promise<import("../..").TeamRunState>;
|
|
18
|
+
failTask(runId: string, taskId: string, reason: string, actorId?: string): Promise<import("../..").TeamRunState>;
|
|
19
|
+
heartbeat(runId: string, workerId: string, progressSummary?: string, actorId?: string): Promise<import("../..").TeamWorkerState>;
|
|
20
|
+
sendMessage(runId: string, message: Omit<TeamMailboxMessage, "id" | "createdAt">, actorId?: string): Promise<TeamMailboxMessage>;
|
|
21
|
+
rebalance(runId: string, reason: string, now?: Date, actorId?: string): Promise<import("../..").TeamRunState>;
|
|
22
|
+
reclaimExpiredLeases(runId: string, now?: Date, actorId?: string): Promise<import("../..").TeamRunState>;
|
|
23
|
+
reconcileWorkerLiveness(runId: string, now?: Date, actorId?: string): Promise<import("../..").TeamRunState>;
|
|
24
|
+
pause(runId: string, actorId?: string): Promise<import("../..").TeamRunState>;
|
|
25
|
+
resume(runId: string, actorId?: string): Promise<import("../..").TeamRunState>;
|
|
26
|
+
nudge(runId: string, workerId: string, message: string, actorId?: string): Promise<TeamMailboxMessage>;
|
|
27
|
+
shutdown(runId: string, reason?: string, actorId?: string): Promise<import("../..").TeamRunState>;
|
|
28
|
+
finalize(runId: string, followupRecommendation?: string, actorId?: string): Promise<import("../..").TeamCompletionSnapshot>;
|
|
29
|
+
getStatusView(runId: string): Promise<{
|
|
30
|
+
runId: string;
|
|
31
|
+
status: "initialized" | "running" | "paused" | "completed" | "blocked" | "failed" | "aborted" | "completed_with_followup_recommended";
|
|
32
|
+
totalTasks: number;
|
|
33
|
+
completedTasks: number;
|
|
34
|
+
activeWorkers: number;
|
|
35
|
+
staleWorkers: number;
|
|
36
|
+
staleLeaseCount: number;
|
|
37
|
+
staleWorkerIds: string[];
|
|
38
|
+
pendingEvidence: number;
|
|
39
|
+
queueSkew: number;
|
|
40
|
+
verificationReady: boolean;
|
|
41
|
+
cleanupStatus: import("../..").TeamCleanupStatus;
|
|
42
|
+
updatedAt: string;
|
|
43
|
+
}>;
|
|
44
|
+
require(runId: string): Promise<import("../..").TeamRunState>;
|
|
45
|
+
persist(state: Awaited<ReturnType<typeof requireTeamState>>): Promise<void>;
|
|
46
|
+
releaseWorker: typeof releaseWorker;
|
|
47
|
+
requireTask: typeof requireTask;
|
|
48
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { RoleProfile, TeamRunSpec, TeamWorkerLaunchSpec, TeamWorkerSpec } from '../../types';
|
|
2
|
+
export declare function assertValidTeamWorkerScopes(spec: TeamRunSpec, resolveRole: (roleKey: string) => RoleProfile): void;
|
|
3
|
+
export declare function createTeamWorkerLaunchSpec(runId: string, spec: TeamRunSpec, worker: TeamWorkerSpec, profile: RoleProfile): TeamWorkerLaunchSpec;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var e={clarify:["plan.consensus"],"plan.consensus":["complete.persistent","team.coordinated"],"complete.persistent":[],"team.coordinated":["complete.persistent"]};var t=[{key:"clarify",description:"Reduces ambiguity and produces a clarification artifact.",entryCriteria:["request is ambiguous or conflicting"],exitCriteria:["ambiguity score recorded","next lane recommended"],allowedTransitions:e.clarify,compatibleRoles:["planner","researcher"],requiredArtifacts:["clarification_artifact"],verificationPolicy:{key:"lane.clarify",requiredEvidence:["clarification_artifact"],minimumApprovals:[],failOnMissingEvidence:!0,allowConditionalCompletion:!1},capabilities:{parallelism:"none",persistence:"checkpointed",approvals:!1,mailbox:!1,taskLeasing:!1}},{key:"plan.consensus",description:"Runs planner, architect, and critic to produce a plan pack.",entryCriteria:["clarity sufficient to plan"],exitCriteria:["plan pack approved","next lane justified"],allowedTransitions:e["plan.consensus"],compatibleRoles:["planner","architect","critic","researcher"],requiredArtifacts:["plan_pack","architect_review","critique_verdict","tradeoff_record"],verificationPolicy:{key:"lane.plan.consensus",requiredEvidence:["plan_pack","architect_review","critique_verdict","tradeoff_record"],minimumApprovals:[],failOnMissingEvidence:!0,allowConditionalCompletion:!1},capabilities:{parallelism:"bounded",persistence:"checkpointed",approvals:!0,mailbox:!1,taskLeasing:!1}},{key:"complete.persistent",description:"Runs a durable single-owner completion loop.",entryCriteria:["plan pack available"],exitCriteria:["evidence satisfied","signoff complete"],allowedTransitions:e["complete.persistent"],compatibleRoles:["executor","verifier","architect","test-engineer"],requiredArtifacts:["completion_record","progress_ledger","signoff_record"],verificationPolicy:{key:"lane.complete.persistent",requiredEvidence:["progress_ledger","verification_results"],minimumApprovals:[{role:"verifier",verdict:"approve"}],failOnMissingEvidence:!0,allowConditionalCompletion:!1},capabilities:{parallelism:"bounded",persistence:"durable",approvals:!0,mailbox:!1,taskLeasing:!1}},{key:"team.coordinated",description:"Runs coordinated multi-worker execution with leases.",entryCriteria:["plan pack available","parallel fanout justified"],exitCriteria:["tasks terminal","shutdown policy passes"],allowedTransitions:e["team.coordinated"],compatibleRoles:["executor","verifier","test-engineer","writer"],requiredArtifacts:["team_snapshot","verification_lane_evidence","team_cleanup_state"],verificationPolicy:{key:"lane.team.coordinated",requiredEvidence:["verification_results"],minimumApprovals:[],failOnMissingEvidence:!0,allowConditionalCompletion:!0},capabilities:{parallelism:"durable",persistence:"durable",approvals:!0,mailbox:!0,taskLeasing:!0}}];var o=[{key:"planner",description:"Produces structured execution plans without implementing.",routingRole:"leader",posture:"orchestrator",allowedTools:["read","analyze","review"],writeScope:"artifacts-only",laneCompatibility:["clarify","plan.consensus","team.coordinated"],evidenceObligations:["plan_pack","tradeoff_record"],escalationTriggers:["scope_conflict","missing_acceptance_criteria"],modelProfileHint:"frontier-planner"},{key:"architect",description:"Checks boundaries, tradeoffs, and architecture soundness.",routingRole:"specialist",posture:"critic",allowedTools:["read","analyze","review"],writeScope:"none",laneCompatibility:["plan.consensus","complete.persistent"],evidenceObligations:["architect_review"],escalationTriggers:["boundary_violation","policy_risk"],modelProfileHint:"frontier-architect"},{key:"critic",description:"Rejects vague plans and incomplete verification paths.",routingRole:"reviewer",posture:"critic",allowedTools:["read","analyze","review"],writeScope:"artifacts-only",laneCompatibility:["plan.consensus"],evidenceObligations:["critique_verdict"],escalationTriggers:["untestable_plan","scope_creep"],modelProfileHint:"critic"},{key:"executor",description:"Executes implementation work in an assigned scope.",routingRole:"executor",posture:"builder",allowedTools:["read","analyze","execute","review"],writeScope:"workspace",laneCompatibility:["complete.persistent","team.coordinated"],evidenceObligations:["completion_record","verification_results"],escalationTriggers:["shared_conflict","destructive_change"],modelProfileHint:"executor"},{key:"verifier",description:"Owns completion gates and evidence sufficiency.",routingRole:"reviewer",posture:"verifier",allowedTools:["read","analyze","review","execute"],writeScope:"artifacts-only",laneCompatibility:["complete.persistent","team.coordinated"],evidenceObligations:["verification_results","signoff_record"],escalationTriggers:["missing_evidence","failing_checks"],modelProfileHint:"verifier"},{key:"test-engineer",description:"Designs and runs regression coverage.",routingRole:"specialist",posture:"verifier",allowedTools:["read","analyze","execute","review"],writeScope:"workspace",laneCompatibility:["complete.persistent","team.coordinated"],evidenceObligations:["verification_results"],escalationTriggers:["flaky_suite","coverage_gap"],modelProfileHint:"test-engineer"},{key:"security-reviewer",description:"Checks trust boundaries and policy-sensitive changes.",routingRole:"specialist",posture:"critic",allowedTools:["read","analyze","review"],writeScope:"none",laneCompatibility:["plan.consensus","complete.persistent","team.coordinated"],evidenceObligations:["architect_review"],escalationTriggers:["secret_exposure","approval_required"],modelProfileHint:"security-reviewer"},{key:"researcher",description:"Performs bounded read-only investigation.",routingRole:"specialist",posture:"researcher",allowedTools:["read","analyze","network"],writeScope:"none",laneCompatibility:["clarify","plan.consensus","team.coordinated"],evidenceObligations:["clarification_artifact"],escalationTriggers:["source_conflict","missing_primary_source"],modelProfileHint:"researcher"},{key:"writer",description:"Produces docs, migration notes, and operator guidance.",routingRole:"specialist",posture:"builder",allowedTools:["read","analyze","execute","review"],writeScope:"workspace",laneCompatibility:["team.coordinated","complete.persistent"],evidenceObligations:["completion_record"],escalationTriggers:["public_api_change","migration_gap"],modelProfileHint:"writer"}];export{e as DEFAULT_TRANSITIONS,o as DEFAULT_ROLE_PROFILES,t as DEFAULT_LANES};
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
var _={clarify:["plan.consensus"],"plan.consensus":["complete.persistent","team.coordinated"],"complete.persistent":[],"team.coordinated":["complete.persistent"]};var se=[{key:"clarify",description:"Reduces ambiguity and produces a clarification artifact.",entryCriteria:["request is ambiguous or conflicting"],exitCriteria:["ambiguity score recorded","next lane recommended"],allowedTransitions:_.clarify,compatibleRoles:["planner","researcher"],requiredArtifacts:["clarification_artifact"],verificationPolicy:{key:"lane.clarify",requiredEvidence:["clarification_artifact"],minimumApprovals:[],failOnMissingEvidence:!0,allowConditionalCompletion:!1},capabilities:{parallelism:"none",persistence:"checkpointed",approvals:!1,mailbox:!1,taskLeasing:!1}},{key:"plan.consensus",description:"Runs planner, architect, and critic to produce a plan pack.",entryCriteria:["clarity sufficient to plan"],exitCriteria:["plan pack approved","next lane justified"],allowedTransitions:_["plan.consensus"],compatibleRoles:["planner","architect","critic","researcher"],requiredArtifacts:["plan_pack","architect_review","critique_verdict","tradeoff_record"],verificationPolicy:{key:"lane.plan.consensus",requiredEvidence:["plan_pack","architect_review","critique_verdict","tradeoff_record"],minimumApprovals:[],failOnMissingEvidence:!0,allowConditionalCompletion:!1},capabilities:{parallelism:"bounded",persistence:"checkpointed",approvals:!0,mailbox:!1,taskLeasing:!1}},{key:"complete.persistent",description:"Runs a durable single-owner completion loop.",entryCriteria:["plan pack available"],exitCriteria:["evidence satisfied","signoff complete"],allowedTransitions:_["complete.persistent"],compatibleRoles:["executor","verifier","architect","test-engineer"],requiredArtifacts:["completion_record","progress_ledger","signoff_record"],verificationPolicy:{key:"lane.complete.persistent",requiredEvidence:["progress_ledger","verification_results"],minimumApprovals:[{role:"verifier",verdict:"approve"}],failOnMissingEvidence:!0,allowConditionalCompletion:!1},capabilities:{parallelism:"bounded",persistence:"durable",approvals:!0,mailbox:!1,taskLeasing:!1}},{key:"team.coordinated",description:"Runs coordinated multi-worker execution with leases.",entryCriteria:["plan pack available","parallel fanout justified"],exitCriteria:["tasks terminal","shutdown policy passes"],allowedTransitions:_["team.coordinated"],compatibleRoles:["executor","verifier","test-engineer","writer"],requiredArtifacts:["team_snapshot","verification_lane_evidence","team_cleanup_state"],verificationPolicy:{key:"lane.team.coordinated",requiredEvidence:["verification_results"],minimumApprovals:[],failOnMissingEvidence:!0,allowConditionalCompletion:!0},capabilities:{parallelism:"durable",persistence:"durable",approvals:!0,mailbox:!0,taskLeasing:!0}}];var q=[{key:"planner",description:"Produces structured execution plans without implementing.",routingRole:"leader",posture:"orchestrator",allowedTools:["read","analyze","review"],writeScope:"artifacts-only",laneCompatibility:["clarify","plan.consensus","team.coordinated"],evidenceObligations:["plan_pack","tradeoff_record"],escalationTriggers:["scope_conflict","missing_acceptance_criteria"],modelProfileHint:"frontier-planner"},{key:"architect",description:"Checks boundaries, tradeoffs, and architecture soundness.",routingRole:"specialist",posture:"critic",allowedTools:["read","analyze","review"],writeScope:"none",laneCompatibility:["plan.consensus","complete.persistent"],evidenceObligations:["architect_review"],escalationTriggers:["boundary_violation","policy_risk"],modelProfileHint:"frontier-architect"},{key:"critic",description:"Rejects vague plans and incomplete verification paths.",routingRole:"reviewer",posture:"critic",allowedTools:["read","analyze","review"],writeScope:"artifacts-only",laneCompatibility:["plan.consensus"],evidenceObligations:["critique_verdict"],escalationTriggers:["untestable_plan","scope_creep"],modelProfileHint:"critic"},{key:"executor",description:"Executes implementation work in an assigned scope.",routingRole:"executor",posture:"builder",allowedTools:["read","analyze","execute","review"],writeScope:"workspace",laneCompatibility:["complete.persistent","team.coordinated"],evidenceObligations:["completion_record","verification_results"],escalationTriggers:["shared_conflict","destructive_change"],modelProfileHint:"executor"},{key:"verifier",description:"Owns completion gates and evidence sufficiency.",routingRole:"reviewer",posture:"verifier",allowedTools:["read","analyze","review","execute"],writeScope:"artifacts-only",laneCompatibility:["complete.persistent","team.coordinated"],evidenceObligations:["verification_results","signoff_record"],escalationTriggers:["missing_evidence","failing_checks"],modelProfileHint:"verifier"},{key:"test-engineer",description:"Designs and runs regression coverage.",routingRole:"specialist",posture:"verifier",allowedTools:["read","analyze","execute","review"],writeScope:"workspace",laneCompatibility:["complete.persistent","team.coordinated"],evidenceObligations:["verification_results"],escalationTriggers:["flaky_suite","coverage_gap"],modelProfileHint:"test-engineer"},{key:"security-reviewer",description:"Checks trust boundaries and policy-sensitive changes.",routingRole:"specialist",posture:"critic",allowedTools:["read","analyze","review"],writeScope:"none",laneCompatibility:["plan.consensus","complete.persistent","team.coordinated"],evidenceObligations:["architect_review"],escalationTriggers:["secret_exposure","approval_required"],modelProfileHint:"security-reviewer"},{key:"researcher",description:"Performs bounded read-only investigation.",routingRole:"specialist",posture:"researcher",allowedTools:["read","analyze","network"],writeScope:"none",laneCompatibility:["clarify","plan.consensus","team.coordinated"],evidenceObligations:["clarification_artifact"],escalationTriggers:["source_conflict","missing_primary_source"],modelProfileHint:"researcher"},{key:"writer",description:"Produces docs, migration notes, and operator guidance.",routingRole:"specialist",posture:"builder",allowedTools:["read","analyze","execute","review"],writeScope:"workspace",laneCompatibility:["team.coordinated","complete.persistent"],evidenceObligations:["completion_record"],escalationTriggers:["public_api_change","migration_gap"],modelProfileHint:"writer"}];var it=["missing_evidence","failing_evidence","policy_blocked","approval_denied","runtime_failure","worker_timeout","lease_conflict"],ot={retryable:"runtime_failure",blocked:"policy_blocked",fatal:"runtime_failure"};function b(e){return st(e)?e:ot[e]}function st(e){return it.includes(e)}function ce(e){switch(b(e)){case"missing_evidence":case"failing_evidence":case"runtime_failure":case"worker_timeout":case"lease_conflict":return!0;default:return!1}}function le(e){switch(b(e)){case"policy_blocked":case"approval_denied":return!0;default:return!1}}var ct=["architect_review","clarification_artifact","completion_record","context_snapshot","critique_verdict","evidence_bundle_ref","evidence_gate_result","loop_state","operator_action","plan_pack","planner_draft","planner_revision","progress_ledger","signoff_record","signoff_request","team_cleanup_state","team_snapshot","terminal_state","tradeoff_record","verification_lane_evidence"],lt=["architect_review","clarification_artifact","completion_record","critique_verdict","plan_pack","progress_ledger","signoff_record","team_snapshot","tradeoff_record","verification_lane_evidence","verification_results"],mt={"architect-review":"architect_review","clarification-artifact":"clarification_artifact","completion-record":"completion_record","context-snapshot":"context_snapshot","critic-review":"critique_verdict","evidence-bundle-ref":"evidence_bundle_ref","evidence-gate-result":"evidence_gate_result","execution-plan-pack":"plan_pack","loop-state":"loop_state","operator-action":"operator_action","plan-pack":"plan_pack","planner-draft":"planner_draft","planner-revision":"planner_revision","progress-ledger":"progress_ledger","review-record":"architect_review","signoff-record":"signoff_record","signoff-request":"signoff_request","team-cleanup-state":"team_cleanup_state","team-completion-snapshot":"team_snapshot","team-snapshot":"team_snapshot","terminal-record":"completion_record","terminal-state":"terminal_state","tradeoff-record":"tradeoff_record","verification-lane-evidence":"verification_lane_evidence"},ut={"architect-review":"architect_review","clarification-artifact":"clarification_artifact","completion-record":"completion_record","critic-review":"critique_verdict","execution-plan-pack":"plan_pack","plan-pack":"plan_pack","progress-ledger":"progress_ledger","signoff-record":"signoff_record","team-completion-snapshot":"team_snapshot","team-snapshot":"team_snapshot","terminal-record":"completion_record","tradeoff-record":"tradeoff_record","verification-lane-evidence":"verification_lane_evidence","verification-results":"verification_results"};function W(e){return mt[e]??e}function V(e){return ut[e]??e}function er(e){return e.map((t)=>W(t))}function me(e){return e.map((t)=>V(t))}function tr(e){return ct.includes(e)}function rr(e){return lt.includes(e)}var ue=[{usage:"/clarify",alias:"/clarify",lane:"clarify",mode:"default",acceptsTask:!0,summary:"Reduce ambiguity and capture a clarification artifact."},{usage:"/plan",alias:"/plan",lane:"plan.consensus",mode:"default",acceptsTask:!0,summary:"Draft a consensus-ready execution plan pack."},{usage:"/plan --consensus",alias:"/plan",lane:"plan.consensus",mode:"consensus",acceptsTask:!0,summary:"Run the deliberate consensus-planning variant."},{usage:"/complete",alias:"/complete",lane:"complete.persistent",mode:"default",acceptsTask:!0,summary:"Start or resume the persistent completion loop."},{usage:"/team",alias:"/team",lane:"team.coordinated",mode:"default",acceptsTask:!0,summary:"Start coordinated multi-worker execution."}],dt={clarify:"/clarify","plan.consensus":"/plan","complete.persistent":"/complete","team.coordinated":"/team"};function pr(e){let t=e.startsWith("/")?e:dt[e],r=ue.find((a)=>a.usage===t);if(!r)throw Error(`Unsupported execution lane command: ${e}`);return r}function wr(e){let t=e.trim();if(!t.startsWith("/"))return;let[r="",a="",...i]=t.split(/\s+/);if(r==="/plan"&&a.startsWith("--")&&a!=="--consensus")return;let n=r==="/plan"&&a==="--consensus"?"/plan --consensus":r,o=ue.find((u)=>u.usage===n);if(!o)return;let s=n==="/plan --consensus"?["--consensus"]:[],l=n==="/plan --consensus"?i.join(" ").trim():[a,...i].join(" ").trim();return{...o,raw:e,task:l,flags:s}}function Tr(){let e=new Map;return{key:"in-process",async createSnapshot(t,r){e.set(t,r)},async restoreSnapshot(t,r){if(e.get(t)!==r)throw Error(`Missing in-process snapshot "${r}" for run ${t}.`)}}}function ft(){let e=new Map;return{key:"in-process",async startWorker(t){e.set(`${t.runId}:${t.workerId}`,"running")},async stopWorker(t,r){e.delete(`${t}:${r}`)},async pauseWorker(t,r){let a=`${t}:${r}`;if(!e.has(a))throw Error(`Worker ${r} is not running for run ${t}.`);e.set(a,"paused")},async resumeWorker(t,r){let a=`${t}:${r}`;if(!e.has(a))throw Error(`Worker ${r} is not running for run ${t}.`);e.set(a,"running")},async nudgeWorker(t,r){let a=`${t}:${r}`;if(!e.has(a))throw Error(`Worker ${r} is not running for run ${t}.`)}}}var vr=ft;function xr(e){return{key:"remote-queue",startWorker(t){return e.enqueueWorker(t)},stopWorker:e.cancelWorker}}function hr(e){return{key:"subagent",startWorker(t){return e.spawnWorker(t)},stopWorker:e.stopWorker,pauseWorker:e.pauseWorker,resumeWorker:e.resumeWorker,nudgeWorker:e.nudgeWorker}}function Pr(e){return{key:"tmux",startWorker(t){return e.startPane(t)},stopWorker:e.stopPane,pauseWorker:e.pausePane,resumeWorker:e.resumePane,nudgeWorker:e.sendKeys}}function Cr(e){return de(e.key,"completion"),e}function Er(e){return de(e.key,"team"),e}function de(e,t){if(!e.trim())throw Error(`Execution-lanes ${t} backend adapters require a key.`)}function Wr(e){return{key:"workflow-engine",startWorker(t){return e.startWorker(t)},stopWorker:e.stopWorker}}function Br(e){return{key:"workflow-engine",createSnapshot:e.createSnapshot,restoreSnapshot:e.restoreSnapshot}}import{normalizeArtifacts as pt}from"@contractspec/lib.harness/evidence/normalizer";function p(e){if(e instanceof Date)return new Date(e.getTime());if(Array.isArray(e))return e.map((t)=>p(t));if(e&&typeof e==="object"){let t={};for(let[r,a]of Object.entries(e))t[r]=p(a);return t}return e}import{randomUUID as gt}from"crypto";function m(e){return`${e}_${gt()}`}function Jr(e){let t=pt({runId:e.runId,artifacts:e.artifacts,now:e.now,idFactory:()=>m("artifact")});return{id:m("evidence"),runId:e.runId,artifactIds:t.map((r)=>r.artifactId),classes:me(e.classes),createdAt:(e.now?.()??new Date).toISOString(),freshUntil:e.freshForMinutes===void 0?void 0:new Date((e.now?.()??new Date).getTime()+e.freshForMinutes*60000).toISOString(),replayBundleUri:e.replayBundleUri,summary:e.summary,metadata:e.metadata?p(e.metadata):void 0}}function H(){return{evaluate(e){let t=e.now?.()??new Date,r=new Set(e.evidence.flatMap((u)=>u.classes.map((x)=>V(String(x))))),a=e.policy.requiredEvidence.map((u)=>V(String(u))).filter((u)=>!r.has(u)).map((u)=>String(u)),i=e.policy.minimumApprovals.filter((u)=>{return!e.approvals.some((x)=>x.role===u.role&&x.verdict===u.verdict&&x.state==="approved")}).map((u)=>`${u.role}:${u.verdict}`),n=e.policy.maxEvidenceAgeMinutes===void 0?[]:e.evidence.filter((u)=>{if(u.freshUntil&&new Date(u.freshUntil).getTime()<t.getTime())return!0;return t.getTime()-new Date(u.createdAt).getTime()>e.policy.maxEvidenceAgeMinutes*60000}).map((u)=>u.id),o=e.blockingRisks??[],s=e.policy.allowConditionalCompletion&&a.length>0&&i.length===0&&n.length===0&&o.length===0;return{passed:(e.policy.failOnMissingEvidence?a.length===0:!0)&&i.length===0&&n.length===0&&o.length===0,conditionallyPassed:s,missingEvidence:a,missingApprovals:i,staleEvidence:n,blockingRisks:o}}}}function c(e,t,r){e.push({path:t,message:r})}function k(e,t){if(e.length===0)return;let r=e.map((a)=>`${a.path}: ${a.message}`).join("; ");throw Error(`${t}: ${r}`)}function F(e){let t=[];if(!e.meta.id.trim())c(t,"meta.id","Clarification artifact id is required.");if(!e.meta.sourceRequest.trim())c(t,"meta.sourceRequest","Clarification source request is required.");if(e.meta.ambiguityScore<0||e.meta.ambiguityScore>1)c(t,"meta.ambiguityScore","Clarification ambiguity score must be between 0 and 1.");if(!e.objective.trim())c(t,"objective","Clarification objective is required.");if(!e.meta.recommendedNextLane)c(t,"meta.recommendedNextLane","Clarification next lane is required.");return t}function fe(e){return k(F(e),"Invalid clarification artifact"),e}function na(){return{run(e){let t=wt(e);return fe({meta:{id:m("clarify"),createdAt:new Date().toISOString(),sourceRequest:e.request,scopeClass:yt(e.request),ambiguityScore:t,recommendedNextLane:"plan.consensus"},objective:e.objective??kt(e.request),constraints:e.constraints??[],assumptions:e.assumptions??[],openQuestions:ge(e),conflictSignals:pe(e.request),authorityContext:e.authorityContext??{policyRefs:[],ruleContextRefs:[]}})}}}function wt(e){let t=[e.request.includes("?"),!e.objective,pe(e.request).length>0,ge(e).length>0];return t.filter(Boolean).length/t.length}function ge(e){let t=[];if(!e.objective)t.push("What is the concrete objective and success condition?");if((e.constraints??[]).length===0)t.push("Which constraints or compatibility surfaces are non-negotiable?");if(e.request.includes("maybe")||e.request.includes("probably"))t.push("Which tentative assumptions should be confirmed before planning?");return t}function pe(e){return["but","except","unless"].filter((t)=>e.toLowerCase().includes(` ${t} `)).map((t)=>`Detected branching language around "${t}".`)}function kt(e){return e.trim().replace(/\s+/g," ").slice(0,180)}function yt(e){let t=e.toLowerCase();if(t.includes("migration")||t.includes("security"))return"high-risk";if(t.includes("team")||t.includes("parallel"))return"large";if(e.length>180)return"medium";return"small"}function we(e){let t=[];if(!e.key.trim())c(t,"key","Verification policy key is required.");for(let r of e.minimumApprovals)if(!r.role.trim())c(t,"minimumApprovals[].role","Approval requirement role is required.");if(e.maxEvidenceAgeMinutes!==void 0&&e.maxEvidenceAgeMinutes<=0)c(t,"maxEvidenceAgeMinutes","Maximum evidence age must be greater than zero.");return t}function ke(e){if(typeof e==="string")return e.trim()?[]:[{path:"key",message:"Verification policy key is required."}];return we(e)}function ye(e){return k(we(e),`Invalid verification policy "${e.key}"`),e}class Rt{items=new Map;register(e){return Re(e),this.items.set(e.key,e),this}get(e){return this.items.get(e)}require(e){let t=this.get(e);if(!t)throw Error(`Missing verification policy "${e}".`);return t}resolve(e){return Q(e,this)}list(){return Array.from(this.items.values())}}function Q(e,t){if(typeof e!=="string")return Re(e),e;if(!t)throw Error(`Verification policy "${e}" requires a registry for resolution.`);return t.require(e)}function Re(e){ye(e)}function O(e){return{get(t){return e.require(t)},assert(t){let r=e.require(t.roleKey);if(!r.laneCompatibility.includes(t.lane))throw Error(`Role "${t.roleKey}" is not compatible with lane "${t.lane}".`);for(let a of t.requiredTools??[])if(!r.allowedTools.includes(a))throw Error(`Role "${t.roleKey}" does not allow required tool "${a}".`);if(t.allowedWriteScopes&&!t.allowedWriteScopes.includes(r.writeScope))throw Error(`Role "${t.roleKey}" write scope "${r.writeScope}" is not allowed here.`);return r}}}async function R(e,t,r){if(!await e.getRun(t.runId))return;return e.updateRun(t.runId,(i)=>({...i,status:Tt(t.phase),currentPhase:t.phase,pendingApprovalRoles:[...t.pendingApprovalRoles],evidenceBundleIds:[...t.evidenceBundleIds],blockingRisks:t.lastGateResult?.blockingRisks??i.blockingRisks,terminalReason:r??i.terminalReason,updatedAt:t.updatedAt}))}async function Te(e,t){if(!await e.getRun(t.runId))return;return e.updateRun(t.runId,(a)=>({...a,status:vt(t.status),currentPhase:t.cleanup.status==="in_progress"?"shutdown":t.status,evidenceBundleIds:[...t.evidenceBundleIds],recommendedNextLane:t.status==="completed_with_followup_recommended"?"complete.persistent":a.recommendedNextLane,terminalReason:t.terminalReason??a.terminalReason,updatedAt:t.updatedAt}))}async function C(e,t){if(!await e.getRun(t.runId))return;return e.updateRun(t.runId,(a)=>{let i=t.state==="requested"?Array.from(new Set([...a.pendingApprovalRoles,t.role])):a.pendingApprovalRoles.filter((n)=>n!==t.role);return{...a,pendingApprovalRoles:i,updatedAt:t.decidedAt??t.requestedAt}})}function Tt(e){switch(e){case"initialized":return"initialized";case"working":case"remediating":return"running";case"waiting_for_evidence":case"awaiting_signoff":return"waiting";case"completed":return"completed";case"blocked":return"blocked";case"failed":return"failed";case"aborted":return"aborted"}}function vt(e){switch(e){case"initialized":return"initialized";case"running":return"running";case"paused":return"paused";case"completed":case"completed_with_followup_recommended":return"completed";case"blocked":return"blocked";case"failed":return"failed";case"aborted":return"aborted"}}function St(e){let t=[];if(!e.id.trim())c(t,"id","Completion loop id is required.");if(!e.ownerRole.trim())c(t,"ownerRole","Completion loop owner role is required.");if(!e.snapshotRef.trim())c(t,"snapshotRef","Completion loop snapshot ref is required.");if(!e.progressLedgerRef.trim())c(t,"progressLedgerRef","Completion loop progress ledger ref is required.");if(!e.signoff.verifierRole.trim())c(t,"signoff.verifierRole","Completion loop verifier role is required.");if(e.terminalConditions.length===0)c(t,"terminalConditions","Completion loop terminal conditions are required.");for(let r of ke(e.verificationPolicy))c(t,`verificationPolicy.${r.path}`,r.message);return t}function ve(e){return k(St(e),`Invalid completion loop "${e.id}"`),e}function Y(e){let t=[];if(!e.key.trim())c(t,"key","Role key is required.");if(!e.description.trim())c(t,"description","Description is required.");if(e.allowedTools.length===0)c(t,"allowedTools","At least one tool permission is required.");if(e.laneCompatibility.length===0)c(t,"laneCompatibility","At least one compatible lane is required.");return t}class B{items=new Map;register(e){return k(Y(e),`Invalid role profile "${e.key}"`),this.items.set(e.key,e),this}get(e){return this.items.get(e)}list(){return Array.from(this.items.values())}listForLane(e){return this.list().filter((t)=>t.laneCompatibility.includes(e))}require(e){let t=this.get(e);if(!t)throw Error(`Missing role profile "${e}".`);return t}}function Ra(e){return k(Y(e),`Invalid role profile "${e.key}"`),e}async function w(e,t){await e?.beforeAction?.(t)}async function T(e,t,r,a,i){await w(e.hooks,{action:t,runId:r,lane:"complete.persistent",actorId:a,reason:i?.reason,metadata:i?.metadata})}function Se(e,t){e.assert({roleKey:t.ownerRole,lane:"complete.persistent",requiredTools:["execute"]});for(let r of t.delegateRoles)if(r!=="human")e.assert({roleKey:r,lane:"complete.persistent"});if(t.signoff.verifierRole!=="human")e.assert({roleKey:t.signoff.verifierRole,lane:"complete.persistent",requiredTools:["review"]})}async function y(e,t){let r=await e.getCompletion(t);if(!r)throw Error(`Completion loop not found: ${t}`);return r}async function v(e,t,r){if(t.progressLedgerArtifactId)await e.saveArtifact({id:t.progressLedgerArtifactId,runId:t.runId,artifactType:"progress_ledger",createdAt:t.updatedAt,body:t.progressLedger,summary:r??t.progressLedger.at(-1)?.message??"Completion progress ledger."});if(t.loopStateArtifactId)await e.saveArtifact({id:t.loopStateArtifactId,runId:t.runId,artifactType:"loop_state",createdAt:t.updatedAt,body:t,summary:`Completion loop phase ${t.phase}.`})}function M(e){return[e.verifierRole,...e.requireArchitectReview?["architect"]:[],...e.requireHumanApproval?["human"]:[]]}function xe(e){return[e.missingEvidence.length>0?`missing evidence: ${e.missingEvidence.join(", ")}`:void 0,e.staleEvidence.length>0?`stale evidence: ${e.staleEvidence.join(", ")}`:void 0,e.missingApprovals.length>0?`missing approvals: ${e.missingApprovals.join(", ")}`:void 0,e.blockingRisks.length>0?`blocking risks: ${e.blockingRisks.join(", ")}`:void 0].filter((t)=>Boolean(t)).join("; ")}function Le(){let e=new B;for(let t of q)e.register(t);return e}async function he(e,t,r,a,i){await T(e,"complete.progress",t,i,{reason:r,metadata:{classification:a}});let n=await y(e.store,t),o=a?b(a):void 0,s={...n,phase:"working",iteration:n.iteration+1,progressLedger:[...n.progressLedger,{id:m("ledger"),iteration:n.iteration+1,createdAt:new Date().toISOString(),message:r,classification:o}],lastFailureClass:o,updatedAt:new Date().toISOString()};return await e.store.saveCompletion(s),await v(e.store,s,r),await e.store.appendEvent({id:m("event"),runId:t,type:"completion.progress",createdAt:s.updatedAt,phase:s.phase,message:r}),await R(e.store,s),s}async function Ae(e,t,r,a){await T(e,"complete.attach_evidence",t,a,{metadata:{classes:r.classes}});let i=await y(e.store,t),n={...i,phase:"waiting_for_evidence",evidenceBundleIds:Array.from(new Set([...i.evidenceBundleIds,r.id])),updatedAt:new Date().toISOString()};return await e.store.saveCompletion(n),await e.store.saveEvidence(r),await e.store.saveArtifact({id:m("artifact"),runId:t,artifactType:"evidence_bundle_ref",createdAt:n.updatedAt,body:r,summary:r.summary}),await v(e.store,n),await R(e.store,n),n}async function Pe(e,t,r,a){await T(e,"complete.request_approval",t,a,{metadata:{role:r.role,state:r.state}});let i=await y(e.store,t),n={...i,phase:"awaiting_signoff",pendingApprovalRoles:Array.from(new Set([...i.pendingApprovalRoles,r.role])),updatedAt:new Date().toISOString()};return await e.store.saveCompletion(n),await e.store.saveApproval(r),await C(e.store,r),await e.store.saveArtifact({id:m("artifact"),runId:t,artifactType:"signoff_request",createdAt:n.updatedAt,body:r,summary:`Requested ${r.role} sign-off.`}),await v(e.store,n),await R(e.store,n),n}async function be(e,t,r,a){await T(e,"complete.evaluate_evidence",t,a,{metadata:{blockingRisks:r}});let i=await y(e.store,t),n=e.gate.evaluate({policy:i.spec.verificationPolicy,evidence:await e.store.listEvidence(t),approvals:await e.store.listApprovals(t),blockingRisks:r}),o=n.missingEvidence.length>0||n.staleEvidence.length>0,s=n.passed||n.conditionallyPassed===!0,l={...i,phase:n.blockingRisks.length>0?"blocked":s?"awaiting_signoff":o?"remediating":n.missingApprovals.length>0?"awaiting_signoff":"remediating",lastGateResult:n,lastFailureClass:!s?n.blockingRisks.length>0?"policy_blocked":n.missingEvidence.length>0?"missing_evidence":o?"failing_evidence":void 0:void 0,updatedAt:new Date().toISOString()};return await e.store.saveCompletion(l),await v(e.store,l),await e.store.saveArtifact({id:m("artifact"),runId:t,artifactType:"evidence_gate_result",createdAt:l.updatedAt,body:n,summary:n.passed?"Evidence gate passed.":"Evidence gate requires remediation."}),await R(e.store,l),n}async function Ce(e,t,r){await T(e,"complete.resume",t,r);let a=await y(e.store,t);if(["completed","blocked","failed","aborted"].includes(a.phase))return a;await e.backend?.restoreSnapshot(t,a.spec.snapshotRef);let i={...a,phase:a.phase==="waiting_for_evidence"||a.phase==="remediating"?"remediating":a.phase==="awaiting_signoff"?"awaiting_signoff":"working",updatedAt:new Date().toISOString()};return await e.store.saveCompletion(i),await v(e.store,i),await R(e.store,i),i}function Ee(e){let t=b(e);if(e==="fatal")return{normalized:t,phase:"failed",retryable:!1};if(e==="retryable")return{normalized:t,phase:"remediating",retryable:!0};if(le(t))return{normalized:t,phase:"blocked",retryable:!1};if(t==="runtime_failure")return{normalized:t,phase:"failed",retryable:!1};if(ce(t))return{normalized:t,phase:"remediating",retryable:!0};return{normalized:t,phase:"failed",retryable:!1}}async function _e(e,t,r,a){await T(e,"complete.decide_approval",t,a,{metadata:{role:r.role,state:r.state}});let i=await y(e.store,t),n={id:m("approval"),runId:t,role:r.role,verdict:r.verdict,state:r.state,comment:r.comment,requestedAt:r.requestedAt??new Date().toISOString(),decidedAt:r.decidedAt,decidedBy:r.decidedBy},o={...i,pendingApprovalRoles:i.pendingApprovalRoles.filter((s)=>s!==n.role),lastFailureClass:n.state==="rejected"?"approval_denied":i.lastFailureClass,phase:n.state==="rejected"?"blocked":"awaiting_signoff",signoffArtifactId:i.signoffArtifactId??m("signoff"),updatedAt:new Date().toISOString()};return await e.store.saveApproval(n),await C(e.store,n),await e.store.saveCompletion(o),await e.store.saveArtifact({id:o.signoffArtifactId,runId:t,artifactType:"signoff_record",createdAt:o.updatedAt,body:n,summary:`${n.role} ${n.state}.`}),await v(e.store,o),await R(e.store,o),n}async function We(e,t,r,a,i){await T(e,"complete.record_failure",t,i,{reason:a,metadata:{classification:r}});let n=await y(e.store,t),o=Ee(r),s={...n,phase:o.phase,retryCount:o.retryable?n.retryCount+1:n.retryCount,lastFailureClass:o.normalized,updatedAt:new Date().toISOString()};return await e.store.saveCompletion(s),await v(e.store,s,a),await e.store.appendEvent({id:m("event"),runId:t,type:"completion.failure",createdAt:s.updatedAt,phase:s.phase,message:a,metadata:{classification:o.normalized,sourceClassification:r}}),await R(e.store,s),s}async function Be(e,t,r,a){await T(e,"complete.finalize",t,a,{reason:r.terminalReason,metadata:{status:r.status}});let i=await y(e.store,t),n=await e.store.listApprovals(t);if(r.status==="completed"){let u=e.gate.evaluate({policy:i.spec.verificationPolicy,evidence:await e.store.listEvidence(t),approvals:n,blockingRisks:r.unresolvedRisks});if(!u.passed&&u.conditionallyPassed!==!0)throw Error(xe(u));for(let x of M(i.spec.signoff))if(!n.some((oe)=>oe.role===x&&oe.state==="approved"))throw Error(`Missing required sign-off for role ${x}.`)}let o=new Date().toISOString(),s={...i,phase:r.status,pendingApprovalRoles:[],terminalRecordArtifactId:m("terminal"),updatedAt:o},l={runId:t,status:r.status,completedAt:o,iterationCount:i.iteration,evidenceBundleIds:i.evidenceBundleIds,approvalIds:r.approvalIds,unresolvedRisks:r.unresolvedRisks,terminalReason:r.terminalReason};return await e.store.saveCompletion(s),await v(e.store,s),await e.store.saveArtifact({id:s.terminalRecordArtifactId,runId:t,artifactType:"completion_record",createdAt:o,body:l,summary:l.terminalReason??`Completion loop ${l.status}.`}),await R(e.store,s,r.terminalReason),l}function Za(e,t){let r={store:e,backend:t?.backend,hooks:t?.hooks,gate:H(),roleGuard:O(t?.roleRegistry??Le())};return{async create(a,i,n){await T(r,"complete.create",a.id,n,{metadata:{ownerRole:a.ownerRole}}),ve(a);let o=Q(a.verificationPolicy,t?.policyRegistry);Se(r.roleGuard,a);let s=new Date().toISOString(),l={runId:a.id,spec:{...a,verificationPolicy:o},phase:"initialized",iteration:0,retryCount:0,progressLedger:[],evidenceBundleIds:[],pendingApprovalRoles:M(a.signoff),contextSnapshotArtifactId:m("context"),progressLedgerArtifactId:m("ledger-artifact"),loopStateArtifactId:m("loop-state"),createdAt:s,updatedAt:s};return await r.backend?.createSnapshot(a.id,a.snapshotRef),await e.saveCompletion(l),await e.saveArtifact({id:l.contextSnapshotArtifactId,runId:a.id,artifactType:"context_snapshot",createdAt:s,body:{spec:l.spec,contextSnapshot:i},summary:"Initial completion loop context snapshot."}),await v(e,l),await R(e,l),l},addProgress(a,i,n,o){return he(r,a,i,n,o)},attachEvidence(a,i,n){return Ae(r,a,i,n)},requestApproval(a,i,n){return Pe(r,a,i,n)},evaluateEvidence(a,i,n){return be(r,a,i,n)},resume(a,i){return Ce(r,a,i)},decideApproval(a,i,n){return _e(r,a,i,n)},recordFailure(a,i,n,o){return We(r,a,i,n,o)},finalize(a,i,n){return Be(r,a,i,n)},async getState(a){return y(e,a)},async require(a){return y(e,a)}}}function j(e){let t=[];if(!e.meta.id.trim())c(t,"meta.id","Plan id is required.");if(!e.objective.trim())c(t,"objective","Objective is required.");if(e.planSteps.length===0)c(t,"planSteps","At least one plan step is required.");for(let r of e.planSteps){if(!r.id.trim())c(t,"planSteps[].id","Plan step id is required.");if(r.acceptanceCriteria.length===0)c(t,`planSteps.${r.id}.acceptanceCriteria`,"Each plan step requires at least one acceptance criterion.")}if(e.authorityContext.policyRefs.length===0)c(t,"authorityContext.policyRefs","At least one policy ref is required.");if(e.authorityContext.ruleContextRefs.length===0)c(t,"authorityContext.ruleContextRefs","At least one rule-context ref is required.");if(!e.staffing.handoffRecommendation.nextLane)c(t,"staffing.handoffRecommendation.nextLane","Next lane is required.");if(!e.staffing.recommendedLanes.some((r)=>r.lane===e.staffing.handoffRecommendation.nextLane))c(t,"staffing.recommendedLanes","Handoff lane must be represented in the recommended lane set.");if(e.meta.scopeClass==="high-risk"){if(!e.constraints.some((r)=>r.toLowerCase().includes("rollback"))&&!e.assumptions.some((r)=>r.toLowerCase().includes("rollback")))c(t,"constraints","High-risk plans must describe rollback expectations.");if(e.verification.requiredApprovals.length<2)c(t,"verification.requiredApprovals","High-risk plans require expanded approval coverage.");if(e.verification.blockingRisks.length===0)c(t,"verification.blockingRisks","High-risk plans must name blocking risks explicitly.")}return t}async function De(e,t,r){await w(e?.hooks,{action:"append_artifact",runId:t,lane:"plan.consensus",actorId:e?.actorId,reason:`Persist ${r}`,metadata:{artifactType:r}})}async function Z(e,t,r){await w(e?.hooks,{action:"handoff",runId:e?.runId??t.meta.id,lane:"plan.consensus",actorId:e?.actorId,reason:`Emit ${r} consensus handoff`,metadata:{nextLane:t.staffing.handoffRecommendation.nextLane}})}function rn(e){return{async run(){let t=e.mode??"short",r=e.maxIterations??(t==="deliberate"?5:3),a=e.enforceReadOnly?await e.purityGuard?.capture():void 0;if(e.enforceReadOnly&&!e.purityGuard)throw Error("Consensus planning in read-only mode requires a purity guard.");try{let i=await e.planner.draft(),n=[],o=[];await A(o,e,{runId:e.authority?.runId??i.meta.id,id:P("planner_draft",0),type:"planner_draft",iteration:0,createdAt:new Date().toISOString(),body:{mode:t,plan:i}});for(let s=1;s<=r;s+=1){let l=await e.architect.review(i),u=xt(await e.critic.review(i),i,t);if(n.push(l,u),await A(o,e,{runId:e.authority?.runId??i.meta.id,id:P("architect_review",s),type:"architect_review",iteration:s,createdAt:l.createdAt,body:l}),await A(o,e,{runId:e.authority?.runId??i.meta.id,id:P("critique_verdict",s),type:"critique_verdict",iteration:s,createdAt:u.createdAt,body:u}),await A(o,e,{runId:e.authority?.runId??i.meta.id,id:P("tradeoff_record",s),type:"tradeoff_record",iteration:s,createdAt:new Date().toISOString(),body:i.tradeoffs}),l.verdict==="approve"&&u.verdict==="approve")return await A(o,e,{runId:e.authority?.runId??i.meta.id,id:P("plan_pack",s),type:"plan_pack",iteration:s,createdAt:new Date().toISOString(),body:i}),await Z(e.authority,i,t),{mode:t,plan:i,reviews:n,artifacts:o,approved:!0,iterations:s};i=await e.planner.revise({iteration:s,currentPlan:i,reviews:[l,u]}),await A(o,e,{runId:e.authority?.runId??i.meta.id,id:P("planner_revision",s),type:"planner_revision",iteration:s,createdAt:new Date().toISOString(),body:{mode:t,plan:i,reviews:[l,u]}})}return await A(o,e,{runId:e.authority?.runId??i.meta.id,id:P("plan_pack",r),type:"plan_pack",iteration:r,createdAt:new Date().toISOString(),body:i}),await Z(e.authority,i,t),{mode:t,plan:i,reviews:n,artifacts:o,approved:!1,iterations:r}}finally{if(e.enforceReadOnly)await e.purityGuard?.assertUnchanged(a)}}}}function xt(e,t,r){let a=j(t).map((i)=>i.message);if(r==="deliberate"){if(!t.constraints.some((i)=>i.toLowerCase().includes("rollback"))&&!t.assumptions.some((i)=>i.toLowerCase().includes("rollback")))a.push("Deliberate plans must describe rollback expectations.");if(!t.planSteps.some((i)=>i.acceptanceCriteria.some((n)=>n.toLowerCase().includes("test"))))a.push("Deliberate plans must include explicit test hardening.")}if(a.length===0)return e;return{...e,verdict:e.verdict==="reject"?"reject":"revise",findings:[...e.findings,...a],recommendedChanges:[...e.recommendedChanges,...a]}}async function A(e,t,r){let{runId:a,...i}=r;await De(t.authority,a,i.type),e.push(i),await t.artifactSink?.persist(i)}function P(e,t){return`${e}-${t}-${Date.now()}`}var Lt=["completed","failed","blocked","cancelled"];function K(e){if(!e.spec.shutdownPolicy.requireTerminalTasks)return!0;return e.tasks.every((t)=>Lt.includes(t.status))}function N(e){if(!e.spec.shutdownPolicy.requireEvidenceGate)return!0;if(e.spec.verificationLane.required)return e.evidenceBundleIds.length>0;return e.evidenceBundleIds.length>0||e.tasks.some((t)=>t.evidenceBundleIds.length>0)}function $e(e,t){return{runId:e.runId,status:t?"completed_with_followup_recommended":"completed",completedAt:new Date().toISOString(),evidenceBundleIds:e.evidenceBundleIds,cleanupStatus:e.cleanup.status,taskStatuses:e.tasks.map((r)=>({taskId:r.taskId,status:r.status})),followupRecommendation:t}}var qe=H(),ht=new Map(se.map((e)=>[e.key,e]));function D(e,t={}){let r=t.now?.()??new Date,a=t.laneRegistry?.get(e.run.lane)??ht.get(e.run.lane),i=(a?.requiredArtifacts??[]).filter((o)=>!At(e.artifacts,o)).map((o)=>String(o)),n=(a?.allowedTransitions.length??0)>0&&!e.run.recommendedNextLane;if(e.completion){let o=e.completion.lastGateResult??qe.evaluate({policy:e.completion.spec.verificationPolicy,evidence:e.evidence,approvals:e.approvals,blockingRisks:e.run.blockingRisks,now:()=>r});return{missingArtifacts:i,missingEvidence:[...o.missingEvidence,...o.staleEvidence],missingApprovals:o.missingApprovals,blockingRisks:o.blockingRisks,missingNextLane:n,terminalReadiness:J({missingArtifacts:i,missingEvidence:o.missingEvidence,missingApprovals:o.missingApprovals,blockingRisks:o.blockingRisks,hasStaleEvidence:o.staleEvidence.length>0,missingNextLane:n})}}if(e.team&&a&&typeof a.verificationPolicy!=="string"){let o=qe.evaluate({policy:a.verificationPolicy,evidence:e.evidence,approvals:e.approvals,blockingRisks:e.run.blockingRisks,now:()=>r}),s=o.missingApprovals.length>0?o.missingApprovals:e.run.pendingApprovalRoles.map((l)=>`${l}:approve`);return{missingArtifacts:i,missingEvidence:[...o.missingEvidence,...o.staleEvidence],missingApprovals:s,blockingRisks:o.blockingRisks,missingNextLane:n,terminalReadiness:J({missingArtifacts:i,missingEvidence:o.missingEvidence,missingApprovals:s,blockingRisks:o.blockingRisks,hasStaleEvidence:o.staleEvidence.length>0,missingNextLane:n,requiresCleanup:!0,cleanupInProgress:e.team.cleanup.status==="in_progress",fullyReady:K(e.team)&&N(e.team)&&(e.team.cleanup.status==="completed"||e.team.cleanup.status==="partial")})}}return{missingArtifacts:i,missingEvidence:[],missingApprovals:e.run.pendingApprovalRoles.map((o)=>`${o}:approve`),blockingRisks:e.run.blockingRisks,missingNextLane:n,terminalReadiness:J({missingArtifacts:i,missingEvidence:[],missingApprovals:e.run.pendingApprovalRoles.map((o)=>`${o}:approve`),blockingRisks:e.run.blockingRisks,hasStaleEvidence:!1,missingNextLane:n})}}function At(e,t){return e.some((r)=>{if(W(String(r.artifactType))!==t)return!1;return Pt(t,r.body)})}function Pt(e,t){switch(e){case"clarification_artifact":return typeof t==="object"&&t!==null&&F(t).length===0;case"plan_pack":return typeof t==="object"&&t!==null&&j(t).length===0;case"tradeoff_record":case"progress_ledger":return Array.isArray(t);case"architect_review":case"critique_verdict":case"completion_record":case"signoff_record":case"team_snapshot":case"verification_lane_evidence":return typeof t==="object"&&t!==null;default:return!0}}function J(e){if(e.requiresCleanup&&e.cleanupInProgress)return"cleanup_pending";if(e.blockingRisks.length>0)return"blocked";if(e.missingArtifacts.length>0)return"missing_artifact";if(e.hasStaleEvidence)return"stale_evidence";if(e.missingEvidence.length>0)return"missing_evidence";if(e.missingApprovals.length>0)return"missing_approval";if(e.missingNextLane)return"not_ready";if(e.requiresCleanup&&!e.fullyReady)return"not_ready";return"ready"}var G=90000;function Ve(e,t=new Date){let r=D(e,{now:()=>t}),a=e.run.evidenceBundleIds.length===0?0:e.evidence.length/Math.max(e.run.evidenceBundleIds.length,1);return{runId:e.run.runId,lane:e.run.lane,objective:e.run.objective,status:e.run.status,currentPhase:e.run.currentPhase,ownerRole:e.run.ownerRole,evidenceCompleteness:Math.min(1,a),missingArtifacts:r.missingArtifacts,pendingApprovals:e.run.pendingApprovalRoles,missingEvidence:r.missingEvidence,missingApprovals:r.missingApprovals,blockingRisks:r.blockingRisks,terminalReadiness:r.terminalReadiness,recommendedNextLane:e.run.recommendedNextLane,updatedAt:e.run.updatedAt}}function gn(e,t=new Date){let r=e.completion;if(!r)return;let a=D(e,{now:()=>t});return{runId:r.runId,phase:r.phase,iteration:r.iteration,retryCount:r.retryCount,snapshotRef:r.spec.snapshotRef,pendingApprovals:r.pendingApprovalRoles,evidenceBundles:r.evidenceBundleIds.length,lastFailureClass:r.lastFailureClass,missingEvidence:a.missingEvidence,terminalReadiness:a.terminalReadiness,updatedAt:r.updatedAt}}function pn(e,t=new Date){let r=e.team;if(!r)return;let a=r.workers.filter((s)=>s.status==="running").length,i=Ct(r,t),n=r.tasks.filter((s)=>Et(s.lease?.expiresAt,t)).length,o=r.tasks.filter((s)=>s.status==="ready").length;return{runId:r.runId,status:r.status,totalTasks:r.tasks.length,completedTasks:r.tasks.filter((s)=>s.status==="completed").length,activeWorkers:a,staleWorkers:i.length,staleLeaseCount:n,staleWorkerIds:i,pendingEvidence:r.tasks.filter((s)=>s.evidenceBundleIds.length===0).length,queueSkew:Math.max(o-a,0),verificationReady:bt(r),cleanupStatus:r.cleanup.status,updatedAt:r.updatedAt}}function bt(e){if(!e.spec.verificationLane.required)return!0;return e.evidenceBundleIds.length>0}function Ct(e,t){return e.workers.filter((r)=>{if(!r.lastHeartbeatAt)return!1;return t.getTime()-new Date(r.lastHeartbeatAt).getTime()>G}).map((r)=>r.workerId)}function Et(e,t){if(!e)return!1;return new Date(e).getTime()<t.getTime()}async function f(e,t,r,a,i){await w(e.hooks,{action:t,runId:r,lane:"team.coordinated",actorId:a,reason:i?.reason,metadata:i?.metadata})}async function d(e,t){let r=await e.getTeam(t);if(!r)throw Error(`Team run not found: ${t}`);return r}async function g(e,t){t.updatedAt=new Date().toISOString(),await e.saveTeam(t),await Te(e,t)}function L(e,t,r="idle"){if(!t)return;let a=e.workers.find((i)=>i.workerId===t);if(a)a.status=r,a.currentTaskId=void 0}function E(e,t){let r=e.tasks.find((a)=>a.taskId===t);if(!r)throw Error(`Task not found: ${t}`);return r}function He(e,t){let r=e.get(t);e.assert({roleKey:t,lane:"team.coordinated",requiredTools:r.routingRole==="executor"||r.posture==="builder"?["execute"]:r.key==="planner"?["read","analyze","review"]:["review"]})}function Oe(){let e=new B;for(let t of q)e.register(t);return e}async function X(e,t,r){await f(e,"pause",t,r);let a=await d(e.store,t),i=a.workers.filter((n)=>n.status==="running");if(i.length>0&&!e.adapter.pauseWorker)throw I(a.spec.backendKey,"pause");for(let n of i)await e.adapter.pauseWorker?.(t,n.workerId),n.status="paused";return a.status="paused",a.updatedAt=new Date().toISOString(),await e.store.appendEvent({id:m("event"),runId:t,type:"team.paused",createdAt:a.updatedAt,phase:a.status,message:"Team run paused."}),await g(e.store,a),a}async function z(e,t,r){await f(e,"resume",t,r);let a=await d(e.store,t),i=a.workers.filter((n)=>n.status==="paused");if(i.length>0&&!e.adapter.resumeWorker)throw I(a.spec.backendKey,"resume");for(let n of i)await e.adapter.resumeWorker?.(t,n.workerId),n.status=_t(n);return a.status="running",a.updatedAt=new Date().toISOString(),await e.store.appendEvent({id:m("event"),runId:t,type:"team.resumed",createdAt:a.updatedAt,phase:a.status,message:"Team run resumed."}),await g(e.store,a),a}async function Me(e,t,r,a,i){await f(e,"nudge",t,i,{reason:a,metadata:{workerId:r}});let n=await d(e.store,t);if(!n.workers.find((l)=>l.workerId===r))throw Error(`Worker not found: ${r}`);if(!n.spec.coordination.mailbox&&!e.adapter.nudgeWorker)throw I(n.spec.backendKey,"nudge");let s=new Date().toISOString();return n.mailbox.push({id:m("mail"),from:"system",to:r,scope:"system",createdAt:s,body:a}),await e.adapter.nudgeWorker?.(t,r,a),n.updatedAt=s,await e.store.appendEvent({id:m("event"),runId:t,type:"team.nudged",createdAt:s,phase:n.status,message:a,metadata:{workerId:r}}),await g(e.store,n),n.mailbox.at(-1)}function _t(e){return e.currentTaskId?"running":"idle"}function I(e,t){return Error(`Team backend "${e??"unknown"}" does not support ${t==="pause"?"pausing":t==="resume"?"resuming":"nudging"} workers.`)}function Wt(e){let t=[];if(!e.id.trim())c(t,"id","Team run id is required.");if(!e.objective.trim())c(t,"objective","Team run objective is required.");if(e.workers.length===0)c(t,"workers","Team run requires at least one worker.");let r=new Set;for(let n of e.workers){if(!n.workerId.trim())c(t,"workers[].workerId","Worker id is required.");if(r.has(n.workerId))c(t,`workers.${n.workerId}`,"Worker ids must be unique.");if(r.add(n.workerId),!n.roleProfile.trim())c(t,`workers.${n.workerId}.roleProfile`,"Worker role profile is required.")}let a=new Set(e.backlog.map((n)=>n.taskId)),i=new Set(e.workers.map((n)=>n.roleProfile));for(let n of e.backlog){if(!n.taskId.trim())c(t,"backlog[].taskId","Task id is required.");if(!n.title.trim())c(t,`backlog.${n.taskId}.title`,"Task title is required.");if(n.roleHint&&!i.has(n.roleHint))c(t,`backlog.${n.taskId}.roleHint`,`No worker is available for role "${n.roleHint}".`);for(let o of n.dependencies??[])if(!a.has(o))c(t,`backlog.${n.taskId}.dependencies`,`Unknown dependency "${o}".`);if(n.writePaths&&n.writePaths.some((o)=>!o.trim()))c(t,`backlog.${n.taskId}.writePaths`,"Write paths must be non-empty strings.")}if(e.verificationLane.required&&!e.verificationLane.ownerRole.trim())c(t,"verificationLane.ownerRole","Verification lane owner role is required.");return t}function je(e){return k(Wt(e),`Invalid team run "${e.id}"`),e}var Bt=["workspace","scoped-worktree"];function Ke(e,t){for(let r of e.workers)if(t(r.roleProfile).writeScope==="scoped-worktree"&&r.worktreeMode!=="isolated")throw Error(`Worker "${r.workerId}" requires isolated worktree mode for scoped-worktree writes.`);for(let r of e.backlog){if(!r.writePaths||r.writePaths.length===0)continue;if(!r.roleHint)throw Error(`Task "${r.taskId}" declares write paths and must declare a roleHint.`);let a=t(r.roleHint);if(!Bt.includes(a.writeScope))throw Error(`Role "${r.roleHint}" cannot own write paths for task "${r.taskId}".`)}}function Ne(e,t,r,a){let i=Array.from(new Set(t.backlog.filter((n)=>n.roleHint===r.roleProfile&&n.writePaths&&n.writePaths.length>0).flatMap((n)=>n.writePaths??[])));return{runId:e,workerId:r.workerId,roleKey:r.roleProfile,writeScope:a.writeScope,worktreeMode:r.worktreeMode,writePaths:i.length>0?i:void 0}}async function Ue(e,t,r){await f(e,"team.create",t.id,r,{metadata:{workerCount:t.workers.length,taskCount:t.backlog.length}}),je(t),Ke(t,(n)=>e.roleGuard.get(n));for(let n of t.workers)He(e.roleGuard,n.roleProfile);if(t.verificationLane.ownerRole!=="human")e.roleGuard.assert({roleKey:t.verificationLane.ownerRole,lane:"team.coordinated",requiredTools:["review"]});let a=new Date().toISOString(),i={runId:t.id,spec:t,status:"initialized",tasks:t.backlog.map((n)=>({taskId:n.taskId,title:n.title,description:n.description,roleHint:n.roleHint,dependencies:n.dependencies??[],writePaths:n.writePaths,status:(n.dependencies?.length??0)>0?"pending":"ready",evidenceBundleIds:[],retryHistory:[]})),workers:t.workers.map((n)=>({workerId:n.workerId,roleProfile:n.roleProfile,status:"idle"})),mailbox:[],heartbeatLog:[],cleanup:{status:"not_requested",failures:[]},evidenceBundleIds:[],createdAt:a,updatedAt:a};return await e.store.saveTeam(i),i}async function Fe(e,t,r){await f(e,"team.start",t,r);let a=await d(e.store,t);for(let i of a.workers){let n=a.spec.workers.find((o)=>o.workerId===i.workerId);if(!n)throw Error(`Worker spec not found: ${i.workerId}`);await e.adapter.startWorker(Ne(t,a.spec,n,e.roleGuard.get(i.roleProfile))),i.status="running"}return a.status="running",await g(e.store,a),a}async function Qe(e,t){let r=await d(e.store,t),a=new Date,i=r.workers.filter((n)=>{if(!n.lastHeartbeatAt)return!1;return a.getTime()-new Date(n.lastHeartbeatAt).getTime()>e.heartbeatStaleMs}).map((n)=>n.workerId);return{runId:t,status:r.status,totalTasks:r.tasks.length,completedTasks:r.tasks.filter((n)=>n.status==="completed").length,activeWorkers:r.workers.filter((n)=>n.status==="running").length,staleWorkers:i.length,staleLeaseCount:r.tasks.filter((n)=>n.lease&&new Date(n.lease.expiresAt).getTime()<a.getTime()).length,staleWorkerIds:i,pendingEvidence:r.tasks.filter((n)=>n.evidenceBundleIds.length===0).length,queueSkew:Math.max(r.tasks.filter((n)=>n.status==="ready").length-r.workers.filter((n)=>n.status==="running").length,0),verificationReady:!r.spec.verificationLane.required||r.evidenceBundleIds.length>0,cleanupStatus:r.cleanup.status,updatedAt:r.updatedAt}}async function Ye(e,t,r,a=new Date,i){await f(e,"team.rebalance",t,i,{reason:r});let n=await ee(e,t,a,i);return n=await te(e,t,a,i),n}async function ee(e,t,r=new Date,a){await f(e,"team.reclaim_expired_leases",t,a);let i=await d(e.store,t);for(let n of i.tasks)if(n.lease&&new Date(n.lease.expiresAt).getTime()<r.getTime())n.status="ready",n.lease=void 0,n.retryHistory.push("lease expired"),L(i,n.claimedBy);return await g(e.store,i),i}async function te(e,t,r=new Date,a){await f(e,"team.reconcile_worker_liveness",t,a);let i=await d(e.store,t);for(let n of i.workers)if(n.lastHeartbeatAt&&r.getTime()-new Date(n.lastHeartbeatAt).getTime()>e.heartbeatStaleMs){n.status="offline",i.heartbeatLog.push({id:m("heartbeat"),workerId:n.workerId,createdAt:r.toISOString(),currentTaskId:n.currentTaskId,health:"stale",progressSummary:n.progressSummary});for(let o of i.tasks.filter((s)=>s.claimedBy===n.workerId))o.status="ready",o.lease=void 0,o.retryHistory.push("worker heartbeat expired");L(i,n.workerId,"offline")}return await g(e.store,i),i}async function Ze(e,t,r,a){await f(e,"team.shutdown",t,a,{reason:r});let i=await d(e.store,t);i.cleanup={...i.cleanup,status:"in_progress",requestedAt:new Date().toISOString(),reason:r,failures:[]};for(let n of i.workers)try{await e.adapter.stopWorker(t,n.workerId),n.status="completed"}catch(o){n.status="failed",i.cleanup.failures.push({workerId:n.workerId,message:o instanceof Error?o.message:"Unknown cleanup failure"})}return i.cleanup.status=i.cleanup.failures.length===0?"completed":"partial",i.cleanup.completedAt=new Date().toISOString(),i.status=i.status==="running"?"paused":i.status,i.terminalReason=r,await e.store.saveArtifact({id:m("artifact"),runId:t,artifactType:"team_cleanup_state",createdAt:i.cleanup.completedAt,body:i.cleanup,summary:i.cleanup.status==="completed"?"Team cleanup completed.":"Team cleanup completed with partial failures."}),await g(e.store,i),i}async function Je(e,t,r,a){await f(e,"team.finalize",t,a,{reason:r});let i=await d(e.store,t);if(!["completed","partial"].includes(i.cleanup.status))throw Error(`Team run ${t} has not completed worker cleanup.`);if(!K(i))throw Error(`Team run ${t} still has non-terminal tasks.`);if(!N(i))throw Error(`Team run ${t} is missing required evidence.`);let n=$e(i,r);return i.status=n.status,i.updatedAt=n.completedAt,i.terminalStateArtifactId=m("terminal"),await e.store.saveArtifact({id:m("artifact"),runId:t,artifactType:"team_snapshot",createdAt:n.completedAt,body:n,summary:r??"Team run completed."}),await e.store.saveArtifact({id:i.terminalStateArtifactId,runId:t,artifactType:"terminal_state",createdAt:n.completedAt,body:n,summary:n.status}),await g(e.store,i),n}async function Ge(e,t,r,a=60000,i){await f(e,"team.claim_task",t,i,{metadata:{workerId:r,leaseMs:a}});let n=await d(e.store,t),o=n.workers.find((l)=>l.workerId===r),s=n.tasks.find((l)=>l.status==="ready"&&l.roleHint===o?.roleProfile)??n.tasks.find((l)=>l.status==="ready");if(!s)return;if(s.status="leased",s.claimedBy=r,s.lease={workerId:r,leasedAt:new Date().toISOString(),expiresAt:new Date(Date.now()+a).toISOString(),renewCount:0},o)o.status="running",o.currentTaskId=s.taskId;return await g(e.store,n),s}async function Xe(e,t,r,a=60000,i){await f(e,"team.renew_lease",t,i,{metadata:{taskId:r,leaseMs:a}});let n=await d(e.store,t),o=n.tasks.find((s)=>s.taskId===r);if(!o?.lease)throw Error(`Task lease not found: ${r}`);return o.lease.expiresAt=new Date(Date.now()+a).toISOString(),o.lease.renewCount+=1,await g(e.store,n),o}async function ze(e,t,r,a){await f(e,"team.complete_task",t,a,{metadata:{taskId:r}});let i=await d(e.store,t),n=E(i,r);n.status="completed",n.lease=void 0;for(let o of i.tasks.filter((s)=>s.dependencies.includes(r)))if(o.dependencies.every((s)=>i.tasks.some((l)=>l.taskId===s&&l.status==="completed")))o.status="ready";return L(i,n.claimedBy),await g(e.store,i),i}async function Ie(e,t,r,a,i){await f(e,"team.attach_task_evidence",t,i,{metadata:{taskId:r,bundleId:a}});let n=await d(e.store,t),o=E(n,r);return o.evidenceBundleIds=Array.from(new Set([...o.evidenceBundleIds,a])),await g(e.store,n),o}async function et(e,t,r,a){await f(e,"team.attach_run_evidence",t,a,{metadata:{bundleId:r}});let i=await d(e.store,t);return i.evidenceBundleIds=Array.from(new Set([...i.evidenceBundleIds,r])),await e.store.saveArtifact({id:m("artifact"),runId:t,artifactType:"verification_lane_evidence",createdAt:new Date().toISOString(),body:{bundleId:r},summary:`Attached verification evidence bundle ${r}.`}),await g(e.store,i),i}async function tt(e,t,r,a,i){await f(e,"team.fail_task",t,i,{reason:a,metadata:{taskId:r}});let n=await d(e.store,t),o=E(n,r);return o.status="failed",o.retryHistory.push(a),o.lease=void 0,L(n,o.claimedBy),await g(e.store,n),n}async function rt(e,t,r,a,i){await f(e,"team.heartbeat",t,i,{reason:a,metadata:{workerId:r}});let n=await d(e.store,t),o=n.workers.find((s)=>s.workerId===r);if(!o)throw Error(`Worker not found: ${r}`);return o.lastHeartbeatAt=new Date().toISOString(),o.progressSummary=a,n.heartbeatLog.push({id:m("heartbeat"),workerId:r,createdAt:o.lastHeartbeatAt,currentTaskId:o.currentTaskId,health:"healthy",progressSummary:a}),await g(e.store,n),o}async function re(e,t,r,a){await f(e,"team.send_message",t,a,{reason:r.body,metadata:{from:r.from,to:r.to,scope:r.scope}});let i=await d(e.store,t);return i.mailbox.push({...r,id:m("mail"),createdAt:new Date().toISOString()}),await g(e.store,i),i.mailbox.at(-1)}function Yn(e,t,r){let a={store:e,adapter:t,hooks:r?.hooks,roleGuard:O(r?.roleRegistry??Oe()),heartbeatStaleMs:r?.heartbeatStaleMs??G};return{create(i,n){return Ue(a,i,n)},start(i,n){return Fe(a,i,n)},claimNextTask(i,n,o=60000,s){return Ge(a,i,n,o,s)},renewLease(i,n,o=60000,s){return Xe(a,i,n,o,s)},completeTask(i,n,o){return ze(a,i,n,o)},attachTaskEvidence(i,n,o,s){return Ie(a,i,n,o,s)},attachRunEvidence(i,n,o){return et(a,i,n,o)},failTask(i,n,o,s){return tt(a,i,n,o,s)},heartbeat(i,n,o,s){return rt(a,i,n,o,s)},sendMessage(i,n,o){return re(a,i,n,o)},async rebalance(i,n,o=new Date,s){let l=await Ye(a,i,n,o,s);return await re(a,i,{from:"system",to:"leader",scope:"system",body:`Rebalance requested: ${n}`},s),l},reclaimExpiredLeases(i,n=new Date,o){return ee(a,i,n,o)},reconcileWorkerLiveness(i,n=new Date,o){return te(a,i,n,o)},pause(i,n){return X(a,i,n)},resume(i,n){return z(a,i,n)},nudge(i,n,o,s){return Me(a,i,n,o,s)},shutdown(i,n,o){return Ze(a,i,n,o)},finalize(i,n,o){return Je(a,i,n,o)},getStatusView(i){return Qe(a,i)},require(i){return d(e,i)},persist(i){return g(e,i)},releaseWorker:L,requireTask:E}}function ae(e){let t=[];if(!e.key)c(t,"key","Lane key is required.");if(!e.description.trim())c(t,"description","Description is required.");if(e.allowedTransitions.includes(e.key))c(t,"allowedTransitions","A lane cannot directly transition to itself.");if(e.requiredArtifacts.length===0)c(t,"requiredArtifacts","At least one required artifact must be declared.");if(typeof e.verificationPolicy==="string"?!e.verificationPolicy.trim():!e.verificationPolicy.key)c(t,"verificationPolicy","Verification policy key is required.");return t}class Dt{items=new Map;register(e){return k(ae(e),`Invalid execution lane spec "${e.key}"`),this.items.set(e.key,e),this}get(e){return this.items.get(e)}list(){return Array.from(this.items.values())}canTransition(e,t){let r=this.items.get(e);return r?r.allowedTransitions.includes(t):!1}}function In(e){return k(ae(e),`Invalid execution lane spec "${e.key}"`),e}class $t{runs=new Map;artifacts=new Map;events=new Map;transitions=new Map;evidence=new Map;approvals=new Map;completions=new Map;teams=new Map;async createRun(e){this.runs.set(e.runId,p(e))}async getRun(e){let t=this.runs.get(e);return t?p(t):void 0}async updateRun(e,t){let r=this.runs.get(e);if(!r)throw Error(`Lane run not found: ${e}`);let a=p(t(p(r)));return this.runs.set(e,a),p(a)}async listRuns(){return Array.from(this.runs.values()).map((e)=>p(e))}async saveArtifact(e){this.upsert(this.artifacts,e.runId,e)}async listArtifacts(e){return this.cloneList(this.artifacts,e)}async appendEvent(e){this.upsert(this.events,e.runId,e)}async listEvents(e){return this.cloneList(this.events,e)}async saveTransition(e){this.upsert(this.transitions,e.runId,e)}async listTransitions(e){return this.cloneList(this.transitions,e)}async saveEvidence(e){this.upsert(this.evidence,e.runId,e)}async listEvidence(e){return this.cloneList(this.evidence,e)}async saveApproval(e){this.upsert(this.approvals,e.runId,e)}async listApprovals(e){return this.cloneList(this.approvals,e)}async saveCompletion(e){this.completions.set(e.runId,p(e))}async getCompletion(e){let t=this.completions.get(e);return t?p(t):void 0}async saveTeam(e){this.teams.set(e.runId,p(e))}async getTeam(e){let t=this.teams.get(e);return t?p(t):void 0}async getSnapshot(e){let t=await this.getRun(e);if(!t)return;return{run:t,events:await this.listEvents(e),transitions:await this.listTransitions(e),artifacts:await this.listArtifacts(e),evidence:await this.listEvidence(e),approvals:await this.listApprovals(e),completion:await this.getCompletion(e),team:await this.getTeam(e)}}push(e,t,r){let a=e.get(t)??[];a.push(p(r)),e.set(t,a)}upsert(e,t,r){let a=e.get(t)??[],i=a.findIndex((n)=>n.id===r.id);if(i===-1)a.push(p(r));else a[i]=p(r);e.set(t,a)}cloneList(e,t){return(e.get(t)??[]).map((r)=>p(r))}}async function at(e,t,r){let a=await e.getSnapshot(t);if(!a)throw Error(`Execution lane run ${t} cannot be marked terminal.`);let i=D(a,{laneRegistry:r.laneRegistry,now:r.now});if(i.terminalReadiness!=="ready")throw Error(Vt(t,i))}function nt(e,t,r){if(t!=="completed")return;if(r.allowTerminalForRun?.(e,t))return;let a=r.laneRegistry?.get(e.lane),i=e.recommendedNextLane;if(!a)return;qt(a,e,i)}function qt(e,t,r){if(e.allowedTransitions.length===0){if(r)throw Error(`Execution lane run ${t.runId} cannot complete with a follow-up lane from "${t.lane}".`);return}if(!r)throw Error(`Execution lane run ${t.runId} must record a next lane before completing "${t.lane}".`);if(!e.allowedTransitions.includes(r))throw Error(`Execution lane run ${t.runId} cannot complete with follow-up lane "${r}" from "${t.lane}".`)}function Vt(e,t){return[`Execution lane run ${e} is not ready for terminal completion.`,t.missingArtifacts.length>0?`missing artifacts: ${t.missingArtifacts.join(", ")}`:void 0,t.missingEvidence.length>0?`missing evidence: ${t.missingEvidence.join(", ")}`:void 0,t.missingApprovals.length>0?`missing approvals: ${t.missingApprovals.join(", ")}`:void 0,t.blockingRisks.length>0?`blocking risks: ${t.blockingRisks.join(", ")}`:void 0,t.missingNextLane?"recommended next lane is missing":void 0].filter((r)=>Boolean(r)).join(" ")}function mi(e,t={}){return{async startRun(r,a){return await w(t.hooks,{action:"start_run",runId:r.runId,lane:r.lane,actorId:a}),await e.createRun(r),r},async transitionRun(r,a,i){let n=await e.getRun(r);if(!n)throw Error(`Execution lane run ${r} cannot hand off.`);return await w(t.hooks,{action:"transition_run",runId:r,lane:n.lane,actorId:i,reason:a.terminalReason,metadata:{status:a.status,currentPhase:a.currentPhase,recommendedNextLane:a.recommendedNextLane}}),e.updateRun(r,(o)=>({...o,status:a.status??o.status,currentPhase:a.currentPhase??o.currentPhase,recommendedNextLane:a.recommendedNextLane??o.recommendedNextLane,terminalReason:a.terminalReason??o.terminalReason,updatedAt:new Date().toISOString()}))},async markTerminal(r,a,i,n){let o=await e.getRun(r);if(!o)throw Error(`Execution lane run ${r} cannot be marked terminal.`);if(nt(o,a,t),await w(t.hooks,{action:"transition_run",runId:r,lane:o.lane,actorId:n,reason:i,metadata:{status:a}}),a==="completed")await at(e,r,t);return this.transitionRun(r,{status:a,currentPhase:a,terminalReason:i},n)},async appendArtifact(r,a,i){let n=await e.getRun(r);await w(t.hooks,{action:"append_artifact",runId:r,lane:n?.lane,actorId:i,metadata:{artifactType:a.artifactType}}),await e.saveArtifact({...a,id:m("artifact"),runId:r})},async appendEvidence(r,a,i){let n=await e.getRun(r);await w(t.hooks,{action:"append_evidence",runId:r,lane:n?.lane,actorId:i,metadata:{classes:a.classes}}),await e.saveEvidence(a),await e.updateRun(r,(o)=>({...o,evidenceBundleIds:Array.from(new Set([...o.evidenceBundleIds,a.id])),updatedAt:new Date().toISOString()}))},async appendApproval(r,a,i){let n=await e.getRun(r);await w(t.hooks,{action:"append_approval",runId:r,lane:n?.lane,actorId:i,metadata:{role:a.role,state:a.state}}),await e.saveApproval(a),await C(e,a)},async appendEvent(r,a,i,n){let o=await e.getRun(r);await w(t.hooks,{action:"append_event",runId:r,lane:o?.lane,actorId:n,reason:i,metadata:{type:a}}),await e.appendEvent({id:m("event"),runId:r,type:a,createdAt:new Date().toISOString(),message:i})},async handoffToLane(r,a,i,n){let o=await e.getRun(r);if(!o||!a)throw Error(`Execution lane run ${r} cannot hand off.`);if(await w(t.hooks,{action:"handoff",runId:r,lane:o.lane,actorId:n,reason:i,metadata:{to:a}}),o.lane===a)throw Error(`Execution lane run ${r} cannot hand off to itself.`);if(t.laneRegistry&&!t.laneRegistry.canTransition(o.lane,a))throw Error(`Execution lane run ${r} cannot transition from "${o.lane}" to "${a}".`);let s={id:m("transition"),runId:r,from:o.lane,to:a,reason:i,createdAt:new Date().toISOString(),actorId:n};return await e.saveTransition(s),await e.updateRun(r,(l)=>({...l,recommendedNextLane:a,updatedAt:new Date().toISOString()})),s},async getStatusView(r){let a=await e.getSnapshot(r);if(!a)return;return Ve(a)},async getSnapshot(r){return e.getSnapshot(r)}}}function di(e){return{exportedAt:new Date().toISOString(),run:e.run,state:{completion:e.completion,team:e.team},events:e.events,transitions:e.transitions,artifacts:e.artifacts,evidence:e.evidence,approvals:e.approvals}}function S(e){return JSON.stringify(e,null,2)}function U(e){return e.map((t)=>JSON.stringify(t)).join(`
|
|
2
|
+
`)}function h(e,t){try{return JSON.parse(t)}catch(r){throw Error(`Invalid JSON in ${e}: ${r instanceof Error?r.message:"unknown parse failure"}`)}}function $(e,t,r){if(t===void 0)return r;return h(e,t)}function ne(e,t){let r=t.trim();if(!r)return[];return r.split(`
|
|
3
|
+
`).map((a,i)=>{try{return JSON.parse(a)}catch(n){throw Error(`Invalid NDJSON in ${e} at line ${i+1}: ${n instanceof Error?n.message:"unknown parse failure"}`)}})}function ie(e,t,r){if(t===void 0)return r;return ne(e,t)}function ki(e){let t={"laneRun.json":S(e.run),"state.json":S(Ht(e)),"events.ndjson":U(e.events),"artifacts.json":S(e.artifacts),"evidence.json":S(e.evidence),"approvals.json":S(e.approvals),"transitions.json":S(e.transitions)};if(e.team){let r=Mt(e);t["workers.json"]=S(r.workers),t["tasks.json"]=S(r.tasks),t["leases.json"]=S(r.leases),t["mailbox.ndjson"]=U(r.mailbox),t["heartbeats.ndjson"]=U(r.heartbeats),t["terminal-state.json"]=S(r.terminalState)}return t}async function yi(e,t){let r=Kt(t);await e.createRun(r.run);for(let i of r.events)await e.appendEvent(i);for(let i of r.transitions)await e.saveTransition(i);for(let i of r.artifacts)await e.saveArtifact(i);for(let i of r.evidence)await e.saveEvidence(i);for(let i of r.approvals)await e.saveApproval(i);if(r.state.completion)await e.saveCompletion(r.state.completion);if(r.state.team)await e.saveTeam(Nt(r));let a=await e.getSnapshot(r.run.runId);if(!a)throw Error(`Failed to hydrate lane runtime store for run ${r.run.runId}.`);return a}function Ht(e){return{completion:e.completion,team:e.team?Ot(e.team):void 0}}function Ot(e){return{runId:e.runId,spec:e.spec,status:e.status,cleanup:e.cleanup,evidenceBundleIds:e.evidenceBundleIds,createdAt:e.createdAt,updatedAt:e.updatedAt,terminalReason:e.terminalReason,terminalStateArtifactId:e.terminalStateArtifactId}}function Mt(e){let t=e.team,r=t.tasks.map(({lease:i,...n})=>n),a=t.tasks.filter((i)=>i.lease).map((i)=>({taskId:i.taskId,lease:i.lease}));return{workers:t.workers,tasks:r,leases:a,mailbox:t.mailbox,heartbeats:t.heartbeatLog,terminalState:jt(e)}}function jt(e){if(!e.team)return null;return((e.team.terminalStateArtifactId?e.artifacts.find((r)=>r.id===e.team?.terminalStateArtifactId):void 0)??[...e.artifacts].reverse().find((r)=>W(String(r.artifactType))==="terminal_state"))?.body??null}function Kt(e){return{run:h("laneRun.json",e["laneRun.json"]),state:h("state.json",e["state.json"]),events:ne("events.ndjson",e["events.ndjson"]),transitions:h("transitions.json",e["transitions.json"]),artifacts:h("artifacts.json",e["artifacts.json"]),evidence:h("evidence.json",e["evidence.json"]),approvals:h("approvals.json",e["approvals.json"]),workers:$("workers.json",e["workers.json"],[]),tasks:$("tasks.json",e["tasks.json"],[]),leases:$("leases.json",e["leases.json"],[]),mailbox:ie("mailbox.ndjson",e["mailbox.ndjson"],[]),heartbeats:ie("heartbeats.ndjson",e["heartbeats.ndjson"],[]),terminalState:$("terminal-state.json",e["terminal-state.json"],null)}}function Nt(e){let t=e.state.team,r=new Map(e.leases.map((a)=>[a.taskId,a.lease]));return{...t,workers:e.workers,tasks:e.tasks.map((a)=>({...a,lease:r.get(a.taskId)})),mailbox:e.mailbox,heartbeatLog:e.heartbeats}}function Ti(){return{select(e){if(e.preferredLane)return e.preferredLane;if(e.planPack)return Ut(e.planPack,e.parallelizableTaskCount);if((e.ambiguityScore??0)>=0.45)return"clarify";if(e.hasPlanPack){if(e.parallelizableTaskCount&&e.parallelizableTaskCount>2)return"team.coordinated";return"complete.persistent"}return"plan.consensus"}}}function Ut(e,t){let r=e.staffing.handoffRecommendation.nextLane;if(r)return r;if((t??e.planSteps.length)>3)return"team.coordinated";return"complete.persistent"}export{ke as validateVerificationPolicySource,we as validateVerificationPolicy,Wt as validateTeamRunSpec,Y as validateRoleProfile,j as validateExecutionPlanPack,ae as validateExecutionLaneSpec,St as validateCompletionLoopSpec,F as validateClarificationArtifact,Te as syncLaneRunFromTeam,R as syncLaneRunFromCompletion,C as syncLaneApprovalState,Q as resolveVerificationPolicySource,pr as resolveExecutionLaneCommand,c as pushIssue,wr as parseExecutionLaneCommand,b as normalizeExecutionLaneFailureClass,me as normalizeExecutionLaneEvidenceClasses,V as normalizeExecutionLaneEvidenceClass,er as normalizeExecutionLaneArtifactTypes,W as normalizeExecutionLaneArtifactType,ce as isRetryableExecutionLaneFailureClass,st as isExecutionLaneFailureClass,rr as isExecutionLaneEvidenceClass,tr as isExecutionLaneArtifactType,le as isBlockingExecutionLaneFailureClass,yi as hydrateLaneRuntimeStore,D as evaluateLaneReadiness,Ra as defineRoleProfile,In as defineExecutionLane,Wr as createWorkflowEngineTeamBackend,Br as createWorkflowEngineCompletionBackend,Pr as createTmuxTeamBackend,Yn as createTeamRun,Er as createTeamBackendAdapter,hr as createSubagentTeamBackend,O as createRoleGuard,xr as createQueueTeamBackend,Ti as createLaneSelector,mi as createLaneRuntime,ki as createLanePersistenceFiles,di as createLanePersistenceBundle,ft as createInProcessTeamBackend,Tr as createInProcessCompletionBackend,vr as createInMemoryTeamBackend,H as createEvidenceGate,Jr as createEvidenceBundle,rn as createConsensusPlanningLane,Za as createCompletionLoop,Cr as createCompletionBackendAdapter,na as createClarifyLane,pn as buildTeamStatusView,Ve as buildLaneStatusView,gn as buildCompletionStatusView,ye as assertValidVerificationPolicy,je as assertValidTeamRunSpec,ve as assertValidCompletionLoopSpec,fe as assertValidClarificationArtifact,k as assertValid,w as assertLaneAuthority,Rt as VerificationPolicyRegistry,G as TEAM_STALE_HEARTBEAT_MS,B as RoleProfileRegistry,$t as InMemoryLaneRuntimeStore,Dt as ExecutionLaneRegistry,it as EXECUTION_LANE_FAILURE_CLASSES,lt as EXECUTION_LANE_EVIDENCE_CLASSES,ue as EXECUTION_LANE_COMMANDS,ct as EXECUTION_LANE_ARTIFACT_TYPES,_ as DEFAULT_TRANSITIONS,q as DEFAULT_ROLE_PROFILES,se as DEFAULT_LANES};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var c=[{usage:"/clarify",alias:"/clarify",lane:"clarify",mode:"default",acceptsTask:!0,summary:"Reduce ambiguity and capture a clarification artifact."},{usage:"/plan",alias:"/plan",lane:"plan.consensus",mode:"default",acceptsTask:!0,summary:"Draft a consensus-ready execution plan pack."},{usage:"/plan --consensus",alias:"/plan",lane:"plan.consensus",mode:"consensus",acceptsTask:!0,summary:"Run the deliberate consensus-planning variant."},{usage:"/complete",alias:"/complete",lane:"complete.persistent",mode:"default",acceptsTask:!0,summary:"Start or resume the persistent completion loop."},{usage:"/team",alias:"/team",lane:"team.coordinated",mode:"default",acceptsTask:!0,summary:"Start coordinated multi-worker execution."}],l={clarify:"/clarify","plan.consensus":"/plan","complete.persistent":"/complete","team.coordinated":"/team"};function d(e){let s=e.startsWith("/")?e:l[e],a=c.find((n)=>n.usage===s);if(!a)throw Error(`Unsupported execution lane command: ${e}`);return a}function p(e){let s=e.trim();if(!s.startsWith("/"))return;let[a="",n="",...o]=s.split(/\s+/);if(a==="/plan"&&n.startsWith("--")&&n!=="--consensus")return;let t=a==="/plan"&&n==="--consensus"?"/plan --consensus":a,r=c.find((u)=>u.usage===t);if(!r)return;let i=t==="/plan --consensus"?["--consensus"]:[],m=t==="/plan --consensus"?o.join(" ").trim():[n,...o].join(" ").trim();return{...r,raw:e,task:m,flags:i}}export{d as resolveExecutionLaneCommand,p as parseExecutionLaneCommand,c as EXECUTION_LANE_COMMANDS};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var n=["missing_evidence","failing_evidence","policy_blocked","approval_denied","runtime_failure","worker_timeout","lease_conflict"],i={retryable:"runtime_failure",blocked:"policy_blocked",fatal:"runtime_failure"};function r(e){return a(e)?e:i[e]}function a(e){return n.includes(e)}function g(e){switch(r(e)){case"missing_evidence":case"failing_evidence":case"runtime_failure":case"worker_timeout":case"lease_conflict":return!0;default:return!1}}function m(e){switch(r(e)){case"policy_blocked":case"approval_denied":return!0;default:return!1}}var o=["architect_review","clarification_artifact","completion_record","context_snapshot","critique_verdict","evidence_bundle_ref","evidence_gate_result","loop_state","operator_action","plan_pack","planner_draft","planner_revision","progress_ledger","signoff_record","signoff_request","team_cleanup_state","team_snapshot","terminal_state","tradeoff_record","verification_lane_evidence"],s=["architect_review","clarification_artifact","completion_record","critique_verdict","plan_pack","progress_ledger","signoff_record","team_snapshot","tradeoff_record","verification_lane_evidence","verification_results"],c={"architect-review":"architect_review","clarification-artifact":"clarification_artifact","completion-record":"completion_record","context-snapshot":"context_snapshot","critic-review":"critique_verdict","evidence-bundle-ref":"evidence_bundle_ref","evidence-gate-result":"evidence_gate_result","execution-plan-pack":"plan_pack","loop-state":"loop_state","operator-action":"operator_action","plan-pack":"plan_pack","planner-draft":"planner_draft","planner-revision":"planner_revision","progress-ledger":"progress_ledger","review-record":"architect_review","signoff-record":"signoff_record","signoff-request":"signoff_request","team-cleanup-state":"team_cleanup_state","team-completion-snapshot":"team_snapshot","team-snapshot":"team_snapshot","terminal-record":"completion_record","terminal-state":"terminal_state","tradeoff-record":"tradeoff_record","verification-lane-evidence":"verification_lane_evidence"},d={"architect-review":"architect_review","clarification-artifact":"clarification_artifact","completion-record":"completion_record","critic-review":"critique_verdict","execution-plan-pack":"plan_pack","plan-pack":"plan_pack","progress-ledger":"progress_ledger","signoff-record":"signoff_record","team-completion-snapshot":"team_snapshot","team-snapshot":"team_snapshot","terminal-record":"completion_record","tradeoff-record":"tradeoff_record","verification-lane-evidence":"verification_lane_evidence","verification-results":"verification_results"};function p(e){return c[e]??e}function l(e){return d[e]??e}function f(e){return e.map((t)=>p(t))}function R(e){return e.map((t)=>l(t))}function x(e){return o.includes(e)}function y(e){return s.includes(e)}export{r as normalizeExecutionLaneFailureClass,R as normalizeExecutionLaneEvidenceClasses,l as normalizeExecutionLaneEvidenceClass,f as normalizeExecutionLaneArtifactTypes,p as normalizeExecutionLaneArtifactType,g as isRetryableExecutionLaneFailureClass,a as isExecutionLaneFailureClass,y as isExecutionLaneEvidenceClass,x as isExecutionLaneArtifactType,m as isBlockingExecutionLaneFailureClass,n as EXECUTION_LANE_FAILURE_CLASSES,s as EXECUTION_LANE_EVIDENCE_CLASSES,o as EXECUTION_LANE_ARTIFACT_TYPES};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { ExecutionLaneSpec, LaneKey } from '../types';
|
|
2
|
+
export declare class ExecutionLaneRegistry {
|
|
3
|
+
private readonly items;
|
|
4
|
+
register(spec: ExecutionLaneSpec): this;
|
|
5
|
+
get(key: LaneKey): ExecutionLaneSpec | undefined;
|
|
6
|
+
list(): ExecutionLaneSpec[];
|
|
7
|
+
canTransition(from: LaneKey, to: LaneKey): boolean;
|
|
8
|
+
}
|
|
9
|
+
export declare function defineExecutionLane(spec: ExecutionLaneSpec): ExecutionLaneSpec;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { RoleProfile } from '../types';
|
|
2
|
+
export declare class RoleProfileRegistry {
|
|
3
|
+
private readonly items;
|
|
4
|
+
register(profile: RoleProfile): this;
|
|
5
|
+
get(key: string): RoleProfile | undefined;
|
|
6
|
+
list(): RoleProfile[];
|
|
7
|
+
listForLane(lane: string): RoleProfile[];
|
|
8
|
+
require(key: string): RoleProfile;
|
|
9
|
+
}
|
|
10
|
+
export declare function defineRoleProfile(profile: RoleProfile): RoleProfile;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { VerificationPolicy, VerificationPolicySource } from '../types';
|
|
2
|
+
export declare class VerificationPolicyRegistry {
|
|
3
|
+
private readonly items;
|
|
4
|
+
register(policy: VerificationPolicy): this;
|
|
5
|
+
get(key: string): VerificationPolicy | undefined;
|
|
6
|
+
require(key: string): VerificationPolicy;
|
|
7
|
+
resolve(source: VerificationPolicySource): VerificationPolicy;
|
|
8
|
+
list(): VerificationPolicy[];
|
|
9
|
+
}
|
|
10
|
+
export declare function resolveVerificationPolicySource(source: VerificationPolicySource, registry?: VerificationPolicyRegistry): VerificationPolicy;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { LaneKey } from '../types';
|
|
2
|
+
export type LaneAuthorityAction = 'append_approval' | 'append_artifact' | 'append_evidence' | 'append_event' | 'pause' | 'resume' | 'nudge' | 'retry' | 'abort' | 'shutdown' | 'request_approval' | 'escalate' | 'replay' | 'start_run' | 'transition_run' | 'handoff' | 'complete.attach_evidence' | 'complete.create' | 'complete.decide_approval' | 'complete.evaluate_evidence' | 'complete.finalize' | 'complete.progress' | 'complete.record_failure' | 'complete.request_approval' | 'complete.resume' | 'team.attach_run_evidence' | 'team.attach_task_evidence' | 'team.claim_task' | 'team.complete_task' | 'team.create' | 'team.fail_task' | 'team.finalize' | 'team.heartbeat' | 'team.rebalance' | 'team.reclaim_expired_leases' | 'team.reconcile_worker_liveness' | 'team.renew_lease' | 'team.send_message' | 'team.start' | 'team.shutdown';
|
|
3
|
+
export interface LaneAuthorityRequest {
|
|
4
|
+
action: LaneAuthorityAction;
|
|
5
|
+
runId: string;
|
|
6
|
+
lane?: LaneKey;
|
|
7
|
+
actorId?: string;
|
|
8
|
+
reason?: string;
|
|
9
|
+
metadata?: Record<string, unknown>;
|
|
10
|
+
}
|
|
11
|
+
export interface LaneAuthorityHooks {
|
|
12
|
+
beforeAction?(request: LaneAuthorityRequest): Promise<void> | void;
|
|
13
|
+
}
|
|
14
|
+
export declare function assertLaneAuthority(hooks: LaneAuthorityHooks | undefined, request: LaneAuthorityRequest): Promise<void>;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { ApprovalRecord, CompletionLoopState, EvidenceBundleRef, LaneArtifactRecord, LaneEventRecord, LaneRunState, LaneRuntimeSnapshot, LaneTransitionRecord, TeamRunState } from '../types';
|
|
2
|
+
import type { LaneRuntimeStore } from './store';
|
|
3
|
+
export declare class InMemoryLaneRuntimeStore implements LaneRuntimeStore {
|
|
4
|
+
private readonly runs;
|
|
5
|
+
private readonly artifacts;
|
|
6
|
+
private readonly events;
|
|
7
|
+
private readonly transitions;
|
|
8
|
+
private readonly evidence;
|
|
9
|
+
private readonly approvals;
|
|
10
|
+
private readonly completions;
|
|
11
|
+
private readonly teams;
|
|
12
|
+
createRun(run: LaneRunState): Promise<void>;
|
|
13
|
+
getRun(runId: string): Promise<LaneRunState | undefined>;
|
|
14
|
+
updateRun(runId: string, updater: (current: LaneRunState) => LaneRunState): Promise<LaneRunState>;
|
|
15
|
+
listRuns(): Promise<LaneRunState[]>;
|
|
16
|
+
saveArtifact(artifact: LaneArtifactRecord): Promise<void>;
|
|
17
|
+
listArtifacts(runId: string): Promise<LaneArtifactRecord[]>;
|
|
18
|
+
appendEvent(event: LaneEventRecord): Promise<void>;
|
|
19
|
+
listEvents(runId: string): Promise<LaneEventRecord[]>;
|
|
20
|
+
saveTransition(transition: LaneTransitionRecord): Promise<void>;
|
|
21
|
+
listTransitions(runId: string): Promise<LaneTransitionRecord[]>;
|
|
22
|
+
saveEvidence(bundle: EvidenceBundleRef): Promise<void>;
|
|
23
|
+
listEvidence(runId: string): Promise<EvidenceBundleRef[]>;
|
|
24
|
+
saveApproval(approval: ApprovalRecord): Promise<void>;
|
|
25
|
+
listApprovals(runId: string): Promise<ApprovalRecord[]>;
|
|
26
|
+
saveCompletion(state: CompletionLoopState): Promise<void>;
|
|
27
|
+
getCompletion(runId: string): Promise<CompletionLoopState | undefined>;
|
|
28
|
+
saveTeam(state: TeamRunState): Promise<void>;
|
|
29
|
+
getTeam(runId: string): Promise<TeamRunState | undefined>;
|
|
30
|
+
getSnapshot(runId: string): Promise<LaneRuntimeSnapshot | undefined>;
|
|
31
|
+
private push;
|
|
32
|
+
private upsert;
|
|
33
|
+
private cloneList;
|
|
34
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { ExecutionLaneSpec, LaneRunState, LaneTerminalStatus } from '../types';
|
|
2
|
+
import type { LaneAuthorityHooks } from './authority-hooks';
|
|
3
|
+
export interface LaneRuntimeOptions {
|
|
4
|
+
hooks?: LaneAuthorityHooks;
|
|
5
|
+
laneRegistry?: {
|
|
6
|
+
get(key: LaneRunState['lane']): ExecutionLaneSpec | undefined;
|
|
7
|
+
canTransition(from: LaneRunState['lane'], to: LaneRunState['lane']): boolean;
|
|
8
|
+
};
|
|
9
|
+
allowTerminalForRun?(run: LaneRunState, status: LaneTerminalStatus): boolean;
|
|
10
|
+
now?: () => Date;
|
|
11
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { LaneRunState, LaneTerminalStatus } from '../types';
|
|
2
|
+
import type { LaneRuntimeOptions } from './lane-runtime-options';
|
|
3
|
+
import type { LaneRuntimeStore } from './store';
|
|
4
|
+
export declare function assertLaneTerminalReadiness(store: LaneRuntimeStore, runId: string, options: LaneRuntimeOptions): Promise<void>;
|
|
5
|
+
export declare function assertTerminalTransition(run: LaneRunState, status: LaneTerminalStatus, options: LaneRuntimeOptions): void;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { ApprovalRecord, EvidenceBundleRef, LaneArtifactRecord, LaneRunState, LaneStatusView, LaneTerminalStatus, LaneTransitionRecord } from '../types';
|
|
2
|
+
import type { LaneRuntimeOptions } from './lane-runtime-options';
|
|
3
|
+
import type { LaneRuntimeStore } from './store';
|
|
4
|
+
export declare function createLaneRuntime(store: LaneRuntimeStore, options?: LaneRuntimeOptions): {
|
|
5
|
+
startRun(run: LaneRunState, actorId?: string): Promise<LaneRunState>;
|
|
6
|
+
transitionRun(runId: string, input: {
|
|
7
|
+
status?: LaneRunState["status"];
|
|
8
|
+
currentPhase?: string;
|
|
9
|
+
recommendedNextLane?: LaneRunState["recommendedNextLane"];
|
|
10
|
+
terminalReason?: string;
|
|
11
|
+
}, actorId?: string): Promise<LaneRunState>;
|
|
12
|
+
markTerminal(runId: string, status: LaneTerminalStatus, reason?: string, actorId?: string): Promise<LaneRunState>;
|
|
13
|
+
appendArtifact(runId: string, artifact: Omit<LaneArtifactRecord, "id">, actorId?: string): Promise<void>;
|
|
14
|
+
appendEvidence(runId: string, bundle: EvidenceBundleRef, actorId?: string): Promise<void>;
|
|
15
|
+
appendApproval(runId: string, approval: ApprovalRecord, actorId?: string): Promise<void>;
|
|
16
|
+
appendEvent(runId: string, type: string, message?: string, actorId?: string): Promise<void>;
|
|
17
|
+
handoffToLane(runId: string, to: LaneRunState["recommendedNextLane"], reason: string, actorId?: string): Promise<LaneTransitionRecord>;
|
|
18
|
+
getStatusView(runId: string): Promise<LaneStatusView | undefined>;
|
|
19
|
+
getSnapshot(runId: string): Promise<import("..").LaneRuntimeSnapshot | undefined>;
|
|
20
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export declare function toJson(value: unknown): string;
|
|
2
|
+
export declare function toNdjson(values: readonly unknown[]): string;
|
|
3
|
+
export declare function parseJson<T>(fileName: string, content: string): T;
|
|
4
|
+
export declare function parseOptionalJson<T>(fileName: string, content: string | undefined, fallback: T): T;
|
|
5
|
+
export declare function parseNdjson<T>(fileName: string, content: string): T[];
|
|
6
|
+
export declare function parseOptionalNdjson<T>(fileName: string, content: string | undefined, fallback: T[]): T[];
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { LanePersistenceFiles, LaneRuntimeSnapshot } from '../types';
|
|
2
|
+
import type { LaneRuntimeStore } from './store';
|
|
3
|
+
export declare function createLanePersistenceFiles(snapshot: LaneRuntimeSnapshot): LanePersistenceFiles;
|
|
4
|
+
export declare function hydrateLaneRuntimeStore(store: LaneRuntimeStore, files: LanePersistenceFiles): Promise<LaneRuntimeSnapshot>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|