@agen-ai/provider-acp 0.4.0 → 0.4.1
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 +355 -12
- package/dist/capabilities.d.ts +3 -1
- package/dist/capabilities.js +5 -4
- package/dist/configuration/catalog.js +0 -2
- package/dist/configuration/errors.js +0 -1
- package/dist/connection/contracts.d.ts +21 -0
- package/dist/connection/errors.js +0 -1
- package/dist/connection/initialize.d.ts +7 -3
- package/dist/connection/initialize.js +46 -17
- package/dist/connection/negotiation.d.ts +2 -1
- package/dist/connection/negotiation.js +15 -1
- package/dist/contracts.d.ts +3 -0
- package/dist/driver.d.ts +1 -1
- package/dist/driver.js +6 -39
- package/dist/driverFactory.d.ts +8 -0
- package/dist/driverFactory.js +48 -0
- package/dist/host/interactions.js +0 -1
- package/dist/host/leases.js +0 -1
- package/dist/host/router.js +0 -1
- package/dist/host/terminals.js +0 -2
- package/dist/index.d.ts +1 -0
- package/dist/instance.d.ts +7 -2
- package/dist/instance.js +102 -27
- package/dist/node/contracts.d.ts +6 -0
- package/dist/node/execution/errors.d.ts +11 -0
- package/dist/node/execution/errors.js +17 -0
- package/dist/node/execution/owner.d.ts +34 -0
- package/dist/node/execution/owner.js +162 -0
- package/dist/node/execution/types.d.ts +20 -0
- package/dist/node/execution/types.js +0 -0
- package/dist/node/index.d.ts +3 -1
- package/dist/node/index.js +16 -6
- package/dist/node/launch.d.ts +5 -8
- package/dist/node/launch.js +13 -1
- package/dist/permissions/contracts.d.ts +22 -0
- package/dist/permissions/contracts.js +0 -0
- package/dist/permissions/mapping.d.ts +13 -0
- package/dist/permissions/mapping.js +99 -0
- package/dist/permissions/selection.d.ts +5 -0
- package/dist/permissions/selection.js +96 -0
- package/dist/session/create.d.ts +7 -1
- package/dist/session/create.js +3 -1
- package/dist/session/errors.js +0 -1
- package/dist/session/mapping.d.ts +6 -0
- package/dist/session/mapping.js +5 -26
- package/dist/session/opening.d.ts +1 -0
- package/dist/session/opening.js +3 -1
- package/dist/session/queue.js +0 -1
- package/dist/session/requests/forms.js +0 -2
- package/dist/session/requests/pending.js +0 -1
- package/dist/session/resources.js +5 -3
- package/dist/session/session.d.ts +4 -1
- package/dist/session/session.js +67 -25
- package/dist/sessionInteractions/broker.d.ts +42 -0
- package/dist/sessionInteractions/broker.js +171 -0
- package/dist/sessionInteractions/contracts.d.ts +3 -0
- package/dist/sessionInteractions/contracts.js +0 -0
- package/dist/sessionInteractions/extensions.d.ts +3 -0
- package/dist/sessionInteractions/extensions.js +17 -0
- package/dist/sessionInteractions/grokFolderTrust.d.ts +43 -0
- package/dist/sessionInteractions/grokFolderTrust.js +107 -0
- package/dist/sessionInteractions/request.d.ts +38 -0
- package/dist/sessionInteractions/request.js +145 -0
- package/package.json +4 -4
|
@@ -8,6 +8,10 @@ import { AcpProviderConnectionError } from "./errors.js";
|
|
|
8
8
|
import { acquireAcpLease, releaseOwnedLease } from "./acquire.js";
|
|
9
9
|
import { readNegotiatedAgent } from "./negotiation.js";
|
|
10
10
|
import { AcpHostRouter } from "../host/router.js";
|
|
11
|
+
import { SessionInteractionBroker } from "../sessionInteractions/broker.js";
|
|
12
|
+
import { createSessionInteractionExtensionRegistry } from "../sessionInteractions/extensions.js";
|
|
13
|
+
import { GROK_FOLDER_TRUST_CAPABILITY_META, GROK_FOLDER_TRUST_METHOD } from "../sessionInteractions/grokFolderTrust.js";
|
|
14
|
+
import { awaitHost } from "../host/lifecycle.js";
|
|
11
15
|
async function initializeAcpConnection(input) {
|
|
12
16
|
throwIfAgentOperationAborted(input.context.signal);
|
|
13
17
|
const initialization = new AbortController();
|
|
@@ -18,11 +22,14 @@ async function initializeAcpConnection(input) {
|
|
|
18
22
|
"ACP connection acquisition or initialization exceeded its deadline."
|
|
19
23
|
)), input.limits.initializationTimeoutMs);
|
|
20
24
|
let lease;
|
|
25
|
+
const execution = input.source.kind === "reserved" ? input.source.owner : void 0;
|
|
21
26
|
try {
|
|
22
|
-
|
|
27
|
+
const context = { ...input.context, signal: initialization.signal };
|
|
28
|
+
lease = input.source.kind === "factory" ? await acquireAcpLease(input.source.create, context) : await awaitHost(input.source.owner.start(context), initialization.signal);
|
|
23
29
|
try {
|
|
24
30
|
validateLease(lease, input.usedStreams);
|
|
25
31
|
} catch (cause) {
|
|
32
|
+
if (execution) throw cause;
|
|
26
33
|
try {
|
|
27
34
|
await releaseOwnedLease(lease);
|
|
28
35
|
} catch (cleanupError) {
|
|
@@ -33,6 +40,13 @@ async function initializeAcpConnection(input) {
|
|
|
33
40
|
} catch (cause) {
|
|
34
41
|
clearTimeout(timeout);
|
|
35
42
|
input.context.signal?.removeEventListener("abort", onInitializationAbort);
|
|
43
|
+
if (execution) {
|
|
44
|
+
try {
|
|
45
|
+
await execution.cleanup();
|
|
46
|
+
} catch (cleanupError) {
|
|
47
|
+
throw execution.retainedError(cause, cleanupError);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
36
50
|
throw cause;
|
|
37
51
|
}
|
|
38
52
|
const stopped = new AbortController();
|
|
@@ -42,6 +56,7 @@ async function initializeAcpConnection(input) {
|
|
|
42
56
|
let closePromise;
|
|
43
57
|
let releasePromise;
|
|
44
58
|
let released = false;
|
|
59
|
+
let sessionInteractions;
|
|
45
60
|
const host = input.host ?? {};
|
|
46
61
|
const router = new AcpHostRouter({
|
|
47
62
|
instanceId: input.context.instanceId,
|
|
@@ -63,11 +78,12 @@ async function initializeAcpConnection(input) {
|
|
|
63
78
|
const stop = (reason) => {
|
|
64
79
|
if (!stopped.signal.aborted) stopped.abort(reason);
|
|
65
80
|
};
|
|
66
|
-
const
|
|
81
|
+
const closeActual = () => {
|
|
67
82
|
if (!closePromise) {
|
|
68
83
|
closePromise = Promise.resolve().then(async () => {
|
|
69
84
|
try {
|
|
70
|
-
const
|
|
85
|
+
const stopping = [router.close(), ...client ? [client.dispose()] : [], release()];
|
|
86
|
+
const cleanup = await Promise.allSettled([...stopping, ...sessionInteractions ? [sessionInteractions.join()] : []]);
|
|
71
87
|
const failures = cleanup.filter((result) => result.status === "rejected");
|
|
72
88
|
if (failures.length) throw new AggregateError(failures.map((result) => result.reason), "ACP connection cleanup failed.");
|
|
73
89
|
} finally {
|
|
@@ -82,21 +98,31 @@ async function initializeAcpConnection(input) {
|
|
|
82
98
|
closePromise = void 0;
|
|
83
99
|
throw error;
|
|
84
100
|
});
|
|
101
|
+
sessionInteractions?.stop({ kind: "session_closed" });
|
|
85
102
|
stop(new AcpProviderConnectionError("acp_provider_connection_closed", "The ACP connection was closed."));
|
|
86
103
|
}
|
|
87
104
|
return closePromise;
|
|
88
105
|
};
|
|
89
|
-
|
|
90
|
-
|
|
106
|
+
execution?.retainCleanup(closeActual);
|
|
107
|
+
const close = () => execution ? execution.cleanup() : closeActual();
|
|
108
|
+
const fail = (error) => {
|
|
109
|
+
if (stopped.signal.aborted) return;
|
|
110
|
+
stop(error);
|
|
91
111
|
void close().catch(() => void 0);
|
|
92
112
|
};
|
|
113
|
+
if (input.sessionInteractions) sessionInteractions = new SessionInteractionBroker({
|
|
114
|
+
stopped: stopped.signal,
|
|
115
|
+
limits: input.limits,
|
|
116
|
+
onFailure: fail
|
|
117
|
+
});
|
|
118
|
+
const onPeerEnd = () => {
|
|
119
|
+
fail(new AcpProviderConnectionError("acp_provider_peer_closed", "The ACP peer closed its stream."));
|
|
120
|
+
};
|
|
93
121
|
const onPeerError = (error) => {
|
|
94
|
-
|
|
95
|
-
void close().catch(() => void 0);
|
|
122
|
+
fail(error);
|
|
96
123
|
};
|
|
97
124
|
const onAbort = () => {
|
|
98
|
-
|
|
99
|
-
void close().catch(() => void 0);
|
|
125
|
+
fail(initialization.signal.reason instanceof Error ? initialization.signal.reason : new DOMException("ACP initialization was aborted.", "AbortError"));
|
|
100
126
|
};
|
|
101
127
|
lease.stdout.once("end", onPeerEnd);
|
|
102
128
|
lease.stdout.once("close", onPeerEnd);
|
|
@@ -114,6 +140,7 @@ async function initializeAcpConnection(input) {
|
|
|
114
140
|
schemaChannel: "stable",
|
|
115
141
|
unknownExtensionPolicy: input.unknownExtensionPolicy,
|
|
116
142
|
outboundRequestIdPrefix: "agenai-acp-",
|
|
143
|
+
...sessionInteractions ? { extensions: createSessionInteractionExtensionRegistry() } : {},
|
|
117
144
|
limits: {
|
|
118
145
|
maxInboundFrameBytes: Math.min(input.limits.maxQueuedBytes, 1024 * 1024),
|
|
119
146
|
maxOutboundFrameBytes: Math.min(input.limits.maxQueuedBytes, 8 * 1024 * 1024),
|
|
@@ -132,6 +159,7 @@ async function initializeAcpConnection(input) {
|
|
|
132
159
|
"elicitation/complete": (notification) => router.complete(notification.params ?? null)
|
|
133
160
|
},
|
|
134
161
|
reverseRequestHandlers: {
|
|
162
|
+
...sessionInteractions ? { [GROK_FOLDER_TRUST_METHOD]: sessionInteractions.handleRequest } : {},
|
|
135
163
|
...Object.fromEntries([
|
|
136
164
|
"session/request_permission",
|
|
137
165
|
"elicitation/create",
|
|
@@ -144,36 +172,35 @@ async function initializeAcpConnection(input) {
|
|
|
144
172
|
"terminal/release"
|
|
145
173
|
].map((method) => [method, (request) => router.admit(request)]))
|
|
146
174
|
},
|
|
147
|
-
onFatalError:
|
|
148
|
-
stop(error);
|
|
149
|
-
void close().catch(() => void 0);
|
|
150
|
-
}
|
|
175
|
+
onFatalError: fail
|
|
151
176
|
});
|
|
152
177
|
void client.closed.then((result) => {
|
|
153
|
-
|
|
154
|
-
void close().catch(() => void 0);
|
|
178
|
+
fail(result.error ?? new AcpProviderConnectionError("acp_provider_connection_closed", "The ACP connection stopped."));
|
|
155
179
|
});
|
|
156
180
|
const response = await createAcpStandardSessionOperations(client).initialize({
|
|
157
181
|
protocolVersion: 1,
|
|
158
182
|
clientCapabilities: {
|
|
183
|
+
...sessionInteractions ? { _meta: GROK_FOLDER_TRUST_CAPABILITY_META } : {},
|
|
159
184
|
fs: { readTextFile: !!host.readTextFile, writeTextFile: !!host.writeTextFile },
|
|
160
185
|
terminal: !!host.createTerminal,
|
|
161
186
|
auth: { terminal: !!host.authenticateInTerminal && !!input.authentication?.terminal },
|
|
162
187
|
elicitation: { form: {}, ...host.url ? { url: {} } : {} },
|
|
163
188
|
...input.configuration === "selectable" ? { session: { configOptions: { boolean: {} } } } : {}
|
|
164
189
|
},
|
|
165
|
-
clientInfo: { name: "@agen-ai/provider-acp", version: "0.4.
|
|
190
|
+
clientInfo: { name: "@agen-ai/provider-acp", version: "0.4.1" }
|
|
166
191
|
}, {
|
|
167
192
|
timeoutMs: input.limits.initializationTimeoutMs,
|
|
168
193
|
signal: initialization.signal
|
|
169
194
|
});
|
|
170
195
|
if (stopped.signal.aborted) throw stopped.signal.reason;
|
|
171
|
-
const negotiated = readNegotiatedAgent(response);
|
|
196
|
+
const negotiated = readNegotiatedAgent(response, input.permissionMapping);
|
|
172
197
|
initialization.signal.removeEventListener("abort", onAbort);
|
|
173
198
|
return Object.freeze({
|
|
174
199
|
client,
|
|
175
200
|
negotiated,
|
|
176
201
|
stopped: stopped.signal,
|
|
202
|
+
...execution ? { execution } : {},
|
|
203
|
+
...sessionInteractions ? { sessionInteractions } : {},
|
|
177
204
|
bindSession: (binding) => router.bindSession(binding),
|
|
178
205
|
...host.form || host.url ? { hostElicitation: (context) => router.sessionElicitation(context) } : {},
|
|
179
206
|
async requestWithScope(method, params, scope, options = {}) {
|
|
@@ -199,9 +226,11 @@ async function initializeAcpConnection(input) {
|
|
|
199
226
|
close
|
|
200
227
|
});
|
|
201
228
|
} catch (cause) {
|
|
229
|
+
if (execution?.cleanupFailure) throw execution.retainedError(cause, execution.cleanupFailure.error);
|
|
202
230
|
try {
|
|
203
231
|
await close();
|
|
204
232
|
} catch (cleanupError) {
|
|
233
|
+
if (execution) throw execution.retainedError(cause, cleanupError);
|
|
205
234
|
throw new AggregateError([cause, cleanupError], "ACP initialization and cleanup failed.");
|
|
206
235
|
}
|
|
207
236
|
throw cause;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { AcpJsonValue } from '@agen-ai/acp-transport';
|
|
2
2
|
import type { AcpNegotiatedAgent } from './contracts.js';
|
|
3
|
+
import type { AcpPermissionMappingSelection } from '../permissions/contracts.js';
|
|
3
4
|
/** The transport has already validated the complete pinned initialize response. */
|
|
4
|
-
export declare function readNegotiatedAgent(response: AcpJsonValue): AcpNegotiatedAgent;
|
|
5
|
+
export declare function readNegotiatedAgent(response: AcpJsonValue, permissionMapping?: AcpPermissionMappingSelection): AcpNegotiatedAgent;
|
|
5
6
|
export declare function negotiatedEnvelope(negotiated: AcpNegotiatedAgent): string;
|
|
6
7
|
//# sourceMappingURL=negotiation.d.ts.map
|
|
@@ -11,7 +11,7 @@ function immutableProtocolData(value) {
|
|
|
11
11
|
}
|
|
12
12
|
return value;
|
|
13
13
|
}
|
|
14
|
-
function readNegotiatedAgent(response) {
|
|
14
|
+
function readNegotiatedAgent(response, permissionMapping = { mapping: "once-only-v1" }) {
|
|
15
15
|
const value = response;
|
|
16
16
|
if (value.protocolVersion !== 1) {
|
|
17
17
|
throw new AcpProviderConnectionError("acp_provider_version_unsupported", "ACP wire version 1 is required.");
|
|
@@ -27,9 +27,23 @@ function readNegotiatedAgent(response) {
|
|
|
27
27
|
}
|
|
28
28
|
agentInfo = Object.freeze({ name: info.name, version: info.version });
|
|
29
29
|
}
|
|
30
|
+
let agentVersion;
|
|
31
|
+
if (permissionMapping.mapping === "declared-complete-consequences-v1") {
|
|
32
|
+
if (agentInfo?.name !== permissionMapping.agentInfo.name || agentInfo.version !== permissionMapping.agentInfo.version) {
|
|
33
|
+
throw new AcpProviderConnectionError("acp_permission_profile_mismatch", "The initialized ACP identity does not match the selected permission profile.");
|
|
34
|
+
}
|
|
35
|
+
} else if (permissionMapping.mapping === "grok-build-1.0.50-edit-remembrance-v1") {
|
|
36
|
+
const meta = value._meta;
|
|
37
|
+
const version = meta !== null && typeof meta === "object" && !Array.isArray(meta) ? meta.agentVersion : void 0;
|
|
38
|
+
if (typeof version !== "string" || version.length > 160 || version !== version.trim() || /[\p{Cc}\p{Cf}]/u.test(version) || version !== "1.0.50") {
|
|
39
|
+
throw new AcpProviderConnectionError("acp_permission_profile_mismatch", "The selected Grok permission profile requires the exact initialized agentVersion 1.0.50.");
|
|
40
|
+
}
|
|
41
|
+
agentVersion = version;
|
|
42
|
+
}
|
|
30
43
|
return Object.freeze({
|
|
31
44
|
protocolVersion: 1,
|
|
32
45
|
...agentInfo ? { agentInfo } : {},
|
|
46
|
+
...agentVersion ? { agentVersion } : {},
|
|
33
47
|
agentCapabilities: immutableProtocolData(value.agentCapabilities ?? {}),
|
|
34
48
|
authMethods: immutableProtocolData(value.authMethods ?? [])
|
|
35
49
|
});
|
package/dist/contracts.d.ts
CHANGED
|
@@ -4,6 +4,7 @@ import type { AgentSessionHostBinding, MaybePromise } from '@agen-ai/agent-runti
|
|
|
4
4
|
import type { AcpProviderLimits } from './limits.js';
|
|
5
5
|
import type { AcpStandardMcpServer, AcpUnknownExtensionPolicy } from '@agen-ai/acp-transport';
|
|
6
6
|
import type { AcpAuthenticationMethods, AcpHostFacilities } from './host/contracts.js';
|
|
7
|
+
import type { AcpPermissionMappingSelection } from './permissions/contracts.js';
|
|
7
8
|
export type { AcpProviderLimits } from './limits.js';
|
|
8
9
|
export interface AcpConnectionStreams {
|
|
9
10
|
readonly stdout: Readable;
|
|
@@ -51,6 +52,8 @@ export interface CreateAcpProviderDriverOptions {
|
|
|
51
52
|
readonly createConnection: AcpConnectionFactory;
|
|
52
53
|
/** Defaults to standard handling of unknown optional vendor extensions. */
|
|
53
54
|
readonly unknownExtensionPolicy?: AcpUnknownExtensionPolicy;
|
|
55
|
+
/** Defaults to once-only choices; complete profiles require independently qualified native semantics. */
|
|
56
|
+
readonly permissionMapping?: AcpPermissionMappingSelection;
|
|
54
57
|
readonly limits?: Partial<AcpProviderLimits>;
|
|
55
58
|
readonly configuration?: 'managed' | 'selectable';
|
|
56
59
|
readonly authentication?: AcpAuthenticationMethods;
|
package/dist/driver.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { AgentProviderDriver } from '@agen-ai/agent-runtime';
|
|
2
2
|
import type { CreateAcpProviderDriverOptions } from './contracts.js';
|
|
3
3
|
export declare function createAcpProviderDriver(options: CreateAcpProviderDriverOptions): AgentProviderDriver;
|
|
4
4
|
//# sourceMappingURL=driver.d.ts.map
|
package/dist/driver.js
CHANGED
|
@@ -1,43 +1,10 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { defineAgentProviderDriver } from "@agen-ai/agent-runtime";
|
|
3
|
-
import { parseAcpProviderConfiguration } from "./configuration.js";
|
|
4
|
-
import { createAcpProviderInstance } from "./instance.js";
|
|
5
|
-
import { resolveAcpProviderLimits } from "./limits.js";
|
|
6
|
-
import { resolveAuthenticationMapping } from "./auth/methods.js";
|
|
7
|
-
import { resolveHostFacilities } from "./host/validation.js";
|
|
8
|
-
import { resolveAcpMcpServers, resolveAcpSessionMcpBinding } from "./mcp.js";
|
|
1
|
+
import { createAcpProviderDriverInternal } from "./driverFactory.js";
|
|
9
2
|
function createAcpProviderDriver(options) {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
const limits = resolveAcpProviderLimits(options.limits);
|
|
16
|
-
const configuration = options.configuration ?? "managed";
|
|
17
|
-
if (configuration !== "managed" && configuration !== "selectable") throw new TypeError("ACP configuration mode is invalid.");
|
|
18
|
-
const authentication = resolveAuthenticationMapping(options.authentication);
|
|
19
|
-
const host = resolveHostFacilities(options.host);
|
|
20
|
-
const mcpServers = resolveAcpMcpServers(options.mcpServers);
|
|
21
|
-
const sessionMcpBinding = resolveAcpSessionMcpBinding(options.sessionMcpBinding);
|
|
22
|
-
const usedStreams = /* @__PURE__ */ new WeakSet();
|
|
23
|
-
return defineAgentProviderDriver({
|
|
24
|
-
providerKey,
|
|
25
|
-
supportsMultipleInstances: true,
|
|
26
|
-
parseConfiguration: parseAcpProviderConfiguration,
|
|
27
|
-
createInstance: ({ instanceId }) => createAcpProviderInstance({
|
|
28
|
-
providerKey,
|
|
29
|
-
instanceId,
|
|
30
|
-
createConnection,
|
|
31
|
-
unknownExtensionPolicy,
|
|
32
|
-
limits,
|
|
33
|
-
usedStreams,
|
|
34
|
-
configuration,
|
|
35
|
-
authentication,
|
|
36
|
-
host,
|
|
37
|
-
mcpServers,
|
|
38
|
-
...sessionMcpBinding ? { sessionMcpBinding } : {}
|
|
39
|
-
})
|
|
40
|
-
});
|
|
3
|
+
if (Object.hasOwn(options, "sessionInteractions")) {
|
|
4
|
+
throw new TypeError("ACP session interaction mappings require the Node provider constructor and its exclusive process ownership.");
|
|
5
|
+
}
|
|
6
|
+
if (Object.hasOwn(options, "executionBoundary")) throw new TypeError("Execution boundaries require the Node provider constructor.");
|
|
7
|
+
return createAcpProviderDriverInternal({ ...options, connectionSource: { kind: "factory", create: options.createConnection } });
|
|
41
8
|
}
|
|
42
9
|
export {
|
|
43
10
|
createAcpProviderDriver
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type AgentProviderDriver } from '@agen-ai/agent-runtime';
|
|
2
|
+
import type { CreateAcpProviderDriverOptions } from './contracts.js';
|
|
3
|
+
import type { AcpSessionInteractionSelection } from './sessionInteractions/contracts.js';
|
|
4
|
+
import type { AcpConnectionSource } from './connection/contracts.js';
|
|
5
|
+
export declare function createAcpProviderDriverInternal(options: Omit<CreateAcpProviderDriverOptions, 'createConnection'> & Readonly<{
|
|
6
|
+
connectionSource: AcpConnectionSource;
|
|
7
|
+
}>, sessionInteractions?: AcpSessionInteractionSelection): AgentProviderDriver;
|
|
8
|
+
//# sourceMappingURL=driverFactory.d.ts.map
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { parseAgentProviderKey } from "@agen-ai/agent-protocol";
|
|
2
|
+
import { defineAgentProviderDriver } from "@agen-ai/agent-runtime";
|
|
3
|
+
import { parseAcpProviderConfiguration } from "./configuration.js";
|
|
4
|
+
import { createAcpProviderInstance } from "./instance.js";
|
|
5
|
+
import { resolveAcpProviderLimits } from "./limits.js";
|
|
6
|
+
import { resolveAuthenticationMapping } from "./auth/methods.js";
|
|
7
|
+
import { resolveHostFacilities } from "./host/validation.js";
|
|
8
|
+
import { resolveAcpMcpServers, resolveAcpSessionMcpBinding } from "./mcp.js";
|
|
9
|
+
import { resolveAcpPermissionMapping } from "./permissions/selection.js";
|
|
10
|
+
function createAcpProviderDriverInternal(options, sessionInteractions) {
|
|
11
|
+
const providerKey = parseAgentProviderKey(options.providerKey);
|
|
12
|
+
const connectionSource = options.connectionSource;
|
|
13
|
+
if (connectionSource.kind === "factory" && typeof connectionSource.create !== "function") throw new TypeError("An ACP connection factory is required.");
|
|
14
|
+
const unknownExtensionPolicy = options.unknownExtensionPolicy === void 0 ? "standard" : options.unknownExtensionPolicy;
|
|
15
|
+
if (unknownExtensionPolicy !== "reject" && unknownExtensionPolicy !== "standard") throw new TypeError("ACP unknown extension policy is invalid.");
|
|
16
|
+
const limits = resolveAcpProviderLimits(options.limits);
|
|
17
|
+
const configuration = options.configuration ?? "managed";
|
|
18
|
+
if (configuration !== "managed" && configuration !== "selectable") throw new TypeError("ACP configuration mode is invalid.");
|
|
19
|
+
const authentication = resolveAuthenticationMapping(options.authentication);
|
|
20
|
+
const host = resolveHostFacilities(options.host);
|
|
21
|
+
const mcpServers = resolveAcpMcpServers(options.mcpServers);
|
|
22
|
+
const sessionMcpBinding = resolveAcpSessionMcpBinding(options.sessionMcpBinding);
|
|
23
|
+
const permissionMapping = resolveAcpPermissionMapping(options.permissionMapping);
|
|
24
|
+
const usedStreams = /* @__PURE__ */ new WeakSet();
|
|
25
|
+
return defineAgentProviderDriver({
|
|
26
|
+
providerKey,
|
|
27
|
+
supportsMultipleInstances: true,
|
|
28
|
+
parseConfiguration: parseAcpProviderConfiguration,
|
|
29
|
+
createInstance: ({ instanceId }) => createAcpProviderInstance({
|
|
30
|
+
providerKey,
|
|
31
|
+
instanceId,
|
|
32
|
+
connectionSource,
|
|
33
|
+
unknownExtensionPolicy,
|
|
34
|
+
limits,
|
|
35
|
+
usedStreams,
|
|
36
|
+
configuration,
|
|
37
|
+
authentication,
|
|
38
|
+
host,
|
|
39
|
+
mcpServers,
|
|
40
|
+
permissionMapping,
|
|
41
|
+
...sessionMcpBinding ? { sessionMcpBinding } : {},
|
|
42
|
+
...sessionInteractions ? { sessionInteractions } : {}
|
|
43
|
+
})
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
export {
|
|
47
|
+
createAcpProviderDriverInternal
|
|
48
|
+
};
|
package/dist/host/leases.js
CHANGED
package/dist/host/router.js
CHANGED
package/dist/host/terminals.js
CHANGED
package/dist/index.d.ts
CHANGED
|
@@ -2,6 +2,7 @@ export { createAcpProviderDriver } from './driver.js';
|
|
|
2
2
|
export { DEFAULT_ACP_PROVIDER_LIMITS, type AcpProviderLimits } from './limits.js';
|
|
3
3
|
export { AcpProviderConnectionError } from './connection/errors.js';
|
|
4
4
|
export { AcpProviderSessionError } from './session/errors.js';
|
|
5
|
+
export type { AcpPermissionOptionSignature, AcpPermissionMenuSignature, AcpPermissionMappingSelection, } from './permissions/contracts.js';
|
|
5
6
|
export type { AcpConnectionStreams, AcpConnectionLease, AcpConnectionFactoryContext, AcpConnectionFactory, AcpSessionMcpBindingContext, AcpSessionMcpBindingLease, AcpSessionMcpBindingFactory, AcpSessionMcpBindingOptions, CreateAcpProviderDriverOptions, } from './contracts.js';
|
|
6
7
|
export type { AcpAuthenticationMethods, AcpHostFacilities, AcpHostInteractionScope, AcpHostInteractionInput, AcpHostFormInput, AcpHostFormResponse, AcpHostUrlInput, AcpHostUrlDecision, AcpHostUrlInteractionLease, AcpHostSessionInput, AcpHostFileReadInput, AcpHostFileWriteInput, AcpHostTerminalCreateInput, AcpHostTerminalLease, AcpHostTerminalOutput, AcpHostTerminalExitStatus, AcpHostAuthenticationTerminalInput, AcpHostAuthenticationTerminalLease, } from './host/contracts.js';
|
|
7
8
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/instance.d.ts
CHANGED
|
@@ -1,13 +1,16 @@
|
|
|
1
1
|
import { type AgentInstanceId, type AgentProviderKey } from '@agen-ai/agent-protocol';
|
|
2
2
|
import type { AcpStandardMcpServer, AcpUnknownExtensionPolicy } from '@agen-ai/acp-transport';
|
|
3
3
|
import { type MaterializedAgentProviderInstance } from '@agen-ai/agent-runtime';
|
|
4
|
-
import type {
|
|
4
|
+
import type { AcpSessionMcpBindingOptions } from './contracts.js';
|
|
5
5
|
import type { AcpAuthenticationMethods, AcpHostFacilities } from './host/contracts.js';
|
|
6
6
|
import type { AcpProviderLimits } from './limits.js';
|
|
7
|
+
import type { AcpConnectionSource } from './connection/contracts.js';
|
|
8
|
+
import type { AcpSessionInteractionSelection } from './sessionInteractions/contracts.js';
|
|
9
|
+
import type { AcpPermissionMappingSelection } from './permissions/contracts.js';
|
|
7
10
|
export declare function createAcpProviderInstance(input: {
|
|
8
11
|
readonly providerKey: AgentProviderKey;
|
|
9
12
|
readonly instanceId: AgentInstanceId;
|
|
10
|
-
readonly
|
|
13
|
+
readonly connectionSource: AcpConnectionSource;
|
|
11
14
|
readonly unknownExtensionPolicy: AcpUnknownExtensionPolicy;
|
|
12
15
|
readonly limits: AcpProviderLimits;
|
|
13
16
|
readonly usedStreams: WeakSet<object>;
|
|
@@ -15,6 +18,8 @@ export declare function createAcpProviderInstance(input: {
|
|
|
15
18
|
readonly authentication: AcpAuthenticationMethods;
|
|
16
19
|
readonly host: AcpHostFacilities;
|
|
17
20
|
readonly mcpServers: readonly AcpStandardMcpServer[];
|
|
21
|
+
readonly permissionMapping: AcpPermissionMappingSelection;
|
|
18
22
|
readonly sessionMcpBinding?: AcpSessionMcpBindingOptions;
|
|
23
|
+
readonly sessionInteractions?: AcpSessionInteractionSelection;
|
|
19
24
|
}): Promise<MaterializedAgentProviderInstance>;
|
|
20
25
|
//# sourceMappingURL=instance.d.ts.map
|