Skip to content

Releases: clawnify/taskwindow

TaskWindow v0.2.11

Choose a tag to compare

@github-actions github-actions released this 01 Oct 08:15
ef12397

Changed

A human click lands a little off-centre, always on the element you meant.
It used to press the exact pixel asked for, every time. It now presses a few
pixels away, never more than 20% of the element's size, 6px across or 3px
down, and only after checking that the new point still hits the same button,
link or checkbox. Where the spot itself matters it still presses exactly
where asked: sliders, canvases, video, embedded frames, and text boxes that
already hold text, where the click places the caret. The result says where it
pressed.

Clicks show on the element, not as a ring. The ring that spread from each
click is gone. The pointer is really on the element, so the page's own hover
and pressed styles show the click, as they would for a person's; the agent's
arrow still dips briefly on the press.

Install

Run npm install -g taskwindow@latest, then taskwindow install. The guided installer configures the daemon and selected coding agents and opens the Chrome Web Store listing; the extension pairs on its own after "Add to Chrome" and Chrome keeps it updated.

Manual archives are attached below (the extension zip is for taskwindow install --extension <zip>, the unpacked development route). Run taskwindow doctor for connection diagnostics or taskwindow pair for manual recovery.

See the README for the full guide.

TaskWindow v0.2.10

Choose a tag to compare

@github-actions github-actions released this 01 Oct 07:59
4a45c67

Changed

human input is now the default. Clicks, scrolls, typing and mouse_move
take the human path unless you pass human: false, so lazy-loading lists,
hover menus and type-ahead inputs work on the first try instead of after an
agent notices the plain event did nothing. Each action costs a few hundred
milliseconds more; human: false gets the old instant event back.

Fixed

human: "true" no longer fails the call. Some agents send booleans and
numbers as strings, and the schema rejected the whole call, so the agent went
looking for a way around the tool. Every boolean and number parameter now
accepts "true", "false" and numeric strings; anything else is still
rejected. browser_batch steps go through the same schema as direct calls, so
they get the same defaults, and bad parameters fail the step by name instead of
reaching the extension.

Agents no longer ask to run an update that does nothing. When the Chrome
Web Store shipped an extension newer than the daemon on npm, every agent
session asked the user for permission to run taskwindow update, which could
only answer "already up to date". The agent now hears that there is nothing to
run yet, and is still told to update once npm has the newer daemon.

Install

Run npm install -g taskwindow@latest, then taskwindow install. The guided installer configures the daemon and selected coding agents and opens the Chrome Web Store listing; the extension pairs on its own after "Add to Chrome" and Chrome keeps it updated.

Manual archives are attached below (the extension zip is for taskwindow install --extension <zip>, the unpacked development route). Run taskwindow doctor for connection diagnostics or taskwindow pair for manual recovery.

See the README for the full guide.

TaskWindow v0.2.9

Choose a tag to compare

@github-actions github-actions released this 01 Oct 07:49
879282d

Added

Wonder: human mode for input that pages actually react to. Pass
human: true to computer on a click, scroll, type or mouse_move and the
action reaches the page as the event stream a real hand produces rather than
one synthetic jump.

This is a correctness fix more than a cosmetic one. A single wheel event
carrying 1600px gave the page two scroll events where a real wheel gives
ninety-nine, so infinite scroll, lazy images and anything gated on
IntersectionObserver simply never fired. A cursor that teleported onto a
button never fired the mouseenter that opens a hover menu. Input.insertText
fires no key events at all, so type-ahead and autocomplete inputs stayed empty.

Pointer moves now follow a curved, decelerating path with an overshoot and a
dwell before the press; scrolls are split into uneven wheel gestures using
Chrome's own smooth-scroll synthesiser; text is typed character by character
with human intervals (and pasted above 200 characters, as a person would).
Coordinates and deltas land exactly where you asked — the variation is in the
path, never the destination. targetWidth lets Fitts's Law pick the approach
speed for the thing being clicked.

