@modelprofile.com/authswitch 6.3.0 → 6.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/dist_ts/00_commitinfo_data.js +1 -1
  2. package/dist_ts/authority-contract.d.ts +142 -0
  3. package/dist_ts/authority-contract.js +3 -0
  4. package/dist_ts/authority-runtime-contract.d.ts +34 -0
  5. package/dist_ts/authority-runtime-contract.js +2 -0
  6. package/dist_ts/classes.authoritybroker.d.ts +76 -0
  7. package/dist_ts/classes.authoritybroker.js +570 -0
  8. package/dist_ts/classes.authorityclient.d.ts +47 -0
  9. package/dist_ts/classes.authorityclient.js +261 -0
  10. package/dist_ts/classes.authoritydaemon.d.ts +46 -0
  11. package/dist_ts/classes.authoritydaemon.js +492 -0
  12. package/dist_ts/classes.authoritydatabase.d.ts +103 -0
  13. package/dist_ts/classes.authoritydatabase.js +835 -0
  14. package/dist_ts/classes.authorityframing.d.ts +8 -0
  15. package/dist_ts/classes.authorityframing.js +22 -0
  16. package/dist_ts/classes.authoritymodels.d.ts +239 -0
  17. package/dist_ts/classes.authoritymodels.js +893 -0
  18. package/dist_ts/classes.authoritysecrets.d.ts +9 -0
  19. package/dist_ts/classes.authoritysecrets.js +30 -0
  20. package/dist_ts/classes.authorityservice.d.ts +28 -0
  21. package/dist_ts/classes.authorityservice.js +71 -0
  22. package/dist_ts/classes.codexmanaged.d.ts +80 -0
  23. package/dist_ts/classes.codexmanaged.js +343 -0
  24. package/dist_ts/index.d.ts +3 -0
  25. package/dist_ts/index.js +27 -1
  26. package/dist_ts/plugins.d.ts +11 -3
  27. package/dist_ts/plugins.js +12 -4
  28. package/package.json +25 -4
  29. package/readme.md +59 -0
  30. package/ts/00_commitinfo_data.ts +1 -1
  31. package/ts/authority-contract.ts +109 -0
  32. package/ts/authority-runtime-contract.ts +33 -0
  33. package/ts/classes.authoritybroker.ts +552 -0
  34. package/ts/classes.authorityclient.ts +252 -0
  35. package/ts/classes.authoritydaemon.ts +403 -0
  36. package/ts/classes.authoritydatabase.ts +818 -0
  37. package/ts/classes.authorityframing.ts +21 -0
  38. package/ts/classes.authoritymodels.ts +407 -0
  39. package/ts/classes.authoritysecrets.ts +27 -0
  40. package/ts/classes.authorityservice.ts +83 -0
  41. package/ts/classes.codexmanaged.ts +339 -0
  42. package/ts/index.ts +26 -0
  43. package/ts/plugins.ts +11 -3
