refactor: inline playbook session runtime, unify base-resource identity - #34

Merged
heimanba merged 6 commits into
mainfrom
refactor/inline-playbook-session-runtime
Jul 20, 2026
Merged

refactor: inline playbook session runtime, unify base-resource identity#34
heimanba merged 6 commits into
mainfrom
refactor/inline-playbook-session-runtime

Conversation

@heimanba

@heimanbaheimanba commented Jul 19, 2026

Copy link
Copy Markdown
Contributor

Summary

This PR consolidates four changes that simplify the session runtime architecture and strengthen base-resource identity tracking:

1. feat(byoc): runtime config, sessions and vaults updates

  • Add metadata stamps (agents.base / agents.vault) to buildRuntimeConfig so the webui can identify managed base resources via remote listing.
  • Migrate playground state from examples/bailian/bailian-cli/agents.state.json to ~/.agents/playground.state.json (one-time auto-migration preserves remote_ids).
  • Relax findBaseVault to match on metadata stamp alone (not display_name), since the engine and imperative path may create vaults with different display_name values but both always set the stamp.

2. refactor: inline session runtime from playbooks into server

  • Move session-runtime.ts from @openagentpack/playbooks into apps/server/src/services/sessions/playbook-session-adapter/runtime.ts — the server is the only production consumer.
  • Replace the generic PlaybookSessionRuntimeAdapters<TDetail, TEvent, TSession, TAgent> with concrete PlaybookSessionRuntimeDeps using ProviderSessionEvent/Session directly.
  • Add runtime.test.ts with full coverage of pick, start, send, list, getDetail, delete.

3. refactor(playbooks): drop unused readiness mapping

  • Remove SKILL_STATUS_CODE, skillStatusFromCode, and numeric↔string mapping code — no remaining consumers after Mode B removal.
  • Update parity tests to only assert string-based status normalization.

4. chore: remove playground dead dep on playbooks, update description

  • Drop unused @openagentpack/playbooks devDependency from packages/playground.
  • Clean up all "Mode A"/"Mode B" terminology from comments across the codebase.

Agent declares environment + vault

  • toAgentBuildInput now resolves environment and vault names from the assembled config and sets them on the agent declaration, so syncAgentResources manages base resources through the plan/apply engine (state tracking + drift detection).
  • Fail-fast invariant checks ensure exactly one environment (and at most one vault per provider).

Test results

All 812 tests pass across all workspaces. Typecheck, architecture conformance, and lint all green.

Behavior / risk

No breaking API change is intended. Runtime base resources keep their managed identity while playground state moves to ~/.agents/playground.state.json with one-time legacy migration. The PR gate now asks for risk and validation evidence in the PR description for high-risk changes, including verification-policy changes, without requiring a special commit-message marker or history rewrite. A generated bun.lock change alone is covered by audit and compatibility checks.

Validation

  • bun scripts/verify.ts full --step typecheck
  • bun scripts/verify.ts full --step lint
  • bun scripts/verify.ts full --step architecture
  • bun scripts/verify.ts full --step test

Change-Id: I5d340bb58f1d0d9a68607024aa49fe0b37c1eab6
Co-developed-by: Qoder <noreply@qoder.com>
readinessFromPick, PlaybookReadiness, and their tests have no
production consumer: the server's agent readiness flows through the
sdk's listAgentsWithReadiness instead. Remove the dead code before
inlining the session runtime.
Change-Id: I131ba28e7fbee9ec2aaf3a44467d27bc590dfd28
Co-developed-by: OpenCode <noreply@opencode.ai>
The playbook session-runtime adapter layer (createPlaybookSessionRuntime,
pickPlaybookAgent, PlaybookAgentIdentityMismatchError, and ~15 input/output
types) lived in @openagentpack/playbooks but had exactly one production
consumer: the server's playbook-session-adapter. This commit:
- Moves the runtime orchestration and agent-pick logic into a new
apps/server/.../playbook-session-adapter/runtime.ts with all generic
type parameters instantiated to their concrete server types.
- Replaces the four adapter interfaces with a single concrete
PlaybookSessionRuntimeDeps type (dependency injection preserved for
testability, but no cross-package abstraction).
- Migrates tests to apps/server with type-safe fake constructors.
- Removes session-runtime.ts from @openagentpack/playbooks and cleans
up all re-exports from the package index.
- Eliminates the duplicate ListPlaybookSessionsInput definition in
sessions.ts (now imported from runtime.ts).
Behavioral changes: none. The PlaybookAgentIdentityMismatchError still
surfaces as HTTP 500 (no route-level catch); a future PR can map it to
4xx if desired.
Change-Id: Ia4276ea3626877163f60529342e7da1ba3a991bd
Co-developed-by: OpenCode <noreply@opencode.ai>
playground's devDependency on @openagentpack/playbooks had zero imports
in its source tree. Remove it.
Also update the playbooks package description now that the session
runtime orchestration no longer lives there.
Change-Id: Ic6ac9936561f2186da6b2cdd37d8ffd0121402d3
Co-developed-by: OpenCode <noreply@opencode.ai>
Change-Id: I1f4b06c06ca304d98f5a1151aad48f1bf4537cec
@heimanba
heimanba merged commit 414589e into mainJul 20, 2026
15 checks passed
@heimanba
heimanba deleted the refactor/inline-playbook-session-runtime branch July 20, 2026 02:02
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

@heimanba
, '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

