// SPDX-License-Identifier: MIT pragma solidity ^0.8.13; contract LivenessTrackedManifestRegistry { struct Entry { bytes32 manifest; uint64 lastHeartbeat; } mapping(address => Entry) public entries; uint256 public immutable heartbeatInterval; event ManifestUpdated(address indexed agent, bytes32 manifest); event AgentEvicted(address indexed agent); constructor(uint256 _heartbeatInterval) { require(_heartbeatInterval > 0, "interval required"); heartbeatInterval = _heartbeatInterval; } function updateManifest(bytes32 _manifest) external { entries[msg.sender] = Entry({ manifest: _manifest, lastHeartbeat: uint64(block.timestamp) }); emit ManifestUpdated(msg.sender, _manifest); } function heartbeat() external { Entry storage entry = entries[msg.sender]; require(entry.lastHeartbeat != 0, "not registered"); entry.lastHeartbeat = uint64(block.timestamp); } function remove() external { Entry storage entry = entries[msg.sender]; require(entry.lastHeartbeat != 0, "not registered"); delete entries[msg.sender]; emit ManifestUpdated(msg.sender, bytes32(0)); } function evictStale(address _agent) external { Entry storage entry = entries[_agent]; require(entry.lastHeartbeat != 0, "not registered"); require(block.timestamp - entry.lastHeartbeat > heartbeatInterval, "not stale"); delete entries[_agent]; emit AgentEvicted(_agent); } }