@@ -0,0 +1,9 @@
1
+ export interface IAuthSwitchSecretCodec {
2
+ seal(accountId: string, plaintext: Uint8Array): Promise<string>;
3
+ unseal(accountId: string, ciphertext: string): Promise<Uint8Array>;
4
+ }
5
+ /** TPM-sealed byte payloads live only as ciphertext in SmartData. */
6
+ export declare class AuthSwitchTpmSecretCodec implements IAuthSwitchSecretCodec {
7
+ seal(accountId: string, plaintext: Uint8Array): Promise<string>;
8
+ unseal(accountId: string, ciphertext: string): Promise<Uint8Array>;
9
+ }
@@ -0,0 +1,30 @@
1
+ import * as plugins from './plugins.js';
2
+ const secretName = (accountId) => {
3
+ if (!/^[a-f0-9]{64}$/.test(accountId))
4
+ throw new Error('Invalid account identity for secret custody.');
5
+ return `authswitch.account.${accountId}`;
6
+ };
7
+ /** TPM-sealed byte payloads live only as ciphertext in SmartData. */
8
+ export class AuthSwitchTpmSecretCodec {
9
+ async seal(accountId, plaintext) {
10
+ const ciphertext = await plugins.smartsecret.sealSmartSecretTpm2Credential(secretName(accountId), plaintext);
11
+ try {
12
+ return Buffer.from(ciphertext).toString('base64url');
13
+ }
14
+ finally {
15
+ ciphertext.fill(0);
16
+ }
17
+ }
18
+ async unseal(accountId, ciphertext) {
19
+ if (!/^[A-Za-z0-9_-]{1,131072}$/.test(ciphertext))
20
+ throw new Error('Invalid sealed account credential.');
21
+ const bytes = Buffer.from(ciphertext, 'base64url');
22
+ try {
23
+ return await plugins.smartsecret.unsealSmartSecretTpm2Credential(secretName(accountId), bytes);
24
+ }
25
+ finally {
26
+ bytes.fill(0);
27
+ }
28
+ }
29
+ }
30
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5hdXRob3JpdHlzZWNyZXRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvY2xhc3Nlcy5hdXRob3JpdHlzZWNyZXRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBT3hDLE1BQU0sVUFBVSxHQUFHLENBQUMsU0FBaUIsRUFBVSxFQUFFO0lBQy9DLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyw4Q0FBOEMsQ0FBQyxDQUFDO0lBQ3ZHLE9BQU8sc0JBQXNCLFNBQVMsRUFBRSxDQUFDO0FBQzNDLENBQUMsQ0FBQztBQUVGLHFFQUFxRTtBQUNyRSxNQUFNLE9BQU8sd0JBQXdCO0lBQzVCLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBaUIsRUFBRSxTQUFxQjtRQUN4RCxNQUFNLFVBQVUsR0FBRyxNQUFNLE9BQU8sQ0FBQyxXQUFXLENBQUMsNkJBQTZCLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQzdHLElBQUksQ0FBQztZQUFDLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUM7UUFBQyxDQUFDO2dCQUNyRCxDQUFDO1lBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUFDLENBQUM7SUFDakMsQ0FBQztJQUVNLEtBQUssQ0FBQyxNQUFNLENBQUMsU0FBaUIsRUFBRSxVQUFrQjtRQUN2RCxJQUFJLENBQUMsMkJBQTJCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQztZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsb0NBQW9DLENBQUMsQ0FBQztRQUN6RyxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxXQUFXLENBQUMsQ0FBQztRQUNuRCxJQUFJLENBQUM7WUFBQyxPQUFPLE1BQU0sT0FBTyxDQUFDLFdBQVcsQ0FBQywrQkFBK0IsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFBQyxDQUFDO2dCQUMvRixDQUFDO1lBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUFDLENBQUM7SUFDNUIsQ0FBQztDQUNGIn0=
@@ -0,0 +1,28 @@
1
+ import * as plugins from './plugins.js';
2
+ export interface IAuthSwitchAuthorityPaths {
3
+ runtimeDirectory: string;
4
+ dataDirectory: string;
5
+ databaseSocketPath: string;
6
+ authoritySocketPath: string;
7
+ runtimeSocketPath: string;
8
+ runtimeSocketDirectory: string;
9
+ }
10
+ /** Canonical per-user paths. An explicit runtime directory is also usable by a trusted container host. */
11
+ export declare const resolveAuthSwitchAuthorityPaths: (runtimeDirectory?: string | undefined) => IAuthSwitchAuthorityPaths;
12
+ /** Explicit installer and lifecycle operations for a user-scoped systemd service. */
13
+ export declare class AuthSwitchAuthorityService {
14
+ readonly unit: plugins.smartdaemon.SystemdUnit;
15
+ readonly unitFile: plugins.smartdaemon.SystemdUnitFile;
16
+ readonly definition: plugins.smartdaemon.SystemdServiceDefinition;
17
+ constructor(runtimeDirectory: string, unitDirectory?: string);
18
+ install(): Promise<Readonly<{
19
+ changed: boolean;
20
+ masked: boolean;
21
+ sha256: string;
22
+ }>>;
23
+ inspect(): Promise<plugins.smartdaemon.ISystemdUnitState>;
24
+ enable(): Promise<plugins.smartdaemon.ISystemdUnitState>;
25
+ start(): Promise<plugins.smartdaemon.ISystemdUnitState>;
26
+ stop(): Promise<plugins.smartdaemon.ISystemdUnitState>;
27
+ }
28
+ export declare const runAuthSwitchAuthorityDaemon: (paths?: IAuthSwitchAuthorityPaths) => Promise<void>;
@@ -0,0 +1,71 @@
1
+ import * as plugins from './plugins.js';
2
+ import { AuthSwitchAuthorityDaemon } from './classes.authoritydaemon.js';
3
+ /** Canonical per-user paths. An explicit runtime directory is also usable by a trusted container host. */
4
+ export const resolveAuthSwitchAuthorityPaths = (runtimeDirectory = process.env.XDG_RUNTIME_DIR) => {
5
+ if (!runtimeDirectory || !plugins.path.isAbsolute(runtimeDirectory)) {
6
+ throw new Error('A private XDG_RUNTIME_DIR is required for authswitch authority.');
7
+ }
8
+ const home = plugins.os.userInfo().homedir;
9
+ const dataHome = process.env.XDG_DATA_HOME || plugins.path.join(home, '.local/share');
10
+ if (!plugins.path.isAbsolute(dataHome))
11
+ throw new Error('XDG_DATA_HOME must be an absolute path.');
12
+ const socketDirectory = plugins.path.join(runtimeDirectory, 'authswitch');
13
+ const runtimeSocketDirectory = plugins.path.join(socketDirectory, 'runtime');
14
+ return {
15
+ runtimeDirectory,
16
+ dataDirectory: plugins.path.join(dataHome, 'authswitch', 'authority'),
17
+ databaseSocketPath: plugins.path.join(socketDirectory, 'internal', 'db.sock'),
18
+ authoritySocketPath: plugins.path.join(socketDirectory, 'management', 'authority.sock'),
19
+ runtimeSocketPath: plugins.path.join(runtimeSocketDirectory, 'runtime.sock'),
20
+ runtimeSocketDirectory,
21
+ };
22
+ };
23
+ /** Explicit installer and lifecycle operations for a user-scoped systemd service. */
24
+ export class AuthSwitchAuthorityService {
25
+ unit;
26
+ unitFile;
27
+ definition;
28
+ constructor(runtimeDirectory, unitDirectory) {
29
+ const packageRoot = plugins.path.dirname(plugins.path.dirname(plugins.fileURLToPath(import.meta.url)));
30
+ const options = { unitName: 'authswitch-authority.service', scope: 'user', runtimeDirectory };
31
+ this.unit = new plugins.smartdaemon.SystemdUnit(options);
32
+ this.unitFile = new plugins.smartdaemon.SystemdUnitFile({ ...options, unitDirectory });
33
+ this.definition = new plugins.smartdaemon.SystemdServiceDefinition({
34
+ unitName: options.unitName, scope: 'user', description: 'Authswitch account authority', executable: process.execPath,
35
+ args: [plugins.path.join(packageRoot, 'cli.js'), 'authority', 'daemon'],
36
+ workingDirectory: packageRoot, restart: 'on-failure', killMode: 'mixed', timeoutStopSeconds: 60,
37
+ });
38
+ }
39
+ async install() {
40
+ const previous = await this.unitFile.inspect();
41
+ const result = await this.unitFile.install(this.definition, previous?.sha256 ?? null);
42
+ return { changed: result.changed, masked: result.masked, sha256: result.record.sha256 };
43
+ }
44
+ inspect() { return this.unit.inspect(); }
45
+ enable() { return this.unit.enable(); }
46
+ start() { return this.unit.start(); }
47
+ stop() { return this.unit.stop(); }
48
+ }
49
+ export const runAuthSwitchAuthorityDaemon = async (paths = resolveAuthSwitchAuthorityPaths()) => {
50
+ const daemon = new AuthSwitchAuthorityDaemon({
51
+ dataDirectory: paths.dataDirectory,
52
+ socketPath: paths.databaseSocketPath,
53
+ authoritySocketPath: paths.authoritySocketPath,
54
+ runtimeSocketPath: paths.runtimeSocketPath,
55
+ });
56
+ await daemon.start();
57
+ await new Promise((resolve, reject) => {
58
+ let stopping = false;
59
+ const stop = () => {
60
+ if (stopping)
61
+ return;
62
+ stopping = true;
63
+ process.off('SIGINT', stop);
64
+ process.off('SIGTERM', stop);
65
+ void daemon.close().then(resolve, reject);
66
+ };
67
+ process.on('SIGINT', stop);
68
+ process.on('SIGTERM', stop);
69
+ });
70
+ };
71
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5hdXRob3JpdHlzZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvY2xhc3Nlcy5hdXRob3JpdHlzZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBV3pFLDBHQUEwRztBQUMxRyxNQUFNLENBQUMsTUFBTSwrQkFBK0IsR0FBRyxDQUFDLGdCQUFnQixHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBZSxFQUE2QixFQUFFO0lBQzNILElBQUksQ0FBQyxnQkFBZ0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQztRQUNwRSxNQUFNLElBQUksS0FBSyxDQUFDLGlFQUFpRSxDQUFDLENBQUM7SUFDckYsQ0FBQztJQUNELE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsT0FBTyxDQUFDO0lBQzNDLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsYUFBYSxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxjQUFjLENBQUMsQ0FBQztJQUN0RixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDO1FBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyx5Q0FBeUMsQ0FBQyxDQUFDO0lBQ25HLE1BQU0sZUFBZSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQzFFLE1BQU0sc0JBQXNCLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQzdFLE9BQU87UUFDTCxnQkFB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
@@ -0,0 +1,80 @@
1
+ import * as plugins from './plugins.js';
2
+ import type { AuthSwitchAuthorityBroker } from './classes.authoritybroker.js';
3
+ export interface IAuthSwitchManagedCodexOptions {
4
+ /** Private runtime root; only the disposable control socket lives here. */
5
+ runtimeDirectory: string;
6
+ /** Caller-owned, durable native Codex state home, reserved to one account and scope by SmartData. */
7
+ codexHomeDirectory: string;
8
+ workspaceDirectory: string;
9
+ executable?: string;
10
+ /** The daemon is the sole owner of this binding and its capability. */
11
+ broker: AuthSwitchAuthorityBroker;
12
+ bindingId: string;
13
+ capability: string;
14
+ onNotification?: (notification: plugins.crossharness.ICodexAppServerNotification) => void;
15
+ onServerRequest?: (request: plugins.crossharness.ICodexAppServerRequest, reply: {
16
+ respond: (result: unknown) => boolean;
17
+ reject: (code: number, message: string) => boolean;
18
+ }) => void;
19
+ onUnavailable?: () => void;
20
+ onPreparedRun: (socketPath: string) => Promise<void>;
21
+ onChildSpawned: (pid: number, startedAt: string) => Promise<void>;
22
+ }
23
+ export interface IAuthSwitchCodexInteractiveCommand {
24
+ executable: string;
25
+ args: string[];
26
+ cwd: string;
27
+ env: NodeJS.ProcessEnv;
28
+ }
29
+ /** Same-user process inspection: a unique private --listen socket is the pre-PID crash identity. */
30
+ export declare const findManagedCodexProcess: (socketPath: string) => Promise<{
31
+ pid: number;
32
+ startedAt: string;
33
+ } | null>;
34
+ /** Daemon-owned Codex app-server. Only access tokens, never refresh grants, enter Codex. */
35
+ export declare class AuthSwitchManagedCodex {
36
+ private readonly options;
37
+ private child?;
38
+ private childExited?;
39
+ private client?;
40
+ private runDirectory?;
41
+ private homeDirectory?;
42
+ private socketPath?;
43
+ private workspaceId?;
44
+ private grantedGeneration?;
45
+ private startPromise?;
46
+ private closePromise?;
47
+ private closed;
48
+ private ready;
49
+ constructor(options: IAuthSwitchManagedCodexOptions);
50
+ get isReady(): boolean;
51
+ private environment;
52
+ private requireVersion;
53
+ start(): Promise<void>;
54
+ private performStart;
55
+ private handleServerRequest;
56
+ /** The interactive CLI attaches to the owned app-server; the daemon remains its auth control peer. */
57
+ interactiveCommand(): IAuthSwitchCodexInteractiveCommand;
58
+ /** Native app-server thread/turn API for noninteractive consumers; notifications go to onNotification. */
59
+ startThread(options: {
60
+ approvalPolicy: 'never' | 'on-request';
61
+ model?: string;
62
+ signal?: AbortSignal;
63
+ }): Promise<string>;
64
+ resumeThread(threadId: string, options: {
65
+ approvalPolicy: 'never' | 'on-request';
66
+ model?: string;
67
+ signal?: AbortSignal;
68
+ }): Promise<void>;
69
+ startTextTurn(text: string, options: {
70
+ approvalPolicy: 'never' | 'on-request';
71
+ model?: string;
72
+ threadId?: string;
73
+ signal?: AbortSignal;
74
+ }): Promise<{
75
+ threadId: string;
76
+ turnId: string;
77
+ }>;
78
+ close(): Promise<void>;
79
+ private performClose;
80
+ }
@@ -0,0 +1,343 @@
1
+ import * as plugins from './plugins.js';
2
+ import { commitinfo } from './00_commitinfo_data.js';
3
+ const isRecord = (value) => value !== null && typeof value === 'object' && !Array.isArray(value);
4
+ const isAlive = (child) => child.exitCode === null && child.signalCode === null;
5
+ const wait = (ms) => new Promise(resolve => setTimeout(resolve, ms));
6
+ /** Same-user process inspection: a unique private --listen socket is the pre-PID crash identity. */
7
+ export const findManagedCodexProcess = async (socketPath) => {
8
+ if (process.platform === 'win32')
9
+ throw new Error('Managed Codex Unix socket process inspection is unavailable on Windows.');
10
+ const output = await new Promise((resolve, reject) => {
11
+ plugins.childProcess.execFile('ps', ['-ww', '-u', String(process.getuid?.()), '-o', 'pid=,lstart=,args='], { timeout: 5_000, maxBuffer: 8 * 1024 * 1024, env: { ...process.env, LC_ALL: 'C' } }, (error, stdout) => error ? reject(new Error('Managed Codex process inspection failed.')) : resolve(stdout));
12
+ });
13
+ const marker = `app-server --listen unix://${socketPath}`;
14
+ const matches = [];
15
+ for (const line of output.split('\n')) {
16
+ const parts = line.trim().split(/\s+/);
17
+ if (parts.length < 8)
18
+ continue;
19
+ const pid = Number(parts[0]);
20
+ const date = Date.parse(parts.slice(1, 6).join(' '));
21
+ const args = parts.slice(6).join(' ');
22
+ if (Number.isSafeInteger(pid) && pid > 0 && Number.isFinite(date) && args.includes(marker)) {
23
+ matches.push({ pid, startedAt: new Date(date).toISOString() });
24
+ }
25
+ }
26
+ if (matches.length > 1)
27
+ throw new Error('Multiple managed Codex processes claim one private socket.');
28
+ return matches[0] ?? null;
29
+ };
30
+ /** Daemon-owned Codex app-server. Only access tokens, never refresh grants, enter Codex. */
31
+ export class AuthSwitchManagedCodex {
32
+ options;
33
+ child;
34
+ childExited;
35
+ client;
36
+ runDirectory;
37
+ homeDirectory;
38
+ socketPath;
39
+ workspaceId;
40
+ grantedGeneration;
41
+ startPromise;
42
+ closePromise;
43
+ closed = false;
44
+ ready = false;
45
+ constructor(options) {
46
+ this.options = options;
47
+ if (!plugins.path.isAbsolute(options.runtimeDirectory) || !plugins.path.isAbsolute(options.workspaceDirectory)
48
+ || !plugins.path.isAbsolute(options.codexHomeDirectory)) {
49
+ throw new Error('Managed Codex requires absolute runtime, home and workspace directories.');
50
+ }
51
+ }
52
+ get isReady() { return this.ready && this.client?.state === 'connected' && !this.closed; }
53
+ environment() {
54
+ const picked = {};
55
+ for (const key of ['PATH', 'HOME', 'USER', 'LOGNAME', 'LANG', 'LC_ALL', 'TERM', 'TMPDIR', 'XDG_RUNTIME_DIR']) {
56
+ if (process.env[key] !== undefined)
57
+ picked[key] = process.env[key];
58
+ }
59
+ picked.CODEX_HOME = this.homeDirectory;
60
+ return picked;
61
+ }
62
+ async requireVersion() {
63
+ const executable = this.options.executable ?? 'codex';
64
+ const output = await new Promise((resolve, reject) => {
65
+ plugins.childProcess.execFile(executable, ['--version'], { timeout: 5_000, maxBuffer: 4096,
66
+ windowsHide: true, env: this.environment() }, (error, stdout) => {
67
+ if (error)
68
+ reject(new Error('Managed Codex version probe failed.'));
69
+ else
70
+ resolve(stdout.trim());
71
+ });
72
+ });
73
+ if (output !== 'codex-cli 0.155.1')
74
+ throw new Error('Managed Codex requires verified codex-cli 0.155.1.');
75
+ }
76
+ start() {
77
+ if (this.closed || this.startPromise)
78
+ throw new Error('Managed Codex can start only once.');
79
+ this.startPromise = this.performStart();
80
+ return this.startPromise;
81
+ }
82
+ async performStart() {
83
+ try {
84
+ const root = this.options.runtimeDirectory;
85
+ await plugins.fs.promises.mkdir(root, { recursive: true, mode: 0o700 });
86
+ const rootStat = await plugins.fs.promises.lstat(root);
87
+ if (!rootStat.isDirectory() || rootStat.isSymbolicLink() || rootStat.uid !== process.getuid?.()) {
88
+ throw new Error('Managed Codex runtime directory is not private.');
89
+ }
90
+ await plugins.fs.promises.chmod(root, 0o700);
91
+ this.runDirectory = await plugins.fs.promises.mkdtemp(plugins.path.join(root, 'codex-'));
92
+ await plugins.fs.promises.chmod(this.runDirectory, 0o700);
93
+ this.homeDirectory = this.options.codexHomeDirectory;
94
+ this.socketPath = plugins.path.join(this.runDirectory, 'app.sock');
95
+ if (Buffer.byteLength(this.socketPath, 'utf8') > 100)
96
+ throw new Error('Managed Codex socket path is too long.');
97
+ const homeStat = await plugins.fs.promises.lstat(this.homeDirectory);
98
+ if (!homeStat.isDirectory() || homeStat.isSymbolicLink() || homeStat.uid !== process.getuid?.()
99
+ || (homeStat.mode & 0o077) !== 0 || await plugins.fs.promises.realpath(this.homeDirectory) !== this.homeDirectory) {
100
+ throw new Error('Managed Codex home is not a private owned directory.');
101
+ }
102
+ try {
103
+ await plugins.fs.promises.lstat(plugins.path.join(this.homeDirectory, 'auth.json'));
104
+ throw new Error('Managed Codex home contains a native credential file.');
105
+ }
106
+ catch (error) {
107
+ if (!isRecord(error) || error.code !== 'ENOENT')
108
+ throw error;
109
+ }
110
+ await this.requireVersion();
111
+ if (this.closed)
112
+ throw new Error('Managed Codex startup was cancelled.');
113
+ const initial = await this.options.broker.resolveAccess(this.options.bindingId, this.options.capability, 60_000);
114
+ if (this.closed)
115
+ throw new Error('Managed Codex startup was cancelled.');
116
+ this.workspaceId = initial.accountId;
117
+ this.grantedGeneration = initial.grantGeneration;
118
+ await this.options.onPreparedRun(this.socketPath);
119
+ if (this.closed)
120
+ throw new Error('Managed Codex startup was cancelled.');
121
+ const child = plugins.childProcess.spawn(this.options.executable ?? 'codex', [
122
+ 'app-server', '--listen', `unix://${this.socketPath}`, '--strict-config',
123
+ '-c', 'cli_auth_credentials_store="ephemeral"',
124
+ ], { cwd: this.options.workspaceDirectory, env: this.environment(), shell: false,
125
+ detached: process.platform !== 'win32', stdio: 'ignore', windowsHide: true });
126
+ this.child = child;
127
+ this.childExited = new Promise(resolve => {
128
+ child.once('error', () => resolve());
129
+ child.once('exit', () => resolve());
130
+ });
131
+ if (!child.pid)
132
+ throw new Error('Managed Codex app-server process has no PID.');
133
+ let observed = null;
134
+ for (let attempt = 0; attempt < 20 && !observed; attempt++) {
135
+ observed = await findManagedCodexProcess(this.socketPath);
136
+ if (!observed)
137
+ await wait(25);
138
+ }
139
+ if (!observed || observed.pid !== child.pid)
140
+ throw new Error('Managed Codex app-server process identity could not be verified.');
141
+ await this.options.onChildSpawned(observed.pid, observed.startedAt);
142
+ const deadline = Date.now() + 10_000;
143
+ while (true) {
144
+ if (this.closed)
145
+ throw new Error('Managed Codex startup was cancelled.');
146
+ if (!isAlive(child))
147
+ throw new Error('Managed Codex app-server exited before accepting connections.');
148
+ try {
149
+ if ((await plugins.fs.promises.lstat(this.socketPath)).isSocket())
150
+ break;
151
+ }
152
+ catch (error) {
153
+ if (!isRecord(error) || error.code !== 'ENOENT')
154
+ throw error;
155
+ }
156
+ if (Date.now() >= deadline)
157
+ throw new Error('Managed Codex app-server socket startup timed out.');
158
+ await wait(25);
159
+ }
160
+ const client = new plugins.crossharness.CodexAppServerClient({
161
+ transport: { type: 'unix', socketPath: this.socketPath },
162
+ clientInfo: { name: 'authswitch', title: 'Authswitch', version: commitinfo.version },
163
+ experimentalApi: true, handshakeTimeoutMs: 5_000, initializeTimeoutMs: 5_000,
164
+ onNotification: notification => this.options.onNotification?.(notification),
165
+ onServerRequest: request => { void this.handleServerRequest(request); },
166
+ onClose: () => {
167
+ const wasReady = this.ready;
168
+ this.ready = false;
169
+ if (wasReady && !this.closed)
170
+ this.options.onUnavailable?.();
171
+ },
172
+ });
173
+ this.client = client;
174
+ await client.connect();
175
+ if (client.serverVersion !== '0.155.1')
176
+ throw new Error('Managed Codex app-server version changed.');
177
+ const login = await client.request('account/login/start', {
178
+ type: 'chatgptAuthTokens', accessToken: initial.accessToken, chatgptAccountId: initial.accountId,
179
+ }, 5_000);
180
+ if (!isRecord(login) || login.type !== 'chatgptAuthTokens') {
181
+ throw new Error('Managed Codex external-token login was not acknowledged.');
182
+ }
183
+ if (this.closed)
184
+ throw new Error('Managed Codex startup was cancelled.');
185
+ this.ready = true;
186
+ }
187
+ catch (error) {
188
+ try {
189
+ await this.close();
190
+ }
191
+ catch (cleanupError) {
192
+ throw new AggregateError([error, cleanupError], 'Managed Codex startup and cleanup failed.');
193
+ }
194
+ throw error;
195
+ }
196
+ }
197
+ async handleServerRequest(request) {
198
+ const client = this.client;
199
+ if (!client || this.closed || !this.ready)
200
+ return;
201
+ if (request.method !== 'account/chatgptAuthTokens/refresh') {
202
+ if (!this.options.onServerRequest) {
203
+ client.rejectRequest(request.id, -32601, 'Managed Codex request requires an owner handler.');
204
+ return;
205
+ }
206
+ try {
207
+ this.options.onServerRequest(request, {
208
+ respond: result => client.respond(request.id, result),
209
+ reject: (code, message) => client.rejectRequest(request.id, code, message),
210
+ });
211
+ }
212
+ catch {
213
+ client.rejectRequest(request.id, -32603, 'Managed Codex owner request failed.');
214
+ }
215
+ return;
216
+ }
217
+ const prior = this.grantedGeneration;
218
+ const workspaceId = this.workspaceId;
219
+ const params = request.params;
220
+ if (params.reason !== 'unauthorized' || !workspaceId || prior === undefined
221
+ || (params.previousAccountId !== undefined && params.previousAccountId !== null
222
+ && params.previousAccountId !== workspaceId)) {
223
+ client.rejectRequest(request.id, -32602, 'Managed Codex account identity is invalid.');
224
+ return;
225
+ }
226
+ try {
227
+ const refreshed = await this.options.broker.resolveAccess(this.options.bindingId, this.options.capability, 60_000, prior);
228
+ if (this.closed || request.signal.aborted)
229
+ return;
230
+ if (refreshed.accountId !== workspaceId || refreshed.grantGeneration <= prior) {
231
+ client.rejectRequest(request.id, -32603, 'Managed Codex account refresh did not advance.');
232
+ return;
233
+ }
234
+ this.grantedGeneration = refreshed.grantGeneration;
235
+ client.respond(request.id, { accessToken: refreshed.accessToken,
236
+ chatgptAccountId: refreshed.accountId, chatgptPlanType: null });
237
+ }
238
+ catch {
239
+ if (!request.signal.aborted)
240
+ client.rejectRequest(request.id, -32603, 'Managed Codex account needs reauthentication.');
241
+ }
242
+ }
243
+ /** The interactive CLI attaches to the owned app-server; the daemon remains its auth control peer. */
244
+ interactiveCommand() {
245
+ if (!this.isReady || !this.socketPath)
246
+ throw new Error('Managed Codex is unavailable.');
247
+ return { executable: this.options.executable ?? 'codex', args: ['--remote', `unix://${this.socketPath}`],
248
+ cwd: this.options.workspaceDirectory, env: this.environment() };
249
+ }
250
+ /** Native app-server thread/turn API for noninteractive consumers; notifications go to onNotification. */
251
+ async startThread(options) {
252
+ if (!this.isReady || !this.client || !options || !['never', 'on-request'].includes(options.approvalPolicy)
253
+ || (options.model !== undefined && (typeof options.model !== 'string' || options.model.length > 128))) {
254
+ throw new Error('Managed Codex thread request is unavailable or invalid.');
255
+ }
256
+ const started = await this.client.request('thread/start', {
257
+ cwd: this.options.workspaceDirectory, approvalPolicy: options.approvalPolicy,
258
+ ...(options.model ? { model: options.model } : {}),
259
+ }, 30_000, options.signal);
260
+ if (!isRecord(started) || !isRecord(started.thread) || typeof started.thread.id !== 'string') {
261
+ throw new Error('Managed Codex returned an invalid thread.');
262
+ }
263
+ return started.thread.id;
264
+ }
265
+ async resumeThread(threadId, options) {
266
+ if (!this.isReady || !this.client || typeof threadId !== 'string' || !threadId || threadId.length > 256
267
+ || !options || !['never', 'on-request'].includes(options.approvalPolicy)
268
+ || (options.model !== undefined && (typeof options.model !== 'string' || options.model.length > 128))) {
269
+ throw new Error('Managed Codex resume request is unavailable or invalid.');
270
+ }
271
+ const resumed = await this.client.request('thread/resume', { threadId,
272
+ cwd: this.options.workspaceDirectory, approvalPolicy: options.approvalPolicy,
273
+ ...(options.model ? { model: options.model } : {}),
274
+ }, 30_000, options.signal);
275
+ if (!isRecord(resumed) || !isRecord(resumed.thread) || resumed.thread.id !== threadId) {
276
+ throw new Error('Managed Codex could not resume the requested thread from its assigned home.');
277
+ }
278
+ }
279
+ async startTextTurn(text, options) {
280
+ if (!this.isReady || !this.client || typeof text !== 'string' || !text.trim() || text.length > 1_000_000
281
+ || !options || !['never', 'on-request'].includes(options.approvalPolicy)
282
+ || (options.model !== undefined && (typeof options.model !== 'string' || options.model.length > 128))
283
+ || (options.threadId !== undefined && (typeof options.threadId !== 'string' || options.threadId.length > 256))) {
284
+ throw new Error('Managed Codex turn request is unavailable or invalid.');
285
+ }
286
+ let threadId = options.threadId;
287
+ if (threadId) {
288
+ await this.resumeThread(threadId, options);
289
+ }
290
+ else {
291
+ threadId = await this.startThread(options);
292
+ }
293
+ const turn = await this.client.request('turn/start', { threadId,
294
+ input: [{ type: 'text', text, text_elements: [] }],
295
+ approvalPolicy: options.approvalPolicy,
296
+ ...(options.model ? { model: options.model } : {}),
297
+ }, 30_000, options.signal);
298
+ if (!isRecord(turn) || !isRecord(turn.turn) || typeof turn.turn.id !== 'string') {
299
+ throw new Error('Managed Codex returned an invalid turn.');
300
+ }
301
+ return { threadId, turnId: turn.turn.id };
302
+ }
303
+ close() {
304
+ if (this.closePromise)
305
+ return this.closePromise;
306
+ const wasReady = this.ready;
307
+ this.closed = true;
308
+ this.ready = false;
309
+ this.closePromise = this.performClose();
310
+ if (wasReady)
311
+ this.options.onUnavailable?.();
312
+ return this.closePromise;
313
+ }
314
+ async performClose() {
315
+ this.client?.close('Managed Codex stopped.');
316
+ const child = this.child;
317
+ if (child && isAlive(child) && child.pid) {
318
+ try {
319
+ process.kill(process.platform === 'win32' ? child.pid : -child.pid, 'SIGTERM');
320
+ }
321
+ catch (error) {
322
+ if (!isRecord(error) || error.code !== 'ESRCH')
323
+ throw error;
324
+ }
325
+ await Promise.race([this.childExited, wait(3_000)]);
326
+ if (isAlive(child)) {
327
+ try {
328
+ process.kill(process.platform === 'win32' ? child.pid : -child.pid, 'SIGKILL');
329
+ }
330
+ catch (error) {
331
+ if (!isRecord(error) || error.code !== 'ESRCH')
332
+ throw error;
333
+ }
334
+ await Promise.race([this.childExited, wait(3_000)]);
335
+ }
336
+ if (isAlive(child))
337
+ throw new Error('Managed Codex process did not stop.');
338
+ }
339
+ if (this.runDirectory)
340
+ await plugins.fs.promises.rm(this.runDirectory, { recursive: true, force: true });
341
+ }
342
+ }
343
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5jb2RleG1hbmFnZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9jbGFzc2VzLmNvZGV4bWFuYWdlZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUN4QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUE2QnJELE1BQU0sUUFBUSxHQUFHLENBQUMsS0FBYyxFQUFvQyxFQUFFLENBQ3BFLEtBQUssS0FBSyxJQUFJLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUN2RSxNQUFNLE9BQU8sR0FBRyxDQUFDLEtBQXdDLEVBQVcsRUFBRSxDQUFDLEtBQUssQ0FBQyxRQUFRLEtBQUssSUFBSSxJQUFJLEtBQUssQ0FBQyxVQUFVLEtBQUssSUFBSSxDQUFDO0FBQzVILE1BQU0sSUFBSSxHQUFHLENBQUMsRUFBVSxFQUFpQixFQUFFLENBQUMsSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFFNUYsb0dBQW9HO0FBQ3BHLE1BQU0sQ0FBQyxNQUFNLHVCQUF1QixHQUFHLEtBQUssRUFBRSxVQUFrQixFQUFzRCxFQUFFO0lBQ3RILElBQUksT0FBTyxDQUFDLFFBQVEsS0FBSyxPQUFPO1FBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyx5RUFBeUUsQ0FBQyxDQUFDO0lBQzdILE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxPQUFPLENBQVMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7UUFDM0QsT0FBTyxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLENB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QUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxPQUFPO3dCQUFFLE1BQU0sS0FBSyxDQUFDO2dCQUFDLENBQUM7Z0JBQzlFLE1BQU0sT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN0RCxDQUFDO1lBQ0QsSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDO2dCQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMscUNBQXFDLENBQUMsQ0FBQztRQUM3RSxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsWUFBWTtZQUFFLE1BQU0sT0FBTyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQzNHLENBQUM7Q0FDRiJ9
@@ -23,4 +23,7 @@ export * from './classes.service.js';
23
23
  export * from './classes.watch.js';
24
24
  export * from './classes.watchlock.js';
25
25
  export * from './watchpolicy.js';
26
+ export * from './classes.authorityclient.js';
27
+ export * from './classes.authoritydaemon.js';
28
+ export * from './classes.authorityservice.js';
26
29
  export declare const runCli: (argvArg?: string[]) => Promise<void>;