fix(api): recover the original result on a retried approval decision - #110

Merged
AmitAvital1 merged 3 commits into
extra-org:mainfrom
Rsakhuja:feat/http-approval-recovery
Aug 22, 2026
Merged

fix(api): recover the original result on a retried approval decision#110
AmitAvital1 merged 3 commits into
extra-org:mainfrom
Rsakhuja:feat/http-approval-recovery

Conversation

@Rsakhuja

@RsakhujaRsakhuja commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

Fixes#109
Catches ApprovalAlreadyProcessed exception and recovers the original result in order to avoid returning a 409 error when a duplicate request is made.

@Asaf-prog

Copy link
Copy Markdown
Collaborator

Thanks for the fix — the overall approach looks correct, and recovering the already-processed result is consistent with the existing agent_manager behavior.

One issue I think we should address before merging:

If engine.get_processed_result() raises an unexpected exception that is not an ApprovalError (for example, a checkpointer/database/runtime failure), it will not be caught by the outer except Exception block, because it is raised from inside the except ApprovalAlreadyProcessed handler.

That means the recovery path currently bypasses the API's existing error sanitization behavior.

I suggest adding an except Exception around get_processed_result() that logs the failure and returns the standard sanitized 500 Internal server error.

It would also be good to add a test where get_processed_result() raises something like RuntimeError("private recovery failure") and verify that:

  • the response is 500
  • the response only contains Internal server error
  • the internal exception message is not exposed to the client

Other than that, the change looks good to me.

@Rsakhuja

Copy link
Copy Markdown
ContributorAuthor

Thanks for the fix — the overall approach looks correct, and recovering the already-processed result is consistent with the existing agent_manager behavior.

One issue I think we should address before merging:

If engine.get_processed_result() raises an unexpected exception that is not an ApprovalError (for example, a checkpointer/database/runtime failure), it will not be caught by the outer except Exception block, because it is raised from inside the except ApprovalAlreadyProcessed handler.

That means the recovery path currently bypasses the API's existing error sanitization behavior.

I suggest adding an except Exception around get_processed_result() that logs the failure and returns the standard sanitized 500 Internal server error.

It would also be good to add a test where get_processed_result() raises something like RuntimeError("private recovery failure") and verify that:

  • the response is 500
  • the response only contains Internal server error
  • the internal exception message is not exposed to the client

Other than that, the change looks good to me.

Hi. That makes sense. I updated the PR to include the except Exception and the additional test.

@AmitAvital1
AmitAvital1 merged commit 0078ca1 into extra-org:mainAug 22, 2026
2 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

HTTP API doesn't recover from duplicate approval decision

3 participants

@Rsakhuja@Asaf-prog@AmitAvital1
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

fix(api): recover the original result on a retried approval decision - #110

Merged
AmitAvital1 merged 3 commits into
extra-org:mainfrom
Rsakhuja:feat/http-approval-recovery
Aug 22, 2026
Merged

fix(api): recover the original result on a retried approval decision#110
AmitAvital1 merged 3 commits into
extra-org:mainfrom
Rsakhuja:feat/http-approval-recovery

Conversation

@Rsakhuja

@RsakhujaRsakhuja commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

Fixes#109
Catches ApprovalAlreadyProcessed exception and recovers the original result in order to avoid returning a 409 error when a duplicate request is made.

@Asaf-prog

Copy link
Copy Markdown
Collaborator

Thanks for the fix — the overall approach looks correct, and recovering the already-processed result is consistent with the existing agent_manager behavior.

One issue I think we should address before merging:

If engine.get_processed_result() raises an unexpected exception that is not an ApprovalError (for example, a checkpointer/database/runtime failure), it will not be caught by the outer except Exception block, because it is raised from inside the except ApprovalAlreadyProcessed handler.

That means the recovery path currently bypasses the API's existing error sanitization behavior.

I suggest adding an except Exception around get_processed_result() that logs the failure and returns the standard sanitized 500 Internal server error.

It would also be good to add a test where get_processed_result() raises something like RuntimeError("private recovery failure") and verify that:

  • the response is 500
  • the response only contains Internal server error
  • the internal exception message is not exposed to the client

Other than that, the change looks good to me.

@Rsakhuja

Copy link
Copy Markdown
ContributorAuthor

