openclaw - ✅(Solved) Fix Plugin SDK: support onboard callback for non-provider plugins (sandbox backends, tool plugins) [1 pull requests, 1 participants]

Official PRs (…)
ON THIS PAGE

Recommended Tools

×6

Utilities matched from this issue’s tags and category — try them while you read without losing context.

GitHub issue graph ai analysis

Paste a GitHub issue URL. We fetch that issue, discover linked issues from bodies/comments/timeline, collect linked pull requests, and produce a structured English report.

The report is written in English Markdown for sharing and archival.

Helpful · Quick feedback

Loading…
GitHub stats
openclaw/openclaw#60030Fetched 2026-04-08 02:37:15
View on GitHub
Comments
0
Participants
1
Timeline
7
Reactions
0
Participants
Timeline (top)
referenced ×4closed ×1cross-referenced ×1locked ×1

Fix Action

Fix / Workaround

Current workaround

PR fix notes

PR #60590: Plugin SDK: add plugin config TUI prompts to onboard and configure wizards

Description (problem / solution / changelog)

Summary

Wire uiHints from plugin manifests into the TUI wizard so sandbox/tool plugins get interactive config prompts during openclaw onboard (manual flow) and openclaw configure --section plugins.

Closes #60030

What changed

  • New file src/wizard/setup.plugin-config.ts: Discovers plugins with non-advanced uiHints fields and generates type-aware TUI prompts:
    • enum → select picker
    • boolean → confirm
    • array → comma-separated text
    • string/number → text input
  • Onboard wizard (src/wizard/setup.ts): New plugin config step after Skills, before Hooks. Skipped in QuickStart. Only shows plugins with unconfigured fields.
  • Configure wizard (src/commands/configure.wizard.ts + configure.shared.ts): New plugins section in the section menu. Shows all configurable plugins with configured/total field counts.

How it works

Plugins that declare uiHints in their manifest (like openshell already does) automatically get interactive TUI prompts — no new plugin code or callbacks required. The same metadata that drives Web UI Settings forms now drives TUI prompts.

Testing

  • 8 unit tests for discovery logic (setup.plugin-config.test.ts)
  • Existing wizard and configure tests pass
  • pnpm check, pnpm tsgo, pnpm build all clean

Changed files

  • src/commands/configure.shared.ts (modified, +2/-0)
  • src/commands/configure.wizard.ts (modified, +19/-0)
  • src/wizard/setup.plugin-config.test.ts (added, +146/-0)
  • src/wizard/setup.plugin-config.ts (added, +372/-0)
  • src/wizard/setup.ts (modified, +10/-0)

Code Example

registerSandboxBackend(id: string, {
  factory: SandboxBackendFactory,
  manager?: SandboxBackendManager,
})

---

registerSandboxBackend(id: string, {
  factory: SandboxBackendFactory,
  manager?: SandboxBackendManager,
  onboard?: (ctx: PluginOnboardContext) => Promise<void>,
})

---

openclaw config set plugins.entries.<id>.config.endpoint "https://..."
openclaw config set plugins.entries.<id>.config.functionId "..."
RAW_BUFFERClick to expand / collapse

Problem

The openclaw onboard TUI wizard only supports LLM providers via registerProvider's catalog.run / resolveProviderApiKey flow. There is no equivalent for:

  • Sandbox backends registered via registerSandboxBackend
  • Tool plugins registered via registerTool

As a result, any plugin that needs to prompt the user for configuration (endpoint URLs, function IDs, workspace paths, non-secret connection settings) has no interactive onboarding path. Users must manually run openclaw config set plugins.entries.<id>.config.<key> <value> for every required field.

Evidence from existing plugins

extensions/openshell (core bundled sandbox) — no onboard callback. Uses configSchema + uiHints only. All config must be set via openclaw config set.

openclaw-plugin-byteplus-sandbox (community plugin) — same pattern. Required fields: endpoint, functionId, region. Must be configured via CLI, no wizard support.

registerSandboxBackend current signature:

registerSandboxBackend(id: string, {
  factory: SandboxBackendFactory,
  manager?: SandboxBackendManager,
})

No onboard or catalog field.

Proposed solution

Add an optional onboard callback to registerSandboxBackend (and potentially registerTool):

registerSandboxBackend(id: string, {
  factory: SandboxBackendFactory,
  manager?: SandboxBackendManager,
  onboard?: (ctx: PluginOnboardContext) => Promise<void>,
})

The onboard callback would be invoked by openclaw onboard when the plugin is selected, allowing plugins to prompt for connection config interactively, validate the input, and write the result to plugins.entries.<id>.config.* via a config write API.

Affected plugins

  • extensions/openshell (bundled)
  • Community sandbox plugins (e.g. byteplus-sandbox)
  • Tool plugins that need non-trivial connection config

Current workaround

openclaw config set plugins.entries.<id>.config.endpoint "https://..."
openclaw config set plugins.entries.<id>.config.functionId "..."

This works but is significantly less user-friendly than the interactive wizard available to LLM providers.

extent analysis

TL;DR

Add an optional onboard callback to registerSandboxBackend and registerTool to enable interactive configuration for sandbox backends and tool plugins.

Guidance

  • Review the proposed solution and consider adding the onboard callback to registerSandboxBackend and registerTool to support interactive onboarding for affected plugins.
  • Verify that the onboard callback is invoked correctly by openclaw onboard when a plugin is selected, and that it can write configuration results to plugins.entries.<id>.config.* via a config write API.
  • Test the updated registerSandboxBackend and registerTool with the onboard callback to ensure that plugins can prompt for connection configuration interactively and validate user input.
  • Consider updating affected plugins, such as extensions/openshell and community sandbox plugins, to use the new onboard callback for interactive configuration.

Example

registerSandboxBackend('example-id', {
  factory: exampleSandboxBackendFactory,
  manager: exampleSandboxBackendManager,
  onboard: async (ctx: PluginOnboardContext) => {
    // Prompt user for configuration interactively
    const endpoint = await ctx.prompt('Enter endpoint URL:');
    const functionId = await ctx.prompt('Enter function ID:');
    // Validate user input and write configuration results
    ctx.configWrite({ endpoint, functionId });
  },
});

Notes

The proposed solution assumes that the onboard callback will be invoked by openclaw onboard when a plugin is selected, and that it will have access to a config write API to store user-provided configuration.

Recommendation

Apply the proposed workaround by adding the onboard callback to registerSandboxBackend and registerTool, as it provides a more user-friendly interactive configuration experience for sandbox backends and tool plugins.

Vote matrix · Quick signals

Works
Did the solution work? Tap to confirm.
Easy Fix
Was it a quick fix?
Time Saver
Did it save you time?
Blocking
Was it severely blocking?
Common Issue
Are others likely hitting this too?
Flaky / Intermittent
Is it intermittent?
Verified / Reproducible
Can you reproduce it reliably?
Loading…

Still need to ship something?

×6

Another batch ranked right after the header list — different links, same matching logic.

Back to top recommendations

TRENDING

openclaw - ✅(Solved) Fix Plugin SDK: support onboard callback for non-provider plugins (sandbox backends, tool plugins) [1 pull requests, 1 participants]