feat(runtime): add durable expert-team collaboration - #1112

Merged
Astro-Han merged 2 commits into
apache:mainfrom
Nyvo-io:feat/agent-team-collaboration
Jul 17, 2026
Merged

feat(runtime): add durable expert-team collaboration#1112
Astro-Han merged 2 commits into
apache:mainfrom
Nyvo-io:feat/agent-team-collaboration

Conversation

@Nyvo-io

@Nyvo-ioNyvo-io commented Jul 16, 2026

Copy link
Copy Markdown
Contributor

Summary

This adds the first backend-only collaboration slice for Maka expert teams, building on the existing expert fan-out/fan-in runtime and Task Ledger ownership model.

  • add a durable, append-only mailbox scoped by session, team, and parent lead AgentRun
  • support bounded role-addressed direct messages and broadcasts with trusted sender AgentRun/Turn attribution
  • expose trusted-context team_message / team_inbox tools to leads and members
  • let child agents discover tasks owned by the current lead run and atomically claim one available Task Ledger item
  • settle claimed task evidence across success, failure, cancellation, waiting-permission, timeout, and startup-error paths without auto-completing successful work
  • document replay/restart boundaries and wire one shared mailbox/task ledger through the desktop runtime

Safety and ownership semantics

  • The parent/lead remains the final adjudicator; child messages and successful results are evidence, not completion authority.
  • A child cannot steal an in-progress task, claim work from another lead run, or claim more than one task per child turn.
  • Agent/team/run identity comes from trusted runtime context rather than model-controlled arguments.
  • Direct recipients are stable role addresses within one parent lead run. Repeated or concurrent invocations of the same member share that role mailbox, while each caller owns its after_seq cursor.
  • Mailbox histories fail closed on corruption, non-monotonic cursors, duplicate message IDs, invalid identities, or lead attribution outside the parent run.
  • This PR does not add invocation-private inboxes, renderer UI, automatic message wakeups, remote/cross-machine workers, marketplace behavior, or worktree writes.

Verification

  • npm run build:test
  • npm run lint
  • npm run typecheck
  • npm run test:dist — all workspace tests passed
  • focused core/runtime/storage mailbox and team-tool tests — 16 passed

Related to #544.

Builds on the expert dispatch work in #971 and Task Ledger child ownership/review semantics in #956; it does not duplicate those slices.

@Astro-HanAstro-Han left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approved.

Non-blocking P2 follow-up: direct-message recipients are keyed only by the stable agent ID, so repeated or concurrent dispatches of the same member within one lead run share a role inbox. A fresh child invocation can therefore read direct messages intended for an earlier invocation. Please either scope recipient identity/cursors to the child run/turn, or explicitly document and test role-mailbox semantics.

@Nyvo-io
Nyvo-ioforce-pushed the feat/agent-team-collaboration branch from 7ae418d to d4fdbd0CompareJuly 17, 2026 06:26
@Nyvo-io

Copy link
Copy Markdown
ContributorAuthor

@Astro-Han Addressed the non-blocking P2 in d4fdbd0 by making the existing role-mailbox semantics explicit and tested.

  • Direct recipients are now documented in the core contract, tool descriptions, and runtime docs as stable role addresses within one parent lead run, not invocation-private addresses.
  • Repeated and concurrent dispatches of the same member are covered at the runtime and storage boundaries; the tests lock shared history plus caller-owned after_seq cursors, including fresh-invocation replay.
  • The follow-up review also found that persisted replay did not enforce the live-send invariant for lead attribution. isAgentMailboxMessage now rejects a lead whose runId differs from parentRunId, with a RED-to-GREEN regression test.
  • The branch was rebased and the prior conflict is resolved.

The current typecheck, test, and e2e checks all pass, and the PR is mergeable/clean.

@Astro-Han

Copy link
Copy Markdown
Contributor

LGTM! Merging.

@Astro-Han
Astro-Han merged commit 1f4f23b into apache:mainJul 17, 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.

2 participants

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