The new computer action idle drifts the cursor without clicking; with dy
it also rocks the wheel by that many pixels and returns to the same offset.

The cursor drawn on the page follows the same path at the same pace, and its
click ring appears when the button actually goes down, so what you watch is
what the page received.

Off by default: it costs a few hundred milliseconds per action.

Codex is now a first-class installer option. A normal guided install
detects Codex alongside the other supported agents, and the explicit
taskwindow install --codex command adds TaskWindow as an authenticated
user-level MCP server shared by the Codex app, CLI, and IDE extension.
taskwindow doctor reports it and taskwindow uninstall removes it with the
other agent registrations.

Registration checks the saved connection and authentication, protects the
config file containing the token, and restores the original config if setup
fails. Restart the agent after setup to load the browser tools.

Fixed

The agent's cursor points where it clicks, and looks like TaskWindow. The
arrow drew 3px right of and 1px below the real click point, so a screenshot
taken to check a target showed the cursor slightly off it. The tip now sits on
the exact point. The black arrow is replaced by one filled with the blue
texture from the icon, drifting slowly so it looks alive while it waits. Longer
moves glide for longer, up to 300ms, and each click shows a brief ring. Page
styles can no longer restyle the cursor, and reduced motion turns off the
drift and the ring.

set_viewport reuses its tabs instead of breeding them. Every call opened
a fresh harness tab, plus one more tab for each viewport that could not be
framed — so iterating on a responsive design left a tab group full of
duplicates of the same page. The view is now opened once per session and
re-pointed on later calls: changing the url or the viewport list navigates the
tabs that already exist, a viewport you stop asking for has its tab closed, and
repeating the same call costs nothing.

Closing a responsive view actually closes it, and says so honestly. Two
separate faults: a set_viewport with no viewports and no sessionToken
invented a token, found nothing under it, and answered "no responsive view is
open (it may have been closed already)" — which reads like success, so agents
moved on believing they had cleaned up. And even with the right token it
removed the window the harness was created in, which is never the window it
ends up in, since joining the session's tab group moves it. A tokenless close
is now an error naming the missing token, a close with nothing to close says
so plainly, and a real close removes the tabs by id and reports how many.

A local file no longer costs eight seconds and a pile of tabs. <all_urls>
does not grant the file:// scheme — that is the per-extension "Allow access
to file URLs" toggle — so a file:// page in the harness iframe never loaded,
and every call waited out the full frame deadline before falling back. It is
now checked up front: the frame attempt is skipped and the result names the
toggle that would make side-by-side work.

Concurrent agents stop clobbering each other's framing rules. The
header-stripping rule used one fixed id for the whole extension, so a second
session's view silently unscoped the first's. Each session now holds its own
rule id and releases it on close.

Install

Run npm install -g taskwindow@latest, then taskwindow install. The guided installer configures the daemon and selected coding agents and opens the Chrome Web Store listing; the extension pairs on its own after "Add to Chrome" and Chrome keeps it updated.

Manual archives are attached below (the extension zip is for taskwindow install --extension <zip>, the unpacked development route). Run taskwindow doctor for connection diagnostics or taskwindow pair for manual recovery.

See the README for the full guide.

TaskWindow v0.2.8

Choose a tag to compare

@github-actions github-actions released this 10 Sep 14:36
f2cf39b

Extension and daemon. Coming from 0.2.7: taskwindow update for the daemon;
the extension now comes from the Chrome Web Store (see below).

Changed

One click in Chrome: the extension is on the Web Store. Setup used to
end with Developer mode, Load unpacked and a folder picker, because Chrome
demands those for an unpacked extension. taskwindow install now opens the
store listing
instead, and "Add to Chrome" is the whole Chrome side. Chrome then keeps the
extension current on its own, so taskwindow update only updates the daemon,
and an extension a version behind the daemon is reported as Chrome's to catch
up on rather than as something to run. Already loaded unpacked? Remove that
copy in chrome://extensions before adding the store one; taskwindow doctor
says which kind is connected. --extension <zip> keeps the unpacked route for
development.

