| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
docs: the README animation is built from photos in the tree, with new characters The six hero GIFs were rendered from pages that lived only in a scratch folder, so changing one character meant editing frames. docs/hero/ now holds every piece, in three layers, each made from the one before: photos/ characters.png as an image model draws it, on white; cut_out.py turns it into one cut-out per theme (shadows kept on light, removed on dark, and only the white connected to the edge touched, so the eyes stay) html/ wide, mobile and small pages that compose the photos; renderLoop(t) draws the frame at second t, and opened in a browser each page plays its own loop build.mjs photos -> frames (Chromium, 12 a second) -> docs/images/hero-*.gif, with the same palette and dither as before A fourth page, html/social.html, builds docs/images/social-preview.png, the repository's social preview, from the same photos. The characters are new: the same four, colours inverted, each with a role it can carry (a hard hat, sunglasses, a beret, a magnifying glass), all still angry. The scenes, their words and their timing are unchanged. | 16 天前 | |
docs: the README animation is built from photos in the tree, with new characters The six hero GIFs were rendered from pages that lived only in a scratch folder, so changing one character meant editing frames. docs/hero/ now holds every piece, in three layers, each made from the one before: photos/ characters.png as an image model draws it, on white; cut_out.py turns it into one cut-out per theme (shadows kept on light, removed on dark, and only the white connected to the edge touched, so the eyes stay) html/ wide, mobile and small pages that compose the photos; renderLoop(t) draws the frame at second t, and opened in a browser each page plays its own loop build.mjs photos -> frames (Chromium, 12 a second) -> docs/images/hero-*.gif, with the same palette and dither as before A fourth page, html/social.html, builds docs/images/social-preview.png, the repository's social preview, from the same photos. The characters are new: the same four, colours inverted, each with a role it can carry (a hard hat, sunglasses, a beret, a magnifying glass), all still angry. The scenes, their words and their timing are unchanged. | 16 天前 | |
browser: never pinned; the image takes the newest release and the engine reads the server it finds A Dot keeps the golden image it was made from and boots every new runtime disk, so the engine already talked to servers other than the one its pinned copy of the interface described. The engine now reads the interface from the installed server when it starts (nanobot/dots/server_interface.py, server_capture.py run as dot by the server's own python): the page tools are what that server serves, a page tool it does not serve is not offered (GET /tools says so), and a Dot whose server cannot be read offers no page tool and its launches say why. With nothing in the engine tied to a version, the image no longer pins one: each build asks PyPI for the newest invisible-playwright-mcp, the newest invisible-playwright it accepts and the invisible-core that one pins (browser-release.ts). The three enter the inputs digest, pins.env and the manifest, which records what was installed. mcp-requirements.lock and capture-mcp-interface.py go; the copy of the interface becomes a test fixture. The owner's no-other-browser rule is checked at build on what was actually installed (builder/other-browsers.txt), and the golden image workflow runs every six hours so a new release is published as a prebuilt image. | 13 天前 | |
browser: never pinned; the image takes the newest release and the engine reads the server it finds A Dot keeps the golden image it was made from and boots every new runtime disk, so the engine already talked to servers other than the one its pinned copy of the interface described. The engine now reads the interface from the installed server when it starts (nanobot/dots/server_interface.py, server_capture.py run as dot by the server's own python): the page tools are what that server serves, a page tool it does not serve is not offered (GET /tools says so), and a Dot whose server cannot be read offers no page tool and its launches say why. With nothing in the engine tied to a version, the image no longer pins one: each build asks PyPI for the newest invisible-playwright-mcp, the newest invisible-playwright it accepts and the invisible-core that one pins (browser-release.ts). The three enter the inputs digest, pins.env and the manifest, which records what was installed. mcp-requirements.lock and capture-mcp-interface.py go; the copy of the interface becomes a test fixture. The owner's no-other-browser rule is checked at build on what was actually installed (builder/other-browsers.txt), and the golden image workflow runs every six hours so a new release is published as a prebuilt image. | 13 天前 | |
Merge branch 'clients-fixes' into fixes-batch | 16 天前 |