Skip to content

Add JavaScript span transform plugins - #28

Open
Stephen Belanger (Qard) wants to merge 8 commits into
mainfrom
t3code/explore-rquickjs-span-plugins
Open

Add JavaScript span transform plugins#28
Stephen Belanger (Qard) wants to merge 8 commits into
mainfrom
t3code/explore-rquickjs-span-plugins

Conversation

@Qard

@QardStephen Belanger (Qard) commented Aug 21, 2026

Copy link
Copy Markdown
Collaborator

Summary

  • add ordered synchronous JavaScript span transforms powered by per-worker QuickJS runtimes
  • bridge spans and context directly with rquickjs-serde, using strict result decoding without intermediate JSON text
  • expose operation, source, session ID, and an environment snapshot captured once when each daemon worker processor is constructed
  • canonicalize plugin paths to absolute paths before validation and persistent enable storage
  • persist enabled plugins for ordinary sessions while keeping managed runs and import/attach plugin chains invocation-local
  • replay raw journal events through the resumed session's current plugin chain
  • isolate failures per plugin and worker so successful plugins continue running while diagnostics remain bounded

Example

Create a synchronous ES module:

// tag-ci.mjsexportdefaultfunctiontagCi(span,context){if(!context.env.CI)returnspan;return{
...span,tags: [...newSet([...(span.tags??[]),"ci"])],metadata: {
...(span.metadata??{}),deployment: context.env.DEPLOYMENT_ENV??"unknown",trace_source: context.source,},};}

Choose the scope when registering it:

# Persist an ordered global chain for ordinary Codex sessions.
bt trace enable codex --plugin ./redact.mjs --plugin ./tag-ci.mjs
# Only local.mjs runs for this managed invocation; enabled plugins are not merged.
bt trace run --plugin ./local.mjs codex -- "summarize this change"# Only sanitize-history.mjs runs for this import; enabled plugins are not merged.
bt trace import codex SESSION_ID --plugin ./sanitize-history.mjs

Each function receives the previous plugin's returned span plus { operation, source, session_id, env }. Plugins may change span content but not span_id, root_span_id, or parent_span_ids.

Raw input events are journaled before transformation. On recovery, an ordinary session uses the current globally configured plugin chain, while an isolated managed session continues using its invocation-local chain. Import and attach are separate from journal recovery and use only their command-line plugins.

See the README examples for redaction, environment handling, chaining, replay, and security guidance.

Validation

  • cargo test --manifest-path bt-daemon/Cargo.toml --all-features --locked
  • cargo clippy --manifest-path bt-daemon/Cargo.toml --all-targets --all-features --locked -- -D warnings
  • cargo fmt --manifest-path bt-daemon/Cargo.toml -- --check
  • cargo metadata --manifest-path bt-daemon/Cargo.toml --locked --no-deps --format-version 1
  • make test
  • git diff --check

@Qard
Stephen Belanger (Qard) marked this pull request as ready for review August 21, 2026 15:17
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

@Qard
Stephen Belanger (Qard)force-pushed the t3code/explore-rquickjs-span-plugins branch from af6b477 to 41bd374CompareAugust 24, 2026 11:54
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

@Qard
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
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;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Add JavaScript span transform plugins by Qard · Pull Request #28 · braintrustdata/braintrust-coding-agent-plugins · GitHub
Skip to content

Add JavaScript span transform plugins - #28

Open
Stephen Belanger (Qard) wants to merge 8 commits into
mainfrom
t3code/explore-rquickjs-span-plugins
Open

Add JavaScript span transform plugins#28
Stephen Belanger (Qard) wants to merge 8 commits into
mainfrom
t3code/explore-rquickjs-span-plugins

Conversation

@Qard

@QardStephen Belanger (Qard) commented Aug 21, 2026

Copy link
Copy Markdown
Collaborator

Summary

  • add ordered synchronous JavaScript span transforms powered by per-worker QuickJS runtimes
  • bridge spans and context directly with rquickjs-serde, using strict result decoding without intermediate JSON text
  • expose operation, source, session ID, and an environment snapshot captured once when each daemon worker processor is constructed
  • canonicalize plugin paths to absolute paths before validation and persistent enable storage
  • persist enabled plugins for ordinary sessions while keeping managed runs and import/attach plugin chains invocation-local
  • replay raw journal events through the resumed session's current plugin chain
  • isolate failures per plugin and worker so successful plugins continue running while diagnostics remain bounded

Example

Create a synchronous ES module:

// tag-ci.mjsexportdefaultfunctiontagCi(span,context){if(!context.env.CI)returnspan;return{
...span,tags: [...newSet([...(span.tags??[]),"ci"])],metadata: {
...(span.metadata??{}),deployment: context.env.DEPLOYMENT_ENV??"unknown",trace_source: context.source,},};}

Choose the scope when registering it:

# Persist an ordered global chain for ordinary Codex sessions.
bt trace enable codex --plugin ./redact.mjs --plugin ./tag-ci.mjs
# Only local.mjs runs for this managed invocation; enabled plugins are not merged.
bt trace run --plugin ./local.mjs codex -- "summarize this change"# Only sanitize-history.mjs runs for this import; enabled plugins are not merged.
bt trace import codex SESSION_ID --plugin ./sanitize-history.mjs

Each function receives the previous plugin's returned span plus { operation, source, session_id, env }. Plugins may change span content but not span_id, root_span_id, or parent_span_ids.

Raw input events are journaled before transformation. On recovery, an ordinary session uses the current globally configured plugin chain, while an isolated managed session continues using its invocation-local chain. Import and attach are separate from journal recovery and use only their command-line plugins.

See the README examples for redaction, environment handling, chaining, replay, and security guidance.

Validation

  • cargo test --manifest-path bt-daemon/Cargo.toml --all-features --locked
  • cargo clippy --manifest-path bt-daemon/Cargo.toml --all-targets --all-features --locked -- -D warnings
  • cargo fmt --manifest-path bt-daemon/Cargo.toml -- --check
  • cargo metadata --manifest-path bt-daemon/Cargo.toml --locked --no-deps --format-version 1
  • make test
  • git diff --check

@Qard
Stephen Belanger (Qard) marked this pull request as ready for review August 21, 2026 15:17
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

@Qard
Stephen Belanger (Qard)force-pushed the t3code/explore-rquickjs-span-plugins branch from af6b477 to 41bd374CompareAugust 24, 2026 11:54
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

@Qard
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Add JavaScript span transform plugins by Qard · Pull Request #28 · braintrustdata/braintrust-coding-agent-plugins · GitHub
Skip to content

Add JavaScript span transform plugins - #28

Open
Stephen Belanger (Qard) wants to merge 8 commits into
mainfrom
t3code/explore-rquickjs-span-plugins
Open

Add JavaScript span transform plugins#28
Stephen Belanger (Qard) wants to merge 8 commits into
mainfrom
t3code/explore-rquickjs-span-plugins

Conversation

@Qard

@QardStephen Belanger (Qard) commented Aug 21, 2026

Copy link
Copy Markdown
Collaborator

Summary

  • add ordered synchronous JavaScript span transforms powered by per-worker QuickJS runtimes
  • bridge spans and context directly with rquickjs-serde, using strict result decoding without intermediate JSON text
  • expose operation, source, session ID, and an environment snapshot captured once when each daemon worker processor is constructed
  • canonicalize plugin paths to absolute paths before validation and persistent enable storage
  • persist enabled plugins for ordinary sessions while keeping managed runs and import/attach plugin chains invocation-local
  • replay raw journal events through the resumed session's current plugin chain
  • isolate failures per plugin and worker so successful plugins continue running while diagnostics remain bounded

Example

Create a synchronous ES module:

// tag-ci.mjsexportdefaultfunctiontagCi(span,context){if(!context.env.CI)returnspan;return{
...span,tags: [...newSet([...(span.tags??[]),"ci"])],metadata: {
...(span.metadata??{}),deployment: context.env.DEPLOYMENT_ENV??"unknown",trace_source: context.source,},};}

Choose the scope when registering it:

# Persist an ordered global chain for ordinary Codex sessions.
bt trace enable codex --plugin ./redact.mjs --plugin ./tag-ci.mjs
# Only local.mjs runs for this managed invocation; enabled plugins are not merged.
bt trace run --plugin ./local.mjs codex -- "summarize this change"# Only sanitize-history.mjs runs for this import; enabled plugins are not merged.
bt trace import codex SESSION_ID --plugin ./sanitize-history.mjs

Each function receives the previous plugin's returned span plus { operation, source, session_id, env }. Plugins may change span content but not span_id, root_span_id, or parent_span_ids.

Raw input events are journaled before transformation. On recovery, an ordinary session uses the current globally configured plugin chain, while an isolated managed session continues using its invocation-local chain. Import and attach are separate from journal recovery and use only their command-line plugins.

See the README examples for redaction, environment handling, chaining, replay, and security guidance.