Thanks for the fix — the overall approach looks correct, and recovering the already-processed result is consistent with the existing agent_manager behavior.

One issue I think we should address before merging:

If engine.get_processed_result() raises an unexpected exception that is not an ApprovalError (for example, a checkpointer/database/runtime failure), it will not be caught by the outer except Exception block, because it is raised from inside the except ApprovalAlreadyProcessed handler.

That means the recovery path currently bypasses the API's existing error sanitization behavior.

I suggest adding an except Exception around get_processed_result() that logs the failure and returns the standard sanitized 500 Internal server error.

It would also be good to add a test where get_processed_result() raises something like RuntimeError("private recovery failure") and verify that:

  • the response is 500
  • the response only contains Internal server error
  • the internal exception message is not exposed to the client

Other than that, the change looks good to me.

Hi. That makes sense. I updated the PR to include the except Exception and the additional test.

@AmitAvital1
AmitAvital1 merged commit 0078ca1 into extra-org:mainAug 22, 2026
2 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

HTTP API doesn't recover from duplicate approval decision

3 participants

@Rsakhuja@Asaf-prog@AmitAvital1
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(api): recover the original result on a retried approval decision - #110

Merged
AmitAvital1 merged 3 commits into
extra-org:mainfrom
Rsakhuja:feat/http-approval-recovery
Aug 22, 2026
Merged

fix(api): recover the original result on a retried approval decision#110
AmitAvital1 merged 3 commits into
extra-org:mainfrom
Rsakhuja:feat/http-approval-recovery

Conversation

@Rsakhuja

@RsakhujaRsakhuja commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

Fixes#109
Catches ApprovalAlreadyProcessed exception and recovers the original result in order to avoid returning a 409 error when a duplicate request is made.

@Asaf-prog

Copy link
Copy Markdown
Collaborator

Thanks for the fix — the overall approach looks correct, and recovering the already-processed result is consistent with the existing agent_manager behavior.

One issue I think we should address before merging:

If engine.get_processed_result() raises an unexpected exception that is not an ApprovalError (for example, a checkpointer/database/runtime failure), it will not be caught by the outer except Exception block, because it is raised from inside the except ApprovalAlreadyProcessed handler.

That means the recovery path currently bypasses the API's existing error sanitization behavior.

I suggest adding an except Exception around get_processed_result() that logs the failure and returns the standard sanitized 500 Internal server error.

It would also be good to add a test where get_processed_result() raises something like RuntimeError("private recovery failure") and verify that:

  • the response is 500
  • the response only contains Internal server error
  • the internal exception message is not exposed to the client

Other than that, the change looks good to me.

@Rsakhuja

Copy link
Copy Markdown
ContributorAuthor

Thanks for the fix — the overall approach looks correct, and recovering the already-processed result is consistent with the existing agent_manager behavior.

One issue I think we should address before merging:

If engine.get_processed_result() raises an unexpected exception that is not an ApprovalError (for example, a checkpointer/database/runtime failure), it will not be caught by the outer except Exception block, because it is raised from inside the except ApprovalAlreadyProcessed handler.

That means the recovery path currently bypasses the API's existing error sanitization behavior.

I suggest adding an except Exception around get_processed_result() that logs the failure and returns the standard sanitized 500 Internal server error.

It would also be good to add a test where get_processed_result() raises something like RuntimeError("private recovery failure") and verify that:

  • the response is 500
  • the response only contains Internal server error
  • the internal exception message is not exposed to the client

Other than that, the change looks good to me.

Hi. That makes sense. I updated the PR to include the except Exception and the additional test.

@AmitAvital1
AmitAvital1 merged commit 0078ca1 into extra-org:mainAug 22, 2026
2 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

HTTP API doesn't recover from duplicate approval decision

3 participants

@Rsakhuja@Asaf-prog@AmitAvital1
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(api): recover the original result on a retried approval decision - #110

Merged
AmitAvital1 merged 3 commits into
extra-org:mainfrom
Rsakhuja:feat/http-approval-recovery
Aug 22, 2026
Merged

fix(api): recover the original result on a retried approval decision#110
AmitAvital1 merged 3 commits into
extra-org:mainfrom
Rsakhuja:feat/http-approval-recovery

Conversation

@Rsakhuja

@RsakhujaRsakhuja commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

