agl 40.5.1 → 40.6.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.
- package/changelog.md +10 -0
- package/dist_serve/bundle.js +1 -1
- package/dist_serve/bundle.js.map +2 -2
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/classes.aglhome.d.ts +5 -0
- package/dist_ts/classes.aglhome.js +2 -1
- package/dist_ts/classes.authstore.js +5 -1
- package/dist_ts/classes.controller.js +11 -2
- package/dist_ts/classes.inferencegateway.d.ts +35 -1
- package/dist_ts/classes.inferencegateway.js +86 -26
- package/dist_ts/classes.inferenceservice.d.ts +4 -2
- package/dist_ts/classes.inferenceservice.js +5 -4
- package/dist_ts/classes.proxycontrol.d.ts +58 -4
- package/dist_ts/classes.proxycontrol.js +23 -44
- package/dist_ts/classes.proxycontrolclient.d.ts +15 -5
- package/dist_ts/classes.proxycontrolclient.js +67 -17
- package/dist_ts/classes.proxydaemon.d.ts +22 -3
- package/dist_ts/classes.proxydaemon.js +73 -12
- package/dist_ts/classes.proxyleaseholder.d.ts +43 -14
- package/dist_ts/classes.proxyleaseholder.js +66 -22
- package/dist_ts/classes.proxystore.d.ts +9 -0
- package/dist_ts/classes.proxystore.js +15 -7
- package/dist_ts/classes.workercallerbindings.d.ts +66 -0
- package/dist_ts/classes.workercallerbindings.js +211 -0
- package/dist_ts/classes.workercallers.d.ts +63 -2
- package/dist_ts/classes.workercallers.js +430 -65
- package/dist_ts/fleet/classes.workerlaunches.d.ts +12 -5
- package/dist_ts/fleet/classes.workerlaunches.js +25 -19
- package/dist_ts/fleet/classes.workers.d.ts +17 -0
- package/dist_ts/fleet/classes.workers.js +74 -1
- package/dist_ts/functions.inferencecli.d.ts +3 -2
- package/dist_ts/functions.inferencecli.js +67 -5
- package/dist_ts/functions.inferencecliarguments.d.ts +6 -2
- package/dist_ts/functions.inferencecliarguments.js +29 -2
- package/dist_ts/functions.inferencelaunch.d.ts +24 -0
- package/dist_ts/functions.inferencelaunch.js +42 -2
- package/dist_ts/functions.proxycontract.d.ts +11 -0
- package/dist_ts/functions.proxycontract.js +12 -1
- package/dist_ts/functions.proxysocket.d.ts +6 -0
- package/dist_ts/functions.proxysocket.js +46 -0
- package/dist_ts/functions.workerprocessproof.d.ts +6 -0
- package/dist_ts/functions.workerprocessproof.js +28 -4
- package/dist_ts_interfaces/workercallers.d.ts +43 -4
- package/package.json +1 -1
- package/readme.md +102 -13
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/classes.aglhome.ts +6 -0
- package/ts/classes.authstore.ts +4 -0
- package/ts/classes.controller.ts +10 -1
- package/ts/classes.inferencegateway.ts +104 -23
- package/ts/classes.inferenceservice.ts +6 -3
- package/ts/classes.proxycontrol.ts +76 -39
- package/ts/classes.proxycontrolclient.ts +72 -20
- package/ts/classes.proxydaemon.ts +85 -15
- package/ts/classes.proxyleaseholder.ts +84 -28
- package/ts/classes.proxystore.ts +16 -5
- package/ts/classes.workercallerbindings.ts +147 -0
- package/ts/classes.workercallers.ts +410 -59
- package/ts/fleet/classes.workerlaunches.ts +23 -15
- package/ts/fleet/classes.workers.ts +51 -1
- package/ts/functions.inferencecli.ts +61 -7
- package/ts/functions.inferencecliarguments.ts +32 -1
- package/ts/functions.inferencelaunch.ts +49 -2
- package/ts/functions.proxycontract.ts +12 -0
- package/ts/functions.proxysocket.ts +39 -0
- package/ts/functions.workerprocessproof.ts +27 -4
- package/ts_interfaces/workercallers.ts +32 -4
- package/ts_web/00_commitinfo_data.ts +1 -1
|
@@ -112,16 +112,40 @@ const processOwnsLoopbackConnection = async (connectionArg, pidArg) => {
|
|
|
112
112
|
const matches = table.split('\n').slice(1).map(line => line.trim().split(/\s+/u)).filter(fields => (fields[1] === endpoint(connectionArg.remotePort) && fields[2] === endpoint(connectionArg.localPort) && fields[3] === '01'));
|
|
113
113
|
return matches.length === 1 && await processOwnsInode(pidArg, matches[0][9]);
|
|
114
114
|
};
|
|
115
|
-
|
|
115
|
+
/**
|
|
116
|
+
* The bridge process `bridgePidArg`, proved to hold the caller's end of the direct loopback connection and to run the
|
|
117
|
+
* approved command, whatever its parent. The command is the one recorded when the launch was prepared: an upgrade
|
|
118
|
+
* installs AGL under another path, and a command whose files are gone is refused as such.
|
|
119
|
+
*/
|
|
120
|
+
export const readWorkerBridge = async (connectionArg, bridgePidArg, commandArg) => {
|
|
121
|
+
for (const file of [commandArg.executable, commandArg.entry]) {
|
|
122
|
+
let resolved;
|
|
123
|
+
try {
|
|
124
|
+
resolved = await plugins.fs.promises.realpath(file);
|
|
125
|
+
}
|
|
126
|
+
catch (errorArg) {
|
|
127
|
+
if (isWorkerCallerProofRefusal(errorArg))
|
|
128
|
+
throw new WorkerCallerProofError('The approved bridge command no longer exists.');
|
|
129
|
+
throw errorArg;
|
|
130
|
+
}
|
|
131
|
+
if (resolved !== file)
|
|
132
|
+
throw new WorkerCallerProofError('The approved bridge command no longer exists.');
|
|
133
|
+
}
|
|
116
134
|
if (!await processOwnsLoopbackConnection(connectionArg, bridgePidArg)) {
|
|
117
135
|
throw new WorkerCallerProofError('Worker transport ownership could not be proved.');
|
|
118
136
|
}
|
|
119
137
|
const bridge = await readWorkerProcessSnapshot(bridgePidArg);
|
|
120
138
|
const entry = await plugins.fs.promises.realpath(bridge.arguments[1] ?? '');
|
|
121
|
-
if (bridge.
|
|
122
|
-
||
|
|
139
|
+
if (bridge.executable !== commandArg.executable || entry !== commandArg.entry
|
|
140
|
+
|| !plugins.util.isDeepStrictEqual(bridge.arguments.slice(2), commandArg.arguments)) {
|
|
123
141
|
throw new WorkerCallerProofError('Worker bridge does not match the approved launch.');
|
|
124
142
|
}
|
|
143
|
+
return bridge;
|
|
144
|
+
};
|
|
145
|
+
export const verifyWorkerBridge = async (connectionArg, bridgePidArg, commandArg, parentArg) => {
|
|
146
|
+
const bridge = await readWorkerBridge(connectionArg, bridgePidArg, commandArg);
|
|
147
|
+
if (bridge.parentPid !== parentArg.pid)
|
|
148
|
+
throw new WorkerCallerProofError('Worker bridge does not match the approved launch.');
|
|
125
149
|
if (!workerSnapshotsEqual(parentArg, await readWorkerProcessSnapshot(parentArg.pid))
|
|
126
150
|
|| !workerSnapshotsEqual(bridge, await readWorkerProcessSnapshot(bridge.pid))) {
|
|
127
151
|
throw new WorkerCallerProofError('Worker transport or process incarnation could not be proved.');
|
|
@@ -189,4 +213,4 @@ export const proveConnectionProcessAncestry = async (connectionArg, pidArg, maxi
|
|
|
189
213
|
}
|
|
190
214
|
return chain;
|
|
191
215
|
};
|
|
192
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnVuY3Rpb25zLndvcmtlcnByb2Nlc3Nwcm9vZi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL2Z1bmN0aW9ucy53b3JrZXJwcm9jZXNzcHJvb2YudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFFeEMsT0FBTyxFQUFFLHdDQUF3QyxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFFekYsTUFBTSxPQUFPLHNCQUF1QixTQUFRLEtBQUs7Q0FBRztBQUVwRCxNQUFNLENBQUMsTUFBTSwwQkFBMEIsR0FBRyxDQUFDLFFBQWlCLEVBQVcsRUFBRSxDQUFDLENBQ3hFLFFBQVEsWUFBWSxzQkFBc0I7T0FDdkMsQ0FBQyxRQUFRLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsU0FBUyxDQUFDLENBQUMsUUFBUSxDQUFFLFFBQThDLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUMzSCxDQUFDO0FBd0JGLE1BQU0sQ0FBQyxNQUFNLHlCQUF5QixHQUFHLEtBQUssRUFBRSxNQUFjLEVBQW1DLEVBQUU7SUFDakcsSUFBSSxPQUFPLENBQUMsUUFBUSxLQUFLLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ2hGLE1BQU0sSUFBSSxzQkFBc0IsQ0FBQywyREFBMkQsQ0FBQyxDQUFDO0lBQ2hHLENBQUM7SUFDRCxNQUFNLElBQUksR0FBRyxTQUFTLE1BQU0sRUFBRSxDQUFDO0lBQy9CLE1BQU0sUUFBUSxHQUFHLE1BQU0sT0FBTyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEdBQUcsSUFBSSxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDNUUsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxH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
|
|
216
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnVuY3Rpb25zLndvcmtlcnByb2Nlc3Nwcm9vZi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL2Z1bmN0aW9ucy53b3JrZXJwcm9jZXNzcHJvb2YudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFFeEMsT0FBTyxFQUFFLHdDQUF3QyxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFFekYsTUFBTSxPQUFPLHNCQUF1QixTQUFRLEtBQUs7Q0FBRztBQUVwRCxNQUFNLENBQUMsTUFBTSwwQkFBMEIsR0FBRyxDQUFDLFFBQWlCLEVBQVcsRUFBRSxDQUFDLENBQ3hFLFFBQVEsWUFBWSxzQkFBc0I7T0FDdkMsQ0FBQyxRQUFRLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsU0FBUyxDQUFDLENBQUMsUUFBUSxDQUFFLFFBQThDLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUMzSCxDQUFDO0FBd0JGLE1BQU0sQ0FBQyxNQUFNLHlCQUF5QixHQUFHLEtBQUssRUFBRSxNQUFjLEVBQW1DLEVBQUU7SUFDakcsSUFBSSxPQUFPLENBQUMsUUFBUSxLQUFLLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ2hGLE1BQU0sSUFBSSxzQkFBc0IsQ0FBQywyREFBMkQsQ0FBQyxDQUFDO0lBQ2hHLENBQUM7SUFDRCxNQUFNLElBQUksR0FBRyxTQUFTLE1BQU0sRUFBRSxDQUFDO0lBQy9CLE1BQU0sUUFBUSxHQUFHLE1BQU0sT0FBTyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEdBQUcsSUFBSSxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDNUUsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxH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
|
|
@@ -4,6 +4,8 @@ export declare const workerCallerLaunchGenerationEnvironmentVariable = "AGL_MCP_
|
|
|
4
4
|
export interface IFleetWorkerCallerLaunchBase {
|
|
5
5
|
launchId: string;
|
|
6
6
|
projectId: string;
|
|
7
|
+
/** The fleet worker the launch identifies, `${projectId}:${name}`: a worker holds one current launch. */
|
|
8
|
+
workerId: string;
|
|
7
9
|
}
|
|
8
10
|
/**
|
|
9
11
|
* The Codex app-server connection that created the worker's thread: a controller connection profile, or the fleet's
|
|
@@ -28,12 +30,18 @@ export interface IFleetClaudeProcess {
|
|
|
28
30
|
pid: number;
|
|
29
31
|
startTicks: string;
|
|
30
32
|
}
|
|
31
|
-
export type TFleetWorkerCallerBinding = IFleetWorkerCallerLaunchBase & {
|
|
33
|
+
export type TFleetWorkerCallerBinding = Omit<IFleetWorkerCallerLaunchBase, 'workerId'> & {
|
|
32
34
|
nativeSessionId: string;
|
|
33
35
|
expectedBindingRevision: number;
|
|
34
|
-
} & (
|
|
36
|
+
} & (
|
|
37
|
+
/**
|
|
38
|
+
* A Claude launch binds to its background job and to the job's current process; a job whose process already exited
|
|
39
|
+
* binds without one, and the next process of the same job proves itself when its bridge enrolls.
|
|
40
|
+
*/
|
|
41
|
+
{
|
|
35
42
|
harnessId: 'claude';
|
|
36
|
-
|
|
43
|
+
claudeJobId: string;
|
|
44
|
+
claudeProcess?: IFleetClaudeProcess;
|
|
37
45
|
} | {
|
|
38
46
|
harnessId: 'codex';
|
|
39
47
|
});
|
|
@@ -58,11 +66,42 @@ export interface IFleetWorkerCallerHooks {
|
|
|
58
66
|
ticketSessionId: string;
|
|
59
67
|
}>;
|
|
60
68
|
getWorkerCallerStatus(launchId: string): IWorkerCallerReadiness;
|
|
61
|
-
|
|
69
|
+
/**
|
|
70
|
+
* Revokes one launch, or the current launch of a worker, also one the controller kept from before a restart. Every
|
|
71
|
+
* reason but `generation_change` revokes it for good: its kept binding is deleted with it.
|
|
72
|
+
*/
|
|
73
|
+
revokeWorkerCaller(request: ({
|
|
62
74
|
launchId: string;
|
|
75
|
+
} | {
|
|
76
|
+
workerId: string;
|
|
77
|
+
}) & {
|
|
63
78
|
reason: 'failure' | 'stop' | 'replacement' | 'generation_change' | 'cancelled';
|
|
64
79
|
}): Promise<void>;
|
|
65
80
|
}
|
|
81
|
+
/** The background job a Claude worker's launch is bound to, as the controller asks the fleet about it. */
|
|
82
|
+
export interface IWorkerClaudeJobRequest {
|
|
83
|
+
workerId: string;
|
|
84
|
+
projectId: string;
|
|
85
|
+
nativeSessionId: string;
|
|
86
|
+
jobId: string;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* What a fresh Claude inventory shows of that job: `running` in one process, `settled` without a process, `ended` for
|
|
90
|
+
* this worker (the worker is gone or archived, continues in another session, or the session continues as another job),
|
|
91
|
+
* or `unproven` when the registry or the inventory could not be read or did not list the session once.
|
|
92
|
+
*/
|
|
93
|
+
export type TWorkerClaudeJobObservation = {
|
|
94
|
+
state: 'running';
|
|
95
|
+
process: IFleetClaudeProcess;
|
|
96
|
+
} | {
|
|
97
|
+
state: 'settled';
|
|
98
|
+
} | {
|
|
99
|
+
state: 'ended';
|
|
100
|
+
reason: string;
|
|
101
|
+
} | {
|
|
102
|
+
state: 'unproven';
|
|
103
|
+
reason: string;
|
|
104
|
+
};
|
|
66
105
|
export interface IWorkerCallerSubject {
|
|
67
106
|
kind: 'worker_launch';
|
|
68
107
|
launchId: string;
|
package/package.json
CHANGED
package/readme.md
CHANGED
|
@@ -328,6 +328,8 @@ agl proxy run codex --model <catalog-model> -- exec 'Explain this repository'
|
|
|
328
328
|
agl proxy run claude -- # Claude Code on Claude accounts
|
|
329
329
|
agl proxy run claude --provider openai --model <catalog-model> --
|
|
330
330
|
agl proxy run opencode --model <catalog-model> -- run 'Explain this repository'
|
|
331
|
+
agl proxy confined run -- docker run --rm --user "$(id -u):$(id -g)" -i <image> claude -p # Claude Code in a container
|
|
332
|
+
agl proxy confined end <run id>
|
|
331
333
|
```
|
|
332
334
|
|
|
333
335
|
Every client -- `codex`, `claude`, `opencode`, or a name of your own -- has one credential. The proxy keeps it
|
|
@@ -434,7 +436,8 @@ pool and keeps its credential. `agl proxy run claude` uses Claude accounts unles
|
|
|
434
436
|
ChatGPT models behind Claude Code; `run codex` and `run opencode` use ChatGPT accounts.
|
|
435
437
|
|
|
436
438
|
The listener binds only `127.0.0.1` and requires the exact host and port, no browser Origin, and
|
|
437
|
-
`Authorization: Bearer <credential>` (or `x-api-key`).
|
|
439
|
+
`Authorization: Bearer <credential>` (or `x-api-key`). Claude Code in a container reaches the proxy through a second
|
|
440
|
+
listener, a Unix socket that serves confined runs alone (see [Confined containers](#confined-containers)).
|
|
438
441
|
|
|
439
442
|
- A ChatGPT pool serves `/openai/v1/responses` and `/openai/v1/models` (the pooled Codex catalog in Codex's
|
|
440
443
|
own shape when Codex names its `client_version`), and `/anthropic/v1/messages` and `/anthropic/v1/models`
|
|
@@ -701,6 +704,65 @@ proxy's binding with it, and the sessions it served move at their next request.
|
|
|
701
704
|
pool, 16 requests in flight per session, 256 per client credential, 512 in all, 32 MiB per request and 8 MiB
|
|
702
705
|
per inspected response event (or non-streaming JSON response).
|
|
703
706
|
|
|
707
|
+
#### Confined containers
|
|
708
|
+
|
|
709
|
+
`agl proxy confined run` runs Claude Code in a Docker container that reaches AGL through one route only: the proxy's
|
|
710
|
+
confined listener, a Unix socket alone in a directory of its own (`agl-proxy-confined/proxy.sock` beside the proxy's
|
|
711
|
+
control socket; `agl proxy status` names it). The listener serves the Claude pool's three endpoints Claude Code uses --
|
|
712
|
+
`GET /anthropic/v1/models`, `POST /anthropic/v1/messages` and `POST /anthropic/v1/messages/count_tokens` -- exactly as
|
|
713
|
+
the loopback listener serves a Claude client, and refuses every other path, method and pool with 404 before anything is
|
|
714
|
+
read or routed; nothing else of AGL is reachable through it. It accepts confined runs' credentials alone: a request
|
|
715
|
+
without a credential, with one the proxy does not know, or with a credential of the loopback listener (any client's or
|
|
716
|
+
lease's) is refused with 401, and a confined run's credential is refused on the loopback listener alike.
|
|
717
|
+
|
|
718
|
+
```sh
|
|
719
|
+
agl proxy confined run -- docker run --rm --user "$(id -u):$(id -g)" -i <image> \
|
|
720
|
+
claude -p --model claude-opus-5-5 --output-format json < prompt.txt
|
|
721
|
+
agl proxy status # names the confined listener and lists the runs by id
|
|
722
|
+
agl proxy confined end <run id> # ends a run's credential at once
|
|
723
|
+
```
|
|
724
|
+
|
|
725
|
+
Before the container starts, the command asks the proxy for the run's credential: one for this run alone, a lease of
|
|
726
|
+
the Claude pool (the Claude accounts first, then the Anthropic API keys) whose sessions are those of the client
|
|
727
|
+
`confined`, so its requests are placed, moved and counted (token usage under `confined`) like any other Claude
|
|
728
|
+
client's. Right after `docker run` it adds the listener's directory as a read-only mount at `/run/agl-proxy` and what
|
|
729
|
+
Claude Code inside needs to reach it, each variable passed by name so the credential appears on no command line:
|
|
730
|
+
|
|
731
|
+
- `ANTHROPIC_UNIX_SOCKET=/run/agl-proxy/proxy.sock`: Claude Code sends its API requests through the socket, as plain
|
|
732
|
+
HTTP, so no relay runs in the container (Claude Code's own setting, which `claude ssh` uses; verified with Claude Code
|
|
733
|
+
2.1.288, the release of AGL's Agent SDK);
|
|
734
|
+
- `ANTHROPIC_BASE_URL=http://localhost/anthropic`: the path Claude Code puts on its requests; the host is not used;
|
|
735
|
+
- `ANTHROPIC_AUTH_TOKEN`: the run's credential;
|
|
736
|
+
- `CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY=1` and `CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1`, as `agl proxy run
|
|
737
|
+
claude` sets them.
|
|
738
|
+
|
|
739
|
+
It prints the run's id on standard error (`AGL proxy confined run <id>: …`), passes its standard input and output
|
|
740
|
+
through, and exits with the container's status. The container never receives an account token, the control socket or
|
|
741
|
+
any other part of the AGL home: the mount holds the socket alone, and the variables that would give Claude Code another
|
|
742
|
+
login or route (`CLAUDE_CODE_OAUTH_TOKEN`, `ANTHROPIC_API_KEY`, …) are removed from the environment `docker` runs with,
|
|
743
|
+
so a `-e NAME` of one of them passes nothing. What the launcher names itself after `docker run` is its own: it must not
|
|
744
|
+
set the variables above. The command takes `docker run` and `docker container run` only, with the image and its
|
|
745
|
+
command after the options.
|
|
746
|
+
|
|
747
|
+
The socket and its directory are the proxy user's alone (0600 and 0700), so the container's processes connect as that
|
|
748
|
+
user: `--user` with its uid and gid under a Docker daemon that runs as root, or the container's own root under rootless
|
|
749
|
+
Docker, which maps it to that user; another uid, or a container whose user namespace maps it elsewhere, cannot connect.
|
|
750
|
+
Root in a container of a rootful daemon connects as well while it keeps Docker's default capabilities, since
|
|
751
|
+
`CAP_DAC_OVERRIDE` passes the socket's mode (with `--cap-drop ALL` it is refused): the mode keeps the host's other users
|
|
752
|
+
out, and only the containers a run started have the mount at all. The directory, not the socket file, is mounted, so a
|
|
753
|
+
proxy restart, which replaces the socket, does not cut the container off.
|
|
754
|
+
|
|
755
|
+
The credential lives as long as the command. When the container exits the command ends it, and the proxy refuses it
|
|
756
|
+
from then on and forgets it. Like a lease it survives a restart of the proxy, which keeps only its SHA-256 digest and
|
|
757
|
+
serves it again at once while the command takes it back. `agl proxy confined end <run id>` ends it at once: requests in
|
|
758
|
+
flight end, the next one is refused, and the command stops the container (`docker run` passes its SIGTERM on) and exits
|
|
759
|
+
with the reason; it does the same when the proxy does not hand the credential back after a restart.
|
|
760
|
+
|
|
761
|
+
Downgrade: an earlier proxy refuses to start while its store keeps a confined run's credential, which its check of the
|
|
762
|
+
kept leases does not know. Let every confined run end before downgrading; if an earlier proxy's start already failed,
|
|
763
|
+
start this release once with no confined run going and wait out the 60-second reclaim window, which ends the kept
|
|
764
|
+
credential, then downgrade.
|
|
765
|
+
|
|
704
766
|
## Native Codex Harness
|
|
705
767
|
|
|
706
768
|
Choose **New → Chat session** and pick the Codex harness to use Codex inside AGL. Native threads support text and reasoning streaming, tool activity, the Codex model and reasoning-effort catalog, command and file approvals, ordinary user-input questions, interruption, history pagination, rename, archive, and deletion. AGL Ask/Yolo controls apply to the exact pending native approval request; approvals never outlive its server request.
|
|
@@ -1737,11 +1799,12 @@ superseded origins refuse preparation.
|
|
|
1737
1799
|
- Revoke on failure, stop, replacement, cancellation or controller-generation change.
|
|
1738
1800
|
Revocation fences new admissions immediately, removes credentials, and waits for already
|
|
1739
1801
|
admitted ticket requests. Native-ID uniqueness and binding revision checks fence races.
|
|
1740
|
-
Controller restart invalidates every
|
|
1741
|
-
|
|
1742
|
-
|
|
1743
|
-
|
|
1744
|
-
are
|
|
1802
|
+
Controller restart invalidates every credential. A Claude launch's binding to its job
|
|
1803
|
+
outlives it (below); a Codex launch does not, and its worker is bound again at its next
|
|
1804
|
+
steer. Every reason but a controller-generation change revokes a launch for good and
|
|
1805
|
+
deletes its kept binding. Hooks do not automatically terminate or adopt outside sessions.
|
|
1806
|
+
Revoked launch IDs stay recorded so they are never prepared again; the oldest give way
|
|
1807
|
+
once 65,536 launches are recorded.
|
|
1745
1808
|
|
|
1746
1809
|
Fleet workers use these hooks themselves, so a worker's MCP ticket writes are admitted as
|
|
1747
1810
|
that worker, not as the driver or anonymously:
|
|
@@ -1753,16 +1816,40 @@ that worker, not as the driver or anonymously:
|
|
|
1753
1816
|
the worker id), passed as `--mcp-config <file> -- <prompt>`. Claude Code saves that path and reads it
|
|
1754
1817
|
again at every wake, so the fleet rewrites it before each one; the launch ID and
|
|
1755
1818
|
generation reach only the `agl` MCP server's environment, never the Claude process's.
|
|
1756
|
-
Once the agents listing shows the job's process, the fleet binds the launch to
|
|
1757
|
-
|
|
1758
|
-
|
|
1819
|
+
Once the agents listing shows the job's process, the fleet binds the launch to the job and
|
|
1820
|
+
that process; a job that already settled after a quick turn is bound without a process. A
|
|
1821
|
+
start, wake or relaunch that fails at any step revokes its launch. Stop revokes the launch
|
|
1822
|
+
and archive also removes the overlay. A start fails closed before Claude runs when the
|
|
1823
|
+
Configuration master has no `agl` MCP server.
|
|
1759
1824
|
- Fleet Codex workers prepare the launch on the fleet's own connection before
|
|
1760
1825
|
`thread/start` and bind it before the first `turn/start`. Before steering a thread whose
|
|
1761
1826
|
launch is unbound, from an earlier connection or from before a controller restart, the
|
|
1762
1827
|
fleet loads the thread and binds a fresh launch; a refusal fails the steer undispatched.
|
|
1763
|
-
-
|
|
1764
|
-
|
|
1765
|
-
|
|
1828
|
+
- A Claude launch belongs to its background job, not to one process. Claude Code retires an
|
|
1829
|
+
idle job's process and starts a new one for the same job when someone writes to it in
|
|
1830
|
+
Claude Code; that process reads the same overlay. The controller keeps each Claude
|
|
1831
|
+
launch's binding in its store (`agl_worker_caller_bindings`, one record per worker:
|
|
1832
|
+
digests of the launch ID and generation, the job and session IDs, the binding revision, the
|
|
1833
|
+
proved process's PID, start and snapshot digest, and the approved bridge command; never a
|
|
1834
|
+
credential). When a bridge enrolls under another process than the bound one, or after a
|
|
1835
|
+
controller restart, the fleet reads a fresh Claude inventory (one read at a time) and the
|
|
1836
|
+
launch is bound to the bridge's process only when the inventory lists the worker's session,
|
|
1837
|
+
once, as the same background job in exactly that process, the process runs the approved
|
|
1838
|
+
Claude Code executable, and the bridge is its direct child running the recorded command
|
|
1839
|
+
over its own connection. A launch a restarted controller restores is proved the same way
|
|
1840
|
+
before its first write, also when its process still runs. Every other process stays
|
|
1841
|
+
unverified, and a refused bridge is not proved again at every call: for the life of that
|
|
1842
|
+
process image, or for five seconds when the job showed no process yet, the inventory could
|
|
1843
|
+
not be read, or the inventory still named another process for the job (Claude Code may just
|
|
1844
|
+
have replaced it).
|
|
1845
|
+
When the inventory shows the worker's session as another job, or the fleet no longer binds
|
|
1846
|
+
the worker to it (archived, moved to another session), the launch is revoked for good.
|
|
1847
|
+
An upgrade moves every bridge in place onto the new build (`process.execve`: the same PID and
|
|
1848
|
+
start, a new image from the new install's path), and the image it became is proved afresh:
|
|
1849
|
+
its command is the one recorded with the launch or the one the restarted controller resolves
|
|
1850
|
+
itself from its configured `agl` MCP entry, never one the bridge names, and a new command is
|
|
1851
|
+
kept with the binding's next revision. Each reason an enrollment stays unverified is written once to the controller log,
|
|
1852
|
+
naming the worker and its session, never the launch ID or a credential.
|
|
1766
1853
|
|
|
1767
1854
|
The bridge exchanges credentials only through the private controller endpoint after Linux
|
|
1768
1855
|
direct-loopback socket-inode ownership, approved executable/argv and current native
|
|
@@ -2860,6 +2947,8 @@ Backend isolation is mandatory. Proxy mode binds the controller to all interface
|
|
|
2860
2947
|
- Permission auto-accept is an explicit server policy, never an assumption based on an open browser.
|
|
2861
2948
|
- Questions are never auto-answered.
|
|
2862
2949
|
- Unknown, malformed, concurrent, or unverifiable lifecycle state fails closed.
|
|
2950
|
+
- The inference proxy's confined listener is a Unix socket of the proxy's user alone; it accepts only confined runs'
|
|
2951
|
+
credentials and serves them only the Claude pool's three Claude Code endpoints.
|
|
2863
2952
|
|
|
2864
2953
|
The global **auto-accept permissions (yolo)** setting replies once to pending permissions across registered projects and writes those replies to the audit log. Each conversation also has a run-local Ask/Yolo switch. For an active managed OpenCode root, that switch covers its currently active direct children under the same exact family authority. For an active managed Flex root, it covers admitted descendants through their exact active parent-run authority chain; a relationship alone grants nothing. Terminal children are never auto-accepted. Disabling either policy seals new automatic replies and drains already admitted replies before returning. Neither mode creates persistent broad provider grants.
|
|
2865
2954
|
|
|
@@ -2910,7 +2999,7 @@ A run that fails keeps its evidence before its root goes: when a test of the fil
|
|
|
2910
2999
|
The suite guards, end to end: opening every harness's conversation across page reloads without a harness child being replaced, recovering the Flex child after `SIGKILL` within 15 seconds, rejoining the shared Codex daemon on its own after that daemon restarts (the conversation opens and answers again within one rejoin backoff step, without **Reconnect**), starting the controller again (as the same and as the next build) with a browser resource attached to a Codex, Flex and OpenCode chat, listing a project's resources right after a browser is attached to each new chat and after a restart, the Flex model list carrying the account's current catalog, a Flex conversation answering, and opening and answering again after a restart, in a project whose id begins with `-` or `_` (the file creates projects until one does), and an `agl mcp` bridge answering tool calls from the same process after the controller moves to the next build. It is the test step of `gitzone release` (`release.preflight` in `.smartconfig.json`) and takes about eight minutes.
|
|
2911
3000
|
|
|
2912
3001
|
|
|
2913
|
-
Host prerequisites: Linux, Chrome (`google-chrome`, `chromium` or `chromium-browser`), `openssl`, `ss` (iproute2, to name the process behind a refused connection) and `codex` 0.156.0 or newer on `PATH`. Set `AGL_E2E_PACKAGE_ROOT` to another installed and built checkout, for example an earlier release, to run a scenario against it and prove it fails there:
|
|
3002
|
+
Host prerequisites: Linux, Chrome (`google-chrome`, `chromium` or `chromium-browser`), `openssl`, `ss` (iproute2, to name the process behind a refused connection) and `codex` 0.156.0 or newer on `PATH`. `e2e.proxyconfined` also runs a Docker container (a daemon this user may use and the `ubuntu:24.04` image already on the host, which the case never pulls) and skips with the missing prerequisite named without them. Set `AGL_E2E_PACKAGE_ROOT` to another installed and built checkout, for example an earlier release, to run a scenario against it and prove it fails there:
|
|
2914
3003
|
|
|
2915
3004
|
```sh
|
|
2916
3005
|
AGL_E2E_PACKAGE_ROOT=/path/to/agl-32.15.1 pnpm exec tsrepo test test/e2e/e2e.conversations.node.ts --verbose --timeout 900
|
package/ts/00_commitinfo_data.ts
CHANGED
package/ts/classes.aglhome.ts
CHANGED
|
@@ -64,6 +64,11 @@ export interface IAGLHomePaths {
|
|
|
64
64
|
proxy: string;
|
|
65
65
|
/** The running proxy's private control socket. */
|
|
66
66
|
proxySocket: string;
|
|
67
|
+
/**
|
|
68
|
+
* The proxy's confined listener: a Unix socket alone in a private directory of its own, which a confined run mounts
|
|
69
|
+
* into its container, so the container sees nothing else of AGL. Only confined credentials are accepted on it.
|
|
70
|
+
*/
|
|
71
|
+
proxyConfinedSocket: string;
|
|
67
72
|
/** The credentials the proxy keeps in files, one per client with delivery `file` (OpenCode's `{file:...}`). */
|
|
68
73
|
proxyCredentials: string;
|
|
69
74
|
/** The credential command a harness routed through the proxy runs; the proxy writes it whenever it starts. */
|
|
@@ -211,6 +216,7 @@ export const resolveAGLHomePaths = (
|
|
|
211
216
|
claudeOnChatGpt: path.join(root, 'claude-gateway'),
|
|
212
217
|
proxy: path.join(root, 'proxy'),
|
|
213
218
|
proxySocket: path.join(sockets, 'agl-proxy.sock'),
|
|
219
|
+
proxyConfinedSocket: path.join(sockets, 'agl-proxy-confined', 'proxy.sock'),
|
|
214
220
|
proxyCredentials: path.join(root, 'proxy', 'credentials'),
|
|
215
221
|
proxyCredentialHelper: path.join(root, 'proxy', 'credential-helper'),
|
|
216
222
|
migration: path.join(root, 'migration'),
|
package/ts/classes.authstore.ts
CHANGED
|
@@ -3,6 +3,7 @@ import { DriverModel } from './driver/classes.driverstore.js';
|
|
|
3
3
|
import { DirectReportModel } from './driver/classes.directreportstore.js';
|
|
4
4
|
import { SessionFeedAcknowledgementModel } from './classes.sessionfeedacknowledgements.js';
|
|
5
5
|
import { HarnessReleaseModel } from './classes.harnessreleases.js';
|
|
6
|
+
import { WorkerCallerBindingModel } from './classes.workercallerbindings.js';
|
|
6
7
|
import { FleetTicketEffectModel } from './fleet/classes.ticketeffects.js';
|
|
7
8
|
import { ControllerCodexOriginMigrationModel } from '../ts_migration/v29_codexorigins.js';
|
|
8
9
|
import { ControllerCodexConnectionStore } from './classes.codexconnectionstore.js';
|
|
@@ -781,6 +782,7 @@ const setAuthStoreModelManager = (
|
|
|
781
782
|
plugins.nosqldb.setDefaultManagerForDoc(managerArg, SessionFeedAcknowledgementModel);
|
|
782
783
|
plugins.nosqldb.setDefaultManagerForDoc(managerArg, FleetTicketEffectModel);
|
|
783
784
|
plugins.nosqldb.setDefaultManagerForDoc(managerArg, HarnessReleaseModel);
|
|
785
|
+
plugins.nosqldb.setDefaultManagerForDoc(managerArg, WorkerCallerBindingModel);
|
|
784
786
|
plugins.nosqldb.setDefaultManagerForDoc(managerArg, TicketModel);
|
|
785
787
|
plugins.nosqldb.setDefaultManagerForDoc(managerArg, TicketBoardModel);
|
|
786
788
|
plugins.nosqldb.setDefaultManagerForDoc(managerArg, TicketCommentModel);
|
|
@@ -1054,6 +1056,8 @@ export class SmartDataAuthStore implements IAuthStore, IAuthStoreSessionIdentity
|
|
|
1054
1056
|
await FleetTicketEffectModel.exact.prepare();
|
|
1055
1057
|
await HarnessReleaseModel.init();
|
|
1056
1058
|
await HarnessReleaseModel.exact.prepare();
|
|
1059
|
+
await WorkerCallerBindingModel.init();
|
|
1060
|
+
await WorkerCallerBindingModel.exact.prepare();
|
|
1057
1061
|
await TicketModel.init();
|
|
1058
1062
|
await TicketBoardModel.init();
|
|
1059
1063
|
await TicketCommentModel.init();
|
package/ts/classes.controller.ts
CHANGED
|
@@ -5,6 +5,7 @@ import { FleetDispatchError } from './fleet/interfaces.workers.js';
|
|
|
5
5
|
import type { TFleetWorkerAction, TFleetWorkerRequest } from '../ts_interfaces/fleetworkers.js';
|
|
6
6
|
import { ControllerBrowserOperationAuthority } from './classes.browseroperationauthority.js';
|
|
7
7
|
import { ControllerWorkerCallers, type IWorkerCodexCallerOrigin } from './classes.workercallers.js';
|
|
8
|
+
import { WorkerCallerBindingStore } from './classes.workercallerbindings.js';
|
|
8
9
|
import { FleetWorkerLaunches } from './fleet/classes.workerlaunches.js';
|
|
9
10
|
import { workerCallerEnrollmentToolName } from './classes.mcpworkercaller.js';
|
|
10
11
|
import { readWorkerProcessSnapshot, readWorkerUnixSocketOwner, workerSnapshotsEqual, isWorkerCallerProofRefusal, type IWorkerCallerConnection } from './functions.workerprocessproof.js';
|
|
@@ -10555,7 +10556,12 @@ export class OpenCodeController {
|
|
|
10555
10556
|
readMaster: async () => {
|
|
10556
10557
|
const resource = await configurationAuthority.getResource();
|
|
10557
10558
|
return (await configurationAuthority.getMaster({ resourceId: resource.resourceId })).master;
|
|
10558
|
-
}, captureCodexOrigin: launch => this.captureWorkerCodexOrigin(launch)
|
|
10559
|
+
}, captureCodexOrigin: launch => this.captureWorkerCodexOrigin(launch),
|
|
10560
|
+
// Claude launches keep their bindings, so a fleet worker's bridge proves itself again after this restart and
|
|
10561
|
+
// after Claude Code continued its job in another process; the fleet reads the job's inventory for that proof.
|
|
10562
|
+
bindings: new WorkerCallerBindingStore(),
|
|
10563
|
+
observeClaudeJob: async (request) => this.fleetWorkers
|
|
10564
|
+
? await this.fleetWorkers.observeCallerJob(request) : { state: 'unproven', reason: 'the fleet is not running yet' } });
|
|
10559
10565
|
this.workerCallers = workerCallers;
|
|
10560
10566
|
const mcpControllerHost = new ControllerMcpHost({
|
|
10561
10567
|
controllerPort: runtimeConfig.controllerPort,
|
|
@@ -12955,6 +12961,9 @@ export class OpenCodeController {
|
|
|
12955
12961
|
}
|
|
12956
12962
|
};
|
|
12957
12963
|
|
|
12964
|
+
// Fleet jobs prepare, bind and revoke worker launches through the caller hooks: admit none and let the running
|
|
12965
|
+
// ones settle before the hooks go, so a stop or archive meets the fleet's own refusal, never missing hooks.
|
|
12966
|
+
await stopPart(async () => { await this.fleetWorkers?.closeAdmission(); });
|
|
12958
12967
|
await stopPart(async () => {
|
|
12959
12968
|
await this.workerCallers?.close();
|
|
12960
12969
|
this.workerCallers = undefined;
|