The plugin manifest declared `fabric-register` as a tool name but
tools.ts never registered it — recruitment fell through to the
standalone `/root/.openclaw/bin/fabric-register` binary, which writes
~/.openclaw/fabric-identity.json correctly but exits without notifying
the running plugin. That left fabric inbound's subscription as a
connect-time snapshot: every new agent required a gateway restart
between `new-agent` and the interview's sub-discussion or the message
had no socket to dispatch on.
Wire the full path:
- `FabricInbound.addAccount(entry)` — login, upsert identity, open socket(s),
track per-agent so removeAccount can teardown cleanly. Idempotent: a
second call replaces the previous socket (used post-onboard when the
agent rotates off the shared `interviewee` placeholder onto its own
apikey).
- `FabricInbound.removeAccount(agentId)` — disconnect sockets, clear
timers + per-agent caches.
- `__fabric.addAccount` / `removeAccount` — cross-plugin bridge so the
`fabric-register` tool can reach the live FabricInbound instance from
its tool handler context.
- `fabric-register` openclaw tool — validates apiKey, calls
`__fabric.addAccount`, returns `{ok, fabricUserId, displayName}`.
Accepts `agentId` arg so recruitment can bind on behalf of a
freshly-created agent before that agent has a session of its own.
Removes the "restart the gateway" advice from the ctxGuild
"agent not registered" error message — operators should now call the
tool path instead.
After this lands + the ClawSkills register-agent script flip (separate
commit), `recruitment.new-agent` -> interviewer sub-discussion runs
without a gateway restart in between.