Validation

  • cargo test --manifest-path bt-daemon/Cargo.toml --all-features --locked
  • cargo clippy --manifest-path bt-daemon/Cargo.toml --all-targets --all-features --locked -- -D warnings
  • cargo fmt --manifest-path bt-daemon/Cargo.toml -- --check
  • cargo metadata --manifest-path bt-daemon/Cargo.toml --locked --no-deps --format-version 1
  • make test
  • git diff --check

@Qard
Stephen Belanger (Qard) marked this pull request as ready for review August 21, 2026 15:17
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

@Qard
Stephen Belanger (Qard)force-pushed the t3code/explore-rquickjs-span-plugins branch from af6b477 to 41bd374CompareAugust 24, 2026 11:54
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

@Qard
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', '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('^' + ".*" + ' Add JavaScript span transform plugins by Qard · Pull Request #28 · braintrustdata/braintrust-coding-agent-plugins · GitHub
Skip to content

Add JavaScript span transform plugins - #28

Open
Stephen Belanger (Qard) wants to merge 8 commits into
mainfrom
t3code/explore-rquickjs-span-plugins
Open

Add JavaScript span transform plugins#28
Stephen Belanger (Qard) wants to merge 8 commits into
mainfrom
t3code/explore-rquickjs-span-plugins

Conversation

@Qard

@QardStephen Belanger (Qard) commented Aug 21, 2026

Copy link
Copy Markdown
Collaborator

Summary

  • add ordered synchronous JavaScript span transforms powered by per-worker QuickJS runtimes
  • bridge spans and context directly with rquickjs-serde, using strict result decoding without intermediate JSON text
  • expose operation, source, session ID, and an environment snapshot captured once when each daemon worker processor is constructed
  • canonicalize plugin paths to absolute paths before validation and persistent enable storage
  • persist enabled plugins for ordinary sessions while keeping managed runs and import/attach plugin chains invocation-local
  • replay raw journal events through the resumed session's current plugin chain
  • isolate failures per plugin and worker so successful plugins continue running while diagnostics remain bounded

Example

Create a synchronous ES module:

// tag-ci.mjsexportdefaultfunctiontagCi(span,context){if(!context.env.CI)returnspan;return{
...span,tags: [...newSet([...(span.tags??[]),"ci"])],metadata: {
...(span.metadata??{}),deployment: context.env.DEPLOYMENT_ENV??"unknown",trace_source: context.source,},};}

Choose the scope when registering it:

# Persist an ordered global chain for ordinary Codex sessions.
bt trace enable codex --plugin ./redact.mjs --plugin ./tag-ci.mjs
# Only local.mjs runs for this managed invocation; enabled plugins are not merged.
bt trace run --plugin ./local.mjs codex -- "summarize this change"# Only sanitize-history.mjs runs for this import; enabled plugins are not merged.
bt trace import codex SESSION_ID --plugin ./sanitize-history.mjs

Each function receives the previous plugin's returned span plus { operation, source, session_id, env }. Plugins may change span content but not span_id, root_span_id, or parent_span_ids.

Raw input events are journaled before transformation. On recovery, an ordinary session uses the current globally configured plugin chain, while an isolated managed session continues using its invocation-local chain. Import and attach are separate from journal recovery and use only their command-line plugins.

See the README examples for redaction, environment handling, chaining, replay, and security guidance.

Validation

  • cargo test --manifest-path bt-daemon/Cargo.toml --all-features --locked
  • cargo clippy --manifest-path bt-daemon/Cargo.toml --all-targets --all-features --locked -- -D warnings
  • cargo fmt --manifest-path bt-daemon/Cargo.toml -- --check
  • cargo metadata --manifest-path bt-daemon/Cargo.toml --locked --no-deps --format-version 1
  • make test
  • git diff --check

@Qard
Stephen Belanger (Qard) marked this pull request as ready for review August 21, 2026 15:17
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

@Qard
Stephen Belanger (Qard)force-pushed the t3code/explore-rquickjs-span-plugins branch from af6b477 to 41bd374CompareAugust 24, 2026 11:54
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

@Qard
, '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" + ' Add JavaScript span transform plugins by Qard · Pull Request #28 · braintrustdata/braintrust-coding-agent-plugins · GitHub
Skip to content

Add JavaScript span transform plugins - #28

Open
Stephen Belanger (Qard) wants to merge 8 commits into
mainfrom
t3code/explore-rquickjs-span-plugins
Open

Add JavaScript span transform plugins#28
Stephen Belanger (Qard) wants to merge 8 commits into
mainfrom
t3code/explore-rquickjs-span-plugins

Conversation

@Qard

@QardStephen Belanger (Qard) commented Aug 21, 2026

Copy link
Copy Markdown
Collaborator