feat(runtime): add durable expert-team collaboration - #1112

Merged
Astro-Han merged 2 commits into
apache:mainfrom
Nyvo-io:feat/agent-team-collaboration
Jul 17, 2026
Merged

feat(runtime): add durable expert-team collaboration#1112
Astro-Han merged 2 commits into
apache:mainfrom
Nyvo-io:feat/agent-team-collaboration

Conversation

@Nyvo-io

@Nyvo-ioNyvo-io commented Jul 16, 2026

Copy link
Copy Markdown
Contributor

Summary

This adds the first backend-only collaboration slice for Maka expert teams, building on the existing expert fan-out/fan-in runtime and Task Ledger ownership model.

  • add a durable, append-only mailbox scoped by session, team, and parent lead AgentRun
  • support bounded role-addressed direct messages and broadcasts with trusted sender AgentRun/Turn attribution
  • expose trusted-context team_message / team_inbox tools to leads and members
  • let child agents discover tasks owned by the current lead run and atomically claim one available Task Ledger item
  • settle claimed task evidence across success, failure, cancellation, waiting-permission, timeout, and startup-error paths without auto-completing successful work
  • document replay/restart boundaries and wire one shared mailbox/task ledger through the desktop runtime

Safety and ownership semantics

  • The parent/lead remains the final adjudicator; child messages and successful results are evidence, not completion authority.
  • A child cannot steal an in-progress task, claim work from another lead run, or claim more than one task per child turn.
  • Agent/team/run identity comes from trusted runtime context rather than model-controlled arguments.
  • Direct recipients are stable role addresses within one parent lead run. Repeated or concurrent invocations of the same member share that role mailbox, while each caller owns its after_seq cursor.
  • Mailbox histories fail closed on corruption, non-monotonic cursors, duplicate message IDs, invalid identities, or lead attribution outside the parent run.
  • This PR does not add invocation-private inboxes, renderer UI, automatic message wakeups, remote/cross-machine workers, marketplace behavior, or worktree writes.

Verification

  • npm run build:test
  • npm run lint
  • npm run typecheck
  • npm run test:dist — all workspace tests passed
  • focused core/runtime/storage mailbox and team-tool tests — 16 passed

Related to #544.

Builds on the expert dispatch work in #971 and Task Ledger child ownership/review semantics in #956; it does not duplicate those slices.

@Astro-HanAstro-Han left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approved.

Non-blocking P2 follow-up: direct-message recipients are keyed only by the stable agent ID, so repeated or concurrent dispatches of the same member within one lead run share a role inbox. A fresh child invocation can therefore read direct messages intended for an earlier invocation. Please either scope recipient identity/cursors to the child run/turn, or explicitly document and test role-mailbox semantics.

@Nyvo-io
Nyvo-ioforce-pushed the feat/agent-team-collaboration branch from 7ae418d to d4fdbd0CompareJuly 17, 2026 06:26
@Nyvo-io

Copy link
Copy Markdown
ContributorAuthor

@Astro-Han Addressed the non-blocking P2 in d4fdbd0 by making the existing role-mailbox semantics explicit and tested.

  • Direct recipients are now documented in the core contract, tool descriptions, and runtime docs as stable role addresses within one parent lead run, not invocation-private addresses.
  • Repeated and concurrent dispatches of the same member are covered at the runtime and storage boundaries; the tests lock shared history plus caller-owned after_seq cursors, including fresh-invocation replay.
  • The follow-up review also found that persisted replay did not enforce the live-send invariant for lead attribution. isAgentMailboxMessage now rejects a lead whose runId differs from parentRunId, with a RED-to-GREEN regression test.
  • The branch was rebased and the prior conflict is resolved.

The current typecheck, test, and e2e checks all pass, and the PR is mergeable/clean.

@Astro-Han

Copy link
Copy Markdown
Contributor

LGTM! Merging.

@Astro-Han
Astro-Han merged commit 1f4f23b into apache:mainJul 17, 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.

2 participants

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

