remote-codex 0.11.49 → 0.11.50

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.
@@ -10,7 +10,7 @@
10
10
  <link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png" />
11
11
  <link rel="manifest" href="/site.webmanifest" />
12
12
  <title>Remote Codex</title>
13
- <script type="module" crossorigin src="/assets/index-DZI1aSXo.js"></script>
13
+ <script type="module" crossorigin src="/assets/index-BXypG9kl.js"></script>
14
14
  <link rel="modulepreload" crossorigin href="/assets/react-vendor-Dfg_6BLf.js">
15
15
  <link rel="modulepreload" crossorigin href="/assets/ui-vendor-CuR8GHb0.js">
16
16
  <link rel="modulepreload" crossorigin href="/assets/graph-vendor-DVQUpZ8C.js">
@@ -347,6 +347,7 @@ function resolveSupervisorLaunch() {
347
347
  function relaySupervisorProcessEnv(extra = {}) {
348
348
  return {
349
349
  ...process.env,
350
+ APP_VERSION: process.env.APP_VERSION ?? readPackageVersion(),
350
351
  REMOTE_CODEX_MODE: 'relay',
351
352
  REMOTE_CODEX_PACKAGE_ROOT: process.env.REMOTE_CODEX_PACKAGE_ROOT ?? packageRoot,
352
353
  REMOTE_CODEX_DISABLE_BUILD_RESTART:
@@ -408,7 +409,7 @@ async function startRelaySupervisorWindowsUnlocked() {
408
409
  REMOTE_CODEX_LIFECYCLE_CONTROL_TOKEN: controlToken,
409
410
  REMOTE_CODEX_LIFECYCLE_INSTANCE_ID: instanceId,
410
411
  REMOTE_CODEX_ENABLED_AGENT_PROVIDERS:
411
- process.env.REMOTE_CODEX_ENABLED_AGENT_PROVIDERS ?? 'codex',
412
+ process.env.REMOTE_CODEX_ENABLED_AGENT_PROVIDERS ?? 'codex,acp',
412
413
  }),
413
414
  stdio: ['ignore', logFd, logFd],
414
415
  });
@@ -1437,7 +1438,8 @@ Recommended environment:
1437
1438
  CODEX_COMMAND
1438
1439
  Codex executable. Default codex.
1439
1440
  REMOTE_CODEX_ENABLED_AGENT_PROVIDERS
1440
- Comma-separated provider ids, for example codex,claude.
1441
+ Comma-separated provider ids. Defaults to codex,claude,opencode,acp on Unix
1442
+ and codex,acp on Windows.
1441
1443
  REMOTE_CODEX_RELAY_SUPERVISOR_TMUX
1442
1444
  Set to 0/false/no/off to disable default tmux management.
1443
1445
  REMOTE_CODEX_RELAY_SUPERVISOR_TMUX_SESSION
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "remote-codex",
3
- "version": "0.11.49",
3
+ "version": "0.11.50",
4
4
  "description": "Local web supervisor for Codex workspaces and threads.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -19,6 +19,41 @@ afterEach(async () => {
19
19
  });
20
20
 