Summary

  • add ordered synchronous JavaScript span transforms powered by per-worker QuickJS runtimes
  • bridge spans and context directly with rquickjs-serde, using strict result decoding without intermediate JSON text
  • expose operation, source, session ID, and an environment snapshot captured once when each daemon worker processor is constructed
  • canonicalize plugin paths to absolute paths before validation and persistent enable storage
  • persist enabled plugins for ordinary sessions while keeping managed runs and import/attach plugin chains invocation-local
  • replay raw journal events through the resumed session's current plugin chain
  • isolate failures per plugin and worker so successful plugins continue running while diagnostics remain bounded

Example

Create a synchronous ES module:

// tag-ci.mjsexportdefaultfunctiontagCi(span,context){if(!context.env.CI)returnspan;return{
...span,tags: [...newSet([...(span.tags??[]),"ci"])],metadata: {
...(span.metadata??{}),deployment: context.env.DEPLOYMENT_ENV??"unknown",trace_source: context.source,},};}

Choose the scope when registering it:

# Persist an ordered global chain for ordinary Codex sessions.
bt trace enable codex --plugin ./redact.mjs --plugin ./tag-ci.mjs
# Only local.mjs runs for this managed invocation; enabled plugins are not merged.
bt trace run --plugin ./local.mjs codex -- "summarize this change"# Only sanitize-history.mjs runs for this import; enabled plugins are not merged.
bt trace import codex SESSION_ID --plugin ./sanitize-history.mjs

Each function receives the previous plugin's returned span plus { operation, source, session_id, env }. Plugins may change span content but not span_id, root_span_id, or parent_span_ids.

Raw input events are journaled before transformation. On recovery, an ordinary session uses the current globally configured plugin chain, while an isolated managed session continues using its invocation-local chain. Import and attach are separate from journal recovery and use only their command-line plugins.

See the README examples for redaction, environment handling, chaining, replay, and security guidance.

Validation

  • cargo test --manifest-path bt-daemon/Cargo.toml --all-features --locked
  • cargo clippy --manifest-path bt-daemon/Cargo.toml --all-targets --all-features --locked -- -D warnings
  • cargo fmt --manifest-path bt-daemon/Cargo.toml -- --check
  • cargo metadata --manifest-path bt-daemon/Cargo.toml --locked --no-deps --format-version 1
  • make test
  • git diff --check

@Qard
Stephen Belanger (Qard) marked this pull request as ready for review August 21, 2026 15:17
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

@Qard
Stephen Belanger (Qard)force-pushed the t3code/explore-rquickjs-span-plugins branch from af6b477 to 41bd374CompareAugust 24, 2026 11:54
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

@Qard
, '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('^' + ".*" + ' Add JavaScript span transform plugins by Qard · Pull Request #28 · braintrustdata/braintrust-coding-agent-plugins · GitHub
Skip to content

Add JavaScript span transform plugins - #28

Open
Stephen Belanger (Qard) wants to merge 8 commits into
mainfrom
t3code/explore-rquickjs-span-plugins
Open

Add JavaScript span transform plugins#28
Stephen Belanger (Qard) wants to merge 8 commits into
mainfrom
t3code/explore-rquickjs-span-plugins

Conversation

@Qard

@QardStephen Belanger (Qard) commented Aug 21, 2026

Copy link
Copy Markdown
Collaborator

Summary

  • add ordered synchronous JavaScript span transforms powered by per-worker QuickJS runtimes
  • bridge spans and context directly with rquickjs-serde, using strict result decoding without intermediate JSON text
  • expose operation, source, session ID, and an environment snapshot captured once when each daemon worker processor is constructed
  • canonicalize plugin paths to absolute paths before validation and persistent enable storage
  • persist enabled plugins for ordinary sessions while keeping managed runs and import/attach plugin chains invocation-local
  • replay raw journal events through the resumed session's current plugin chain
  • isolate failures per plugin and worker so successful plugins continue running while diagnostics remain bounded

Example

Create a synchronous ES module:

// tag-ci.mjsexportdefaultfunctiontagCi(span,context){if(!context.env.CI)returnspan;return{
...span,tags: [...newSet([...(span.tags??[]),"ci"])],metadata: {
...(span.metadata??{}),deployment: context.env.DEPLOYMENT_ENV??"unknown",trace_source: context.source,},};}

Choose the scope when registering it:

# Persist an ordered global chain for ordinary Codex sessions.
bt trace enable codex --plugin ./redact.mjs --plugin ./tag-ci.mjs
# Only local.mjs runs for this managed invocation; enabled plugins are not merged.
bt trace run --plugin ./local.mjs codex -- "summarize this change"# Only sanitize-history.mjs runs for this import; enabled plugins are not merged.
bt trace import codex SESSION_ID --plugin ./sanitize-history.mjs

