@polpo-ai/core 0.15.144 → 0.16.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 +30 -0
- package/dist/__tests__/custom-tool-runner.test.d.ts +2 -0
- package/dist/__tests__/custom-tool-runner.test.d.ts.map +1 -0
- package/dist/__tests__/custom-tool-runner.test.js +121 -0
- package/dist/__tests__/custom-tool-runner.test.js.map +1 -0
- package/dist/__tests__/mcp-runner-client.test.d.ts +2 -0
- package/dist/__tests__/mcp-runner-client.test.d.ts.map +1 -0
- package/dist/__tests__/mcp-runner-client.test.js +144 -0
- package/dist/__tests__/mcp-runner-client.test.js.map +1 -0
- package/dist/__tests__/mission-execution.test.d.ts +2 -0
- package/dist/__tests__/mission-execution.test.d.ts.map +1 -0
- package/dist/__tests__/mission-execution.test.js +68 -0
- package/dist/__tests__/mission-execution.test.js.map +1 -0
- package/dist/__tests__/run-state-monitor.test.d.ts +2 -0
- package/dist/__tests__/run-state-monitor.test.d.ts.map +1 -0
- package/dist/__tests__/run-state-monitor.test.js +59 -0
- package/dist/__tests__/run-state-monitor.test.js.map +1 -0
- package/dist/__tests__/runtime-metadata.test.d.ts +2 -0
- package/dist/__tests__/runtime-metadata.test.d.ts.map +1 -0
- package/dist/__tests__/runtime-metadata.test.js +17 -0
- package/dist/__tests__/runtime-metadata.test.js.map +1 -0
- package/dist/__tests__/task-execution-router.test.js +1 -1
- package/dist/__tests__/task-execution-router.test.js.map +1 -1
- package/dist/__tests__/task-runner-agent-lifetime.test.d.ts +2 -0
- package/dist/__tests__/task-runner-agent-lifetime.test.d.ts.map +1 -0
- package/dist/__tests__/task-runner-agent-lifetime.test.js +136 -0
- package/dist/__tests__/task-runner-agent-lifetime.test.js.map +1 -0
- package/dist/adapter.d.ts +18 -0
- package/dist/adapter.d.ts.map +1 -1
- package/dist/agent-manager.d.ts +3 -0
- package/dist/agent-manager.d.ts.map +1 -1
- package/dist/agent-manager.js +28 -2
- package/dist/agent-manager.js.map +1 -1
- package/dist/agent-store.d.ts +70 -1
- package/dist/agent-store.d.ts.map +1 -1
- package/dist/agent-store.js +103 -1
- package/dist/agent-store.js.map +1 -1
- package/dist/approval-manager.d.ts +24 -4
- package/dist/approval-manager.d.ts.map +1 -1
- package/dist/approval-manager.js +160 -112
- package/dist/approval-manager.js.map +1 -1
- package/dist/approval-manager.test.d.ts +2 -0
- package/dist/approval-manager.test.d.ts.map +1 -0
- package/dist/approval-manager.test.js +116 -0
- package/dist/approval-manager.test.js.map +1 -0
- package/dist/assessment-orchestrator.d.ts +12 -1
- package/dist/assessment-orchestrator.d.ts.map +1 -1
- package/dist/assessment-orchestrator.js +181 -83
- package/dist/assessment-orchestrator.js.map +1 -1
- package/dist/chat-interactions.d.ts +23 -3
- package/dist/chat-interactions.d.ts.map +1 -1
- package/dist/chat-interactions.js +50 -2
- package/dist/chat-interactions.js.map +1 -1
- package/dist/chat-interactions.test.js +39 -2
- package/dist/chat-interactions.test.js.map +1 -1
- package/dist/custom-tool-runner.d.ts +56 -0
- package/dist/custom-tool-runner.d.ts.map +1 -0
- package/dist/custom-tool-runner.js +197 -0
- package/dist/custom-tool-runner.js.map +1 -0
- package/dist/escalation-manager.d.ts +2 -0
- package/dist/escalation-manager.d.ts.map +1 -1
- package/dist/escalation-manager.js +79 -25
- package/dist/escalation-manager.js.map +1 -1
- package/dist/events.d.ts +4 -0
- package/dist/events.d.ts.map +1 -1
- package/dist/hooks.d.ts.map +1 -1
- package/dist/hooks.js +6 -0
- package/dist/hooks.js.map +1 -1
- package/dist/index.d.ts +19 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +13 -1
- package/dist/index.js.map +1 -1
- package/dist/mcp-capability.d.ts +40 -0
- package/dist/mcp-capability.d.ts.map +1 -0
- package/dist/mcp-capability.js +2 -0
- package/dist/mcp-capability.js.map +1 -0
- package/dist/mcp-runner.d.ts +45 -0
- package/dist/mcp-runner.d.ts.map +1 -0
- package/dist/mcp-runner.js +238 -0
- package/dist/mcp-runner.js.map +1 -0
- package/dist/mission-cancellation.d.ts +14 -0
- package/dist/mission-cancellation.d.ts.map +1 -0
- package/dist/mission-cancellation.js +43 -0
- package/dist/mission-cancellation.js.map +1 -0
- package/dist/mission-execution.d.ts +103 -0
- package/dist/mission-execution.d.ts.map +1 -0
- package/dist/mission-execution.js +196 -0
- package/dist/mission-execution.js.map +1 -0
- package/dist/mission-executor.d.ts +18 -16
- package/dist/mission-executor.d.ts.map +1 -1
- package/dist/mission-executor.js +339 -203
- package/dist/mission-executor.js.map +1 -1
- package/dist/mission-gating.d.ts +11 -15
- package/dist/mission-gating.d.ts.map +1 -1
- package/dist/mission-gating.js +25 -33
- package/dist/mission-gating.js.map +1 -1
- package/dist/mission-inspection.d.ts +29 -0
- package/dist/mission-inspection.d.ts.map +1 -0
- package/dist/mission-inspection.js +99 -0
- package/dist/mission-inspection.js.map +1 -0
- package/dist/mission-store.d.ts +7 -0
- package/dist/mission-store.d.ts.map +1 -1
- package/dist/mission-store.js +8 -0
- package/dist/mission-store.js.map +1 -1
- package/dist/orchestrator-context.d.ts +3 -0
- package/dist/orchestrator-context.d.ts.map +1 -1
- package/dist/orchestrator-engine.d.ts +39 -39
- package/dist/orchestrator-engine.d.ts.map +1 -1
- package/dist/orchestrator-engine.js +124 -24
- package/dist/orchestrator-engine.js.map +1 -1
- package/dist/run-state-monitor.d.ts +14 -0
- package/dist/run-state-monitor.d.ts.map +1 -0
- package/dist/run-state-monitor.js +63 -0
- package/dist/run-state-monitor.js.map +1 -0
- package/dist/run-store.d.ts +15 -0
- package/dist/run-store.d.ts.map +1 -1
- package/dist/runner-capability.d.ts +43 -0
- package/dist/runner-capability.d.ts.map +1 -0
- package/dist/runner-capability.js +55 -0
- package/dist/runner-capability.js.map +1 -0
- package/dist/runtime-metadata.d.ts +5 -0
- package/dist/runtime-metadata.d.ts.map +1 -0
- package/dist/runtime-metadata.js +21 -0
- package/dist/runtime-metadata.js.map +1 -0
- package/dist/scheduler.d.ts +2 -1
- package/dist/scheduler.d.ts.map +1 -1
- package/dist/scheduler.js +16 -6
- package/dist/scheduler.js.map +1 -1
- package/dist/schemas.d.ts +8 -6
- package/dist/schemas.d.ts.map +1 -1
- package/dist/schemas.js +10 -0
- package/dist/schemas.js.map +1 -1
- package/dist/spawner.d.ts +12 -0
- package/dist/spawner.d.ts.map +1 -1
- package/dist/steering.d.ts +4 -1
- package/dist/steering.d.ts.map +1 -1
- package/dist/steering.js.map +1 -1
- package/dist/task-approval-coordinator.d.ts +29 -0
- package/dist/task-approval-coordinator.d.ts.map +1 -0
- package/dist/task-approval-coordinator.js +216 -0
- package/dist/task-approval-coordinator.js.map +1 -0
- package/dist/task-dispatch.d.ts +40 -0
- package/dist/task-dispatch.d.ts.map +1 -0
- package/dist/task-dispatch.js +136 -0
- package/dist/task-dispatch.js.map +1 -0
- package/dist/task-execution.d.ts +146 -0
- package/dist/task-execution.d.ts.map +1 -0
- package/dist/task-execution.js +357 -0
- package/dist/task-execution.js.map +1 -0
- package/dist/task-manager.d.ts +31 -22
- package/dist/task-manager.d.ts.map +1 -1
- package/dist/task-manager.js +74 -7
- package/dist/task-manager.js.map +1 -1
- package/dist/task-runner.d.ts +30 -3
- package/dist/task-runner.d.ts.map +1 -1
- package/dist/task-runner.js +429 -90
- package/dist/task-runner.js.map +1 -1
- package/dist/task-store.d.ts +9 -3
- package/dist/task-store.d.ts.map +1 -1
- package/dist/tool-invocation.d.ts +4 -0
- package/dist/tool-invocation.d.ts.map +1 -1
- package/dist/tool-invocation.js +8 -1
- package/dist/tool-invocation.js.map +1 -1
- package/dist/tool-invocation.test.d.ts +2 -0
- package/dist/tool-invocation.test.d.ts.map +1 -0
- package/dist/tool-invocation.test.js +40 -0
- package/dist/tool-invocation.test.js.map +1 -0
- package/dist/types/agent.d.ts +4 -0
- package/dist/types/agent.d.ts.map +1 -1
- package/dist/types/agent.js.map +1 -1
- package/dist/types/config.d.ts +3 -0
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/config.js.map +1 -1
- package/dist/types/mission.d.ts +23 -1
- package/dist/types/mission.d.ts.map +1 -1
- package/dist/types/task.d.ts +10 -0
- package/dist/types/task.d.ts.map +1 -1
- package/package.json +17 -1
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { currentMissionExecutionTasks } from "./mission-inspection.js";
|
|
2
|
+
import { isMissionExecutionCancellationStore, MissionExecutionError, validateMissionExecutionKey } from "./mission-execution.js";
|
|
3
|
+
import { TaskExecutionError } from "./task-execution.js";
|
|
4
|
+
/** Cancel accepted work from a cold host without starting schedules, restoring
|
|
5
|
+
* agents or dispatching unrelated Tasks. Notify returned Run owners after commit. */
|
|
6
|
+
export async function cancelMissionExecution(stores, missionId, options = {}) {
|
|
7
|
+
const executionId = options.executionId;
|
|
8
|
+
validateMissionExecutionKey(missionId, "abort");
|
|
9
|
+
if (executionId !== undefined)
|
|
10
|
+
validateMissionExecutionKey(executionId, "abort");
|
|
11
|
+
const stored = await stores.missionStore.getMission(missionId);
|
|
12
|
+
if (!stored)
|
|
13
|
+
throw new MissionExecutionError("mission_execution_invalid", "Mission not found");
|
|
14
|
+
const mission = structuredClone(stored);
|
|
15
|
+
const persistence = stores.missionExecutionStore;
|
|
16
|
+
const tasks = structuredClone(await stores.taskStore.listTasks());
|
|
17
|
+
const selected = executionId === undefined ? await currentMissionExecutionTasks(mission, tasks, persistence) : [];
|
|
18
|
+
const ids = new Set(selected.map(task => task.missionExecutionId));
|
|
19
|
+
const target = executionId ?? (ids.size === 1 ? [...ids][0] : undefined);
|
|
20
|
+
if (!target) {
|
|
21
|
+
if (!selected.length && !mission.executionCount && mission.status === "draft")
|
|
22
|
+
return { aborted: 0, missionCancelled: false, killedRunIds: [] };
|
|
23
|
+
throw new MissionExecutionError("mission_execution_unsupported", "Mission cancellation requires an accepted execution ID; legacy group labels cannot authorize cancellation");
|
|
24
|
+
}
|
|
25
|
+
if (!isMissionExecutionCancellationStore(persistence)) {
|
|
26
|
+
throw new MissionExecutionError("mission_execution_unsupported", "Mission cancellation requires atomic persistence");
|
|
27
|
+
}
|
|
28
|
+
const admission = await persistence.getMissionExecutionById(target);
|
|
29
|
+
if (!admission || admission.receipt.missionId !== missionId || admission.receipt.executionId !== target) {
|
|
30
|
+
throw new MissionExecutionError("mission_execution_invalid", "Execution does not belong to this Mission");
|
|
31
|
+
}
|
|
32
|
+
// Retain the snapshots read above through the commit. Re-reading after an
|
|
33
|
+
// await would acquire authority over a replacement attempt unintentionally.
|
|
34
|
+
const current = new Map(tasks.map(task => [task.id, task]));
|
|
35
|
+
const conditions = admission.receipt.tasks.map(accepted => {
|
|
36
|
+
const snapshot = current.get(accepted.id);
|
|
37
|
+
if (!snapshot)
|
|
38
|
+
throw new TaskExecutionError("task_execution_conflict", "Accepted Mission task is missing");
|
|
39
|
+
return { taskId: accepted.id, snapshot };
|
|
40
|
+
});
|
|
41
|
+
return persistence.abortMissionExecution({ missionId, executionId: target, tasks: conditions });
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=mission-cancellation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mission-cancellation.js","sourceRoot":"","sources":["../src/mission-cancellation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import type { AgentConfig, Mission, ScopedNotificationRules, Task } from "./types.js";
|
|
2
|
+
import { type TaskExecutionPrecondition, type TaskExecutionState } from "./task-execution.js";
|
|
3
|
+
import type { RunRecord } from "./run-store.js";
|
|
4
|
+
/** Immutable admission receipt. Task snapshots describe what was created;
|
|
5
|
+
* callers read TaskStore separately for current execution status. */
|
|
6
|
+
export interface MissionExecutionReceipt {
|
|
7
|
+
executionId: string;
|
|
8
|
+
missionId: string;
|
|
9
|
+
idempotencyKey: string;
|
|
10
|
+
group: string;
|
|
11
|
+
sequence: number;
|
|
12
|
+
user?: string;
|
|
13
|
+
metadata?: Record<string, string>;
|
|
14
|
+
createdAt: string;
|
|
15
|
+
tasks: Task[];
|
|
16
|
+
}
|
|
17
|
+
/** Every control/inspection surface must use the same accepted task identity. */
|
|
18
|
+
export declare function assertMissionExecutionTask(task: Task, receipt: MissionExecutionReceipt): void;
|
|
19
|
+
export interface MissionExecutionCommit {
|
|
20
|
+
/** Mission used to plan and authorize all tasks, rechecked at admission. */
|
|
21
|
+
expected: Mission;
|
|
22
|
+
receipt: MissionExecutionReceipt;
|
|
23
|
+
notifications?: ScopedNotificationRules;
|
|
24
|
+
/** Agent definitions selected during planning, recovered only for this execution. */
|
|
25
|
+
runtime?: {
|
|
26
|
+
volatileAgents: AgentConfig[];
|
|
27
|
+
taskTitles?: Array<{
|
|
28
|
+
authored: string;
|
|
29
|
+
accepted: string;
|
|
30
|
+
}>;
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
/** Capability separate from ordinary Mission CRUD. Implementations must commit
|
|
34
|
+
* the receipt, all tasks, Mission activation and counter as one durable unit. */
|
|
35
|
+
export interface MissionExecutionStore {
|
|
36
|
+
getMissionExecution(missionId: string, idempotencyKey: string): Promise<MissionExecutionReceipt | undefined>;
|
|
37
|
+
getMissionExecutionById(executionId: string): Promise<MissionExecutionCommit | undefined>;
|
|
38
|
+
commitMissionExecution(input: MissionExecutionCommit): Promise<{
|
|
39
|
+
receipt: MissionExecutionReceipt;
|
|
40
|
+
created: boolean;
|
|
41
|
+
}>;
|
|
42
|
+
/** Finalize only the current active execution, with all accepted tasks terminal. */
|
|
43
|
+
finalizeMissionExecution(executionId: string, status: MissionExecutionFinalStatus): Promise<boolean>;
|
|
44
|
+
}
|
|
45
|
+
export type MissionExecutionFinalStatus = "completed" | "failed" | "scheduled" | "recurring";
|
|
46
|
+
/** Cancellation must commit the complete accepted Task set, its Runs and the
|
|
47
|
+
* current Mission status together. Per-Task cancellation followed by a separate
|
|
48
|
+
* finalization lets concurrent cleanup reschedule the interrupted Mission. */
|
|
49
|
+
export interface MissionExecutionAbortInput {
|
|
50
|
+
missionId: string;
|
|
51
|
+
executionId: string;
|
|
52
|
+
tasks: TaskExecutionPrecondition[];
|
|
53
|
+
}
|
|
54
|
+
export interface MissionExecutionAbortResult {
|
|
55
|
+
executionId: string;
|
|
56
|
+
aborted: number;
|
|
57
|
+
/** False when cancelling a historical execution of a newer active Mission. */
|
|
58
|
+
missionCancelled: boolean;
|
|
59
|
+
/** Notify only these exact owners, after the durable commit succeeds. */
|
|
60
|
+
killedRunIds: string[];
|
|
61
|
+
}
|
|
62
|
+
export interface MissionExecutionCancellationStore extends MissionExecutionStore {
|
|
63
|
+
abortMissionExecution(input: MissionExecutionAbortInput): Promise<MissionExecutionAbortResult>;
|
|
64
|
+
}
|
|
65
|
+
export declare function isMissionExecutionCancellationStore(value: unknown): value is MissionExecutionCancellationStore;
|
|
66
|
+
export declare function normalizeMissionExecutionAbort(input: MissionExecutionAbortInput): MissionExecutionAbortInput;
|
|
67
|
+
/** Shared decision, called while storage holds all Mission/Task/Run reads stable.
|
|
68
|
+
* The returned writes must all succeed in the SAME transaction or all roll back. */
|
|
69
|
+
export declare function prepareMissionExecutionAbort(input: MissionExecutionAbortInput, receipt: MissionExecutionReceipt | undefined, mission: Mission | undefined, tasks: Task[], runs: RunRecord[], now: string): {
|
|
70
|
+
tasks: TaskExecutionState[];
|
|
71
|
+
mission?: Mission;
|
|
72
|
+
result: MissionExecutionAbortResult;
|
|
73
|
+
};
|
|
74
|
+
export declare function validateMissionExecutionFinalStatus(status: MissionExecutionFinalStatus): void;
|
|
75
|
+
export interface MissionExecutionOptions {
|
|
76
|
+
idempotencyKey?: string;
|
|
77
|
+
}
|
|
78
|
+
export interface MissionExecutionResult {
|
|
79
|
+
tasks: Task[];
|
|
80
|
+
group: string;
|
|
81
|
+
executionId?: string;
|
|
82
|
+
}
|
|
83
|
+
export interface MissionAbortOptions {
|
|
84
|
+
executionId?: string;
|
|
85
|
+
}
|
|
86
|
+
export interface MissionAbortResult {
|
|
87
|
+
aborted: number;
|
|
88
|
+
executionId?: string;
|
|
89
|
+
}
|
|
90
|
+
export declare function isMissionExecutionStore(value: unknown): value is MissionExecutionStore;
|
|
91
|
+
export declare class MissionExecutionError extends Error {
|
|
92
|
+
readonly code: "mission_execution_invalid" | "mission_execution_conflict" | "mission_execution_unsupported";
|
|
93
|
+
constructor(code: "mission_execution_invalid" | "mission_execution_conflict" | "mission_execution_unsupported", message: string);
|
|
94
|
+
}
|
|
95
|
+
export declare function validateMissionExecutionKey(missionId: string, key: string): void;
|
|
96
|
+
/** Capture a bounded JSON copy before awaiting storage. No caller can mutate
|
|
97
|
+
* its principal, dependency graph or expected Mission while admission waits. */
|
|
98
|
+
export declare function normalizeMissionExecutionCommit(input: unknown): MissionExecutionCommit;
|
|
99
|
+
/** Called under the store's actual transaction/lock, after receipt lookup.
|
|
100
|
+
* A committed duplicate returns its original receipt before these stale-plan
|
|
101
|
+
* checks; changed Mission configuration never reauthorizes a replay. */
|
|
102
|
+
export declare function admitMissionExecution(input: MissionExecutionCommit, current: Mission | undefined, tasks: Task[]): Mission;
|
|
103
|
+
//# sourceMappingURL=mission-execution.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mission-execution.d.ts","sourceRoot":"","sources":["../src/mission-execution.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,uBAAuB,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAEtF,OAAO,EACL,KAAK,yBAAyB,EAAE,KAAK,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACvF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD;qEACqE;AACrE,MAAM,WAAW,uBAAuB;IACtC,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,IAAI,EAAE,CAAC;CACf;AAED,iFAAiF;AACjF,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,uBAAuB,GAAG,IAAI,CAO7F;AAED,MAAM,WAAW,sBAAsB;IACrC,4EAA4E;IAC5E,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,uBAAuB,CAAC;IACjC,aAAa,CAAC,EAAE,uBAAuB,CAAC;IACxC,qFAAqF;IACrF,OAAO,CAAC,EAAE;QAAE,cAAc,EAAE,WAAW,EAAE,CAAC;QAAC,UAAU,CAAC,EAAE,KAAK,CAAC;YAAE,QAAQ,EAAE,MAAM,CAAC;YAAC,QAAQ,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAAE,CAAC;CACzG;AAED;iFACiF;AACjF,MAAM,WAAW,qBAAqB;IACpC,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,uBAAuB,GAAG,SAAS,CAAC,CAAC;IAC7G,uBAAuB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,GAAG,SAAS,CAAC,CAAC;IAC1F,sBAAsB,CAAC,KAAK,EAAE,sBAAsB,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,uBAAuB,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IACvH,oFAAoF;IACpF,wBAAwB,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,2BAA2B,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACtG;AACD,MAAM,MAAM,2BAA2B,GAAG,WAAW,GAAG,QAAQ,GAAG,WAAW,GAAG,WAAW,CAAC;AAE7F;;8EAE8E;AAC9E,MAAM,WAAW,0BAA0B;IACzC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,yBAAyB,EAAE,CAAC;CACpC;AACD,MAAM,WAAW,2BAA2B;IAC1C,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,8EAA8E;IAC9E,gBAAgB,EAAE,OAAO,CAAC;IAC1B,yEAAyE;IACzE,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AACD,MAAM,WAAW,iCAAkC,SAAQ,qBAAqB;IAC9E,qBAAqB,CAAC,KAAK,EAAE,0BAA0B,GAAG,OAAO,CAAC,2BAA2B,CAAC,CAAC;CAChG;AACD,wBAAgB,mCAAmC,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,iCAAiC,CAG9G;AACD,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,0BAA0B,GAAG,0BAA0B,CAO5G;AAED;oFACoF;AACpF,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,0BAA0B,EAAE,OAAO,EAAE,uBAAuB,GAAG,SAAS,EAC1H,OAAO,EAAE,OAAO,GAAG,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,GAAG,EAAE,MAAM,GAAG;IAC5E,KAAK,EAAE,kBAAkB,EAAE,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,2BAA2B,CAAC;CACrF,CA4BF;AAED,wBAAgB,mCAAmC,CAAC,MAAM,EAAE,2BAA2B,GAAG,IAAI,CAE7F;AAED,MAAM,WAAW,uBAAuB;IAAG,cAAc,CAAC,EAAE,MAAM,CAAA;CAAE;AACpE,MAAM,WAAW,sBAAsB;IAAG,KAAK,EAAE,IAAI,EAAE,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE;AAC9F,MAAM,WAAW,mBAAmB;IAAG,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE;AAC7D,MAAM,WAAW,kBAAkB;IAAG,OAAO,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE;AAE7E,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,qBAAqB,CAItF;AAED,qBAAa,qBAAsB,SAAQ,KAAK;IAClC,QAAQ,CAAC,IAAI,EAAE,2BAA2B,GAAG,4BAA4B,GAAG,+BAA+B;gBAAlG,IAAI,EAAE,2BAA2B,GAAG,4BAA4B,GAAG,+BAA+B,EAAE,OAAO,EAAE,MAAM;CAIzI;AAqBD,wBAAgB,2BAA2B,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAGhF;AAED;gFACgF;AAChF,wBAAgB,+BAA+B,CAAC,KAAK,EAAE,OAAO,GAAG,sBAAsB,CAqDtF;AAED;;wEAEwE;AACxE,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,sBAAsB,EAAE,OAAO,EAAE,OAAO,GAAG,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,OAAO,CASzH"}
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
import { normalizeRuntimeMetadata, sameRuntimeMetadata } from "./runtime-metadata.js";
|
|
2
|
+
import { normalizeTaskExecutionPreconditions, assertTaskExecutionPreconditions, prepareTaskExecutionMutation, taskExecutionReference } from "./task-execution.js";
|
|
3
|
+
/** Every control/inspection surface must use the same accepted task identity. */
|
|
4
|
+
export function assertMissionExecutionTask(task, receipt) {
|
|
5
|
+
const captured = receipt.tasks.find(candidate => candidate.id === task.id);
|
|
6
|
+
if (!captured || task.missionId !== receipt.missionId || task.group !== receipt.group
|
|
7
|
+
|| task.missionExecutionId !== receipt.executionId || captured.missionExecutionId !== task.missionExecutionId
|
|
8
|
+
|| task.user !== receipt.user || !sameRuntimeMetadata(task.metadata, receipt.metadata)) {
|
|
9
|
+
throw new MissionExecutionError("mission_execution_invalid", "Task does not match its accepted Mission execution");
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
export function isMissionExecutionCancellationStore(value) {
|
|
13
|
+
return isMissionExecutionStore(value)
|
|
14
|
+
&& typeof value.abortMissionExecution === "function";
|
|
15
|
+
}
|
|
16
|
+
export function normalizeMissionExecutionAbort(input) {
|
|
17
|
+
if (!input)
|
|
18
|
+
invalid();
|
|
19
|
+
validateMissionExecutionKey(input.missionId, "abort");
|
|
20
|
+
validateMissionExecutionKey(input.executionId, "abort");
|
|
21
|
+
const tasks = normalizeTaskExecutionPreconditions(input.tasks);
|
|
22
|
+
if (tasks.some(task => task.snapshot === null))
|
|
23
|
+
invalid();
|
|
24
|
+
return { missionId: input.missionId, executionId: input.executionId, tasks };
|
|
25
|
+
}
|
|
26
|
+
/** Shared decision, called while storage holds all Mission/Task/Run reads stable.
|
|
27
|
+
* The returned writes must all succeed in the SAME transaction or all roll back. */
|
|
28
|
+
export function prepareMissionExecutionAbort(input, receipt, mission, tasks, runs, now) {
|
|
29
|
+
if (!receipt || receipt.executionId !== input.executionId || receipt.missionId !== input.missionId
|
|
30
|
+
|| input.tasks.length !== receipt.tasks.length || input.tasks.some(p => !receipt.tasks.some(t => t.id === p.taskId))) {
|
|
31
|
+
throw new MissionExecutionError("mission_execution_invalid", "Cancellation must match the complete accepted Mission execution");
|
|
32
|
+
}
|
|
33
|
+
if (!mission || mission.id !== input.missionId || (mission.executionCount ?? 0) < receipt.sequence)
|
|
34
|
+
conflict();
|
|
35
|
+
const current = new Map(tasks.map(task => [task.id, task]));
|
|
36
|
+
assertTaskExecutionPreconditions(input.tasks, id => current.get(id));
|
|
37
|
+
const writes = [], killedRunIds = [];
|
|
38
|
+
let aborted = 0;
|
|
39
|
+
for (const captured of input.tasks) {
|
|
40
|
+
const task = current.get(captured.taskId);
|
|
41
|
+
assertMissionExecutionTask(task, receipt);
|
|
42
|
+
const terminal = task.status === "done" || task.status === "failed";
|
|
43
|
+
// A terminal Task can still own a Run from an older writer. Invalidate that
|
|
44
|
+
// ownership too, but do not advance an already-closed Task on replay.
|
|
45
|
+
if (terminal && task.activeRunId === undefined && task.approvalState === undefined)
|
|
46
|
+
continue;
|
|
47
|
+
const run = task.activeRunId === undefined ? undefined : runs.find(run => run.id === task.activeRunId);
|
|
48
|
+
const state = prepareTaskExecutionMutation(task, run, taskExecutionReference(task), { type: "cancel", reason: "Mission execution aborted" }, now);
|
|
49
|
+
writes.push(state);
|
|
50
|
+
if (!terminal)
|
|
51
|
+
aborted++;
|
|
52
|
+
if (run?.status === "running" && state.run?.status === "killed")
|
|
53
|
+
killedRunIds.push(run.id);
|
|
54
|
+
}
|
|
55
|
+
const isCurrent = mission.executionCount === receipt.sequence;
|
|
56
|
+
const cancelMission = isCurrent && ["active", "paused", "scheduled", "recurring"].includes(mission.status);
|
|
57
|
+
return { tasks: writes, ...(cancelMission ? { mission: { ...mission, status: "cancelled", updatedAt: now } } : {}),
|
|
58
|
+
result: { executionId: receipt.executionId, aborted, killedRunIds,
|
|
59
|
+
missionCancelled: isCurrent && (cancelMission || mission.status === "cancelled") } };
|
|
60
|
+
}
|
|
61
|
+
export function validateMissionExecutionFinalStatus(status) {
|
|
62
|
+
if (!["completed", "failed", "scheduled", "recurring"].includes(status))
|
|
63
|
+
invalid();
|
|
64
|
+
}
|
|
65
|
+
export function isMissionExecutionStore(value) {
|
|
66
|
+
const store = value;
|
|
67
|
+
return !!store && typeof store.getMissionExecution === "function" && typeof store.getMissionExecutionById === "function"
|
|
68
|
+
&& typeof store.commitMissionExecution === "function" && typeof store.finalizeMissionExecution === "function";
|
|
69
|
+
}
|
|
70
|
+
export class MissionExecutionError extends Error {
|
|
71
|
+
code;
|
|
72
|
+
constructor(code, message) {
|
|
73
|
+
super(message);
|
|
74
|
+
this.code = code;
|
|
75
|
+
this.name = "MissionExecutionError";
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
function invalid() { throw new MissionExecutionError("mission_execution_invalid", "Invalid Mission execution plan"); }
|
|
79
|
+
function conflict() { throw new MissionExecutionError("mission_execution_conflict", "Mission or task state changed before execution admission"); }
|
|
80
|
+
function json(value) {
|
|
81
|
+
if (value === null || typeof value === "string" || typeof value === "boolean")
|
|
82
|
+
return value;
|
|
83
|
+
if (typeof value === "number" && Number.isFinite(value))
|
|
84
|
+
return value;
|
|
85
|
+
// Array.from visits holes too: sparse arrays must not silently serialize as
|
|
86
|
+
// null entries that would make a committed receipt impossible to replay.
|
|
87
|
+
if (Array.isArray(value))
|
|
88
|
+
return Array.from(value, json);
|
|
89
|
+
if (value && typeof value === "object" && Object.getPrototypeOf(value) === Object.prototype) {
|
|
90
|
+
const result = {};
|
|
91
|
+
for (const key of Object.keys(value).sort()) {
|
|
92
|
+
const item = value[key];
|
|
93
|
+
if (item !== undefined)
|
|
94
|
+
Object.defineProperty(result, key, { value: json(item), enumerable: true });
|
|
95
|
+
}
|
|
96
|
+
return result;
|
|
97
|
+
}
|
|
98
|
+
return invalid();
|
|
99
|
+
}
|
|
100
|
+
export function validateMissionExecutionKey(missionId, key) {
|
|
101
|
+
if (typeof missionId !== "string" || !/^[a-zA-Z0-9_-]{1,200}$/.test(missionId)
|
|
102
|
+
|| typeof key !== "string" || !key.trim() || key !== key.trim() || key.length > 200 || /[\x00-\x1f\x7f]/.test(key))
|
|
103
|
+
invalid();
|
|
104
|
+
}
|
|
105
|
+
/** Capture a bounded JSON copy before awaiting storage. No caller can mutate
|
|
106
|
+
* its principal, dependency graph or expected Mission while admission waits. */
|
|
107
|
+
export function normalizeMissionExecutionCommit(input) {
|
|
108
|
+
let copied;
|
|
109
|
+
try {
|
|
110
|
+
copied = json(input);
|
|
111
|
+
}
|
|
112
|
+
catch {
|
|
113
|
+
return invalid();
|
|
114
|
+
}
|
|
115
|
+
if (!copied || typeof copied !== "object" || Array.isArray(copied))
|
|
116
|
+
invalid();
|
|
117
|
+
if (new TextEncoder().encode(JSON.stringify(copied)).length > 4 * 1024 * 1024)
|
|
118
|
+
invalid();
|
|
119
|
+
const { expected, receipt } = copied;
|
|
120
|
+
if (!expected || !receipt)
|
|
121
|
+
invalid();
|
|
122
|
+
try {
|
|
123
|
+
normalizeRuntimeMetadata(expected.metadata);
|
|
124
|
+
if (!sameRuntimeMetadata(expected.metadata, receipt.metadata)
|
|
125
|
+
|| receipt.tasks?.some(task => !sameRuntimeMetadata(task?.metadata, receipt.metadata)))
|
|
126
|
+
invalid();
|
|
127
|
+
}
|
|
128
|
+
catch {
|
|
129
|
+
invalid();
|
|
130
|
+
}
|
|
131
|
+
validateMissionExecutionKey(receipt.missionId, receipt.idempotencyKey);
|
|
132
|
+
if (expected.id !== receipt.missionId || typeof expected.name !== "string" || !expected.name.trim()
|
|
133
|
+
|| typeof expected.data !== "string" || (expected.user !== undefined && (typeof expected.user !== "string" || !expected.user.trim()))
|
|
134
|
+
|| typeof receipt.executionId !== "string" || !/^[a-zA-Z0-9_-]{1,200}$/.test(receipt.executionId)
|
|
135
|
+
|| typeof receipt.createdAt !== "string" || !Number.isFinite(Date.parse(receipt.createdAt))
|
|
136
|
+
|| !Number.isSafeInteger(receipt.sequence) || receipt.sequence < 1
|
|
137
|
+
|| receipt.sequence !== (expected.executionCount ?? 0) + 1 || receipt.user !== expected.user
|
|
138
|
+
|| receipt.group !== (receipt.sequence > 1 ? `${expected.name} #${receipt.sequence}` : expected.name)
|
|
139
|
+
|| !Array.isArray(receipt.tasks) || !receipt.tasks.length || receipt.tasks.length > 1000)
|
|
140
|
+
invalid();
|
|
141
|
+
const ids = new Set(), titles = new Set();
|
|
142
|
+
for (const task of receipt.tasks) {
|
|
143
|
+
if (!task || typeof task.id !== "string" || !/^[a-zA-Z0-9_-]{1,200}$/.test(task.id) || ids.has(task.id)
|
|
144
|
+
|| typeof task.title !== "string" || !task.title.trim() || titles.has(task.title)
|
|
145
|
+
|| typeof task.description !== "string" || typeof task.assignTo !== "string" || !task.assignTo.trim()
|
|
146
|
+
|| task.missionId !== expected.id || task.group !== receipt.group || task.user !== receipt.user
|
|
147
|
+
|| (task.missionExecutionId !== undefined && task.missionExecutionId !== receipt.executionId)
|
|
148
|
+
|| task.status !== "pending" || task.retries !== 0 || !Number.isSafeInteger(task.maxRetries) || task.maxRetries < 0
|
|
149
|
+
|| task.approvalState !== undefined
|
|
150
|
+
|| task.createdAt !== receipt.createdAt || task.updatedAt !== receipt.createdAt || !Array.isArray(task.dependsOn)
|
|
151
|
+
|| task.dependsOn.some(id => !ids.has(id)) || !Array.isArray(task.expectations) || !Array.isArray(task.metrics))
|
|
152
|
+
invalid();
|
|
153
|
+
ids.add(task.id);
|
|
154
|
+
titles.add(task.title);
|
|
155
|
+
}
|
|
156
|
+
if (copied.runtime !== undefined) {
|
|
157
|
+
const runtime = copied.runtime;
|
|
158
|
+
if (!runtime || !Array.isArray(runtime.volatileAgents))
|
|
159
|
+
invalid();
|
|
160
|
+
const names = new Set();
|
|
161
|
+
for (const agent of runtime.volatileAgents) {
|
|
162
|
+
if (!agent || typeof agent.name !== "string" || !agent.name.trim() || names.has(agent.name))
|
|
163
|
+
invalid();
|
|
164
|
+
names.add(agent.name);
|
|
165
|
+
}
|
|
166
|
+
if (runtime.taskTitles !== undefined) {
|
|
167
|
+
if (!Array.isArray(runtime.taskTitles) || runtime.taskTitles.length !== receipt.tasks.length)
|
|
168
|
+
invalid();
|
|
169
|
+
const authored = new Set(), accepted = new Set();
|
|
170
|
+
for (const entry of runtime.taskTitles) {
|
|
171
|
+
if (!entry || typeof entry.authored !== "string" || !entry.authored.trim() || authored.has(entry.authored)
|
|
172
|
+
|| !titles.has(entry.accepted) || accepted.has(entry.accepted))
|
|
173
|
+
invalid();
|
|
174
|
+
authored.add(entry.authored);
|
|
175
|
+
accepted.add(entry.accepted);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
return copied;
|
|
180
|
+
}
|
|
181
|
+
/** Called under the store's actual transaction/lock, after receipt lookup.
|
|
182
|
+
* A committed duplicate returns its original receipt before these stale-plan
|
|
183
|
+
* checks; changed Mission configuration never reauthorizes a replay. */
|
|
184
|
+
export function admitMissionExecution(input, current, tasks) {
|
|
185
|
+
const state = (mission) => JSON.stringify(json({ ...mission, executionCount: mission.executionCount ?? 0 }));
|
|
186
|
+
if (!current || state(input.expected) !== state(current)
|
|
187
|
+
|| !["draft", "scheduled", "recurring", "failed", "cancelled"].includes(current.status))
|
|
188
|
+
conflict();
|
|
189
|
+
const ids = new Set(input.receipt.tasks.map(task => task.id));
|
|
190
|
+
const titles = new Set(input.receipt.tasks.map(task => task.title));
|
|
191
|
+
if (tasks.some(task => ids.has(task.id) || (titles.has(task.title) && task.status !== "done" && task.status !== "failed")))
|
|
192
|
+
conflict();
|
|
193
|
+
return { ...current, status: "active", executionCount: input.receipt.sequence, updatedAt: input.receipt.createdAt,
|
|
194
|
+
...(input.notifications === undefined ? {} : { notifications: input.notifications }) };
|
|
195
|
+
}
|
|
196
|
+
//# sourceMappingURL=mission-execution.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mission-execution.js","sourceRoot":"","sources":["../src/mission-execution.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,10 @@
|
|
|
1
|
+
import type { ActiveCheckpoint, ActiveDelay } from "./types.js";
|
|
1
2
|
import type { OrchestratorContext } from "./orchestrator-context.js";
|
|
2
3
|
import type { TaskManager } from "./task-manager.js";
|
|
3
4
|
import type { AgentManager } from "./agent-manager.js";
|
|
4
5
|
import type { Mission, MissionStatus, MissionReport, Task, MissionQualityGate, MissionCheckpoint, MissionDelay, ScopedNotificationRules } from "./types.js";
|
|
5
6
|
import type { QualityController } from "./quality-controller.js";
|
|
7
|
+
import { type MissionAbortOptions, type MissionAbortResult, type MissionExecutionOptions, type MissionExecutionResult } from "./mission-execution.js";
|
|
6
8
|
/**
|
|
7
9
|
* Mission CRUD + execution + resume + group lifecycle.
|
|
8
10
|
* Runtime checkpoint/delay gating is delegated to MissionGating.
|
|
@@ -22,6 +24,9 @@ export declare class MissionExecutor {
|
|
|
22
24
|
/** Track the pre-execution status for scheduled/recurring missions (by group name).
|
|
23
25
|
* When a mission completes/fails, this determines whether to return to scheduled/recurring. */
|
|
24
26
|
private scheduledOrigin;
|
|
27
|
+
private preparedExecutions;
|
|
28
|
+
private groupExecutions;
|
|
29
|
+
private gatingKey;
|
|
25
30
|
constructor(ctx: OrchestratorContext, taskMgr: TaskManager, agentMgr: AgentManager);
|
|
26
31
|
/** Resolves when async store loading and group rebuild are complete. */
|
|
27
32
|
readonly ready: Promise<void>;
|
|
@@ -48,13 +53,9 @@ export declare class MissionExecutor {
|
|
|
48
53
|
* Returns true if the checkpoint was active and is now resumed, false if not found.
|
|
49
54
|
*/
|
|
50
55
|
resumeCheckpoint(group: string, checkpointName: string): Promise<boolean>;
|
|
56
|
+
resumeCheckpointByMissionId(missionId: string, checkpointName: string): Promise<boolean>;
|
|
51
57
|
/** Get all active (unresumed) checkpoints across all mission groups. */
|
|
52
|
-
getActiveCheckpoints():
|
|
53
|
-
group: string;
|
|
54
|
-
checkpointName: string;
|
|
55
|
-
checkpoint: MissionCheckpoint;
|
|
56
|
-
reachedAt: string;
|
|
57
|
-
}>;
|
|
58
|
+
getActiveCheckpoints(): ActiveCheckpoint[];
|
|
58
59
|
/** Get delays for a mission group. Returns empty array if none defined. */
|
|
59
60
|
getDelays(group: string): MissionDelay[];
|
|
60
61
|
/**
|
|
@@ -69,13 +70,7 @@ export declare class MissionExecutor {
|
|
|
69
70
|
expiresAt: string;
|
|
70
71
|
} | undefined>;
|
|
71
72
|
/** Get all active (unexpired) delays across all mission groups. */
|
|
72
|
-
getActiveDelays():
|
|
73
|
-
group: string;
|
|
74
|
-
delayName: string;
|
|
75
|
-
delay: MissionDelay;
|
|
76
|
-
startedAt: string;
|
|
77
|
-
expiresAt: string;
|
|
78
|
-
}>;
|
|
73
|
+
getActiveDelays(): ActiveDelay[];
|
|
79
74
|
createMission(opts: {
|
|
80
75
|
data: string;
|
|
81
76
|
prompt?: string;
|
|
@@ -96,12 +91,14 @@ export declare class MissionExecutor {
|
|
|
96
91
|
notifications?: ScopedNotificationRules;
|
|
97
92
|
/** Opaque end-user identifier (OpenAI-compat). */
|
|
98
93
|
user?: string;
|
|
94
|
+
metadata?: Record<string, string>;
|
|
99
95
|
}): Promise<Mission>;
|
|
100
96
|
getMission(missionId: string): Promise<Mission | undefined>;
|
|
101
97
|
getMissionByName(name: string): Promise<Mission | undefined>;
|
|
102
98
|
listMissions(): Promise<Mission[]>;
|
|
103
99
|
updateMission(missionId: string, updates: Partial<Omit<Mission, "id">>): Promise<Mission>;
|
|
104
100
|
deleteMission(missionId: string): Promise<boolean>;
|
|
101
|
+
private currentExecutionTasks;
|
|
105
102
|
getResumableMissions(): Promise<Mission[]>;
|
|
106
103
|
resumeMission(missionId: string, opts?: {
|
|
107
104
|
retryFailed?: boolean;
|
|
@@ -109,10 +106,15 @@ export declare class MissionExecutor {
|
|
|
109
106
|
retried: number;
|
|
110
107
|
pending: number;
|
|
111
108
|
}>;
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
109
|
+
/** Cancel one accepted execution, never a presentation group or a newer Task attempt. */
|
|
110
|
+
abortMission(missionId: string, options?: MissionAbortOptions): Promise<MissionAbortResult & {
|
|
111
|
+
missionCancelled: boolean;
|
|
115
112
|
}>;
|
|
113
|
+
private forgetExecution;
|
|
114
|
+
/** Restore accepted runtime definitions before any task can be dispatched.
|
|
115
|
+
* The durable receipt is authoritative even after Mission edits or a restart. */
|
|
116
|
+
prepareTaskExecution(task: Task, restoreAgents?: boolean): Promise<void>;
|
|
117
|
+
executeMission(missionId: string, options?: MissionExecutionOptions, expectedMission?: Mission): Promise<MissionExecutionResult>;
|
|
116
118
|
/** Check if any mission groups have all tasks terminal, and clean up their volatile agents */
|
|
117
119
|
cleanupCompletedGroups(tasks: Task[]): Promise<void>;
|
|
118
120
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mission-executor.d.ts","sourceRoot":"","sources":["../src/mission-executor.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"mission-executor.d.ts","sourceRoot":"","sources":["../src/mission-executor.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEhE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,IAAI,EAAmB,kBAAkB,EAAE,iBAAiB,EAAE,YAAY,EAAE,uBAAuB,EAAe,MAAM,YAAY,CAAC;AAC1L,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAGjE,OAAO,EAAkF,KAAK,mBAAmB,EAAE,KAAK,kBAAkB,EAA+B,KAAK,uBAAuB,EAAE,KAAK,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAcnQ;;;GAGG;AACH,qBAAa,eAAe;IAuBxB,OAAO,CAAC,GAAG;IACX,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,QAAQ;IAxBlB,OAAO,CAAC,aAAa,CAAqB;IAC1C,+EAA+E;IAC/E,OAAO,CAAC,YAAY,CAA2C;IAC/D,OAAO,CAAC,QAAQ,CAAe;IAC/B,kFAAkF;IAClF,OAAO,CAAC,MAAM,CAAgB;IAC9B,mEAAmE;IACnE,OAAO,CAAC,WAAW,CAAC,CAAoB;IACxC;oGACgG;IAChG,OAAO,CAAC,eAAe,CAAgD;IACvE,OAAO,CAAC,kBAAkB,CAAsD;IAChF,OAAO,CAAC,eAAe,CAAkC;IACzD,OAAO,CAAC,SAAS;gBASP,GAAG,EAAE,mBAAmB,EACxB,OAAO,EAAE,WAAW,EACpB,QAAQ,EAAE,YAAY;IAehC,wEAAwE;IACxE,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAE9B,yEAAyE;YAC3D,oBAAoB;IAKlC,mEAAmE;YACrD,oBAAoB;IA+BlC,+EAA+E;IAC/E,oBAAoB,CAAC,IAAI,EAAE,iBAAiB,GAAG,IAAI;IAInD,kFAAkF;IAClF,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,kBAAkB,EAAE;IAMpD,gFAAgF;IAChF,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,iBAAiB,EAAE;IAIlD;;;OAGG;IACG,qBAAqB,CACzB,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,IAAI,EAAE,GACZ,OAAO,CAAC;QAAE,UAAU,EAAE,iBAAiB,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC;IAK5E;;;OAGG;IACG,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAIzE,2BAA2B,CAAC,SAAS,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAU9F,wEAAwE;IACxE,oBAAoB,IAAI,gBAAgB,EAAE;IAI1C,2EAA2E;IAC3E,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY,EAAE;IAIxC;;;;;OAKG;IACG,gBAAgB,CACpB,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,IAAI,EAAE,GACZ,OAAO,CAAC;QAAE,KAAK,EAAE,YAAY,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC;IAKrF,mEAAmE;IACnE,eAAe,IAAI,WAAW,EAAE;IAI1B,aAAa,CAAC,IAAI,EAAE;QACxB,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,MAAM,CAAC,EAAE,aAAa,CAAC;QACvB;;;WAGG;QACH,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,gEAAgE;QAChE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB;;;WAGG;QACH,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,aAAa,CAAC,EAAE,uBAAuB,CAAC;QACxC,kDAAkD;QAClD,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KACnC,GAAG,OAAO,CAAC,OAAO,CAAC;IAmBd,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC;IAI3D,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC;IAI5D,YAAY,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IAIlC,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAIzF,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;YA2B1C,qBAAqB;IAI7B,oBAAoB,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IAK1C,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IA8BvH,yFAAyF;IACnF,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,GAAE,mBAAwB,GAAG,OAAO,CAAC,kBAAkB,GAAG;QAAE,gBAAgB,EAAE,OAAO,CAAA;KAAE,CAAC;YAgBvH,eAAe;IAc7B;qFACiF;IAC3E,oBAAoB,CAAC,IAAI,EAAE,IAAI,EAAE,aAAa,UAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IA2CrE,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,GAAE,uBAA4B,EAAE,eAAe,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAqH1I,8FAA8F;IACxF,sBAAsB,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAoF1D;;;OAGG;YACW,gBAAgB;IAO9B;;;OAGG;YACW,kBAAkB;IAShC;;;;;;;;;OASG;YACW,uBAAuB;IAkBrC,4CAA4C;IACtC,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE;QAC5C,KAAK,EAAE,MAAM,CAAC;QACd,WAAW,EAAE,MAAM,CAAC;QACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;QACrB,YAAY,CAAC,EAAE,OAAO,EAAE,CAAC;QACzB,gBAAgB,CAAC,EAAE,OAAO,EAAE,CAAC;QAC7B,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,WAAW,CAAC,EAAE;YAAE,aAAa,CAAC,EAAE,MAAM,CAAC;YAAC,aAAa,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;QACjE,aAAa,CAAC,EAAE,OAAO,CAAC;KACzB,GAAG,OAAO,CAAC,OAAO,CAAC;IAUpB,yEAAyE;IACnE,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE;QACrE,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;QACrB,YAAY,CAAC,EAAE,OAAO,EAAE,CAAC;QACzB,gBAAgB,CAAC,EAAE,OAAO,EAAE,CAAC;QAC7B,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,WAAW,CAAC,EAAE;YAAE,aAAa,CAAC,EAAE,MAAM,CAAC;YAAC,aAAa,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;QACjE,aAAa,CAAC,EAAE,OAAO,CAAC;KACzB,GAAG,OAAO,CAAC,OAAO,CAAC;IAYpB,2FAA2F;IACrF,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAuC/E,mGAAmG;IAC7F,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC;IAgBhF,4CAA4C;IACtC,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE;QACxD,IAAI,EAAE,MAAM,CAAC;QACb,UAAU,EAAE,MAAM,EAAE,CAAC;QACrB,WAAW,EAAE,MAAM,EAAE,CAAC;QACtB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;QAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,GAAG,OAAO,CAAC,OAAO,CAAC;IASpB,iEAAiE;IAC3D,uBAAuB,CAAC,SAAS,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,OAAO,EAAE;QAChF,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;QACtB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;QACvB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;QAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,GAAG,OAAO,CAAC,OAAO,CAAC;IAWpB,2DAA2D;IACrD,uBAAuB,CAAC,SAAS,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAU1F,uCAAuC;IACjC,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE;QAC9C,IAAI,EAAE,MAAM,CAAC;QACb,UAAU,EAAE,MAAM,EAAE,CAAC;QACrB,WAAW,EAAE,MAAM,EAAE,CAAC;QACtB,QAAQ,EAAE,MAAM,CAAC;QACjB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;QAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,GAAG,OAAO,CAAC,OAAO,CAAC;IAWpB,4DAA4D;IACtD,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE;QACtE,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;QACtB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;QACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;QAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,GAAG,OAAO,CAAC,OAAO,CAAC;IAYpB,sDAAsD;IAChD,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAUhF,8CAA8C;IACxC,qBAAqB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE;QACnD,IAAI,EAAE,MAAM,CAAC;QACb,UAAU,EAAE,MAAM,EAAE,CAAC;QACrB,WAAW,EAAE,MAAM,EAAE,CAAC;QACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,gBAAgB,CAAC,EAAE,OAAO,CAAC;QAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;KAC3B,GAAG,OAAO,CAAC,OAAO,CAAC;IASpB,mEAAmE;IAC7D,wBAAwB,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE;QAC3E,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;QACtB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;QACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,gBAAgB,CAAC,EAAE,OAAO,CAAC;QAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;KAC3B,GAAG,OAAO,CAAC,OAAO,CAAC;IAWpB,6DAA6D;IACvD,wBAAwB,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAUrF,wDAAwD;IAClD,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE;QACpD,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;KACxB,GAAG,OAAO,CAAC,OAAO,CAAC;IASpB,kEAAkE;IAC5D,uBAAuB,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE;QAC5E,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;KACxB,GAAG,OAAO,CAAC,OAAO,CAAC;IAWpB,4DAA4D;IACtD,uBAAuB,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAUtF,mDAAmD;IAC7C,0BAA0B,CAAC,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,uBAAuB,GAAG,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC;IAU9G,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,OAAO,GAAG,OAAO,CAAC,aAAa,CAAC;CAuD3H"}
|