adonis-ai-kit 1.1.0 → 1.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.
Files changed (86) hide show
  1. package/CHANGELOG.md +74 -0
  2. package/README.md +77 -5
  3. package/dist/src/acp/acp_agents.d.ts +25 -11
  4. package/dist/src/acp/acp_agents.d.ts.map +1 -1
  5. package/dist/src/acp/acp_agents.js +62 -38
  6. package/dist/src/acp/acp_agents.js.map +1 -1
  7. package/dist/src/acp/provider.d.ts +14 -4
  8. package/dist/src/acp/provider.d.ts.map +1 -1
  9. package/dist/src/acp/provider.js +23 -2
  10. package/dist/src/acp/provider.js.map +1 -1
  11. package/dist/src/acp/types.d.ts +21 -0
  12. package/dist/src/acp/types.d.ts.map +1 -1
  13. package/dist/src/agents/loader.d.ts +3 -3
  14. package/dist/src/agents/loader.d.ts.map +1 -1
  15. package/dist/src/agents/loader.js.map +1 -1
  16. package/dist/src/ai_manager.d.ts +12 -8
  17. package/dist/src/ai_manager.d.ts.map +1 -1
  18. package/dist/src/ai_manager.js +128 -15
  19. package/dist/src/ai_manager.js.map +1 -1
  20. package/dist/src/budget/types.d.ts +1 -6
  21. package/dist/src/budget/types.d.ts.map +1 -1
  22. package/dist/src/catalog/source.d.ts +18 -3
  23. package/dist/src/catalog/source.d.ts.map +1 -1
  24. package/dist/src/catalog/source.js +15 -5
  25. package/dist/src/catalog/source.js.map +1 -1
  26. package/dist/src/circuit_breaker.d.ts +21 -0
  27. package/dist/src/circuit_breaker.d.ts.map +1 -1
  28. package/dist/src/circuit_breaker.js +64 -19
  29. package/dist/src/circuit_breaker.js.map +1 -1
  30. package/dist/src/error_classifier.d.ts +34 -1
  31. package/dist/src/error_classifier.d.ts.map +1 -1
  32. package/dist/src/error_classifier.js +159 -33
  33. package/dist/src/error_classifier.js.map +1 -1
  34. package/dist/src/guard/registry.d.ts +6 -0
  35. package/dist/src/guard/registry.d.ts.map +1 -1
  36. package/dist/src/guard/registry.js +12 -2
  37. package/dist/src/guard/registry.js.map +1 -1
  38. package/dist/src/guard/types.d.ts +6 -7
  39. package/dist/src/guard/types.d.ts.map +1 -1
  40. package/dist/src/index.d.ts +4 -1
  41. package/dist/src/index.d.ts.map +1 -1
  42. package/dist/src/index.js +2 -0
  43. package/dist/src/index.js.map +1 -1
  44. package/dist/src/logger.d.ts +7 -0
  45. package/dist/src/logger.d.ts.map +1 -0
  46. package/dist/src/logger.js +2 -0
  47. package/dist/src/logger.js.map +1 -0
  48. package/dist/src/models/catalog_resolver.d.ts +24 -0
  49. package/dist/src/models/catalog_resolver.d.ts.map +1 -0
  50. package/dist/src/models/catalog_resolver.js +66 -0
  51. package/dist/src/models/catalog_resolver.js.map +1 -0
  52. package/dist/src/models/index.d.ts +14 -0
  53. package/dist/src/models/index.d.ts.map +1 -0
  54. package/dist/src/models/index.js +8 -0
  55. package/dist/src/models/index.js.map +1 -0
  56. package/dist/src/models/keys.d.ts +9 -0
  57. package/dist/src/models/keys.d.ts.map +1 -0
  58. package/dist/src/models/keys.js +12 -0
  59. package/dist/src/models/keys.js.map +1 -0
  60. package/dist/src/models/language_model_factory.d.ts +44 -0
  61. package/dist/src/models/language_model_factory.d.ts.map +1 -0
  62. package/dist/src/models/language_model_factory.js +193 -0
  63. package/dist/src/models/language_model_factory.js.map +1 -0
  64. package/dist/src/models/model_chain.d.ts +58 -0
  65. package/dist/src/models/model_chain.d.ts.map +1 -0
  66. package/dist/src/models/model_chain.js +144 -0
  67. package/dist/src/models/model_chain.js.map +1 -0
  68. package/dist/src/models/model_ref.d.ts +12 -0
  69. package/dist/src/models/model_ref.d.ts.map +1 -0
  70. package/dist/src/models/model_ref.js +33 -0
  71. package/dist/src/models/model_ref.js.map +1 -0
  72. package/dist/src/models/protocols.d.ts +6 -0
  73. package/dist/src/models/protocols.d.ts.map +1 -0
  74. package/dist/src/models/protocols.js +33 -0
  75. package/dist/src/models/protocols.js.map +1 -0
  76. package/dist/src/models/provider_factories.d.ts +19 -0
  77. package/dist/src/models/provider_factories.d.ts.map +1 -0
  78. package/dist/src/models/provider_factories.js +70 -0
  79. package/dist/src/models/provider_factories.js.map +1 -0
  80. package/dist/src/models/types.d.ts +17 -0
  81. package/dist/src/models/types.d.ts.map +1 -0
  82. package/dist/src/models/types.js +2 -0
  83. package/dist/src/models/types.js.map +1 -0
  84. package/dist/src/types.d.ts +46 -3
  85. package/dist/src/types.d.ts.map +1 -1
  86. package/package.json +70 -4
