Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
212 commits
Select commit Hold shift + click to select a range
a9c8ba8
feat(polkavm): grant PeerTransport to apps that declare a JAM network
replghost Sep 26, 2026
72dc1a4
chore(vendor): rebuild the host from #1010 at 81021f43
replghost Sep 26, 2026
5a1414b
Merge feat/pvm-peer-transport (#290) into the Seity layer for deployment
replghost Sep 26, 2026
8feff98
chore(truapi): commit the peer-transport vendor modules the dist igno…
replghost Sep 26, 2026
1836779
chore(truapi): commit the peer-transport vendor modules the dist igno…
replghost Sep 26, 2026
67015c5
feat(polkavm): grant JAM peer access as a runtime permission
replghost Sep 27, 2026
67c4dcb
Merge feat/pvm-peer-transport (#290) into the Seity layer for deployment
replghost Sep 27, 2026
889d53b
chore(vendor): rebuild the host from #1010 at 8e4521b1
replghost Sep 27, 2026
c74317c
Merge feat/pvm-peer-transport (#290) into the Seity layer for deployment
replghost Sep 27, 2026
6e68b1c
Merge remote-tracking branch 'origin/feat/chat-seity-profile' into HEAD
replghost Sep 27, 2026
fcdf905
Merge remote-tracking branch 'origin/feat/chat-seity-profile' into HEAD
replghost Sep 27, 2026
8980057
refactor(polkavm): rename PeerTransport to JamPeerTransport
replghost Sep 27, 2026
03a2728
Merge feat/pvm-peer-transport (#290) into the Seity layer for deployment
replghost Sep 27, 2026
cfacd21
Merge feat/chat-seity-profile (#287) into the deployment layer: surfa…
replghost Sep 27, 2026
855383b
Merge remote-tracking branch 'origin/feat/chat-seity-profile' into HEAD
replghost Sep 27, 2026
9654d82
Merge remote-tracking branch 'origin/feat/chat-seity-profile' into HEAD
replghost Sep 27, 2026
c1be9d5
Merge feat/chat-seity-profile (TrUAPI 0.21) into feat/jam-peer-transp…
replghost Sep 27, 2026
cde261b
Merge feat/chat-seity-profile (SSO Chat messages at 200-205) into fea…
replghost Sep 28, 2026
9750ca2
Merge feat/chat-seity-profile (test wallet single-tab owner) into fea…
replghost Sep 28, 2026
6558f92
Merge feat/chat-seity-profile (#287) into feat/jam-peer-transport-on-…
replghost Sep 28, 2026
4490d10
Merge feat/pvm-wasm (#185, TrUAPI 0.21) and move JamPeerTransport to …
replghost Sep 28, 2026
fff2819
Merge feat/chat-seity-profile (take the wallet back on a click into a…
replghost Sep 28, 2026
67ae699
Merge feat/pvm-wasm (#185): take the wallet back on a click into a fo…
replghost Sep 28, 2026
73e3c4a
Merge feat/pvm-peer-transport (#290): JamPeerTransport on wire trait 111
replghost Sep 28, 2026
3c067ef
Merge feat/chat-seity-profile (#287): profile disclosure consent
replghost Sep 28, 2026
3ddd66b
Merge feat/chat-seity-profile (#287): placed contact avatars
replghost Sep 28, 2026
881eaf7
Merge feat/chat-seity-profile (#287): Chat state migration
replghost Sep 28, 2026
7d9e185
Merge feat/chat-seity-profile (#287): Profile on wire trait 69
replghost Sep 28, 2026
c7a6880
Merge feat/chat-seity-profile (#287): profile relay triggers
replghost Sep 28, 2026
4643841
Merge feat/chat-seity-profile (#287): hide host-drawn avatars while t…
replghost Sep 28, 2026
745bc80
Merge updated PolkaVM base
replghost Sep 28, 2026
7561c24
Merge updated Seity base
replghost Sep 28, 2026
dd8ce90
Merge updated JamPeerTransport base
replghost Sep 28, 2026
8e56d69
chore(vendor): rebuild host with worker startup timeout fix
replghost Sep 28, 2026
35576ad
Merge feat/pvm-wasm (Safari per-app test wallet notice) into feat/pvm…
replghost Sep 28, 2026
e75ea17
Merge feat/chat-seity-profile (Safari per-app test wallet notice) int…
replghost Sep 28, 2026
2f660e5
Merge feat/pvm-peer-transport (Safari per-app test wallet notice) int…
replghost Sep 28, 2026
b356a13
chore(vendor): rebuild the host WASM from host-rust-core#1011 at ef98…
replghost Sep 28, 2026
1facd8a
Merge feat/chat-seity-profile (contact attribution) into feat/jam-pee…
replghost Sep 29, 2026
a5187fe
chore(vendor): rebuild the host WASM from host-rust-core#1011 at 52a0…
replghost Sep 29, 2026
b0c08f2
Merge feat/chat-seity-profile (contact username) into feat/jam-peer-t…
replghost Sep 29, 2026
9d7be15
chore(vendor): rebuild the host WASM from host-rust-core#1011 at 1b0a…
replghost Sep 29, 2026
0a5e2db
Merge feat/chat-seity-profile into feat/jam-peer-transport-on-seity
replghost Sep 29, 2026
8936d68
chore(vendor): point the host lock at host-rust-core#1011 5c1b378b
replghost Sep 29, 2026
1526ce6
Merge revert of the light-client E2E switch into feat/jam-peer-transp…
replghost Sep 29, 2026
ce7f512
Merge feat/pvm-wasm (#185) into feat/pvm-peer-transport
replghost Sep 29, 2026
fd61f2c
chore(vendor): rebuild the host from host-rust-core#1010 at 372d6962
replghost Sep 29, 2026
4869292
Merge feat/pvm-peer-transport (#290) into feat/jam-peer-transport-on-…
replghost Sep 29, 2026
2d54cca
chore(vendor): rebuild the host from host-rust-core#1011 at 4d52f5c1
replghost Sep 29, 2026
62940c5
Merge refreshed PolkaVM base into peer transport
replghost Sep 29, 2026
5fd56ee
Merge refreshed Seity profile into JAM peer transport
replghost Sep 29, 2026
ef779e5
Merge refreshed PVM peer transport into JAM Seity transport
replghost Sep 29, 2026
d14169a
Merge commit '8858795d' into HEAD
replghost Sep 29, 2026
8279e41
Merge commit '2b25898a' into HEAD
replghost Sep 29, 2026
2613cf1
Refresh peer transport wallet artifacts from the 0.23 runtime
replghost Sep 29, 2026
36e6dc8
Merge commit '75d58e4a51bc5c8b0d65cae63494f3ba00ab5e78' into HEAD
replghost Sep 29, 2026
cf85255
Merge commit '2613cf1b3d92877079bb96fc383be1fcb185e13d' into HEAD
replghost Sep 29, 2026
3e5c939
ci: recognize the public resolver mapping-slot vector
replghost Sep 29, 2026
755f4e6
ci: recognize the public resolver mapping-slot vector
replghost Sep 29, 2026
4cc9e80
chore(vendor): rebuild the host from host-rust-core#1011 at 08a08fbd
replghost Sep 29, 2026
853717f
Merge feat/chat-seity-profile (#287) into feat/jam-peer-transport-on-…
replghost Sep 29, 2026
6858c2f
ci: retain deployed product smoke diagnostics
replghost Sep 29, 2026
57aaf94
fix(host): settle protocol startup and exercise demand-driven Chat
replghost Sep 29, 2026
62b386f
ci: retain deployed product smoke diagnostics
replghost Sep 29, 2026
ad5ec01
fix(host): settle protocol startup and exercise demand-driven Chat
replghost Sep 29, 2026
42bd1c8
Merge remote-tracking branch 'origin/feat/chat-seity-profile' into HEAD
replghost Sep 30, 2026
9b29550
Merge feat/pvm-peer-transport (#290) into feat/jam-peer-transport-on-…
replghost Sep 30, 2026
adebb2f
chore(vendor): rebuild the host from host-rust-core#1011 at f3c55406
replghost Sep 30, 2026
f46219d
Merge remote-tracking branch 'origin/feat/chat-seity-profile' into HEAD
replghost Sep 30, 2026
4c25558
chore(vendor): merge Profile refresh and pin combined runtime af087f73
replghost Sep 30, 2026
f84419d
Merge remote-tracking branch 'origin/feat/chat-seity-profile' into HEAD
replghost Sep 30, 2026
e38db7c
Merge Profile refresh smoke setup into combined deployment
replghost Sep 30, 2026
d656c49
Preserve concurrent combined smoke integration
replghost Sep 30, 2026
032e971
Merge verified real-settings smoke reconciliation from Profile
replghost Sep 30, 2026
da7eff8
Merge PolkaVM apps default-on fix from Seity
replghost Sep 30, 2026
7b2ed36
fix(settings): keep runtime defaults explicit at browser call sites
replghost Sep 30, 2026
87e2f78
Merge commit 'dd110e71' into HEAD
replghost Sep 30, 2026
51d0ef9
fix(deps): update fast-uri and brace-expansion security pins
replghost Sep 30, 2026
c1f7066
Merge commit '98376ca4049fb0cc96974d8564060272bf030af8' into HEAD
replghost Sep 30, 2026
d9df860
test(smoke): exercise testnet products without opting in
replghost Sep 30, 2026
4b29b82
Merge commit '7f99ce47678dde7d1d0e466e092db97229adb949' into HEAD
replghost Sep 30, 2026
6c05576
Merge remote-tracking branch 'origin/feat/chat-seity-profile' into HEAD
replghost Sep 30, 2026
c0eaa67
Merge remote-tracking branch 'origin/feat/pvm-peer-transport' into HEAD
replghost Sep 30, 2026
76eb846
docs: preserve spacing after default-policy merge
replghost Sep 30, 2026
afa4aa9
docs: format default-policy smoke guidance
replghost Sep 30, 2026
1514e45
fix(pwa): upgrade cached hosts across sandbox contract changes
replghost Sep 30, 2026
e5c8a1a
Merge common provider refresh into PVM peer transport
replghost Sep 30, 2026
5b00259
Merge provider refresh from Chat and Profile
replghost Sep 30, 2026
997fb52
Merge provider refresh from JAM transport
replghost Sep 30, 2026
3a07d89
Merge SDK provenance guidance while retaining JAM artifacts
replghost Sep 30, 2026
4ed4d94
Merge clarified SDK provenance guidance from Profile
replghost Sep 30, 2026
4037fa5
Merge clarified SDK provenance guidance from JAM
replghost Sep 30, 2026
c781983
Normalize merged dependency documentation formatting
replghost Sep 30, 2026
6291521
Merge source-pinned E2E toolchain setup from PVM
replghost Sep 30, 2026
b3fa339
Merge provider-compatible Previewnet trust roots from PVM
replghost Sep 30, 2026
febab9b
Merge Seity provider qualification fixes
replghost Sep 30, 2026
4c9e1a3
Merge JAM provider qualification fixes
replghost Sep 30, 2026
505d7e5
Merge current main and PVM into Peer transport
replghost Oct 1, 2026
38b0e77
Merge main-based Seity and port JAM host upgrades to Astro
replghost Oct 1, 2026
55ee8a8
Merge main-qualified Peer transport into the combined JAM stack
replghost Oct 1, 2026
bebb593
Type the cached-host upgrade browser fixture for strict NodeNext
replghost Oct 1, 2026
6b5261a
Merge qualified Seity profile and landing lifecycle fixes
replghost Oct 1, 2026
d658101
Merge execution-scoped consent and the canonical Peer SDK backport
replghost Oct 1, 2026
624b0ab
fix(rpc): preserve idle subscriptions and propagate transport loss
replghost Oct 1, 2026
343c19c
Merge gateway subscription recovery from profile layer
replghost Oct 1, 2026
28886e6
Merge gateway subscription recovery from peer transport layer
replghost Oct 1, 2026
206d230
Build the browser-proven contract upgrade worker through Astro
replghost Oct 1, 2026
63fd38c
Merge commit 'df38076ebe04d8725cf0756b9cd96f707404e24e' into HEAD
replghost Oct 1, 2026
1cd3427
Merge commit 'd65810185562c21b4027d7acf3072775dda21bd1' into HEAD
replghost Oct 1, 2026
662e94a
Vendor the qualified main-based Peer execution callback runtime
replghost Oct 1, 2026
b68b513
Merge commit '624b0abf' into HEAD
replghost Oct 1, 2026
5334c28
Merge commit '8db88b04fee2b1b33fea09647d44745bd09de941' into HEAD
replghost Oct 1, 2026
5eb2b93
Merge commit '4865556d057d3f0e7943d728075b2335ceaea8c2' into HEAD
replghost Oct 1, 2026
7aa70e4
Merge commit '5334c28bb732b5f71253bb7f05a7e6f2cbd27670' into HEAD
replghost Oct 1, 2026
f6d1bc3
Merge commit '28886e6ecc4d8a065deed85cf2d6cac81bcc84bc' into HEAD
replghost Oct 1, 2026
6506911
Merge commit 'a26b493d4b2018453900450176228b6f4d32b62d' into HEAD
replghost Oct 1, 2026
b09c4e9
Merge commit '7278a04410d50618a36add6e2f69cc0c7e28cd21' into HEAD
replghost Oct 1, 2026
7278a04
Merge commit '952e3b41bf7b1f3bd630bd243042cf57d362b740' into HEAD
replghost Oct 1, 2026
83f617e
Merge commit '38b5dda1a95b9d2133bd64a9aa453c43f8e4ed92' into HEAD
replghost Oct 1, 2026
b9c90e6
Merge commit '825a391348a9d3489fadc52ebb1f16bee5973c37' into HEAD
replghost Oct 1, 2026
edd0666
Merge commit 'b9c90e6068b9c75a0866893c70823f013f8ee988' into HEAD
replghost Oct 1, 2026
88828c3
Merge commit 'beb5ad7553c23b0a1c9cfa7c9cf54e84820d8d96' into HEAD
replghost Oct 1, 2026
b73c3ec
Merge commit 'ce4ebdf04f80eff5d427ddca4d17e58e9ff8c296' into HEAD
replghost Oct 1, 2026
c4a08e9
Merge commit 'b73c3eccd101737efd06abf8a3f16022bcb75270' into HEAD
replghost Oct 1, 2026
bac980c
Merge commit '026cbedeffe2a2f6a98c40c9b6dcb0c3b6b711c0' into HEAD
replghost Oct 1, 2026
8f1c87f
Merge commit 'abb08d91deadd79e00c652b5ffd69d30232547e5' into HEAD
replghost Oct 1, 2026
117ef1e
Merge commit 'bac980c18e45ffa714a6f9db65ec19b5103c277c' into HEAD
replghost Oct 1, 2026
a5e8b5f
Merge commit 'fef26cd136c8e6c142ef644cc7640dd83d0fa58d' into HEAD
replghost Oct 1, 2026
3775784
Merge commit 'a093cb4d6fe9cf85133138cab8653c06283d36e1' into HEAD
replghost Oct 1, 2026
4d32035
Merge commit 'a5e8b5fd186fbc148e27cf887dd64db082c1d4ff' into HEAD
replghost Oct 1, 2026
96455b5
Merge commit '76314cd7ab368c2035e9d48b02b87dccedb0a229' into HEAD
replghost Oct 1, 2026
169fd2e
Merge commit '89b7a465d7f23febcebe31abad7b4afe4bfc8a99' into HEAD
replghost Oct 1, 2026
1b241af
Merge commit '96455b5dc6b8390b3be61a3f2630051ef2035eea' into HEAD
replghost Oct 1, 2026
be0b5af
Merge commit '3898d80afba6fcf01c28c0b61d8bca6f217e5a41' into HEAD
replghost Oct 1, 2026
5e94e8d
Merge commit 'e592e99313a10edbcb9f822a1197932703c74d11' into HEAD
replghost Oct 1, 2026
4ca2cda
Merge commit '927a3b362b00d319927100c535ebdc03b35e2d45'; commit '5e94…
replghost Oct 1, 2026
8c40f16
docs: use the lock manifest as Peer artifact provenance
replghost Oct 1, 2026
46a4557
docs: identify the combined JAM artifact source branch
replghost Oct 1, 2026
d8744f7
Merge commit '69d255a3e5a2c8ac4567833894df482d20c17e8f' into HEAD
replghost Oct 1, 2026
bda003b
Merge commit 'e8310f3506224cbe96c84912b4749ad042559b8c'; commit 'd874…
replghost Oct 1, 2026
3f0dcdb
chore: refresh canonical native-main Peer SDK artifacts
replghost Oct 1, 2026
fcfcd36
Merge commit '289d0b1399f524fdd036d3a6be5dae04b4fcfa38' into HEAD
replghost Oct 1, 2026
944d0dd
Merge commit 'a864a60348984c0cb2ae0b4895517a455b96c4b6' into HEAD
replghost Oct 1, 2026
3a815a0
Merge commit '5aae6ba5d8ad5cad932e1a06e9e3b1e873b584c8' into HEAD
replghost Oct 1, 2026
340051b
chore: refresh canonical native-main JAM SDK artifacts
replghost Oct 1, 2026
90d35ae
Merge commit '11f46dddd1d5dfe40bea9201e5467b4c6c26430f' into HEAD
replghost Oct 1, 2026
a6f6c36
Merge commit '3a815a0dd20553ba7337e3704c4af0eed00c9df9' into HEAD
replghost Oct 1, 2026
b1a0b81
Merge commit '0afb7feb122702e476d21d1f440917e81a2256c1' into HEAD
replghost Oct 1, 2026
08a1e99
Merge commit 'c7033121442406ae030f20e03c099c48ac6e0eff' into HEAD
replghost Oct 1, 2026
d8d0f80
Merge commit 'b1a0b81c0373315ac6bb709f27d5cf8a608683b7' into HEAD
replghost Oct 1, 2026
602d1b3
merge: inherit qualified stopped-chain recovery
replghost Oct 2, 2026
56cea5d
fix(jam): explain unsupported WebTransport browsers
replghost Oct 2, 2026
8c71bae
merge: inherit bounded Seity and shared resolver recovery
replghost Oct 2, 2026
8cb28d2
test: qualify stopped follow recovery at the real resolver boundary
replghost Oct 2, 2026
0ee6f29
merge: inherit shared-worker generation recovery
replghost Oct 2, 2026
a21757c
merge: inherit proven recovery guidance
replghost Oct 2, 2026
78d6375
merge: inherit final Seity recovery and qualification guidance
replghost Oct 2, 2026
93d0cc9
merge: inherit final Peer recovery ancestry
replghost Oct 2, 2026
c60e0b1
merge: inherit real-RPC recovery regression cutover
replghost Oct 2, 2026
00a9152
merge: inherit Seity canonical recovery regression ancestry
replghost Oct 2, 2026
2b3b31c
merge: inherit Peer canonical recovery regression ancestry
replghost Oct 2, 2026
44ed4f8
merge: inherit isolated bitswap fixture setup
replghost Oct 2, 2026
e83d531
merge: inherit Seity isolated bitswap fixtures
replghost Oct 2, 2026
dcdef40
merge: inherit Peer isolated bitswap fixture ancestry
replghost Oct 2, 2026
05a6265
Merge corrected upstream and refresh canonical peer artifacts
replghost Oct 2, 2026
e108215
Merge corrected upstream and refresh canonical jam artifacts
replghost Oct 2, 2026
fdd73dc
Merge corrected upstream and refresh canonical jam artifacts
replghost Oct 2, 2026
14df609
Merge commit 'bdb7e068e1d2925e38dc9f7f5222536ddd5d07a8' into HEAD
replghost Oct 2, 2026
19a9c5a
Merge commit 'abca1e079e90781a97fa9492331ddb7ad669d2b7' into HEAD
replghost Oct 2, 2026
0efd81f
Merge commit '19a9c5aeb0f0f6ef33151ca66da3bb147efa5936' into HEAD
replghost Oct 2, 2026
449a6b1
Merge refreshed runtime into browser JAM PeerTransport
replghost Oct 2, 2026
3dbb40d
Merge refreshed Seity into browser deployment integration
replghost Oct 2, 2026
dcf5ffc
Merge refreshed JAM PeerTransport into browser deployment integration
replghost Oct 2, 2026
0d703d1
Merge finalized Seity source into deployment integration
replghost Oct 2, 2026
31846fc
Merge refreshed runtime and matching native PeerTransport packages
replghost Oct 2, 2026
6d93e71
Merge finalized JAM PeerTransport and refresh native integration pack…
replghost Oct 2, 2026
6226d3f
Merge branch 'work/seity-contact-audiences' into work/contacts-browse…
replghost Oct 2, 2026
d718a95
Merge branch 'work/seity-contact-audiences' into work/contacts-browse…
replghost Oct 2, 2026
9f6fd71
Merge refreshed browser runtime into JamPeerTransport
replghost Oct 2, 2026
5e25e78
Merge refreshed browser Seity into integration
replghost Oct 2, 2026
829d77f
Merge refreshed browser JamPeerTransport into integration
replghost Oct 2, 2026
f12efea
Merge refreshed runtime and matched JamPeerTransport artifacts
replghost Oct 2, 2026
e23014c
Merge refreshed Seity into browser integration
replghost Oct 2, 2026
bc4c097
Merge refreshed JamPeerTransport and integration native artifacts
replghost Oct 2, 2026
8e00147
Merge final runtime formatting into JamPeerTransport
replghost Oct 2, 2026
704ff59
Merge final Seity source into browser integration
replghost Oct 2, 2026
067a50a
Merge final JamPeerTransport source into browser integration
replghost Oct 2, 2026
c4ecf99
Merge persisted cache compatibility correction into JamPeerTransport
replghost Oct 2, 2026
5792d13
Merge Seity persisted cache correction into integration
replghost Oct 2, 2026
86dd4bb
Merge JamPeerTransport persisted cache correction into integration
replghost Oct 2, 2026
0e9a772
Merge runtime archive fixture correction into JamPeerTransport
replghost Oct 2, 2026
2d69435
Merge Seity archive fixture correction into integration
replghost Oct 2, 2026
7fc6de7
Merge JamPeerTransport archive fixture correction into integration
replghost Oct 2, 2026
7593f8e
Merge incoming Contacts integration into refreshed release layer
replghost Oct 2, 2026
3fe3bd1
Merge finalized Contacts Seity layer into release integration
replghost Oct 2, 2026
31ec358
Vendor clean Contacts integration packages from matching native source
replghost Oct 2, 2026
e60d74f
merge: forward Seity empty profiles and local time into integration
replghost Oct 2, 2026
8a40c09
Merge Contacts formatting repair into release integration
replghost Oct 2, 2026
754d61c
merge: forward Seity and refresh peer-integration native SDK
replghost Oct 2, 2026
ca368e9
merge: forward finalized locale tests and Profile formatting
replghost Oct 2, 2026
4833bac
merge: forward finalized browser locale and Profile fixes
replghost Oct 2, 2026
0a14603
merge: preserve concurrent release integration ancestry
replghost Oct 2, 2026
4d80b4b
merge: forward bridge SDK mock repair into host integration
replghost Oct 2, 2026
ebdc667
build(vendor): restore archive provenance and remove installed depend…
replghost Oct 3, 2026
870f608
Merge generic runtime into JamPeerTransport and refresh native SDK
replghost Oct 3, 2026
8abe312
Merge qualified Seity SDK provenance into browser integration
replghost Oct 3, 2026
fa6cd2e
Merge refreshed peer Locale support into browser integration
replghost Oct 3, 2026
ea4f773
Merge approved Duke pointer-lock smoke correction into browser #290
replghost Oct 3, 2026
7f09b05
Merge approved Duke pointer-lock smoke correction into browser #291
replghost Oct 3, 2026
0afd9f1
Merge approved Duke pointer-lock smoke correction into browser #291
replghost Oct 3, 2026
265f52f
Merge approved browser #287 runtime update into integration #291
replghost Oct 4, 2026
35099e0
Merge approved #287 qualification input correction into #291
replghost Oct 4, 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
7 changes: 7 additions & 0 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,13 @@ jobs:
echo "::error::PolkaVM functional specs must have 0 failures"
exit 1
fi
UPGRADE_EXECUTED=$(jq '[.suites[] | recurse(.suites[]?) | .specs[]? | select(.file == "host-upgrade.spec.ts") | select(any(.tests[]?.results[]?; .status != "skipped"))] | length' tests/functional/results.json)
UPGRADE_FAILED=$(jq '[.suites[] | recurse(.suites[]?) | .specs[]? | select(.file == "host-upgrade.spec.ts" and .ok == false)] | length' tests/functional/results.json)
UPGRADE_SKIPPED=$(jq '[.suites[] | recurse(.suites[]?) | .specs[]? | select(.file == "host-upgrade.spec.ts") | .tests[]?.results[]? | select(.status == "skipped")] | length' tests/functional/results.json)
if [ "$UPGRADE_EXECUTED" -lt 2 ] || [ "$UPGRADE_FAILED" -gt 0 ] || [ "$UPGRADE_SKIPPED" -gt 0 ]; then
echo "::error::host-upgrade.spec.ts must execute its upgrade scenarios without failures or skips (executed: $UPGRADE_EXECUTED, failed: $UPGRADE_FAILED, skipped: $UPGRADE_SKIPPED)"
exit 1
fi
LOADING_FAILED=$(jq '[.suites[] | recurse(.suites[]?) | .specs[]? | select(.file == "loading.spec.ts" and .ok == false)] | length' tests/functional/results.json)
RESOLUTION_FAILED=$(jq '[.suites[] | recurse(.suites[]?) | .specs[]? | select(.file == "resolution.spec.ts" and .ok == false)] | length' tests/functional/results.json)
TRANSPORT_FAILED=$(jq '[.suites[] | recurse(.suites[]?) | .specs[]? | select(.file == "network-transport.spec.ts" and .ok == false)] | length' tests/functional/results.json)
Expand Down
31 changes: 31 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -150,6 +150,26 @@ traffic stays on the bounded PolkaVM runtime ABI 1. Guest Host requests use the
Host-frame bytes use the canonical TrUAPI wire codec, currently version 3. Build guest clients against the SDK recorded
in `vendor/truapi-host.lock.json`; runtime ABI 1 compatibility alone does not imply TrUAPI wire compatibility.

On this branch, `vendor/truapi-host.lock.json` pins the canonical SDK and Wasm to `feat/jam-peer-transport-on-seity`.
JAM peer transport is execution-local in the sandbox. Before dialing a network, it requests `JamPeers` permission
through the product's authenticated port to the shared page core. The host's Solid permission dialog shows the full
genesis hash and offers **Allow once**, **Always allow**, and **Deny**; dismissal saves no decision. Durable decisions
are scoped to product and genesis, while a one-time grant lasts only for that execution. This grants no account,
signing, storage, or arbitrary web access.

The sandbox checks for the required browser WebTransport capability before requesting permission. If it is unavailable,
the host leaves the stored permission unchanged, shows the detected browser version and compatibility requirements, and
the app can continue with its verified snapshot. Supported versions are Chrome or Edge 100+, Firefox 125+, and
Safari/iOS 26.4+.

The canonical session uses WebTransport to validators, with at most eight connections, sixteen streams per connection,
and 1 MiB messages. Received data remains unverified until the guest checks it. The runtime menu's **Network access**
section lists this execution's grants. Network updates continue while its display/audio menu is paused. Stop,
replacement, and runtime failure close the session and refuse outstanding permission requests; a replacement guest
cannot consume old replies. Ordinary host frames retain their 1 MiB bound and still use the shared page core; only peer
frames use the larger bound needed for message framing. The session's ten-second dial deadline includes the permission
prompt: a late decision does not resurrect an expired dial, though a retry can use the remembered decision.

App manifest v2 uses runtime ABI 1 with framebuffer, Tri2D, WebGPU Raster, and bounded capability negotiation; TrUAPI,
MotionSample v1, text, IME, focus, and wheel input use the same pinned browser runtime as native Hosts. UI output v1
applies cursor and IME-agent state in the sandbox. Clipboard text and HTTP(S) navigation cross an origin-checked parent
Expand Down Expand Up @@ -226,6 +246,17 @@ current page was loaded:
If a background re-resolution finds the on-chain CID has changed, dotli shows a **New version available** notification
with a **Reload** action rather than swapping content silently.

The host PWA caches its shell separately from the cross-origin sandbox. On a worker update, open host pages report their
sandbox-contract version. Matching hosts keep the normal update prompt. Legacy, incompatible, or nonresponsive hosts are
reloaded at the same URL after the new shell finishes installing, without clearing wallet/app storage or product caches.
This lets an already cached host recover even when it cannot understand the newer sandbox's update request; the
sandbox's strict contract validation remains unchanged. As with any host reload, in-memory app state and credentialless
iframe storage restart; persistent host storage is retained.

Astro builds the release-specific classic upgrade worker after its static pages and before Workbox emits `host-sw.js`.
Browser validation and Node-loaded build configuration share the version in
`packages/config/src/host-sandbox-version.ts`; the build does not import browser network configuration.

## TrUAPI bridge

Loaded SPAs communicate with dotli through a postMessage-based protocol. The bridge exposes:
Expand Down
49 changes: 42 additions & 7 deletions apps/host/astro.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
import { sentryVitePlugin } from '@sentry/vite-plugin';
import { defineConfig } from 'astro/config';
import type { AstroIntegration } from 'astro';
import type { Plugin, PluginOption } from 'vite';
import { build as viteBuild, type Plugin, type PluginOption } from 'vite';
import { readFileSync, readdirSync } from 'node:fs';
import { readFile, writeFile } from 'node:fs/promises';
import { execSync } from 'node:child_process';
Expand All @@ -21,6 +21,7 @@ import { astroPwa } from '@config/vite/astro-pwa';
import { buildInfo, readPackageVersion } from '@config/vite/build-info';
import { appBuildOptions, rolldownOptions } from '@config/vite/build-options';
import { runtimeNetworkConfigScript } from '@config/vite/runtime-network-config';
import { SANDBOX_SCHEMA_VERSION } from '../../packages/config/src/host-sandbox-version.ts';
import { stripAnalytics } from '@dotli/metrics/vite';
import { handleNodeIdentityProxy, IDENTITY_PROXY_PREFIX } from '../../scripts/identity-proxy.ts';

Expand Down Expand Up @@ -48,6 +49,38 @@ if ((process.env['VITE_COMMIT_SHA'] ?? '') === '') {

const OUT_DIR = 'dist';
const APP_URL = process.env['VITE_APP_URL'] ?? '';
const HOST_UPDATE_SCRIPT = `assets/host-update-${process.env['VITE_COMMIT_SHA'] ?? 'dev'}.js`;

function hostUpdateWorker(): AstroIntegration {
return {
name: 'host-update-worker',
hooks: {
// Finish before astroPwa generates the importing service worker.
// A release-specific URL avoids stale HTTP-cached importScripts.
'astro:build:done': async ({ dir }) => {
await viteBuild({
configFile: false,
define: {
__HOST_SANDBOX_SCHEMA_VERSION__: JSON.stringify(SANDBOX_SCHEMA_VERSION),
},
build: {
emptyOutDir: false,
outDir: fileURLToPath(dir),
lib: {
entry: resolve(import.meta.dirname, 'src/host-update.ts'),
formats: ['iife'],
name: 'DotliHostUpdate',
fileName: () => HOST_UPDATE_SCRIPT,
},
sourcemap: false,
minify: true,
},
logLevel: 'warn',
});
},
},
};
}

/**
* Walk every workspace member's `package.json` and collect its direct
Expand Down Expand Up @@ -286,11 +319,12 @@ export default defineConfig({
astroSolid(),
// Before astroPwa: it rewrites the page that the precache manifest hashes.
pagePreloads(),
hostUpdateWorker(),
// Host shell PWA. Scope-locked to the host origin (myapp.dot.li). The
// protocol iframe on host.dot.li and the app iframe on *.app.dot.li are
// cross-origin and outside this SW's reach by design. `registerType:
// "prompt"` defers update activation to the user via workbox-window in
// src/pwa.ts.
// cross-origin and outside this SW's reach by design. Compatible host
// sessions keep prompt-style updates. The imported upgrade worker replaces
// incompatible cached shells without touching wallet or application storage.
astroPwa({
injectRegister: false,
registerType: 'prompt',
Expand Down Expand Up @@ -319,10 +353,11 @@ export default defineConfig({
// The TrUAPI core loads its ring-VRF module (~4.6 MB) only when a
// ring-VRF operation first needs it. Precaching it would make every
// installed shell download it after each release.
globIgnores: ['**/truapi_provider_bg*.wasm', '**/truapi_verifiable_bg*.wasm'],
globIgnores: ['**/truapi_provider_bg*.wasm', '**/truapi_verifiable_bg*.wasm', '**/host-update-*.js'],
cleanupOutdatedCaches: true,
// skipWaiting/clientsClaim stay false: prompt-style updates require
// the waiting SW to sit idle until the user opts in.
importScripts: [HOST_UPDATE_SCRIPT],
// The upgrade worker overrides these only for outdated shells;
// matching-contract sessions still opt into an ordinary update.
skipWaiting: false,
clientsClaim: false,
maximumFileSizeToCacheInBytes: 32 * 1024 * 1024,
Expand Down
2 changes: 1 addition & 1 deletion apps/host/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
"build": "astro build",
"build:prod": "astro check && astro build && node ../../scripts/compress-dist.ts",
"test": "vitest run",
"test:functional": "playwright test --config=tests/functional/playwright.config.ts tests/functional/loading.spec.ts tests/functional/resolution.spec.ts tests/functional/navigation.spec.ts tests/functional/network-transport.spec.ts tests/functional/ui-smoke.spec.ts tests/functional/host-settings.spec.ts tests/functional/polkavm.spec.ts tests/functional/chinpokomon.spec.ts",
"test:functional": "playwright test --config=tests/functional/playwright.config.ts tests/functional/loading.spec.ts tests/functional/resolution.spec.ts tests/functional/navigation.spec.ts tests/functional/network-transport.spec.ts tests/functional/ui-smoke.spec.ts tests/functional/host-settings.spec.ts tests/functional/polkavm.spec.ts tests/functional/chinpokomon.spec.ts tests/functional/host-upgrade.spec.ts",
"test:e2e": "playwright test --config=tests/e2e/playwright.config.ts",
"test:e2e:local": "E2E_PRODUCT_URL=${E2E_PRODUCT_URL:-http://localhost:5199} SIGNING_HOST_NETWORK=${SIGNING_HOST_NETWORK:-paseo-next-v2} playwright test --config=tests/e2e/playwright.config.ts",
"test:perf": "PERF_RUNS=10 PERF_DOMAIN_A=browse PERF_DOMAIN_B=host-playground playwright test --config=tests/performance/playwright.config.ts tests/performance/cold-start.spec.ts",
Expand Down
96 changes: 96 additions & 0 deletions apps/host/src/host-update.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
// Copyright 2026 Parity Technologies (UK) Ltd.
// SPDX-License-Identifier: AGPL-3.0-only

/// <reference lib="webworker" />
declare const self: ServiceWorkerGlobalScope;

declare const __HOST_SANDBOX_SCHEMA_VERSION__: number;

export {};

const VERSION_REPLY_TIMEOUT_MS = 1_500;

function hasCurrentContract(client: WindowClient): Promise<boolean> {
const { promise, resolve } = Promise.withResolvers<boolean>();
const channel = new MessageChannel();
const finish = (matches: boolean): void => {
clearTimeout(timer);
channel.port1.onmessage = null;
channel.port1.close();
resolve(matches);
};
const timer = setTimeout(() => {
finish(false);
}, VERSION_REPLY_TIMEOUT_MS);
channel.port1.onmessage = (event: MessageEvent<unknown>) => {
const data = event.data;
finish(
typeof data === 'object' &&
data !== null &&
'version' in data &&
data.version === __HOST_SANDBOX_SCHEMA_VERSION__,
);
};
try {
client.postMessage({ type: 'dotli:host-contract-version' }, [channel.port2]);
} catch {
// The document can disappear while the worker is checking open tabs.
channel.port2.close();
finish(false);
}
return promise;
}

async function outdatedClients(): Promise<WindowClient[]> {
const windows = (await self.clients.matchAll({ type: 'window', includeUncontrolled: true })).filter(client =>
client.url.startsWith(self.registration.scope),
);
const compatible = await Promise.all(windows.map(hasCurrentContract));
return windows.filter((_, index) => compatible[index] !== true);
}

function isWindowClient(client: Client | undefined): client is WindowClient {
return client?.type === 'window';
}

self.addEventListener('install', (event: ExtendableEvent) => {
if (self.registration.active === null) {
return;
}
event.waitUntil(
outdatedClients().then(async clients => {
// Compatible sessions retain the normal update prompt. Legacy hosts do
// not answer this query and cannot be relied on to handle a new sandbox's
// update request. Activate only after Workbox's precache install succeeds.
if (clients.length > 0) {
await self.skipWaiting();
}
}),
);
});

self.addEventListener('activate', (event: ExtendableEvent) => {
event.waitUntil(
(async () => {
// Probe again: the worker can restart between installation and activation,
// and a tab may have navigated while the new assets were downloading.
const clients = await outdatedClients();
if (clients.length === 0) {
return;
}
await self.clients.claim();
await Promise.all(
clients.map(async client => {
const current = await self.clients.get(client.id);
if (isWindowClient(current)) {
// Navigation fetches wait for activation. Awaiting them here would
// deadlock the worker and every tab it just claimed.
void current.navigate(current.url).catch((error: unknown) => {
console.warn('[dot.li] Could not reload an outdated host', error);
});
}
}),
);
})(),
);
});
16 changes: 16 additions & 0 deletions apps/host/src/pwa.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,27 @@
import { Workbox } from 'workbox-window';
import { showNotification } from '@dotli/ui';
import { log } from '@dotli/shared';
import { SANDBOX_SCHEMA_VERSION } from '@dotli/config';

const UPDATE_INTERVAL_MS = 15 * 60 * 1000;

if ('serviceWorker' in navigator) {
const wb = new Workbox('/host-sw.js');
navigator.serviceWorker.addEventListener('message', (event: MessageEvent<unknown>) => {
const data = event.data;
const reply = event.ports.at(0);
if (
typeof data !== 'object' ||
data === null ||
!('type' in data) ||
data.type !== 'dotli:host-contract-version' ||
reply === undefined
) {
return;
}
reply.postMessage({ version: SANDBOX_SCHEMA_VERSION });
reply.close();
});
let hostUpdateRequired = false;
let applyingUpdate = false;

Expand Down
2 changes: 1 addition & 1 deletion apps/host/tests/functional/chinpokomon.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ import { expect, test, type Page } from '@playwright/test';
import { readFile, readdir } from 'node:fs/promises';
import { join, relative } from 'node:path';
// Node-loaded specs use the side-effect-free contract, not the browser config barrel.
import { SANDBOX_SCHEMA_VERSION } from '../../../../packages/config/src/host-sandbox-contract.js';
import { SANDBOX_SCHEMA_VERSION } from '../../../../packages/config/src/host-sandbox-version.js';
import { archiveCar, installTruapiPortResponder } from './helpers/polkavm.js';

const bundleDir = process.env['DOTLI_CHINPOKOMON_BUNDLE'];
Expand Down
Loading
Loading