Pairing happens without a code. A store install has no folder for the
installer to leave a setup code in, so the extension pairs by identity
instead: Chrome stamps its fixed extension id on every request as the origin,
which no other extension or web page can forge, and the daemon returns its
token to that origin alone. Unpacked builds keep the one-time code; manual
pairing with taskwindow pair is unchanged.

Added

Setup recovers from a Web Store build that cannot pair itself. Chrome
serves whatever version last passed review, which can trail a release by
weeks, and a build older than self-pairing leaves taskwindow install
waiting out its five minutes for a connection that was never coming. After a
quiet minute the installer now prints a pairing code and where to paste it,
then keeps waiting — so the recovery is ten seconds instead of a dead wait
and a puzzled taskwindow doctor. Nothing is printed when the extension
pairs on its own, and never on the unpacked path, where a second code would
invalidate the one the installer just wrote.

The extension explains itself on first install, when there is something
to explain.
Right after "Add to Chrome" the extension checks for the daemon.
Found one — the installer is driving and pairing is silent — it opens
nothing. Found none, the user came from the store listing first, so a setup
guide opens with the two commands to run; it turns green by itself once the
daemon is up, and Settings links to it for later.

Install

Run npm install -g taskwindow@latest, then taskwindow install. The guided installer configures the daemon and selected coding agents and opens the Chrome Web Store listing; the extension pairs on its own after "Add to Chrome" and Chrome keeps it updated.

Manual archives are attached below (the extension zip is for taskwindow install --extension <zip>, the unpacked development route). Run taskwindow doctor for connection diagnostics or taskwindow pair for manual recovery.

See the README for the full guide.

TaskWindow v0.2.7

Choose a tag to compare

@github-actions github-actions released this 09 Sep 14:33
ebe821d

Extension and daemon. Coming from 0.2.6: taskwindow update.

Changed

One session, one tab group. A tab group exists to hold every tab of one
job, but agents were getting a group per tab: at the moment it calls
tabs_create an agent has its attention on the sub-task in front of it, so it
named that — "Glass bezel check", "Masked band check" — and each name made
its own group of one. The name is now read once, on the first call of a
session, and fixed: every later tab joins that group, and a task passed
anyway is reported back in the result instead of starting a second group. The
tool now asks for the name of the whole job, not of the page about to open.

Every result restates your session token. The token was named once, in the
first tabs_create result, at the start of a session meant to run for a whole
job — so it was exactly the detail an agent loses as its context is
compacted, and the next tabs_create without it counted as a different
session and opened a second tab group. Every session-scoped result now ends
with a session: ... line, so the token an agent needs is always in what it
just read.

Added

Short tasks clean up after themselves. Naming a task in tabs_create now
also asks longRunning: might this job need more than an hour? Say false
and the group closes itself, tabs and all, once it has been idle for an hour,
so a finished lookup no longer sits in the TaskWindow window for a month. Say
true and it keeps the 30-day lifetime. The answer is required on the call
that names the task — the first of a session. To revise it later, pass
longRunning on its own; passed alongside a task, it is ignored with the
name it came with, so a stray sub-task name can never cut a whole job's group
down to the one-hour lifetime. A group whose tab you are reading is never
closed, and groups created before this release keep the 30-day lifetime.

Fixed

Task groups stay in the agent's window. The first tab of every new task was
yanked into whatever Chrome window you were last looking at, leaving the agent
window holding nothing but its pinned anchor. Creating a tab group without
naming a window puts it in Chrome's current window — for an extension service
worker, the window you last focused — and Chrome moves the tab there to join
it. New groups now say which window they belong to.

