fix(ui): show synthesis as a 'Linking dynamic dispatch' phase; mute node:sqlite warning spam (#1299)

Two first-run UX bugs surfaced by indexing a real 1,342-file C repo:

1. After 'Resolving refs' hit 100%, the ~40 dynamic-dispatch synthesis
   passes ran with no progress surface, so the bar sat frozen at 100%
   long enough to read as a hang (the C fn-pointer pass alone can hold
   for a while on C-heavy repos). Synthesis now reports per-pass
   progress through a new 'linking' IndexProgress phase, rendered as
   'Linking dynamic dispatch'. The step total is pinned by a test to
   the synthesizer's actual __mark() count so adding a pass without
   bumping it fails loudly.

2. node:sqlite's ExperimentalWarning is emitted once per THREAD, so the
   main process plus every parse worker printed it mid-index,
   interleaved with the progress UI. All launch paths now pass
   --disable-warning=ExperimentalWarning: both bundle launchers, the
   Windows npm-shim invocation, and the CLI self-relaunch
   (NODE_RUNTIME_FLAGS, deliberately excluded from the re-exec gate so
   an older installed launcher never triggers a pointless re-exec, and
   version-gated off nodes older than the flag).

Verified end-to-end on the same repo: zero warnings, live linking bar,
byte-identical graph (50,520 nodes / 148,232 edges). Full suite green.

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Colby Mchenry
2026-07-15 19:44:09 -05:00
committed by GitHub
co-authored by Claude Fable 5
parent 243ef1d3e2
commit ad5300a601
11 changed files with 239 additions and 35 deletions
+46 -3
View File
@@ -16,6 +16,8 @@ import * as os from 'os';
import * as path from 'path';
import {
WASM_RUNTIME_FLAGS,
NODE_RUNTIME_FLAGS,
nodeRuntimeFlagsFor,
processHasWasmRuntimeFlags,
buildRelaunchArgv,
} from '../src/extraction/wasm-runtime-flags';
@@ -42,6 +44,36 @@ describe('WASM_RUNTIME_FLAGS', () => {
});
});
describe('NODE_RUNTIME_FLAGS', () => {
it('suppresses the node:sqlite ExperimentalWarning on this runtime', () => {
// The warning is emitted once per THREAD (main + every parse worker), so
// during indexing it repeatedly interleaves with the progress UI. Prove
// the flag both launches node and actually silences the warning.
expect(NODE_RUNTIME_FLAGS).toContain('--disable-warning=ExperimentalWarning');
const res = spawnSync(
process.execPath,
[...NODE_RUNTIME_FLAGS, '-e', "require('node:sqlite'); process.exit(0)"],
{ encoding: 'utf8' }
);
expect(res.status, res.stderr).toBe(0);
expect(res.stderr).not.toMatch(/ExperimentalWarning/);
});
it('is empty on nodes too old for --disable-warning (fatal "bad option" there)', () => {
expect(nodeRuntimeFlagsFor('20.10.0')).toEqual([]);
expect(nodeRuntimeFlagsFor('21.2.0')).toEqual([]);
expect(nodeRuntimeFlagsFor('20.11.0')).toContain('--disable-warning=ExperimentalWarning');
expect(nodeRuntimeFlagsFor('21.3.0')).toContain('--disable-warning=ExperimentalWarning');
expect(nodeRuntimeFlagsFor('22.5.0')).toContain('--disable-warning=ExperimentalWarning');
});
it('is NOT required by the re-exec gate (old-launcher compat)', () => {
// An installed bundle launcher that passes only the WASM flags must not
// trigger a pointless re-exec over a cosmetic warning flag.
expect(processHasWasmRuntimeFlags(['--liftoff-only'])).toBe(true);
});
});
describe('processHasWasmRuntimeFlags', () => {
it('is true only when every required flag is present', () => {
expect(processHasWasmRuntimeFlags(['--liftoff-only'])).toBe(true);
@@ -55,8 +87,9 @@ describe('processHasWasmRuntimeFlags', () => {
});
describe('buildRelaunchArgv', () => {
it('places the wasm flags first, then the script and its args', () => {
it('places our flags first, then the script and its args', () => {
expect(buildRelaunchArgv('/x/codegraph.js', ['index', '/repo'], [])).toEqual([
...NODE_RUNTIME_FLAGS,
'--liftoff-only',
'/x/codegraph.js',
'index',
@@ -66,8 +99,18 @@ describe('buildRelaunchArgv', () => {
it('preserves other existing node flags without duplicating ours', () => {
expect(
buildRelaunchArgv('/x/codegraph.js', ['status'], ['--liftoff-only', '--enable-source-maps'])
).toEqual(['--liftoff-only', '--enable-source-maps', '/x/codegraph.js', 'status']);
buildRelaunchArgv('/x/codegraph.js', ['status'], [
'--liftoff-only',
...NODE_RUNTIME_FLAGS,
'--enable-source-maps',
])
).toEqual([
...NODE_RUNTIME_FLAGS,
'--liftoff-only',
'--enable-source-maps',
'/x/codegraph.js',
'status',
]);
});
it('produces an argv that actually launches node WITH the flag applied', () => {