oh-my-claude-sisyphus 3.6.1 → 3.6.3
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/commands/doctor.md +1 -1
- package/commands/psm.md +180 -0
- package/dist/__tests__/analytics/analytics-summary.test.d.ts +2 -0
- package/dist/__tests__/analytics/analytics-summary.test.d.ts.map +1 -0
- package/dist/__tests__/analytics/analytics-summary.test.js +267 -0
- package/dist/__tests__/analytics/analytics-summary.test.js.map +1 -0
- package/dist/__tests__/analytics/cost-estimator.test.d.ts +2 -0
- package/dist/__tests__/analytics/cost-estimator.test.d.ts.map +1 -0
- package/dist/__tests__/analytics/cost-estimator.test.js +212 -0
- package/dist/__tests__/analytics/cost-estimator.test.js.map +1 -0
- package/dist/__tests__/hooks/auto-slash-command/executor.test.d.ts +7 -0
- package/dist/__tests__/hooks/auto-slash-command/executor.test.d.ts.map +1 -0
- package/dist/__tests__/hooks/auto-slash-command/executor.test.js +374 -0
- package/dist/__tests__/hooks/auto-slash-command/executor.test.js.map +1 -0
- package/dist/__tests__/hud/auto-tracking.integration.test.d.ts +2 -0
- package/dist/__tests__/hud/auto-tracking.integration.test.d.ts.map +1 -0
- package/dist/__tests__/hud/auto-tracking.integration.test.js +12 -0
- package/dist/__tests__/hud/auto-tracking.integration.test.js.map +1 -0
- package/dist/__tests__/installer.test.js +1 -1
- package/dist/__tests__/learned-skills/config.test.d.ts +2 -0
- package/dist/__tests__/learned-skills/config.test.d.ts.map +1 -0
- package/dist/__tests__/learned-skills/config.test.js +37 -0
- package/dist/__tests__/learned-skills/config.test.js.map +1 -0
- package/dist/__tests__/learned-skills/detector.test.d.ts +2 -0
- package/dist/__tests__/learned-skills/detector.test.d.ts.map +1 -0
- package/dist/__tests__/learned-skills/detector.test.js +99 -0
- package/dist/__tests__/learned-skills/detector.test.js.map +1 -0
- package/dist/__tests__/learned-skills/finder.test.d.ts +2 -0
- package/dist/__tests__/learned-skills/finder.test.d.ts.map +1 -0
- package/dist/__tests__/learned-skills/finder.test.js +59 -0
- package/dist/__tests__/learned-skills/finder.test.js.map +1 -0
- package/dist/__tests__/learned-skills/loader.test.d.ts +2 -0
- package/dist/__tests__/learned-skills/loader.test.d.ts.map +1 -0
- package/dist/__tests__/learned-skills/loader.test.js +69 -0
- package/dist/__tests__/learned-skills/loader.test.js.map +1 -0
- package/dist/__tests__/learned-skills/parser.test.d.ts +2 -0
- package/dist/__tests__/learned-skills/parser.test.d.ts.map +1 -0
- package/dist/__tests__/learned-skills/parser.test.js +81 -0
- package/dist/__tests__/learned-skills/parser.test.js.map +1 -0
- package/dist/__tests__/learned-skills/validator.test.d.ts +2 -0
- package/dist/__tests__/learned-skills/validator.test.d.ts.map +1 -0
- package/dist/__tests__/learned-skills/validator.test.js +85 -0
- package/dist/__tests__/learned-skills/validator.test.js.map +1 -0
- package/dist/__tests__/skills.test.js +6 -5
- package/dist/__tests__/skills.test.js.map +1 -1
- package/dist/agents/codex-agents.d.ts +20 -0
- package/dist/agents/codex-agents.d.ts.map +1 -0
- package/dist/agents/codex-agents.js +36 -0
- package/dist/agents/codex-agents.js.map +1 -0
- package/dist/agents/document-writer.d.ts +11 -0
- package/dist/agents/document-writer.d.ts.map +1 -0
- package/dist/agents/document-writer.js +209 -0
- package/dist/agents/document-writer.js.map +1 -0
- package/dist/agents/frontend-engineer.d.ts +11 -0
- package/dist/agents/frontend-engineer.d.ts.map +1 -0
- package/dist/agents/frontend-engineer.js +115 -0
- package/dist/agents/frontend-engineer.js.map +1 -0
- package/dist/agents/librarian.d.ts +12 -0
- package/dist/agents/librarian.d.ts.map +1 -0
- package/dist/agents/librarian.js +103 -0
- package/dist/agents/librarian.js.map +1 -0
- package/dist/agents/metis.d.ts +12 -0
- package/dist/agents/metis.d.ts.map +1 -0
- package/dist/agents/metis.js +117 -0
- package/dist/agents/metis.js.map +1 -0
- package/dist/agents/momus.d.ts +12 -0
- package/dist/agents/momus.d.ts.map +1 -0
- package/dist/agents/momus.js +128 -0
- package/dist/agents/momus.js.map +1 -0
- package/dist/agents/multimodal-looker.d.ts +11 -0
- package/dist/agents/multimodal-looker.d.ts.map +1 -0
- package/dist/agents/multimodal-looker.js +70 -0
- package/dist/agents/multimodal-looker.js.map +1 -0
- package/dist/agents/oracle.d.ts +13 -0
- package/dist/agents/oracle.d.ts.map +1 -0
- package/dist/agents/oracle.js +191 -0
- package/dist/agents/oracle.js.map +1 -0
- package/dist/agents/orchestrator-sisyphus.d.ts +11 -0
- package/dist/agents/orchestrator-sisyphus.d.ts.map +1 -0
- package/dist/agents/orchestrator-sisyphus.js +115 -0
- package/dist/agents/orchestrator-sisyphus.js.map +1 -0
- package/dist/agents/prometheus.d.ts +12 -0
- package/dist/agents/prometheus.d.ts.map +1 -0
- package/dist/agents/prometheus.js +195 -0
- package/dist/agents/prometheus.js.map +1 -0
- package/dist/agents/sisyphus-junior.d.ts +12 -0
- package/dist/agents/sisyphus-junior.d.ts.map +1 -0
- package/dist/agents/sisyphus-junior.js +93 -0
- package/dist/agents/sisyphus-junior.js.map +1 -0
- package/dist/cli/analytics.js +0 -0
- package/dist/cli/components/CostDashboard.d.ts +15 -0
- package/dist/cli/components/CostDashboard.d.ts.map +1 -0
- package/dist/cli/components/CostDashboard.js +15 -0
- package/dist/cli/components/CostDashboard.js.map +1 -0
- package/dist/cli/components/LiveStats.d.ts +16 -0
- package/dist/cli/components/LiveStats.d.ts.map +1 -0
- package/dist/cli/components/LiveStats.js +16 -0
- package/dist/cli/components/LiveStats.js.map +1 -0
- package/dist/cli/components/SessionBrowser.d.ts +14 -0
- package/dist/cli/components/SessionBrowser.d.ts.map +1 -0
- package/dist/cli/components/SessionBrowser.js +14 -0
- package/dist/cli/components/SessionBrowser.js.map +1 -0
- package/dist/cli/index.js +0 -0
- package/dist/cli/tui.d.ts +21 -0
- package/dist/cli/tui.d.ts.map +1 -0
- package/dist/cli/tui.js +21 -0
- package/dist/cli/tui.js.map +1 -0
- package/dist/hooks/autopilot/signals.d.ts +20 -0
- package/dist/hooks/autopilot/signals.d.ts.map +1 -0
- package/dist/hooks/autopilot/signals.js +75 -0
- package/dist/hooks/autopilot/signals.js.map +1 -0
- package/dist/hooks/autopilot/summary.d.ts +27 -0
- package/dist/hooks/autopilot/summary.d.ts.map +1 -0
- package/dist/hooks/autopilot/summary.js +160 -0
- package/dist/hooks/autopilot/summary.js.map +1 -0
- package/dist/hooks/autopilot/transition.d.ts +39 -0
- package/dist/hooks/autopilot/transition.d.ts.map +1 -0
- package/dist/hooks/autopilot/transition.js +216 -0
- package/dist/hooks/autopilot/transition.js.map +1 -0
- package/dist/hooks/context-window-limit-recovery/constants.d.ts +28 -0
- package/dist/hooks/context-window-limit-recovery/constants.d.ts.map +1 -0
- package/dist/hooks/context-window-limit-recovery/constants.js +85 -0
- package/dist/hooks/context-window-limit-recovery/constants.js.map +1 -0
- package/dist/hooks/context-window-limit-recovery/index.d.ts +62 -0
- package/dist/hooks/context-window-limit-recovery/index.d.ts.map +1 -0
- package/dist/hooks/context-window-limit-recovery/index.js +201 -0
- package/dist/hooks/context-window-limit-recovery/index.js.map +1 -0
- package/dist/hooks/context-window-limit-recovery/parser.d.ts +31 -0
- package/dist/hooks/context-window-limit-recovery/parser.d.ts.map +1 -0
- package/dist/hooks/context-window-limit-recovery/parser.js +241 -0
- package/dist/hooks/context-window-limit-recovery/parser.js.map +1 -0
- package/dist/hooks/context-window-limit-recovery/types.d.ts +84 -0
- package/dist/hooks/context-window-limit-recovery/types.d.ts.map +1 -0
- package/dist/hooks/context-window-limit-recovery/types.js +34 -0
- package/dist/hooks/context-window-limit-recovery/types.js.map +1 -0
- package/dist/hooks/edit-error-recovery/index.d.ts +62 -0
- package/dist/hooks/edit-error-recovery/index.d.ts.map +1 -0
- package/dist/hooks/edit-error-recovery/index.js +89 -0
- package/dist/hooks/edit-error-recovery/index.js.map +1 -0
- package/dist/hooks/learned-skills/config.d.ts +53 -0
- package/dist/hooks/learned-skills/config.d.ts.map +1 -0
- package/dist/hooks/learned-skills/config.js +103 -0
- package/dist/hooks/learned-skills/config.js.map +1 -0
- package/dist/hooks/learned-skills/constants.d.ts +24 -0
- package/dist/hooks/learned-skills/constants.d.ts.map +1 -0
- package/dist/hooks/learned-skills/constants.js +26 -0
- package/dist/hooks/learned-skills/constants.js.map +1 -0
- package/dist/hooks/learned-skills/detection-hook.d.ts +39 -0
- package/dist/hooks/learned-skills/detection-hook.d.ts.map +1 -0
- package/dist/hooks/learned-skills/detection-hook.js +83 -0
- package/dist/hooks/learned-skills/detection-hook.js.map +1 -0
- package/dist/hooks/learned-skills/detector.d.ts +30 -0
- package/dist/hooks/learned-skills/detector.d.ts.map +1 -0
- package/dist/hooks/learned-skills/detector.js +150 -0
- package/dist/hooks/learned-skills/detector.js.map +1 -0
- package/dist/hooks/learned-skills/finder.d.ts +21 -0
- package/dist/hooks/learned-skills/finder.d.ts.map +1 -0
- package/dist/hooks/learned-skills/finder.js +117 -0
- package/dist/hooks/learned-skills/finder.js.map +1 -0
- package/dist/hooks/learned-skills/index.d.ts +62 -0
- package/dist/hooks/learned-skills/index.d.ts.map +1 -0
- package/dist/hooks/learned-skills/index.js +137 -0
- package/dist/hooks/learned-skills/index.js.map +1 -0
- package/dist/hooks/learned-skills/loader.d.ts +20 -0
- package/dist/hooks/learned-skills/loader.d.ts.map +1 -0
- package/dist/hooks/learned-skills/loader.js +107 -0
- package/dist/hooks/learned-skills/loader.js.map +1 -0
- package/dist/hooks/learned-skills/parser.d.ts +21 -0
- package/dist/hooks/learned-skills/parser.d.ts.map +1 -0
- package/dist/hooks/learned-skills/parser.js +190 -0
- package/dist/hooks/learned-skills/parser.js.map +1 -0
- package/dist/hooks/learned-skills/promotion.d.ts +29 -0
- package/dist/hooks/learned-skills/promotion.d.ts.map +1 -0
- package/dist/hooks/learned-skills/promotion.js +87 -0
- package/dist/hooks/learned-skills/promotion.js.map +1 -0
- package/dist/hooks/learned-skills/types.d.ts +109 -0
- package/dist/hooks/learned-skills/types.d.ts.map +1 -0
- package/dist/hooks/learned-skills/types.js +8 -0
- package/dist/hooks/learned-skills/types.js.map +1 -0
- package/dist/hooks/learned-skills/validator.d.ts +15 -0
- package/dist/hooks/learned-skills/validator.d.ts.map +1 -0
- package/dist/hooks/learned-skills/validator.js +87 -0
- package/dist/hooks/learned-skills/validator.js.map +1 -0
- package/dist/hooks/learned-skills/writer.d.ts +27 -0
- package/dist/hooks/learned-skills/writer.d.ts.map +1 -0
- package/dist/hooks/learned-skills/writer.js +126 -0
- package/dist/hooks/learned-skills/writer.js.map +1 -0
- package/dist/hooks/mnemosyne/config.d.ts +53 -0
- package/dist/hooks/mnemosyne/config.d.ts.map +1 -0
- package/dist/hooks/mnemosyne/config.js +103 -0
- package/dist/hooks/mnemosyne/config.js.map +1 -0
- package/dist/hooks/mnemosyne/constants.d.ts +24 -0
- package/dist/hooks/mnemosyne/constants.d.ts.map +1 -0
- package/dist/hooks/mnemosyne/constants.js +26 -0
- package/dist/hooks/mnemosyne/constants.js.map +1 -0
- package/dist/hooks/mnemosyne/detection-hook.d.ts +39 -0
- package/dist/hooks/mnemosyne/detection-hook.d.ts.map +1 -0
- package/dist/hooks/mnemosyne/detection-hook.js +83 -0
- package/dist/hooks/mnemosyne/detection-hook.js.map +1 -0
- package/dist/hooks/mnemosyne/detector.d.ts +30 -0
- package/dist/hooks/mnemosyne/detector.d.ts.map +1 -0
- package/dist/hooks/mnemosyne/detector.js +150 -0
- package/dist/hooks/mnemosyne/detector.js.map +1 -0
- package/dist/hooks/mnemosyne/finder.d.ts +21 -0
- package/dist/hooks/mnemosyne/finder.d.ts.map +1 -0
- package/dist/hooks/mnemosyne/finder.js +117 -0
- package/dist/hooks/mnemosyne/finder.js.map +1 -0
- package/dist/hooks/mnemosyne/index.d.ts +62 -0
- package/dist/hooks/mnemosyne/index.d.ts.map +1 -0
- package/dist/hooks/mnemosyne/index.js +137 -0
- package/dist/hooks/mnemosyne/index.js.map +1 -0
- package/dist/hooks/mnemosyne/loader.d.ts +20 -0
- package/dist/hooks/mnemosyne/loader.d.ts.map +1 -0
- package/dist/hooks/mnemosyne/loader.js +113 -0
- package/dist/hooks/mnemosyne/loader.js.map +1 -0
- package/dist/hooks/mnemosyne/parser.d.ts +21 -0
- package/dist/hooks/mnemosyne/parser.d.ts.map +1 -0
- package/dist/hooks/mnemosyne/parser.js +190 -0
- package/dist/hooks/mnemosyne/parser.js.map +1 -0
- package/dist/hooks/mnemosyne/promotion.d.ts +29 -0
- package/dist/hooks/mnemosyne/promotion.d.ts.map +1 -0
- package/dist/hooks/mnemosyne/promotion.js +87 -0
- package/dist/hooks/mnemosyne/promotion.js.map +1 -0
- package/dist/hooks/mnemosyne/types.d.ts +109 -0
- package/dist/hooks/mnemosyne/types.d.ts.map +1 -0
- package/dist/hooks/mnemosyne/types.js +8 -0
- package/dist/hooks/mnemosyne/types.js.map +1 -0
- package/dist/hooks/mnemosyne/validator.d.ts +15 -0
- package/dist/hooks/mnemosyne/validator.d.ts.map +1 -0
- package/dist/hooks/mnemosyne/validator.js +87 -0
- package/dist/hooks/mnemosyne/validator.js.map +1 -0
- package/dist/hooks/mnemosyne/writer.d.ts +27 -0
- package/dist/hooks/mnemosyne/writer.d.ts.map +1 -0
- package/dist/hooks/mnemosyne/writer.js +126 -0
- package/dist/hooks/mnemosyne/writer.js.map +1 -0
- package/dist/hooks/ralph-loop/index.d.ts +116 -0
- package/dist/hooks/ralph-loop/index.d.ts.map +1 -0
- package/dist/hooks/ralph-loop/index.js +322 -0
- package/dist/hooks/ralph-loop/index.js.map +1 -0
- package/dist/hooks/ralph-prd/index.d.ts +130 -0
- package/dist/hooks/ralph-prd/index.d.ts.map +1 -0
- package/dist/hooks/ralph-prd/index.js +310 -0
- package/dist/hooks/ralph-prd/index.js.map +1 -0
- package/dist/hooks/ralph-progress/index.d.ts +102 -0
- package/dist/hooks/ralph-progress/index.d.ts.map +1 -0
- package/dist/hooks/ralph-progress/index.js +408 -0
- package/dist/hooks/ralph-progress/index.js.map +1 -0
- package/dist/hooks/ralph-verifier/index.d.ts +72 -0
- package/dist/hooks/ralph-verifier/index.d.ts.map +1 -0
- package/dist/hooks/ralph-verifier/index.js +223 -0
- package/dist/hooks/ralph-verifier/index.js.map +1 -0
- package/dist/hooks/session-recovery/constants.d.ts +56 -0
- package/dist/hooks/session-recovery/constants.d.ts.map +1 -0
- package/dist/hooks/session-recovery/constants.js +78 -0
- package/dist/hooks/session-recovery/constants.js.map +1 -0
- package/dist/hooks/session-recovery/index.d.ts +53 -0
- package/dist/hooks/session-recovery/index.d.ts.map +1 -0
- package/dist/hooks/session-recovery/index.js +321 -0
- package/dist/hooks/session-recovery/index.js.map +1 -0
- package/dist/hooks/session-recovery/storage.d.ts +76 -0
- package/dist/hooks/session-recovery/storage.d.ts.map +1 -0
- package/dist/hooks/session-recovery/storage.js +383 -0
- package/dist/hooks/session-recovery/storage.js.map +1 -0
- package/dist/hooks/session-recovery/types.d.ts +145 -0
- package/dist/hooks/session-recovery/types.d.ts.map +1 -0
- package/dist/hooks/session-recovery/types.js +8 -0
- package/dist/hooks/session-recovery/types.js.map +1 -0
- package/dist/hooks/sisyphus-orchestrator/constants.d.ts +23 -0
- package/dist/hooks/sisyphus-orchestrator/constants.d.ts.map +1 -0
- package/dist/hooks/sisyphus-orchestrator/constants.js +142 -0
- package/dist/hooks/sisyphus-orchestrator/constants.js.map +1 -0
- package/dist/hooks/sisyphus-orchestrator/index.d.ts +113 -0
- package/dist/hooks/sisyphus-orchestrator/index.d.ts.map +1 -0
- package/dist/hooks/sisyphus-orchestrator/index.js +309 -0
- package/dist/hooks/sisyphus-orchestrator/index.js.map +1 -0
- package/dist/hooks/subagent-tracker/index.d.ts +83 -0
- package/dist/hooks/subagent-tracker/index.d.ts.map +1 -0
- package/dist/hooks/subagent-tracker/index.js +207 -0
- package/dist/hooks/subagent-tracker/index.js.map +1 -0
- package/dist/hooks/ultraqa-loop/index.d.ts +94 -0
- package/dist/hooks/ultraqa-loop/index.d.ts.map +1 -0
- package/dist/hooks/ultraqa-loop/index.js +216 -0
- package/dist/hooks/ultraqa-loop/index.js.map +1 -0
- package/dist/hooks/ultrawork-state/index.d.ts +62 -0
- package/dist/hooks/ultrawork-state/index.d.ts.map +1 -0
- package/dist/hooks/ultrawork-state/index.js +208 -0
- package/dist/hooks/ultrawork-state/index.js.map +1 -0
- package/dist/hud/sisyphus-state.d.ts +31 -0
- package/dist/hud/sisyphus-state.d.ts.map +1 -0
- package/dist/hud/sisyphus-state.js +163 -0
- package/dist/hud/sisyphus-state.js.map +1 -0
- package/dist/installer/index.d.ts +1 -1
- package/dist/installer/index.js +1 -1
- package/docs/MIGRATION.md +2 -2
- package/docs/design/project-session-manager.md +1033 -0
- package/package.json +1 -1
- package/skills/doctor/SKILL.md +1 -1
- package/skills/project-session-manager/SKILL.md +410 -0
- package/skills/project-session-manager/lib/config.sh +86 -0
- package/skills/project-session-manager/lib/parse.sh +121 -0
- package/skills/project-session-manager/lib/session.sh +132 -0
- package/skills/project-session-manager/lib/tmux.sh +103 -0
- package/skills/project-session-manager/lib/worktree.sh +171 -0
- package/skills/project-session-manager/psm.sh +629 -0
- package/skills/project-session-manager/templates/feature.md +56 -0
- package/skills/project-session-manager/templates/issue-fix.md +57 -0
- package/skills/project-session-manager/templates/pr-review.md +65 -0
- package/skills/project-session-manager/templates/projects.json +19 -0
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Context Window Limit Recovery Hook
|
|
3
|
+
*
|
|
4
|
+
* Detects context window limit errors and injects recovery messages
|
|
5
|
+
* to help Claude recover gracefully.
|
|
6
|
+
*
|
|
7
|
+
* Adapted from oh-my-opencode's anthropic-context-window-limit-recovery hook.
|
|
8
|
+
*
|
|
9
|
+
* Note: This is a simplified version for Claude Code's shell hook system.
|
|
10
|
+
* The original uses OpenCode's plugin event system for more sophisticated
|
|
11
|
+
* recovery like automatic summarization and truncation.
|
|
12
|
+
*/
|
|
13
|
+
import * as fs from 'fs';
|
|
14
|
+
import * as path from 'path';
|
|
15
|
+
import { tmpdir } from 'os';
|
|
16
|
+
import { parseTokenLimitError, containsTokenLimitError, } from './parser.js';
|
|
17
|
+
import { CONTEXT_LIMIT_RECOVERY_MESSAGE, CONTEXT_LIMIT_SHORT_MESSAGE, NON_EMPTY_CONTENT_RECOVERY_MESSAGE, RECOVERY_FAILED_MESSAGE, } from './constants.js';
|
|
18
|
+
import { RETRY_CONFIG } from './types.js';
|
|
19
|
+
const DEBUG = process.env.CONTEXT_LIMIT_RECOVERY_DEBUG === '1';
|
|
20
|
+
const DEBUG_FILE = path.join(tmpdir(), 'context-limit-recovery-debug.log');
|
|
21
|
+
function debugLog(...args) {
|
|
22
|
+
if (DEBUG) {
|
|
23
|
+
const msg = `[${new Date().toISOString()}] [context-limit-recovery] ${args
|
|
24
|
+
.map((a) => typeof a === 'object' ? JSON.stringify(a, null, 2) : String(a))
|
|
25
|
+
.join(' ')}\n`;
|
|
26
|
+
fs.appendFileSync(DEBUG_FILE, msg);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
const sessionStates = new Map();
|
|
30
|
+
const STATE_TTL = 300_000; // 5 minutes
|
|
31
|
+
/**
|
|
32
|
+
* Get or create session state
|
|
33
|
+
*/
|
|
34
|
+
function getSessionState(sessionId) {
|
|
35
|
+
let state = sessionStates.get(sessionId);
|
|
36
|
+
const now = Date.now();
|
|
37
|
+
// Reset stale state
|
|
38
|
+
if (state && now - state.lastErrorTime > STATE_TTL) {
|
|
39
|
+
state = undefined;
|
|
40
|
+
}
|
|
41
|
+
if (!state) {
|
|
42
|
+
state = {
|
|
43
|
+
retryState: { attempt: 0, lastAttemptTime: 0 },
|
|
44
|
+
truncateState: { truncateAttempt: 0 },
|
|
45
|
+
lastErrorTime: now,
|
|
46
|
+
errorCount: 0,
|
|
47
|
+
};
|
|
48
|
+
sessionStates.set(sessionId, state);
|
|
49
|
+
}
|
|
50
|
+
return state;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Clean up old session states
|
|
54
|
+
*/
|
|
55
|
+
function cleanupSessionStates() {
|
|
56
|
+
const now = Date.now();
|
|
57
|
+
for (const [sessionId, state] of sessionStates) {
|
|
58
|
+
if (now - state.lastErrorTime > STATE_TTL) {
|
|
59
|
+
sessionStates.delete(sessionId);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
// Run cleanup periodically
|
|
64
|
+
let cleanupIntervalStarted = false;
|
|
65
|
+
/**
|
|
66
|
+
* Create context window limit recovery hook
|
|
67
|
+
*
|
|
68
|
+
* This hook monitors for token/context limit errors and injects
|
|
69
|
+
* helpful recovery messages when detected.
|
|
70
|
+
*/
|
|
71
|
+
export function createContextLimitRecoveryHook(config) {
|
|
72
|
+
debugLog('createContextLimitRecoveryHook called', { config });
|
|
73
|
+
if (!cleanupIntervalStarted) {
|
|
74
|
+
cleanupIntervalStarted = true;
|
|
75
|
+
setInterval(cleanupSessionStates, 60_000);
|
|
76
|
+
}
|
|
77
|
+
return {
|
|
78
|
+
/**
|
|
79
|
+
* PostToolUse - Check for context limit errors in tool responses
|
|
80
|
+
*/
|
|
81
|
+
postToolUse: (input) => {
|
|
82
|
+
if (!input.tool_response) {
|
|
83
|
+
return null;
|
|
84
|
+
}
|
|
85
|
+
// Check if response contains token limit error
|
|
86
|
+
const parsed = parseTokenLimitError(input.tool_response);
|
|
87
|
+
if (!parsed && !containsTokenLimitError(input.tool_response)) {
|
|
88
|
+
return null;
|
|
89
|
+
}
|
|
90
|
+
debugLog('detected token limit error', {
|
|
91
|
+
tool: input.tool_name,
|
|
92
|
+
sessionId: input.session_id,
|
|
93
|
+
parsed,
|
|
94
|
+
});
|
|
95
|
+
const state = getSessionState(input.session_id);
|
|
96
|
+
state.lastErrorTime = Date.now();
|
|
97
|
+
state.errorCount++;
|
|
98
|
+
// Generate appropriate recovery message
|
|
99
|
+
const recovery = generateRecoveryMessage(parsed, state, config);
|
|
100
|
+
if (recovery.message) {
|
|
101
|
+
debugLog('injecting recovery message', {
|
|
102
|
+
errorType: recovery.errorType,
|
|
103
|
+
attempt: state.retryState.attempt,
|
|
104
|
+
});
|
|
105
|
+
return recovery.message;
|
|
106
|
+
}
|
|
107
|
+
return null;
|
|
108
|
+
},
|
|
109
|
+
/**
|
|
110
|
+
* Notification - Check for error notifications
|
|
111
|
+
* (Called when errors are passed through notification system)
|
|
112
|
+
*/
|
|
113
|
+
onError: (input) => {
|
|
114
|
+
const parsed = parseTokenLimitError(input.error);
|
|
115
|
+
if (!parsed) {
|
|
116
|
+
return {
|
|
117
|
+
attempted: false,
|
|
118
|
+
success: false,
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
debugLog('error notification contains token limit error', {
|
|
122
|
+
sessionId: input.session_id,
|
|
123
|
+
parsed,
|
|
124
|
+
});
|
|
125
|
+
const state = getSessionState(input.session_id);
|
|
126
|
+
state.lastErrorTime = Date.now();
|
|
127
|
+
state.errorCount++;
|
|
128
|
+
const recovery = generateRecoveryMessage(parsed, state, config);
|
|
129
|
+
return {
|
|
130
|
+
attempted: true,
|
|
131
|
+
success: !!recovery.message,
|
|
132
|
+
message: recovery.message,
|
|
133
|
+
errorType: recovery.errorType,
|
|
134
|
+
};
|
|
135
|
+
},
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Generate appropriate recovery message based on error and state
|
|
140
|
+
*/
|
|
141
|
+
function generateRecoveryMessage(parsed, state, config) {
|
|
142
|
+
// Use custom message if provided
|
|
143
|
+
if (config?.customMessage) {
|
|
144
|
+
return {
|
|
145
|
+
message: config.customMessage,
|
|
146
|
+
errorType: parsed?.errorType,
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
// Handle non-empty content error
|
|
150
|
+
if (parsed?.errorType?.includes('non-empty content')) {
|
|
151
|
+
return {
|
|
152
|
+
message: NON_EMPTY_CONTENT_RECOVERY_MESSAGE,
|
|
153
|
+
errorType: 'non-empty content',
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
// Check retry limits
|
|
157
|
+
state.retryState.attempt++;
|
|
158
|
+
state.retryState.lastAttemptTime = Date.now();
|
|
159
|
+
if (state.retryState.attempt > RETRY_CONFIG.maxAttempts) {
|
|
160
|
+
return {
|
|
161
|
+
message: RECOVERY_FAILED_MESSAGE,
|
|
162
|
+
errorType: 'recovery_exhausted',
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
// Return detailed or short message based on config
|
|
166
|
+
if (config?.detailed !== false) {
|
|
167
|
+
let message = CONTEXT_LIMIT_RECOVERY_MESSAGE;
|
|
168
|
+
// Add token info if available
|
|
169
|
+
if (parsed?.currentTokens && parsed?.maxTokens) {
|
|
170
|
+
message += `\nToken Details:
|
|
171
|
+
- Current: ${parsed.currentTokens.toLocaleString()} tokens
|
|
172
|
+
- Maximum: ${parsed.maxTokens.toLocaleString()} tokens
|
|
173
|
+
- Over limit by: ${(parsed.currentTokens - parsed.maxTokens).toLocaleString()} tokens
|
|
174
|
+
`;
|
|
175
|
+
}
|
|
176
|
+
return {
|
|
177
|
+
message,
|
|
178
|
+
errorType: parsed?.errorType || 'token_limit_exceeded',
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
return {
|
|
182
|
+
message: CONTEXT_LIMIT_SHORT_MESSAGE,
|
|
183
|
+
errorType: parsed?.errorType || 'token_limit_exceeded',
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Check if text contains a context limit error
|
|
188
|
+
*/
|
|
189
|
+
export function detectContextLimitError(text) {
|
|
190
|
+
return containsTokenLimitError(text);
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Parse error to get detailed token limit info
|
|
194
|
+
*/
|
|
195
|
+
export function parseContextLimitError(error) {
|
|
196
|
+
return parseTokenLimitError(error);
|
|
197
|
+
}
|
|
198
|
+
export { RETRY_CONFIG, TRUNCATE_CONFIG } from './types.js';
|
|
199
|
+
export { CONTEXT_LIMIT_RECOVERY_MESSAGE, CONTEXT_LIMIT_SHORT_MESSAGE, NON_EMPTY_CONTENT_RECOVERY_MESSAGE, TRUNCATION_APPLIED_MESSAGE, RECOVERY_FAILED_MESSAGE, } from './constants.js';
|
|
200
|
+
export { parseTokenLimitError, containsTokenLimitError, TOKEN_LIMIT_PATTERNS, TOKEN_LIMIT_KEYWORDS, } from './parser.js';
|
|
201
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/hooks/context-window-limit-recovery/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Context Window Limit Error Parser
|
|
3
|
+
*
|
|
4
|
+
* Parses error responses to detect token/context limit errors.
|
|
5
|
+
*
|
|
6
|
+
* Adapted from oh-my-opencode's anthropic-context-window-limit-recovery hook.
|
|
7
|
+
*/
|
|
8
|
+
import type { ParsedTokenLimitError } from './types.js';
|
|
9
|
+
/**
|
|
10
|
+
* Patterns to extract token counts from error messages
|
|
11
|
+
*/
|
|
12
|
+
declare const TOKEN_LIMIT_PATTERNS: RegExp[];
|
|
13
|
+
/**
|
|
14
|
+
* Keywords indicating token limit errors
|
|
15
|
+
*/
|
|
16
|
+
declare const TOKEN_LIMIT_KEYWORDS: string[];
|
|
17
|
+
/**
|
|
18
|
+
* Patterns indicating thinking block structure errors (NOT token limit)
|
|
19
|
+
* These should be handled differently
|
|
20
|
+
*/
|
|
21
|
+
declare const THINKING_BLOCK_ERROR_PATTERNS: RegExp[];
|
|
22
|
+
/**
|
|
23
|
+
* Parse an error to detect if it's a token limit error
|
|
24
|
+
*/
|
|
25
|
+
export declare function parseTokenLimitError(err: unknown): ParsedTokenLimitError | null;
|
|
26
|
+
/**
|
|
27
|
+
* Check if a string contains a token limit error indication
|
|
28
|
+
*/
|
|
29
|
+
export declare function containsTokenLimitError(text: string): boolean;
|
|
30
|
+
export { TOKEN_LIMIT_PATTERNS, TOKEN_LIMIT_KEYWORDS, THINKING_BLOCK_ERROR_PATTERNS, };
|
|
31
|
+
//# sourceMappingURL=parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../../src/hooks/context-window-limit-recovery/parser.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAExD;;GAEG;AACH,QAAA,MAAM,oBAAoB,UAMzB,CAAC;AAEF;;GAEG;AACH,QAAA,MAAM,oBAAoB,UASzB,CAAC;AAEF;;;GAGG;AACH,QAAA,MAAM,6BAA6B,UAOlC,CAAC;AAuDF;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,OAAO,GACX,qBAAqB,GAAG,IAAI,CA8J9B;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE7D;AAGD,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,6BAA6B,GAC9B,CAAC"}
|
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Context Window Limit Error Parser
|
|
3
|
+
*
|
|
4
|
+
* Parses error responses to detect token/context limit errors.
|
|
5
|
+
*
|
|
6
|
+
* Adapted from oh-my-opencode's anthropic-context-window-limit-recovery hook.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Patterns to extract token counts from error messages
|
|
10
|
+
*/
|
|
11
|
+
const TOKEN_LIMIT_PATTERNS = [
|
|
12
|
+
/(\d+)\s*tokens?\s*>\s*(\d+)\s*maximum/i,
|
|
13
|
+
/prompt.*?(\d+).*?tokens.*?exceeds.*?(\d+)/i,
|
|
14
|
+
/(\d+).*?tokens.*?limit.*?(\d+)/i,
|
|
15
|
+
/context.*?length.*?(\d+).*?maximum.*?(\d+)/i,
|
|
16
|
+
/max.*?context.*?(\d+).*?but.*?(\d+)/i,
|
|
17
|
+
];
|
|
18
|
+
/**
|
|
19
|
+
* Keywords indicating token limit errors
|
|
20
|
+
*/
|
|
21
|
+
const TOKEN_LIMIT_KEYWORDS = [
|
|
22
|
+
'prompt is too long',
|
|
23
|
+
'is too long',
|
|
24
|
+
'context_length_exceeded',
|
|
25
|
+
'max_tokens',
|
|
26
|
+
'token limit',
|
|
27
|
+
'context length',
|
|
28
|
+
'too many tokens',
|
|
29
|
+
'non-empty content',
|
|
30
|
+
];
|
|
31
|
+
/**
|
|
32
|
+
* Patterns indicating thinking block structure errors (NOT token limit)
|
|
33
|
+
* These should be handled differently
|
|
34
|
+
*/
|
|
35
|
+
const THINKING_BLOCK_ERROR_PATTERNS = [
|
|
36
|
+
/thinking.*first block/i,
|
|
37
|
+
/first block.*thinking/i,
|
|
38
|
+
/must.*start.*thinking/i,
|
|
39
|
+
/thinking.*redacted_thinking/i,
|
|
40
|
+
/expected.*thinking.*found/i,
|
|
41
|
+
/thinking.*disabled.*cannot.*contain/i,
|
|
42
|
+
];
|
|
43
|
+
/**
|
|
44
|
+
* Pattern to extract message index from error
|
|
45
|
+
*/
|
|
46
|
+
const MESSAGE_INDEX_PATTERN = /messages\.(\d+)/;
|
|
47
|
+
/**
|
|
48
|
+
* Check if error is a thinking block structure error
|
|
49
|
+
*/
|
|
50
|
+
function isThinkingBlockError(text) {
|
|
51
|
+
return THINKING_BLOCK_ERROR_PATTERNS.some((pattern) => pattern.test(text));
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Extract token counts from error message
|
|
55
|
+
*/
|
|
56
|
+
function extractTokensFromMessage(message) {
|
|
57
|
+
for (const pattern of TOKEN_LIMIT_PATTERNS) {
|
|
58
|
+
const match = message.match(pattern);
|
|
59
|
+
if (match) {
|
|
60
|
+
const num1 = parseInt(match[1], 10);
|
|
61
|
+
const num2 = parseInt(match[2], 10);
|
|
62
|
+
return num1 > num2
|
|
63
|
+
? { current: num1, max: num2 }
|
|
64
|
+
: { current: num2, max: num1 };
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Extract message index from error text
|
|
71
|
+
*/
|
|
72
|
+
function extractMessageIndex(text) {
|
|
73
|
+
const match = text.match(MESSAGE_INDEX_PATTERN);
|
|
74
|
+
if (match) {
|
|
75
|
+
return parseInt(match[1], 10);
|
|
76
|
+
}
|
|
77
|
+
return undefined;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Check if text indicates a token limit error
|
|
81
|
+
*/
|
|
82
|
+
function isTokenLimitError(text) {
|
|
83
|
+
if (isThinkingBlockError(text)) {
|
|
84
|
+
return false;
|
|
85
|
+
}
|
|
86
|
+
const lower = text.toLowerCase();
|
|
87
|
+
return TOKEN_LIMIT_KEYWORDS.some((kw) => lower.includes(kw.toLowerCase()));
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Parse an error to detect if it's a token limit error
|
|
91
|
+
*/
|
|
92
|
+
export function parseTokenLimitError(err) {
|
|
93
|
+
// Handle string errors
|
|
94
|
+
if (typeof err === 'string') {
|
|
95
|
+
if (err.toLowerCase().includes('non-empty content')) {
|
|
96
|
+
return {
|
|
97
|
+
currentTokens: 0,
|
|
98
|
+
maxTokens: 0,
|
|
99
|
+
errorType: 'non-empty content',
|
|
100
|
+
messageIndex: extractMessageIndex(err),
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
if (isTokenLimitError(err)) {
|
|
104
|
+
const tokens = extractTokensFromMessage(err);
|
|
105
|
+
return {
|
|
106
|
+
currentTokens: tokens?.current ?? 0,
|
|
107
|
+
maxTokens: tokens?.max ?? 0,
|
|
108
|
+
errorType: 'token_limit_exceeded_string',
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
return null;
|
|
112
|
+
}
|
|
113
|
+
// Handle non-object errors
|
|
114
|
+
if (!err || typeof err !== 'object')
|
|
115
|
+
return null;
|
|
116
|
+
const errObj = err;
|
|
117
|
+
// Collect all text sources from the error object
|
|
118
|
+
const textSources = [];
|
|
119
|
+
const dataObj = errObj.data;
|
|
120
|
+
const responseBody = dataObj?.responseBody;
|
|
121
|
+
const errorMessage = errObj.message;
|
|
122
|
+
const errorData = errObj.error;
|
|
123
|
+
const nestedError = errorData?.error;
|
|
124
|
+
if (typeof responseBody === 'string')
|
|
125
|
+
textSources.push(responseBody);
|
|
126
|
+
if (typeof errorMessage === 'string')
|
|
127
|
+
textSources.push(errorMessage);
|
|
128
|
+
if (typeof errorData?.message === 'string')
|
|
129
|
+
textSources.push(errorData.message);
|
|
130
|
+
if (typeof errObj.body === 'string')
|
|
131
|
+
textSources.push(errObj.body);
|
|
132
|
+
if (typeof errObj.details === 'string')
|
|
133
|
+
textSources.push(errObj.details);
|
|
134
|
+
if (typeof errObj.reason === 'string')
|
|
135
|
+
textSources.push(errObj.reason);
|
|
136
|
+
if (typeof errObj.description === 'string')
|
|
137
|
+
textSources.push(errObj.description);
|
|
138
|
+
if (typeof nestedError?.message === 'string')
|
|
139
|
+
textSources.push(nestedError.message);
|
|
140
|
+
if (typeof dataObj?.message === 'string')
|
|
141
|
+
textSources.push(dataObj.message);
|
|
142
|
+
if (typeof dataObj?.error === 'string')
|
|
143
|
+
textSources.push(dataObj.error);
|
|
144
|
+
// Try JSON stringification if no text sources found
|
|
145
|
+
if (textSources.length === 0) {
|
|
146
|
+
try {
|
|
147
|
+
const jsonStr = JSON.stringify(errObj);
|
|
148
|
+
if (isTokenLimitError(jsonStr)) {
|
|
149
|
+
textSources.push(jsonStr);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
catch {
|
|
153
|
+
// Ignore JSON errors
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
const combinedText = textSources.join(' ');
|
|
157
|
+
if (!isTokenLimitError(combinedText))
|
|
158
|
+
return null;
|
|
159
|
+
// Try to parse structured response body
|
|
160
|
+
if (typeof responseBody === 'string') {
|
|
161
|
+
try {
|
|
162
|
+
const jsonPatterns = [
|
|
163
|
+
/data:\s*(\{[\s\S]*\})\s*$/m,
|
|
164
|
+
/(\{"type"\s*:\s*"error"[\s\S]*\})/,
|
|
165
|
+
/(\{[\s\S]*"error"[\s\S]*\})/,
|
|
166
|
+
];
|
|
167
|
+
for (const pattern of jsonPatterns) {
|
|
168
|
+
const dataMatch = responseBody.match(pattern);
|
|
169
|
+
if (dataMatch) {
|
|
170
|
+
try {
|
|
171
|
+
const jsonData = JSON.parse(dataMatch[1]);
|
|
172
|
+
const message = jsonData.error?.message || '';
|
|
173
|
+
const tokens = extractTokensFromMessage(message);
|
|
174
|
+
if (tokens) {
|
|
175
|
+
return {
|
|
176
|
+
currentTokens: tokens.current,
|
|
177
|
+
maxTokens: tokens.max,
|
|
178
|
+
requestId: jsonData.request_id,
|
|
179
|
+
errorType: jsonData.error?.type || 'token_limit_exceeded',
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
catch {
|
|
184
|
+
// Ignore parse errors
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
// Check for Bedrock-style errors
|
|
189
|
+
const bedrockJson = JSON.parse(responseBody);
|
|
190
|
+
if (typeof bedrockJson.message === 'string' &&
|
|
191
|
+
isTokenLimitError(bedrockJson.message)) {
|
|
192
|
+
return {
|
|
193
|
+
currentTokens: 0,
|
|
194
|
+
maxTokens: 0,
|
|
195
|
+
errorType: 'bedrock_input_too_long',
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
catch {
|
|
200
|
+
// Ignore parse errors
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
// Extract tokens from any text source
|
|
204
|
+
for (const text of textSources) {
|
|
205
|
+
const tokens = extractTokensFromMessage(text);
|
|
206
|
+
if (tokens) {
|
|
207
|
+
return {
|
|
208
|
+
currentTokens: tokens.current,
|
|
209
|
+
maxTokens: tokens.max,
|
|
210
|
+
errorType: 'token_limit_exceeded',
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
// Check for non-empty content error
|
|
215
|
+
if (combinedText.toLowerCase().includes('non-empty content')) {
|
|
216
|
+
return {
|
|
217
|
+
currentTokens: 0,
|
|
218
|
+
maxTokens: 0,
|
|
219
|
+
errorType: 'non-empty content',
|
|
220
|
+
messageIndex: extractMessageIndex(combinedText),
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
// Generic token limit error
|
|
224
|
+
if (isTokenLimitError(combinedText)) {
|
|
225
|
+
return {
|
|
226
|
+
currentTokens: 0,
|
|
227
|
+
maxTokens: 0,
|
|
228
|
+
errorType: 'token_limit_exceeded_unknown',
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
return null;
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Check if a string contains a token limit error indication
|
|
235
|
+
*/
|
|
236
|
+
export function containsTokenLimitError(text) {
|
|
237
|
+
return isTokenLimitError(text);
|
|
238
|
+
}
|
|
239
|
+
// Re-export patterns for testing
|
|
240
|
+
export { TOKEN_LIMIT_PATTERNS, TOKEN_LIMIT_KEYWORDS, THINKING_BLOCK_ERROR_PATTERNS, };
|
|
241
|
+
//# sourceMappingURL=parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../../src/hooks/context-window-limit-recovery/parser.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH;;GAEG;AACH,MAAM,oBAAoB,GAAG;IAC3B,wCAAwC;IACxC,4CAA4C;IAC5C,iCAAiC;IACjC,6CAA6C;IAC7C,sCAAsC;CACvC,CAAC;AAEF;;GAEG;AACH,MAAM,oBAAoB,GAAG;IAC3B,oBAAoB;IACpB,aAAa;IACb,yBAAyB;IACzB,YAAY;IACZ,aAAa;IACb,gBAAgB;IAChB,iBAAiB;IACjB,mBAAmB;CACpB,CAAC;AAEF;;;GAGG;AACH,MAAM,6BAA6B,GAAG;IACpC,wBAAwB;IACxB,wBAAwB;IACxB,wBAAwB;IACxB,8BAA8B;IAC9B,4BAA4B;IAC5B,sCAAsC;CACvC,CAAC;AAEF;;GAEG;AACH,MAAM,qBAAqB,GAAG,iBAAiB,CAAC;AAEhD;;GAEG;AACH,SAAS,oBAAoB,CAAC,IAAY;IACxC,OAAO,6BAA6B,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAC7E,CAAC;AAED;;GAEG;AACH,SAAS,wBAAwB,CAC/B,OAAe;IAEf,KAAK,MAAM,OAAO,IAAI,oBAAoB,EAAE,CAAC;QAC3C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACrC,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACpC,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACpC,OAAO,IAAI,GAAG,IAAI;gBAChB,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE;gBAC9B,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;QACnC,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,SAAS,mBAAmB,CAAC,IAAY;IACvC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;IAChD,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAChC,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;GAEG;AACH,SAAS,iBAAiB,CAAC,IAAY;IACrC,IAAI,oBAAoB,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/B,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IACjC,OAAO,oBAAoB,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;AAC7E,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAClC,GAAY;IAEZ,uBAAuB;IACvB,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC5B,IAAI,GAAG,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC;YACpD,OAAO;gBACL,aAAa,EAAE,CAAC;gBAChB,SAAS,EAAE,CAAC;gBACZ,SAAS,EAAE,mBAAmB;gBAC9B,YAAY,EAAE,mBAAmB,CAAC,GAAG,CAAC;aACvC,CAAC;QACJ,CAAC;QACD,IAAI,iBAAiB,CAAC,GAAG,CAAC,EAAE,CAAC;YAC3B,MAAM,MAAM,GAAG,wBAAwB,CAAC,GAAG,CAAC,CAAC;YAC7C,OAAO;gBACL,aAAa,EAAE,MAAM,EAAE,OAAO,IAAI,CAAC;gBACnC,SAAS,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;gBAC3B,SAAS,EAAE,6BAA6B;aACzC,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,2BAA2B;IAC3B,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAEjD,MAAM,MAAM,GAAG,GAA8B,CAAC;IAE9C,iDAAiD;IACjD,MAAM,WAAW,GAAa,EAAE,CAAC;IAEjC,MAAM,OAAO,GAAG,MAAM,CAAC,IAA2C,CAAC;IACnE,MAAM,YAAY,GAAG,OAAO,EAAE,YAAY,CAAC;IAC3C,MAAM,YAAY,GAAG,MAAM,CAAC,OAA6B,CAAC;IAC1D,MAAM,SAAS,GAAG,MAAM,CAAC,KAA4C,CAAC;IACtE,MAAM,WAAW,GAAG,SAAS,EAAE,KAA4C,CAAC;IAE5E,IAAI,OAAO,YAAY,KAAK,QAAQ;QAAE,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACrE,IAAI,OAAO,YAAY,KAAK,QAAQ;QAAE,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACrE,IAAI,OAAO,SAAS,EAAE,OAAO,KAAK,QAAQ;QACxC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,OAAiB,CAAC,CAAC;IAChD,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ;QAAE,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,IAAc,CAAC,CAAC;IAC7E,IAAI,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ;QACpC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,OAAiB,CAAC,CAAC;IAC7C,IAAI,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ;QACnC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,MAAgB,CAAC,CAAC;IAC5C,IAAI,OAAO,MAAM,CAAC,WAAW,KAAK,QAAQ;QACxC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,WAAqB,CAAC,CAAC;IACjD,IAAI,OAAO,WAAW,EAAE,OAAO,KAAK,QAAQ;QAC1C,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,OAAiB,CAAC,CAAC;IAClD,IAAI,OAAO,OAAO,EAAE,OAAO,KAAK,QAAQ;QACtC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,OAAiB,CAAC,CAAC;IAC9C,IAAI,OAAO,OAAO,EAAE,KAAK,KAAK,QAAQ;QACpC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,KAAe,CAAC,CAAC;IAE5C,oDAAoD;IACpD,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;YACvC,IAAI,iBAAiB,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC/B,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,qBAAqB;QACvB,CAAC;IACH,CAAC;IAED,MAAM,YAAY,GAAG,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC3C,IAAI,CAAC,iBAAiB,CAAC,YAAY,CAAC;QAAE,OAAO,IAAI,CAAC;IAElD,wCAAwC;IACxC,IAAI,OAAO,YAAY,KAAK,QAAQ,EAAE,CAAC;QACrC,IAAI,CAAC;YAUH,MAAM,YAAY,GAAG;gBACnB,4BAA4B;gBAC5B,mCAAmC;gBACnC,6BAA6B;aAC9B,CAAC;YAEF,KAAK,MAAM,OAAO,IAAI,YAAY,EAAE,CAAC;gBACnC,MAAM,SAAS,GAAG,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBAC9C,IAAI,SAAS,EAAE,CAAC;oBACd,IAAI,CAAC;wBACH,MAAM,QAAQ,GAAuB,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;wBAC9D,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,EAAE,OAAO,IAAI,EAAE,CAAC;wBAC9C,MAAM,MAAM,GAAG,wBAAwB,CAAC,OAAO,CAAC,CAAC;wBAEjD,IAAI,MAAM,EAAE,CAAC;4BACX,OAAO;gCACL,aAAa,EAAE,MAAM,CAAC,OAAO;gCAC7B,SAAS,EAAE,MAAM,CAAC,GAAG;gCACrB,SAAS,EAAE,QAAQ,CAAC,UAAU;gCAC9B,SAAS,EAAE,QAAQ,CAAC,KAAK,EAAE,IAAI,IAAI,sBAAsB;6BAC1D,CAAC;wBACJ,CAAC;oBACH,CAAC;oBAAC,MAAM,CAAC;wBACP,sBAAsB;oBACxB,CAAC;gBACH,CAAC;YACH,CAAC;YAED,iCAAiC;YACjC,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;YAC7C,IACE,OAAO,WAAW,CAAC,OAAO,KAAK,QAAQ;gBACvC,iBAAiB,CAAC,WAAW,CAAC,OAAO,CAAC,EACtC,CAAC;gBACD,OAAO;oBACL,aAAa,EAAE,CAAC;oBAChB,SAAS,EAAE,CAAC;oBACZ,SAAS,EAAE,wBAAwB;iBACpC,CAAC;YACJ,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,sBAAsB;QACxB,CAAC;IACH,CAAC;IAED,sCAAsC;IACtC,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAG,wBAAwB,CAAC,IAAI,CAAC,CAAC;QAC9C,IAAI,MAAM,EAAE,CAAC;YACX,OAAO;gBACL,aAAa,EAAE,MAAM,CAAC,OAAO;gBAC7B,SAAS,EAAE,MAAM,CAAC,GAAG;gBACrB,SAAS,EAAE,sBAAsB;aAClC,CAAC;QACJ,CAAC;IACH,CAAC;IAED,oCAAoC;IACpC,IAAI,YAAY,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC;QAC7D,OAAO;YACL,aAAa,EAAE,CAAC;YAChB,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE,mBAAmB;YAC9B,YAAY,EAAE,mBAAmB,CAAC,YAAY,CAAC;SAChD,CAAC;IACJ,CAAC;IAED,4BAA4B;IAC5B,IAAI,iBAAiB,CAAC,YAAY,CAAC,EAAE,CAAC;QACpC,OAAO;YACL,aAAa,EAAE,CAAC;YAChB,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE,8BAA8B;SAC1C,CAAC;IACJ,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,uBAAuB,CAAC,IAAY;IAClD,OAAO,iBAAiB,CAAC,IAAI,CAAC,CAAC;AACjC,CAAC;AAED,iCAAiC;AACjC,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,6BAA6B,GAC9B,CAAC"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Context Window Limit Recovery Types
|
|
3
|
+
*
|
|
4
|
+
* Type definitions for detecting and recovering from context window limit errors.
|
|
5
|
+
*
|
|
6
|
+
* Adapted from oh-my-opencode's anthropic-context-window-limit-recovery hook.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Parsed token limit error information
|
|
10
|
+
*/
|
|
11
|
+
export interface ParsedTokenLimitError {
|
|
12
|
+
/** Current number of tokens in the conversation */
|
|
13
|
+
currentTokens: number;
|
|
14
|
+
/** Maximum allowed tokens */
|
|
15
|
+
maxTokens: number;
|
|
16
|
+
/** Request ID from the API response */
|
|
17
|
+
requestId?: string;
|
|
18
|
+
/** Type of error detected */
|
|
19
|
+
errorType: string;
|
|
20
|
+
/** Provider ID (e.g., 'anthropic') */
|
|
21
|
+
providerID?: string;
|
|
22
|
+
/** Model ID (e.g., 'claude-3-opus-20240229') */
|
|
23
|
+
modelID?: string;
|
|
24
|
+
/** Index of the problematic message */
|
|
25
|
+
messageIndex?: number;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Retry state for recovery attempts
|
|
29
|
+
*/
|
|
30
|
+
export interface RetryState {
|
|
31
|
+
/** Number of retry attempts made */
|
|
32
|
+
attempt: number;
|
|
33
|
+
/** Timestamp of last retry attempt */
|
|
34
|
+
lastAttemptTime: number;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Truncation state for progressive truncation
|
|
38
|
+
*/
|
|
39
|
+
export interface TruncateState {
|
|
40
|
+
/** Number of truncation attempts made */
|
|
41
|
+
truncateAttempt: number;
|
|
42
|
+
/** ID of the last truncated part */
|
|
43
|
+
lastTruncatedPartId?: string;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Recovery result
|
|
47
|
+
*/
|
|
48
|
+
export interface RecoveryResult {
|
|
49
|
+
/** Whether recovery was attempted */
|
|
50
|
+
attempted: boolean;
|
|
51
|
+
/** Whether recovery was successful */
|
|
52
|
+
success: boolean;
|
|
53
|
+
/** Recovery message to inject */
|
|
54
|
+
message?: string;
|
|
55
|
+
/** Error type detected */
|
|
56
|
+
errorType?: string;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Configuration for retry behavior
|
|
60
|
+
*/
|
|
61
|
+
export declare const RETRY_CONFIG: {
|
|
62
|
+
/** Maximum retry attempts */
|
|
63
|
+
readonly maxAttempts: 2;
|
|
64
|
+
/** Initial delay between retries in ms */
|
|
65
|
+
readonly initialDelayMs: 2000;
|
|
66
|
+
/** Backoff factor for exponential backoff */
|
|
67
|
+
readonly backoffFactor: 2;
|
|
68
|
+
/** Maximum delay between retries in ms */
|
|
69
|
+
readonly maxDelayMs: 30000;
|
|
70
|
+
};
|
|
71
|
+
/**
|
|
72
|
+
* Configuration for truncation behavior
|
|
73
|
+
*/
|
|
74
|
+
export declare const TRUNCATE_CONFIG: {
|
|
75
|
+
/** Maximum truncation attempts */
|
|
76
|
+
readonly maxTruncateAttempts: 20;
|
|
77
|
+
/** Minimum output size (chars) to attempt truncation */
|
|
78
|
+
readonly minOutputSizeToTruncate: 500;
|
|
79
|
+
/** Target token ratio after truncation */
|
|
80
|
+
readonly targetTokenRatio: 0.5;
|
|
81
|
+
/** Average characters per token estimate */
|
|
82
|
+
readonly charsPerToken: 4;
|
|
83
|
+
};
|
|
84
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/hooks/context-window-limit-recovery/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,mDAAmD;IACnD,aAAa,EAAE,MAAM,CAAC;IACtB,6BAA6B;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,uCAAuC;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6BAA6B;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,sCAAsC;IACtC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gDAAgD;IAChD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uCAAuC;IACvC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,oCAAoC;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,sCAAsC;IACtC,eAAe,EAAE,MAAM,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,yCAAyC;IACzC,eAAe,EAAE,MAAM,CAAC;IACxB,oCAAoC;IACpC,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,qCAAqC;IACrC,SAAS,EAAE,OAAO,CAAC;IACnB,sCAAsC;IACtC,OAAO,EAAE,OAAO,CAAC;IACjB,iCAAiC;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,0BAA0B;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,eAAO,MAAM,YAAY;IACvB,6BAA6B;;IAE7B,0CAA0C;;IAE1C,6CAA6C;;IAE7C,0CAA0C;;CAElC,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,eAAe;IAC1B,kCAAkC;;IAElC,wDAAwD;;IAExD,0CAA0C;;IAE1C,4CAA4C;;CAEpC,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Context Window Limit Recovery Types
|
|
3
|
+
*
|
|
4
|
+
* Type definitions for detecting and recovering from context window limit errors.
|
|
5
|
+
*
|
|
6
|
+
* Adapted from oh-my-opencode's anthropic-context-window-limit-recovery hook.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Configuration for retry behavior
|
|
10
|
+
*/
|
|
11
|
+
export const RETRY_CONFIG = {
|
|
12
|
+
/** Maximum retry attempts */
|
|
13
|
+
maxAttempts: 2,
|
|
14
|
+
/** Initial delay between retries in ms */
|
|
15
|
+
initialDelayMs: 2000,
|
|
16
|
+
/** Backoff factor for exponential backoff */
|
|
17
|
+
backoffFactor: 2,
|
|
18
|
+
/** Maximum delay between retries in ms */
|
|
19
|
+
maxDelayMs: 30000,
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* Configuration for truncation behavior
|
|
23
|
+
*/
|
|
24
|
+
export const TRUNCATE_CONFIG = {
|
|
25
|
+
/** Maximum truncation attempts */
|
|
26
|
+
maxTruncateAttempts: 20,
|
|
27
|
+
/** Minimum output size (chars) to attempt truncation */
|
|
28
|
+
minOutputSizeToTruncate: 500,
|
|
29
|
+
/** Target token ratio after truncation */
|
|
30
|
+
targetTokenRatio: 0.5,
|
|
31
|
+
/** Average characters per token estimate */
|
|
32
|
+
charsPerToken: 4,
|
|
33
|
+
};
|
|
34
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/hooks/context-window-limit-recovery/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAwDH;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,6BAA6B;IAC7B,WAAW,EAAE,CAAC;IACd,0CAA0C;IAC1C,cAAc,EAAE,IAAI;IACpB,6CAA6C;IAC7C,aAAa,EAAE,CAAC;IAChB,0CAA0C;IAC1C,UAAU,EAAE,KAAK;CACT,CAAC;AAEX;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,kCAAkC;IAClC,mBAAmB,EAAE,EAAE;IACvB,wDAAwD;IACxD,uBAAuB,EAAE,GAAG;IAC5B,0CAA0C;IAC1C,gBAAgB,EAAE,GAAG;IACrB,4CAA4C;IAC5C,aAAa,EAAE,CAAC;CACR,CAAC"}
|