feat(runtime): star orchestrator→worker expert teams - #971

Merged
jackwener merged 5 commits into
mainfrom
claude/happy-hermann-4febe7
Jul 14, 2026
Merged

feat(runtime): star orchestrator→worker expert teams#971
jackwener merged 5 commits into
mainfrom
claude/happy-hermann-4febe7

Conversation

@jackwener

Copy link
Copy Markdown
Member

What

Implements expert teams — a lead persona fans a task out to tool-scoped member experts (child agents) and synthesizes their results. This is the star orchestrator→worker topology reverse-engineered from WorkBuddy's team experts and QoderWork's sub-agent pipelines (see docs/expert-team-implementation.md), rebuilt entirely on Maka's existing child-agent machinery — no new orchestration engine, no mesh mailbox, no shared task board.

Model

  • Capability archetype — a built-in agent profile (local_read / web_research / implementation) fixing tool scope + permission mode + category policy.
  • Expert — a persona that runs under an archetype and may narrow (never widen) its tools. An expert can never exceed its archetype's policy → stricter than either competitor, preserves Maka's permission-safety invariant.
  • Expert team — a lead (runs as the main session) + N dispatchable members. Members never talk to each other; the lead coordinates.

Members materialize into ordinary AgentDefinitions with a deterministic id expert:<teamId>:<memberId>, so the child-turn machinery (tool scoping, permission gating, worktree fail-closed) runs them unchanged and a spawn resolves statelessly from the id.

Changes

@maka/runtime

  • expert-catalog.ts — types, materialization, static registry, combined resolver, and the built-in Code Review Team (read-only correctness / simplification / test-coverage reviewers).
  • expert-tools.ts — the team-bound expert_dispatch tool (member enum + roster). Parallel fan-out reuses the existing per-turn subagent concurrency; fan-in is the child summary + artifactIds pointers.
  • Pluggable resolver: spawnChildAgent / startChildTurn now resolve a spec id via requireResolvedAgentDefinition (builtin ?? expert), preserving built-in error messages.

@maka/core

  • expert-team.ts — the mode:expert-team:<teamId> session-label vocabulary.

Desktop

  • Lead system-prompt fragment + expert_dispatch tool, gated on the label (main session only — members never get nested teams).
  • expertTeam:list / expertTeam:start IPC + preload bridge + window typings to start a read-only team session.

How to use

const{ teams }=awaitwindow.maka.expertTeam.list();constr=awaitwindow.maka.expertTeam.start({teamId: 'code-review',prompt: 'Review the current diff.'});

Any session labeled mode:expert-team:<teamId> is a fully functional team lead — the label is the only special state.

Tests

New unit tests across core / runtime / desktop-main. Verified locally:

  • @maka/core 824/824 · @maka/runtime 1383 (0 fail) · @maka/headless 807/807 · desktop-main handler + quick-chat 28/28.
  • Full ordered npm run build passes (incl. desktop main + preload + renderer); desktop typecheck clean.

Note: ~193 desktop "source-grep / Storybook / real-window" contract tests fail only in a nested git-worktree checkout (they resolve the repo root to .claude/packages/... and ENOENT); they are unrelated to this change and pass in a normal checkout / CI.

Deliberately deferred (documented, not built)

Renderer team-picker panel; mesh "Agent Teams" (member↔member messaging, shared task board); worktree-isolated writing members (fail-closed today); remote expert marketplace; digital-colleague / IM / cloud layer. Design + rationale in docs/expert-team-{plan,implementation,runtime}.md.

Expert teams let a lead persona fan a task out to tool-scoped member
experts (child agents), then synthesize their results — the star
topology reverse-engineered from WorkBuddy's `team` experts and
QoderWork's sub-agent pipelines, rebuilt entirely on Maka's existing
child-agent machinery (no new orchestration engine, no mesh mailbox).
Runtime (@maka/runtime):
- expert-catalog.ts: ExpertDefinition / ExpertTeamDefinition, data-driven
members that inherit a capability archetype (tool scope + permission
mode) and may only narrow its tools — never widen. Members materialize
into ordinary AgentDefinitions with a deterministic id
(expert:<teamId>:<memberId>) so the child-turn machinery runs them
unchanged and a spawn resolves statelessly from the id.
- expert-tools.ts: the team-bound `expert_dispatch` tool (member enum +
roster), a thin wrapper over spawnChildAgent; parallel fan-out reuses
the existing per-turn concurrency; fan-in is the child summary +
artifact-id pointers.
- Pluggable definition resolver: spawnChildAgent / startChildTurn resolve
a spec id via requireResolvedAgentDefinition (builtin ?? expert),
preserving builtin error messages.
- Ships a read-only Code Review Team (correctness / simplification /
test-coverage reviewers) that runs within current capabilities.
Core (@maka/core):
- expert-team.ts: the `mode:expert-team:<teamId>` session-label vocabulary.
Desktop:
- Lead system-prompt fragment + `expert_dispatch` tool gated on the label
(main session only — members never get nested teams).
- expertTeam:list / expertTeam:start IPC + preload bridge + window typings
to start a read-only team session.
Tests across core / runtime / desktop-main. Docs in docs/expert-team-*.md.
The composer "+" button attached files directly. Turn it into a small
menu (reusing the existing Menu primitive, same as the workspace/branch
pickers):
- 添加文件或目录 → the existing attachment picker.
- 专家团 → a submenu listing the built-in expert teams; picking one
starts a new `mode:expert-team:<teamId>` session (read-only), mirroring
the quick-chat start+navigate flow.
Wiring: Composer gains `expertTeams` + `onStartExpertTeam` props; app-shell
loads window.maka.expertTeam.list() once and routes selection through a new
handleExpertTeamStart action. The "+" trigger renders whenever attachments
or teams are available. Storybook chat-surface exercises the menu.
End-to-end integration test: startChildTurn with an `expert:<team>:<member>`
spec id resolves through requireResolvedAgentDefinition into the materialized
member definition — asserting the child backend receives the archetype-scoped
tools (Read/Glob/Grep), the composed persona system prompt, explore permission
mode, and the expert id/name on the child run. Closes the one integration seam
the unit tests could not cover.
…ad code
- Correctness: the lead persona fragment was injected into every dispatched
member (child turns inherit the session's expert-team label). Gate the lead
fragment on `forChildTurn` so members no longer get "you are the lead, use
expert_dispatch" for a tool they don't have. (The tool itself was already
withheld from children.)
- getExpertAgentDefinition now honors its `| undefined` contract: a member that
would throw on materialization (tool-widening) resolves to undefined instead
of throwing through resolveAgentDefinition.
- Remove dead exports flagged for knip: buildExpertToolGroup / EXPERT_TOOL_GROUP_ID
(expert_dispatch is added directly, not via a deferred group), getExpertTeamMember
(no callers), and un-export the internal composeExpertSystemPrompt.
…4febe7
# Conflicts:
#	apps/desktop/src/main/main.ts
#	packages/ui/src/composer.tsx
@jackwener
jackwener merged commit dbc017e into mainJul 14, 2026
3 checks passed
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

@jackwener
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

