Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
236 commits
Select commit Hold shift + click to select a range
4a7f46f
test(core): require typed browser operation capability binding
seonghobae Aug 12, 2026
c6d370e
style(core): format typed browser operation contract
seonghobae Aug 12, 2026
7a6f0e2
feat(core): derive adapter capability from typed browser operation
seonghobae Aug 12, 2026
4c4868f
style(core): format typed operation dispatch boundary
seonghobae Aug 13, 2026
9acbac7
docs(changelog): record typed browser operation binding
seonghobae Aug 13, 2026
751ae00
merge: align typed browser operation capabilities with current epoch …
seonghobae Aug 15, 2026
68fed65
merge: preserve browser lifetime authority in typed operation binding
seonghobae Aug 16, 2026
9935292
test: define buyer-visible browser operation vocabulary
seonghobae Aug 16, 2026
06635ab
feat(core): bind buyer-visible browser operation vocabulary
seonghobae Aug 16, 2026
d1d5c73
test(core): require bounded BiDi accessibility query
seonghobae Aug 16, 2026
341ccdc
style(core): apply canonical BiDi query test formatting
seonghobae Aug 16, 2026
ad3b5a2
feat(core): bound WebDriver BiDi accessibility query
seonghobae Aug 16, 2026
750348a
feat(core): export bounded BiDi accessibility query
seonghobae Aug 16, 2026
7fc113d
style(core): apply canonical BiDi query exports
seonghobae Aug 16, 2026
fd66444
test(core): require minimal BiDi node serialization
seonghobae Aug 16, 2026
75356e0
feat(core): minimize BiDi node serialization surface
seonghobae Aug 16, 2026
8a18184
feat(core): export minimal BiDi serialization limits
seonghobae Aug 16, 2026
b649787
test(bidi): reject over-budget locateNodes results
seonghobae Aug 16, 2026
7faa2c6
fix(bidi): revalidate locateNodes result budget
seonghobae Aug 16, 2026
d99181b
docs(changelog): record BiDi result budget revalidation
seonghobae Aug 16, 2026
b45c40b
test(bidi): require bounded remote node references
seonghobae Aug 16, 2026
64d7630
feat(core): admit bounded BiDi remote node references
cursoragent Aug 16, 2026
601628b
test(core): reject control-bearing BiDi locator text
cursoragent Aug 16, 2026
496f556
feat(core): reject control-bearing BiDi locator text
cursoragent Aug 16, 2026
9f38940
test(bidi): bind locateNodes results to current authority
cursoragent Aug 16, 2026
ce0af01
test(bidi): fix locateNodes admission test syntax
cursoragent Aug 16, 2026
5ee16f1
feat(core): bind locateNodes results to current authority
cursoragent Aug 16, 2026
2533394
test(bidi): require QueryNodes capability before node admission
cursoragent Aug 16, 2026
4186437
feat(core): admit locateNodes only after QueryNodes proof
cursoragent Aug 16, 2026
87e1e71
docs: record QueryNodes SemanticObservation admission boundary
cursoragent Aug 16, 2026
685d517
test(core): reject Unicode format locator and identifier text
cursoragent Aug 16, 2026
816fa1f
feat(core): reject Unicode format protocol text
cursoragent Aug 16, 2026
ef4a3b7
docs: cite UTS 39 and UAX 9 for format-character rejection
cursoragent Aug 16, 2026
c0e3d8e
test(core): require SemanticObservation proof to bind locateNodes
cursoragent Aug 16, 2026
d6a7998
feat(core): consume SemanticObservation proof in bind_current_nodes
cursoragent Aug 16, 2026
d83fec0
style(core): rustfmt locateNodes proof-admission tests
cursoragent Aug 16, 2026
2cd4ad5
test(core): forbid public raw node minting
seonghobae Aug 16, 2026
35cc131
fix(core): encapsulate raw browser node minting
seonghobae Aug 16, 2026
a7e7bd7
fix(core): expose guarded browser authority registry
seonghobae Aug 16, 2026
7b6ecbc
test(core): route public node tests through semantic admission
seonghobae Aug 16, 2026
00f6268
test(core): route origin binding node discovery through admission
seonghobae Aug 16, 2026
530e440
style(core): apply canonical rustfmt to browser authority tests
seonghobae Aug 16, 2026
761d4be
test(core): permit fixture expect calls in admission regression
seonghobae Aug 16, 2026
04560b8
test(core): require atomic locateNodes batch admission
seonghobae Aug 17, 2026
b972931
test(core): apply canonical rustfmt to atomic admission regression
seonghobae Aug 17, 2026
8916235
test(core): reach atomic locateNodes admission boundary
seonghobae Aug 17, 2026
deee9e0
fix(core): make locateNodes authority binding atomic
seonghobae Aug 17, 2026
c18bd19
test(core): exercise atomic browser binding coverage path
seonghobae Aug 17, 2026
cca7e56
style(core): apply canonical rustfmt to atomic binding tests
seonghobae Aug 17, 2026
eec935e
test(core): reject CDP proof at BiDi node admission
seonghobae Aug 17, 2026
dcb77be
test(core): apply canonical BiDi protocol-kind regression formatting
seonghobae Aug 17, 2026
1671042
test(core): cover protocol-confusion error contract
seonghobae Aug 17, 2026
65e849c
fix(core): bind BiDi node admission to protocol family
seonghobae Aug 17, 2026
ec6293e
fix(core): apply canonical protocol-kind gate formatting
seonghobae Aug 17, 2026
0bd1878
test(core): define locateNodes command serialization contract
seonghobae Aug 17, 2026
09de2a1
style(core): apply canonical locateNodes test formatting
seonghobae Aug 17, 2026
542d180
feat(core): serialize bounded locateNodes command envelopes
seonghobae Aug 17, 2026
75d0ef1
feat(core): export bounded locateNodes command contract
seonghobae Aug 17, 2026
82bdd73
style(core): apply canonical locateNodes command formatting
seonghobae Aug 17, 2026
1844676
docs(changelog): record BiDi locateNodes serialization
seonghobae Aug 17, 2026
d28836a
docs(doctoring): ground BiDi command serialization
seonghobae Aug 17, 2026
15f5988
test(core): require BiDi locateNodes response correlation
seonghobae Aug 17, 2026
39a73bb
test(core): format BiDi response correlation RED
seonghobae Aug 17, 2026
5abc70f
feat(core): correlate BiDi locateNodes response ids
seonghobae Aug 17, 2026
3118635
docs(changelog): record BiDi response correlation
seonghobae Aug 17, 2026
547d9c9
docs(doctoring): ground BiDi response correlation
seonghobae Aug 17, 2026
2ba56af
test(core): require BiDi response envelope semantics
seonghobae Aug 17, 2026
4bf783e
style(core): canonicalize BiDi envelope regression
seonghobae Aug 17, 2026
45ed6b0
feat(core): retain WebDriver BiDi response envelope kind
seonghobae Aug 17, 2026
b088f23
feat(core): export BiDi response envelope contract
seonghobae Aug 17, 2026
640289b
style(core): canonicalize BiDi envelope exports
seonghobae Aug 17, 2026
67e57de
docs(changelog): record BiDi response envelope correlation
seonghobae Aug 17, 2026
4690320
test(core): require fail-closed BiDi success evidence conversion
seonghobae Aug 17, 2026
c6fac94
feat(core): reject BiDi error envelopes from success evidence
seonghobae Aug 17, 2026
13a8a1a
style(core): apply canonical BiDi error formatting
seonghobae Aug 17, 2026
d251ca5
test(core): bind locateNodes result budget to correlated response
seonghobae Aug 17, 2026
c11f46b
style(core): apply canonical rustfmt to result-budget regression
seonghobae Aug 17, 2026
429b02b
fix(core): bind locateNodes result budget to correlated success
seonghobae Aug 17, 2026
9a53a5c
test(core): require correlated locateNodes result admission
seonghobae Aug 17, 2026
86a18c5
style(core): apply canonical locateNodes result test formatting
seonghobae Aug 17, 2026
e9a47b6
feat(core): admit correlated locateNodes result batches
seonghobae Aug 17, 2026
fe8bbf2
feat(core): export correlated locateNodes result admission
seonghobae Aug 17, 2026
2c535b8
test(core): require correlated result authority binding
seonghobae Aug 17, 2026
3488eea
style(core): apply canonical correlated result test formatting
seonghobae Aug 17, 2026
44ddc32
test(core): isolate correlated result authority RED
seonghobae Aug 17, 2026
61508eb
feat(core): bind correlated context identifiers fail-closed
seonghobae Aug 17, 2026
8ce29ea
feat(core): expose crate-private context identity check
seonghobae Aug 17, 2026
cfee13a
feat(core): bind correlated locateNodes results to current authority
seonghobae Aug 17, 2026
31faaac
test(core): cover missing origin binding rejection
seonghobae Aug 17, 2026
67d0a3b
test(core): require bounded BiDi response documents
seonghobae Aug 18, 2026
192b6f2
test(core): format BiDi response document RED
seonghobae Aug 18, 2026
810c762
feat(core): bound raw BiDi response documents
seonghobae Aug 18, 2026
f4cf87b
feat(core): export BiDi response document boundary
seonghobae Aug 18, 2026
afe81c4
docs: record bounded BiDi response documents
seonghobae Aug 18, 2026
b2c458c
test(core): require bounded BiDi response envelope parsing
seonghobae Aug 18, 2026
89bd3db
style(core): apply canonical BiDi parser test formatting
seonghobae Aug 18, 2026
77eb49b
feat(core): parse bounded BiDi response envelopes
seonghobae Aug 18, 2026
9f924d2
feat(core): expose BiDi response envelope parser
seonghobae Aug 18, 2026
addb63f
style(core): apply canonical response parser formatting
seonghobae Aug 18, 2026
eb086b0
test(core): exercise hostile BiDi response JSON grammar
seonghobae Aug 18, 2026
5c8df76
fix(core): satisfy strict BiDi parser clippy
seonghobae Aug 18, 2026
e455fe8
test(core): cover response parser failure edges
seonghobae Aug 18, 2026
9447879
fix(core): remove unreachable parser error edges
seonghobae Aug 18, 2026
d45118b
test(core): respect bounded response admission boundary
seonghobae Aug 18, 2026
1b157ef
test(core): avoid panic-prone admission assertion
seonghobae Aug 18, 2026
67f5ca3
fix(core): remove unreachable parser coverage branches
seonghobae Aug 18, 2026
e65df25
test(core): require parsed BiDi response correlation
seonghobae Aug 18, 2026
e9d90df
test(core): apply canonical BiDi correlation formatting
seonghobae Aug 18, 2026
5481255
feat(core): correlate bounded BiDi response documents
seonghobae Aug 18, 2026
35a9f42
docs(changelog): record bounded BiDi document correlation
seonghobae Aug 18, 2026
e0b502a
test(core): reject unknown WebDriver BiDi error codes
seonghobae Aug 18, 2026
ebc127c
test(core): format WebDriver BiDi error-code RED
seonghobae Aug 18, 2026
99b4f5d
fix(core): define WebDriver BiDi error-code vocabulary
seonghobae Aug 18, 2026
9b85be5
fix(core): wire WebDriver BiDi error-code validator
seonghobae Aug 18, 2026
e815964
fix(core): reject unknown WebDriver BiDi error codes
seonghobae Aug 18, 2026
5b829fe
style(core): apply canonical rustfmt ordering
seonghobae Aug 18, 2026
f5e087d
test(core): cover current BiDi client-window error
seonghobae Aug 18, 2026
4077a79
fix(core): admit current BiDi client-window error
seonghobae Aug 18, 2026
b7e5ba5
test(core): keep BiDi failure regression panic-free
seonghobae Aug 18, 2026
9d39c59
docs(doctoring): record current BiDi error-code contract
seonghobae Aug 18, 2026
0e8414c
test(core): require wire-derived locateNodes result admission
seonghobae Aug 18, 2026
3ad1c5f
style(core): apply canonical wire-result test formatting
seonghobae Aug 18, 2026
ee545e6
feat(core): admit locateNodes nodes from bounded wire response
seonghobae Aug 18, 2026
2f12879
style(core): apply canonical response document formatting
seonghobae Aug 18, 2026
c8d6d9a
style(core): apply canonical wire node parser formatting
seonghobae Aug 18, 2026
e7b81bc
test(core): cover locateNodes document failure boundaries
seonghobae Aug 18, 2026
16591ab
test(core): keep failure-evidence regressions clippy-clean
seonghobae Aug 18, 2026
858bcf4
test(core): cover locateNodes second-pass parser invariants
seonghobae Aug 18, 2026
da7ffe9
test(core): avoid node debug equality requirement
seonghobae Aug 18, 2026
1b0f6ad
style(core): apply canonical wire-result formatting
seonghobae Aug 18, 2026
cbbc4d6
test(core): cover second-pass parser failure propagation
seonghobae Aug 18, 2026
755ba06
fix(core): keep second-pass string decoding utf8-safe
seonghobae Aug 18, 2026
70d85f9
test(core): cover wire node admission tuple
seonghobae Aug 18, 2026
4089a72
test(core): cover skipped wire result shapes
seonghobae Aug 18, 2026
14a4a39
test(core): cover wire node admission metadata
seonghobae Aug 18, 2026
a2fe264
test(core): prioritize locateNodes result budget
seonghobae Aug 18, 2026
3083e4e
fix(core): enforce locateNodes budget before node decoding
seonghobae Aug 18, 2026
6c3b0bd
fix(core): bind wire parsing to exact result budget
seonghobae Aug 18, 2026
850dbf1
test(core): cover bounded overflow parser invariant
seonghobae Aug 18, 2026
e373a73
test(core): close bounded overflow coverage invariant
seonghobae Aug 18, 2026
dfc522f
test(core): require bounded BiDi byte admission
seonghobae Aug 18, 2026
42c0443
feat(core): admit bounded BiDi response bytes
seonghobae Aug 18, 2026
c80ffdb
test(core): require typed BiDi error-code evidence
seonghobae Aug 18, 2026
f331b32
style(core): canonicalize error-code RED
seonghobae Aug 18, 2026
e9f4dcc
fix(core): retain typed BiDi error-code evidence
seonghobae Aug 18, 2026
358c6e2
test(core): prove every typed BiDi error mapping
seonghobae Aug 18, 2026
6740339
fix(core): restore canonical Rust formatting
seonghobae Aug 18, 2026
a451054
test(core): require wire-to-authority node binding
seonghobae Aug 18, 2026
bcc719f
test(core): format wire authority regression
seonghobae Aug 18, 2026
fda7ea8
feat(core): bind wire locateNodes results to current authority
seonghobae Aug 18, 2026
1ae0c2b
merge: align semantic observation admission with current observed-epo…
seonghobae Aug 19, 2026
c6c1172
merge: align BiDi command serialization with current semantic admission
seonghobae Aug 19, 2026
c4c9fce
merge: align BiDi response correlation with current command serializa…
seonghobae Aug 19, 2026
b0c29ac
test(core): cover BiDi bind admission failure
seonghobae Aug 19, 2026
257d9a2
test(core): require typed BiDi protocol errors
seonghobae Aug 19, 2026
ef4f554
style(core): apply canonical rustfmt to BiDi RED
seonghobae Aug 19, 2026
5441594
fix(core): preserve correlated BiDi protocol errors
seonghobae Aug 19, 2026
cdf0d8f
style(core): apply canonical rustfmt to BiDi error preservation
seonghobae Aug 19, 2026
d883f9a
test(core): align BiDi wire error regression with typed protocol pres…
seonghobae Aug 19, 2026
910c519
style(core): apply canonical rustfmt to BiDi wire regression
seonghobae Aug 19, 2026
291bbac
fix(core): remove unreachable BiDi success-conversion edge
seonghobae Aug 19, 2026
a11b838
test(core): cover nullable BiDi error admission
seonghobae Aug 19, 2026
2687529
test(core): require bounded BiDi WebSocket endpoint admission
seonghobae Aug 19, 2026
a1c4cb5
style(core): canonicalize BiDi WebSocket endpoint RED
seonghobae Aug 19, 2026
dbdff70
style(core): apply canonical rustfmt to endpoint RED
seonghobae Aug 19, 2026
3d2c408
feat(core): admit bounded BiDi WebSocket endpoints
seonghobae Aug 19, 2026
e0ec37e
style(core): apply canonical endpoint rustfmt
seonghobae Aug 19, 2026
bebb1e1
test(core): cover malformed BiDi endpoint authorities
seonghobae Aug 19, 2026
8054128
fix(core): remove unreachable IPv4 endpoint branch
seonghobae Aug 19, 2026
42bfbed
test(core): cover empty BiDi endpoint authority
seonghobae Aug 19, 2026
bc042ee
test(core): format BiDi WebSocket endpoint regressions
seonghobae Aug 19, 2026
5d7906a
test(core): require exact BiDi endpoint session correlation
seonghobae Aug 19, 2026
96fdd9d
style(core): apply canonical BiDi session-correlation formatting
seonghobae Aug 19, 2026
c4d2e4d
feat(core): correlate BiDi endpoint with exact session
seonghobae Aug 19, 2026
45935f5
feat(core): export correlated BiDi endpoint contract
seonghobae Aug 19, 2026
70461f1
style(core): apply canonical session-correlation formatting
seonghobae Aug 19, 2026
4047cef
docs(changelog): record BiDi session correlation
seonghobae Aug 19, 2026
48ad304
test(core): require explicit BiDi connect target
seonghobae Aug 19, 2026
3cc6711
test(core): format explicit BiDi connect target regressions
seonghobae Aug 19, 2026
2e9898d
feat(core): derive explicit BiDi loopback connect targets
seonghobae Aug 19, 2026
aace3a8
feat(core): export explicit BiDi connect target contract
seonghobae Aug 19, 2026
2e43ad6
style(core): format explicit BiDi connect target
seonghobae Aug 19, 2026
6a21bed
test(core): require BiDi connect target changelog evidence
seonghobae Aug 19, 2026
7e30360
docs(core): record explicit BiDi connect target boundary
seonghobae Aug 19, 2026
dc5cfd8
test(core): preserve BiDi endpoint across resolver handoff
seonghobae Aug 19, 2026
3a9506c
fix(core): retain correlated BiDi endpoint on resolver handoff
seonghobae Aug 19, 2026
d34c528
test(core): require exact BiDi socket peer verification
seonghobae Aug 19, 2026
d7cf226
feat(core): verify exact BiDi socket peer
seonghobae Aug 19, 2026
89fc9c3
feat(core): export verified BiDi peer contract
seonghobae Aug 19, 2026
f62d204
test(core): require BiDi socket-peer release evidence
seonghobae Aug 19, 2026
d52cdfe
docs(changelog): record BiDi socket-peer verification
seonghobae Aug 19, 2026
fa510a0
fix(changelog): preserve direct TCP release wording
seonghobae Aug 19, 2026
fcde975
test(network): require bounded BiDi loopback TCP connection
seonghobae Aug 19, 2026
aef0ac7
test(network): format BiDi TCP RED contract
seonghobae Aug 19, 2026
1de304b
feat(network): connect exact BiDi loopback transport
seonghobae Aug 19, 2026
ccb7d31
feat(network): export bounded BiDi TCP transport
seonghobae Aug 19, 2026
b4ce10d
refactor(network): isolate BiDi transport errors
seonghobae Aug 19, 2026
8ed075c
test(network): isolate BiDi transport resilience coverage
seonghobae Aug 19, 2026
ec66b21
refactor(network): keep BiDi transport boundary focused
seonghobae Aug 19, 2026
755d626
test(network): apply canonical BiDi resilience formatting
seonghobae Aug 19, 2026
fd91248
fix(network): remove unused BiDi error imports
seonghobae Aug 19, 2026
975e2e2
docs(changelog): record bounded BiDi TCP transport
seonghobae Aug 19, 2026
c491464
test(network): require consumable BiDi TCP evidence
seonghobae Aug 19, 2026
6aab73c
feat(network): hand off verified BiDi TCP evidence
seonghobae Aug 19, 2026
18703be
docs(changelog): record BiDi TCP evidence handoff
seonghobae Aug 19, 2026
11a533d
test(network): require bounded BiDi WebSocket opening request
seonghobae Aug 19, 2026
9803303
feat(network): bind BiDi WebSocket opening request
seonghobae Aug 19, 2026
8b8f664
test(network): cover BiDi handshake diagnostics
seonghobae Aug 19, 2026
73f2fbd
test(network): close BiDi handshake branch coverage
seonghobae Aug 19, 2026
d39d0d3
test(network): retain BiDi WebSocket client key
seonghobae Aug 19, 2026
ccfc641
fix(network): retain BiDi WebSocket client key
seonghobae Aug 19, 2026
2495b5a
test(core): cover ChromeDriver session id compatibility
seonghobae Aug 19, 2026
baf917c
fix(core): accept canonical ChromeDriver session ids
seonghobae Aug 19, 2026
ba38e2c
merge: carry ChromeDriver session compatibility into correlation
seonghobae Aug 19, 2026
d8f45f8
merge: carry ChromeDriver session compatibility into connect targets
seonghobae Aug 21, 2026
036412a
merge: carry ChromeDriver session compatibility into socket peer veri…
seonghobae Aug 21, 2026
e441948
merge: carry ChromeDriver session compatibility into BiDi TCP transport
seonghobae Aug 21, 2026
b036e47
merge: carry ChromeDriver session compatibility into BiDi handshake r…
seonghobae Aug 21, 2026
30da73a
test(network): redact WebSocket client nonce debug
seonghobae Aug 22, 2026
6922dd9
fix(network): redact WebSocket client nonce debug
seonghobae Aug 22, 2026
e1ad7f4
Merge pull request #193 from ContextualWisdomLab/feat/webdriver-bidi-…
seonghobae Aug 26, 2026
1db9faa
Merge pull request #191 from ContextualWisdomLab/feat/webdriver-bidi-…
seonghobae Aug 26, 2026
37e5688
Merge pull request #189 from ContextualWisdomLab/feat/webdriver-bidi-…
seonghobae Aug 26, 2026
09736e2
Merge pull request #190 from ContextualWisdomLab/feat/webdriver-bidi-…
seonghobae Aug 26, 2026
0b0a9e0
Merge pull request #188 from ContextualWisdomLab/feat/webdriver-bidi-…
seonghobae Aug 26, 2026
7a08c38
Merge pull request #185 from ContextualWisdomLab/feat/webdriver-bidi-…
seonghobae Aug 26, 2026
225eb45
Merge pull request #192 from ContextualWisdomLab/feat/webdriver-bidi-…
seonghobae Aug 26, 2026
82f9be4
docs: record correlated BiDi result admission
seonghobae Aug 26, 2026
788ae6d
Merge pull request #182 from ContextualWisdomLab/feat/webdriver-bidi-…
seonghobae Aug 26, 2026
fd8aec7
Merge pull request #184 from ContextualWisdomLab/feat/webdriver-bidi-…
seonghobae Aug 26, 2026
2d7d25f
fix(core): require BiDi response classification
seonghobae Aug 26, 2026
05a5234
Merge pull request #181 from ContextualWisdomLab/feat/webdriver-bidi-…
seonghobae Aug 26, 2026
889659e
docs(core): avoid private correlation links
seonghobae Aug 26, 2026
749cb24
Merge pull request #183 from ContextualWisdomLab/feat/webdriver-bidi-…
seonghobae Aug 26, 2026
51d4182
Merge pull request #186 from ContextualWisdomLab/feat/webdriver-bidi-…
seonghobae Aug 26, 2026
bdb7bcb
Merge remote-tracking branch 'origin/feat/browser-context-origin-prot…
seonghobae Aug 26, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion ARCHITECTURE.md
Original file line number Diff line number Diff line change
Expand Up @@ -166,7 +166,7 @@ Observation should prefer the most structured trustworthy source available:
4. accessibility tree combined with DOM and layout;
5. screenshot or vision fallback for canvas and inaccessible custom interfaces.

