feat: Split get-actor-run into data + -widget tools#734
Draft
jirispilka wants to merge 1 commit intoclaude/call-actor-split-I2C7Tfrom
Draft
feat: Split get-actor-run into data + -widget tools#734jirispilka wants to merge 1 commit intoclaude/call-actor-split-I2C7Tfrom
jirispilka wants to merge 1 commit intoclaude/call-actor-split-I2C7Tfrom
Conversation
This was referenced Apr 20, 2026
Final step (6 of 6) of the #577 umbrella rollout. Mirrors the decoupled-pattern recipe from #722 (fetch-actor-details), #723 (search-actors), and #724 (call-actor): - get-actor-run is now mode-independent and data-only. No tool-level widget _meta in either mode; runs category entry is a plain ToolEntry instead of a mode map. - New get-actor-run-widget (apps-only) renders the live progress widget. Input is strict: { runId } only. Tool- and response-level widget _meta (ui.resourceUri = ui://widget/actor-run.html). Reuses the shared buildGetActorRunSuccessResponse({ widget: true }) helper. - buildGetActorRunSuccessResponse widget branch now also sets openai/widgetDescription on the response _meta, matching the other three widget tools. - Apps server instructions: added the fourth disambiguation bullet pairing get-actor-run (silent data lookup) with get-actor-run-widget (live progress widget), using the same vocabulary as the existing three splits. WORKFLOW_RULES untouched — the "NEVER poll get-actor-run after call-actor-widget" rule is orthogonal. - Deleted src/tools/apps/get_actor_run.ts; widget rendering now lives in the sibling tool rather than a mode toggle. https://claude.ai/code/session_01SF9P6g91UrVMahn4bLsUNf
57df5bc to
8b19378
Compare
f837504 to
4e18bed
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
PR chain — part of #577
Step 6 of 6 in the #577 umbrella rollout.
Stacked on #724 (branch
claude/call-actor-split-I2C7T); rebase tomasteronce #720–#724 merge.openai→appsfetch-actor-detailssplit (pilot)search-actorssplitcall-actorsplitget-actor-runsplitCloses #719. Completes the umbrella.
Summary
Final application of the decoupled pattern validated in #722 / #723 / #724.
get-actor-runis now mode-independent and data-only. No tool-level widget_metaineither mode; the
runscategory entry is a plainToolEntryinstead of a mode map.get-actor-run-widget(apps-only) renders the live progress widget. Input isstrict:
{ runId }only. Tool- and response-level widget_metawithui.resourceUri = ui://widget/actor-run.html,visibility = ['model','app'], non-emptycsp. Reuses the sharedbuildGetActorRunSuccessResponse({ widget: true })helper.buildGetActorRunSuccessResponsewidget branch now also setsopenai/widgetDescriptionon response
_meta, matching the other three widget tools.get-actor-run(silent data lookup) with
get-actor-run-widget(live progress widget), using the samevocabulary as the three preceding splits.
WORKFLOW_RULESuntouched — the "NEVER pollget-actor-runaftercall-actor-widget" rule is orthogonal to this split and stillvalid under today's auto-polling
call-actor-widget.src/tools/apps/get_actor_run.ts— widget rendering now lives in the siblingtool rather than a mode toggle on a shared handler.
No
-internalequivalent existed forget-actor-run, so no deletion on that side.Approach
Approach A, same as peers (#722 / #723 / #724). No design question — the decoupled
pattern has been validated three times and this is the final mechanical application.
Key changes
src/tools/apps/get_actor_run_widget.tssrc/tools/apps/get_actor_run.tssrc/const.tsACTOR_RUNS_GET_WIDGET = 'get-actor-run-widget'src/tools/categories.tsrunsentry → plaindefaultGetActorRun;ui[]gets{ apps: getActorRunWidgetTool }src/tools/core/get_actor_run_common.ts_metafromgetActorRunMetadata; trim stale "NEVER call in UI mode" block from the base description; addopenai/widgetDescriptionto widget response_metasrc/utils/server-instructions/apps.tstests/unit/tools.get_actor_run.widget.response.test.tscall_actor_widget.response.test.tstests/unit/tools.mode_contract.test.tsget-actor-run-widgetadded touicategory expectations;get-actor-runadded to the no-widget-meta list (runs category)tests/unit/tools.categories.test.tsnot.toBe→toBeforget-actor-run(now mode-independent, same object)Tests
npm run type-check— passesnpm run lint— passesnpm run test:unit— 615 passednpm run build— passesmcpc-style JSON-RPC probe matrix (stdio, raw
tools/list)A: default mode (
node dist/stdio.js --tools=runs,actors,ui)B: apps mode (
--ui=true)Byte-identical base schemas across modes:
Test plan
npm run type-checknpm run lintnpm run test:unitnpm run buildnpm run test:integration) — human-run per CLAUDE.mdtools/callwith a realAPIFY_TOKENand runId — manualapify-mcp-server-internalimpactPurely additive surface on the widget side. Base
get-actor-runkeeps the same name andbyte-identical input/output schemas across modes, so the hosted server should continue
working with no edits. The only potentially-breaking rename is the shared
buildGetActorRunSuccessResponsenow emitsopenai/widgetDescriptionon the response —harmless for consumers that ignore extra
_metakeys. Please confirm on the internalside.
https://claude.ai/code/session_01SF9P6g91UrVMahn4bLsUNf