feat(runtime): star orchestrator→worker expert teams - #971

Merged
jackwener merged 5 commits into
mainfrom
claude/happy-hermann-4febe7
Jul 14, 2026
Merged

feat(runtime): star orchestrator→worker expert teams#971
jackwener merged 5 commits into
mainfrom
claude/happy-hermann-4febe7

Conversation

@jackwener

Copy link
Copy Markdown
Member

What

Implements expert teams — a lead persona fans a task out to tool-scoped member experts (child agents) and synthesizes their results. This is the star orchestrator→worker topology reverse-engineered from WorkBuddy's team experts and QoderWork's sub-agent pipelines (see docs/expert-team-implementation.md), rebuilt entirely on Maka's existing child-agent machinery — no new orchestration engine, no mesh mailbox, no shared task board.

Model

  • Capability archetype — a built-in agent profile (local_read / web_research / implementation) fixing tool scope + permission mode + category policy.
  • Expert — a persona that runs under an archetype and may narrow (never widen) its tools. An expert can never exceed its archetype's policy → stricter than either competitor, preserves Maka's permission-safety invariant.
  • Expert team — a lead (runs as the main session) + N dispatchable members. Members never talk to each other; the lead coordinates.

Members materialize into ordinary AgentDefinitions with a deterministic id expert:<teamId>:<memberId>, so the child-turn machinery (tool scoping, permission gating, worktree fail-closed) runs them unchanged and a spawn resolves statelessly from the id.

Changes

@maka/runtime

  • expert-catalog.ts — types, materialization, static registry, combined resolver, and the built-in Code Review Team (read-only correctness / simplification / test-coverage reviewers).
  • expert-tools.ts — the team-bound expert_dispatch tool (member enum + roster). Parallel fan-out reuses the existing per-turn subagent concurrency; fan-in is the child summary + artifactIds pointers.
  • Pluggable resolver: spawnChildAgent / startChildTurn now resolve a spec id via requireResolvedAgentDefinition (builtin ?? expert), preserving built-in error messages.

@maka/core

  • expert-team.ts — the mode:expert-team:<teamId> session-label vocabulary.

Desktop

  • Lead system-prompt fragment + expert_dispatch tool, gated on the label (main session only — members never get nested teams).
  • expertTeam:list / expertTeam:start IPC + preload bridge + window typings to start a read-only team session.

How to use

const{ teams }=awaitwindow.maka.expertTeam.list();constr=awaitwindow.maka.expertTeam.start({teamId: 'code-review',prompt: 'Review the current diff.'});

Any session labeled mode:expert-team:<teamId> is a fully functional team lead — the label is the only special state.

Tests

New unit tests across core / runtime / desktop-main. Verified locally:

  • @maka/core 824/824 · @maka/runtime 1383 (0 fail) · @maka/headless 807/807 · desktop-main handler + quick-chat 28/28.
  • Full ordered npm run build passes (incl. desktop main + preload + renderer); desktop typecheck clean.

Note: ~193 desktop "source-grep / Storybook / real-window" contract tests fail only in a nested git-worktree checkout (they resolve the repo root to .claude/packages/... and ENOENT); they are unrelated to this change and pass in a normal checkout / CI.

Deliberately deferred (documented, not built)

Renderer team-picker panel; mesh "Agent Teams" (member↔member messaging, shared task board); worktree-isolated writing members (fail-closed today); remote expert marketplace; digital-colleague / IM / cloud layer. Design + rationale in docs/expert-team-{plan,implementation,runtime}.md.

Expert teams let a lead persona fan a task out to tool-scoped member
experts (child agents), then synthesize their results — the star
topology reverse-engineered from WorkBuddy's `team` experts and
QoderWork's sub-agent pipelines, rebuilt entirely on Maka's existing
child-agent machinery (no new orchestration engine, no mesh mailbox).
Runtime (@maka/runtime):
- expert-catalog.ts: ExpertDefinition / ExpertTeamDefinition, data-driven
members that inherit a capability archetype (tool scope + permission
mode) and may only narrow its tools — never widen. Members materialize
into ordinary AgentDefinitions with a deterministic id
(expert:<teamId>:<memberId>) so the child-turn machinery runs them
unchanged and a spawn resolves statelessly from the id.
- expert-tools.ts: the team-bound `expert_dispatch` tool (member enum +
roster), a thin wrapper over spawnChildAgent; parallel fan-out reuses
the existing per-turn concurrency; fan-in is the child summary +
artifact-id pointers.
- Pluggable definition resolver: spawnChildAgent / startChildTurn resolve
a spec id via requireResolvedAgentDefinition (builtin ?? expert),
preserving builtin error messages.
- Ships a read-only Code Review Team (correctness / simplification /
test-coverage reviewers) that runs within current capabilities.
Core (@maka/core):
- expert-team.ts: the `mode:expert-team:<teamId>` session-label vocabulary.
Desktop:
- Lead system-prompt fragment + `expert_dispatch` tool gated on the label
(main session only — members never get nested teams).
- expertTeam:list / expertTeam:start IPC + preload bridge + window typings
to start a read-only team session.
Tests across core / runtime / desktop-main. Docs in docs/expert-team-*.md.
The composer "+" button attached files directly. Turn it into a small
menu (reusing the existing Menu primitive, same as the workspace/branch
pickers):
- 添加文件或目录 → the existing attachment picker.
- 专家团 → a submenu listing the built-in expert teams; picking one
starts a new `mode:expert-team:<teamId>` session (read-only), mirroring
the quick-chat start+navigate flow.
Wiring: Composer gains `expertTeams` + `onStartExpertTeam` props; app-shell
loads window.maka.expertTeam.list() once and routes selection through a new
handleExpertTeamStart action. The "+" trigger renders whenever attachments
or teams are available. Storybook chat-surface exercises the menu.
End-to-end integration test: startChildTurn with an `expert:<team>:<member>`
spec id resolves through requireResolvedAgentDefinition into the materialized
member definition — asserting the child backend receives the archetype-scoped
tools (Read/Glob/Grep), the composed persona system prompt, explore permission
mode, and the expert id/name on the child run. Closes the one integration seam
the unit tests could not cover.
…ad code
- Correctness: the lead persona fragment was injected into every dispatched
member (child turns inherit the session's expert-team label). Gate the lead
fragment on `forChildTurn` so members no longer get "you are the lead, use
expert_dispatch" for a tool they don't have. (The tool itself was already
withheld from children.)
- getExpertAgentDefinition now honors its `| undefined` contract: a member that
would throw on materialization (tool-widening) resolves to undefined instead
of throwing through resolveAgentDefinition.
- Remove dead exports flagged for knip: buildExpertToolGroup / EXPERT_TOOL_GROUP_ID
(expert_dispatch is added directly, not via a deferred group), getExpertTeamMember
(no callers), and un-export the internal composeExpertSystemPrompt.
…4febe7
# Conflicts:
#	apps/desktop/src/main/main.ts
#	packages/ui/src/composer.tsx
@jackwener
jackwener merged commit dbc017e into mainJul 14, 2026
3 checks passed
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

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