Raw HTML is not the default model input. Full snapshots are followed by incremental semantic diffs, versioned by document epoch. Node references become invalid after navigation or epoch change.
Raw HTML is not the default model input. Full snapshots are followed by incremental semantic diffs, versioned by document epoch. Node references become invalid after navigation or epoch change. An untrusted WebDriver BiDi `locateNodes` result becomes an `ObservedNodeHandle` only after the adapter transfers a non-cloneable `QueryNodes` / `SemanticObservation` protocol-use proof into `bind_current_nodes` and the exact current session, browsing context, canonical origin, and document epoch still match. Navigation or TypedInput proofs fail closed. That control-plane composition does not perform browser I/O or authorize typed input.

## 8. Action lifecycle

Expand Down
16 changes: 16 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,29 @@ All notable changes to OriginWeave are documented in this file. The format follo

### Added

- Bounded WebDriver BiDi loopback TCP transport that consumes one exact no-DNS connect target, retries only explicitly recoverable local transport failures within repository timeout and attempt ceilings, exposes the stream only after operating-system peer inspection and exact peer verification, supports a consuming handoff of the original stream with typed credential-free peer/session/TLS and bounded-attempt evidence, preserves typed causal errors, and performs no DNS, proxy/PAC, process authentication, TLS, WebSocket, BiDi message, browser-action, or Agent-authority step.
- Exact WebDriver BiDi socket-peer verification that consumes an approved no-DNS connect target, requires the observed IP address and port to match exactly, preserves the TLS requirement and exact correlated session id, and remains inert metadata that does not authenticate an OS process, does not negotiate TLS, perform a WebSocket handshake, or grant Agent authority.
- Explicit no-DNS WebDriver BiDi loopback connection targets that derive exact IPv4/IPv6 loopback `SocketAddr` metadata from a session-correlated endpoint, reject `localhost` as requiring separately trusted name resolution, preserve the TLS requirement and exact session id, perform no socket I/O, and grant no Agent authority.
- Rust workspace for independently reusable core, policy, destination, network, TLS, resource, and evidence modules.
- Versioned browser-protocol adapter metadata that distinguishes WebDriver BiDi from pinned CDP, binds bounded adapter/browser revision tokens to an explicit duplicate-free capability set, normalizes capability-set identity independently of caller ordering, and exposes typed fail-closed capability requirements without granting browser, action, network, or secret authority by protocol kind alone.
- Canonical OriginWeave protocol-version parsing for exact `originweave/<major>.<minor>` syntax, with typed fail-closed rejection of malformed, ambiguous, overflowed, or noncanonical serialized generations; parsing does not negotiate compatibility or grant adapter authority.
- Atomic browser-protocol use validation that requires the exact OriginWeave protocol generation, caller-supplied runtime protocol family, exact pinned runtime protocol/browser revisions, and an explicitly declared capability in deterministic fail-closed order before producing non-cloneable validation evidence; this metadata proof does not authenticate the adapter or grant browser/Agent authority.
- Runtime browser-adapter version binding at the atomic protocol-use boundary: the caller-supplied bounded adapter-version token must exactly match the reviewed descriptor version before runtime revision or capability checks can succeed, preventing adapter-build drift from silently reusing otherwise matching protocol/browser metadata without authenticating or attesting the adapter process.
- Same-call browser-protocol dispatch gating that validates current protocol family, adapter version, pinned protocol/browser revisions, OriginWeave generation, and required capability before invoking one callback, transferring the non-cloneable validation proof by ownership without turning metadata validation into browser or Agent authority.
- Context-bound browser-protocol dispatch composition that revalidates the exact OriginWeave browser session/context pair, carries the registry's current document epoch into the immediate callback, and separately requires the same exact runtime protocol metadata/capability checks before dispatch without claiming origin, destination, typed-input, transport-authentication, or post-condition authority.
- Typed browser-protocol operations that derive the exact adapter capability inside the strongest current context/origin/document-epoch dispatch boundary, preventing callers from independently selecting mismatched operation and capability metadata without performing browser I/O or granting policy authority.
- Bounded WebDriver BiDi accessibility-node query parameters for `browsingContext.locateNodes`, with reviewed selector/result budgets, exact-token role and control-free accessible-name admission, minimal remote-value serialization options, and fail-closed revalidation that rejects an untrusted adapter response whose returned node count exceeds the exact request budget before node normalization or retention.
- Deterministic WebDriver BiDi `browsingContext.locateNodes` command serialization that accepts only protocol-range `js-uint` identifiers and bounded injection-safe browsing-context identifiers, JSON-escapes reviewed query text, and emits the exact accessibility locator, finite node budget, and minimal serialization options without performing transport I/O or granting browser or Agent authority.
- Fail-closed WebDriver BiDi `locateNodes` response correlation that consumes the exact serialized command, rejects out-of-range or mismatched response `id` values, and returns non-cloneable correlation evidence carrying only the matched command identifier and browsing context without parsing the response or granting browser/Agent authority.
- Typed WebDriver BiDi response-envelope correlation that preserves success/error classification, rejects success responses with absent ids, treats nullable error ids as explicitly uncorrelatable, and prevents correlated error envelopes from becoming success correlation evidence without raw JSON parsing or browser/Agent authority grants.
- Correlated WebDriver BiDi `locateNodes` result admission that consumes exact response-correlation evidence, revalidates the serialized browsing-context identifier against the registered browsing-context identity, enforces the command's node budget, and binds admitted nodes atomically without granting browser or Agent authority.
- Bounded raw WebDriver BiDi response-document admission before JSON parsing, with a 65,536-byte product safety budget, exact wire-text retention, JSON-whitespace-aware top-level object-boundary checks, and typed fail-closed errors; this coarse boundary deliberately does not claim JSON validity, response correlation, browser authenticity, or Agent authority.
- One consuming bounded WebDriver BiDi response-document correlation boundary that parses the exact admitted JSON document and feeds only its typed response kind and protocol-range id into the existing exact command-correlation gate, preserving nested parser/correlation error sources without authenticating transport or granting browser/Agent authority.
- Consuming WebDriver BiDi WebSocket endpoint/session correlation that validates one caller-supplied canonical session UUID and rejects exact session mismatches before later transport use; the correlated type preserves only bounded endpoint metadata and does not authenticate Chromium, ChromeDriver, the caller, or the socket peer.
- Fail-closed WebDriver BiDi `script.NodeRemoteValue` admission that requires the exact remote type `node` and a non-empty `sharedId` within the same UTF-8 identifier budget as browser session and context identifiers, rejecting control and whitespace so an untrusted `locateNodes` item cannot be retained as a later typed-input handle without a usable shared node identity.
- Same-call `locateNodes` result admission that revalidates the exact current session, browsing context, canonical origin, and document epoch, rejects an over-budget or non-node result, and translates each admitted `sharedId` through the authority registry into an `ObservedNodeHandle` without performing browser I/O.
- Same-call QueryNodes admission that transfers a non-cloneable SemanticObservation protocol-use proof by ownership into `bind_current_nodes` before an untrusted `locateNodes` result can become current `ObservedNodeHandle` values, so Navigation-only or TypedInput-only proofs cannot mint observation handles.
- Fail-closed rejection of reviewed Unicode format and bidirectional-override characters in accessibility roles, accessible names, BiDi `sharedId` values, and registry external identifiers, while ordinary spaces in accessible names remain valid.
- Explicit `BrowserAuthorityRegistry::bind_context_origin` registration that binds one canonical origin to the exact current browser session, browsing context, and document epoch before origin-sensitive protocol use, rejecting cross-session ownership and same-epoch origin changes without granting navigation or action authority.
- Explicit `BrowserAuthorityRegistry::require_context_origin` revalidation that requires the exact registered canonical origin for the current browser session, browsing context, and document epoch before origin-sensitive protocol use, failing closed when binding is absent or mismatched without granting navigation or action authority.
- Origin-gated `dispatch_if_context_origin_current` composition that revalidates the exact registered session, browsing context, and canonical origin, carries the current document epoch into the same synchronous callback, and then validates protocol metadata and capability without claiming destination, network, TLS, adapter-authentication, action, or post-condition authority.
Expand Down
163 changes: 163 additions & 0 deletions crates/originweave-core/src/browser_authority_registry.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,163 @@
use crate::browser_registry::BrowserAuthorityRegistry as RawBrowserAuthorityRegistry;
use crate::{
BrowserRegistryError, BrowserSessionId, BrowsingContextId, DocumentEpoch, ObservedNodeHandle,
Origin,
};

