@automatalabs/acp-agents 0.23.2 → 0.24.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/README.md +1 -1
- package/dist/acp-client.d.ts +27 -0
- package/dist/acp-client.d.ts.map +1 -1
- package/dist/acp-client.js +58 -0
- package/dist/auth/auth-profiles.d.ts +2 -1
- package/dist/auth/auth-profiles.d.ts.map +1 -1
- package/dist/auth/auth-profiles.js +2 -1
- package/dist/backend.d.ts +6 -1
- package/dist/backend.d.ts.map +1 -1
- package/dist/backends/codex.d.ts.map +1 -1
- package/dist/backends/codex.js +9 -7
- package/dist/backends/custom.d.ts.map +1 -1
- package/dist/backends/custom.js +3 -1
- package/dist/backends/opencode.d.ts.map +1 -1
- package/dist/backends/opencode.js +3 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/pool.d.ts +13 -1
- package/dist/pool.d.ts.map +1 -1
- package/dist/pool.js +29 -2
- package/dist/provider-store.d.ts +34 -0
- package/dist/provider-store.d.ts.map +1 -0
- package/dist/provider-store.js +53 -0
- package/dist/runner.d.ts +27 -3
- package/dist/runner.d.ts.map +1 -1
- package/dist/runner.js +32 -5
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -177,7 +177,7 @@ From [`src/index.ts`](./src/index.ts):
|
|
|
177
177
|
|
|
178
178
|
- **`createAcpRunner(options?)`** — factory returning an `AcpAgentRunner` (this is what `@automatalabs/workflows` injects into the engine).
|
|
179
179
|
- **`AcpAgentRunner`** — the `AgentRunner` implementation; `run(prompt, options)`, `openSession(options)`, `dispose()`, and `[Symbol.asyncDispose]()` for `await using`. The caller that constructs a runner owns its lifecycle.
|
|
180
|
-
- **Auth/provider lifecycle methods** — `describeAuthMethods()`, `completeAuth()`, `runner.auth`, `authMethods()`, `authenticate()`, `listProviders()`, `setProvider()`, `disableProvider()`, and `logout()`; see [docs/api.md](../../docs/api.md) for capability gating and installed adapter support.
|
|
180
|
+
- **Auth/provider lifecycle methods** — `describeAuthMethods()`, `completeAuth()`, `runner.auth`, `authMethods()`, `authenticate()`, `listProviders()`, `setProvider()`, `disableProvider()`, and `logout()`; see [docs/api.md](../../docs/api.md) for capability gating and installed adapter support. A successful `setProvider()` records a durable routing intent (`ProviderStore`) replayed on every fresh connection's `initialize` — provider config is in-process agent state for e.g. codex-acp, so record → recycle → replay is what makes it stick across the pool.
|
|
181
181
|
- **Session lifecycle methods** — `listSessions()`, `deleteSession()`, `loadSession()`, `resumeSession()`, and `forkSession()` for backends that advertise session persistence; see [docs/api.md](../../docs/api.md).
|
|
182
182
|
- **`InteractiveSession` / `InteractiveSessionOptions` / `InteractiveTurn`** — the held-open multi-turn session surface returned by `openSession()`.
|
|
183
183
|
- **`AcpRunnerOptions.onElicitation`** — runner-wide ACP elicitation responder; sessions can override with `InteractiveSessionOptions.onElicitation`.
|
package/dist/acp-client.d.ts
CHANGED
|
@@ -8,6 +8,7 @@ import { type ElicitationResolver, type PermissionResolver, type ToolPolicy } fr
|
|
|
8
8
|
import { UsageAccumulator } from "./usage.js";
|
|
9
9
|
import { type ClientHandlers } from "./client-handlers.js";
|
|
10
10
|
import { type AuthStore, type BackendAuthMachine, type ConnectionAuthStamp } from "./auth/auth-store.js";
|
|
11
|
+
import type { ProviderStore } from "./provider-store.js";
|
|
11
12
|
interface RawResultSuccess {
|
|
12
13
|
type: string;
|
|
13
14
|
subtype: string;
|
|
@@ -34,6 +35,7 @@ declare class SessionState {
|
|
|
34
35
|
rawResultSuccess: RawResultSuccess | undefined;
|
|
35
36
|
modes: SessionModeState | null | undefined;
|
|
36
37
|
private turnStartIndex;
|
|
38
|
+
private finalMessageStartIndex;
|
|
37
39
|
/** `label`/`runId` are carried here ONLY so the MultiplexClient can stamp them onto emitted
|
|
38
40
|
* events as context — they never affect routing or the wire request. */
|
|
39
41
|
constructor(cwd: string, policy: ToolPolicy, permissionResolver?: PermissionResolver | undefined, elicitationResolver?: ElicitationResolver | undefined, label?: string | undefined, runId?: string | undefined, modes?: SessionModeState | null, mcpServerIds?: readonly string[], retainSessionLog?: boolean);
|
|
@@ -43,6 +45,11 @@ declare class SessionState {
|
|
|
43
45
|
* growing for the lifetime of a held-open session. */
|
|
44
46
|
beginTurn(): void;
|
|
45
47
|
currentTurnText(): string;
|
|
48
|
+
/** The turn's FINAL assistant message: only the chunks streamed after the last content event
|
|
49
|
+
* that isn't an assistant message chunk (tool call, thought, plan). A backend whose schema
|
|
50
|
+
* constraint applies turn-wide (Codex) emits schema-shaped intermediate progress messages;
|
|
51
|
+
* structured extraction must read this, never the whole-turn concatenation. */
|
|
52
|
+
finalMessageText(): string;
|
|
46
53
|
applyUpdate(update: SessionNotification["update"]): void;
|
|
47
54
|
applyRawMessage(message: RawResultSuccess | undefined): void;
|
|
48
55
|
/** Settle every deferred permission still parked on this session. Used by release/cancel/death
|
|
@@ -111,6 +118,11 @@ export interface PooledConnectionDeps {
|
|
|
111
118
|
* collected `env_var` values, and carries a generation stamp the pool gates selection on.
|
|
112
119
|
* Undefined => no auth wiring, byte-identical to the pre-auth baseline (default-OFF). */
|
|
113
120
|
authStore?: AuthStore;
|
|
121
|
+
/** The runner's single provider-intent store. When present, this connection replays the recorded
|
|
122
|
+
* `providers/set` intents at the end of `initialize` (provider routing is in-process agent state
|
|
123
|
+
* for e.g. codex-acp — the same dispose-after-configure class as auth gap 3) and carries a
|
|
124
|
+
* generation stamp the pool gates selection on. Undefined or empty => byte-identical baseline. */
|
|
125
|
+
providerStore?: ProviderStore;
|
|
114
126
|
/** Client-side ACP fs/terminal handlers advertised once and routed by sessionId. */
|
|
115
127
|
clientHandlers?: ClientHandlers;
|
|
116
128
|
}
|
|
@@ -135,9 +147,14 @@ export declare class PooledConnection {
|
|
|
135
147
|
private readonly advertiseElicitation;
|
|
136
148
|
private readonly authCapabilities;
|
|
137
149
|
private readonly authStore;
|
|
150
|
+
private readonly providerStore;
|
|
138
151
|
/** Which intent-generation THIS process reflects (§2.4). Starts at -1/false so a connection with
|
|
139
152
|
* no applied intent is stale against a machine that has ever advanced past generation 0. */
|
|
140
153
|
authStamp: ConnectionAuthStamp;
|
|
154
|
+
/** Which provider-store generation THIS process replayed at initialize. Starts at 0 (== the
|
|
155
|
+
* store's empty-pool generation), so the pre-provider baseline is never stale; the first
|
|
156
|
+
* recorded intent advances the store past it and recycles older processes. */
|
|
157
|
+
providerStamp: number;
|
|
141
158
|
/** Set by the pool when a busy stale connection must be recycled once it drains (§2.6). While set,
|
|
142
159
|
* the connection is never handed a new session and is disposed-and-dropped on release. */
|
|
143
160
|
recyclePending: boolean;
|
|
@@ -206,6 +223,14 @@ export declare class PooledConnection {
|
|
|
206
223
|
* on a JSON-RPC response that will never come. */
|
|
207
224
|
race<T>(op: Promise<T>): Promise<T>;
|
|
208
225
|
private initialize;
|
|
226
|
+
/** Replay the recorded `providers/set` intents at the end of `initialize`, then stamp the
|
|
227
|
+
* generation this process reflects. Advertise-gated: an agent that does not advertise the
|
|
228
|
+
* unstable providers block gets no replay (an intent can only have been recorded against an
|
|
229
|
+
* advertising agent, so a skip here means the agent surface changed under us — the stamp still
|
|
230
|
+
* marks this process current because no better state is reachable). A replay FAILURE throws,
|
|
231
|
+
* failing the connection loudly: silently opening sessions without the host-configured gateway
|
|
232
|
+
* routing would mis-route traffic. */
|
|
233
|
+
private applyProviderIntents;
|
|
209
234
|
/**
|
|
210
235
|
* Open a new per-agent session on this pooled connection: session/new { cwd }, register its
|
|
211
236
|
* accumulator for routing, and return a SessionHandle. `activeSessions` is reserved
|
|
@@ -335,6 +360,8 @@ export declare class SessionHandle implements StructuredSource {
|
|
|
335
360
|
prompt(content: string | ContentBlock[], promptMeta?: Record<string, unknown>): Promise<PromptResponse>;
|
|
336
361
|
/** StructuredSource — the latest turn's assistant text. */
|
|
337
362
|
currentTurnText(): string;
|
|
363
|
+
/** StructuredSource — the latest turn's FINAL assistant message (see SessionState). */
|
|
364
|
+
finalMessageText(): string;
|
|
338
365
|
/** StructuredSource — Claude's raw structured_output for the latest turn, if any. */
|
|
339
366
|
rawStructuredOutput(): unknown;
|
|
340
367
|
/** Best-effort ACP cancel (wired to opts.signal). The agent settles the turn as "cancelled". */
|
package/dist/acp-client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"acp-client.d.ts","sourceRoot":"","sources":["../src/acp-client.ts"],"names":[],"mappings":"AAwBA,OAAO,EAOL,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,EACzB,KAAK,UAAU,EAQf,KAAK,yBAAyB,EAC9B,KAAK,YAAY,EACjB,KAAK,uBAAuB,EAC5B,KAAK,+BAA+B,EACpC,KAAK,kBAAkB,EACvB,KAAK,0BAA0B,EAC/B,KAAK,6BAA6B,EAGlC,KAAK,oBAAoB,EAEzB,KAAK,sBAAsB,EAC3B,KAAK,uBAAuB,EAK5B,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,EACzB,KAAK,oBAAoB,EACzB,KAAK,qBAAqB,EAG1B,KAAK,aAAa,EAClB,KAAK,cAAc,EAMnB,KAAK,aAAa,EAClB,KAAK,cAAc,EAMnB,KAAK,yBAAyB,EAG9B,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,EAGxB,KAAK,gBAAgB,EACrB,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,EACxB,KAAK,6BAA6B,EAClC,KAAK,8BAA8B,EACnC,KAAK,qBAAqB,EAC1B,KAAK,sBAAsB,EAO5B,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAIL,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACrB,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACzE,OAAO,EAQL,KAAK,sBAAsB,EAC5B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAA2C,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AACzF,OAAO,EAEL,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EACvB,KAAK,UAAU,EAChB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAIL,KAAK,cAAc,EAEpB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAEL,KAAK,SAAS,EACd,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,EACzB,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"acp-client.d.ts","sourceRoot":"","sources":["../src/acp-client.ts"],"names":[],"mappings":"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"}
|
package/dist/acp-client.js
CHANGED
|
@@ -76,6 +76,7 @@ class SessionState {
|
|
|
76
76
|
rawResultSuccess;
|
|
77
77
|
modes;
|
|
78
78
|
turnStartIndex = 0;
|
|
79
|
+
finalMessageStartIndex = 0;
|
|
79
80
|
/** `label`/`runId` are carried here ONLY so the MultiplexClient can stamp them onto emitted
|
|
80
81
|
* events as context — they never affect routing or the wire request. */
|
|
81
82
|
constructor(cwd, policy, permissionResolver, elicitationResolver, label, runId, modes, mcpServerIds = [], retainSessionLog = true) {
|
|
@@ -102,11 +103,19 @@ class SessionState {
|
|
|
102
103
|
this.history.length = 0;
|
|
103
104
|
this.turnStartIndex = 0;
|
|
104
105
|
}
|
|
106
|
+
this.finalMessageStartIndex = this.turnStartIndex;
|
|
105
107
|
this.rawResultSuccess = undefined;
|
|
106
108
|
}
|
|
107
109
|
currentTurnText() {
|
|
108
110
|
return this.textChunks.slice(this.turnStartIndex).join("");
|
|
109
111
|
}
|
|
112
|
+
/** The turn's FINAL assistant message: only the chunks streamed after the last content event
|
|
113
|
+
* that isn't an assistant message chunk (tool call, thought, plan). A backend whose schema
|
|
114
|
+
* constraint applies turn-wide (Codex) emits schema-shaped intermediate progress messages;
|
|
115
|
+
* structured extraction must read this, never the whole-turn concatenation. */
|
|
116
|
+
finalMessageText() {
|
|
117
|
+
return this.textChunks.slice(this.finalMessageStartIndex).join("");
|
|
118
|
+
}
|
|
110
119
|
applyUpdate(update) {
|
|
111
120
|
switch (update.sessionUpdate) {
|
|
112
121
|
case "agent_message_chunk": {
|
|
@@ -122,6 +131,7 @@ class SessionState {
|
|
|
122
131
|
break;
|
|
123
132
|
}
|
|
124
133
|
case "tool_call": {
|
|
134
|
+
this.finalMessageStartIndex = this.textChunks.length;
|
|
125
135
|
this.history.push({
|
|
126
136
|
role: "tool",
|
|
127
137
|
kind: "toolCall",
|
|
@@ -131,6 +141,15 @@ class SessionState {
|
|
|
131
141
|
});
|
|
132
142
|
break;
|
|
133
143
|
}
|
|
144
|
+
// Any other CONTENT event also ends the in-flight assistant message — text streamed after
|
|
145
|
+
// it belongs to a new message. Bookkeeping updates (usage, mode) never break a message.
|
|
146
|
+
case "user_message_chunk":
|
|
147
|
+
case "agent_thought_chunk":
|
|
148
|
+
case "tool_call_update":
|
|
149
|
+
case "plan": {
|
|
150
|
+
this.finalMessageStartIndex = this.textChunks.length;
|
|
151
|
+
break;
|
|
152
|
+
}
|
|
134
153
|
case "usage_update": {
|
|
135
154
|
this.usage.recordCost(update.cost);
|
|
136
155
|
// Also feed the context token counts so AgentUsage.total is non-zero for backends
|
|
@@ -647,9 +666,14 @@ export class PooledConnection {
|
|
|
647
666
|
advertiseElicitation;
|
|
648
667
|
authCapabilities;
|
|
649
668
|
authStore;
|
|
669
|
+
providerStore;
|
|
650
670
|
/** Which intent-generation THIS process reflects (§2.4). Starts at -1/false so a connection with
|
|
651
671
|
* no applied intent is stale against a machine that has ever advanced past generation 0. */
|
|
652
672
|
authStamp = { appliedGeneration: -1, applied: false, trippedAuthRequired: false };
|
|
673
|
+
/** Which provider-store generation THIS process replayed at initialize. Starts at 0 (== the
|
|
674
|
+
* store's empty-pool generation), so the pre-provider baseline is never stale; the first
|
|
675
|
+
* recorded intent advances the store past it and recycles older processes. */
|
|
676
|
+
providerStamp = 0;
|
|
653
677
|
/** Set by the pool when a busy stale connection must be recycled once it drains (§2.6). While set,
|
|
654
678
|
* the connection is never handed a new session and is disposed-and-dropped on release. */
|
|
655
679
|
recyclePending = false;
|
|
@@ -675,6 +699,7 @@ export class PooledConnection {
|
|
|
675
699
|
this.advertiseElicitation = deps.advertiseElicitation ?? Boolean(deps.elicitationResolver);
|
|
676
700
|
this.authCapabilities = deps.authCapabilities;
|
|
677
701
|
this.authStore = deps.authStore;
|
|
702
|
+
this.providerStore = deps.providerStore;
|
|
678
703
|
this.client = new MultiplexClient(this.backendId, this.onEvent, deps.clientHandlers, deps.permissionResolver, deps.elicitationResolver);
|
|
679
704
|
const { command, args, env } = backend.spawnConfig();
|
|
680
705
|
// Spawn-env auth overlay (§2.8): host-collected `env_var` values (and, for a profiled backend,
|
|
@@ -988,11 +1013,40 @@ export class PooledConnection {
|
|
|
988
1013
|
machine.send({ t: "initialize_ok", connectionId: this.id, advertised: negotiated.authMethods });
|
|
989
1014
|
await this.applyAuthIntent(machine);
|
|
990
1015
|
}
|
|
1016
|
+
// Replay recorded provider-routing intents (the providers/* sibling of the auth replay
|
|
1017
|
+
// above): provider config is in-process agent state for e.g. codex-acp, so every fresh
|
|
1018
|
+
// process must be re-routed here or its sessions would silently run on default routing.
|
|
1019
|
+
await this.applyProviderIntents();
|
|
991
1020
|
}
|
|
992
1021
|
finally {
|
|
993
1022
|
clearTimeout(timer);
|
|
994
1023
|
}
|
|
995
1024
|
}
|
|
1025
|
+
/** Replay the recorded `providers/set` intents at the end of `initialize`, then stamp the
|
|
1026
|
+
* generation this process reflects. Advertise-gated: an agent that does not advertise the
|
|
1027
|
+
* unstable providers block gets no replay (an intent can only have been recorded against an
|
|
1028
|
+
* advertising agent, so a skip here means the agent surface changed under us — the stamp still
|
|
1029
|
+
* marks this process current because no better state is reachable). A replay FAILURE throws,
|
|
1030
|
+
* failing the connection loudly: silently opening sessions without the host-configured gateway
|
|
1031
|
+
* routing would mis-route traffic. */
|
|
1032
|
+
async applyProviderIntents() {
|
|
1033
|
+
const store = this.providerStore;
|
|
1034
|
+
if (!store)
|
|
1035
|
+
return;
|
|
1036
|
+
const poolKey = this.backend.poolKey ?? this.backend.id;
|
|
1037
|
+
const generation = store.generation(poolKey);
|
|
1038
|
+
if (this.negotiated?.supportsProviders === true) {
|
|
1039
|
+
for (const intent of store.intentsFor(poolKey)) {
|
|
1040
|
+
await this.rawAgentRequest(AGENT_METHODS.providers_set, {
|
|
1041
|
+
providerId: intent.providerId,
|
|
1042
|
+
apiType: intent.apiType,
|
|
1043
|
+
baseUrl: intent.baseUrl,
|
|
1044
|
+
...(intent.headers ? { headers: intent.headers } : {}),
|
|
1045
|
+
});
|
|
1046
|
+
}
|
|
1047
|
+
}
|
|
1048
|
+
this.providerStamp = generation;
|
|
1049
|
+
}
|
|
996
1050
|
/**
|
|
997
1051
|
* Open a new per-agent session on this pooled connection: session/new { cwd }, register its
|
|
998
1052
|
* accumulator for routing, and return a SessionHandle. `activeSessions` is reserved
|
|
@@ -1528,6 +1582,10 @@ export class SessionHandle {
|
|
|
1528
1582
|
currentTurnText() {
|
|
1529
1583
|
return this.state.currentTurnText();
|
|
1530
1584
|
}
|
|
1585
|
+
/** StructuredSource — the latest turn's FINAL assistant message (see SessionState). */
|
|
1586
|
+
finalMessageText() {
|
|
1587
|
+
return this.state.finalMessageText();
|
|
1588
|
+
}
|
|
1531
1589
|
/** StructuredSource — Claude's raw structured_output for the latest turn, if any. */
|
|
1532
1590
|
rawStructuredOutput() {
|
|
1533
1591
|
return this.state.rawResultSuccess?.structured_output;
|
|
@@ -47,7 +47,8 @@ export interface AuthProfile {
|
|
|
47
47
|
* unchanged. No `spawnAuthEnv` — Claude has no `DEFAULT_AUTH_REQUEST`-style pre-auth channel and is
|
|
48
48
|
* consumed client-side only (§3.2 spawn-time). */
|
|
49
49
|
export declare const claudeAuthProfile: AuthProfile;
|
|
50
|
-
/** Codex — `@automatalabs/codex-acp
|
|
50
|
+
/** Codex — `@automatalabs/codex-acp`, our fork (§3.3; the spec heading tracks the installed
|
|
51
|
+
* version). Advertises no `terminal` method (its
|
|
51
52
|
* `api-key` reads env internally and `chat-gpt`/`gateway` are `agent`-type), so terminal is always
|
|
52
53
|
* false; `gateway` follows an `onAuth` resolver. The `spawnAuthEnv` lever emits `DEFAULT_AUTH_REQUEST`
|
|
53
54
|
* for `api-key`/`gateway` intents so a freshly recycled process pre-authenticates before its first
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth-profiles.d.ts","sourceRoot":"","sources":["../../src/auth/auth-profiles.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AACrE,OAAO,KAAK,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAC5E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAElD;gDACgD;AAChD,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;qFAEqF;AACrF,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B;;4FAEwF;IACxF,sBAAsB,CAAC,IAAI,EAAE;QAAE,MAAM,EAAE,OAAO,CAAC;QAAC,QAAQ,EAAE,OAAO,CAAA;KAAE,GAAG,uBAAuB,CAAC,MAAM,CAAC,CAAC;IACtG;;2CAEuC;IACvC,QAAQ,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,oBAAoB,GAAG,oBAAoB,CAAC;IAC/E,mFAAmF;IACnF,cAAc,CAAC,CAAC,MAAM,EAAE,OAAO,CAAC,UAAU,EAAE;QAAE,IAAI,EAAE,UAAU,CAAA;KAAE,CAAC,GAAG,cAAc,CAAC;IACnF,2FAA2F;IAC3F,SAAS,CAAC,CAAC,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,CAAC,cAAc,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClH;;kBAEc;IACd,YAAY,CAAC,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;CACvE;AAED;;;;;;mDAMmD;AACnD,eAAO,MAAM,iBAAiB,EAAE,WAK/B,CAAC;AAEF
|
|
1
|
+
{"version":3,"file":"auth-profiles.d.ts","sourceRoot":"","sources":["../../src/auth/auth-profiles.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AACrE,OAAO,KAAK,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAC5E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAElD;gDACgD;AAChD,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;qFAEqF;AACrF,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B;;4FAEwF;IACxF,sBAAsB,CAAC,IAAI,EAAE;QAAE,MAAM,EAAE,OAAO,CAAC;QAAC,QAAQ,EAAE,OAAO,CAAA;KAAE,GAAG,uBAAuB,CAAC,MAAM,CAAC,CAAC;IACtG;;2CAEuC;IACvC,QAAQ,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,oBAAoB,GAAG,oBAAoB,CAAC;IAC/E,mFAAmF;IACnF,cAAc,CAAC,CAAC,MAAM,EAAE,OAAO,CAAC,UAAU,EAAE;QAAE,IAAI,EAAE,UAAU,CAAA;KAAE,CAAC,GAAG,cAAc,CAAC;IACnF,2FAA2F;IAC3F,SAAS,CAAC,CAAC,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,CAAC,cAAc,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClH;;kBAEc;IACd,YAAY,CAAC,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;CACvE;AAED;;;;;;mDAMmD;AACnD,eAAO,MAAM,iBAAiB,EAAE,WAK/B,CAAC;AAEF;;;;;;4CAM4C;AAC5C,eAAO,MAAM,gBAAgB,EAAE,WAc9B,CAAC;AAEF;;;;0EAI0E;AAC1E,eAAO,MAAM,mBAAmB,EAAE,WAIjC,CAAC"}
|
|
@@ -11,7 +11,8 @@ export const claudeAuthProfile = {
|
|
|
11
11
|
describe: (_method, base) => base,
|
|
12
12
|
buildMeta: (_method, resolution) => resolution.meta,
|
|
13
13
|
};
|
|
14
|
-
/** Codex — `@automatalabs/codex-acp
|
|
14
|
+
/** Codex — `@automatalabs/codex-acp`, our fork (§3.3; the spec heading tracks the installed
|
|
15
|
+
* version). Advertises no `terminal` method (its
|
|
15
16
|
* `api-key` reads env internally and `chat-gpt`/`gateway` are `agent`-type), so terminal is always
|
|
16
17
|
* false; `gateway` follows an `onAuth` resolver. The `spawnAuthEnv` lever emits `DEFAULT_AUTH_REQUEST`
|
|
17
18
|
* for `api-key`/`gateway` intents so a freshly recycled process pre-authenticates before its first
|
package/dist/backend.d.ts
CHANGED
|
@@ -12,8 +12,13 @@ export interface SpawnConfig {
|
|
|
12
12
|
}
|
|
13
13
|
/** The slice of an active session a Backend reads to extract the native structured result. */
|
|
14
14
|
export interface StructuredSource {
|
|
15
|
-
/** The latest turn's accumulated assistant text. */
|
|
15
|
+
/** The latest turn's accumulated assistant text (every message in the turn, concatenated). */
|
|
16
16
|
currentTurnText(): string;
|
|
17
|
+
/** The latest turn's FINAL assistant message only: the text streamed after the last
|
|
18
|
+
* tool/thought/plan event. Schema backends read this, never currentTurnText() — agents that
|
|
19
|
+
* constrain sampling turn-wide (Codex) emit schema-shaped JSON for intermediate progress
|
|
20
|
+
* messages too, and a first-JSON scan over the whole turn returns the wrong object. */
|
|
21
|
+
finalMessageText(): string;
|
|
17
22
|
/** Claude only: `structured_output` from the latest `type:"result", subtype:"success"` raw message. */
|
|
18
23
|
rawStructuredOutput(): unknown;
|
|
19
24
|
}
|
package/dist/backend.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"backend.d.ts","sourceRoot":"","sources":["../src/backend.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAE3D,wFAAwF;AACxF,MAAM,MAAM,gBAAgB,GAAG,QAAQ,GAAG,OAAO,GAAG,UAAU,CAAC;AAC/D;sFACsF;AACtF,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC;AAE/B,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC;CACxB;AAED,8FAA8F;AAC9F,MAAM,WAAW,gBAAgB;IAC/B,
|
|
1
|
+
{"version":3,"file":"backend.d.ts","sourceRoot":"","sources":["../src/backend.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAE3D,wFAAwF;AACxF,MAAM,MAAM,gBAAgB,GAAG,QAAQ,GAAG,OAAO,GAAG,UAAU,CAAC;AAC/D;sFACsF;AACtF,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC;AAE/B,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC;CACxB;AAED,8FAA8F;AAC9F,MAAM,WAAW,gBAAgB;IAC/B,8FAA8F;IAC9F,eAAe,IAAI,MAAM,CAAC;IAC1B;;;4FAGwF;IACxF,gBAAgB,IAAI,MAAM,CAAC;IAC3B,uGAAuG;IACvG,mBAAmB,IAAI,OAAO,CAAC;CAChC;AAED;+EAC+E;AAC/E,MAAM,WAAW,iBAAiB;IAChC,yFAAyF;IACzF,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,sFAAsF;IACtF,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAChC;AAED,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,EAAE,EAAE,SAAS,CAAC;IACvB;;;0EAGsE;IACtE,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B;;oCAEgC;IAChC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,OAAO,CAAC;IACvC;;;;kGAI8F;IAC9F,QAAQ,CAAC,mBAAmB,CAAC,EAAE,OAAO,CAAC;IACvC;;qFAEiF;IACjF,QAAQ,CAAC,0BAA0B,CAAC,EAAE,OAAO,CAAC;IAC9C;;sFAEkF;IAClF,QAAQ,CAAC,kBAAkB,CAAC,EAAE;QAAE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,CAAA;KAAE,CAAC;IACpG;;;;6EAIyE;IACzE,QAAQ,CAAC,WAAW,CAAC,EAAE,WAAW,CAAC;IACnC,0DAA0D;IAC1D,WAAW,IAAI,WAAW,CAAC;IAC3B;;sEAEkE;IAClE,mBAAmB,CAAC,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;IAC5D;;;mGAG+F;IAC/F,WAAW,CAAC,MAAM,EAAE,OAAO,GAAG,SAAS,EAAE,MAAM,CAAC,EAAE,iBAAiB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;IAC1G,kGAAkG;IAClG,UAAU,CAAC,MAAM,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;IAC7E,oGAAoG;IACpG,gBAAgB,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC;CACrD;AAED,6FAA6F;AAC7F,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,EAAE,CAE7D"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codex.d.ts","sourceRoot":"","sources":["../../src/backends/codex.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"codex.d.ts","sourceRoot":"","sources":["../../src/backends/codex.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAEvC,OAAO,KAAK,EAAE,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAS/F,qBAAa,YAAa,YAAW,OAAO;IAC1C,QAAQ,CAAC,EAAE,EAAG,OAAO,CAAU;IAC/B;8EAC0E;IAC1E,QAAQ,CAAC,WAAW,iDAAoB;IACxC,QAAQ,CAAC,kBAAkB;;;MAGhB;IAEX,WAAW,IAAI,WAAW;IAe1B,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,SAAS,EAAE,MAAM,CAAC,EAAE,iBAAiB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS;IAY1G,UAAU,CAAC,MAAM,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS;IAK5E,gBAAgB,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO;CAMpD"}
|
package/dist/backends/codex.js
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
// CodexBackend — drives the installed npm dep @automatalabs/codex-acp, a published fork of
|
|
2
2
|
// @agentclientprotocol/codex-acp that bakes in the outputSchema patch. The patch forwards
|
|
3
3
|
// request._meta["outputSchema"] into the Codex App Server's turn/start.outputSchema,
|
|
4
|
-
// which the shipped @openai/codex binary honors
|
|
5
|
-
//
|
|
6
|
-
//
|
|
7
|
-
//
|
|
8
|
-
// reads the final
|
|
4
|
+
// which the shipped @openai/codex binary honors as an OpenAI Responses-API STRICT constraint —
|
|
5
|
+
// applied to EVERY sampled assistant message in the turn (field-verified), not only the last:
|
|
6
|
+
// intermediate progress messages between tool calls come back schema-shaped too. So the schema
|
|
7
|
+
// rides per-PROMPT `_meta` (not session/new), normalized to OpenAI strict rules first, and
|
|
8
|
+
// extraction reads ONLY the turn's final assistant message off the normal agent-message stream —
|
|
9
|
+
// a whole-turn scan would pick up a progress object instead of the result.
|
|
9
10
|
import { createRequire } from "node:module";
|
|
10
11
|
import { CODEX_CUSTOM_CAPABILITY_NAMESPACE, CODEX_META_KEYS, META_KEYS } from "@automatalabs/shared-types";
|
|
11
12
|
import { splitArgs } from "../backend.js";
|
|
@@ -56,7 +57,8 @@ export class CodexBackend {
|
|
|
56
57
|
}
|
|
57
58
|
nativeStructured(source) {
|
|
58
59
|
// The constrained final message is pure JSON; parse it directly, with a balanced-block
|
|
59
|
-
// fallback if the
|
|
60
|
-
|
|
60
|
+
// fallback if the message also carried leading prose. Final message ONLY — the turn-wide
|
|
61
|
+
// constraint makes intermediate progress messages schema-shaped as well.
|
|
62
|
+
return parseFinalJson(source.finalMessageText());
|
|
61
63
|
}
|
|
62
64
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"custom.d.ts","sourceRoot":"","sources":["../../src/backends/custom.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAEvC,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAC5E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAIxD,qBAAa,gBAAiB,YAAW,OAAO;IAalC,OAAO,CAAC,QAAQ,CAAC,MAAM;IAZnC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,mBAAmB,QAAQ;IACpC;mGAC+F;IAC/F,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB;;oFAEgF;IAChF,QAAQ,CAAC,mBAAmB,QAAQ;IACpC,QAAQ,CAAC,0BAA0B,EAAE,OAAO,CAAC;IAC7C,QAAQ,CAAC,kBAAkB,CAAC,EAAE,WAAW,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC,CAAC;gBAE5C,MAAM,EAAE,iBAAiB;IAYtD,WAAW,IAAI,WAAW;IAS1B,mBAAmB,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS;IAQ1D,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS;IAM9E,UAAU,CAAC,MAAM,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS;IAQ5E,gBAAgB,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO;
|
|
1
|
+
{"version":3,"file":"custom.d.ts","sourceRoot":"","sources":["../../src/backends/custom.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAEvC,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAC5E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAIxD,qBAAa,gBAAiB,YAAW,OAAO;IAalC,OAAO,CAAC,QAAQ,CAAC,MAAM;IAZnC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,mBAAmB,QAAQ;IACpC;mGAC+F;IAC/F,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB;;oFAEgF;IAChF,QAAQ,CAAC,mBAAmB,QAAQ;IACpC,QAAQ,CAAC,0BAA0B,EAAE,OAAO,CAAC;IAC7C,QAAQ,CAAC,kBAAkB,CAAC,EAAE,WAAW,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC,CAAC;gBAE5C,MAAM,EAAE,iBAAiB;IAYtD,WAAW,IAAI,WAAW;IAS1B,mBAAmB,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS;IAQ1D,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS;IAM9E,UAAU,CAAC,MAAM,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS;IAQ5E,gBAAgB,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO;CAKpD"}
|
package/dist/backends/custom.js
CHANGED
|
@@ -73,6 +73,8 @@ export class CustomAcpBackend {
|
|
|
73
73
|
return { [META_KEYS.outputSchema]: toJsonSchema(schema) };
|
|
74
74
|
}
|
|
75
75
|
nativeStructured(source) {
|
|
76
|
-
|
|
76
|
+
// Final assistant message only — never the whole-turn concatenation (a schema-shaped
|
|
77
|
+
// progress message earlier in the turn must not win over the result).
|
|
78
|
+
return parseFinalJson(source.finalMessageText());
|
|
77
79
|
}
|
|
78
80
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"opencode.d.ts","sourceRoot":"","sources":["../../src/backends/opencode.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAEvC,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAQ5E,qBAAa,eAAgB,YAAW,OAAO;IAC7C,QAAQ,CAAC,EAAE,EAAG,UAAU,CAAU;IAClC,gGAAgG;IAChG,QAAQ,CAAC,WAAW,iDAAuB;IAC3C,QAAQ,CAAC,mBAAmB,QAAQ;IACpC,QAAQ,CAAC,mBAAmB,QAAQ;IACpC,QAAQ,CAAC,0BAA0B,QAAQ;IAE3C,WAAW,IAAI,WAAW;IAW1B,WAAW,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS;IAKlD,UAAU,CAAC,MAAM,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS;IAO5E,gBAAgB,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO;
|
|
1
|
+
{"version":3,"file":"opencode.d.ts","sourceRoot":"","sources":["../../src/backends/opencode.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAEvC,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAQ5E,qBAAa,eAAgB,YAAW,OAAO;IAC7C,QAAQ,CAAC,EAAE,EAAG,UAAU,CAAU;IAClC,gGAAgG;IAChG,QAAQ,CAAC,WAAW,iDAAuB;IAC3C,QAAQ,CAAC,mBAAmB,QAAQ;IACpC,QAAQ,CAAC,mBAAmB,QAAQ;IACpC,QAAQ,CAAC,0BAA0B,QAAQ;IAE3C,WAAW,IAAI,WAAW;IAW1B,WAAW,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS;IAKlD,UAAU,CAAC,MAAM,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS;IAO5E,gBAAgB,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO;CAKpD"}
|
|
@@ -38,7 +38,9 @@ export class OpenCodeBackend {
|
|
|
38
38
|
return { [META_KEYS.outputSchema]: toJsonSchema(schema) };
|
|
39
39
|
}
|
|
40
40
|
nativeStructured(source) {
|
|
41
|
-
|
|
41
|
+
// Final assistant message only — never the whole-turn concatenation (a schema-shaped
|
|
42
|
+
// progress message earlier in the turn must not win over the result).
|
|
43
|
+
return parseFinalJson(source.finalMessageText());
|
|
42
44
|
}
|
|
43
45
|
}
|
|
44
46
|
function resolveOpenCodePackageBin() {
|
package/dist/index.d.ts
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
export { AcpAgentRunner, createAcpRunner, selectBackend } from "./runner.js";
|
|
2
|
-
export type { AcpRunnerOptions, AuthenticateOptions, AuthMethodsOptions, AuthCapableRunner, AuthController, AuthOutcome, AuthStatusSnapshot, CompleteAuthOptions, DisableProviderOptions, DeleteSessionOptions, ListProvidersOptions, ListSessionsOptions, LogoutOptions, ReattachSessionOptions, SetProviderOptions, } from "./runner.js";
|
|
2
|
+
export type { AcpRunnerOptions, AuthenticateOptions, AuthMethodsOptions, AuthCapableRunner, AuthController, AuthOutcome, AuthStatusSnapshot, CompleteAuthOptions, DisableProviderOptions, DeleteSessionOptions, ListProvidersOptions, ListSessionsOptions, LogoutOptions, ProviderCapableRunner, ReattachSessionOptions, SetProviderOptions, } from "./runner.js";
|
|
3
3
|
export { buildAuthDescriptor, buildAuthDescriptors, isGatewayShapedMeta } from "./auth/auth-types.js";
|
|
4
4
|
export type { AuthContext, AuthMethodDescriptor, AuthResolution, AuthResolver } from "./auth/auth-types.js";
|
|
5
5
|
export { AuthStore, BackendAuthMachine, classifyCredential, redactSecrets, } from "./auth/auth-store.js";
|
|
6
6
|
export type { AuthEvent, AuthIntent, AuthMethodType, BackendAuthState, ConnectionAuthStamp, CredentialClass, RedactedIntent, } from "./auth/auth-store.js";
|
|
7
|
+
export { ProviderStore } from "./provider-store.js";
|
|
8
|
+
export type { ProviderIntent } from "./provider-store.js";
|
|
7
9
|
export { claudeAuthProfile, codexAuthProfile, opencodeAuthProfile } from "./auth/auth-profiles.js";
|
|
8
10
|
export type { AuthProfile, TerminalLaunch } from "./auth/auth-profiles.js";
|
|
9
11
|
export { InteractiveSession } from "./interactive.js";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC7E,YAAY,EACV,gBAAgB,EAChB,mBAAmB,EACnB,kBAAkB,EAClB,iBAAiB,EACjB,cAAc,EACd,WAAW,EACX,kBAAkB,EAClB,mBAAmB,EACnB,sBAAsB,EACtB,oBAAoB,EACpB,oBAAoB,EACpB,mBAAmB,EACnB,aAAa,EACb,sBAAsB,EACtB,kBAAkB,GACnB,MAAM,aAAa,CAAC;AAGrB,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AACtG,YAAY,EAAE,WAAW,EAAE,oBAAoB,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAC5G,OAAO,EACL,SAAS,EACT,kBAAkB,EAClB,kBAAkB,EAClB,aAAa,GACd,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EACV,SAAS,EACT,UAAU,EACV,cAAc,EACd,gBAAgB,EAChB,mBAAmB,EACnB,eAAe,EACf,cAAc,GACf,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AACnG,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,YAAY,EAAE,yBAAyB,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAEnF,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AACzE,YAAY,EACV,uBAAuB,EACvB,+BAA+B,EAC/B,qBAAqB,EACrB,kBAAkB,EAClB,0BAA0B,EAC1B,6BAA6B,EAC7B,gBAAgB,EAChB,UAAU,EACV,mBAAmB,EACnB,oBAAoB,EACpB,UAAU,EACV,eAAe,EACf,gBAAgB,EAChB,YAAY,EACZ,kBAAkB,EAClB,sBAAsB,EACtB,uBAAuB,EACvB,+BAA+B,EAC/B,iBAAiB,EACjB,kBAAkB,EAClB,wBAAwB,EACxB,yBAAyB,EACzB,oBAAoB,EACpB,qBAAqB,EACrB,oBAAoB,EACpB,qBAAqB,EACrB,uBAAuB,EACvB,uBAAuB,EACvB,uBAAuB,EACvB,2BAA2B,EAC3B,mBAAmB,EACnB,aAAa,EACb,yBAAyB,EACzB,uBAAuB,EACvB,iBAAiB,EACjB,qBAAqB,EACrB,uBAAuB,EACvB,0BAA0B,EAC1B,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACpB,qBAAqB,EACrB,mBAAmB,EACnB,oBAAoB,EACpB,WAAW,EACX,kBAAkB,EAClB,mBAAmB,EACnB,kBAAkB,EAClB,aAAa,EACb,cAAc,EACd,eAAe,EACf,YAAY,EACZ,cAAc,EACd,sBAAsB,EACtB,iBAAiB,EACjB,kBAAkB,EAClB,oBAAoB,EACpB,qBAAqB,EACrB,qBAAqB,EACrB,UAAU,EACV,YAAY,EACZ,qBAAqB,EACrB,WAAW,EACX,gBAAgB,EAChB,WAAW,EACX,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,0BAA0B,CAAC;AAGlC,OAAO,EAAE,YAAY,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AAC9F,YAAY,EAAE,eAAe,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAE7F,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAClE,YAAY,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAE/E,OAAO,EACL,qBAAqB,EACrB,gCAAgC,EAChC,oBAAoB,EACpB,yBAAyB,EACzB,gBAAgB,EAChB,sBAAsB,EACtB,oBAAoB,EACpB,yBAAyB,EACzB,yBAAyB,GAC1B,MAAM,wBAAwB,CAAC;AAChC,YAAY,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAI3G,OAAO,EACL,sBAAsB,EACtB,kBAAkB,EAClB,cAAc,EACd,0BAA0B,EAC1B,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC1D,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAI7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,YAAY,EACV,iBAAiB,EACjB,uBAAuB,EACvB,cAAc,EACd,UAAU,EACV,WAAW,EACX,gBAAgB,GACjB,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EAAE,6BAA6B,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAClG,YAAY,EACV,iBAAiB,EACjB,YAAY,EACZ,gBAAgB,EAChB,eAAe,EACf,YAAY,EACZ,gBAAgB,EAChB,aAAa,EACb,2BAA2B,EAC3B,mBAAmB,EACnB,0BAA0B,EAC1B,yBAAyB,EACzB,kBAAkB,EAClB,kBAAkB,EAClB,oBAAoB,GACrB,MAAM,aAAa,CAAC;AAErB,YAAY,EACV,OAAO,EACP,SAAS,EACT,gBAAgB,EAChB,iBAAiB,EACjB,WAAW,EACX,gBAAgB,GACjB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAExD,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpF,YAAY,EACV,mBAAmB,EACnB,iBAAiB,EACjB,oBAAoB,EACpB,kBAAkB,EAClB,UAAU,GACX,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAE9C,YAAY,EAAE,eAAe,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAEvG,OAAO,EAAE,qBAAqB,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAE7F,OAAO,EACL,gBAAgB,EAChB,aAAa,EACb,cAAc,EACd,uBAAuB,EACvB,aAAa,GACd,MAAM,wBAAwB,CAAC;AAChC,YAAY,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAEhF,OAAO,EAAE,4BAA4B,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAC1F,YAAY,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -8,6 +8,9 @@ export { AcpAgentRunner, createAcpRunner, selectBackend } from "./runner.js";
|
|
|
8
8
|
// Type-driven auth contracts (§1.3) and the AuthStore lifecycle spine (§2).
|
|
9
9
|
export { buildAuthDescriptor, buildAuthDescriptors, isGatewayShapedMeta } from "./auth/auth-types.js";
|
|
10
10
|
export { AuthStore, BackendAuthMachine, classifyCredential, redactSecrets, } from "./auth/auth-store.js";
|
|
11
|
+
// The provider-routing intent store — the providers/* sibling of the AuthStore: recorded on a
|
|
12
|
+
// successful setProvider, replayed on every connection's initialize, generation-gated by the pool.
|
|
13
|
+
export { ProviderStore } from "./provider-store.js";
|
|
11
14
|
// Per-agent auth profiles (§3): the pure-data adapters wired onto the built-in backends. Custom
|
|
12
15
|
// backends supply none (conformance-by-absence, §3.5).
|
|
13
16
|
export { claudeAuthProfile, codexAuthProfile, opencodeAuthProfile } from "./auth/auth-profiles.js";
|
package/dist/pool.d.ts
CHANGED
|
@@ -4,6 +4,7 @@ import { type ClientHandlers } from "./client-handlers.js";
|
|
|
4
4
|
import type { AcpEventSink } from "./events.js";
|
|
5
5
|
import type { ElicitationResolver, PermissionResolver } from "./permissions.js";
|
|
6
6
|
import type { AuthStore } from "./auth/auth-store.js";
|
|
7
|
+
import type { ProviderStore } from "./provider-store.js";
|
|
7
8
|
export interface AcpPoolOptions {
|
|
8
9
|
/** Long-lived processes to keep PER backend. Default 1; falls back to AGENTPRISM_ACP_POOL_SIZE. */
|
|
9
10
|
size?: number;
|
|
@@ -27,6 +28,11 @@ export interface AcpPoolDeps {
|
|
|
27
28
|
* no session is ever opened on a connection whose applied intent-generation is stale. Undefined
|
|
28
29
|
* => no gating, byte-identical to the pre-auth baseline. */
|
|
29
30
|
authStore?: AuthStore;
|
|
31
|
+
/** The runner's single provider-intent store. When present, connection selection is also gated
|
|
32
|
+
* on the provider-routing generation, so no session is ever opened on a process still running
|
|
33
|
+
* under stale (or missing) client-configured provider routing. Undefined or never-recorded =>
|
|
34
|
+
* no gating, byte-identical baseline. */
|
|
35
|
+
providerStore?: ProviderStore;
|
|
30
36
|
}
|
|
31
37
|
/** Resolve the per-backend pool size: explicit option wins, else env, else 1. Clamped to >= 1. */
|
|
32
38
|
export declare function resolvePoolSize(option?: number): number;
|
|
@@ -56,8 +62,14 @@ export declare class AcpAgentPool {
|
|
|
56
62
|
* connections are DRAINED (recycled on release), not disposed synchronously, so in-flight prompts
|
|
57
63
|
* finish under the auth they started with. Never blocks. */
|
|
58
64
|
private reconcileStale;
|
|
65
|
+
/** Reconcile every live connection for a key to the current provider-routing generation. There
|
|
66
|
+
* is no live re-apply lane here (provider changes are rare host-level config): an idle stale
|
|
67
|
+
* process is recycled now, a busy one drains and recycles on release — mirroring the
|
|
68
|
+
* disk/spawn-env branches of reconcileStale. Never blocks. */
|
|
69
|
+
private reconcileProviderStale;
|
|
59
70
|
/** Public: reconcile every live connection for a backend to the current generation (§2.6). Called
|
|
60
|
-
* by the runner immediately after a host-completed auth
|
|
71
|
+
* by the runner immediately after a host-completed auth — or a provider-routing change — so a
|
|
72
|
+
* subsequent run() lands current. */
|
|
61
73
|
recycle(poolKey: string): void;
|
|
62
74
|
/** Spawn a fresh pooled connection (a fresh process primes the current intent at initialize). */
|
|
63
75
|
private spawn;
|
package/dist/pool.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pool.d.ts","sourceRoot":"","sources":["../src/pool.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,OAAO,EAAa,MAAM,cAAc,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,KAAK,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAC1F,OAAO,EAA0B,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEnF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,KAAK,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAChF,OAAO,KAAK,EAAE,SAAS,EAAsB,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"pool.d.ts","sourceRoot":"","sources":["../src/pool.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,OAAO,EAAa,MAAM,cAAc,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,KAAK,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAC1F,OAAO,EAA0B,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEnF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,KAAK,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAChF,OAAO,KAAK,EAAE,SAAS,EAAsB,MAAM,sBAAsB,CAAC;AAC1E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAKzD,MAAM,WAAW,cAAc;IAC7B,mGAAmG;IACnG,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,4FAA4F;IAC5F,cAAc,CAAC,EAAE,cAAc,CAAC;CACjC;AAED;6FAC6F;AAC7F,MAAM,WAAW,WAAW;IAC1B,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,kBAAkB,CAAC,EAAE,kBAAkB,CAAC;IACxC,mBAAmB,CAAC,EAAE,mBAAmB,CAAC;IAC1C,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B;4EACwE;IACxE,gBAAgB,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IAC7D;;iEAE6D;IAC7D,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB;;;8CAG0C;IAC1C,aAAa,CAAC,EAAE,aAAa,CAAC;CAC/B;AAED,kGAAkG;AAClG,wBAAgB,eAAe,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAUvD;AAED,qBAAa,YAAY;IAUrB,OAAO,CAAC,QAAQ,CAAC,IAAI;IATvB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA6B;IAC5D,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA4C;IACtE,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA4B;IAC1D,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAS;gBAGvB,OAAO,GAAE,cAAmB,EACX,IAAI,GAAE,WAAgB;IAOzC,8FAA8F;IACxF,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,aAAa,CAAC;IAehF,2FAA2F;IACrF,eAAe,CACnB,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,CAAC,UAAU,EAAE,gBAAgB,KAAK,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC,EACzF,OAAO,GAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAO,GACrD,OAAO,CAAC,aAAa,CAAC;IAezB;;;;OAIG;IACH,OAAO,CAAC,gBAAgB;IAgCxB;;iEAE6D;IAC7D,OAAO,CAAC,cAAc;IActB;;;mEAG+D;IAC/D,OAAO,CAAC,sBAAsB;IAc9B;;0CAEsC;IACtC,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAO9B,iGAAiG;IACjG,OAAO,CAAC,KAAK;IAiBb,OAAO,CAAC,cAAc;IAStB,+DAA+D;IAC/D,OAAO,CAAC,IAAI;IAOZ,iEAAiE;IAC3D,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ9B,OAAO,CAAC,cAAc;IAMtB,OAAO,CAAC,eAAe;IAMvB,OAAO,CAAC,cAAc;IAMtB,gGAAgG;IAChG,OAAO,CAAC,WAAW;CAGpB"}
|
package/dist/pool.js
CHANGED
|
@@ -83,7 +83,11 @@ export class AcpAgentPool {
|
|
|
83
83
|
const connections = this.connectionsFor(key);
|
|
84
84
|
if (machine)
|
|
85
85
|
this.reconcileStale(key, machine);
|
|
86
|
-
|
|
86
|
+
this.reconcileProviderStale(key);
|
|
87
|
+
const usable = connections.filter((c) => c.alive &&
|
|
88
|
+
!c.recyclePending &&
|
|
89
|
+
!machine?.isStale(c.authStamp) &&
|
|
90
|
+
!this.deps.providerStore?.isStale(key, c.providerStamp));
|
|
87
91
|
const idle = usable.find((c) => c.activeSessions === 0);
|
|
88
92
|
if (idle)
|
|
89
93
|
return idle;
|
|
@@ -113,14 +117,36 @@ export class AcpAgentPool {
|
|
|
113
117
|
}
|
|
114
118
|
}
|
|
115
119
|
}
|
|
120
|
+
/** Reconcile every live connection for a key to the current provider-routing generation. There
|
|
121
|
+
* is no live re-apply lane here (provider changes are rare host-level config): an idle stale
|
|
122
|
+
* process is recycled now, a busy one drains and recycles on release — mirroring the
|
|
123
|
+
* disk/spawn-env branches of reconcileStale. Never blocks. */
|
|
124
|
+
reconcileProviderStale(key) {
|
|
125
|
+
const store = this.deps.providerStore;
|
|
126
|
+
if (!store)
|
|
127
|
+
return;
|
|
128
|
+
for (const c of this.connectionsFor(key).filter((c) => c.alive)) {
|
|
129
|
+
if (!store.isStale(key, c.providerStamp))
|
|
130
|
+
continue;
|
|
131
|
+
if (c.activeSessions === 0) {
|
|
132
|
+
void c.dispose();
|
|
133
|
+
this.drop(key, c);
|
|
134
|
+
}
|
|
135
|
+
else {
|
|
136
|
+
c.recyclePending = true; // BUSY: drain, then dispose-and-drop on release
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
116
140
|
/** Public: reconcile every live connection for a backend to the current generation (§2.6). Called
|
|
117
|
-
* by the runner immediately after a host-completed auth
|
|
141
|
+
* by the runner immediately after a host-completed auth — or a provider-routing change — so a
|
|
142
|
+
* subsequent run() lands current. */
|
|
118
143
|
recycle(poolKey) {
|
|
119
144
|
if (this.disposed)
|
|
120
145
|
return;
|
|
121
146
|
const machine = this.deps.authStore?.existing(poolKey);
|
|
122
147
|
if (machine)
|
|
123
148
|
this.reconcileStale(poolKey, machine);
|
|
149
|
+
this.reconcileProviderStale(poolKey);
|
|
124
150
|
}
|
|
125
151
|
/** Spawn a fresh pooled connection (a fresh process primes the current intent at initialize). */
|
|
126
152
|
spawn(key, backend) {
|
|
@@ -133,6 +159,7 @@ export class AcpAgentPool {
|
|
|
133
159
|
advertiseElicitation: this.deps.advertiseElicitation,
|
|
134
160
|
authCapabilities: this.deps.authCapabilities,
|
|
135
161
|
authStore: this.deps.authStore,
|
|
162
|
+
providerStore: this.deps.providerStore,
|
|
136
163
|
clientHandlers: this.clientHandlers,
|
|
137
164
|
});
|
|
138
165
|
this.connectionsFor(key).push(connection);
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { SetProviderRequest } from "@agentclientprotocol/sdk";
|
|
2
|
+
/** One recorded `providers/set` — the full replacement configuration for one provider. The
|
|
3
|
+
* request-scoped `_meta` passthrough is deliberately NOT recorded: it rides the immediate wire
|
|
4
|
+
* call only, while the intent captures the durable routing config. */
|
|
5
|
+
export interface ProviderIntent {
|
|
6
|
+
providerId: SetProviderRequest["providerId"];
|
|
7
|
+
apiType: SetProviderRequest["apiType"];
|
|
8
|
+
baseUrl: SetProviderRequest["baseUrl"];
|
|
9
|
+
/** SECRET gateway headers, replayed verbatim and never surfaced anywhere else. */
|
|
10
|
+
headers?: SetProviderRequest["headers"];
|
|
11
|
+
}
|
|
12
|
+
/** The runner's single in-memory provider-intent store. Default-OFF by construction: until the
|
|
13
|
+
* first successful `setProvider`, no entry exists, `isStale` is always false, and replay is a
|
|
14
|
+
* no-op — byte-identical to the pre-provider baseline. */
|
|
15
|
+
export declare class ProviderStore {
|
|
16
|
+
private readonly byPool;
|
|
17
|
+
/** Record the full replacement configuration for one provider and advance the generation. The
|
|
18
|
+
* stored copy is store-owned, so a superseded copy's header values are zeroized (§2.14-style
|
|
19
|
+
* hygiene) before it is replaced. */
|
|
20
|
+
record(poolKey: string, intent: ProviderIntent): void;
|
|
21
|
+
/** Drop the recorded intent for one provider (after a successful `providers/disable`) —
|
|
22
|
+
* zeroizing its stored header values — and advance the generation so routed processes recycle.
|
|
23
|
+
* Removing an unrecorded id still advances — disable is idempotent agent-side and an extra
|
|
24
|
+
* recycle is harmless. */
|
|
25
|
+
remove(poolKey: string, providerId: string): void;
|
|
26
|
+
/** The recorded intents for one pool key, in insertion order (replay order). */
|
|
27
|
+
intentsFor(poolKey: string): ProviderIntent[];
|
|
28
|
+
/** The current generation for one pool key; 0 when nothing was ever recorded. */
|
|
29
|
+
generation(poolKey: string): number;
|
|
30
|
+
/** True when a connection stamped at `stamp` no longer reflects the recorded routing. A pool
|
|
31
|
+
* key with no entry is never stale (the default-OFF baseline). */
|
|
32
|
+
isStale(poolKey: string, stamp: number): boolean;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=provider-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider-store.d.ts","sourceRoot":"","sources":["../src/provider-store.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAEnE;;uEAEuE;AACvE,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,kBAAkB,CAAC,YAAY,CAAC,CAAC;IAC7C,OAAO,EAAE,kBAAkB,CAAC,SAAS,CAAC,CAAC;IACvC,OAAO,EAAE,kBAAkB,CAAC,SAAS,CAAC,CAAC;IACvC,kFAAkF;IAClF,OAAO,CAAC,EAAE,kBAAkB,CAAC,SAAS,CAAC,CAAC;CACzC;AAWD;;2DAE2D;AAC3D,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgC;IAEvD;;0CAEsC;IACtC,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,GAAG,IAAI;IAWrD;;;+BAG2B;IAC3B,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI;IAQjD,gFAAgF;IAChF,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,cAAc,EAAE;IAK7C,iFAAiF;IACjF,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAInC;uEACmE;IACnE,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO;CAIjD"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/** The runner's single in-memory provider-intent store. Default-OFF by construction: until the
|
|
2
|
+
* first successful `setProvider`, no entry exists, `isStale` is always false, and replay is a
|
|
3
|
+
* no-op — byte-identical to the pre-provider baseline. */
|
|
4
|
+
export class ProviderStore {
|
|
5
|
+
byPool = new Map();
|
|
6
|
+
/** Record the full replacement configuration for one provider and advance the generation. The
|
|
7
|
+
* stored copy is store-owned, so a superseded copy's header values are zeroized (§2.14-style
|
|
8
|
+
* hygiene) before it is replaced. */
|
|
9
|
+
record(poolKey, intent) {
|
|
10
|
+
let entry = this.byPool.get(poolKey);
|
|
11
|
+
if (!entry) {
|
|
12
|
+
entry = { generation: 0, intents: new Map() };
|
|
13
|
+
this.byPool.set(poolKey, entry);
|
|
14
|
+
}
|
|
15
|
+
zeroizeHeaders(entry.intents.get(intent.providerId));
|
|
16
|
+
entry.intents.set(intent.providerId, { ...intent, ...(intent.headers ? { headers: { ...intent.headers } } : {}) });
|
|
17
|
+
entry.generation += 1;
|
|
18
|
+
}
|
|
19
|
+
/** Drop the recorded intent for one provider (after a successful `providers/disable`) —
|
|
20
|
+
* zeroizing its stored header values — and advance the generation so routed processes recycle.
|
|
21
|
+
* Removing an unrecorded id still advances — disable is idempotent agent-side and an extra
|
|
22
|
+
* recycle is harmless. */
|
|
23
|
+
remove(poolKey, providerId) {
|
|
24
|
+
const entry = this.byPool.get(poolKey);
|
|
25
|
+
if (!entry)
|
|
26
|
+
return; // nothing recorded => nothing to replay or recycle
|
|
27
|
+
zeroizeHeaders(entry.intents.get(providerId));
|
|
28
|
+
entry.intents.delete(providerId);
|
|
29
|
+
entry.generation += 1;
|
|
30
|
+
}
|
|
31
|
+
/** The recorded intents for one pool key, in insertion order (replay order). */
|
|
32
|
+
intentsFor(poolKey) {
|
|
33
|
+
const entry = this.byPool.get(poolKey);
|
|
34
|
+
return entry ? [...entry.intents.values()] : [];
|
|
35
|
+
}
|
|
36
|
+
/** The current generation for one pool key; 0 when nothing was ever recorded. */
|
|
37
|
+
generation(poolKey) {
|
|
38
|
+
return this.byPool.get(poolKey)?.generation ?? 0;
|
|
39
|
+
}
|
|
40
|
+
/** True when a connection stamped at `stamp` no longer reflects the recorded routing. A pool
|
|
41
|
+
* key with no entry is never stale (the default-OFF baseline). */
|
|
42
|
+
isStale(poolKey, stamp) {
|
|
43
|
+
const entry = this.byPool.get(poolKey);
|
|
44
|
+
return entry !== undefined && stamp < entry.generation;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
/** Overwrite a store-owned intent copy's SECRET header values before dropping the reference. */
|
|
48
|
+
function zeroizeHeaders(intent) {
|
|
49
|
+
if (!intent?.headers)
|
|
50
|
+
return;
|
|
51
|
+
for (const key of Object.keys(intent.headers))
|
|
52
|
+
intent.headers[key] = "";
|
|
53
|
+
}
|
package/dist/runner.d.ts
CHANGED
|
@@ -129,6 +129,18 @@ export interface AuthCapableRunner {
|
|
|
129
129
|
listBackends(): string[];
|
|
130
130
|
readonly auth: AuthController;
|
|
131
131
|
}
|
|
132
|
+
/** Structural capability interface the MCP composition root duck-types to register the provider
|
|
133
|
+
* tools, symmetric to AuthCapableRunner and equally seam-preserving. `AcpAgentRunner` implements
|
|
134
|
+
* it. This is the GENERIC base-spec `providers/*` surface: every method is advertise-gated per
|
|
135
|
+
* backend (`agentCapabilities.providers`), so any spec-conformant agent that advertises the
|
|
136
|
+
* unstable providers block is served with zero agent-specific code. */
|
|
137
|
+
export interface ProviderCapableRunner {
|
|
138
|
+
listProviders(opts?: ListProvidersOptions): Promise<ListProvidersResponse>;
|
|
139
|
+
setProvider(opts: SetProviderOptions): Promise<SetProviderResponse | void>;
|
|
140
|
+
disableProvider(opts: DisableProviderOptions): Promise<DisableProviderResponse | void>;
|
|
141
|
+
/** Ids of every configured backend (built-ins + AcpRunnerOptions.backends). */
|
|
142
|
+
listBackends(): string[];
|
|
143
|
+
}
|
|
132
144
|
/** Constructor options for the runner: pool sizing, client-side handlers, and the custom-backend
|
|
133
145
|
* registry. `backends` merges over (and wins against) env-declared AGENTPRISM_BACKENDS entries. */
|
|
134
146
|
export interface AcpRunnerOptions extends AcpPoolOptions {
|
|
@@ -161,7 +173,7 @@ export interface AcpRunnerOptions extends AcpPoolOptions {
|
|
|
161
173
|
* pass it into managers/runs as needed, then call dispose() (or use `await using`) when that
|
|
162
174
|
* owner is done with the pooled and dedicated backend processes.
|
|
163
175
|
*/
|
|
164
|
-
export declare class AcpAgentRunner implements AgentRunner, AuthCapableRunner {
|
|
176
|
+
export declare class AcpAgentRunner implements AgentRunner, AuthCapableRunner, ProviderCapableRunner {
|
|
165
177
|
private readonly pool;
|
|
166
178
|
/** The resolved custom-backend registry (env + option, validated at construction). */
|
|
167
179
|
private readonly backends;
|
|
@@ -185,6 +197,11 @@ export declare class AcpAgentRunner implements AgentRunner, AuthCapableRunner {
|
|
|
185
197
|
* home for credential material in the library. Threaded into the pool and every dedicated
|
|
186
198
|
* connection so all connection types reconcile to the same intent. */
|
|
187
199
|
private readonly authStore;
|
|
200
|
+
/** The single per-runner provider-intent store — the providers/* sibling of the AuthStore.
|
|
201
|
+
* setProvider records here after the wire call succeeds; every connection (pooled and
|
|
202
|
+
* dedicated) replays the recorded routing at initialize, so client-configured providers
|
|
203
|
+
* survive pool recycles and dispose-after-use dedicated connections. */
|
|
204
|
+
private readonly providerStore;
|
|
188
205
|
/** The auth verbs as one addressable object (§2.10). */
|
|
189
206
|
readonly auth: AuthController;
|
|
190
207
|
private readonly structuredOutputTools;
|
|
@@ -244,9 +261,16 @@ export declare class AcpAgentRunner implements AgentRunner, AuthCapableRunner {
|
|
|
244
261
|
listBackends(): string[];
|
|
245
262
|
/** List configurable providers from the selected backend. */
|
|
246
263
|
listProviders(opts?: ListProvidersOptions): Promise<ListProvidersResponse>;
|
|
247
|
-
/** Configure one provider on the selected backend.
|
|
264
|
+
/** Configure one provider on the selected backend. The wire call validates against the live
|
|
265
|
+
* agent (unknown providerId/apiType errors surface immediately); on success the routing is
|
|
266
|
+
* recorded as a durable intent — provider config is in-process agent state for e.g. codex-acp,
|
|
267
|
+
* so without the record this dedicated connection's dispose would silently discard it (the
|
|
268
|
+
* providers/* sibling of the dispose-after-authenticate bug). Every later connection replays
|
|
269
|
+
* the intent at initialize, and the pool recycles so no session runs under stale routing.
|
|
270
|
+
* The request-scoped `meta` passthrough rides the immediate call only; it is not replayed. */
|
|
248
271
|
setProvider(opts: SetProviderOptions): Promise<SetProviderResponse | void>;
|
|
249
|
-
/** Disable one provider on the selected backend
|
|
272
|
+
/** Disable one provider on the selected backend, drop its recorded routing intent, and recycle
|
|
273
|
+
* the pool so no future session replays it. Idempotent like the wire method. */
|
|
250
274
|
disableProvider(opts: DisableProviderOptions): Promise<DisableProviderResponse | void>;
|
|
251
275
|
/** Logout through the selected backend. REBUILT (§2.9): first clear the AuthStore machine
|
|
252
276
|
* (zeroizing `authenticateMeta`/`envValues`, §2.14) and recycle the pool so no pooled process
|
package/dist/runner.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"AAmBA,OAAO,EAIL,KAAK,WAAW,EAChB,KAAK,WAAW,EAEhB,KAAK,UAAU,EAChB,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EACV,mBAAmB,EACnB,oBAAoB,EACpB,UAAU,EAEV,sBAAsB,EACtB,uBAAuB,EAEvB,qBAAqB,EAErB,oBAAoB,EAEpB,cAAc,EACd,kBAAkB,EAClB,mBAAmB,EAEpB,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAEvC,OAAO,EAAgB,KAAK,cAAc,EAAE,MAAM,WAAW,CAAC;AAC9D,OAAO,EAEL,KAAK,gBAAgB,EACrB,KAAK,YAAY,EAGlB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,OAAO,EAAoB,MAAM,cAAc,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,KAAK,yBAAyB,EAAE,MAAM,kBAAkB,CAAC;AAKtF,OAAO,EAGL,KAAK,eAAe,EACpB,KAAK,mBAAmB,EACzB,MAAM,eAAe,CAAC;AAEvB,OAAO,EAGL,KAAK,oBAAoB,EACzB,KAAK,cAAc,EACnB,KAAK,YAAY,EAClB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAIL,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACtB,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"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"}
|
package/dist/runner.js
CHANGED
|
@@ -30,6 +30,7 @@ import { registryWithRunBackends, resolveBackendRegistry, } from "./registry.js"
|
|
|
30
30
|
import { mapThrownError } from "./errors-map.js";
|
|
31
31
|
import { buildAuthDescriptor, } from "./auth/auth-types.js";
|
|
32
32
|
import { AuthStore, classifyCredential, } from "./auth/auth-store.js";
|
|
33
|
+
import { ProviderStore } from "./provider-store.js";
|
|
33
34
|
import { resolveStructuredOutput } from "./structured-output.js";
|
|
34
35
|
import { STRUCTURED_OUTPUT_SERVER_NAME, StructuredOutputToolHost, } from "./structured-tool.js";
|
|
35
36
|
import { buildRunPrompt, mergeTurnMeta, promptWithImages, validatePromptImages, } from "./prompt.js";
|
|
@@ -63,6 +64,11 @@ export class AcpAgentRunner {
|
|
|
63
64
|
* home for credential material in the library. Threaded into the pool and every dedicated
|
|
64
65
|
* connection so all connection types reconcile to the same intent. */
|
|
65
66
|
authStore = new AuthStore();
|
|
67
|
+
/** The single per-runner provider-intent store — the providers/* sibling of the AuthStore.
|
|
68
|
+
* setProvider records here after the wire call succeeds; every connection (pooled and
|
|
69
|
+
* dedicated) replays the recorded routing at initialize, so client-configured providers
|
|
70
|
+
* survive pool recycles and dispose-after-use dedicated connections. */
|
|
71
|
+
providerStore = new ProviderStore();
|
|
66
72
|
/** The auth verbs as one addressable object (§2.10). */
|
|
67
73
|
auth;
|
|
68
74
|
structuredOutputTools = new StructuredOutputToolHost();
|
|
@@ -94,6 +100,7 @@ export class AcpAgentRunner {
|
|
|
94
100
|
advertiseElicitation: Boolean(options.onElicitation),
|
|
95
101
|
authCapabilities: this.authCapabilities,
|
|
96
102
|
authStore: this.authStore,
|
|
103
|
+
providerStore: this.providerStore,
|
|
97
104
|
});
|
|
98
105
|
this.backends = resolveBackendRegistry(options.backends);
|
|
99
106
|
this.auth = {
|
|
@@ -228,7 +235,13 @@ export class AcpAgentRunner {
|
|
|
228
235
|
await disposeBestEffort(connection);
|
|
229
236
|
}
|
|
230
237
|
}
|
|
231
|
-
/** Configure one provider on the selected backend.
|
|
238
|
+
/** Configure one provider on the selected backend. The wire call validates against the live
|
|
239
|
+
* agent (unknown providerId/apiType errors surface immediately); on success the routing is
|
|
240
|
+
* recorded as a durable intent — provider config is in-process agent state for e.g. codex-acp,
|
|
241
|
+
* so without the record this dedicated connection's dispose would silently discard it (the
|
|
242
|
+
* providers/* sibling of the dispose-after-authenticate bug). Every later connection replays
|
|
243
|
+
* the intent at initialize, and the pool recycles so no session runs under stale routing.
|
|
244
|
+
* The request-scoped `meta` passthrough rides the immediate call only; it is not replayed. */
|
|
232
245
|
async setProvider(opts) {
|
|
233
246
|
if (this.disposed)
|
|
234
247
|
throw new Error("ACP agent runner is disposed");
|
|
@@ -247,6 +260,13 @@ export class AcpAgentRunner {
|
|
|
247
260
|
...(opts.meta ? { _meta: opts.meta } : {}),
|
|
248
261
|
};
|
|
249
262
|
const response = await connection.setProvider(request, opts.label);
|
|
263
|
+
this.providerStore.record(backend.poolKey ?? backend.id, {
|
|
264
|
+
providerId: opts.providerId,
|
|
265
|
+
apiType: opts.apiType,
|
|
266
|
+
baseUrl: opts.baseUrl,
|
|
267
|
+
...(opts.headers ? { headers: opts.headers } : {}),
|
|
268
|
+
});
|
|
269
|
+
this.pool.recycle(backend.poolKey ?? backend.id);
|
|
250
270
|
opts.signal?.throwIfAborted();
|
|
251
271
|
if (this.disposed)
|
|
252
272
|
throw new Error("ACP agent runner is disposed");
|
|
@@ -256,7 +276,8 @@ export class AcpAgentRunner {
|
|
|
256
276
|
await disposeBestEffort(connection);
|
|
257
277
|
}
|
|
258
278
|
}
|
|
259
|
-
/** Disable one provider on the selected backend
|
|
279
|
+
/** Disable one provider on the selected backend, drop its recorded routing intent, and recycle
|
|
280
|
+
* the pool so no future session replays it. Idempotent like the wire method. */
|
|
260
281
|
async disableProvider(opts) {
|
|
261
282
|
if (this.disposed)
|
|
262
283
|
throw new Error("ACP agent runner is disposed");
|
|
@@ -270,6 +291,8 @@ export class AcpAgentRunner {
|
|
|
270
291
|
...(opts.meta ? { _meta: opts.meta } : {}),
|
|
271
292
|
};
|
|
272
293
|
const response = await connection.disableProvider(request, opts.label);
|
|
294
|
+
this.providerStore.remove(backend.poolKey ?? backend.id, opts.providerId);
|
|
295
|
+
this.pool.recycle(backend.poolKey ?? backend.id);
|
|
273
296
|
opts.signal?.throwIfAborted();
|
|
274
297
|
if (this.disposed)
|
|
275
298
|
throw new Error("ACP agent runner is disposed");
|
|
@@ -516,7 +539,9 @@ export class AcpAgentRunner {
|
|
|
516
539
|
// instead of silently continuing the ladder.
|
|
517
540
|
assertNormalStopReason(repromptResponse.stopReason, opts.label);
|
|
518
541
|
},
|
|
519
|
-
|
|
542
|
+
// Final message only, matching nativeStructured: prose extraction over the whole turn
|
|
543
|
+
// would resurrect the first-JSON-wins bug for schema-shaped progress messages.
|
|
544
|
+
lastText: () => activeSession.finalMessageText(),
|
|
520
545
|
tryCaptured: structuredTool ? () => structuredTool?.tryCaptured() : undefined,
|
|
521
546
|
tryNative: () => prepared.backend.nativeStructured(activeSession),
|
|
522
547
|
};
|
|
@@ -683,9 +708,11 @@ export class AcpAgentRunner {
|
|
|
683
708
|
elicitationResolver: this.elicitationResolver,
|
|
684
709
|
advertiseElicitation: Boolean(this.elicitationResolver),
|
|
685
710
|
authCapabilities: this.authCapabilities,
|
|
686
|
-
// Same
|
|
687
|
-
// initialize (§2.5) — the direct fix for the
|
|
711
|
+
// Same stores as the pool: a dedicated connection re-primes the durable auth intent AND the
|
|
712
|
+
// recorded provider routing at its own initialize (§2.5) — the direct fix for the
|
|
713
|
+
// dispose-after-authenticate bug (gap 3) and its providers/* sibling.
|
|
688
714
|
authStore: this.authStore,
|
|
715
|
+
providerStore: this.providerStore,
|
|
689
716
|
clientHandlers: this.clientHandlers,
|
|
690
717
|
});
|
|
691
718
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@automatalabs/acp-agents",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.24.0",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"engines": {
|
|
6
6
|
"node": ">=22"
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
"dependencies": {
|
|
30
30
|
"@agentclientprotocol/claude-agent-acp": "0.58.1",
|
|
31
31
|
"@agentclientprotocol/sdk": "^1.2.1",
|
|
32
|
-
"@automatalabs/codex-acp": "1.
|
|
32
|
+
"@automatalabs/codex-acp": "1.6.0",
|
|
33
33
|
"@modelcontextprotocol/sdk": "^1.29",
|
|
34
34
|
"typebox": "1.3.2",
|
|
35
35
|
"@automatalabs/shared-types": "0.16.0"
|