package/CHANGELOG.md ADDED
@@ -0,0 +1,74 @@
1
+ # Changelog
2
+
3
+ All notable changes to `adonis-ai-kit` are documented in this file.
4
+ The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
5
+
6
+ ## [1.2.0] - 2026-10-22
7
+
8
+ Includes the work previously staged as the 1.3.0 and 1.4.0 candidates, which were never published.
9
+
10
+ ### Added
11
+
12
+ - `adonis-ai-kit/models` subpath export:
13
+ - Types and helpers: `ResolvedModel`, `parseModelRef`, `modelKeyFor`, `breakerKeyFor`, `PROTOCOL_TO_NPM`, `resolveProviderNpm`.
14
+ - `ProviderFactory`, `BUILTIN_PROVIDER_EXPORTS` and `ProviderFactoryRegistry` (lazy import of known AI SDK provider packages, plus `register()` for custom ones).
15
+ - `LanguageModelFactory`: 180 s fetch timeout, secret-header redaction in logs, ACP models through `AcpDriver`, and `shutdown()`.
16
+ - `ModelResolver` and `CatalogModelResolver`.
17
+ - `buildChainCandidates`, `runModelChain` and `FallbackEvent` for running a call over an ordered model chain with per-credential circuit breakers.
18
+ - `AcpDriverDeps.runtime`: a prebuilt runtime config for the ACP driver.
19
+ - `AiManager` call options:
20
+ - `schema` (structured `output` on `generateText` and `streamText`), `stopWhen`, `maxRetries`, `onStepFinish`.
21
+ - `models` and `onFallback` to run a call over a dynamic model chain.
22
+ - `AiConfig.resolver` and `AiConfig.languageModels`.
23
+ - Optional `peerDependencies` for the AI SDK provider packages.
24
+ - `LanguageModelFactory` options `acp.inheritEnv` (pass the full server environment to agents) and `acp.shareDriver` (set to `false` to give every model its own driver and agent process).
25
+ - Single `Logger` type shared by all modules (`LoggerContract` stays as a deprecated alias).
26
+ - `ErrorClassification.errorClass` and `ErrorClassification.countsAsFailure`, plus the `countsAsBreakerFailure()` helper.
27
+ - `CircuitBreaker.acquire()` returning a `BreakerPermit`, and `CircuitBreaker.resetAll()`.
28
+ - `ToolAccessOptions.permissions` for per-call tool permissions.
29
+ - ACP: `AcpAgentConfig.credentialEnv` and `buildAcpRuntimeConfig(agentId, options)` with `projectMcpPath` (the positional form keeps working).
30
+ - Error taxonomy exported from the package root: `ErrorClass` (11 classes), `classifyErrorClass()`, `isRetryableError()` and `getUserFriendlyMessage()`.
31
+ - Replaceable ACP agent registry: `registerAcpAgent()`, `setAcpAgents()` and `resetAcpAgents()`, so an application can point an agent at the binary installed on the machine.
32
+ - Catalog option `injectSystemProviders` (default `true`) to turn off the automatic injection of openai/anthropic/google; superseded within this release by `systemProviders` and kept as a deprecated alias.
33
+ - Catalog: `systemProviders: { fallback, acp }` option (also available as `CatalogConfig.systemProviders`) to inject fallback and ACP providers independently.
34
+
35
+ ### Changed
36
+
37
+ - Optional provider peer dependencies accept any version.
38
+ - Behavior changes to be aware of:
39
+ - `prompt_too_long` and `no_output_generated` errors now fall back to the next provider but never open the circuit breaker.
40
+ - Errors recognised only through `isRetryable === true` fall back, but no longer count against the circuit breaker.
41
+ - `ErrorClassification` gained two required fields (`errorClass`, `countsAsFailure`). This only affects code that constructs the interface itself.
42
+ - `dist/` is no longer tracked in git (it is still built and shipped in the npm package).
43
+
44
+ ### Deprecated
45
+
46
+ - `injectSystemProviders` (added earlier in this release, then superseded by `systemProviders`) — use `systemProviders`.
47
+ - The `sourcecraft` and `freebuff` default ACP agents — they will be removed from the defaults in 2.0; register them with `registerAcpAgent()`.
48
+ - `LoggerContract` — use `Logger`.
49
+
50
+ ### Fixed
51
+
52
+ - `ToolDefinition.description` accepts the AI SDK v7 tool description type (string or function); the confirmation action falls back to the tool name.
53
+ - One error taxonomy now drives both fallback and circuit-breaker decisions.
54
+ - HTTP status codes are found in `status`, `response.status`, nested `cause` and `lastError` (AI SDK `RetryError`).
55
+ - HTTP 409 and 425 are classified as `overloaded`.
56
+ - ACP agents registered with `setAcpAgents()`/`registerAcpAgent()` without `credentialEnv` inherit the built-in agent's credentials for the same id; `credentialEnv: []` opts out.
57
+ - `CircuitBreaker.execute()` frees its probe slot even if `isFailure` throws.
58
+ - Model chains fall through to the next candidate on missing provider packages, config errors and open breakers (without counting against the breaker), and reject a missing resolver up front.
59
+ - Rejections of an async `onFallback` handler are caught and logged.
60
+ - ACP models in `AiManager` chains use its `ConfirmationService`.
61
+ - `AcpDriver` blanks `process.env` keys that are missing from a custom env source.
62
+ - `LanguageModelFactory` with `acp.shareDriver: false` no longer retains a driver per call: the driver is released when its call ends.
63
+
64
+ ### Notes
65
+
66
+ - An exhausted `models` chain rethrows the last error (or `ProviderUnavailableError` if no candidate could be attempted), unlike the provider cascade, which throws `CascadingFallbackError`.
67
+
68
+ ### Development
69
+
70
+ - Japa test harness.
71
+
72
+ ## [1.1.0]
73
+
74
+ Initial public release.
package/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # adonis-ai
1
+ # adonis-ai-kit
2
2
 
3
3
  > **Production-grade AI & Agentic workflow toolkit for AdonisJS 7**, powered by Vercel AI SDK v7, multi-provider cascading fallback, circuit breakers, tool security guardrails, token budget tracking, models.dev live catalog, and ACP (Agent Client Protocol) coding agents.
4
4
 
@@ -13,9 +13,9 @@
13
13
 
14
14
  ## Highlights & Architectural Comparison
15
15
 
16
- While frameworks like **Laravel AI** and **Prism** bring basic prompt-level abstractions to PHP, enterprise production systems require strict SRE resilience, tool execution guardrails, cost guarantees, and streaming protocol integrity. **`adonis-ai`** is built from the ground up for high-concurrency Node.js microservices:
16
+ While frameworks like **Laravel AI** and **Prism** bring basic prompt-level abstractions to PHP, enterprise production systems require strict SRE resilience, tool execution guardrails, cost guarantees, and streaming protocol integrity. **`adonis-ai-kit`** is built from the ground up for high-concurrency Node.js microservices:
17
17
 
18
- | Feature | `adonis-ai` (AdonisJS 7) | Laravel AI / Prism (PHP) |
18
+ | Feature | `adonis-ai-kit` (AdonisJS 7) | Laravel AI / Prism (PHP) |
19
19
  | :--- | :--- | :--- |
20
20
  | **Foundation Engine** | **Vercel AI SDK v7** (native Node.js async streams & tool calls) | Custom cURL/Guzzle wrappers |
21
21
  | **Circuit Breaker** | **Per `provider:model` key** (isolated half-open state, probe limits) | Global or none |
@@ -131,7 +131,7 @@ console.log(`Duration: ${result.durationMs}ms, Cost: $${result.costUsd}`)
131
131
  console.log(`Tokens: in=${result.usage.inputTokens}, out=${result.usage.outputTokens}, cached=${result.usage.cacheReadTokens}`)
132
132
  ```
133
133
 
134
- If OpenAI returns `429 Rate Limit` or `503 Service Unavailable`, `adonis-ai` automatically routes the request to `anthropic` with its configured model, recording circuit breaker metrics.
134
+ If OpenAI returns `429 Rate Limit` or `503 Service Unavailable`, `adonis-ai-kit` automatically routes the request to `anthropic` with its configured model, recording circuit breaker metrics. A `prompt_too_long` failure also moves on to the next model, but never counts against (or opens) the circuit breaker.
135
135
 
136
136
  ---
137
137
 
@@ -182,6 +182,29 @@ export default class ChatController {
182
182
  }
183
183
  ```
184
184
 
185
+ #### Structured output with tools in a stream
186
+
187
+ `schema`, `stopWhen`, `maxRetries` and `onStepFinish` work for both `generateText` and `streamText`:
188
+
189
+ ```ts
190
+ import { stepCountIs } from 'ai'
191
+ import { z } from 'zod'
192
+
193
+ const stream = await ai.streamText({
194
+ prompt: 'Find the cheapest flight and summarise it.',
195
+ tools: { searchFlights },
196
+ schema: z.object({ airline: z.string(), priceUsd: z.number() }),
197
+ stopWhen: stepCountIs(6), // takes precedence over `maxSteps`
198
+ maxRetries: 0, // fail fast, let the fallback chain take over
199
+ onStepFinish: (step) => console.log('step done', step.finishReason),
200
+ })
201
+
202
+ for await (const part of stream.fullStream) {
203
+ // forward parts to the client...
204
+ }
205
+ const flight = await stream.output // parsed against the schema
206
+ ```
207
+
185
208
  ---
186
209
 
187
210
  ### 4. Tool Security Guardrails & Human-in-the-Loop (HITL)
@@ -260,11 +283,60 @@ const execution = await runner.run({
260
283
  })
