c0d43379b8
Memind CI / Test, build, and release guards (push) Failing after 3m44s
Pin @deepseek-ai/dsh@0.1.1-rc.2 probing in check-dsh-executor-local.mjs, keep live headless smoke opt-in only, and record the 10k-token approval gate. Co-authored-by: Cursor <cursoragent@cursor.com>
115 lines
3.8 KiB
JavaScript
115 lines
3.8 KiB
JavaScript
#!/usr/bin/env node
|
|
/**
|
|
* Local DeepSeek Harness (dsh) smoke — dev machine only, no LLM by default.
|
|
*
|
|
* Always verifies the CLI. When MEMIND_TOOL_GATEWAY_DSH_ENABLED=1, also prints
|
|
* a dry-run launch plan (does not spawn dsh).
|
|
*
|
|
* Live headless smoke (costs LLM tokens) is opt-in only:
|
|
* MEMIND_DSH_RUN_LIVE_SMOKE=1 node scripts/check-dsh-executor-local.mjs
|
|
* Any run expected to exceed 10k tokens requires explicit user approval.
|
|
*/
|
|
import { spawnSync } from 'node:child_process';
|
|
import { buildDshExecutorLaunchPlan, dshExecutorEnabled, resolveDshCommand } from '../dsh-agent-launch.mjs';
|
|
|
|
const cliName = process.env.MEMIND_DSH_BIN ?? process.env.DSH_BIN ?? 'dsh';
|
|
const pinnedVersion = process.env.MEMIND_DSH_PINNED_VERSION ?? '0.1.1-rc.2';
|
|
|
|
function run(cmd, args, options = {}) {
|
|
return spawnSync(cmd, args, { encoding: 'utf8', ...options });
|
|
}
|
|
|
|
const versionResult = run(cliName, ['--version']);
|
|
const version = (versionResult.stdout ?? versionResult.stderr ?? '').trim();
|
|
if (versionResult.status !== 0 || !version) {
|
|
console.error('DSH_EXECUTOR_FAIL: CLI not found');
|
|
console.error(` install: npm install -g @deepseek-ai/dsh@${pinnedVersion}`);
|
|
process.exit(1);
|
|
}
|
|
|
|
const resolved = resolveDshCommand(process.env);
|
|
console.log('DSH_EXECUTOR_PROBE:');
|
|
console.log(` version=${version}`);
|
|
console.log(` command=${resolved.command}`);
|
|
console.log(` via_npx=${resolved.viaNpx}`);
|
|
|
|
if (version !== pinnedVersion) {
|
|
console.warn(`DSH_EXECUTOR_WARN: expected ${pinnedVersion}, got ${version}`);
|
|
}
|
|
|
|
const headlessHelp = run(resolved.command, resolved.viaNpx
|
|
? ['-y', '@deepseek-ai/dsh', '--profile', 'headless', '--help']
|
|
: ['--profile', 'headless', '--help']);
|
|
if (headlessHelp.status !== 0) {
|
|
console.error('DSH_EXECUTOR_FAIL: headless profile unavailable');
|
|
process.exit(1);
|
|
}
|
|
|
|
if (!dshExecutorEnabled(process.env)) {
|
|
console.log('DSH_EXECUTOR_SKIP: MEMIND_TOOL_GATEWAY_DSH_ENABLED is off (launch plan not checked)');
|
|
console.log('DSH_EXECUTOR_CLI_OK');
|
|
process.exit(0);
|
|
}
|
|
|
|
const plan = buildDshExecutorLaunchPlan({
|
|
cwd: process.cwd(),
|
|
instruction: process.env.MEMIND_DSH_SMOKE_TASK ?? 'List three files in the workspace root and stop.',
|
|
env: process.env,
|
|
runtimeEnv: {
|
|
DEEPSEEK_API_KEY: process.env.DEEPSEEK_API_KEY ?? process.env.OPENAI_API_KEY ?? '',
|
|
},
|
|
});
|
|
|
|
console.log('DSH_EXECUTOR_PLAN:');
|
|
console.log(JSON.stringify({
|
|
ok: plan.ok,
|
|
executor: plan.executor,
|
|
command: plan.command,
|
|
argsPreview: plan.args?.slice?.(0, 6),
|
|
cwd: plan.cwd,
|
|
message: plan.message ?? null,
|
|
}, null, 2));
|
|
|
|
if (!plan.ok) {
|
|
console.error('DSH_EXECUTOR_FAIL: launch plan unavailable');
|
|
process.exit(1);
|
|
}
|
|
|
|
if (process.env.MEMIND_DSH_RUN_LIVE_SMOKE !== '1') {
|
|
console.log('DSH_EXECUTOR_OK: dry-run plan ready (no LLM; set MEMIND_DSH_RUN_LIVE_SMOKE=1 to execute once)');
|
|
process.exit(0);
|
|
}
|
|
|
|
if (!process.env.DEEPSEEK_API_KEY && !process.env.OPENAI_API_KEY) {
|
|
console.error('DSH_EXECUTOR_FAIL: live smoke requires DEEPSEEK_API_KEY or OPENAI_API_KEY');
|
|
process.exit(1);
|
|
}
|
|
|
|
console.warn('DSH_EXECUTOR_LIVE: spawning one headless task (LLM tokens will be consumed)');
|
|
const live = spawnSync(plan.command, plan.args, {
|
|
cwd: plan.cwd,
|
|
env: { ...process.env, ...plan.env },
|
|
encoding: 'utf8',
|
|
maxBuffer: 1024 * 1024,
|
|
timeout: positiveTimeout(process.env.MEMIND_DSH_LIVE_TIMEOUT_MS, 120_000),
|
|
});
|
|
|
|
if (live.error) {
|
|
console.error(`DSH_EXECUTOR_FAIL: ${live.error.message}`);
|
|
process.exit(1);
|
|
}
|
|
if (live.status !== 0) {
|
|
console.error(`DSH_EXECUTOR_FAIL: exit ${live.status}`);
|
|
if (live.stderr) console.error(live.stderr.slice(0, 2000));
|
|
process.exit(1);
|
|
}
|
|
|
|
const preview = (live.stdout ?? '').trim().slice(0, 500);
|
|
console.log(`DSH_EXECUTOR_LIVE_OK: stdout_preview=${JSON.stringify(preview)}`);
|
|
|
|
function positiveTimeout(value, fallback) {
|
|
const n = Number(value);
|
|
if (!Number.isFinite(n) || n <= 0) return fallback;
|
|
return Math.floor(n);
|
|
}
|