And the agent window is found by its anchor, not by its groups. The fix
above governs new groups; it could not bring back the groups the bug had
already parked in your window, because the lookup for "the agent's window"
answered with wherever the most recent group happened to sit — your window,
authoritatively. So a brand-new task kept opening there too. The pinned
workspace tab now identifies the agent window; groups only break a tie between
two anchored windows, or stand in when no anchor is left. "Use this window for
the agent" moves the anchor along with the groups, which empties the old agent
window and lets Chrome close it. Nothing to do after updating: the next task
opens where the anchor is.

Nothing ever brings a tab forward. 0.2.6 still made a tab visible before
mouse input, on the belief that a hidden tab never acknowledges the event, and
failed the call when that tab was behind yours — which agents then worked
around by closing tabs or clicking through page scripts. Checked in Chrome:
click, wheel scroll and typing over the DevTools protocol all land in a tab
that is not its window's active tab, and it stays that way. The activation and
the "behind another tab" error are gone.

Install

Run npm install -g taskwindow@latest, then taskwindow install. The guided installer configures the daemon and selected coding agents, downloads the extension, opens Chrome, and pairs automatically after you load the unpacked folder.

Manual archives are attached below. Run taskwindow doctor for connection diagnostics or taskwindow pair for manual recovery.

See the README for the full guide.

TaskWindow v0.2.6

Choose a tag to compare

@github-actions github-actions released this 06 Sep 08:02
0c1a9c3

Extension and daemon. Coming from 0.2.5: nothing to run — taskwindow update.

Changed

The task name is remembered per session. Only the first tabs_create
needs a task; later calls with the sessionToken can omit it and the tab
joins the session's current task group — the same way the token is kept for
the agent instead of re-derived. A new task name still starts another group
and makes it current. A token whose session has no group yet gets an error
that says to pass the name.

Fixed

The agent never switches tabs on you. tabs_create opened every tab as
the active one, and clicking or scrolling in a tab that was not the visible
one first made it visible — so when that window was the one you were working
in (agent groups adopted into it, or "own window" off), you were pulled off
your page mid-task. Now every tab opens in the background: the active option
is gone, and a background tab still renders, so screenshots and page reads
work as before. Input brings a tab forward only in a window you are not
looking at — the agent's own window, or any window while Chrome is in the
background; if the tab is behind yours in your focused window, the call fails
with the reason instead of switching. The focus hand-back after Chrome raises
a window on tab creation now runs only while Chrome is frontmost, so it can no
longer pull you out of another app.

Install

Run npm install -g taskwindow@latest, then taskwindow install. The guided installer configures the daemon and selected coding agents, downloads the extension, opens Chrome, and pairs automatically after you load the unpacked folder.

Manual archives are attached below. Run taskwindow doctor for connection diagnostics or taskwindow pair for manual recovery.

See the README for the full guide.

TaskWindow v0.2.5

Choose a tag to compare

@github-actions github-actions released this 06 Sep 07:40
6d74310

Daemon and extension. Coming from 0.2.4: taskwindow update — it refreshes the
extension files, restarts the daemon and reloads the extension for you.

Fixed

A slow wake-up no longer turns one task into five groups and stray tabs.
After a laptop sleep, Chrome can take tens of seconds to answer the extension.
The daemon gave up on tabs_create after 15s, the extension finished the call
anyway, and each retry — having no session token yet — minted a new session:
the popover filled with identical "linkedin batch 7 research" groups, some tabs
sat outside any group, and the agent could reach none of them. Now the daemon
mints the session token up front and names it in the timeout error, so the
retry (same token, task and url) receives the tab the first call opened — still
opening, or finished within the last minute — instead of a second one. A tab
the extension cannot put in its task group is closed again, never stranded.
Chrome calls that stall inside the tab-group bookkeeping fail that one call
after 10s instead of holding every session's tools; the error says which call.

taskwindow_status and the popover agree about the connection. Both ends
now use the extension's 20-second ping as a liveness check: a socket the other
side silently abandoned (typical after sleep) is dropped and redialled, so
tools fail fast with "not connected" instead of timing out one by one while
status still reported a connected extension.

