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

  1. Pass the capability name string that was used during registerCapability
  2. 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

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


AI-assisted analysis of siyuan-note/siyuan@251596fc0d (2026-08-12). Data as JSON: /api/errors/26f4c8748086d59f. Report an issue: GitHub.