@the-open-engine/zeroshot 6.3.0 → 6.5.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 (149) hide show
  1. package/cli/commands/providers.js +11 -5
  2. package/cli/index.js +83 -17
  3. package/cli/lib/first-run.js +14 -3
  4. package/docker/zeroshot-cluster/Dockerfile +11 -1
  5. package/lib/agent-cli-provider/acp-stdio-runner.d.ts +4 -0
  6. package/lib/agent-cli-provider/acp-stdio-runner.d.ts.map +1 -0
  7. package/lib/agent-cli-provider/acp-stdio-runner.js +259 -0
  8. package/lib/agent-cli-provider/acp-stdio-runner.js.map +1 -0
  9. package/lib/agent-cli-provider/adapters/acp.d.ts +23 -0
  10. package/lib/agent-cli-provider/adapters/acp.d.ts.map +1 -0
  11. package/lib/agent-cli-provider/adapters/acp.js +373 -0
  12. package/lib/agent-cli-provider/adapters/acp.js.map +1 -0
  13. package/lib/agent-cli-provider/adapters/claude.d.ts.map +1 -1
  14. package/lib/agent-cli-provider/adapters/claude.js +2 -29
  15. package/lib/agent-cli-provider/adapters/claude.js.map +1 -1
  16. package/lib/agent-cli-provider/adapters/copilot-parser.d.ts +3 -0
  17. package/lib/agent-cli-provider/adapters/copilot-parser.d.ts.map +1 -0
  18. package/lib/agent-cli-provider/adapters/copilot-parser.js +154 -0
  19. package/lib/agent-cli-provider/adapters/copilot-parser.js.map +1 -0
  20. package/lib/agent-cli-provider/adapters/copilot.d.ts +3 -0
  21. package/lib/agent-cli-provider/adapters/copilot.d.ts.map +1 -0
  22. package/lib/agent-cli-provider/adapters/copilot.js +176 -0
  23. package/lib/agent-cli-provider/adapters/copilot.js.map +1 -0
  24. package/lib/agent-cli-provider/adapters/gateway.d.ts +6 -0
  25. package/lib/agent-cli-provider/adapters/gateway.d.ts.map +1 -0
  26. package/lib/agent-cli-provider/adapters/gateway.js +161 -0
  27. package/lib/agent-cli-provider/adapters/gateway.js.map +1 -0
  28. package/lib/agent-cli-provider/adapters/gemini.d.ts.map +1 -1
  29. package/lib/agent-cli-provider/adapters/gemini.js +9 -2
  30. package/lib/agent-cli-provider/adapters/gemini.js.map +1 -1
  31. package/lib/agent-cli-provider/adapters/index.d.ts.map +1 -1
  32. package/lib/agent-cli-provider/adapters/index.js +6 -34
  33. package/lib/agent-cli-provider/adapters/index.js.map +1 -1
  34. package/lib/agent-cli-provider/adapters/opencode.d.ts.map +1 -1
  35. package/lib/agent-cli-provider/adapters/opencode.js +5 -1
  36. package/lib/agent-cli-provider/adapters/opencode.js.map +1 -1
  37. package/lib/agent-cli-provider/adapters/pi.d.ts +3 -0
  38. package/lib/agent-cli-provider/adapters/pi.d.ts.map +1 -0
  39. package/lib/agent-cli-provider/adapters/pi.js +331 -0
  40. package/lib/agent-cli-provider/adapters/pi.js.map +1 -0
  41. package/lib/agent-cli-provider/claude-command.d.ts +6 -0
  42. package/lib/agent-cli-provider/claude-command.d.ts.map +1 -0
  43. package/lib/agent-cli-provider/claude-command.js +43 -0
  44. package/lib/agent-cli-provider/claude-command.js.map +1 -0
  45. package/lib/agent-cli-provider/contract-actions.d.ts.map +1 -1
  46. package/lib/agent-cli-provider/contract-actions.js +13 -17
  47. package/lib/agent-cli-provider/contract-actions.js.map +1 -1
  48. package/lib/agent-cli-provider/contract-invoke.d.ts.map +1 -1
  49. package/lib/agent-cli-provider/contract-invoke.js +10 -3
  50. package/lib/agent-cli-provider/contract-invoke.js.map +1 -1
  51. package/lib/agent-cli-provider/contract-options.d.ts.map +1 -1
  52. package/lib/agent-cli-provider/contract-options.js +57 -2
  53. package/lib/agent-cli-provider/contract-options.js.map +1 -1
  54. package/lib/agent-cli-provider/contract-support.d.ts +1 -0
  55. package/lib/agent-cli-provider/contract-support.d.ts.map +1 -1
  56. package/lib/agent-cli-provider/contract-support.js +25 -3
  57. package/lib/agent-cli-provider/contract-support.js.map +1 -1
  58. package/lib/agent-cli-provider/errors.d.ts +1 -0
  59. package/lib/agent-cli-provider/errors.d.ts.map +1 -1
  60. package/lib/agent-cli-provider/errors.js +14 -5
  61. package/lib/agent-cli-provider/errors.js.map +1 -1
  62. package/lib/agent-cli-provider/gateway-client.d.ts +32 -0
  63. package/lib/agent-cli-provider/gateway-client.d.ts.map +1 -0
  64. package/lib/agent-cli-provider/gateway-client.js +135 -0
  65. package/lib/agent-cli-provider/gateway-client.js.map +1 -0
  66. package/lib/agent-cli-provider/gateway-runner.d.ts +9 -0
  67. package/lib/agent-cli-provider/gateway-runner.d.ts.map +1 -0
  68. package/lib/agent-cli-provider/gateway-runner.js +294 -0
  69. package/lib/agent-cli-provider/gateway-runner.js.map +1 -0
  70. package/lib/agent-cli-provider/gateway-tools.d.ts +14 -0
  71. package/lib/agent-cli-provider/gateway-tools.d.ts.map +1 -0
  72. package/lib/agent-cli-provider/gateway-tools.js +495 -0
  73. package/lib/agent-cli-provider/gateway-tools.js.map +1 -0
  74. package/lib/agent-cli-provider/index.d.ts +3 -2
  75. package/lib/agent-cli-provider/index.d.ts.map +1 -1
  76. package/lib/agent-cli-provider/index.js +14 -1
  77. package/lib/agent-cli-provider/index.js.map +1 -1
  78. package/lib/agent-cli-provider/invoke-evidence.d.ts +2 -2
  79. package/lib/agent-cli-provider/invoke-evidence.d.ts.map +1 -1
  80. package/lib/agent-cli-provider/invoke-evidence.js +17 -3
  81. package/lib/agent-cli-provider/invoke-evidence.js.map +1 -1
  82. package/lib/agent-cli-provider/provider-registry.d.ts +437 -0
  83. package/lib/agent-cli-provider/provider-registry.d.ts.map +1 -0
  84. package/lib/agent-cli-provider/provider-registry.js +411 -0
  85. package/lib/agent-cli-provider/provider-registry.js.map +1 -0
  86. package/lib/agent-cli-provider/single-agent-runtime.d.ts +7 -0
  87. package/lib/agent-cli-provider/single-agent-runtime.d.ts.map +1 -1
  88. package/lib/agent-cli-provider/single-agent-runtime.js +139 -19
  89. package/lib/agent-cli-provider/single-agent-runtime.js.map +1 -1
  90. package/lib/agent-cli-provider/types.d.ts +106 -4
  91. package/lib/agent-cli-provider/types.d.ts.map +1 -1
  92. package/lib/agent-cli-provider/types.js.map +1 -1
  93. package/lib/detached-startup.js +4 -2
  94. package/lib/docker-config.js +24 -13
  95. package/lib/provider-defaults.js +15 -4
  96. package/lib/provider-detection.js +2 -0
  97. package/lib/provider-names.js +32 -12
  98. package/lib/repo-settings.js +15 -1
  99. package/lib/run-mode.js +18 -6
  100. package/lib/run-plan.js +32 -0
  101. package/lib/settings/claude-auth.js +3 -6
  102. package/lib/settings.js +17 -2
  103. package/lib/setup-apply.js +300 -0
  104. package/lib/setup-journal.js +109 -0
  105. package/lib/setup-plan.js +406 -0
  106. package/lib/setup-undo.js +88 -0
  107. package/lib/start-cluster.js +34 -9
  108. package/lib/stream-json-parser.js +7 -5
  109. package/package.json +33 -3
  110. package/scripts/live-provider-smoke.js +221 -0
  111. package/src/agent/agent-lifecycle.js +7 -4
  112. package/src/agent/agent-quality-gate-schema.js +2 -2
  113. package/src/agent/agent-task-executor.js +41 -2
  114. package/src/agent-cli-provider/acp-stdio-runner.ts +314 -0
  115. package/src/agent-cli-provider/adapters/acp.ts +493 -0
  116. package/src/agent-cli-provider/adapters/claude.ts +2 -32
  117. package/src/agent-cli-provider/adapters/copilot-parser.ts +166 -0
  118. package/src/agent-cli-provider/adapters/copilot.ts +231 -0
  119. package/src/agent-cli-provider/adapters/gateway.ts +186 -0
  120. package/src/agent-cli-provider/adapters/gemini.ts +9 -2
  121. package/src/agent-cli-provider/adapters/index.ts +5 -36
  122. package/src/agent-cli-provider/adapters/opencode.ts +4 -1
  123. package/src/agent-cli-provider/adapters/pi.ts +410 -0
  124. package/src/agent-cli-provider/claude-command.ts +47 -0
  125. package/src/agent-cli-provider/contract-actions.ts +14 -17
  126. package/src/agent-cli-provider/contract-invoke.ts +12 -3
  127. package/src/agent-cli-provider/contract-options.ts +72 -3
  128. package/src/agent-cli-provider/contract-support.ts +30 -3
  129. package/src/agent-cli-provider/errors.ts +14 -4
  130. package/src/agent-cli-provider/gateway-client.ts +170 -0
  131. package/src/agent-cli-provider/gateway-runner.ts +353 -0
  132. package/src/agent-cli-provider/gateway-tools.ts +616 -0
  133. package/src/agent-cli-provider/index.ts +28 -0
  134. package/src/agent-cli-provider/invoke-evidence.ts +24 -3
  135. package/src/agent-cli-provider/provider-registry.ts +515 -0
  136. package/src/agent-cli-provider/single-agent-runtime.ts +192 -18
  137. package/src/agent-cli-provider/types.ts +145 -4
  138. package/src/config-validator.js +33 -15
  139. package/src/isolation-manager.js +124 -19
  140. package/src/ledger.js +3 -0
  141. package/src/message-bus.js +12 -2
  142. package/src/orchestrator.js +37 -17
  143. package/src/preflight.js +83 -30
  144. package/src/providers/capabilities.js +15 -42
  145. package/src/providers/index.js +52 -72
  146. package/src/worktree-claude-config.js +17 -0
  147. package/task-lib/commands/run.js +1 -0
  148. package/task-lib/provider-helper-runtime.js +11 -0
  149. package/task-lib/runner.js +7 -0
