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 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.