instar 0.28.76 → 0.28.78
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/index.html +486 -0
- package/dist/cli.js +5 -8
- package/dist/cli.js.map +1 -1
- package/dist/commands/discovery.d.ts.map +1 -1
- package/dist/commands/discovery.js +2 -2
- package/dist/commands/discovery.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +22 -4
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/job.d.ts.map +1 -1
- package/dist/commands/job.js +2 -2
- package/dist/commands/job.js.map +1 -1
- package/dist/commands/ledgerCleanup.d.ts.map +1 -1
- package/dist/commands/ledgerCleanup.js +2 -2
- package/dist/commands/ledgerCleanup.js.map +1 -1
- package/dist/commands/listener.d.ts.map +1 -1
- package/dist/commands/listener.js +7 -12
- package/dist/commands/listener.js.map +1 -1
- package/dist/commands/nuke.d.ts.map +1 -1
- package/dist/commands/nuke.js +11 -21
- package/dist/commands/nuke.js.map +1 -1
- package/dist/commands/server.d.ts.map +1 -1
- package/dist/commands/server.js +79 -5
- package/dist/commands/server.js.map +1 -1
- package/dist/commands/setup.d.ts.map +1 -1
- package/dist/commands/setup.js +11 -15
- package/dist/commands/setup.js.map +1 -1
- package/dist/commands/slack-cli.d.ts.map +1 -1
- package/dist/commands/slack-cli.js +5 -8
- package/dist/commands/slack-cli.js.map +1 -1
- package/dist/commands/whatsapp.d.ts.map +1 -1
- package/dist/commands/whatsapp.js +2 -2
- package/dist/commands/whatsapp.js.map +1 -1
- package/dist/commands/worktree.d.ts.map +1 -1
- package/dist/commands/worktree.js +2 -2
- package/dist/commands/worktree.js.map +1 -1
- package/dist/core/AgentConnector.d.ts.map +1 -1
- package/dist/core/AgentConnector.js +9 -10
- package/dist/core/AgentConnector.js.map +1 -1
- package/dist/core/AgentRegistry.d.ts.map +1 -1
- package/dist/core/AgentRegistry.js +3 -4
- package/dist/core/AgentRegistry.js.map +1 -1
- package/dist/core/AutoDispatcher.d.ts.map +1 -1
- package/dist/core/AutoDispatcher.js +2 -2
- package/dist/core/AutoDispatcher.js.map +1 -1
- package/dist/core/AutoUpdater.d.ts.map +1 -1
- package/dist/core/AutoUpdater.js +2 -2
- package/dist/core/AutoUpdater.js.map +1 -1
- package/dist/core/AutonomousEvolution.d.ts.map +1 -1
- package/dist/core/AutonomousEvolution.js +2 -2
- package/dist/core/AutonomousEvolution.js.map +1 -1
- package/dist/core/BackupManager.d.ts.map +1 -1
- package/dist/core/BackupManager.js +2 -2
- package/dist/core/BackupManager.js.map +1 -1
- package/dist/core/BranchManager.d.ts.map +1 -1
- package/dist/core/BranchManager.js +3 -3
- package/dist/core/BranchManager.js.map +1 -1
- package/dist/core/CaffeinateManager.d.ts.map +1 -1
- package/dist/core/CaffeinateManager.js +2 -2
- package/dist/core/CaffeinateManager.js.map +1 -1
- package/dist/core/DeferredDispatchTracker.d.ts.map +1 -1
- package/dist/core/DeferredDispatchTracker.js +2 -2
- package/dist/core/DeferredDispatchTracker.js.map +1 -1
- package/dist/core/DispatchManager.d.ts.map +1 -1
- package/dist/core/DispatchManager.js +3 -4
- package/dist/core/DispatchManager.js.map +1 -1
- package/dist/core/EvolutionManager.d.ts.map +1 -1
- package/dist/core/EvolutionManager.js +2 -2
- package/dist/core/EvolutionManager.js.map +1 -1
- package/dist/core/ExecutionJournal.d.ts.map +1 -1
- package/dist/core/ExecutionJournal.js +2 -2
- package/dist/core/ExecutionJournal.js.map +1 -1
- package/dist/core/FeedbackManager.d.ts.map +1 -1
- package/dist/core/FeedbackManager.js +2 -2
- package/dist/core/FeedbackManager.js.map +1 -1
- package/dist/core/FileClassifier.d.ts.map +1 -1
- package/dist/core/FileClassifier.js +8 -17
- package/dist/core/FileClassifier.js.map +1 -1
- package/dist/core/ForegroundRestartWatcher.d.ts.map +1 -1
- package/dist/core/ForegroundRestartWatcher.js +3 -4
- package/dist/core/ForegroundRestartWatcher.js.map +1 -1
- package/dist/core/GitStateManager.d.ts.map +1 -1
- package/dist/core/GitStateManager.js +3 -12
- package/dist/core/GitStateManager.js.map +1 -1
- package/dist/core/GitSync.d.ts.map +1 -1
- package/dist/core/GitSync.js +6 -6
- package/dist/core/GitSync.js.map +1 -1
- package/dist/core/GlobalInstallCleanup.d.ts.map +1 -1
- package/dist/core/GlobalInstallCleanup.js +3 -4
- package/dist/core/GlobalInstallCleanup.js.map +1 -1
- package/dist/core/GlobalSecretStore.d.ts.map +1 -1
- package/dist/core/GlobalSecretStore.js +3 -4
- package/dist/core/GlobalSecretStore.js.map +1 -1
- package/dist/core/HandoffManager.d.ts.map +1 -1
- package/dist/core/HandoffManager.js +5 -5
- package/dist/core/HandoffManager.js.map +1 -1
- package/dist/core/JargonDetector.d.ts +28 -0
- package/dist/core/JargonDetector.d.ts.map +1 -0
- package/dist/core/JargonDetector.js +59 -0
- package/dist/core/JargonDetector.js.map +1 -0
- package/dist/core/LedgerSessionRegistry.d.ts.map +1 -1
- package/dist/core/LedgerSessionRegistry.js +2 -2
- package/dist/core/LedgerSessionRegistry.js.map +1 -1
- package/dist/core/MachineIdentity.d.ts.map +1 -1
- package/dist/core/MachineIdentity.js +2 -2
- package/dist/core/MachineIdentity.js.map +1 -1
- package/dist/core/MessagingToneGate.d.ts +42 -5
- package/dist/core/MessagingToneGate.d.ts.map +1 -1
- package/dist/core/MessagingToneGate.js +40 -6
- package/dist/core/MessagingToneGate.js.map +1 -1
- package/dist/core/ParallelDevWiring.d.ts.map +1 -1
- package/dist/core/ParallelDevWiring.js +3 -6
- package/dist/core/ParallelDevWiring.js.map +1 -1
- package/dist/core/PostUpdateMigrator.d.ts +26 -0
- package/dist/core/PostUpdateMigrator.d.ts.map +1 -1
- package/dist/core/PostUpdateMigrator.js +249 -46
- package/dist/core/PostUpdateMigrator.js.map +1 -1
- package/dist/core/ProjectMapper.d.ts.map +1 -1
- package/dist/core/ProjectMapper.js +5 -11
- package/dist/core/ProjectMapper.js.map +1 -1
- package/dist/core/RelationshipManager.d.ts.map +1 -1
- package/dist/core/RelationshipManager.js +4 -5
- package/dist/core/RelationshipManager.js.map +1 -1
- package/dist/core/SafeGitExecutor.d.ts +11 -5
- package/dist/core/SafeGitExecutor.d.ts.map +1 -1
- package/dist/core/SafeGitExecutor.js +87 -1
- package/dist/core/SafeGitExecutor.js.map +1 -1
- package/dist/core/ScopeVerifier.d.ts.map +1 -1
- package/dist/core/ScopeVerifier.js +3 -6
- package/dist/core/ScopeVerifier.js.map +1 -1
- package/dist/core/SecretStore.d.ts.map +1 -1
- package/dist/core/SecretStore.js +2 -2
- package/dist/core/SecretStore.js.map +1 -1
- package/dist/core/SharedStateLedger.d.ts.map +1 -1
- package/dist/core/SharedStateLedger.js +2 -2
- package/dist/core/SharedStateLedger.js.map +1 -1
- package/dist/core/SoulManager.d.ts.map +1 -1
- package/dist/core/SoulManager.js +3 -4
- package/dist/core/SoulManager.js.map +1 -1
- package/dist/core/StateManager.d.ts.map +1 -1
- package/dist/core/StateManager.js +4 -6
- package/dist/core/StateManager.js.map +1 -1
- package/dist/core/SyncOrchestrator.d.ts.map +1 -1
- package/dist/core/SyncOrchestrator.js +6 -7
- package/dist/core/SyncOrchestrator.js.map +1 -1
- package/dist/core/UpdateChecker.d.ts.map +1 -1
- package/dist/core/UpdateChecker.js +3 -4
- package/dist/core/UpdateChecker.js.map +1 -1
- package/dist/core/UpgradeGuideProcessor.d.ts.map +1 -1
- package/dist/core/UpgradeGuideProcessor.js +3 -4
- package/dist/core/UpgradeGuideProcessor.js.map +1 -1
- package/dist/core/WorktreeManager.d.ts.map +1 -1
- package/dist/core/WorktreeManager.js +9 -14
- package/dist/core/WorktreeManager.js.map +1 -1
- package/dist/knowledge/KnowledgeManager.d.ts.map +1 -1
- package/dist/knowledge/KnowledgeManager.js +2 -2
- package/dist/knowledge/KnowledgeManager.js.map +1 -1
- package/dist/lifeline/ServerSupervisor.d.ts +28 -0
- package/dist/lifeline/ServerSupervisor.d.ts.map +1 -1
- package/dist/lifeline/ServerSupervisor.js +171 -73
- package/dist/lifeline/ServerSupervisor.js.map +1 -1
- package/dist/lifeline/TelegramLifeline.d.ts.map +1 -1
- package/dist/lifeline/TelegramLifeline.js +10 -4
- package/dist/lifeline/TelegramLifeline.js.map +1 -1
- package/dist/lifeline/detectLaunchdSupervised.d.ts +43 -0
- package/dist/lifeline/detectLaunchdSupervised.d.ts.map +1 -0
- package/dist/lifeline/detectLaunchdSupervised.js +106 -0
- package/dist/lifeline/detectLaunchdSupervised.js.map +1 -0
- package/dist/lifeline/droppedMessages.d.ts.map +1 -1
- package/dist/lifeline/droppedMessages.js +2 -2
- package/dist/lifeline/droppedMessages.js.map +1 -1
- package/dist/memory/EpisodicMemory.d.ts.map +1 -1
- package/dist/memory/EpisodicMemory.js +2 -2
- package/dist/memory/EpisodicMemory.js.map +1 -1
- package/dist/memory/TopicMemory.d.ts.map +1 -1
- package/dist/memory/TopicMemory.js +5 -8
- package/dist/memory/TopicMemory.js.map +1 -1
- package/dist/messaging/AgentTokenManager.d.ts.map +1 -1
- package/dist/messaging/AgentTokenManager.js +2 -2
- package/dist/messaging/AgentTokenManager.js.map +1 -1
- package/dist/messaging/DropPickup.d.ts.map +1 -1
- package/dist/messaging/DropPickup.js +2 -2
- package/dist/messaging/DropPickup.js.map +1 -1
- package/dist/messaging/GitSyncTransport.d.ts.map +1 -1
- package/dist/messaging/GitSyncTransport.js +4 -6
- package/dist/messaging/GitSyncTransport.js.map +1 -1
- package/dist/messaging/MessageStore.d.ts.map +1 -1
- package/dist/messaging/MessageStore.js +3 -4
- package/dist/messaging/MessageStore.js.map +1 -1
- package/dist/messaging/TelegramAdapter.d.ts.map +1 -1
- package/dist/messaging/TelegramAdapter.js +5 -8
- package/dist/messaging/TelegramAdapter.js.map +1 -1
- package/dist/messaging/backends/BaileysBackend.d.ts.map +1 -1
- package/dist/messaging/backends/BaileysBackend.js +3 -4
- package/dist/messaging/backends/BaileysBackend.js.map +1 -1
- package/dist/messaging/local-tone-check.d.ts +61 -0
- package/dist/messaging/local-tone-check.d.ts.map +1 -0
- package/dist/messaging/local-tone-check.js +78 -0
- package/dist/messaging/local-tone-check.js.map +1 -0
- package/dist/messaging/pending-relay-store.d.ts +153 -0
- package/dist/messaging/pending-relay-store.d.ts.map +1 -0
- package/dist/messaging/pending-relay-store.js +351 -0
- package/dist/messaging/pending-relay-store.js.map +1 -0
- package/dist/messaging/secret-patterns.d.ts +35 -0
- package/dist/messaging/secret-patterns.d.ts.map +1 -0
- package/dist/messaging/secret-patterns.js +70 -0
- package/dist/messaging/secret-patterns.js.map +1 -0
- package/dist/messaging/shared/EncryptedAuthStore.d.ts.map +1 -1
- package/dist/messaging/shared/EncryptedAuthStore.js +3 -4
- package/dist/messaging/shared/EncryptedAuthStore.js.map +1 -1
- package/dist/messaging/shared/MessageLogger.d.ts.map +1 -1
- package/dist/messaging/shared/MessageLogger.js +2 -2
- package/dist/messaging/shared/MessageLogger.js.map +1 -1
- package/dist/messaging/shared/PrivacyConsent.d.ts.map +1 -1
- package/dist/messaging/shared/PrivacyConsent.js +2 -2
- package/dist/messaging/shared/PrivacyConsent.js.map +1 -1
- package/dist/messaging/shared/SessionChannelRegistry.d.ts.map +1 -1
- package/dist/messaging/shared/SessionChannelRegistry.js +2 -2
- package/dist/messaging/shared/SessionChannelRegistry.js.map +1 -1
- package/dist/messaging/system-templates.d.ts +87 -0
- package/dist/messaging/system-templates.d.ts.map +1 -0
- package/dist/messaging/system-templates.js +236 -0
- package/dist/messaging/system-templates.js.map +1 -0
- package/dist/messaging/whoami-cache.d.ts +66 -0
- package/dist/messaging/whoami-cache.d.ts.map +1 -0
- package/dist/messaging/whoami-cache.js +149 -0
- package/dist/messaging/whoami-cache.js.map +1 -0
- package/dist/moltbridge/ProfileCompiler.d.ts.map +1 -1
- package/dist/moltbridge/ProfileCompiler.js +13 -7
- package/dist/moltbridge/ProfileCompiler.js.map +1 -1
- package/dist/monitoring/CommitmentTracker.d.ts.map +1 -1
- package/dist/monitoring/CommitmentTracker.js +2 -2
- package/dist/monitoring/CommitmentTracker.js.map +1 -1
- package/dist/monitoring/CredentialProvider.d.ts.map +1 -1
- package/dist/monitoring/CredentialProvider.js +2 -2
- package/dist/monitoring/CredentialProvider.js.map +1 -1
- package/dist/monitoring/DegradationReporter.d.ts +41 -0
- package/dist/monitoring/DegradationReporter.d.ts.map +1 -1
- package/dist/monitoring/DegradationReporter.js +96 -4
- package/dist/monitoring/DegradationReporter.js.map +1 -1
- package/dist/monitoring/HealthChecker.d.ts.map +1 -1
- package/dist/monitoring/HealthChecker.js +2 -2
- package/dist/monitoring/HealthChecker.js.map +1 -1
- package/dist/monitoring/HookEventReceiver.d.ts.map +1 -1
- package/dist/monitoring/HookEventReceiver.js +2 -2
- package/dist/monitoring/HookEventReceiver.js.map +1 -1
- package/dist/monitoring/InstructionsVerifier.d.ts.map +1 -1
- package/dist/monitoring/InstructionsVerifier.js +2 -2
- package/dist/monitoring/InstructionsVerifier.js.map +1 -1
- package/dist/monitoring/PresenceProxy.d.ts.map +1 -1
- package/dist/monitoring/PresenceProxy.js +5 -8
- package/dist/monitoring/PresenceProxy.js.map +1 -1
- package/dist/monitoring/QuotaTracker.d.ts.map +1 -1
- package/dist/monitoring/QuotaTracker.js +2 -2
- package/dist/monitoring/QuotaTracker.js.map +1 -1
- package/dist/monitoring/SessionMigrator.d.ts.map +1 -1
- package/dist/monitoring/SessionMigrator.js +2 -2
- package/dist/monitoring/SessionMigrator.js.map +1 -1
- package/dist/monitoring/SessionRecovery.d.ts.map +1 -1
- package/dist/monitoring/SessionRecovery.js +2 -2
- package/dist/monitoring/SessionRecovery.js.map +1 -1
- package/dist/monitoring/TelemetryAuth.d.ts.map +1 -1
- package/dist/monitoring/TelemetryAuth.js +3 -4
- package/dist/monitoring/TelemetryAuth.js.map +1 -1
- package/dist/monitoring/TokenLedger.d.ts +130 -0
- package/dist/monitoring/TokenLedger.d.ts.map +1 -0
- package/dist/monitoring/TokenLedger.js +523 -0
- package/dist/monitoring/TokenLedger.js.map +1 -0
- package/dist/monitoring/TokenLedgerPoller.d.ts +26 -0
- package/dist/monitoring/TokenLedgerPoller.d.ts.map +1 -0
- package/dist/monitoring/TokenLedgerPoller.js +44 -0
- package/dist/monitoring/TokenLedgerPoller.js.map +1 -0
- package/dist/monitoring/TriageOrchestrator.d.ts.map +1 -1
- package/dist/monitoring/TriageOrchestrator.js +3 -4
- package/dist/monitoring/TriageOrchestrator.js.map +1 -1
- package/dist/monitoring/WorktreeReaper.d.ts.map +1 -1
- package/dist/monitoring/WorktreeReaper.js +5 -7
- package/dist/monitoring/WorktreeReaper.js.map +1 -1
- package/dist/monitoring/delivery-failure-sentinel/recovery-policy.d.ts +83 -0
- package/dist/monitoring/delivery-failure-sentinel/recovery-policy.d.ts.map +1 -0
- package/dist/monitoring/delivery-failure-sentinel/recovery-policy.js +218 -0
- package/dist/monitoring/delivery-failure-sentinel/recovery-policy.js.map +1 -0
- package/dist/monitoring/delivery-failure-sentinel.d.ts +177 -0
- package/dist/monitoring/delivery-failure-sentinel.d.ts.map +1 -0
- package/dist/monitoring/delivery-failure-sentinel.js +598 -0
- package/dist/monitoring/delivery-failure-sentinel.js.map +1 -0
- package/dist/monitoring/probes/PlatformProbe.d.ts.map +1 -1
- package/dist/monitoring/probes/PlatformProbe.js +3 -4
- package/dist/monitoring/probes/PlatformProbe.js.map +1 -1
- package/dist/monitoring/templates-drift-verifier.d.ts +109 -0
- package/dist/monitoring/templates-drift-verifier.d.ts.map +1 -0
- package/dist/monitoring/templates-drift-verifier.js +324 -0
- package/dist/monitoring/templates-drift-verifier.js.map +1 -0
- package/dist/paste/PasteManager.d.ts.map +1 -1
- package/dist/paste/PasteManager.js +5 -8
- package/dist/paste/PasteManager.js.map +1 -1
- package/dist/publishing/PrivateViewer.d.ts.map +1 -1
- package/dist/publishing/PrivateViewer.js +2 -2
- package/dist/publishing/PrivateViewer.js.map +1 -1
- package/dist/scheduler/JobScheduler.d.ts.map +1 -1
- package/dist/scheduler/JobScheduler.js +2 -2
- package/dist/scheduler/JobScheduler.js.map +1 -1
- package/dist/server/AgentServer.d.ts +22 -0
- package/dist/server/AgentServer.d.ts.map +1 -1
- package/dist/server/AgentServer.js +199 -1
- package/dist/server/AgentServer.js.map +1 -1
- package/dist/server/WebSocketManager.d.ts +11 -0
- package/dist/server/WebSocketManager.d.ts.map +1 -1
- package/dist/server/WebSocketManager.js +28 -0
- package/dist/server/WebSocketManager.js.map +1 -1
- package/dist/server/boot-id.d.ts +58 -0
- package/dist/server/boot-id.d.ts.map +1 -0
- package/dist/server/boot-id.js +121 -0
- package/dist/server/boot-id.js.map +1 -0
- package/dist/server/middleware.d.ts +14 -1
- package/dist/server/middleware.d.ts.map +1 -1
- package/dist/server/middleware.js +81 -1
- package/dist/server/middleware.js.map +1 -1
- package/dist/server/routes.d.ts +76 -0
- package/dist/server/routes.d.ts.map +1 -1
- package/dist/server/routes.js +626 -11
- package/dist/server/routes.js.map +1 -1
- package/dist/threadline/AgentDiscovery.d.ts.map +1 -1
- package/dist/threadline/AgentDiscovery.js +2 -2
- package/dist/threadline/AgentDiscovery.js.map +1 -1
- package/dist/threadline/AgentTrustManager.d.ts.map +1 -1
- package/dist/threadline/AgentTrustManager.js +2 -2
- package/dist/threadline/AgentTrustManager.js.map +1 -1
- package/dist/threadline/BackfillCore.d.ts +70 -0
- package/dist/threadline/BackfillCore.d.ts.map +1 -0
- package/dist/threadline/BackfillCore.js +117 -0
- package/dist/threadline/BackfillCore.js.map +1 -0
- package/dist/threadline/CircuitBreaker.d.ts.map +1 -1
- package/dist/threadline/CircuitBreaker.js +2 -2
- package/dist/threadline/CircuitBreaker.js.map +1 -1
- package/dist/threadline/ComputeMeter.d.ts.map +1 -1
- package/dist/threadline/ComputeMeter.js +2 -2
- package/dist/threadline/ComputeMeter.js.map +1 -1
- package/dist/threadline/ContextThreadMap.d.ts.map +1 -1
- package/dist/threadline/ContextThreadMap.js +2 -2
- package/dist/threadline/ContextThreadMap.js.map +1 -1
- package/dist/threadline/HeartbeatWatchdog.d.ts +78 -0
- package/dist/threadline/HeartbeatWatchdog.d.ts.map +1 -0
- package/dist/threadline/HeartbeatWatchdog.js +212 -0
- package/dist/threadline/HeartbeatWatchdog.js.map +1 -0
- package/dist/threadline/HeartbeatWriter.d.ts +79 -0
- package/dist/threadline/HeartbeatWriter.d.ts.map +1 -0
- package/dist/threadline/HeartbeatWriter.js +109 -0
- package/dist/threadline/HeartbeatWriter.js.map +1 -0
- package/dist/threadline/InvitationManager.d.ts.map +1 -1
- package/dist/threadline/InvitationManager.js +2 -2
- package/dist/threadline/InvitationManager.js.map +1 -1
- package/dist/threadline/ListenerSessionManager.d.ts +59 -0
- package/dist/threadline/ListenerSessionManager.d.ts.map +1 -1
- package/dist/threadline/ListenerSessionManager.js +79 -0
- package/dist/threadline/ListenerSessionManager.js.map +1 -1
- package/dist/threadline/MCPAuth.d.ts.map +1 -1
- package/dist/threadline/MCPAuth.js +2 -2
- package/dist/threadline/MCPAuth.js.map +1 -1
- package/dist/threadline/PipeSessionSpawner.d.ts.map +1 -1
- package/dist/threadline/PipeSessionSpawner.js +3 -4
- package/dist/threadline/PipeSessionSpawner.js.map +1 -1
- package/dist/threadline/RateLimiter.d.ts.map +1 -1
- package/dist/threadline/RateLimiter.js +2 -2
- package/dist/threadline/RateLimiter.js.map +1 -1
- package/dist/threadline/RelaySpawnFailureHandler.d.ts +53 -0
- package/dist/threadline/RelaySpawnFailureHandler.d.ts.map +1 -0
- package/dist/threadline/RelaySpawnFailureHandler.js +73 -0
- package/dist/threadline/RelaySpawnFailureHandler.js.map +1 -0
- package/dist/threadline/SessionLifecycle.d.ts.map +1 -1
- package/dist/threadline/SessionLifecycle.js +2 -2
- package/dist/threadline/SessionLifecycle.js.map +1 -1
- package/dist/threadline/SpawnLedger.d.ts +94 -0
- package/dist/threadline/SpawnLedger.d.ts.map +1 -0
- package/dist/threadline/SpawnLedger.js +194 -0
- package/dist/threadline/SpawnLedger.js.map +1 -0
- package/dist/threadline/SpawnNonce.d.ts +49 -0
- package/dist/threadline/SpawnNonce.d.ts.map +1 -0
- package/dist/threadline/SpawnNonce.js +99 -0
- package/dist/threadline/SpawnNonce.js.map +1 -0
- package/dist/threadline/TelegramBridge.d.ts +140 -0
- package/dist/threadline/TelegramBridge.d.ts.map +1 -0
- package/dist/threadline/TelegramBridge.js +224 -0
- package/dist/threadline/TelegramBridge.js.map +1 -0
- package/dist/threadline/TelegramBridgeConfig.d.ts +79 -0
- package/dist/threadline/TelegramBridgeConfig.d.ts.map +1 -0
- package/dist/threadline/TelegramBridgeConfig.js +168 -0
- package/dist/threadline/TelegramBridgeConfig.js.map +1 -0
- package/dist/threadline/ThreadlineBootstrap.d.ts.map +1 -1
- package/dist/threadline/ThreadlineBootstrap.js +2 -2
- package/dist/threadline/ThreadlineBootstrap.js.map +1 -1
- package/dist/threadline/ThreadlineMCPServer.d.ts.map +1 -1
- package/dist/threadline/ThreadlineMCPServer.js +5 -0
- package/dist/threadline/ThreadlineMCPServer.js.map +1 -1
- package/dist/threadline/ThreadlineObservability.d.ts +95 -0
- package/dist/threadline/ThreadlineObservability.d.ts.map +1 -0
- package/dist/threadline/ThreadlineObservability.js +310 -0
- package/dist/threadline/ThreadlineObservability.js.map +1 -0
- package/dist/threadline/WakeSocketServer.d.ts.map +1 -1
- package/dist/threadline/WakeSocketServer.js +3 -4
- package/dist/threadline/WakeSocketServer.js.map +1 -1
- package/dist/threadline/listener-daemon.d.ts.map +1 -1
- package/dist/threadline/listener-daemon.js +3 -4
- package/dist/threadline/listener-daemon.js.map +1 -1
- package/dist/users/UserManager.d.ts.map +1 -1
- package/dist/users/UserManager.js +2 -2
- package/dist/users/UserManager.js.map +1 -1
- package/dist/users/UserOnboarding.d.ts.map +1 -1
- package/dist/users/UserOnboarding.js +2 -2
- package/dist/users/UserOnboarding.js.map +1 -1
- package/dist/utils/jsonl-rotation.d.ts.map +1 -1
- package/dist/utils/jsonl-rotation.js +2 -2
- package/dist/utils/jsonl-rotation.js.map +1 -1
- package/package.json +1 -1
- package/scripts/analyze-release.js +7 -12
- package/scripts/check-contract-evidence.js +27 -10
- package/scripts/fix-better-sqlite3.cjs +0 -2
- package/scripts/instar-dev-precommit.js +0 -2
- package/scripts/lint-no-direct-destructive.js +24 -4
- package/scripts/lint-template-sha-history.ts +183 -0
- package/scripts/migrate-incident-2026-04-17.mjs +2 -2
- package/scripts/run-migration.js +500 -0
- package/scripts/test-bootstrap-relay.mjs +2 -2
- package/scripts/threadline-bridge-backfill.mjs +379 -0
- package/scripts/verify-deployed-templates.ts +87 -0
- package/src/data/builtin-manifest.json +140 -132
- package/src/templates/scripts/git-sync-gate.sh +0 -4
- package/src/templates/scripts/telegram-reply.sh +318 -13
- package/upgrades/0.28.77.md +133 -0
- package/upgrades/0.28.78.md +90 -0
- package/upgrades/side-effects/agent-health-alert-authority-routing.md +121 -0
- package/upgrades/side-effects/comprehensive-destructive-tool-containment-migration.md +82 -0
- package/upgrades/side-effects/deferral-detector-orphan-todo.md +101 -0
- package/upgrades/side-effects/lifeline-self-heal-hardening.md +151 -0
- package/upgrades/side-effects/relay-spawn-ghost-reply-phase1.md +139 -0
- package/upgrades/side-effects/telegram-delivery-robustness-layer-2.md +320 -0
- package/upgrades/side-effects/telegram-delivery-robustness-layer-3.md +202 -0
- package/upgrades/side-effects/telegram-delivery-robustness-layer-7.md +339 -0
- package/upgrades/side-effects/telegram-delivery-robustness.md +178 -0
- package/upgrades/side-effects/threadline-bridge-backfill.md +203 -0
- package/upgrades/side-effects/threadline-canonical-inbox-write.md +218 -0
- package/upgrades/side-effects/threadline-observability-tab.md +206 -0
- package/upgrades/side-effects/threadline-tg-bridge-module.md +196 -0
- package/upgrades/side-effects/threadline-tg-bridge-settings-surface.md +208 -0
- package/upgrades/side-effects/token-ledger-bounded-scan.md +230 -0
- package/upgrades/side-effects/token-ledger-phase1.md +123 -0
- package/upgrades/NEXT.md +0 -53
- /package/upgrades/side-effects/{telegram-lifeline-version-missing-info.md → 0.28.76.md} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ContextThreadMap.js","sourceRoot":"","sources":["../../src/threadline/ContextThreadMap.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"ContextThreadMap.js","sourceRoot":"","sources":["../../src/threadline/ContextThreadMap.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HeartbeatWatchdog — single shared 1s poller for relay-spawned session
|
|
3
|
+
* heartbeats.
|
|
4
|
+
*
|
|
5
|
+
* Component B of RELAY-SPAWN-GHOST-REPLY-CONTAINMENT-SPEC. Each tick it
|
|
6
|
+
* reads `.instar/threadline/sessions/*.alive`, verifies the HMAC against
|
|
7
|
+
* the SpawnLedger row, checks process liveness, and emits structured
|
|
8
|
+
* signals to the registered consumer. Per round-2 review: ONE poller for
|
|
9
|
+
* the whole relay (not per-session), or fan-out scales O(n²) on busy
|
|
10
|
+
* peers.
|
|
11
|
+
*
|
|
12
|
+
* Authority classification (per docs/signal-vs-authority.md): pure
|
|
13
|
+
* SIGNAL-PRODUCER. Emits typed signals; never blocks, never kills, never
|
|
14
|
+
* decides retry-vs-suppress. The consumer (RelaySpawnFailureHandler) is
|
|
15
|
+
* the smart authority that owns those decisions.
|
|
16
|
+
*/
|
|
17
|
+
import type { SpawnLedger, SpawnLedgerRow } from './SpawnLedger.js';
|
|
18
|
+
export type HeartbeatSignalKind = 'heartbeat-verified' | 'heartbeat-missing' | 'heartbeat-forged' | 'heartbeat-stale' | 'heartbeat-pid-dead';
|
|
19
|
+
export interface HeartbeatSignal {
|
|
20
|
+
kind: HeartbeatSignalKind;
|
|
21
|
+
/** Spawn ledger eventId this signal is about. */
|
|
22
|
+
eventId: string;
|
|
23
|
+
/** Thread the heartbeat (or absence) was for. */
|
|
24
|
+
threadId: string;
|
|
25
|
+
/** Best-known peer for this row; undefined if ledger row missing. */
|
|
26
|
+
peerId?: string;
|
|
27
|
+
/** Epoch ms when the signal was raised. */
|
|
28
|
+
raisedAt: number;
|
|
29
|
+
/** Human-readable detail for logs. Stable strings, not free-form. */
|
|
30
|
+
detail: string;
|
|
31
|
+
/** Underlying ledger row at time of signal, if available. */
|
|
32
|
+
row?: SpawnLedgerRow;
|
|
33
|
+
}
|
|
34
|
+
export type HeartbeatSignalConsumer = (sig: HeartbeatSignal) => void;
|
|
35
|
+
export interface HeartbeatWatchdogOptions {
|
|
36
|
+
/** Directory containing per-thread `.alive` files. */
|
|
37
|
+
sessionsDir: string;
|
|
38
|
+
/** Spawn ledger to look up nonces and current row state. */
|
|
39
|
+
ledger: SpawnLedger;
|
|
40
|
+
/** Where to send structured signals. Required. */
|
|
41
|
+
consumer: HeartbeatSignalConsumer;
|
|
42
|
+
/** First-heartbeat deadline (ms). Default 5000. Spec §Component B. */
|
|
43
|
+
firstHeartbeatGraceMs?: number;
|
|
44
|
+
/** Refresh cadence the writer is expected to honor (ms). Default 10000. */
|
|
45
|
+
refreshCadenceMs?: number;
|
|
46
|
+
/** Liveness check via kill(pid, 0). Default true. */
|
|
47
|
+
checkPidLiveness?: boolean;
|
|
48
|
+
/** Now-source for tests. */
|
|
49
|
+
now?: () => number;
|
|
50
|
+
}
|
|
51
|
+
export declare class HeartbeatWatchdog {
|
|
52
|
+
private readonly sessionsDir;
|
|
53
|
+
private readonly ledger;
|
|
54
|
+
private readonly consumer;
|
|
55
|
+
private readonly firstHeartbeatGraceMs;
|
|
56
|
+
private readonly refreshCadenceMs;
|
|
57
|
+
private readonly checkPidLiveness;
|
|
58
|
+
private readonly now;
|
|
59
|
+
/** eventIds we've already emitted a 'heartbeat-verified' signal for. */
|
|
60
|
+
private readonly verifiedOnce;
|
|
61
|
+
/** eventIds we've already emitted a terminal failure signal for. */
|
|
62
|
+
private readonly terminalSignaled;
|
|
63
|
+
private timer;
|
|
64
|
+
constructor(opts: HeartbeatWatchdogOptions);
|
|
65
|
+
/** Start the 1s tick. Idempotent. */
|
|
66
|
+
start(intervalMs?: number): void;
|
|
67
|
+
/** Stop the tick. Idempotent. */
|
|
68
|
+
stop(): void;
|
|
69
|
+
/**
|
|
70
|
+
* One pass: enumerate spawning rows, check each for heartbeat health.
|
|
71
|
+
* Public so tests and integration code can drive deterministic ticks.
|
|
72
|
+
*/
|
|
73
|
+
tick(): HeartbeatSignal[];
|
|
74
|
+
private evaluateRow;
|
|
75
|
+
private findHeartbeatForEvent;
|
|
76
|
+
private isPidAlive;
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=HeartbeatWatchdog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HeartbeatWatchdog.d.ts","sourceRoot":"","sources":["../../src/threadline/HeartbeatWatchdog.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAKH,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAQpE,MAAM,MAAM,mBAAmB,GAC3B,oBAAoB,GACpB,mBAAmB,GACnB,kBAAkB,GAClB,iBAAiB,GACjB,oBAAoB,CAAC;AAEzB,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,mBAAmB,CAAC;IAC1B,iDAAiD;IACjD,OAAO,EAAE,MAAM,CAAC;IAChB,iDAAiD;IACjD,QAAQ,EAAE,MAAM,CAAC;IACjB,qEAAqE;IACrE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,2CAA2C;IAC3C,QAAQ,EAAE,MAAM,CAAC;IACjB,qEAAqE;IACrE,MAAM,EAAE,MAAM,CAAC;IACf,6DAA6D;IAC7D,GAAG,CAAC,EAAE,cAAc,CAAC;CACtB;AAED,MAAM,MAAM,uBAAuB,GAAG,CAAC,GAAG,EAAE,eAAe,KAAK,IAAI,CAAC;AAIrE,MAAM,WAAW,wBAAwB;IACvC,sDAAsD;IACtD,WAAW,EAAE,MAAM,CAAC;IACpB,4DAA4D;IAC5D,MAAM,EAAE,WAAW,CAAC;IACpB,kDAAkD;IAClD,QAAQ,EAAE,uBAAuB,CAAC;IAClC,sEAAsE;IACtE,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,2EAA2E;IAC3E,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,qDAAqD;IACrD,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,4BAA4B;IAC5B,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAED,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAc;IACrC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA0B;IACnD,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAS;IAC/C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAU;IAC3C,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;IAEnC,wEAAwE;IACxE,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAqB;IAClD,oEAAoE;IACpE,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAqB;IAEtD,OAAO,CAAC,KAAK,CAA+B;gBAEhC,IAAI,EAAE,wBAAwB;IAW1C,qCAAqC;IACrC,KAAK,CAAC,UAAU,GAAE,MAAc,GAAG,IAAI;IAYvC,iCAAiC;IACjC,IAAI,IAAI,IAAI;IAOZ;;;OAGG;IACH,IAAI,IAAI,eAAe,EAAE;IAqBzB,OAAO,CAAC,WAAW;IAqFnB,OAAO,CAAC,qBAAqB;IAyB7B,OAAO,CAAC,UAAU;CAiBnB"}
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HeartbeatWatchdog — single shared 1s poller for relay-spawned session
|
|
3
|
+
* heartbeats.
|
|
4
|
+
*
|
|
5
|
+
* Component B of RELAY-SPAWN-GHOST-REPLY-CONTAINMENT-SPEC. Each tick it
|
|
6
|
+
* reads `.instar/threadline/sessions/*.alive`, verifies the HMAC against
|
|
7
|
+
* the SpawnLedger row, checks process liveness, and emits structured
|
|
8
|
+
* signals to the registered consumer. Per round-2 review: ONE poller for
|
|
9
|
+
* the whole relay (not per-session), or fan-out scales O(n²) on busy
|
|
10
|
+
* peers.
|
|
11
|
+
*
|
|
12
|
+
* Authority classification (per docs/signal-vs-authority.md): pure
|
|
13
|
+
* SIGNAL-PRODUCER. Emits typed signals; never blocks, never kills, never
|
|
14
|
+
* decides retry-vs-suppress. The consumer (RelaySpawnFailureHandler) is
|
|
15
|
+
* the smart authority that owns those decisions.
|
|
16
|
+
*/
|
|
17
|
+
import fs from 'node:fs';
|
|
18
|
+
import path from 'node:path';
|
|
19
|
+
import { canonicalHeartbeatPayload, } from './HeartbeatWriter.js';
|
|
20
|
+
export class HeartbeatWatchdog {
|
|
21
|
+
sessionsDir;
|
|
22
|
+
ledger;
|
|
23
|
+
consumer;
|
|
24
|
+
firstHeartbeatGraceMs;
|
|
25
|
+
refreshCadenceMs;
|
|
26
|
+
checkPidLiveness;
|
|
27
|
+
now;
|
|
28
|
+
/** eventIds we've already emitted a 'heartbeat-verified' signal for. */
|
|
29
|
+
verifiedOnce = new Set();
|
|
30
|
+
/** eventIds we've already emitted a terminal failure signal for. */
|
|
31
|
+
terminalSignaled = new Set();
|
|
32
|
+
timer = null;
|
|
33
|
+
constructor(opts) {
|
|
34
|
+
this.sessionsDir = opts.sessionsDir;
|
|
35
|
+
this.ledger = opts.ledger;
|
|
36
|
+
this.consumer = opts.consumer;
|
|
37
|
+
this.firstHeartbeatGraceMs = opts.firstHeartbeatGraceMs ?? 5_000;
|
|
38
|
+
this.refreshCadenceMs = opts.refreshCadenceMs ?? 10_000;
|
|
39
|
+
this.checkPidLiveness = opts.checkPidLiveness ?? true;
|
|
40
|
+
this.now = opts.now ?? Date.now;
|
|
41
|
+
fs.mkdirSync(this.sessionsDir, { recursive: true });
|
|
42
|
+
}
|
|
43
|
+
/** Start the 1s tick. Idempotent. */
|
|
44
|
+
start(intervalMs = 1_000) {
|
|
45
|
+
if (this.timer)
|
|
46
|
+
return;
|
|
47
|
+
this.timer = setInterval(() => {
|
|
48
|
+
try {
|
|
49
|
+
this.tick();
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
/* tick must never throw — single poller for the whole relay */
|
|
53
|
+
}
|
|
54
|
+
}, intervalMs);
|
|
55
|
+
this.timer.unref?.();
|
|
56
|
+
}
|
|
57
|
+
/** Stop the tick. Idempotent. */
|
|
58
|
+
stop() {
|
|
59
|
+
if (this.timer) {
|
|
60
|
+
clearInterval(this.timer);
|
|
61
|
+
this.timer = null;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* One pass: enumerate spawning rows, check each for heartbeat health.
|
|
66
|
+
* Public so tests and integration code can drive deterministic ticks.
|
|
67
|
+
*/
|
|
68
|
+
tick() {
|
|
69
|
+
const emitted = [];
|
|
70
|
+
const spawning = this.ledger.listSpawning();
|
|
71
|
+
for (const row of spawning) {
|
|
72
|
+
if (this.terminalSignaled.has(row.eventId))
|
|
73
|
+
continue;
|
|
74
|
+
const sig = this.evaluateRow(row);
|
|
75
|
+
if (sig) {
|
|
76
|
+
// Suppress repeat 'verified' beyond the first.
|
|
77
|
+
if (sig.kind === 'heartbeat-verified') {
|
|
78
|
+
if (this.verifiedOnce.has(row.eventId))
|
|
79
|
+
continue;
|
|
80
|
+
this.verifiedOnce.add(row.eventId);
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
this.terminalSignaled.add(row.eventId);
|
|
84
|
+
}
|
|
85
|
+
this.consumer(sig);
|
|
86
|
+
emitted.push(sig);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return emitted;
|
|
90
|
+
}
|
|
91
|
+
evaluateRow(row) {
|
|
92
|
+
const { eventId, peerId, spawnedAt } = row;
|
|
93
|
+
const now = this.now();
|
|
94
|
+
const ageMs = now - spawnedAt;
|
|
95
|
+
// Locate the .alive file. We don't know threadId from the ledger
|
|
96
|
+
// (intentionally — ledger is per-event, not per-thread). Scan once.
|
|
97
|
+
const alive = this.findHeartbeatForEvent(eventId);
|
|
98
|
+
if (!alive) {
|
|
99
|
+
// No heartbeat yet. If still inside grace window, no signal.
|
|
100
|
+
if (ageMs <= this.firstHeartbeatGraceMs)
|
|
101
|
+
return null;
|
|
102
|
+
return {
|
|
103
|
+
kind: 'heartbeat-missing',
|
|
104
|
+
eventId,
|
|
105
|
+
threadId: '<unknown>',
|
|
106
|
+
peerId,
|
|
107
|
+
raisedAt: now,
|
|
108
|
+
detail: `no .alive file after ${ageMs}ms (grace ${this.firstHeartbeatGraceMs}ms)`,
|
|
109
|
+
row,
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
const { envelope, threadId } = alive;
|
|
113
|
+
// Verify HMAC against the ledger nonce.
|
|
114
|
+
const payload = canonicalHeartbeatPayload({
|
|
115
|
+
eventId: envelope.eventId,
|
|
116
|
+
sessionPid: envelope.sessionPid,
|
|
117
|
+
threadId: envelope.threadId,
|
|
118
|
+
ts: envelope.ts,
|
|
119
|
+
});
|
|
120
|
+
const valid = this.ledger.verifyHeartbeatHmac(eventId, payload, envelope.hmac);
|
|
121
|
+
if (!valid || envelope.eventId !== eventId) {
|
|
122
|
+
return {
|
|
123
|
+
kind: 'heartbeat-forged',
|
|
124
|
+
eventId,
|
|
125
|
+
threadId,
|
|
126
|
+
peerId,
|
|
127
|
+
raisedAt: now,
|
|
128
|
+
detail: valid
|
|
129
|
+
? `eventId mismatch in payload (${envelope.eventId} vs ledger ${eventId})`
|
|
130
|
+
: 'HMAC verification failed',
|
|
131
|
+
row,
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
// Heartbeat must be fresh (within 2× refresh cadence per spec).
|
|
135
|
+
const heartbeatAge = now - envelope.ts;
|
|
136
|
+
if (heartbeatAge > this.refreshCadenceMs * 2) {
|
|
137
|
+
return {
|
|
138
|
+
kind: 'heartbeat-stale',
|
|
139
|
+
eventId,
|
|
140
|
+
threadId,
|
|
141
|
+
peerId,
|
|
142
|
+
raisedAt: now,
|
|
143
|
+
detail: `heartbeat ${heartbeatAge}ms old, max ${this.refreshCadenceMs * 2}ms`,
|
|
144
|
+
row,
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
// Pid must still be alive — caught the round-1 fork-and-crash case.
|
|
148
|
+
if (this.checkPidLiveness && !this.isPidAlive(envelope.sessionPid)) {
|
|
149
|
+
return {
|
|
150
|
+
kind: 'heartbeat-pid-dead',
|
|
151
|
+
eventId,
|
|
152
|
+
threadId,
|
|
153
|
+
peerId,
|
|
154
|
+
raisedAt: now,
|
|
155
|
+
detail: `pid ${envelope.sessionPid} not running`,
|
|
156
|
+
row,
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
return {
|
|
160
|
+
kind: 'heartbeat-verified',
|
|
161
|
+
eventId,
|
|
162
|
+
threadId,
|
|
163
|
+
peerId,
|
|
164
|
+
raisedAt: now,
|
|
165
|
+
detail: `heartbeat ok, age ${heartbeatAge}ms`,
|
|
166
|
+
row,
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
findHeartbeatForEvent(eventId) {
|
|
170
|
+
let entries;
|
|
171
|
+
try {
|
|
172
|
+
entries = fs.readdirSync(this.sessionsDir);
|
|
173
|
+
}
|
|
174
|
+
catch {
|
|
175
|
+
return null;
|
|
176
|
+
}
|
|
177
|
+
for (const name of entries) {
|
|
178
|
+
if (!name.endsWith('.alive'))
|
|
179
|
+
continue;
|
|
180
|
+
const full = path.join(this.sessionsDir, name);
|
|
181
|
+
try {
|
|
182
|
+
const raw = fs.readFileSync(full, 'utf8');
|
|
183
|
+
const env = JSON.parse(raw);
|
|
184
|
+
if (env.eventId === eventId) {
|
|
185
|
+
return { envelope: env, threadId: name.replace(/\.alive$/, '') };
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
catch {
|
|
189
|
+
/* skip malformed */
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
return null;
|
|
193
|
+
}
|
|
194
|
+
isPidAlive(pid) {
|
|
195
|
+
if (!pid || pid <= 0)
|
|
196
|
+
return false;
|
|
197
|
+
try {
|
|
198
|
+
process.kill(pid, 0);
|
|
199
|
+
return true;
|
|
200
|
+
}
|
|
201
|
+
catch (e) {
|
|
202
|
+
// ESRCH = no such process. EPERM = exists but unsigned-able (alive).
|
|
203
|
+
if (e instanceof Error &&
|
|
204
|
+
'code' in e &&
|
|
205
|
+
e.code === 'EPERM') {
|
|
206
|
+
return true;
|
|
207
|
+
}
|
|
208
|
+
return false;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
//# sourceMappingURL=HeartbeatWatchdog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HeartbeatWatchdog.js","sourceRoot":"","sources":["../../src/threadline/HeartbeatWatchdog.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HeartbeatWriter — utility used by relay-spawned sessions to emit signed
|
|
3
|
+
* liveness pings the relay-side HeartbeatWatchdog can verify.
|
|
4
|
+
*
|
|
5
|
+
* Component B of RELAY-SPAWN-GHOST-REPLY-CONTAINMENT-SPEC. The spawned
|
|
6
|
+
* session reads its per-spawn HMAC nonce from FD 3 once at boot, then
|
|
7
|
+
* uses it to sign a heartbeat payload written via atomic-rename to
|
|
8
|
+
* `.instar/threadline/sessions/<threadId>.alive` on a fixed cadence.
|
|
9
|
+
*
|
|
10
|
+
* Atomic-rename is mandatory: it eliminates the half-write race the
|
|
11
|
+
* round-1 review found between writer-flushing and watchdog-reading.
|
|
12
|
+
*
|
|
13
|
+
* Authority classification: pure side-effect-only utility. No decisions,
|
|
14
|
+
* no signals consumed. The session that imports this is the one being
|
|
15
|
+
* watched; integrity comes from the signature, not from this code.
|
|
16
|
+
*/
|
|
17
|
+
export interface HeartbeatPayloadFields {
|
|
18
|
+
/** Spawn ledger eventId — must match the row this nonce was reserved for. */
|
|
19
|
+
eventId: string;
|
|
20
|
+
/** Process id of the session writing this heartbeat. */
|
|
21
|
+
sessionPid: number;
|
|
22
|
+
/** Thread id this session is servicing. */
|
|
23
|
+
threadId: string;
|
|
24
|
+
/** Epoch ms — used by watchdog to detect stale heartbeats. */
|
|
25
|
+
ts: number;
|
|
26
|
+
}
|
|
27
|
+
export interface HeartbeatEnvelope extends HeartbeatPayloadFields {
|
|
28
|
+
/** Hex SHA-256 HMAC of the canonical payload string under the spawn nonce. */
|
|
29
|
+
hmac: string;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Build the canonical signing string. The watchdog reconstructs this
|
|
33
|
+
* EXACTLY when verifying, so any reordering or extra whitespace breaks
|
|
34
|
+
* verification. Field order is locked: evt:pid:tid:ts.
|
|
35
|
+
*/
|
|
36
|
+
export declare function canonicalHeartbeatPayload(p: HeartbeatPayloadFields): string;
|
|
37
|
+
export interface HeartbeatWriterOptions {
|
|
38
|
+
/** Directory containing per-thread `.alive` files. */
|
|
39
|
+
sessionsDir: string;
|
|
40
|
+
/** Per-spawn HMAC nonce, read once from FD 3 by the spawned session. */
|
|
41
|
+
spawnNonce: Buffer;
|
|
42
|
+
/** Spawn ledger eventId this session was reserved under. */
|
|
43
|
+
eventId: string;
|
|
44
|
+
/** Thread id this session is servicing. */
|
|
45
|
+
threadId: string;
|
|
46
|
+
/** Process id (defaults to current process). */
|
|
47
|
+
sessionPid?: number;
|
|
48
|
+
}
|
|
49
|
+
export declare class HeartbeatWriter {
|
|
50
|
+
private readonly opts;
|
|
51
|
+
private readonly targetPath;
|
|
52
|
+
constructor(opts: HeartbeatWriterOptions);
|
|
53
|
+
/**
|
|
54
|
+
* Write a heartbeat now. Atomic: writes to a tmp file in the same dir,
|
|
55
|
+
* then renames over the target. Watchdog will only see complete files.
|
|
56
|
+
*/
|
|
57
|
+
write(now?: number): HeartbeatEnvelope;
|
|
58
|
+
/** Path the writer targets — exposed for diagnostics. */
|
|
59
|
+
get path(): string;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Read the per-spawn nonce from FD 3 exactly once. Called by spawned
|
|
63
|
+
* sessions at boot. Returns null if FD 3 is not a pipe or contains no
|
|
64
|
+
* data — caller MUST treat null as "no spawn-guard active for this
|
|
65
|
+
* session" and skip heartbeat writing (the watchdog will then mark it
|
|
66
|
+
* heartbeat-missing, which is correct fail-closed behavior).
|
|
67
|
+
*
|
|
68
|
+
* Why FD 3 and not env: the round-1 review noted that env vars are
|
|
69
|
+
* inherited by every fork-helper a session may spawn (build tools,
|
|
70
|
+
* shells), giving them the nonce. FD 3 is single-read by design and
|
|
71
|
+
* does not propagate.
|
|
72
|
+
*/
|
|
73
|
+
export declare function readSpawnNonceFromFd3(): Buffer | null;
|
|
74
|
+
/**
|
|
75
|
+
* Default sessions-dir convention. Single source of truth used by both
|
|
76
|
+
* the writer (in spawned sessions) and the watchdog (in the relay).
|
|
77
|
+
*/
|
|
78
|
+
export declare function defaultSessionsDir(stateDir?: string): string;
|
|
79
|
+
//# sourceMappingURL=HeartbeatWriter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HeartbeatWriter.d.ts","sourceRoot":"","sources":["../../src/threadline/HeartbeatWriter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAOH,MAAM,WAAW,sBAAsB;IACrC,6EAA6E;IAC7E,OAAO,EAAE,MAAM,CAAC;IAChB,wDAAwD;IACxD,UAAU,EAAE,MAAM,CAAC;IACnB,2CAA2C;IAC3C,QAAQ,EAAE,MAAM,CAAC;IACjB,8DAA8D;IAC9D,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,iBAAkB,SAAQ,sBAAsB;IAC/D,8EAA8E;IAC9E,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,CAAC,EAAE,sBAAsB,GAAG,MAAM,CAE3E;AAED,MAAM,WAAW,sBAAsB;IACrC,sDAAsD;IACtD,WAAW,EAAE,MAAM,CAAC;IACpB,wEAAwE;IACxE,UAAU,EAAE,MAAM,CAAC;IACnB,4DAA4D;IAC5D,OAAO,EAAE,MAAM,CAAC;IAChB,2CAA2C;IAC3C,QAAQ,EAAE,MAAM,CAAC;IACjB,gDAAgD;IAChD,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAmC;IACxD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;gBAExB,IAAI,EAAE,sBAAsB;IAiBxC;;;OAGG;IACH,KAAK,CAAC,GAAG,SAAa,GAAG,iBAAiB;IAqB1C,yDAAyD;IACzD,IAAI,IAAI,IAAI,MAAM,CAEjB;CACF;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,GAAG,IAAI,CAYrD;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,GAAE,MAA2C,GAAG,MAAM,CAEhG"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HeartbeatWriter — utility used by relay-spawned sessions to emit signed
|
|
3
|
+
* liveness pings the relay-side HeartbeatWatchdog can verify.
|
|
4
|
+
*
|
|
5
|
+
* Component B of RELAY-SPAWN-GHOST-REPLY-CONTAINMENT-SPEC. The spawned
|
|
6
|
+
* session reads its per-spawn HMAC nonce from FD 3 once at boot, then
|
|
7
|
+
* uses it to sign a heartbeat payload written via atomic-rename to
|
|
8
|
+
* `.instar/threadline/sessions/<threadId>.alive` on a fixed cadence.
|
|
9
|
+
*
|
|
10
|
+
* Atomic-rename is mandatory: it eliminates the half-write race the
|
|
11
|
+
* round-1 review found between writer-flushing and watchdog-reading.
|
|
12
|
+
*
|
|
13
|
+
* Authority classification: pure side-effect-only utility. No decisions,
|
|
14
|
+
* no signals consumed. The session that imports this is the one being
|
|
15
|
+
* watched; integrity comes from the signature, not from this code.
|
|
16
|
+
*/
|
|
17
|
+
import crypto from 'node:crypto';
|
|
18
|
+
import fs from 'node:fs';
|
|
19
|
+
import os from 'node:os';
|
|
20
|
+
import path from 'node:path';
|
|
21
|
+
/**
|
|
22
|
+
* Build the canonical signing string. The watchdog reconstructs this
|
|
23
|
+
* EXACTLY when verifying, so any reordering or extra whitespace breaks
|
|
24
|
+
* verification. Field order is locked: evt:pid:tid:ts.
|
|
25
|
+
*/
|
|
26
|
+
export function canonicalHeartbeatPayload(p) {
|
|
27
|
+
return `evt:${p.eventId}:pid:${p.sessionPid}:tid:${p.threadId}:ts:${p.ts}`;
|
|
28
|
+
}
|
|
29
|
+
export class HeartbeatWriter {
|
|
30
|
+
opts;
|
|
31
|
+
targetPath;
|
|
32
|
+
constructor(opts) {
|
|
33
|
+
if (!opts.spawnNonce || opts.spawnNonce.length !== 32) {
|
|
34
|
+
throw new Error('HeartbeatWriter requires a 32-byte spawnNonce');
|
|
35
|
+
}
|
|
36
|
+
if (!opts.eventId || !opts.threadId || !opts.sessionsDir) {
|
|
37
|
+
throw new Error('HeartbeatWriter requires sessionsDir, eventId, threadId');
|
|
38
|
+
}
|
|
39
|
+
this.opts = {
|
|
40
|
+
sessionPid: process.pid,
|
|
41
|
+
...opts,
|
|
42
|
+
};
|
|
43
|
+
this.targetPath = path.join(this.opts.sessionsDir, `${opts.threadId}.alive`);
|
|
44
|
+
fs.mkdirSync(this.opts.sessionsDir, { recursive: true });
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Write a heartbeat now. Atomic: writes to a tmp file in the same dir,
|
|
48
|
+
* then renames over the target. Watchdog will only see complete files.
|
|
49
|
+
*/
|
|
50
|
+
write(now = Date.now()) {
|
|
51
|
+
const fields = {
|
|
52
|
+
eventId: this.opts.eventId,
|
|
53
|
+
sessionPid: this.opts.sessionPid,
|
|
54
|
+
threadId: this.opts.threadId,
|
|
55
|
+
ts: now,
|
|
56
|
+
};
|
|
57
|
+
const payload = canonicalHeartbeatPayload(fields);
|
|
58
|
+
const hmac = crypto
|
|
59
|
+
.createHmac('sha256', this.opts.spawnNonce)
|
|
60
|
+
.update(payload)
|
|
61
|
+
.digest('hex');
|
|
62
|
+
const env = { ...fields, hmac };
|
|
63
|
+
// Atomic write: tmp in same directory then rename.
|
|
64
|
+
const tmp = `${this.targetPath}.${process.pid}.${crypto.randomBytes(4).toString('hex')}.tmp`;
|
|
65
|
+
fs.writeFileSync(tmp, JSON.stringify(env), { mode: 0o600 });
|
|
66
|
+
fs.renameSync(tmp, this.targetPath);
|
|
67
|
+
return env;
|
|
68
|
+
}
|
|
69
|
+
/** Path the writer targets — exposed for diagnostics. */
|
|
70
|
+
get path() {
|
|
71
|
+
return this.targetPath;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Read the per-spawn nonce from FD 3 exactly once. Called by spawned
|
|
76
|
+
* sessions at boot. Returns null if FD 3 is not a pipe or contains no
|
|
77
|
+
* data — caller MUST treat null as "no spawn-guard active for this
|
|
78
|
+
* session" and skip heartbeat writing (the watchdog will then mark it
|
|
79
|
+
* heartbeat-missing, which is correct fail-closed behavior).
|
|
80
|
+
*
|
|
81
|
+
* Why FD 3 and not env: the round-1 review noted that env vars are
|
|
82
|
+
* inherited by every fork-helper a session may spawn (build tools,
|
|
83
|
+
* shells), giving them the nonce. FD 3 is single-read by design and
|
|
84
|
+
* does not propagate.
|
|
85
|
+
*/
|
|
86
|
+
export function readSpawnNonceFromFd3() {
|
|
87
|
+
try {
|
|
88
|
+
// FD 3 is the convention for inherited-pipe handoff per spec.
|
|
89
|
+
const buf = fs.readFileSync(3);
|
|
90
|
+
if (!buf || buf.length === 0)
|
|
91
|
+
return null;
|
|
92
|
+
// Nonce is exactly 32 bytes. If FD 3 carries anything else, treat
|
|
93
|
+
// as absent rather than guessing — fail-closed.
|
|
94
|
+
if (buf.length !== 32)
|
|
95
|
+
return null;
|
|
96
|
+
return buf;
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
return null;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Default sessions-dir convention. Single source of truth used by both
|
|
104
|
+
* the writer (in spawned sessions) and the watchdog (in the relay).
|
|
105
|
+
*/
|
|
106
|
+
export function defaultSessionsDir(stateDir = path.join(os.homedir(), '.instar')) {
|
|
107
|
+
return path.join(stateDir, 'threadline', 'sessions');
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=HeartbeatWriter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HeartbeatWriter.js","sourceRoot":"","sources":["../../src/threadline/HeartbeatWriter.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InvitationManager.d.ts","sourceRoot":"","sources":["../../src/threadline/InvitationManager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;
|
|
1
|
+
{"version":3,"file":"InvitationManager.d.ts","sourceRoot":"","sources":["../../src/threadline/InvitationManager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AASH,MAAM,WAAW,uBAAuB;IACtC,8CAA8C;IAC9C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gEAAgE;IAChE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,sEAAsE;IACtE,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,UAAU;IACzB,iDAAiD;IACjD,KAAK,EAAE,MAAM,CAAC;IACd,yCAAyC;IACzC,IAAI,EAAE,MAAM,CAAC;IACb,2BAA2B;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,oDAAoD;IACpD,SAAS,EAAE,MAAM,CAAC;IAClB,uEAAuE;IACvE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,6CAA6C;IAC7C,OAAO,EAAE,MAAM,CAAC;IAChB,kDAAkD;IAClD,QAAQ,EAAE,MAAM,CAAC;IACjB,qDAAqD;IACrD,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,uDAAuD;IACvD,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,MAAM,gBAAgB,GAAG,OAAO,GAAG,SAAS,GAAG,WAAW,GAAG,SAAS,GAAG,WAAW,GAAG,cAAc,CAAC;AAE5G,MAAM,WAAW,wBAAwB;IACvC,MAAM,EAAE,gBAAgB,CAAC;IACzB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;CAChB;AAiCD,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;IACzC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,WAAW,CAA6B;gBAEpC,OAAO,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE;IAYzC;;;OAGG;IACH,MAAM,CAAC,OAAO,CAAC,EAAE,uBAAuB,GAAG,MAAM;IA2BjD;;;OAGG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,wBAAwB;IAwDjD;;;;OAIG;IACH,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,wBAAwB;IAwBvE;;;OAGG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAW9B;;OAEG;IACH,IAAI,IAAI,KAAK,CAAC,UAAU,GAAG;QAAE,MAAM,EAAE,gBAAgB,CAAA;KAAE,CAAC;IASxD;;OAEG;IACH,MAAM,IAAI,IAAI;IAMd,OAAO,CAAC,WAAW;IAInB,OAAO,CAAC,kBAAkB;IAkB1B,OAAO,CAAC,eAAe;IAQvB,OAAO,CAAC,IAAI;CAWb"}
|
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
import crypto from 'node:crypto';
|
|
13
13
|
import fs from 'node:fs';
|
|
14
14
|
import path from 'node:path';
|
|
15
|
+
import { SafeFsExecutor } from '../core/SafeFsExecutor.js';
|
|
15
16
|
// ── Helpers ──────────────────────────────────────────────────────────
|
|
16
17
|
function atomicWrite(filePath, data) {
|
|
17
18
|
const tmpPath = `${filePath}.${process.pid}.${Math.random().toString(36).slice(2)}.tmp`;
|
|
@@ -20,9 +21,8 @@ function atomicWrite(filePath, data) {
|
|
|
20
21
|
fs.renameSync(tmpPath, filePath);
|
|
21
22
|
}
|
|
22
23
|
catch (err) {
|
|
23
|
-
// safe-git-allow: incremental-migration
|
|
24
24
|
try {
|
|
25
|
-
|
|
25
|
+
SafeFsExecutor.safeUnlinkSync(tmpPath, { operation: 'src/threadline/InvitationManager.ts:66' });
|
|
26
26
|
}
|
|
27
27
|
catch { /* ignore */ }
|
|
28
28
|
throw err;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InvitationManager.js","sourceRoot":"","sources":["../../src/threadline/InvitationManager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"InvitationManager.js","sourceRoot":"","sources":["../../src/threadline/InvitationManager.ts"],"names":[],"mappings":"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"}
|