fix(hooks): add network errors to noRetryPatterns, update E2E test

- Add ENOTFOUND, ENETUNREACH, EAI_AGAIN to noRetryPatterns to prevent
  infinite retries on network errors
- Update E2E test to expect exit code 2 (block) when CLIProxy unavailable
- Fix debug message expectation in test
This commit is contained in:
kaitranntt
2026-02-04 00:59:10 -05:00
parent 51b719ef34
commit 1201b4bb4b
2 changed files with 15 additions and 7 deletions
+6 -2
View File
@@ -215,9 +215,13 @@ async function analyzeWithRetry(base64Data, mediaType, timeoutMs) {
lastError = err;
const isLastModel = i === models.length - 1;
// Don't retry on certain errors (auth, rate limit, timeout, file access)
// Don't retry on certain errors (auth, rate limit, timeout, file access, network)
const errMsg = err.message || '';
const noRetryPatterns = ['AUTH_ERROR', 'RATE_LIMIT', 'TIMEOUT', 'EACCES', 'EPERM', 'ECONNREFUSED'];
const noRetryPatterns = [
'AUTH_ERROR', 'RATE_LIMIT', 'TIMEOUT',
'EACCES', 'EPERM', 'ECONNREFUSED',
'ENOTFOUND', 'ENETUNREACH', 'EAI_AGAIN' // Network errors - no point retrying
];
const shouldNotRetry = noRetryPatterns.some(p => errMsg.includes(p));
if (shouldNotRetry || isLastModel) {
+9 -5
View File
@@ -468,7 +468,7 @@ describe('Image Analyzer Hook', () => {
resetMockState();
});
it('should pass through when CLIProxy is unavailable', async () => {
it('should block when CLIProxy is unavailable to prevent context overflow', async () => {
// Force hook to use a port that's definitely not running
const result = invokeHook(
{
@@ -483,9 +483,13 @@ describe('Image Analyzer Hook', () => {
}
);
// Should pass through (exit 0) when CLIProxy not available
expect(result.code).toBe(0);
expect(result.stderr).toContain('CLIProxy not available');
// Should block (exit 2) when CLIProxy not available to prevent context overflow
expect(result.code).toBe(2);
const output = JSON.parse(result.stdout);
expect(output.decision).toBe('block');
expect(output.hookSpecificOutput.permissionDecisionReason).toContain(
'CLIProxy unavailable'
);
});
it('should analyze PNG via mock CLIProxy and return analysis', () => {
@@ -634,7 +638,7 @@ describe('Image Analyzer Hook', () => {
// Should output debug info to stderr
expect(result.stderr).toContain('[CCS Hook]');
expect(result.stderr).toContain('Analyzing');
expect(result.stderr).toContain('Starting image analysis');
});
it('should handle API error response gracefully (pass through)', () => {