Fixes#109
Catches ApprovalAlreadyProcessed exception and recovers the original result in order to avoid returning a 409 error when a duplicate request is made.

@Asaf-prog

Copy link
Copy Markdown
Collaborator

Thanks for the fix — the overall approach looks correct, and recovering the already-processed result is consistent with the existing agent_manager behavior.

One issue I think we should address before merging:

If engine.get_processed_result() raises an unexpected exception that is not an ApprovalError (for example, a checkpointer/database/runtime failure), it will not be caught by the outer except Exception block, because it is raised from inside the except ApprovalAlreadyProcessed handler.

That means the recovery path currently bypasses the API's existing error sanitization behavior.

I suggest adding an except Exception around get_processed_result() that logs the failure and returns the standard sanitized 500 Internal server error.

It would also be good to add a test where get_processed_result() raises something like RuntimeError("private recovery failure") and verify that:

  • the response is 500
  • the response only contains Internal server error
  • the internal exception message is not exposed to the client

Other than that, the change looks good to me.

@Rsakhuja

Copy link
Copy Markdown
ContributorAuthor

Thanks for the fix — the overall approach looks correct, and recovering the already-processed result is consistent with the existing agent_manager behavior.

One issue I think we should address before merging:

If engine.get_processed_result() raises an unexpected exception that is not an ApprovalError (for example, a checkpointer/database/runtime failure), it will not be caught by the outer except Exception block, because it is raised from inside the except ApprovalAlreadyProcessed handler.

That means the recovery path currently bypasses the API's existing error sanitization behavior.

I suggest adding an except Exception around get_processed_result() that logs the failure and returns the standard sanitized 500 Internal server error.

It would also be good to add a test where get_processed_result() raises something like RuntimeError("private recovery failure") and verify that:

  • the response is 500
  • the response only contains Internal server error
  • the internal exception message is not exposed to the client

Other than that, the change looks good to me.

Hi. That makes sense. I updated the PR to include the except Exception and the additional test.

@AmitAvital1
AmitAvital1 merged commit 0078ca1 into extra-org:mainAug 22, 2026
2 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

HTTP API doesn't recover from duplicate approval decision

3 participants

@Rsakhuja@Asaf-prog@AmitAvital1
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

fix(api): recover the original result on a retried approval decision - #110

Merged
AmitAvital1 merged 3 commits into
extra-org:mainfrom
Rsakhuja:feat/http-approval-recovery
Aug 22, 2026
Merged

fix(api): recover the original result on a retried approval decision#110
AmitAvital1 merged 3 commits into
extra-org:mainfrom
Rsakhuja:feat/http-approval-recovery

Conversation

@Rsakhuja

@RsakhujaRsakhuja commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

Fixes#109
Catches ApprovalAlreadyProcessed exception and recovers the original result in order to avoid returning a 409 error when a duplicate request is made.

@Asaf-prog

Copy link
Copy Markdown
Collaborator

Thanks for the fix — the overall approach looks correct, and recovering the already-processed result is consistent with the existing agent_manager behavior.

One issue I think we should address before merging:

If engine.get_processed_result() raises an unexpected exception that is not an ApprovalError (for example, a checkpointer/database/runtime failure), it will not be caught by the outer except Exception block, because it is raised from inside the except ApprovalAlreadyProcessed handler.

That means the recovery path currently bypasses the API's existing error sanitization behavior.

I suggest adding an except Exception around get_processed_result() that logs the failure and returns the standard sanitized 500 Internal server error.

It would also be good to add a test where get_processed_result() raises something like RuntimeError("private recovery failure") and verify that:

  • the response is 500
  • the response only contains Internal server error
  • the internal exception message is not exposed to the client

Other than that, the change looks good to me.

@Rsakhuja

Copy link
Copy Markdown
ContributorAuthor

Thanks for the fix — the overall approach looks correct, and recovering the already-processed result is consistent with the existing agent_manager behavior.

One issue I think we should address before merging:

If engine.get_processed_result() raises an unexpected exception that is not an ApprovalError (for example, a checkpointer/database/runtime failure), it will not be caught by the outer except Exception block, because it is raised from inside the except ApprovalAlreadyProcessed handler.

That means the recovery path currently bypasses the API's existing error sanitization behavior.

I suggest adding an except Exception around get_processed_result() that logs the failure and returns the standard sanitized 500 Internal server error.

