fix: preserve read error codes and launcher fixtures (#1873)
This commit was merged in pull request #1912.
This commit is contained in:
1 parent
307fe928ac
commit
96c900d210
10 files changed
+82
-27
No files matched your search
@@ -76,8 +76,8 @@ function readJsonFile(file, what) {
|
||||
let document;
|
||||
try {
|
||||
document = parseJsonFileText(fs.readFileSync(file, "utf8"), file, what);
|
||||
} catch {
|
||||
fail(2, `${what} is not valid JSON (${file})`);
|
||||
} catch (error) {
|
||||
fail(2, `${what} is not valid JSON (${file})${error.code ? ` (${error.code})` : ""}`);
|
||||
}
|
||||
return document;
|
||||
}
|
||||
|
||||
@@ -32,6 +32,9 @@ for (const agent of ['darkwing', 'dewey', 'filbert', 'researcher', 'sage']) test
|
||||
// fixture is its own data root so no registration reaches a real one.
|
||||
cpSync(join(source, 'scripts/mosaic'), join(root, 'scripts/mosaic'));
|
||||
cpSync(join(source, 'packages/seat/src'), join(root, 'packages/seat/src'), { recursive: true });
|
||||
mkdirSync(join(root, 'packages/organization/src'), { recursive: true });
|
||||
for (const file of ['util.mjs', 'errors.mjs', 'vocabulary.mjs'])
|
||||
cpSync(join(source, 'packages/organization/src', file), join(root, 'packages/organization/src', file));
|
||||
mkdirSync(join(root, '.git'));
|
||||
writeFileSync(join(root, 'config.json'), JSON.stringify({ configVersion: 1, dataRoot: root }));
|
||||
const registration = join(root, `seats/repo/${agent}/registration.json`);
|
||||
@@ -149,40 +152,46 @@ test('default agent entry retains container setup and refuses missing seat/auth'
|
||||
try {
|
||||
for (const dir of ['scripts', 'bin', 'runtime/user']) mkdirSync(join(root, dir), { recursive: true });
|
||||
cpSync(join(source, 'scripts/agent.sh'), join(root, 'scripts/agent.sh'));
|
||||
// All runtime effects remain in this fixture; Docker and release helpers are doubles.
|
||||
// Observe the current processing-control handoff; its Docker behavior has
|
||||
// its own package tests. Every runtime effect stays inside this fixture.
|
||||
writeFileSync(join(root, 'scripts/common.sh'), `
|
||||
load_config() { MOSAIC_DEV_DIR="$PWD/runtime"; MOSAIC_ADAPTER=pi; MOSAIC_MODEL=test; echo config >> trace; }
|
||||
load_release() { echo release >> trace; }
|
||||
bootstrap_runtime_dir() { echo bootstrap >> trace; }
|
||||
processing_guard() { echo processing >> trace; }
|
||||
ensure_release_aligned() { echo alignment >> trace; }
|
||||
`);
|
||||
writeFileSync(join(root, 'runtime/user/USER.md'), 'fixture user\n');
|
||||
writeFileSync(join(root, 'bin/docker'), `#!/usr/bin/env node
|
||||
require('node:fs').writeFileSync('docker.json', JSON.stringify({
|
||||
args: process.argv.slice(2), session: process.env.MOSAIC_SESSION_DIR,
|
||||
workspace: process.env.MOSAIC_WORKSPACE, tools: process.env.MOSAIC_TOOLS,
|
||||
name: process.env.MOSAIC_AGENT_NAME, interactive: process.env.MOSAIC_INTERACTIVE
|
||||
mkdirSync(join(root, 'packages/processing-control/src'), { recursive: true });
|
||||
writeFileSync(join(root, 'packages/processing-control/src/container-cli.mjs'), `
|
||||
import fs from 'node:fs';
|
||||
fs.writeFileSync('container.json', JSON.stringify({
|
||||
args: process.argv.slice(2), session: process.env.MOSAIC_SESSION_DIR ?? null,
|
||||
workspace: process.env.MOSAIC_WORKSPACE ?? null, tools: process.env.MOSAIC_TOOLS,
|
||||
name: process.env.MOSAIC_AGENT_NAME, interactive: process.env.MOSAIC_INTERACTIVE,
|
||||
sessionSource: process.env.MOSAIC_SESSION_SOURCE, workspaceSource: process.env.MOSAIC_WORKSPACE_SOURCE
|
||||
}));
|
||||
`, { mode: 0o755 });
|
||||
`);
|
||||
const env = { ...process.env, PATH: join(root, 'bin') + ':' + process.env.PATH };
|
||||
for (const name of ['MOSAIC_AGENTS_DIR', 'MOSAIC_ROLES_DIR', 'MOSAIC_SKILLS', 'MOSAIC_AGENT_ROLE']) delete env[name];
|
||||
const run = (args, overrides = {}) => spawnSync('bash', [join(root, 'scripts/agent.sh'), ...args],
|
||||
{ cwd: tmpdir(), env: { ...env, ...overrides }, encoding: 'utf8', timeout: 10000 });
|
||||
let result = run(['fixture', '--tools', 'read,bash']);
|
||||
assert.equal(result.status, 0, result.stdout + result.stderr);
|
||||
assert.deepEqual(readFileSync(join(root, 'trace'), 'utf8').trim().split('\n'), ['config', 'release', 'bootstrap', 'alignment']);
|
||||
assert.deepEqual(JSON.parse(readFileSync(join(root, 'docker.json'))), {
|
||||
args: ['compose', 'run', '--rm', 'mosaic-agent'], session: '/var/lib/mosaic/sessions/agent-fixture',
|
||||
workspace: '/var/lib/mosaic/workspaces/fixture', tools: 'read,bash', name: 'fixture', interactive: '1'
|
||||
assert.deepEqual(readFileSync(join(root, 'trace'), 'utf8').trim().split('\n'), ['config', 'release', 'bootstrap', 'processing', 'alignment']);
|
||||
assert.deepEqual(JSON.parse(readFileSync(join(root, 'container.json'))), {
|
||||
args: ['--tty'], session: null,
|
||||
workspace: null, tools: 'read,bash', name: 'fixture', interactive: '1',
|
||||
sessionSource: join(root, 'runtime/sessions/agent-fixture'), workspaceSource: join(root, 'runtime/workspaces/fixture')
|
||||
});
|
||||
const captured = readFileSync(join(root, 'docker.json'), 'utf8');
|
||||
const captured = readFileSync(join(root, 'container.json'), 'utf8');
|
||||
result = run(['fixture'], { MOSAIC_AGENTS_DIR: join(root, 'missing-seats') });
|
||||
assert.equal(result.status, 4);
|
||||
assert.match(result.stderr, /no seat definition/);
|
||||
result = run(['fixture', '--auth', 'missing']);
|
||||
assert.equal(result.status, 4);
|
||||
assert.match(result.stderr, /no mosaic-managed credential/);
|
||||
assert.equal(readFileSync(join(root, 'docker.json'), 'utf8'), captured);
|
||||
assert.equal(readFileSync(join(root, 'container.json'), 'utf8'), captured);
|
||||
assert.equal(existsSync(join(root, '.pi')), false);
|
||||
} finally {
|
||||
rmSync(root, { recursive: true, force: true });
|
||||
|
||||
@@ -23,6 +23,9 @@ test('Rocko uses Sonnet, isolated resume IDs, current context and launch refusal
|
||||
// Seat registration (packages/seat): the fixture is its own data root.
|
||||
cpSync(join(source, 'scripts/mosaic'), join(root, 'scripts/mosaic'));
|
||||
cpSync(join(source, 'packages/seat/src'), join(root, 'packages/seat/src'), { recursive: true });
|
||||
mkdirSync(join(root, 'packages/organization/src'), { recursive: true });
|
||||
for (const file of ['util.mjs', 'errors.mjs', 'vocabulary.mjs'])
|
||||
cpSync(join(source, 'packages/organization/src', file), join(root, 'packages/organization/src', file));
|
||||
mkdirSync(join(root, '.git'));
|
||||
writeFileSync(join(root, 'config.json'), JSON.stringify({ configVersion: 1, dataRoot: root }));
|
||||
const registration = join(root, 'seats/repo/rocko/registration.json');
|
||||
|
||||
Reference in new issue
Block a user