feat(runtime): add durable expert-team collaboration - #1112

Merged
Astro-Han merged 2 commits into
apache:mainfrom
Nyvo-io:feat/agent-team-collaboration
Jul 17, 2026
Merged

feat(runtime): add durable expert-team collaboration#1112
Astro-Han merged 2 commits into
apache:mainfrom
Nyvo-io:feat/agent-team-collaboration

Conversation

@Nyvo-io

@Nyvo-ioNyvo-io commented Jul 16, 2026

Copy link
Copy Markdown
Contributor

Summary

This adds the first backend-only collaboration slice for Maka expert teams, building on the existing expert fan-out/fan-in runtime and Task Ledger ownership model.

  • add a durable, append-only mailbox scoped by session, team, and parent lead AgentRun
  • support bounded role-addressed direct messages and broadcasts with trusted sender AgentRun/Turn attribution
  • expose trusted-context team_message / team_inbox tools to leads and members
  • let child agents discover tasks owned by the current lead run and atomically claim one available Task Ledger item
  • settle claimed task evidence across success, failure, cancellation, waiting-permission, timeout, and startup-error paths without auto-completing successful work
  • document replay/restart boundaries and wire one shared mailbox/task ledger through the desktop runtime

Safety and ownership semantics

  • The parent/lead remains the final adjudicator; child messages and successful results are evidence, not completion authority.
  • A child cannot steal an in-progress task, claim work from another lead run, or claim more than one task per child turn.
  • Agent/team/run identity comes from trusted runtime context rather than model-controlled arguments.
  • Direct recipients are stable role addresses within one parent lead run. Repeated or concurrent invocations of the same member share that role mailbox, while each caller owns its after_seq cursor.
  • Mailbox histories fail closed on corruption, non-monotonic cursors, duplicate message IDs, invalid identities, or lead attribution outside the parent run.
  • This PR does not add invocation-private inboxes, renderer UI, automatic message wakeups, remote/cross-machine workers, marketplace behavior, or worktree writes.

Verification

  • npm run build:test
  • npm run lint
  • npm run typecheck
  • npm run test:dist — all workspace tests passed
  • focused core/runtime/storage mailbox and team-tool tests — 16 passed

Related to #544.

Builds on the expert dispatch work in #971 and Task Ledger child ownership/review semantics in #956; it does not duplicate those slices.

@Astro-HanAstro-Han left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approved.

Non-blocking P2 follow-up: direct-message recipients are keyed only by the stable agent ID, so repeated or concurrent dispatches of the same member within one lead run share a role inbox. A fresh child invocation can therefore read direct messages intended for an earlier invocation. Please either scope recipient identity/cursors to the child run/turn, or explicitly document and test role-mailbox semantics.

@Nyvo-io
Nyvo-ioforce-pushed the feat/agent-team-collaboration branch from 7ae418d to d4fdbd0CompareJuly 17, 2026 06:26
@Nyvo-io

Copy link
Copy Markdown
ContributorAuthor

@Astro-Han Addressed the non-blocking P2 in d4fdbd0 by making the existing role-mailbox semantics explicit and tested.

  • Direct recipients are now documented in the core contract, tool descriptions, and runtime docs as stable role addresses within one parent lead run, not invocation-private addresses.
  • Repeated and concurrent dispatches of the same member are covered at the runtime and storage boundaries; the tests lock shared history plus caller-owned after_seq cursors, including fresh-invocation replay.
  • The follow-up review also found that persisted replay did not enforce the live-send invariant for lead attribution. isAgentMailboxMessage now rejects a lead whose runId differs from parentRunId, with a RED-to-GREEN regression test.
  • The branch was rebased and the prior conflict is resolved.

The current typecheck, test, and e2e checks all pass, and the PR is mergeable/clean.

@Astro-Han

Copy link
Copy Markdown
Contributor

LGTM! Merging.

@Astro-Han
Astro-Han merged commit 1f4f23b into apache:mainJul 17, 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.

2 participants

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