@@ -1,8 +1,14 @@
1
1
  const readline = require('readline');
2
2
  const { loadSettings, saveSettings } = require('../../lib/settings');
3
- const { VALID_PROVIDERS, normalizeProviderName } = require('../../lib/provider-names');
3
+ const {
4
+ VALID_PROVIDERS,
5
+ normalizeProviderName,
6
+ providerSupportsCapability,
7
+ } = require('../../lib/provider-names');
4
8
  const { detectProviders, getProvider } = require('../../src/providers');
5
9
 
10
+ const PROVIDER_CHOICES = VALID_PROVIDERS.join(', ');
11
+
6
12
  function question(rl, prompt) {
7
13
  return new Promise((resolve) => {
8
14
  rl.question(prompt, (answer) => resolve(answer.trim()));
@@ -45,7 +51,7 @@ async function providersCommand() {
45
51
  function setDefaultCommand(args) {
46
52
  const provider = normalizeProviderName(args[0]);
47
53
  if (!VALID_PROVIDERS.includes(provider)) {
48
- console.error(`Invalid provider: ${args[0]}`);
54
+ console.error(`Invalid provider: ${args[0]}. Valid: ${PROVIDER_CHOICES}`);
49
55
  process.exit(1);
50
56
  }
51
57
 
@@ -58,8 +64,8 @@ function setDefaultCommand(args) {
58
64
 
59
65
  async function setupCommand(args) {
60
66
  const provider = normalizeProviderName(args[0]);
61
- if (!provider) {
62
- console.error('Provider is required (claude, codex, gemini, opencode)');
67
+ if (!provider || !VALID_PROVIDERS.includes(provider)) {
68
+ console.error(`Provider is required (${PROVIDER_CHOICES})`);
63
69
  process.exit(1);
64
70
  }
65
71
 
@@ -115,7 +121,7 @@ async function setupCommand(args) {
115
121
  for (const level of levelKeys) {
116
122
  const modelChoice = await question(rl, `Model for ${level} (${catalog.join(', ')}): `);
117
123
  if (modelChoice) levelOverrides[level] = { model: modelChoice };
118
- if (provider !== 'codex') continue;
124
+ if (!providerSupportsCapability(provider, 'reasoningEffort')) continue;
119
125
  const reasoning = await question(rl, `Reasoning for ${level} (low|medium|high|xhigh): `);
120
126
  if (reasoning) {
121
127
  levelOverrides[level] = {
package/cli/index.js CHANGED
@@ -46,8 +46,9 @@ const {
46
46
  validateSetting,
47
47
  coerceValue,
48
48
  DEFAULT_SETTINGS,
49
+ settingsFileExists,
49
50
  } = require('../lib/settings');
50
- const { normalizeProviderName } = require('../lib/provider-names');
51
+ const { VALID_PROVIDERS, normalizeProviderName } = require('../lib/provider-names');
51
52
  const { getProvider, parseProviderChunk } = require('../src/providers');
52
53
  const { readClustersFileSync } = require('../lib/clusters-registry');
53
54
  const { MOUNT_PRESETS, resolveEnvs } = require('../lib/docker-config');
@@ -89,6 +90,7 @@ const { EVENT_COPY, formatMergeStatus } = require('./event-copy');
89
90
  let activeClusterId = null;
90
91
  /** @type {import('../src/orchestrator') | null} */
91
92
  let orchestratorInstance = null;
93
+ const PROVIDER_CHOICES = VALID_PROVIDERS.join(', ');
92
94
 
93
95
  // Track active status footer for safe output routing
94
96
  // When set, all output routes through statusFooter.print() to prevent garbling
@@ -189,7 +191,9 @@ function normalizeRunOptions(options) {
189
191
  if (options.docker) {
190
192
  options.worktree = false;
191
193
  }
192
- options.autoMerge = Boolean(options.ship);
194
+ // autoMerge is NOT stored here — it is derived from the run plan (delivery ===
195
+ // 'ship') at every consumer. Writing it here unconditionally would clobber an
196
+ // explicit autoMerge intent (e.g. a future `--auto-merge` flag) back to false.
193
197
  }
194
198
 
195
199
  async function runClusterPreflight({ input, options, providerOverride, settings, forceProvider }) {
@@ -2411,10 +2415,7 @@ program
2411
2415
  'When to close issue after merge: auto|always|never (default: from .zeroshot/settings.json or never)'
2412
2416
  )
2413
2417
  .option('--workers <n>', 'Max sub-agents for worker to spawn in parallel', parseInt)
2414
- .option(
2415
- '--provider <provider>',
2416
- 'Override all agents to use a provider (claude, codex, gemini, opencode)'
2417
- )
2418
+ .option('--provider <provider>', `Override all agents to use a provider (${PROVIDER_CHOICES})`)
2418
2419
  .option('--model <model>', 'Override all agent models (provider-specific model id)')
2419
2420
  .option(
2420
2421
  '--sim <mode>',
@@ -2610,6 +2611,7 @@ Force provider flags: -G (GitHub), -L (GitLab), -J (Jira), -D (DevOps), -N (Line
2610
2611
 
2611
2612
  if (!process.env.ZEROSHOT_DAEMON) {
2612
2613
  await streamClusterInForeground(cluster, orchestrator, clusterId, options);
2614
+ orchestrator.close();
2613
2615
  }
2614
2616
 
2615
2617
  setupDaemonCleanup(orchestrator, clusterId);
@@ -2679,7 +2681,7 @@ taskCmd
2679
2681
  .command('run <prompt>')
2680
2682
  .description('Run a single-agent background task')
2681
2683
  .option('-C, --cwd <path>', 'Working directory for task')
2682
- .option('--provider <provider>', 'Provider to use (claude, codex, gemini, opencode)')
2684
+ .option('--provider <provider>', `Provider to use (${PROVIDER_CHOICES})`)
2683
2685
  .option('--model <model>', 'Model id override for the provider')
2684
2686
  .option('--model-level <level>', 'Model level override (level1, level2, level3)')
2685
2687
  .option('--reasoning-effort <effort>', 'Reasoning effort (low, medium, high, xhigh)')
@@ -2691,6 +2693,12 @@ taskCmd
2691
2693
  'stream-json'
2692
2694
  )
2693
2695
  .option('--json-schema <schema>', 'JSON schema for structured output')
2696
+ .option(
2697
+ '--mcp-config <config>',
2698
+ 'MCP server config for providers that accept an MCP config flag (e.g. Copilot). ' +
2699
+ 'Inline JSON string ({"mcpServers":{...}}) or @<path>. Repeatable.',
2700
+ (value, previous) => (previous || []).concat([value])
2701
+ )
2694
2702
  .option('--silent-json-output', 'Log ONLY final structured output')
2695
2703
  .action(async (prompt, options) => {
2696
2704
  try {
@@ -3602,15 +3610,15 @@ function registerTuiEntrypoint(commandName, providerName) {
3602
3610
  .action(failTuiUnavailable);
3603
3611
  }
3604
3612
 
3605
- registerTuiEntrypoint('codex', 'codex');
3606
- registerTuiEntrypoint('claude', 'claude');
3607
- registerTuiEntrypoint('gemini', 'gemini');
3608
- registerTuiEntrypoint('opencode', 'opencode');
3613
+ for (const providerName of VALID_PROVIDERS) {
3614
+ registerTuiEntrypoint(providerName, providerName);
3615
+ }
3609
3616
 
3610
3617
  // Settings management
3611
3618
  const settingsCmd = program.command('settings').description('Manage zeroshot settings');
3612
3619
 
3613
3620
  function printSettingsUsage() {
3621
+ const mountPresetList = Object.keys(MOUNT_PRESETS).join(', ');
3614
3622
  console.log(chalk.dim('Usage:'));
3615
3623
  console.log(chalk.dim(' zeroshot settings set <key> <value>'));
3616
3624
  console.log(chalk.dim(' zeroshot settings get <key>'));
@@ -3621,11 +3629,7 @@ function printSettingsUsage() {
3621
3629
  console.log(chalk.dim(' zeroshot settings set dockerMounts \'["gh","git","ssh","aws"]\''));
3622
3630
  console.log(chalk.dim(' zeroshot settings set dockerEnvPassthrough \'["AWS_*","TF_VAR_*"]\''));
3623
3631
  console.log('');
3624
- console.log(
3625
- chalk.dim(
3626
- 'Available mount presets: gh, git, ssh, aws, azure, kube, terraform, gcloud, claude, codex, gemini'
3627
- )
3628
- );
3632
+ console.log(chalk.dim(`Available mount presets: ${mountPresetList}`));
3629
3633
  console.log('');
3630
3634
  }
3631
3635
 
@@ -4126,7 +4130,7 @@ providersCmd.action(async () => {
4126
4130
 
4127
4131
  providersCmd
4128
4132
  .command('set-default <provider>')
4129
- .description('Set default provider (claude, codex, gemini, opencode)')
4133
+ .description(`Set default provider (${PROVIDER_CHOICES})`)
4130
4134
  .action(async (provider) => {
4131
4135
  await setDefaultCommand([provider]);
4132
4136
  });
@@ -4138,6 +4142,68 @@ providersCmd
4138
4142
  await setupCommand([provider]);
4139
4143
  });
4140
4144
 
4145
+ // Setup wizard (read-only facts + setup contract; apply/undo/TTY wizard land separately)
4146
+ const setupCmd = program.command('setup').description('Setup and configuration wizard');
4147
+ setupCmd
4148
+ .command('plan')
4149
+ .description('Show read-only setup facts and proposed contract (no writes)')
4150
+ .option('--json', 'Output as JSON')
4151
+ .action(() => {
4152
+ const { buildSetupPlan } = require('../lib/setup-plan');
4153
+ const { readRepoSettings } = require('../lib/repo-settings');
4154
+
4155
+ const cwd = process.cwd();
4156
+ const settings = loadSettings();
4157
+ settings.__meta = { fileExists: settingsFileExists() };
4158
+ const { settings: repoSettings } = readRepoSettings(cwd);
4159
+ const plan = buildSetupPlan({
4160
+ cwd,
4161
+ settings,
4162
+ repoSettings,
4163
+ env: { ...process.env, __isTTY: !!process.stdout.isTTY },
4164
+ });
4165
+ console.log(JSON.stringify(plan, null, 2));
4166
+ });
4167
+
4168
+ setupCmd
4169
+ .command('apply')
4170
+ .description('Apply a decisions file to global/repo settings (writes)')
4171
+ .requiredOption('--decisions <file>', 'Path to decisions JSON file')
4172
+ .option('--json', 'Output as JSON')
4173
+ .option(
4174
+ '--allow-risky-defaults',
4175
+ 'Allow storing defaultDelivery=ship as a global default (auto-merge by default)'
4176
+ )
4177
+ .action((opts) => {
4178
+ const { applyDecisions } = require('../lib/setup-apply');
4179
+ try {
4180
+ const results = applyDecisions({
4181
+ decisionsPath: opts.decisions,
4182
+ cwd: process.cwd(),
4183
+ allowRiskyDefaults: !!opts.allowRiskyDefaults,
4184
+ });
4185
+ console.log(JSON.stringify({ results }, null, 2));
4186
+ } catch (err) {
4187
+ console.error(JSON.stringify({ error: err.message }, null, 2));
4188
+ process.exitCode = 1;
4189
+ }
4190
+ });
4191
+
4192
+ setupCmd
4193
+ .command('undo')
4194
+ .description('Undo writes made by the most recent `zeroshot setup apply` runs')
4195
+ .option('--json', 'Output as JSON')
4196
+ .action(() => {
4197
+ const { undo } = require('../lib/setup-undo');
4198
+ try {
4199
+ const results = undo({});
4200
+ console.log(JSON.stringify({ results }, null, 2));
4201
+ } catch (err) {
4202
+ console.error(JSON.stringify({ error: err.message }, null, 2));
4203
+ process.exitCode = 1;
4204
+ }
4205
+ });
4206
+
4141
4207
  // Update command
4142
4208
  program
4143
4209
  .command('update')
@@ -10,6 +10,7 @@
10
10
 
11
11
  const readline = require('readline');
12
12
  const { loadSettings, saveSettings } = require('../../lib/settings');
13
+ const { listProviderMetadata } = require('../../lib/provider-names');
13
14
  const { detectProviders } = require('../../src/providers');
14
15
 
15
16
  /**
@@ -39,6 +40,16 @@ function createReadline() {
39
40
  });
40
41
  }
41
42
 
43
+ function printProviderInstallChoices() {
44
+ for (const provider of listProviderMetadata()) {
45
+ const [firstLine, ...remainingLines] = provider.installInstructions.split('\n');
46
+ console.log(` - ${provider.displayName}: ${firstLine}`);
47
+ for (const line of remainingLines) {
48
+ console.log(` ${line}`);
49
+ }
50
+ }
51
+ }
52
+
42
53
  /**
43
54
  * Prompt for provider selection
44
55
  * @param {readline.Interface} rl
@@ -52,9 +63,7 @@ function promptProvider(rl, detected) {
52
63
 
53
64
  if (available.length === 0) {
54
65
  console.log('No AI CLI tools detected. Please install one of:');
55
- console.log(' - Claude Code: npm install -g @anthropic-ai/claude-code');
56
- console.log(' - Codex CLI: npm install -g @openai/codex');
57
- console.log(' - Gemini CLI: npm install -g @google/gemini-cli');
66
+ printProviderInstallChoices();
58
67
  process.exit(1);
59
68
  }
60
69
 
@@ -208,4 +217,6 @@ module.exports = {
208
217
  detectFirstRun,
209
218
  printWelcome,
210
219
  printComplete,
220
+ promptProvider,
221
+ printProviderInstallChoices,
211
222
  };
@@ -8,7 +8,9 @@ FROM node:20-slim
8
8
 
9
9
  # Upgrade npm to fix Arborist isDescendantOf bug (npm 10.x crash on complex peer deps)
10
10
  # See: https://github.com/npm/cli/issues/7682
11
- RUN npm install -g npm@latest
11
+ # Pinned to npm@11 (the latest line that still supports the node:20-slim base); npm@latest (12.x)
12
+ # now requires node >=22 and breaks the build with EBADENGINE.
13
+ RUN npm install -g npm@11
12
14
 
13
15
  # Version pinning for infrastructure tools
14
16
  ARG AWS_CLI_VERSION=2.15.10
@@ -146,6 +148,14 @@ RUN mkdir -p /home/node/.claude /home/node/.config/gh \
146
148
  RUN mkdir -p /workspace && chown node:node /workspace
147
149
  WORKDIR /workspace
148
150
 
151
+ # Install the running provider's CLI as a docker-cached layer (per-provider image variant).
152
+ # Claude is baked in above, so its variant passes an empty PROVIDER_INSTALL and skips this step.
153
+ # Kept last in the root phase so every heavy layer above is shared across all provider images;
154
+ # Docker caches this layer keyed on the install command, so it builds once per provider and is
155
+ # then reused. The command comes from the provider registry (docker.install), never hardcoded.
156
+ ARG PROVIDER_INSTALL=""
157
+ RUN if [ -n "$PROVIDER_INSTALL" ]; then sh -c "$PROVIDER_INSTALL"; fi
158
+
149
159
  # Switch to non-root user (required for --dangerously-skip-permissions)
150
160
  USER node
151
161
 
@@ -0,0 +1,4 @@
1
+ import type { CommandSpec, ProviderId } from './types';
2
+ import type { ProcessResult, ProcessRunnerOptions } from './process-runner';
3
+ export declare function runAcpStdioPrompt(provider: ProviderId, commandSpec: CommandSpec, prompt: string, options?: ProcessRunnerOptions): Promise<ProcessResult>;
4
+ //# sourceMappingURL=acp-stdio-runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"acp-stdio-runner.d.ts","sourceRoot":"","sources":["../../src/agent-cli-provider/acp-stdio-runner.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACvD,OAAO,KAAK,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AA2F5E,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,UAAU,EACpB,WAAW,EAAE,WAAW,EACxB,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,aAAa,CAAC,CAqNxB"}
@@ -0,0 +1,259 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.runAcpStdioPrompt = runAcpStdioPrompt;
4
+ /* eslint-disable max-lines-per-function */
5
+ const node_child_process_1 = require("node:child_process");
6
+ const env_safety_1 = require("./env-safety");
7
+ const DEFAULT_TIMEOUT_KILL_GRACE_MS = 100;
8
+ function spawnOptions(commandSpec) {
9
+ const options = {
10
+ shell: false,
11
+ env: { ...(0, env_safety_1.omitProcessControlEnv)(process.env), ...(0, env_safety_1.omitUnsafeProviderEnv)(commandSpec.env) },
12
+ stdio: ['pipe', 'pipe', 'pipe'],
13
+ };
14
+ if (commandSpec.cwd !== undefined)
15
+ options.cwd = commandSpec.cwd;
16
+ return options;
17
+ }
18
+ function processResult(input) {
19
+ return {
20
+ stdout: Buffer.concat(input.stdout).toString('utf8'),
21
+ stderr: Buffer.concat(input.stderr).toString('utf8'),
22
+ exitCode: input.exitCode,
23
+ signal: input.signal,
24
+ durationMs: Date.now() - input.startedAt,
25
+ timedOut: input.timedOut,
26
+ ...(input.timedOut && input.timeoutMs !== undefined ? { timeoutMs: input.timeoutMs } : {}),
27
+ };
28
+ }
29
+ function isRecord(value) {
30
+ return value !== null && typeof value === 'object' && !Array.isArray(value);
31
+ }
32
+ function parseProtocolLine(line) {
33
+ let parsed;
34
+ try {
35
+ parsed = JSON.parse(line);
36
+ }
37
+ catch (error) {
38
+ const reason = error instanceof Error ? error.message : 'Unknown JSON parse error.';
39
+ throw new Error(`malformed ACP stdout JSON: ${reason}`);
40
+ }
41
+ if (!isRecord(parsed))
42
+ throw new Error('malformed ACP stdout JSON: expected a JSON object.');
43
+ return parsed;
44
+ }
45
+ function createPromptParams(sessionId, prompt) {
46
+ return {
47
+ sessionId,
48
+ prompt: [
49
+ {
50
+ role: 'user',
51
+ content: [{ type: 'text', text: prompt }],
52
+ },
53
+ ],
54
+ };
55
+ }
56
+ function runAcpStdioPrompt(provider, commandSpec, prompt, options = {}) {
57
+ return new Promise((resolve, reject) => {
58
+ const startedAt = Date.now();
59
+ const stdout = [];
60
+ const stderr = [];
61
+ const child = (0, node_child_process_1.spawn)(commandSpec.binary, [...commandSpec.args], spawnOptions(commandSpec));
62
+ const pending = new Map();
63
+ let stdoutBuffer = '';
64
+ let nextId = 1;
65
+ let timedOut = false;
66
+ let protocolFailure = null;
67
+ let sessionId = null;
68
+ let closeResolved = false;
69
+ let timeout;
70
+ let timeoutKill;
71
+ function cleanupTimers() {
72
+ if (timeout !== undefined)
73
+ clearTimeout(timeout);
74
+ if (timeoutKill !== undefined)
75
+ clearTimeout(timeoutKill);
76
+ }
77
+ function finalize(exitCode, signal) {
78
+ if (closeResolved)
79
+ return;
80
+ closeResolved = true;
81
+ cleanupTimers();
82
+ if (protocolFailure) {
83
+ const failureMessage = protocolFailure.message;
84
+ if (!stderr.some((chunk) => chunk.toString('utf8').includes(failureMessage))) {
85
+ stderr.push(Buffer.from(`${failureMessage}\n`, 'utf8'));
86
+ }
87
+ }
88
+ const effectiveExitCode = protocolFailure && exitCode === 0 && signal === null ? 1 : exitCode;
89
+ resolve(processResult({
90
+ stdout,
91
+ stderr,
92
+ exitCode: effectiveExitCode,
93
+ signal,
94
+ startedAt,
95
+ timedOut,
96
+ ...(options.timeoutMs === undefined ? {} : { timeoutMs: options.timeoutMs }),
97
+ }));
98
+ }
99
+ function failClosed(message) {
100
+ if (protocolFailure)
101
+ return;
102
+ protocolFailure = new Error(`${provider} ACP stdio fail-closed: ${message}`);
103
+ for (const request of pending.values()) {
104
+ request.reject(protocolFailure);
105
+ }
106
+ pending.clear();
107
+ if (sessionId && child.stdin && !child.stdin.destroyed) {
108
+ child.stdin.write(`${JSON.stringify({
109
+ jsonrpc: '2.0',
110
+ method: 'session/cancel',
111
+ params: { sessionId },
112
+ })}\n`);
113
+ }
114
+ child.stdin?.end();
115
+ child.kill('SIGTERM');
116
+ }
117
+ function handleProtocolMessage(message) {
118
+ const responseId = typeof message.id === 'number' ? message.id : null;
119
+ if (responseId !== null && (message.result !== undefined || message.error !== undefined)) {
120
+ const request = pending.get(responseId);
121
+ if (request) {
122
+ pending.delete(responseId);
123
+ request.resolve(message);
124
+ }
125
+ return;
126
+ }
127
+ const method = typeof message.method === 'string' ? message.method : null;
128
+ if (!method)
129
+ return;
130
+ if (method === 'session/update')
131
+ return;
132
+ if (method.startsWith('_'))
133
+ return;
134
+ if (method === 'session/request_permission') {
135
+ failClosed('unsupported session/request_permission callback.');
136
+ return;
137
+ }
138
+ if (method.startsWith('fs/')) {
139
+ failClosed(`unsupported ${method} callback.`);
140
+ return;
141
+ }
142
+ if (method.startsWith('terminal/')) {
143
+ failClosed(`unsupported ${method} callback.`);
144
+ return;
145
+ }
146
+ if (method.startsWith('session/')) {
147
+ failClosed(`unsupported ${method} session-control callback.`);
148
+ }
149
+ }
150
+ function consumeStdoutLine(line) {
151
+ try {
152
+ handleProtocolMessage(parseProtocolLine(line));
153
+ }
154
+ catch (error) {
155
+ failClosed(error instanceof Error ? error.message : 'malformed ACP stdout JSON.');
156
+ }
157
+ }
158
+ function flushStdoutRemainder() {
159
+ const line = stdoutBuffer.trim();
160
+ stdoutBuffer = '';
161
+ if (line)
162
+ consumeStdoutLine(line);
163
+ }
164
+ function flushStdout(data) {
165
+ stdout.push(data);
166
+ stdoutBuffer += data.toString('utf8');
167
+ let newline = stdoutBuffer.indexOf('\n');
168
+ while (newline !== -1) {
169
+ const line = stdoutBuffer.slice(0, newline).trim();
170
+ stdoutBuffer = stdoutBuffer.slice(newline + 1);
171
+ if (line)
172
+ consumeStdoutLine(line);
173
+ newline = stdoutBuffer.indexOf('\n');
174
+ }
175
+ }
176
+ function sendRequest(method, params) {
177
+ const id = nextId;
178
+ nextId += 1;
179
+ const request = {
180
+ jsonrpc: '2.0',
181
+ id,
182
+ method,
183
+ params,
184
+ };
185
+ return new Promise((requestResolve, requestReject) => {
186
+ pending.set(id, { resolve: requestResolve, reject: requestReject });
187
+ child.stdin?.write(`${JSON.stringify(request)}\n`);
188
+ });
189
+ }
190
+ async function driveProtocol() {
191
+ const initialize = await sendRequest('initialize', {
192
+ protocolVersion: 1,
193
+ clientInfo: {
194
+ name: '@the-open-engine/zeroshot',
195
+ version: '1',
196
+ },
197
+ clientCapabilities: {
198
+ fs: false,
199
+ terminal: false,
200
+ promptCapabilities: {
201
+ image: false,
202
+ },
203
+ },
204
+ });
205
+ if (initialize.error !== undefined) {
206
+ child.stdin?.end();
207
+ return;
208
+ }
209
+ const session = await sendRequest('session/new', {
210
+ cwd: commandSpec.cwd ?? process.cwd(),
211
+ mcpServers: [],
212
+ });
213
+ if (session.error !== undefined) {
214
+ child.stdin?.end();
215
+ return;
216
+ }
217
+ const sessionResult = isRecord(session.result) ? session.result : {};
218
+ const nextSessionId = typeof sessionResult.sessionId === 'string' ? sessionResult.sessionId : null;
219
+ if (!nextSessionId) {
220
+ failClosed('session/new response omitted sessionId.');
221
+ return;
222
+ }
223
+ sessionId = nextSessionId;
224
+ await sendRequest('session/prompt', createPromptParams(sessionId, prompt));
225
+ child.stdin?.end();
226
+ }
227
+ if (options.timeoutMs !== undefined) {
228
+ timeout = setTimeout(() => {
229
+ timedOut = true;
230
+ if (sessionId && child.stdin && !child.stdin.destroyed) {
231
+ child.stdin.write(`${JSON.stringify({
232
+ jsonrpc: '2.0',
233
+ method: 'session/cancel',
234
+ params: { sessionId },
235
+ })}\n`);
236
+ }
237
+ child.kill('SIGTERM');
238
+ timeoutKill = setTimeout(() => {
239
+ if (!closeResolved)
240
+ child.kill('SIGKILL');
241
+ }, options.timeoutKillGraceMs ?? DEFAULT_TIMEOUT_KILL_GRACE_MS);
242
+ }, options.timeoutMs);
243
+ }
244
+ child.stdout?.on('data', flushStdout);
245
+ child.stdout?.once('end', flushStdoutRemainder);
246
+ child.stderr?.on('data', (data) => stderr.push(data));
247
+ child.once('error', (error) => {
248
+ cleanupTimers();
249
+ reject(error);
250
+ });
251
+ child.once('close', (exitCode, signal) => {
252
+ finalize(exitCode, signal);
253
+ });
254
+ driveProtocol().catch((error) => {
255
+ failClosed(error instanceof Error ? error.message : 'ACP protocol failed.');
256
+ });
257
+ });
258
+ }
259
+ //# sourceMappingURL=acp-stdio-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"acp-stdio-runner.js","sourceRoot":"","sources":["../../src/agent-cli-provider/acp-stdio-runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import { type BuildProviderCommandOptions, type LevelModelSpec, type ModelCatalogEntry, type ModelLevel, type ProviderAdapter, type ProviderId } from '../types';
2
+ export interface AcpAdapterMetadata {
3
+ readonly provider: ProviderId;
4
+ readonly displayName: string;
5
+ readonly binary: string;
6
+ readonly commandArgs: readonly string[];
7
+ readonly credentialEnvKeys: readonly string[];
8
+ readonly modelCatalog?: Readonly<Record<string, ModelCatalogEntry>>;
9
+ readonly levelMapping?: Readonly<Record<ModelLevel, LevelModelSpec>>;
10
+ readonly defaultLevel?: ModelLevel;
11
+ readonly defaultMaxLevel?: ModelLevel;
12
+ readonly defaultMinLevel?: ModelLevel;
13
+ readonly supportsPromptImages: boolean;
14
+ readonly supportsLoadSession: boolean;
15
+ readonly supportsSessionCancel: boolean;
16
+ readonly supportsSessionSetModel: boolean;
17
+ readonly supportsSessionSetMode: boolean;
18
+ readonly retryableErrorPatterns?: readonly RegExp[];
19
+ readonly permanentErrorPatterns?: readonly RegExp[];
20
+ }
21
+ export declare function buildAcpPrompt(context: string, options?: BuildProviderCommandOptions): string;
22
+ export declare function createAcpAdapter(meta: AcpAdapterMetadata): ProviderAdapter;
23
+ //# sourceMappingURL=acp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"acp.d.ts","sourceRoot":"","sources":["../../../src/agent-cli-provider/adapters/acp.ts"],"names":[],"mappings":"AAYA,OAAO,EAEL,KAAK,2BAA2B,EAGhC,KAAK,cAAc,EAEnB,KAAK,iBAAiB,EACtB,KAAK,UAAU,EAEf,KAAK,eAAe,EACpB,KAAK,UAAU,EAKhB,MAAM,UAAU,CAAC;AAWlB,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,QAAQ,EAAE,UAAU,CAAC;IAC9B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IACxC,QAAQ,CAAC,iBAAiB,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9C,QAAQ,CAAC,YAAY,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC,CAAC;IACpE,QAAQ,CAAC,YAAY,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC,CAAC;IACrE,QAAQ,CAAC,YAAY,CAAC,EAAE,UAAU,CAAC;IACnC,QAAQ,CAAC,eAAe,CAAC,EAAE,UAAU,CAAC;IACtC,QAAQ,CAAC,eAAe,CAAC,EAAE,UAAU,CAAC;IACtC,QAAQ,CAAC,oBAAoB,EAAE,OAAO,CAAC;IACvC,QAAQ,CAAC,mBAAmB,EAAE,OAAO,CAAC;IACtC,QAAQ,CAAC,qBAAqB,EAAE,OAAO,CAAC;IACxC,QAAQ,CAAC,uBAAuB,EAAE,OAAO,CAAC;IAC1C,QAAQ,CAAC,sBAAsB,EAAE,OAAO,CAAC;IACzC,QAAQ,CAAC,sBAAsB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACpD,QAAQ,CAAC,sBAAsB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACrD;AAsGD,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,2BAAgC,GAAG,MAAM,CAEjG;AAuTD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,kBAAkB,GAAG,eAAe,CAoB1E"}