/// Public browser-authority registry with raw node minting kept inside the crate.
///
/// Browser-session, browsing-context, document-epoch, and canonical-origin lifecycle operations are
/// public because trusted adapters need them to maintain current authority. Converting untrusted
/// browser-protocol node identifiers into [`ObservedNodeHandle`] values is deliberately
/// crate-private: external callers must use a reviewed semantic-observation admission boundary such
/// as [`crate::WebDriverBiDiAccessibilityQuery::bind_current_nodes`], which consumes the required
/// protocol-use proof, validates the complete batch, and revalidates the exact current document
/// before atomically minting handles.
pub struct BrowserAuthorityRegistry {
inner: RawBrowserAuthorityRegistry,
}

impl BrowserAuthorityRegistry {
/// Create an empty registry with the reviewed default per-namespace identifier capacity.
#[must_use]
pub fn new() -> Self {
Self {
inner: RawBrowserAuthorityRegistry::new(),
}
}

/// Create an empty registry with a caller-selected per-namespace identifier capacity.
///
/// Session, browsing-context, and node identifiers retain independent monotonic namespaces.
/// The node namespace is still reachable only through crate-owned semantic admission.
#[must_use]
pub fn with_identifier_limit(maximum_identifier: u64) -> Self {
Self {
inner: RawBrowserAuthorityRegistry::with_identifier_limit(maximum_identifier),
}
}

/// Register one opaque external browser-session identifier.
pub fn register_session(
&mut self,
external_identifier: &str,
) -> Result<BrowserSessionId, BrowserRegistryError> {
self.inner.register_session(external_identifier)
}

/// Register one opaque external browsing-context identifier inside a known browser session.
pub fn register_context(
&mut self,
browser_session: BrowserSessionId,
external_identifier: &str,
) -> Result<BrowsingContextId, BrowserRegistryError> {
self.inner
.register_context(browser_session, external_identifier)
}

/// Retire one browsing context and all registry-local authority derived from it.
pub fn remove_context(
&mut self,
browsing_context: BrowsingContextId,
) -> Result<(), BrowserRegistryError> {
self.inner.remove_context(browsing_context)
}

/// Retire one browser session and every registered context and node binding beneath it.
pub fn remove_session(
&mut self,
browser_session: BrowserSessionId,
) -> Result<(), BrowserRegistryError> {
self.inner.remove_session(browser_session)
}

/// Return the currently active document epoch for a known browsing context.
pub fn current_epoch(
&self,
browsing_context: BrowsingContextId,
) -> Result<DocumentEpoch, BrowserRegistryError> {
self.inner.current_epoch(browsing_context)
}

/// Return the current document epoch only when the supplied session owns the context.
pub fn current_context_epoch(
&self,
browser_session: BrowserSessionId,
browsing_context: BrowsingContextId,
) -> Result<DocumentEpoch, BrowserRegistryError> {
self.inner
.current_context_epoch(browser_session, browsing_context)
}

/// Require an opaque external browsing-context identifier to name this exact context.
pub(crate) fn require_context_external_identifier(
&self,
browser_session: BrowserSessionId,
browsing_context: BrowsingContextId,
external_identifier: &str,
) -> Result<(), BrowserRegistryError> {
self.inner.require_context_external_identifier(
browser_session,
browsing_context,
external_identifier,
)
}

/// Bind the canonical origin observed for the exact current browser document.
pub fn bind_context_origin(
&mut self,
browser_session: BrowserSessionId,
browsing_context: BrowsingContextId,
origin: &Origin,
) -> Result<DocumentEpoch, BrowserRegistryError> {
self.inner
.bind_context_origin(browser_session, browsing_context, origin)
}

/// Revalidate the canonical origin bound to the exact current browser document.
pub fn require_context_origin(
&self,
browser_session: BrowserSessionId,
browsing_context: BrowsingContextId,
origin: &Origin,
) -> Result<DocumentEpoch, BrowserRegistryError> {
self.inner
.require_context_origin(browser_session, browsing_context, origin)
}

/// Advance a browsing context to the next document epoch and invalidate old node bindings.
pub fn advance_document(
&mut self,
browsing_context: BrowsingContextId,
) -> Result<DocumentEpoch, BrowserRegistryError> {
self.inner.advance_document(browsing_context)
}

/// Bind one admitted batch of adapter-local node identifiers to current browser authority.
///
/// This operation is intentionally crate-private. The raw registry commits the batch only when
/// every identifier can be bound; a later failure rolls back node identifiers and any origin
/// binding created by the batch before the error is returned. Production callers outside this
/// crate therefore cannot bypass semantic admission or observe partial authority from a failed
/// `locateNodes` result.
pub(crate) fn bind_nodes(
&mut self,
browser_session: BrowserSessionId,
browsing_context: BrowsingContextId,
origin: &Origin,
external_identifiers: &[&str],
) -> Result<Vec<ObservedNodeHandle>, BrowserRegistryError> {
self.inner.bind_nodes(
browser_session,
browsing_context,
origin,
external_identifiers,
)
}
}

impl Default for BrowserAuthorityRegistry {
fn default() -> Self {
Self::new()
}
}
Loading
Loading