feat(runtime): add durable expert-team collaboration - #1112

Merged
Astro-Han merged 2 commits into
apache:mainfrom
Nyvo-io:feat/agent-team-collaboration
Jul 17, 2026
Merged

feat(runtime): add durable expert-team collaboration#1112
Astro-Han merged 2 commits into
apache:mainfrom
Nyvo-io:feat/agent-team-collaboration

Conversation

@Nyvo-io

@Nyvo-ioNyvo-io commented Jul 16, 2026

Copy link
Copy Markdown
Contributor

Summary

This adds the first backend-only collaboration slice for Maka expert teams, building on the existing expert fan-out/fan-in runtime and Task Ledger ownership model.

  • add a durable, append-only mailbox scoped by session, team, and parent lead AgentRun
  • support bounded role-addressed direct messages and broadcasts with trusted sender AgentRun/Turn attribution
  • expose trusted-context team_message / team_inbox tools to leads and members
  • let child agents discover tasks owned by the current lead run and atomically claim one available Task Ledger item
  • settle claimed task evidence across success, failure, cancellation, waiting-permission, timeout, and startup-error paths without auto-completing successful work
  • document replay/restart boundaries and wire one shared mailbox/task ledger through the desktop runtime

Safety and ownership semantics

  • The parent/lead remains the final adjudicator; child messages and successful results are evidence, not completion authority.
  • A child cannot steal an in-progress task, claim work from another lead run, or claim more than one task per child turn.
  • Agent/team/run identity comes from trusted runtime context rather than model-controlled arguments.
  • Direct recipients are stable role addresses within one parent lead run. Repeated or concurrent invocations of the same member share that role mailbox, while each caller owns its after_seq cursor.
  • Mailbox histories fail closed on corruption, non-monotonic cursors, duplicate message IDs, invalid identities, or lead attribution outside the parent run.
  • This PR does not add invocation-private inboxes, renderer UI, automatic message wakeups, remote/cross-machine workers, marketplace behavior, or worktree writes.

Verification

  • npm run build:test
  • npm run lint
  • npm run typecheck
  • npm run test:dist — all workspace tests passed
  • focused core/runtime/storage mailbox and team-tool tests — 16 passed

Related to #544.

Builds on the expert dispatch work in #971 and Task Ledger child ownership/review semantics in #956; it does not duplicate those slices.

@Astro-HanAstro-Han left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approved.

Non-blocking P2 follow-up: direct-message recipients are keyed only by the stable agent ID, so repeated or concurrent dispatches of the same member within one lead run share a role inbox. A fresh child invocation can therefore read direct messages intended for an earlier invocation. Please either scope recipient identity/cursors to the child run/turn, or explicitly document and test role-mailbox semantics.

@Nyvo-io
Nyvo-ioforce-pushed the feat/agent-team-collaboration branch from 7ae418d to d4fdbd0CompareJuly 17, 2026 06:26
@Nyvo-io

Copy link
Copy Markdown
ContributorAuthor

@Astro-Han Addressed the non-blocking P2 in d4fdbd0 by making the existing role-mailbox semantics explicit and tested.

  • Direct recipients are now documented in the core contract, tool descriptions, and runtime docs as stable role addresses within one parent lead run, not invocation-private addresses.
  • Repeated and concurrent dispatches of the same member are covered at the runtime and storage boundaries; the tests lock shared history plus caller-owned after_seq cursors, including fresh-invocation replay.
  • The follow-up review also found that persisted replay did not enforce the live-send invariant for lead attribution. isAgentMailboxMessage now rejects a lead whose runId differs from parentRunId, with a RED-to-GREEN regression test.
  • The branch was rebased and the prior conflict is resolved.

The current typecheck, test, and e2e checks all pass, and the PR is mergeable/clean.

@Astro-Han

Copy link
Copy Markdown
Contributor

LGTM! Merging.

@Astro-Han
Astro-Han merged commit 1f4f23b into apache:mainJul 17, 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.

2 participants

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

