@oh-my-matrix/autopilot 3.0.2 → 3.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +15 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +131 -1
- package/dist/index.js.map +1 -1
- package/dist/src/continuation-engine.d.ts +6 -0
- package/dist/src/continuation-engine.d.ts.map +1 -1
- package/dist/src/continuation-engine.js +115 -5
- package/dist/src/continuation-engine.js.map +1 -1
- package/dist/src/logger.d.ts +8 -0
- package/dist/src/logger.d.ts.map +1 -1
- package/dist/src/logger.js.map +1 -1
- package/dist/src/state-persister.d.ts +121 -0
- package/dist/src/state-persister.d.ts.map +1 -0
- package/dist/src/state-persister.js +456 -0
- package/dist/src/state-persister.js.map +1 -0
- package/dist/src/types.d.ts +15 -0
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/types.js +3 -0
- package/dist/src/types.js.map +1 -1
- package/openclaw.plugin.json +1 -1
- package/package.json +12 -11
- package/LICENSE +0 -21
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"continuation-engine.js","sourceRoot":"","sources":["../../src/continuation-engine.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"continuation-engine.js","sourceRoot":"","sources":["../../src/continuation-engine.ts"],"names":[],"mappings":"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"}
|
package/dist/src/logger.d.ts
CHANGED
|
@@ -9,6 +9,14 @@
|
|
|
9
9
|
*
|
|
10
10
|
* JSON mode emits one JSON object per line: { ts, level, msg, ...ctx }
|
|
11
11
|
* Text mode emits plain string args (backward-compatible with existing behavior).
|
|
12
|
+
*
|
|
13
|
+
* DRIFT REFERENCE: this logger is intentionally byte-equivalent in its
|
|
14
|
+
* safety-relevant parts (emitJson try/catch + fallback shape, splitArgs) to
|
|
15
|
+
* packages/dynamic-workflows/src/logger.ts. If you change the try/catch or
|
|
16
|
+
* fallback here, change the sibling too. The two per-package logger tests
|
|
17
|
+
* (tests/p0-structured-logger.test.ts here, dynamic-workflows/tests/logger.test.ts)
|
|
18
|
+
* are the drift guard until a third consumer justifies extracting createLogger()
|
|
19
|
+
* (boundary doc §5.2). The logger must NEVER throw into a hook.
|
|
12
20
|
*/
|
|
13
21
|
type LogLevel = 'debug' | 'info' | 'warn' | 'error' | 'silent';
|
|
14
22
|
/** Log an informational message (gated by AUTOPILOT_LOG_LEVEL >= info) */
|
package/dist/src/logger.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/logger.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/logger.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,KAAK,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;AAqE/D,0EAA0E;AAC1E,wBAAgB,GAAG,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAI5C;AAED,mEAAmE;AACnE,wBAAgB,IAAI,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAI7C;AAED,mEAAmE;AACnE,wBAAgB,KAAK,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAI9C;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,OAAO,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAClC,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC3B,IAAI,CAQN"}
|
package/dist/src/logger.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/logger.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/logger.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import type { AutopilotState } from './types';
|
|
2
|
+
import type { WorkspaceRecord, RetryEntry, WorkflowConfig } from './types';
|
|
3
|
+
export declare function getCheckpointWriteFailureCount(): number;
|
|
4
|
+
export declare function _resetCheckpointFailureCountForTest(): void;
|
|
5
|
+
export declare function _disableCheckpointingForTest(): void;
|
|
6
|
+
export declare function _enableCheckpointingForTest(): void;
|
|
7
|
+
export declare function _isCheckpointingDisabledForTest(): boolean;
|
|
8
|
+
/**
|
|
9
|
+
* The slim persisted shape. Intentionally a SUBSET of AutopilotState — we do NOT
|
|
10
|
+
* persist permissionAudit (it has its own JSONL via audit-persister), nor status
|
|
11
|
+
* (re-derived on load). Large/ephemeral fields (canaryFired, noUsageWarned) are
|
|
12
|
+
* session-scoped and never persisted.
|
|
13
|
+
*/
|
|
14
|
+
export interface AutopilotCheckpoint {
|
|
15
|
+
runId: string;
|
|
16
|
+
sessionKey: string;
|
|
17
|
+
orchestrationState?: AutopilotState['orchestrationState'];
|
|
18
|
+
blockedReason?: AutopilotState['blockedReason'];
|
|
19
|
+
goal?: string;
|
|
20
|
+
goalSnapshot?: string;
|
|
21
|
+
progress?: string;
|
|
22
|
+
progressSnapshot?: string;
|
|
23
|
+
turnAttempts: number;
|
|
24
|
+
totalContinuations: number;
|
|
25
|
+
maxAttemptsPerTurn: number;
|
|
26
|
+
maxTotalContinuations: number;
|
|
27
|
+
needsCrossTurnResume: boolean;
|
|
28
|
+
enabled: boolean;
|
|
29
|
+
totalTokensUsed: number;
|
|
30
|
+
tokenBudget?: number;
|
|
31
|
+
inputTokensUsed?: number;
|
|
32
|
+
outputTokensUsed?: number;
|
|
33
|
+
evidenceStatus?: AutopilotState['evidence'] extends infer E ? (E extends {
|
|
34
|
+
status: infer S;
|
|
35
|
+
} ? S : undefined) : undefined;
|
|
36
|
+
startedAt?: number;
|
|
37
|
+
lastActivityAt?: number;
|
|
38
|
+
/** Forensic only — loaders overwrite with deriveStatus(). Never trusted. */
|
|
39
|
+
status?: AutopilotState['status'];
|
|
40
|
+
workspaceRoot?: string;
|
|
41
|
+
workspacePath?: string;
|
|
42
|
+
/** Full workspace record (Reviewer #1 Finding 2a fix): restored runs MUST retain
|
|
43
|
+
* their permission-containment boundary + checkpoint-root. Persisting flat fields
|
|
44
|
+
* alone left state.workspace undefined after restore, widening the tool-call
|
|
45
|
+
* containment to process.cwd() — a security regression. */
|
|
46
|
+
workspace?: WorkspaceRecord;
|
|
47
|
+
/** Retry entry (Reviewer #1 Finding 2b fix): without this, restored retry_queued
|
|
48
|
+
* runs lose state.retry → the stall interval's retry_due guard
|
|
49
|
+
* (state.retry?.nextRetryAt != null) is never satisfied → the run wedges forever. */
|
|
50
|
+
retry?: RetryEntry;
|
|
51
|
+
/** Workflow config (Reviewer #1 Finding 2c fix): restored runs otherwise skip
|
|
52
|
+
* validation commands, reset stallTimeoutMs, and lose modelRouting. */
|
|
53
|
+
workflow?: WorkflowConfig;
|
|
54
|
+
/** Enhancement C (ADR-019): per-run trust decision; without this a crashed
|
|
55
|
+
* trusted-verifiable run silently degrades the early-completion threshold
|
|
56
|
+
* (3 -> 2) on recovery. Must be in the allowlist, not auto-serialized. */
|
|
57
|
+
trustWorkspace?: boolean;
|
|
58
|
+
/** Millisecond epoch of the checkpoint write. */
|
|
59
|
+
savedAt: number;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Build a slim checkpoint from a full AutopilotState. Extracts only the fields
|
|
63
|
+
* needed to resume a run; drops the bulky/ephemeral ones.
|
|
64
|
+
*/
|
|
65
|
+
export declare function buildCheckpoint(state: AutopilotState, runId: string, workspaceRoot: string): AutopilotCheckpoint;
|
|
66
|
+
/**
|
|
67
|
+
* Persist a checkpoint + update the sessionKey→runId index. Fail-silent.
|
|
68
|
+
* Serialized per-runId so concurrent setState firings don't interleave writes.
|
|
69
|
+
*
|
|
70
|
+
* Returns a Promise (rather than sync) because the lock chain is async; callers
|
|
71
|
+
* that don't need to await (the common case from setState) fire-and-forget via
|
|
72
|
+
* void. The internal _writeSyncLocked does the actual sync I/O under the lock.
|
|
73
|
+
*/
|
|
74
|
+
export declare function saveCheckpoint(state: AutopilotState, runId: string, workspaceRoot: string): void;
|
|
75
|
+
/**
|
|
76
|
+
* Load a checkpoint and rebuild an AutopilotState. ADR-016 BLOCKER #1 fix:
|
|
77
|
+
* `status` is NEVER trusted from the persisted field — always re-derived.
|
|
78
|
+
*
|
|
79
|
+
* Returns null if the checkpoint is missing, corrupt, or fails workspace
|
|
80
|
+
* validation (Review #4 #4: stale-run guard).
|
|
81
|
+
*/
|
|
82
|
+
export declare function loadCheckpoint(runId: string, workspaceRoot: string, options?: {
|
|
83
|
+
validateWorkspace?: boolean;
|
|
84
|
+
}): AutopilotState | null;
|
|
85
|
+
/**
|
|
86
|
+
* Delete a checkpoint file (Review #4 #6: called on terminal transitions to
|
|
87
|
+
* prevent done-run file leaks). Fail-silent.
|
|
88
|
+
*/
|
|
89
|
+
export declare function deleteCheckpoint(runId: string, workspaceRoot: string): void;
|
|
90
|
+
/**
|
|
91
|
+
* Remove a sessionKey→runId entry from the index. Used when a run terminates
|
|
92
|
+
* so a future session_start for the same sessionKey doesn't resurrect a dead run.
|
|
93
|
+
*/
|
|
94
|
+
export declare function clearSessionIndexEntry(workspaceRoot: string, sessionKey: string): void;
|
|
95
|
+
/**
|
|
96
|
+
* Look up runId by sessionKey from the durable index. Returns null if the
|
|
97
|
+
* index is missing, corrupt, or has no entry. This is BLOCKER #2's recovery
|
|
98
|
+
* path: after a process restart, the in-memory sessionKeyToRunId Map is empty,
|
|
99
|
+
* so session_start must consult this file to find the checkpoint.
|
|
100
|
+
*/
|
|
101
|
+
export declare function lookupRunIdBySessionKey(workspaceRoot: string, sessionKey: string): string | null;
|
|
102
|
+
/**
|
|
103
|
+
* Scan the checkpoints directory and return all runIds whose checkpoint is
|
|
104
|
+
* resumable (orchestrationState in the active family) and whose workspace still
|
|
105
|
+
* exists. Used by register() at process init to restore ALL resumable runs,
|
|
106
|
+
* not just the one whose session_start fired (Review #3 multi-run gap).
|
|
107
|
+
*
|
|
108
|
+
* Also sweeps terminal checkpoints older than TERMINAL_CHECKPOINT_TTL_MS to
|
|
109
|
+
* reclaim disk (Review #4 #6c).
|
|
110
|
+
*/
|
|
111
|
+
export declare function listResumableCheckpoints(workspaceRoot: string): string[];
|
|
112
|
+
/** Test-only: clear the write-lock map between tests. */
|
|
113
|
+
export declare function _clearWriteLocksForTest(): void;
|
|
114
|
+
/**
|
|
115
|
+
* Test-only: deterministically await all in-flight checkpoint writes. Reviewer
|
|
116
|
+
* #2 Finding 5 fix — replaces the fragile "two setImmediate ticks" drain with
|
|
117
|
+
* `Promise.all` over the lock map so tests don't flake if the lock chain grows
|
|
118
|
+
* another async hop.
|
|
119
|
+
*/
|
|
120
|
+
export declare function _flushAllWritesForTest(): Promise<void>;
|
|
121
|
+
//# sourceMappingURL=state-persister.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state-persister.d.ts","sourceRoot":"","sources":["../../src/state-persister.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,456 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.getCheckpointWriteFailureCount = getCheckpointWriteFailureCount;
|
|
37
|
+
exports._resetCheckpointFailureCountForTest = _resetCheckpointFailureCountForTest;
|
|
38
|
+
exports._disableCheckpointingForTest = _disableCheckpointingForTest;
|
|
39
|
+
exports._enableCheckpointingForTest = _enableCheckpointingForTest;
|
|
40
|
+
exports._isCheckpointingDisabledForTest = _isCheckpointingDisabledForTest;
|
|
41
|
+
exports.buildCheckpoint = buildCheckpoint;
|
|
42
|
+
exports.saveCheckpoint = saveCheckpoint;
|
|
43
|
+
exports.loadCheckpoint = loadCheckpoint;
|
|
44
|
+
exports.deleteCheckpoint = deleteCheckpoint;
|
|
45
|
+
exports.clearSessionIndexEntry = clearSessionIndexEntry;
|
|
46
|
+
exports.lookupRunIdBySessionKey = lookupRunIdBySessionKey;
|
|
47
|
+
exports.listResumableCheckpoints = listResumableCheckpoints;
|
|
48
|
+
exports._clearWriteLocksForTest = _clearWriteLocksForTest;
|
|
49
|
+
exports._flushAllWritesForTest = _flushAllWritesForTest;
|
|
50
|
+
/**
|
|
51
|
+
* Crash-recovery checkpoint persistence for autopilot run state.
|
|
52
|
+
*
|
|
53
|
+
* Writes a SLIM pointer of AutopilotState to
|
|
54
|
+
* {workspaceRoot}/.autopilot/checkpoints/{runId}.json
|
|
55
|
+
* plus a sessionKey→runId index at
|
|
56
|
+
* {workspaceRoot}/.autopilot/checkpoints/session-index.json
|
|
57
|
+
*
|
|
58
|
+
* Design (mirrors @oh-my-matrix/permission-policy/src/audit-persister.ts):
|
|
59
|
+
* - synchronous file I/O (plugin runs in main process; simplicity > async)
|
|
60
|
+
* - fail-silent (never throws; persistence is best-effort recovery, not authoritative)
|
|
61
|
+
* - no external dependencies
|
|
62
|
+
*
|
|
63
|
+
* ADR-016 invariant (status sole-writer): `status` is NEVER trusted from disk.
|
|
64
|
+
* On load, status is re-derived via deriveStatus(). We persist a `status` field
|
|
65
|
+
* only as a forensic hint; loaders MUST overwrite it with the derived value.
|
|
66
|
+
* This prevents the H1 false-completion class from recurring via stale checkpoints.
|
|
67
|
+
*
|
|
68
|
+
* Review #4 BLOCKERs addressed here:
|
|
69
|
+
* #1 (status re-derive) — loadCheckpoint re-derives via deriveStatus
|
|
70
|
+
* #2 (runId recovery) — session-index.json maps sessionKey→runId durably
|
|
71
|
+
* #3 (write concurrency) — per-runId Promise lock serializes writes
|
|
72
|
+
* #5 (atomic same-dir write) — tmp written next to target, not os.tmpdir()
|
|
73
|
+
* #6 (done-run leak) — deleteCheckpoint called on terminal transitions
|
|
74
|
+
*/
|
|
75
|
+
const fs = __importStar(require("fs"));
|
|
76
|
+
const path = __importStar(require("path"));
|
|
77
|
+
const orchestrator_1 = require("./orchestrator");
|
|
78
|
+
const CHECKPOINT_SUBDIR = path.join('.autopilot', 'checkpoints');
|
|
79
|
+
const SESSION_INDEX_FILE = 'session-index.json';
|
|
80
|
+
const TERMINAL_CHECKPOINT_TTL_MS = 24 * 60 * 60 * 1000; // sweep terminal checkpoints older than 24h
|
|
81
|
+
let _writeFailureCount = 0;
|
|
82
|
+
function getCheckpointWriteFailureCount() { return _writeFailureCount; }
|
|
83
|
+
function _resetCheckpointFailureCountForTest() { _writeFailureCount = 0; }
|
|
84
|
+
/**
|
|
85
|
+
* Test-only kill switch. When true, saveCheckpoint/deleteCheckpoint/listResumableCheckpoints
|
|
86
|
+
* become no-ops so the existing 50+ test suite (which runs in the repo root and would
|
|
87
|
+
* otherwise leak checkpoint files across tests, polluting stateByRun via the
|
|
88
|
+
* register()-time restore) stays isolated. Production never sets this. Flipped to
|
|
89
|
+
* true by index.ts _resetForTest(); flipped back false by _enableCheckpointingForTest()
|
|
90
|
+
* in tests that exercise persistence (state-persister.test.ts).
|
|
91
|
+
*/
|
|
92
|
+
let _checkpointingDisabledForTest = false;
|
|
93
|
+
function _disableCheckpointingForTest() { _checkpointingDisabledForTest = true; }
|
|
94
|
+
function _enableCheckpointingForTest() { _checkpointingDisabledForTest = false; }
|
|
95
|
+
function _isCheckpointingDisabledForTest() { return _checkpointingDisabledForTest; }
|
|
96
|
+
/**
|
|
97
|
+
* Resolve the checkpoint directory for a workspace root, following symlinks
|
|
98
|
+
* (S12: same canonical-path discipline as audit-persister).
|
|
99
|
+
*/
|
|
100
|
+
function getCheckpointDir(workspaceRoot) {
|
|
101
|
+
let resolved = workspaceRoot;
|
|
102
|
+
try {
|
|
103
|
+
resolved = fs.realpathSync(workspaceRoot);
|
|
104
|
+
}
|
|
105
|
+
catch {
|
|
106
|
+
// Path may not exist yet (mkdirSync creates it downstream).
|
|
107
|
+
}
|
|
108
|
+
return path.join(resolved, CHECKPOINT_SUBDIR);
|
|
109
|
+
}
|
|
110
|
+
function getCheckpointPath(workspaceRoot, runId) {
|
|
111
|
+
return path.join(getCheckpointDir(workspaceRoot), `${runId}.json`);
|
|
112
|
+
}
|
|
113
|
+
function getSessionIndexPath(workspaceRoot) {
|
|
114
|
+
return path.join(getCheckpointDir(workspaceRoot), SESSION_INDEX_FILE);
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Build a slim checkpoint from a full AutopilotState. Extracts only the fields
|
|
118
|
+
* needed to resume a run; drops the bulky/ephemeral ones.
|
|
119
|
+
*/
|
|
120
|
+
function buildCheckpoint(state, runId, workspaceRoot) {
|
|
121
|
+
return {
|
|
122
|
+
runId,
|
|
123
|
+
sessionKey: state.sessionKey,
|
|
124
|
+
orchestrationState: state.orchestrationState,
|
|
125
|
+
blockedReason: state.blockedReason,
|
|
126
|
+
goal: state.goal,
|
|
127
|
+
goalSnapshot: state.goalSnapshot,
|
|
128
|
+
progress: state.progress,
|
|
129
|
+
progressSnapshot: state.progressSnapshot,
|
|
130
|
+
turnAttempts: state.turnAttempts,
|
|
131
|
+
totalContinuations: state.totalContinuations,
|
|
132
|
+
maxAttemptsPerTurn: state.maxAttemptsPerTurn,
|
|
133
|
+
maxTotalContinuations: state.maxTotalContinuations,
|
|
134
|
+
needsCrossTurnResume: state.needsCrossTurnResume,
|
|
135
|
+
enabled: state.enabled,
|
|
136
|
+
totalTokensUsed: state.totalTokensUsed,
|
|
137
|
+
tokenBudget: state.tokenBudget,
|
|
138
|
+
inputTokensUsed: state.inputTokensUsed,
|
|
139
|
+
outputTokensUsed: state.outputTokensUsed,
|
|
140
|
+
evidenceStatus: state.evidence?.status,
|
|
141
|
+
startedAt: state.startedAt,
|
|
142
|
+
lastActivityAt: state.lastActivityAt,
|
|
143
|
+
// Forensic hint only — loadCheckpoint overwrites this with deriveStatus().
|
|
144
|
+
status: state.status,
|
|
145
|
+
workspaceRoot,
|
|
146
|
+
workspacePath: state.workspace?.path,
|
|
147
|
+
workspace: state.workspace,
|
|
148
|
+
retry: state.retry,
|
|
149
|
+
workflow: state.workflow,
|
|
150
|
+
trustWorkspace: state.trustWorkspace,
|
|
151
|
+
savedAt: Date.now(),
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
// ─── Per-runId write lock (Review #4 #3a) ──────────────────────────────
|
|
155
|
+
// Serializes concurrent saveCheckpoint calls for the same runId across the
|
|
156
|
+
// 60s stall timer context and async hook handler contexts. A bare Map<runId,
|
|
157
|
+
// Promise> chain — each write awaits the previous one before starting.
|
|
158
|
+
const writeLocks = new Map();
|
|
159
|
+
/**
|
|
160
|
+
* Atomic write: tmp file in the SAME directory as the target (NOT os.tmpdir(),
|
|
161
|
+
* which can be on a different volume on Windows → EXDEV). renameSync is atomic
|
|
162
|
+
* on POSIX same-filesystem; Node ≥10 overwrites the target.
|
|
163
|
+
*/
|
|
164
|
+
function atomicWriteFileSync(targetPath, data) {
|
|
165
|
+
const dir = path.dirname(targetPath);
|
|
166
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
167
|
+
// PID + random suffix guards against same-dir tmp collisions under concurrency.
|
|
168
|
+
const tmpPath = `${targetPath}.tmp.${process.pid}.${Math.random().toString(36).slice(2)}`;
|
|
169
|
+
fs.writeFileSync(tmpPath, data, 'utf-8');
|
|
170
|
+
fs.renameSync(tmpPath, targetPath);
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Persist a checkpoint + update the sessionKey→runId index. Fail-silent.
|
|
174
|
+
* Serialized per-runId so concurrent setState firings don't interleave writes.
|
|
175
|
+
*
|
|
176
|
+
* Returns a Promise (rather than sync) because the lock chain is async; callers
|
|
177
|
+
* that don't need to await (the common case from setState) fire-and-forget via
|
|
178
|
+
* void. The internal _writeSyncLocked does the actual sync I/O under the lock.
|
|
179
|
+
*/
|
|
180
|
+
function saveCheckpoint(state, runId, workspaceRoot) {
|
|
181
|
+
if (_checkpointingDisabledForTest)
|
|
182
|
+
return; // test isolation: don't touch disk
|
|
183
|
+
const checkpoint = buildCheckpoint(state, runId, workspaceRoot);
|
|
184
|
+
const targetPath = getCheckpointPath(workspaceRoot, runId);
|
|
185
|
+
// Chain onto any in-flight write for this runId.
|
|
186
|
+
const prev = writeLocks.get(runId) ?? Promise.resolve();
|
|
187
|
+
const next = prev.then(() => {
|
|
188
|
+
try {
|
|
189
|
+
atomicWriteFileSync(targetPath, JSON.stringify(checkpoint));
|
|
190
|
+
updateSessionIndex(workspaceRoot, checkpoint.sessionKey, runId);
|
|
191
|
+
}
|
|
192
|
+
catch (e) {
|
|
193
|
+
_writeFailureCount++;
|
|
194
|
+
try {
|
|
195
|
+
console.error('[autopilot] checkpoint save failed:', e);
|
|
196
|
+
}
|
|
197
|
+
catch { /* noop */ }
|
|
198
|
+
}
|
|
199
|
+
}).catch(() => {
|
|
200
|
+
// Lock chain errors are already logged inside _writeSyncLocked; swallow to
|
|
201
|
+
// keep the chain alive for the next write.
|
|
202
|
+
});
|
|
203
|
+
writeLocks.set(runId, next);
|
|
204
|
+
// Auto-clean the lock entry once settled so the Map doesn't grow unbounded.
|
|
205
|
+
void next.then(() => {
|
|
206
|
+
if (writeLocks.get(runId) === next)
|
|
207
|
+
writeLocks.delete(runId);
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
/** Update the sessionKey→runId index atomically. Fail-silent. */
|
|
211
|
+
function updateSessionIndex(workspaceRoot, sessionKey, runId) {
|
|
212
|
+
const indexPath = getSessionIndexPath(workspaceRoot);
|
|
213
|
+
let index = {};
|
|
214
|
+
try {
|
|
215
|
+
if (fs.existsSync(indexPath)) {
|
|
216
|
+
index = JSON.parse(fs.readFileSync(indexPath, 'utf-8'));
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
catch {
|
|
220
|
+
// Corrupt index — start fresh rather than crash.
|
|
221
|
+
index = {};
|
|
222
|
+
}
|
|
223
|
+
if (index[sessionKey] === runId)
|
|
224
|
+
return; // no-op if unchanged
|
|
225
|
+
index[sessionKey] = runId;
|
|
226
|
+
try {
|
|
227
|
+
atomicWriteFileSync(indexPath, JSON.stringify(index));
|
|
228
|
+
}
|
|
229
|
+
catch (e) {
|
|
230
|
+
_writeFailureCount++;
|
|
231
|
+
try {
|
|
232
|
+
console.error('[autopilot] session-index update failed:', e);
|
|
233
|
+
}
|
|
234
|
+
catch { /* noop */ }
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Load a checkpoint and rebuild an AutopilotState. ADR-016 BLOCKER #1 fix:
|
|
239
|
+
* `status` is NEVER trusted from the persisted field — always re-derived.
|
|
240
|
+
*
|
|
241
|
+
* Returns null if the checkpoint is missing, corrupt, or fails workspace
|
|
242
|
+
* validation (Review #4 #4: stale-run guard).
|
|
243
|
+
*/
|
|
244
|
+
function loadCheckpoint(runId, workspaceRoot, options) {
|
|
245
|
+
const cpPath = getCheckpointPath(workspaceRoot, runId);
|
|
246
|
+
let cp;
|
|
247
|
+
try {
|
|
248
|
+
const raw = fs.readFileSync(cpPath, 'utf-8');
|
|
249
|
+
cp = JSON.parse(raw);
|
|
250
|
+
}
|
|
251
|
+
catch {
|
|
252
|
+
return null; // missing or corrupt — nothing to resume
|
|
253
|
+
}
|
|
254
|
+
// Review #4 #4: stale-run guard. If the workspace path recorded at checkpoint
|
|
255
|
+
// time no longer exists (deleted between crash and restart), refuse to resume
|
|
256
|
+
// rather than resurrecting a run against a vanished workspace.
|
|
257
|
+
if (options?.validateWorkspace !== false && cp.workspacePath) {
|
|
258
|
+
try {
|
|
259
|
+
const stat = fs.statSync(cp.workspacePath);
|
|
260
|
+
if (!stat.isDirectory())
|
|
261
|
+
return null;
|
|
262
|
+
}
|
|
263
|
+
catch {
|
|
264
|
+
return null;
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
// Rebuild a minimal AutopilotState. Many fields have safe defaults; the
|
|
268
|
+
// load-bearing ones (orchestrationState, blockedReason, goal, counters,
|
|
269
|
+
// workspace, retry, workflow) come from the checkpoint.
|
|
270
|
+
const partial = {
|
|
271
|
+
sessionKey: cp.sessionKey,
|
|
272
|
+
runId: cp.runId,
|
|
273
|
+
orchestrationState: cp.orchestrationState,
|
|
274
|
+
blockedReason: cp.blockedReason,
|
|
275
|
+
goal: cp.goal,
|
|
276
|
+
goalSnapshot: cp.goalSnapshot,
|
|
277
|
+
progress: cp.progress,
|
|
278
|
+
progressSnapshot: cp.progressSnapshot,
|
|
279
|
+
turnAttempts: cp.turnAttempts,
|
|
280
|
+
totalContinuations: cp.totalContinuations,
|
|
281
|
+
maxAttemptsPerTurn: cp.maxAttemptsPerTurn,
|
|
282
|
+
maxTotalContinuations: cp.maxTotalContinuations,
|
|
283
|
+
maxConcurrentAutopilot: 5, // default; per-run override not persisted
|
|
284
|
+
needsCrossTurnResume: cp.needsCrossTurnResume,
|
|
285
|
+
enabled: cp.enabled,
|
|
286
|
+
totalTokensUsed: cp.totalTokensUsed,
|
|
287
|
+
tokenBudget: cp.tokenBudget,
|
|
288
|
+
inputTokensUsed: cp.inputTokensUsed,
|
|
289
|
+
outputTokensUsed: cp.outputTokensUsed,
|
|
290
|
+
startedAt: cp.startedAt,
|
|
291
|
+
lastActivityAt: cp.lastActivityAt,
|
|
292
|
+
degraded: true, // mark resumed runs — operators can tell a restored run
|
|
293
|
+
toolErrorCount: 0,
|
|
294
|
+
toolErrorThreshold: 5,
|
|
295
|
+
// Reviewer #1 Finding 2a/2b/2c fixes: restore the three load-bearing
|
|
296
|
+
// objects the original "slim pointer" design dropped. Without workspace,
|
|
297
|
+
// the permission containment boundary widens to process.cwd(); without
|
|
298
|
+
// retry, retry_queued runs wedge; without workflow, validation is skipped.
|
|
299
|
+
workspace: cp.workspace,
|
|
300
|
+
retry: cp.retry,
|
|
301
|
+
workflow: cp.workflow,
|
|
302
|
+
trustWorkspace: cp.trustWorkspace,
|
|
303
|
+
};
|
|
304
|
+
// BLOCKER #1: re-derive status. Never trust cp.status.
|
|
305
|
+
const derivedStatus = (0, orchestrator_1.deriveStatus)(partial);
|
|
306
|
+
return { ...partial, status: derivedStatus };
|
|
307
|
+
}
|
|
308
|
+
/**
|
|
309
|
+
* Delete a checkpoint file (Review #4 #6: called on terminal transitions to
|
|
310
|
+
* prevent done-run file leaks). Fail-silent.
|
|
311
|
+
*/
|
|
312
|
+
function deleteCheckpoint(runId, workspaceRoot) {
|
|
313
|
+
if (_checkpointingDisabledForTest)
|
|
314
|
+
return; // test isolation: don't touch disk
|
|
315
|
+
const cpPath = getCheckpointPath(workspaceRoot, runId);
|
|
316
|
+
try {
|
|
317
|
+
if (fs.existsSync(cpPath))
|
|
318
|
+
fs.unlinkSync(cpPath);
|
|
319
|
+
}
|
|
320
|
+
catch (e) {
|
|
321
|
+
try {
|
|
322
|
+
console.error('[autopilot] checkpoint delete failed:', e);
|
|
323
|
+
}
|
|
324
|
+
catch { /* noop */ }
|
|
325
|
+
}
|
|
326
|
+
// Best-effort index cleanup — leave stale sessionKey→runId entries; they're
|
|
327
|
+
// cheap and the index is rewritten on every save. A full GC pass would risk
|
|
328
|
+
// racing an in-flight save for a different runId.
|
|
329
|
+
}
|
|
330
|
+
/**
|
|
331
|
+
* Remove a sessionKey→runId entry from the index. Used when a run terminates
|
|
332
|
+
* so a future session_start for the same sessionKey doesn't resurrect a dead run.
|
|
333
|
+
*/
|
|
334
|
+
function clearSessionIndexEntry(workspaceRoot, sessionKey) {
|
|
335
|
+
const indexPath = getSessionIndexPath(workspaceRoot);
|
|
336
|
+
try {
|
|
337
|
+
if (!fs.existsSync(indexPath))
|
|
338
|
+
return;
|
|
339
|
+
const index = JSON.parse(fs.readFileSync(indexPath, 'utf-8'));
|
|
340
|
+
if (!(sessionKey in index))
|
|
341
|
+
return;
|
|
342
|
+
delete index[sessionKey];
|
|
343
|
+
atomicWriteFileSync(indexPath, JSON.stringify(index));
|
|
344
|
+
}
|
|
345
|
+
catch {
|
|
346
|
+
// fail-silent
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
/**
|
|
350
|
+
* Look up runId by sessionKey from the durable index. Returns null if the
|
|
351
|
+
* index is missing, corrupt, or has no entry. This is BLOCKER #2's recovery
|
|
352
|
+
* path: after a process restart, the in-memory sessionKeyToRunId Map is empty,
|
|
353
|
+
* so session_start must consult this file to find the checkpoint.
|
|
354
|
+
*/
|
|
355
|
+
function lookupRunIdBySessionKey(workspaceRoot, sessionKey) {
|
|
356
|
+
const indexPath = getSessionIndexPath(workspaceRoot);
|
|
357
|
+
try {
|
|
358
|
+
if (!fs.existsSync(indexPath))
|
|
359
|
+
return null;
|
|
360
|
+
const index = JSON.parse(fs.readFileSync(indexPath, 'utf-8'));
|
|
361
|
+
return index[sessionKey] ?? null;
|
|
362
|
+
}
|
|
363
|
+
catch {
|
|
364
|
+
return null;
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
/**
|
|
368
|
+
* Scan the checkpoints directory and return all runIds whose checkpoint is
|
|
369
|
+
* resumable (orchestrationState in the active family) and whose workspace still
|
|
370
|
+
* exists. Used by register() at process init to restore ALL resumable runs,
|
|
371
|
+
* not just the one whose session_start fired (Review #3 multi-run gap).
|
|
372
|
+
*
|
|
373
|
+
* Also sweeps terminal checkpoints older than TERMINAL_CHECKPOINT_TTL_MS to
|
|
374
|
+
* reclaim disk (Review #4 #6c).
|
|
375
|
+
*/
|
|
376
|
+
function listResumableCheckpoints(workspaceRoot) {
|
|
377
|
+
if (_checkpointingDisabledForTest)
|
|
378
|
+
return []; // test isolation: don't read disk
|
|
379
|
+
const dir = getCheckpointDir(workspaceRoot);
|
|
380
|
+
if (!fs.existsSync(dir))
|
|
381
|
+
return [];
|
|
382
|
+
let files;
|
|
383
|
+
try {
|
|
384
|
+
files = fs.readdirSync(dir).filter(f => f.endsWith('.json') && f !== SESSION_INDEX_FILE);
|
|
385
|
+
}
|
|
386
|
+
catch {
|
|
387
|
+
return [];
|
|
388
|
+
}
|
|
389
|
+
const resumable = [];
|
|
390
|
+
const now = Date.now();
|
|
391
|
+
for (const f of files) {
|
|
392
|
+
const runId = f.replace(/\.json$/, '');
|
|
393
|
+
const fullPath = path.join(dir, f);
|
|
394
|
+
try {
|
|
395
|
+
const cp = JSON.parse(fs.readFileSync(fullPath, 'utf-8'));
|
|
396
|
+
const orch = cp.orchestrationState;
|
|
397
|
+
const isResumable = orch === 'running' || orch === 'claimed' || orch === 'retry_queued' || orch === 'released' || orch === 'unclaimed';
|
|
398
|
+
const isTerminal = orch === 'done' || (orch === 'blocked' && cp.blockedReason && !isResumableBlockedReason(cp.blockedReason));
|
|
399
|
+
if (isTerminal) {
|
|
400
|
+
// Review #4 #6c: sweep stale terminal checkpoints.
|
|
401
|
+
if (cp.savedAt && (now - cp.savedAt) > TERMINAL_CHECKPOINT_TTL_MS) {
|
|
402
|
+
try {
|
|
403
|
+
fs.unlinkSync(fullPath);
|
|
404
|
+
}
|
|
405
|
+
catch { /* fail-silent */ }
|
|
406
|
+
}
|
|
407
|
+
continue;
|
|
408
|
+
}
|
|
409
|
+
if (isResumable) {
|
|
410
|
+
// Validate workspace still exists before offering to resume.
|
|
411
|
+
if (cp.workspacePath) {
|
|
412
|
+
try {
|
|
413
|
+
const stat = fs.statSync(cp.workspacePath);
|
|
414
|
+
if (!stat.isDirectory())
|
|
415
|
+
continue;
|
|
416
|
+
}
|
|
417
|
+
catch {
|
|
418
|
+
continue; // workspace gone — skip
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
resumable.push(runId);
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
catch {
|
|
425
|
+
// corrupt checkpoint — skip
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
return resumable;
|
|
429
|
+
}
|
|
430
|
+
// Mirror of RESUMABLE_BLOCKED_REASONS from orchestrator.ts (kept local to avoid
|
|
431
|
+
// a circular import: orchestrator.ts imports nothing from this module, and we
|
|
432
|
+
// don't want to widen its dep surface). If the set in orchestrator.ts changes,
|
|
433
|
+
// update this too. (Documented linkage, not duplication-for-its-own-sake.)
|
|
434
|
+
const RESUMABLE_BLOCKED_LOCAL = new Set([
|
|
435
|
+
'stalled',
|
|
436
|
+
'validation_failed',
|
|
437
|
+
'evidence_missing',
|
|
438
|
+
'injection_rejected',
|
|
439
|
+
]);
|
|
440
|
+
function isResumableBlockedReason(reason) {
|
|
441
|
+
return RESUMABLE_BLOCKED_LOCAL.has(reason);
|
|
442
|
+
}
|
|
443
|
+
/** Test-only: clear the write-lock map between tests. */
|
|
444
|
+
function _clearWriteLocksForTest() {
|
|
445
|
+
writeLocks.clear();
|
|
446
|
+
}
|
|
447
|
+
/**
|
|
448
|
+
* Test-only: deterministically await all in-flight checkpoint writes. Reviewer
|
|
449
|
+
* #2 Finding 5 fix — replaces the fragile "two setImmediate ticks" drain with
|
|
450
|
+
* `Promise.all` over the lock map so tests don't flake if the lock chain grows
|
|
451
|
+
* another async hop.
|
|
452
|
+
*/
|
|
453
|
+
async function _flushAllWritesForTest() {
|
|
454
|
+
await Promise.all([...writeLocks.values()]);
|
|
455
|
+
}
|
|
456
|
+
//# sourceMappingURL=state-persister.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state-persister.js","sourceRoot":"","sources":["../../src/state-persister.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoCA,wEAAuF;AACvF,kFAAuF;AAWvF,oEAA8F;AAC9F,kEAA8F;AAC9F,0EAAoG;AAgFpG,0CAiCC;AA8BD,wCAwBC;AA+BD,wCAmEC;AAMD,4CAWC;AAMD,wDAWC;AAQD,0DASC;AAWD,4DA6CC;AAiBD,0DAEC;AAQD,wDAEC;AAncD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,uCAAyB;AACzB,2CAA6B;AAG7B,iDAA8C;AAE9C,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC;AACjE,MAAM,kBAAkB,GAAG,oBAAoB,CAAC;AAChD,MAAM,0BAA0B,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,4CAA4C;AAEpG,IAAI,kBAAkB,GAAG,CAAC,CAAC;AAC3B,SAAgB,8BAA8B,KAAa,OAAO,kBAAkB,CAAC,CAAC,CAAC;AACvF,SAAgB,mCAAmC,KAAW,kBAAkB,GAAG,CAAC,CAAC,CAAC,CAAC;AAEvF;;;;;;;GAOG;AACH,IAAI,6BAA6B,GAAG,KAAK,CAAC;AAC1C,SAAgB,4BAA4B,KAAW,6BAA6B,GAAG,IAAI,CAAC,CAAC,CAAC;AAC9F,SAAgB,2BAA2B,KAAW,6BAA6B,GAAG,KAAK,CAAC,CAAC,CAAC;AAC9F,SAAgB,+BAA+B,KAAc,OAAO,6BAA6B,CAAC,CAAC,CAAC;AAEpG;;;GAGG;AACH,SAAS,gBAAgB,CAAC,aAAqB;IAC7C,IAAI,QAAQ,GAAG,aAAa,CAAC;IAC7B,IAAI,CAAC;QACH,QAAQ,GAAG,EAAE,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC;IAC5C,CAAC;IAAC,MAAM,CAAC;QACP,4DAA4D;IAC9D,CAAC;IACD,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC;AAChD,CAAC;AAED,SAAS,iBAAiB,CAAC,aAAqB,EAAE,KAAa;IAC7D,OAAO,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC,EAAE,GAAG,KAAK,OAAO,CAAC,CAAC;AACrE,CAAC;AAED,SAAS,mBAAmB,CAAC,aAAqB;IAChD,OAAO,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC,EAAE,kBAAkB,CAAC,CAAC;AACxE,CAAC;AAsDD;;;GAGG;AACH,SAAgB,eAAe,CAAC,KAAqB,EAAE,KAAa,EAAE,aAAqB;IACzF,OAAO;QACL,KAAK;QACL,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,kBAAkB,EAAE,KAAK,CAAC,kBAAkB;QAC5C,aAAa,EAAE,KAAK,CAAC,aAAa;QAClC,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,YAAY,EAAE,KAAK,CAAC,YAAY;QAChC,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;QACxC,YAAY,EAAE,KAAK,CAAC,YAAY;QAChC,kBAAkB,EAAE,KAAK,CAAC,kBAAkB;QAC5C,kBAAkB,EAAE,KAAK,CAAC,kBAAkB;QAC5C,qBAAqB,EAAE,KAAK,CAAC,qBAAqB;QAClD,oBAAoB,EAAE,KAAK,CAAC,oBAAoB;QAChD,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,eAAe,EAAE,KAAK,CAAC,eAAe;QACtC,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,eAAe,EAAE,KAAK,CAAC,eAAe;QACtC,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;QACxC,cAAc,EAAE,KAAK,CAAC,QAAQ,EAAE,MAAM;QACtC,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,cAAc,EAAE,KAAK,CAAC,cAAc;QACpC,2EAA2E;QAC3E,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,aAAa;QACb,aAAa,EAAE,KAAK,CAAC,SAAS,EAAE,IAAI;QACpC,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,cAAc,EAAE,KAAK,CAAC,cAAc;QACpC,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE;KACpB,CAAC;AACJ,CAAC;AAED,0EAA0E;AAC1E,2EAA2E;AAC3E,6EAA6E;AAC7E,uEAAuE;AACvE,MAAM,UAAU,GAAG,IAAI,GAAG,EAAyB,CAAC;AAEpD;;;;GAIG;AACH,SAAS,mBAAmB,CAAC,UAAkB,EAAE,IAAY;IAC3D,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IACrC,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACvC,gFAAgF;IAChF,MAAM,OAAO,GAAG,GAAG,UAAU,QAAQ,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1F,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IACzC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;AACrC,CAAC;AAED;;;;;;;GAOG;AACH,SAAgB,cAAc,CAAC,KAAqB,EAAE,KAAa,EAAE,aAAqB;IACxF,IAAI,6BAA6B;QAAE,OAAO,CAAC,mCAAmC;IAC9E,MAAM,UAAU,GAAG,eAAe,CAAC,KAAK,EAAE,KAAK,EAAE,aAAa,CAAC,CAAC;IAChE,MAAM,UAAU,GAAG,iBAAiB,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;IAE3D,iDAAiD;IACjD,MAAM,IAAI,GAAG,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IACxD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE;QAC1B,IAAI,CAAC;YACH,mBAAmB,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC;YAC5D,kBAAkB,CAAC,aAAa,EAAE,UAAU,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QAClE,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,kBAAkB,EAAE,CAAC;YACrB,IAAI,CAAC;gBAAC,OAAO,CAAC,KAAK,CAAC,qCAAqC,EAAE,CAAC,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,UAAU,CAAC,CAAC;QACvF,CAAC;IACH,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;QACZ,2EAA2E;QAC3E,2CAA2C;IAC7C,CAAC,CAAC,CAAC;IACH,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAC5B,4EAA4E;IAC5E,KAAK,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE;QAClB,IAAI,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,IAAI;YAAE,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;AACL,CAAC;AAED,iEAAiE;AACjE,SAAS,kBAAkB,CAAC,aAAqB,EAAE,UAAkB,EAAE,KAAa;IAClF,MAAM,SAAS,GAAG,mBAAmB,CAAC,aAAa,CAAC,CAAC;IACrD,IAAI,KAAK,GAA2B,EAAE,CAAC;IACvC,IAAI,CAAC;QACH,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC7B,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAA2B,CAAC;QACpF,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,iDAAiD;QACjD,KAAK,GAAG,EAAE,CAAC;IACb,CAAC;IACD,IAAI,KAAK,CAAC,UAAU,CAAC,KAAK,KAAK;QAAE,OAAO,CAAC,qBAAqB;IAC9D,KAAK,CAAC,UAAU,CAAC,GAAG,KAAK,CAAC;IAC1B,IAAI,CAAC;QACH,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;IACxD,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,kBAAkB,EAAE,CAAC;QACrB,IAAI,CAAC;YAAC,OAAO,CAAC,KAAK,CAAC,0CAA0C,EAAE,CAAC,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,UAAU,CAAC,CAAC;IAC5F,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,cAAc,CAC5B,KAAa,EACb,aAAqB,EACrB,OAAyC;IAEzC,MAAM,MAAM,GAAG,iBAAiB,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;IACvD,IAAI,EAAuB,CAAC;IAC5B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC7C,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAwB,CAAC;IAC9C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC,CAAC,yCAAyC;IACxD,CAAC;IAED,8EAA8E;IAC9E,8EAA8E;IAC9E,+DAA+D;IAC/D,IAAI,OAAO,EAAE,iBAAiB,KAAK,KAAK,IAAI,EAAE,CAAC,aAAa,EAAE,CAAC;QAC7D,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC;YAC3C,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;gBAAE,OAAO,IAAI,CAAC;QACvC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,wEAAwE;IACxE,wEAAwE;IACxE,wDAAwD;IACxD,MAAM,OAAO,GAAG;QACd,UAAU,EAAE,EAAE,CAAC,UAAU;QACzB,KAAK,EAAE,EAAE,CAAC,KAAK;QACf,kBAAkB,EAAE,EAAE,CAAC,kBAAkB;QACzC,aAAa,EAAE,EAAE,CAAC,aAAa;QAC/B,IAAI,EAAE,EAAE,CAAC,IAAI;QACb,YAAY,EAAE,EAAE,CAAC,YAAY;QAC7B,QAAQ,EAAE,EAAE,CAAC,QAAQ;QACrB,gBAAgB,EAAE,EAAE,CAAC,gBAAgB;QACrC,YAAY,EAAE,EAAE,CAAC,YAAY;QAC7B,kBAAkB,EAAE,EAAE,CAAC,kBAAkB;QACzC,kBAAkB,EAAE,EAAE,CAAC,kBAAkB;QACzC,qBAAqB,EAAE,EAAE,CAAC,qBAAqB;QAC/C,sBAAsB,EAAE,CAAC,EAAE,0CAA0C;QACrE,oBAAoB,EAAE,EAAE,CAAC,oBAAoB;QAC7C,OAAO,EAAE,EAAE,CAAC,OAAO;QACnB,eAAe,EAAE,EAAE,CAAC,eAAe;QACnC,WAAW,EAAE,EAAE,CAAC,WAAW;QAC3B,eAAe,EAAE,EAAE,CAAC,eAAe;QACnC,gBAAgB,EAAE,EAAE,CAAC,gBAAgB;QACrC,SAAS,EAAE,EAAE,CAAC,SAAS;QACvB,cAAc,EAAE,EAAE,CAAC,cAAc;QACjC,QAAQ,EAAE,IAAI,EAAE,wDAAwD;QACxE,cAAc,EAAE,CAAC;QACjB,kBAAkB,EAAE,CAAC;QACrB,qEAAqE;QACrE,yEAAyE;QACzE,uEAAuE;QACvE,2EAA2E;QAC3E,SAAS,EAAE,EAAE,CAAC,SAAS;QACvB,KAAK,EAAE,EAAE,CAAC,KAAK;QACf,QAAQ,EAAE,EAAE,CAAC,QAAQ;QACrB,cAAc,EAAE,EAAE,CAAC,cAAc;KAChB,CAAC;IAEpB,uDAAuD;IACvD,MAAM,aAAa,GAAG,IAAA,2BAAY,EAAC,OAAO,CAAC,CAAC;IAC5C,OAAO,EAAE,GAAG,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;AAC/C,CAAC;AAED;;;GAGG;AACH,SAAgB,gBAAgB,CAAC,KAAa,EAAE,aAAqB;IACnE,IAAI,6BAA6B;QAAE,OAAO,CAAC,mCAAmC;IAC9E,MAAM,MAAM,GAAG,iBAAiB,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;IACvD,IAAI,CAAC;QACH,IAAI,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC;YAAE,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IACnD,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,IAAI,CAAC;YAAC,OAAO,CAAC,KAAK,CAAC,uCAAuC,EAAE,CAAC,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,UAAU,CAAC,CAAC;IACzF,CAAC;IACD,4EAA4E;IAC5E,4EAA4E;IAC5E,kDAAkD;AACpD,CAAC;AAED;;;GAGG;AACH,SAAgB,sBAAsB,CAAC,aAAqB,EAAE,UAAkB;IAC9E,MAAM,SAAS,GAAG,mBAAmB,CAAC,aAAa,CAAC,CAAC;IACrD,IAAI,CAAC;QACH,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC;YAAE,OAAO;QACtC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAA2B,CAAC;QACxF,IAAI,CAAC,CAAC,UAAU,IAAI,KAAK,CAAC;YAAE,OAAO;QACnC,OAAO,KAAK,CAAC,UAAU,CAAC,CAAC;QACzB,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;IACxD,CAAC;IAAC,MAAM,CAAC;QACP,cAAc;IAChB,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,SAAgB,uBAAuB,CAAC,aAAqB,EAAE,UAAkB;IAC/E,MAAM,SAAS,GAAG,mBAAmB,CAAC,aAAa,CAAC,CAAC;IACrD,IAAI,CAAC;QACH,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC;YAAE,OAAO,IAAI,CAAC;QAC3C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAA2B,CAAC;QACxF,OAAO,KAAK,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC;IACnC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;;;;;GAQG;AACH,SAAgB,wBAAwB,CAAC,aAAqB;IAC5D,IAAI,6BAA6B;QAAE,OAAO,EAAE,CAAC,CAAC,kCAAkC;IAChF,MAAM,GAAG,GAAG,gBAAgB,CAAC,aAAa,CAAC,CAAC;IAC5C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,CAAC;IACnC,IAAI,KAAe,CAAC;IACpB,IAAI,CAAC;QACH,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,kBAAkB,CAAC,CAAC;IAC3F,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,MAAM,KAAK,GAAG,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACnC,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAwB,CAAC;YACjF,MAAM,IAAI,GAAG,EAAE,CAAC,kBAAkB,CAAC;YACnC,MAAM,WAAW,GAAG,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,cAAc,IAAI,IAAI,KAAK,UAAU,IAAI,IAAI,KAAK,WAAW,CAAC;YACvI,MAAM,UAAU,GAAG,IAAI,KAAK,MAAM,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,EAAE,CAAC,aAAa,IAAI,CAAC,wBAAwB,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC;YAE9H,IAAI,UAAU,EAAE,CAAC;gBACf,mDAAmD;gBACnD,IAAI,EAAE,CAAC,OAAO,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,0BAA0B,EAAE,CAAC;oBAClE,IAAI,CAAC;wBAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;oBAAC,CAAC;oBAAC,MAAM,CAAC,CAAC,iBAAiB,CAAC,CAAC;gBAC9D,CAAC;gBACD,SAAS;YACX,CAAC;YACD,IAAI,WAAW,EAAE,CAAC;gBAChB,6DAA6D;gBAC7D,IAAI,EAAE,CAAC,aAAa,EAAE,CAAC;oBACrB,IAAI,CAAC;wBACH,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC;wBAC3C,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;4BAAE,SAAS;oBACpC,CAAC;oBAAC,MAAM,CAAC;wBACP,SAAS,CAAC,wBAAwB;oBACpC,CAAC;gBACH,CAAC;gBACD,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACxB,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,4BAA4B;QAC9B,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,gFAAgF;AAChF,8EAA8E;AAC9E,+EAA+E;AAC/E,2EAA2E;AAC3E,MAAM,uBAAuB,GAAwB,IAAI,GAAG,CAAC;IAC3D,SAAS;IACT,mBAAmB;IACnB,kBAAkB;IAClB,oBAAoB;CACrB,CAAC,CAAC;AACH,SAAS,wBAAwB,CAAC,MAAc;IAC9C,OAAO,uBAAuB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AAC7C,CAAC;AAED,yDAAyD;AACzD,SAAgB,uBAAuB;IACrC,UAAU,CAAC,KAAK,EAAE,CAAC;AACrB,CAAC;AAED;;;;;GAKG;AACI,KAAK,UAAU,sBAAsB;IAC1C,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;AAC9C,CAAC"}
|