feat(runtime): star orchestrator→worker expert teams - #971

Merged
jackwener merged 5 commits into
mainfrom
claude/happy-hermann-4febe7
Jul 14, 2026
Merged

feat(runtime): star orchestrator→worker expert teams#971
jackwener merged 5 commits into
mainfrom
claude/happy-hermann-4febe7

Conversation

@jackwener

Copy link
Copy Markdown
Member

What

Implements expert teams — a lead persona fans a task out to tool-scoped member experts (child agents) and synthesizes their results. This is the star orchestrator→worker topology reverse-engineered from WorkBuddy's team experts and QoderWork's sub-agent pipelines (see docs/expert-team-implementation.md), rebuilt entirely on Maka's existing child-agent machinery — no new orchestration engine, no mesh mailbox, no shared task board.

Model

  • Capability archetype — a built-in agent profile (local_read / web_research / implementation) fixing tool scope + permission mode + category policy.
  • Expert — a persona that runs under an archetype and may narrow (never widen) its tools. An expert can never exceed its archetype's policy → stricter than either competitor, preserves Maka's permission-safety invariant.
  • Expert team — a lead (runs as the main session) + N dispatchable members. Members never talk to each other; the lead coordinates.

Members materialize into ordinary AgentDefinitions with a deterministic id expert:<teamId>:<memberId>, so the child-turn machinery (tool scoping, permission gating, worktree fail-closed) runs them unchanged and a spawn resolves statelessly from the id.

Changes

@maka/runtime

  • expert-catalog.ts — types, materialization, static registry, combined resolver, and the built-in Code Review Team (read-only correctness / simplification / test-coverage reviewers).
  • expert-tools.ts — the team-bound expert_dispatch tool (member enum + roster). Parallel fan-out reuses the existing per-turn subagent concurrency; fan-in is the child summary + artifactIds pointers.
  • Pluggable resolver: spawnChildAgent / startChildTurn now resolve a spec id via requireResolvedAgentDefinition (builtin ?? expert), preserving built-in error messages.

@maka/core

  • expert-team.ts — the mode:expert-team:<teamId> session-label vocabulary.

Desktop

  • Lead system-prompt fragment + expert_dispatch tool, gated on the label (main session only — members never get nested teams).
  • expertTeam:list / expertTeam:start IPC + preload bridge + window typings to start a read-only team session.

How to use

const{ teams }=awaitwindow.maka.expertTeam.list();constr=awaitwindow.maka.expertTeam.start({teamId: 'code-review',prompt: 'Review the current diff.'});

Any session labeled mode:expert-team:<teamId> is a fully functional team lead — the label is the only special state.

Tests

New unit tests across core / runtime / desktop-main. Verified locally:

  • @maka/core 824/824 · @maka/runtime 1383 (0 fail) · @maka/headless 807/807 · desktop-main handler + quick-chat 28/28.
  • Full ordered npm run build passes (incl. desktop main + preload + renderer); desktop typecheck clean.

Note: ~193 desktop "source-grep / Storybook / real-window" contract tests fail only in a nested git-worktree checkout (they resolve the repo root to .claude/packages/... and ENOENT); they are unrelated to this change and pass in a normal checkout / CI.

Deliberately deferred (documented, not built)

Renderer team-picker panel; mesh "Agent Teams" (member↔member messaging, shared task board); worktree-isolated writing members (fail-closed today); remote expert marketplace; digital-colleague / IM / cloud layer. Design + rationale in docs/expert-team-{plan,implementation,runtime}.md.

Expert teams let a lead persona fan a task out to tool-scoped member
experts (child agents), then synthesize their results — the star
topology reverse-engineered from WorkBuddy's `team` experts and
QoderWork's sub-agent pipelines, rebuilt entirely on Maka's existing
child-agent machinery (no new orchestration engine, no mesh mailbox).
Runtime (@maka/runtime):
- expert-catalog.ts: ExpertDefinition / ExpertTeamDefinition, data-driven
members that inherit a capability archetype (tool scope + permission
mode) and may only narrow its tools — never widen. Members materialize
into ordinary AgentDefinitions with a deterministic id
(expert:<teamId>:<memberId>) so the child-turn machinery runs them
unchanged and a spawn resolves statelessly from the id.
- expert-tools.ts: the team-bound `expert_dispatch` tool (member enum +
roster), a thin wrapper over spawnChildAgent; parallel fan-out reuses
the existing per-turn concurrency; fan-in is the child summary +
artifact-id pointers.
- Pluggable definition resolver: spawnChildAgent / startChildTurn resolve
a spec id via requireResolvedAgentDefinition (builtin ?? expert),
preserving builtin error messages.
- Ships a read-only Code Review Team (correctness / simplification /
test-coverage reviewers) that runs within current capabilities.
Core (@maka/core):
- expert-team.ts: the `mode:expert-team:<teamId>` session-label vocabulary.
Desktop:
- Lead system-prompt fragment + `expert_dispatch` tool gated on the label
(main session only — members never get nested teams).
- expertTeam:list / expertTeam:start IPC + preload bridge + window typings
to start a read-only team session.
Tests across core / runtime / desktop-main. Docs in docs/expert-team-*.md.
The composer "+" button attached files directly. Turn it into a small
menu (reusing the existing Menu primitive, same as the workspace/branch
pickers):
- 添加文件或目录 → the existing attachment picker.
- 专家团 → a submenu listing the built-in expert teams; picking one
starts a new `mode:expert-team:<teamId>` session (read-only), mirroring
the quick-chat start+navigate flow.
Wiring: Composer gains `expertTeams` + `onStartExpertTeam` props; app-shell
loads window.maka.expertTeam.list() once and routes selection through a new
handleExpertTeamStart action. The "+" trigger renders whenever attachments
or teams are available. Storybook chat-surface exercises the menu.
End-to-end integration test: startChildTurn with an `expert:<team>:<member>`
spec id resolves through requireResolvedAgentDefinition into the materialized
member definition — asserting the child backend receives the archetype-scoped
tools (Read/Glob/Grep), the composed persona system prompt, explore permission
mode, and the expert id/name on the child run. Closes the one integration seam
the unit tests could not cover.
…ad code
- Correctness: the lead persona fragment was injected into every dispatched
member (child turns inherit the session's expert-team label). Gate the lead
fragment on `forChildTurn` so members no longer get "you are the lead, use
expert_dispatch" for a tool they don't have. (The tool itself was already
withheld from children.)
- getExpertAgentDefinition now honors its `| undefined` contract: a member that
would throw on materialization (tool-widening) resolves to undefined instead
of throwing through resolveAgentDefinition.
- Remove dead exports flagged for knip: buildExpertToolGroup / EXPERT_TOOL_GROUP_ID
(expert_dispatch is added directly, not via a deferred group), getExpertTeamMember
(no callers), and un-export the internal composeExpertSystemPrompt.
…4febe7
# Conflicts:
#	apps/desktop/src/main/main.ts
#	packages/ui/src/composer.tsx
@jackwener
jackwener merged commit dbc017e into mainJul 14, 2026
3 checks passed
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

