Skip to content

Port resource preview UX improvements to PromptsScreen (#1328)#1331

Open
cliffhall wants to merge 5 commits into
v2/mainfrom
v2/issue-1328-prompts-screen-parity
Open

Port resource preview UX improvements to PromptsScreen (#1328)#1331
cliffhall wants to merge 5 commits into
v2/mainfrom
v2/issue-1328-prompts-screen-parity

Conversation

@cliffhall
Copy link
Copy Markdown
Member

Summary

Brings the prompts-side flow up to parity with the resource preview work from #1326:

  • Argument-form width cap: maw=40% on the form pane.
  • Auto-hide form after Get Prompt: handleSelectPrompt decides between auto-fetch (no-arg prompts) vs. form-render (arg-bearing prompts); submittedFor flips off the form once the user submits.
  • Auto-fetch on sidebar selection for no-argument prompts.
  • Sized-to-content preview with viewport cap: PreviewCard variant=\"preview\" + PreviewPane mah=SCROLL_MAX_HEIGHT. PromptMessagesDisplay pins its header (flex: 0 0 auto) and the inner ScrollArea (flex: 0 1 auto, mih: 0) absorbs overflow.
  • Markdown in prompt messages: MessageBubble routes each content block through ContentViewer with mimeType=\"text/markdown\" for text blocks; image/audio/resource flow through the existing ContentViewer branches. Non-renderable block types (tool_use, tool_result) are filtered out.
  • Stale-result guard: App.tsx tags getPromptState with promptName so the screen can ignore a stale result whose name no longer matches the sidebar selection.
  • Live completion/complete on argument inputs: PromptArgumentsForm accepts onCompleteArgument + completionsSupported, swaps TextInput → Mantine Autocomplete, mirrors the per-arg AbortController + per-arg timer / 300ms debounce pattern from ResourceTemplatePanel. PromptsScreen re-injects the active prompt name as a ref/prompt envelope. App.tsx already had the callback; just threaded it through.

Closes #1328.

Test plan

  • npm run validate (format, lint, build, unit + coverage gate)
  • npm run test:integration (379 passed)
  • npm run test:storybook (300 passed)
  • New / updated tests cover: auto-fetch on no-arg selection (and no re-fire on prop change), form auto-hide after submit, stale-name guard, ref/prompt envelope on completion, markdown rendering in MessageBubble, multi-block messages.
  • Manual: connect to the everything server, select a no-arg prompt (should auto-fetch + show messages); select a prompt with required args (should show form ≤40% width); fill + Get Prompt → form disappears, messages render as markdown; verify autocomplete fires per keystroke against completion/complete.

🤖 Generated with Claude Code

Brings the prompt-fetching flow up to parity with the resource preview
work from #1326:

- Cap the argument-form pane at maw=40% so a bare input + button doesn't
  stretch across wide displays.
- Auto-fetch no-argument prompts the moment they're picked from the
  sidebar (handleSelectPrompt routes them straight to onGetPrompt({})),
  and hide the form once the user clicks Get Prompt — the result panel
  takes the same fixed-height column the resource preview uses.
- Apply the PreviewCard variant=preview pattern: card sizes to content
  but caps at viewport, PromptMessagesDisplay pins its header (flex 0 0
  auto) and lets the inner ScrollArea (flex 0 1 auto, mih 0) absorb
  overflow.
- Tag getPromptState with the prompt name in App.tsx so the screen can
  ignore a stale result whose name no longer matches the selection.
- MessageBubble now routes each content block through ContentViewer
  (markdown for text via mimeType="text/markdown", image/audio/resource
  via existing ContentViewer branches). Non-renderable block types
  (tool_use, tool_result) are filtered out; the role-label header keeps
  the bubble visible regardless.
- PromptArgumentsForm gains onCompleteArgument + completionsSupported;
  when both are set, each input becomes Mantine Autocomplete with the
  same per-arg AbortController + per-arg debounce timer pattern as
  ResourceTemplatePanel. PromptsScreen + InspectorView + App.tsx wire
  the callback to inspectorClient.getCompletions with a
  ref/prompt envelope.

Closes #1328.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@cliffhall cliffhall added the v2 Issues and PRs for v2 label May 20, 2026
cliffhall and others added 4 commits May 20, 2026 14:22
A top-left CloseButton dismisses the preview panel. The host screen
decides what to fall back to:

- ResourcesScreen remembers the originating template URI when the user
  reads from a template form (originatingTemplateUri); closing the
  preview restores the template form. Plain-resource reads (sidebar
  selection) just empty the selection and return to the empty state.
  Picking a different template / resource from the sidebar clears the
  back-trail.
- PromptsScreen flips submittedFor back to undefined when the closed
  prompt has arguments — the argument form re-renders with the
  user's values preserved so they can edit and re-submit. No-arg
  prompts have nothing to fall back to, so the selection is dropped
  and the empty state appears.

The X button is hidden when the host omits onClose, so callers that
don't want a dismiss control keep their existing rendering.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The OK-state preview already had its X button (inside the panel
component itself). Pending and error states were inline cards in
renderReadState / renderPreview with no way to dismiss them, so a
user who submitted bad input to a resource template or prompt was
stuck staring at the error until they picked a different sidebar
item. Adds a top-left CloseButton row to both states on both screens,
wired to the same handleClosePreview handler — so the template form
or argument form re-appears on close just like it does from the OK
state.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Two fixes to the PromptArgumentsForm autocomplete:

- Focusing an argument input now fires completion/complete immediately
  (handleFocus) — the dropdown is populated as soon as the user clicks
  in, not only after they start typing. Any in-flight debounce timer
  for the same arg is cancelled so a stale keystroke request can't
  overwrite the fresh focus response.
- The completion context now includes every declared prompt argument
  (with "" for ones the user hasn't typed into yet), minus the one
  being completed. Previously the context only carried args the user
  had touched, so servers that disambiguate based on co-arguments
  couldn't see the full picture on the first keystroke.

Tests cover both: a focus-only path that fires before any keystroke,
and a typing path that asserts the empty sibling is sent through.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Mirrors the prompt-side change: focusing a template variable input
now fires completion/complete immediately so the dropdown populates
the moment the user clicks in, rather than waiting for the first
keystroke + 300ms debounce. Any pending debounce timer for the same
variable is cancelled first so a stale keystroke response can't
overwrite the focus response.

The sibling-context coverage was already correct here — `variables`
is seeded with empty strings for every declared template variable at
mount and on template switch, so the context payload always carries
the full variable set minus the one being completed.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

v2 Issues and PRs for v2

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant