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.
- package/README.md +7 -5
- package/apps/supervisor-api/dist/index.js +5 -5
- package/apps/supervisor-web/dist/assets/index-BXypG9kl.js +22 -0
- package/apps/supervisor-web/dist/index.html +1 -1
- package/bin/remote-codex.mjs +4 -2
- package/package.json +1 -1
- package/packages/acp/src/catalog-runtime.test.ts +35 -0
- package/packages/acp/src/catalog-runtime.ts +5 -6
- package/scripts/service-manager.mjs +13 -0
- package/apps/supervisor-web/dist/assets/index-DZI1aSXo.js +0 -22
|
@@ -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-
|
|
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">
|
package/bin/remote-codex.mjs
CHANGED
|
@@ -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
|
|
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
|
@@ -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:
|
|
146
|
-
installedVersion:
|
|
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 =
|
|
397
|
-
this.installation.installedVersion =
|
|
398
|
-
|
|
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, {
|