You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
This repository was archived by the owner on Jul 27, 2026. It is now read-only.
Repository navigation
fix(frontend): do not gate the skills modal on runtime readiness - #1122
Opening the Available Skills modal from the chat input's + menu on the home page shows a loading spinner with "Waiting for runtime to start…" that never completes. The modal is unusable from the home page on both local and cloud backends, and from any conversation whose execution status is null (e.g. a stopped cloud sandbox).
Steps to Reproduce
Start the development server: npm run dev
On the home page, click the plus (+) icon in the chat input to open the context menu
Select "Show Available Skills"
Current Behavior
The modal opens, but the spinner ("Waiting for runtime to start…") spins indefinitely. No skills are ever listed and no error is shown.
Expected Behavior
The modal loads and displays the list of available skills
If the list cannot be loaded, a clear failure message is shown instead of an endless spinner
Root Cause
SkillsModal gates its entire body on isAgentReady, derived from useAgentState(), which maps a null execution status to AgentState.LOADING. With no conversation (home page) — or a conversation whose status stays null — that state never changes, so the waiting branch renders forever.
The gate is vestigial: it dates from when skills were loaded from the conversation runtime (loadSkillsForConversation, enabled: !!executionStatus). Since PR #362 the skills come from a static catalog (SkillsService.getSkills — agent-server SkillsClient locally, /api/v1/skills/search on cloud) that requires no conversation or runtime. The Skills settings page and the slash-command menu already consume the same catalog ungated.
Fix
Remove the runtime-readiness gate from SkillsModal and let the skills query's own states drive the UI (loading → spinner, error → "Failed to fetch skills…", data → grouped catalog). Delete the orphaned SkillsRuntimeWaitingState component.
Acceptance Criteria
Opening Available Skills from the home page + menu lists the skills catalog
When the skills fetch fails, the modal shows the fetch-error message instead of hanging
Works on local and cloud backends, and in conversations regardless of runtime state
Regression tests cover the home-page and fetch-failure paths
Summary
Fixes the Available Skills modal spinning forever on "Waiting for runtime to start…" when opened from the home page's chat input + menu (reproducible on local and cloud backends), and in any conversation whose execution status is null.
Problem
SkillsModal only rendered its content once curAgentState left LOADING/INIT:
useAgentState() maps a null execution status to AgentState.LOADING. On the home page no conversation exists, so the status is null forever → the waiting spinner never resolves.
Root Cause
The gate is a leftover from when skills were loaded from the conversation runtime (loadSkillsForConversation, gated on executionStatus). Since #362 the modal reads a static catalog via SkillsService.getSkills() — agent-server SkillsClient locally, /api/v1/skills/search via the cloud proxy on cloud backends — which needs no conversation or runtime. The Skills settings page (useSkills()) and the slash-command menu (useConversationSkills()) already consume the same catalog with no such gate.
Changes
src/components/features/conversation-panel/skills-modal.tsx — remove the isAgentReady gate; the skills query's own states now drive the UI (isLoading → loading state, isError → "Failed to fetch skills. Please try again later.", data → grouped catalog). One internal change fixes all three render sites (chat + menu, tools menu, conversation-title menu).
src/components/features/conversation-panel/skills-runtime-waiting-state.tsx — deleted (orphaned; the DIFF_VIEWER$WAITING_FOR_RUNTIME i18n key remains in use by diff-viewer components).
__tests__/components/modals/skills/skill-modal.test.tsx — remove the useAgentState mock and the test asserting the old gating behavior; add regression tests (mocking SkillsService, not hooks):
displays the skills catalog when opened with no active conversation (home page)
surfaces the fetch-error message when the catalog cannot be loaded
Deliberately not added: an enabled: !!conversation.data gate on the skills query — that would reintroduce the hang on the home page.
Snapshot comparison step crashed (timeout, OOM, or runner error) — diff results below may be incomplete or absent.
Check the CI logs for the full error output (look for the "Run snapshot comparison" step).
✅ No baseline found on main — all 73 snapshots are new and will become the baseline once this PR merges.
Category
Count
🔴 Changed
0
🆕 New
73
✅ Unchanged
0
Total
73
🆕 New snapshots (73)
These snapshots have no baseline on main and will become the new baseline once this PR merges.
archived-conversation — 3 snapshots
conversation-panel-with-archived-badges
conversation-view-archived
conversation-view-sandbox-error
automations — 4 snapshots
automations-delete-modal
automations-list-active-inactive
automations-no-automations
automations-search-no-results
backends-extended — 19 snapshots
backend-add-blank-disabled
backend-add-cloud-advanced-open
backend-add-cloud-no-key-disabled
backend-add-cloud-with-key-enabled
backend-add-form-partially-filled
backend-add-invalid-url-disabled
backend-add-local-ready
backend-add-name-only-disabled
backend-add-two-column-layout
backend-add-whitespace-host-disabled
backend-after-switch
backend-cancel-nothing-saved
backend-dropdown-two-backends
backend-edit-prefilled
backend-manage-after-removal
backend-manage-two-listed
backend-remove-cancelled
backend-remove-confirmation
backend-switch-overlay
backends — 3 snapshots
backend-add-modal
backend-manage-modal
backend-selector-open
changes-tab — 3 snapshots
changes-deleted-file
changes-diff-viewer
changes-empty
collapsible-thinking — 4 snapshots
reasoning-content-collapsed
reasoning-content-expanded
think-action-collapsed
think-action-expanded
mcp-page — 11 snapshots
mcp-custom-server-1-editor-open
mcp-custom-server-2-url-filled
mcp-custom-server-3-all-filled
mcp-custom-server-4-installed
mcp-custom-server-editor
mcp-empty-installed
mcp-search-filtered
mcp-slack-install-1-marketplace
mcp-slack-install-2-modal
mcp-slack-install-3-filled
mcp-slack-install-4-installed
onboarding — 4 snapshots
onboarding-step-0-check-backend
onboarding-step-1-choose-agent
onboarding-step-2-setup-llm
onboarding-step-3-say-hello
projects-workspace-browser
projects-workspace-browser
settings-page — 5 snapshots
add-backend-modal
analytics-consent-modal
home-screen
settings-app-page
settings-page
settings-secrets — 5 snapshots
secrets-add-form-filled
secrets-add-form
secrets-after-save
secrets-delete-confirm
secrets-list
settings-verification — 3 snapshots
condenser-settings
verification-settings-off
verification-settings-on
sidebar — 3 snapshots
sidebar-collapsed
sidebar-conversation-panel
sidebar-filter-menu
skills-page — 5 snapshots
skills-empty
skills-loaded
skills-no-match
skills-search-filtered
skills-type-filter
Generated by the Snapshot Tests workflow. This comment was created by an AI agent (OpenHands) on behalf of the repo maintainers.
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
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.
Why
Problem
Opening the Available Skills modal from the chat input's + menu on the home page shows a loading spinner with "Waiting for runtime to start…" that never completes. The modal is unusable from the home page on both local and cloud backends, and from any conversation whose execution status is
null(e.g. a stopped cloud sandbox).Steps to Reproduce
npm run devCurrent Behavior
The modal opens, but the spinner ("Waiting for runtime to start…") spins indefinitely. No skills are ever listed and no error is shown.
Expected Behavior
Root Cause
SkillsModalgates its entire body onisAgentReady, derived fromuseAgentState(), which maps anullexecution status toAgentState.LOADING. With no conversation (home page) — or a conversation whose status staysnull— that state never changes, so the waiting branch renders forever.The gate is vestigial: it dates from when skills were loaded from the conversation runtime (
loadSkillsForConversation,enabled: !!executionStatus). Since PR #362 the skills come from a static catalog (SkillsService.getSkills— agent-serverSkillsClientlocally,/api/v1/skills/searchon cloud) that requires no conversation or runtime. The Skills settings page and the slash-command menu already consume the same catalog ungated.Fix
Remove the runtime-readiness gate from
SkillsModaland let the skills query's own states drive the UI (loading → spinner, error → "Failed to fetch skills…", data → grouped catalog). Delete the orphanedSkillsRuntimeWaitingStatecomponent.Acceptance Criteria
Summary
Fixes the Available Skills modal spinning forever on "Waiting for runtime to start…" when opened from the home page's chat input + menu (reproducible on local and cloud backends), and in any conversation whose execution status is
null.Problem
SkillsModalonly rendered its content oncecurAgentStateleftLOADING/INIT:useAgentState()maps anullexecution status toAgentState.LOADING. On the home page no conversation exists, so the status isnullforever → the waiting spinner never resolves.Root Cause
The gate is a leftover from when skills were loaded from the conversation runtime (
loadSkillsForConversation, gated onexecutionStatus). Since #362 the modal reads a static catalog viaSkillsService.getSkills()— agent-serverSkillsClientlocally,/api/v1/skills/searchvia the cloud proxy on cloud backends — which needs no conversation or runtime. The Skills settings page (useSkills()) and the slash-command menu (useConversationSkills()) already consume the same catalog with no such gate.Changes
src/components/features/conversation-panel/skills-modal.tsx— remove theisAgentReadygate; the skills query's own states now drive the UI (isLoading→ loading state,isError→ "Failed to fetch skills. Please try again later.", data → grouped catalog). One internal change fixes all three render sites (chat + menu, tools menu, conversation-title menu).src/components/features/conversation-panel/skills-runtime-waiting-state.tsx— deleted (orphaned; theDIFF_VIEWER$WAITING_FOR_RUNTIMEi18n key remains in use by diff-viewer components).__tests__/components/modals/skills/skill-modal.test.tsx— remove theuseAgentStatemock and the test asserting the old gating behavior; add regression tests (mockingSkillsService, not hooks):Deliberately not added: an
enabled: !!conversation.datagate on the skills query — that would reintroduce the hang on the home page.Issue Number
Resolves #2092
How to Test
npm run devVideo/Screenshots
app-2155.mov
Type
🐳 Docker images for this PR
• GHCR package: https://github.com/OpenHands/agent-canvas/pkgs/container/agent-canvas
ghcr.io/openhands/agent-canvasghcr.io/openhands/agent-server:1.24.0-pythonopenhands-automation==1.0.0a6c5d69ae41a0dfda44a712011f04c9652a71da7d4Pull (multi-arch manifest)
# Multi-arch manifest — Docker automatically pulls the correct architecture docker pull ghcr.io/openhands/agent-canvas:sha-c5d69aeRun
All tags pushed for this build
About Multi-Architecture Support
sha-c5d69ae) is a multi-arch manifest supporting both amd64 and arm64sha-c5d69ae-amd64) are also available if needed