@jackwener
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(runtime): star orchestrator→worker expert teams - #971

Merged
jackwener merged 5 commits into
mainfrom
claude/happy-hermann-4febe7
Jul 14, 2026
Merged

feat(runtime): star orchestrator→worker expert teams#971
jackwener merged 5 commits into
mainfrom
claude/happy-hermann-4febe7

Conversation

@jackwener

Copy link
Copy Markdown
Member

What

Implements expert teams — a lead persona fans a task out to tool-scoped member experts (child agents) and synthesizes their results. This is the star orchestrator→worker topology reverse-engineered from WorkBuddy's team experts and QoderWork's sub-agent pipelines (see docs/expert-team-implementation.md), rebuilt entirely on Maka's existing child-agent machinery — no new orchestration engine, no mesh mailbox, no shared task board.

Model

  • Capability archetype — a built-in agent profile (local_read / web_research / implementation) fixing tool scope + permission mode + category policy.
  • Expert — a persona that runs under an archetype and may narrow (never widen) its tools. An expert can never exceed its archetype's policy → stricter than either competitor, preserves Maka's permission-safety invariant.
  • Expert team — a lead (runs as the main session) + N dispatchable members. Members never talk to each other; the lead coordinates.

Members materialize into ordinary AgentDefinitions with a deterministic id expert:<teamId>:<memberId>, so the child-turn machinery (tool scoping, permission gating, worktree fail-closed) runs them unchanged and a spawn resolves statelessly from the id.

Changes

@maka/runtime

  • expert-catalog.ts — types, materialization, static registry, combined resolver, and the built-in Code Review Team (read-only correctness / simplification / test-coverage reviewers).
  • expert-tools.ts — the team-bound expert_dispatch tool (member enum + roster). Parallel fan-out reuses the existing per-turn subagent concurrency; fan-in is the child summary + artifactIds pointers.
  • Pluggable resolver: spawnChildAgent / startChildTurn now resolve a spec id via requireResolvedAgentDefinition (builtin ?? expert), preserving built-in error messages.

@maka/core

  • expert-team.ts — the mode:expert-team:<teamId> session-label vocabulary.

Desktop

  • Lead system-prompt fragment + expert_dispatch tool, gated on the label (main session only — members never get nested teams).
  • expertTeam:list / expertTeam:start IPC + preload bridge + window typings to start a read-only team session.

How to use

const{ teams }=awaitwindow.maka.expertTeam.list();constr=awaitwindow.maka.expertTeam.start({teamId: 'code-review',prompt: 'Review the current diff.'});

Any session labeled mode:expert-team:<teamId> is a fully functional team lead — the label is the only special state.

Tests

New unit tests across core / runtime / desktop-main. Verified locally:

  • @maka/core 824/824 · @maka/runtime 1383 (0 fail) · @maka/headless 807/807 · desktop-main handler + quick-chat 28/28.
  • Full ordered npm run build passes (incl. desktop main + preload + renderer); desktop typecheck clean.

Note: ~193 desktop "source-grep / Storybook / real-window" contract tests fail only in a nested git-worktree checkout (they resolve the repo root to .claude/packages/... and ENOENT); they are unrelated to this change and pass in a normal checkout / CI.

Deliberately deferred (documented, not built)

Renderer team-picker panel; mesh "Agent Teams" (member↔member messaging, shared task board); worktree-isolated writing members (fail-closed today); remote expert marketplace; digital-colleague / IM / cloud layer. Design + rationale in docs/expert-team-{plan,implementation,runtime}.md.

Expert teams let a lead persona fan a task out to tool-scoped member
experts (child agents), then synthesize their results — the star
topology reverse-engineered from WorkBuddy's `team` experts and
QoderWork's sub-agent pipelines, rebuilt entirely on Maka's existing
child-agent machinery (no new orchestration engine, no mesh mailbox).
Runtime (@maka/runtime):
- expert-catalog.ts: ExpertDefinition / ExpertTeamDefinition, data-driven
members that inherit a capability archetype (tool scope + permission
mode) and may only narrow its tools — never widen. Members materialize
into ordinary AgentDefinitions with a deterministic id
(expert:<teamId>:<memberId>) so the child-turn machinery runs them
unchanged and a spawn resolves statelessly from the id.
- expert-tools.ts: the team-bound `expert_dispatch` tool (member enum +
roster), a thin wrapper over spawnChildAgent; parallel fan-out reuses
the existing per-turn concurrency; fan-in is the child summary +
artifact-id pointers.
- Pluggable definition resolver: spawnChildAgent / startChildTurn resolve
a spec id via requireResolvedAgentDefinition (builtin ?? expert),
preserving builtin error messages.
- Ships a read-only Code Review Team (correctness / simplification /
test-coverage reviewers) that runs within current capabilities.
Core (@maka/core):
- expert-team.ts: the `mode:expert-team:<teamId>` session-label vocabulary.
Desktop:
- Lead system-prompt fragment + `expert_dispatch` tool gated on the label
(main session only — members never get nested teams).
- expertTeam:list / expertTeam:start IPC + preload bridge + window typings
to start a read-only team session.
Tests across core / runtime / desktop-main. Docs in docs/expert-team-*.md.
The composer "+" button attached files directly. Turn it into a small
menu (reusing the existing Menu primitive, same as the workspace/branch
pickers):
- 添加文件或目录 → the existing attachment picker.
- 专家团 → a submenu listing the built-in expert teams; picking one
starts a new `mode:expert-team:<teamId>` session (read-only), mirroring
the quick-chat start+navigate flow.
Wiring: Composer gains `expertTeams` + `onStartExpertTeam` props; app-shell
loads window.maka.expertTeam.list() once and routes selection through a new
handleExpertTeamStart action. The "+" trigger renders whenever attachments
or teams are available. Storybook chat-surface exercises the menu.
End-to-end integration test: startChildTurn with an `expert:<team>:<member>`
spec id resolves through requireResolvedAgentDefinition into the materialized
member definition — asserting the child backend receives the archetype-scoped
tools (Read/Glob/Grep), the composed persona system prompt, explore permission
mode, and the expert id/name on the child run. Closes the one integration seam
the unit tests could not cover.
…ad code
- Correctness: the lead persona fragment was injected into every dispatched
member (child turns inherit the session's expert-team label). Gate the lead
fragment on `forChildTurn` so members no longer get "you are the lead, use
expert_dispatch" for a tool they don't have. (The tool itself was already
withheld from children.)
- getExpertAgentDefinition now honors its `| undefined` contract: a member that
would throw on materialization (tool-widening) resolves to undefined instead
of throwing through resolveAgentDefinition.
- Remove dead exports flagged for knip: buildExpertToolGroup / EXPERT_TOOL_GROUP_ID
(expert_dispatch is added directly, not via a deferred group), getExpertTeamMember
(no callers), and un-export the internal composeExpertSystemPrompt.
…4febe7
# Conflicts:
#	apps/desktop/src/main/main.ts
#	packages/ui/src/composer.tsx
@jackwener
jackwener merged commit dbc017e into mainJul 14, 2026
3 checks passed
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

@jackwener
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

