nexus-windows-codex 3.1.1 → 3.1.2
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 +15 -0
- package/README.md +1 -2
- package/lib/garde-fous.mjs +2 -2
- package/lib/journal.mjs +7 -3
- package/lib/mcp.mjs +1 -1
- package/lib/session.mjs +2 -2
- package/lib/tree.mjs +1 -1
- package/native/bin/NexusCodex.UIA.exe +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,21 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [3.1.2] - 2026-10-25 — Docs that match the code
|
|
11
|
+
|
|
12
|
+
### Fixed
|
|
13
|
+
- The shared action journal recorded version `3.0.0` for every release: the version is now read from `package.json`.
|
|
14
|
+
- The shared policy is looked up in the author's current layout; the embedded `garde-fous.json` stays the copy used by
|
|
15
|
+
the npm package (no behaviour change for npm installs).
|
|
16
|
+
- SKILL.md and the API reference describe the code as it is: physical fallback by the helper's own real input
|
|
17
|
+
(`physical:native`) before Sky's, native WebP captures usable as `screenshotId` for a background click or wheel,
|
|
18
|
+
background keys and Ctrl/Shift shortcuts in Win32 and WinForms, wheel at a point in Win32, WinForms, WPF, Tk and
|
|
19
|
+
Chromium started with a DevTools port; product name NexusWindows for Codex; installer path neutral.
|
|
20
|
+
- README: the measurements section no longer points to the French-only validation archive.
|
|
21
|
+
|
|
22
|
+
### Removed
|
|
23
|
+
- `VALIDATION.md` (French archive of the 1.x validations).
|
|
24
|
+
|
|
10
25
|
## [3.1.1] - 2026-10-24 — Numbers on the image
|
|
11
26
|
|
|
12
27
|
### Added
|
package/README.md
CHANGED
|
@@ -335,8 +335,7 @@ test.ps1 offline check; -Full adds the real validation
|
|
|
335
335
|
|
|
336
336
|
## Measurements
|
|
337
337
|
|
|
338
|
-
|
|
339
|
-
French). Windows shown without activation at the bottom of the z-order, the Win32 one covered by the WinForms one.
|
|
338
|
+
Real validation of October 15, 2026 on the repository's own fixture (`tests/live`, run by `test.ps1 -Full`). Windows shown without activation at the bottom of the z-order, the Win32 one covered by the WinForms one.
|
|
340
339
|
Each action: postcondition verified, event counted by the application, foreground unchanged, cursor still.
|
|
341
340
|
|
|
342
341
|
| Action | Technique | Duration (input and read-backs) |
|
package/lib/garde-fous.mjs
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
// résilier, passer un dépôt en public) exige `confirm:true` sur l'action, posé seulement sur l'ordre explicite de Julien
|
|
6
6
|
// ou après son oui. Le contrôle porte sur CE QUE LE GESTE DÉCLENCHE, pas sur sa forme : clic par sélecteur ou en
|
|
7
7
|
// coordonnées, Entrée, Ctrl+Entrée, Espace, Alt+lettre, saut de ligne tapé, menu, action secondaire.
|
|
8
|
-
// Fichier lu : NEXUS_GARDE_FOUS s'il est donné, sinon la politique commune de
|
|
8
|
+
// Fichier lu : NEXUS_GARDE_FOUS s'il est donné, sinon la politique commune de NexusWindows (`../../commun`), sinon la
|
|
9
9
|
// copie embarquée (version publique ; un test vérifie qu'elle est identique). Absent ou invalide : refus (échec fermé).
|
|
10
10
|
import { createHash, randomBytes } from 'node:crypto';
|
|
11
11
|
import { readFileSync, statSync, existsSync } from 'node:fs';
|
|
@@ -13,7 +13,7 @@ import path from 'node:path';
|
|
|
13
13
|
import { fileURLToPath } from 'node:url';
|
|
14
14
|
|
|
15
15
|
const here = path.dirname(fileURLToPath(import.meta.url));
|
|
16
|
-
export const SHARED_POLICY = path.resolve(here, '..', '..', '
|
|
16
|
+
export const SHARED_POLICY = path.resolve(here, '..', '..', 'commun', 'garde-fous.json');
|
|
17
17
|
export const EMBEDDED_POLICY = path.resolve(here, '..', 'garde-fous.json');
|
|
18
18
|
export const AGENT = 'codex';
|
|
19
19
|
const TRIGGER_DEPTH = 8; // ancêtres remontés depuis un texte ou une icône jusqu'à son bouton
|
package/lib/journal.mjs
CHANGED
|
@@ -1,11 +1,15 @@
|
|
|
1
|
-
// Journal commun des trois Nexus Windows (NexusHarness/
|
|
1
|
+
// Journal commun des trois Nexus Windows (NexusHarness/NexusShared/journal/FORMAT.md) : une ligne par action, sans texte
|
|
2
2
|
// d'écran (ni texte tapé, ni libellé, ni titre). Écriture synchrone et silencieuse : un journal ne bloque jamais une
|
|
3
3
|
// action, y compris dans un runtime REPL sans objet global `process` (relecture de Codex du 23/10).
|
|
4
|
-
import { appendFileSync, mkdirSync } from 'node:fs';
|
|
4
|
+
import { appendFileSync, mkdirSync, readFileSync } from 'node:fs';
|
|
5
5
|
import os from 'node:os';
|
|
6
6
|
import path from 'node:path';
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
// Version de l'outil : celle de package.json (jamais écrite en dur, comme stop.mjs).
|
|
9
|
+
const VERSION = (() => {
|
|
10
|
+
try { return JSON.parse(readFileSync(new URL('../package.json', import.meta.url), 'utf8')).version ?? 'unknown'; }
|
|
11
|
+
catch { return 'unknown'; }
|
|
12
|
+
})();
|
|
9
13
|
const ISSUES = {
|
|
10
14
|
verified: '✓', already: '=', 'already-satisfied': '=', observed: '~', 'sent-unconfirmed': '~', unmet: '~',
|
|
11
15
|
unknown: '~', interrupted: '~', refused: 'refus', 'confirmation-required': 'refus', 'julien-active': 'différé',
|
package/lib/mcp.mjs
CHANGED
|
@@ -97,7 +97,7 @@ function errorStatus(error) {
|
|
|
97
97
|
}
|
|
98
98
|
|
|
99
99
|
// Observation lisible par le modèle : arbre et état, plus l'image native jointe (fichier local, jamais copiée ailleurs).
|
|
100
|
-
// Pas d'image en double (règle commune des produits Nexus,
|
|
100
|
+
// Pas d'image en double (règle commune des produits Nexus, NexusShared/images.md) : mêmes octets (encodeur WebP déterministe :
|
|
101
101
|
// mêmes pixels), mêmes dimensions et même cadre écran que la dernière image envoyée pour cette fenêtre (ou ce zoom) →
|
|
102
102
|
// non jointe, la réponse dit quel identifiant prend les points. `always` (mode image) la joint toujours. `received` :
|
|
103
103
|
// appelé pour chaque image que le modèle a réellement (jointe, ou identique à la dernière envoyée), jamais pour une
|
package/lib/session.mjs
CHANGED
|
@@ -557,7 +557,7 @@ export class WindowsSession {
|
|
|
557
557
|
if (!sameWindow(current, this.#window)) throw new Error('Window identity changed; bind it again');
|
|
558
558
|
const useNative = nativeOnly || backend === 'native' || (backend === 'auto' && this.#nativePreferred);
|
|
559
559
|
// Capture propre (PrintWindow, fenêtre recouverte, sans premier plan) ; image vide ou échec : capture Sky.
|
|
560
|
-
// Numéros [N] (
|
|
560
|
+
// Numéros [N] (NexusShared/images.md point 5, avis de Codex du 24/10) : arbre natif lu AVANT la capture, une seule fois et
|
|
561
561
|
// sous le même verrou ; ses index et rectangles vont au helper, qui ne les dessine que si le cadre de la fenêtre est
|
|
562
562
|
// resté celui de la lecture. L'âge de l'observation part du début de cette lecture (FRESH_MS).
|
|
563
563
|
let marksNote = null, preread = null, treeStartedAt = null, candidates = null;
|
|
@@ -1484,7 +1484,7 @@ export class WindowsSession {
|
|
|
1484
1484
|
}
|
|
1485
1485
|
#record(kind, status, durationMs, technique = null, foreground = null) {
|
|
1486
1486
|
this.#metrics.push({ kind, status, technique, durationMs, at: new Date().toISOString() });
|
|
1487
|
-
// Journal commun des trois Nexus Windows (
|
|
1487
|
+
// Journal commun des trois Nexus Windows (NexusShared/journal/FORMAT.md) : sans texte d'écran, jamais bloquant.
|
|
1488
1488
|
try { writeJournal(journalLine({ session: this.#sessionId, app: this.#window?.app, kind, status, technique, durationMs, foreground })); }
|
|
1489
1489
|
catch { /* journal : jamais bloquant */ }
|
|
1490
1490
|
}
|
package/lib/tree.mjs
CHANGED
|
@@ -20,7 +20,7 @@ const stateFlags = new Set(['disabled', 'selected', 'unselected', 'selectable',
|
|
|
20
20
|
'settable', 'string', 'float', 'integer', 'boolean']);
|
|
21
21
|
export const digest = value => createHash('sha256').update(value).digest('hex');
|
|
22
22
|
|
|
23
|
-
// Numéros [N] sur l'image (
|
|
23
|
+
// Numéros [N] sur l'image (NexusShared/images.md point 5) : éléments natifs avec un rectangle, hors racine et hors éléments
|
|
24
24
|
// dits hors écran. auto : contrôles sans nom (espaces compris) qu'on peut viser ; all : tous. scope : HWND porteur le plus
|
|
25
25
|
// proche (l'élément ou un ancêtre), que le helper compare à la fenêtre capturée (menu surgissant d'une autre fenêtre :
|
|
26
26
|
// jamais d'étiquette fantôme). Index EXACT de la ligne de l'arbre, jamais renuméroté.
|
package/package.json
CHANGED