var test = require("node:test"); var assert = require("node:assert"); var { createCodexAdapter } = require("../lib/yoke/adapters/codex"); function fakeUserInfo(username) { return { uid: username === "alice" ? 1201 : 1202, gid: username === "alice" ? 1301 : 1302, home: "/home/" + username, user: username, shell: "/bin/bash", }; } function createFakeServer(options) { return { options: options, started: false, proc: null, start: function() { this.started = true; return Promise.resolve(); }, send: function(method) { if (method === "skills/list") return Promise.resolve({ data: [] }); return Promise.resolve({}); }, notify: function() {}, stop: function() { this.started = false; }, }; } test("Codex creates and reuses a separate app-server for each mapped Linux user", async function() { var servers = []; var adapter = createCodexAdapter({ cwd: process.cwd(), osUsers: true, resolveOsUserInfo: fakeUserInfo, createAppServer: function(options) { var server = createFakeServer(options); servers.push(server); return server; }, }); await adapter.init({ linuxUser: "alice", env: { PROJECT_TOKEN: "alice-project" } }); await adapter.init({ linuxUser: "alice" }); await adapter.init({ linuxUser: "bob" }); assert.strictEqual(servers.length, 2); assert.strictEqual(servers[0].options.osUserInfo.user, "alice"); assert.strictEqual(servers[0].options.env.PROJECT_TOKEN, "alice-project"); assert.strictEqual(servers[1].options.osUserInfo.user, "bob"); assert.notStrictEqual(servers[0], servers[1]); }); test("Codex fails closed when OS-user isolation lacks a mapped Linux user", async function() { var adapter = createCodexAdapter({ cwd: process.cwd(), osUsers: true, resolveOsUserInfo: fakeUserInfo, createAppServer: createFakeServer, }); await assert.rejects( adapter.init({}), /requires a mapped Linux user/ ); }); test("Codex auth refresh restarts only the matching Linux user runtime", async function() { var servers = []; var adapter = createCodexAdapter({ cwd: process.cwd(), osUsers: true, resolveOsUserInfo: fakeUserInfo, createAppServer: function(options) { var server = createFakeServer(options); servers.push(server); return server; }, }); await adapter.init({ linuxUser: "alice" }); await adapter.init({ linuxUser: "bob" }); await adapter.refreshAuthIdentity("alice"); assert.strictEqual(servers[0].started, false, "Alice's stale app-server is stopped"); assert.strictEqual(servers[1].started, true, "Bob's authenticated app-server stays running"); await adapter.init({ linuxUser: "alice" }); await adapter.init({ linuxUser: "bob" }); assert.strictEqual(servers.length, 3, "only Alice gets a fresh app-server"); });