') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); })(); feat(code-mode): replace Self with QuickJS by Astro-Han · Pull Request #2549 · apache/maka · GitHub
Skip to content

feat(code-mode): replace Self with QuickJS - #2549

Merged
Astro-Han merged 6 commits into
mainfrom
feat/code-mode-quickjs-executor
Aug 9, 2026
Merged

feat(code-mode): replace Self with QuickJS#2549
Astro-Han merged 6 commits into
mainfrom
feat/code-mode-quickjs-executor

Conversation

@Astro-Han

@Astro-HanAstro-Han commented Aug 9, 2026

Copy link
Copy Markdown
Contributor

Summary

Replace the hand-written Self interpreter with @ai-sdk/code-mode and its QuickJS sandbox.

  • keep one public executeCodeCell path and one process-wide worker
  • serialize cells through a cancelable single-slot FIFO queue while preserving nested tool concurrency inside a cell
  • replace interpreter-specific limits with enforceable timeout, memory, stack, source, bridge, and JSON byte limits
  • remove the old interpreter plus its Acorn and direct TypeScript dependencies
  • align the AI SDK provider family and include the embedded QuickJS licenses in desktop notices

This reduces the production execution core from a 2,429-line custom interpreter to a 127-line adapter and delegates JavaScript/TypeScript semantics and sandbox maintenance to the upstream library.

Verification

  • npm ci
  • npm run test --workspace @maka/code-mode — 31 tests passed
  • npm run build --workspace @maka/core
  • npm run build --workspace @maka/runtime
  • node --test packages/runtime/dist/__tests__/code-mode-backend.test.js — 20 tests passed
  • npm run check:third-party-notices
  • Biome format check for all changed TypeScript files
  • git diff --check main...HEAD

Repository-wide tests were not run locally; CI owns full coverage.

Adversarial review

Four deep reviews covered architecture, concurrency/lifecycle, resource security, and test/dependency maintenance. Findings addressed in this draft:

  • fatal durable failures now abort the invocation, block later dispatch, drain concurrent siblings, and preserve the first failure
  • tool lookup uses a null-prototype set so inherited properties cannot become untracked host tools
  • explicit undefined limit overrides retain Maka's stricter defaults
  • error classification uses structured upstream codes and distinguishes byte limits from serialization/tool failures
  • the sandbox deadline is named honestly; aborted host operations still drain before the cell and FIFO slot settle
  • embedded QuickJS license inventory fails closed for every unreviewed @ai-sdk/code-mode version
  • redundant and brittle tests were removed or rewritten; concurrency tests use deterministic barriers

Remaining upstream constraints: @ai-sdk/code-mode emits Node's one-time stripTypeScriptTypes experimental warning, and its tools proxy reserves the exact property name then (no current production tool uses it).

Checklist

  • Tests cover the change and fail without it
  • Lint, format, typecheck and the affected suites pass locally

Does this PR entail a change in behavior?

  • Yes — described under Summary above
  • No

@Astro-Han
Astro-Hanforce-pushed the feat/code-mode-quickjs-executor branch from 1bbca29 to e2ad461CompareAugust 9, 2026 06:05
@Astro-Han
Astro-Han marked this pull request as ready for review August 9, 2026 06:30
@Astro-Han
Astro-Han merged commit d662a09 into mainAug 9, 2026
14 checks passed
@Astro-Han
Astro-Han deleted the feat/code-mode-quickjs-executor branch August 9, 2026 06:31
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.

1 participant

@Astro-Han