feat(runtime): add durable expert-team collaboration - #1112

Merged
Astro-Han merged 2 commits into
apache:mainfrom
Nyvo-io:feat/agent-team-collaboration
Jul 17, 2026
Merged

feat(runtime): add durable expert-team collaboration#1112
Astro-Han merged 2 commits into
apache:mainfrom
Nyvo-io:feat/agent-team-collaboration

Conversation

@Nyvo-io

@Nyvo-ioNyvo-io commented Jul 16, 2026

Copy link
Copy Markdown
Contributor

Summary

This adds the first backend-only collaboration slice for Maka expert teams, building on the existing expert fan-out/fan-in runtime and Task Ledger ownership model.

  • add a durable, append-only mailbox scoped by session, team, and parent lead AgentRun
  • support bounded role-addressed direct messages and broadcasts with trusted sender AgentRun/Turn attribution
  • expose trusted-context team_message / team_inbox tools to leads and members
  • let child agents discover tasks owned by the current lead run and atomically claim one available Task Ledger item
  • settle claimed task evidence across success, failure, cancellation, waiting-permission, timeout, and startup-error paths without auto-completing successful work
  • document replay/restart boundaries and wire one shared mailbox/task ledger through the desktop runtime

Safety and ownership semantics

  • The parent/lead remains the final adjudicator; child messages and successful results are evidence, not completion authority.
  • A child cannot steal an in-progress task, claim work from another lead run, or claim more than one task per child turn.
  • Agent/team/run identity comes from trusted runtime context rather than model-controlled arguments.
  • Direct recipients are stable role addresses within one parent lead run. Repeated or concurrent invocations of the same member share that role mailbox, while each caller owns its after_seq cursor.
  • Mailbox histories fail closed on corruption, non-monotonic cursors, duplicate message IDs, invalid identities, or lead attribution outside the parent run.
  • This PR does not add invocation-private inboxes, renderer UI, automatic message wakeups, remote/cross-machine workers, marketplace behavior, or worktree writes.

Verification

  • npm run build:test
  • npm run lint
  • npm run typecheck
  • npm run test:dist — all workspace tests passed
  • focused core/runtime/storage mailbox and team-tool tests — 16 passed

Related to #544.

Builds on the expert dispatch work in #971 and Task Ledger child ownership/review semantics in #956; it does not duplicate those slices.

@Astro-HanAstro-Han left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approved.

Non-blocking P2 follow-up: direct-message recipients are keyed only by the stable agent ID, so repeated or concurrent dispatches of the same member within one lead run share a role inbox. A fresh child invocation can therefore read direct messages intended for an earlier invocation. Please either scope recipient identity/cursors to the child run/turn, or explicitly document and test role-mailbox semantics.

@Nyvo-io
Nyvo-ioforce-pushed the feat/agent-team-collaboration branch from 7ae418d to d4fdbd0CompareJuly 17, 2026 06:26
@Nyvo-io

Copy link
Copy Markdown
ContributorAuthor

@Astro-Han Addressed the non-blocking P2 in d4fdbd0 by making the existing role-mailbox semantics explicit and tested.

  • Direct recipients are now documented in the core contract, tool descriptions, and runtime docs as stable role addresses within one parent lead run, not invocation-private addresses.
  • Repeated and concurrent dispatches of the same member are covered at the runtime and storage boundaries; the tests lock shared history plus caller-owned after_seq cursors, including fresh-invocation replay.
  • The follow-up review also found that persisted replay did not enforce the live-send invariant for lead attribution. isAgentMailboxMessage now rejects a lead whose runId differs from parentRunId, with a RED-to-GREEN regression test.
  • The branch was rebased and the prior conflict is resolved.

The current typecheck, test, and e2e checks all pass, and the PR is mergeable/clean.

@Astro-Han

Copy link
Copy Markdown
Contributor

LGTM! Merging.

@Astro-Han
Astro-Han merged commit 1f4f23b into apache:mainJul 17, 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.

2 participants

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

