Skip to content

feat(integrations): report native OMP tool and permission activity - #880

Closed
bandzalkin wants to merge 35 commits into
band-ai:mainfrom
bandzalkin:feat/native-omp-activity
Closed

bandzalkin wants to merge 35 commits into
band-ai:mainfrom
bandzalkin:feat/native-omp-activity

Conversation

@bandzalkin

Copy link
Copy Markdown
Contributor

Why

band-agent's OMP harness runs the fork-maintained native adapter (src/band/adapters/omp.py from #763), which the activity-detail stack (#839/#840/#841) does not touch — it covers only omp_acp.py. OMP rooms therefore keep showing plain "reasoning" through tool runs and approval waits.

What changed

Testing

  • New tests/adapters/test_omp_activity.py (9 tests): tool start/end and the approval wait asserted at the reporter with narration on and off; name-only payloads; untracked ends ignored; auto-approve and non-select UI report nothing.
  • Affected suites green on the merged tree: tests/adapters/test_omp_adapter.py, tests/adapters/activity, tests/toolkit/test_omp_*, tests/integrations/test_omprpc.py, tests/runtime/{activity,workingstate,workingreporter,activityownership} — 228 passed; pyrefly check 0 errors.

AlexanderZ-Band and others added 27 commits October 18, 2026 13:33
Give the repeated tool-completion and privacy checks one helper, and name the ACP call record so activity identity is not a bare tuple.

Co-authored-by: Cursor <cursoragent@cursor.com>
…t-activity-detail-to-the-platform-INT-1744

Keep main's BackendTurns ownership of OpenCode cancellation and register the
watcher as a turn worker so activity reporting outlives the handler. Reporter
unit tests move to tests/runtime/workingreporter; main's workingstate package
keeps the execution-level tests.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AgnNR4uiqD787Bg3yKdZpL
…detail-to-the-platform-INT-1744' into feat/python-sdk-report-activity-detail-to-the-platform-delivery-INT-1744

Port the startup-backlog claim-failure test edit to the split
tests/runtime/execution package.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AgnNR4uiqD787Bg3yKdZpL
…detail-to-the-platform-delivery-INT-1744' into feat/python-sdk-report-activity-detail-to-the-platform-producers-INT-1744

Adopt main's agno and tool test layouts and carry the producer edits into
them; keep the split CrewAI/Parlant coverage guards with main's new paths.
Letta streams provider events through main's BackendTurns run, and the
CrewAI flow tool activity wraps main's turn-owned tool execution.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AgnNR4uiqD787Bg3yKdZpL
It runs three collect-only subprocesses, which exceeded the default
per-test timeout on Windows runners.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AgnNR4uiqD787Bg3yKdZpL
…detail-to-the-platform-INT-1744' into feat/python-sdk-report-activity-detail-to-the-platform-delivery-INT-1744
…detail-to-the-platform-delivery-INT-1744' into feat/python-sdk-report-activity-detail-to-the-platform-producers-INT-1744
Adapters that do not report tool calls must not leak tool names through the
live room indicator. The decision is taken once per turn in SimpleAdapter
from the negotiated emit set and enforced at the single observer every
activity reporter funnels through, so no adapter can bypass it. Permission
and memory detail name no content and always report.

Guards: tests/runtime/activity/test_namegate.py pins that a tool_call frame
reaches the wire with Emit.TOOL_CALLS and degrades to nameless reasoning
without it; fails if the wrapper is removed.
The native OMP adapter delivered only the boolean working indicator, so
rooms showed plain reasoning through tool runs and approval waits. Hook
the typed activity helpers into the existing toolCallId-correlated tool
events and around the permission resolver wait: a running tool reports
its name, a /approve or human wait reports permission, and everything
returns to reasoning as they finish. Names pass through unfiltered here;
the SimpleAdapter chokepoint gates them on the same Tool calls & results
choice as tool narration, so a tool-reporting-off agent leaks no names
and no argument text ever reaches the reporter.

Guarded by tests/adapters/test_omp_activity.py, driving start/end and
the approval wait with narration on and off.
bandzalkin added a commit to bandzalkin/band-sdk-python that referenced this pull request Oct 20, 2026
The native adapter needs its own hooks because the activity stack covers
omp_acp.py only. band-ai#880 inherits band-ai#763's branch and merges band-ai#874 for the
helper API, so its own changes are the omp.py hooks and their tests.
bandzalkin added a commit to bandzalkin/band-sdk-python that referenced this pull request Oct 20, 2026
The native adapter needs its own hooks because the activity stack covers
omp_acp.py only. band-ai#880 inherits band-ai#763's branch and rides the activity
helpers through band-ai#874, so its own changes are the omp.py hooks and their
tests; after 874 keeps its main content behind the stack's forward
merges, as the replay's prerequisite guard requires.
bandzalkin added a commit to bandzalkin/band-sdk-python that referenced this pull request Oct 20, 2026
band-ai#763 deletes omp_acp.py while band-ai#841 edits it, so the deletion must be
computed over the stack's tree to compose once. band-ai#854, band-ai#795 and band-ai#848
rebased onto the new band-ai#763 head; band-ai#880 rides after 763 as hooks-only.
bandzalkin added a commit to bandzalkin/band-sdk-python that referenced this pull request Oct 20, 2026
Select band-ai#841 (which inherits the merged band-ai#839 and band-ai#840) and our gate
band-ai#874 after it, restack band-ai#763 after band-ai#874 so its omp_acp.py removal
composes once against band-ai#841's edit, and select band-ai#880 (native OMP activity
hooks) after band-ai#763. The band-ai#857 source branch was rebased onto current main
after the test reorg.
bandzalkin added a commit to bandzalkin/band-sdk-python that referenced this pull request Oct 20, 2026
The hooks ride the native branch itself (contract 2026-10-20): band-ai#880 is
retired and its selection entry dropped.
@bandzalkin

Copy link
Copy Markdown
Contributor Author

Closing: per the fork replay contract (2026-10-20), the native OMP activity hooks land on #763's own branch instead of a separate stacked PR — #763 is now restacked after 874 (head 22165bf carries these hooks: cherry-picked 0dba2b4 with the ruff fix). The change content, tests, and evidence are unchanged from this PR; superseded by the merge into #763.

Sign up for free to 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