Skip to content

v10.0.0-rc.8

Pre-release
Pre-release

Choose a tag to compare

@branarakic branarakic released this 15 May 22:23
· 2175 commits to main since this release
2729848

libp2p reachability hardening (capacity / observability / multi-reservation series), tag-triggered npm publishing, agent-to-agent debug chat, Node UI chat panel revamp, and a Base Sepolia 7-contract redeploy. Testnet contract redeploy requiredchainResetMarker bumped to v10-profilestorage-paramstore-redeploy-2026-05-14 (already on main since #511); first boot on rc.8 wipes per-node chain-derived state for any operator still on the rc.6 marker. Hub at 0xC056e67Da4F51377Ad1B01f50F655fFdcCD809F6 and Token at 0x2A58BdD13176D85906D804cdbFFA0D9119282DC8 retain their addresses.

Added

  • libp2p reachability hardening PR1/3 — Core Node relay capacity + TTLs + operator knob (PR #524, packages/core/src/node.ts, packages/core/src/types.ts, packages/cli/src/config.ts, packages/agent/src/dkg-agent.ts): Core Nodes now scale circuitRelayServer capacity by RELAY_CAPACITY_MULTIPLIER so a node advertising itself as a relay actually accepts the reservations it gets dialed for. New DKGNodeConfig.relayServerCapacity operator knob (validated by validateRelayServerCapacity) lets large-fanout operators scale maxReservations / maxCircuits / maxOutboundStreams / maxInboundStreams together; defaults stay safe for small operators. Reservation TTL extended to 2 h with defaultDurationLimit of 30 min so long-lived edges aren't churned on every refresh cycle.
  • libp2p reachability hardening PR2/3 — relay observability (PR #525, new packages/core/src/relay-metrics-adapter.ts, new packages/core/src/relay-internal-shapes.ts, packages/core/src/node.ts, packages/node-ui/src/db.ts, packages/node-ui/src/api.ts): RelayMetricsAdapter plugs into libp2p as a Metrics implementation and counts relay-server bytes by direction via RELAY_V2_HOP_CODEC / RELAY_V2_STOP_CODEC stream tracking (no more guessing from raw connection metadata). New /api/relay/stats endpoint surfaces { activeReservations, activeCircuits, bytesIn, bytesOut }; values are persisted as relay_* columns on metric_snapshots for retention. Compatibility helpers (readRelayReservations, readConnectionStreams) validate libp2p internal shapes and return null on mismatch so the API reports a visible error rather than silently stale zeros if libp2p ever refactors. Pinned by packages/core/test/relay-internal-shapes.test.ts (9 cases).
  • libp2p reachability hardening PR3/3 — edge multi-reservation tuning (PR #526, packages/core/src/node.ts, packages/core/test/relay.test.ts): edge nodes can now hold multiple parallel relay reservations for redundancy via DKGNodeConfig.relayReservationCount (default 3, gated to edge nodes that actually have relayPeers). The relay watchdog enforces per-relay reservation presence when target > 1, with a per-tick forced-redial budget capped at missingSlotsAtTickStart so a single cycle can't burn through every relay. New canonical usableRelayCandidates pass deduplicates relayPeers by canonical peerId (handles mixed base58btc/base32 encodings), aggregates alternate transports for the same peer ([relayA-tcp, relayA-ws] → one RelayTarget with both addrs), drops self-references, and warns on malformed entries. AutoNAT gating + /p2p-circuit listener fallback now key off usableRelayCandidates.length so a node whose every configured relay is unusable falls back cleanly instead of half-configuring itself.
  • Agent-to-agent debug chat (PRs #510, #521, packages/mcp-dkg/src/index.ts, new packages/agent/src/message-outbox.ts, packages/core/src/protocol-router.ts): MCP exposes dkg_send_message / dkg_check_inbox / dkg_get_chat_history / dkg_list_agents so two agents on different nodes can exchange threaded messages with ACL enforcement (sender-on-allowlist, no rate-limit bypass). MessageOutbox retries silent-dropped invitee deliveries with per-key inflight guard against duplicate-delivery races; ProtocolRouter.send re-runs peerResolver per attempt so a stale handle from boot doesn't strand subsequent retries.
  • Node UI chat panel UX/UI revamp (PRs #503, #504, #505, #516, #528, #529, packages/node-ui/src/components/chat/**): full chat-panel rebuild — sticky header, custom Select for project switching, drag-and-drop file composer with chip rendering, markdown + syntax highlighting in assistant turns, full-width assistant bubbles, send-button states, hover-revealed timestamps, inline streaming caret, my-projects picker, and a 404-resilient markdown viewer for imported documents. Replaces the legacy chat surface end-to-end.
  • Tag-triggered npm publishing (PR #522, .github/workflows/npm-publish.yml, .github/workflows/release.yml): merging to main no longer publishes anything to npm. Publishing now fires only on signed annotated tags matching v<major>.<minor>.<patch> (e.g. v10.0.0-rc.8), and only when the tag is reachable from main or v10-rc, ssh- or gpg-signed, and matches every package.json version in the workspace. The npm-publish GitHub Environment requires a reviewer (5-minute wait, no self-approval) before any package is pushed. Replaces the previous continuous-publish-on-merge flow.

Fixed

  • relayServerCapacity validator silently accepted unsafe-integer values (PR #530, packages/core/src/node.ts, packages/core/test/relay-capacity.test.ts): the validator used Number.isInteger which accepts values above Number.MAX_SAFE_INTEGER (e.g. 9007199254740993); multiplying by RELAY_CAPACITY_MULTIPLIER then silently lost precision and corrupted the libp2p caps. Now uses Number.isSafeInteger and a new MAX_RELAY_SERVER_CAPACITY ceiling that ensures every derived cap also stays within the safe range. deriveRelayCaps got the same belt-and-braces check.
  • Staking-V10: _convertToNFT left migrated TRAC stranded in StakingStorage (PR #491, packages/evm-module/contracts/StakingV10.sol): the conviction-NFT conversion path read the migrated balance from StakingStorage but never transferred it onward to ConvictionStakingStorage, so the underlying TRAC was unrecoverable from either side post-conversion. Now transfers the balance in the same call before minting the NFT.
  • Staking-V10: operator-fee lookup ignored historical epoch (PR #493, packages/evm-module/contracts/StakingV10.sol): _getEffectiveOperatorFee resolved against the latest fee-change rather than the epoch the lookup was for, so reward calculations against past epochs used today's fee. Now binds the lookup to the requesting epoch's timestamp.
  • Post-approval sync gap hid freshly-joined curated CGs (PR #517, packages/agent/src/dkg-agent.ts): a window between approval-event arrival and _meta reconciliation left the just-joined CG invisible to the invitee until the next periodic sync. Approval handling now triggers an immediate targeted sync of the new CG.
  • Curator reject-reason was hidden in JoinProjectModal (PR #508, packages/node-ui/src/components/.../JoinProjectModal.tsx): the modal swallowed the reason field on JOIN_REQUEST_REJECTED, leaving operators with a generic "rejected" UI. Now surfaces the curator's explicit reason string.
  • Axiom-4 trust upgrades (PR #523): hardened trust-upgrade endpoint inputs, bounded the verify-collection timeout, fail-closed on non-quorum verify, and aligned devnet trust paths with the new gating. Companion devnet sections cover the regression surfaces.
  • npm-publish job missed hidden .publish-artifacts upload (PR #515, .github/workflows/npm-publish.yml): renamed to non-hidden publish-artifacts so actions/upload-artifact includes it; preceded #522 (tag-triggered publishing) and unblocked the new flow.

Changed

  • Base Sepolia (chainId 84532): 7 contracts redeployed off main@7235e669 (PR #511, packages/evm-module/deployments/base_sepolia_v10_contracts.json): refresh of the Profile/ProfileStorage/ParameterStorage family + the staking-V10 contracts that needed the #491 / #493 fixes deployed. New addresses are committed to base_sepolia_v10_contracts.json; agents discover them via Hub.getContractAddress(...) at runtime so no network/testnet.json edit was needed beyond the chainResetMarker bump (v10-rc6-pca-author-attestation-2026-05-10v10-profilestorage-paramstore-redeploy-2026-05-14). Hub + Token addresses preserved.

Note: this release was published to npm manually due to a workflow bug (#532) that blocked the tag-triggered CI publish. All 15 public packages are at 10.0.0-rc.8 under the rc dist-tag. Future releases will go through the proper signed-tag CI flow once #532 lands.