@oh-my-matrix/autopilot 2.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/LICENSE +21 -0
- package/README.md +36 -0
- package/dist/index.d.ts +28 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1034 -0
- package/dist/index.js.map +1 -0
- package/dist/src/audit-persister.d.ts +25 -0
- package/dist/src/audit-persister.d.ts.map +1 -0
- package/dist/src/audit-persister.js +162 -0
- package/dist/src/audit-persister.js.map +1 -0
- package/dist/src/autopilot-state.d.ts +35 -0
- package/dist/src/autopilot-state.d.ts.map +1 -0
- package/dist/src/autopilot-state.js +121 -0
- package/dist/src/autopilot-state.js.map +1 -0
- package/dist/src/command-runner.d.ts +13 -0
- package/dist/src/command-runner.d.ts.map +1 -0
- package/dist/src/command-runner.js +148 -0
- package/dist/src/command-runner.js.map +1 -0
- package/dist/src/completion-detector.d.ts +21 -0
- package/dist/src/completion-detector.d.ts.map +1 -0
- package/dist/src/completion-detector.js +104 -0
- package/dist/src/completion-detector.js.map +1 -0
- package/dist/src/continuation-engine.d.ts +9 -0
- package/dist/src/continuation-engine.d.ts.map +1 -0
- package/dist/src/continuation-engine.js +76 -0
- package/dist/src/continuation-engine.js.map +1 -0
- package/dist/src/effort-injection.d.ts +9 -0
- package/dist/src/effort-injection.d.ts.map +1 -0
- package/dist/src/effort-injection.js +17 -0
- package/dist/src/effort-injection.js.map +1 -0
- package/dist/src/evidence-gate.d.ts +24 -0
- package/dist/src/evidence-gate.d.ts.map +1 -0
- package/dist/src/evidence-gate.js +86 -0
- package/dist/src/evidence-gate.js.map +1 -0
- package/dist/src/goal-manager.d.ts +5 -0
- package/dist/src/goal-manager.d.ts.map +1 -0
- package/dist/src/goal-manager.js +22 -0
- package/dist/src/goal-manager.js.map +1 -0
- package/dist/src/logger.d.ts +27 -0
- package/dist/src/logger.d.ts.map +1 -0
- package/dist/src/logger.js +90 -0
- package/dist/src/logger.js.map +1 -0
- package/dist/src/orchestrator.d.ts +16 -0
- package/dist/src/orchestrator.d.ts.map +1 -0
- package/dist/src/orchestrator.js +252 -0
- package/dist/src/orchestrator.js.map +1 -0
- package/dist/src/permission-policy.d.ts +36 -0
- package/dist/src/permission-policy.d.ts.map +1 -0
- package/dist/src/permission-policy.js +265 -0
- package/dist/src/permission-policy.js.map +1 -0
- package/dist/src/project-detector.d.ts +8 -0
- package/dist/src/project-detector.d.ts.map +1 -0
- package/dist/src/project-detector.js +130 -0
- package/dist/src/project-detector.js.map +1 -0
- package/dist/src/projection.d.ts +47 -0
- package/dist/src/projection.d.ts.map +1 -0
- package/dist/src/projection.js +58 -0
- package/dist/src/projection.js.map +1 -0
- package/dist/src/retry-queue.d.ts +25 -0
- package/dist/src/retry-queue.d.ts.map +1 -0
- package/dist/src/retry-queue.js +77 -0
- package/dist/src/retry-queue.js.map +1 -0
- package/dist/src/stall-detector.d.ts +22 -0
- package/dist/src/stall-detector.d.ts.map +1 -0
- package/dist/src/stall-detector.js +26 -0
- package/dist/src/stall-detector.js.map +1 -0
- package/dist/src/tool-error-tracker.d.ts +4 -0
- package/dist/src/tool-error-tracker.d.ts.map +1 -0
- package/dist/src/tool-error-tracker.js +18 -0
- package/dist/src/tool-error-tracker.js.map +1 -0
- package/dist/src/types.d.ts +223 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +55 -0
- package/dist/src/types.js.map +1 -0
- package/dist/src/workflow-config.d.ts +13 -0
- package/dist/src/workflow-config.d.ts.map +1 -0
- package/dist/src/workflow-config.js +422 -0
- package/dist/src/workflow-config.js.map +1 -0
- package/openclaw.plugin.json +62 -0
- package/package.json +56 -0
|
@@ -0,0 +1,130 @@
|
|
|
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.detectValidationCommands = detectValidationCommands;
|
|
37
|
+
/**
|
|
38
|
+
* R-3: Project type auto-detection for Evidence Gate validation commands.
|
|
39
|
+
*
|
|
40
|
+
* Inspects the workspace root for known project files and returns
|
|
41
|
+
* a default set of ValidationCommand entries appropriate for the project.
|
|
42
|
+
* Returns empty array if no recognizable project type is found.
|
|
43
|
+
*/
|
|
44
|
+
const fs = __importStar(require("fs"));
|
|
45
|
+
const path = __importStar(require("path"));
|
|
46
|
+
function exists(filePath) {
|
|
47
|
+
try {
|
|
48
|
+
return fs.existsSync(filePath);
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
return false;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
function readJsonSafe(filePath) {
|
|
55
|
+
try {
|
|
56
|
+
return JSON.parse(fs.readFileSync(filePath, 'utf-8'));
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
return {};
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Detect validation commands for the given workspace directory.
|
|
64
|
+
* Checks for package.json (Node), go.mod (Go), Cargo.toml (Rust),
|
|
65
|
+
* pyproject.toml / requirements.txt (Python).
|
|
66
|
+
*/
|
|
67
|
+
function detectValidationCommands(workspaceDir) {
|
|
68
|
+
try {
|
|
69
|
+
if (!fs.existsSync(workspaceDir))
|
|
70
|
+
return [];
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
return [];
|
|
74
|
+
}
|
|
75
|
+
const commands = [];
|
|
76
|
+
// ── Node.js ──────────────────────────────────────────────────────────────
|
|
77
|
+
const pkgPath = path.join(workspaceDir, 'package.json');
|
|
78
|
+
if (exists(pkgPath)) {
|
|
79
|
+
const pkg = readJsonSafe(pkgPath);
|
|
80
|
+
const scripts = (pkg.scripts ?? {});
|
|
81
|
+
const hasTestScript = typeof scripts.test === 'string';
|
|
82
|
+
// Detect package manager.
|
|
83
|
+
// The bare name (npm/pnpm/yarn) is emitted uniformly; command-runner's
|
|
84
|
+
// conditional shell (X-15) resolves .cmd wrappers on Windows automatically.
|
|
85
|
+
let pm = 'npm';
|
|
86
|
+
if (exists(path.join(workspaceDir, 'pnpm-lock.yaml')))
|
|
87
|
+
pm = 'pnpm';
|
|
88
|
+
else if (exists(path.join(workspaceDir, 'yarn.lock')))
|
|
89
|
+
pm = 'yarn';
|
|
90
|
+
if (hasTestScript) {
|
|
91
|
+
commands.push({
|
|
92
|
+
id: 'node-test',
|
|
93
|
+
command: `${pm} test`,
|
|
94
|
+
timeoutMs: 120_000,
|
|
95
|
+
required: true,
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
// ── Go ────────────────────────────────────────────────────────────────────
|
|
100
|
+
if (exists(path.join(workspaceDir, 'go.mod'))) {
|
|
101
|
+
commands.push({
|
|
102
|
+
id: 'go-test',
|
|
103
|
+
command: 'go test ./...',
|
|
104
|
+
timeoutMs: 120_000,
|
|
105
|
+
required: true,
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
// ── Rust ─────────────────────────────────────────────────────────────────
|
|
109
|
+
if (exists(path.join(workspaceDir, 'Cargo.toml'))) {
|
|
110
|
+
commands.push({
|
|
111
|
+
id: 'cargo-test',
|
|
112
|
+
command: 'cargo test',
|
|
113
|
+
timeoutMs: 180_000,
|
|
114
|
+
required: true,
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
// ── Python ───────────────────────────────────────────────────────────────
|
|
118
|
+
const hasPyproject = exists(path.join(workspaceDir, 'pyproject.toml'));
|
|
119
|
+
const hasRequirements = exists(path.join(workspaceDir, 'requirements.txt'));
|
|
120
|
+
if (hasPyproject || hasRequirements) {
|
|
121
|
+
commands.push({
|
|
122
|
+
id: 'pytest',
|
|
123
|
+
command: 'python -m pytest',
|
|
124
|
+
timeoutMs: 120_000,
|
|
125
|
+
required: false,
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
return commands;
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=project-detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-detector.js","sourceRoot":"","sources":["../../src/project-detector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import type { AutopilotState, ToolErrorEntry, EvidenceCommandResult } from './types';
|
|
2
|
+
export interface AutopilotProjection {
|
|
3
|
+
status: AutopilotState['status'];
|
|
4
|
+
enabled: boolean;
|
|
5
|
+
turnAttempts: number;
|
|
6
|
+
totalContinuations: number;
|
|
7
|
+
maxAttemptsPerTurn: number;
|
|
8
|
+
maxTotalContinuations: number;
|
|
9
|
+
maxConcurrentAutopilot: number;
|
|
10
|
+
pauseReason?: AutopilotState['pauseReason'];
|
|
11
|
+
needsCrossTurnResume: boolean;
|
|
12
|
+
canStop: boolean;
|
|
13
|
+
lastGoal?: string;
|
|
14
|
+
totalTokensUsed: number;
|
|
15
|
+
tokenBudget?: number;
|
|
16
|
+
/** Estimated API cost in USD based on input/output token counts (Claude Sonnet pricing) */
|
|
17
|
+
estimatedCostUsd: number;
|
|
18
|
+
lastToolError?: ToolErrorEntry;
|
|
19
|
+
degraded: boolean;
|
|
20
|
+
orchestrationState?: AutopilotState['orchestrationState'];
|
|
21
|
+
workspacePath?: string;
|
|
22
|
+
workspaceBranch?: string;
|
|
23
|
+
retryCount?: number;
|
|
24
|
+
nextRetryAt?: number;
|
|
25
|
+
blockedReason?: AutopilotState['blockedReason'];
|
|
26
|
+
startedAt?: number;
|
|
27
|
+
lastActivityAt?: number;
|
|
28
|
+
runtimeMs?: number;
|
|
29
|
+
inputTokensUsed?: number;
|
|
30
|
+
outputTokensUsed?: number;
|
|
31
|
+
evidenceStatus?: AutopilotState['evidence'] extends {
|
|
32
|
+
status: infer S;
|
|
33
|
+
} | undefined ? S : never;
|
|
34
|
+
evidenceSummary?: string;
|
|
35
|
+
lastEvidenceCommands?: EvidenceCommandResult[];
|
|
36
|
+
workflowSource?: 'workflow_md' | 'default' | 'last_valid';
|
|
37
|
+
workflowConfigError?: string;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Claude API pricing constants used for cost estimation.
|
|
41
|
+
* Model: Claude Sonnet (as of 2026-Q2). Update if model/pricing changes.
|
|
42
|
+
* Source: https://www.anthropic.com/pricing
|
|
43
|
+
*/
|
|
44
|
+
export declare const AUTOPILOT_INPUT_COST_PER_M_USD = 3;
|
|
45
|
+
export declare const AUTOPILOT_OUTPUT_COST_PER_M_USD = 15;
|
|
46
|
+
export declare function projectState(state: AutopilotState | undefined): AutopilotProjection | undefined;
|
|
47
|
+
//# sourceMappingURL=projection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projection.d.ts","sourceRoot":"","sources":["../../src/projection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAErF,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAC;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,sBAAsB,EAAE,MAAM,CAAC;IAC/B,WAAW,CAAC,EAAE,cAAc,CAAC,aAAa,CAAC,CAAC;IAC5C,oBAAoB,EAAE,OAAO,CAAC;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,2FAA2F;IAC3F,gBAAgB,EAAE,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,cAAc,CAAC;IAC/B,QAAQ,EAAE,OAAO,CAAC;IAElB,kBAAkB,CAAC,EAAE,cAAc,CAAC,oBAAoB,CAAC,CAAC;IAC1D,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,cAAc,CAAC,eAAe,CAAC,CAAC;IAChD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,cAAc,CAAC,EAAE,cAAc,CAAC,UAAU,CAAC,SAAS;QAAE,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,GAAG,SAAS,GAAG,CAAC,GAAG,KAAK,CAAC;IAChG,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,oBAAoB,CAAC,EAAE,qBAAqB,EAAE,CAAC;IAC/C,cAAc,CAAC,EAAE,aAAa,GAAG,SAAS,GAAG,YAAY,CAAC;IAC1D,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED;;;;GAIG;AACH,eAAO,MAAM,8BAA8B,IAAM,CAAC;AAClD,eAAO,MAAM,+BAA+B,KAAO,CAAC;AAMpD,wBAAgB,YAAY,CAAC,KAAK,EAAE,cAAc,GAAG,SAAS,GAAG,mBAAmB,GAAG,SAAS,CA0C/F"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AUTOPILOT_OUTPUT_COST_PER_M_USD = exports.AUTOPILOT_INPUT_COST_PER_M_USD = void 0;
|
|
4
|
+
exports.projectState = projectState;
|
|
5
|
+
/**
|
|
6
|
+
* Claude API pricing constants used for cost estimation.
|
|
7
|
+
* Model: Claude Sonnet (as of 2026-Q2). Update if model/pricing changes.
|
|
8
|
+
* Source: https://www.anthropic.com/pricing
|
|
9
|
+
*/
|
|
10
|
+
exports.AUTOPILOT_INPUT_COST_PER_M_USD = 3.0;
|
|
11
|
+
exports.AUTOPILOT_OUTPUT_COST_PER_M_USD = 15.0;
|
|
12
|
+
// Claude Sonnet pricing (per 1M tokens, USD)
|
|
13
|
+
const INPUT_COST_PER_M = exports.AUTOPILOT_INPUT_COST_PER_M_USD;
|
|
14
|
+
const OUTPUT_COST_PER_M = exports.AUTOPILOT_OUTPUT_COST_PER_M_USD;
|
|
15
|
+
function projectState(state) {
|
|
16
|
+
if (!state)
|
|
17
|
+
return undefined;
|
|
18
|
+
const now = Date.now();
|
|
19
|
+
const inputTokens = state.inputTokensUsed ?? 0;
|
|
20
|
+
const outputTokens = state.outputTokensUsed ?? 0;
|
|
21
|
+
const estimatedCostUsd = (inputTokens * INPUT_COST_PER_M + outputTokens * OUTPUT_COST_PER_M) / 1_000_000;
|
|
22
|
+
return {
|
|
23
|
+
status: state.status,
|
|
24
|
+
enabled: state.enabled,
|
|
25
|
+
turnAttempts: state.turnAttempts,
|
|
26
|
+
totalContinuations: state.totalContinuations,
|
|
27
|
+
maxAttemptsPerTurn: state.maxAttemptsPerTurn,
|
|
28
|
+
maxTotalContinuations: state.maxTotalContinuations,
|
|
29
|
+
maxConcurrentAutopilot: state.maxConcurrentAutopilot,
|
|
30
|
+
pauseReason: state.pauseReason,
|
|
31
|
+
needsCrossTurnResume: state.needsCrossTurnResume,
|
|
32
|
+
canStop: state.status === 'running' || state.status === 'paused' || state.status === 'done',
|
|
33
|
+
lastGoal: state.goal && state.goal.length > 100 ? state.goal.substring(0, 97) + '...' : state.goal?.substring(0, 100),
|
|
34
|
+
totalTokensUsed: state.totalTokensUsed,
|
|
35
|
+
tokenBudget: state.tokenBudget,
|
|
36
|
+
estimatedCostUsd,
|
|
37
|
+
lastToolError: state.lastToolError,
|
|
38
|
+
degraded: state.degraded,
|
|
39
|
+
// M2 projection fields
|
|
40
|
+
orchestrationState: state.orchestrationState,
|
|
41
|
+
workspacePath: state.workspace?.path,
|
|
42
|
+
workspaceBranch: state.workspace?.branchName,
|
|
43
|
+
retryCount: state.retry?.attempt ?? 0,
|
|
44
|
+
nextRetryAt: state.retry?.nextRetryAt,
|
|
45
|
+
blockedReason: state.blockedReason,
|
|
46
|
+
startedAt: state.startedAt,
|
|
47
|
+
lastActivityAt: state.lastActivityAt,
|
|
48
|
+
runtimeMs: state.startedAt != null ? now - state.startedAt : 0,
|
|
49
|
+
inputTokensUsed: state.inputTokensUsed ?? 0,
|
|
50
|
+
outputTokensUsed: state.outputTokensUsed ?? 0,
|
|
51
|
+
evidenceStatus: state.evidence?.status,
|
|
52
|
+
evidenceSummary: state.evidence?.diffSummary,
|
|
53
|
+
lastEvidenceCommands: state.evidence?.commands,
|
|
54
|
+
workflowSource: state.workflow?.source,
|
|
55
|
+
workflowConfigError: state.workflowConfigError,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=projection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projection.js","sourceRoot":"","sources":["../../src/projection.ts"],"names":[],"mappings":";;;AAmDA,oCA0CC;AAtDD;;;;GAIG;AACU,QAAA,8BAA8B,GAAG,GAAG,CAAC;AACrC,QAAA,+BAA+B,GAAG,IAAI,CAAC;AAEpD,6CAA6C;AAC7C,MAAM,gBAAgB,GAAG,sCAA8B,CAAC;AACxD,MAAM,iBAAiB,GAAG,uCAA+B,CAAC;AAE1D,SAAgB,YAAY,CAAC,KAAiC;IAC5D,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAC7B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,WAAW,GAAG,KAAK,CAAC,eAAe,IAAI,CAAC,CAAC;IAC/C,MAAM,YAAY,GAAG,KAAK,CAAC,gBAAgB,IAAI,CAAC,CAAC;IACjD,MAAM,gBAAgB,GACpB,CAAC,WAAW,GAAG,gBAAgB,GAAG,YAAY,GAAG,iBAAiB,CAAC,GAAG,SAAS,CAAC;IAClF,OAAO;QACL,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,YAAY,EAAE,KAAK,CAAC,YAAY;QAChC,kBAAkB,EAAE,KAAK,CAAC,kBAAkB;QAC5C,kBAAkB,EAAE,KAAK,CAAC,kBAAkB;QAC5C,qBAAqB,EAAE,KAAK,CAAC,qBAAqB;QAClD,sBAAsB,EAAE,KAAK,CAAC,sBAAsB;QACpD,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,oBAAoB,EAAE,KAAK,CAAC,oBAAoB;QAChD,OAAO,EAAE,KAAK,CAAC,MAAM,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM;QAC3F,QAAQ,EAAE,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC;QACrH,eAAe,EAAE,KAAK,CAAC,eAAe;QACtC,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,gBAAgB;QAChB,aAAa,EAAE,KAAK,CAAC,aAAa;QAClC,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,uBAAuB;QACvB,kBAAkB,EAAE,KAAK,CAAC,kBAAkB;QAC5C,aAAa,EAAE,KAAK,CAAC,SAAS,EAAE,IAAI;QACpC,eAAe,EAAE,KAAK,CAAC,SAAS,EAAE,UAAU;QAC5C,UAAU,EAAE,KAAK,CAAC,KAAK,EAAE,OAAO,IAAI,CAAC;QACrC,WAAW,EAAE,KAAK,CAAC,KAAK,EAAE,WAAW;QACrC,aAAa,EAAE,KAAK,CAAC,aAAa;QAClC,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,cAAc,EAAE,KAAK,CAAC,cAAc;QACpC,SAAS,EAAE,KAAK,CAAC,SAAS,IAAI,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QAC9D,eAAe,EAAE,KAAK,CAAC,eAAe,IAAI,CAAC;QAC3C,gBAAgB,EAAE,KAAK,CAAC,gBAAgB,IAAI,CAAC;QAC7C,cAAc,EAAE,KAAK,CAAC,QAAQ,EAAE,MAAM;QACtC,eAAe,EAAE,KAAK,CAAC,QAAQ,EAAE,WAAW;QAC5C,oBAAoB,EAAE,KAAK,CAAC,QAAQ,EAAE,QAAQ;QAC9C,cAAc,EAAE,KAAK,CAAC,QAAQ,EAAE,MAAM;QACtC,mBAAmB,EAAE,KAAK,CAAC,mBAAmB;KAC/C,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* M2.5 Retry Queue
|
|
3
|
+
*
|
|
4
|
+
* Exponential backoff calculator and recoverable error classifier.
|
|
5
|
+
* Pure functions — no side effects.
|
|
6
|
+
*/
|
|
7
|
+
import type { RetryEntry } from './types';
|
|
8
|
+
/** delay = min(10000 * 2^(attempt-1), maxRetryBackoffMs) */
|
|
9
|
+
export declare function computeRetryDelay(attempt: number, maxRetryBackoffMs: number): number;
|
|
10
|
+
export interface RetryClassification {
|
|
11
|
+
recoverable: boolean;
|
|
12
|
+
category: string;
|
|
13
|
+
}
|
|
14
|
+
/** Classify an error string into recoverable vs non-recoverable */
|
|
15
|
+
export declare function classifyRecoverability(error: string): RetryClassification;
|
|
16
|
+
export interface ShouldRetryInput {
|
|
17
|
+
attempt: number;
|
|
18
|
+
maxRetries: number;
|
|
19
|
+
recoverable: boolean;
|
|
20
|
+
}
|
|
21
|
+
/** Determine whether a retry should be attempted */
|
|
22
|
+
export declare function shouldRetry(input: ShouldRetryInput): boolean;
|
|
23
|
+
/** Build a RetryEntry for the next retry attempt */
|
|
24
|
+
export declare function buildRetryEntry(attempt: number, error: string, now: number, maxRetryBackoffMs: number): RetryEntry;
|
|
25
|
+
//# sourceMappingURL=retry-queue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry-queue.d.ts","sourceRoot":"","sources":["../../src/retry-queue.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAE1C,4DAA4D;AAC5D,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,GAAG,MAAM,CAIpF;AAED,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,OAAO,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,mEAAmE;AACnE,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,mBAAmB,CAkDzE;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,oDAAoD;AACpD,wBAAgB,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAI5D;AAED,oDAAoD;AACpD,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,EACX,iBAAiB,EAAE,MAAM,GACxB,UAAU,CAQZ"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.computeRetryDelay = computeRetryDelay;
|
|
4
|
+
exports.classifyRecoverability = classifyRecoverability;
|
|
5
|
+
exports.shouldRetry = shouldRetry;
|
|
6
|
+
exports.buildRetryEntry = buildRetryEntry;
|
|
7
|
+
/** delay = min(10000 * 2^(attempt-1), maxRetryBackoffMs) */
|
|
8
|
+
function computeRetryDelay(attempt, maxRetryBackoffMs) {
|
|
9
|
+
const base = 10000;
|
|
10
|
+
const delay = base * Math.pow(2, attempt - 1);
|
|
11
|
+
return Math.min(delay, maxRetryBackoffMs);
|
|
12
|
+
}
|
|
13
|
+
/** Classify an error string into recoverable vs non-recoverable */
|
|
14
|
+
function classifyRecoverability(error) {
|
|
15
|
+
const lower = error.toLowerCase();
|
|
16
|
+
// Recoverable errors
|
|
17
|
+
if (lower.includes('transient') || lower.includes('tool fail')) {
|
|
18
|
+
return { recoverable: true, category: 'transient_error' };
|
|
19
|
+
}
|
|
20
|
+
if (lower.includes('timeout')) {
|
|
21
|
+
return { recoverable: true, category: 'timeout' };
|
|
22
|
+
}
|
|
23
|
+
if (lower === 'stalled' || lower.includes('stall')) {
|
|
24
|
+
return { recoverable: true, category: 'stall' };
|
|
25
|
+
}
|
|
26
|
+
// Non-recoverable: permission must be checked BEFORE validation/injection
|
|
27
|
+
// so that mixed messages like "permission validation_failed" or
|
|
28
|
+
// "permission injection rejected" are always non-recoverable.
|
|
29
|
+
if (lower.includes('permission')) {
|
|
30
|
+
return { recoverable: false, category: 'permission' };
|
|
31
|
+
}
|
|
32
|
+
if (lower.includes('validation_failed') || lower.includes('validation')) {
|
|
33
|
+
return { recoverable: true, category: 'validation' };
|
|
34
|
+
}
|
|
35
|
+
if (lower.includes('injection') || lower.includes('rejected')) {
|
|
36
|
+
return { recoverable: true, category: 'injection_rejected' };
|
|
37
|
+
}
|
|
38
|
+
// Non-recoverable errors
|
|
39
|
+
if (lower.includes('containment') || lower.includes('workspace_create')) {
|
|
40
|
+
return { recoverable: false, category: 'workspace' };
|
|
41
|
+
}
|
|
42
|
+
// config_invalid or any error starting with 'config' — but NOT 'reconfiguration...'
|
|
43
|
+
// which is a transient state change, not a config error.
|
|
44
|
+
if (lower.startsWith('config')) {
|
|
45
|
+
return { recoverable: false, category: 'config' };
|
|
46
|
+
}
|
|
47
|
+
if (lower.includes('budget') || lower.includes('token')) {
|
|
48
|
+
return { recoverable: false, category: 'budget' };
|
|
49
|
+
}
|
|
50
|
+
if (lower.includes('user_stopped') || lower === 'user stopped') {
|
|
51
|
+
return { recoverable: false, category: 'user_action' };
|
|
52
|
+
}
|
|
53
|
+
if (lower.includes('max_retries')) {
|
|
54
|
+
return { recoverable: false, category: 'max_retries' };
|
|
55
|
+
}
|
|
56
|
+
// Unknown errors — treat as non-recoverable for safety
|
|
57
|
+
return { recoverable: false, category: 'unknown' };
|
|
58
|
+
}
|
|
59
|
+
/** Determine whether a retry should be attempted */
|
|
60
|
+
function shouldRetry(input) {
|
|
61
|
+
if (!input.recoverable)
|
|
62
|
+
return false;
|
|
63
|
+
if (input.maxRetries <= 0)
|
|
64
|
+
return false;
|
|
65
|
+
return input.attempt <= input.maxRetries;
|
|
66
|
+
}
|
|
67
|
+
/** Build a RetryEntry for the next retry attempt */
|
|
68
|
+
function buildRetryEntry(attempt, error, now, maxRetryBackoffMs) {
|
|
69
|
+
const classification = classifyRecoverability(error);
|
|
70
|
+
return {
|
|
71
|
+
attempt,
|
|
72
|
+
nextRetryAt: now + computeRetryDelay(attempt, maxRetryBackoffMs),
|
|
73
|
+
lastError: error,
|
|
74
|
+
recoverable: classification.recoverable,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=retry-queue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry-queue.js","sourceRoot":"","sources":["../../src/retry-queue.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* M2.5 Stall Detector
|
|
3
|
+
*
|
|
4
|
+
* Detects when an autopilot run has been inactive for too long.
|
|
5
|
+
* Only checks stall while orchestrationState is 'running'.
|
|
6
|
+
*/
|
|
7
|
+
export interface StallCheckInput {
|
|
8
|
+
orchestrationState: string;
|
|
9
|
+
lastActivityAt?: number;
|
|
10
|
+
now: number;
|
|
11
|
+
stallTimeoutMs: number;
|
|
12
|
+
}
|
|
13
|
+
export interface StallResult {
|
|
14
|
+
stalled: boolean;
|
|
15
|
+
stallDurationMs?: number;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Check if the run has stalled based on last activity time.
|
|
19
|
+
* Only considers stall when orchestrationState is 'running'.
|
|
20
|
+
*/
|
|
21
|
+
export declare function checkStall(input: StallCheckInput): StallResult;
|
|
22
|
+
//# sourceMappingURL=stall-detector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stall-detector.d.ts","sourceRoot":"","sources":["../../src/stall-detector.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,WAAW,eAAe;IAC9B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,WAAW,CAsB9D"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.checkStall = checkStall;
|
|
4
|
+
/**
|
|
5
|
+
* Check if the run has stalled based on last activity time.
|
|
6
|
+
* Only considers stall when orchestrationState is 'running'.
|
|
7
|
+
*/
|
|
8
|
+
function checkStall(input) {
|
|
9
|
+
const { orchestrationState, lastActivityAt, now, stallTimeoutMs } = input;
|
|
10
|
+
// Only check stall while actively running
|
|
11
|
+
if (orchestrationState !== 'running') {
|
|
12
|
+
return { stalled: false };
|
|
13
|
+
}
|
|
14
|
+
if (lastActivityAt == null) {
|
|
15
|
+
return { stalled: false };
|
|
16
|
+
}
|
|
17
|
+
const elapsed = now - lastActivityAt;
|
|
18
|
+
if (elapsed > stallTimeoutMs) {
|
|
19
|
+
return {
|
|
20
|
+
stalled: true,
|
|
21
|
+
stallDurationMs: elapsed - stallTimeoutMs,
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
return { stalled: false };
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=stall-detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stall-detector.js","sourceRoot":"","sources":["../../src/stall-detector.ts"],"names":[],"mappings":";;AAsBA,gCAsBC;AA1BD;;;GAGG;AACH,SAAgB,UAAU,CAAC,KAAsB;IAC/C,MAAM,EAAE,kBAAkB,EAAE,cAAc,EAAE,GAAG,EAAE,cAAc,EAAE,GAAG,KAAK,CAAC;IAE1E,0CAA0C;IAC1C,IAAI,kBAAkB,KAAK,SAAS,EAAE,CAAC;QACrC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAC5B,CAAC;IAED,IAAI,cAAc,IAAI,IAAI,EAAE,CAAC;QAC3B,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAC5B,CAAC;IAED,MAAM,OAAO,GAAG,GAAG,GAAG,cAAc,CAAC;IAErC,IAAI,OAAO,GAAG,cAAc,EAAE,CAAC;QAC7B,OAAO;YACL,OAAO,EAAE,IAAI;YACb,eAAe,EAAE,OAAO,GAAG,cAAc;SAC1C,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;AAC5B,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { AutopilotState, ToolErrorEntry } from './types';
|
|
2
|
+
export declare function trackToolError(state: AutopilotState, error: ToolErrorEntry): AutopilotState;
|
|
3
|
+
export declare function isThresholdExceeded(state: AutopilotState, threshold: number): boolean;
|
|
4
|
+
//# sourceMappingURL=tool-error-tracker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-error-tracker.d.ts","sourceRoot":"","sources":["../../src/tool-error-tracker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAE9D,wBAAgB,cAAc,CAC5B,KAAK,EAAE,cAAc,EACrB,KAAK,EAAE,cAAc,GACpB,cAAc,CAWhB;AAED,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,cAAc,EACrB,SAAS,EAAE,MAAM,GAChB,OAAO,CAET"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.trackToolError = trackToolError;
|
|
4
|
+
exports.isThresholdExceeded = isThresholdExceeded;
|
|
5
|
+
function trackToolError(state, error) {
|
|
6
|
+
const isSameError = state.lastToolError &&
|
|
7
|
+
state.lastToolError.tool === error.tool &&
|
|
8
|
+
state.lastToolError.args === error.args;
|
|
9
|
+
return {
|
|
10
|
+
...state,
|
|
11
|
+
lastToolError: error,
|
|
12
|
+
toolErrorCount: isSameError ? state.toolErrorCount + 1 : 1,
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
function isThresholdExceeded(state, threshold) {
|
|
16
|
+
return state.toolErrorCount >= threshold;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=tool-error-tracker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-error-tracker.js","sourceRoot":"","sources":["../../src/tool-error-tracker.ts"],"names":[],"mappings":";;AAEA,wCAcC;AAED,kDAKC;AArBD,SAAgB,cAAc,CAC5B,KAAqB,EACrB,KAAqB;IAErB,MAAM,WAAW,GACf,KAAK,CAAC,aAAa;QACnB,KAAK,CAAC,aAAa,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI;QACvC,KAAK,CAAC,aAAa,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC;IAE1C,OAAO;QACL,GAAG,KAAK;QACR,aAAa,EAAE,KAAK;QACpB,cAAc,EAAE,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;KAC3D,CAAC;AACJ,CAAC;AAED,SAAgB,mBAAmB,CACjC,KAAqB,EACrB,SAAiB;IAEjB,OAAO,KAAK,CAAC,cAAc,IAAI,SAAS,CAAC;AAC3C,CAAC"}
|