acp-port 0.1.3 → 0.2.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/CONTRIBUTING.md +6 -4
- package/README.md +8 -5
- package/dist/agent/agent.js +23 -9
- package/dist/agent/agent.js.map +1 -1
- package/dist/agent/diagnostics.d.ts +3 -0
- package/dist/agent/diagnostics.js +29 -0
- package/dist/agent/diagnostics.js.map +1 -0
- package/dist/agent/session.d.ts +1 -0
- package/dist/agent/session.js +17 -3
- package/dist/agent/session.js.map +1 -1
- package/dist/agent/turn.js +21 -5
- package/dist/agent/turn.js.map +1 -1
- package/dist/cli/arguments.d.ts +1 -1
- package/dist/cli/arguments.js +2 -9
- package/dist/cli/arguments.js.map +1 -1
- package/dist/config/modes.js +3 -3
- package/dist/config/modes.js.map +1 -1
- package/dist/config/schema.d.ts +0 -7
- package/dist/config/schema.js +0 -2
- package/dist/config/schema.js.map +1 -1
- package/dist/providers/adapters/anthropic-provider.d.ts +1 -1
- package/dist/providers/adapters/anthropic-provider.js +12 -10
- package/dist/providers/adapters/anthropic-provider.js.map +1 -1
- package/dist/providers/adapters/openai-provider.d.ts +1 -1
- package/dist/providers/adapters/openai-provider.js +9 -8
- package/dist/providers/adapters/openai-provider.js.map +1 -1
- package/dist/providers/provider-contract.d.ts +6 -0
- package/dist/providers/provider-contract.js +11 -1
- package/dist/providers/provider-contract.js.map +1 -1
- package/dist/providers/provider-registry.d.ts +2 -2
- package/dist/providers/provider-registry.js +11 -7
- package/dist/providers/provider-registry.js.map +1 -1
- package/dist/providers/support/request-handling.d.ts +3 -3
- package/dist/providers/support/request-handling.js +125 -21
- package/dist/providers/support/request-handling.js.map +1 -1
- package/dist/providers/support/sdk-clients.d.ts +1 -1
- package/dist/providers/support/sdk-clients.js +17 -5
- package/dist/providers/support/sdk-clients.js.map +1 -1
- package/dist/tools/runner.d.ts +1 -0
- package/dist/tools/runner.js +80 -15
- package/dist/tools/runner.js.map +1 -1
- package/docs/architecture.md +1 -1
- package/docs/capabilities.md +15 -11
- package/docs/configuration.md +20 -3
- package/docs/editor-integration.md +18 -16
- package/docs/providers.md +38 -1
- package/docs/releases.md +8 -6
- package/docs/troubleshooting.md +35 -4
- package/package.json +9 -9
package/CONTRIBUTING.md
CHANGED
|
@@ -4,7 +4,7 @@ ACP Port is a TypeScript ACP agent that connects an editor to an LLM API. Contri
|
|
|
4
4
|
|
|
5
5
|
## Set up a checkout
|
|
6
6
|
|
|
7
|
-
Use Node.js **24.21.0** and **pnpm 12.8.1**, as pinned in `mise.toml`; run `mise install` if you use mise.
|
|
7
|
+
Use Node.js **24.21.0** and **pnpm 12.8.1**, as pinned in `mise.toml`; run `mise install` if you use mise. The release tooling requires Node.js **22.22.2 or later in the 22.x line, or 24.15.0 or later**. The published CLI itself supports Node.js 22.12.0 or newer. CI checks Node.js 22 and 24. Clone your fork or the repository, enter its directory, and install the versions recorded in the lockfile:
|
|
8
8
|
|
|
9
9
|
```sh
|
|
10
10
|
pnpm install --frozen-lockfile
|
|
@@ -68,7 +68,7 @@ Launch the Node entry point directly in editor configurations: package-manager s
|
|
|
68
68
|
| --- | --- |
|
|
69
69
|
| `pnpm run dev <args>` | Run the source CLI using `tsx`. |
|
|
70
70
|
| `pnpm run typecheck` | Check production and test TypeScript without emitting files. |
|
|
71
|
-
| `pnpm test` | Run `src/**/*.test.ts` with the Node.js test runner and `tsx`;
|
|
71
|
+
| `pnpm test` | Run `src/**/*.test.ts` with the Node.js test runner and `tsx`; the runner timeout is 60 seconds. Tests may set a shorter explicit timeout. |
|
|
72
72
|
| `pnpm run check` | Run type checking followed by the test suite. |
|
|
73
73
|
| `pnpm run build` | Emit ESM JavaScript, source maps, and declarations to `dist/`; exclude tests. |
|
|
74
74
|
| `pnpm run format:check` | Check formatting with Biome without writing fixes. |
|
|
@@ -87,11 +87,13 @@ pnpm run lint:check
|
|
|
87
87
|
|
|
88
88
|
CI runs these after `pnpm install --frozen-lockfile` on both supported Node.js matrix versions and verifies the npm package contents. `pnpm run check` runs type checking and tests; build, formatting, and lint checks are separate. After both matrix jobs pass, qualifying commits on the canonical repository's default branch trigger the automated release. Pull requests and fork pushes only run checks. See the [release guide](docs/releases.md) for maintainer setup.
|
|
89
89
|
|
|
90
|
+
The runner timeout also bounds each test file, including its sequential tests. CLI integration files launch multiple Node.js processes and can exceed 15 seconds on CI even when every individual test passes. The 60-second budget covers that cumulative startup cost; individual CLI subprocesses still have a 10-second deadline.
|
|
91
|
+
|
|
90
92
|
For a focused test run:
|
|
91
93
|
|
|
92
94
|
```sh
|
|
93
|
-
node --import tsx --test --test-timeout=
|
|
94
|
-
node --import tsx --test --test-timeout=
|
|
95
|
+
node --import tsx --test --test-timeout=60000 src/providers/adapters/openai-provider.test.ts
|
|
96
|
+
node --import tsx --test --test-timeout=60000 --test-name-pattern="cancellation" "src/**/*.test.ts"
|
|
95
97
|
```
|
|
96
98
|
|
|
97
99
|
`tsx` executes TypeScript but does not replace type checking. Run `pnpm run typecheck` after changing types or adding tests.
|
package/README.md
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
acp-port is a TypeScript CLI that runs as an ACP coding agent. It connects an ACP-capable editor to local model servers, LLM gateways, and cloud APIs. The editor provides the conversation UI, workspace context, permissions, and optional file/terminal access; acp-port handles model discovery, streaming responses, conversation history, and the model's tool loop. File tools use the local workspace when the editor does not provide file access.
|
|
6
6
|
|
|
7
|
-
Use it with LM Studio, Ollama, LiteLLM, OpenRouter, OpenAI, Anthropic, or Google's OpenAI-compatible Gemini endpoint. Choose the endpoint and model you want to use, then register acp-port as a custom agent in your editor.
|
|
7
|
+
Use it with llama.cpp, LM Studio, Ollama, LiteLLM, OpenRouter, OpenAI, Anthropic, or Google's OpenAI-compatible Gemini endpoint. Choose the endpoint and model you want to use, then register acp-port as a custom agent in your editor.
|
|
8
8
|
|
|
9
9
|
## Documentation
|
|
10
10
|
|
|
@@ -124,6 +124,7 @@ The [editor integration guide](docs/editor-integration.md) includes copyable con
|
|
|
124
124
|
|
|
125
125
|
| Service | Adapter | Base URL | Authentication |
|
|
126
126
|
| --- | --- | --- | --- |
|
|
127
|
+
| llama.cpp | `openai` | `http://127.0.0.1:8080/v1` for port 8080 | Optional, depending on server settings |
|
|
127
128
|
| LM Studio | `openai` (default) | `http://127.0.0.1:1234/v1` | Optional, depending on server settings |
|
|
128
129
|
| Ollama | `openai` | `http://127.0.0.1:11434/v1` | Usually omitted for a local server |
|
|
129
130
|
| LiteLLM | `openai` | Your gateway's API base URL | Gateway key, when required |
|
|
@@ -163,7 +164,6 @@ npx -y acp-port --base-url http://127.0.0.1:1234/v1 \
|
|
|
163
164
|
| `--name NAME` | Set the endpoint label used in model names. |
|
|
164
165
|
| `--no-discovery` | Skip model discovery. Requires `--default-model`. |
|
|
165
166
|
| `--no-tools` | Omit all tools for models that only support text chat. |
|
|
166
|
-
| `--mode MODE` | Choose `manual` (default), `accept-edits`, `plan`, `auto`, or `full-access`. Supporting editors also offer a per-session mode selector. |
|
|
167
167
|
| `--json` | Print structured catalog data with the `models` command. |
|
|
168
168
|
| `--help`, `-h`, `--version` | Print usage or version and exit. |
|
|
169
169
|
|
|
@@ -176,8 +176,9 @@ The [configuration reference](docs/configuration.md) documents validation, model
|
|
|
176
176
|
- Streams text and accepts embedded text resources. Resource links supply metadata; their contents are not automatically fetched.
|
|
177
177
|
- Exposes `read_file`, `write_file`, `list_directory`, `search_files`, and `run_command` when tools are enabled. File and command tools work locally when the editor does not provide them. Plan mode exposes only reading, listing, and searching.
|
|
178
178
|
- By default, requests editor permission before each write or command and restricts file paths and command working directories to the session workspace. Reads, listings, and searches do not request approval.
|
|
179
|
-
-
|
|
180
|
-
-
|
|
179
|
+
- Select **Full access** through ACP to run all five tools locally without approval prompts or workspace path restrictions. Commands inherit the agent's environment and OS permissions; this does not grant administrator privileges or provide an OS sandbox. Local reads use saved disk contents.
|
|
180
|
+
- **Accept edits** automatically allows workspace writes but asks before commands. **Ask and remember** can remember explicit session approvals for a file or exact command. **Plan** prevents writes and command execution. Select modes through the editor's ACP controls; changing a mode cancels the current turn and clears remembered approvals.
|
|
181
|
+
- The editor can switch a session from full access to **Ask permission**. Approval requests identify the file and proposed contents, or the executable, arguments, and working directory; rejection prevents execution. See [editor permission controls](docs/editor-integration.md#choose-permissions-in-the-editor).
|
|
181
182
|
- Keeps sessions in memory. Restarting the agent loses their history; session reload and automatic history summarization are unavailable.
|
|
182
183
|
- Defaults to 12 model requests per turn, 200,000 history characters, and 120-second provider/tool timeouts. A character budget is not a model token budget.
|
|
183
184
|
- Supports text-based coding workflows. Images, audio, binary attachments, and MCP tools are unsupported. Forwarded MCP servers are ignored with a warning on stderr; chat and supported editor tools remain available.
|
|
@@ -186,6 +187,8 @@ Prompts, attached text, conversation history, and tool results are sent to the s
|
|
|
186
187
|
|
|
187
188
|
Automated tests cover mocked provider APIs, ACP sessions, permission handling, and a stdio tool round trip. They do not establish compatibility with every model or replace a live test in your editor. For common failures, see [troubleshooting](docs/troubleshooting.md).
|
|
188
189
|
|
|
190
|
+
Prompt failures appear in the editor conversation with an explanation and suggested next steps, including HTTP status when available. Editors supporting ACP notices also receive an error notice. See [llama.cpp setup](docs/providers.md#llamacpp) for its API URL, model alias, and tool-template configuration.
|
|
191
|
+
|
|
189
192
|
## Development
|
|
190
193
|
|
|
191
194
|
```sh
|
|
@@ -198,7 +201,7 @@ pnpm run format:check
|
|
|
198
201
|
pnpm run lint:check
|
|
199
202
|
```
|
|
200
203
|
|
|
201
|
-
Use **Node.js 24.21.0 and pnpm 12.8.1** for development; `mise install` installs these versions from `mise.toml`.
|
|
204
|
+
Use **Node.js 24.21.0 and pnpm 12.8.1** for development; `mise install` installs these versions from `mise.toml`. The release tooling requires Node.js 22.22.2 or later in the 22.x line, or 24.15.0 or later. The published CLI supports Node.js 22.12.0 or newer. The committed `pnpm-lock.yaml` makes local and CI installs repeatable.
|
|
202
205
|
|
|
203
206
|
The project uses TypeScript, native ESM, the ACP SDK, Zod, and the OpenAI/Anthropic SDKs. Tests run directly from TypeScript with Node's test runner and `tsx`; a build is not required to run them. Editors using `dist/cli/index.js` require a new build and process restart to pick up source changes.
|
|
204
207
|
|
package/dist/agent/agent.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { agent, PROTOCOL_VERSION, RequestError, } from "@agentclientprotocol/sdk";
|
|
2
2
|
import { z } from "zod";
|
|
3
3
|
import pkg from "../../package.json" with { type: "json" };
|
|
4
|
+
import { reportSessionDiagnostic } from "./diagnostics.js";
|
|
4
5
|
import { createSession, getSessionConfigOptions, getSessionModes, selectSessionMode, selectSessionModel, } from "./session.js";
|
|
5
6
|
import { runSessionPrompt } from "./turn.js";
|
|
6
7
|
export function createAgent(config, registry, options = {}) {
|
|
@@ -123,15 +124,28 @@ export function createAgent(config, registry, options = {}) {
|
|
|
123
124
|
})
|
|
124
125
|
.onRequest("session/prompt", async ({ params, client, signal }) => {
|
|
125
126
|
const session = getSession(params.sessionId);
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
127
|
+
try {
|
|
128
|
+
return await runSessionPrompt({
|
|
129
|
+
config,
|
|
130
|
+
registry,
|
|
131
|
+
session,
|
|
132
|
+
capabilities,
|
|
133
|
+
client,
|
|
134
|
+
signal,
|
|
135
|
+
prompt: params.prompt,
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
catch (error) {
|
|
139
|
+
if (error instanceof RequestError) {
|
|
140
|
+
try {
|
|
141
|
+
await reportSessionDiagnostic(client, capabilities, session.id, "error", error.message);
|
|
142
|
+
}
|
|
143
|
+
catch {
|
|
144
|
+
// A closed transport must not replace the original request failure.
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
throw error;
|
|
148
|
+
}
|
|
135
149
|
}));
|
|
136
150
|
}
|
|
137
151
|
//# sourceMappingURL=agent.js.map
|
package/dist/agent/agent.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../../src/agent/agent.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../../src/agent/agent.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { AgentContext, ClientCapabilities } from "@agentclientprotocol/sdk";
|
|
2
|
+
/** Keep diagnostics visible in editors that do not expose JSON-RPC error details. */
|
|
3
|
+
export declare function reportSessionDiagnostic(client: AgentContext, capabilities: ClientCapabilities, sessionId: string, severity: "error" | "warning", message: string): Promise<void>;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/** Keep diagnostics visible in editors that do not expose JSON-RPC error details. */
|
|
2
|
+
export async function reportSessionDiagnostic(client, capabilities, sessionId, severity, message) {
|
|
3
|
+
const supportsNotices = capabilities.session?.notices != null;
|
|
4
|
+
// Fatal errors remain in the transcript even when an editor dismisses notices.
|
|
5
|
+
if (severity === "error" || !supportsNotices) {
|
|
6
|
+
await client.notify("session/update", {
|
|
7
|
+
sessionId,
|
|
8
|
+
update: {
|
|
9
|
+
sessionUpdate: "agent_message_chunk",
|
|
10
|
+
content: {
|
|
11
|
+
type: "text",
|
|
12
|
+
text: `\n\n**acp-port ${severity}**\n\n${message}\n\n`,
|
|
13
|
+
},
|
|
14
|
+
},
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
if (supportsNotices) {
|
|
18
|
+
await client.notify("session/update", {
|
|
19
|
+
sessionId,
|
|
20
|
+
update: {
|
|
21
|
+
sessionUpdate: "notice",
|
|
22
|
+
severity,
|
|
23
|
+
title: `acp-port ${severity}`,
|
|
24
|
+
description: message,
|
|
25
|
+
},
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=diagnostics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../../src/agent/diagnostics.ts"],"names":[],"mappings":"AAKA,qFAAqF;AACrF,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,MAAoB,EACpB,YAAgC,EAChC,SAAiB,EACjB,QAA6B,EAC7B,OAAe;IAEf,MAAM,eAAe,GAAG,YAAY,CAAC,OAAO,EAAE,OAAO,IAAI,IAAI,CAAC;IAC9D,+EAA+E;IAC/E,IAAI,QAAQ,KAAK,OAAO,IAAI,CAAC,eAAe,EAAE,CAAC;QAC7C,MAAM,MAAM,CAAC,MAAM,CAAC,gBAAgB,EAAE;YACpC,SAAS;YACT,MAAM,EAAE;gBACN,aAAa,EAAE,qBAAqB;gBACpC,OAAO,EAAE;oBACP,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,kBAAkB,QAAQ,SAAS,OAAO,MAAM;iBACvD;aACF;SACF,CAAC,CAAC;IACL,CAAC;IACD,IAAI,eAAe,EAAE,CAAC;QACpB,MAAM,MAAM,CAAC,MAAM,CAAC,gBAAgB,EAAE;YACpC,SAAS;YACT,MAAM,EAAE;gBACN,aAAa,EAAE,QAAQ;gBACvB,QAAQ;gBACR,KAAK,EAAE,YAAY,QAAQ,EAAE;gBAC7B,WAAW,EAAE,OAAO;aACrB;SACF,CAAC,CAAC;IACL,CAAC;AACH,CAAC"}
|
package/dist/agent/session.d.ts
CHANGED
|
@@ -16,6 +16,7 @@ export interface AgentSession {
|
|
|
16
16
|
history: Message[];
|
|
17
17
|
mode: AgentMode;
|
|
18
18
|
permissionGrants: Set<string>;
|
|
19
|
+
pendingWarnings: string[];
|
|
19
20
|
activeTurn?: AbortController;
|
|
20
21
|
}
|
|
21
22
|
export declare function createSession(workspaceDirectory: string, config: Config, registry: ProviderRegistry, options: AgentOptions, signal: AbortSignal): Promise<AgentSession>;
|
package/dist/agent/session.js
CHANGED
|
@@ -16,7 +16,8 @@ export async function createSession(workspaceDirectory, config, registry, option
|
|
|
16
16
|
catch {
|
|
17
17
|
throw RequestError.invalidParams(undefined, "Session cwd must be an existing local directory.");
|
|
18
18
|
}
|
|
19
|
-
const
|
|
19
|
+
const discoveryErrors = new Map();
|
|
20
|
+
const modelCatalog = await registry.discover(options.provider, signal, (providerId, error) => discoveryErrors.set(providerId, error));
|
|
20
21
|
const preferredModelId = options.model ??
|
|
21
22
|
(!options.provider ||
|
|
22
23
|
config.defaultModel?.startsWith(`${options.provider}/`)
|
|
@@ -27,6 +28,15 @@ export async function createSession(workspaceDirectory, config, registry, option
|
|
|
27
28
|
? modelCatalog.find((model) => model.id === preferredModelId)
|
|
28
29
|
: modelCatalog.find((model) => model.providerId === initialProviderId);
|
|
29
30
|
if (!selectedModel) {
|
|
31
|
+
const failedProviderId = preferredModelId
|
|
32
|
+
? preferredModelId.split("/")[0]
|
|
33
|
+
: initialProviderId;
|
|
34
|
+
const discoveryError = failedProviderId
|
|
35
|
+
? discoveryErrors.get(failedProviderId)
|
|
36
|
+
: undefined;
|
|
37
|
+
if (discoveryError) {
|
|
38
|
+
throw RequestError.internalError(undefined, `Model discovery failed for provider ${failedProviderId}. ${discoveryError.message} If model listing is unavailable, set --default-model MODEL_ID --no-discovery using the server's upstream model ID.`);
|
|
39
|
+
}
|
|
30
40
|
throw RequestError.invalidParams(undefined, preferredModelId
|
|
31
41
|
? `Selected model ${preferredModelId} is unavailable. Check the endpoint's model list or provide its upstream ID with --default-model.`
|
|
32
42
|
: `No models available for initial provider ${initialProviderId ?? "(none)"}. Check the endpoint URL, authentication, and server, or provide --default-model; no automatic provider fallback is performed.`);
|
|
@@ -37,8 +47,11 @@ export async function createSession(workspaceDirectory, config, registry, option
|
|
|
37
47
|
modelCatalog,
|
|
38
48
|
selectedModel,
|
|
39
49
|
history: [],
|
|
40
|
-
mode:
|
|
50
|
+
mode: "manual",
|
|
41
51
|
permissionGrants: new Set(),
|
|
52
|
+
pendingWarnings: [...discoveryErrors].map(([providerId, error]) => `Model discovery failed for provider ${providerId}. ${error.message} ${config.providers[providerId]?.models?.length
|
|
53
|
+
? "Continuing with configured models for this provider; inference has not been verified."
|
|
54
|
+
: "Its models are unavailable in this session."}`),
|
|
42
55
|
};
|
|
43
56
|
}
|
|
44
57
|
export function getSessionConfigOptions(session) {
|
|
@@ -56,7 +69,8 @@ export function getSessionConfigOptions(session) {
|
|
|
56
69
|
},
|
|
57
70
|
{
|
|
58
71
|
id: "mode",
|
|
59
|
-
name: "
|
|
72
|
+
name: "Permission mode",
|
|
73
|
+
description: "Choose when the editor must approve file writes and commands. Changes apply to this session and cancel pending work.",
|
|
60
74
|
category: "mode",
|
|
61
75
|
type: "select",
|
|
62
76
|
currentValue: session.mode,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/agent/session.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,UAAU,MAAM,kBAAkB,CAAC;AAC1C,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EACL,YAAY,GAGb,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAEL,eAAe,EACf,UAAU,GACX,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/agent/session.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,UAAU,MAAM,kBAAkB,CAAC;AAC1C,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EACL,YAAY,GAGb,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAEL,eAAe,EACf,UAAU,GACX,MAAM,oBAAoB,CAAC;AA0B5B,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,kBAA0B,EAC1B,MAAc,EACd,QAA0B,EAC1B,OAAqB,EACrB,MAAmB;IAEnB,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,kBAAkB,CAAC,EAAE,CAAC;QACzC,MAAM,YAAY,CAAC,aAAa,CAC9B,SAAS,EACT,+BAA+B,CAChC,CAAC;IACJ,CAAC;IACD,IAAI,CAAC;QACH,kBAAkB,GAAG,MAAM,UAAU,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC;QACnE,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;YAC/D,MAAM,IAAI,KAAK,EAAE,CAAC;QACpB,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,YAAY,CAAC,aAAa,CAC9B,SAAS,EACT,kDAAkD,CACnD,CAAC;IACJ,CAAC;IACD,MAAM,eAAe,GAAG,IAAI,GAAG,EAAyB,CAAC;IACzD,MAAM,YAAY,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAC1C,OAAO,CAAC,QAAQ,EAChB,MAAM,EACN,CAAC,UAAU,EAAE,KAAK,EAAE,EAAE,CAAC,eAAe,CAAC,GAAG,CAAC,UAAU,EAAE,KAAK,CAAC,CAC9D,CAAC;IACF,MAAM,gBAAgB,GACpB,OAAO,CAAC,KAAK;QACb,CAAC,CAAC,OAAO,CAAC,QAAQ;YAClB,MAAM,CAAC,YAAY,EAAE,UAAU,CAAC,GAAG,OAAO,CAAC,QAAQ,GAAG,CAAC;YACrD,CAAC,CAAC,MAAM,CAAC,YAAY;YACrB,CAAC,CAAC,SAAS,CAAC,CAAC;IACjB,MAAM,iBAAiB,GACrB,OAAO,CAAC,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;IACvD,MAAM,aAAa,GAAG,gBAAgB;QACpC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,gBAAgB,CAAC;QAC7D,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,KAAK,iBAAiB,CAAC,CAAC;IACzE,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,MAAM,gBAAgB,GAAG,gBAAgB;YACvC,CAAC,CAAC,gBAAgB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAChC,CAAC,CAAC,iBAAiB,CAAC;QACtB,MAAM,cAAc,GAAG,gBAAgB;YACrC,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,gBAAgB,CAAC;YACvC,CAAC,CAAC,SAAS,CAAC;QACd,IAAI,cAAc,EAAE,CAAC;YACnB,MAAM,YAAY,CAAC,aAAa,CAC9B,SAAS,EACT,uCAAuC,gBAAgB,KAAK,cAAc,CAAC,OAAO,qHAAqH,CACxM,CAAC;QACJ,CAAC;QACD,MAAM,YAAY,CAAC,aAAa,CAC9B,SAAS,EACT,gBAAgB;YACd,CAAC,CAAC,kBAAkB,gBAAgB,mGAAmG;YACvI,CAAC,CAAC,4CAA4C,iBAAiB,IAAI,QAAQ,gIAAgI,CAC9M,CAAC;IACJ,CAAC;IACD,OAAO;QACL,EAAE,EAAE,MAAM,CAAC,UAAU,EAAE;QACvB,kBAAkB;QAClB,YAAY;QACZ,aAAa;QACb,OAAO,EAAE,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,gBAAgB,EAAE,IAAI,GAAG,EAAE;QAC3B,eAAe,EAAE,CAAC,GAAG,eAAe,CAAC,CAAC,GAAG,CACvC,CAAC,CAAC,UAAU,EAAE,KAAK,CAAC,EAAE,EAAE,CACtB,uCAAuC,UAAU,KAAK,KAAK,CAAC,OAAO,IACjE,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,MAAM;YAC1C,CAAC,CAAC,uFAAuF;YACzF,CAAC,CAAC,6CACN,EAAE,CACL;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,uBAAuB,CACrC,OAAqB;IAErB,OAAO;QACL;YACE,EAAE,EAAE,OAAO;YACX,IAAI,EAAE,OAAO;YACb,QAAQ,EAAE,OAAO;YACjB,IAAI,EAAE,QAAQ;YACd,YAAY,EAAE,OAAO,CAAC,aAAa,CAAC,EAAE;YACtC,OAAO,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBAC5C,KAAK,EAAE,KAAK,CAAC,EAAE;gBACf,IAAI,EAAE,KAAK,CAAC,IAAI;aACjB,CAAC,CAAC;SACJ;QACD;YACE,EAAE,EAAE,MAAM;YACV,IAAI,EAAE,iBAAiB;YACvB,WAAW,EACT,sHAAsH;YACxH,QAAQ,EAAE,MAAM;YAChB,IAAI,EAAE,QAAQ;YACd,YAAY,EAAE,OAAO,CAAC,IAAI;YAC1B,OAAO,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;gBACjC,KAAK,EAAE,IAAI,CAAC,EAAE;gBACd,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,WAAW,EAAE,IAAI,CAAC,WAAW;aAC9B,CAAC,CAAC;SACJ;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,OAAqB;IACnD,OAAO;QACL,aAAa,EAAE,OAAO,CAAC,IAAI;QAC3B,cAAc,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;KACxD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,OAAqB,EAAE,MAAc;IACrE,MAAM,MAAM,GAAG,eAAe,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IACjD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,YAAY,CAAC,aAAa,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;IAC/D,CAAC;IACD,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC;QACjC,+EAA+E;QAC/E,OAAO,CAAC,UAAU,EAAE,KAAK,CAAC,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC,CAAC;QAC7D,OAAO,CAAC,gBAAgB,CAAC,KAAK,EAAE,CAAC;QACjC,OAAO,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;IAC7B,CAAC;AACH,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,OAAqB,EACrB,OAAe;IAEf,MAAM,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC,IAAI,CAC7C,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,OAAO,CAChC,CAAC;IACF,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,MAAM,YAAY,CAAC,aAAa,CAC9B,SAAS,EACT,gFAAgF,CACjF,CAAC;IACJ,CAAC;IACD,gFAAgF;IAChF,OAAO,CAAC,aAAa,GAAG,aAAa,CAAC;AACxC,CAAC"}
|
package/dist/agent/turn.js
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { RequestError, } from "@agentclientprotocol/sdk";
|
|
2
2
|
import { getModeInstructions } from "../config/modes.js";
|
|
3
|
+
import { ProviderError, } from "../providers/provider-contract.js";
|
|
3
4
|
import { ToolRunner } from "../tools/runner.js";
|
|
5
|
+
import { reportSessionDiagnostic } from "./diagnostics.js";
|
|
4
6
|
import { extractPromptText } from "./prompt-content.js";
|
|
5
7
|
const MAX_TOOL_CALLS_PER_RESPONSE = 32;
|
|
6
8
|
const DEFAULT_SYSTEM_PROMPT = `You are a coding assistant running inside the user's editor.
|
|
@@ -24,29 +26,43 @@ export async function runSessionPrompt({ config, registry, session, capabilities
|
|
|
24
26
|
throw RequestError.invalidParams(undefined, "Session history limit reached. Start a new session or increase agent.maxHistoryChars.");
|
|
25
27
|
}
|
|
26
28
|
const selectedModel = session.selectedModel;
|
|
29
|
+
const historyLength = session.history.length;
|
|
27
30
|
const controller = new AbortController();
|
|
28
31
|
session.activeTurn = controller;
|
|
29
32
|
session.history.push({ role: "user", content: text });
|
|
30
33
|
const turnSignal = AbortSignal.any([signal, controller.signal]);
|
|
31
34
|
try {
|
|
32
|
-
|
|
35
|
+
// Wait until the editor knows the session ID before displaying discovery warnings.
|
|
36
|
+
for (const warning of session.pendingWarnings) {
|
|
37
|
+
turnSignal.throwIfAborted();
|
|
38
|
+
await reportSessionDiagnostic(client, capabilities, session.id, "warning", warning);
|
|
39
|
+
}
|
|
40
|
+
session.pendingWarnings = [];
|
|
41
|
+
return await runModelToolLoop(config, registry, session, capabilities, client, turnSignal, selectedModel);
|
|
33
42
|
}
|
|
34
43
|
catch (error) {
|
|
44
|
+
// A failed request with no response must not leave consecutive user messages
|
|
45
|
+
// on retry: strict chat templates (including local models) reject them.
|
|
46
|
+
// Once text or tool activity exists, preserve it for an accurate history.
|
|
47
|
+
if (session.history.length === historyLength + 1) {
|
|
48
|
+
session.history.pop();
|
|
49
|
+
}
|
|
35
50
|
if (turnSignal.aborted) {
|
|
36
51
|
return { stopReason: "cancelled" };
|
|
37
52
|
}
|
|
38
|
-
//
|
|
53
|
+
// Only explicitly sanitized provider errors are safe to show in the editor.
|
|
39
54
|
if (error instanceof RequestError) {
|
|
40
55
|
throw error;
|
|
41
56
|
}
|
|
42
|
-
throw RequestError.internalError(undefined, `Provider ${selectedModel.providerId} request failed
|
|
57
|
+
throw RequestError.internalError(undefined, `Provider ${selectedModel.providerId} request failed for model ${selectedModel.modelId}. ${error instanceof ProviderError
|
|
58
|
+
? error.message
|
|
59
|
+
: "Check its API key, model, URL, and server logs."}`);
|
|
43
60
|
}
|
|
44
61
|
finally {
|
|
45
62
|
session.activeTurn = undefined;
|
|
46
63
|
}
|
|
47
64
|
}
|
|
48
|
-
async function runModelToolLoop(config, registry, session, capabilities, client, signal) {
|
|
49
|
-
const model = session.selectedModel;
|
|
65
|
+
async function runModelToolLoop(config, registry, session, capabilities, client, signal, model) {
|
|
50
66
|
const provider = registry.get(model.providerId);
|
|
51
67
|
const toolRunner = new ToolRunner({
|
|
52
68
|
client,
|
package/dist/agent/turn.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"turn.js","sourceRoot":"","sources":["../../src/agent/turn.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,YAAY,GACb,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"turn.js","sourceRoot":"","sources":["../../src/agent/turn.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/arguments.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { AgentOptions } from "../agent/session.js";
|
|
2
2
|
import { type Config } from "../config/schema.js";
|
|
3
|
-
export declare const CLI_HELP = "acp-port \u2014 local models and LLM APIs over ACP\n\nUsage:\n acp-port [serve] [--base-url URL] [--default-model MODEL_ID]\n [--provider PROVIDER] [--name NAME] [--no-discovery] [--no-tools]\n
|
|
3
|
+
export declare const CLI_HELP = "acp-port \u2014 local models and LLM APIs over ACP\n\nUsage:\n acp-port [serve] [--base-url URL] [--default-model MODEL_ID]\n [--provider PROVIDER] [--name NAME] [--no-discovery] [--no-tools]\n acp-port [serve] --provider openai|anthropic|gemini [--default-model MODEL_ID]\n acp-port models [--base-url URL] [--json]\n [--provider PROVIDER] [--default-model MODEL_ID] [--no-discovery]\n\nProviders: openai (default), anthropic, gemini\nEach launch uses only its CLI options and environment; no configuration file is used.\nThe openai provider uses Chat Completions at https://api.openai.com/v1 by default.\nUse --base-url for local models and proxies that support the same API.\n--default-model selects the initial model using its upstream ID, including any slashes.\nOther discovered models remain selectable; without this option the first model is used.\nSet API_KEY in the editor entry's env object for endpoint authentication.\nOpenAI, Anthropic, and Gemini require API keys; local endpoints may not need one.\nProvider-specific key variables such as OPENAI_API_KEY are not used.\n--no-discovery requires --default-model. Models are discovered, not downloaded.\nSessions start in Ask permission; select permission modes through your editor's ACP controls.\nModes use the agent/editor process's OS permissions; they do not grant administrator privileges.\nWith no command, starts serve. Use --help for usage and --version for version.\n";
|
|
4
4
|
export type CliCommand = {
|
|
5
5
|
name: "help" | "version";
|
|
6
6
|
} | {
|
package/dist/cli/arguments.js
CHANGED
|
@@ -5,7 +5,6 @@ export const CLI_HELP = `acp-port — local models and LLM APIs over ACP
|
|
|
5
5
|
Usage:
|
|
6
6
|
acp-port [serve] [--base-url URL] [--default-model MODEL_ID]
|
|
7
7
|
[--provider PROVIDER] [--name NAME] [--no-discovery] [--no-tools]
|
|
8
|
-
[--mode manual|accept-edits|plan|auto|full-access]
|
|
9
8
|
acp-port [serve] --provider openai|anthropic|gemini [--default-model MODEL_ID]
|
|
10
9
|
acp-port models [--base-url URL] [--json]
|
|
11
10
|
[--provider PROVIDER] [--default-model MODEL_ID] [--no-discovery]
|
|
@@ -20,8 +19,7 @@ Set API_KEY in the editor entry's env object for endpoint authentication.
|
|
|
20
19
|
OpenAI, Anthropic, and Gemini require API keys; local endpoints may not need one.
|
|
21
20
|
Provider-specific key variables such as OPENAI_API_KEY are not used.
|
|
22
21
|
--no-discovery requires --default-model. Models are discovered, not downloaded.
|
|
23
|
-
|
|
24
|
-
--mode full-access runs all tools locally without approval prompts or workspace path restrictions.
|
|
22
|
+
Sessions start in Ask permission; select permission modes through your editor's ACP controls.
|
|
25
23
|
Modes use the agent/editor process's OS permissions; they do not grant administrator privileges.
|
|
26
24
|
With no command, starts serve. Use --help for usage and --version for version.
|
|
27
25
|
`;
|
|
@@ -40,7 +38,6 @@ export function parseCliArguments(args) {
|
|
|
40
38
|
json: { type: "boolean" },
|
|
41
39
|
"no-discovery": { type: "boolean" },
|
|
42
40
|
"no-tools": { type: "boolean" },
|
|
43
|
-
mode: { type: "string" },
|
|
44
41
|
},
|
|
45
42
|
});
|
|
46
43
|
if (values.help) {
|
|
@@ -73,11 +70,8 @@ export function parseCliArguments(args) {
|
|
|
73
70
|
}
|
|
74
71
|
assertAllowedOptions([
|
|
75
72
|
...connectionOptions,
|
|
76
|
-
...(commandName === "models" ? ["json"] : [
|
|
73
|
+
...(commandName === "models" ? ["json"] : []),
|
|
77
74
|
]);
|
|
78
|
-
if (values.mode === "full-access" && values["no-tools"]) {
|
|
79
|
-
throw new Error("--mode full-access cannot be combined with --no-tools.");
|
|
80
|
-
}
|
|
81
75
|
if (values["default-model"] && values["default-model"].length !== 1) {
|
|
82
76
|
throw new Error("--default-model accepts exactly one model.");
|
|
83
77
|
}
|
|
@@ -86,7 +80,6 @@ export function parseCliArguments(args) {
|
|
|
86
80
|
throw new Error("--no-discovery requires --default-model.");
|
|
87
81
|
}
|
|
88
82
|
const config = configSchema.parse({
|
|
89
|
-
agent: { mode: values.mode ?? "manual" },
|
|
90
83
|
providers: {
|
|
91
84
|
endpoint: {
|
|
92
85
|
type: values.provider ?? "openai",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"arguments.js","sourceRoot":"","sources":["../../src/cli/arguments.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAe,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEhE,MAAM,CAAC,MAAM,QAAQ,GAAG
|
|
1
|
+
{"version":3,"file":"arguments.js","sourceRoot":"","sources":["../../src/cli/arguments.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAe,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEhE,MAAM,CAAC,MAAM,QAAQ,GAAG;;;;;;;;;;;;;;;;;;;;;;CAsBvB,CAAC;AAOF,gFAAgF;AAChF,MAAM,UAAU,iBAAiB,CAAC,IAAc;IAC9C,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC;QAC7C,IAAI;QACJ,gBAAgB,EAAE,IAAI;QACtB,OAAO,EAAE;YACP,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE;YACrC,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;YAC5B,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YAC5B,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YAC9B,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YACxB,eAAe,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;YACnD,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;YACzB,cAAc,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;YACnC,UAAU,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;SAChC;KACF,CAAC,CAAC;IACH,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QAChB,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAC1B,CAAC;IACD,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;IAC7B,CAAC;IACD,MAAM,WAAW,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC;IAC9C,MAAM,oBAAoB,GAAG,CAAC,OAAiB,EAAE,EAAE;QACjD,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;QACjE,CAAC;QACD,KAAK,MAAM,UAAU,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YAC7C,IAAI,CAAC,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC1D,MAAM,IAAI,KAAK,CAAC,KAAK,UAAU,qBAAqB,WAAW,GAAG,CAAC,CAAC;YACtE,CAAC;QACH,CAAC;IACH,CAAC,CAAC;IACF,MAAM,iBAAiB,GAAG;QACxB,UAAU;QACV,UAAU;QACV,MAAM;QACN,eAAe;QACf,cAAc;QACd,UAAU;KACX,CAAC;IAEF,IAAI,WAAW,KAAK,OAAO,IAAI,WAAW,KAAK,QAAQ,EAAE,CAAC;QACxD,MAAM,IAAI,KAAK,CAAC,oBAAoB,WAAW,eAAe,CAAC,CAAC;IAClE,CAAC;IACD,oBAAoB,CAAC;QACnB,GAAG,iBAAiB;QACpB,GAAG,CAAC,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;KAC9C,CAAC,CAAC;IAEH,IAAI,MAAM,CAAC,eAAe,CAAC,IAAI,MAAM,CAAC,eAAe,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpE,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;IAChE,CAAC;IACD,MAAM,YAAY,GAAG,MAAM,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAClD,IAAI,MAAM,CAAC,cAAc,CAAC,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;QACzD,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;IAC9D,CAAC;IACD,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC;QAChC,SAAS,EAAE;YACT,QAAQ,EAAE;gBACR,IAAI,EAAE,MAAM,CAAC,QAAQ,IAAI,QAAQ;gBACjC,OAAO,EAAE,MAAM,CAAC,UAAU,CAAC;gBAC3B,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,MAAM,EACJ,YAAY,KAAK,SAAS;oBACxB,CAAC,CAAC,SAAS;oBACX,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;gBAChD,cAAc,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC;gBACvC,KAAK,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC;aAC3B;SACF;KACF,CAAC,CAAC;IACH,OAAO,WAAW,KAAK,QAAQ;QAC7B,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,KAAK,EAAE;QACxD,CAAC,CAAC;YACE,IAAI,EAAE,OAAO;YACb,MAAM;YACN,SAAS,EAAE;gBACT,QAAQ,EAAE,UAAU;gBACpB,KAAK,EACH,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,YAAY,YAAY,EAAE;aACtE;SACF,CAAC;AACR,CAAC"}
|
package/dist/config/modes.js
CHANGED
|
@@ -9,8 +9,8 @@ export const agentModeSchema = z.enum([
|
|
|
9
9
|
export const agentModes = [
|
|
10
10
|
{
|
|
11
11
|
id: "manual",
|
|
12
|
-
name: "
|
|
13
|
-
description: "Ask
|
|
12
|
+
name: "Ask permission",
|
|
13
|
+
description: "Ask the editor to approve each file write and command; workspace reads are allowed.",
|
|
14
14
|
},
|
|
15
15
|
{
|
|
16
16
|
id: "accept-edits",
|
|
@@ -24,7 +24,7 @@ export const agentModes = [
|
|
|
24
24
|
},
|
|
25
25
|
{
|
|
26
26
|
id: "auto",
|
|
27
|
-
name: "
|
|
27
|
+
name: "Ask and remember",
|
|
28
28
|
description: "Ask for new actions and remember explicit session approvals for a file or exact command.",
|
|
29
29
|
},
|
|
30
30
|
{
|
package/dist/config/modes.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"modes.js","sourceRoot":"","sources":["../../src/config/modes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,IAAI,CAAC;IACpC,QAAQ;IACR,cAAc;IACd,MAAM;IACN,MAAM;IACN,aAAa;CACd,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB;QACE,EAAE,EAAE,QAAQ;QACZ,IAAI,EAAE,
|
|
1
|
+
{"version":3,"file":"modes.js","sourceRoot":"","sources":["../../src/config/modes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,IAAI,CAAC;IACpC,QAAQ;IACR,cAAc;IACd,MAAM;IACN,MAAM;IACN,aAAa;CACd,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB;QACE,EAAE,EAAE,QAAQ;QACZ,IAAI,EAAE,gBAAgB;QACtB,WAAW,EACT,qFAAqF;KACxF;IACD;QACE,EAAE,EAAE,cAAc;QAClB,IAAI,EAAE,cAAc;QACpB,WAAW,EACT,gEAAgE;KACnE;IACD;QACE,EAAE,EAAE,MAAM;QACV,IAAI,EAAE,MAAM;QACZ,WAAW,EACT,qFAAqF;KACxF;IACD;QACE,EAAE,EAAE,MAAM;QACV,IAAI,EAAE,kBAAkB;QACxB,WAAW,EACT,0FAA0F;KAC7F;IACD;QACE,EAAE,EAAE,aAAa;QACjB,IAAI,EAAE,aAAa;QACnB,WAAW,EACT,gFAAgF;KACnF;CACoE,CAAC;AAExE,MAAM,UAAU,mBAAmB,CAAC,IAAe;IACjD,MAAM,QAAQ,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,IAAI,CAAC,CAAC;IAC/D,OAAO,SAAS,IAAI,KAAK,QAAQ,EAAE,WAAW,KAC5C,IAAI,KAAK,aAAa;QACpB,CAAC,CAAC,yHAAyH;QAC3H,CAAC,CAAC,oFACN,EAAE,CAAC;AACL,CAAC"}
|
package/dist/config/schema.d.ts
CHANGED
|
@@ -90,13 +90,6 @@ export declare const configSchema: z.ZodObject<{
|
|
|
90
90
|
apiKeyEnv: z.ZodDefault<z.ZodString>;
|
|
91
91
|
}, z.core.$strict>], "type">>>;
|
|
92
92
|
agent: z.ZodPrefault<z.ZodObject<{
|
|
93
|
-
mode: z.ZodDefault<z.ZodEnum<{
|
|
94
|
-
"accept-edits": "accept-edits";
|
|
95
|
-
auto: "auto";
|
|
96
|
-
"full-access": "full-access";
|
|
97
|
-
manual: "manual";
|
|
98
|
-
plan: "plan";
|
|
99
|
-
}>>;
|
|
100
93
|
maxSteps: z.ZodDefault<z.ZodNumber>;
|
|
101
94
|
maxHistoryChars: z.ZodDefault<z.ZodNumber>;
|
|
102
95
|
toolTimeoutMs: z.ZodDefault<z.ZodNumber>;
|
package/dist/config/schema.js
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
import { agentModeSchema } from "./modes.js";
|
|
3
2
|
export const entryId = z.string().regex(/^[a-zA-Z0-9][a-zA-Z0-9_-]*$/);
|
|
4
3
|
const environmentVariableNameSchema = z
|
|
5
4
|
.string()
|
|
@@ -56,7 +55,6 @@ export const configSchema = z
|
|
|
56
55
|
providers: z.record(entryId, providerSchema).default({}),
|
|
57
56
|
agent: z
|
|
58
57
|
.object({
|
|
59
|
-
mode: agentModeSchema.default("manual"),
|
|
60
58
|
maxSteps: z.number().int().min(1).max(100).default(12),
|
|
61
59
|
maxHistoryChars: z.number().int().min(1_000).default(200_000),
|
|
62
60
|
toolTimeoutMs: z
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type ApiProviderConfig, type GenerateRequest, type Model, type ModelEvent, type Provider } from "../provider-contract.js";
|
|
2
2
|
/** Native Anthropic Messages API; does not read Claude subscription credentials. */
|
|
3
3
|
export declare class AnthropicProvider implements Provider {
|
|
4
4
|
private readonly config;
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { ProviderError, } from "../provider-contract.js";
|
|
1
2
|
import { createProviderRequestSignal, sanitizeProviderError, validateToolCalls, } from "../support/request-handling.js";
|
|
2
3
|
import { ConfiguredAnthropicClient } from "../support/sdk-clients.js";
|
|
3
4
|
/** Native Anthropic Messages API; does not read Claude subscription credentials. */
|
|
@@ -9,27 +10,28 @@ export class AnthropicProvider {
|
|
|
9
10
|
this.client = new ConfiguredAnthropicClient(config);
|
|
10
11
|
}
|
|
11
12
|
async listModels(signal) {
|
|
13
|
+
const requestSignal = createProviderRequestSignal(this.config, signal);
|
|
12
14
|
try {
|
|
13
15
|
const models = [];
|
|
14
|
-
for await (const model of this.client.models.list({}, { signal:
|
|
16
|
+
for await (const model of this.client.models.list({}, { signal: requestSignal })) {
|
|
15
17
|
models.push({ id: model.id, name: model.display_name });
|
|
16
18
|
}
|
|
17
19
|
return models;
|
|
18
20
|
}
|
|
19
21
|
catch (error) {
|
|
20
|
-
throw sanitizeProviderError(error);
|
|
22
|
+
throw sanitizeProviderError(error, this.config, requestSignal);
|
|
21
23
|
}
|
|
22
24
|
}
|
|
23
25
|
async *generate(request) {
|
|
26
|
+
const signal = createProviderRequestSignal(this.config, request.signal);
|
|
24
27
|
try {
|
|
25
|
-
yield* this.generateStream(request);
|
|
28
|
+
yield* this.generateStream(request, signal);
|
|
26
29
|
}
|
|
27
30
|
catch (error) {
|
|
28
|
-
throw sanitizeProviderError(error);
|
|
31
|
+
throw sanitizeProviderError(error, this.config, signal);
|
|
29
32
|
}
|
|
30
33
|
}
|
|
31
|
-
async *generateStream(request) {
|
|
32
|
-
const signal = createProviderRequestSignal(this.config, request.signal);
|
|
34
|
+
async *generateStream(request, signal) {
|
|
33
35
|
const stream = await this.client.messages.create({
|
|
34
36
|
model: request.model,
|
|
35
37
|
system: request.system,
|
|
@@ -74,7 +76,7 @@ export class AnthropicProvider {
|
|
|
74
76
|
else if (event.delta.type === "input_json_delta") {
|
|
75
77
|
const pending = calls.get(event.index);
|
|
76
78
|
if (!pending) {
|
|
77
|
-
throw new
|
|
79
|
+
throw new ProviderError("Anthropic streamed tool input without a tool call.", "protocol");
|
|
78
80
|
}
|
|
79
81
|
pending.call.arguments += event.delta.partial_json;
|
|
80
82
|
}
|
|
@@ -98,7 +100,7 @@ export class AnthropicProvider {
|
|
|
98
100
|
}
|
|
99
101
|
signal.throwIfAborted();
|
|
100
102
|
if (!completed || !stopReason) {
|
|
101
|
-
throw new
|
|
103
|
+
throw new ProviderError("Anthropic stream ended before the message completed; retry the prompt.", "protocol");
|
|
102
104
|
}
|
|
103
105
|
if (stopReason === "max_tokens" ||
|
|
104
106
|
stopReason === "model_context_window_exceeded") {
|
|
@@ -110,13 +112,13 @@ export class AnthropicProvider {
|
|
|
110
112
|
return;
|
|
111
113
|
}
|
|
112
114
|
if (stopReason === "pause_turn") {
|
|
113
|
-
throw new
|
|
115
|
+
throw new ProviderError("Anthropic paused the turn before completion; retry the prompt.", "protocol");
|
|
114
116
|
}
|
|
115
117
|
const completeCalls = [...calls.entries()]
|
|
116
118
|
.sort(([a], [b]) => a - b)
|
|
117
119
|
.map(([, pending]) => {
|
|
118
120
|
if (!pending.complete) {
|
|
119
|
-
throw new
|
|
121
|
+
throw new ProviderError("Anthropic returned an incomplete tool call.", "protocol");
|
|
120
122
|
}
|
|
121
123
|
return {
|
|
122
124
|
...pending.call,
|