It would also be good to add a test where get_processed_result() raises something like RuntimeError("private recovery failure") and verify that:

  • the response is 500
  • the response only contains Internal server error
  • the internal exception message is not exposed to the client

Other than that, the change looks good to me.

Hi. That makes sense. I updated the PR to include the except Exception and the additional test.

@AmitAvital1
AmitAvital1 merged commit 0078ca1 into extra-org:mainAug 22, 2026
2 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

HTTP API doesn't recover from duplicate approval decision

3 participants

@Rsakhuja@Asaf-prog@AmitAvital1
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(api): recover the original result on a retried approval decision - #110

Merged
AmitAvital1 merged 3 commits into
extra-org:mainfrom
Rsakhuja:feat/http-approval-recovery
Aug 22, 2026
Merged

fix(api): recover the original result on a retried approval decision#110
AmitAvital1 merged 3 commits into
extra-org:mainfrom
Rsakhuja:feat/http-approval-recovery

Conversation

@Rsakhuja

@RsakhujaRsakhuja commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

Fixes#109
Catches ApprovalAlreadyProcessed exception and recovers the original result in order to avoid returning a 409 error when a duplicate request is made.

@Asaf-prog

Copy link
Copy Markdown
Collaborator

Thanks for the fix — the overall approach looks correct, and recovering the already-processed result is consistent with the existing agent_manager behavior.

One issue I think we should address before merging:

If engine.get_processed_result() raises an unexpected exception that is not an ApprovalError (for example, a checkpointer/database/runtime failure), it will not be caught by the outer except Exception block, because it is raised from inside the except ApprovalAlreadyProcessed handler.

That means the recovery path currently bypasses the API's existing error sanitization behavior.

I suggest adding an except Exception around get_processed_result() that logs the failure and returns the standard sanitized 500 Internal server error.

It would also be good to add a test where get_processed_result() raises something like RuntimeError("private recovery failure") and verify that:

  • the response is 500
  • the response only contains Internal server error
  • the internal exception message is not exposed to the client

Other than that, the change looks good to me.

@Rsakhuja

Copy link
Copy Markdown
ContributorAuthor

Thanks for the fix — the overall approach looks correct, and recovering the already-processed result is consistent with the existing agent_manager behavior.

One issue I think we should address before merging:

If engine.get_processed_result() raises an unexpected exception that is not an ApprovalError (for example, a checkpointer/database/runtime failure), it will not be caught by the outer except Exception block, because it is raised from inside the except ApprovalAlreadyProcessed handler.

That means the recovery path currently bypasses the API's existing error sanitization behavior.

I suggest adding an except Exception around get_processed_result() that logs the failure and returns the standard sanitized 500 Internal server error.

It would also be good to add a test where get_processed_result() raises something like RuntimeError("private recovery failure") and verify that:

  • the response is 500
  • the response only contains Internal server error
  • the internal exception message is not exposed to the client

Other than that, the change looks good to me.

Hi. That makes sense. I updated the PR to include the except Exception and the additional test.

@AmitAvital1
AmitAvital1 merged commit 0078ca1 into extra-org:mainAug 22, 2026
2 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

HTTP API doesn't recover from duplicate approval decision

3 participants

@Rsakhuja@Asaf-prog@AmitAvital1
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(api): recover the original result on a retried approval decision - #110

Merged
AmitAvital1 merged 3 commits into
extra-org:mainfrom
Rsakhuja:feat/http-approval-recovery
Aug 22, 2026
Merged

fix(api): recover the original result on a retried approval decision#110
AmitAvital1 merged 3 commits into
extra-org:mainfrom
Rsakhuja:feat/http-approval-recovery

Conversation

@Rsakhuja

@RsakhujaRsakhuja commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

Fixes#109
Catches ApprovalAlreadyProcessed exception and recovers the original result in order to avoid returning a 409 error when a duplicate request is made.

@Asaf-prog

Copy link
Copy Markdown
Collaborator

Thanks for the fix — the overall approach looks correct, and recovering the already-processed result is consistent with the existing agent_manager behavior.

One issue I think we should address before merging:

If engine.get_processed_result() raises an unexpected exception that is not an ApprovalError (for example, a checkpointer/database/runtime failure), it will not be caught by the outer except Exception block, because it is raised from inside the except ApprovalAlreadyProcessed handler.