javascript_execute can reuse variable names. Top-level const/let
declarations stayed in the page between calls, so the second script that
declared ta failed with "Identifier 'ta' has already been declared". It now
evaluates in the DevTools console's REPL mode, which also allows top-level
await.

The daemon log names slow and late answers. A tool call the extension
answered after more than 5s — or after its deadline had passed — is logged
with the elapsed time and, for tabs_create, how long the tab creation and
the grouping each took, so the next slow morning is diagnosable.

Install

Run npm install -g taskwindow@latest, then taskwindow install. The guided installer configures the daemon and selected coding agents, downloads the extension, opens Chrome, and pairs automatically after you load the unpacked folder.

Manual archives are attached below. Run taskwindow doctor for connection diagnostics or taskwindow pair for manual recovery.

See the README for the full guide.

TaskWindow v0.2.4

Choose a tag to compare

@github-actions github-actions released this 05 Sep 20:20

Extension-side. Coming from 0.2.3 or older: npm install -g taskwindow@latest,
then taskwindow update — it refreshes the extension files and reloads the
extension for you (older extensions get told the one click that remains).

Added

taskwindow update. One non-interactive command brings the daemon and the
extension to the latest release: installs the npm package into the prefix the
current one lives in (not whichever npm is first on PATH), refreshes the
unpacked extension files, restarts the daemon, and has the extension reload
itself. Open tabs survive. Agents may run it, with your permission.

Agents learn about new versions. The daemon asks the npm registry for the
latest version at most once a day and, when there is one (or the extension
lags the daemon), says so once per agent session — in the tabs_create result
and in taskwindow_status — telling the agent to ask you before running
taskwindow update. doctor shows it too. Disable with
~/.taskwindow/no-update-check.

computer screenshots can be saved to disk. By default a screenshot comes
back inline, with no path — nothing else could use the actual image. Pass
save_to_disk: true and the daemon also writes the PNG to a temp directory
(OS-cleaned) and returns the absolute path in the result text, so the agent can
attach it to an issue, feed it to another tool, or just verify it with file.
The extension is untouched; this happens entirely daemon-side.

Extension-side: after taskwindow install, reload TaskWindow in
chrome://extensions.

Fixed

Screenshot coordinates now match click coordinates on Retina and zoomed
pages.
computer screenshots were rendered in device pixels while clicks,
scrolls and mouse moves are dispatched in CSS pixels, so on a 2x display every
coordinate read off a screenshot landed twice too far right and down — off the
button, or off the viewport entirely. Agents clicked "send" and nothing
happened, then pressed Enter into nothing. Screenshots are now captured at
1 image pixel per CSS pixel, so x,y read off them can be used as-is; the
result text says so. A newly created agent window also opens at 1280x900, so
that 1:1 screenshot stays within the resolution vision models see natively
instead of being downscaled on the way in (resize the window if you want more).

The on-page cursor and glow no longer fade out mid-task. They used to
disappear about 1.6s after each action, so an agent that moved the mouse and
then took a screenshot to check the spot before clicking often found nothing to
check. Both now stay up for as long as the tab is being driven and go away when
TaskWindow detaches from the tab.

javascript_execute works on sites with a strict Content Security Policy.
It ran the code through eval inside the page, which x.com, reddit.com, GitHub
and any other site without 'unsafe-eval' reject. It now evaluates over the
DevTools protocol like the DevTools console, which the page's CSP cannot block.

doctor and install warn when an older taskwindow shadows this one.
Global installs under different Node versions leave older copies behind, and if
one sits earlier on PATH it silently runs instead of the version you just
installed — a pre-doctor copy even falls through to daemon mode and dies with
EADDRINUSE. Both commands now name the shadowing binary and its version, and
say how to remove it.

Install

