fix(plugins): the silent-degrade doors close — a broken accelerator install can never read as absent
The auto-detection "not installed" heuristic accepted any resolution failure whose message merely CONTAINED the package name, unterminated — so a missing platform-binary sibling package (what a deploy replacing node_modules mid-restart leaves behind) read as "the accelerator is not installed", and brainy silently served the default WASM engines with zero journal lines. A production restart storm paid 90 seconds of throttled WASM compile behind exactly that hole. The name must now terminate where it ends (quote, whitespace, punctuation, end) — a sibling package, an inner file path, or a dependency failure is a broken install and init() throws, as the guard's own law always stated. Second door: activate() returning false (the documented graceful decline) warned on console.warn, which `silent: true` patches away — an invisible degrade. The decline now narrates via the always-on channel. Also exports CanonicalCounts from the public surface (the coverage-ledger denominator type consumers read through getCanonicalCounts()). Pinned in tests/unit/plugin-activation-loudness.test.ts (five error shapes; the decline warn under silent: true).
This commit is contained in:
parent
18f172e098
commit
b9ba50fbec
4 changed files with 92 additions and 6 deletions
|
|
@ -17622,8 +17622,15 @@ export class Brainy<T = any> implements BrainyInterface<T> {
|
|||
private static isPackageNotInstalledError(error: unknown, pkg: string): boolean {
|
||||
const code = (error as { code?: string })?.code
|
||||
const message = error instanceof Error ? error.message : String(error)
|
||||
const namesPackage =
|
||||
message.includes(`'${pkg}'`) || message.includes(`"${pkg}"`) || message.includes(` ${pkg}`)
|
||||
// The package name must TERMINATE where it ends: an unanchored prefix match
|
||||
// read a missing platform-binary SIBLING package (e.g. "<pkg>-linux-x64-gnu",
|
||||
// exactly what a deploy replacing node_modules mid-restart leaves behind) as
|
||||
// "<pkg> is not installed" — and a present-but-broken accelerator silently
|
||||
// degraded to the default JS engines. A production storm was hunted for a
|
||||
// day because of that swallow. The name must be followed by a quote,
|
||||
// whitespace, punctuation, or end-of-message — never a longer name's tail.
|
||||
const escaped = pkg.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')
|
||||
const namesPackage = new RegExp("(^|['\"\\s])" + escaped + "(?=$|['\"\\s.,)])").test(message)
|
||||
const isResolutionFailure =
|
||||
code === 'ERR_MODULE_NOT_FOUND' ||
|
||||
code === 'MODULE_NOT_FOUND' ||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue