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":"SessionLifecycle.js","sourceRoot":"","sources":["../../src/threadline/SessionLifecycle.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"SessionLifecycle.js","sourceRoot":"","sources":["../../src/threadline/SessionLifecycle.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SpawnLedger — SQLite-backed compare-and-swap ledger for relay-spawned sessions.
|
|
3
|
+
*
|
|
4
|
+
* Implements Component A of the Threadline Relay-Spawn Ghost-Reply
|
|
5
|
+
* Containment Spec. The ledger is the spawn-creation step itself, not a
|
|
6
|
+
* post-hoc check: tryReserve() atomically claims an eventId or returns null
|
|
7
|
+
* if another spawn already claimed it. This is the idempotency primitive
|
|
8
|
+
* that makes "Spawned session for X (twice)" structurally impossible.
|
|
9
|
+
*
|
|
10
|
+
* Per spec §Component A:
|
|
11
|
+
* - Backed by SQLite (WAL mode, flock-coordinated for second-instar-on-host)
|
|
12
|
+
* - Per-spawn HMAC nonce generated here, never written to a path the
|
|
13
|
+
* spawned session can read after launch (handed to the session via FD-3
|
|
14
|
+
* by SpawnNonce.ts).
|
|
15
|
+
* - Per-peer rolling rate cap (1000 spawns / 24h) enforced on tryReserve
|
|
16
|
+
* - Global hard cap of 100k rows; prune by TTL (30d) via a background job.
|
|
17
|
+
*
|
|
18
|
+
* Authority classification (per docs/signal-vs-authority.md): structural
|
|
19
|
+
* idempotency-key dedup at the transport layer. Permitted authority — not
|
|
20
|
+
* a judgment call, mechanics.
|
|
21
|
+
*/
|
|
22
|
+
export type SpawnStatus = 'spawning' | 'verified' | 'failed' | 'completed';
|
|
23
|
+
export interface SpawnLedgerRow {
|
|
24
|
+
eventId: string;
|
|
25
|
+
peerId: string;
|
|
26
|
+
spawnNonce: Buffer;
|
|
27
|
+
spawnedAt: number;
|
|
28
|
+
status: SpawnStatus;
|
|
29
|
+
terminalAt: number | null;
|
|
30
|
+
failureReason: string | null;
|
|
31
|
+
}
|
|
32
|
+
export interface ReserveResult {
|
|
33
|
+
reserved: true;
|
|
34
|
+
spawnNonce: Buffer;
|
|
35
|
+
row: SpawnLedgerRow;
|
|
36
|
+
}
|
|
37
|
+
export interface ReserveCollision {
|
|
38
|
+
reserved: false;
|
|
39
|
+
reason: 'duplicate-event' | 'peer-rate-limit' | 'ledger-full';
|
|
40
|
+
existing?: SpawnLedgerRow;
|
|
41
|
+
}
|
|
42
|
+
export type ReserveOutcome = ReserveResult | ReserveCollision;
|
|
43
|
+
export interface SpawnLedgerOptions {
|
|
44
|
+
/** Maximum spawns per peer in the rolling window. Default 1000. */
|
|
45
|
+
perPeerCap?: number;
|
|
46
|
+
/** Rolling window in ms for the per-peer cap. Default 24h. */
|
|
47
|
+
perPeerWindowMs?: number;
|
|
48
|
+
/** Hard cap on total rows. Default 100_000. */
|
|
49
|
+
globalCap?: number;
|
|
50
|
+
}
|
|
51
|
+
export declare class SpawnLedger {
|
|
52
|
+
private db;
|
|
53
|
+
private opts;
|
|
54
|
+
constructor(dbPath: string, opts?: SpawnLedgerOptions);
|
|
55
|
+
private applySchema;
|
|
56
|
+
/**
|
|
57
|
+
* Atomically reserve a spawn slot for `eventId`. Returns the spawn nonce
|
|
58
|
+
* the caller must hand to the spawned session via FD-3, or a collision
|
|
59
|
+
* with the reason.
|
|
60
|
+
*
|
|
61
|
+
* This is the single point where a spawn is decided. If two relay
|
|
62
|
+
* threads race on the same eventId, exactly one tryReserve() returns
|
|
63
|
+
* {reserved: true}; the other gets {reserved: false, reason: 'duplicate-event'}.
|
|
64
|
+
*/
|
|
65
|
+
tryReserve(eventId: string, peerId: string, now?: number): ReserveOutcome;
|
|
66
|
+
/**
|
|
67
|
+
* Mark a reserved spawn as having moved to a terminal state. Verified =
|
|
68
|
+
* heartbeat HMAC validated. Failed = watchdog signal triggered. Completed
|
|
69
|
+
* = session exited cleanly.
|
|
70
|
+
*/
|
|
71
|
+
markStatus(eventId: string, status: Exclude<SpawnStatus, 'spawning'>, failureReason?: string | null, now?: number): boolean;
|
|
72
|
+
get(eventId: string): SpawnLedgerRow | null;
|
|
73
|
+
/**
|
|
74
|
+
* Verify a heartbeat HMAC against the stored spawn nonce.
|
|
75
|
+
* Returns true if valid; false if no row or mismatch.
|
|
76
|
+
*/
|
|
77
|
+
verifyHeartbeatHmac(eventId: string, payload: string, presentedHmac: string): boolean;
|
|
78
|
+
/**
|
|
79
|
+
* Prune rows older than `olderThanMs` AND in a terminal state.
|
|
80
|
+
* Spawning rows are NEVER pruned (they may still be in flight).
|
|
81
|
+
* Returns count of rows removed.
|
|
82
|
+
*/
|
|
83
|
+
pruneTerminal(olderThanMs: number, now?: number): number;
|
|
84
|
+
/**
|
|
85
|
+
* List ALL rows currently in 'spawning' state, regardless of age.
|
|
86
|
+
* Used by HeartbeatWatchdog which applies its own grace-window filter.
|
|
87
|
+
*/
|
|
88
|
+
listSpawning(): SpawnLedgerRow[];
|
|
89
|
+
/** Sweep stale 'spawning' rows (heartbeat never confirmed, no terminal mark). */
|
|
90
|
+
sweepStaleSpawning(staleAfterMs: number, now?: number): SpawnLedgerRow[];
|
|
91
|
+
count(): number;
|
|
92
|
+
close(): void;
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=SpawnLedger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SpawnLedger.d.ts","sourceRoot":"","sources":["../../src/threadline/SpawnLedger.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AASH,MAAM,MAAM,WAAW,GAAG,UAAU,GAAG,UAAU,GAAG,QAAQ,GAAG,WAAW,CAAC;AAE3E,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,WAAW,CAAC;IACpB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,IAAI,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,cAAc,CAAC;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,KAAK,CAAC;IAChB,MAAM,EAAE,iBAAiB,GAAG,iBAAiB,GAAG,aAAa,CAAC;IAC9D,QAAQ,CAAC,EAAE,cAAc,CAAC;CAC3B;AAED,MAAM,MAAM,cAAc,GAAG,aAAa,GAAG,gBAAgB,CAAC;AAE9D,MAAM,WAAW,kBAAkB;IACjC,mEAAmE;IACnE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,8DAA8D;IAC9D,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,+CAA+C;IAC/C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAUD,qBAAa,WAAW;IACtB,OAAO,CAAC,EAAE,CAAoB;IAC9B,OAAO,CAAC,IAAI,CAA+B;gBAE/B,MAAM,EAAE,MAAM,EAAE,IAAI,GAAE,kBAAuB;IAUzD,OAAO,CAAC,WAAW;IAkBnB;;;;;;;;OAQG;IACH,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,SAAa,GAAG,cAAc;IAmD7E;;;;OAIG;IACH,UAAU,CACR,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,OAAO,CAAC,WAAW,EAAE,UAAU,CAAC,EACxC,aAAa,GAAE,MAAM,GAAG,IAAW,EACnC,GAAG,SAAa,GACf,OAAO;IAUV,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI;IAO3C;;;OAGG;IACH,mBAAmB,CACjB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,aAAa,EAAE,MAAM,GACpB,OAAO;IAcV;;;;OAIG;IACH,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,SAAa,GAAG,MAAM;IAa5D;;;OAGG;IACH,YAAY,IAAI,cAAc,EAAE;IAMhC,iFAAiF;IACjF,kBAAkB,CAAC,YAAY,EAAE,MAAM,EAAE,GAAG,SAAa,GAAG,cAAc,EAAE;IAW5E,KAAK,IAAI,MAAM;IAIf,KAAK,IAAI,IAAI;CAQd"}
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SpawnLedger — SQLite-backed compare-and-swap ledger for relay-spawned sessions.
|
|
3
|
+
*
|
|
4
|
+
* Implements Component A of the Threadline Relay-Spawn Ghost-Reply
|
|
5
|
+
* Containment Spec. The ledger is the spawn-creation step itself, not a
|
|
6
|
+
* post-hoc check: tryReserve() atomically claims an eventId or returns null
|
|
7
|
+
* if another spawn already claimed it. This is the idempotency primitive
|
|
8
|
+
* that makes "Spawned session for X (twice)" structurally impossible.
|
|
9
|
+
*
|
|
10
|
+
* Per spec §Component A:
|
|
11
|
+
* - Backed by SQLite (WAL mode, flock-coordinated for second-instar-on-host)
|
|
12
|
+
* - Per-spawn HMAC nonce generated here, never written to a path the
|
|
13
|
+
* spawned session can read after launch (handed to the session via FD-3
|
|
14
|
+
* by SpawnNonce.ts).
|
|
15
|
+
* - Per-peer rolling rate cap (1000 spawns / 24h) enforced on tryReserve
|
|
16
|
+
* - Global hard cap of 100k rows; prune by TTL (30d) via a background job.
|
|
17
|
+
*
|
|
18
|
+
* Authority classification (per docs/signal-vs-authority.md): structural
|
|
19
|
+
* idempotency-key dedup at the transport layer. Permitted authority — not
|
|
20
|
+
* a judgment call, mechanics.
|
|
21
|
+
*/
|
|
22
|
+
import Database from 'better-sqlite3';
|
|
23
|
+
import crypto from 'node:crypto';
|
|
24
|
+
import path from 'node:path';
|
|
25
|
+
import fs from 'node:fs';
|
|
26
|
+
const DEFAULTS = {
|
|
27
|
+
perPeerCap: 1000,
|
|
28
|
+
perPeerWindowMs: 24 * 60 * 60 * 1000,
|
|
29
|
+
globalCap: 100_000,
|
|
30
|
+
};
|
|
31
|
+
// ── Implementation ───────────────────────────────────────────────────
|
|
32
|
+
export class SpawnLedger {
|
|
33
|
+
db;
|
|
34
|
+
opts;
|
|
35
|
+
constructor(dbPath, opts = {}) {
|
|
36
|
+
fs.mkdirSync(path.dirname(dbPath), { recursive: true });
|
|
37
|
+
this.db = new Database(dbPath);
|
|
38
|
+
this.db.pragma('journal_mode = WAL');
|
|
39
|
+
this.db.pragma('synchronous = NORMAL');
|
|
40
|
+
this.db.pragma('foreign_keys = ON');
|
|
41
|
+
this.opts = { ...DEFAULTS, ...opts };
|
|
42
|
+
this.applySchema();
|
|
43
|
+
}
|
|
44
|
+
applySchema() {
|
|
45
|
+
this.db.exec(`
|
|
46
|
+
CREATE TABLE IF NOT EXISTS spawn_ledger (
|
|
47
|
+
eventId TEXT PRIMARY KEY,
|
|
48
|
+
peerId TEXT NOT NULL,
|
|
49
|
+
spawnNonce BLOB NOT NULL,
|
|
50
|
+
spawnedAt INTEGER NOT NULL,
|
|
51
|
+
status TEXT NOT NULL CHECK (status IN ('spawning','verified','failed','completed')),
|
|
52
|
+
terminalAt INTEGER,
|
|
53
|
+
failureReason TEXT
|
|
54
|
+
);
|
|
55
|
+
CREATE INDEX IF NOT EXISTS idx_spawn_ledger_peer_time
|
|
56
|
+
ON spawn_ledger (peerId, spawnedAt);
|
|
57
|
+
CREATE INDEX IF NOT EXISTS idx_spawn_ledger_status_time
|
|
58
|
+
ON spawn_ledger (status, spawnedAt);
|
|
59
|
+
`);
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Atomically reserve a spawn slot for `eventId`. Returns the spawn nonce
|
|
63
|
+
* the caller must hand to the spawned session via FD-3, or a collision
|
|
64
|
+
* with the reason.
|
|
65
|
+
*
|
|
66
|
+
* This is the single point where a spawn is decided. If two relay
|
|
67
|
+
* threads race on the same eventId, exactly one tryReserve() returns
|
|
68
|
+
* {reserved: true}; the other gets {reserved: false, reason: 'duplicate-event'}.
|
|
69
|
+
*/
|
|
70
|
+
tryReserve(eventId, peerId, now = Date.now()) {
|
|
71
|
+
if (!eventId || !peerId) {
|
|
72
|
+
throw new Error('SpawnLedger.tryReserve requires eventId and peerId');
|
|
73
|
+
}
|
|
74
|
+
// Global cap check (cheap COUNT — index on status covers it).
|
|
75
|
+
const total = this.db
|
|
76
|
+
.prepare('SELECT COUNT(*) AS n FROM spawn_ledger')
|
|
77
|
+
.get();
|
|
78
|
+
if (total.n >= this.opts.globalCap) {
|
|
79
|
+
return { reserved: false, reason: 'ledger-full' };
|
|
80
|
+
}
|
|
81
|
+
// Per-peer rolling rate cap.
|
|
82
|
+
const windowStart = now - this.opts.perPeerWindowMs;
|
|
83
|
+
const peerRecent = this.db
|
|
84
|
+
.prepare('SELECT COUNT(*) AS n FROM spawn_ledger WHERE peerId = ? AND spawnedAt >= ?')
|
|
85
|
+
.get(peerId, windowStart);
|
|
86
|
+
if (peerRecent.n >= this.opts.perPeerCap) {
|
|
87
|
+
return { reserved: false, reason: 'peer-rate-limit' };
|
|
88
|
+
}
|
|
89
|
+
const spawnNonce = crypto.randomBytes(32);
|
|
90
|
+
const insert = this.db.prepare(`INSERT INTO spawn_ledger (eventId, peerId, spawnNonce, spawnedAt, status, terminalAt, failureReason)
|
|
91
|
+
VALUES (?, ?, ?, ?, 'spawning', NULL, NULL)`);
|
|
92
|
+
try {
|
|
93
|
+
insert.run(eventId, peerId, spawnNonce, now);
|
|
94
|
+
}
|
|
95
|
+
catch (err) {
|
|
96
|
+
// SQLite UNIQUE constraint on PRIMARY KEY → another spawn won the race.
|
|
97
|
+
if (err instanceof Error &&
|
|
98
|
+
/UNIQUE|PRIMARY KEY/.test(err.message)) {
|
|
99
|
+
const existing = this.get(eventId);
|
|
100
|
+
return {
|
|
101
|
+
reserved: false,
|
|
102
|
+
reason: 'duplicate-event',
|
|
103
|
+
existing: existing ?? undefined,
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
throw err;
|
|
107
|
+
}
|
|
108
|
+
const row = this.get(eventId);
|
|
109
|
+
return { reserved: true, spawnNonce, row };
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Mark a reserved spawn as having moved to a terminal state. Verified =
|
|
113
|
+
* heartbeat HMAC validated. Failed = watchdog signal triggered. Completed
|
|
114
|
+
* = session exited cleanly.
|
|
115
|
+
*/
|
|
116
|
+
markStatus(eventId, status, failureReason = null, now = Date.now()) {
|
|
117
|
+
const stmt = this.db.prepare(`UPDATE spawn_ledger
|
|
118
|
+
SET status = ?, terminalAt = ?, failureReason = ?
|
|
119
|
+
WHERE eventId = ? AND status != ?`);
|
|
120
|
+
const result = stmt.run(status, now, failureReason, eventId, status);
|
|
121
|
+
return result.changes > 0;
|
|
122
|
+
}
|
|
123
|
+
get(eventId) {
|
|
124
|
+
const row = this.db
|
|
125
|
+
.prepare('SELECT * FROM spawn_ledger WHERE eventId = ?')
|
|
126
|
+
.get(eventId);
|
|
127
|
+
return row ?? null;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Verify a heartbeat HMAC against the stored spawn nonce.
|
|
131
|
+
* Returns true if valid; false if no row or mismatch.
|
|
132
|
+
*/
|
|
133
|
+
verifyHeartbeatHmac(eventId, payload, presentedHmac) {
|
|
134
|
+
const row = this.get(eventId);
|
|
135
|
+
if (!row)
|
|
136
|
+
return false;
|
|
137
|
+
const expected = crypto
|
|
138
|
+
.createHmac('sha256', row.spawnNonce)
|
|
139
|
+
.update(payload)
|
|
140
|
+
.digest('hex');
|
|
141
|
+
// Constant-time compare to avoid timing side channel.
|
|
142
|
+
const a = Buffer.from(expected, 'hex');
|
|
143
|
+
const b = Buffer.from(presentedHmac, 'hex');
|
|
144
|
+
if (a.length !== b.length)
|
|
145
|
+
return false;
|
|
146
|
+
return crypto.timingSafeEqual(a, b);
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Prune rows older than `olderThanMs` AND in a terminal state.
|
|
150
|
+
* Spawning rows are NEVER pruned (they may still be in flight).
|
|
151
|
+
* Returns count of rows removed.
|
|
152
|
+
*/
|
|
153
|
+
pruneTerminal(olderThanMs, now = Date.now()) {
|
|
154
|
+
const cutoff = now - olderThanMs;
|
|
155
|
+
const result = this.db
|
|
156
|
+
.prepare(`DELETE FROM spawn_ledger
|
|
157
|
+
WHERE status != 'spawning'
|
|
158
|
+
AND terminalAt IS NOT NULL
|
|
159
|
+
AND terminalAt < ?`)
|
|
160
|
+
.run(cutoff);
|
|
161
|
+
return result.changes;
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* List ALL rows currently in 'spawning' state, regardless of age.
|
|
165
|
+
* Used by HeartbeatWatchdog which applies its own grace-window filter.
|
|
166
|
+
*/
|
|
167
|
+
listSpawning() {
|
|
168
|
+
return this.db
|
|
169
|
+
.prepare(`SELECT * FROM spawn_ledger WHERE status = 'spawning'`)
|
|
170
|
+
.all();
|
|
171
|
+
}
|
|
172
|
+
/** Sweep stale 'spawning' rows (heartbeat never confirmed, no terminal mark). */
|
|
173
|
+
sweepStaleSpawning(staleAfterMs, now = Date.now()) {
|
|
174
|
+
const cutoff = now - staleAfterMs;
|
|
175
|
+
const rows = this.db
|
|
176
|
+
.prepare(`SELECT * FROM spawn_ledger
|
|
177
|
+
WHERE status = 'spawning' AND spawnedAt < ?`)
|
|
178
|
+
.all(cutoff);
|
|
179
|
+
return rows;
|
|
180
|
+
}
|
|
181
|
+
count() {
|
|
182
|
+
return this.db.prepare('SELECT COUNT(*) AS n FROM spawn_ledger').get().n;
|
|
183
|
+
}
|
|
184
|
+
close() {
|
|
185
|
+
try {
|
|
186
|
+
this.db.pragma('wal_checkpoint(TRUNCATE)');
|
|
187
|
+
}
|
|
188
|
+
catch {
|
|
189
|
+
/* db may already be closed; safe to ignore */
|
|
190
|
+
}
|
|
191
|
+
this.db.close();
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
//# sourceMappingURL=SpawnLedger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SpawnLedger.js","sourceRoot":"","sources":["../../src/threadline/SpawnLedger.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SpawnNonce — relay-side helpers for binding a SpawnLedger reservation
|
|
3
|
+
* to a freshly-spawned session via FD 3 inheritance, and for deriving a
|
|
4
|
+
* deterministic eventId from envelope material.
|
|
5
|
+
*
|
|
6
|
+
* Component A glue for RELAY-SPAWN-GHOST-REPLY-CONTAINMENT-SPEC. The
|
|
7
|
+
* reader counterpart (`readSpawnNonceFromFd3`) lives in HeartbeatWriter
|
|
8
|
+
* since it runs in the spawned session, not the relay.
|
|
9
|
+
*
|
|
10
|
+
* Why FD 3 and not env: round-1 review surfaced that env vars propagate
|
|
11
|
+
* to every fork-helper a session may spawn (build tools, shells), giving
|
|
12
|
+
* those processes the nonce. FD 3 is single-read by the spawned process
|
|
13
|
+
* and is closed by the relay immediately after handoff.
|
|
14
|
+
*/
|
|
15
|
+
import type { SpawnOptions, StdioOptions } from 'node:child_process';
|
|
16
|
+
import type { MessageEnvelope } from '../messaging/types.js';
|
|
17
|
+
/**
|
|
18
|
+
* Deterministic eventId from envelope material. Bound to:
|
|
19
|
+
* - sender identity (signedBy or hmacBy on transport metadata)
|
|
20
|
+
* - the transport-layer nonce (already used for replay prevention)
|
|
21
|
+
* - the application-level message id
|
|
22
|
+
*
|
|
23
|
+
* Why this triple: any one alone is insufficient. The transport nonce is
|
|
24
|
+
* unique per delivery but not authenticated to a specific message body
|
|
25
|
+
* (a relay or attacker could re-route the same nonce with a different
|
|
26
|
+
* payload). Combining with the signed-by + message id binds the eventId
|
|
27
|
+
* to "this exact message from this exact sender via this exact relay
|
|
28
|
+
* delivery". Replays produce the same eventId → ledger CAS rejects.
|
|
29
|
+
*/
|
|
30
|
+
export declare function deriveEventId(envelope: MessageEnvelope): string;
|
|
31
|
+
export interface NonceFdHandle {
|
|
32
|
+
/** Read FD to be passed as stdio[3] to child_process.spawn(). */
|
|
33
|
+
readFd: number;
|
|
34
|
+
/** Call after spawn returns to release the relay-side handle. */
|
|
35
|
+
close: () => void;
|
|
36
|
+
}
|
|
37
|
+
export declare function prepareNonceFd(spawnNonce: Buffer): NonceFdHandle;
|
|
38
|
+
/**
|
|
39
|
+
* Build a stdio array suitable for child_process.spawn() that inherits
|
|
40
|
+
* stdin/stdout/stderr from the parent and binds FD 3 to the nonce read
|
|
41
|
+
* end. Caller owns calling handle.close() AFTER spawn returns.
|
|
42
|
+
*/
|
|
43
|
+
export declare function stdioWithNonceFd(handle: NonceFdHandle): StdioOptions;
|
|
44
|
+
/**
|
|
45
|
+
* Convenience: enrich a SpawnOptions with FD-3 nonce binding. Returns a
|
|
46
|
+
* new options object plus the handle to close after spawn.
|
|
47
|
+
*/
|
|
48
|
+
export declare function withNonceFd(baseOpts: SpawnOptions, handle: NonceFdHandle): SpawnOptions;
|
|
49
|
+
//# sourceMappingURL=SpawnNonce.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SpawnNonce.d.ts","sourceRoot":"","sources":["../../src/threadline/SpawnNonce.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAErE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAE7D;;;;;;;;;;;;GAYG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,eAAe,GAAG,MAAM,CAS/D;AAkBD,MAAM,WAAW,aAAa;IAC5B,iEAAiE;IACjE,MAAM,EAAE,MAAM,CAAC;IACf,iEAAiE;IACjE,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB;AAED,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,aAAa,CA4BhE;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,aAAa,GAAG,YAAY,CAEpE;AAED;;;GAGG;AACH,wBAAgB,WAAW,CACzB,QAAQ,EAAE,YAAY,EACtB,MAAM,EAAE,aAAa,GACpB,YAAY,CAKd"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SpawnNonce — relay-side helpers for binding a SpawnLedger reservation
|
|
3
|
+
* to a freshly-spawned session via FD 3 inheritance, and for deriving a
|
|
4
|
+
* deterministic eventId from envelope material.
|
|
5
|
+
*
|
|
6
|
+
* Component A glue for RELAY-SPAWN-GHOST-REPLY-CONTAINMENT-SPEC. The
|
|
7
|
+
* reader counterpart (`readSpawnNonceFromFd3`) lives in HeartbeatWriter
|
|
8
|
+
* since it runs in the spawned session, not the relay.
|
|
9
|
+
*
|
|
10
|
+
* Why FD 3 and not env: round-1 review surfaced that env vars propagate
|
|
11
|
+
* to every fork-helper a session may spawn (build tools, shells), giving
|
|
12
|
+
* those processes the nonce. FD 3 is single-read by the spawned process
|
|
13
|
+
* and is closed by the relay immediately after handoff.
|
|
14
|
+
*/
|
|
15
|
+
import crypto from 'node:crypto';
|
|
16
|
+
/**
|
|
17
|
+
* Deterministic eventId from envelope material. Bound to:
|
|
18
|
+
* - sender identity (signedBy or hmacBy on transport metadata)
|
|
19
|
+
* - the transport-layer nonce (already used for replay prevention)
|
|
20
|
+
* - the application-level message id
|
|
21
|
+
*
|
|
22
|
+
* Why this triple: any one alone is insufficient. The transport nonce is
|
|
23
|
+
* unique per delivery but not authenticated to a specific message body
|
|
24
|
+
* (a relay or attacker could re-route the same nonce with a different
|
|
25
|
+
* payload). Combining with the signed-by + message id binds the eventId
|
|
26
|
+
* to "this exact message from this exact sender via this exact relay
|
|
27
|
+
* delivery". Replays produce the same eventId → ledger CAS rejects.
|
|
28
|
+
*/
|
|
29
|
+
export function deriveEventId(envelope) {
|
|
30
|
+
const t = envelope.transport;
|
|
31
|
+
const signer = t.signedBy ?? t.hmacBy ?? '<unsigned>';
|
|
32
|
+
const nonce = t.nonce ?? '<no-nonce>';
|
|
33
|
+
const msgId = envelope.message?.id ?? '<no-msg-id>';
|
|
34
|
+
return crypto
|
|
35
|
+
.createHash('sha256')
|
|
36
|
+
.update(`${signer}\x00${nonce}\x00${msgId}`)
|
|
37
|
+
.digest('hex');
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Open a pipe, write the per-spawn nonce into it, return both ends so
|
|
41
|
+
* the caller can hand the read end to child_process.spawn() via FD 3
|
|
42
|
+
* and close the write end after spawn returns.
|
|
43
|
+
*
|
|
44
|
+
* Node's child_process does not expose POSIX pipe(2) directly, so we use
|
|
45
|
+
* a tmpfile + open-for-read pattern as a portable substitute. The file
|
|
46
|
+
* is unlinked immediately after open so even root cannot read it from
|
|
47
|
+
* disk after the spawn returns.
|
|
48
|
+
*/
|
|
49
|
+
import fs from 'node:fs';
|
|
50
|
+
import os from 'node:os';
|
|
51
|
+
import path from 'node:path';
|
|
52
|
+
import { SafeFsExecutor } from '../core/SafeFsExecutor.js';
|
|
53
|
+
export function prepareNonceFd(spawnNonce) {
|
|
54
|
+
if (spawnNonce.length !== 32) {
|
|
55
|
+
throw new Error('SpawnNonce.prepareNonceFd requires a 32-byte nonce');
|
|
56
|
+
}
|
|
57
|
+
// tmpfile in os.tmpdir(); 0o600; immediately unlinked after open.
|
|
58
|
+
const tmp = path.join(os.tmpdir(), `instar-spawn-nonce-${process.pid}-${crypto.randomBytes(6).toString('hex')}`);
|
|
59
|
+
fs.writeFileSync(tmp, spawnNonce, { mode: 0o600 });
|
|
60
|
+
const readFd = fs.openSync(tmp, 'r');
|
|
61
|
+
// Unlink immediately; the open FD keeps the inode alive only as long
|
|
62
|
+
// as one of the processes holds it.
|
|
63
|
+
try {
|
|
64
|
+
SafeFsExecutor.safeUnlinkSync(tmp, { operation: 'SpawnNonce.prepareNonceFd' });
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
/* best-effort */
|
|
68
|
+
}
|
|
69
|
+
return {
|
|
70
|
+
readFd,
|
|
71
|
+
close: () => {
|
|
72
|
+
try {
|
|
73
|
+
fs.closeSync(readFd);
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
/* already closed */
|
|
77
|
+
}
|
|
78
|
+
},
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Build a stdio array suitable for child_process.spawn() that inherits
|
|
83
|
+
* stdin/stdout/stderr from the parent and binds FD 3 to the nonce read
|
|
84
|
+
* end. Caller owns calling handle.close() AFTER spawn returns.
|
|
85
|
+
*/
|
|
86
|
+
export function stdioWithNonceFd(handle) {
|
|
87
|
+
return ['inherit', 'inherit', 'inherit', handle.readFd];
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Convenience: enrich a SpawnOptions with FD-3 nonce binding. Returns a
|
|
91
|
+
* new options object plus the handle to close after spawn.
|
|
92
|
+
*/
|
|
93
|
+
export function withNonceFd(baseOpts, handle) {
|
|
94
|
+
return {
|
|
95
|
+
...baseOpts,
|
|
96
|
+
stdio: stdioWithNonceFd(handle),
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=SpawnNonce.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SpawnNonce.js","sourceRoot":"","sources":["../../src/threadline/SpawnNonce.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,MAAM,MAAM,aAAa,CAAC;AAKjC;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,aAAa,CAAC,QAAyB;IACrD,MAAM,CAAC,GAAG,QAAQ,CAAC,SAAS,CAAC;IAC7B,MAAM,MAAM,GAAG,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,MAAM,IAAI,YAAY,CAAC;IACtD,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,IAAI,YAAY,CAAC;IACtC,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,EAAE,EAAE,IAAI,aAAa,CAAC;IACpD,OAAO,MAAM;SACV,UAAU,CAAC,QAAQ,CAAC;SACpB,MAAM,CAAC,GAAG,MAAM,OAAO,KAAK,OAAO,KAAK,EAAE,CAAC;SAC3C,MAAM,CAAC,KAAK,CAAC,CAAC;AACnB,CAAC;AAED;;;;;;;;;GASG;AACH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAS3D,MAAM,UAAU,cAAc,CAAC,UAAkB;IAC/C,IAAI,UAAU,CAAC,MAAM,KAAK,EAAE,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;IACxE,CAAC;IACD,kEAAkE;IAClE,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CACnB,EAAE,CAAC,MAAM,EAAE,EACX,sBAAsB,OAAO,CAAC,GAAG,IAAI,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAC7E,CAAC;IACF,EAAE,CAAC,aAAa,CAAC,GAAG,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACnD,MAAM,MAAM,GAAG,EAAE,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACrC,qEAAqE;IACrE,oCAAoC;IACpC,IAAI,CAAC;QACH,cAAc,CAAC,cAAc,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,2BAA2B,EAAE,CAAC,CAAC;IACjF,CAAC;IAAC,MAAM,CAAC;QACP,iBAAiB;IACnB,CAAC;IACD,OAAO;QACL,MAAM;QACN,KAAK,EAAE,GAAG,EAAE;YACV,IAAI,CAAC;gBACH,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;YACvB,CAAC;YAAC,MAAM,CAAC;gBACP,oBAAoB;YACtB,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAqB;IACpD,OAAO,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;AAC1D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CACzB,QAAsB,EACtB,MAAqB;IAErB,OAAO;QACL,GAAG,QAAQ;QACX,KAAK,EAAE,gBAAgB,CAAC,MAAM,CAAC;KAChC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TelegramBridge — mirrors threadline messages into per-thread Telegram topics.
|
|
3
|
+
*
|
|
4
|
+
* The bridge gives Justin visibility into agent-to-agent conversations:
|
|
5
|
+
* every inbound and outbound threadline message gets relayed into a
|
|
6
|
+
* dedicated Telegram topic so he can watch the exchange in real time.
|
|
7
|
+
*
|
|
8
|
+
* **Relay-only.** The bridge is a pure observer — it never blocks, gates,
|
|
9
|
+
* or vetoes a message. The blocking authority lives in TelegramBridgeConfig
|
|
10
|
+
* (the dashboard toggles + allow/deny list). The bridge simply asks the
|
|
11
|
+
* config "should I post?" and, if yes, posts.
|
|
12
|
+
*
|
|
13
|
+
* **No double-fire.** The bridge does NOT use the existing `telegram-reply`
|
|
14
|
+
* pipeline (which is for agent → user replies). It writes directly through
|
|
15
|
+
* the TelegramAdapter primitives `findOrCreateForumTopic` + `sendToTopic`,
|
|
16
|
+
* and persists thread → topic bindings in
|
|
17
|
+
* `.instar/threadline/telegram-bridge-bindings.json`.
|
|
18
|
+
*
|
|
19
|
+
* **Does NOT replace spawn-session.** The relay handler in server.ts still
|
|
20
|
+
* spawns Claude Code sessions for inbound messages. The bridge runs
|
|
21
|
+
* alongside that path; it's purely additive for user visibility.
|
|
22
|
+
*
|
|
23
|
+
* Topic naming: `{localAgent}↔{remoteAgentName} — {subject}` (truncated to
|
|
24
|
+
* Telegram's 128-char limit). Subject defaults to the first ~40 chars of
|
|
25
|
+
* the inbound message when no explicit subject is supplied.
|
|
26
|
+
*/
|
|
27
|
+
import type { TelegramBridgeConfig } from './TelegramBridgeConfig.js';
|
|
28
|
+
export declare const MAX_BRIDGE_MESSAGE_BODY = 3800;
|
|
29
|
+
export interface TelegramBridgeBinding {
|
|
30
|
+
threadId: string;
|
|
31
|
+
topicId: number;
|
|
32
|
+
remoteAgent: string;
|
|
33
|
+
topicName: string;
|
|
34
|
+
createdAt: string;
|
|
35
|
+
lastMessageAt: string;
|
|
36
|
+
}
|
|
37
|
+
export interface TelegramBridgeBindingsFile {
|
|
38
|
+
version: 1;
|
|
39
|
+
bindings: TelegramBridgeBinding[];
|
|
40
|
+
}
|
|
41
|
+
/** Subset of TelegramAdapter the bridge needs — keeps tests easy to mock. */
|
|
42
|
+
export interface TelegramSink {
|
|
43
|
+
findOrCreateForumTopic(name: string, iconColor?: number): Promise<{
|
|
44
|
+
topicId: number;
|
|
45
|
+
name: string;
|
|
46
|
+
reused: boolean;
|
|
47
|
+
}>;
|
|
48
|
+
sendToTopic(topicId: number, text: string, options?: {
|
|
49
|
+
silent?: boolean;
|
|
50
|
+
skipStallClear?: boolean;
|
|
51
|
+
}): Promise<{
|
|
52
|
+
ok: boolean;
|
|
53
|
+
messageId?: number;
|
|
54
|
+
reason?: string;
|
|
55
|
+
} | unknown>;
|
|
56
|
+
}
|
|
57
|
+
export interface BridgeInboundEvent {
|
|
58
|
+
threadId: string;
|
|
59
|
+
remoteAgent: string;
|
|
60
|
+
remoteAgentName?: string;
|
|
61
|
+
text: string;
|
|
62
|
+
subject?: string;
|
|
63
|
+
messageId?: string;
|
|
64
|
+
timestamp?: string;
|
|
65
|
+
}
|
|
66
|
+
export interface BridgeOutboundEvent {
|
|
67
|
+
threadId: string;
|
|
68
|
+
remoteAgent: string;
|
|
69
|
+
remoteAgentName?: string;
|
|
70
|
+
text: string;
|
|
71
|
+
messageId?: string;
|
|
72
|
+
timestamp?: string;
|
|
73
|
+
/** Optional preview of the agent reply being mirrored (e.g. truncated body). */
|
|
74
|
+
outcome?: string;
|
|
75
|
+
}
|
|
76
|
+
export interface TelegramBridgeOptions {
|
|
77
|
+
stateDir: string;
|
|
78
|
+
localAgentName: string;
|
|
79
|
+
config: TelegramBridgeConfig;
|
|
80
|
+
telegram: TelegramSink;
|
|
81
|
+
/** Optional override for the bindings filename (testing). */
|
|
82
|
+
bindingsFilename?: string;
|
|
83
|
+
/** Logger; defaults to console. */
|
|
84
|
+
log?: {
|
|
85
|
+
info: (msg: string) => void;
|
|
86
|
+
warn: (msg: string) => void;
|
|
87
|
+
error: (msg: string) => void;
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
export declare class TelegramBridge {
|
|
91
|
+
private readonly stateDir;
|
|
92
|
+
private readonly bindingsPath;
|
|
93
|
+
private readonly localAgentName;
|
|
94
|
+
private readonly cfg;
|
|
95
|
+
private readonly telegram;
|
|
96
|
+
private readonly log;
|
|
97
|
+
private bindings;
|
|
98
|
+
constructor(opts: TelegramBridgeOptions);
|
|
99
|
+
private loadBindings;
|
|
100
|
+
private persistBindings;
|
|
101
|
+
/** Public for inspection (dashboard, observability tab). */
|
|
102
|
+
getBindings(): TelegramBridgeBinding[];
|
|
103
|
+
/** Public for the observability tab to query a single binding. */
|
|
104
|
+
getBindingForThread(threadId: string): TelegramBridgeBinding | null;
|
|
105
|
+
/** Build the topic name for a thread — used at create time. Exposed for tests. */
|
|
106
|
+
buildTopicName(remoteAgentName: string, subject?: string): string;
|
|
107
|
+
/**
|
|
108
|
+
* Mirror an inbound threadline message into Telegram.
|
|
109
|
+
*
|
|
110
|
+
* Decision tree:
|
|
111
|
+
* 1. If the bridge config disallows mirroring AND no existing topic
|
|
112
|
+
* → no-op.
|
|
113
|
+
* 2. If a topic exists for this thread → post (subject to mirrorExisting).
|
|
114
|
+
* 3. Else (no existing topic) → check shouldAutoCreateTopic; if yes,
|
|
115
|
+
* create + post; else no-op.
|
|
116
|
+
*
|
|
117
|
+
* Failure-tolerant — never throws. Returns `{posted, topicId}` for
|
|
118
|
+
* observability.
|
|
119
|
+
*/
|
|
120
|
+
mirrorInbound(evt: BridgeInboundEvent): Promise<{
|
|
121
|
+
posted: boolean;
|
|
122
|
+
topicId?: number;
|
|
123
|
+
reason?: string;
|
|
124
|
+
}>;
|
|
125
|
+
/**
|
|
126
|
+
* Mirror an outbound threadline message (sent via threadline_send) into
|
|
127
|
+
* the corresponding Telegram topic. Outbound mirroring requires an
|
|
128
|
+
* existing binding — outbound traffic alone never auto-creates topics
|
|
129
|
+
* (the user opted in via inbound or by manual action).
|
|
130
|
+
*/
|
|
131
|
+
mirrorOutbound(evt: BridgeOutboundEvent): Promise<{
|
|
132
|
+
posted: boolean;
|
|
133
|
+
topicId?: number;
|
|
134
|
+
reason?: string;
|
|
135
|
+
}>;
|
|
136
|
+
private formatInboundBody;
|
|
137
|
+
private formatOutboundBody;
|
|
138
|
+
private postSafe;
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=TelegramBridge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TelegramBridge.d.ts","sourceRoot":"","sources":["../../src/threadline/TelegramBridge.ts"],"names":[],"mappings":"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"}
|