Repository navigation
Built on Extension.js 4.1.33.
extension_wait {for: "rebuild"}no longer takes the compile write itself for a reconnected background. The engine stampscompiledAtandtswith two clock reads around a synchronous read, so whenever they crossed a millisecond boundary the ready.json write that recorded the compile already satisfied the reattach proof (runtime: "attached"withtspastcompiledAt), and the wait answeredreload.outcome: "reattached"atwaitedMs0, before any reload or when none would ever follow (a content-only edit), and on an engine that stampsreloadedAtit preempted the wait for that stamp 10.14.0 promised. The two engines now get the proof that fits each: on an engine that writesreloadedAt, the reattach answer is never given, the reload stamp alone settles the wait; on an older engine, which has only the write sequence to go by, the reconnect must be a later ready.json write whosetspasses thetsthe compile write itself carried, not merelycompiledAt, so that write can never be its own proof.reattached,still-detachedandnot-stampedkeep their meaning for the older engine.extension_evalwithuntilkeeps the whole call insidetimeoutMs. Each poll ran with the call's owntimeout(30000 by default) inside the engine's promise settle, anduntilchecked its budget only between polls, sountil: {timeoutMs: 50000}on a promise that never settles could run about 80 s, past the 60 s client request timeout the 50000 clamp exists for. Each poll's engine timeout is now the remaininguntilbudget, with a 300 ms floor and a caller's smallertimeoutstill honored, so the call ends withintimeoutMsplus oneintervalMs.extension_stop {browser}leaves a dev server whose command line names no--browseralone unless chrome, the engine's default, is the browser being stopped. A person's ownnpm run devbeside an MCP firefox session on the same project read as that session's process, was SIGKILLed byextension_stop {browser: "firefox"}and listed underreaped. A command line with no browser flag now counts as the engine default's, so a firefox or chromium stop keeps it running and a chrome stop ends it.extension_screenshotwrites its image only inside the project and only as a.png.pathis resolved againstprojectPathand refused withE_BAD_REQUEST(statusbad-request) when it lands outside it, by an absolute path or a../escape, or when it names a file that does not end in.png, sopath: "src/manifest.json"no longer overwrites the manifest with image bytes. A folder is named with a trailing slash (shots/) or by an existing directory and gets the timestamped default name; a name such asshotsthat is neither a.pngnor an existing folder is refused with a hint namingshots/, where it used to write a file literally calledshots. The check runs before the browser is asked for pixels, the default location is unchanged, and thepathdescription states the rules.