refactor: inline playbook session runtime, unify base-resource identity - #34

Merged
heimanba merged 6 commits into
mainfrom
refactor/inline-playbook-session-runtime
Jul 20, 2026
Merged

refactor: inline playbook session runtime, unify base-resource identity#34
heimanba merged 6 commits into
mainfrom
refactor/inline-playbook-session-runtime

Conversation

@heimanba

@heimanbaheimanba commented Jul 19, 2026

Copy link
Copy Markdown
Contributor

Summary

This PR consolidates four changes that simplify the session runtime architecture and strengthen base-resource identity tracking:

1. feat(byoc): runtime config, sessions and vaults updates

  • Add metadata stamps (agents.base / agents.vault) to buildRuntimeConfig so the webui can identify managed base resources via remote listing.
  • Migrate playground state from examples/bailian/bailian-cli/agents.state.json to ~/.agents/playground.state.json (one-time auto-migration preserves remote_ids).
  • Relax findBaseVault to match on metadata stamp alone (not display_name), since the engine and imperative path may create vaults with different display_name values but both always set the stamp.

2. refactor: inline session runtime from playbooks into server

  • Move session-runtime.ts from @openagentpack/playbooks into apps/server/src/services/sessions/playbook-session-adapter/runtime.ts — the server is the only production consumer.
  • Replace the generic PlaybookSessionRuntimeAdapters<TDetail, TEvent, TSession, TAgent> with concrete PlaybookSessionRuntimeDeps using ProviderSessionEvent/Session directly.
  • Add runtime.test.ts with full coverage of pick, start, send, list, getDetail, delete.

3. refactor(playbooks): drop unused readiness mapping

  • Remove SKILL_STATUS_CODE, skillStatusFromCode, and numeric↔string mapping code — no remaining consumers after Mode B removal.
  • Update parity tests to only assert string-based status normalization.

4. chore: remove playground dead dep on playbooks, update description

  • Drop unused @openagentpack/playbooks devDependency from packages/playground.
  • Clean up all "Mode A"/"Mode B" terminology from comments across the codebase.

Agent declares environment + vault

  • toAgentBuildInput now resolves environment and vault names from the assembled config and sets them on the agent declaration, so syncAgentResources manages base resources through the plan/apply engine (state tracking + drift detection).
  • Fail-fast invariant checks ensure exactly one environment (and at most one vault per provider).

Test results

All 812 tests pass across all workspaces. Typecheck, architecture conformance, and lint all green.

Behavior / risk

No breaking API change is intended. Runtime base resources keep their managed identity while playground state moves to ~/.agents/playground.state.json with one-time legacy migration. The PR gate now asks for risk and validation evidence in the PR description for high-risk changes, including verification-policy changes, without requiring a special commit-message marker or history rewrite. A generated bun.lock change alone is covered by audit and compatibility checks.

Validation

  • bun scripts/verify.ts full --step typecheck
  • bun scripts/verify.ts full --step lint
  • bun scripts/verify.ts full --step architecture
  • bun scripts/verify.ts full --step test

Change-Id: I5d340bb58f1d0d9a68607024aa49fe0b37c1eab6
Co-developed-by: Qoder <noreply@qoder.com>
readinessFromPick, PlaybookReadiness, and their tests have no
production consumer: the server's agent readiness flows through the
sdk's listAgentsWithReadiness instead. Remove the dead code before
inlining the session runtime.
Change-Id: I131ba28e7fbee9ec2aaf3a44467d27bc590dfd28
Co-developed-by: OpenCode <noreply@opencode.ai>
The playbook session-runtime adapter layer (createPlaybookSessionRuntime,
pickPlaybookAgent, PlaybookAgentIdentityMismatchError, and ~15 input/output
types) lived in @openagentpack/playbooks but had exactly one production
consumer: the server's playbook-session-adapter. This commit:
- Moves the runtime orchestration and agent-pick logic into a new
apps/server/.../playbook-session-adapter/runtime.ts with all generic
type parameters instantiated to their concrete server types.
- Replaces the four adapter interfaces with a single concrete
PlaybookSessionRuntimeDeps type (dependency injection preserved for
testability, but no cross-package abstraction).
- Migrates tests to apps/server with type-safe fake constructors.
- Removes session-runtime.ts from @openagentpack/playbooks and cleans
up all re-exports from the package index.
- Eliminates the duplicate ListPlaybookSessionsInput definition in
sessions.ts (now imported from runtime.ts).
Behavioral changes: none. The PlaybookAgentIdentityMismatchError still
surfaces as HTTP 500 (no route-level catch); a future PR can map it to
4xx if desired.
Change-Id: Ia4276ea3626877163f60529342e7da1ba3a991bd
Co-developed-by: OpenCode <noreply@opencode.ai>
playground's devDependency on @openagentpack/playbooks had zero imports
in its source tree. Remove it.
Also update the playbooks package description now that the session
runtime orchestration no longer lives there.
Change-Id: Ic6ac9936561f2186da6b2cdd37d8ffd0121402d3
Co-developed-by: OpenCode <noreply@opencode.ai>
Change-Id: I1f4b06c06ca304d98f5a1151aad48f1bf4537cec
@heimanba
heimanba merged commit 414589e into mainJul 20, 2026
15 checks passed
@heimanba
heimanba deleted the refactor/inline-playbook-session-runtime branch July 20, 2026 02:02
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

@heimanba
, '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

