| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
Ten task-shaped pages, and the Home page grows with them (#1226) Seven guides for putting the agent to work - prices across sites, a lead list, moving rows between two web apps, running unattended, running on a local model, whether to hand it your accounts, and how to write a task it can actually follow - plus three comparisons the wiki was missing: RPA, the no-code platforms, and Vercel's agent-browser. Every external fact was read from the source on 5 September 2026 and the Sources sections say which page and when. Two claims about our own software were checked against the code rather than remembered: the twenty-five turn cap and the OpenRouter key requirement. The comparison pages declare the conflict of interest and none of them puts this project first. | 4 天前 | |
No turn ceiling, and a stop button that is always there (0.13.0) (#1258) The loop stopped itself at twenty-five turns and raised "task did not finish within max_turns=25". What that did in practice was end long tasks that were going fine, one step before they might have answered, with the transcript at its largest and every one of those steps already paid for. A number cannot tell a loop that is stuck from a task that is simply long. The ceiling is gone, not raised: there is no max_turns parameter left to set. What ends a run now is the person watching it, so the two things that made that unreliable are fixed in the same change. The stop control is its own button instead of a mode of the send button. As a mode its condition was `busyNow && !typed`, so it disappeared the moment somebody typed while the agent worked, and the composer is exactly where a person's hands are. It now follows the run and nothing else, and queueing a follow-up still works alongside it. The model request runs in a thread. It is a synchronous HTTP call and it sat on the event loop: measured at zero scheduler slices during a 300 ms call, which means /chat/stop could not be served, no event reached the page and the live pane did not repaint for as long as the model was thinking - which is exactly when somebody reaches for stop. It is now a cancellation point too, so a stop lands promptly rather than after the step in flight. It does not unsend a request already made: that reply is still paid for and then dropped. Four tests pinned the ceiling and are replaced by three that pin its absence, including a structural one that reads the AST rather than the source text, so a comment quoting the old error message does not read as a reintroduction while `max_turns: int = 1000` still would. The seven wiki pages that described the cap now describe what actually bounds a run, and say plainly that a stop only works while somebody is looking. Unrelated but caught by it: the CLI tests scrubbed provider variables and never considered the `.env` file the README tells people to write, so two of them failed on any machine that had one and passed in CI, which has none. The fixture now runs them from an empty directory. | 1 天前 | |
The MCP server moves in: aihawk.mcp, one package, one release (0.10.0) (#1253) * Squashed 'incoming-mcp/' content from commit f0cb73e git-subtree-dir: incoming-mcp git-subtree-split: f0cb73eef0241e4fe755447491d8839089faec8e * The MCP server moves in: aihawk.mcp, one package, one release (0.10.0) The server lived in its own repository, invisible-playwright-mcp, with four stars against thirty thousand here, and every change to it landed twice: a floor to raise here, a verb table to keep in step, a README that was already a pointer at this one. It now ships inside this package as the module aihawk.mcp, started by the invisible-playwright-mcp command or by python -m aihawk.mcp, which is what the interface spawns. The module is renamed on purpose: a wheel of aihawk owning the old module's files would have them deleted by pip when the old package is uninstalled during an upgrade. The PyPI name invisible-playwright-mcp lives on as a shim, a compatibility module and the same console script over aihawk, so every client registered with uvx invisible-playwright-mcp keeps working; the shim is published from the old repository right after this release, and that repository is then archived, never deleted. What moved: the ten modules under src/aihawk/mcp, twenty-six test files under tests/mcp_server (the two that guarded the standalone package's own version and release pages are gone, aihawk's cover the wheel), the server's README as the wiki page mcp-server and its tool-design notes as mcp-tool-design, with the nineteen wiki links that pointed at the old repository retargeted. The dependency on the server becomes the server's own dependencies (mcp capped below 2, invisible-playwright with its floor, selectolax). The publish gate checks the engine floor instead of the server floor, the wheel checks prove the module and the second console script, and a new e2e job runs the server's browser tests on one platform the way its own CI did. aihawk's __version__ was a stale literal and now reads the installed distribution. Measured before this commit, with the built wheels: default suite 333 passed, the e2e subset 21 passed against a cached engine, the clean-venv install answers on both commands, pip upgrade paths from 0.15.2 and from aihawk 0.9.2 end with the old import reaching aihawk.mcp, and uvx with an empty cache resolves the shim to this wheel and drives a page. | 2 天前 | |
A wiki, and the twenty pages the search data said to write first AIHawk gets the same reading-room the engine's repo already has: a docs/ tree rendered into the GitHub wiki by the same converter and workflow, copied from invisible_playwright where both have been running for weeks. The twenty pages are not a guess. 53 live SERPs were read before choosing them: the Operator-alternatives cluster is owned today by domains smaller than this repo, the open-source-agent queries already rank GitHub results in the top four, the agent-gets-blocked questions return nothing but forum threads, and this repo already sits at position 4-6 on four job-bot queries that a supporting page can push higher. Every comparison page carries the disclosure at the top - AIHawk is a project in the space it compares - and every claim about another tool traces to that tool's own site or source, fetched while writing. Four pages arrive from the engine wiki's AI-agents section, adapted, not copied: the timing signal, retry loops, computer-use detection and browser-use's config surface belong with the agent product, in agent language, and their originals become pointers. The mechanism layer stays where it was - pages here link into the invisible_playwright wiki for fingerprints, vendors and network truth instead of restating it. No job board, retailer or booking site is named anywhere, per the same rule the articles/ folder already declares. | 6 天前 | |
uv is the way in, because it is the one that works for every reader (#1247) Owner decision, 2026-09-06, after measuring the alternatives and reading what comparable projects do. pip install aihawk is refused outside a virtual environment on current Ubuntu and Debian, and on Windows a Store Python or an install without Add to PATH leaves the commands unreachable; browser-use, aider and the official MCP servers all lead with uv for the same reason. Both blocks now install uv once, one line per system, then run everything through uvx, which brings its own Python and never depends on the PATH the client happens to have. The wiki goes back to the uv form it had yesterday: the four client guides and the sixteen pages that name the commands. | 3 天前 | |
uv is the way in, because it is the one that works for every reader (#1247) Owner decision, 2026-09-06, after measuring the alternatives and reading what comparable projects do. pip install aihawk is refused outside a virtual environment on current Ubuntu and Debian, and on Windows a Store Python or an install without Add to PATH leaves the commands unreachable; browser-use, aider and the official MCP servers all lead with uv for the same reason. Both blocks now install uv once, one line per system, then run everything through uvx, which brings its own Python and never depends on the PATH the client happens to have. The wiki goes back to the uv form it had yesterday: the four client guides and the sixteen pages that name the commands. | 3 天前 | |
uv is the way in, because it is the one that works for every reader (#1247) Owner decision, 2026-09-06, after measuring the alternatives and reading what comparable projects do. pip install aihawk is refused outside a virtual environment on current Ubuntu and Debian, and on Windows a Store Python or an install without Add to PATH leaves the commands unreachable; browser-use, aider and the official MCP servers all lead with uv for the same reason. Both blocks now install uv once, one line per system, then run everything through uvx, which brings its own Python and never depends on the PATH the client happens to have. The wiki goes back to the uv form it had yesterday: the four client guides and the sixteen pages that name the commands. | 3 天前 | |
The scheduled flows move to the library, and every published block was executed first | 5 天前 | |
uv is the way in, because it is the one that works for every reader (#1247) Owner decision, 2026-09-06, after measuring the alternatives and reading what comparable projects do. pip install aihawk is refused outside a virtual environment on current Ubuntu and Debian, and on Windows a Store Python or an install without Add to PATH leaves the commands unreachable; browser-use, aider and the official MCP servers all lead with uv for the same reason. Both blocks now install uv once, one line per system, then run everything through uvx, which brings its own Python and never depends on the PATH the client happens to have. The wiki goes back to the uv form it had yesterday: the four client guides and the sixteen pages that name the commands. | 3 天前 | |
No turn ceiling, and a stop button that is always there (0.13.0) (#1258) The loop stopped itself at twenty-five turns and raised "task did not finish within max_turns=25". What that did in practice was end long tasks that were going fine, one step before they might have answered, with the transcript at its largest and every one of those steps already paid for. A number cannot tell a loop that is stuck from a task that is simply long. The ceiling is gone, not raised: there is no max_turns parameter left to set. What ends a run now is the person watching it, so the two things that made that unreliable are fixed in the same change. The stop control is its own button instead of a mode of the send button. As a mode its condition was `busyNow && !typed`, so it disappeared the moment somebody typed while the agent worked, and the composer is exactly where a person's hands are. It now follows the run and nothing else, and queueing a follow-up still works alongside it. The model request runs in a thread. It is a synchronous HTTP call and it sat on the event loop: measured at zero scheduler slices during a 300 ms call, which means /chat/stop could not be served, no event reached the page and the live pane did not repaint for as long as the model was thinking - which is exactly when somebody reaches for stop. It is now a cancellation point too, so a stop lands promptly rather than after the step in flight. It does not unsend a request already made: that reply is still paid for and then dropped. Four tests pinned the ceiling and are replaced by three that pin its absence, including a structural one that reads the AST rather than the source text, so a comment quoting the old error message does not read as a reintroduction while `max_turns: int = 1000` still would. The seven wiki pages that described the cap now describe what actually bounds a run, and say plainly that a stop only works while somebody is looking. Unrelated but caught by it: the CLI tests scrubbed provider variables and never considered the `.env` file the README tells people to write, so two of them failed on any machine that had one and passed in CI, which has none. The fixture now runs them from an empty directory. | 1 天前 | |
uv is the way in, because it is the one that works for every reader (#1247) Owner decision, 2026-09-06, after measuring the alternatives and reading what comparable projects do. pip install aihawk is refused outside a virtual environment on current Ubuntu and Debian, and on Windows a Store Python or an install without Add to PATH leaves the commands unreachable; browser-use, aider and the official MCP servers all lead with uv for the same reason. Both blocks now install uv once, one line per system, then run everything through uvx, which brings its own Python and never depends on the PATH the client happens to have. The wiki goes back to the uv form it had yesterday: the four client guides and the sixteen pages that name the commands. | 3 天前 | |
Fix stale invisible-playwright-mcp references left over from the aihawk merge (#1255) Seven leftovers found after the server moved into this package (0.10.0/0.11.0): - A command wrapped across a line break in docs/claude-computer-use-detected-as-bot.md escaped yesterday's blanket replace (it matched "uvx invisible-playwright-mcp" on one line, not the wrapped form), so it still told Claude Code to add the old package. - Three pages (ai-browser-agent-local-llm.md, ai-browser-agent-open-source.md, running-aihawk-with-cline.md) still named invisible-playwright-mcp as the package or command, inconsistent with the rest of the docs, which say aihawk. - A dead anchor, repeated in both articles, pointed at a README heading that no longer has that wording ("you already use an assistant that can run tools" was reworded to "From your assistant, over MCP" days ago). - One article's "Reproducing it" section gave the old command as a live instruction (its "Recorded against" table nearby is correctly historical and untouched). - test_shim_contract.py's docstring described the old two-script contract while the tests below it already checked the new one-command contract. Historical references left alone: the dated version tables, the aihawk-do removal notes, and the shim note in docs/mcp-server.md (correctly dated "before 0.11.0"). | 2 天前 | |
Fix stale invisible-playwright-mcp references left over from the aihawk merge (#1255) Seven leftovers found after the server moved into this package (0.10.0/0.11.0): - A command wrapped across a line break in docs/claude-computer-use-detected-as-bot.md escaped yesterday's blanket replace (it matched "uvx invisible-playwright-mcp" on one line, not the wrapped form), so it still told Claude Code to add the old package. - Three pages (ai-browser-agent-local-llm.md, ai-browser-agent-open-source.md, running-aihawk-with-cline.md) still named invisible-playwright-mcp as the package or command, inconsistent with the rest of the docs, which say aihawk. - A dead anchor, repeated in both articles, pointed at a README heading that no longer has that wording ("you already use an assistant that can run tools" was reworded to "From your assistant, over MCP" days ago). - One article's "Reproducing it" section gave the old command as a live instruction (its "Recorded against" table nearby is correctly historical and untouched). - test_shim_contract.py's docstring described the old two-script contract while the tests below it already checked the new one-command contract. Historical references left alone: the dated version tables, the aihawk-do removal notes, and the shim note in docs/mcp-server.md (correctly dated "before 0.11.0"). | 2 天前 | |
One command: aihawk is the server, aihawk ui the interface (0.11.0) (#1254) No command spells aihawk.mcp or invisible-playwright-mcp any more. `aihawk` with no subcommand is the MCP server over stdio: `uvx aihawk` is what a client registers, `python -m aihawk` is what the interface spawns, and a person at a terminal gets one line on stderr saying what is waiting. `aihawk ui` is the interface as before. The second console script this package carried since 0.10.0 is gone, and so is python -m aihawk.mcp; the PyPI name invisible-playwright-mcp stays a shim over aihawk, so a client that registered it before today keeps working unchanged. The README, the wiki page of the server and every config block say `uvx aihawk`. The content gate reads `aihawk` as the command, as a whole word, so `uvx aihawk` and `uvx aihawk ui` are both checked against the README's launcher, and its CLI-surface regex no longer crosses a line break, which `uvx aihawk` at the end of a line would otherwise have tripped. The README test measures the MCP way by the registration command a reader copies, since the server's own name now also starts the interface's. Measured with the built wheel: the default suite green, the 29 e2e tests green against a cached engine (the ones that spawn the server now spawn python -m aihawk), the clean-venv install carries one script, and python -m aihawk and uvx aihawk both answer the MCP handshake, list 18 tools and open a page, while uvx aihawk ui --help is the interface. | 2 天前 | |
Ten task-shaped pages, and the Home page grows with them (#1226) Seven guides for putting the agent to work - prices across sites, a lead list, moving rows between two web apps, running unattended, running on a local model, whether to hand it your accounts, and how to write a task it can actually follow - plus three comparisons the wiki was missing: RPA, the no-code platforms, and Vercel's agent-browser. Every external fact was read from the source on 5 September 2026 and the Sources sections say which page and when. Two claims about our own software were checked against the code rather than remembered: the twenty-five turn cap and the OpenRouter key requirement. The comparison pages declare the conflict of interest and none of them puts this project first. | 4 天前 | |
Identify the app to OpenRouter, and default to GLM 5.3 Flash (0.12.0) (#1257) Two changes to what leaves the process for the model. OpenRouter groups its public rankings by HTTP-Referer and X-Title, and this package sent neither, so every request was anonymous traffic on the key. They go on the client rather than the call site: one place, and every request carries them whatever calls it. Nothing fails when they are missing - no error, no changed answer, the app simply is not there - so the tests assert them on the wire against a local stub server rather than on a client attribute, which is also how the key is asserted a few tests above. The default model moves from z-ai/glm-4.6 to z-ai/glm-5.3-flash: input is $0.071-$0.388 per million against $0.43-$0.60, output $0.237-$1.358 against $1.75-$2.20, and the context window is 1,310,720 tokens against 204,800. Anyone who set --model or AIHAWK_MODEL is unaffected. The wiki carried the old default in four pages, three of them with cost arithmetic resting on its prices; all four are updated with figures retrieved today, and the section arguing that a cheaper model which retries is not cheaper now says plainly that the caveat applies to the new default too, since there is no measurement here of how it holds up over twenty turns of tool calls. One test pinned the default as a literal copy and now reads the constant, which is the drift the test beside it warns about. | 1 天前 | |
Ten pages from the verified backlog, written under the new rules The queue that survived the topic ban, shipped with every fact fetched the same day: what replaced Project Mariner (shut down 4 May 2026, folded into Gemini Agent and Chrome auto-browse - the same playbook that worked for the Operator page), the Manus landscape with its Meta-divestiture whiplash told from primary coverage, the Gemini-vs-Claude computer-use referee with both vendors' current toolset names read from their own docs, the honest self-review that owns the brand queries a fork and a mirror currently hold, and the AI-browser-versus-agent distinction page nobody had written. The task half: website data into Google Sheets (honest about when a formula beats an agent, and that the agent writes CSV to stdout rather than pretending a Sheets integration exists), invoice downloads (honest that the tool list has no download tool - the page teaches the escort pattern instead of inventing one), web research (conceding open-web breadth to the search-API tools by their own numbers), testing your own site, and the Cline walkthrough completing the client set. Zero job-application content anywhere, per the owner's ban - down to rewording incidental uses of the bare word. | 5 天前 | |
Identify the app to OpenRouter, and default to GLM 5.3 Flash (0.12.0) (#1257) Two changes to what leaves the process for the model. OpenRouter groups its public rankings by HTTP-Referer and X-Title, and this package sent neither, so every request was anonymous traffic on the key. They go on the client rather than the call site: one place, and every request carries them whatever calls it. Nothing fails when they are missing - no error, no changed answer, the app simply is not there - so the tests assert them on the wire against a local stub server rather than on a client attribute, which is also how the key is asserted a few tests above. The default model moves from z-ai/glm-4.6 to z-ai/glm-5.3-flash: input is $0.071-$0.388 per million against $0.43-$0.60, output $0.237-$1.358 against $1.75-$2.20, and the context window is 1,310,720 tokens against 204,800. Anyone who set --model or AIHAWK_MODEL is unaffected. The wiki carried the old default in four pages, three of them with cost arithmetic resting on its prices; all four are updated with figures retrieved today, and the section arguing that a cheaper model which retries is not cheaper now says plainly that the caveat applies to the new default too, since there is no measurement here of how it holds up over twenty turns of tool calls. One test pinned the default as a literal copy and now reads the constant, which is the drift the test beside it warns about. | 1 天前 | |
The review says which versions it read, not what PyPI serves today (#1274) The paragraph said the package "is on PyPI at version 0.3.0". That was true when the review was written on 3 September; the index now serves 0.19.0, so a reader today sees a number sixteen releases behind and reasonably concludes the project has stalled - the opposite of what the repository shows. The sources list already had the right shape for this: it dates its reading ("metadata checked against the index 2026-09-04") and so it cannot go stale. This paragraph now does the same, and points at the PyPI page for the current answer instead of trying to be it. The versions stay in the text. A review of something that ships several times a week has to say which build it looked at, or its claims cannot be checked at all. | 1 天前 | |
The two flagged pages, each written inside its own fence LinkedIn posting gets the page the owner shaped: broad on purpose, with zero operational instructions anywhere in it. It quotes the User Agreement's own clauses, names the sanctioned routes at category level (native scheduling, the two-tier API access model read off Microsoft's own docs), states the restriction risk from LinkedIn's help pages, and carries its spine in one paragraph: this wiki does not teach what the terms prohibit, and says so instead of pretending the demand does not exist. Appointment bots get the one honest page in a scam-adjacent SERP: the legitimate slice leads (watching availability for yourself, a human doing the booking), the paid-slot ecosystem is called what it is with a real embassy warning quoted from the source, and the volume section rests on a government booking system's own words about blocking attempts too rapid for a human operator. No faster-appointment claim anywhere, no booking instructions, no per-country guidance, and the fairness line stands: a public queue hammered degrades for everyone. | 5 天前 | |
Give the two pages with no in-body links out a way onward (#1273) The link graph counted 61 pages in this wiki with two carrying no contextual outgoing links at all, every internal link sitting in the See also footer, which the graph excludes because boilerplate is not equity. Both happened to be the pages where the honest answer is a boundary rather than a walkthrough, so they had the fewest natural places to send a reader onward. Nothing operational is added and no step is taught. The LinkedIn page now names the three sibling platform pages in the sentence that already says LinkedIn is deliberately absent from that series, points the detection half at the page that owns it, and connects the cost of losing a professional account to the question of logging an agent in at all. The Instagram page points its checkable limit at how the tool set is shaped, its read-before-submit rule at the forms page that states the same rule, and its account-risk paragraph at the same accounts page. Two anchors were rewritten after reading the target: one asserted the tool-design page argues something about a short list of verbs, and one put words in the forms page about fields an agent did not author. Neither page says that. An anchor that describes its target wrongly is worse than no link. aihawk: 2 mute pages to 0, outbound density median 3.5 per thousand words. content gate, its selftest, english-only and the wiki build all clean. | 1 天前 | |
The computer-use API left its preview, and five pages were still saying otherwise An independent fact-check pass against OpenAI's current guide (fetched, not searched) found the API framing stale on four wave-one pages plus one in this wave: the tool is generally available, named computer, driven by current models, with a documented migration from the old computer-use-preview model. The research-preview and usage-tier language is gone everywhere it described the present; the historical mentions of Operator launching as a preview in January 2025 stay, because they describe January 2025. The per-token price that belonged to the retired preview model went with it rather than being carried onto a model it was never quoted for. Also records the owner's decision in articles/README.md: a mainstream site may now be the declared subject of a guide, while incidental target-naming in demos, credentials, and site-specific defense-defeating instructions stay out. | 6 天前 | |
No turn ceiling, and a stop button that is always there (0.13.0) (#1258) The loop stopped itself at twenty-five turns and raised "task did not finish within max_turns=25". What that did in practice was end long tasks that were going fine, one step before they might have answered, with the transcript at its largest and every one of those steps already paid for. A number cannot tell a loop that is stuck from a task that is simply long. The ceiling is gone, not raised: there is no max_turns parameter left to set. What ends a run now is the person watching it, so the two things that made that unreliable are fixed in the same change. The stop control is its own button instead of a mode of the send button. As a mode its condition was `busyNow && !typed`, so it disappeared the moment somebody typed while the agent worked, and the composer is exactly where a person's hands are. It now follows the run and nothing else, and queueing a follow-up still works alongside it. The model request runs in a thread. It is a synchronous HTTP call and it sat on the event loop: measured at zero scheduler slices during a 300 ms call, which means /chat/stop could not be served, no event reached the page and the live pane did not repaint for as long as the model was thinking - which is exactly when somebody reaches for stop. It is now a cancellation point too, so a stop lands promptly rather than after the step in flight. It does not unsend a request already made: that reply is still paid for and then dropped. Four tests pinned the ceiling and are replaced by three that pin its absence, including a structural one that reads the AST rather than the source text, so a comment quoting the old error message does not read as a reintroduction while `max_turns: int = 1000` still would. The seven wiki pages that described the cap now describe what actually bounds a run, and say plainly that a stop only works while somebody is looking. Unrelated but caught by it: the CLI tests scrubbed provider variables and never considered the `.env` file the README tells people to write, so two of them failed on any machine that had one and passed in CI, which has none. The fixture now runs them from an empty directory. | 1 天前 | |
The infrastructure layer gets compared, with every number read off the vendor's own page Five pages the comparisons hub was missing, written under the fresh anti-penalty checklist: the cloud-browser-infrastructure explainer nobody neutral had written (every vendor that names its engine runs Chromium; Lightpanda is the one new-engine exception, and a local agent that ships its own browser needs none of it), Browserbase alternatives split by what the searcher actually wants, the Firecrawl category question conceded loudly where Firecrawl wins, Skyvern alternatives sorted by Skyvern's own README sentence about which half is open, and a Stagehand-vs-browser-use referee page where this project appears only in one labeled aside. Every vendor fact was fetched from that vendor's site or repo the same day, and one claim that could not be verified there (a customer-name banner read as a customer list) was dropped rather than shipped. Three of the pages use three different structures on purpose: the near-duplicate template is the one production pattern the scaled-content policy actually punishes. Also: agent-browser (41.9k stars, the largest omission) and Notte join the open-source landscape page, and browser-use's own move into selling infra is noted where alternatives are weighed. | 6 天前 | |
The MCP server moves in: aihawk.mcp, one package, one release (0.10.0) (#1253) * Squashed 'incoming-mcp/' content from commit f0cb73e git-subtree-dir: incoming-mcp git-subtree-split: f0cb73eef0241e4fe755447491d8839089faec8e * The MCP server moves in: aihawk.mcp, one package, one release (0.10.0) The server lived in its own repository, invisible-playwright-mcp, with four stars against thirty thousand here, and every change to it landed twice: a floor to raise here, a verb table to keep in step, a README that was already a pointer at this one. It now ships inside this package as the module aihawk.mcp, started by the invisible-playwright-mcp command or by python -m aihawk.mcp, which is what the interface spawns. The module is renamed on purpose: a wheel of aihawk owning the old module's files would have them deleted by pip when the old package is uninstalled during an upgrade. The PyPI name invisible-playwright-mcp lives on as a shim, a compatibility module and the same console script over aihawk, so every client registered with uvx invisible-playwright-mcp keeps working; the shim is published from the old repository right after this release, and that repository is then archived, never deleted. What moved: the ten modules under src/aihawk/mcp, twenty-six test files under tests/mcp_server (the two that guarded the standalone package's own version and release pages are gone, aihawk's cover the wheel), the server's README as the wiki page mcp-server and its tool-design notes as mcp-tool-design, with the nineteen wiki links that pointed at the old repository retargeted. The dependency on the server becomes the server's own dependencies (mcp capped below 2, invisible-playwright with its floor, selectolax). The publish gate checks the engine floor instead of the server floor, the wheel checks prove the module and the second console script, and a new e2e job runs the server's browser tests on one platform the way its own CI did. aihawk's __version__ was a stale literal and now reads the installed distribution. Measured before this commit, with the built wheels: default suite 333 passed, the e2e subset 21 passed against a cached engine, the clean-venv install answers on both commands, pip upgrade paths from 0.15.2 and from aihawk 0.9.2 end with the old import reaching aihawk.mcp, and uvx with an empty cache resolves the shim to this wheel and drives a page. | 2 天前 | |
The infrastructure layer gets compared, with every number read off the vendor's own page Five pages the comparisons hub was missing, written under the fresh anti-penalty checklist: the cloud-browser-infrastructure explainer nobody neutral had written (every vendor that names its engine runs Chromium; Lightpanda is the one new-engine exception, and a local agent that ships its own browser needs none of it), Browserbase alternatives split by what the searcher actually wants, the Firecrawl category question conceded loudly where Firecrawl wins, Skyvern alternatives sorted by Skyvern's own README sentence about which half is open, and a Stagehand-vs-browser-use referee page where this project appears only in one labeled aside. Every vendor fact was fetched from that vendor's site or repo the same day, and one claim that could not be verified there (a customer-name banner read as a customer list) was dropped rather than shipped. Three of the pages use three different structures on purpose: the near-duplicate template is the one production pattern the scaled-content policy actually punishes. Also: agent-browser (41.9k stars, the largest omission) and Notte join the open-source landscape page, and browser-use's own move into selling infra is noted where alternatives are weighed. | 6 天前 | |
Fix stale invisible-playwright-mcp references left over from the aihawk merge (#1255) Seven leftovers found after the server moved into this package (0.10.0/0.11.0): - A command wrapped across a line break in docs/claude-computer-use-detected-as-bot.md escaped yesterday's blanket replace (it matched "uvx invisible-playwright-mcp" on one line, not the wrapped form), so it still told Claude Code to add the old package. - Three pages (ai-browser-agent-local-llm.md, ai-browser-agent-open-source.md, running-aihawk-with-cline.md) still named invisible-playwright-mcp as the package or command, inconsistent with the rest of the docs, which say aihawk. - A dead anchor, repeated in both articles, pointed at a README heading that no longer has that wording ("you already use an assistant that can run tools" was reworded to "From your assistant, over MCP" days ago). - One article's "Reproducing it" section gave the old command as a live instruction (its "Recorded against" table nearby is correctly historical and untouched). - test_shim_contract.py's docstring described the old two-script contract while the tests below it already checked the new one-command contract. Historical references left alone: the dated version tables, the aihawk-do removal notes, and the shim note in docs/mcp-server.md (correctly dated "before 0.11.0"). | 2 天前 | |
The infrastructure layer gets compared, with every number read off the vendor's own page Five pages the comparisons hub was missing, written under the fresh anti-penalty checklist: the cloud-browser-infrastructure explainer nobody neutral had written (every vendor that names its engine runs Chromium; Lightpanda is the one new-engine exception, and a local agent that ships its own browser needs none of it), Browserbase alternatives split by what the searcher actually wants, the Firecrawl category question conceded loudly where Firecrawl wins, Skyvern alternatives sorted by Skyvern's own README sentence about which half is open, and a Stagehand-vs-browser-use referee page where this project appears only in one labeled aside. Every vendor fact was fetched from that vendor's site or repo the same day, and one claim that could not be verified there (a customer-name banner read as a customer list) was dropped rather than shipped. Three of the pages use three different structures on purpose: the near-duplicate template is the one production pattern the scaled-content policy actually punishes. Also: agent-browser (41.9k stars, the largest omission) and Notte join the open-source landscape page, and browser-use's own move into selling infra is noted where alternatives are weighed. | 6 天前 | |
A wiki, and the twenty pages the search data said to write first AIHawk gets the same reading-room the engine's repo already has: a docs/ tree rendered into the GitHub wiki by the same converter and workflow, copied from invisible_playwright where both have been running for weeks. The twenty pages are not a guess. 53 live SERPs were read before choosing them: the Operator-alternatives cluster is owned today by domains smaller than this repo, the open-source-agent queries already rank GitHub results in the top four, the agent-gets-blocked questions return nothing but forum threads, and this repo already sits at position 4-6 on four job-bot queries that a supporting page can push higher. Every comparison page carries the disclosure at the top - AIHawk is a project in the space it compares - and every claim about another tool traces to that tool's own site or source, fetched while writing. Four pages arrive from the engine wiki's AI-agents section, adapted, not copied: the timing signal, retry loops, computer-use detection and browser-use's config surface belong with the agent product, in agent language, and their originals become pointers. The mechanism layer stays where it was - pages here link into the invisible_playwright wiki for fingerprints, vendors and network truth instead of restating it. No job board, retailer or booking site is named anywhere, per the same rule the articles/ folder already declares. | 6 天前 | |
The infrastructure layer gets compared, with every number read off the vendor's own page Five pages the comparisons hub was missing, written under the fresh anti-penalty checklist: the cloud-browser-infrastructure explainer nobody neutral had written (every vendor that names its engine runs Chromium; Lightpanda is the one new-engine exception, and a local agent that ships its own browser needs none of it), Browserbase alternatives split by what the searcher actually wants, the Firecrawl category question conceded loudly where Firecrawl wins, Skyvern alternatives sorted by Skyvern's own README sentence about which half is open, and a Stagehand-vs-browser-use referee page where this project appears only in one labeled aside. Every vendor fact was fetched from that vendor's site or repo the same day, and one claim that could not be verified there (a customer-name banner read as a customer list) was dropped rather than shipped. Three of the pages use three different structures on purpose: the near-duplicate template is the one production pattern the scaled-content policy actually punishes. Also: agent-browser (41.9k stars, the largest omission) and Notte join the open-source landscape page, and browser-use's own move into selling infra is noted where alternatives are weighed. | 6 天前 | |
Ten pages from the verified backlog, written under the new rules The queue that survived the topic ban, shipped with every fact fetched the same day: what replaced Project Mariner (shut down 4 May 2026, folded into Gemini Agent and Chrome auto-browse - the same playbook that worked for the Operator page), the Manus landscape with its Meta-divestiture whiplash told from primary coverage, the Gemini-vs-Claude computer-use referee with both vendors' current toolset names read from their own docs, the honest self-review that owns the brand queries a fork and a mirror currently hold, and the AI-browser-versus-agent distinction page nobody had written. The task half: website data into Google Sheets (honest about when a formula beats an agent, and that the agent writes CSV to stdout rather than pretending a Sheets integration exists), invoice downloads (honest that the tool list has no download tool - the page teaches the escort pattern instead of inventing one), web research (conceding open-web breadth to the search-API tools by their own numbers), testing your own site, and the Cline walkthrough completing the client set. Zero job-application content anywhere, per the owner's ban - down to rewording incidental uses of the bare word. | 5 天前 | |
Ten pages from the verified backlog, written under the new rules The queue that survived the topic ban, shipped with every fact fetched the same day: what replaced Project Mariner (shut down 4 May 2026, folded into Gemini Agent and Chrome auto-browse - the same playbook that worked for the Operator page), the Manus landscape with its Meta-divestiture whiplash told from primary coverage, the Gemini-vs-Claude computer-use referee with both vendors' current toolset names read from their own docs, the honest self-review that owns the brand queries a fork and a mirror currently hold, and the AI-browser-versus-agent distinction page nobody had written. The task half: website data into Google Sheets (honest about when a formula beats an agent, and that the agent writes CSV to stdout rather than pretending a Sheets integration exists), invoice downloads (honest that the tool list has no download tool - the page teaches the escort pattern instead of inventing one), web research (conceding open-web breadth to the search-API tools by their own numbers), testing your own site, and the Cline walkthrough completing the client set. Zero job-application content anywhere, per the owner's ban - down to rewording incidental uses of the bare word. | 5 天前 | |
The MCP server moves in: aihawk.mcp, one package, one release (0.10.0) (#1253) * Squashed 'incoming-mcp/' content from commit f0cb73e git-subtree-dir: incoming-mcp git-subtree-split: f0cb73eef0241e4fe755447491d8839089faec8e * The MCP server moves in: aihawk.mcp, one package, one release (0.10.0) The server lived in its own repository, invisible-playwright-mcp, with four stars against thirty thousand here, and every change to it landed twice: a floor to raise here, a verb table to keep in step, a README that was already a pointer at this one. It now ships inside this package as the module aihawk.mcp, started by the invisible-playwright-mcp command or by python -m aihawk.mcp, which is what the interface spawns. The module is renamed on purpose: a wheel of aihawk owning the old module's files would have them deleted by pip when the old package is uninstalled during an upgrade. The PyPI name invisible-playwright-mcp lives on as a shim, a compatibility module and the same console script over aihawk, so every client registered with uvx invisible-playwright-mcp keeps working; the shim is published from the old repository right after this release, and that repository is then archived, never deleted. What moved: the ten modules under src/aihawk/mcp, twenty-six test files under tests/mcp_server (the two that guarded the standalone package's own version and release pages are gone, aihawk's cover the wheel), the server's README as the wiki page mcp-server and its tool-design notes as mcp-tool-design, with the nineteen wiki links that pointed at the old repository retargeted. The dependency on the server becomes the server's own dependencies (mcp capped below 2, invisible-playwright with its floor, selectolax). The publish gate checks the engine floor instead of the server floor, the wheel checks prove the module and the second console script, and a new e2e job runs the server's browser tests on one platform the way its own CI did. aihawk's __version__ was a stale literal and now reads the installed distribution. Measured before this commit, with the built wheels: default suite 333 passed, the e2e subset 21 passed against a cached engine, the clean-venv install answers on both commands, pip upgrade paths from 0.15.2 and from aihawk 0.9.2 end with the old import reaching aihawk.mcp, and uvx with an empty cache resolves the shim to this wheel and drives a page. | 2 天前 | |
The job-application topic leaves the wiki Owner decision: this project does not write about job applications. The whole cluster goes, not just its instructional half - nine pages: the three automate-job-applications guides, the LinkedIn application pages, the Easy Apply landscape, the job-search agent page, the bot history page, the LinkedIn detection page whose every example leaned on application velocity, and the hub that held them. Every page that linked into the cluster is rewritten to stand without it, the Home page and the README stop advertising it, and the wiki rebuild will drop the pages on the next publish since the converter mirrors deletions. The rest of the wiki is untouched: comparisons, the blocked cluster, setup, tasks, apartments. The site-as-subject rule survives for other topics; the job topic specifically is closed. | 6 天前 | |
No turn ceiling, and a stop button that is always there (0.13.0) (#1258) The loop stopped itself at twenty-five turns and raised "task did not finish within max_turns=25". What that did in practice was end long tasks that were going fine, one step before they might have answered, with the transcript at its largest and every one of those steps already paid for. A number cannot tell a loop that is stuck from a task that is simply long. The ceiling is gone, not raised: there is no max_turns parameter left to set. What ends a run now is the person watching it, so the two things that made that unreliable are fixed in the same change. The stop control is its own button instead of a mode of the send button. As a mode its condition was `busyNow && !typed`, so it disappeared the moment somebody typed while the agent worked, and the composer is exactly where a person's hands are. It now follows the run and nothing else, and queueing a follow-up still works alongside it. The model request runs in a thread. It is a synchronous HTTP call and it sat on the event loop: measured at zero scheduler slices during a 300 ms call, which means /chat/stop could not be served, no event reached the page and the live pane did not repaint for as long as the model was thinking - which is exactly when somebody reaches for stop. It is now a cancellation point too, so a stop lands promptly rather than after the step in flight. It does not unsend a request already made: that reply is still paid for and then dropped. Four tests pinned the ceiling and are replaced by three that pin its absence, including a structural one that reads the AST rather than the source text, so a comment quoting the old error message does not read as a reintroduction while `max_turns: int = 1000` still would. The seven wiki pages that described the cap now describe what actually bounds a run, and say plainly that a stop only works while somebody is looking. Unrelated but caught by it: the CLI tests scrubbed provider variables and never considered the `.env` file the README tells people to write, so two of them failed on any machine that had one and passed in CI, which has none. The fixture now runs them from an empty directory. | 1 天前 | |
uv is the way in, because it is the one that works for every reader (#1247) Owner decision, 2026-09-06, after measuring the alternatives and reading what comparable projects do. pip install aihawk is refused outside a virtual environment on current Ubuntu and Debian, and on Windows a Store Python or an install without Add to PATH leaves the commands unreachable; browser-use, aider and the official MCP servers all lead with uv for the same reason. Both blocks now install uv once, one line per system, then run everything through uvx, which brings its own Python and never depends on the PATH the client happens to have. The wiki goes back to the uv form it had yesterday: the four client guides and the sixteen pages that name the commands. | 3 天前 | |
The MCP server moves in: aihawk.mcp, one package, one release (0.10.0) (#1253) * Squashed 'incoming-mcp/' content from commit f0cb73e git-subtree-dir: incoming-mcp git-subtree-split: f0cb73eef0241e4fe755447491d8839089faec8e * The MCP server moves in: aihawk.mcp, one package, one release (0.10.0) The server lived in its own repository, invisible-playwright-mcp, with four stars against thirty thousand here, and every change to it landed twice: a floor to raise here, a verb table to keep in step, a README that was already a pointer at this one. It now ships inside this package as the module aihawk.mcp, started by the invisible-playwright-mcp command or by python -m aihawk.mcp, which is what the interface spawns. The module is renamed on purpose: a wheel of aihawk owning the old module's files would have them deleted by pip when the old package is uninstalled during an upgrade. The PyPI name invisible-playwright-mcp lives on as a shim, a compatibility module and the same console script over aihawk, so every client registered with uvx invisible-playwright-mcp keeps working; the shim is published from the old repository right after this release, and that repository is then archived, never deleted. What moved: the ten modules under src/aihawk/mcp, twenty-six test files under tests/mcp_server (the two that guarded the standalone package's own version and release pages are gone, aihawk's cover the wheel), the server's README as the wiki page mcp-server and its tool-design notes as mcp-tool-design, with the nineteen wiki links that pointed at the old repository retargeted. The dependency on the server becomes the server's own dependencies (mcp capped below 2, invisible-playwright with its floor, selectolax). The publish gate checks the engine floor instead of the server floor, the wheel checks prove the module and the second console script, and a new e2e job runs the server's browser tests on one platform the way its own CI did. aihawk's __version__ was a stale literal and now reads the installed distribution. Measured before this commit, with the built wheels: default suite 333 passed, the e2e subset 21 passed against a cached engine, the clean-venv install answers on both commands, pip upgrade paths from 0.15.2 and from aihawk 0.9.2 end with the old import reaching aihawk.mcp, and uvx with an empty cache resolves the shim to this wheel and drives a page. | 2 天前 | |
Eleven audit findings closed: stale command references, a version that contradicted itself, and a model id made exact | 5 天前 | |
Ten pages from the verified backlog, written under the new rules The queue that survived the topic ban, shipped with every fact fetched the same day: what replaced Project Mariner (shut down 4 May 2026, folded into Gemini Agent and Chrome auto-browse - the same playbook that worked for the Operator page), the Manus landscape with its Meta-divestiture whiplash told from primary coverage, the Gemini-vs-Claude computer-use referee with both vendors' current toolset names read from their own docs, the honest self-review that owns the brand queries a fork and a mirror currently hold, and the AI-browser-versus-agent distinction page nobody had written. The task half: website data into Google Sheets (honest about when a formula beats an agent, and that the agent writes CSV to stdout rather than pretending a Sheets integration exists), invoice downloads (honest that the tool list has no download tool - the page teaches the escort pattern instead of inventing one), web research (conceding open-web breadth to the search-API tools by their own numbers), testing your own site, and the Cline walkthrough completing the client set. Zero job-application content anywhere, per the owner's ban - down to rewording incidental uses of the bare word. | 5 天前 | |
A declared browser wakes where it was, tabs and all (0.19.0) (#1272) A saved session gave back WHO its browsers were. That is half of what somebody reopens a session for: a browser that comes home as the right person with nothing open is right about its identity and wrong about its work. The urls are saved with the identity now, and the first command aimed at a declared browser reopens them. Click a pane that says "not up" and it starts, with a stopwatch on it, because seven to fourteen seconds of silence is the defect this project fixed elsewhere with the Thinking clock. ⛔ FOURTEEN TOOLS WROTE `registry.ensure(addressed(...))` FOR THEMSELVES, so "what it takes to hand somebody a usable browser" was a fact known in fifteen places. The moment it stopped being just `ensure` - a declared browser now has tabs owed to it - fifteen places would have had to learn the same new step, and the one that did not would hand back a browser that came home empty. They go through one funnel, `ready`, and a test says no tool reaches the registry on its own. The floor on the address scan fell from 18 to 10 because there are fewer places able to get it wrong; that is normally how a gate gets switched off, so the reason is written where the number is and the stronger guarantee replaced it. The reopen happens ONCE. A wake that kept reopening would fight whoever is using the browser, adding the same pages back every time it was handed out. Three things this got wrong. The recovery path brought back half a browser: `drop` keeps the identity on purpose, and until now the pages were not part of "the same person" - a browser that died mid-command came back correct and empty, and the only way to notice was to go looking for your own work. The session file was never rewritten when tabs moved, so the urls were fresh in memory and stale on disk. Saving from `ready` unconditionally would have put a disk write in the path of the frame pump, thirteen times a second, so it writes when the tabs actually changed - which turns "every command" into "every navigation". And the workspace copied the `touched` guard from the picture route, where it belongs because asking for a picture STARTS a browser. `browser_list` starts nothing, by construction and by its own test, so the copy emptied the workspace in exactly the case declarations exist for: a session reopened after a restart, whose panes offering to wake its browsers would never have been drawn. Verified with a real engine: a session file declaring a browser with a url, a restart, and the wake brought it back on that page - then a second browser made the first one a preview showing a real frame. | 1 天前 | |
The MCP server moves in: aihawk.mcp, one package, one release (0.10.0) (#1253) * Squashed 'incoming-mcp/' content from commit f0cb73e git-subtree-dir: incoming-mcp git-subtree-split: f0cb73eef0241e4fe755447491d8839089faec8e * The MCP server moves in: aihawk.mcp, one package, one release (0.10.0) The server lived in its own repository, invisible-playwright-mcp, with four stars against thirty thousand here, and every change to it landed twice: a floor to raise here, a verb table to keep in step, a README that was already a pointer at this one. It now ships inside this package as the module aihawk.mcp, started by the invisible-playwright-mcp command or by python -m aihawk.mcp, which is what the interface spawns. The module is renamed on purpose: a wheel of aihawk owning the old module's files would have them deleted by pip when the old package is uninstalled during an upgrade. The PyPI name invisible-playwright-mcp lives on as a shim, a compatibility module and the same console script over aihawk, so every client registered with uvx invisible-playwright-mcp keeps working; the shim is published from the old repository right after this release, and that repository is then archived, never deleted. What moved: the ten modules under src/aihawk/mcp, twenty-six test files under tests/mcp_server (the two that guarded the standalone package's own version and release pages are gone, aihawk's cover the wheel), the server's README as the wiki page mcp-server and its tool-design notes as mcp-tool-design, with the nineteen wiki links that pointed at the old repository retargeted. The dependency on the server becomes the server's own dependencies (mcp capped below 2, invisible-playwright with its floor, selectolax). The publish gate checks the engine floor instead of the server floor, the wheel checks prove the module and the second console script, and a new e2e job runs the server's browser tests on one platform the way its own CI did. aihawk's __version__ was a stale literal and now reads the installed distribution. Measured before this commit, with the built wheels: default suite 333 passed, the e2e subset 21 passed against a cached engine, the clean-venv install answers on both commands, pip upgrade paths from 0.15.2 and from aihawk 0.9.2 end with the old import reaching aihawk.mcp, and uvx with an empty cache resolves the shim to this wheel and drives a page. | 2 天前 | |
No turn ceiling, and a stop button that is always there (0.13.0) (#1258) The loop stopped itself at twenty-five turns and raised "task did not finish within max_turns=25". What that did in practice was end long tasks that were going fine, one step before they might have answered, with the transcript at its largest and every one of those steps already paid for. A number cannot tell a loop that is stuck from a task that is simply long. The ceiling is gone, not raised: there is no max_turns parameter left to set. What ends a run now is the person watching it, so the two things that made that unreliable are fixed in the same change. The stop control is its own button instead of a mode of the send button. As a mode its condition was `busyNow && !typed`, so it disappeared the moment somebody typed while the agent worked, and the composer is exactly where a person's hands are. It now follows the run and nothing else, and queueing a follow-up still works alongside it. The model request runs in a thread. It is a synchronous HTTP call and it sat on the event loop: measured at zero scheduler slices during a 300 ms call, which means /chat/stop could not be served, no event reached the page and the live pane did not repaint for as long as the model was thinking - which is exactly when somebody reaches for stop. It is now a cancellation point too, so a stop lands promptly rather than after the step in flight. It does not unsend a request already made: that reply is still paid for and then dropped. Four tests pinned the ceiling and are replaced by three that pin its absence, including a structural one that reads the AST rather than the source text, so a comment quoting the old error message does not read as a reintroduction while `max_turns: int = 1000` still would. The seven wiki pages that described the cap now describe what actually bounds a run, and say plainly that a stop only works while somebody is looking. Unrelated but caught by it: the CLI tests scrubbed provider variables and never considered the `.env` file the README tells people to write, so two of them failed on any machine that had one and passed in CI, which has none. The fixture now runs them from an empty directory. | 1 天前 | |
0.4.0: the placeholder goes, and keyless driving is the library's job | 5 天前 | |
The open-source trio declares its own split | 5 天前 | |
The computer-use API left its preview, and five pages were still saying otherwise An independent fact-check pass against OpenAI's current guide (fetched, not searched) found the API framing stale on four wave-one pages plus one in this wave: the tool is generally available, named computer, driven by current models, with a documented migration from the old computer-use-preview model. The research-preview and usage-tier language is gone everywhere it described the present; the historical mentions of Operator launching as a preview in January 2025 stay, because they describe January 2025. The per-token price that belonged to the retired preview model went with it rather than being carried onto a model it was never quoted for. Also records the owner's decision in articles/README.md: a mainstream site may now be the declared subject of a guide, while incidental target-naming in demos, credentials, and site-specific defense-defeating instructions stay out. | 6 天前 | |
uv is the way in, because it is the one that works for every reader (#1247) Owner decision, 2026-09-06, after measuring the alternatives and reading what comparable projects do. pip install aihawk is refused outside a virtual environment on current Ubuntu and Debian, and on Windows a Store Python or an install without Add to PATH leaves the commands unreachable; browser-use, aider and the official MCP servers all lead with uv for the same reason. Both blocks now install uv once, one line per system, then run everything through uvx, which brings its own Python and never depends on the PATH the client happens to have. The wiki goes back to the uv form it had yesterday: the four client guides and the sixteen pages that name the commands. | 3 天前 | |
Give the two pages with no in-body links out a way onward (#1273) The link graph counted 61 pages in this wiki with two carrying no contextual outgoing links at all, every internal link sitting in the See also footer, which the graph excludes because boilerplate is not equity. Both happened to be the pages where the honest answer is a boundary rather than a walkthrough, so they had the fewest natural places to send a reader onward. Nothing operational is added and no step is taught. The LinkedIn page now names the three sibling platform pages in the sentence that already says LinkedIn is deliberately absent from that series, points the detection half at the page that owns it, and connects the cost of losing a professional account to the question of logging an agent in at all. The Instagram page points its checkable limit at how the tool set is shaped, its read-before-submit rule at the forms page that states the same rule, and its account-risk paragraph at the same accounts page. Two anchors were rewritten after reading the target: one asserted the tool-design page argues something about a short list of verbs, and one put words in the forms page about fields an agent did not author. Neither page says that. An anchor that describes its target wrongly is worse than no link. aihawk: 2 mute pages to 0, outbound density median 3.5 per thousand words. content gate, its selftest, english-only and the wiki build all clean. | 1 天前 | |
Posting to social media, with the API named first and one honest cannot Four pages open the social vertical the owner authorized, and every one puts the official route before the agent: the umbrella decision page says plainly that Threads, Bluesky and Mastodon have APIs good enough that an agent adds nothing there; the Facebook page teaches the Pages Graph API before describing the one surface without an API; the X page does the arithmetic on pay-per-use API pricing and concludes the API wins for most posting. The Instagram page carries the most honest line of the batch, read out of the source rather than assumed: the agent's tool vocabulary has no file-upload action, Instagram posts require media, so AIHawk cannot post there end to end - the page says exactly that and describes the human-does-the-picker division instead of inflating. Meta's terms are quoted from the English canonical; the two pages that could not be read (X's automation rules behind a 403, Instagram's ToU behind JS) are cited by name and URL with an explicit note that nothing from them is quoted. The scope line rides every page: your own content, your own account, never engagement automation, never mass posting, never groups at volume. LinkedIn is not in this wave. | 5 天前 | |
Ten pages from the verified backlog, written under the new rules The queue that survived the topic ban, shipped with every fact fetched the same day: what replaced Project Mariner (shut down 4 May 2026, folded into Gemini Agent and Chrome auto-browse - the same playbook that worked for the Operator page), the Manus landscape with its Meta-divestiture whiplash told from primary coverage, the Gemini-vs-Claude computer-use referee with both vendors' current toolset names read from their own docs, the honest self-review that owns the brand queries a fork and a mirror currently hold, and the AI-browser-versus-agent distinction page nobody had written. The task half: website data into Google Sheets (honest about when a formula beats an agent, and that the agent writes CSV to stdout rather than pretending a Sheets integration exists), invoice downloads (honest that the tool list has no download tool - the page teaches the escort pattern instead of inventing one), web research (conceding open-web breadth to the search-API tools by their own numbers), testing your own site, and the Cline walkthrough completing the client set. Zero job-application content anywhere, per the owner's ban - down to rewording incidental uses of the bare word. | 5 天前 | |
uv is the way in, because it is the one that works for every reader (#1247) Owner decision, 2026-09-06, after measuring the alternatives and reading what comparable projects do. pip install aihawk is refused outside a virtual environment on current Ubuntu and Debian, and on Windows a Store Python or an install without Add to PATH leaves the commands unreachable; browser-use, aider and the official MCP servers all lead with uv for the same reason. Both blocks now install uv once, one line per system, then run everything through uvx, which brings its own Python and never depends on the PATH the client happens to have. The wiki goes back to the uv form it had yesterday: the four client guides and the sixteen pages that name the commands. | 3 天前 | |
One command: aihawk is the server, aihawk ui the interface (0.11.0) (#1254) No command spells aihawk.mcp or invisible-playwright-mcp any more. `aihawk` with no subcommand is the MCP server over stdio: `uvx aihawk` is what a client registers, `python -m aihawk` is what the interface spawns, and a person at a terminal gets one line on stderr saying what is waiting. `aihawk ui` is the interface as before. The second console script this package carried since 0.10.0 is gone, and so is python -m aihawk.mcp; the PyPI name invisible-playwright-mcp stays a shim over aihawk, so a client that registered it before today keeps working unchanged. The README, the wiki page of the server and every config block say `uvx aihawk`. The content gate reads `aihawk` as the command, as a whole word, so `uvx aihawk` and `uvx aihawk ui` are both checked against the README's launcher, and its CLI-surface regex no longer crosses a line break, which `uvx aihawk` at the end of a line would otherwise have tripped. The README test measures the MCP way by the registration command a reader copies, since the server's own name now also starts the interface's. Measured with the built wheel: the default suite green, the 29 e2e tests green against a cached engine (the ones that spawn the server now spawn python -m aihawk), the clean-venv install carries one script, and python -m aihawk and uvx aihawk both answer the MCP handshake, list 18 tools and open a page, while uvx aihawk ui --help is the interface. | 2 天前 | |
The MCP server moves in: aihawk.mcp, one package, one release (0.10.0) (#1253) * Squashed 'incoming-mcp/' content from commit f0cb73e git-subtree-dir: incoming-mcp git-subtree-split: f0cb73eef0241e4fe755447491d8839089faec8e * The MCP server moves in: aihawk.mcp, one package, one release (0.10.0) The server lived in its own repository, invisible-playwright-mcp, with four stars against thirty thousand here, and every change to it landed twice: a floor to raise here, a verb table to keep in step, a README that was already a pointer at this one. It now ships inside this package as the module aihawk.mcp, started by the invisible-playwright-mcp command or by python -m aihawk.mcp, which is what the interface spawns. The module is renamed on purpose: a wheel of aihawk owning the old module's files would have them deleted by pip when the old package is uninstalled during an upgrade. The PyPI name invisible-playwright-mcp lives on as a shim, a compatibility module and the same console script over aihawk, so every client registered with uvx invisible-playwright-mcp keeps working; the shim is published from the old repository right after this release, and that repository is then archived, never deleted. What moved: the ten modules under src/aihawk/mcp, twenty-six test files under tests/mcp_server (the two that guarded the standalone package's own version and release pages are gone, aihawk's cover the wheel), the server's README as the wiki page mcp-server and its tool-design notes as mcp-tool-design, with the nineteen wiki links that pointed at the old repository retargeted. The dependency on the server becomes the server's own dependencies (mcp capped below 2, invisible-playwright with its floor, selectolax). The publish gate checks the engine floor instead of the server floor, the wheel checks prove the module and the second console script, and a new e2e job runs the server's browser tests on one platform the way its own CI did. aihawk's __version__ was a stale literal and now reads the installed distribution. Measured before this commit, with the built wheels: default suite 333 passed, the e2e subset 21 passed against a cached engine, the clean-venv install answers on both commands, pip upgrade paths from 0.15.2 and from aihawk 0.9.2 end with the old import reaching aihawk.mcp, and uvx with an empty cache resolves the shim to this wheel and drives a page. | 2 天前 | |
Fix stale invisible-playwright-mcp references left over from the aihawk merge (#1255) Seven leftovers found after the server moved into this package (0.10.0/0.11.0): - A command wrapped across a line break in docs/claude-computer-use-detected-as-bot.md escaped yesterday's blanket replace (it matched "uvx invisible-playwright-mcp" on one line, not the wrapped form), so it still told Claude Code to add the old package. - Three pages (ai-browser-agent-local-llm.md, ai-browser-agent-open-source.md, running-aihawk-with-cline.md) still named invisible-playwright-mcp as the package or command, inconsistent with the rest of the docs, which say aihawk. - A dead anchor, repeated in both articles, pointed at a README heading that no longer has that wording ("you already use an assistant that can run tools" was reworded to "From your assistant, over MCP" days ago). - One article's "Reproducing it" section gave the old command as a live instruction (its "Recorded against" table nearby is correctly historical and untouched). - test_shim_contract.py's docstring described the old two-script contract while the tests below it already checked the new one-command contract. Historical references left alone: the dated version tables, the aihawk-do removal notes, and the shim note in docs/mcp-server.md (correctly dated "before 0.11.0"). | 2 天前 | |
The MCP server moves in: aihawk.mcp, one package, one release (0.10.0) (#1253) * Squashed 'incoming-mcp/' content from commit f0cb73e git-subtree-dir: incoming-mcp git-subtree-split: f0cb73eef0241e4fe755447491d8839089faec8e * The MCP server moves in: aihawk.mcp, one package, one release (0.10.0) The server lived in its own repository, invisible-playwright-mcp, with four stars against thirty thousand here, and every change to it landed twice: a floor to raise here, a verb table to keep in step, a README that was already a pointer at this one. It now ships inside this package as the module aihawk.mcp, started by the invisible-playwright-mcp command or by python -m aihawk.mcp, which is what the interface spawns. The module is renamed on purpose: a wheel of aihawk owning the old module's files would have them deleted by pip when the old package is uninstalled during an upgrade. The PyPI name invisible-playwright-mcp lives on as a shim, a compatibility module and the same console script over aihawk, so every client registered with uvx invisible-playwright-mcp keeps working; the shim is published from the old repository right after this release, and that repository is then archived, never deleted. What moved: the ten modules under src/aihawk/mcp, twenty-six test files under tests/mcp_server (the two that guarded the standalone package's own version and release pages are gone, aihawk's cover the wheel), the server's README as the wiki page mcp-server and its tool-design notes as mcp-tool-design, with the nineteen wiki links that pointed at the old repository retargeted. The dependency on the server becomes the server's own dependencies (mcp capped below 2, invisible-playwright with its floor, selectolax). The publish gate checks the engine floor instead of the server floor, the wheel checks prove the module and the second console script, and a new e2e job runs the server's browser tests on one platform the way its own CI did. aihawk's __version__ was a stale literal and now reads the installed distribution. Measured before this commit, with the built wheels: default suite 333 passed, the e2e subset 21 passed against a cached engine, the clean-venv install answers on both commands, pip upgrade paths from 0.15.2 and from aihawk 0.9.2 end with the old import reaching aihawk.mcp, and uvx with an empty cache resolves the shim to this wheel and drives a page. | 2 天前 | |
Ten task-shaped pages, and the Home page grows with them (#1226) Seven guides for putting the agent to work - prices across sites, a lead list, moving rows between two web apps, running unattended, running on a local model, whether to hand it your accounts, and how to write a task it can actually follow - plus three comparisons the wiki was missing: RPA, the no-code platforms, and Vercel's agent-browser. Every external fact was read from the source on 5 September 2026 and the Sources sections say which page and when. Two claims about our own software were checked against the code rather than remembered: the twenty-five turn cap and the OpenRouter key requirement. The comparison pages declare the conflict of interest and none of them puts this project first. | 4 天前 | |
The infrastructure layer gets compared, with every number read off the vendor's own page Five pages the comparisons hub was missing, written under the fresh anti-penalty checklist: the cloud-browser-infrastructure explainer nobody neutral had written (every vendor that names its engine runs Chromium; Lightpanda is the one new-engine exception, and a local agent that ships its own browser needs none of it), Browserbase alternatives split by what the searcher actually wants, the Firecrawl category question conceded loudly where Firecrawl wins, Skyvern alternatives sorted by Skyvern's own README sentence about which half is open, and a Stagehand-vs-browser-use referee page where this project appears only in one labeled aside. Every vendor fact was fetched from that vendor's site or repo the same day, and one claim that could not be verified there (a customer-name banner read as a customer list) was dropped rather than shipped. Three of the pages use three different structures on purpose: the near-duplicate template is the one production pattern the scaled-content policy actually punishes. Also: agent-browser (41.9k stars, the largest omission) and Notte join the open-source landscape page, and browser-use's own move into selling infra is noted where alternatives are weighed. | 6 天前 | |
The infrastructure layer gets compared, with every number read off the vendor's own page Five pages the comparisons hub was missing, written under the fresh anti-penalty checklist: the cloud-browser-infrastructure explainer nobody neutral had written (every vendor that names its engine runs Chromium; Lightpanda is the one new-engine exception, and a local agent that ships its own browser needs none of it), Browserbase alternatives split by what the searcher actually wants, the Firecrawl category question conceded loudly where Firecrawl wins, Skyvern alternatives sorted by Skyvern's own README sentence about which half is open, and a Stagehand-vs-browser-use referee page where this project appears only in one labeled aside. Every vendor fact was fetched from that vendor's site or repo the same day, and one claim that could not be verified there (a customer-name banner read as a customer list) was dropped rather than shipped. Three of the pages use three different structures on purpose: the near-duplicate template is the one production pattern the scaled-content policy actually punishes. Also: agent-browser (41.9k stars, the largest omission) and Notte join the open-source landscape page, and browser-use's own move into selling infra is noted where alternatives are weighed. | 6 天前 | |
Eleven audit findings closed: stale command references, a version that contradicted itself, and a model id made exact | 5 天前 | |
No turn ceiling, and a stop button that is always there (0.13.0) (#1258) The loop stopped itself at twenty-five turns and raised "task did not finish within max_turns=25". What that did in practice was end long tasks that were going fine, one step before they might have answered, with the transcript at its largest and every one of those steps already paid for. A number cannot tell a loop that is stuck from a task that is simply long. The ceiling is gone, not raised: there is no max_turns parameter left to set. What ends a run now is the person watching it, so the two things that made that unreliable are fixed in the same change. The stop control is its own button instead of a mode of the send button. As a mode its condition was `busyNow && !typed`, so it disappeared the moment somebody typed while the agent worked, and the composer is exactly where a person's hands are. It now follows the run and nothing else, and queueing a follow-up still works alongside it. The model request runs in a thread. It is a synchronous HTTP call and it sat on the event loop: measured at zero scheduler slices during a 300 ms call, which means /chat/stop could not be served, no event reached the page and the live pane did not repaint for as long as the model was thinking - which is exactly when somebody reaches for stop. It is now a cancellation point too, so a stop lands promptly rather than after the step in flight. It does not unsend a request already made: that reply is still paid for and then dropped. Four tests pinned the ceiling and are replaced by three that pin its absence, including a structural one that reads the AST rather than the source text, so a comment quoting the old error message does not read as a reintroduction while `max_turns: int = 1000` still would. The seven wiki pages that described the cap now describe what actually bounds a run, and say plainly that a stop only works while somebody is looking. Unrelated but caught by it: the CLI tests scrubbed provider variables and never considered the `.env` file the README tells people to write, so two of them failed on any machine that had one and passed in CI, which has none. The fixture now runs them from an empty directory. | 1 天前 | |
A wiki, and the twenty pages the search data said to write first AIHawk gets the same reading-room the engine's repo already has: a docs/ tree rendered into the GitHub wiki by the same converter and workflow, copied from invisible_playwright where both have been running for weeks. The twenty pages are not a guess. 53 live SERPs were read before choosing them: the Operator-alternatives cluster is owned today by domains smaller than this repo, the open-source-agent queries already rank GitHub results in the top four, the agent-gets-blocked questions return nothing but forum threads, and this repo already sits at position 4-6 on four job-bot queries that a supporting page can push higher. Every comparison page carries the disclosure at the top - AIHawk is a project in the space it compares - and every claim about another tool traces to that tool's own site or source, fetched while writing. Four pages arrive from the engine wiki's AI-agents section, adapted, not copied: the timing signal, retry loops, computer-use detection and browser-use's config surface belong with the agent product, in agent language, and their originals become pointers. The mechanism layer stays where it was - pages here link into the invisible_playwright wiki for fingerprints, vendors and network truth instead of restating it. No job board, retailer or booking site is named anywhere, per the same rule the articles/ folder already declares. | 6 天前 | |
No turn ceiling, and a stop button that is always there (0.13.0) (#1258) The loop stopped itself at twenty-five turns and raised "task did not finish within max_turns=25". What that did in practice was end long tasks that were going fine, one step before they might have answered, with the transcript at its largest and every one of those steps already paid for. A number cannot tell a loop that is stuck from a task that is simply long. The ceiling is gone, not raised: there is no max_turns parameter left to set. What ends a run now is the person watching it, so the two things that made that unreliable are fixed in the same change. The stop control is its own button instead of a mode of the send button. As a mode its condition was `busyNow && !typed`, so it disappeared the moment somebody typed while the agent worked, and the composer is exactly where a person's hands are. It now follows the run and nothing else, and queueing a follow-up still works alongside it. The model request runs in a thread. It is a synchronous HTTP call and it sat on the event loop: measured at zero scheduler slices during a 300 ms call, which means /chat/stop could not be served, no event reached the page and the live pane did not repaint for as long as the model was thinking - which is exactly when somebody reaches for stop. It is now a cancellation point too, so a stop lands promptly rather than after the step in flight. It does not unsend a request already made: that reply is still paid for and then dropped. Four tests pinned the ceiling and are replaced by three that pin its absence, including a structural one that reads the AST rather than the source text, so a comment quoting the old error message does not read as a reintroduction while `max_turns: int = 1000` still would. The seven wiki pages that described the cap now describe what actually bounds a run, and say plainly that a stop only works while somebody is looking. Unrelated but caught by it: the CLI tests scrubbed provider variables and never considered the `.env` file the README tells people to write, so two of them failed on any machine that had one and passed in CI, which has none. The fixture now runs them from an empty directory. | 1 天前 |
| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
| 4 天前 | ||
| 1 天前 | ||
| 2 天前 | ||
| 6 天前 | ||
| 3 天前 | ||
| 3 天前 | ||
| 3 天前 | ||
| 5 天前 | ||
| 3 天前 | ||
| 1 天前 | ||
| 3 天前 | ||
| 2 天前 | ||
| 2 天前 | ||
| 2 天前 | ||
| 4 天前 | ||
| 1 天前 | ||
| 5 天前 | ||
| 1 天前 | ||
| 1 天前 | ||
| 5 天前 | ||
| 1 天前 | ||
| 6 天前 | ||
| 1 天前 | ||
| 6 天前 | ||
| 2 天前 | ||
| 6 天前 | ||
| 2 天前 | ||
| 6 天前 | ||
| 6 天前 | ||
| 6 天前 | ||
| 5 天前 | ||
| 5 天前 | ||
| 2 天前 | ||
| 6 天前 | ||
| 1 天前 | ||
| 3 天前 | ||
| 2 天前 | ||
| 5 天前 | ||
| 5 天前 | ||
| 1 天前 | ||
| 2 天前 | ||
| 1 天前 | ||
| 5 天前 | ||
| 5 天前 | ||
| 6 天前 | ||
| 3 天前 | ||
| 1 天前 | ||
| 5 天前 | ||
| 5 天前 | ||
| 3 天前 | ||
| 2 天前 | ||
| 2 天前 | ||
| 2 天前 | ||
| 2 天前 | ||
| 4 天前 | ||
| 6 天前 | ||
| 6 天前 | ||
| 5 天前 | ||
| 1 天前 | ||
| 6 天前 | ||
| 1 天前 |