feat(runtime): star orchestrator→worker expert teams - #971

Merged
jackwener merged 5 commits into
mainfrom
claude/happy-hermann-4febe7
Jul 14, 2026
Merged

feat(runtime): star orchestrator→worker expert teams#971
jackwener merged 5 commits into
mainfrom
claude/happy-hermann-4febe7

Conversation

@jackwener

Copy link
Copy Markdown
Member

What

Implements expert teams — a lead persona fans a task out to tool-scoped member experts (child agents) and synthesizes their results. This is the star orchestrator→worker topology reverse-engineered from WorkBuddy's team experts and QoderWork's sub-agent pipelines (see docs/expert-team-implementation.md), rebuilt entirely on Maka's existing child-agent machinery — no new orchestration engine, no mesh mailbox, no shared task board.

Model

  • Capability archetype — a built-in agent profile (local_read / web_research / implementation) fixing tool scope + permission mode + category policy.
  • Expert — a persona that runs under an archetype and may narrow (never widen) its tools. An expert can never exceed its archetype's policy → stricter than either competitor, preserves Maka's permission-safety invariant.
  • Expert team — a lead (runs as the main session) + N dispatchable members. Members never talk to each other; the lead coordinates.

Members materialize into ordinary AgentDefinitions with a deterministic id expert:<teamId>:<memberId>, so the child-turn machinery (tool scoping, permission gating, worktree fail-closed) runs them unchanged and a spawn resolves statelessly from the id.

Changes

@maka/runtime

  • expert-catalog.ts — types, materialization, static registry, combined resolver, and the built-in Code Review Team (read-only correctness / simplification / test-coverage reviewers).
  • expert-tools.ts — the team-bound expert_dispatch tool (member enum + roster). Parallel fan-out reuses the existing per-turn subagent concurrency; fan-in is the child summary + artifactIds pointers.
  • Pluggable resolver: spawnChildAgent / startChildTurn now resolve a spec id via requireResolvedAgentDefinition (builtin ?? expert), preserving built-in error messages.

@maka/core

  • expert-team.ts — the mode:expert-team:<teamId> session-label vocabulary.

Desktop

  • Lead system-prompt fragment + expert_dispatch tool, gated on the label (main session only — members never get nested teams).
  • expertTeam:list / expertTeam:start IPC + preload bridge + window typings to start a read-only team session.

How to use

const{ teams }=awaitwindow.maka.expertTeam.list();constr=awaitwindow.maka.expertTeam.start({teamId: 'code-review',prompt: 'Review the current diff.'});

Any session labeled mode:expert-team:<teamId> is a fully functional team lead — the label is the only special state.

Tests

New unit tests across core / runtime / desktop-main. Verified locally:

  • @maka/core 824/824 · @maka/runtime 1383 (0 fail) · @maka/headless 807/807 · desktop-main handler + quick-chat 28/28.
  • Full ordered npm run build passes (incl. desktop main + preload + renderer); desktop typecheck clean.

Note: ~193 desktop "source-grep / Storybook / real-window" contract tests fail only in a nested git-worktree checkout (they resolve the repo root to .claude/packages/... and ENOENT); they are unrelated to this change and pass in a normal checkout / CI.

Deliberately deferred (documented, not built)

Renderer team-picker panel; mesh "Agent Teams" (member↔member messaging, shared task board); worktree-isolated writing members (fail-closed today); remote expert marketplace; digital-colleague / IM / cloud layer. Design + rationale in docs/expert-team-{plan,implementation,runtime}.md.

Expert teams let a lead persona fan a task out to tool-scoped member
experts (child agents), then synthesize their results — the star
topology reverse-engineered from WorkBuddy's `team` experts and
QoderWork's sub-agent pipelines, rebuilt entirely on Maka's existing
child-agent machinery (no new orchestration engine, no mesh mailbox).
Runtime (@maka/runtime):
- expert-catalog.ts: ExpertDefinition / ExpertTeamDefinition, data-driven
members that inherit a capability archetype (tool scope + permission
mode) and may only narrow its tools — never widen. Members materialize
into ordinary AgentDefinitions with a deterministic id
(expert:<teamId>:<memberId>) so the child-turn machinery runs them
unchanged and a spawn resolves statelessly from the id.
- expert-tools.ts: the team-bound `expert_dispatch` tool (member enum +
roster), a thin wrapper over spawnChildAgent; parallel fan-out reuses
the existing per-turn concurrency; fan-in is the child summary +
artifact-id pointers.
- Pluggable definition resolver: spawnChildAgent / startChildTurn resolve
a spec id via requireResolvedAgentDefinition (builtin ?? expert),
preserving builtin error messages.
- Ships a read-only Code Review Team (correctness / simplification /
test-coverage reviewers) that runs within current capabilities.
Core (@maka/core):
- expert-team.ts: the `mode:expert-team:<teamId>` session-label vocabulary.
Desktop:
- Lead system-prompt fragment + `expert_dispatch` tool gated on the label
(main session only — members never get nested teams).
- expertTeam:list / expertTeam:start IPC + preload bridge + window typings
to start a read-only team session.
Tests across core / runtime / desktop-main. Docs in docs/expert-team-*.md.
The composer "+" button attached files directly. Turn it into a small
menu (reusing the existing Menu primitive, same as the workspace/branch
pickers):
- 添加文件或目录 → the existing attachment picker.
- 专家团 → a submenu listing the built-in expert teams; picking one
starts a new `mode:expert-team:<teamId>` session (read-only), mirroring
the quick-chat start+navigate flow.
Wiring: Composer gains `expertTeams` + `onStartExpertTeam` props; app-shell
loads window.maka.expertTeam.list() once and routes selection through a new
handleExpertTeamStart action. The "+" trigger renders whenever attachments
or teams are available. Storybook chat-surface exercises the menu.
End-to-end integration test: startChildTurn with an `expert:<team>:<member>`
spec id resolves through requireResolvedAgentDefinition into the materialized
member definition — asserting the child backend receives the archetype-scoped
tools (Read/Glob/Grep), the composed persona system prompt, explore permission
mode, and the expert id/name on the child run. Closes the one integration seam
the unit tests could not cover.
…ad code
- Correctness: the lead persona fragment was injected into every dispatched
member (child turns inherit the session's expert-team label). Gate the lead
fragment on `forChildTurn` so members no longer get "you are the lead, use
expert_dispatch" for a tool they don't have. (The tool itself was already
withheld from children.)
- getExpertAgentDefinition now honors its `| undefined` contract: a member that
would throw on materialization (tool-widening) resolves to undefined instead
of throwing through resolveAgentDefinition.
- Remove dead exports flagged for knip: buildExpertToolGroup / EXPERT_TOOL_GROUP_ID
(expert_dispatch is added directly, not via a deferred group), getExpertTeamMember
(no callers), and un-export the internal composeExpertSystemPrompt.
…4febe7
# Conflicts:
#	apps/desktop/src/main/main.ts
#	packages/ui/src/composer.tsx
@jackwener
jackwener merged commit dbc017e into mainJul 14, 2026
3 checks passed
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