261
284
  ```
262
285
 
286
+ Agents declare the credentials they need and can receive a project MCP server explicitly:
287
+
288
+ ```ts
289
+ import { registerAcpAgent, buildAcpRuntimeConfig } from 'adonis-ai-kit/acp'
290
+
291
+ registerAcpAgent('my-agent', {
292
+ id: 'my-agent', name: 'My Agent', description: '', command: 'my-agent-acp', args: [],
293
+ envVarPrefix: 'ACP_MY_AGENT', supportsMcpServers: true,
294
+ // the first set source is passed to the agent process as `target`
295
+ credentialEnv: [{ target: 'MY_API_KEY', sources: ['MY_API_KEY', 'MY_KEY'] }],
296
+ })
297
+
298
+ const runtime = buildAcpRuntimeConfig('my-agent', {
299
+ projectMcpPath: './mcp/server.js', // used when ACP_MY_AGENT_PROJECT_MCP_PATH is unset
300
+ // the project MCP server is still only attached when ACP_MY_AGENT_ENABLE_PROJECT_MCP=true
301
+ })
302
+ ```
303
+
304
+ ACP agents in a `models` chain ask a human through the manager's `ConfirmationService` (see `getConfirmationService()`), like the provider cascade does.
305
+
306
+ Calling `buildAcpRuntimeConfig` + `createACPProvider` directly bypasses the env sanitizing that `AcpDriver` applies: the agent then inherits the full server environment.
307
+
308
+ The `sourcecraft` and `freebuff` default agents are deprecated and will be removed from the defaults in 2.0; register them with `registerAcpAgent()` if you need them.
309
+
263
310
  ---
264
311
 
312
+ ### 7. Dynamic Credentials & Model Chains
313
+
314
+ Apps with per-user credentials can't use a static provider cascade. Pass `models` — an ordered chain of
315
+ `ResolvedModel | string` — to `generateText`, `streamText` or `generateObject`; the provider cascade is then not used.
316
+
317
+ ```ts
318
+ const result = await ai.generateText({
319
+ prompt: 'Summarize this',
320
+ models: [userKeyModel, teamKeyModel, 'anthropic/claude-sonnet-4-5'],
321
+ onFallback: ({ fromModel, toModel, errorClass }) => log.warn(`${fromModel} -> ${toModel} (${errorClass})`),
322
+ })
323
+ result.provider // providerID of the model that answered
324
+ result.model // its modelID
325
+ // fromModel / toModel are breaker keys: the credential key when the model has one, otherwise provider/model
326
+ ```
327
+
328
+ - Entries are tried in order. Retryable failures (429, 5xx, network) and entries that cannot be attempted (missing provider
329
+ package, config error, open breaker) move on to the next entry; bad requests, caller aborts and any failure after a
330
+ tool has run are thrown as is. `streamText` falls back on errors before the first chunk.
331
+ - Each entry has its own circuit breaker, keyed by `credentialKey` when present (so one bad key doesn't block the others).
332
+ - String entries are resolved through `config.resolver` (e.g. a `CatalogModelResolver`); without one a `ProviderConfigError` is thrown.
333
+ - Models are built by `config.languageModels` (a `LanguageModelFactory`); when absent a default one is created lazily.
334
+ `manager.shutdown()` shuts it down (stops ACP agents).
335
+ - `schema`, `stopWhen`, `maxRetries` and `onStepFinish` work on the chain path too. Empty `models` uses the provider cascade.
336
+
265
337
  ## Ace CLI Commands
266
338
 
267
- `adonis-ai` registers helpful Ace commands:
339
+ `adonis-ai-kit` registers helpful Ace commands:
268
340
 
269
341
  ```bash
270
342
  # Test connectivity, latency, and model availability across configured providers
@@ -1,15 +1,25 @@
1
- import type { LoggerContract } from '../ai_manager.js';
2
- import type { AcpAgentConfig, AcpAgentRuntimeConfig, AcpMcpServerConfig, AcpProjectMcpConfig } from './types.js';
1
+ import type { Logger } from '../logger.js';
2
+ import type { AcpAgentConfig, AcpAgentRuntimeConfig, AcpMcpServerConfig, AcpProjectMcpConfig, AcpRuntimeOptions } from './types.js';
3
3
  /**
4
- * Built-in ACP agent configurations. These are the ONLY commands that may be started from a
5
- * model name; anything else must be configured explicitly via `AcpProviderConfig.command`.
4
+ * Registry of the ACP agents this application may start.
6
5
  *
7
- * Commands follow the agents' own ACP docs: Claude via the `claude-agent-acp` adapter, Gemini CLI
8
- * with `--acp`, Qwen Code's `qwen --acp`, Codex via `codex-acp`, `opencode acp`.
9
- * `sourcecraft` and `freebuff` could not be verified against upstream docs; override them with
10
- * `ACP_<AGENT>_PATH` / `ACP_<AGENT>_ARGS` if your install differs.
6
+ * It starts with the built-in agents, and an application can replace it with the
7
+ * binaries that are actually installed on the operator's machine
8
+ * (`setAcpAgents`) or extend it (`registerAcpAgent`).
11
9
  */
12
10
  export declare const ACP_AGENTS: Record<string, AcpAgentConfig>;
11
+ /**
12
+ * Registers (or replaces) one ACP agent.
13
+ */
14
+ export declare function registerAcpAgent(agentId: string, config: AcpAgentConfig): void;
15
+ /**
16
+ * Replaces the whole agent registry, e.g. with the binaries of a given deployment.
17
+ */
18
+ export declare function setAcpAgents(agents: Record<string, AcpAgentConfig>): void;
19
+ /**
20
+ * Restores the built-in agent registry.
21
+ */
22
+ export declare function resetAcpAgents(): void;
13
23
  /**
14
24
  * Get ACP agent configuration by ID.
15
25
  */
@@ -27,7 +37,7 @@ export declare function isAcpAgent(agentId: string): boolean;
27
37
  * Supports JSON arrays (e.g., '["--flag","--opt","val"]')
28
38
  * and falls back to comma-separated values.
29
39
  */
30
- export declare function parseAcpArgs(argsOverride: string | undefined, fallback: string[], logger?: LoggerContract): string[];
40
+ export declare function parseAcpArgs(argsOverride: string | undefined, fallback: string[], logger?: Logger): string[];
31
41
  /**
32
42
  * Validates an MCP server definition and converts it to the exact shape required by the ACP
33
43
  * schema: stdio servers have no `type` and an `env` array; remote servers have `type`
@@ -36,11 +46,15 @@ export declare function parseAcpArgs(argsOverride: string | undefined, fallback:
36
46
  */
37
47
  export declare function normalizeMcpServer(input: unknown): AcpMcpServerConfig | null;
38
48
  /** Builds the stdio MCP server entry for a project-local MCP server file. */
39
- export declare function buildProjectMcpServer(config: AcpProjectMcpConfig, logger?: LoggerContract): AcpMcpServerConfig | null;
49
+ export declare function buildProjectMcpServer(config: AcpProjectMcpConfig, logger?: Logger): AcpMcpServerConfig | null;
40
50
  /**
41
51
  * Build runtime configuration for an ACP agent.
52
+ *
53
+ * The positional form `(agentId, getEnv, envSource, logger)` is kept for compatibility;
54
+ * a function as the second argument selects it.
42
55
  */
43
- export declare function buildAcpRuntimeConfig(agentId: string, getEnv?: (key: string) => string | undefined, envSource?: Record<string, string | undefined>, logger?: LoggerContract): AcpAgentRuntimeConfig | null;
56
+ export declare function buildAcpRuntimeConfig(agentId: string, options?: AcpRuntimeOptions): AcpAgentRuntimeConfig | null;
57
+ export declare function buildAcpRuntimeConfig(agentId: string, getEnv?: (key: string) => string | undefined, envSource?: Record<string, string | undefined>, logger?: Logger): AcpAgentRuntimeConfig | null;
44
58
  /**
45
59
  * Create provider entry for models.dev registry.
46
60
  */