That means the recovery path currently bypasses the API's existing error sanitization behavior.

I suggest adding an except Exception around get_processed_result() that logs the failure and returns the standard sanitized 500 Internal server error.

It would also be good to add a test where get_processed_result() raises something like RuntimeError("private recovery failure") and verify that:

  • the response is 500
  • the response only contains Internal server error
  • the internal exception message is not exposed to the client

Other than that, the change looks good to me.

@Rsakhuja

Copy link
Copy Markdown
ContributorAuthor

Thanks for the fix — the overall approach looks correct, and recovering the already-processed result is consistent with the existing agent_manager behavior.

One issue I think we should address before merging:

If engine.get_processed_result() raises an unexpected exception that is not an ApprovalError (for example, a checkpointer/database/runtime failure), it will not be caught by the outer except Exception block, because it is raised from inside the except ApprovalAlreadyProcessed handler.

That means the recovery path currently bypasses the API's existing error sanitization behavior.

I suggest adding an except Exception around get_processed_result() that logs the failure and returns the standard sanitized 500 Internal server error.

It would also be good to add a test where get_processed_result() raises something like RuntimeError("private recovery failure") and verify that:

  • the response is 500
  • the response only contains Internal server error
  • the internal exception message is not exposed to the client

Other than that, the change looks good to me.

Hi. That makes sense. I updated the PR to include the except Exception and the additional test.

@AmitAvital1
AmitAvital1 merged commit 0078ca1 into extra-org:mainAug 22, 2026
2 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

HTTP API doesn't recover from duplicate approval decision

3 participants

@Rsakhuja@Asaf-prog@AmitAvital1
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

fix(api): recover the original result on a retried approval decision - #110

Merged
AmitAvital1 merged 3 commits into
extra-org:mainfrom
Rsakhuja:feat/http-approval-recovery
Aug 22, 2026
Merged

fix(api): recover the original result on a retried approval decision#110
AmitAvital1 merged 3 commits into
extra-org:mainfrom
Rsakhuja:feat/http-approval-recovery

Conversation

@Rsakhuja

@RsakhujaRsakhuja commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

Fixes#109
Catches ApprovalAlreadyProcessed exception and recovers the original result in order to avoid returning a 409 error when a duplicate request is made.

@Asaf-prog

Copy link
Copy Markdown
Collaborator

Thanks for the fix — the overall approach looks correct, and recovering the already-processed result is consistent with the existing agent_manager behavior.

One issue I think we should address before merging:

If engine.get_processed_result() raises an unexpected exception that is not an ApprovalError (for example, a checkpointer/database/runtime failure), it will not be caught by the outer except Exception block, because it is raised from inside the except ApprovalAlreadyProcessed handler.

That means the recovery path currently bypasses the API's existing error sanitization behavior.

I suggest adding an except Exception around get_processed_result() that logs the failure and returns the standard sanitized 500 Internal server error.

It would also be good to add a test where get_processed_result() raises something like RuntimeError("private recovery failure") and verify that:

  • the response is 500
  • the response only contains Internal server error
  • the internal exception message is not exposed to the client

Other than that, the change looks good to me.

@Rsakhuja

Copy link
Copy Markdown
ContributorAuthor

Thanks for the fix — the overall approach looks correct, and recovering the already-processed result is consistent with the existing agent_manager behavior.

One issue I think we should address before merging:

If engine.get_processed_result() raises an unexpected exception that is not an ApprovalError (for example, a checkpointer/database/runtime failure), it will not be caught by the outer except Exception block, because it is raised from inside the except ApprovalAlreadyProcessed handler.

That means the recovery path currently bypasses the API's existing error sanitization behavior.

I suggest adding an except Exception around get_processed_result() that logs the failure and returns the standard sanitized 500 Internal server error.

It would also be good to add a test where get_processed_result() raises something like RuntimeError("private recovery failure") and verify that:

  • the response is 500
  • the response only contains Internal server error
  • the internal exception message is not exposed to the client

Other than that, the change looks good to me.

Hi. That makes sense. I updated the PR to include the except Exception and the additional test.

@AmitAvital1
AmitAvital1 merged commit 0078ca1 into extra-org:mainAug 22, 2026
2 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

HTTP API doesn't recover from duplicate approval decision

3 participants

@Rsakhuja@Asaf-prog@AmitAvital1