refactor: inline playbook session runtime, unify base-resource identity - #34

Merged
heimanba merged 6 commits into
mainfrom
refactor/inline-playbook-session-runtime
Jul 20, 2026
Merged

refactor: inline playbook session runtime, unify base-resource identity#34
heimanba merged 6 commits into
mainfrom
refactor/inline-playbook-session-runtime

Conversation

@heimanba

@heimanbaheimanba commented Jul 19, 2026

Copy link
Copy Markdown
Contributor

Summary

This PR consolidates four changes that simplify the session runtime architecture and strengthen base-resource identity tracking:

1. feat(byoc): runtime config, sessions and vaults updates

  • Add metadata stamps (agents.base / agents.vault) to buildRuntimeConfig so the webui can identify managed base resources via remote listing.
  • Migrate playground state from examples/bailian/bailian-cli/agents.state.json to ~/.agents/playground.state.json (one-time auto-migration preserves remote_ids).
  • Relax findBaseVault to match on metadata stamp alone (not display_name), since the engine and imperative path may create vaults with different display_name values but both always set the stamp.

2. refactor: inline session runtime from playbooks into server

  • Move session-runtime.ts from @openagentpack/playbooks into apps/server/src/services/sessions/playbook-session-adapter/runtime.ts — the server is the only production consumer.
  • Replace the generic PlaybookSessionRuntimeAdapters<TDetail, TEvent, TSession, TAgent> with concrete PlaybookSessionRuntimeDeps using ProviderSessionEvent/Session directly.
  • Add runtime.test.ts with full coverage of pick, start, send, list, getDetail, delete.

3. refactor(playbooks): drop unused readiness mapping

  • Remove SKILL_STATUS_CODE, skillStatusFromCode, and numeric↔string mapping code — no remaining consumers after Mode B removal.
  • Update parity tests to only assert string-based status normalization.

4. chore: remove playground dead dep on playbooks, update description

  • Drop unused @openagentpack/playbooks devDependency from packages/playground.
  • Clean up all "Mode A"/"Mode B" terminology from comments across the codebase.

Agent declares environment + vault

  • toAgentBuildInput now resolves environment and vault names from the assembled config and sets them on the agent declaration, so syncAgentResources manages base resources through the plan/apply engine (state tracking + drift detection).
  • Fail-fast invariant checks ensure exactly one environment (and at most one vault per provider).

Test results

All 812 tests pass across all workspaces. Typecheck, architecture conformance, and lint all green.

Behavior / risk

No breaking API change is intended. Runtime base resources keep their managed identity while playground state moves to ~/.agents/playground.state.json with one-time legacy migration. The PR gate now asks for risk and validation evidence in the PR description for high-risk changes, including verification-policy changes, without requiring a special commit-message marker or history rewrite. A generated bun.lock change alone is covered by audit and compatibility checks.

Validation

  • bun scripts/verify.ts full --step typecheck
  • bun scripts/verify.ts full --step lint
  • bun scripts/verify.ts full --step architecture
  • bun scripts/verify.ts full --step test

Change-Id: I5d340bb58f1d0d9a68607024aa49fe0b37c1eab6
Co-developed-by: Qoder <noreply@qoder.com>
readinessFromPick, PlaybookReadiness, and their tests have no
production consumer: the server's agent readiness flows through the
sdk's listAgentsWithReadiness instead. Remove the dead code before
inlining the session runtime.
Change-Id: I131ba28e7fbee9ec2aaf3a44467d27bc590dfd28
Co-developed-by: OpenCode <noreply@opencode.ai>
The playbook session-runtime adapter layer (createPlaybookSessionRuntime,
pickPlaybookAgent, PlaybookAgentIdentityMismatchError, and ~15 input/output
types) lived in @openagentpack/playbooks but had exactly one production
consumer: the server's playbook-session-adapter. This commit:
- Moves the runtime orchestration and agent-pick logic into a new
apps/server/.../playbook-session-adapter/runtime.ts with all generic
type parameters instantiated to their concrete server types.
- Replaces the four adapter interfaces with a single concrete
PlaybookSessionRuntimeDeps type (dependency injection preserved for
testability, but no cross-package abstraction).
- Migrates tests to apps/server with type-safe fake constructors.
- Removes session-runtime.ts from @openagentpack/playbooks and cleans
up all re-exports from the package index.
- Eliminates the duplicate ListPlaybookSessionsInput definition in
sessions.ts (now imported from runtime.ts).
Behavioral changes: none. The PlaybookAgentIdentityMismatchError still
surfaces as HTTP 500 (no route-level catch); a future PR can map it to
4xx if desired.
Change-Id: Ia4276ea3626877163f60529342e7da1ba3a991bd
Co-developed-by: OpenCode <noreply@opencode.ai>
playground's devDependency on @openagentpack/playbooks had zero imports
in its source tree. Remove it.
Also update the playbooks package description now that the session
runtime orchestration no longer lives there.
Change-Id: Ic6ac9936561f2186da6b2cdd37d8ffd0121402d3
Co-developed-by: OpenCode <noreply@opencode.ai>
Change-Id: I1f4b06c06ca304d98f5a1151aad48f1bf4537cec
@heimanba
heimanba merged commit 414589e into mainJul 20, 2026
15 checks passed
@heimanba
heimanba deleted the refactor/inline-playbook-session-runtime branch July 20, 2026 02:02
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

@heimanba
, '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