@jackwener
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(runtime): star orchestrator→worker expert teams - #971

Merged
jackwener merged 5 commits into
mainfrom
claude/happy-hermann-4febe7
Jul 14, 2026
Merged

feat(runtime): star orchestrator→worker expert teams#971
jackwener merged 5 commits into
mainfrom
claude/happy-hermann-4febe7

Conversation

@jackwener

Copy link
Copy Markdown
Member

What

Implements expert teams — a lead persona fans a task out to tool-scoped member experts (child agents) and synthesizes their results. This is the star orchestrator→worker topology reverse-engineered from WorkBuddy's team experts and QoderWork's sub-agent pipelines (see docs/expert-team-implementation.md), rebuilt entirely on Maka's existing child-agent machinery — no new orchestration engine, no mesh mailbox, no shared task board.

Model

  • Capability archetype — a built-in agent profile (local_read / web_research / implementation) fixing tool scope + permission mode + category policy.
  • Expert — a persona that runs under an archetype and may narrow (never widen) its tools. An expert can never exceed its archetype's policy → stricter than either competitor, preserves Maka's permission-safety invariant.
  • Expert team — a lead (runs as the main session) + N dispatchable members. Members never talk to each other; the lead coordinates.

Members materialize into ordinary AgentDefinitions with a deterministic id expert:<teamId>:<memberId>, so the child-turn machinery (tool scoping, permission gating, worktree fail-closed) runs them unchanged and a spawn resolves statelessly from the id.

Changes

@maka/runtime

  • expert-catalog.ts — types, materialization, static registry, combined resolver, and the built-in Code Review Team (read-only correctness / simplification / test-coverage reviewers).
  • expert-tools.ts — the team-bound expert_dispatch tool (member enum + roster). Parallel fan-out reuses the existing per-turn subagent concurrency; fan-in is the child summary + artifactIds pointers.
  • Pluggable resolver: spawnChildAgent / startChildTurn now resolve a spec id via requireResolvedAgentDefinition (builtin ?? expert), preserving built-in error messages.

@maka/core

  • expert-team.ts — the mode:expert-team:<teamId> session-label vocabulary.

Desktop

  • Lead system-prompt fragment + expert_dispatch tool, gated on the label (main session only — members never get nested teams).
  • expertTeam:list / expertTeam:start IPC + preload bridge + window typings to start a read-only team session.

How to use

const{ teams }=awaitwindow.maka.expertTeam.list();constr=awaitwindow.maka.expertTeam.start({teamId: 'code-review',prompt: 'Review the current diff.'});

Any session labeled mode:expert-team:<teamId> is a fully functional team lead — the label is the only special state.

Tests

New unit tests across core / runtime / desktop-main. Verified locally:

  • @maka/core 824/824 · @maka/runtime 1383 (0 fail) · @maka/headless 807/807 · desktop-main handler + quick-chat 28/28.
  • Full ordered npm run build passes (incl. desktop main + preload + renderer); desktop typecheck clean.

Note: ~193 desktop "source-grep / Storybook / real-window" contract tests fail only in a nested git-worktree checkout (they resolve the repo root to .claude/packages/... and ENOENT); they are unrelated to this change and pass in a normal checkout / CI.

Deliberately deferred (documented, not built)

Renderer team-picker panel; mesh "Agent Teams" (member↔member messaging, shared task board); worktree-isolated writing members (fail-closed today); remote expert marketplace; digital-colleague / IM / cloud layer. Design + rationale in docs/expert-team-{plan,implementation,runtime}.md.

Expert teams let a lead persona fan a task out to tool-scoped member
experts (child agents), then synthesize their results — the star
topology reverse-engineered from WorkBuddy's `team` experts and
QoderWork's sub-agent pipelines, rebuilt entirely on Maka's existing
child-agent machinery (no new orchestration engine, no mesh mailbox).
Runtime (@maka/runtime):
- expert-catalog.ts: ExpertDefinition / ExpertTeamDefinition, data-driven
members that inherit a capability archetype (tool scope + permission
mode) and may only narrow its tools — never widen. Members materialize
into ordinary AgentDefinitions with a deterministic id
(expert:<teamId>:<memberId>) so the child-turn machinery runs them
unchanged and a spawn resolves statelessly from the id.
- expert-tools.ts: the team-bound `expert_dispatch` tool (member enum +
roster), a thin wrapper over spawnChildAgent; parallel fan-out reuses
the existing per-turn concurrency; fan-in is the child summary +
artifact-id pointers.
- Pluggable definition resolver: spawnChildAgent / startChildTurn resolve
a spec id via requireResolvedAgentDefinition (builtin ?? expert),
preserving builtin error messages.
- Ships a read-only Code Review Team (correctness / simplification /
test-coverage reviewers) that runs within current capabilities.
Core (@maka/core):
- expert-team.ts: the `mode:expert-team:<teamId>` session-label vocabulary.
Desktop:
- Lead system-prompt fragment + `expert_dispatch` tool gated on the label
(main session only — members never get nested teams).
- expertTeam:list / expertTeam:start IPC + preload bridge + window typings
to start a read-only team session.
Tests across core / runtime / desktop-main. Docs in docs/expert-team-*.md.
The composer "+" button attached files directly. Turn it into a small
menu (reusing the existing Menu primitive, same as the workspace/branch
pickers):
- 添加文件或目录 → the existing attachment picker.
- 专家团 → a submenu listing the built-in expert teams; picking one
starts a new `mode:expert-team:<teamId>` session (read-only), mirroring
the quick-chat start+navigate flow.
Wiring: Composer gains `expertTeams` + `onStartExpertTeam` props; app-shell
loads window.maka.expertTeam.list() once and routes selection through a new
handleExpertTeamStart action. The "+" trigger renders whenever attachments
or teams are available. Storybook chat-surface exercises the menu.
End-to-end integration test: startChildTurn with an `expert:<team>:<member>`
spec id resolves through requireResolvedAgentDefinition into the materialized
member definition — asserting the child backend receives the archetype-scoped
tools (Read/Glob/Grep), the composed persona system prompt, explore permission
mode, and the expert id/name on the child run. Closes the one integration seam
the unit tests could not cover.
…ad code
- Correctness: the lead persona fragment was injected into every dispatched
member (child turns inherit the session's expert-team label). Gate the lead
fragment on `forChildTurn` so members no longer get "you are the lead, use
expert_dispatch" for a tool they don't have. (The tool itself was already
withheld from children.)
- getExpertAgentDefinition now honors its `| undefined` contract: a member that
would throw on materialization (tool-widening) resolves to undefined instead
of throwing through resolveAgentDefinition.
- Remove dead exports flagged for knip: buildExpertToolGroup / EXPERT_TOOL_GROUP_ID
(expert_dispatch is added directly, not via a deferred group), getExpertTeamMember
(no callers), and un-export the internal composeExpertSystemPrompt.
…4febe7
# Conflicts:
#	apps/desktop/src/main/main.ts
#	packages/ui/src/composer.tsx
@jackwener
jackwener merged commit dbc017e into mainJul 14, 2026
3 checks passed
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

