feat(runtime): add FormatJson builtin tool - #603

Closed
luojiyin1987 wants to merge 5 commits into
apache:mainfrom
luojiyin1987:feat/formatjson-builtin-tool
Closed

feat(runtime): add FormatJson builtin tool#603
luojiyin1987 wants to merge 5 commits into
apache:mainfrom
luojiyin1987:feat/formatjson-builtin-tool

Conversation

@luojiyin1987

Copy link
Copy Markdown
Contributor

Summary

Closes#602

Adds FormatJson builtin tool — see issue #602 for full design.

Changes

  • packages/runtime/src/builtin-tools.ts: +39 lines (FormatJson tool definition + sortKeysDeep helper)
  • packages/runtime/src/__tests__/builtin-tools.test.ts: +69 lines (7 test cases)

Verification

  • Runtime tests: 34/34 pass after rebase onto upstream/main
  • No pre-existing tests broken
  • Pure function tool — no permission required, no fs side effects

Notes

  • Rebased onto upstream/main before opening this PR
  • The __proto__ preservation behavior is documented in the test
  • sortKeysDeep uses Object.fromEntries to avoid the __proto__ setter prototype pollution risk

@luojiyin1987

Copy link
Copy Markdown
ContributorAuthor

CI Status Note

The failing typecheck job (https://github.com/maka-agent/maka-agent/actions/runs/28851164752/job/85566577387) is not caused by this PR. It is a pre-existing failure on upstream/main where the CapabilityAuditStrip component was simplified (designer-audit round 4) and dropped its focus prop, but the Storybook stories were not updated to match.

Verification

  • I rebased this PR onto upstream/main (d229afe8) and re-ran tsc -p tsconfig.storybook.json --noEmit against the rebased branch — the storybook typecheck was the only blocker introduced by rebase.
  • The e2e and test jobs both pass (2143/2143 tests pass, 378/378 suites).
  • The typecheck failure on the original PR feat(runtime): add FormatJson builtin tool #603 is identical to what upstream/main produces on a clean checkout (verified locally).

Fix

I opened #608 which removes the stale focus prop from the four CapabilityAuditStrip usages in the Storybook stories. Once that is merged into main, this PR should rebase cleanly and turn green.

If the maintainers prefer a different fix (e.g. re-adding the focus prop to the component), I am happy to adjust the scope. Either way, the typecheck failure in #603 is not introduced by this PR — it is pre-existing.

@jackwener

Copy link
Copy Markdown
Member

Thanks — the implementation itself is clean (the proto preservation test and recursive sort coverage are genuinely good). Closing on first-principles grounds rather than code quality:

The tool's economics don't work as a string→string function.content is a required string parameter, so the model must emit the entire JSON payload into the tool call before getting it back reformatted — that's ~2× the tokens of the model simply writing the formatted JSON directly, which any current model does reliably. There's no size threshold where this wins: bigger payloads make the round-trip cost worse, not better.

The capability already exists in-session. For on-disk JSON the agent uses Bash (jq ., python3 -m json.tool) without round-tripping content through the prompt; for in-context JSON it just… writes formatted JSON.

Every builtin has a standing cost — a slot in every session's tool list that all prompts pay for and the model must consider. That budget should go to tools that unlock something the model can't do: side effects, host access, privileged data.

A version of this that WOULD carry its weight: FormatJson({ path, sort_keys }) that validates/normalizes a JSON file in place and returns only a diagnostic (valid/error + byte delta) — no content round-trip, useful for config hygiene after Write. If you want to pursue that, happy to review it in a fresh PR against #602.

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.

feat(runtime): add FormatJson builtin tool

2 participants

@luojiyin1987@jackwener
, '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

feat(runtime): add FormatJson builtin tool - #603

Closed
luojiyin1987 wants to merge 5 commits into
apache:mainfrom
luojiyin1987:feat/formatjson-builtin-tool
Closed

feat(runtime): add FormatJson builtin tool#603
luojiyin1987 wants to merge 5 commits into
apache:mainfrom
luojiyin1987:feat/formatjson-builtin-tool

Conversation

@luojiyin1987

Copy link
Copy Markdown
Contributor

Summary

Closes#602

Adds FormatJson builtin tool — see issue #602 for full design.

Changes

  • packages/runtime/src/builtin-tools.ts: +39 lines (FormatJson tool definition + sortKeysDeep helper)
  • packages/runtime/src/__tests__/builtin-tools.test.ts: +69 lines (7 test cases)

Verification

  • Runtime tests: 34/34 pass after rebase onto upstream/main
  • No pre-existing tests broken
  • Pure function tool — no permission required, no fs side effects

Notes

  • Rebased onto upstream/main before opening this PR
  • The __proto__ preservation behavior is documented in the test
  • sortKeysDeep uses Object.fromEntries to avoid the __proto__ setter prototype pollution risk

@luojiyin1987

Copy link
Copy Markdown
ContributorAuthor

CI Status Note

The failing typecheck job (https://github.com/maka-agent/maka-agent/actions/runs/28851164752/job/85566577387) is not caused by this PR. It is a pre-existing failure on upstream/main where the CapabilityAuditStrip component was simplified (designer-audit round 4) and dropped its focus prop, but the Storybook stories were not updated to match.

Verification

  • I rebased this PR onto upstream/main (d229afe8) and re-ran tsc -p tsconfig.storybook.json --noEmit against the rebased branch — the storybook typecheck was the only blocker introduced by rebase.
  • The e2e and test jobs both pass (2143/2143 tests pass, 378/378 suites).
  • The typecheck failure on the original PR feat(runtime): add FormatJson builtin tool #603 is identical to what upstream/main produces on a clean checkout (verified locally).

Fix

I opened #608 which removes the stale focus prop from the four CapabilityAuditStrip usages in the Storybook stories. Once that is merged into main, this PR should rebase cleanly and turn green.

If the maintainers prefer a different fix (e.g. re-adding the focus prop to the component), I am happy to adjust the scope. Either way, the typecheck failure in #603 is not introduced by this PR — it is pre-existing.

@jackwener

Copy link
Copy Markdown
Member

Thanks — the implementation itself is clean (the proto preservation test and recursive sort coverage are genuinely good). Closing on first-principles grounds rather than code quality:

The tool's economics don't work as a string→string function.content is a required string parameter, so the model must emit the entire JSON payload into the tool call before getting it back reformatted — that's ~2× the tokens of the model simply writing the formatted JSON directly, which any current model does reliably. There's no size threshold where this wins: bigger payloads make the round-trip cost worse, not better.

The capability already exists in-session. For on-disk JSON the agent uses Bash (jq ., python3 -m json.tool) without round-tripping content through the prompt; for in-context JSON it just… writes formatted JSON.

Every builtin has a standing cost — a slot in every session's tool list that all prompts pay for and the model must consider. That budget should go to tools that unlock something the model can't do: side effects, host access, privileged data.

A version of this that WOULD carry its weight: FormatJson({ path, sort_keys }) that validates/normalizes a JSON file in place and returns only a diagnostic (valid/error + byte delta) — no content round-trip, useful for config hygiene after Write. If you want to pursue that, happy to review it in a fresh PR against #602.

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.

feat(runtime): add FormatJson builtin tool

2 participants

@luojiyin1987@jackwener
, '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

feat(runtime): add FormatJson builtin tool - #603

Closed
luojiyin1987 wants to merge 5 commits into
apache:mainfrom
luojiyin1987:feat/formatjson-builtin-tool
Closed

feat(runtime): add FormatJson builtin tool#603
luojiyin1987 wants to merge 5 commits into
apache:mainfrom
luojiyin1987:feat/formatjson-builtin-tool

Conversation

@luojiyin1987

Copy link
Copy Markdown
Contributor

Summary

Closes#602

Adds FormatJson builtin tool — see issue #602 for full design.

Changes

  • packages/runtime/src/builtin-tools.ts: +39 lines (FormatJson tool definition + sortKeysDeep helper)
  • packages/runtime/src/__tests__/builtin-tools.test.ts: +69 lines (7 test cases)

Verification

  • Runtime tests: 34/34 pass after rebase onto upstream/main
  • No pre-existing tests broken
  • Pure function tool — no permission required, no fs side effects

Notes

  • Rebased onto upstream/main before opening this PR
  • The __proto__ preservation behavior is documented in the test
  • sortKeysDeep uses Object.fromEntries to avoid the __proto__ setter prototype pollution risk

@luojiyin1987

Copy link
Copy Markdown
ContributorAuthor

CI Status Note

The failing typecheck job (https://github.com/maka-agent/maka-agent/actions/runs/28851164752/job/85566577387) is not caused by this PR. It is a pre-existing failure on upstream/main where the CapabilityAuditStrip component was simplified (designer-audit round 4) and dropped its focus prop, but the Storybook stories were not updated to match.

Verification

  • I rebased this PR onto upstream/main (d229afe8) and re-ran tsc -p tsconfig.storybook.json --noEmit against the rebased branch — the storybook typecheck was the only blocker introduced by rebase.
  • The e2e and test jobs both pass (2143/2143 tests pass, 378/378 suites).
  • The typecheck failure on the original PR feat(runtime): add FormatJson builtin tool #603 is identical to what upstream/main produces on a clean checkout (verified locally).

Fix

I opened #608 which removes the stale focus prop from the four CapabilityAuditStrip usages in the Storybook stories. Once that is merged into main, this PR should rebase cleanly and turn green.

If the maintainers prefer a different fix (e.g. re-adding the focus prop to the component), I am happy to adjust the scope. Either way, the typecheck failure in #603 is not introduced by this PR — it is pre-existing.

@jackwener

Copy link
Copy Markdown
Member

Thanks — the implementation itself is clean (the proto preservation test and recursive sort coverage are genuinely good). Closing on first-principles grounds rather than code quality:

The tool's economics don't work as a string→string function.content is a required string parameter, so the model must emit the entire JSON payload into the tool call before getting it back reformatted — that's ~2× the tokens of the model simply writing the formatted JSON directly, which any current model does reliably. There's no size threshold where this wins: bigger payloads make the round-trip cost worse, not better.

The capability already exists in-session. For on-disk JSON the agent uses Bash (jq ., python3 -m json.tool) without round-tripping content through the prompt; for in-context JSON it just… writes formatted JSON.

Every builtin has a standing cost — a slot in every session's tool list that all prompts pay for and the model must consider. That budget should go to tools that unlock something the model can't do: side effects, host access, privileged data.

A version of this that WOULD carry its weight: FormatJson({ path, sort_keys }) that validates/normalizes a JSON file in place and returns only a diagnostic (valid/error + byte delta) — no content round-trip, useful for config hygiene after Write. If you want to pursue that, happy to review it in a fresh PR against #602.

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.

feat(runtime): add FormatJson builtin tool

2 participants

@luojiyin1987@jackwener
, '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

feat(runtime): add FormatJson builtin tool - #603

Closed
luojiyin1987 wants to merge 5 commits into
apache:mainfrom
luojiyin1987:feat/formatjson-builtin-tool
Closed

feat(runtime): add FormatJson builtin tool#603
luojiyin1987 wants to merge 5 commits into
apache:mainfrom
luojiyin1987:feat/formatjson-builtin-tool

Conversation

@luojiyin1987

Copy link
Copy Markdown
Contributor

Summary

Closes#602

Adds FormatJson builtin tool — see issue #602 for full design.

Changes

  • packages/runtime/src/builtin-tools.ts: +39 lines (FormatJson tool definition + sortKeysDeep helper)
  • packages/runtime/src/__tests__/builtin-tools.test.ts: +69 lines (7 test cases)

Verification

  • Runtime tests: 34/34 pass after rebase onto upstream/main
  • No pre-existing tests broken
  • Pure function tool — no permission required, no fs side effects

Notes

  • Rebased onto upstream/main before opening this PR
  • The __proto__ preservation behavior is documented in the test
  • sortKeysDeep uses Object.fromEntries to avoid the __proto__ setter prototype pollution risk

@luojiyin1987

Copy link
Copy Markdown
ContributorAuthor

CI Status Note

The failing typecheck job (https://github.com/maka-agent/maka-agent/actions/runs/28851164752/job/85566577387) is not caused by this PR. It is a pre-existing failure on upstream/main where the CapabilityAuditStrip component was simplified (designer-audit round 4) and dropped its focus prop, but the Storybook stories were not updated to match.

Verification

  • I rebased this PR onto upstream/main (d229afe8) and re-ran tsc -p tsconfig.storybook.json --noEmit against the rebased branch — the storybook typecheck was the only blocker introduced by rebase.
  • The e2e and test jobs both pass (2143/2143 tests pass, 378/378 suites).
  • The typecheck failure on the original PR feat(runtime): add FormatJson builtin tool #603 is identical to what upstream/main produces on a clean checkout (verified locally).

Fix

I opened #608 which removes the stale focus prop from the four CapabilityAuditStrip usages in the Storybook stories. Once that is merged into main, this PR should rebase cleanly and turn green.

If the maintainers prefer a different fix (e.g. re-adding the focus prop to the component), I am happy to adjust the scope. Either way, the typecheck failure in #603 is not introduced by this PR — it is pre-existing.

@jackwener

Copy link
Copy Markdown
Member

Thanks — the implementation itself is clean (the proto preservation test and recursive sort coverage are genuinely good). Closing on first-principles grounds rather than code quality:

The tool's economics don't work as a string→string function.content is a required string parameter, so the model must emit the entire JSON payload into the tool call before getting it back reformatted — that's ~2× the tokens of the model simply writing the formatted JSON directly, which any current model does reliably. There's no size threshold where this wins: bigger payloads make the round-trip cost worse, not better.

The capability already exists in-session. For on-disk JSON the agent uses Bash (jq ., python3 -m json.tool) without round-tripping content through the prompt; for in-context JSON it just… writes formatted JSON.

Every builtin has a standing cost — a slot in every session's tool list that all prompts pay for and the model must consider. That budget should go to tools that unlock something the model can't do: side effects, host access, privileged data.

A version of this that WOULD carry its weight: FormatJson({ path, sort_keys }) that validates/normalizes a JSON file in place and returns only a diagnostic (valid/error + byte delta) — no content round-trip, useful for config hygiene after Write. If you want to pursue that, happy to review it in a fresh PR against #602.

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.

feat(runtime): add FormatJson builtin tool

2 participants

@luojiyin1987@jackwener
, '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

feat(runtime): add FormatJson builtin tool - #603

Closed
luojiyin1987 wants to merge 5 commits into
apache:mainfrom
luojiyin1987:feat/formatjson-builtin-tool
Closed

feat(runtime): add FormatJson builtin tool#603
luojiyin1987 wants to merge 5 commits into
apache:mainfrom
luojiyin1987:feat/formatjson-builtin-tool

Conversation

@luojiyin1987

Copy link
Copy Markdown
Contributor

Summary

Closes#602

Adds FormatJson builtin tool — see issue #602 for full design.

Changes

  • packages/runtime/src/builtin-tools.ts: +39 lines (FormatJson tool definition + sortKeysDeep helper)
  • packages/runtime/src/__tests__/builtin-tools.test.ts: +69 lines (7 test cases)

Verification

  • Runtime tests: 34/34 pass after rebase onto upstream/main
  • No pre-existing tests broken
  • Pure function tool — no permission required, no fs side effects

Notes

  • Rebased onto upstream/main before opening this PR
  • The __proto__ preservation behavior is documented in the test
  • sortKeysDeep uses Object.fromEntries to avoid the __proto__ setter prototype pollution risk

@luojiyin1987

Copy link
Copy Markdown
ContributorAuthor

CI Status Note

The failing typecheck job (https://github.com/maka-agent/maka-agent/actions/runs/28851164752/job/85566577387) is not caused by this PR. It is a pre-existing failure on upstream/main where the CapabilityAuditStrip component was simplified (designer-audit round 4) and dropped its focus prop, but the Storybook stories were not updated to match.

Verification

  • I rebased this PR onto upstream/main (d229afe8) and re-ran tsc -p tsconfig.storybook.json --noEmit against the rebased branch — the storybook typecheck was the only blocker introduced by rebase.
  • The e2e and test jobs both pass (2143/2143 tests pass, 378/378 suites).
  • The typecheck failure on the original PR feat(runtime): add FormatJson builtin tool #603 is identical to what upstream/main produces on a clean checkout (verified locally).

Fix

I opened #608 which removes the stale focus prop from the four CapabilityAuditStrip usages in the Storybook stories. Once that is merged into main, this PR should rebase cleanly and turn green.

If the maintainers prefer a different fix (e.g. re-adding the focus prop to the component), I am happy to adjust the scope. Either way, the typecheck failure in #603 is not introduced by this PR — it is pre-existing.

@jackwener

Copy link
Copy Markdown
Member

Thanks — the implementation itself is clean (the proto preservation test and recursive sort coverage are genuinely good). Closing on first-principles grounds rather than code quality:

The tool's economics don't work as a string→string function.content is a required string parameter, so the model must emit the entire JSON payload into the tool call before getting it back reformatted — that's ~2× the tokens of the model simply writing the formatted JSON directly, which any current model does reliably. There's no size threshold where this wins: bigger payloads make the round-trip cost worse, not better.

The capability already exists in-session. For on-disk JSON the agent uses Bash (jq ., python3 -m json.tool) without round-tripping content through the prompt; for in-context JSON it just… writes formatted JSON.

Every builtin has a standing cost — a slot in every session's tool list that all prompts pay for and the model must consider. That budget should go to tools that unlock something the model can't do: side effects, host access, privileged data.

A version of this that WOULD carry its weight: FormatJson({ path, sort_keys }) that validates/normalizes a JSON file in place and returns only a diagnostic (valid/error + byte delta) — no content round-trip, useful for config hygiene after Write. If you want to pursue that, happy to review it in a fresh PR against #602.

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.

feat(runtime): add FormatJson builtin tool

2 participants

@luojiyin1987@jackwener
, '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

feat(runtime): add FormatJson builtin tool - #603

Closed
luojiyin1987 wants to merge 5 commits into
apache:mainfrom
luojiyin1987:feat/formatjson-builtin-tool
Closed

feat(runtime): add FormatJson builtin tool#603
luojiyin1987 wants to merge 5 commits into
apache:mainfrom
luojiyin1987:feat/formatjson-builtin-tool

Conversation

@luojiyin1987

Copy link
Copy Markdown
Contributor

Summary

Closes#602

Adds FormatJson builtin tool — see issue #602 for full design.

Changes

  • packages/runtime/src/builtin-tools.ts: +39 lines (FormatJson tool definition + sortKeysDeep helper)
  • packages/runtime/src/__tests__/builtin-tools.test.ts: +69 lines (7 test cases)

Verification

  • Runtime tests: 34/34 pass after rebase onto upstream/main
  • No pre-existing tests broken
  • Pure function tool — no permission required, no fs side effects

Notes

  • Rebased onto upstream/main before opening this PR
  • The __proto__ preservation behavior is documented in the test
  • sortKeysDeep uses Object.fromEntries to avoid the __proto__ setter prototype pollution risk

@luojiyin1987

Copy link
Copy Markdown
ContributorAuthor

CI Status Note

The failing typecheck job (https://github.com/maka-agent/maka-agent/actions/runs/28851164752/job/85566577387) is not caused by this PR. It is a pre-existing failure on upstream/main where the CapabilityAuditStrip component was simplified (designer-audit round 4) and dropped its focus prop, but the Storybook stories were not updated to match.

Verification

  • I rebased this PR onto upstream/main (d229afe8) and re-ran tsc -p tsconfig.storybook.json --noEmit against the rebased branch — the storybook typecheck was the only blocker introduced by rebase.
  • The e2e and test jobs both pass (2143/2143 tests pass, 378/378 suites).
  • The typecheck failure on the original PR feat(runtime): add FormatJson builtin tool #603 is identical to what upstream/main produces on a clean checkout (verified locally).

Fix

I opened #608 which removes the stale focus prop from the four CapabilityAuditStrip usages in the Storybook stories. Once that is merged into main, this PR should rebase cleanly and turn green.

If the maintainers prefer a different fix (e.g. re-adding the focus prop to the component), I am happy to adjust the scope. Either way, the typecheck failure in #603 is not introduced by this PR — it is pre-existing.

@jackwener

Copy link
Copy Markdown
Member

Thanks — the implementation itself is clean (the proto preservation test and recursive sort coverage are genuinely good). Closing on first-principles grounds rather than code quality:

The tool's economics don't work as a string→string function.content is a required string parameter, so the model must emit the entire JSON payload into the tool call before getting it back reformatted — that's ~2× the tokens of the model simply writing the formatted JSON directly, which any current model does reliably. There's no size threshold where this wins: bigger payloads make the round-trip cost worse, not better.

The capability already exists in-session. For on-disk JSON the agent uses Bash (jq ., python3 -m json.tool) without round-tripping content through the prompt; for in-context JSON it just… writes formatted JSON.

Every builtin has a standing cost — a slot in every session's tool list that all prompts pay for and the model must consider. That budget should go to tools that unlock something the model can't do: side effects, host access, privileged data.

A version of this that WOULD carry its weight: FormatJson({ path, sort_keys }) that validates/normalizes a JSON file in place and returns only a diagnostic (valid/error + byte delta) — no content round-trip, useful for config hygiene after Write. If you want to pursue that, happy to review it in a fresh PR against #602.

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.

feat(runtime): add FormatJson builtin tool

2 participants

@luojiyin1987@jackwener
, '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

feat(runtime): add FormatJson builtin tool - #603

Closed
luojiyin1987 wants to merge 5 commits into
apache:mainfrom
luojiyin1987:feat/formatjson-builtin-tool
Closed

feat(runtime): add FormatJson builtin tool#603
luojiyin1987 wants to merge 5 commits into
apache:mainfrom
luojiyin1987:feat/formatjson-builtin-tool

Conversation

@luojiyin1987

Copy link
Copy Markdown
Contributor

Summary

Closes#602

Adds FormatJson builtin tool — see issue #602 for full design.

Changes

  • packages/runtime/src/builtin-tools.ts: +39 lines (FormatJson tool definition + sortKeysDeep helper)
  • packages/runtime/src/__tests__/builtin-tools.test.ts: +69 lines (7 test cases)

Verification

  • Runtime tests: 34/34 pass after rebase onto upstream/main
  • No pre-existing tests broken
  • Pure function tool — no permission required, no fs side effects

Notes

  • Rebased onto upstream/main before opening this PR
  • The __proto__ preservation behavior is documented in the test
  • sortKeysDeep uses Object.fromEntries to avoid the __proto__ setter prototype pollution risk

@luojiyin1987

Copy link
Copy Markdown
ContributorAuthor

CI Status Note

The failing typecheck job (https://github.com/maka-agent/maka-agent/actions/runs/28851164752/job/85566577387) is not caused by this PR. It is a pre-existing failure on upstream/main where the CapabilityAuditStrip component was simplified (designer-audit round 4) and dropped its focus prop, but the Storybook stories were not updated to match.

Verification

  • I rebased this PR onto upstream/main (d229afe8) and re-ran tsc -p tsconfig.storybook.json --noEmit against the rebased branch — the storybook typecheck was the only blocker introduced by rebase.
  • The e2e and test jobs both pass (2143/2143 tests pass, 378/378 suites).
  • The typecheck failure on the original PR feat(runtime): add FormatJson builtin tool #603 is identical to what upstream/main produces on a clean checkout (verified locally).

Fix

I opened #608 which removes the stale focus prop from the four CapabilityAuditStrip usages in the Storybook stories. Once that is merged into main, this PR should rebase cleanly and turn green.

If the maintainers prefer a different fix (e.g. re-adding the focus prop to the component), I am happy to adjust the scope. Either way, the typecheck failure in #603 is not introduced by this PR — it is pre-existing.

@jackwener

Copy link
Copy Markdown
Member

Thanks — the implementation itself is clean (the proto preservation test and recursive sort coverage are genuinely good). Closing on first-principles grounds rather than code quality:

The tool's economics don't work as a string→string function.content is a required string parameter, so the model must emit the entire JSON payload into the tool call before getting it back reformatted — that's ~2× the tokens of the model simply writing the formatted JSON directly, which any current model does reliably. There's no size threshold where this wins: bigger payloads make the round-trip cost worse, not better.

The capability already exists in-session. For on-disk JSON the agent uses Bash (jq ., python3 -m json.tool) without round-tripping content through the prompt; for in-context JSON it just… writes formatted JSON.

Every builtin has a standing cost — a slot in every session's tool list that all prompts pay for and the model must consider. That budget should go to tools that unlock something the model can't do: side effects, host access, privileged data.

A version of this that WOULD carry its weight: FormatJson({ path, sort_keys }) that validates/normalizes a JSON file in place and returns only a diagnostic (valid/error + byte delta) — no content round-trip, useful for config hygiene after Write. If you want to pursue that, happy to review it in a fresh PR against #602.

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.

feat(runtime): add FormatJson builtin tool

2 participants

@luojiyin1987@jackwener
, '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

feat(runtime): add FormatJson builtin tool - #603

Closed
luojiyin1987 wants to merge 5 commits into
apache:mainfrom
luojiyin1987:feat/formatjson-builtin-tool
Closed

feat(runtime): add FormatJson builtin tool#603
luojiyin1987 wants to merge 5 commits into
apache:mainfrom
luojiyin1987:feat/formatjson-builtin-tool

Conversation

@luojiyin1987

Copy link
Copy Markdown
Contributor

Summary

Closes#602

Adds FormatJson builtin tool — see issue #602 for full design.

Changes

  • packages/runtime/src/builtin-tools.ts: +39 lines (FormatJson tool definition + sortKeysDeep helper)
  • packages/runtime/src/__tests__/builtin-tools.test.ts: +69 lines (7 test cases)

Verification

  • Runtime tests: 34/34 pass after rebase onto upstream/main
  • No pre-existing tests broken
  • Pure function tool — no permission required, no fs side effects

Notes

  • Rebased onto upstream/main before opening this PR
  • The __proto__ preservation behavior is documented in the test
  • sortKeysDeep uses Object.fromEntries to avoid the __proto__ setter prototype pollution risk

@luojiyin1987

Copy link
Copy Markdown
ContributorAuthor

CI Status Note

The failing typecheck job (https://github.com/maka-agent/maka-agent/actions/runs/28851164752/job/85566577387) is not caused by this PR. It is a pre-existing failure on upstream/main where the CapabilityAuditStrip component was simplified (designer-audit round 4) and dropped its focus prop, but the Storybook stories were not updated to match.

Verification

  • I rebased this PR onto upstream/main (d229afe8) and re-ran tsc -p tsconfig.storybook.json --noEmit against the rebased branch — the storybook typecheck was the only blocker introduced by rebase.
  • The e2e and test jobs both pass (2143/2143 tests pass, 378/378 suites).
  • The typecheck failure on the original PR feat(runtime): add FormatJson builtin tool #603 is identical to what upstream/main produces on a clean checkout (verified locally).

Fix

I opened #608 which removes the stale focus prop from the four CapabilityAuditStrip usages in the Storybook stories. Once that is merged into main, this PR should rebase cleanly and turn green.

If the maintainers prefer a different fix (e.g. re-adding the focus prop to the component), I am happy to adjust the scope. Either way, the typecheck failure in #603 is not introduced by this PR — it is pre-existing.

@jackwener

Copy link
Copy Markdown
Member

Thanks — the implementation itself is clean (the proto preservation test and recursive sort coverage are genuinely good). Closing on first-principles grounds rather than code quality:

The tool's economics don't work as a string→string function.content is a required string parameter, so the model must emit the entire JSON payload into the tool call before getting it back reformatted — that's ~2× the tokens of the model simply writing the formatted JSON directly, which any current model does reliably. There's no size threshold where this wins: bigger payloads make the round-trip cost worse, not better.

The capability already exists in-session. For on-disk JSON the agent uses Bash (jq ., python3 -m json.tool) without round-tripping content through the prompt; for in-context JSON it just… writes formatted JSON.

Every builtin has a standing cost — a slot in every session's tool list that all prompts pay for and the model must consider. That budget should go to tools that unlock something the model can't do: side effects, host access, privileged data.

A version of this that WOULD carry its weight: FormatJson({ path, sort_keys }) that validates/normalizes a JSON file in place and returns only a diagnostic (valid/error + byte delta) — no content round-trip, useful for config hygiene after Write. If you want to pursue that, happy to review it in a fresh PR against #602.

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.

feat(runtime): add FormatJson builtin tool

2 participants

@luojiyin1987@jackwener