refactor: inline playbook session runtime, unify base-resource identity - #34

Merged
heimanba merged 6 commits into
mainfrom
refactor/inline-playbook-session-runtime
Jul 20, 2026
Merged

refactor: inline playbook session runtime, unify base-resource identity#34
heimanba merged 6 commits into
mainfrom
refactor/inline-playbook-session-runtime

Conversation

@heimanba

@heimanbaheimanba commented Jul 19, 2026

Copy link
Copy Markdown
Contributor

Summary

This PR consolidates four changes that simplify the session runtime architecture and strengthen base-resource identity tracking:

1. feat(byoc): runtime config, sessions and vaults updates

  • Add metadata stamps (agents.base / agents.vault) to buildRuntimeConfig so the webui can identify managed base resources via remote listing.
  • Migrate playground state from examples/bailian/bailian-cli/agents.state.json to ~/.agents/playground.state.json (one-time auto-migration preserves remote_ids).
  • Relax findBaseVault to match on metadata stamp alone (not display_name), since the engine and imperative path may create vaults with different display_name values but both always set the stamp.

2. refactor: inline session runtime from playbooks into server

  • Move session-runtime.ts from @openagentpack/playbooks into apps/server/src/services/sessions/playbook-session-adapter/runtime.ts — the server is the only production consumer.
  • Replace the generic PlaybookSessionRuntimeAdapters<TDetail, TEvent, TSession, TAgent> with concrete PlaybookSessionRuntimeDeps using ProviderSessionEvent/Session directly.
  • Add runtime.test.ts with full coverage of pick, start, send, list, getDetail, delete.

3. refactor(playbooks): drop unused readiness mapping

  • Remove SKILL_STATUS_CODE, skillStatusFromCode, and numeric↔string mapping code — no remaining consumers after Mode B removal.
  • Update parity tests to only assert string-based status normalization.

4. chore: remove playground dead dep on playbooks, update description

  • Drop unused @openagentpack/playbooks devDependency from packages/playground.
  • Clean up all "Mode A"/"Mode B" terminology from comments across the codebase.

Agent declares environment + vault

  • toAgentBuildInput now resolves environment and vault names from the assembled config and sets them on the agent declaration, so syncAgentResources manages base resources through the plan/apply engine (state tracking + drift detection).
  • Fail-fast invariant checks ensure exactly one environment (and at most one vault per provider).

Test results

All 812 tests pass across all workspaces. Typecheck, architecture conformance, and lint all green.

Behavior / risk

No breaking API change is intended. Runtime base resources keep their managed identity while playground state moves to ~/.agents/playground.state.json with one-time legacy migration. The PR gate now asks for risk and validation evidence in the PR description for high-risk changes, including verification-policy changes, without requiring a special commit-message marker or history rewrite. A generated bun.lock change alone is covered by audit and compatibility checks.

Validation

  • bun scripts/verify.ts full --step typecheck
  • bun scripts/verify.ts full --step lint
  • bun scripts/verify.ts full --step architecture
  • bun scripts/verify.ts full --step test

Change-Id: I5d340bb58f1d0d9a68607024aa49fe0b37c1eab6
Co-developed-by: Qoder <noreply@qoder.com>
readinessFromPick, PlaybookReadiness, and their tests have no
production consumer: the server's agent readiness flows through the
sdk's listAgentsWithReadiness instead. Remove the dead code before
inlining the session runtime.
Change-Id: I131ba28e7fbee9ec2aaf3a44467d27bc590dfd28
Co-developed-by: OpenCode <noreply@opencode.ai>
The playbook session-runtime adapter layer (createPlaybookSessionRuntime,
pickPlaybookAgent, PlaybookAgentIdentityMismatchError, and ~15 input/output
types) lived in @openagentpack/playbooks but had exactly one production
consumer: the server's playbook-session-adapter. This commit:
- Moves the runtime orchestration and agent-pick logic into a new
apps/server/.../playbook-session-adapter/runtime.ts with all generic
type parameters instantiated to their concrete server types.
- Replaces the four adapter interfaces with a single concrete
PlaybookSessionRuntimeDeps type (dependency injection preserved for
testability, but no cross-package abstraction).
- Migrates tests to apps/server with type-safe fake constructors.
- Removes session-runtime.ts from @openagentpack/playbooks and cleans
up all re-exports from the package index.
- Eliminates the duplicate ListPlaybookSessionsInput definition in
sessions.ts (now imported from runtime.ts).
Behavioral changes: none. The PlaybookAgentIdentityMismatchError still
surfaces as HTTP 500 (no route-level catch); a future PR can map it to
4xx if desired.
Change-Id: Ia4276ea3626877163f60529342e7da1ba3a991bd
Co-developed-by: OpenCode <noreply@opencode.ai>
playground's devDependency on @openagentpack/playbooks had zero imports
in its source tree. Remove it.
Also update the playbooks package description now that the session
runtime orchestration no longer lives there.
Change-Id: Ic6ac9936561f2186da6b2cdd37d8ffd0121402d3
Co-developed-by: OpenCode <noreply@opencode.ai>
Change-Id: I1f4b06c06ca304d98f5a1151aad48f1bf4537cec
@heimanba
heimanba merged commit 414589e into mainJul 20, 2026
15 checks passed
@heimanba
heimanba deleted the refactor/inline-playbook-session-runtime branch July 20, 2026 02:02
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

@heimanba
, '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