@@ -1 +1 @@
1
- {"version":3,"file":"acp_agents.d.ts","sourceRoot":"","sources":["../../../src/acp/acp_agents.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AACtD,OAAO,KAAK,EACV,cAAc,EACd,qBAAqB,EACrB,kBAAkB,EAElB,mBAAmB,EACpB,MAAM,YAAY,CAAA;AAEnB;;;;;;;;GAQG;AACH,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAiEpD,CAAA;AAEF;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAE7E;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,MAAM,EAAE,CAE1C;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAC1B,YAAY,EAAE,MAAM,GAAG,SAAS,EAChC,QAAQ,EAAE,MAAM,EAAE,EAClB,MAAM,CAAC,EAAE,cAAc,GACtB,MAAM,EAAE,CAiBV;AAoBD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,kBAAkB,GAAG,IAAI,CAwB5E;AAED,6EAA6E;AAC7E,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,mBAAmB,EAC3B,MAAM,CAAC,EAAE,cAAc,GACtB,kBAAkB,GAAG,IAAI,CAY3B;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,MAAM,EACf,MAAM,GAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,GAAG,SAAqC,EACvE,SAAS,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAe,EAC3D,MAAM,CAAC,EAAE,cAAc,GACtB,qBAAqB,GAAG,IAAI,CA0F9B;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG;IACvD,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,EAAE,CAAA;IACb,GAAG,EAAE,MAAM,CAAA;IACX,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CACrD,GAAG,IAAI,CA0BP;AAED;;GAEG;AACH,wBAAgB,wBAAwB,IAAI,UAAU,CAAC,OAAO,sBAAsB,CAAC,EAAE,CAItF;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI;IAClC,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,MAAM,EAAE,MAAM,CACZ,MAAM,EACN;QACE,IAAI,EAAE,MAAM,CAAA;QACZ,GAAG,EAAE,MAAM,CAAA;QACX,IAAI,EAAE,MAAM,CAAA;QACZ,UAAU,EAAE,MAAM,CAAA;QAClB,gBAAgB,EAAE,MAAM,CAAA;KACzB,CACF,CAAA;CACF,CA4BA"}
1
+ {"version":3,"file":"acp_agents.d.ts","sourceRoot":"","sources":["../../../src/acp/acp_agents.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAC1C,OAAO,KAAK,EACV,cAAc,EACd,qBAAqB,EACrB,kBAAkB,EAElB,mBAAmB,EACnB,iBAAiB,EAClB,MAAM,YAAY,CAAA;AAyFnB;;;;;;GAMG;AACH,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAA6B,CAAA;AAEnF;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,GAAG,IAAI,CAE9E;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,GAAG,IAAI,CAGzE;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,IAAI,CAErC;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAE7E;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,MAAM,EAAE,CAE1C;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAC1B,YAAY,EAAE,MAAM,GAAG,SAAS,EAChC,QAAQ,EAAE,MAAM,EAAE,EAClB,MAAM,CAAC,EAAE,MAAM,GACd,MAAM,EAAE,CAiBV;AAoBD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,kBAAkB,GAAG,IAAI,CAwB5E;AAED,6EAA6E;AAC7E,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,mBAAmB,EAC3B,MAAM,CAAC,EAAE,MAAM,GACd,kBAAkB,GAAG,IAAI,CAY3B;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,iBAAiB,GAC1B,qBAAqB,GAAG,IAAI,CAAA;AAC/B,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,EAC5C,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,EAC9C,MAAM,CAAC,EAAE,MAAM,GACd,qBAAqB,GAAG,IAAI,CAAA;AAiG/B;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG;IACvD,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,EAAE,CAAA;IACb,GAAG,EAAE,MAAM,CAAA;IACX,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CACrD,GAAG,IAAI,CA0BP;AAED;;GAEG;AACH,wBAAgB,wBAAwB,IAAI,UAAU,CAAC,OAAO,sBAAsB,CAAC,EAAE,CAItF;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI;IAClC,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,MAAM,EAAE,MAAM,CACZ,MAAM,EACN;QACE,IAAI,EAAE,MAAM,CAAA;QACZ,GAAG,EAAE,MAAM,CAAA;QACX,IAAI,EAAE,MAAM,CAAA;QACZ,UAAU,EAAE,MAAM,CAAA;QAClB,gBAAgB,EAAE,MAAM,CAAA;KACzB,CACF,CAAA;CACF,CA4BA"}
@@ -9,7 +9,7 @@ import path from 'node:path';
9
9
  * `sourcecraft` and `freebuff` could not be verified against upstream docs; override them with
10
10
  * `ACP_<AGENT>_PATH` / `ACP_<AGENT>_ARGS` if your install differs.
11
11
  */
12
- export const ACP_AGENTS = Object.freeze({
12
+ const DEFAULT_ACP_AGENTS = Object.freeze({
13
13
  'claude-code': {
14
14
  id: 'claude-code',
15
15
  name: 'Claude Code',
@@ -18,6 +18,7 @@ export const ACP_AGENTS = Object.freeze({
18
18
  args: [],
19
19
  envVarPrefix: 'ACP_CLAUDE_CODE',
20
20
  supportsMcpServers: true,
21
+ credentialEnv: [{ target: 'ANTHROPIC_API_KEY', sources: ['ANTHROPIC_API_KEY'] }],
21
22
  },
22
23
  'gemini': {
23
24
  id: 'gemini',
@@ -28,6 +29,7 @@ export const ACP_AGENTS = Object.freeze({
28
29
  envVarPrefix: 'ACP_GEMINI',
29
30
  supportsMcpServers: true,
30
31
  authMethodId: 'gemini-api-key',
32
+ credentialEnv: [{ target: 'GEMINI_API_KEY', sources: ['GEMINI_API_KEY', 'GOOGLE_API_KEY'] }],
31
33
  },
32
34
  'codex': {
33
35
  id: 'codex',
@@ -37,6 +39,7 @@ export const ACP_AGENTS = Object.freeze({
37
39
  args: [],
38
40
  envVarPrefix: 'ACP_CODEX',
39
41
  supportsMcpServers: true,
42
+ credentialEnv: [{ target: 'OPENAI_API_KEY', sources: ['OPENAI_API_KEY'] }],
40
43
  },
41
44
  'qwen-code': {
42
45
  id: 'qwen-code',
@@ -46,7 +49,9 @@ export const ACP_AGENTS = Object.freeze({
46
49
  args: ['--acp'],
47
50
  envVarPrefix: 'ACP_QWEN_CODE',
48
51
  supportsMcpServers: true,
52
+ credentialEnv: [{ target: 'DASHSCOPE_API_KEY', sources: ['DASHSCOPE_API_KEY', 'QWEN_API_KEY'] }],
49
53
  },
54
+ /** @deprecated Removed from defaults in 2.0; register it with registerAcpAgent() */
50
55
  'sourcecraft': {
51
56
  id: 'sourcecraft',
52
57
  name: 'SourceCraft Code Assistant',
@@ -64,7 +69,9 @@ export const ACP_AGENTS = Object.freeze({
64
69
  args: ['acp'],
65
70
  envVarPrefix: 'ACP_OPENCODE',
66
71
  supportsMcpServers: true,
72
+ credentialEnv: [{ target: 'OPENCODE_API_KEY', sources: ['OPENCODE_API_KEY'] }],
67
73
  },
74
+ /** @deprecated Removed from defaults in 2.0; register it with registerAcpAgent() */
68
75
  'freebuff': {
69
76
  id: 'freebuff',
70
77
  name: 'Freebuff',
@@ -73,8 +80,40 @@ export const ACP_AGENTS = Object.freeze({
73
80
  args: [],
74
81
  envVarPrefix: 'ACP_FREEBUFF',
75
82
  supportsMcpServers: true,
83
+ credentialEnv: [
84
+ { target: 'CODEBUFF_API_KEY', sources: ['CODEBUFF_API_KEY', 'FREEBUFF_API_KEY'] },
85
+ { target: 'FREEBUFF_API_KEY', sources: ['CODEBUFF_API_KEY', 'FREEBUFF_API_KEY'] },
86
+ ],
76
87
  },
77
88
  });
89
+ /**
90
+ * Registry of the ACP agents this application may start.
91
+ *
92
+ * It starts with the built-in agents, and an application can replace it with the
93
+ * binaries that are actually installed on the operator's machine
94
+ * (`setAcpAgents`) or extend it (`registerAcpAgent`).
95
+ */
96
+ export const ACP_AGENTS = { ...DEFAULT_ACP_AGENTS };
97
+ /**
98
+ * Registers (or replaces) one ACP agent.
99
+ */
100
+ export function registerAcpAgent(agentId, config) {
101
+ ACP_AGENTS[agentId] = config;
102
+ }
103
+ /**
104
+ * Replaces the whole agent registry, e.g. with the binaries of a given deployment.
105
+ */
106
+ export function setAcpAgents(agents) {
107
+ for (const key of Object.keys(ACP_AGENTS))
108
+ delete ACP_AGENTS[key];
109
+ Object.assign(ACP_AGENTS, agents);
110
+ }
111
+ /**
112
+ * Restores the built-in agent registry.
113
+ */
114
+ export function resetAcpAgents() {
115
+ setAcpAgents(DEFAULT_ACP_AGENTS);
116
+ }
78
117
  /**
79
118
  * Get ACP agent configuration by ID.
80
119
  */
@@ -178,10 +217,20 @@ export function buildProjectMcpServer(config, logger) {
178
217
  env: [],
179
218
  };
180
219
  }
181
- /**
182
- * Build runtime configuration for an ACP agent.
183
- */
184
- export function buildAcpRuntimeConfig(agentId, getEnv = (key) => process.env[key], envSource = process.env, logger) {
220
+ export function buildAcpRuntimeConfig(agentId, optionsOrGetEnv, positionalEnvSource, positionalLogger) {
221
+ // Positional form: getEnv is a function, or explicitly undefined with trailing arguments.
222
+ const isPositional = typeof optionsOrGetEnv === 'function' ||
223
+ (optionsOrGetEnv === undefined && arguments.length > 2);
224
+ const options = isPositional
225
+ ? {
226
+ getEnv: optionsOrGetEnv,
227
+ envSource: positionalEnvSource,
228
+ logger: positionalLogger,
229
+ }
230
+ : (optionsOrGetEnv ?? {});
231
+ const getEnv = options.getEnv ?? ((key) => process.env[key]);
232
+ const envSource = options.envSource ?? process.env;
233
+ const { logger } = options;
185
234
  const config = getAcpAgentConfig(agentId);
186
235
  if (!config)
187
236
  return null;
@@ -194,38 +243,13 @@ export function buildAcpRuntimeConfig(agentId, getEnv = (key) => process.env[key
194
243
  const cwd = path.resolve(getEnv(`${prefix}_CWD`) || process.cwd());
195
244
  // Build environment variables
196
245
  const env = {};
197
- // Add auth-related env vars based on agent type
198
- if (agentId === 'gemini') {
199
- const apiKey = getEnv('GEMINI_API_KEY') || getEnv('GOOGLE_API_KEY');
200
- if (apiKey)
201
- env.GEMINI_API_KEY = apiKey;
202
- }
203
- else if (agentId === 'claude-code') {
204
- const apiKey = getEnv('ANTHROPIC_API_KEY');
205
- if (apiKey)
206
- env.ANTHROPIC_API_KEY = apiKey;
207
- }
208
- else if (agentId === 'codex') {
209
- const apiKey = getEnv('OPENAI_API_KEY');
210
- if (apiKey)
211
- env.OPENAI_API_KEY = apiKey;
212
- }
213
- else if (agentId === 'qwen-code') {
214
- const apiKey = getEnv('DASHSCOPE_API_KEY') || getEnv('QWEN_API_KEY');
215
- if (apiKey)
216
- env.DASHSCOPE_API_KEY = apiKey;
217
- }
218
- else if (agentId === 'opencode') {
219
- const apiKey = getEnv('OPENCODE_API_KEY');
220
- if (apiKey)
221
- env.OPENCODE_API_KEY = apiKey;
222
- }
223
- else if (agentId === 'freebuff') {
224
- const apiKey = getEnv('CODEBUFF_API_KEY') || getEnv('FREEBUFF_API_KEY');
225
- if (apiKey) {
226
- env.CODEBUFF_API_KEY = apiKey;
227
- env.FREEBUFF_API_KEY = apiKey;
228
- }
246
+ // Add the agent's declared credentials: first source that has a value wins
247
+ // (an agent registered without credentialEnv inherits the built-in agent's with the same id)
248
+ const credentialEnv = config.credentialEnv ?? DEFAULT_ACP_AGENTS[agentId]?.credentialEnv ?? [];
249
+ for (const { target, sources } of credentialEnv) {
250
+ const value = sources.map((source) => getEnv(source)).find(Boolean);
251
+ if (value)
252
+ env[target] = value;
229
253
  }
230
254
  // Add custom env vars from ACP_<AGENT>_ENV_* pattern
231
255
  const envPrefix = `${prefix}_ENV_`;
@@ -257,7 +281,7 @@ export function buildAcpRuntimeConfig(agentId, getEnv = (key) => process.env[key
257
281
  }
258
282
  // Add the project's MCP server if enabled and an explicit path was given
259
283
  if (getEnv(`${prefix}_ENABLE_PROJECT_MCP`) === 'true') {
260
- const projectPath = getEnv(`${prefix}_PROJECT_MCP_PATH`);
284
+ const projectPath = getEnv(`${prefix}_PROJECT_MCP_PATH`) || options.projectMcpPath;
261
285
  if (projectPath) {
262
286
  const server = buildProjectMcpServer({ path: projectPath }, logger);
263
287
  if (server)
@@ -1 +1 @@
1
- {"version":3,"file":"acp_agents.js","sourceRoot":"","sources":["../../../src/acp/acp_agents.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"acp_agents.js","sourceRoot":"","sources":["../../../src/acp/acp_agents.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AACpC,OAAO,IAAI,MAAM,WAAW,CAAA;AAW5B;;;;;;;;GAQG;AACH,MAAM,kBAAkB,GAAmC,MAAM,CAAC,MAAM,CAAC;IACvE,aAAa,EAAE;QACb,EAAE,EAAE,aAAa;QACjB,IAAI,EAAE,aAAa;QACnB,WAAW,EAAE,qCAAqC;QAClD,OAAO,EAAE,kBAAkB;QAC3B,IAAI,EAAE,EAAE;QACR,YAAY,EAAE,iBAAiB;QAC/B,kBAAkB,EAAE,IAAI;QACxB,aAAa,EAAE,CAAC,EAAE,MAAM,EAAE,mBAAmB,EAAE,OAAO,EAAE,CAAC,mBAAmB,CAAC,EAAE,CAAC;KACjF;IACD,QAAQ,EAAE;QACR,EAAE,EAAE,QAAQ;QACZ,IAAI,EAAE,YAAY;QAClB,WAAW,EAAE,2BAA2B;QACxC,OAAO,EAAE,QAAQ;QACjB,IAAI,EAAE,CAAC,OAAO,CAAC;QACf,YAAY,EAAE,YAAY;QAC1B,kBAAkB,EAAE,IAAI;QACxB,YAAY,EAAE,gBAAgB;QAC9B,aAAa,EAAE,CAAC,EAAE,MAAM,EAAE,gBAAgB,EAAE,OAAO,EAAE,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,EAAE,CAAC;KAC7F;IACD,OAAO,EAAE;QACP,EAAE,EAAE,OAAO;QACX,IAAI,EAAE,WAAW;QACjB,WAAW,EAAE,0BAA0B;QACvC,OAAO,EAAE,WAAW;QACpB,IAAI,EAAE,EAAE;QACR,YAAY,EAAE,WAAW;QACzB,kBAAkB,EAAE,IAAI;QACxB,aAAa,EAAE,CAAC,EAAE,MAAM,EAAE,gBAAgB,EAAE,OAAO,EAAE,CAAC,gBAAgB,CAAC,EAAE,CAAC;KAC3E;IACD,WAAW,EAAE;QACX,EAAE,EAAE,WAAW;QACf,IAAI,EAAE,WAAW;QACjB,WAAW,EAAE,+BAA+B;QAC5C,OAAO,EAAE,MAAM;QACf,IAAI,EAAE,CAAC,OAAO,CAAC;QACf,YAAY,EAAE,eAAe;QAC7B,kBAAkB,EAAE,IAAI;QACxB,aAAa,EAAE,CAAC,EAAE,MAAM,EAAE,mBAAmB,EAAE,OAAO,EAAE,CAAC,mBAAmB,EAAE,cAAc,CAAC,EAAE,CAAC;KACjG;IACD,oFAAoF;IACpF,aAAa,EAAE;QACb,EAAE,EAAE,aAAa;QACjB,IAAI,EAAE,4BAA4B;QAClC,WAAW,EAAE,4CAA4C;QACzD,OAAO,EAAE,KAAK;QACd,IAAI,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC;QAC3B,YAAY,EAAE,iBAAiB;QAC/B,kBAAkB,EAAE,IAAI;KACzB;IACD,UAAU,EAAE;QACV,EAAE,EAAE,UAAU;QACd,IAAI,EAAE,UAAU;QAChB,WAAW,EAAE,8BAA8B;QAC3C,OAAO,EAAE,UAAU;QACnB,IAAI,EAAE,CAAC,KAAK,CAAC;QACb,YAAY,EAAE,cAAc;QAC5B,kBAAkB,EAAE,IAAI;QACxB,aAAa,EAAE,CAAC,EAAE,MAAM,EAAE,kBAAkB,EAAE,OAAO,EAAE,CAAC,kBAAkB,CAAC,EAAE,CAAC;KAC/E;IACD,oFAAoF;IACpF,UAAU,EAAE;QACV,EAAE,EAAE,UAAU;QACd,IAAI,EAAE,UAAU;QAChB,WAAW,EAAE,0BAA0B;QACvC,OAAO,EAAE,oBAAoB;QAC7B,IAAI,EAAE,EAAE;QACR,YAAY,EAAE,cAAc;QAC5B,kBAAkB,EAAE,IAAI;QACxB,aAAa,EAAE;YACb,EAAE,MAAM,EAAE,kBAAkB,EAAE,OAAO,EAAE,CAAC,kBAAkB,EAAE,kBAAkB,CAAC,EAAE;YACjF,EAAE,MAAM,EAAE,kBAAkB,EAAE,OAAO,EAAE,CAAC,kBAAkB,EAAE,kBAAkB,CAAC,EAAE;SAClF;KACF;CACF,CAAC,CAAA;AAEF;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,UAAU,GAAmC,EAAE,GAAG,kBAAkB,EAAE,CAAA;AAEnF;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAe,EAAE,MAAsB;IACtE,UAAU,CAAC,OAAO,CAAC,GAAG,MAAM,CAAA;AAC9B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,MAAsC;IACjE,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC;QAAE,OAAO,UAAU,CAAC,GAAG,CAAC,CAAA;IACjE,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,CAAA;AACnC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc;IAC5B,YAAY,CAAC,kBAAkB,CAAC,CAAA;AAClC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAe;IAC/C,OAAO,UAAU,CAAC,OAAO,CAAC,CAAA;AAC5B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe;IAC7B,OAAO,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;AAChC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,OAAe;IACxC,OAAO,OAAO,IAAI,UAAU,CAAA;AAC9B,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAC1B,YAAgC,EAChC,QAAkB,EAClB,MAAe;IAEf,IAAI,CAAC,YAAY;QAAE,OAAO,QAAQ,CAAA;IAClC,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,EAAE,CAAA;IACnC,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC5B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;YAClC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC,EAAE,CAAC;gBAC9E,OAAO,MAAM,CAAA;YACf,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,EAAE,IAAI,EAAE,CAAC,8CAA8C,OAAO,EAAE,CAAC,CAAA;QACzE,CAAC;IACH,CAAC;IACD,OAAO,OAAO;SACX,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SACpB,MAAM,CAAC,OAAO,CAAC,CAAA;AACpB,CAAC;AAED,SAAS,eAAe,CAAC,KAAc;IACrC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC,MAAM,CACjB,CAAC,IAAI,EAAwB,EAAE,CAC7B,IAAI,KAAK,IAAI;YACb,OAAO,IAAI,KAAK,QAAQ;YACxB,OAAQ,IAAqB,CAAC,IAAI,KAAK,QAAQ;YAC/C,OAAQ,IAAqB,CAAC,KAAK,KAAK,QAAQ,CACnD,CAAA;IACH,CAAC;IACD,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAChD,OAAO,MAAM,CAAC,OAAO,CAAC,KAAgC,CAAC;aACpD,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC;aAChD,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAe,EAAE,CAAC,CAAC,CAAA;IAC/D,CAAC;IACD,OAAO,EAAE,CAAA;AACX,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAc;IAC/C,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAA;IAC5D,MAAM,GAAG,GAAG,KAAgC,CAAA;IAC5C,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAA;IAEtE,MAAM,GAAG,GACP,OAAO,GAAG,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAA;IACnG,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,IAAI,GAAG,CAAC,IAAI,KAAK,KAAK,IAAI,CAAC,GAAG,CAAC,IAAI,KAAK,SAAS,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;QACjG,IAAI,CAAC,GAAG;YAAE,OAAO,IAAI,CAAA;QACrB,OAAO;YACL,IAAI,EAAE,GAAG,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM;YACzC,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,GAAG;YACH,OAAO,EAAE,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC;SACtC,CAAA;IACH,CAAC;IAED,IAAI,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,IAAI,GAAG,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAA;IAC5E,OAAO;QACL,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE;QAC/F,GAAG,EAAE,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC;KAC9B,CAAA;AACH,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,qBAAqB,CACnC,MAA2B,EAC3B,MAAe;IAEf,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IAC5C,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,MAAM,EAAE,IAAI,EAAE,CAAC,uCAAuC,UAAU,yBAAyB,CAAC,CAAA;QAC1F,OAAO,IAAI,CAAA;IACb,CAAC;IACD,OAAO;QACL,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,eAAe;QACpC,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,MAAM;QACjC,IAAI,EAAE,CAAC,UAAU,CAAC;QAClB,GAAG,EAAE,EAAE;KACR,CAAA;AACH,CAAC;AAkBD,MAAM,UAAU,qBAAqB,CACnC,OAAe,EACf,eAA2E,EAC3E,mBAAwD,EACxD,gBAAyB;IAEzB,0FAA0F;IAC1F,MAAM,YAAY,GAChB,OAAO,eAAe,KAAK,UAAU;QACrC,CAAC,eAAe,KAAK,SAAS,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;IACzD,MAAM,OAAO,GAAsB,YAAY;QAC7C,CAAC,CAAC;YACE,MAAM,EAAE,eAAoE;YAC5E,SAAS,EAAE,mBAAmB;YAC9B,MAAM,EAAE,gBAAgB;SACzB;QACH,CAAC,CAAC,CAAE,eAAiD,IAAI,EAAE,CAAC,CAAA;IAC9D,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAA;IACpE,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,GAAG,CAAA;IAClD,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAA;IAE1B,MAAM,MAAM,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAA;IACzC,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAA;IAExB,MAAM,MAAM,GAAG,MAAM,CAAC,YAAY,CAAA;IAElC,yCAAyC;IACzC,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,MAAM,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAA;IAE1D,sCAAsC;IACtC,MAAM,IAAI,GAAG,YAAY,CAAC,MAAM,CAAC,GAAG,MAAM,OAAO,CAAC,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;IAExE,2EAA2E;IAC3E,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,MAAM,CAAC,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAA;IAElE,8BAA8B;IAC9B,MAAM,GAAG,GAA2B,EAAE,CAAA;IAEtC,2EAA2E;IAC3E,6FAA6F;IAC7F,MAAM,aAAa,GAAG,MAAM,CAAC,aAAa,IAAI,kBAAkB,CAAC,OAAO,CAAC,EAAE,aAAa,IAAI,EAAE,CAAA;IAC9F,KAAK,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,aAAa,EAAE,CAAC;QAChD,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QACnE,IAAI,KAAK;YAAE,GAAG,CAAC,MAAM,CAAC,GAAG,KAAK,CAAA;IAChC,CAAC;IAED,qDAAqD;IACrD,MAAM,SAAS,GAAG,GAAG,MAAM,OAAO,CAAA;IAClC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;QACrD,IAAI,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACrD,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAA;YAC1C,GAAG,CAAC,MAAM,CAAC,GAAG,KAAK,CAAA;QACrB,CAAC;IACH,CAAC;IAED,oFAAoF;IACpF,MAAM,UAAU,GAAyB,EAAE,CAAA;IAC3C,MAAM,aAAa,GAAG,MAAM,CAAC,GAAG,MAAM,cAAc,CAAC,CAAA;IACrD,IAAI,aAAa,EAAE,CAAC;QAClB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAA;YACxC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC1B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;oBAC3B,MAAM,MAAM,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAA;oBACxC,IAAI,MAAM;wBAAE,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;;wBAC9B,MAAM,EAAE,IAAI,EAAE,CAAC,+CAA+C,OAAO,EAAE,CAAC,CAAA;gBAC/E,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,EAAE,IAAI,EAAE,CAAC,sCAAsC,OAAO,EAAE,CAAC,CAAA;QACjE,CAAC;IACH,CAAC;IAED,yEAAyE;IACzE,IAAI,MAAM,CAAC,GAAG,MAAM,qBAAqB,CAAC,KAAK,MAAM,EAAE,CAAC;QACtD,MAAM,WAAW,GAAG,MAAM,CAAC,GAAG,MAAM,mBAAmB,CAAC,IAAI,OAAO,CAAC,cAAc,CAAA;QAClF,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,MAAM,GAAG,qBAAqB,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,MAAM,CAAC,CAAA;YACnE,IAAI,MAAM;gBAAE,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QACrC,CAAC;aAAM,CAAC;YACN,MAAM,EAAE,IAAI,EAAE,CACZ,SAAS,MAAM,kCAAkC,MAAM,iDAAiD,CACzG,CAAA;QACH,CAAC;IACH,CAAC;IAED,OAAO;QACL,OAAO;QACP,IAAI;QACJ,GAAG;QACH,GAAG;QACH,UAAU;QACV,YAAY,EAAE,MAAM,CAAC,YAAY;KAClC,CAAA;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,OAAe;IAQpD,MAAM,MAAM,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAA;IACzC,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAA;IAExB,MAAM,MAAM,GAAG,MAAM,CAAC,YAAY,CAAA;IAElC,OAAO;QACL,EAAE,EAAE,OAAO,OAAO,EAAE;QACpB,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,GAAG,EAAE;YACH,GAAG,MAAM,OAAO;YAChB,GAAG,MAAM,MAAM;YACf,GAAG,MAAM,OAAO;YAChB,GAAG,MAAM,cAAc;YACvB,GAAG,MAAM,qBAAqB;YAC9B,GAAG,MAAM,mBAAmB;SAC7B;QACD,GAAG,EAAE,4BAA4B;QACjC,QAAQ,EAAE,KAAK;QACf,MAAM,EAAE;YACN,CAAC,OAAO,CAAC,EAAE;gBACT,EAAE,EAAE,OAAO;gBACX,IAAI,EAAE,GAAG,MAAM,CAAC,IAAI,QAAQ;aAC7B;SACF;KACF,CAAA;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,wBAAwB;IACtC,OAAO,eAAe,EAAE;SACrB,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,sBAAsB,CAAC,EAAE,CAAC,CAAC;SACvC,MAAM,CAAC,CAAC,KAAK,EAAsC,EAAE,CAAC,KAAK,KAAK,IAAI,CAAC,CAAA;AAC1E,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB;IAa9B,MAAM,MAAM,GAGR,EAAE,CAAA;IAEN,KAAK,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QACtD,MAAM,CAAC,GAAG,MAAM,CAAC,YAAY,CAAA;QAC7B,MAAM,CAAC,EAAE,CAAC,GAAG;YACX,IAAI,EAAE,GAAG,CAAC,OAAO;YACjB,GAAG,EAAE,GAAG,CAAC,MAAM;YACf,IAAI,EAAE,GAAG,CAAC,OAAO;YACjB,UAAU,EAAE,GAAG,CAAC,cAAc;YAC9B,gBAAgB,EAAE,GAAG,CAAC,qBAAqB;SAC5C,CAAA;IACH,CAAC;IAED,OAAO;QACL,OAAO,EAAE;YACP,mBAAmB;YACnB,gBAAgB;YAChB,gBAAgB;YAChB,mBAAmB;YACnB,kBAAkB;YAClB,kBAAkB;SACnB;QACD,MAAM;KACP,CAAA;AACH,CAAC"}
@@ -1,8 +1,8 @@
1
1
  import type { LanguageModel } from 'ai';
2
2
  import type { ConfirmationService } from '../guard/confirmation.js';
3
3
  import type { AiDriver } from '../types.js';
4
- import type { LoggerContract } from '../ai_manager.js';
5
- import type { AcpProviderConfig } from './types.js';
4
+ import type { Logger } from '../logger.js';
5
+ import type { AcpAgentRuntimeConfig, AcpProviderConfig } from './types.js';
6
6
  /**
7
7
  * Builds the environment for the agent process.
8
8
  *
@@ -13,11 +13,20 @@ import type { AcpProviderConfig } from './types.js';
13
13
  */
14
14
  export declare function buildAgentEnv(source: Record<string, string | undefined>, extra: Record<string, string>, inheritEnv?: boolean): Record<string, string>;
15
15
  export interface AcpDriverDeps {
16
- logger?: LoggerContract;
16
+ logger?: Logger;
17
17
  /** Answers agent permission requests when `permissionPolicy` is `ask`. */
18
18
  confirmation?: ConfirmationService;
19
- /** Environment to derive the agent environment from. Default: `process.env` */
19
+ /**
20
+ * Environment whose allowlisted variables the agent keeps. Default: `process.env`. Variables that
21
+ * exist only in `process.env` are blanked as well, because the agent is spawned with
22
+ * `{ ...process.env, ...env }`.
23
+ */
20
24
  env?: Record<string, string | undefined>;
25
+ /**
26
+ * Prebuilt runtime config (e.g. from `buildAcpRuntimeConfig`). Used verbatim, except that `cwd`
27
+ * must be absolute and the agent environment is rebuilt from `env` plus the runtime's own env.
28
+ */
29
+ runtime?: AcpAgentRuntimeConfig;
21
30
  }
22
31
  export declare class AcpDriver implements AiDriver {
23
32
  readonly name: string;
@@ -26,6 +35,7 @@ export declare class AcpDriver implements AiDriver {
26
35
  private logger?;
27
36
  private confirmation?;
28
37
  private env;
38
+ private runtime?;
29
39
  private cachedModels;
30
40
  private providers;
31
41
  private permissionPolicy;
@@ -1 +1 @@
1
- {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../../src/acp/provider.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,IAAI,CAAA;AACvC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AACnE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAE3C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AACtD,OAAO,KAAK,EAIV,iBAAiB,EAClB,MAAM,YAAY,CAAA;AAiEnB;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,EAC1C,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC7B,UAAU,UAAQ,GACjB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAUxB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,cAAc,CAAA;IACvB,0EAA0E;IAC1E,YAAY,CAAC,EAAE,mBAAmB,CAAA;IAClC,+EAA+E;IAC/E,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAA;CACzC;AAED,qBAAa,SAAU,YAAW,QAAQ;IACxC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;IAC7B,OAAO,CAAC,MAAM,CAAmB;IACjC,OAAO,CAAC,MAAM,CAAC,CAAgB;IAC/B,OAAO,CAAC,YAAY,CAAC,CAAqB;IAC1C,OAAO,CAAC,GAAG,CAAoC;IAC/C,OAAO,CAAC,YAAY,CAAiD;IACrE,OAAO,CAAC,SAAS,CAAkC;IACnD,OAAO,CAAC,gBAAgB,CAAqB;gBAEjC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,iBAAiB,EAAE,IAAI,GAAE,aAAkB;IAgB7E;;;OAGG;IACG,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAe1D;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAgBzE;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAa/B,OAAO,CAAC,oBAAoB;YAyDd,WAAW;IAiCzB;;;;OAIG;IACH,OAAO,CAAC,wBAAwB;YAiBlB,gBAAgB;CA8C/B;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,iBAAiB,EACzB,IAAI,GAAE,aAAkB,GACvB,SAAS,CAEX"}
1
+ {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../../src/acp/provider.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,IAAI,CAAA;AACvC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AACnE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAE3C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAC1C,OAAO,KAAK,EACV,qBAAqB,EAGrB,iBAAiB,EAClB,MAAM,YAAY,CAAA;AAiEnB;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,EAC1C,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC7B,UAAU,UAAQ,GACjB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAYxB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,0EAA0E;IAC1E,YAAY,CAAC,EAAE,mBAAmB,CAAA;IAClC;;;;OAIG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAA;IACxC;;;OAGG;IACH,OAAO,CAAC,EAAE,qBAAqB,CAAA;CAChC;AAED,qBAAa,SAAU,YAAW,QAAQ;IACxC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;IAC7B,OAAO,CAAC,MAAM,CAAmB;IACjC,OAAO,CAAC,MAAM,CAAC,CAAQ;IACvB,OAAO,CAAC,YAAY,CAAC,CAAqB;IAC1C,OAAO,CAAC,GAAG,CAAoC;IAC/C,OAAO,CAAC,OAAO,CAAC,CAAuB;IACvC,OAAO,CAAC,YAAY,CAAiD;IACrE,OAAO,CAAC,SAAS,CAAkC;IACnD,OAAO,CAAC,gBAAgB,CAAqB;gBAEjC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,iBAAiB,EAAE,IAAI,GAAE,aAAkB;IAiB7E;;;OAGG;IACG,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAe1D;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAgBzE;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAa/B,OAAO,CAAC,oBAAoB;YAsEd,WAAW;IAiCzB;;;;OAIG;IACH,OAAO,CAAC,wBAAwB;YAiBlB,gBAAgB;CA8C/B;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,iBAAiB,EACzB,IAAI,GAAE,aAAkB,GACvB,SAAS,CAEX"}
@@ -1,3 +1,11 @@
1
+ var __rewriteRelativeImportExtension = (this && this.__rewriteRelativeImportExtension) || function (path, preserveJsx) {
2
+ if (typeof path === "string" && /^\.\.?\//.test(path)) {
3
+ return path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {
4
+ return tsx ? preserveJsx ? ".jsx" : ".js" : d && (!ext || !cm) ? m : (d + ext + "." + cm.toLowerCase() + "js");
5
+ });
6
+ }
7
+ return path;
8
+ };
1
9
  import path from 'node:path';
2
10
  import { AiException, ProviderConfigError } from '../errors.js';
3
11
  import { buildAcpRuntimeConfig, buildProjectMcpServer, getAcpAgentConfig, normalizeMcpServer, } from './acp_agents.js';
@@ -46,7 +54,9 @@ export function buildAgentEnv(source, extra, inheritEnv = false) {
46
54
  if (inheritEnv)
47
55
  return { ...extra };
48
56
  const env = {};
49
- for (const key of Object.keys(source)) {
57
+ // The provider merges over `process.env`, so keys that only exist there must be blanked too.
58
+ const keys = new Set([...Object.keys(source), ...Object.keys(process.env)]);
59
+ for (const key of keys) {
50
60
  const upper = key.toUpperCase();
51
61
  const safe = SAFE_ENV_KEYS.has(upper) || SAFE_ENV_PREFIXES.some((p) => upper.startsWith(p));
52
62
  env[key] = safe ? (source[key] ?? '') : '';
@@ -60,6 +70,7 @@ export class AcpDriver {
60
70
  logger;
61
71
  confirmation;
62
72
  env;
73
+ runtime;
63
74
  cachedModels = new Map();
64
75
  providers = new Set();
65
76
  permissionPolicy;
@@ -69,6 +80,7 @@ export class AcpDriver {
69
80
  this.logger = deps.logger;
70
81
  this.confirmation = deps.confirmation;
71
82
  this.env = deps.env ?? process.env;
83
+ this.runtime = deps.runtime;
72
84
  this.defaultModel = config.agentId ?? config.defaultModel ?? 'claude-code';
73
85
  this.permissionPolicy = config.permissionPolicy ?? 'ask';
74
86
  if (this.permissionPolicy === 'allow') {
@@ -128,6 +140,15 @@ export class AcpDriver {
128
140
  }
129
141
  }
130
142
  resolveRuntimeConfig(agentId) {
143
+ if (this.runtime) {
144
+ if (!path.isAbsolute(this.runtime.cwd)) {
145
+ throw new ProviderConfigError(this.name, `ACP "cwd" must be an absolute path, got "${this.runtime.cwd}"`);
146
+ }
147
+ return {
148
+ ...this.runtime,
149
+ env: buildAgentEnv(this.env, this.runtime.env, this.config.inheritEnv),
150
+ };
151
+ }
131
152
  const predefined = getAcpAgentConfig(agentId);
132
153
  const explicitCommand = this.config.command;
133
154
  // A command is only ever taken from config or from the built-in agent table.
@@ -175,7 +196,7 @@ export class AcpDriver {
175
196
  this.logger?.info?.(`[ACP] Starting ACP agent session: ${runtimeConfig.command} in ${runtimeConfig.cwd}`);
176
197
  let acpModule;
177
198
  try {
178
- acpModule = await import('@mcpc-tech/acp-ai-provider');
199
+ acpModule = await import(__rewriteRelativeImportExtension('@mcpc-tech/acp-ai-provider'));
179
200
  }
180
201
  catch (err) {
181
202
  throw new AiException(`Package "@mcpc-tech/acp-ai-provider" is required to use ACP drivers: ${err instanceof Error ? err.message : String(err)}`, 'E_AI_MISSING_DEPENDENCY', err);