@jackwener
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(runtime): star orchestrator→worker expert teams - #971

Merged
jackwener merged 5 commits into
mainfrom
claude/happy-hermann-4febe7
Jul 14, 2026
Merged

feat(runtime): star orchestrator→worker expert teams#971
jackwener merged 5 commits into
mainfrom
claude/happy-hermann-4febe7

Conversation

@jackwener

Copy link
Copy Markdown
Member

What

Implements expert teams — a lead persona fans a task out to tool-scoped member experts (child agents) and synthesizes their results. This is the star orchestrator→worker topology reverse-engineered from WorkBuddy's team experts and QoderWork's sub-agent pipelines (see docs/expert-team-implementation.md), rebuilt entirely on Maka's existing child-agent machinery — no new orchestration engine, no mesh mailbox, no shared task board.

Model

  • Capability archetype — a built-in agent profile (local_read / web_research / implementation) fixing tool scope + permission mode + category policy.
  • Expert — a persona that runs under an archetype and may narrow (never widen) its tools. An expert can never exceed its archetype's policy → stricter than either competitor, preserves Maka's permission-safety invariant.
  • Expert team — a lead (runs as the main session) + N dispatchable members. Members never talk to each other; the lead coordinates.

Members materialize into ordinary AgentDefinitions with a deterministic id expert:<teamId>:<memberId>, so the child-turn machinery (tool scoping, permission gating, worktree fail-closed) runs them unchanged and a spawn resolves statelessly from the id.

Changes

@maka/runtime

  • expert-catalog.ts — types, materialization, static registry, combined resolver, and the built-in Code Review Team (read-only correctness / simplification / test-coverage reviewers).
  • expert-tools.ts — the team-bound expert_dispatch tool (member enum + roster). Parallel fan-out reuses the existing per-turn subagent concurrency; fan-in is the child summary + artifactIds pointers.
  • Pluggable resolver: spawnChildAgent / startChildTurn now resolve a spec id via requireResolvedAgentDefinition (builtin ?? expert), preserving built-in error messages.

@maka/core

  • expert-team.ts — the mode:expert-team:<teamId> session-label vocabulary.

Desktop

  • Lead system-prompt fragment + expert_dispatch tool, gated on the label (main session only — members never get nested teams).
  • expertTeam:list / expertTeam:start IPC + preload bridge + window typings to start a read-only team session.

How to use

const{ teams }=awaitwindow.maka.expertTeam.list();constr=awaitwindow.maka.expertTeam.start({teamId: 'code-review',prompt: 'Review the current diff.'});

Any session labeled mode:expert-team:<teamId> is a fully functional team lead — the label is the only special state.

Tests

New unit tests across core / runtime / desktop-main. Verified locally:

  • @maka/core 824/824 · @maka/runtime 1383 (0 fail) · @maka/headless 807/807 · desktop-main handler + quick-chat 28/28.
  • Full ordered npm run build passes (incl. desktop main + preload + renderer); desktop typecheck clean.

Note: ~193 desktop "source-grep / Storybook / real-window" contract tests fail only in a nested git-worktree checkout (they resolve the repo root to .claude/packages/... and ENOENT); they are unrelated to this change and pass in a normal checkout / CI.

Deliberately deferred (documented, not built)

Renderer team-picker panel; mesh "Agent Teams" (member↔member messaging, shared task board); worktree-isolated writing members (fail-closed today); remote expert marketplace; digital-colleague / IM / cloud layer. Design + rationale in docs/expert-team-{plan,implementation,runtime}.md.

Expert teams let a lead persona fan a task out to tool-scoped member
experts (child agents), then synthesize their results — the star
topology reverse-engineered from WorkBuddy's `team` experts and
QoderWork's sub-agent pipelines, rebuilt entirely on Maka's existing
child-agent machinery (no new orchestration engine, no mesh mailbox).
Runtime (@maka/runtime):
- expert-catalog.ts: ExpertDefinition / ExpertTeamDefinition, data-driven
members that inherit a capability archetype (tool scope + permission
mode) and may only narrow its tools — never widen. Members materialize
into ordinary AgentDefinitions with a deterministic id
(expert:<teamId>:<memberId>) so the child-turn machinery runs them
unchanged and a spawn resolves statelessly from the id.
- expert-tools.ts: the team-bound `expert_dispatch` tool (member enum +
roster), a thin wrapper over spawnChildAgent; parallel fan-out reuses
the existing per-turn concurrency; fan-in is the child summary +
artifact-id pointers.
- Pluggable definition resolver: spawnChildAgent / startChildTurn resolve
a spec id via requireResolvedAgentDefinition (builtin ?? expert),
preserving builtin error messages.
- Ships a read-only Code Review Team (correctness / simplification /
test-coverage reviewers) that runs within current capabilities.
Core (@maka/core):
- expert-team.ts: the `mode:expert-team:<teamId>` session-label vocabulary.
Desktop:
- Lead system-prompt fragment + `expert_dispatch` tool gated on the label
(main session only — members never get nested teams).
- expertTeam:list / expertTeam:start IPC + preload bridge + window typings
to start a read-only team session.
Tests across core / runtime / desktop-main. Docs in docs/expert-team-*.md.
The composer "+" button attached files directly. Turn it into a small
menu (reusing the existing Menu primitive, same as the workspace/branch
pickers):
- 添加文件或目录 → the existing attachment picker.
- 专家团 → a submenu listing the built-in expert teams; picking one
starts a new `mode:expert-team:<teamId>` session (read-only), mirroring
the quick-chat start+navigate flow.
Wiring: Composer gains `expertTeams` + `onStartExpertTeam` props; app-shell
loads window.maka.expertTeam.list() once and routes selection through a new
handleExpertTeamStart action. The "+" trigger renders whenever attachments
or teams are available. Storybook chat-surface exercises the menu.
End-to-end integration test: startChildTurn with an `expert:<team>:<member>`
spec id resolves through requireResolvedAgentDefinition into the materialized
member definition — asserting the child backend receives the archetype-scoped
tools (Read/Glob/Grep), the composed persona system prompt, explore permission
mode, and the expert id/name on the child run. Closes the one integration seam
the unit tests could not cover.
…ad code
- Correctness: the lead persona fragment was injected into every dispatched
member (child turns inherit the session's expert-team label). Gate the lead
fragment on `forChildTurn` so members no longer get "you are the lead, use
expert_dispatch" for a tool they don't have. (The tool itself was already
withheld from children.)
- getExpertAgentDefinition now honors its `| undefined` contract: a member that
would throw on materialization (tool-widening) resolves to undefined instead
of throwing through resolveAgentDefinition.
- Remove dead exports flagged for knip: buildExpertToolGroup / EXPERT_TOOL_GROUP_ID
(expert_dispatch is added directly, not via a deferred group), getExpertTeamMember
(no callers), and un-export the internal composeExpertSystemPrompt.
…4febe7
# Conflicts:
#	apps/desktop/src/main/main.ts
#	packages/ui/src/composer.tsx
@jackwener
jackwener merged commit dbc017e into mainJul 14, 2026
3 checks passed
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

@jackwener
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