refactor: inline playbook session runtime, unify base-resource identity - #34

Merged
heimanba merged 6 commits into
mainfrom
refactor/inline-playbook-session-runtime
Jul 20, 2026
Merged

refactor: inline playbook session runtime, unify base-resource identity#34
heimanba merged 6 commits into
mainfrom
refactor/inline-playbook-session-runtime

Conversation

@heimanba

@heimanbaheimanba commented Jul 19, 2026

Copy link
Copy Markdown
Contributor

Summary

This PR consolidates four changes that simplify the session runtime architecture and strengthen base-resource identity tracking:

1. feat(byoc): runtime config, sessions and vaults updates

  • Add metadata stamps (agents.base / agents.vault) to buildRuntimeConfig so the webui can identify managed base resources via remote listing.
  • Migrate playground state from examples/bailian/bailian-cli/agents.state.json to ~/.agents/playground.state.json (one-time auto-migration preserves remote_ids).
  • Relax findBaseVault to match on metadata stamp alone (not display_name), since the engine and imperative path may create vaults with different display_name values but both always set the stamp.

2. refactor: inline session runtime from playbooks into server

  • Move session-runtime.ts from @openagentpack/playbooks into apps/server/src/services/sessions/playbook-session-adapter/runtime.ts — the server is the only production consumer.
  • Replace the generic PlaybookSessionRuntimeAdapters<TDetail, TEvent, TSession, TAgent> with concrete PlaybookSessionRuntimeDeps using ProviderSessionEvent/Session directly.
  • Add runtime.test.ts with full coverage of pick, start, send, list, getDetail, delete.

3. refactor(playbooks): drop unused readiness mapping

  • Remove SKILL_STATUS_CODE, skillStatusFromCode, and numeric↔string mapping code — no remaining consumers after Mode B removal.
  • Update parity tests to only assert string-based status normalization.

4. chore: remove playground dead dep on playbooks, update description

  • Drop unused @openagentpack/playbooks devDependency from packages/playground.
  • Clean up all "Mode A"/"Mode B" terminology from comments across the codebase.

Agent declares environment + vault

  • toAgentBuildInput now resolves environment and vault names from the assembled config and sets them on the agent declaration, so syncAgentResources manages base resources through the plan/apply engine (state tracking + drift detection).
  • Fail-fast invariant checks ensure exactly one environment (and at most one vault per provider).

Test results

All 812 tests pass across all workspaces. Typecheck, architecture conformance, and lint all green.

Behavior / risk

No breaking API change is intended. Runtime base resources keep their managed identity while playground state moves to ~/.agents/playground.state.json with one-time legacy migration. The PR gate now asks for risk and validation evidence in the PR description for high-risk changes, including verification-policy changes, without requiring a special commit-message marker or history rewrite. A generated bun.lock change alone is covered by audit and compatibility checks.

Validation

  • bun scripts/verify.ts full --step typecheck
  • bun scripts/verify.ts full --step lint
  • bun scripts/verify.ts full --step architecture
  • bun scripts/verify.ts full --step test

Change-Id: I5d340bb58f1d0d9a68607024aa49fe0b37c1eab6
Co-developed-by: Qoder <noreply@qoder.com>
readinessFromPick, PlaybookReadiness, and their tests have no
production consumer: the server's agent readiness flows through the
sdk's listAgentsWithReadiness instead. Remove the dead code before
inlining the session runtime.
Change-Id: I131ba28e7fbee9ec2aaf3a44467d27bc590dfd28
Co-developed-by: OpenCode <noreply@opencode.ai>
The playbook session-runtime adapter layer (createPlaybookSessionRuntime,
pickPlaybookAgent, PlaybookAgentIdentityMismatchError, and ~15 input/output
types) lived in @openagentpack/playbooks but had exactly one production
consumer: the server's playbook-session-adapter. This commit:
- Moves the runtime orchestration and agent-pick logic into a new
apps/server/.../playbook-session-adapter/runtime.ts with all generic
type parameters instantiated to their concrete server types.
- Replaces the four adapter interfaces with a single concrete
PlaybookSessionRuntimeDeps type (dependency injection preserved for
testability, but no cross-package abstraction).
- Migrates tests to apps/server with type-safe fake constructors.
- Removes session-runtime.ts from @openagentpack/playbooks and cleans
up all re-exports from the package index.
- Eliminates the duplicate ListPlaybookSessionsInput definition in
sessions.ts (now imported from runtime.ts).
Behavioral changes: none. The PlaybookAgentIdentityMismatchError still
surfaces as HTTP 500 (no route-level catch); a future PR can map it to
4xx if desired.
Change-Id: Ia4276ea3626877163f60529342e7da1ba3a991bd
Co-developed-by: OpenCode <noreply@opencode.ai>
playground's devDependency on @openagentpack/playbooks had zero imports
in its source tree. Remove it.
Also update the playbooks package description now that the session
runtime orchestration no longer lives there.
Change-Id: Ic6ac9936561f2186da6b2cdd37d8ffd0121402d3
Co-developed-by: OpenCode <noreply@opencode.ai>
Change-Id: I1f4b06c06ca304d98f5a1151aad48f1bf4537cec
@heimanba
heimanba merged commit 414589e into mainJul 20, 2026
15 checks passed
@heimanba
heimanba deleted the refactor/inline-playbook-session-runtime branch July 20, 2026 02:02
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

@heimanba
, '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

