instar 1.3.1649 → 1.3.1650
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dashboard/console/accounts.js +2 -1
- package/dashboard/console/agents-model.js +3 -3
- package/dashboard/console/agents.js +7 -4
- package/dashboard/console/console.css +1 -0
- package/dashboard/console/console.js +35 -4
- package/dashboard/console/costs-model.js +12 -0
- package/dashboard/console/costs.js +6 -3
- package/dashboard/console/development-model.js +9 -3
- package/dashboard/console/development.js +7 -4
- package/dashboard/console/home-model.js +30 -14
- package/dashboard/console/mandates.js +3 -3
- package/dashboard/console/needs-model.js +105 -0
- package/dashboard/console/plans.js +2 -1
- package/dashboard/console/secrets.js +2 -2
- package/dashboard/console/ticket-model.js +36 -0
- package/dashboard/console/ui.js +3 -0
- package/dist/cli.js +8 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/install.d.ts +9 -7
- package/dist/commands/install.d.ts.map +1 -1
- package/dist/commands/install.js +2 -19
- package/dist/commands/install.js.map +1 -1
- package/dist/commands/reflect.d.ts.map +1 -1
- package/dist/commands/reflect.js +2 -0
- package/dist/commands/reflect.js.map +1 -1
- package/dist/commands/route.d.ts.map +1 -1
- package/dist/commands/route.js +2 -0
- package/dist/commands/route.js.map +1 -1
- package/dist/commands/server.d.ts.map +1 -1
- package/dist/commands/server.js +315 -14
- package/dist/commands/server.js.map +1 -1
- package/dist/commands/setClaudeKey.d.ts +8 -0
- package/dist/commands/setClaudeKey.d.ts.map +1 -0
- package/dist/commands/setClaudeKey.js +35 -0
- package/dist/commands/setClaudeKey.js.map +1 -0
- package/dist/core/AccountFollowMeOrchestrator.d.ts.map +1 -1
- package/dist/core/AccountFollowMeOrchestrator.js +4 -0
- package/dist/core/AccountFollowMeOrchestrator.js.map +1 -1
- package/dist/core/AppMediaStore.d.ts.map +1 -1
- package/dist/core/AppMediaStore.js +3 -0
- package/dist/core/AppMediaStore.js.map +1 -1
- package/dist/core/BackupManager.d.ts.map +1 -1
- package/dist/core/BackupManager.js +2 -0
- package/dist/core/BackupManager.js.map +1 -1
- package/dist/core/ClaudeCliIntelligenceProvider.d.ts.map +1 -1
- package/dist/core/ClaudeCliIntelligenceProvider.js +11 -3
- package/dist/core/ClaudeCliIntelligenceProvider.js.map +1 -1
- package/dist/core/ClaudeKeyHealth.d.ts +141 -0
- package/dist/core/ClaudeKeyHealth.d.ts.map +1 -0
- package/dist/core/ClaudeKeyHealth.js +467 -0
- package/dist/core/ClaudeKeyHealth.js.map +1 -0
- package/dist/core/CodexTaskContinuationStore.d.ts.map +1 -1
- package/dist/core/CodexTaskContinuationStore.js +7 -0
- package/dist/core/CodexTaskContinuationStore.js.map +1 -1
- package/dist/core/CoherenceJournal.d.ts +1 -1
- package/dist/core/CoherenceJournal.d.ts.map +1 -1
- package/dist/core/CoherenceJournal.js +11 -2
- package/dist/core/CoherenceJournal.js.map +1 -1
- package/dist/core/Config.d.ts +8 -0
- package/dist/core/Config.d.ts.map +1 -1
- package/dist/core/Config.js +26 -0
- package/dist/core/Config.js.map +1 -1
- package/dist/core/CredentialSwapExecutor.d.ts.map +1 -1
- package/dist/core/CredentialSwapExecutor.js +10 -0
- package/dist/core/CredentialSwapExecutor.js.map +1 -1
- package/dist/core/DecisionQualityRecorderImpl.d.ts.map +1 -1
- package/dist/core/DecisionQualityRecorderImpl.js +6 -0
- package/dist/core/DecisionQualityRecorderImpl.js.map +1 -1
- package/dist/core/DiscoveryEvaluator.d.ts.map +1 -1
- package/dist/core/DiscoveryEvaluator.js +4 -0
- package/dist/core/DiscoveryEvaluator.js.map +1 -1
- package/dist/core/IdentityReannounceClaimant.d.ts.map +1 -1
- package/dist/core/IdentityReannounceClaimant.js +4 -0
- package/dist/core/IdentityReannounceClaimant.js.map +1 -1
- package/dist/core/IntelligenceRouter.d.ts.map +1 -1
- package/dist/core/IntelligenceRouter.js +9 -0
- package/dist/core/IntelligenceRouter.js.map +1 -1
- package/dist/core/JournalSyncApplier.d.ts +1 -0
- package/dist/core/JournalSyncApplier.d.ts.map +1 -1
- package/dist/core/JournalSyncApplier.js +48 -0
- package/dist/core/JournalSyncApplier.js.map +1 -1
- package/dist/core/LeaseCoordinator.d.ts +4 -0
- package/dist/core/LeaseCoordinator.d.ts.map +1 -1
- package/dist/core/LeaseCoordinator.js +64 -1
- package/dist/core/LeaseCoordinator.js.map +1 -1
- package/dist/core/MessagingToneGate.d.ts +11 -7
- package/dist/core/MessagingToneGate.d.ts.map +1 -1
- package/dist/core/MessagingToneGate.js +15 -1
- package/dist/core/MessagingToneGate.js.map +1 -1
- package/dist/core/MobileDeviceKeys.d.ts +10 -0
- package/dist/core/MobileDeviceKeys.d.ts.map +1 -1
- package/dist/core/MobileDeviceKeys.js +17 -0
- package/dist/core/MobileDeviceKeys.js.map +1 -1
- package/dist/core/MultiMachineCoordinator.d.ts +12 -0
- package/dist/core/MultiMachineCoordinator.d.ts.map +1 -1
- package/dist/core/MultiMachineCoordinator.js +115 -3
- package/dist/core/MultiMachineCoordinator.js.map +1 -1
- package/dist/core/MutualSshRuntime.d.ts +1 -0
- package/dist/core/MutualSshRuntime.d.ts.map +1 -1
- package/dist/core/MutualSshRuntime.js +17 -1
- package/dist/core/MutualSshRuntime.js.map +1 -1
- package/dist/core/ObservedEndpointTracker.d.ts +1 -0
- package/dist/core/ObservedEndpointTracker.d.ts.map +1 -1
- package/dist/core/ObservedEndpointTracker.js +17 -0
- package/dist/core/ObservedEndpointTracker.js.map +1 -1
- package/dist/core/OverloadShedPlanner.d.ts.map +1 -1
- package/dist/core/OverloadShedPlanner.js +9 -0
- package/dist/core/OverloadShedPlanner.js.map +1 -1
- package/dist/core/OwnershipApplier.d.ts.map +1 -1
- package/dist/core/OwnershipApplier.js +7 -0
- package/dist/core/OwnershipApplier.js.map +1 -1
- package/dist/core/OwnershipReconciler.d.ts.map +1 -1
- package/dist/core/OwnershipReconciler.js +5 -0
- package/dist/core/OwnershipReconciler.js.map +1 -1
- package/dist/core/PostUpdateMigrator.d.ts +8 -0
- package/dist/core/PostUpdateMigrator.d.ts.map +1 -1
- package/dist/core/PostUpdateMigrator.js +76 -2
- package/dist/core/PostUpdateMigrator.js.map +1 -1
- package/dist/core/PrHandLease.d.ts.map +1 -1
- package/dist/core/PrHandLease.js +2 -0
- package/dist/core/PrHandLease.js.map +1 -1
- package/dist/core/ProactiveSwapMonitor.d.ts.map +1 -1
- package/dist/core/ProactiveSwapMonitor.js +7 -0
- package/dist/core/ProactiveSwapMonitor.js.map +1 -1
- package/dist/core/ProjectRoundExecution.d.ts.map +1 -1
- package/dist/core/ProjectRoundExecution.js +3 -2
- package/dist/core/ProjectRoundExecution.js.map +1 -1
- package/dist/core/QueueDrainLoop.d.ts +7 -0
- package/dist/core/QueueDrainLoop.d.ts.map +1 -1
- package/dist/core/QueueDrainLoop.js +37 -1
- package/dist/core/QueueDrainLoop.js.map +1 -1
- package/dist/core/RemoteAckStore.d.ts.map +1 -1
- package/dist/core/RemoteAckStore.js +4 -0
- package/dist/core/RemoteAckStore.js.map +1 -1
- package/dist/core/ReplicatedStoreReconcilerWiring.d.ts.map +1 -1
- package/dist/core/ReplicatedStoreReconcilerWiring.js +1 -0
- package/dist/core/ReplicatedStoreReconcilerWiring.js.map +1 -1
- package/dist/core/SecretSync.d.ts +1 -0
- package/dist/core/SecretSync.d.ts.map +1 -1
- package/dist/core/SecretSync.js +16 -0
- package/dist/core/SecretSync.js.map +1 -1
- package/dist/core/SessionManager.d.ts +11 -0
- package/dist/core/SessionManager.d.ts.map +1 -1
- package/dist/core/SessionManager.js +125 -14
- package/dist/core/SessionManager.js.map +1 -1
- package/dist/core/SessionPoolFailoverRunner.d.ts.map +1 -1
- package/dist/core/SessionPoolFailoverRunner.js +4 -0
- package/dist/core/SessionPoolFailoverRunner.js.map +1 -1
- package/dist/core/SleepWakeDetector.d.ts.map +1 -1
- package/dist/core/SleepWakeDetector.js +10 -0
- package/dist/core/SleepWakeDetector.js.map +1 -1
- package/dist/core/SubscriptionReloginStore.d.ts.map +1 -1
- package/dist/core/SubscriptionReloginStore.js +10 -1
- package/dist/core/SubscriptionReloginStore.js.map +1 -1
- package/dist/core/TopicPinMutation.d.ts.map +1 -1
- package/dist/core/TopicPinMutation.js +5 -0
- package/dist/core/TopicPinMutation.js.map +1 -1
- package/dist/core/UnjustifiedStopGate.d.ts.map +1 -1
- package/dist/core/UnjustifiedStopGate.js +22 -0
- package/dist/core/UnjustifiedStopGate.js.map +1 -1
- package/dist/core/WindowRunCadenceExecutor.d.ts.map +1 -1
- package/dist/core/WindowRunCadenceExecutor.js +20 -0
- package/dist/core/WindowRunCadenceExecutor.js.map +1 -1
- package/dist/core/claudeChildAuth.d.ts +68 -0
- package/dist/core/claudeChildAuth.d.ts.map +1 -0
- package/dist/core/claudeChildAuth.js +173 -0
- package/dist/core/claudeChildAuth.js.map +1 -0
- package/dist/core/claudeKeyProbe.d.ts +23 -0
- package/dist/core/claudeKeyProbe.d.ts.map +1 -0
- package/dist/core/claudeKeyProbe.js +68 -0
- package/dist/core/claudeKeyProbe.js.map +1 -0
- package/dist/core/codexDeviceLimitWiring.d.ts.map +1 -1
- package/dist/core/codexDeviceLimitWiring.js +12 -0
- package/dist/core/codexDeviceLimitWiring.js.map +1 -1
- package/dist/core/deliverToConversation.d.ts.map +1 -1
- package/dist/core/deliverToConversation.js +11 -0
- package/dist/core/deliverToConversation.js.map +1 -1
- package/dist/core/meteredCallEntry.d.ts.map +1 -1
- package/dist/core/meteredCallEntry.js +21 -0
- package/dist/core/meteredCallEntry.js.map +1 -1
- package/dist/core/nobodyPollingActuator.d.ts.map +1 -1
- package/dist/core/nobodyPollingActuator.js +5 -0
- package/dist/core/nobodyPollingActuator.js.map +1 -1
- package/dist/core/operatorSurfaceReferral.d.ts +18 -0
- package/dist/core/operatorSurfaceReferral.d.ts.map +1 -0
- package/dist/core/operatorSurfaceReferral.js +32 -0
- package/dist/core/operatorSurfaceReferral.js.map +1 -0
- package/dist/core/ownershipFollowsLiveWork.d.ts.map +1 -1
- package/dist/core/ownershipFollowsLiveWork.js +10 -1
- package/dist/core/ownershipFollowsLiveWork.js.map +1 -1
- package/dist/core/types.d.ts +15 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js.map +1 -1
- package/dist/core/worktreeDirtyCheck.d.ts.map +1 -1
- package/dist/core/worktreeDirtyCheck.js +2 -0
- package/dist/core/worktreeDirtyCheck.js.map +1 -1
- package/dist/data/stageBCertifiedSet.d.ts +9 -0
- package/dist/data/stageBCertifiedSet.d.ts.map +1 -1
- package/dist/data/stageBCertifiedSet.js +12 -0
- package/dist/data/stageBCertifiedSet.js.map +1 -1
- package/dist/data/standards-guard-index.json +1 -1
- package/dist/data/standards-guard-index.meta.json +2 -2
- package/dist/data/standards-registry.meta.json +1 -1
- package/dist/lifeline/TelegramLifeline.d.ts.map +1 -1
- package/dist/lifeline/TelegramLifeline.js +17 -3
- package/dist/lifeline/TelegramLifeline.js.map +1 -1
- package/dist/messaging/attentionHubPolicy.d.ts.map +1 -1
- package/dist/messaging/attentionHubPolicy.js +1 -0
- package/dist/messaging/attentionHubPolicy.js.map +1 -1
- package/dist/monitoring/AgentWorktreeReaper.d.ts.map +1 -1
- package/dist/monitoring/AgentWorktreeReaper.js +15 -0
- package/dist/monitoring/AgentWorktreeReaper.js.map +1 -1
- package/dist/monitoring/ApprenticeshipCycleSlaMonitor.d.ts.map +1 -1
- package/dist/monitoring/ApprenticeshipCycleSlaMonitor.js +18 -9
- package/dist/monitoring/ApprenticeshipCycleSlaMonitor.js.map +1 -1
- package/dist/monitoring/CodexArmSessionSweeper.d.ts.map +1 -1
- package/dist/monitoring/CodexArmSessionSweeper.js +11 -0
- package/dist/monitoring/CodexArmSessionSweeper.js.map +1 -1
- package/dist/monitoring/CrashLoopPauser.d.ts.map +1 -1
- package/dist/monitoring/CrashLoopPauser.js +8 -0
- package/dist/monitoring/CrashLoopPauser.js.map +1 -1
- package/dist/monitoring/DegradationReporter.d.ts.map +1 -1
- package/dist/monitoring/DegradationReporter.js +7 -1
- package/dist/monitoring/DegradationReporter.js.map +1 -1
- package/dist/monitoring/DegradedTmuxGuard.d.ts +2 -0
- package/dist/monitoring/DegradedTmuxGuard.d.ts.map +1 -1
- package/dist/monitoring/DegradedTmuxGuard.js +14 -0
- package/dist/monitoring/DegradedTmuxGuard.js.map +1 -1
- package/dist/monitoring/DurableOutputScrubber.d.ts.map +1 -1
- package/dist/monitoring/DurableOutputScrubber.js +7 -0
- package/dist/monitoring/DurableOutputScrubber.js.map +1 -1
- package/dist/monitoring/DurableVaultSession.d.ts.map +1 -1
- package/dist/monitoring/DurableVaultSession.js +15 -0
- package/dist/monitoring/DurableVaultSession.js.map +1 -1
- package/dist/monitoring/ExternalHogSentinel.d.ts +2 -0
- package/dist/monitoring/ExternalHogSentinel.d.ts.map +1 -1
- package/dist/monitoring/ExternalHogSentinel.js +27 -1
- package/dist/monitoring/ExternalHogSentinel.js.map +1 -1
- package/dist/monitoring/FailureLedger.d.ts.map +1 -1
- package/dist/monitoring/FailureLedger.js +38 -1
- package/dist/monitoring/FailureLedger.js.map +1 -1
- package/dist/monitoring/FeatureEvidenceLog.d.ts +5 -0
- package/dist/monitoring/FeatureEvidenceLog.d.ts.map +1 -1
- package/dist/monitoring/FeatureEvidenceLog.js +25 -0
- package/dist/monitoring/FeatureEvidenceLog.js.map +1 -1
- package/dist/monitoring/GeminiCapacityEscalationMonitor.d.ts.map +1 -1
- package/dist/monitoring/GeminiCapacityEscalationMonitor.js +20 -2
- package/dist/monitoring/GeminiCapacityEscalationMonitor.js.map +1 -1
- package/dist/monitoring/GeminiLoopRunner.d.ts.map +1 -1
- package/dist/monitoring/GeminiLoopRunner.js +11 -1
- package/dist/monitoring/GeminiLoopRunner.js.map +1 -1
- package/dist/monitoring/GreenPrAutoMerger.d.ts.map +1 -1
- package/dist/monitoring/GreenPrAutoMerger.js +11 -0
- package/dist/monitoring/GreenPrAutoMerger.js.map +1 -1
- package/dist/monitoring/GrowthDigestPublisher.d.ts.map +1 -1
- package/dist/monitoring/GrowthDigestPublisher.js +16 -0
- package/dist/monitoring/GrowthDigestPublisher.js.map +1 -1
- package/dist/monitoring/GrowthMilestoneAnalyst.d.ts +3 -0
- package/dist/monitoring/GrowthMilestoneAnalyst.d.ts.map +1 -1
- package/dist/monitoring/GrowthMilestoneAnalyst.js +45 -1
- package/dist/monitoring/GrowthMilestoneAnalyst.js.map +1 -1
- package/dist/monitoring/McpProcessReaper.d.ts +2 -0
- package/dist/monitoring/McpProcessReaper.d.ts.map +1 -1
- package/dist/monitoring/McpProcessReaper.js +32 -0
- package/dist/monitoring/McpProcessReaper.js.map +1 -1
- package/dist/monitoring/MissingLoginSessionDetector.d.ts +2 -1
- package/dist/monitoring/MissingLoginSessionDetector.d.ts.map +1 -1
- package/dist/monitoring/MissingLoginSessionDetector.js +23 -0
- package/dist/monitoring/MissingLoginSessionDetector.js.map +1 -1
- package/dist/monitoring/OrchestratorPoller.d.ts +1 -0
- package/dist/monitoring/OrchestratorPoller.d.ts.map +1 -1
- package/dist/monitoring/OrchestratorPoller.js +13 -0
- package/dist/monitoring/OrchestratorPoller.js.map +1 -1
- package/dist/monitoring/OrphanedWorkSentinel.d.ts.map +1 -1
- package/dist/monitoring/OrphanedWorkSentinel.js +7 -0
- package/dist/monitoring/OrphanedWorkSentinel.js.map +1 -1
- package/dist/monitoring/PresenceProxy.d.ts.map +1 -1
- package/dist/monitoring/PresenceProxy.js +9 -1
- package/dist/monitoring/PresenceProxy.js.map +1 -1
- package/dist/monitoring/ProcessFootprintMonitor.d.ts.map +1 -1
- package/dist/monitoring/ProcessFootprintMonitor.js +20 -2
- package/dist/monitoring/ProcessFootprintMonitor.js.map +1 -1
- package/dist/monitoring/PromiseBeacon.d.ts.map +1 -1
- package/dist/monitoring/PromiseBeacon.js +20 -0
- package/dist/monitoring/PromiseBeacon.js.map +1 -1
- package/dist/monitoring/ReleaseReadinessSentinel.d.ts +2 -0
- package/dist/monitoring/ReleaseReadinessSentinel.d.ts.map +1 -1
- package/dist/monitoring/ReleaseReadinessSentinel.js +26 -0
- package/dist/monitoring/ReleaseReadinessSentinel.js.map +1 -1
- package/dist/monitoring/RopeHealthMonitor.d.ts.map +1 -1
- package/dist/monitoring/RopeHealthMonitor.js +35 -1
- package/dist/monitoring/RopeHealthMonitor.js.map +1 -1
- package/dist/monitoring/SentinelNotifier.d.ts.map +1 -1
- package/dist/monitoring/SentinelNotifier.js +16 -0
- package/dist/monitoring/SentinelNotifier.js.map +1 -1
- package/dist/monitoring/SessionReaper.d.ts.map +1 -1
- package/dist/monitoring/SessionReaper.js +11 -2
- package/dist/monitoring/SessionReaper.js.map +1 -1
- package/dist/monitoring/SingleMachineFailoverGapDetector.d.ts +2 -0
- package/dist/monitoring/SingleMachineFailoverGapDetector.d.ts.map +1 -1
- package/dist/monitoring/SingleMachineFailoverGapDetector.js +20 -0
- package/dist/monitoring/SingleMachineFailoverGapDetector.js.map +1 -1
- package/dist/monitoring/SpeakerElection.d.ts.map +1 -1
- package/dist/monitoring/SpeakerElection.js +8 -0
- package/dist/monitoring/SpeakerElection.js.map +1 -1
- package/dist/monitoring/StrandedTopicSentinel.d.ts +3 -0
- package/dist/monitoring/StrandedTopicSentinel.d.ts.map +1 -1
- package/dist/monitoring/StrandedTopicSentinel.js +33 -0
- package/dist/monitoring/StrandedTopicSentinel.js.map +1 -1
- package/dist/native/InstarWedgeCanary.app/Contents/MacOS/InstarWedgeCanary +0 -0
- package/dist/native/instar-desktop-host +0 -0
- package/dist/providers/adapters/anthropic-headless/transport/oneShotCompletion.d.ts.map +1 -1
- package/dist/providers/adapters/anthropic-headless/transport/oneShotCompletion.js +5 -2
- package/dist/providers/adapters/anthropic-headless/transport/oneShotCompletion.js.map +1 -1
- package/dist/recommended/RecommendedServicesLedger.d.ts +91 -0
- package/dist/recommended/RecommendedServicesLedger.d.ts.map +1 -0
- package/dist/recommended/RecommendedServicesLedger.js +193 -0
- package/dist/recommended/RecommendedServicesLedger.js.map +1 -0
- package/dist/recommended/RecommendedServicesReplicatedStore.d.ts +14 -0
- package/dist/recommended/RecommendedServicesReplicatedStore.d.ts.map +1 -0
- package/dist/recommended/RecommendedServicesReplicatedStore.js +34 -0
- package/dist/recommended/RecommendedServicesReplicatedStore.js.map +1 -0
- package/dist/recommended/legacyDeclines.d.ts +11 -0
- package/dist/recommended/legacyDeclines.d.ts.map +1 -0
- package/dist/recommended/legacyDeclines.js +17 -0
- package/dist/recommended/legacyDeclines.js.map +1 -0
- package/dist/recommended/serviceIds.d.ts +3 -0
- package/dist/recommended/serviceIds.d.ts.map +1 -0
- package/dist/recommended/serviceIds.js +6 -0
- package/dist/recommended/serviceIds.js.map +1 -0
- package/dist/scaffold/templates.d.ts +2 -0
- package/dist/scaffold/templates.d.ts.map +1 -1
- package/dist/scaffold/templates.js +8 -0
- package/dist/scaffold/templates.js.map +1 -1
- package/dist/scheduler/JobResultTriage.d.ts.map +1 -1
- package/dist/scheduler/JobResultTriage.js +10 -0
- package/dist/scheduler/JobResultTriage.js.map +1 -1
- package/dist/scheduler/JobScheduler.d.ts.map +1 -1
- package/dist/scheduler/JobScheduler.js +12 -0
- package/dist/scheduler/JobScheduler.js.map +1 -1
- package/dist/scheduler/MentorOnboardingRunner.d.ts +3 -0
- package/dist/scheduler/MentorOnboardingRunner.d.ts.map +1 -1
- package/dist/scheduler/MentorOnboardingRunner.js +24 -2
- package/dist/scheduler/MentorOnboardingRunner.js.map +1 -1
- package/dist/server/AgentServer.d.ts +2 -0
- package/dist/server/AgentServer.d.ts.map +1 -1
- package/dist/server/AgentServer.js +76 -15
- package/dist/server/AgentServer.js.map +1 -1
- package/dist/server/BootHealthBeacon.d.ts +3 -0
- package/dist/server/BootHealthBeacon.d.ts.map +1 -1
- package/dist/server/BootHealthBeacon.js +9 -0
- package/dist/server/BootHealthBeacon.js.map +1 -1
- package/dist/server/CapabilityIndex.d.ts.map +1 -1
- package/dist/server/CapabilityIndex.js +10 -1
- package/dist/server/CapabilityIndex.js.map +1 -1
- package/dist/server/LifelineIngressGuard.d.ts.map +1 -1
- package/dist/server/LifelineIngressGuard.js +11 -0
- package/dist/server/LifelineIngressGuard.js.map +1 -1
- package/dist/server/PoolPollCache.d.ts +4 -0
- package/dist/server/PoolPollCache.d.ts.map +1 -1
- package/dist/server/PoolPollCache.js +33 -0
- package/dist/server/PoolPollCache.js.map +1 -1
- package/dist/server/machineRoutes.d.ts.map +1 -1
- package/dist/server/machineRoutes.js +6 -0
- package/dist/server/machineRoutes.js.map +1 -1
- package/dist/server/middleware.d.ts.map +1 -1
- package/dist/server/middleware.js +6 -0
- package/dist/server/middleware.js.map +1 -1
- package/dist/server/mobileConsoleTicket.d.ts +113 -0
- package/dist/server/mobileConsoleTicket.d.ts.map +1 -0
- package/dist/server/mobileConsoleTicket.js +405 -0
- package/dist/server/mobileConsoleTicket.js.map +1 -0
- package/dist/server/mobileConversationRoutes.d.ts.map +1 -1
- package/dist/server/mobileConversationRoutes.js +20 -1
- package/dist/server/mobileConversationRoutes.js.map +1 -1
- package/dist/server/mobileMediaRoutes.d.ts.map +1 -1
- package/dist/server/mobileMediaRoutes.js +3 -0
- package/dist/server/mobileMediaRoutes.js.map +1 -1
- package/dist/server/mobilePairingRoutes.d.ts +8 -2
- package/dist/server/mobilePairingRoutes.d.ts.map +1 -1
- package/dist/server/mobilePairingRoutes.js +67 -6
- package/dist/server/mobilePairingRoutes.js.map +1 -1
- package/dist/server/mobileSessionTerminalRoutes.d.ts +128 -0
- package/dist/server/mobileSessionTerminalRoutes.d.ts.map +1 -0
- package/dist/server/mobileSessionTerminalRoutes.js +389 -0
- package/dist/server/mobileSessionTerminalRoutes.js.map +1 -0
- package/dist/server/recommendedServiceRoutes.d.ts +13 -0
- package/dist/server/recommendedServiceRoutes.d.ts.map +1 -0
- package/dist/server/recommendedServiceRoutes.js +49 -0
- package/dist/server/recommendedServiceRoutes.js.map +1 -0
- package/dist/server/routes.d.ts +2 -0
- package/dist/server/routes.d.ts.map +1 -1
- package/dist/server/routes.js +170 -4
- package/dist/server/routes.js.map +1 -1
- package/dist/testing/selfActionRegistry.d.ts.map +1 -1
- package/dist/testing/selfActionRegistry.js +36 -0
- package/dist/testing/selfActionRegistry.js.map +1 -1
- package/dist/threadline/A2ACheckInProxy.d.ts.map +1 -1
- package/dist/threadline/A2ACheckInProxy.js +26 -15
- package/dist/threadline/A2ACheckInProxy.js.map +1 -1
- package/dist/threadline/AgentTrustManager.d.ts.map +1 -1
- package/dist/threadline/AgentTrustManager.js +3 -0
- package/dist/threadline/AgentTrustManager.js.map +1 -1
- package/dist/threadline/InboundIdLedger.d.ts.map +1 -1
- package/dist/threadline/InboundIdLedger.js +18 -1
- package/dist/threadline/InboundIdLedger.js.map +1 -1
- package/dist/threadline/NegotiatorGate.d.ts.map +1 -1
- package/dist/threadline/NegotiatorGate.js +11 -0
- package/dist/threadline/NegotiatorGate.js.map +1 -1
- package/dist/threadline/PipeSessionSpawner.d.ts.map +1 -1
- package/dist/threadline/PipeSessionSpawner.js +8 -0
- package/dist/threadline/PipeSessionSpawner.js.map +1 -1
- package/dist/threadline/ThreadlineRouter.d.ts.map +1 -1
- package/dist/threadline/ThreadlineRouter.js +13 -0
- package/dist/threadline/ThreadlineRouter.js.map +1 -1
- package/dist/threadline/pairingReplicationWiring.d.ts.map +1 -1
- package/dist/threadline/pairingReplicationWiring.js +9 -0
- package/dist/threadline/pairingReplicationWiring.js.map +1 -1
- package/dist/threadline/relayForward.d.ts.map +1 -1
- package/dist/threadline/relayForward.js +13 -2
- package/dist/threadline/relayForward.js.map +1 -1
- package/dist/threadline/relayUnknownSenderTrust.d.ts +0 -9
- package/dist/threadline/relayUnknownSenderTrust.d.ts.map +1 -1
- package/dist/threadline/relayUnknownSenderTrust.js +16 -0
- package/dist/threadline/relayUnknownSenderTrust.js.map +1 -1
- package/package.json +1 -1
- package/scripts/check-constitution-pairing.mjs +273 -0
- package/scripts/safe-merge.mjs +9 -0
- package/src/data/builtin-manifest.json +103 -103
- package/src/data/feature-ladders.json +113 -113
- package/src/data/stageBCertifiedSet.ts +12 -0
- package/src/data/standards-guard-index.json +1 -1
- package/src/data/standards-guard-index.meta.json +2 -2
- package/src/data/standards-registry.meta.json +1 -1
- package/src/data/state-coherence-registry.json +18 -0
- package/src/scaffold/templates.ts +9 -0
- package/upgrades/1.3.1650.md +105 -0
- package/upgrades/mobile-console-device-signin.eli16.md +5 -0
- package/upgrades/side-effects/cloud-key-internal-calls.md +116 -0
- package/upgrades/side-effects/constitution-alignment.eli16.md +11 -0
- package/upgrades/side-effects/constitution-alignment.md +69 -0
- package/upgrades/side-effects/feature-evidence-recording.eli16.md +3 -0
- package/upgrades/side-effects/feature-evidence-recording.md +66 -0
- package/upgrades/side-effects/feedback-reroute-admission-parity.md +77 -0
- package/upgrades/side-effects/mobile-console-device-signin.md +102 -0
- package/upgrades/side-effects/mobile-native-session-screen.md +88 -0
- package/upgrades/side-effects/operator-needs-first-screen.md +87 -0
- package/upgrades/side-effects/recommended-services-choices.md +50 -0
- package/upgrades/side-effects/rerouted-lifetime-active-process.md +63 -0
- package/upgrades/side-effects/undated-resurfacer-e2e-wait.eli16.md +5 -0
- package/upgrades/side-effects/undated-resurfacer-e2e-wait.md +9 -0
package/dist/commands/server.js
CHANGED
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
* the boot-time TCC-protected path detection + /guards row (see the
|
|
4
4
|
* TccProtectedPathGuard block beside the worktree detector).
|
|
5
5
|
*/
|
|
6
|
+
import { configureClaudeChildAuth, sweepClaudeAuthEnvFiles } from '../core/claudeChildAuth.js';
|
|
6
7
|
import { slackHistoryLabel } from '../messaging/slack/threadHistoryLabel.js';
|
|
7
8
|
import { readPairingOwnerName } from '../threadline/pairingOwnerName.js';
|
|
8
9
|
import { buildThrowawayJobGuard, checkThrowawayExpiry, describeExpiry, takeLastAutoStartRefusal, throwawayStartupDecision } from '../core/ThrowawayAgentGuard.js';
|
|
@@ -61,7 +62,7 @@ import { StandDownAudit } from '../core/StandDownAudit.js';
|
|
|
61
62
|
import { resolveStandardsRegistry } from '../core/standardsRegistryPath.js';
|
|
62
63
|
import { chunkLiteralForTmux, buildLiteralSendArgs } from '../core/tmuxLiteralSend.js';
|
|
63
64
|
import { parseStandardsRegistry } from '../core/StandardsRegistryParser.js';
|
|
64
|
-
import { loadConfig, ensureStateDir, detectTmuxPath, detectGeminiPath } from '../core/Config.js';
|
|
65
|
+
import { loadConfig, ensureStateDir, detectTmuxPath, detectGeminiPath, detectClaudePath, readConfiguredAnthropicKey } from '../core/Config.js';
|
|
65
66
|
import { handleProcessLevelError } from '../core/uncaughtExceptionPolicy.js';
|
|
66
67
|
import { planInboundLossNotices } from '../core/inboundLossRouting.js';
|
|
67
68
|
import { heartbeatFreshEnoughToRerecord } from '../core/MachineHeartbeat.js';
|
|
@@ -75,6 +76,7 @@ import { SingleInstanceLock, installReleaseHandlers } from '../core/SingleInstan
|
|
|
75
76
|
import { resolveDevAgentGate, resolveStateSyncStores } from '../core/devAgentGate.js';
|
|
76
77
|
import { JOB_LEASE_POOL_AUTHORITY_READY } from '../scheduler/JobLeaseClaimStore.js';
|
|
77
78
|
import { resolveRelayUnknownSenderTrustMode } from '../threadline/relayUnknownSenderTrust.js';
|
|
79
|
+
import { featureEvidence } from '../monitoring/FeatureEvidenceLog.js';
|
|
78
80
|
import { resolveEncryptToPinnedMode, encryptToPinnedModeName } from '../threadline/encryptToPinned.js';
|
|
79
81
|
import { resolveRefuseDowngradeMode } from '../threadline/refuseDowngrade.js';
|
|
80
82
|
import { MarkedPairingInviteFlow } from '../threadline/PairingPendingAcceptMarkers.js';
|
|
@@ -646,6 +648,9 @@ let _singleMachineFailoverGap = null;
|
|
|
646
648
|
// `GET /pool/missing-login` can read the detector constructed deep in the mesh
|
|
647
649
|
// peer-presence wiring. Null when the guard is dark (route 503s).
|
|
648
650
|
let _missingLoginSession = null;
|
|
651
|
+
// The journal compaction pass runs at boot, before the evidence log is wired by
|
|
652
|
+
// AgentServer; its row is held here and written straight after that construction.
|
|
653
|
+
let _pendingCompactionEvidence = null;
|
|
649
654
|
// Module-level handle for the SessionPoolFailoverRunner driver (§Rollout, Track H)
|
|
650
655
|
// so `GET /session-pool/failover-runner` can read its status(). Null when the
|
|
651
656
|
// runner is dark (dev-gated) — the route 503s. Constructed inside the rollout-gate
|
|
@@ -808,6 +813,8 @@ let _pinPlacementMetadata = null;
|
|
|
808
813
|
let _ws13SustainedOnline = null;
|
|
809
814
|
/** Cross-machine secret-sync (spec Phase 4): route-facing handle (push lever + read-only status). */
|
|
810
815
|
let _secretSyncHandle = null;
|
|
816
|
+
/** The boot-time escrow result, recorded as evidence once the evidence log is wired. Flags only, no key material. */
|
|
817
|
+
let _recoveryEscrowEvidence = null;
|
|
811
818
|
/** Pool Dashboard Streaming (POOL-DASHBOARD-STREAM-SPEC §2.3): shared single-use
|
|
812
819
|
* ticket store — minted by the `pool-stream-ticket` mesh verb, consumed by the
|
|
813
820
|
* WebSocketManager's /pool-stream upgrade. Constructed in the mesh-setup block. */
|
|
@@ -1001,6 +1008,7 @@ let _spawnAdmission = null;
|
|
|
1001
1008
|
/** Native app conversations (mobile-native-conversations, increment 1) — late-bound for the replication observers. */
|
|
1002
1009
|
let _appConversationService = null;
|
|
1003
1010
|
let _ecosystemLedger = null;
|
|
1011
|
+
let _recommendedServicesLedger = null;
|
|
1004
1012
|
// trustworthy-machine-load C5: one fixed holding notice per topic per overload
|
|
1005
1013
|
// episode when EVERY machine refuses new work (30-min cooldown; the message
|
|
1006
1014
|
// itself is already in durable custody, this only tells the user why it waits).
|
|
@@ -2484,6 +2492,14 @@ getHubClassifierDeps) {
|
|
|
2484
2492
|
modelTier: clsDeps.modelTier,
|
|
2485
2493
|
});
|
|
2486
2494
|
const willAct = result.isCommand && !clsDeps.dryRun;
|
|
2495
|
+
// Same scope as the audit below: LLM-engaged verdicts, never the prefilter-skip bulk.
|
|
2496
|
+
if (result.source !== 'prefilter-skip') {
|
|
2497
|
+
featureEvidence.record('threadline.hubIntent', {
|
|
2498
|
+
kind: result.source === 'fail-open' ? 'error' : 'fired',
|
|
2499
|
+
reason: result.source === 'fail-open' ? 'classifier-fail-open' : result.isCommand ? (willAct ? 'swallow' : 'would-swallow') : 'would-pass',
|
|
2500
|
+
context: { topicId, dryRun: clsDeps.dryRun, source: result.source, intent: result.intent ?? null, confidence: result.confidence ?? null, targetTopicId: result.targetTopicId ?? null },
|
|
2501
|
+
});
|
|
2502
|
+
}
|
|
2487
2503
|
// Audit the soak: log LLM-engaged decisions (a prefilter-skip is the
|
|
2488
2504
|
// bulk of traffic and always a would-pass — skipping it cuts volume
|
|
2489
2505
|
// AND the message-preview privacy surface). Never gates the message.
|
|
@@ -2528,6 +2544,7 @@ getHubClassifierDeps) {
|
|
|
2528
2544
|
}
|
|
2529
2545
|
catch (err) {
|
|
2530
2546
|
console.warn(`[telegram] hub-command intercept error (fail-open): ${err instanceof Error ? err.message : err}`);
|
|
2547
|
+
featureEvidence.record('threadline.hubIntent', { kind: 'error', reason: 'intercept-threw-fail-open', context: { errorName: err instanceof Error ? err.name : 'unknown' } });
|
|
2531
2548
|
}
|
|
2532
2549
|
}
|
|
2533
2550
|
// ── Fix commands from notification messages ──────────────────────
|
|
@@ -3861,6 +3878,10 @@ export async function startServer(options) {
|
|
|
3861
3878
|
watchPaths: ['updates.autoApply', 'sessions.maxSessions', 'monitoring'],
|
|
3862
3879
|
});
|
|
3863
3880
|
liveConfig.start();
|
|
3881
|
+
// Every server-side `claude` child gets the configured sign-in key from here, read per call so a
|
|
3882
|
+
// restored key applies at once (spec cloud-key-internal-calls). Off: sessions.claudeChildAuth.enabled.
|
|
3883
|
+
configureClaudeChildAuth(() => liveConfig.get('sessions.claudeChildAuth.enabled', true) === false ? undefined : config.sessions?.anthropicApiKey, () => config.sessions?.anthropicBaseUrl);
|
|
3884
|
+
sweepClaudeAuthEnvFiles(config.stateDir);
|
|
3864
3885
|
// Threadline → Telegram bridge config — settings surface for the bridge
|
|
3865
3886
|
// module. Default-OFF auto-create ships from day one;
|
|
3866
3887
|
// see TelegramBridgeConfig for the policy.
|
|
@@ -4075,6 +4096,7 @@ export async function startServer(options) {
|
|
|
4075
4096
|
// covers the window on the fleet. D4-verified read-only (localhost-only inbound
|
|
4076
4097
|
// socket, zero outbound). Belt-and-suspenders, not a boot reorder.
|
|
4077
4098
|
let bootBeacon;
|
|
4099
|
+
let bootBeaconBindErrorCode = null;
|
|
4078
4100
|
if (resolveDevAgentGate(config.monitoring?.bootHealthBeacon?.enabled, config)) {
|
|
4079
4101
|
try {
|
|
4080
4102
|
bootBeacon = new BootHealthBeacon(config.port);
|
|
@@ -4086,6 +4108,7 @@ export async function startServer(options) {
|
|
|
4086
4108
|
// failure must NEVER block the server boot (the startupGrace bump still
|
|
4087
4109
|
// covers the health window). Logged here, not swallowed silently.
|
|
4088
4110
|
bootBeacon = undefined;
|
|
4111
|
+
bootBeaconBindErrorCode = err?.code ?? 'unknown';
|
|
4089
4112
|
console.error(' Boot health beacon failed to start (non-fatal):', err instanceof Error ? err.message : err);
|
|
4090
4113
|
}
|
|
4091
4114
|
}
|
|
@@ -4779,6 +4802,9 @@ export async function startServer(options) {
|
|
|
4779
4802
|
// docs/specs/ecosystem-idea-pipeline.md: inert registration; the store is injected below whenever the pipeline is on.
|
|
4780
4803
|
const { ECOSYSTEM_IDEAS_KIND_REGISTRATION } = await import('../ecosystem/EcosystemIdeasReplicatedStore.js');
|
|
4781
4804
|
replicatedKindRegistry.register(ECOSYSTEM_IDEAS_KIND_REGISTRATION);
|
|
4805
|
+
// docs/specs/recommended-services.md: a person's choices follow them across machines.
|
|
4806
|
+
const { RECOMMENDED_SERVICES_KIND_REGISTRATION } = await import('../recommended/RecommendedServicesReplicatedStore.js');
|
|
4807
|
+
replicatedKindRegistry.register(RECOMMENDED_SERVICES_KIND_REGISTRATION);
|
|
4782
4808
|
// mobile-native-conversations §4.8 — the `mobileDeviceKeyLedger` kind (inert registration; on
|
|
4783
4809
|
// whenever native app conversations are on, so a signed record can be checked on any machine).
|
|
4784
4810
|
const { DEVICE_KEY_LEDGER_KIND_REGISTRATION } = await import('../core/MobileDeviceKeyLedgerReplicatedStore.js');
|
|
@@ -4940,13 +4966,35 @@ export async function startServer(options) {
|
|
|
4940
4966
|
const compactionConfig = config.multiMachine?.coherenceJournal?.replication?.compaction;
|
|
4941
4967
|
if (compactionConfig?.run === true) {
|
|
4942
4968
|
const { ReplicatedJournalCompactor } = await import('../core/ReplicatedJournalCompactor.js');
|
|
4943
|
-
|
|
4944
|
-
|
|
4945
|
-
|
|
4946
|
-
|
|
4947
|
-
|
|
4948
|
-
|
|
4949
|
-
|
|
4969
|
+
try {
|
|
4970
|
+
const compaction = new ReplicatedJournalCompactor({
|
|
4971
|
+
stateDir: config.stateDir,
|
|
4972
|
+
registry: replicatedKindRegistry,
|
|
4973
|
+
enabled: true,
|
|
4974
|
+
dryRun: compactionConfig.dryRun ?? true,
|
|
4975
|
+
logger: (m) => console.log(pc.dim(` ${m}`)),
|
|
4976
|
+
}).run();
|
|
4977
|
+
_pendingCompactionEvidence = {
|
|
4978
|
+
kind: 'fired',
|
|
4979
|
+
reason: compaction.dryRun ? 'would-compact' : 'compacted',
|
|
4980
|
+
context: {
|
|
4981
|
+
dryRun: compaction.dryRun,
|
|
4982
|
+
filesCompacted: compaction.filesCompacted,
|
|
4983
|
+
originalRecords: compaction.originalRecords,
|
|
4984
|
+
compactedRecords: compaction.compactedRecords,
|
|
4985
|
+
bytesBefore: compaction.bytesBefore,
|
|
4986
|
+
bytesAfter: compaction.bytesAfter,
|
|
4987
|
+
},
|
|
4988
|
+
};
|
|
4989
|
+
}
|
|
4990
|
+
catch (compactionErr) {
|
|
4991
|
+
_pendingCompactionEvidence = {
|
|
4992
|
+
kind: 'error',
|
|
4993
|
+
reason: 'compaction-failed',
|
|
4994
|
+
context: { dryRun: compactionConfig.dryRun ?? true, errorName: compactionErr instanceof Error ? compactionErr.name : 'unknown' },
|
|
4995
|
+
};
|
|
4996
|
+
throw compactionErr;
|
|
4997
|
+
}
|
|
4950
4998
|
// A real run replaced streams atomically; rebuild from the committed files.
|
|
4951
4999
|
}
|
|
4952
5000
|
coherenceJournal.setReplicatedRecordCommitObserver((kind, entries) => {
|
|
@@ -4973,6 +5021,14 @@ export async function startServer(options) {
|
|
|
4973
5021
|
for (const e of entries)
|
|
4974
5022
|
_ecosystemLedger.ingestReplicated(e.data.event);
|
|
4975
5023
|
}
|
|
5024
|
+
// A person's choices: each row lands only when it verifies under the machine it names.
|
|
5025
|
+
if (kind === 'recommended-service-record' && _recommendedServicesLedger) {
|
|
5026
|
+
for (const e of entries) {
|
|
5027
|
+
const r = _recommendedServicesLedger.ingestReplicated(e.data.row);
|
|
5028
|
+
if (r === 'bad-signature' || r === 'unverifiable')
|
|
5029
|
+
console.warn(` [recommended-services] a replicated row was not accepted (${r})`);
|
|
5030
|
+
}
|
|
5031
|
+
}
|
|
4976
5032
|
// Device-key ledger rows: each lands only when it verifies under the pinned key of the machine it names.
|
|
4977
5033
|
if (kind === 'mobile-device-key-ledger-row' && _appConversationService?.deps.keyLedger) {
|
|
4978
5034
|
const ledger = _appConversationService.deps.keyLedger;
|
|
@@ -5088,6 +5144,11 @@ export async function startServer(options) {
|
|
|
5088
5144
|
const _appNativeOn = _isMobileNativeEnabled(config);
|
|
5089
5145
|
const _stateSyncStoresResolved = (() => {
|
|
5090
5146
|
let s = _stateSyncStoresBase ?? {};
|
|
5147
|
+
// On wherever the journal is live: a yes or no belongs to the person, not one machine
|
|
5148
|
+
// (docs/specs/recommended-services.md). Without the journal there is no applier, so it isn't advertised.
|
|
5149
|
+
const _recommendedServicesOn = !!coherenceJournal && _stateSyncStoresBase?.recommendedServices?.enabled !== false;
|
|
5150
|
+
if (_recommendedServicesOn)
|
|
5151
|
+
s = { ...s, recommendedServices: { enabled: true } };
|
|
5091
5152
|
if (_appNativeOn)
|
|
5092
5153
|
s = { ...s, appConversations: { enabled: true }, mobileDeviceKeyLedger: { enabled: true } };
|
|
5093
5154
|
if (resolveDevAgentGate(config.ecosystemIdeas?.enabled, config))
|
|
@@ -5098,7 +5159,7 @@ export async function startServer(options) {
|
|
|
5098
5159
|
s = { ...s, topicPins: { enabled: true } };
|
|
5099
5160
|
if (_staleOwnerReleaseResolved)
|
|
5100
5161
|
s = { ...s, topicClaimAnnotations: { enabled: true } };
|
|
5101
|
-
return _appNativeOn || _accountFollowMeEnabled || _pinReplicateEnabled || _staleOwnerReleaseResolved || _stateSyncStoresBase ? s : _stateSyncStoresBase;
|
|
5162
|
+
return _recommendedServicesOn || _appNativeOn || _accountFollowMeEnabled || _pinReplicateEnabled || _staleOwnerReleaseResolved || _stateSyncStoresBase ? s : _stateSyncStoresBase;
|
|
5102
5163
|
})();
|
|
5103
5164
|
// WS2 send-side: the generic journal-backed record emitter (the concrete emitter
|
|
5104
5165
|
// the per-store managers' emit hooks call). Needs the journal sink, the HLC clock,
|
|
@@ -7682,6 +7743,7 @@ export async function startServer(options) {
|
|
|
7682
7743
|
// Never let a pauser fault take down the boot path or the interval.
|
|
7683
7744
|
clpLastError = err instanceof Error ? err.message : String(err);
|
|
7684
7745
|
console.error(pc.red(` CrashLoopPauser pass failed: ${clpLastError}`));
|
|
7746
|
+
featureEvidence.record('monitoring.crashLoopPauser', { kind: 'error', reason: 'pause pass failed', context: { dryRun: clpDryRun, errorName: err instanceof Error ? err.name : 'unknown' } });
|
|
7685
7747
|
}
|
|
7686
7748
|
};
|
|
7687
7749
|
const clpInitialDelay = clpCfg.initialPassDelayMs ?? 10 * 60_000;
|
|
@@ -8808,6 +8870,50 @@ export async function startServer(options) {
|
|
|
8808
8870
|
console.warn(` [app-conversations] wiring failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
8809
8871
|
}
|
|
8810
8872
|
}
|
|
8873
|
+
// docs/specs/recommended-services.md: built here so its rows replicate; no identity means no ledger, and the routes answer 503.
|
|
8874
|
+
try {
|
|
8875
|
+
const { loadMachineSigner, identityKeyLookup } = await import('../core/AppRecordSignatures.js');
|
|
8876
|
+
const { RecommendedServicesLedger } = await import('../recommended/RecommendedServicesLedger.js');
|
|
8877
|
+
const recRepl = await import('../recommended/RecommendedServicesReplicatedStore.js');
|
|
8878
|
+
const signer = loadMachineSigner(config.stateDir);
|
|
8879
|
+
if (signer) {
|
|
8880
|
+
const ledger = new RecommendedServicesLedger({ stateDir: config.stateDir, signer, keyLookup: identityKeyLookup(config.stateDir) });
|
|
8881
|
+
if (replicatedRecordEmitter) {
|
|
8882
|
+
const emitter = replicatedRecordEmitter;
|
|
8883
|
+
const emitRow = (row) => {
|
|
8884
|
+
const { outcome } = emitter.emit(recRepl.RECOMMENDED_SERVICES_STORE_KEY, recRepl.deriveRecommendedServiceRecordKey(row.eventId), recRepl.buildRecommendedServiceRecordData(row));
|
|
8885
|
+
if (outcome !== 'emitted')
|
|
8886
|
+
console.warn(` [recommended-services] a choice was not replicated yet (${outcome}); it is sent again at next boot`);
|
|
8887
|
+
};
|
|
8888
|
+
ledger.setReplicationHook(emitRow);
|
|
8889
|
+
ledger.setReplicating(_stateSyncStoresResolved?.recommendedServices?.enabled === true && config.multiMachine?.coherenceJournal?.replication?.enabled === true);
|
|
8890
|
+
// Rows written while the journal was off, or dropped by a rate cap, go out now.
|
|
8891
|
+
if (replicatedPeerStreamReader && cjOwnMachineId) {
|
|
8892
|
+
for (const row of ledger.all()) {
|
|
8893
|
+
if (row.machineId !== signer.machineId())
|
|
8894
|
+
continue;
|
|
8895
|
+
const rk = recRepl.deriveRecommendedServiceRecordKey(row.eventId);
|
|
8896
|
+
if (!replicatedPeerStreamReader.loadOriginRecords(recRepl.RECOMMENDED_SERVICES_STORE_KEY, rk).some((o) => o.origin === cjOwnMachineId))
|
|
8897
|
+
emitRow(row);
|
|
8898
|
+
}
|
|
8899
|
+
}
|
|
8900
|
+
}
|
|
8901
|
+
if (replicatedPeerStreamReader && cjOwnMachineId) {
|
|
8902
|
+
const reader = replicatedPeerStreamReader;
|
|
8903
|
+
for (const rk of reader.listRecordKeys(recRepl.RECOMMENDED_SERVICES_STORE_KEY)) {
|
|
8904
|
+
for (const r of reader.loadOriginRecords(recRepl.RECOMMENDED_SERVICES_STORE_KEY, rk)) {
|
|
8905
|
+
if (r.origin !== cjOwnMachineId)
|
|
8906
|
+
ledger.ingestReplicated(r.data.row);
|
|
8907
|
+
}
|
|
8908
|
+
}
|
|
8909
|
+
}
|
|
8910
|
+
_recommendedServicesLedger = ledger;
|
|
8911
|
+
}
|
|
8912
|
+
}
|
|
8913
|
+
catch (err) {
|
|
8914
|
+
// @silent-fallback-ok: reported; the routes answer 503 and nothing else depends on this
|
|
8915
|
+
console.warn(` [recommended-services] ledger wiring failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
8916
|
+
}
|
|
8811
8917
|
// docs/specs/ecosystem-idea-pipeline.md: the ledger is built here so its events replicate; AgentServer builds the service.
|
|
8812
8918
|
if (resolveDevAgentGate(config.ecosystemIdeas?.enabled, config)) {
|
|
8813
8919
|
try {
|
|
@@ -14068,9 +14174,26 @@ export async function startServer(options) {
|
|
|
14068
14174
|
if (replicatedRecordEmitter && _accountFollowMeEnabled) {
|
|
14069
14175
|
const emitter = replicatedRecordEmitter;
|
|
14070
14176
|
const { SUBSCRIPTION_ACCOUNT_META_STORE_KEY, deriveSubscriptionAccountMetaRecordKey, buildSubscriptionAccountMetaData, buildSubscriptionAccountMetaTombstoneData, } = await import('../core/SubscriptionAccountMetaReplicatedStore.js');
|
|
14177
|
+
// Every quota change re-projects an account, so one row per op and outcome per ten minutes. No account ids.
|
|
14178
|
+
const followMeEvidence = (op, outcome) => {
|
|
14179
|
+
const failed = outcome === 'error' || outcome === 'unconfirmed' || outcome.startsWith('dropped:');
|
|
14180
|
+
featureEvidence.recordAtMostEvery('multiMachine.accountFollowMe', `${op}:${outcome}`, 600_000, {
|
|
14181
|
+
kind: outcome === 'emitted' ? 'fired' : failed ? 'error' : 'held',
|
|
14182
|
+
reason: `account-meta-${op}:${outcome}`,
|
|
14183
|
+
context: { op, outcome },
|
|
14184
|
+
});
|
|
14185
|
+
};
|
|
14071
14186
|
subscriptionPool.setMetaReplicationEmitter({
|
|
14072
|
-
emitPut: (acct) =>
|
|
14073
|
-
|
|
14187
|
+
emitPut: (acct) => {
|
|
14188
|
+
const projected = emitter.emit(SUBSCRIPTION_ACCOUNT_META_STORE_KEY, deriveSubscriptionAccountMetaRecordKey(acct.id), (hlc, origin, observed) => buildSubscriptionAccountMetaData({ account: acct, hlc, origin, observed }));
|
|
14189
|
+
followMeEvidence('put', projected.outcome);
|
|
14190
|
+
return projected;
|
|
14191
|
+
},
|
|
14192
|
+
emitDelete: (accountId, deletedAt) => {
|
|
14193
|
+
const projected = emitter.emit(SUBSCRIPTION_ACCOUNT_META_STORE_KEY, deriveSubscriptionAccountMetaRecordKey(accountId), (hlc, origin, observed) => buildSubscriptionAccountMetaTombstoneData({ accountId, hlc, origin, deletedAt, observed }));
|
|
14194
|
+
followMeEvidence('delete', projected.outcome);
|
|
14195
|
+
return projected;
|
|
14196
|
+
},
|
|
14074
14197
|
});
|
|
14075
14198
|
}
|
|
14076
14199
|
// POOL-AWARE QUOTA THROTTLE wiring (docs/specs/POOL-AWARE-QUOTA-THROTTLE-SPEC.md):
|
|
@@ -16350,6 +16473,23 @@ export async function startServer(options) {
|
|
|
16350
16473
|
externalBlockSweepMs: aoftRawCfg.externalBlockSweepMs,
|
|
16351
16474
|
holdsLease: () => (leaseCoordinatorRef ? leaseCoordinatorRef.holdsLease() : true),
|
|
16352
16475
|
});
|
|
16476
|
+
// The aoft.* events have no other reader: keep them, with no message text (ids and reason codes only).
|
|
16477
|
+
for (const [event, kind] of [
|
|
16478
|
+
['aoft.would-suppress', 'fired'], ['aoft.suppressed', 'fired'],
|
|
16479
|
+
['aoft.would-reroute-terminal', 'fired'], ['aoft.terminal-rerouted', 'fired'],
|
|
16480
|
+
['aoft.would-deadletter-external', 'fired'], ['aoft.deadlettered-external', 'fired'],
|
|
16481
|
+
['aoft.external-block-recorded-internal', 'held'],
|
|
16482
|
+
['aoft.graveyard-reconciled', 'fired'],
|
|
16483
|
+
['aoft.beacon-id-leak', 'error'],
|
|
16484
|
+
]) {
|
|
16485
|
+
promiseBeacon.on(event, (e) => {
|
|
16486
|
+
featureEvidence.record('commitments.agentOwnedFollowthrough', {
|
|
16487
|
+
kind,
|
|
16488
|
+
reason: event.replace('aoft.', '') + (e?.reason ? `: ${e.reason}` : ''),
|
|
16489
|
+
context: { commitmentId: e?.id ?? null, topicId: e?.topicId ?? null, sendKind: e?.kind ?? null, dryRun: event.includes('would-') || e?.dryRun === true, closed: e?.closed ?? null, wouldClose: e?.wouldClose ?? null, leakedTerms: Array.isArray(e?.terms) ? e.terms.length : null },
|
|
16490
|
+
});
|
|
16491
|
+
});
|
|
16492
|
+
}
|
|
16353
16493
|
promiseBeacon.start();
|
|
16354
16494
|
globalThis.__instarPromiseBeacon = promiseBeacon;
|
|
16355
16495
|
// ── AutonomousProgressHeartbeat ──────────────────────────────────
|
|
@@ -16467,6 +16607,30 @@ export async function startServer(options) {
|
|
|
16467
16607
|
maxHeartbeatsPerRun: ahRawCfg.maxHeartbeatsPerRun,
|
|
16468
16608
|
recentOutputChangeWindowMs: ahRawCfg.recentOutputChangeWindowMs,
|
|
16469
16609
|
});
|
|
16610
|
+
// The focus line is a session's own words: never in a row. Suppressions run every tick, so only a change of reason per topic writes one.
|
|
16611
|
+
const ahLastHold = new Map();
|
|
16612
|
+
autonomousHeartbeat.on('would-emit', (e) => {
|
|
16613
|
+
ahLastHold.delete(e.topicId);
|
|
16614
|
+
featureEvidence.record('monitoring.autonomousHeartbeat', { kind: 'fired', reason: 'would emit (dry run)', context: { topicId: e.topicId, minutesSilent: e.minutesSilent, dryRun: true } });
|
|
16615
|
+
});
|
|
16616
|
+
autonomousHeartbeat.on('emitted', (e) => {
|
|
16617
|
+
ahLastHold.delete(e.topicId);
|
|
16618
|
+
featureEvidence.record('monitoring.autonomousHeartbeat', { kind: 'fired', reason: 'emitted', context: { topicId: e.topicId, minutesSilent: e.minutesSilent, dryRun: false } });
|
|
16619
|
+
});
|
|
16620
|
+
autonomousHeartbeat.on('send-error', (e) => {
|
|
16621
|
+
featureEvidence.record('monitoring.autonomousHeartbeat', { kind: 'error', reason: 'send failed', context: { topicId: e.topicId, errorName: e.err instanceof Error ? e.err.name : 'unknown' } });
|
|
16622
|
+
});
|
|
16623
|
+
autonomousHeartbeat.on('tick-error', (err) => {
|
|
16624
|
+
featureEvidence.recordAtMostEvery('monitoring.autonomousHeartbeat', 'tick-error', 60 * 60 * 1000, { kind: 'error', reason: 'tick failed', context: { errorName: err instanceof Error ? err.name : 'unknown' } });
|
|
16625
|
+
});
|
|
16626
|
+
autonomousHeartbeat.on('suppressed', (e) => {
|
|
16627
|
+
if (ahLastHold.get(e.topicId) === e.reason)
|
|
16628
|
+
return;
|
|
16629
|
+
if (ahLastHold.size >= 256)
|
|
16630
|
+
ahLastHold.clear();
|
|
16631
|
+
ahLastHold.set(e.topicId, e.reason);
|
|
16632
|
+
featureEvidence.record('monitoring.autonomousHeartbeat', { kind: 'held', reason: `suppressed: ${e.reason}`, context: { topicId: e.topicId } });
|
|
16633
|
+
});
|
|
16470
16634
|
autonomousHeartbeat.start();
|
|
16471
16635
|
globalThis.__instarAutonomousHeartbeat = autonomousHeartbeat;
|
|
16472
16636
|
guardRegistry.register('monitoring.autonomousHeartbeat.enabled', () => autonomousHeartbeat.guardStatus());
|
|
@@ -19599,6 +19763,17 @@ export async function startServer(options) {
|
|
|
19599
19763
|
});
|
|
19600
19764
|
if (featureRegistryReady) {
|
|
19601
19765
|
featureRegistry.bootstrap(config);
|
|
19766
|
+
// docs/specs/recommended-services.md: old declines carry over before any list is built.
|
|
19767
|
+
if (_recommendedServicesLedger) {
|
|
19768
|
+
try {
|
|
19769
|
+
const { importLegacyDeclines } = await import('../recommended/legacyDeclines.js');
|
|
19770
|
+
importLegacyDeclines(_recommendedServicesLedger, (id) => featureRegistry.getState(id, 'default')?.discoveryState ?? null);
|
|
19771
|
+
}
|
|
19772
|
+
catch (err) {
|
|
19773
|
+
// @silent-fallback-ok: reported; idempotent, so it retries at next boot, and optional work never blocks startup
|
|
19774
|
+
console.warn(` [recommended-services] old declines could not be imported yet: ${err instanceof Error ? err.message : String(err)}`);
|
|
19775
|
+
}
|
|
19776
|
+
}
|
|
19602
19777
|
}
|
|
19603
19778
|
{
|
|
19604
19779
|
const summaries = featureRegistry.getSummaries();
|
|
@@ -20474,6 +20649,102 @@ export async function startServer(options) {
|
|
|
20474
20649
|
_swapAntiThrashEngine = null;
|
|
20475
20650
|
_swapWorkGate = null;
|
|
20476
20651
|
}
|
|
20652
|
+
// A dead sign-in key on a key-only agent: confirmed, told, recovered (spec cloud-key-internal-calls).
|
|
20653
|
+
// Wired here, outside the subscription pool block, because these agents may have no pool.
|
|
20654
|
+
{
|
|
20655
|
+
const { ClaudeKeyHealth, claudeKeyFingerprint, setActiveClaudeKeyHealth } = await import('../core/ClaudeKeyHealth.js');
|
|
20656
|
+
const { buildClaudeKeyProbe } = await import('../core/claudeKeyProbe.js');
|
|
20657
|
+
const { configuredClaudeOauthKey, setClaudeCallOutcomeListener } = await import('../core/claudeChildAuth.js');
|
|
20658
|
+
const keyHealthOn = () => liveConfig.get('sessions.claudeKeyHealth.enabled', true) !== false;
|
|
20659
|
+
const sendToSlackKey = async (routingKey, text) => {
|
|
20660
|
+
const [channelId, threadTs] = routingKey.split(':');
|
|
20661
|
+
await _slackAdapter.sendToChannel(channelId, text, threadTs ? { thread_ts: threadTs } : undefined);
|
|
20662
|
+
};
|
|
20663
|
+
// The disk read covers a topic bound after this server booted, as SessionRefresh does.
|
|
20664
|
+
const topicForSession = (name) => telegram?.getTopicForSession(name) ?? telegram?.resolveTopicForSessionFromDisk?.(name) ?? null;
|
|
20665
|
+
const claudeKeyHealth = new ClaudeKeyHealth({
|
|
20666
|
+
stateFile: path.join(config.stateDir, 'state', 'claude-key-health.json'),
|
|
20667
|
+
currentKey: () => (keyHealthOn() ? configuredClaudeOauthKey() : undefined),
|
|
20668
|
+
currentRawKey: () => config.sessions.anthropicApiKey,
|
|
20669
|
+
readKeyFromDisk: () => (keyHealthOn() ? readConfiguredAnthropicKey(config.stateDir) : undefined),
|
|
20670
|
+
applyKey: (key) => {
|
|
20671
|
+
config.sessions.anthropicApiKey = key ?? undefined;
|
|
20672
|
+
sessionManager.setAnthropicKey(key);
|
|
20673
|
+
},
|
|
20674
|
+
probe: buildClaudeKeyProbe({
|
|
20675
|
+
claudePath: () => resolveFrameworkBinaryPath({
|
|
20676
|
+
framework: 'claude-code',
|
|
20677
|
+
frameworkBinaryPaths: config.sessions.frameworkBinaryPaths,
|
|
20678
|
+
claudePath: config.sessions.claudePath,
|
|
20679
|
+
configuredFramework: config.sessions.framework,
|
|
20680
|
+
}) ?? detectClaudePath(),
|
|
20681
|
+
baseUrl: () => config.sessions.anthropicBaseUrl,
|
|
20682
|
+
}),
|
|
20683
|
+
// Fixed server text straight to the adapters: the model is what is down, and `notify` returns
|
|
20684
|
+
// nothing, so it can't say whether anyone was told.
|
|
20685
|
+
notifyOperator: async (text) => {
|
|
20686
|
+
let delivered = false;
|
|
20687
|
+
const hubTopicId = state.get('agent-attention-topic') ?? 0;
|
|
20688
|
+
if (telegram && hubTopicId) {
|
|
20689
|
+
try {
|
|
20690
|
+
await telegram.sendToTopic(hubTopicId, text);
|
|
20691
|
+
delivered = true;
|
|
20692
|
+
}
|
|
20693
|
+
catch (err) { /* @silent-fallback-ok: `delivered` stays false, which drives the retry and its capped report */
|
|
20694
|
+
console.warn(`[ClaudeKeyHealth] Telegram notice failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
20695
|
+
}
|
|
20696
|
+
}
|
|
20697
|
+
const attentionChannel = state.get('slack-attention-channel');
|
|
20698
|
+
if (_slackAdapter && attentionChannel) {
|
|
20699
|
+
try {
|
|
20700
|
+
await _slackAdapter.sendToChannel(attentionChannel, text);
|
|
20701
|
+
delivered = true;
|
|
20702
|
+
}
|
|
20703
|
+
catch (err) { /* @silent-fallback-ok: `delivered` stays false, which drives the retry and its capped report */
|
|
20704
|
+
console.warn(`[ClaudeKeyHealth] Slack notice failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
20705
|
+
}
|
|
20706
|
+
}
|
|
20707
|
+
return delivered;
|
|
20708
|
+
},
|
|
20709
|
+
notifyPerson: async (sessionName, text) => {
|
|
20710
|
+
const topicId = topicForSession(sessionName);
|
|
20711
|
+
if (topicId !== null) {
|
|
20712
|
+
await telegram.sendToTopic(topicId, text);
|
|
20713
|
+
return true;
|
|
20714
|
+
}
|
|
20715
|
+
const routingKey = _slackAdapter?.getChannelForSession(sessionName) ?? null;
|
|
20716
|
+
if (routingKey !== null) {
|
|
20717
|
+
await sendToSlackKey(routingKey, text);
|
|
20718
|
+
return true;
|
|
20719
|
+
}
|
|
20720
|
+
return false;
|
|
20721
|
+
},
|
|
20722
|
+
listStuckSessions: async () => (await sessionManager.listSessionsAtLoginScreen()).filter((name) => topicForSession(name) !== null || (_slackAdapter?.getChannelForSession(name) ?? null) !== null),
|
|
20723
|
+
sessionLaunchFingerprint: (tmuxSession) => {
|
|
20724
|
+
const launched = sessionManager.sessionLaunchKey(tmuxSession);
|
|
20725
|
+
return launched ? claudeKeyFingerprint(launched) : null;
|
|
20726
|
+
},
|
|
20727
|
+
refresh: async (sessionName, prompt) => {
|
|
20728
|
+
if (!_sessionRefresh)
|
|
20729
|
+
return { ok: false, reason: 'session refresh not available' };
|
|
20730
|
+
const r = await _sessionRefresh.refreshSession({ sessionName, followUpPrompt: prompt, reason: 'claude-key-restored' });
|
|
20731
|
+
return r.ok ? { ok: true, newSessionName: r.newSessionName } : { ok: false, reason: r.code };
|
|
20732
|
+
},
|
|
20733
|
+
clearLoginReports: () => sessionManager.clearInteractiveLoginReports(),
|
|
20734
|
+
report: ({ reason, impact }) => DegradationReporter.getInstance().report({
|
|
20735
|
+
feature: 'ClaudeKeyHealth',
|
|
20736
|
+
primary: 'the configured Claude sign-in key authenticates every model call',
|
|
20737
|
+
fallback: 'the operator is told and stuck conversations wait for a working key',
|
|
20738
|
+
reason,
|
|
20739
|
+
impact,
|
|
20740
|
+
}),
|
|
20741
|
+
logger: { log: (m) => console.log(m), warn: (m) => console.warn(m) },
|
|
20742
|
+
});
|
|
20743
|
+
setActiveClaudeKeyHealth(claudeKeyHealth);
|
|
20744
|
+
setClaudeCallOutcomeListener((outcome) => claudeKeyHealth.noteCallOutcome(outcome));
|
|
20745
|
+
sessionManager.prependInteractiveLoginExpiredSink((signal) => claudeKeyHealth.handle(signal));
|
|
20746
|
+
void claudeKeyHealth.boot().catch((err) => console.warn(`[ClaudeKeyHealth] boot failed: ${err instanceof Error ? err.message : String(err)}`));
|
|
20747
|
+
}
|
|
20477
20748
|
// SessionRefresh — agent-initiated session respawn. Requires a Telegram
|
|
20478
20749
|
// adapter (v1 scope: Telegram-bound sessions only). The respawner closure
|
|
20479
20750
|
// captures `topicMemory` by reference, so even if topicMemory is wired up
|
|
@@ -23415,6 +23686,7 @@ export async function startServer(options) {
|
|
|
23415
23686
|
// root at already-paired peers remains an explicit operator/PIN step;
|
|
23416
23687
|
// the bearer recovery path can never become the first root writer.
|
|
23417
23688
|
const escrow = machineRecoveryKey.ensure(meshSelfId, own.recoveryEpoch ?? 0, own.recoveryPublicKey);
|
|
23689
|
+
_recoveryEscrowEvidence = { minted: !!escrow, recoveryEpoch: own.recoveryEpoch ?? 0, hadRoot: !!own.recoveryPublicKey };
|
|
23418
23690
|
if (own.recoveryPublicKey && !escrow) {
|
|
23419
23691
|
try {
|
|
23420
23692
|
_meshAttentionRaise?.({
|
|
@@ -24619,6 +24891,9 @@ export async function startServer(options) {
|
|
|
24619
24891
|
// release replicates exactly like the user-move release does. A lost CAS
|
|
24620
24892
|
// (peer advanced the epoch first) is a no-op here — we never retry/force.
|
|
24621
24893
|
emitPlacement(sk, r, 'released', prevOwner);
|
|
24894
|
+
featureEvidence.record('multiMachine.ownershipFollowsLiveWork', r.ok
|
|
24895
|
+
? { kind: 'fired', reason: 'release-on-complete: ownership released', context: { topicId: sk, part: 'release-on-complete', prevOwner: prevOwner ?? null } }
|
|
24896
|
+
: { kind: 'error', reason: 'release-on-complete: compare-and-set refused', context: { topicId: sk, part: 'release-on-complete', prevOwner: prevOwner ?? null } });
|
|
24622
24897
|
}
|
|
24623
24898
|
catch {
|
|
24624
24899
|
// @silent-fallback-ok — release-on-complete is best-effort housekeeping
|
|
@@ -27921,6 +28196,11 @@ export async function startServer(options) {
|
|
|
27921
28196
|
}
|
|
27922
28197
|
runMachineCoherenceEffects?.(effects, { telegram: () => tg ?? null });
|
|
27923
28198
|
};
|
|
28199
|
+
const meshEvidence = (kind, reason) => {
|
|
28200
|
+
featureEvidence.record('monitoring.meshCoherenceLiveCheck', { kind, reason, context: { uptimeSec: Math.round(process.uptime()), emitCap: config.monitoring?.meshCoherenceLiveCheck?.emitCap ?? null } });
|
|
28201
|
+
};
|
|
28202
|
+
const meshFired = (code) => { meshEvidence('fired', `divergence:${code}`); return true; };
|
|
28203
|
+
const meshHeld = (code) => meshEvidence('held', `emit-cap:${code}`);
|
|
27924
28204
|
const peerPresenceTick = () => {
|
|
27925
28205
|
void reconcileIdentityActivation().catch((err) => {
|
|
27926
28206
|
console.warn(`[identity-recovery] periodic activation reconciliation failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
@@ -27960,8 +28240,10 @@ export async function startServer(options) {
|
|
|
27960
28240
|
if (emitCap === undefined || count < emitCap) { // emitCap is READ here
|
|
27961
28241
|
console.log(pc.yellow(` ⚠ mesh-live-coherence [${w.code}]: ${w.message}`));
|
|
27962
28242
|
_meshCoherenceEmitCounts.set(w.code, count + 1);
|
|
27963
|
-
firedThisTick =
|
|
28243
|
+
firedThisTick = meshFired(w.code);
|
|
27964
28244
|
}
|
|
28245
|
+
else
|
|
28246
|
+
meshHeld(w.code);
|
|
27965
28247
|
}
|
|
27966
28248
|
}
|
|
27967
28249
|
recorder?.record({ feature: 'mesh-coherence-live', kind: 'event', outcome: firedThisTick ? 'fired' : 'noop' });
|
|
@@ -27979,6 +28261,8 @@ export async function startServer(options) {
|
|
|
27979
28261
|
_meshCoherenceFailing = true;
|
|
27980
28262
|
}
|
|
27981
28263
|
_meshCoherenceConsecFailures += 1;
|
|
28264
|
+
if (_meshCoherenceConsecFailures === 1)
|
|
28265
|
+
meshEvidence('error', 'live-state-read-failed');
|
|
27982
28266
|
}
|
|
27983
28267
|
}
|
|
27984
28268
|
}
|
|
@@ -29642,10 +29926,12 @@ export async function startServer(options) {
|
|
|
29642
29926
|
console.warn('[instar] Windows desktop bootstrap diagnostic could not be persisted');
|
|
29643
29927
|
}
|
|
29644
29928
|
}
|
|
29645
|
-
const server = new AgentServer({ config, ecosystemLedger: _ecosystemLedger ?? undefined, singleInstanceLock, agentIdentity: _agentIdentityDeps, terminateSessionAuthority: terminateWithAuthority, subscriptionEmailBinding: credentialLocationLedger, subscriptionEmailBarrier, subscriptionIdentityOracle, sessionManager, llmQueue: sharedLlmQueue, state, scheduler, telegram, telegramOrigin: telegramOriginBoot?.runtime, relationships, feedback, feedbackAnomalyDetector, dispatches, updateChecker, autoUpdater, autoDispatcher, quotaTracker, quotaManager, publisher, viewer, jobAnomalySendAutomationReply: sendAutomationReply, tunnel, evolution, watchdog, topicMemory, triageNurse, projectMapper, cartographerRoots: cartographerRoots ?? undefined, coherenceGate: scopeVerifier, contextHierarchy, canonicalState, operationGate, sentinel, adaptiveTrust, memoryMonitor, orphanReaper, coherenceMonitor, commitmentTracker, subscriptionPool, accountFollowMePeerViews: async () => { const nickById = new Map((_listPoolMachines?.() ?? []).map((m) => [m.machineId, verifiedEntityName(m.machineId, m.nickname) ?? ''])); let peers = (_resolvePeerUrls?.() ?? []).map((p) => ({ machineId: p.machineId, nickname: nickById.get(p.machineId) ?? '', url: p.url })); if (peers.length === 0) {
|
|
29929
|
+
const server = new AgentServer({ config, ecosystemLedger: _ecosystemLedger ?? undefined, recommendedServicesLedger: _recommendedServicesLedger ?? undefined, singleInstanceLock, agentIdentity: _agentIdentityDeps, terminateSessionAuthority: terminateWithAuthority, subscriptionEmailBinding: credentialLocationLedger, subscriptionEmailBarrier, subscriptionIdentityOracle, sessionManager, llmQueue: sharedLlmQueue, state, scheduler, telegram, telegramOrigin: telegramOriginBoot?.runtime, relationships, feedback, feedbackAnomalyDetector, dispatches, updateChecker, autoUpdater, autoDispatcher, quotaTracker, quotaManager, publisher, viewer, jobAnomalySendAutomationReply: sendAutomationReply, tunnel, evolution, watchdog, topicMemory, triageNurse, projectMapper, cartographerRoots: cartographerRoots ?? undefined, coherenceGate: scopeVerifier, contextHierarchy, canonicalState, operationGate, sentinel, adaptiveTrust, memoryMonitor, orphanReaper, coherenceMonitor, commitmentTracker, subscriptionPool, accountFollowMePeerViews: async () => { const nickById = new Map((_listPoolMachines?.() ?? []).map((m) => [m.machineId, verifiedEntityName(m.machineId, m.nickname) ?? ''])); let peers = (_resolvePeerUrls?.() ?? []).map((p) => ({ machineId: p.machineId, nickname: nickById.get(p.machineId) ?? '', url: p.url })); if (peers.length === 0) {
|
|
29646
29930
|
peers = (_listPoolMachines?.() ?? []).filter((m) => m.machineId !== _meshSelfId && !!m.lastKnownUrl).map((m) => ({ machineId: m.machineId, nickname: verifiedEntityName(m.machineId, m.nickname) ?? '', url: m.lastKnownUrl }));
|
|
29647
29931
|
} if (peers.length === 0)
|
|
29648
|
-
return []; const { fetchPeerSubscriptionViews } = await import('../core/fetchPeerSubscriptionViews.js'); return fetchPeerSubscriptionViews({ peers: () => peers, fetchImpl: fetch, authToken: config.authToken ?? '' }); }, quotaPoller, quotaAwareScheduler: _quotaAwareScheduler ?? undefined, proactiveSwapMonitor: _proactiveSwapMonitor ?? undefined, inUseAccountResolver, enrollmentWizard, accountFollowMeRevocation, credentialRepointing, semanticMemory, activitySentinel, rateLimitSentinel, releaseReadinessSentinel: releaseReadinessSentinel ?? undefined, greenPrAutoMerger: greenPrAutoMerger ?? undefined, localVerify: localVerifyService ?? undefined, localVerifyStatus: localVerifyStatus ?? undefined, guardLatchStore: guardLatchStore ?? undefined, agentStopSurfacer: agentStopSurfacer ?? undefined, messageRouter, summarySentinel, spawnManager, systemReviewer, capabilityMapper, selfKnowledgeTree, coverageAuditor, topicResumeMap: _topicResumeMap ?? undefined, topicProfile: _topicProfileCtx ?? undefined, sessionRefresh: _sessionRefresh ?? undefined, autonomyManager, trustElevationTracker, autonomousEvolution, coordinator: coordinator.enabled ? coordinator : undefined, meshBindActive: coordinator.managers.identityManager.hasIdentity() && config.multiMachine?.meshTransport?.enabled !== false, localSigningKeyPem, leaseTransport, peerEndpointRecorder, getSelfMeshEndpoints, onLeasePullRequest: () => leaseCoordinatorRef?.currentLease() ?? null, liveTailReceiver, handoffWireTransport, onHandoffBegin, onHandoffInitiate: handoffInitiate, handoffInProgress: handoffSentinelInProgress, messageLedger, currentInboundByTopic, replyMarkerTransport, onReplyMarker: messageLedger ? (marker) => { const m = marker; messageLedger.applyRemoteReplyMarker(m.dedupeKey, { platform: m.platform, replyIdempotencyKey: m.replyIdempotencyKey, epoch: m.epoch, topic: m.topic ?? null }); } : undefined, whatsapp: whatsappAdapter, slack: slackAdapter, imessage: imessageAdapter, conversationRegistry, conversationBindAuth, appConversations: _appConversationService ?? undefined, slackInboundDispatch: () => _slackInboundDispatch, conversationFollowThrough, whatsappBusinessBackend, messageBridge, hookEventReceiver, worktreeMonitor, subagentTracker, instructionsVerifier, handshakeManager: threadlineHandshake, threadlineRouter, conversationStore, threadLog, threadMessageRecorder, warrantsReplyGate, collaborationSurfacer, peerHomebaseRelay, threadResumeMap, topicLinkageHandler: topicLinkageHandler ?? undefined, threadlineRelayClient, pairingInvites: threadlinePairingInvites, getLastRelayEvent: threadlineGetLastRelayEvent, a2aRelayForward: _a2aRelayForwardCtx ?? undefined, threadlineReplyWaiters, threadlineMcpHttp, listenerManager: listenerManager ?? undefined, a2aDeliveryTracker: a2aDeliveryTracker ?? undefined, relayVerdictCounters: threadlineRelayClient ? (() => ({ ...threadlineRelayClient.relayVerdictCounters, expiredMismatchIgnored: a2aDeliveryTracker?.expiredMismatchIgnored ?? 0 })) : undefined, inboundIdLedger: _inboundIdLedger ?? undefined, inboundIdLedgerDaemonDeferred: () => _inboundIdLedgerDaemonDeferred, responseReviewGate, reviewCanaryBattery, messagingToneGate, outboundDedupGate, telemetryHeartbeat, pasteManager, featureRegistry, discoveryEvaluator, completionEvaluator, unifiedTrust, liveConfig, sharedStateLedger, ledgerSessionRegistry, worktreeManager, oidcEnrolledRepos: parallelDevConfig?.oidcEnrolledRepos, initiativeTracker, projectRoundRunner, projectDriftChecker, machineHeartbeat, machinePoolRegistry, ropeHealthMonitor, writeAdmission: writeAdmission ?? undefined, getInboundQueue: () => _inboundQueue, getMachineCoherence: () => _machineCoherenceSentinel, getSingleMachineFailoverGap: () => _singleMachineFailoverGap, getMissingLoginSession: () => _missingLoginSession, getSessionPoolFailoverRunner: () => _sessionPoolFailoverRunnerDriver?.status() ?? null, sessionPoolPromotionActivation: _sessionPoolPromotionActivation, meshRpcDispatcher, deliverA2aToMachine: _deliverA2aToMachine ?? undefined, workingSetPullCoordinator, workingSetArtifactManager, orchestratorPoller, commitmentReplicaStore, preferenceReplicaStore, replicatedRecordEmitter, replicatedStoreReconciler, conflictStore, rollbackUnmerge, droppedOriginRegistry, preferencesUnionReader, jevMemoryPicker, forwardCommitmentMutate, sessionOwnershipRegistry, sendDrain: _sendDrain ?? undefined, claimTopicOwnershipOnSpawn: (topicId) => _claimOwnershipForAutonomousSpawn ? _claimOwnershipForAutonomousSpawn(topicId) : 'unwired', topicPinStore: _topicPinStore ?? undefined, topicPinSkewQuarantine: _topicPinSkewQuarantine ?? undefined, topicPinFoldView: _topicPinFoldView ?? undefined, ownershipReconciler: _ownershipReconciler ?? undefined, staleOwnerEngine: _staleOwnerEngine ?? undefined, duplicateReconciler: _duplicateReconciler ?? undefined, ownerDarkLadder: _ownerDarkLadder ?? undefined, spawnAdmission: _spawnAdmission ?? undefined, judgmentProvenance: _judgmentProvenance ?? undefined, leaseHandback: _leaseHandbackCtx ?? undefined, streamTicketStore: _streamTicketStore ?? undefined, poolStreamAllowRemoteInput: config.dashboard?.poolStream?.allowRemoteInput ?? false, poolStreamConnector: _poolStreamConnector ?? undefined, secretSync: _secretSyncHandle ?? undefined, meshSelfId: _meshSelfId ?? undefined, resolveRouterUrl: _resolveRouterUrl ?? undefined, resolvePeerUrls: _resolvePeerUrls ?? undefined, recordRopeResult: _recordRopeResult ?? undefined, guardRegistry, listPoolMachines: _listPoolMachines ?? undefined, deliverMandateToMachine: _deliverMandateToMachine ?? undefined, passkeyRevokeOutbox: _passkeyRevokeOutbox ? () => _passkeyRevokeOutbox : undefined, passkeyPeerOnline: _passkeyPeerOnline, passkeyPoolReader: _passkeyPoolReader ? () => _passkeyPoolReader : undefined, passkeyProofBrowser: async (profileDir) => { const { ChromeCdpReloginBrowser } = await import('../core/ChromeCdpReloginBrowser.js'); return new ChromeCdpReloginBrowser({ userDataDir: profileDir, passkeyMode: true, headless: true, launchTimeoutMs: 30_000, operationTimeoutMs: 20_000 }); }, poolLink: _poolLink ?? undefined, poolPollCache: _poolPollCache ?? undefined, sessionPoolE2EResultStore, proxyCoordinator, topicIntentStore, topicIntentArcCheck, usherSignalStore, intelligence: sharedIntelligence ?? undefined, telegramBridgeConfig, telegramBridge: telegramBridge ?? undefined, threadlineObservability, briefDeps, workingMemory, taskFlowRegistry, threadlineFlowBridge, sessionReaper, agentWorktreeReaper, externalHogSentinel, orphanedWorkSentinel, mcpProcessReaper, codexArmSessionSweeper, geminiLoopRunner, sleepController, agentActivityState, reapLog, resumeQueue, resumeDrainer, autonomousLivenessReconciler, enforcedTerminationStatus: () => enforcedTerminationWatchdog?.guardStatus() ?? null, prHandLease: prHandLease ?? undefined, standDownRegistry: _standDownRegistry ?? undefined, standDownAudit: _standDownAudit ?? undefined, operatorStopRecorder: recordOperatorStop, sleepWakeDetector, unjustifiedStopGate, stopGateDb, stopNotifier, liveTestGate, liveTestGateMode, liveTestRunnerCtx });
|
|
29932
|
+
return []; const { fetchPeerSubscriptionViews } = await import('../core/fetchPeerSubscriptionViews.js'); return fetchPeerSubscriptionViews({ peers: () => peers, fetchImpl: fetch, authToken: config.authToken ?? '' }); }, quotaPoller, quotaAwareScheduler: _quotaAwareScheduler ?? undefined, proactiveSwapMonitor: _proactiveSwapMonitor ?? undefined, inUseAccountResolver, enrollmentWizard, accountFollowMeRevocation, credentialRepointing, semanticMemory, activitySentinel, rateLimitSentinel, releaseReadinessSentinel: releaseReadinessSentinel ?? undefined, greenPrAutoMerger: greenPrAutoMerger ?? undefined, localVerify: localVerifyService ?? undefined, localVerifyStatus: localVerifyStatus ?? undefined, guardLatchStore: guardLatchStore ?? undefined, agentStopSurfacer: agentStopSurfacer ?? undefined, messageRouter, summarySentinel, spawnManager, systemReviewer, capabilityMapper, selfKnowledgeTree, coverageAuditor, topicResumeMap: _topicResumeMap ?? undefined, topicProfile: _topicProfileCtx ?? undefined, sessionRefresh: _sessionRefresh ?? undefined, autonomyManager, trustElevationTracker, autonomousEvolution, coordinator: coordinator.enabled ? coordinator : undefined, meshBindActive: coordinator.managers.identityManager.hasIdentity() && config.multiMachine?.meshTransport?.enabled !== false, localSigningKeyPem, leaseTransport, peerEndpointRecorder, getSelfMeshEndpoints, onLeasePullRequest: () => leaseCoordinatorRef?.currentLease() ?? null, liveTailReceiver, handoffWireTransport, onHandoffBegin, onHandoffInitiate: handoffInitiate, handoffInProgress: handoffSentinelInProgress, messageLedger, currentInboundByTopic, replyMarkerTransport, onReplyMarker: messageLedger ? (marker) => { const m = marker; messageLedger.applyRemoteReplyMarker(m.dedupeKey, { platform: m.platform, replyIdempotencyKey: m.replyIdempotencyKey, epoch: m.epoch, topic: m.topic ?? null }); } : undefined, whatsapp: whatsappAdapter, slack: slackAdapter, imessage: imessageAdapter, conversationRegistry, conversationBindAuth, appConversations: _appConversationService ?? undefined, slackInboundDispatch: () => _slackInboundDispatch, conversationFollowThrough, whatsappBusinessBackend, messageBridge, hookEventReceiver, worktreeMonitor, subagentTracker, instructionsVerifier, handshakeManager: threadlineHandshake, threadlineRouter, conversationStore, threadLog, threadMessageRecorder, warrantsReplyGate, collaborationSurfacer, peerHomebaseRelay, threadResumeMap, topicLinkageHandler: topicLinkageHandler ?? undefined, threadlineRelayClient, pairingInvites: threadlinePairingInvites, getLastRelayEvent: threadlineGetLastRelayEvent, a2aRelayForward: _a2aRelayForwardCtx ?? undefined, threadlineReplyWaiters, threadlineMcpHttp, listenerManager: listenerManager ?? undefined, a2aDeliveryTracker: a2aDeliveryTracker ?? undefined, relayVerdictCounters: threadlineRelayClient ? (() => ({ ...threadlineRelayClient.relayVerdictCounters, expiredMismatchIgnored: a2aDeliveryTracker?.expiredMismatchIgnored ?? 0 })) : undefined, inboundIdLedger: _inboundIdLedger ?? undefined, inboundIdLedgerDaemonDeferred: () => _inboundIdLedgerDaemonDeferred, responseReviewGate, reviewCanaryBattery, messagingToneGate, outboundDedupGate, telemetryHeartbeat, pasteManager, featureRegistry, discoveryEvaluator, completionEvaluator, unifiedTrust, liveConfig, sharedStateLedger, ledgerSessionRegistry, worktreeManager, oidcEnrolledRepos: parallelDevConfig?.oidcEnrolledRepos, initiativeTracker, projectRoundRunner, projectDriftChecker, machineHeartbeat, machinePoolRegistry, ropeHealthMonitor, writeAdmission: writeAdmission ?? undefined, getInboundQueue: () => _inboundQueue, getMachineCoherence: () => _machineCoherenceSentinel, getSingleMachineFailoverGap: () => _singleMachineFailoverGap, getMissingLoginSession: () => _missingLoginSession, getSessionPoolFailoverRunner: () => _sessionPoolFailoverRunnerDriver?.status() ?? null, sessionPoolPromotionActivation: _sessionPoolPromotionActivation, meshRpcDispatcher, deliverA2aToMachine: _deliverA2aToMachine ?? undefined, workingSetPullCoordinator, workingSetArtifactManager, orchestratorPoller, commitmentReplicaStore, preferenceReplicaStore, replicatedRecordEmitter, replicatedStoreReconciler, conflictStore, rollbackUnmerge, droppedOriginRegistry, preferencesUnionReader, jevMemoryPicker, forwardCommitmentMutate, sessionOwnershipRegistry, sendDrain: _sendDrain ?? undefined, claimTopicOwnershipOnSpawn: (topicId) => _claimOwnershipForAutonomousSpawn ? _claimOwnershipForAutonomousSpawn(topicId) : 'unwired', topicPinStore: _topicPinStore ?? undefined, topicPinSkewQuarantine: _topicPinSkewQuarantine ?? undefined, topicPinFoldView: _topicPinFoldView ?? undefined, ownershipReconciler: _ownershipReconciler ?? undefined, staleOwnerEngine: _staleOwnerEngine ?? undefined, duplicateReconciler: _duplicateReconciler ?? undefined, ownerDarkLadder: _ownerDarkLadder ?? undefined, spawnAdmission: _spawnAdmission ?? undefined, judgmentProvenance: _judgmentProvenance ?? undefined, leaseHandback: _leaseHandbackCtx ?? undefined, streamTicketStore: _streamTicketStore ?? undefined, poolStreamAllowRemoteInput: config.dashboard?.poolStream?.allowRemoteInput ?? false, poolStreamConnector: _poolStreamConnector ?? undefined, secretSync: _secretSyncHandle ?? undefined, meshSelfId: _meshSelfId ?? undefined, resolveRouterUrl: _resolveRouterUrl ?? undefined, resolvePeerUrls: _resolvePeerUrls ?? undefined, recordRopeResult: _recordRopeResult ?? undefined, guardRegistry, listPoolMachines: _listPoolMachines ?? undefined, deliverMandateToMachine: _deliverMandateToMachine ?? undefined, passkeyRevokeOutbox: _passkeyRevokeOutbox ? () => _passkeyRevokeOutbox : undefined, passkeyPeerOnline: _passkeyPeerOnline, passkeyPoolReader: _passkeyPoolReader ? () => _passkeyPoolReader : undefined, passkeyProofBrowser: async (profileDir) => { const { ChromeCdpReloginBrowser } = await import('../core/ChromeCdpReloginBrowser.js'); return new ChromeCdpReloginBrowser({ userDataDir: profileDir, passkeyMode: true, headless: true, launchTimeoutMs: 30_000, operationTimeoutMs: 20_000 }); }, poolLink: _poolLink ?? undefined, poolPollCache: _poolPollCache ?? undefined, sessionPoolE2EResultStore, proxyCoordinator, topicIntentStore, topicIntentArcCheck, usherSignalStore, intelligence: sharedIntelligence ?? undefined, telegramBridgeConfig, telegramBridge: telegramBridge ?? undefined, threadlineObservability, briefDeps, workingMemory, taskFlowRegistry, threadlineFlowBridge, sessionReaper, agentWorktreeReaper, externalHogSentinel, orphanedWorkSentinel, mcpProcessReaper, codexArmSessionSweeper, geminiLoopRunner, sleepController, agentActivityState, reapLog, resumeQueue, resumeDrainer, autonomousLivenessReconciler, enforcedTerminationStatus: () => enforcedTerminationWatchdog?.guardStatus() ?? null, prHandLease: prHandLease ?? undefined, standDownRegistry: _standDownRegistry ?? undefined, standDownAudit: _standDownAudit ?? undefined, operatorStopRecorder: recordOperatorStop, sleepWakeDetector, unjustifiedStopGate, stopGateDb, stopNotifier, liveTestGate, liveTestGateMode, liveTestRunnerCtx });
|
|
29933
|
+
if (_pendingCompactionEvidence)
|
|
29934
|
+
featureEvidence.record('multiMachine.coherenceJournal.replication.compaction', _pendingCompactionEvidence); // Resolve the late-bound topic-operator getter (increment 2e): routing was
|
|
29649
29935
|
const readIdentityProjectionPeerRows = async () => {
|
|
29650
29936
|
const peers = _resolvePeerUrls?.() ?? [];
|
|
29651
29937
|
const extra = config.multiMachine?.peerUrlAllowlist;
|
|
@@ -29996,6 +30282,7 @@ export async function startServer(options) {
|
|
|
29996
30282
|
subjectMachineId: proposed.machineId, epoch: proposed.recoveryEpoch ?? 0,
|
|
29997
30283
|
contentHash: operatorGrantMod.recoveryRootDelegationHash(proposed), dryRun,
|
|
29998
30284
|
});
|
|
30285
|
+
featureEvidence.record('multiMachine.recoveryKeyEscrow', { kind: 'fired', reason: dryRun ? 'would rotate the recovery root from a peer' : 'rotated the recovery root from a peer', context: { machineId: proposed.machineId, recoveryEpoch: proposed.recoveryEpoch ?? 0, dryRun } });
|
|
29999
30286
|
if (dryRun)
|
|
30000
30287
|
return 'would-rotate';
|
|
30001
30288
|
identityStore.apply({
|
|
@@ -30590,10 +30877,14 @@ export async function startServer(options) {
|
|
|
30590
30877
|
// port (force-closes lingering sockets, awaits 'close') BEFORE listen, so the
|
|
30591
30878
|
// gap is sub-second and the supervisor never observes a hole. No-op if the
|
|
30592
30879
|
// beacon was never started (dark) or already failed.
|
|
30880
|
+
// A failed bind happened before the evidence log was wired (at AgentServer construction), so it is kept and written here.
|
|
30881
|
+
if (bootBeaconBindErrorCode)
|
|
30882
|
+
featureEvidence.record('monitoring.bootHealthBeacon', { kind: 'error', reason: 'could not bind during boot', context: { code: bootBeaconBindErrorCode, port: config.port } });
|
|
30593
30883
|
try {
|
|
30594
30884
|
await bootBeacon?.stop();
|
|
30595
30885
|
}
|
|
30596
30886
|
catch (err) {
|
|
30887
|
+
featureEvidence.record('monitoring.bootHealthBeacon', { kind: 'error', reason: 'handoff failed: stop threw', context: { port: config.port, errorName: err instanceof Error ? err.name : 'unknown' } });
|
|
30597
30888
|
// @silent-fallback-ok — a beacon stop failure must not stop the real server
|
|
30598
30889
|
// from binding; logged, and the OS releases the listening socket regardless.
|
|
30599
30890
|
console.error(' Boot health beacon stop failed (continuing to bind real server):', err instanceof Error ? err.message : err);
|
|
@@ -30604,6 +30895,16 @@ export async function startServer(options) {
|
|
|
30604
30895
|
// no per-session write admission.
|
|
30605
30896
|
sessionManager.startMonitoring();
|
|
30606
30897
|
await server.start();
|
|
30898
|
+
// Boot recovery runs before the evidence log exists, so its verdict is recorded here.
|
|
30899
|
+
if (resolveDevAgentGate(config.multiMachine?.recoveryKeyEscrow?.enabled, config)) {
|
|
30900
|
+
const escrowDryRun = config.multiMachine?.recoveryKeyEscrow?.dryRun !== false;
|
|
30901
|
+
featureEvidence.record('multiMachine.recoveryKeyEscrow', {
|
|
30902
|
+
kind: bootRecoveryOutcome === 'disabled' || (_recoveryEscrowEvidence && !_recoveryEscrowEvidence.minted && _recoveryEscrowEvidence.hadRoot) ? 'error'
|
|
30903
|
+
: bootRecoveryOutcome === 'coherence-held' ? 'held' : 'fired',
|
|
30904
|
+
reason: bootRecoveryOutcome === 'disabled' ? 'boot recovery unavailable' : `boot recovery: ${bootRecoveryOutcome}`,
|
|
30905
|
+
context: { outcome: bootRecoveryOutcome, dryRun: escrowDryRun, minted: _recoveryEscrowEvidence?.minted ?? null, hadRoot: _recoveryEscrowEvidence?.hadRoot ?? null, recoveryEpoch: _recoveryEscrowEvidence?.recoveryEpoch ?? null },
|
|
30906
|
+
});
|
|
30907
|
+
}
|
|
30607
30908
|
// After listen: a stop's condition usually turns met across a restart onto the
|
|
30608
30909
|
// fixed version, and the wake brief sends a session straight to a route.
|
|
30609
30910
|
agentStopSurfacer?.start();
|