oh-my-claude-sisyphus 3.3.10 → 3.4.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 +3 -3
- package/agents/explore-high.md +195 -0
- package/agents/qa-tester-high.md +141 -0
- package/agents/templates/README.md +110 -0
- package/agents/templates/base-agent.md +54 -0
- package/agents/templates/tier-instructions.md +94 -0
- package/commands/ecomode.md +60 -0
- package/commands/help.md +1 -1
- package/commands/mcp-setup.md +7 -6
- package/commands/ralplan.md +8 -1
- package/commands/ultrapilot.md +158 -0
- package/commands/ultrawork.md +1 -0
- package/dist/__tests__/delegation-enforcer-integration.test.d.ts +6 -0
- package/dist/__tests__/delegation-enforcer-integration.test.d.ts.map +1 -0
- package/dist/__tests__/delegation-enforcer-integration.test.js +136 -0
- package/dist/__tests__/delegation-enforcer-integration.test.js.map +1 -0
- package/dist/__tests__/delegation-enforcer.test.d.ts +5 -0
- package/dist/__tests__/delegation-enforcer.test.d.ts.map +1 -0
- package/dist/__tests__/delegation-enforcer.test.js +208 -0
- package/dist/__tests__/delegation-enforcer.test.js.map +1 -0
- package/dist/__tests__/hooks.test.js +2 -2
- package/dist/__tests__/hooks.test.js.map +1 -1
- package/dist/__tests__/installer.test.js +4 -6
- package/dist/__tests__/installer.test.js.map +1 -1
- package/dist/__tests__/ralph-prd.test.js +1 -1
- package/dist/__tests__/ralph-prd.test.js.map +1 -1
- package/dist/__tests__/ralph-progress.test.js +1 -1
- package/dist/__tests__/ralph-progress.test.js.map +1 -1
- package/dist/__tests__/skills.test.js +31 -24
- package/dist/__tests__/skills.test.js.map +1 -1
- package/dist/agents/analyst.d.ts.map +1 -1
- package/dist/agents/analyst.js +1 -0
- package/dist/agents/analyst.js.map +1 -1
- package/dist/agents/architect.d.ts.map +1 -1
- package/dist/agents/architect.js +1 -0
- package/dist/agents/architect.js.map +1 -1
- package/dist/agents/critic.d.ts.map +1 -1
- package/dist/agents/critic.js +1 -0
- package/dist/agents/critic.js.map +1 -1
- package/dist/agents/definitions.d.ts +5 -1
- package/dist/agents/definitions.d.ts.map +1 -1
- package/dist/agents/definitions.js +53 -155
- package/dist/agents/definitions.js.map +1 -1
- package/dist/agents/designer.d.ts.map +1 -1
- package/dist/agents/designer.js +1 -0
- package/dist/agents/designer.js.map +1 -1
- package/dist/agents/executor.d.ts.map +1 -1
- package/dist/agents/executor.js +1 -0
- package/dist/agents/executor.js.map +1 -1
- package/dist/agents/explore.d.ts.map +1 -1
- package/dist/agents/explore.js +1 -0
- package/dist/agents/explore.js.map +1 -1
- package/dist/agents/planner.d.ts.map +1 -1
- package/dist/agents/planner.js +1 -0
- package/dist/agents/planner.js.map +1 -1
- package/dist/agents/qa-tester.d.ts.map +1 -1
- package/dist/agents/qa-tester.js +1 -0
- package/dist/agents/qa-tester.js.map +1 -1
- package/dist/agents/researcher.d.ts.map +1 -1
- package/dist/agents/researcher.js +1 -0
- package/dist/agents/researcher.js.map +1 -1
- package/dist/agents/scientist.d.ts.map +1 -1
- package/dist/agents/scientist.js +1 -0
- package/dist/agents/scientist.js.map +1 -1
- package/dist/agents/types.d.ts +2 -0
- package/dist/agents/types.d.ts.map +1 -1
- package/dist/agents/types.js.map +1 -1
- package/dist/agents/vision.d.ts.map +1 -1
- package/dist/agents/vision.js +1 -0
- package/dist/agents/vision.js.map +1 -1
- package/dist/agents/writer.d.ts.map +1 -1
- package/dist/agents/writer.js +1 -0
- package/dist/agents/writer.js.map +1 -1
- package/dist/cli/index.js +0 -3
- package/dist/cli/index.js.map +1 -1
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/loader.js +1 -6
- package/dist/config/loader.js.map +1 -1
- package/dist/features/delegation-enforcer.d.ts +71 -0
- package/dist/features/delegation-enforcer.d.ts.map +1 -0
- package/dist/features/delegation-enforcer.js +128 -0
- package/dist/features/delegation-enforcer.js.map +1 -0
- package/dist/features/index.d.ts +3 -0
- package/dist/features/index.d.ts.map +1 -1
- package/dist/features/index.js +18 -0
- package/dist/features/index.js.map +1 -1
- package/dist/features/state-manager/index.d.ts +100 -0
- package/dist/features/state-manager/index.d.ts.map +1 -0
- package/dist/features/state-manager/index.js +407 -0
- package/dist/features/state-manager/index.js.map +1 -0
- package/dist/features/state-manager/types.d.ts +147 -0
- package/dist/features/state-manager/types.d.ts.map +1 -0
- package/dist/features/state-manager/types.js +30 -0
- package/dist/features/state-manager/types.js.map +1 -0
- package/dist/features/task-decomposer/index.d.ts +33 -0
- package/dist/features/task-decomposer/index.d.ts.map +1 -0
- package/dist/features/task-decomposer/index.js +698 -0
- package/dist/features/task-decomposer/index.js.map +1 -0
- package/dist/features/task-decomposer/types.d.ts +133 -0
- package/dist/features/task-decomposer/types.d.ts.map +1 -0
- package/dist/features/task-decomposer/types.js +8 -0
- package/dist/features/task-decomposer/types.js.map +1 -0
- package/dist/features/verification/example.d.ts +49 -0
- package/dist/features/verification/example.d.ts.map +1 -0
- package/dist/features/verification/example.js +235 -0
- package/dist/features/verification/example.js.map +1 -0
- package/dist/features/verification/index.d.ts +97 -0
- package/dist/features/verification/index.d.ts.map +1 -0
- package/dist/features/verification/index.js +439 -0
- package/dist/features/verification/index.js.map +1 -0
- package/dist/features/verification/types.d.ts +142 -0
- package/dist/features/verification/types.d.ts.map +1 -0
- package/dist/features/verification/types.js +7 -0
- package/dist/features/verification/types.js.map +1 -0
- package/dist/hooks/agent-usage-reminder/constants.d.ts.map +1 -1
- package/dist/hooks/agent-usage-reminder/constants.js +0 -1
- package/dist/hooks/agent-usage-reminder/constants.js.map +1 -1
- package/dist/hooks/autopilot/__tests__/cancel.test.js +4 -4
- package/dist/hooks/autopilot/__tests__/cancel.test.js.map +1 -1
- package/dist/hooks/autopilot/__tests__/summary.test.js +1 -1
- package/dist/hooks/autopilot/__tests__/summary.test.js.map +1 -1
- package/dist/hooks/autopilot/__tests__/transition.test.js +1 -2
- package/dist/hooks/autopilot/__tests__/transition.test.js.map +1 -1
- package/dist/hooks/autopilot/cancel.js +2 -2
- package/dist/hooks/autopilot/cancel.js.map +1 -1
- package/dist/hooks/autopilot/enforcement.d.ts +16 -2
- package/dist/hooks/autopilot/enforcement.d.ts.map +1 -1
- package/dist/hooks/autopilot/enforcement.js +78 -4
- package/dist/hooks/autopilot/enforcement.js.map +1 -1
- package/dist/hooks/autopilot/index.d.ts +3 -6
- package/dist/hooks/autopilot/index.d.ts.map +1 -1
- package/dist/hooks/autopilot/index.js +6 -12
- package/dist/hooks/autopilot/index.js.map +1 -1
- package/dist/hooks/autopilot/state.d.ts +36 -2
- package/dist/hooks/autopilot/state.d.ts.map +1 -1
- package/dist/hooks/autopilot/state.js +216 -2
- package/dist/hooks/autopilot/state.js.map +1 -1
- package/dist/hooks/autopilot/validation.d.ts +23 -2
- package/dist/hooks/autopilot/validation.d.ts.map +1 -1
- package/dist/hooks/autopilot/validation.js +158 -1
- package/dist/hooks/autopilot/validation.js.map +1 -1
- package/dist/hooks/bridge.js +3 -3
- package/dist/hooks/bridge.js.map +1 -1
- package/dist/hooks/index.d.ts +5 -9
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +31 -21
- package/dist/hooks/index.js.map +1 -1
- package/dist/hooks/learner/promotion.js +1 -1
- package/dist/hooks/learner/promotion.js.map +1 -1
- package/dist/hooks/persistent-mode/index.d.ts.map +1 -1
- package/dist/hooks/persistent-mode/index.js +2 -3
- package/dist/hooks/persistent-mode/index.js.map +1 -1
- package/dist/hooks/ralph/index.d.ts +11 -0
- package/dist/hooks/ralph/index.d.ts.map +1 -0
- package/dist/hooks/ralph/index.js +53 -0
- package/dist/hooks/ralph/index.js.map +1 -0
- package/dist/hooks/ralph/loop.d.ts +116 -0
- package/dist/hooks/ralph/loop.d.ts.map +1 -0
- package/dist/hooks/ralph/loop.js +322 -0
- package/dist/hooks/ralph/loop.js.map +1 -0
- package/dist/hooks/ralph/prd.d.ts +130 -0
- package/dist/hooks/ralph/prd.d.ts.map +1 -0
- package/dist/hooks/ralph/prd.js +310 -0
- package/dist/hooks/ralph/prd.js.map +1 -0
- package/dist/hooks/ralph/progress.d.ts +102 -0
- package/dist/hooks/ralph/progress.d.ts.map +1 -0
- package/dist/hooks/ralph/progress.js +408 -0
- package/dist/hooks/ralph/progress.js.map +1 -0
- package/dist/hooks/ralph/verifier.d.ts +72 -0
- package/dist/hooks/ralph/verifier.d.ts.map +1 -0
- package/dist/hooks/ralph/verifier.js +223 -0
- package/dist/hooks/ralph/verifier.js.map +1 -0
- package/dist/hooks/recovery/constants.d.ts +114 -0
- package/dist/hooks/recovery/constants.d.ts.map +1 -0
- package/dist/hooks/recovery/constants.js +227 -0
- package/dist/hooks/recovery/constants.js.map +1 -0
- package/dist/hooks/recovery/context-window.d.ts +24 -0
- package/dist/hooks/recovery/context-window.d.ts.map +1 -0
- package/dist/hooks/recovery/context-window.js +321 -0
- package/dist/hooks/recovery/context-window.js.map +1 -0
- package/dist/hooks/recovery/edit-error.d.ts +24 -0
- package/dist/hooks/recovery/edit-error.d.ts.map +1 -0
- package/dist/hooks/recovery/edit-error.js +56 -0
- package/dist/hooks/recovery/edit-error.js.map +1 -0
- package/dist/hooks/recovery/index.d.ts +102 -0
- package/dist/hooks/recovery/index.d.ts.map +1 -0
- package/dist/hooks/recovery/index.js +166 -0
- package/dist/hooks/recovery/index.js.map +1 -0
- package/dist/hooks/recovery/session-recovery.d.ts +24 -0
- package/dist/hooks/recovery/session-recovery.d.ts.map +1 -0
- package/dist/hooks/recovery/session-recovery.js +281 -0
- package/dist/hooks/recovery/session-recovery.js.map +1 -0
- package/dist/hooks/recovery/storage.d.ts +75 -0
- package/dist/hooks/recovery/storage.d.ts.map +1 -0
- package/dist/hooks/recovery/storage.js +382 -0
- package/dist/hooks/recovery/storage.js.map +1 -0
- package/dist/hooks/recovery/types.d.ts +196 -0
- package/dist/hooks/recovery/types.d.ts.map +1 -0
- package/dist/hooks/recovery/types.js +32 -0
- package/dist/hooks/recovery/types.js.map +1 -0
- package/dist/hooks/ultrapilot/index.d.ts +90 -0
- package/dist/hooks/ultrapilot/index.d.ts.map +1 -0
- package/dist/hooks/ultrapilot/index.js +310 -0
- package/dist/hooks/ultrapilot/index.js.map +1 -0
- package/dist/hooks/ultrapilot/state.d.ts +72 -0
- package/dist/hooks/ultrapilot/state.d.ts.map +1 -0
- package/dist/hooks/ultrapilot/state.js +258 -0
- package/dist/hooks/ultrapilot/state.js.map +1 -0
- package/dist/hooks/ultrapilot/types.d.ts +113 -0
- package/dist/hooks/ultrapilot/types.d.ts.map +1 -0
- package/dist/hooks/ultrapilot/types.js +36 -0
- package/dist/hooks/ultrapilot/types.js.map +1 -0
- package/dist/hooks/ultraqa/index.d.ts +94 -0
- package/dist/hooks/ultraqa/index.d.ts.map +1 -0
- package/dist/hooks/ultraqa/index.js +216 -0
- package/dist/hooks/ultraqa/index.js.map +1 -0
- package/dist/hooks/ultrawork/index.d.ts +62 -0
- package/dist/hooks/ultrawork/index.d.ts.map +1 -0
- package/dist/hooks/ultrawork/index.js +208 -0
- package/dist/hooks/ultrawork/index.js.map +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -2
- package/dist/index.js.map +1 -1
- package/dist/installer/index.d.ts +1 -1
- package/dist/installer/index.d.ts.map +1 -1
- package/dist/installer/index.js +1 -1
- package/dist/installer/index.js.map +1 -1
- package/dist/mcp/index.d.ts +1 -1
- package/dist/mcp/index.d.ts.map +1 -1
- package/dist/mcp/index.js +1 -1
- package/dist/mcp/index.js.map +1 -1
- package/dist/mcp/servers.d.ts +2 -18
- package/dist/mcp/servers.d.ts.map +1 -1
- package/dist/mcp/servers.js +4 -36
- package/dist/mcp/servers.js.map +1 -1
- package/dist/shared/types.d.ts +1 -3
- package/dist/shared/types.d.ts.map +1 -1
- package/docs/CLAUDE.md +170 -44
- package/docs/DELEGATION-ENFORCER.md +282 -0
- package/docs/FULL-README.md +1 -1
- package/docs/LOCAL_PLUGIN_INSTALL.md +1 -1
- package/docs/MIGRATION.md +298 -104
- package/package.json +2 -2
- package/scripts/test-mutual-exclusion.ts +1 -1
- package/skills/analyze/SKILL.md +0 -1
- package/skills/autopilot/SKILL.md +0 -1
- package/skills/cancel/SKILL.md +580 -0
- package/skills/cancel-autopilot/SKILL.md +0 -1
- package/skills/cancel-ecomode/SKILL.md +41 -0
- package/skills/cancel-ralph/SKILL.md +0 -1
- package/skills/cancel-ultraqa/SKILL.md +0 -1
- package/skills/cancel-ultrawork/SKILL.md +0 -1
- package/skills/deepinit/SKILL.md +0 -1
- package/skills/deepsearch/SKILL.md +0 -1
- package/skills/doctor/SKILL.md +0 -1
- package/skills/ecomode/SKILL.md +128 -0
- package/skills/frontend-ui-ux/SKILL.md +0 -1
- package/skills/git-master/SKILL.md +0 -1
- package/skills/help/SKILL.md +1 -2
- package/skills/hud/SKILL.md +0 -1
- package/skills/learner/SKILL.md +0 -1
- package/skills/mcp-setup/SKILL.md +8 -7
- package/skills/note/SKILL.md +0 -1
- package/skills/omc-default/SKILL.md +0 -1
- package/skills/omc-default-global/SKILL.md +0 -1
- package/skills/omc-setup/SKILL.md +176 -10
- package/skills/orchestrate/SKILL.md +0 -1
- package/skills/pipeline/SKILL.md +417 -0
- package/skills/plan/SKILL.md +138 -21
- package/skills/planner/SKILL.md +0 -1
- package/skills/ralph/SKILL.md +65 -1
- package/skills/ralph-init/SKILL.md +0 -1
- package/skills/ralplan/SKILL.md +0 -1
- package/skills/release/SKILL.md +0 -1
- package/skills/research/SKILL.md +0 -1
- package/skills/review/SKILL.md +0 -1
- package/skills/swarm/SKILL.md +349 -0
- package/skills/tdd/SKILL.md +0 -1
- package/skills/ultrapilot/SKILL.md +563 -0
- package/skills/ultraqa/SKILL.md +0 -1
- package/skills/ultrawork/SKILL.md +0 -1
- package/docs/MIGRATION-v3.md +0 -186
|
@@ -0,0 +1,321 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Context Window Limit Recovery
|
|
3
|
+
*
|
|
4
|
+
* Detects context window limit errors and injects recovery messages
|
|
5
|
+
* to help Claude recover gracefully.
|
|
6
|
+
*/
|
|
7
|
+
import * as fs from 'fs';
|
|
8
|
+
import { TOKEN_LIMIT_PATTERNS, TOKEN_LIMIT_KEYWORDS, CONTEXT_LIMIT_RECOVERY_MESSAGE, CONTEXT_LIMIT_SHORT_MESSAGE, NON_EMPTY_CONTENT_RECOVERY_MESSAGE, RECOVERY_FAILED_MESSAGE, DEBUG, DEBUG_FILE, } from './constants.js';
|
|
9
|
+
import { RETRY_CONFIG } from './types.js';
|
|
10
|
+
function debugLog(...args) {
|
|
11
|
+
if (DEBUG) {
|
|
12
|
+
const msg = `[${new Date().toISOString()}] [context-window-recovery] ${args
|
|
13
|
+
.map((a) => typeof a === 'object' ? JSON.stringify(a, null, 2) : String(a))
|
|
14
|
+
.join(' ')}\n`;
|
|
15
|
+
fs.appendFileSync(DEBUG_FILE, msg);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
const sessionStates = new Map();
|
|
19
|
+
const STATE_TTL = 300_000; // 5 minutes
|
|
20
|
+
/**
|
|
21
|
+
* Patterns indicating thinking block structure errors (NOT token limit)
|
|
22
|
+
*/
|
|
23
|
+
const THINKING_BLOCK_ERROR_PATTERNS = [
|
|
24
|
+
/thinking.*first block/i,
|
|
25
|
+
/first block.*thinking/i,
|
|
26
|
+
/must.*start.*thinking/i,
|
|
27
|
+
/thinking.*redacted_thinking/i,
|
|
28
|
+
/expected.*thinking.*found/i,
|
|
29
|
+
/thinking.*disabled.*cannot.*contain/i,
|
|
30
|
+
];
|
|
31
|
+
/**
|
|
32
|
+
* Check if error is a thinking block structure error
|
|
33
|
+
*/
|
|
34
|
+
function isThinkingBlockError(text) {
|
|
35
|
+
return THINKING_BLOCK_ERROR_PATTERNS.some((pattern) => pattern.test(text));
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Check if text indicates a token limit error
|
|
39
|
+
*/
|
|
40
|
+
function isTokenLimitError(text) {
|
|
41
|
+
if (isThinkingBlockError(text)) {
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
const lower = text.toLowerCase();
|
|
45
|
+
return TOKEN_LIMIT_KEYWORDS.some((kw) => lower.includes(kw.toLowerCase()));
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Extract token counts from error message
|
|
49
|
+
*/
|
|
50
|
+
function extractTokensFromMessage(message) {
|
|
51
|
+
for (const pattern of TOKEN_LIMIT_PATTERNS) {
|
|
52
|
+
const match = message.match(pattern);
|
|
53
|
+
if (match) {
|
|
54
|
+
const num1 = parseInt(match[1], 10);
|
|
55
|
+
const num2 = parseInt(match[2], 10);
|
|
56
|
+
return num1 > num2
|
|
57
|
+
? { current: num1, max: num2 }
|
|
58
|
+
: { current: num2, max: num1 };
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Extract message index from error text
|
|
65
|
+
*/
|
|
66
|
+
function extractMessageIndex(text) {
|
|
67
|
+
const match = text.match(/messages\.(\d+)/);
|
|
68
|
+
if (match) {
|
|
69
|
+
return parseInt(match[1], 10);
|
|
70
|
+
}
|
|
71
|
+
return undefined;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Parse an error to detect if it's a token limit error
|
|
75
|
+
*/
|
|
76
|
+
export function parseTokenLimitError(err) {
|
|
77
|
+
// Handle string errors
|
|
78
|
+
if (typeof err === 'string') {
|
|
79
|
+
if (err.toLowerCase().includes('non-empty content')) {
|
|
80
|
+
return {
|
|
81
|
+
currentTokens: 0,
|
|
82
|
+
maxTokens: 0,
|
|
83
|
+
errorType: 'non-empty content',
|
|
84
|
+
messageIndex: extractMessageIndex(err),
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
if (isTokenLimitError(err)) {
|
|
88
|
+
const tokens = extractTokensFromMessage(err);
|
|
89
|
+
return {
|
|
90
|
+
currentTokens: tokens?.current ?? 0,
|
|
91
|
+
maxTokens: tokens?.max ?? 0,
|
|
92
|
+
errorType: 'token_limit_exceeded_string',
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
return null;
|
|
96
|
+
}
|
|
97
|
+
// Handle non-object errors
|
|
98
|
+
if (!err || typeof err !== 'object')
|
|
99
|
+
return null;
|
|
100
|
+
const errObj = err;
|
|
101
|
+
// Collect all text sources from the error object
|
|
102
|
+
const textSources = [];
|
|
103
|
+
const dataObj = errObj.data;
|
|
104
|
+
const responseBody = dataObj?.responseBody;
|
|
105
|
+
const errorMessage = errObj.message;
|
|
106
|
+
const errorData = errObj.error;
|
|
107
|
+
const nestedError = errorData?.error;
|
|
108
|
+
if (typeof responseBody === 'string')
|
|
109
|
+
textSources.push(responseBody);
|
|
110
|
+
if (typeof errorMessage === 'string')
|
|
111
|
+
textSources.push(errorMessage);
|
|
112
|
+
if (typeof errorData?.message === 'string')
|
|
113
|
+
textSources.push(errorData.message);
|
|
114
|
+
if (typeof errObj.body === 'string')
|
|
115
|
+
textSources.push(errObj.body);
|
|
116
|
+
if (typeof errObj.details === 'string')
|
|
117
|
+
textSources.push(errObj.details);
|
|
118
|
+
if (typeof errObj.reason === 'string')
|
|
119
|
+
textSources.push(errObj.reason);
|
|
120
|
+
if (typeof errObj.description === 'string')
|
|
121
|
+
textSources.push(errObj.description);
|
|
122
|
+
if (typeof nestedError?.message === 'string')
|
|
123
|
+
textSources.push(nestedError.message);
|
|
124
|
+
if (typeof dataObj?.message === 'string')
|
|
125
|
+
textSources.push(dataObj.message);
|
|
126
|
+
if (typeof dataObj?.error === 'string')
|
|
127
|
+
textSources.push(dataObj.error);
|
|
128
|
+
// Try JSON stringification if no text sources found
|
|
129
|
+
if (textSources.length === 0) {
|
|
130
|
+
try {
|
|
131
|
+
const jsonStr = JSON.stringify(errObj);
|
|
132
|
+
if (isTokenLimitError(jsonStr)) {
|
|
133
|
+
textSources.push(jsonStr);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
catch {
|
|
137
|
+
// Ignore JSON errors
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
const combinedText = textSources.join(' ');
|
|
141
|
+
if (!isTokenLimitError(combinedText))
|
|
142
|
+
return null;
|
|
143
|
+
// Try to parse structured response body
|
|
144
|
+
if (typeof responseBody === 'string') {
|
|
145
|
+
try {
|
|
146
|
+
const jsonPatterns = [
|
|
147
|
+
/data:\s*(\{[\s\S]*\})\s*$/m,
|
|
148
|
+
/(\{"type"\s*:\s*"error"[\s\S]*\})/,
|
|
149
|
+
/(\{[\s\S]*"error"[\s\S]*\})/,
|
|
150
|
+
];
|
|
151
|
+
for (const pattern of jsonPatterns) {
|
|
152
|
+
const dataMatch = responseBody.match(pattern);
|
|
153
|
+
if (dataMatch) {
|
|
154
|
+
try {
|
|
155
|
+
const jsonData = JSON.parse(dataMatch[1]);
|
|
156
|
+
const message = jsonData.error?.message || '';
|
|
157
|
+
const tokens = extractTokensFromMessage(message);
|
|
158
|
+
if (tokens) {
|
|
159
|
+
return {
|
|
160
|
+
currentTokens: tokens.current,
|
|
161
|
+
maxTokens: tokens.max,
|
|
162
|
+
requestId: jsonData.request_id,
|
|
163
|
+
errorType: jsonData.error?.type || 'token_limit_exceeded',
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
catch {
|
|
168
|
+
// Ignore parse errors
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
// Check for Bedrock-style errors
|
|
173
|
+
const bedrockJson = JSON.parse(responseBody);
|
|
174
|
+
if (typeof bedrockJson.message === 'string' &&
|
|
175
|
+
isTokenLimitError(bedrockJson.message)) {
|
|
176
|
+
return {
|
|
177
|
+
currentTokens: 0,
|
|
178
|
+
maxTokens: 0,
|
|
179
|
+
errorType: 'bedrock_input_too_long',
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
catch {
|
|
184
|
+
// Ignore parse errors
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
// Extract tokens from any text source
|
|
188
|
+
for (const text of textSources) {
|
|
189
|
+
const tokens = extractTokensFromMessage(text);
|
|
190
|
+
if (tokens) {
|
|
191
|
+
return {
|
|
192
|
+
currentTokens: tokens.current,
|
|
193
|
+
maxTokens: tokens.max,
|
|
194
|
+
errorType: 'token_limit_exceeded',
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
// Check for non-empty content error
|
|
199
|
+
if (combinedText.toLowerCase().includes('non-empty content')) {
|
|
200
|
+
return {
|
|
201
|
+
currentTokens: 0,
|
|
202
|
+
maxTokens: 0,
|
|
203
|
+
errorType: 'non-empty content',
|
|
204
|
+
messageIndex: extractMessageIndex(combinedText),
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
// Generic token limit error
|
|
208
|
+
if (isTokenLimitError(combinedText)) {
|
|
209
|
+
return {
|
|
210
|
+
currentTokens: 0,
|
|
211
|
+
maxTokens: 0,
|
|
212
|
+
errorType: 'token_limit_exceeded_unknown',
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
return null;
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Check if text contains a context limit error
|
|
219
|
+
*/
|
|
220
|
+
export function containsTokenLimitError(text) {
|
|
221
|
+
return isTokenLimitError(text);
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Get or create session state
|
|
225
|
+
*/
|
|
226
|
+
function getSessionState(sessionId) {
|
|
227
|
+
let state = sessionStates.get(sessionId);
|
|
228
|
+
const now = Date.now();
|
|
229
|
+
// Reset stale state
|
|
230
|
+
if (state && now - state.lastErrorTime > STATE_TTL) {
|
|
231
|
+
state = undefined;
|
|
232
|
+
}
|
|
233
|
+
if (!state) {
|
|
234
|
+
state = {
|
|
235
|
+
retryState: { attempt: 0, lastAttemptTime: 0 },
|
|
236
|
+
truncateState: { truncateAttempt: 0 },
|
|
237
|
+
lastErrorTime: now,
|
|
238
|
+
errorCount: 0,
|
|
239
|
+
};
|
|
240
|
+
sessionStates.set(sessionId, state);
|
|
241
|
+
}
|
|
242
|
+
return state;
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Generate appropriate recovery message based on error and state
|
|
246
|
+
*/
|
|
247
|
+
function generateRecoveryMessage(parsed, state, config) {
|
|
248
|
+
// Use custom message if provided
|
|
249
|
+
if (config?.customMessages?.context_window_limit) {
|
|
250
|
+
return {
|
|
251
|
+
message: config.customMessages.context_window_limit,
|
|
252
|
+
errorType: parsed?.errorType,
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
// Handle non-empty content error
|
|
256
|
+
if (parsed?.errorType?.includes('non-empty content')) {
|
|
257
|
+
return {
|
|
258
|
+
message: NON_EMPTY_CONTENT_RECOVERY_MESSAGE,
|
|
259
|
+
errorType: 'non-empty content',
|
|
260
|
+
};
|
|
261
|
+
}
|
|
262
|
+
// Check retry limits
|
|
263
|
+
state.retryState.attempt++;
|
|
264
|
+
state.retryState.lastAttemptTime = Date.now();
|
|
265
|
+
if (state.retryState.attempt > RETRY_CONFIG.maxAttempts) {
|
|
266
|
+
return {
|
|
267
|
+
message: RECOVERY_FAILED_MESSAGE,
|
|
268
|
+
errorType: 'recovery_exhausted',
|
|
269
|
+
};
|
|
270
|
+
}
|
|
271
|
+
// Return detailed or short message based on config
|
|
272
|
+
if (config?.detailed !== false) {
|
|
273
|
+
let message = CONTEXT_LIMIT_RECOVERY_MESSAGE;
|
|
274
|
+
// Add token info if available
|
|
275
|
+
if (parsed?.currentTokens && parsed?.maxTokens) {
|
|
276
|
+
message += `\nToken Details:
|
|
277
|
+
- Current: ${parsed.currentTokens.toLocaleString()} tokens
|
|
278
|
+
- Maximum: ${parsed.maxTokens.toLocaleString()} tokens
|
|
279
|
+
- Over limit by: ${(parsed.currentTokens - parsed.maxTokens).toLocaleString()} tokens
|
|
280
|
+
`;
|
|
281
|
+
}
|
|
282
|
+
return {
|
|
283
|
+
message,
|
|
284
|
+
errorType: parsed?.errorType || 'token_limit_exceeded',
|
|
285
|
+
};
|
|
286
|
+
}
|
|
287
|
+
return {
|
|
288
|
+
message: CONTEXT_LIMIT_SHORT_MESSAGE,
|
|
289
|
+
errorType: parsed?.errorType || 'token_limit_exceeded',
|
|
290
|
+
};
|
|
291
|
+
}
|
|
292
|
+
/**
|
|
293
|
+
* Handle context window limit recovery
|
|
294
|
+
*/
|
|
295
|
+
export function handleContextWindowRecovery(sessionId, error, config) {
|
|
296
|
+
const parsed = parseTokenLimitError(error);
|
|
297
|
+
if (!parsed) {
|
|
298
|
+
return {
|
|
299
|
+
attempted: false,
|
|
300
|
+
success: false,
|
|
301
|
+
};
|
|
302
|
+
}
|
|
303
|
+
debugLog('detected token limit error', { sessionId, parsed });
|
|
304
|
+
const state = getSessionState(sessionId);
|
|
305
|
+
state.lastErrorTime = Date.now();
|
|
306
|
+
state.errorCount++;
|
|
307
|
+
const recovery = generateRecoveryMessage(parsed, state, config);
|
|
308
|
+
return {
|
|
309
|
+
attempted: true,
|
|
310
|
+
success: !!recovery.message,
|
|
311
|
+
message: recovery.message,
|
|
312
|
+
errorType: recovery.errorType,
|
|
313
|
+
};
|
|
314
|
+
}
|
|
315
|
+
/**
|
|
316
|
+
* Check if text contains a context limit error
|
|
317
|
+
*/
|
|
318
|
+
export function detectContextLimitError(text) {
|
|
319
|
+
return containsTokenLimitError(text);
|
|
320
|
+
}
|
|
321
|
+
//# sourceMappingURL=context-window.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-window.js","sourceRoot":"","sources":["../../../src/hooks/recovery/context-window.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Edit Error Recovery
|
|
3
|
+
*
|
|
4
|
+
* Detects Edit tool errors caused by AI mistakes and injects
|
|
5
|
+
* a recovery reminder to guide corrective action.
|
|
6
|
+
*/
|
|
7
|
+
import type { RecoveryResult } from './types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Check if an output contains an edit error pattern
|
|
10
|
+
*/
|
|
11
|
+
export declare function detectEditError(output: string): boolean;
|
|
12
|
+
/**
|
|
13
|
+
* Inject the edit error recovery reminder into the output
|
|
14
|
+
*/
|
|
15
|
+
export declare function injectEditErrorRecovery(output: string): string;
|
|
16
|
+
/**
|
|
17
|
+
* Handle edit error recovery
|
|
18
|
+
*/
|
|
19
|
+
export declare function handleEditErrorRecovery(toolName: string, output: string): RecoveryResult;
|
|
20
|
+
/**
|
|
21
|
+
* Process edit tool output and inject recovery if needed.
|
|
22
|
+
*/
|
|
23
|
+
export declare function processEditOutput(toolName: string, output: string): string;
|
|
24
|
+
//# sourceMappingURL=edit-error.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"edit-error.d.ts","sourceRoot":"","sources":["../../../src/hooks/recovery/edit-error.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAKvD;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAK9D;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,GACb,cAAc,CAqBhB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAK1E"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Edit Error Recovery
|
|
3
|
+
*
|
|
4
|
+
* Detects Edit tool errors caused by AI mistakes and injects
|
|
5
|
+
* a recovery reminder to guide corrective action.
|
|
6
|
+
*/
|
|
7
|
+
import { EDIT_ERROR_PATTERNS, EDIT_ERROR_REMINDER, } from './constants.js';
|
|
8
|
+
/**
|
|
9
|
+
* Check if an output contains an edit error pattern
|
|
10
|
+
*/
|
|
11
|
+
export function detectEditError(output) {
|
|
12
|
+
const outputLower = output.toLowerCase();
|
|
13
|
+
return EDIT_ERROR_PATTERNS.some((pattern) => outputLower.includes(pattern.toLowerCase()));
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Inject the edit error recovery reminder into the output
|
|
17
|
+
*/
|
|
18
|
+
export function injectEditErrorRecovery(output) {
|
|
19
|
+
if (detectEditError(output)) {
|
|
20
|
+
return output + EDIT_ERROR_REMINDER;
|
|
21
|
+
}
|
|
22
|
+
return output;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Handle edit error recovery
|
|
26
|
+
*/
|
|
27
|
+
export function handleEditErrorRecovery(toolName, output) {
|
|
28
|
+
if (toolName.toLowerCase() !== 'edit') {
|
|
29
|
+
return {
|
|
30
|
+
attempted: false,
|
|
31
|
+
success: false,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
if (detectEditError(output)) {
|
|
35
|
+
return {
|
|
36
|
+
attempted: true,
|
|
37
|
+
success: true,
|
|
38
|
+
message: EDIT_ERROR_REMINDER,
|
|
39
|
+
errorType: 'edit_error',
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
return {
|
|
43
|
+
attempted: false,
|
|
44
|
+
success: false,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Process edit tool output and inject recovery if needed.
|
|
49
|
+
*/
|
|
50
|
+
export function processEditOutput(toolName, output) {
|
|
51
|
+
if (toolName.toLowerCase() !== 'edit') {
|
|
52
|
+
return output;
|
|
53
|
+
}
|
|
54
|
+
return injectEditErrorRecovery(output);
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=edit-error.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"edit-error.js","sourceRoot":"","sources":["../../../src/hooks/recovery/edit-error.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,gBAAgB,CAAC;AAGxB;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,MAAc;IAC5C,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;IACzC,OAAO,mBAAmB,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAC1C,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAC5C,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,uBAAuB,CAAC,MAAc;IACpD,IAAI,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC;QAC5B,OAAO,MAAM,GAAG,mBAAmB,CAAC;IACtC,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,uBAAuB,CACrC,QAAgB,EAChB,MAAc;IAEd,IAAI,QAAQ,CAAC,WAAW,EAAE,KAAK,MAAM,EAAE,CAAC;QACtC,OAAO;YACL,SAAS,EAAE,KAAK;YAChB,OAAO,EAAE,KAAK;SACf,CAAC;IACJ,CAAC;IAED,IAAI,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC;QAC5B,OAAO;YACL,SAAS,EAAE,IAAI;YACf,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,mBAAmB;YAC5B,SAAS,EAAE,YAAY;SACxB,CAAC;IACJ,CAAC;IAED,OAAO;QACL,SAAS,EAAE,KAAK;QAChB,OAAO,EAAE,KAAK;KACf,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,QAAgB,EAAE,MAAc;IAChE,IAAI,QAAQ,CAAC,WAAW,EAAE,KAAK,MAAM,EAAE,CAAC;QACtC,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,OAAO,uBAAuB,CAAC,MAAM,CAAC,CAAC;AACzC,CAAC"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unified Recovery Module
|
|
3
|
+
*
|
|
4
|
+
* Consolidates all recovery mechanisms into a single, coordinated system.
|
|
5
|
+
* Handles context window limits, edit errors, and session recovery.
|
|
6
|
+
*
|
|
7
|
+
* Recovery Priority (checked in order):
|
|
8
|
+
* 1. Context Window Limit - Most critical, blocks all progress
|
|
9
|
+
* 2. Edit Errors - Immediate user feedback needed
|
|
10
|
+
* 3. Session Recovery - Structural errors that need fixing
|
|
11
|
+
*/
|
|
12
|
+
export type { RecoveryErrorType, RecoveryResult, RecoveryConfig, ParsedTokenLimitError, RetryState, TruncateState, MessageData, StoredMessageMeta, StoredPart, StoredTextPart, StoredToolPart, StoredReasoningPart, } from './types.js';
|
|
13
|
+
export { RETRY_CONFIG, TRUNCATE_CONFIG } from './types.js';
|
|
14
|
+
export { CONTEXT_LIMIT_RECOVERY_MESSAGE, CONTEXT_LIMIT_SHORT_MESSAGE, NON_EMPTY_CONTENT_RECOVERY_MESSAGE, TRUNCATION_APPLIED_MESSAGE, RECOVERY_FAILED_MESSAGE, TOKEN_LIMIT_PATTERNS, TOKEN_LIMIT_KEYWORDS, EDIT_ERROR_PATTERNS, EDIT_ERROR_REMINDER, RECOVERY_MESSAGES, PLACEHOLDER_TEXT, } from './constants.js';
|
|
15
|
+
export { readMessages, readParts, findEmptyMessages, findMessagesWithThinkingBlocks, findMessagesWithOrphanThinking, injectTextPart, prependThinkingPart, stripThinkingParts, replaceEmptyTextParts, } from './storage.js';
|
|
16
|
+
export { handleContextWindowRecovery, detectContextLimitError, parseTokenLimitError, containsTokenLimitError, } from './context-window.js';
|
|
17
|
+
export { handleEditErrorRecovery, detectEditError, processEditOutput, } from './edit-error.js';
|
|
18
|
+
export { handleSessionRecovery, detectErrorType as detectSessionErrorType, isRecoverableError, } from './session-recovery.js';
|
|
19
|
+
import type { RecoveryResult, RecoveryConfig, MessageData } from './types.js';
|
|
20
|
+
/**
|
|
21
|
+
* Unified recovery handler
|
|
22
|
+
*
|
|
23
|
+
* Attempts recovery in priority order:
|
|
24
|
+
* 1. Context Window Limit (most critical)
|
|
25
|
+
* 2. Session Recovery (structural errors)
|
|
26
|
+
* 3. Edit Errors (handled during tool execution)
|
|
27
|
+
*
|
|
28
|
+
* @param input Recovery input
|
|
29
|
+
* @returns Recovery result
|
|
30
|
+
*/
|
|
31
|
+
export declare function handleRecovery(input: {
|
|
32
|
+
sessionId: string;
|
|
33
|
+
error?: unknown;
|
|
34
|
+
toolName?: string;
|
|
35
|
+
toolOutput?: string;
|
|
36
|
+
message?: MessageData;
|
|
37
|
+
config?: RecoveryConfig;
|
|
38
|
+
}): Promise<RecoveryResult>;
|
|
39
|
+
/**
|
|
40
|
+
* Detect if an error is recoverable
|
|
41
|
+
*
|
|
42
|
+
* Checks all recovery mechanisms to see if the error can be handled.
|
|
43
|
+
*/
|
|
44
|
+
export declare function detectRecoverableError(error: unknown): {
|
|
45
|
+
recoverable: boolean;
|
|
46
|
+
type?: string;
|
|
47
|
+
};
|
|
48
|
+
/**
|
|
49
|
+
* Detect if output contains an edit error
|
|
50
|
+
*/
|
|
51
|
+
export declare function detectEditErrorInOutput(output: string): boolean;
|
|
52
|
+
/**
|
|
53
|
+
* Create unified recovery hook for Claude Code
|
|
54
|
+
*
|
|
55
|
+
* This hook provides a single entry point for all recovery mechanisms.
|
|
56
|
+
*/
|
|
57
|
+
export declare function createRecoveryHook(config?: RecoveryConfig): {
|
|
58
|
+
/**
|
|
59
|
+
* Check for errors during tool execution or message processing
|
|
60
|
+
*/
|
|
61
|
+
onError: (input: {
|
|
62
|
+
session_id: string;
|
|
63
|
+
error: unknown;
|
|
64
|
+
message?: MessageData;
|
|
65
|
+
}) => Promise<RecoveryResult>;
|
|
66
|
+
/**
|
|
67
|
+
* Post-tool execution hook for edit error recovery
|
|
68
|
+
*/
|
|
69
|
+
afterToolExecute: (input: {
|
|
70
|
+
tool: string;
|
|
71
|
+
output: string;
|
|
72
|
+
sessionId: string;
|
|
73
|
+
}) => {
|
|
74
|
+
output: string;
|
|
75
|
+
recovery?: RecoveryResult;
|
|
76
|
+
};
|
|
77
|
+
/**
|
|
78
|
+
* Check if an error is recoverable
|
|
79
|
+
*/
|
|
80
|
+
isRecoverable: (error: unknown) => boolean;
|
|
81
|
+
/**
|
|
82
|
+
* Get recovery type for an error
|
|
83
|
+
*/
|
|
84
|
+
getRecoveryType: (error: unknown) => string | undefined;
|
|
85
|
+
};
|
|
86
|
+
/**
|
|
87
|
+
* Parse context limit error for detailed information
|
|
88
|
+
*/
|
|
89
|
+
export declare function parseContextLimitError(error: unknown): import("./types.js").ParsedTokenLimitError | null;
|
|
90
|
+
/**
|
|
91
|
+
* Detect if text contains a context limit error
|
|
92
|
+
*/
|
|
93
|
+
export declare function detectContextLimitErrorInText(text: string): boolean;
|
|
94
|
+
/**
|
|
95
|
+
* Detect if text contains an edit error
|
|
96
|
+
*/
|
|
97
|
+
export declare function detectEditErrorInText(text: string): boolean;
|
|
98
|
+
/**
|
|
99
|
+
* Check if session error is recoverable
|
|
100
|
+
*/
|
|
101
|
+
export declare function isSessionRecoverable(error: unknown): boolean;
|
|
102
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/hooks/recovery/index.ts"],"names":[],"mappings":"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"}
|