refactor: inline playbook session runtime, unify base-resource identity - #34

Merged
heimanba merged 6 commits into
mainfrom
refactor/inline-playbook-session-runtime
Jul 20, 2026
Merged

refactor: inline playbook session runtime, unify base-resource identity#34
heimanba merged 6 commits into
mainfrom
refactor/inline-playbook-session-runtime

Conversation

@heimanba

@heimanbaheimanba commented Jul 19, 2026

Copy link
Copy Markdown
Contributor

Summary

This PR consolidates four changes that simplify the session runtime architecture and strengthen base-resource identity tracking:

1. feat(byoc): runtime config, sessions and vaults updates

  • Add metadata stamps (agents.base / agents.vault) to buildRuntimeConfig so the webui can identify managed base resources via remote listing.
  • Migrate playground state from examples/bailian/bailian-cli/agents.state.json to ~/.agents/playground.state.json (one-time auto-migration preserves remote_ids).
  • Relax findBaseVault to match on metadata stamp alone (not display_name), since the engine and imperative path may create vaults with different display_name values but both always set the stamp.

2. refactor: inline session runtime from playbooks into server

  • Move session-runtime.ts from @openagentpack/playbooks into apps/server/src/services/sessions/playbook-session-adapter/runtime.ts — the server is the only production consumer.
  • Replace the generic PlaybookSessionRuntimeAdapters<TDetail, TEvent, TSession, TAgent> with concrete PlaybookSessionRuntimeDeps using ProviderSessionEvent/Session directly.
  • Add runtime.test.ts with full coverage of pick, start, send, list, getDetail, delete.

3. refactor(playbooks): drop unused readiness mapping

  • Remove SKILL_STATUS_CODE, skillStatusFromCode, and numeric↔string mapping code — no remaining consumers after Mode B removal.
  • Update parity tests to only assert string-based status normalization.

4. chore: remove playground dead dep on playbooks, update description

  • Drop unused @openagentpack/playbooks devDependency from packages/playground.
  • Clean up all "Mode A"/"Mode B" terminology from comments across the codebase.

Agent declares environment + vault

  • toAgentBuildInput now resolves environment and vault names from the assembled config and sets them on the agent declaration, so syncAgentResources manages base resources through the plan/apply engine (state tracking + drift detection).
  • Fail-fast invariant checks ensure exactly one environment (and at most one vault per provider).

Test results

All 812 tests pass across all workspaces. Typecheck, architecture conformance, and lint all green.

Behavior / risk

No breaking API change is intended. Runtime base resources keep their managed identity while playground state moves to ~/.agents/playground.state.json with one-time legacy migration. The PR gate now asks for risk and validation evidence in the PR description for high-risk changes, including verification-policy changes, without requiring a special commit-message marker or history rewrite. A generated bun.lock change alone is covered by audit and compatibility checks.

Validation

  • bun scripts/verify.ts full --step typecheck
  • bun scripts/verify.ts full --step lint
  • bun scripts/verify.ts full --step architecture
  • bun scripts/verify.ts full --step test

Change-Id: I5d340bb58f1d0d9a68607024aa49fe0b37c1eab6
Co-developed-by: Qoder <noreply@qoder.com>
readinessFromPick, PlaybookReadiness, and their tests have no
production consumer: the server's agent readiness flows through the
sdk's listAgentsWithReadiness instead. Remove the dead code before
inlining the session runtime.
Change-Id: I131ba28e7fbee9ec2aaf3a44467d27bc590dfd28
Co-developed-by: OpenCode <noreply@opencode.ai>
The playbook session-runtime adapter layer (createPlaybookSessionRuntime,
pickPlaybookAgent, PlaybookAgentIdentityMismatchError, and ~15 input/output
types) lived in @openagentpack/playbooks but had exactly one production
consumer: the server's playbook-session-adapter. This commit:
- Moves the runtime orchestration and agent-pick logic into a new
apps/server/.../playbook-session-adapter/runtime.ts with all generic
type parameters instantiated to their concrete server types.
- Replaces the four adapter interfaces with a single concrete
PlaybookSessionRuntimeDeps type (dependency injection preserved for
testability, but no cross-package abstraction).
- Migrates tests to apps/server with type-safe fake constructors.
- Removes session-runtime.ts from @openagentpack/playbooks and cleans
up all re-exports from the package index.
- Eliminates the duplicate ListPlaybookSessionsInput definition in
sessions.ts (now imported from runtime.ts).
Behavioral changes: none. The PlaybookAgentIdentityMismatchError still
surfaces as HTTP 500 (no route-level catch); a future PR can map it to
4xx if desired.
Change-Id: Ia4276ea3626877163f60529342e7da1ba3a991bd
Co-developed-by: OpenCode <noreply@opencode.ai>
playground's devDependency on @openagentpack/playbooks had zero imports
in its source tree. Remove it.
Also update the playbooks package description now that the session
runtime orchestration no longer lives there.
Change-Id: Ic6ac9936561f2186da6b2cdd37d8ffd0121402d3
Co-developed-by: OpenCode <noreply@opencode.ai>
Change-Id: I1f4b06c06ca304d98f5a1151aad48f1bf4537cec
@heimanba
heimanba merged commit 414589e into mainJul 20, 2026
15 checks passed
@heimanba
heimanba deleted the refactor/inline-playbook-session-runtime branch July 20, 2026 02:02
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

@heimanba
, '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

