feat: expand live chat and work server tools
This commit is contained in:
@@ -1,8 +1,10 @@
|
||||
import test from 'node:test';
|
||||
import assert from 'node:assert/strict';
|
||||
import fs from 'node:fs';
|
||||
import os from 'node:os';
|
||||
import path from 'node:path';
|
||||
import { EventEmitter } from 'node:events';
|
||||
import { writeFile } from 'node:fs/promises';
|
||||
import { mkdtemp, mkdir, rm, writeFile } from 'node:fs/promises';
|
||||
import { env } from '../config/env.js';
|
||||
import {
|
||||
buildHealthCheckUrls,
|
||||
@@ -88,6 +90,7 @@ test('test, release and prod restart scripts fall back to Docker socket when doc
|
||||
workServerScript,
|
||||
/docker compose -f etc\/servers\/work-server\/docker-compose\.yml up -d --build --force-recreate --no-deps work-server/,
|
||||
);
|
||||
assert.doesNotMatch(workServerScript, /kill -HUP 1/);
|
||||
assert.match(socketRestartScript, /\/containers\/\$\{encodeURIComponent\(containerName\)\}\/restart\?t=30/);
|
||||
});
|
||||
|
||||
@@ -271,3 +274,65 @@ test('listServerCommands marks command-runner online when localhost fallback res
|
||||
assert.equal(runnerCommand.httpStatus, 200);
|
||||
assert.match(String(runnerCommand.errorMessage ?? ''), /fallback health check succeeded via http:\/\/127\.0\.0\.1:3211\/health/);
|
||||
});
|
||||
|
||||
test('listServerCommands ignores public codex chat resources when checking app source updates', async () => {
|
||||
const tempRoot = await mkdtemp(path.join(os.tmpdir(), 'ai-code-app-source-scan-'));
|
||||
const originalMainRoot = env.SERVER_COMMAND_MAIN_PROJECT_ROOT;
|
||||
const originalProjectRoot = env.SERVER_COMMAND_PROJECT_ROOT;
|
||||
const buildTargetPath = '/tmp/ai-code-test-app-dist/index.html';
|
||||
const previousBuildContents = fs.existsSync(buildTargetPath) ? await fs.promises.readFile(buildTargetPath) : null;
|
||||
const previousBuildStat = fs.existsSync(buildTargetPath) ? await fs.promises.stat(buildTargetPath) : null;
|
||||
|
||||
try {
|
||||
const staleDate = new Date('2026-04-19T00:00:00.000Z');
|
||||
await mkdir(path.join(tempRoot, 'src'), { recursive: true });
|
||||
await mkdir(path.join(tempRoot, 'public', '.codex_chat', 'session', 'resource'), { recursive: true });
|
||||
await writeFile(path.join(tempRoot, 'src', 'main.tsx'), 'export const app = true;\n', 'utf8');
|
||||
await writeFile(path.join(tempRoot, 'index.html'), '<!doctype html>\n', 'utf8');
|
||||
await writeFile(path.join(tempRoot, 'package.json'), '{"name":"tmp"}\n', 'utf8');
|
||||
await writeFile(path.join(tempRoot, 'tsconfig.json'), '{}\n', 'utf8');
|
||||
await writeFile(path.join(tempRoot, 'tsconfig.app.json'), '{}\n', 'utf8');
|
||||
await writeFile(path.join(tempRoot, 'vite.config.ts'), 'export default {};\n', 'utf8');
|
||||
await writeFile(path.join(tempRoot, 'public', '.codex_chat', 'session', 'resource', 'note.txt'), 'resource only\n', 'utf8');
|
||||
await Promise.all([
|
||||
fs.promises.utimes(path.join(tempRoot, 'src', 'main.tsx'), staleDate, staleDate),
|
||||
fs.promises.utimes(path.join(tempRoot, 'index.html'), staleDate, staleDate),
|
||||
fs.promises.utimes(path.join(tempRoot, 'package.json'), staleDate, staleDate),
|
||||
fs.promises.utimes(path.join(tempRoot, 'tsconfig.json'), staleDate, staleDate),
|
||||
fs.promises.utimes(path.join(tempRoot, 'tsconfig.app.json'), staleDate, staleDate),
|
||||
fs.promises.utimes(path.join(tempRoot, 'vite.config.ts'), staleDate, staleDate),
|
||||
]);
|
||||
|
||||
await mkdir(path.dirname(buildTargetPath), { recursive: true });
|
||||
await writeFile(buildTargetPath, '<!doctype html>\n', 'utf8');
|
||||
const buildDate = new Date('2026-04-20T00:00:00.000Z');
|
||||
await fs.promises.utimes(buildTargetPath, buildDate, buildDate);
|
||||
|
||||
const resourceDate = new Date('2026-04-28T00:00:00.000Z');
|
||||
await fs.promises.utimes(path.join(tempRoot, 'public', '.codex_chat', 'session', 'resource', 'note.txt'), resourceDate, resourceDate);
|
||||
|
||||
env.SERVER_COMMAND_MAIN_PROJECT_ROOT = tempRoot;
|
||||
env.SERVER_COMMAND_PROJECT_ROOT = tempRoot;
|
||||
|
||||
const commands = await listServerCommands();
|
||||
const testCommand = commands.find((item) => item.key === 'test');
|
||||
|
||||
assert.ok(testCommand);
|
||||
assert.equal(testCommand.buildRequired, false);
|
||||
assert.notEqual(testCommand.latestSourceChangePath, 'public/.codex_chat/session/resource/note.txt');
|
||||
} finally {
|
||||
env.SERVER_COMMAND_MAIN_PROJECT_ROOT = originalMainRoot;
|
||||
env.SERVER_COMMAND_PROJECT_ROOT = originalProjectRoot;
|
||||
|
||||
if (previousBuildContents) {
|
||||
await writeFile(buildTargetPath, previousBuildContents, 'utf8');
|
||||
if (previousBuildStat) {
|
||||
await fs.promises.utimes(buildTargetPath, previousBuildStat.atime, previousBuildStat.mtime);
|
||||
}
|
||||
} else {
|
||||
await rm(buildTargetPath, { force: true });
|
||||
}
|
||||
|
||||
await rm(tempRoot, { recursive: true, force: true });
|
||||
}
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user