Run npm install -g taskwindow@latest, then taskwindow install. The guided installer configures the daemon and selected coding agents, downloads the extension, opens Chrome, and pairs automatically after you load the unpacked folder.

Manual archives are attached below. Run taskwindow doctor for connection diagnostics or taskwindow pair for manual recovery.

See the README for the full guide.

TaskWindow v0.2.3

Choose a tag to compare

@github-actions github-actions released this 05 Sep 08:07
e98c938

Extension-side again: after taskwindow install, reload TaskWindow in
chrome://extensions.

Changed

New icon, and task groups are now blue — the same blue as the glow that marks
where an agent is acting on a page — instead of green.

Install

Run npm install -g taskwindow@latest, then taskwindow install. The guided installer configures the daemon and selected coding agents, downloads the extension, opens Chrome, and pairs automatically after you load the unpacked folder.

Manual archives are attached below. Run taskwindow doctor for connection diagnostics or taskwindow pair for manual recovery.

See the README for the full guide.

TaskWindow v0.2.2

Choose a tag to compare

@github-actions github-actions released this 05 Sep 08:02
a755a34

This one changes the extension, so updating the daemon alone is not enough:
after taskwindow install, reload TaskWindow in chrome://extensions.
taskwindow doctor flags the mismatch until you do.

Added

reload. Reloads a tab in place (optionally bypassing the cache) and waits
for the load event. There was no way to refresh a page: tabs_create is the
first tool every agent learns and needs no tab id, so "check the page again"
turned into a second tab at the same URL, every iteration. tabs_create now
says so and points at reload/navigate for a page you already have open.

Fixed

Opening a tab no longer steals focus. tabs_create focused the agent
window on every call — the default active: true ran
windows.update({ focused: true }), which also brings Chrome to the front — so
each tab an agent opened pulled you out of your own window, or out of your
terminal. active now means active within the agent window, so the page
renders and screenshots work; whatever you were in keeps focus. Click the agent
window when you want to watch.

Mouse input no longer stalls when the agent window isn't in front. Chrome
stops producing frames for a tab that is inactive or whose window is covered,
and DevTools holds a wheel event until the next frame — so scroll hung for
30 s and mouse_move/clicks took 5 s whenever you were looking at something
else, which the focus fix above makes the normal case. The page is now kept
rendering with CDP focus emulation (what Playwright does by default; the
equivalent launch flags aren't available to an extension), and a mouse action
first makes its tab the active one in the agent window. Keys and screenshots
were never affected.

A tab's existence no longer leaks across sessions. Passing another session's
tab id returned "belongs to a different agent session" while an unused id
returned "No tab with id" — two distinguishable answers, so an agent could walk
tab ids and learn which were live (and how many tabs you had open) without ever
being allowed to touch them. Both now return the same message, and it no longer
claims the tab belongs to another agent: it may equally be one of your own.
tabs_close went through its own tab lookup and bypassed the check entirely; it
now shares the single guarded path.

Changed

Agents share one window. Every new task used to open another Chrome window,
even within one session. A window holds many tab groups, so a task now joins
the window the agent is already working in — concurrent agents included — and
only the very first creates one. A pinned TaskWindow workspace tab anchors
that window: Chrome closes a window with its last tab, and one task finishing
must not take the shared window, and wherever you put it, away from everyone
else. No agent can close the anchor, since it sits outside every group. Close it
yourself if you want the window gone; the next task simply opens a fresh one.

taskwindow install is documented as the one command that installs, repairs and
updates the extension. taskwindow doctor used to point at taskwindow install --extension when extension files were missing; it now points at taskwindow install. The --extension flag still works and remains the way to install from
a local zip when the download fails.

Install

Run npm install -g taskwindow@latest, then taskwindow install. The guided installer configures the daemon and selected coding agents, downloads the extension, opens Chrome, and pairs automatically after you load the unpacked folder.

Manual archives are attached below. Run taskwindow doctor for connection diagnostics or taskwindow pair for manual recovery.

See the README for the full guide.