feat(runtime): add durable expert-team collaboration - #1112

Merged
Astro-Han merged 2 commits into
apache:mainfrom
Nyvo-io:feat/agent-team-collaboration
Jul 17, 2026
Merged

feat(runtime): add durable expert-team collaboration#1112
Astro-Han merged 2 commits into
apache:mainfrom
Nyvo-io:feat/agent-team-collaboration

Conversation

@Nyvo-io

@Nyvo-ioNyvo-io commented Jul 16, 2026

Copy link
Copy Markdown
Contributor

Summary

This adds the first backend-only collaboration slice for Maka expert teams, building on the existing expert fan-out/fan-in runtime and Task Ledger ownership model.

  • add a durable, append-only mailbox scoped by session, team, and parent lead AgentRun
  • support bounded role-addressed direct messages and broadcasts with trusted sender AgentRun/Turn attribution
  • expose trusted-context team_message / team_inbox tools to leads and members
  • let child agents discover tasks owned by the current lead run and atomically claim one available Task Ledger item
  • settle claimed task evidence across success, failure, cancellation, waiting-permission, timeout, and startup-error paths without auto-completing successful work
  • document replay/restart boundaries and wire one shared mailbox/task ledger through the desktop runtime

Safety and ownership semantics

  • The parent/lead remains the final adjudicator; child messages and successful results are evidence, not completion authority.
  • A child cannot steal an in-progress task, claim work from another lead run, or claim more than one task per child turn.
  • Agent/team/run identity comes from trusted runtime context rather than model-controlled arguments.
  • Direct recipients are stable role addresses within one parent lead run. Repeated or concurrent invocations of the same member share that role mailbox, while each caller owns its after_seq cursor.
  • Mailbox histories fail closed on corruption, non-monotonic cursors, duplicate message IDs, invalid identities, or lead attribution outside the parent run.
  • This PR does not add invocation-private inboxes, renderer UI, automatic message wakeups, remote/cross-machine workers, marketplace behavior, or worktree writes.

Verification

  • npm run build:test
  • npm run lint
  • npm run typecheck
  • npm run test:dist — all workspace tests passed
  • focused core/runtime/storage mailbox and team-tool tests — 16 passed

Related to #544.

Builds on the expert dispatch work in #971 and Task Ledger child ownership/review semantics in #956; it does not duplicate those slices.

@Astro-HanAstro-Han left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approved.

Non-blocking P2 follow-up: direct-message recipients are keyed only by the stable agent ID, so repeated or concurrent dispatches of the same member within one lead run share a role inbox. A fresh child invocation can therefore read direct messages intended for an earlier invocation. Please either scope recipient identity/cursors to the child run/turn, or explicitly document and test role-mailbox semantics.

@Nyvo-io
Nyvo-ioforce-pushed the feat/agent-team-collaboration branch from 7ae418d to d4fdbd0CompareJuly 17, 2026 06:26
@Nyvo-io

Copy link
Copy Markdown
ContributorAuthor

@Astro-Han Addressed the non-blocking P2 in d4fdbd0 by making the existing role-mailbox semantics explicit and tested.

  • Direct recipients are now documented in the core contract, tool descriptions, and runtime docs as stable role addresses within one parent lead run, not invocation-private addresses.
  • Repeated and concurrent dispatches of the same member are covered at the runtime and storage boundaries; the tests lock shared history plus caller-owned after_seq cursors, including fresh-invocation replay.
  • The follow-up review also found that persisted replay did not enforce the live-send invariant for lead attribution. isAgentMailboxMessage now rejects a lead whose runId differs from parentRunId, with a RED-to-GREEN regression test.
  • The branch was rebased and the prior conflict is resolved.

The current typecheck, test, and e2e checks all pass, and the PR is mergeable/clean.

@Astro-Han

Copy link
Copy Markdown
Contributor

LGTM! Merging.

@Astro-Han
Astro-Han merged commit 1f4f23b into apache:mainJul 17, 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.

2 participants

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