refactor: inline playbook session runtime, unify base-resource identity - #34

Merged
heimanba merged 6 commits into
mainfrom
refactor/inline-playbook-session-runtime
Jul 20, 2026
Merged

refactor: inline playbook session runtime, unify base-resource identity#34
heimanba merged 6 commits into
mainfrom
refactor/inline-playbook-session-runtime

Conversation

@heimanba

@heimanbaheimanba commented Jul 19, 2026

Copy link
Copy Markdown
Contributor

Summary

This PR consolidates four changes that simplify the session runtime architecture and strengthen base-resource identity tracking:

1. feat(byoc): runtime config, sessions and vaults updates

  • Add metadata stamps (agents.base / agents.vault) to buildRuntimeConfig so the webui can identify managed base resources via remote listing.
  • Migrate playground state from examples/bailian/bailian-cli/agents.state.json to ~/.agents/playground.state.json (one-time auto-migration preserves remote_ids).
  • Relax findBaseVault to match on metadata stamp alone (not display_name), since the engine and imperative path may create vaults with different display_name values but both always set the stamp.

2. refactor: inline session runtime from playbooks into server

  • Move session-runtime.ts from @openagentpack/playbooks into apps/server/src/services/sessions/playbook-session-adapter/runtime.ts — the server is the only production consumer.
  • Replace the generic PlaybookSessionRuntimeAdapters<TDetail, TEvent, TSession, TAgent> with concrete PlaybookSessionRuntimeDeps using ProviderSessionEvent/Session directly.
  • Add runtime.test.ts with full coverage of pick, start, send, list, getDetail, delete.

3. refactor(playbooks): drop unused readiness mapping

  • Remove SKILL_STATUS_CODE, skillStatusFromCode, and numeric↔string mapping code — no remaining consumers after Mode B removal.
  • Update parity tests to only assert string-based status normalization.

4. chore: remove playground dead dep on playbooks, update description

  • Drop unused @openagentpack/playbooks devDependency from packages/playground.
  • Clean up all "Mode A"/"Mode B" terminology from comments across the codebase.

Agent declares environment + vault

  • toAgentBuildInput now resolves environment and vault names from the assembled config and sets them on the agent declaration, so syncAgentResources manages base resources through the plan/apply engine (state tracking + drift detection).
  • Fail-fast invariant checks ensure exactly one environment (and at most one vault per provider).

Test results

All 812 tests pass across all workspaces. Typecheck, architecture conformance, and lint all green.

Behavior / risk

No breaking API change is intended. Runtime base resources keep their managed identity while playground state moves to ~/.agents/playground.state.json with one-time legacy migration. The PR gate now asks for risk and validation evidence in the PR description for high-risk changes, including verification-policy changes, without requiring a special commit-message marker or history rewrite. A generated bun.lock change alone is covered by audit and compatibility checks.

Validation

  • bun scripts/verify.ts full --step typecheck
  • bun scripts/verify.ts full --step lint
  • bun scripts/verify.ts full --step architecture
  • bun scripts/verify.ts full --step test

Change-Id: I5d340bb58f1d0d9a68607024aa49fe0b37c1eab6
Co-developed-by: Qoder <noreply@qoder.com>
readinessFromPick, PlaybookReadiness, and their tests have no
production consumer: the server's agent readiness flows through the
sdk's listAgentsWithReadiness instead. Remove the dead code before
inlining the session runtime.
Change-Id: I131ba28e7fbee9ec2aaf3a44467d27bc590dfd28
Co-developed-by: OpenCode <noreply@opencode.ai>
The playbook session-runtime adapter layer (createPlaybookSessionRuntime,
pickPlaybookAgent, PlaybookAgentIdentityMismatchError, and ~15 input/output
types) lived in @openagentpack/playbooks but had exactly one production
consumer: the server's playbook-session-adapter. This commit:
- Moves the runtime orchestration and agent-pick logic into a new
apps/server/.../playbook-session-adapter/runtime.ts with all generic
type parameters instantiated to their concrete server types.
- Replaces the four adapter interfaces with a single concrete
PlaybookSessionRuntimeDeps type (dependency injection preserved for
testability, but no cross-package abstraction).
- Migrates tests to apps/server with type-safe fake constructors.
- Removes session-runtime.ts from @openagentpack/playbooks and cleans
up all re-exports from the package index.
- Eliminates the duplicate ListPlaybookSessionsInput definition in
sessions.ts (now imported from runtime.ts).
Behavioral changes: none. The PlaybookAgentIdentityMismatchError still
surfaces as HTTP 500 (no route-level catch); a future PR can map it to
4xx if desired.
Change-Id: Ia4276ea3626877163f60529342e7da1ba3a991bd
Co-developed-by: OpenCode <noreply@opencode.ai>
playground's devDependency on @openagentpack/playbooks had zero imports
in its source tree. Remove it.
Also update the playbooks package description now that the session
runtime orchestration no longer lives there.
Change-Id: Ic6ac9936561f2186da6b2cdd37d8ffd0121402d3
Co-developed-by: OpenCode <noreply@opencode.ai>
Change-Id: I1f4b06c06ca304d98f5a1151aad48f1bf4537cec
@heimanba
heimanba merged commit 414589e into mainJul 20, 2026
15 checks passed
@heimanba
heimanba deleted the refactor/inline-playbook-session-runtime branch July 20, 2026 02:02
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

@heimanba
, '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

