siyuan-note/siyuan · error
unregisterCapability requires 1 argument: name
Error message
unregisterCapability requires 1 argument: name
What it means
Thrown by siyuan.agent.unregisterCapability when called with zero arguments (len(call.Arguments) < 1). The API requires the capability name to know which tool to unregister from the agent's capability registry.
Source
Thrown at kernel/plugin/api_agent.go:218
if runErr != nil {
logging.LogErrorf("[plugin:%s] siyuan.agent.registerCapability worker run: %v", p.Name, runErr)
if rejectErr := reject(rt.NewGoError(runErr)); rejectErr != nil {
logging.LogErrorf("[plugin:%s] siyuan.agent.registerCapability reject on run error: %v", p.Name, rejectErr)
}
}
return rt.ToValue(promise)
})))
// siyuan.agent.unregisterCapability(name) 返回 Promise<void>。
lo.Must0(agentAPI.Set("unregisterCapability", rt.ToValue(func(call goja.FunctionCall, rt *goja.Runtime) goja.Value {
promise, resolve, reject := rt.NewPromise()
var argErr error
var toolName string
if len(call.Arguments) < 1 {
argErr = fmt.Errorf("unregisterCapability requires 1 argument: name")
} else if s := call.Argument(0); goja.IsString(s) {
toolName = s.String()
} else {
argErr = fmt.Errorf("first argument must be a tool name string")
}
if argErr != nil {
_ = reject(rt.NewGoError(argErr))
return rt.ToValue(promise)
}
runErr := p.worker.Run(func(rt *goja.Runtime) (result any, err error) {
p.unregisterAgentCapability(toolName)
return
}, func(workerRT *goja.Runtime, result any, err error) {
if lo.IsNil(err) {
if resolveErr := resolve(result); resolveErr != nil {
logging.LogErrorf("[plugin:%s] siyuan.agent.unregisterCapability resolve: %v", p.Name, resolveErr)View on GitHub (pinned to 251596fc0d)
Solutions
- Pass the capability name string that was used during registerCapability
- Store registered capability names and pass them to unregisterCapability on teardown
Example fix
// before
await siyuan.agent.unregisterCapability();
// after
await siyuan.agent.unregisterCapability('myTool'); Defensive patterns
Strategy: validation
Validate before calling
if (arguments.length < 1 || typeof arguments[0] !== 'string') {
throw new Error('unregisterCapability requires a name string');
}
await siyuan.agent.unregisterCapability(name); Try / catch
try {
await siyuan.agent.unregisterCapability(name);
} catch (e) {
console.error('unregisterCapability failed:', e.message);
} Prevention
- Always pass the capability name that was used during registration
- Track registered names in an array for clean teardown
When it happens
Trigger: Calling siyuan.agent.unregisterCapability() with no arguments. The plugin may have destructured or computed the name and it was undefined/absent.
Common situations: Plugin cleanup code calls unregisterCapability in a loop but the name variable is empty; teardown logic runs before names are populated; copy-paste omission.
Related errors
- registerCapability requires 3 arguments: name, config, handl
- config.description must not be empty
- config.description is required and must be a string
- config.inputSchema is required
- second argument must be a config object
AI-assisted analysis of siyuan-note/siyuan@251596fc0d (2026-08-12).
Data as JSON: /api/errors/26f4c8748086d59f.
Report an issue: GitHub.