feat(session): amicode_session tool — spawn sessions as background tabs - #641

Merged
aarontrowbridge merged 1 commit into
mainfrom
639-feat-amicode_session-tool-spawn-sessions-from-a-session-as-background-tabs
Aug 31, 2026
Merged

feat(session): amicode_session tool — spawn sessions as background tabs#641
aarontrowbridge merged 1 commit into
mainfrom
639-feat-amicode_session-tool-spawn-sessions-from-a-session-as-background-tabs

Conversation

@aarontrowbridge

Copy link
Copy Markdown
Member

Closes#639

What

A session can now spawn new sessions that surface as background tabs beside the parent — fan-out for parallel work, fork-mode for branching a thread mid-conversation.

PieceWhat it does
amicode_session toolCreates 1–4 child sessions via the engine-provided PluginInput.client (first server-mutating tool in the pack), posts the prompt immediately (explicit model bypasses draft-readiness retries), stamps metadata {spawned_by, spawned_depth}. mode: "fork" seeds from this session's history via the native fork endpoint + metadata PATCH.
Spawn policy (session_spawn.ts)Pure + unit-tested: count cap 4/call, soft depth cap 2 overridable with force, model precedence (arg > parent's model > server default), hey-api unwrap, honest summaries.
Session route effectWatches the server session store for spawned_by == this route's session; opens each child as a background tab (tabs.addSessionTab — never navigates, no focus steal); idempotent via opened-set. Selection logic in session/spawn-tabs.ts (bun tests).
ManifestPer-file hashes updated for the modified session.tsx + the two new overlay files — drift gate green locally.

Design decisions (from #639 discussion)

  • Auto-open, backgroundaddSessionTab never navigates; spawning cannot steal focus.
  • Start immediatelypromptAsync with explicit model; children churn from birth (cost noted in the tool description).
  • Soft depth cap — default 2, force: true overrules; depth is derived from the session's OWN stamp, not the caller's claim, so the cap is enforced by construction.
  • Honest fallback — if no pane shows the parent, the child still spawns and is discoverable in the session list; the fork-mode metadata PATCH is tolerated to fail (child runs, just won't auto-open).

Test evidence

  • test/session_spawn.test.ts — 20 tests, green.
  • spawn-tabs.test.ts — 8 tests, green (bun).
  • tsc --noEmit clean; agents_md + amicode_tools suites green.
  • Full extension suite: the 7 failures are pre-existing on current main (environmental: vendored binary absent, pin fixtures, staged bins, pasqal venv) — verified by re-running the same files on a clean tree; this branch adds zero new failures.
  • drift_gate.mjs: PASS (556 files) — including the Complete the .18 pin: re-extract the app-bundle overlay + re-record the service-contract fixtures (unblocks #622 and main) #636-re-extracted state this branch rebased onto.
  • Overlay app typecheck is not a CI lane (composition proof remains the pre-cutover gate); session.tsx passes esbuild parse + review, consistent with current overlay-PR practice.

Sequencing note

Rebased onto the post-#636 main — the app-bundle-gate red that #639 was originally sequenced behind is resolved on this base.

…bs (#639)
A session can now spawn new sessions that surface as background tabs in
the parent's pane. Three pieces:
- plugin (amicode_session): the pack's FIRST server-mutating tool. Uses the
engine-provided PluginInput.client (server-bound SDK) to create and
immediately prompt 1-4 children; mode=fork seeds from this session's
history via /session/{id}/fork + a metadata PATCH. Children stamp
metadata {spawned_by, spawned_depth}. Policy (count cap 4, soft depth
cap 2 overridable with force, model precedence) lives in
session_spawn.ts, unit-tested (20 tests).
- app (session route): an effect in ResolvedTargetSessionRoute watches the
server session store for sessions stamped spawned_by == this route's
session and opens each as a background tab via tabs.addSessionTab —
never navigates, never steals focus; idempotent via an opened-set.
Selection logic extracted to session/spawn-tabs.ts (8 bun tests).
- app-bundle manifest: hashes for the modified session.tsx + the two new
overlay files (drift gate green).
Test notes: the 7 failing tests in the extension suite are pre-existing on
main (environmental: vendored binary, pin fixtures, staged bins) — this
branch adds none. The overlay app typecheck is not a CI lane (composition
proof remains the pre-cutover gate); session.tsx passes esbuild parse and
review, consistent with current overlay-PR practice.
Closes#639
@coderabbitai

Copy link
Copy Markdown

Important

Draft PR not reviewed

Draft PRs are not automatically reviewed by default.

  • Trigger a manual review

To automatically review draft PRs, update your CodeRabbit configuration:

reviews:
auto_review:
drafts: true

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@aarontrowbridge
aarontrowbridge marked this pull request as ready for review August 31, 2026 00:18
@aarontrowbridge
aarontrowbridge merged commit a0f6a46 into mainAug 31, 2026
8 checks passed
@aarontrowbridge
aarontrowbridge deleted the 639-feat-amicode_session-tool-spawn-sessions-from-a-session-as-background-tabs branch August 31, 2026 00:18
aarontrowbridge added a commit that referenced this pull request Aug 31, 2026
…dated spawn plan (#646) (#648)
The fleet's aggregated chat DB holds weeks of unclosed threads; nothing
surfaces them. This skill codifies the sweep-and-resume pass: a read-only
SQLite recipe (top-level sessions in a window, last assistant text per
session, pending todos), a five-bucket classification (BLOCKED-ON-USER /
INTERRUPTED / PARKED / AWAITING-REVIEW / STALE), consolidation of spawnable
threads into at most 3-4 THEME-scoped sessions with self-contained seed
prompts, and — only on explicit confirmation — one amicode_session call per
theme (#641's spawn tool; graceful inline fallback when it isn't deployed).
The DB recipe is verified verbatim against the live fleet server DB
(97 sessions in a 14-day window → 60 after the noise filter; todo and
last-text extraction working).
Blocked-on-user and awaiting-review threads are deliberately never spawn
candidates — a fresh session cannot press the button only the human can
press.
@aarontrowbridge
aarontrowbridge restored the 639-feat-amicode_session-tool-spawn-sessions-from-a-session-as-background-tabs branch August 31, 2026 02:40
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: amicode_session tool — spawn sessions from a session as background tabs

1 participant

@aarontrowbridge
, '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(session): amicode_session tool — spawn sessions as background tabs - #641

Merged
aarontrowbridge merged 1 commit into
mainfrom
639-feat-amicode_session-tool-spawn-sessions-from-a-session-as-background-tabs
Aug 31, 2026
Merged

feat(session): amicode_session tool — spawn sessions as background tabs#641
aarontrowbridge merged 1 commit into
mainfrom
639-feat-amicode_session-tool-spawn-sessions-from-a-session-as-background-tabs

Conversation

@aarontrowbridge

Copy link
Copy Markdown
Member

Closes#639

What

A session can now spawn new sessions that surface as background tabs beside the parent — fan-out for parallel work, fork-mode for branching a thread mid-conversation.

PieceWhat it does
amicode_session toolCreates 1–4 child sessions via the engine-provided PluginInput.client (first server-mutating tool in the pack), posts the prompt immediately (explicit model bypasses draft-readiness retries), stamps metadata {spawned_by, spawned_depth}. mode: "fork" seeds from this session's history via the native fork endpoint + metadata PATCH.
Spawn policy (session_spawn.ts)Pure + unit-tested: count cap 4/call, soft depth cap 2 overridable with force, model precedence (arg > parent's model > server default), hey-api unwrap, honest summaries.
Session route effectWatches the server session store for spawned_by == this route's session; opens each child as a background tab (tabs.addSessionTab — never navigates, no focus steal); idempotent via opened-set. Selection logic in session/spawn-tabs.ts (bun tests).
ManifestPer-file hashes updated for the modified session.tsx + the two new overlay files — drift gate green locally.

Design decisions (from #639 discussion)

  • Auto-open, backgroundaddSessionTab never navigates; spawning cannot steal focus.
  • Start immediatelypromptAsync with explicit model; children churn from birth (cost noted in the tool description).
  • Soft depth cap — default 2, force: true overrules; depth is derived from the session's OWN stamp, not the caller's claim, so the cap is enforced by construction.
  • Honest fallback — if no pane shows the parent, the child still spawns and is discoverable in the session list; the fork-mode metadata PATCH is tolerated to fail (child runs, just won't auto-open).

Test evidence

  • test/session_spawn.test.ts — 20 tests, green.
  • spawn-tabs.test.ts — 8 tests, green (bun).
  • tsc --noEmit clean; agents_md + amicode_tools suites green.
  • Full extension suite: the 7 failures are pre-existing on current main (environmental: vendored binary absent, pin fixtures, staged bins, pasqal venv) — verified by re-running the same files on a clean tree; this branch adds zero new failures.
  • drift_gate.mjs: PASS (556 files) — including the Complete the .18 pin: re-extract the app-bundle overlay + re-record the service-contract fixtures (unblocks #622 and main) #636-re-extracted state this branch rebased onto.
  • Overlay app typecheck is not a CI lane (composition proof remains the pre-cutover gate); session.tsx passes esbuild parse + review, consistent with current overlay-PR practice.

Sequencing note

Rebased onto the post-#636 main — the app-bundle-gate red that #639 was originally sequenced behind is resolved on this base.

…bs (#639)
A session can now spawn new sessions that surface as background tabs in
the parent's pane. Three pieces:
- plugin (amicode_session): the pack's FIRST server-mutating tool. Uses the
engine-provided PluginInput.client (server-bound SDK) to create and
immediately prompt 1-4 children; mode=fork seeds from this session's
history via /session/{id}/fork + a metadata PATCH. Children stamp
metadata {spawned_by, spawned_depth}. Policy (count cap 4, soft depth
cap 2 overridable with force, model precedence) lives in
session_spawn.ts, unit-tested (20 tests).
- app (session route): an effect in ResolvedTargetSessionRoute watches the
server session store for sessions stamped spawned_by == this route's
session and opens each as a background tab via tabs.addSessionTab —
never navigates, never steals focus; idempotent via an opened-set.
Selection logic extracted to session/spawn-tabs.ts (8 bun tests).
- app-bundle manifest: hashes for the modified session.tsx + the two new
overlay files (drift gate green).
Test notes: the 7 failing tests in the extension suite are pre-existing on
main (environmental: vendored binary, pin fixtures, staged bins) — this
branch adds none. The overlay app typecheck is not a CI lane (composition
proof remains the pre-cutover gate); session.tsx passes esbuild parse and
review, consistent with current overlay-PR practice.
Closes#639
@coderabbitai

Copy link
Copy Markdown

Important

Draft PR not reviewed

Draft PRs are not automatically reviewed by default.

  • Trigger a manual review

To automatically review draft PRs, update your CodeRabbit configuration:

reviews:
auto_review:
drafts: true

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@aarontrowbridge
aarontrowbridge marked this pull request as ready for review August 31, 2026 00:18
@aarontrowbridge
aarontrowbridge merged commit a0f6a46 into mainAug 31, 2026
8 checks passed
@aarontrowbridge
aarontrowbridge deleted the 639-feat-amicode_session-tool-spawn-sessions-from-a-session-as-background-tabs branch August 31, 2026 00:18
aarontrowbridge added a commit that referenced this pull request Aug 31, 2026
…dated spawn plan (#646) (#648)
The fleet's aggregated chat DB holds weeks of unclosed threads; nothing
surfaces them. This skill codifies the sweep-and-resume pass: a read-only
SQLite recipe (top-level sessions in a window, last assistant text per
session, pending todos), a five-bucket classification (BLOCKED-ON-USER /
INTERRUPTED / PARKED / AWAITING-REVIEW / STALE), consolidation of spawnable
threads into at most 3-4 THEME-scoped sessions with self-contained seed
prompts, and — only on explicit confirmation — one amicode_session call per
theme (#641's spawn tool; graceful inline fallback when it isn't deployed).
The DB recipe is verified verbatim against the live fleet server DB
(97 sessions in a 14-day window → 60 after the noise filter; todo and
last-text extraction working).
Blocked-on-user and awaiting-review threads are deliberately never spawn
candidates — a fresh session cannot press the button only the human can
press.
@aarontrowbridge
aarontrowbridge restored the 639-feat-amicode_session-tool-spawn-sessions-from-a-session-as-background-tabs branch August 31, 2026 02:40
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: amicode_session tool — spawn sessions from a session as background tabs

1 participant

@aarontrowbridge
, '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(session): amicode_session tool — spawn sessions as background tabs - #641

Merged
aarontrowbridge merged 1 commit into
mainfrom
639-feat-amicode_session-tool-spawn-sessions-from-a-session-as-background-tabs
Aug 31, 2026
Merged

feat(session): amicode_session tool — spawn sessions as background tabs#641
aarontrowbridge merged 1 commit into
mainfrom
639-feat-amicode_session-tool-spawn-sessions-from-a-session-as-background-tabs

Conversation

@aarontrowbridge

Copy link
Copy Markdown
Member

Closes#639

What

A session can now spawn new sessions that surface as background tabs beside the parent — fan-out for parallel work, fork-mode for branching a thread mid-conversation.

PieceWhat it does
amicode_session toolCreates 1–4 child sessions via the engine-provided PluginInput.client (first server-mutating tool in the pack), posts the prompt immediately (explicit model bypasses draft-readiness retries), stamps metadata {spawned_by, spawned_depth}. mode: "fork" seeds from this session's history via the native fork endpoint + metadata PATCH.
Spawn policy (session_spawn.ts)Pure + unit-tested: count cap 4/call, soft depth cap 2 overridable with force, model precedence (arg > parent's model > server default), hey-api unwrap, honest summaries.
Session route effectWatches the server session store for spawned_by == this route's session; opens each child as a background tab (tabs.addSessionTab — never navigates, no focus steal); idempotent via opened-set. Selection logic in session/spawn-tabs.ts (bun tests).
ManifestPer-file hashes updated for the modified session.tsx + the two new overlay files — drift gate green locally.

Design decisions (from #639 discussion)

  • Auto-open, backgroundaddSessionTab never navigates; spawning cannot steal focus.
  • Start immediatelypromptAsync with explicit model; children churn from birth (cost noted in the tool description).
  • Soft depth cap — default 2, force: true overrules; depth is derived from the session's OWN stamp, not the caller's claim, so the cap is enforced by construction.
  • Honest fallback — if no pane shows the parent, the child still spawns and is discoverable in the session list; the fork-mode metadata PATCH is tolerated to fail (child runs, just won't auto-open).

Test evidence

  • test/session_spawn.test.ts — 20 tests, green.
  • spawn-tabs.test.ts — 8 tests, green (bun).
  • tsc --noEmit clean; agents_md + amicode_tools suites green.
  • Full extension suite: the 7 failures are pre-existing on current main (environmental: vendored binary absent, pin fixtures, staged bins, pasqal venv) — verified by re-running the same files on a clean tree; this branch adds zero new failures.
  • drift_gate.mjs: PASS (556 files) — including the Complete the .18 pin: re-extract the app-bundle overlay + re-record the service-contract fixtures (unblocks #622 and main) #636-re-extracted state this branch rebased onto.
  • Overlay app typecheck is not a CI lane (composition proof remains the pre-cutover gate); session.tsx passes esbuild parse + review, consistent with current overlay-PR practice.

Sequencing note

Rebased onto the post-#636 main — the app-bundle-gate red that #639 was originally sequenced behind is resolved on this base.

…bs (#639)
A session can now spawn new sessions that surface as background tabs in
the parent's pane. Three pieces:
- plugin (amicode_session): the pack's FIRST server-mutating tool. Uses the
engine-provided PluginInput.client (server-bound SDK) to create and
immediately prompt 1-4 children; mode=fork seeds from this session's
history via /session/{id}/fork + a metadata PATCH. Children stamp
metadata {spawned_by, spawned_depth}. Policy (count cap 4, soft depth
cap 2 overridable with force, model precedence) lives in
session_spawn.ts, unit-tested (20 tests).
- app (session route): an effect in ResolvedTargetSessionRoute watches the
server session store for sessions stamped spawned_by == this route's
session and opens each as a background tab via tabs.addSessionTab —
never navigates, never steals focus; idempotent via an opened-set.
Selection logic extracted to session/spawn-tabs.ts (8 bun tests).
- app-bundle manifest: hashes for the modified session.tsx + the two new
overlay files (drift gate green).
Test notes: the 7 failing tests in the extension suite are pre-existing on
main (environmental: vendored binary, pin fixtures, staged bins) — this
branch adds none. The overlay app typecheck is not a CI lane (composition
proof remains the pre-cutover gate); session.tsx passes esbuild parse and
review, consistent with current overlay-PR practice.
Closes#639
@coderabbitai

Copy link
Copy Markdown

Important

Draft PR not reviewed

Draft PRs are not automatically reviewed by default.

  • Trigger a manual review

To automatically review draft PRs, update your CodeRabbit configuration:

reviews:
auto_review:
drafts: true

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@aarontrowbridge
aarontrowbridge marked this pull request as ready for review August 31, 2026 00:18
@aarontrowbridge
aarontrowbridge merged commit a0f6a46 into mainAug 31, 2026
8 checks passed
@aarontrowbridge
aarontrowbridge deleted the 639-feat-amicode_session-tool-spawn-sessions-from-a-session-as-background-tabs branch August 31, 2026 00:18
aarontrowbridge added a commit that referenced this pull request Aug 31, 2026
…dated spawn plan (#646) (#648)
The fleet's aggregated chat DB holds weeks of unclosed threads; nothing
surfaces them. This skill codifies the sweep-and-resume pass: a read-only
SQLite recipe (top-level sessions in a window, last assistant text per
session, pending todos), a five-bucket classification (BLOCKED-ON-USER /
INTERRUPTED / PARKED / AWAITING-REVIEW / STALE), consolidation of spawnable
threads into at most 3-4 THEME-scoped sessions with self-contained seed
prompts, and — only on explicit confirmation — one amicode_session call per
theme (#641's spawn tool; graceful inline fallback when it isn't deployed).
The DB recipe is verified verbatim against the live fleet server DB
(97 sessions in a 14-day window → 60 after the noise filter; todo and
last-text extraction working).
Blocked-on-user and awaiting-review threads are deliberately never spawn
candidates — a fresh session cannot press the button only the human can
press.
@aarontrowbridge
aarontrowbridge restored the 639-feat-amicode_session-tool-spawn-sessions-from-a-session-as-background-tabs branch August 31, 2026 02:40
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: amicode_session tool — spawn sessions from a session as background tabs

1 participant

@aarontrowbridge
, '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(session): amicode_session tool — spawn sessions as background tabs - #641

Merged
aarontrowbridge merged 1 commit into
mainfrom
639-feat-amicode_session-tool-spawn-sessions-from-a-session-as-background-tabs
Aug 31, 2026
Merged

feat(session): amicode_session tool — spawn sessions as background tabs#641
aarontrowbridge merged 1 commit into
mainfrom
639-feat-amicode_session-tool-spawn-sessions-from-a-session-as-background-tabs

Conversation

@aarontrowbridge

Copy link
Copy Markdown
Member

Closes#639

What

A session can now spawn new sessions that surface as background tabs beside the parent — fan-out for parallel work, fork-mode for branching a thread mid-conversation.

PieceWhat it does
amicode_session toolCreates 1–4 child sessions via the engine-provided PluginInput.client (first server-mutating tool in the pack), posts the prompt immediately (explicit model bypasses draft-readiness retries), stamps metadata {spawned_by, spawned_depth}. mode: "fork" seeds from this session's history via the native fork endpoint + metadata PATCH.
Spawn policy (session_spawn.ts)Pure + unit-tested: count cap 4/call, soft depth cap 2 overridable with force, model precedence (arg > parent's model > server default), hey-api unwrap, honest summaries.
Session route effectWatches the server session store for spawned_by == this route's session; opens each child as a background tab (tabs.addSessionTab — never navigates, no focus steal); idempotent via opened-set. Selection logic in session/spawn-tabs.ts (bun tests).
ManifestPer-file hashes updated for the modified session.tsx + the two new overlay files — drift gate green locally.

Design decisions (from #639 discussion)

  • Auto-open, backgroundaddSessionTab never navigates; spawning cannot steal focus.
  • Start immediatelypromptAsync with explicit model; children churn from birth (cost noted in the tool description).
  • Soft depth cap — default 2, force: true overrules; depth is derived from the session's OWN stamp, not the caller's claim, so the cap is enforced by construction.
  • Honest fallback — if no pane shows the parent, the child still spawns and is discoverable in the session list; the fork-mode metadata PATCH is tolerated to fail (child runs, just won't auto-open).

Test evidence

  • test/session_spawn.test.ts — 20 tests, green.
  • spawn-tabs.test.ts — 8 tests, green (bun).
  • tsc --noEmit clean; agents_md + amicode_tools suites green.
  • Full extension suite: the 7 failures are pre-existing on current main (environmental: vendored binary absent, pin fixtures, staged bins, pasqal venv) — verified by re-running the same files on a clean tree; this branch adds zero new failures.
  • drift_gate.mjs: PASS (556 files) — including the Complete the .18 pin: re-extract the app-bundle overlay + re-record the service-contract fixtures (unblocks #622 and main) #636-re-extracted state this branch rebased onto.
  • Overlay app typecheck is not a CI lane (composition proof remains the pre-cutover gate); session.tsx passes esbuild parse + review, consistent with current overlay-PR practice.

Sequencing note

Rebased onto the post-#636 main — the app-bundle-gate red that #639 was originally sequenced behind is resolved on this base.

…bs (#639)
A session can now spawn new sessions that surface as background tabs in
the parent's pane. Three pieces:
- plugin (amicode_session): the pack's FIRST server-mutating tool. Uses the
engine-provided PluginInput.client (server-bound SDK) to create and
immediately prompt 1-4 children; mode=fork seeds from this session's
history via /session/{id}/fork + a metadata PATCH. Children stamp
metadata {spawned_by, spawned_depth}. Policy (count cap 4, soft depth
cap 2 overridable with force, model precedence) lives in
session_spawn.ts, unit-tested (20 tests).
- app (session route): an effect in ResolvedTargetSessionRoute watches the
server session store for sessions stamped spawned_by == this route's
session and opens each as a background tab via tabs.addSessionTab —
never navigates, never steals focus; idempotent via an opened-set.
Selection logic extracted to session/spawn-tabs.ts (8 bun tests).
- app-bundle manifest: hashes for the modified session.tsx + the two new
overlay files (drift gate green).
Test notes: the 7 failing tests in the extension suite are pre-existing on
main (environmental: vendored binary, pin fixtures, staged bins) — this
branch adds none. The overlay app typecheck is not a CI lane (composition
proof remains the pre-cutover gate); session.tsx passes esbuild parse and
review, consistent with current overlay-PR practice.
Closes#639
@coderabbitai

Copy link
Copy Markdown

Important

Draft PR not reviewed

Draft PRs are not automatically reviewed by default.

  • Trigger a manual review

To automatically review draft PRs, update your CodeRabbit configuration:

reviews:
auto_review:
drafts: true

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@aarontrowbridge
aarontrowbridge marked this pull request as ready for review August 31, 2026 00:18
@aarontrowbridge
aarontrowbridge merged commit a0f6a46 into mainAug 31, 2026
8 checks passed
@aarontrowbridge
aarontrowbridge deleted the 639-feat-amicode_session-tool-spawn-sessions-from-a-session-as-background-tabs branch August 31, 2026 00:18
aarontrowbridge added a commit that referenced this pull request Aug 31, 2026
…dated spawn plan (#646) (#648)
The fleet's aggregated chat DB holds weeks of unclosed threads; nothing
surfaces them. This skill codifies the sweep-and-resume pass: a read-only
SQLite recipe (top-level sessions in a window, last assistant text per
session, pending todos), a five-bucket classification (BLOCKED-ON-USER /
INTERRUPTED / PARKED / AWAITING-REVIEW / STALE), consolidation of spawnable
threads into at most 3-4 THEME-scoped sessions with self-contained seed
prompts, and — only on explicit confirmation — one amicode_session call per
theme (#641's spawn tool; graceful inline fallback when it isn't deployed).
The DB recipe is verified verbatim against the live fleet server DB
(97 sessions in a 14-day window → 60 after the noise filter; todo and
last-text extraction working).
Blocked-on-user and awaiting-review threads are deliberately never spawn
candidates — a fresh session cannot press the button only the human can
press.
@aarontrowbridge
aarontrowbridge restored the 639-feat-amicode_session-tool-spawn-sessions-from-a-session-as-background-tabs branch August 31, 2026 02:40
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: amicode_session tool — spawn sessions from a session as background tabs

1 participant

@aarontrowbridge
, '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(session): amicode_session tool — spawn sessions as background tabs - #641

Merged
aarontrowbridge merged 1 commit into
mainfrom
639-feat-amicode_session-tool-spawn-sessions-from-a-session-as-background-tabs
Aug 31, 2026
Merged

feat(session): amicode_session tool — spawn sessions as background tabs#641
aarontrowbridge merged 1 commit into
mainfrom
639-feat-amicode_session-tool-spawn-sessions-from-a-session-as-background-tabs

Conversation

@aarontrowbridge

Copy link
Copy Markdown
Member

Closes#639

What

A session can now spawn new sessions that surface as background tabs beside the parent — fan-out for parallel work, fork-mode for branching a thread mid-conversation.

PieceWhat it does
amicode_session toolCreates 1–4 child sessions via the engine-provided PluginInput.client (first server-mutating tool in the pack), posts the prompt immediately (explicit model bypasses draft-readiness retries), stamps metadata {spawned_by, spawned_depth}. mode: "fork" seeds from this session's history via the native fork endpoint + metadata PATCH.
Spawn policy (session_spawn.ts)Pure + unit-tested: count cap 4/call, soft depth cap 2 overridable with force, model precedence (arg > parent's model > server default), hey-api unwrap, honest summaries.
Session route effectWatches the server session store for spawned_by == this route's session; opens each child as a background tab (tabs.addSessionTab — never navigates, no focus steal); idempotent via opened-set. Selection logic in session/spawn-tabs.ts (bun tests).
ManifestPer-file hashes updated for the modified session.tsx + the two new overlay files — drift gate green locally.

Design decisions (from #639 discussion)

  • Auto-open, backgroundaddSessionTab never navigates; spawning cannot steal focus.
  • Start immediatelypromptAsync with explicit model; children churn from birth (cost noted in the tool description).
  • Soft depth cap — default 2, force: true overrules; depth is derived from the session's OWN stamp, not the caller's claim, so the cap is enforced by construction.
  • Honest fallback — if no pane shows the parent, the child still spawns and is discoverable in the session list; the fork-mode metadata PATCH is tolerated to fail (child runs, just won't auto-open).

Test evidence

  • test/session_spawn.test.ts — 20 tests, green.
  • spawn-tabs.test.ts — 8 tests, green (bun).
  • tsc --noEmit clean; agents_md + amicode_tools suites green.
  • Full extension suite: the 7 failures are pre-existing on current main (environmental: vendored binary absent, pin fixtures, staged bins, pasqal venv) — verified by re-running the same files on a clean tree; this branch adds zero new failures.
  • drift_gate.mjs: PASS (556 files) — including the Complete the .18 pin: re-extract the app-bundle overlay + re-record the service-contract fixtures (unblocks #622 and main) #636-re-extracted state this branch rebased onto.
  • Overlay app typecheck is not a CI lane (composition proof remains the pre-cutover gate); session.tsx passes esbuild parse + review, consistent with current overlay-PR practice.

Sequencing note

Rebased onto the post-#636 main — the app-bundle-gate red that #639 was originally sequenced behind is resolved on this base.

…bs (#639)
A session can now spawn new sessions that surface as background tabs in
the parent's pane. Three pieces:
- plugin (amicode_session): the pack's FIRST server-mutating tool. Uses the
engine-provided PluginInput.client (server-bound SDK) to create and
immediately prompt 1-4 children; mode=fork seeds from this session's
history via /session/{id}/fork + a metadata PATCH. Children stamp
metadata {spawned_by, spawned_depth}. Policy (count cap 4, soft depth
cap 2 overridable with force, model precedence) lives in
session_spawn.ts, unit-tested (20 tests).
- app (session route): an effect in ResolvedTargetSessionRoute watches the
server session store for sessions stamped spawned_by == this route's
session and opens each as a background tab via tabs.addSessionTab —
never navigates, never steals focus; idempotent via an opened-set.
Selection logic extracted to session/spawn-tabs.ts (8 bun tests).
- app-bundle manifest: hashes for the modified session.tsx + the two new
overlay files (drift gate green).
Test notes: the 7 failing tests in the extension suite are pre-existing on
main (environmental: vendored binary, pin fixtures, staged bins) — this
branch adds none. The overlay app typecheck is not a CI lane (composition
proof remains the pre-cutover gate); session.tsx passes esbuild parse and
review, consistent with current overlay-PR practice.
Closes#639
@coderabbitai

Copy link
Copy Markdown

Important

Draft PR not reviewed

Draft PRs are not automatically reviewed by default.

  • Trigger a manual review

To automatically review draft PRs, update your CodeRabbit configuration:

reviews:
auto_review:
drafts: true

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@aarontrowbridge
aarontrowbridge marked this pull request as ready for review August 31, 2026 00:18
@aarontrowbridge
aarontrowbridge merged commit a0f6a46 into mainAug 31, 2026
8 checks passed
@aarontrowbridge
aarontrowbridge deleted the 639-feat-amicode_session-tool-spawn-sessions-from-a-session-as-background-tabs branch August 31, 2026 00:18
aarontrowbridge added a commit that referenced this pull request Aug 31, 2026
…dated spawn plan (#646) (#648)
The fleet's aggregated chat DB holds weeks of unclosed threads; nothing
surfaces them. This skill codifies the sweep-and-resume pass: a read-only
SQLite recipe (top-level sessions in a window, last assistant text per
session, pending todos), a five-bucket classification (BLOCKED-ON-USER /
INTERRUPTED / PARKED / AWAITING-REVIEW / STALE), consolidation of spawnable
threads into at most 3-4 THEME-scoped sessions with self-contained seed
prompts, and — only on explicit confirmation — one amicode_session call per
theme (#641's spawn tool; graceful inline fallback when it isn't deployed).
The DB recipe is verified verbatim against the live fleet server DB
(97 sessions in a 14-day window → 60 after the noise filter; todo and
last-text extraction working).
Blocked-on-user and awaiting-review threads are deliberately never spawn
candidates — a fresh session cannot press the button only the human can
press.
@aarontrowbridge
aarontrowbridge restored the 639-feat-amicode_session-tool-spawn-sessions-from-a-session-as-background-tabs branch August 31, 2026 02:40
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: amicode_session tool — spawn sessions from a session as background tabs

1 participant

@aarontrowbridge
, '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(session): amicode_session tool — spawn sessions as background tabs - #641

Merged
aarontrowbridge merged 1 commit into
mainfrom
639-feat-amicode_session-tool-spawn-sessions-from-a-session-as-background-tabs
Aug 31, 2026
Merged

feat(session): amicode_session tool — spawn sessions as background tabs#641
aarontrowbridge merged 1 commit into
mainfrom
639-feat-amicode_session-tool-spawn-sessions-from-a-session-as-background-tabs

Conversation

@aarontrowbridge

Copy link
Copy Markdown
Member

Closes#639

What

A session can now spawn new sessions that surface as background tabs beside the parent — fan-out for parallel work, fork-mode for branching a thread mid-conversation.

PieceWhat it does
amicode_session toolCreates 1–4 child sessions via the engine-provided PluginInput.client (first server-mutating tool in the pack), posts the prompt immediately (explicit model bypasses draft-readiness retries), stamps metadata {spawned_by, spawned_depth}. mode: "fork" seeds from this session's history via the native fork endpoint + metadata PATCH.
Spawn policy (session_spawn.ts)Pure + unit-tested: count cap 4/call, soft depth cap 2 overridable with force, model precedence (arg > parent's model > server default), hey-api unwrap, honest summaries.
Session route effectWatches the server session store for spawned_by == this route's session; opens each child as a background tab (tabs.addSessionTab — never navigates, no focus steal); idempotent via opened-set. Selection logic in session/spawn-tabs.ts (bun tests).
ManifestPer-file hashes updated for the modified session.tsx + the two new overlay files — drift gate green locally.

Design decisions (from #639 discussion)

  • Auto-open, backgroundaddSessionTab never navigates; spawning cannot steal focus.
  • Start immediatelypromptAsync with explicit model; children churn from birth (cost noted in the tool description).
  • Soft depth cap — default 2, force: true overrules; depth is derived from the session's OWN stamp, not the caller's claim, so the cap is enforced by construction.
  • Honest fallback — if no pane shows the parent, the child still spawns and is discoverable in the session list; the fork-mode metadata PATCH is tolerated to fail (child runs, just won't auto-open).

Test evidence

  • test/session_spawn.test.ts — 20 tests, green.
  • spawn-tabs.test.ts — 8 tests, green (bun).
  • tsc --noEmit clean; agents_md + amicode_tools suites green.
  • Full extension suite: the 7 failures are pre-existing on current main (environmental: vendored binary absent, pin fixtures, staged bins, pasqal venv) — verified by re-running the same files on a clean tree; this branch adds zero new failures.
  • drift_gate.mjs: PASS (556 files) — including the Complete the .18 pin: re-extract the app-bundle overlay + re-record the service-contract fixtures (unblocks #622 and main) #636-re-extracted state this branch rebased onto.
  • Overlay app typecheck is not a CI lane (composition proof remains the pre-cutover gate); session.tsx passes esbuild parse + review, consistent with current overlay-PR practice.

Sequencing note

Rebased onto the post-#636 main — the app-bundle-gate red that #639 was originally sequenced behind is resolved on this base.

…bs (#639)
A session can now spawn new sessions that surface as background tabs in
the parent's pane. Three pieces:
- plugin (amicode_session): the pack's FIRST server-mutating tool. Uses the
engine-provided PluginInput.client (server-bound SDK) to create and
immediately prompt 1-4 children; mode=fork seeds from this session's
history via /session/{id}/fork + a metadata PATCH. Children stamp
metadata {spawned_by, spawned_depth}. Policy (count cap 4, soft depth
cap 2 overridable with force, model precedence) lives in
session_spawn.ts, unit-tested (20 tests).
- app (session route): an effect in ResolvedTargetSessionRoute watches the
server session store for sessions stamped spawned_by == this route's
session and opens each as a background tab via tabs.addSessionTab —
never navigates, never steals focus; idempotent via an opened-set.
Selection logic extracted to session/spawn-tabs.ts (8 bun tests).
- app-bundle manifest: hashes for the modified session.tsx + the two new
overlay files (drift gate green).
Test notes: the 7 failing tests in the extension suite are pre-existing on
main (environmental: vendored binary, pin fixtures, staged bins) — this
branch adds none. The overlay app typecheck is not a CI lane (composition
proof remains the pre-cutover gate); session.tsx passes esbuild parse and
review, consistent with current overlay-PR practice.
Closes#639
@coderabbitai

Copy link
Copy Markdown

Important

Draft PR not reviewed

Draft PRs are not automatically reviewed by default.

  • Trigger a manual review

To automatically review draft PRs, update your CodeRabbit configuration:

reviews:
auto_review:
drafts: true

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@aarontrowbridge
aarontrowbridge marked this pull request as ready for review August 31, 2026 00:18
@aarontrowbridge
aarontrowbridge merged commit a0f6a46 into mainAug 31, 2026
8 checks passed
@aarontrowbridge
aarontrowbridge deleted the 639-feat-amicode_session-tool-spawn-sessions-from-a-session-as-background-tabs branch August 31, 2026 00:18
aarontrowbridge added a commit that referenced this pull request Aug 31, 2026
…dated spawn plan (#646) (#648)
The fleet's aggregated chat DB holds weeks of unclosed threads; nothing
surfaces them. This skill codifies the sweep-and-resume pass: a read-only
SQLite recipe (top-level sessions in a window, last assistant text per
session, pending todos), a five-bucket classification (BLOCKED-ON-USER /
INTERRUPTED / PARKED / AWAITING-REVIEW / STALE), consolidation of spawnable
threads into at most 3-4 THEME-scoped sessions with self-contained seed
prompts, and — only on explicit confirmation — one amicode_session call per
theme (#641's spawn tool; graceful inline fallback when it isn't deployed).
The DB recipe is verified verbatim against the live fleet server DB
(97 sessions in a 14-day window → 60 after the noise filter; todo and
last-text extraction working).
Blocked-on-user and awaiting-review threads are deliberately never spawn
candidates — a fresh session cannot press the button only the human can
press.
@aarontrowbridge
aarontrowbridge restored the 639-feat-amicode_session-tool-spawn-sessions-from-a-session-as-background-tabs branch August 31, 2026 02:40
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: amicode_session tool — spawn sessions from a session as background tabs

1 participant

@aarontrowbridge
, '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(session): amicode_session tool — spawn sessions as background tabs - #641

Merged
aarontrowbridge merged 1 commit into
mainfrom
639-feat-amicode_session-tool-spawn-sessions-from-a-session-as-background-tabs
Aug 31, 2026
Merged

feat(session): amicode_session tool — spawn sessions as background tabs#641
aarontrowbridge merged 1 commit into
mainfrom
639-feat-amicode_session-tool-spawn-sessions-from-a-session-as-background-tabs

Conversation

@aarontrowbridge

Copy link
Copy Markdown
Member

Closes#639

What

A session can now spawn new sessions that surface as background tabs beside the parent — fan-out for parallel work, fork-mode for branching a thread mid-conversation.

PieceWhat it does
amicode_session toolCreates 1–4 child sessions via the engine-provided PluginInput.client (first server-mutating tool in the pack), posts the prompt immediately (explicit model bypasses draft-readiness retries), stamps metadata {spawned_by, spawned_depth}. mode: "fork" seeds from this session's history via the native fork endpoint + metadata PATCH.
Spawn policy (session_spawn.ts)Pure + unit-tested: count cap 4/call, soft depth cap 2 overridable with force, model precedence (arg > parent's model > server default), hey-api unwrap, honest summaries.
Session route effectWatches the server session store for spawned_by == this route's session; opens each child as a background tab (tabs.addSessionTab — never navigates, no focus steal); idempotent via opened-set. Selection logic in session/spawn-tabs.ts (bun tests).
ManifestPer-file hashes updated for the modified session.tsx + the two new overlay files — drift gate green locally.

Design decisions (from #639 discussion)

  • Auto-open, backgroundaddSessionTab never navigates; spawning cannot steal focus.
  • Start immediatelypromptAsync with explicit model; children churn from birth (cost noted in the tool description).
  • Soft depth cap — default 2, force: true overrules; depth is derived from the session's OWN stamp, not the caller's claim, so the cap is enforced by construction.
  • Honest fallback — if no pane shows the parent, the child still spawns and is discoverable in the session list; the fork-mode metadata PATCH is tolerated to fail (child runs, just won't auto-open).

Test evidence

  • test/session_spawn.test.ts — 20 tests, green.
  • spawn-tabs.test.ts — 8 tests, green (bun).
  • tsc --noEmit clean; agents_md + amicode_tools suites green.
  • Full extension suite: the 7 failures are pre-existing on current main (environmental: vendored binary absent, pin fixtures, staged bins, pasqal venv) — verified by re-running the same files on a clean tree; this branch adds zero new failures.
  • drift_gate.mjs: PASS (556 files) — including the Complete the .18 pin: re-extract the app-bundle overlay + re-record the service-contract fixtures (unblocks #622 and main) #636-re-extracted state this branch rebased onto.
  • Overlay app typecheck is not a CI lane (composition proof remains the pre-cutover gate); session.tsx passes esbuild parse + review, consistent with current overlay-PR practice.

Sequencing note

Rebased onto the post-#636 main — the app-bundle-gate red that #639 was originally sequenced behind is resolved on this base.

…bs (#639)
A session can now spawn new sessions that surface as background tabs in
the parent's pane. Three pieces:
- plugin (amicode_session): the pack's FIRST server-mutating tool. Uses the
engine-provided PluginInput.client (server-bound SDK) to create and
immediately prompt 1-4 children; mode=fork seeds from this session's
history via /session/{id}/fork + a metadata PATCH. Children stamp
metadata {spawned_by, spawned_depth}. Policy (count cap 4, soft depth
cap 2 overridable with force, model precedence) lives in
session_spawn.ts, unit-tested (20 tests).
- app (session route): an effect in ResolvedTargetSessionRoute watches the
server session store for sessions stamped spawned_by == this route's
session and opens each as a background tab via tabs.addSessionTab —
never navigates, never steals focus; idempotent via an opened-set.
Selection logic extracted to session/spawn-tabs.ts (8 bun tests).
- app-bundle manifest: hashes for the modified session.tsx + the two new
overlay files (drift gate green).
Test notes: the 7 failing tests in the extension suite are pre-existing on
main (environmental: vendored binary, pin fixtures, staged bins) — this
branch adds none. The overlay app typecheck is not a CI lane (composition
proof remains the pre-cutover gate); session.tsx passes esbuild parse and
review, consistent with current overlay-PR practice.
Closes#639
@coderabbitai

Copy link
Copy Markdown

Important

Draft PR not reviewed

Draft PRs are not automatically reviewed by default.

  • Trigger a manual review

To automatically review draft PRs, update your CodeRabbit configuration:

reviews:
auto_review:
drafts: true

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@aarontrowbridge
aarontrowbridge marked this pull request as ready for review August 31, 2026 00:18
@aarontrowbridge
aarontrowbridge merged commit a0f6a46 into mainAug 31, 2026
8 checks passed
@aarontrowbridge
aarontrowbridge deleted the 639-feat-amicode_session-tool-spawn-sessions-from-a-session-as-background-tabs branch August 31, 2026 00:18
aarontrowbridge added a commit that referenced this pull request Aug 31, 2026
…dated spawn plan (#646) (#648)
The fleet's aggregated chat DB holds weeks of unclosed threads; nothing
surfaces them. This skill codifies the sweep-and-resume pass: a read-only
SQLite recipe (top-level sessions in a window, last assistant text per
session, pending todos), a five-bucket classification (BLOCKED-ON-USER /
INTERRUPTED / PARKED / AWAITING-REVIEW / STALE), consolidation of spawnable
threads into at most 3-4 THEME-scoped sessions with self-contained seed
prompts, and — only on explicit confirmation — one amicode_session call per
theme (#641's spawn tool; graceful inline fallback when it isn't deployed).
The DB recipe is verified verbatim against the live fleet server DB
(97 sessions in a 14-day window → 60 after the noise filter; todo and
last-text extraction working).
Blocked-on-user and awaiting-review threads are deliberately never spawn
candidates — a fresh session cannot press the button only the human can
press.
@aarontrowbridge
aarontrowbridge restored the 639-feat-amicode_session-tool-spawn-sessions-from-a-session-as-background-tabs branch August 31, 2026 02:40
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: amicode_session tool — spawn sessions from a session as background tabs

1 participant

@aarontrowbridge
, '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(session): amicode_session tool — spawn sessions as background tabs - #641

Merged
aarontrowbridge merged 1 commit into
mainfrom
639-feat-amicode_session-tool-spawn-sessions-from-a-session-as-background-tabs
Aug 31, 2026
Merged

feat(session): amicode_session tool — spawn sessions as background tabs#641
aarontrowbridge merged 1 commit into
mainfrom
639-feat-amicode_session-tool-spawn-sessions-from-a-session-as-background-tabs

Conversation

@aarontrowbridge

Copy link
Copy Markdown
Member

Closes#639

What

A session can now spawn new sessions that surface as background tabs beside the parent — fan-out for parallel work, fork-mode for branching a thread mid-conversation.

PieceWhat it does
amicode_session toolCreates 1–4 child sessions via the engine-provided PluginInput.client (first server-mutating tool in the pack), posts the prompt immediately (explicit model bypasses draft-readiness retries), stamps metadata {spawned_by, spawned_depth}. mode: "fork" seeds from this session's history via the native fork endpoint + metadata PATCH.
Spawn policy (session_spawn.ts)Pure + unit-tested: count cap 4/call, soft depth cap 2 overridable with force, model precedence (arg > parent's model > server default), hey-api unwrap, honest summaries.
Session route effectWatches the server session store for spawned_by == this route's session; opens each child as a background tab (tabs.addSessionTab — never navigates, no focus steal); idempotent via opened-set. Selection logic in session/spawn-tabs.ts (bun tests).
ManifestPer-file hashes updated for the modified session.tsx + the two new overlay files — drift gate green locally.

Design decisions (from #639 discussion)

  • Auto-open, backgroundaddSessionTab never navigates; spawning cannot steal focus.
  • Start immediatelypromptAsync with explicit model; children churn from birth (cost noted in the tool description).
  • Soft depth cap — default 2, force: true overrules; depth is derived from the session's OWN stamp, not the caller's claim, so the cap is enforced by construction.
  • Honest fallback — if no pane shows the parent, the child still spawns and is discoverable in the session list; the fork-mode metadata PATCH is tolerated to fail (child runs, just won't auto-open).

Test evidence

  • test/session_spawn.test.ts — 20 tests, green.
  • spawn-tabs.test.ts — 8 tests, green (bun).
  • tsc --noEmit clean; agents_md + amicode_tools suites green.
  • Full extension suite: the 7 failures are pre-existing on current main (environmental: vendored binary absent, pin fixtures, staged bins, pasqal venv) — verified by re-running the same files on a clean tree; this branch adds zero new failures.
  • drift_gate.mjs: PASS (556 files) — including the Complete the .18 pin: re-extract the app-bundle overlay + re-record the service-contract fixtures (unblocks #622 and main) #636-re-extracted state this branch rebased onto.
  • Overlay app typecheck is not a CI lane (composition proof remains the pre-cutover gate); session.tsx passes esbuild parse + review, consistent with current overlay-PR practice.

Sequencing note

Rebased onto the post-#636 main — the app-bundle-gate red that #639 was originally sequenced behind is resolved on this base.

…bs (#639)
A session can now spawn new sessions that surface as background tabs in
the parent's pane. Three pieces:
- plugin (amicode_session): the pack's FIRST server-mutating tool. Uses the
engine-provided PluginInput.client (server-bound SDK) to create and
immediately prompt 1-4 children; mode=fork seeds from this session's
history via /session/{id}/fork + a metadata PATCH. Children stamp
metadata {spawned_by, spawned_depth}. Policy (count cap 4, soft depth
cap 2 overridable with force, model precedence) lives in
session_spawn.ts, unit-tested (20 tests).
- app (session route): an effect in ResolvedTargetSessionRoute watches the
server session store for sessions stamped spawned_by == this route's
session and opens each as a background tab via tabs.addSessionTab —
never navigates, never steals focus; idempotent via an opened-set.
Selection logic extracted to session/spawn-tabs.ts (8 bun tests).
- app-bundle manifest: hashes for the modified session.tsx + the two new
overlay files (drift gate green).
Test notes: the 7 failing tests in the extension suite are pre-existing on
main (environmental: vendored binary, pin fixtures, staged bins) — this
branch adds none. The overlay app typecheck is not a CI lane (composition
proof remains the pre-cutover gate); session.tsx passes esbuild parse and
review, consistent with current overlay-PR practice.
Closes#639
@coderabbitai

Copy link
Copy Markdown

Important

Draft PR not reviewed

Draft PRs are not automatically reviewed by default.

  • Trigger a manual review

To automatically review draft PRs, update your CodeRabbit configuration:

reviews:
auto_review:
drafts: true

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@aarontrowbridge
aarontrowbridge marked this pull request as ready for review August 31, 2026 00:18
@aarontrowbridge
aarontrowbridge merged commit a0f6a46 into mainAug 31, 2026
8 checks passed
@aarontrowbridge
aarontrowbridge deleted the 639-feat-amicode_session-tool-spawn-sessions-from-a-session-as-background-tabs branch August 31, 2026 00:18
aarontrowbridge added a commit that referenced this pull request Aug 31, 2026
…dated spawn plan (#646) (#648)
The fleet's aggregated chat DB holds weeks of unclosed threads; nothing
surfaces them. This skill codifies the sweep-and-resume pass: a read-only
SQLite recipe (top-level sessions in a window, last assistant text per
session, pending todos), a five-bucket classification (BLOCKED-ON-USER /
INTERRUPTED / PARKED / AWAITING-REVIEW / STALE), consolidation of spawnable
threads into at most 3-4 THEME-scoped sessions with self-contained seed
prompts, and — only on explicit confirmation — one amicode_session call per
theme (#641's spawn tool; graceful inline fallback when it isn't deployed).
The DB recipe is verified verbatim against the live fleet server DB
(97 sessions in a 14-day window → 60 after the noise filter; todo and
last-text extraction working).
Blocked-on-user and awaiting-review threads are deliberately never spawn
candidates — a fresh session cannot press the button only the human can
press.
@aarontrowbridge
aarontrowbridge restored the 639-feat-amicode_session-tool-spawn-sessions-from-a-session-as-background-tabs branch August 31, 2026 02:40
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: amicode_session tool — spawn sessions from a session as background tabs

1 participant

@aarontrowbridge