feat(runtime): star orchestrator→worker expert teams - #971

Merged
jackwener merged 5 commits into
mainfrom
claude/happy-hermann-4febe7
Jul 14, 2026
Merged

feat(runtime): star orchestrator→worker expert teams#971
jackwener merged 5 commits into
mainfrom
claude/happy-hermann-4febe7

Conversation

@jackwener

Copy link
Copy Markdown
Member

What

Implements expert teams — a lead persona fans a task out to tool-scoped member experts (child agents) and synthesizes their results. This is the star orchestrator→worker topology reverse-engineered from WorkBuddy's team experts and QoderWork's sub-agent pipelines (see docs/expert-team-implementation.md), rebuilt entirely on Maka's existing child-agent machinery — no new orchestration engine, no mesh mailbox, no shared task board.

Model

  • Capability archetype — a built-in agent profile (local_read / web_research / implementation) fixing tool scope + permission mode + category policy.
  • Expert — a persona that runs under an archetype and may narrow (never widen) its tools. An expert can never exceed its archetype's policy → stricter than either competitor, preserves Maka's permission-safety invariant.
  • Expert team — a lead (runs as the main session) + N dispatchable members. Members never talk to each other; the lead coordinates.

Members materialize into ordinary AgentDefinitions with a deterministic id expert:<teamId>:<memberId>, so the child-turn machinery (tool scoping, permission gating, worktree fail-closed) runs them unchanged and a spawn resolves statelessly from the id.

Changes

@maka/runtime

  • expert-catalog.ts — types, materialization, static registry, combined resolver, and the built-in Code Review Team (read-only correctness / simplification / test-coverage reviewers).
  • expert-tools.ts — the team-bound expert_dispatch tool (member enum + roster). Parallel fan-out reuses the existing per-turn subagent concurrency; fan-in is the child summary + artifactIds pointers.
  • Pluggable resolver: spawnChildAgent / startChildTurn now resolve a spec id via requireResolvedAgentDefinition (builtin ?? expert), preserving built-in error messages.

@maka/core

  • expert-team.ts — the mode:expert-team:<teamId> session-label vocabulary.

Desktop

  • Lead system-prompt fragment + expert_dispatch tool, gated on the label (main session only — members never get nested teams).
  • expertTeam:list / expertTeam:start IPC + preload bridge + window typings to start a read-only team session.

How to use

const{ teams }=awaitwindow.maka.expertTeam.list();constr=awaitwindow.maka.expertTeam.start({teamId: 'code-review',prompt: 'Review the current diff.'});

Any session labeled mode:expert-team:<teamId> is a fully functional team lead — the label is the only special state.

Tests

New unit tests across core / runtime / desktop-main. Verified locally:

  • @maka/core 824/824 · @maka/runtime 1383 (0 fail) · @maka/headless 807/807 · desktop-main handler + quick-chat 28/28.
  • Full ordered npm run build passes (incl. desktop main + preload + renderer); desktop typecheck clean.

Note: ~193 desktop "source-grep / Storybook / real-window" contract tests fail only in a nested git-worktree checkout (they resolve the repo root to .claude/packages/... and ENOENT); they are unrelated to this change and pass in a normal checkout / CI.

Deliberately deferred (documented, not built)

Renderer team-picker panel; mesh "Agent Teams" (member↔member messaging, shared task board); worktree-isolated writing members (fail-closed today); remote expert marketplace; digital-colleague / IM / cloud layer. Design + rationale in docs/expert-team-{plan,implementation,runtime}.md.

Expert teams let a lead persona fan a task out to tool-scoped member
experts (child agents), then synthesize their results — the star
topology reverse-engineered from WorkBuddy's `team` experts and
QoderWork's sub-agent pipelines, rebuilt entirely on Maka's existing
child-agent machinery (no new orchestration engine, no mesh mailbox).
Runtime (@maka/runtime):
- expert-catalog.ts: ExpertDefinition / ExpertTeamDefinition, data-driven
members that inherit a capability archetype (tool scope + permission
mode) and may only narrow its tools — never widen. Members materialize
into ordinary AgentDefinitions with a deterministic id
(expert:<teamId>:<memberId>) so the child-turn machinery runs them
unchanged and a spawn resolves statelessly from the id.
- expert-tools.ts: the team-bound `expert_dispatch` tool (member enum +
roster), a thin wrapper over spawnChildAgent; parallel fan-out reuses
the existing per-turn concurrency; fan-in is the child summary +
artifact-id pointers.
- Pluggable definition resolver: spawnChildAgent / startChildTurn resolve
a spec id via requireResolvedAgentDefinition (builtin ?? expert),
preserving builtin error messages.
- Ships a read-only Code Review Team (correctness / simplification /
test-coverage reviewers) that runs within current capabilities.
Core (@maka/core):
- expert-team.ts: the `mode:expert-team:<teamId>` session-label vocabulary.
Desktop:
- Lead system-prompt fragment + `expert_dispatch` tool gated on the label
(main session only — members never get nested teams).
- expertTeam:list / expertTeam:start IPC + preload bridge + window typings
to start a read-only team session.
Tests across core / runtime / desktop-main. Docs in docs/expert-team-*.md.
The composer "+" button attached files directly. Turn it into a small
menu (reusing the existing Menu primitive, same as the workspace/branch
pickers):
- 添加文件或目录 → the existing attachment picker.
- 专家团 → a submenu listing the built-in expert teams; picking one
starts a new `mode:expert-team:<teamId>` session (read-only), mirroring
the quick-chat start+navigate flow.
Wiring: Composer gains `expertTeams` + `onStartExpertTeam` props; app-shell
loads window.maka.expertTeam.list() once and routes selection through a new
handleExpertTeamStart action. The "+" trigger renders whenever attachments
or teams are available. Storybook chat-surface exercises the menu.
End-to-end integration test: startChildTurn with an `expert:<team>:<member>`
spec id resolves through requireResolvedAgentDefinition into the materialized
member definition — asserting the child backend receives the archetype-scoped
tools (Read/Glob/Grep), the composed persona system prompt, explore permission
mode, and the expert id/name on the child run. Closes the one integration seam
the unit tests could not cover.
…ad code
- Correctness: the lead persona fragment was injected into every dispatched
member (child turns inherit the session's expert-team label). Gate the lead
fragment on `forChildTurn` so members no longer get "you are the lead, use
expert_dispatch" for a tool they don't have. (The tool itself was already
withheld from children.)
- getExpertAgentDefinition now honors its `| undefined` contract: a member that
would throw on materialization (tool-widening) resolves to undefined instead
of throwing through resolveAgentDefinition.
- Remove dead exports flagged for knip: buildExpertToolGroup / EXPERT_TOOL_GROUP_ID
(expert_dispatch is added directly, not via a deferred group), getExpertTeamMember
(no callers), and un-export the internal composeExpertSystemPrompt.
…4febe7
# Conflicts:
#	apps/desktop/src/main/main.ts
#	packages/ui/src/composer.tsx
@jackwener
jackwener merged commit dbc017e into mainJul 14, 2026
3 checks passed
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

@jackwener