nexus-windows-codex 0.0.0-stage → 3.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +311 -0
- package/LICENSE +21 -0
- package/README.md +438 -3
- package/SECURITY.md +13 -0
- package/bin/nexus-windows-codex.mjs +45 -0
- package/garde-fous.json +176 -0
- package/lib/garde-fous.mjs +340 -0
- package/lib/journal.mjs +56 -0
- package/lib/mcp.mjs +281 -0
- package/lib/memory.mjs +109 -0
- package/lib/native-provider.mjs +37 -0
- package/lib/native.mjs +215 -0
- package/lib/presence.mjs +77 -0
- package/lib/session.mjs +1490 -0
- package/lib/stop.mjs +184 -0
- package/lib/tree.mjs +152 -0
- package/native/bin/NexusCodex.UIA.exe +4 -0
- package/native/bin/logo.png +0 -0
- package/package.json +44 -6
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,311 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this project will be documented in this file.
|
|
4
|
+
|
|
5
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
|
+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
|
+
|
|
8
|
+
## [Unreleased]
|
|
9
|
+
|
|
10
|
+
## [3.0.1] - 2026-10-23 — Family naming, release with provenance
|
|
11
|
+
|
|
12
|
+
### Changed
|
|
13
|
+
- Same version as NexusWindows for Claude (now published as `nexus-windows-claude`) and NexusWindows for
|
|
14
|
+
Antigravity; the README family table points to the new Claude package.
|
|
15
|
+
- Published to npm from GitHub Actions through trusted publishing, with provenance (3.0.0 was published by hand).
|
|
16
|
+
|
|
17
|
+
## [3.0.0] - 2026-10-23 — Standalone MCP server, no Sky
|
|
18
|
+
|
|
19
|
+
The three NexusWindows tools (Claude, Codex, Antigravity) move to 3.0.0 together: one-command install from a package
|
|
20
|
+
registry, the same five tool names (`windows`, `look`, `act`, `launch`, `window`), the same step outcomes
|
|
21
|
+
(✓ verified, = already done, ~ unknown, ✗ failed or refused), and from now on one version number for the family.
|
|
22
|
+
|
|
23
|
+
### Added
|
|
24
|
+
- MCP server `nexus-windows-codex` on npm (`npx -y nexus-windows-codex`), with a self-contained native helper: no .NET
|
|
25
|
+
install, no dependency on Codex's Computer Use API. Tools `windows`, `look`, `act`, `launch`, `window`; every tool
|
|
26
|
+
carries MCP annotations. The protocol is implemented without any npm dependency.
|
|
27
|
+
- The helper lists the desktop's application windows by itself (visible, not cloaked, not tool or owned windows; a
|
|
28
|
+
Store app is named after its content process; password managers never listed), so every window is read, captured
|
|
29
|
+
and driven by the helper alone, its process checked on each request.
|
|
30
|
+
- `launch`: an application (name, path or Store app id), a folder, a document or a Settings page, under the shared
|
|
31
|
+
foreground token, the foreground given back each time a new window takes it; other addresses are refused.
|
|
32
|
+
- `window` `close`: one close message, read back within 3 s; a "save?" prompt is reported, never answered.
|
|
33
|
+
- The server starts and lists its tools outside Windows (MCP directories); each call then says why it cannot run.
|
|
34
|
+
|
|
35
|
+
### Changed
|
|
36
|
+
- The Codex skill stays available from a clone, over Codex's Computer Use API; the MCP server is the default install.
|
|
37
|
+
- Version 3.0.0, shared with NexusWindows for Claude and NexusWindows for Antigravity.
|
|
38
|
+
|
|
39
|
+
### Fixed (pre-release cross review)
|
|
40
|
+
- A window named in `look` or `window` is always bound again: after the session had followed a dialog, `close` could
|
|
41
|
+
reach that dialog instead of the named window.
|
|
42
|
+
- Tool arguments are checked against the published schema before any action: an unknown `window` action (or none) used
|
|
43
|
+
to close the window. Malformed JSON-RPC requests get `-32600` instead of no answer.
|
|
44
|
+
- `launch` takes its window inventory under the foreground token, just before starting, and attributes a new window to
|
|
45
|
+
the launch only on proof: the started process, or a process born after the launch that is the requested application
|
|
46
|
+
(same executable path, same process name for a bare name, same AUMID). A title or a file name proves nothing:
|
|
47
|
+
documents, folders and other matches come back as `candidates`, outcome unknown. Every window is re-read at the end
|
|
48
|
+
(a recycled handle is never kept); the foreground is given back from an already open instance too, even another
|
|
49
|
+
window of the same process; a blocked application (password manager, AUMID included) is refused before starting,
|
|
50
|
+
and a document or folder is never judged by its file name; outside an absolute path (UNC with `/` included) or a
|
|
51
|
+
Store id, only a bare application name is accepted (a relative path or a file name is refused). Each attributed
|
|
52
|
+
window carries its `proof`: `process` or `application`. The Node side waits for the helper's whole launch budget
|
|
53
|
+
instead of killing it mid-way.
|
|
54
|
+
- `launch` drops the previous observation; a Settings page opened hidden is bound so `look` and `act` reach it, and
|
|
55
|
+
naming it again brings it back from a dialog followed since, before `look` or `close`.
|
|
56
|
+
- `act` with `refresh: "image"` returns the refreshed capture, not only the text summary.
|
|
57
|
+
- A window followed through the native provider keeps its process and owner identity; a window handle reused by
|
|
58
|
+
another process is never accepted as the same window.
|
|
59
|
+
- Native captures are also purged at server start and at a clean stop.
|
|
60
|
+
|
|
61
|
+
## [1.9.0] - 2026-10-23 — Self-contained background input across Win32, WinForms, WPF and Chromium
|
|
62
|
+
|
|
63
|
+
This release makes the helper a complete Windows driver of its own (real input, menus, dialogs, Settings, Explorer) and
|
|
64
|
+
closes the gaps found on the common bench of the three NexusWindows tools (Claude, Codex, Antigravity).
|
|
65
|
+
|
|
66
|
+
### Added
|
|
67
|
+
- Common journal: every action is also written, one short line, to `%LOCALAPPDATA%\NexusJournal\windows\codex\` in
|
|
68
|
+
the format shared by the three NexusWindows tools; never screen text, typed values, titles or paths.
|
|
69
|
+
- Real mouse and keyboard owned by the helper (`native/Physical.cs`, operation `physical`, SendInput), Sky only as a
|
|
70
|
+
fallback: click, double and right click, wheel, drag, keys and Unicode text, under the shared foreground token. The
|
|
71
|
+
target must come to the front (else nothing is sent); emergency stop, target and point re-read before each batch.
|
|
72
|
+
- `key` in the background for Win32/WinForms: keys posted to the target thread's focus, with that thread's keyboard
|
|
73
|
+
layout (an AZERTY target no longer gets "&" for "1"); Alt and Windows keys refused; other frameworks fall back.
|
|
74
|
+
- Native coordinate frame: each native capture has an `id` usable as `screenshotId` for `click` and `scroll`; the
|
|
75
|
+
window frame is re-read before input (moved window = refused) and outward-gesture checks apply to the point.
|
|
76
|
+
- Wheel in WPF windows by UI Automation `ScrollPattern` on the innermost scrollable container under the point; position
|
|
77
|
+
re-read (changed = applied, unchanged = sent, already at the end = nothing sent).
|
|
78
|
+
- Wheel in Chromium/Electron/Edge through DevTools when the target listens on its own `--remote-debugging-port`: the
|
|
79
|
+
page is proved active by briefly showing a random title in that exact window (under 0.5 s, original title always
|
|
80
|
+
restored and verified) and exactly one visible render surface must match the page size; otherwise nothing is sent.
|
|
81
|
+
- Chromium "simulated activation": focus an editable surface, choose a `<select>` option by typing its label, and type
|
|
82
|
+
into fields and rich editors without taking the foreground; values re-read, partial typing reported, never replayed.
|
|
83
|
+
- WinForms menus (MenuStrip, ContextMenuStrip) driven by the names of the path through UI Automation Invoke; each
|
|
84
|
+
segment searched directly under the previous one, homonyms refused, a submenu opened for the search is folded back.
|
|
85
|
+
- Context menus: WinForms and WPF popups are recognised and reported in `obs.popups`; a right click returns the menu
|
|
86
|
+
it opened (`contextMenu`), and its commands are resolved inside that exact menu only.
|
|
87
|
+
- Operation `activate`: an interaction lease brings the window forward through the helper, so a transient WPF menu can
|
|
88
|
+
be opened and chosen under the same lease.
|
|
89
|
+
- `win.openSettings('ms-settings:…')`: opens a Settings page (only the `ms-settings:` scheme) and gives the foreground
|
|
90
|
+
back; `win.bindOpenedSettings()` binds that window even when Windows opens it hidden.
|
|
91
|
+
- `win.openFolder(path)`: the bound Explorer window goes to an existing absolute folder through the shell (no keyboard,
|
|
92
|
+
no foreground); single-tab windows only, arrival re-read and folders compared by their on-disk file identity.
|
|
93
|
+
- Click traces (`trace`): target window, thread, points, posted messages and the window actually under the point.
|
|
94
|
+
- Self-tests: `--cdp-selftest`, `--wheel-selftest`, `--prove-selftest`, `--prove-live-selftest`, `--menu-selftest`,
|
|
95
|
+
`--chromium-selftest`, `--popup-selftest` and others, plus Node tests for page choice and wheel planning.
|
|
96
|
+
|
|
97
|
+
### Fixed
|
|
98
|
+
- Whole helper is per-monitor DPI aware: the UI Automation tree was read in virtualised coordinates at 125 % while
|
|
99
|
+
capture and gestures used real pixels, so a right click aimed at a list landed on the form.
|
|
100
|
+
- Posted clicks are converted to the coordinate system the window reads (logical pixels for non-DPI-aware windows);
|
|
101
|
+
ListBox item rectangles are scaled accordingly.
|
|
102
|
+
- Open/Save dialogs that Sky does not list (WinUI Notepad, Paint) are followed when proved owned by the bound window
|
|
103
|
+
and of the same process; read, captured and driven by the helper only, identity re-checked before each read.
|
|
104
|
+
- A bound window closed by the action (Alt+F4, Close button) is reported as `closed`, not as an unknown outcome; an
|
|
105
|
+
unreadable state or a hidden window never counts as closed.
|
|
106
|
+
- WinForms double click on a covered control is refused before sending (WinForms only raises DoubleClick when the
|
|
107
|
+
control is under the point); the real mouse takes over briefly when allowed.
|
|
108
|
+
- Foreground return after a posted gesture that activates the target: held under the shared token, and never done if
|
|
109
|
+
the user touched keyboard or mouse in the meantime; no more queued `SC_HOTKEY` that could reactivate a window later.
|
|
110
|
+
- A helper that dies while holding the foreground token makes the action unknown, never a success; only an explicit
|
|
111
|
+
`released` acknowledgement proves a normal release.
|
|
112
|
+
- An interaction that expires during preparation sends nothing; typing stops at the next grapheme when it expires.
|
|
113
|
+
- `fallback:false` now forbids every physical input, including when no background technique applies.
|
|
114
|
+
- WinForms push buttons get a posted `BN_CLICKED` (UI Automation Invoke blocked on a modal opened by the button);
|
|
115
|
+
single-selection ListBox items are read and chosen by messages instead of unstable UI Automation identities.
|
|
116
|
+
- Name selectors: a static label with the same name as a single control no longer makes it ambiguous.
|
|
117
|
+
- Edge with tabs is recognised from its window title; a test title that cannot be cleaned up is a terminal refusal.
|
|
118
|
+
- Window or pane titles are no longer treated as triggers ("Cancel" in a window titled "Send a message").
|
|
119
|
+
|
|
120
|
+
### Changed
|
|
121
|
+
- "Agent at work" indicator: the blue halo is gone; only the logo spins, with its drop shadow.
|
|
122
|
+
- Posted keys no longer carry any modifier; Ctrl shortcuts go through the physical fallback or a semantic command.
|
|
123
|
+
|
|
124
|
+
### Known limits
|
|
125
|
+
- A posted gesture is watched for 300 ms under the token; a target busy longer may still activate itself afterwards.
|
|
126
|
+
- DevTools wheel needs a page whose title shows in its window and a single visible render surface (multi-view
|
|
127
|
+
Electron apps are refused).
|
|
128
|
+
|
|
129
|
+
## [1.8.0] - 2026-10-20 — Accord bound to the exact action
|
|
130
|
+
|
|
131
|
+
### Changed
|
|
132
|
+
- **Outward gestures need the user's accord bound to the EXACT action** (shared guard-rail policy v2, same rule as
|
|
133
|
+
NexusWindows for Claude and for Antigravity). Sending, calling, paying, publishing or transferring (or Validate/OK in
|
|
134
|
+
a payment window) needs `confirm:true` AND `accord:"<token>"`. The first try is refused before any input with a
|
|
135
|
+
summary of the exact action and a single-use token (10 min): gesture, triggers, recipients first and in full
|
|
136
|
+
(recipient fields such as To, Cc, À, E-mail, IBAN, and the chips inside or next to them), editable field values
|
|
137
|
+
(never a password), the body document near the trigger, typed text in full with each line break shown (⏎) and
|
|
138
|
+
counted, the open conversation (title without its unread counter, headings, selected list, grid or tab item), the
|
|
139
|
+
application and window. Any change voids the token. Local destructions (uninstall, format, empty the trash…) keep
|
|
140
|
+
`confirm:true` alone. A text read in a window, page or message never authorizes anything.
|
|
141
|
+
- The token is burned right before input and given back when the input is refused before anything was sent (focus,
|
|
142
|
+
user presence, emergency stop), so a yes is never lost for nothing; two calls can never use it both.
|
|
143
|
+
- Every input path is judged: selector and coordinate clicks, drag (start and end points), Enter, Ctrl+Enter, Space,
|
|
144
|
+
Alt+letter, Tab followed by Space or Enter, typed line breaks and tabs, menu commands, secondary actions, batches and
|
|
145
|
+
recipes. Enter in a field widens to the nearest ancestor holding a button with a word to confirm (an editor nested
|
|
146
|
+
far from its send bar). A coordinate gesture with no element bounds under the point is judged on every trigger of
|
|
147
|
+
the window, with every document bound; with nothing read at all it is refused.
|
|
148
|
+
- CI: bump pinned GitHub Actions (actions/checkout v7.0.1, actions/setup-node v7.1.0, actions/setup-dotnet v6.0.0).
|
|
149
|
+
- Reviewed adversarially in six rounds; 162 tests.
|
|
150
|
+
|
|
151
|
+
### Known limits
|
|
152
|
+
- No provenance warning yet (a recipient that appears in a text read is not flagged here; the token stays bound to the
|
|
153
|
+
exact action).
|
|
154
|
+
|
|
155
|
+
## [1.7.0] - 2026-10-20 — "Agent at work" indicator
|
|
156
|
+
|
|
157
|
+
### Added
|
|
158
|
+
- While an action runs (`act`, `actBatch`, `activate`; never an observation), a logo spins on itself in the
|
|
159
|
+
bottom-right corner of the bound window's screen with a breathing blue halo, and goes away 1.6 s after the last
|
|
160
|
+
action. Drawn by the emergency-stop guard (`native/BusyIndicator.cs`, commands `busy <hwnd>` / `idle`): always on
|
|
161
|
+
top, borderless, click-through, never activated, absent from the taskbar, excluded from screen captures.
|
|
162
|
+
`NEXUS_WINDOWS_INDICATOR=0` turns it off. Tests: `tests/indicator.test.mjs` (session wiring, guard commands, and the
|
|
163
|
+
native frames rendered by the built helper in `test.ps1`).
|
|
164
|
+
|
|
165
|
+
## [1.6.0] - 2026-10-20 — Bounded foreground interactions, hardened supply chain
|
|
166
|
+
|
|
167
|
+
### Added
|
|
168
|
+
- **Bounded foreground interaction** (`beginInteraction`, 100 ms to 30 s): one short observe → act → observe
|
|
169
|
+
sequence on transient menus and canvases keeps the same foreground lease, then gives the foreground back; never an
|
|
170
|
+
open-ended lease, refused while the user is active or after the emergency stop.
|
|
171
|
+
- Shared guard-rail policy v2 (nexus-shared): confirmation tied to the exact action, detection of instructions aimed
|
|
172
|
+
at an AI in what is read on screen; currency amounts recognised in any notation (« 4,99 € » = « 4.99 EUR »).
|
|
173
|
+
- OpenSSF Scorecard workflow and badge; Dependabot for GitHub Actions and npm (7-day cooldown).
|
|
174
|
+
|
|
175
|
+
### Changed
|
|
176
|
+
- The policy file now travels with every request to the native helper, so the guardrails also hold in the Codex
|
|
177
|
+
REPL runtime (no `process` global); the helper keeps its Windows environment there.
|
|
178
|
+
- GitHub Actions pinned by commit SHA, checkout without persisted credentials (zizmor clean).
|
|
179
|
+
- Repository renamed to `pironjulien/NexusWindows-Codex`; GitHub redirects the old address.
|
|
180
|
+
- Erasing, resetting or formatting the whole device now needs confirmation too; "erase everything" counts only on a
|
|
181
|
+
reset screen.
|
|
182
|
+
|
|
183
|
+
## [1.5.0] - 2026-10-18 — One shared guardrail policy
|
|
184
|
+
|
|
185
|
+
The same policy as NexusWindows for Claude and for Antigravity (`garde-fous.json`, with a `codex` entry).
|
|
186
|
+
|
|
187
|
+
### Added
|
|
188
|
+
- **Confirmation of irreversible gestures**: paying, calling, sending, publishing, deleting permanently, formatting,
|
|
189
|
+
uninstalling, resetting, cancelling a subscription and making a repository public need `confirm:true`, set only on
|
|
190
|
+
the user's explicit order. The check is on what the gesture triggers: click by selector or by coordinates, Enter,
|
|
191
|
+
Ctrl+Enter, Space, Alt+letter, typed line break, menu command, secondary action. Refused before any input, status
|
|
192
|
+
`confirmation-required` in a batch; a learned recipe is never an order.
|
|
193
|
+
- Embedded copy of the policy (`garde-fous.json`), checked byte-identical to the shared file in the author's
|
|
194
|
+
workspace; `NEXUS_GARDE_FOUS` points to another file.
|
|
195
|
+
- Real validation: every gesture refused and exactly one send after confirmation, on WinForms, Win32 and WPF; hard
|
|
196
|
+
block and fail-closed helper with a real policy file.
|
|
197
|
+
- GitHub Actions workflow running `test.ps1` on Windows (node tests and native helper build), with its badge.
|
|
198
|
+
- README: Privacy section (what is read, where it goes, what is stored, how to remove it).
|
|
199
|
+
|
|
200
|
+
### Changed
|
|
201
|
+
- **Hard block read from the shared policy** instead of a built-in list: the secure desktop, Windows credential
|
|
202
|
+
prompts, password managers (Dashlane, NordPass, RoboForm and LastPass added) and Codex's own application. Missing or
|
|
203
|
+
invalid policy: everything is refused.
|
|
204
|
+
- The helper exposes the access key and the "default button" state of controls.
|
|
205
|
+
|
|
206
|
+
### Removed
|
|
207
|
+
- Refusals the shared policy made free: terminals, consoles (by process and by window class), Windows Security.
|
|
208
|
+
|
|
209
|
+
## [1.4.1] - 2026-10-18
|
|
210
|
+
|
|
211
|
+
Defects found by the cross-agent review of 2026-10-16, fixed at the root.
|
|
212
|
+
|
|
213
|
+
### Fixed
|
|
214
|
+
- **No more double click**: after a background click "sent" with no visible effect after 1.618 s, the session used
|
|
215
|
+
to redo a real click (two actions, reported "verified"). The physical fallback now only happens after a "nothing
|
|
216
|
+
took" read back by the helper; otherwise the result is `sent-unconfirmed`: sent, effect not read back, never
|
|
217
|
+
counted as a success nor replayed.
|
|
218
|
+
- **The user's pause respected everywhere**: `activate()`, `set_value` and Sky's secondary actions (which can give
|
|
219
|
+
focus) wait for the user's pause and go under the shared token, like real input.
|
|
220
|
+
- **Foreground handed back**: under the token, the helper notes the user's active window, then puts it back in front
|
|
221
|
+
at the end if the target application still holds the foreground. If the user switched to another window, nothing
|
|
222
|
+
is taken back from them. The result says so (`foregroundReturned`).
|
|
223
|
+
- **Foreground UIA click**: the user's pause is checked again inside the helper once the token is taken (the wait can
|
|
224
|
+
last 8 s). The `--com-worker` child is bound to the helper (Job Object): it dies with it and can no longer act
|
|
225
|
+
afterwards. Node timeouts exceed the helper's (token wait + action).
|
|
226
|
+
- **Emergency stop**: the token wait (8 s) stops as soon as the hotkey is pressed, every 50 ms. Physical typing goes
|
|
227
|
+
character by character, with a stop check before each one (before: every 48 letters).
|
|
228
|
+
- **Guard restarted**: if the guard (stop hotkey, user presence) crashes, every action restarts it; while presence is
|
|
229
|
+
unknown, physical input is deferred with a clear message, never sent blind.
|
|
230
|
+
- **Win32 menus**: a command's disabled state is read after `WM_INITMENU` and `WM_INITMENUPOPUP`, like a real
|
|
231
|
+
opening; without an answer, the command is refused ("not verifiable").
|
|
232
|
+
- **Off-screen element**: `IsOffscreen` is read and reported (`flags: ['offscreen']`); a click on an element of which
|
|
233
|
+
nothing is visible in its window is refused.
|
|
234
|
+
- **Window closed during a request**: "refused, nothing sent" instead of "unknown result", and never a fallback to a
|
|
235
|
+
window that is gone.
|
|
236
|
+
- **Application memory**: a lock left by a dead process no longer blocks forever; it carries the pid and the time,
|
|
237
|
+
and is taken over if its holder is dead or if it is too old.
|
|
238
|
+
|
|
239
|
+
### Added
|
|
240
|
+
- Tests: new and rewritten Node tests for the points above (double action, pause and token, foreground handed back,
|
|
241
|
+
stop while typing, guard restarted, unknown presence, off-screen element, orphan lock).
|
|
242
|
+
|
|
243
|
+
### Changed
|
|
244
|
+
- README renamed to NexusWindows for Codex, the Codex edition of the NexusWindows family: badges, banner, links to
|
|
245
|
+
the other Nexus projects and to the project page (julienpiron.fr/nexuswindows).
|
|
246
|
+
|
|
247
|
+
## [1.4.0] - 2026-10-16
|
|
248
|
+
|
|
249
|
+
Fixes measured by the cross-agent bench of 2026-10-16 (16/20 in the morning with 1.3.0, 19/20 after).
|
|
250
|
+
|
|
251
|
+
### Added
|
|
252
|
+
- Drop-down lists: Win32/WinForms combo box opened and closed by `CB_SHOWDROPDOWN`, read back by
|
|
253
|
+
`CB_GETDROPPEDSTATE`; options read by messages as `list`/`listitem` nodes, open or not.
|
|
254
|
+
- Windows excluded by class: every console or terminal window (`ConsoleWindowClass`, `PseudoConsoleWindow`,
|
|
255
|
+
`CASCADIA_HOSTING_WINDOW_CLASS`) is refused whatever process Windows attributes it to.
|
|
256
|
+
- `tests/postcondition.test.mjs`; `tests/live/bench-forms.mjs` (bench forms hosted by `powershell.exe`, run by
|
|
257
|
+
`test.ps1 -Full`, with a console-class window that must be refused and the foreground sampled every 20 ms).
|
|
258
|
+
|
|
259
|
+
### Changed
|
|
260
|
+
- The tree is read with the COM UI Automation client in one round trip (`CacheRequest`, `Subtree` scope); the managed
|
|
261
|
+
`System.Windows.Automation` client is no longer loaded anywhere. About 50 ms per bench form instead of 150 to 300 ms;
|
|
262
|
+
the bench task takes 1.2 to 1.4 s instead of 4 to 8 s.
|
|
263
|
+
- For an action, only the target and its ancestors are read again (by runtime identity); any difference is refused.
|
|
264
|
+
- Graphical windows hosted by `powershell.exe`, `cmd` or `pwsh` are allowed (the whole process was refused).
|
|
265
|
+
|
|
266
|
+
### Fixed
|
|
267
|
+
- A postcondition already true before the action no longer skips it unless it is a precise state the action changes;
|
|
268
|
+
a postcondition that only restates the target is refused before any input (1.3.0 skipped "Validate").
|
|
269
|
+
- Opening a WinForms list was wrongly `already-satisfied` (its items always exist in the tree).
|
|
270
|
+
- Choosing in an open list: the list is closed first (that close is a cancel which restored the previous choice),
|
|
271
|
+
then `CB_SETCURSEL` + `CBN_SELCHANGE` + `CBN_SELENDOK`; the choice is proven by the combo box `value`.
|
|
272
|
+
- WPF: following the combo box popup lost every control of the form ("found 0"); transient popups are no longer
|
|
273
|
+
followed, and a combo box is closed again after any choice.
|
|
274
|
+
|
|
275
|
+
## [1.3.0] - 2026-10-16
|
|
276
|
+
|
|
277
|
+
Version numbers now follow the upstream project (1.1.x and 1.2.x were never published here).
|
|
278
|
+
|
|
279
|
+
### Added
|
|
280
|
+
- Background-first actions in the .NET helper, tried before Codex's physical input: direct Win32 messages
|
|
281
|
+
(`BN_CLICKED`, `BM_SETCHECK`, `EM_SETSEL` + `EM_REPLACESEL`, `CB_SETCURSEL`/`LB_SETCURSEL` with notification,
|
|
282
|
+
`TCM_SETCURFOCUS`, menu `WM_COMMAND`) and COM UI Automation with `AutoSetFocus = FALSE`. New `select` and `menu` actions.
|
|
283
|
+
- COM-only child process (`--com-worker`) for UIA patterns: measured that a COM Invoke/Toggle from a process that has
|
|
284
|
+
used `System.Windows.Automation` activates the target window despite `AutoSetFocus = FALSE`.
|
|
285
|
+
- Per-technique read-back (`applied`, `none`, `sent`); physical fallback only when nothing applied, or when the
|
|
286
|
+
postcondition is unmet and nothing observable changed; `fallback:false`; results report `technique`, `mechanism`,
|
|
287
|
+
`foregroundTaken`, `attempts`.
|
|
288
|
+
- Native capture `observe({capture:'native'})`: `PrintWindow(PW_RENDERFULLCONTENT)`, per-monitor DPI, DWM frame crop,
|
|
289
|
+
blank-image detection with fallback to Sky's screenshot.
|
|
290
|
+
- `actBatch(obs, steps)`: up to 32 verified steps in one call, stopping at the first unmet step.
|
|
291
|
+
- Related windows followed without a new `bind` (owned dialogs, modals, same-process popups); `windowStack`,
|
|
292
|
+
`windowChange`.
|
|
293
|
+
- User presence through Raw Input in the `--stop-guard` process; wait for a 1.618 s pause before physical input,
|
|
294
|
+
chunked typing interrupted when the user takes over; `presenceStatus()`.
|
|
295
|
+
- Shared emergency stop (Ctrl+Alt+Shift+Esc, `%USERPROFILE%\.nexus\stop`) in the session and in the helper;
|
|
296
|
+
`emergencyStopStatus()`.
|
|
297
|
+
- Shared foreground token (`%USERPROFILE%\.nexus\foreground.lock`) for physical input and foreground UIA.
|
|
298
|
+
- `install.ps1` (builds the helper, installs the skill) and a real validation `tests/live/background.live.mjs`
|
|
299
|
+
run by `test.ps1 -Full`.
|
|
300
|
+
|
|
301
|
+
### Changed
|
|
302
|
+
- 100 JavaScript tests (95 offline, 5 real-environment tests run by `-Full`).
|
|
303
|
+
|
|
304
|
+
## [1.0.0] - 2026-10-14
|
|
305
|
+
|
|
306
|
+
### Added
|
|
307
|
+
- Native Microsoft UI Automation helper on isolated MTA thread in C# (.NET 8).
|
|
308
|
+
- Observation coordinator with verified postconditions and dynamic cache invalidation.
|
|
309
|
+
- Deterministic session manager preventing focus theft, stale observations and duplicate actions.
|
|
310
|
+
- 59 comprehensive unit and integration tests passing in under 1 second.
|
|
311
|
+
- OpenAI Codex desktop integration skill and documentation.
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Julien Piron (https://julienpiron.fr)
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|