fix(ui): external adapter selection, config field placement, and transcript parser freshness

- Fix external adapters (hermes, droid) not auto-selected when
  navigating with ?adapterType= param — was using a stale
  module-level Set built before async adapter registration
- Move SchemaConfigFields to render after thinking effort (same
  visual area as Claude's chrome toggle) instead of bottom of
  config section
- Extract SelectField into its own component to fix React hooks
  order violation when schema fields change between renders
- Add onAdapterChange() subscription in registry.ts so
  registerUIAdapter() notifies components when dynamic parsers
  load, fixing stale parser for old runs
- Add parserTick to both RunTranscriptView and
  useLiveRunTranscripts to force recomputation on parser change
This commit is contained in:
HenkDz 2026-04-01 21:56:19 +01:00
parent 69a1593ff8
commit 47f3cdc1bb
13 changed files with 473 additions and 55 deletions

View file

@ -212,8 +212,23 @@ export async function reloadExternalAdapter(
const packageDir = resolvePackageDir(record);
const entryPoint = resolvePackageEntryPoint(packageDir);
const modulePath = path.resolve(packageDir, entryPoint);
const fileUrl = `file://${modulePath}`;
const cacheBustUrl = `file://${modulePath}?t=${Date.now()}`;
// Bust ESM module cache so re-import loads fresh code from disk.
// Query-string trick (?t=...) works in Node; Bun may need the file:// URL
// to be evicted from its internal registry first.
try {
// @ts-expect-error -- Bun internal module cache
const bunCache = globalThis.Bun?.__moduleCache as Map<string, unknown> | undefined;
if (bunCache) {
bunCache.delete(fileUrl);
bunCache.delete(modulePath);
}
} catch {
// Ignore — query-string fallback still works in Node
}
const cacheBustUrl = `${fileUrl}?t=${Date.now()}`;
logger.info(
{ type, packageName: record.packageName, modulePath, cacheBustUrl },