21
21
  describe('AcpCatalogRuntimeAdapter', () => {
22
+ it('keeps the built-in ACP runtime selectable when every base agent is missing', async () => {
23
+ const runtime = new AcpCatalogRuntimeAdapter({
24
+ catalog: new AcpAgentCatalog({
25
+ definitions: [{
26
+ id: 'missing-agent',
27
+ displayName: 'Missing Agent',
28
+ description: 'Missing ACP fixture',
29
+ transport: 'native',
30
+ baseCommand: 'remote-codex-missing-acp-agent',
31
+ baseProbeCommand: 'remote-codex-missing-acp-agent --version',
32
+ serverCommand: 'remote-codex-missing-acp-agent acp',
33
+ serverProbeCommand: 'remote-codex-missing-acp-agent acp --help',
34
+ installCommand: null,
35
+ }],
36
+ }),
37
+ });
38
+ runtimes.push(runtime);
39
+
40
+ const agents = await runtime.listModels();
41
+
42
+ expect(agents).toMatchObject([{
43
+ id: 'missing-agent',
44
+ acpAgent: { availability: 'base_missing' },
45
+ }]);
46
+ expect(runtime.installation).toMatchObject({
47
+ installed: true,
48
+ installedVersion: 'Built in · 0 ACP agents ready',
49
+ lastError: 'No supported base agent was detected.',
50
+ });
51
+ expect(runtime.getStatus()).toMatchObject({
52
+ state: 'degraded',
53
+ lastError: 'No supported base agent was detected.',
54
+ });
55
+ });
56
+
22
57
  it('selects a concrete agent and scopes its provider session id', async () => {
23
58
  const fixture = path.resolve(
24
59
  'node_modules/@agentclientprotocol/sdk/dist/examples/agent.js',
@@ -142,8 +142,8 @@ export class AcpCatalogRuntimeAdapter extends EventEmitter implements AgentRunti
142
142
  readonly managementSchema = catalogManagementSchema;
143
143
  readonly installation: AgentBackendInstallationDto = {
144
144
  packageName: null,
145
- installed: false,
146
- installedVersion: null,
145
+ installed: true,
146
+ installedVersion: 'Built in · 0 ACP agents ready',
147
147
  latestVersion: null,
148
148
  installCommand: null,
149
149
  updateCommand: null,
@@ -393,10 +393,9 @@ export class AcpCatalogRuntimeAdapter extends EventEmitter implements AgentRunti
393
393
  const entries = await this.catalog.list({ force });
394
394
  const ready = entries.filter((entry) => entry.availability === 'ready');
395
395
  const baseInstalled = entries.filter((entry) => entry.availability !== 'base_missing');
396
- this.installation.installed = baseInstalled.length > 0;
397
- this.installation.installedVersion = ready.length > 0
398
- ? `${ready.length} ACP agent${ready.length === 1 ? '' : 's'} ready`
399
- : null;
396
+ this.installation.installed = true;
397
+ this.installation.installedVersion =
398
+ `Built in · ${ready.length} ACP agent${ready.length === 1 ? '' : 's'} ready`;
400
399
  this.installation.lastError = ready.length > 0
401
400
  ? null
402
401
  : baseInstalled.length > 0
@@ -21,6 +21,7 @@ const stateFile = path.join(serviceDir, 'service-state.json');
21
21
  const apiEntry = path.join(repoRoot, 'apps', 'supervisor-api', 'dist', 'index.js');
22
22
  const webEntry = path.join(repoRoot, 'scripts', 'run-web-service.mjs');
23
23
  const webIndex = path.join(repoRoot, 'apps', 'supervisor-web', 'dist', 'index.html');
24
+ const packageVersion = readPackageVersion();
24
25
  const defaultServicePort = supportsSourceRestart ? 4173 : 45673;
25
26
  const defaultApiPort = supportsSourceRestart ? 8787 : 45674;
26
27
 
@@ -76,6 +77,7 @@ async function startService() {
76
77
 
77
78
  const apiPid = spawnDetached(process.execPath, [apiEntry], apiLogPath, {
78
79
  NODE_ENV: 'production',
80
+ APP_VERSION: process.env.APP_VERSION ?? packageVersion,
79
81
  HOST: apiHost,
80
82
  PORT: String(apiPort),
81
83
  LOG_LEVEL: process.env.LOG_LEVEL ?? 'warn',
@@ -186,6 +188,17 @@ function ensureBuildArtifacts() {
186
188
  process.exit(1);
187
189
  }
188
190
 
191
+ function readPackageVersion() {
192
+ try {
193
+ const parsed = JSON.parse(
194
+ fs.readFileSync(path.join(repoRoot, 'package.json'), 'utf8'),
195
+ );
196
+ return typeof parsed.version === 'string' ? parsed.version : '0.0.0';
197
+ } catch {
198
+ return '0.0.0';
199
+ }
200
+ }
201
+
189
202
  function spawnDetached(commandToRun, args, logPath, env) {
190
203
  const logFd = fs.openSync(logPath, 'a');
191
204
  const child = spawn(commandToRun, args, {