// Command plexum-fabric-register binds a Plexum agent to a Fabric // Center API key. Equivalent of openclaw's `fabric-register` script. // // Usage: // // plexum-fabric-register --api-key fak_... // # agent id from $AGENT_ID env (set by exec MCP tool) // plexum-fabric-register --agent-id alice --api-key fak_... // // Flags: // --api-key Required. The Center-issued agent API key. // --agent-id Optional when $AGENT_ID is set. // --center Optional. Defaults to ${FABRIC_CENTER_API_BASE} or // http://localhost:7001/api. // --identity-file Optional path to fabric-identity.json (default // ${PLEXUM_PROFILE_ROOT}/fabric-identity.json). // // Writes the (agent, api key, user id, email) tuple to identity file // after validating the key against Center via /auth/agent/login. package main import ( "context" "flag" "fmt" "os" "time" "git.hangman-lab.top/hzhang/Plexum-fabric-channel-plugin/internal/fabric" "git.hangman-lab.top/hzhang/Plexum-fabric-channel-plugin/internal/identity" ) func main() { apiKey := flag.String("api-key", "", "Fabric Center API key (fak_...; required)") agentID := flag.String("agent-id", "", "agent id (defaults to $AGENT_ID)") centerBase := flag.String("center", "", "Center API base URL (default $FABRIC_CENTER_API_BASE or http://localhost:7001/api)") identityFile := flag.String("identity-file", "", "identity registry path (default $PLEXUM_PROFILE_ROOT/fabric-identity.json)") flag.Parse() if *apiKey == "" { fatalf("--api-key is required") } if *agentID == "" { *agentID = os.Getenv("AGENT_ID") } if *agentID == "" { fatalf("--agent-id required (or set AGENT_ID env)") } if *centerBase == "" { *centerBase = os.Getenv("FABRIC_CENTER_API_BASE") } if *centerBase == "" { *centerBase = "http://localhost:7001/api" } if *identityFile == "" { *identityFile = identity.DefaultPath() } ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second) defer cancel() client := fabric.New(*centerBase) sess, err := client.AgentLogin(ctx, *apiKey) if err != nil { fatalf("validate key against %s: %v", *centerBase, err) } reg, err := identity.Open(*identityFile) if err != nil { fatalf("open identity: %v", err) } reg.Set(*agentID, &identity.Entry{ FabricAPIKey: *apiKey, FabricUserID: sess.User.ID, FabricEmail: sess.User.Email, Enabled: true, }) if err := reg.Save(); err != nil { fatalf("save identity: %v", err) } fmt.Printf("registered agent %s as fabric user %s (%s); %d guilds\n", *agentID, sess.User.Email, sess.User.ID, len(sess.Guilds)) fmt.Printf("identity file: %s\n", *identityFile) fmt.Println("restart the plexum gateway to pick up the new identity") } func fatalf(format string, args ...any) { fmt.Fprintf(os.Stderr, "plexum-fabric-register: "+format+"\n", args...) os.Exit(1) }