feat(runtime): add durable expert-team collaboration - #1112

Merged
Astro-Han merged 2 commits into
apache:mainfrom
Nyvo-io:feat/agent-team-collaboration
Jul 17, 2026
Merged

feat(runtime): add durable expert-team collaboration#1112
Astro-Han merged 2 commits into
apache:mainfrom
Nyvo-io:feat/agent-team-collaboration

Conversation

@Nyvo-io

@Nyvo-ioNyvo-io commented Jul 16, 2026

Copy link
Copy Markdown
Contributor

Summary

This adds the first backend-only collaboration slice for Maka expert teams, building on the existing expert fan-out/fan-in runtime and Task Ledger ownership model.

  • add a durable, append-only mailbox scoped by session, team, and parent lead AgentRun
  • support bounded role-addressed direct messages and broadcasts with trusted sender AgentRun/Turn attribution
  • expose trusted-context team_message / team_inbox tools to leads and members
  • let child agents discover tasks owned by the current lead run and atomically claim one available Task Ledger item
  • settle claimed task evidence across success, failure, cancellation, waiting-permission, timeout, and startup-error paths without auto-completing successful work
  • document replay/restart boundaries and wire one shared mailbox/task ledger through the desktop runtime

Safety and ownership semantics

  • The parent/lead remains the final adjudicator; child messages and successful results are evidence, not completion authority.
  • A child cannot steal an in-progress task, claim work from another lead run, or claim more than one task per child turn.
  • Agent/team/run identity comes from trusted runtime context rather than model-controlled arguments.
  • Direct recipients are stable role addresses within one parent lead run. Repeated or concurrent invocations of the same member share that role mailbox, while each caller owns its after_seq cursor.
  • Mailbox histories fail closed on corruption, non-monotonic cursors, duplicate message IDs, invalid identities, or lead attribution outside the parent run.
  • This PR does not add invocation-private inboxes, renderer UI, automatic message wakeups, remote/cross-machine workers, marketplace behavior, or worktree writes.

Verification

  • npm run build:test
  • npm run lint
  • npm run typecheck
  • npm run test:dist — all workspace tests passed
  • focused core/runtime/storage mailbox and team-tool tests — 16 passed

Related to #544.

Builds on the expert dispatch work in #971 and Task Ledger child ownership/review semantics in #956; it does not duplicate those slices.

@Astro-HanAstro-Han left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approved.

Non-blocking P2 follow-up: direct-message recipients are keyed only by the stable agent ID, so repeated or concurrent dispatches of the same member within one lead run share a role inbox. A fresh child invocation can therefore read direct messages intended for an earlier invocation. Please either scope recipient identity/cursors to the child run/turn, or explicitly document and test role-mailbox semantics.

@Nyvo-io
Nyvo-ioforce-pushed the feat/agent-team-collaboration branch from 7ae418d to d4fdbd0CompareJuly 17, 2026 06:26
@Nyvo-io

Copy link
Copy Markdown
ContributorAuthor

@Astro-Han Addressed the non-blocking P2 in d4fdbd0 by making the existing role-mailbox semantics explicit and tested.

  • Direct recipients are now documented in the core contract, tool descriptions, and runtime docs as stable role addresses within one parent lead run, not invocation-private addresses.
  • Repeated and concurrent dispatches of the same member are covered at the runtime and storage boundaries; the tests lock shared history plus caller-owned after_seq cursors, including fresh-invocation replay.
  • The follow-up review also found that persisted replay did not enforce the live-send invariant for lead attribution. isAgentMailboxMessage now rejects a lead whose runId differs from parentRunId, with a RED-to-GREEN regression test.
  • The branch was rebased and the prior conflict is resolved.

The current typecheck, test, and e2e checks all pass, and the PR is mergeable/clean.

@Astro-Han

Copy link
Copy Markdown
Contributor

LGTM! Merging.

@Astro-Han
Astro-Han merged commit 1f4f23b into apache:mainJul 17, 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.

2 participants

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