Each function receives the previous plugin's returned span plus { operation, source, session_id, env }. Plugins may change span content but not span_id, root_span_id, or parent_span_ids.

Raw input events are journaled before transformation. On recovery, an ordinary session uses the current globally configured plugin chain, while an isolated managed session continues using its invocation-local chain. Import and attach are separate from journal recovery and use only their command-line plugins.

See the README examples for redaction, environment handling, chaining, replay, and security guidance.

Validation

  • cargo test --manifest-path bt-daemon/Cargo.toml --all-features --locked
  • cargo clippy --manifest-path bt-daemon/Cargo.toml --all-targets --all-features --locked -- -D warnings
  • cargo fmt --manifest-path bt-daemon/Cargo.toml -- --check
  • cargo metadata --manifest-path bt-daemon/Cargo.toml --locked --no-deps --format-version 1
  • make test
  • git diff --check

@Qard
Stephen Belanger (Qard) marked this pull request as ready for review August 21, 2026 15:17
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

@Qard
Stephen Belanger (Qard)force-pushed the t3code/explore-rquickjs-span-plugins branch from af6b477 to 41bd374CompareAugust 24, 2026 11:54
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

@Qard
, '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); } })(); })(); Add JavaScript span transform plugins by Qard · Pull Request #28 · braintrustdata/braintrust-coding-agent-plugins · GitHub
Skip to content

Add JavaScript span transform plugins - #28

Open
Stephen Belanger (Qard) wants to merge 8 commits into
mainfrom
t3code/explore-rquickjs-span-plugins
Open

Add JavaScript span transform plugins#28
Stephen Belanger (Qard) wants to merge 8 commits into
mainfrom
t3code/explore-rquickjs-span-plugins

Conversation

@Qard

@QardStephen Belanger (Qard) commented Aug 21, 2026

Copy link
Copy Markdown
Collaborator

Summary

  • add ordered synchronous JavaScript span transforms powered by per-worker QuickJS runtimes
  • bridge spans and context directly with rquickjs-serde, using strict result decoding without intermediate JSON text
  • expose operation, source, session ID, and an environment snapshot captured once when each daemon worker processor is constructed
  • canonicalize plugin paths to absolute paths before validation and persistent enable storage
  • persist enabled plugins for ordinary sessions while keeping managed runs and import/attach plugin chains invocation-local
  • replay raw journal events through the resumed session's current plugin chain
  • isolate failures per plugin and worker so successful plugins continue running while diagnostics remain bounded

Example

Create a synchronous ES module:

// tag-ci.mjsexportdefaultfunctiontagCi(span,context){if(!context.env.CI)returnspan;return{
...span,tags: [...newSet([...(span.tags??[]),"ci"])],metadata: {
...(span.metadata??{}),deployment: context.env.DEPLOYMENT_ENV??"unknown",trace_source: context.source,},};}

Choose the scope when registering it:

# Persist an ordered global chain for ordinary Codex sessions.
bt trace enable codex --plugin ./redact.mjs --plugin ./tag-ci.mjs
# Only local.mjs runs for this managed invocation; enabled plugins are not merged.
bt trace run --plugin ./local.mjs codex -- "summarize this change"# Only sanitize-history.mjs runs for this import; enabled plugins are not merged.
bt trace import codex SESSION_ID --plugin ./sanitize-history.mjs

Each function receives the previous plugin's returned span plus { operation, source, session_id, env }. Plugins may change span content but not span_id, root_span_id, or parent_span_ids.

Raw input events are journaled before transformation. On recovery, an ordinary session uses the current globally configured plugin chain, while an isolated managed session continues using its invocation-local chain. Import and attach are separate from journal recovery and use only their command-line plugins.

See the README examples for redaction, environment handling, chaining, replay, and security guidance.

Validation

  • cargo test --manifest-path bt-daemon/Cargo.toml --all-features --locked
  • cargo clippy --manifest-path bt-daemon/Cargo.toml --all-targets --all-features --locked -- -D warnings
  • cargo fmt --manifest-path bt-daemon/Cargo.toml -- --check
  • cargo metadata --manifest-path bt-daemon/Cargo.toml --locked --no-deps --format-version 1
  • make test
  • git diff --check

@Qard
Stephen Belanger (Qard) marked this pull request as ready for review August 21, 2026 15:17
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

@Qard
Stephen Belanger (Qard)force-pushed the t3code/explore-rquickjs-span-plugins branch from af6b477 to 41bd374CompareAugust 24, 2026 11:54
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

@Qard