Loading
feat: restore service info logging with historical reporting
Restores service info logging (ports, packages, IP, init module) that was lost during the migration to the current juice architecture, and extends it with historical reporting for the Nebula project's reporting needs.
- Add shell_port, iopub_port, stdin_port, control_port, hb_port, ip, init_module, and available_usb_devices to ServiceInfo
- Wire info gathering into service startup automatically via a template method on Service (_setup_service_specifics/_service_info_kwargs hooks), so TaskManagerService, IPythonService, and any future subclass report correctly without needing to remember to call it themselves
- Add RuntimeData.store(keep_history=True) and load_history() to keep a timestamped historical archive per service, deduplicated when nothing has changed between restarts
- Add Client.get_service_info(service_name, timestamp=...) to read the current or a historical snapshot
- Wrap store_service_info() in try/except so a failure gathering this info can never prevent a service from starting
- Add tests for all of the above; full suite passing with no regressions
- Update docs: concepts/service.md, reference/historical/differences-legacy-juice.md, tutorials/basics/accessing-services.md