What problem are you trying to solve?
Superset already knows when a terminal agent needs attention: its lifecycle hooks record PermissionRequest, and the workspace board and notifications show the workspace as waiting. Public terminal consumers can read that normalized state once #7007 lands, but the host retains no typed description of the pending interaction.
That prevents another interface attached to the same terminal—for example a Linear agent session—from showing the question or choices the agent is waiting on. Claude Code demonstrates the gap clearly: its PermissionRequest hook fires with a structured AskUserQuestion payload before the question is committed to the provider transcript. Superset correctly shows Needs attention while an external consumer can only say generically that input is required.
Reading terminal screen text is not a safe contract, and making each integration independently scrape provider files would create competing lifecycle owners. Slack and Linear launch integrations are separate workflows; they do not expose the local terminal's pending interaction.
Downstream reproduction and acceptance context: todd-studio/workstation#252.
Proposed solution
Extend the host-owned terminal-agent binding with an optional provider-neutral pendingInteraction that is exposed alongside agentStatus on workspace-scoped terminal listings.
The contract should carry only user-facing interaction data, for example:
- interaction kind (
question or approval)
- provider request/item id when available
- one or more questions with stable id, short header, question text, and optional choices/descriptions
- whether free-form input is accepted
Provider adapters should normalize their native event into that contract. Raw hook/tool payloads must not be persisted or exposed: they can contain commands, file content, or secrets. The pending interaction should clear on the canonical event that proves it was answered or the turn ended, while the terminal/session identity remains intact.
Claude Code can populate this from its structured PermissionRequest / AskUserQuestion hook input. Codex exposes a typed item/tool/requestUserInput request in its app-server protocol and records its custom tool call in the rollout; its adapter should map the same public contract rather than introducing Codex-specific fields. Providers without structured content can continue to expose only PermissionRequest.
This keeps one owner for lifecycle and lets SDK/CLI consumers render an exact prompt without interpreting terminal output.
Workarounds you've tried
- Provider transcript observation works for Codex and Kimi, but Claude does not commit an interactive
AskUserQuestion until after the dialog is answered.
- Reading terminal output or window titles would be brittle screen scraping and can capture sensitive content.
- Superset's documented Linear custom script launches/opens a workspace; it does not relay terminal state. Its Slack integration starts a separate cloud agent/workspace and therefore does not mirror an existing local terminal.
- #7007 deliberately exposes only the existing normalized lifecycle state so that small, reviewable change is not coupled to this larger interaction/security contract.
What problem are you trying to solve?
Superset already knows when a terminal agent needs attention: its lifecycle hooks record
PermissionRequest, and the workspace board and notifications show the workspace as waiting. Public terminal consumers can read that normalized state once #7007 lands, but the host retains no typed description of the pending interaction.That prevents another interface attached to the same terminal—for example a Linear agent session—from showing the question or choices the agent is waiting on. Claude Code demonstrates the gap clearly: its
PermissionRequesthook fires with a structuredAskUserQuestionpayload before the question is committed to the provider transcript. Superset correctly shows Needs attention while an external consumer can only say generically that input is required.Reading terminal screen text is not a safe contract, and making each integration independently scrape provider files would create competing lifecycle owners. Slack and Linear launch integrations are separate workflows; they do not expose the local terminal's pending interaction.
Downstream reproduction and acceptance context: todd-studio/workstation#252.
Proposed solution
Extend the host-owned terminal-agent binding with an optional provider-neutral
pendingInteractionthat is exposed alongsideagentStatuson workspace-scoped terminal listings.The contract should carry only user-facing interaction data, for example:
questionorapproval)Provider adapters should normalize their native event into that contract. Raw hook/tool payloads must not be persisted or exposed: they can contain commands, file content, or secrets. The pending interaction should clear on the canonical event that proves it was answered or the turn ended, while the terminal/session identity remains intact.
Claude Code can populate this from its structured
PermissionRequest/AskUserQuestionhook input. Codex exposes a typeditem/tool/requestUserInputrequest in its app-server protocol and records its custom tool call in the rollout; its adapter should map the same public contract rather than introducing Codex-specific fields. Providers without structured content can continue to expose onlyPermissionRequest.This keeps one owner for lifecycle and lets SDK/CLI consumers render an exact prompt without interpreting terminal output.
Workarounds you've tried
AskUserQuestionuntil after the dialog is answered.