refactor: inline playbook session runtime, unify base-resource identity - #34

Merged
heimanba merged 6 commits into
mainfrom
refactor/inline-playbook-session-runtime
Jul 20, 2026
Merged

refactor: inline playbook session runtime, unify base-resource identity#34
heimanba merged 6 commits into
mainfrom
refactor/inline-playbook-session-runtime

Conversation

@heimanba

@heimanbaheimanba commented Jul 19, 2026

Copy link
Copy Markdown
Contributor

Summary

This PR consolidates four changes that simplify the session runtime architecture and strengthen base-resource identity tracking:

1. feat(byoc): runtime config, sessions and vaults updates

  • Add metadata stamps (agents.base / agents.vault) to buildRuntimeConfig so the webui can identify managed base resources via remote listing.
  • Migrate playground state from examples/bailian/bailian-cli/agents.state.json to ~/.agents/playground.state.json (one-time auto-migration preserves remote_ids).
  • Relax findBaseVault to match on metadata stamp alone (not display_name), since the engine and imperative path may create vaults with different display_name values but both always set the stamp.

2. refactor: inline session runtime from playbooks into server

  • Move session-runtime.ts from @openagentpack/playbooks into apps/server/src/services/sessions/playbook-session-adapter/runtime.ts — the server is the only production consumer.
  • Replace the generic PlaybookSessionRuntimeAdapters<TDetail, TEvent, TSession, TAgent> with concrete PlaybookSessionRuntimeDeps using ProviderSessionEvent/Session directly.
  • Add runtime.test.ts with full coverage of pick, start, send, list, getDetail, delete.

3. refactor(playbooks): drop unused readiness mapping

  • Remove SKILL_STATUS_CODE, skillStatusFromCode, and numeric↔string mapping code — no remaining consumers after Mode B removal.
  • Update parity tests to only assert string-based status normalization.

4. chore: remove playground dead dep on playbooks, update description

  • Drop unused @openagentpack/playbooks devDependency from packages/playground.
  • Clean up all "Mode A"/"Mode B" terminology from comments across the codebase.

Agent declares environment + vault

  • toAgentBuildInput now resolves environment and vault names from the assembled config and sets them on the agent declaration, so syncAgentResources manages base resources through the plan/apply engine (state tracking + drift detection).
  • Fail-fast invariant checks ensure exactly one environment (and at most one vault per provider).

Test results

All 812 tests pass across all workspaces. Typecheck, architecture conformance, and lint all green.

Behavior / risk

No breaking API change is intended. Runtime base resources keep their managed identity while playground state moves to ~/.agents/playground.state.json with one-time legacy migration. The PR gate now asks for risk and validation evidence in the PR description for high-risk changes, including verification-policy changes, without requiring a special commit-message marker or history rewrite. A generated bun.lock change alone is covered by audit and compatibility checks.

Validation

  • bun scripts/verify.ts full --step typecheck
  • bun scripts/verify.ts full --step lint
  • bun scripts/verify.ts full --step architecture
  • bun scripts/verify.ts full --step test

Change-Id: I5d340bb58f1d0d9a68607024aa49fe0b37c1eab6
Co-developed-by: Qoder <noreply@qoder.com>
readinessFromPick, PlaybookReadiness, and their tests have no
production consumer: the server's agent readiness flows through the
sdk's listAgentsWithReadiness instead. Remove the dead code before
inlining the session runtime.
Change-Id: I131ba28e7fbee9ec2aaf3a44467d27bc590dfd28
Co-developed-by: OpenCode <noreply@opencode.ai>
The playbook session-runtime adapter layer (createPlaybookSessionRuntime,
pickPlaybookAgent, PlaybookAgentIdentityMismatchError, and ~15 input/output
types) lived in @openagentpack/playbooks but had exactly one production
consumer: the server's playbook-session-adapter. This commit:
- Moves the runtime orchestration and agent-pick logic into a new
apps/server/.../playbook-session-adapter/runtime.ts with all generic
type parameters instantiated to their concrete server types.
- Replaces the four adapter interfaces with a single concrete
PlaybookSessionRuntimeDeps type (dependency injection preserved for
testability, but no cross-package abstraction).
- Migrates tests to apps/server with type-safe fake constructors.
- Removes session-runtime.ts from @openagentpack/playbooks and cleans
up all re-exports from the package index.
- Eliminates the duplicate ListPlaybookSessionsInput definition in
sessions.ts (now imported from runtime.ts).
Behavioral changes: none. The PlaybookAgentIdentityMismatchError still
surfaces as HTTP 500 (no route-level catch); a future PR can map it to
4xx if desired.
Change-Id: Ia4276ea3626877163f60529342e7da1ba3a991bd
Co-developed-by: OpenCode <noreply@opencode.ai>
playground's devDependency on @openagentpack/playbooks had zero imports
in its source tree. Remove it.
Also update the playbooks package description now that the session
runtime orchestration no longer lives there.
Change-Id: Ic6ac9936561f2186da6b2cdd37d8ffd0121402d3
Co-developed-by: OpenCode <noreply@opencode.ai>
Change-Id: I1f4b06c06ca304d98f5a1151aad48f1bf4537cec
@heimanba
heimanba merged commit 414589e into mainJul 20, 2026
15 checks passed
@heimanba
heimanba deleted the refactor/inline-playbook-session-runtime branch July 20, 2026 02:02
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

@heimanba