feat(runtime): add durable expert-team collaboration - #1112

Merged
Astro-Han merged 2 commits into
apache:mainfrom
Nyvo-io:feat/agent-team-collaboration
Jul 17, 2026
Merged

feat(runtime): add durable expert-team collaboration#1112
Astro-Han merged 2 commits into
apache:mainfrom
Nyvo-io:feat/agent-team-collaboration

Conversation

@Nyvo-io

@Nyvo-ioNyvo-io commented Jul 16, 2026

Copy link
Copy Markdown
Contributor

Summary

This adds the first backend-only collaboration slice for Maka expert teams, building on the existing expert fan-out/fan-in runtime and Task Ledger ownership model.

  • add a durable, append-only mailbox scoped by session, team, and parent lead AgentRun
  • support bounded role-addressed direct messages and broadcasts with trusted sender AgentRun/Turn attribution
  • expose trusted-context team_message / team_inbox tools to leads and members
  • let child agents discover tasks owned by the current lead run and atomically claim one available Task Ledger item
  • settle claimed task evidence across success, failure, cancellation, waiting-permission, timeout, and startup-error paths without auto-completing successful work
  • document replay/restart boundaries and wire one shared mailbox/task ledger through the desktop runtime

Safety and ownership semantics

  • The parent/lead remains the final adjudicator; child messages and successful results are evidence, not completion authority.
  • A child cannot steal an in-progress task, claim work from another lead run, or claim more than one task per child turn.
  • Agent/team/run identity comes from trusted runtime context rather than model-controlled arguments.
  • Direct recipients are stable role addresses within one parent lead run. Repeated or concurrent invocations of the same member share that role mailbox, while each caller owns its after_seq cursor.
  • Mailbox histories fail closed on corruption, non-monotonic cursors, duplicate message IDs, invalid identities, or lead attribution outside the parent run.
  • This PR does not add invocation-private inboxes, renderer UI, automatic message wakeups, remote/cross-machine workers, marketplace behavior, or worktree writes.

Verification

  • npm run build:test
  • npm run lint
  • npm run typecheck
  • npm run test:dist — all workspace tests passed
  • focused core/runtime/storage mailbox and team-tool tests — 16 passed

Related to #544.

Builds on the expert dispatch work in #971 and Task Ledger child ownership/review semantics in #956; it does not duplicate those slices.

@Astro-HanAstro-Han left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approved.

Non-blocking P2 follow-up: direct-message recipients are keyed only by the stable agent ID, so repeated or concurrent dispatches of the same member within one lead run share a role inbox. A fresh child invocation can therefore read direct messages intended for an earlier invocation. Please either scope recipient identity/cursors to the child run/turn, or explicitly document and test role-mailbox semantics.

@Nyvo-io
Nyvo-ioforce-pushed the feat/agent-team-collaboration branch from 7ae418d to d4fdbd0CompareJuly 17, 2026 06:26
@Nyvo-io

Copy link
Copy Markdown
ContributorAuthor

@Astro-Han Addressed the non-blocking P2 in d4fdbd0 by making the existing role-mailbox semantics explicit and tested.

  • Direct recipients are now documented in the core contract, tool descriptions, and runtime docs as stable role addresses within one parent lead run, not invocation-private addresses.
  • Repeated and concurrent dispatches of the same member are covered at the runtime and storage boundaries; the tests lock shared history plus caller-owned after_seq cursors, including fresh-invocation replay.
  • The follow-up review also found that persisted replay did not enforce the live-send invariant for lead attribution. isAgentMailboxMessage now rejects a lead whose runId differs from parentRunId, with a RED-to-GREEN regression test.
  • The branch was rebased and the prior conflict is resolved.

The current typecheck, test, and e2e checks all pass, and the PR is mergeable/clean.

@Astro-Han

Copy link
Copy Markdown
Contributor

LGTM! Merging.

@Astro-Han
Astro-Han merged commit 1f4f23b into apache:mainJul 17, 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.

2 participants

@Nyvo-io@Astro-Han