All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- Add
fetch,Request,Headers, andResponseto available vat endowments (#942)- Add
VatConfig.network: { allowedHosts: string[] }; requesting'fetch'without it rejectsinitVat
- Add
- Integrate Snaps attenuated endowment factories into vat globals (#937)
- Add
setInterval,clearInterval,crypto,SubtleCrypto, andMath(crypto-backedMath.random) to the default vat endowments - BREAKING:
setTimeoutnow enforces a 10 ms minimum delay (upstream SnapsMINIMUM_TIMEOUT); shorter delays are silently coerced to 10 ms - BREAKING:
Date.now()is attenuated — each read adds up to 1 ms of random jitter, clamped monotonic non-decreasing; precise sub-millisecond timing no longer leaks through - BREAKING:
clearTimeout/clearIntervalonly clear handles created by the same vat'ssetTimeout/setInterval; passing a host-format handle is a no-op - BREAKING: replace exported
DEFAULT_ALLOWED_GLOBALSconstant withcreateDefaultEndowments()factory andVatEndowmentstype;VatSupervisornow acceptsmakeAllowedGlobalsin place ofallowedGlobals
- Add
- Make vat global allowlist configurable and expand available endowments (#933)
- Export
DEFAULT_ALLOWED_GLOBALSwithURL,URLSearchParams,atob,btoa,AbortController, andAbortSignalin addition to the existing globals - Accept optional
allowedGlobalsonVatSupervisorfor custom allowlists - Log a warning when a vat requests an unknown global
- Export
- Export
OcapURLIssuerServiceandOcapURLRedemptionServicetypes so vats can type the corresponding kernel-service endowments (#952)
- BREAKING: Remove
VatConfig.platformConfig.fetch— migrate toglobals: ['fetch', ...]+network.allowedHosts(#942) - BREAKING:
MakeAllowedGlobalsnow takes a{ logger }options bag (#942) - BREAKING: Type
VatConfig.globalsandKernel.make'sallowedGlobalNamesasAllowedGlobalName[](a literal union) instead ofstring[]; unknown names are now rejected at theinitVatRPC boundary (#941)- Exports:
AllowedGlobalName,AllowedGlobalNameStruct,MakeAllowedGlobals,VatEndowmentsStruct
- Exports:
- Bound relay hints in OCAP URLs to a maximum of 3 and cap the relay pool at 20 entries with eviction of oldest non-bootstrap relays (#929)
- Deserialize CapData rejections in
Kernel.queueMessageso vat errors surface as plainErrorobjects to all callers (#928) - Detect peer restart across receiver state loss so the receiving kernel no longer silently drops a restarted peer's
seq=1messages (#948)- Persist the peer's last-observed incarnation and compare it on every successful handshake; on a detected restart, clear the peer's c-list contributions and reject the promises it was deciding before the new incarnation reuses any erefs
- Accept liveslots-allocated durable, virtual, and faceted vrefs (e.g.
o+d10/1,o+v3/4:0) inisVRef/insistERef/EndpointMessageStructvalidation (#949)- Previously the regex only matched plain
[op][+-]N, so any vat usingdefineDurableKindfailed outgoing-send validation and persisted-slot reads
- Previously the regex only matched plain
- Regenerate
incarnationIdwhenresetStorage=trueclears the rest of kernel state, completing the #948 peer-restart detection on browser/extension kernel reloads (#950)- The previous except-list preserved
incarnationIdacrossresetStoragewipes, so a restarted sender signalled the same incarnation it had before the wipe and the matching receiver's handshake decided "no restart" — leaving stalehighestReceivedSeqin place and silently dropping the sender's freshseq=1messages
- The previous except-list preserved
- Register a new vat with its subcluster before awaiting
runVat, so a garbage-collection pass during bundle load cannot delete the still-empty subcluster out from under the in-progress vat creation (#952) - Use length-prefixed framing for remote messages so payloads larger than the underlying transport's per-frame cutoff (e.g.
@libp2p/webrtc's 16 KB datachannel limit) are reassembled correctly on the receiver (#957)- Replace
byteStreamwithlpStreamon every remote channel; the byte-oriented stream did not preservewrite()boundaries, so any message the transport split into multiple frames was parsed from the first frame only, silently dropped without acknowledgement, and the sender retried until giving up afterMAX_RETRIES - Surface receiver-side framing-cap violations (
InvalidDataLengthError,InvalidDataLengthLengthError) asResourceLimitErrorwithlimitType: 'messageSize'so size errors look the same whether they tripped on the sender'svalidateMessageSizeor the receiver's framing decoder
- Replace
- Restore IO channels for persisted subclusters at kernel init so re-incarnated vats find their IOService references live (#963)
SubclusterManager.restorePersistedIOChannels()walks every persisted subcluster, finds those whose config declaresio, and re-creates the channels viaIOManagerbeforeinitializeAllVatsruns- Without this, any vat that opened an IO channel via
launchSubclusterlost its channel acrossdaemon stop/daemon startand silently held a dead IOService reference
- Add various configurable timeouts for remote communications (#906)
- Propagate relay hints from redeemed ocap URLs (#887)
- Add
allowedWsHostsparameter toinitializeRemoteComms()(#878)
- BREAKING: Adopt branded string types for kernel identifiers (#917, #921)
- Standardize vat-observable kernel errors (#913)
- Upgrade libp2p to v3 and improve remote communication reliability (#900, #915)
- Auto-extract
allowedWsHostsfrom plainws://relay multiaddrs inConnectionFactory(#881) - Use
E()for kernel service invocation to support remote presences as services (#872)
- Attempt to reconnect to unreachable relays on startup (#918)
- Restore single-delivery guarantee per crank and prevent rollback cache staleness (#879)
- Add
TextEncoder,TextDecoder,setTimeout, andclearTimeoutto vat globals allowlist (#856) - Add
IOManagerand IO kernel service for vat I/O streams (#840) - Add system subclusters and kernel facet service (#803)
- Buffer vat outputs to make cranks transactional (#794)
- Enqueue async vat syscalls immediately when outside a crank (#848)
- Add caplet vat type for lightweight vat configurations (#753)
- Add CapTP infrastructure for kernel-to-kernel communication (#751)
- Prevent vat endowment names from being overridden (#619)
- Add kernel-to-kernel remote communication via libp2p (#578)
- Add
remoteCommsstatus toKernel.getStatus()output (#637) - Add
relaysparameter toinitRemoteCommsfor configuring relay servers (#638) - Add location hint support to OCAP URL handling (#666)
- Fix kernel restart with open remote connections (#677)
- Add automatic reconnection with exponential backoff for remote comms (#678)
- Fix remote endpoint initialization to occur during registration rather than construction (#681)
- Fix shutdown handling to properly sequence crank completion, stream closing, and remote comms teardown (#692)
- Fix remote message queueing during connection establishment (#697)
- Add explicit connection management for intentional disconnects (#699)
- Reject pending promises on connection loss (#706)
- Refactor remote location hint handling and add
registerLocationHintsplatform service (#712) - Add timeout handling for remote message sends and URL redemptions (#713)
- Add resource limits for remote communications (#714)
- Add message sequencing and acknowledgment to remote messaging (#744)
- Persist pending messages and sequence state in
RemoteHandleacross restarts (#760) - Add rate limiting for remote messages and connections (#776)
- Add BIP39 mnemonic support for kernel identity seed recovery (#780)
- Add kernel incarnation detection protocol for identifying peer restarts (#788)
- Add permanent failure detection for reconnection attempts (#789)
- Add incarnation ID infrastructure and handshake module (#800)
- Handle reconnection to restarted peers with incarnation ID detection (#807)
- Complete Ken protocol implementation for reliable remote message delivery (#811)
- Implement distributed garbage collection protocol for remote references (#814)
- Add cross-incarnation wake detection to reset backoffs on peer restart (#822)
- Enable OCAP URL issuance and redemption without active remote comms (#823)
- Add direct transport support (QUIC + TCP) for Node.js peer connections (#839)
- Add
initRemoteCommsandregisterLocationHintsRPC methods for kernel control (#849) - Fix trailing comma in OCAP URLs when no relays are known (#850)
- Allow plain
ws://connections for relay dialing (#855) - Restrict plain
ws://relay dialing to private and explicitly allowed addresses (#857) - Accept
allowedWsHostsparameter ininitRemoteCommsRPC (#858) - Re-dial relays on connection close with exponential backoff (#860)
- Add
- BREAKING: Drop Node 20 support (#837)
- Close database in
Kernel.stop()(#845) - Remove
reloadConfigandreloadSubclustermethods fromKernel(#836) - Export
BaggageandVatPowerstypes (#801) - Load vat bundles via Vite instead of
@endo/import-bundle(#763) - Extract
VatManagerandSubclusterManagerfromKernelclass (#651)- Extract
RemoteManagerandKernelServiceManagerfromKernelclass (#653)
- Extract
- Migrate kernel service dispatch from
FartomakeExo(#612)
- Disable cache for default bundle fetch (#802)
- Clean up orphan messages during recovery (#769)
- Fix message delivery to terminated vats (#617)
- Handle messages remaining in queue after kernel restart (#611)
- Fix kernel initialization and operation with persistent storage (#604)
- Dual-license package under MIT and/or Apache 2.0 (#601)
- Add kernel service object support (#563)
- Wait for crank to run kernel actions (#595)
- Bump Endo and Agoric dependencies (#590)
- Throw if subcluster launch fails (#566)
- Use
@metamask/logger(#559)
- Remove redundant kernel promise ref count increment (#565)
- Remove support for launching vats outside a subcluster (#535)
- Throwing from remotable method rejects result (#545)
- Make export paths compatible with Browserify (#533)
- Properly handle syscall failures (#520)
- Add
Kernel.getStatus()(#522) - Use JSON-RPC notifications for vat syscalls (#528)
- Remove
waitForSyscallsToComplete()(#527)
- Initial release.