instar 1.3.1649 → 1.3.1650
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dashboard/console/accounts.js +2 -1
- package/dashboard/console/agents-model.js +3 -3
- package/dashboard/console/agents.js +7 -4
- package/dashboard/console/console.css +1 -0
- package/dashboard/console/console.js +35 -4
- package/dashboard/console/costs-model.js +12 -0
- package/dashboard/console/costs.js +6 -3
- package/dashboard/console/development-model.js +9 -3
- package/dashboard/console/development.js +7 -4
- package/dashboard/console/home-model.js +30 -14
- package/dashboard/console/mandates.js +3 -3
- package/dashboard/console/needs-model.js +105 -0
- package/dashboard/console/plans.js +2 -1
- package/dashboard/console/secrets.js +2 -2
- package/dashboard/console/ticket-model.js +36 -0
- package/dashboard/console/ui.js +3 -0
- package/dist/cli.js +8 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/install.d.ts +9 -7
- package/dist/commands/install.d.ts.map +1 -1
- package/dist/commands/install.js +2 -19
- package/dist/commands/install.js.map +1 -1
- package/dist/commands/reflect.d.ts.map +1 -1
- package/dist/commands/reflect.js +2 -0
- package/dist/commands/reflect.js.map +1 -1
- package/dist/commands/route.d.ts.map +1 -1
- package/dist/commands/route.js +2 -0
- package/dist/commands/route.js.map +1 -1
- package/dist/commands/server.d.ts.map +1 -1
- package/dist/commands/server.js +315 -14
- package/dist/commands/server.js.map +1 -1
- package/dist/commands/setClaudeKey.d.ts +8 -0
- package/dist/commands/setClaudeKey.d.ts.map +1 -0
- package/dist/commands/setClaudeKey.js +35 -0
- package/dist/commands/setClaudeKey.js.map +1 -0
- package/dist/core/AccountFollowMeOrchestrator.d.ts.map +1 -1
- package/dist/core/AccountFollowMeOrchestrator.js +4 -0
- package/dist/core/AccountFollowMeOrchestrator.js.map +1 -1
- package/dist/core/AppMediaStore.d.ts.map +1 -1
- package/dist/core/AppMediaStore.js +3 -0
- package/dist/core/AppMediaStore.js.map +1 -1
- package/dist/core/BackupManager.d.ts.map +1 -1
- package/dist/core/BackupManager.js +2 -0
- package/dist/core/BackupManager.js.map +1 -1
- package/dist/core/ClaudeCliIntelligenceProvider.d.ts.map +1 -1
- package/dist/core/ClaudeCliIntelligenceProvider.js +11 -3
- package/dist/core/ClaudeCliIntelligenceProvider.js.map +1 -1
- package/dist/core/ClaudeKeyHealth.d.ts +141 -0
- package/dist/core/ClaudeKeyHealth.d.ts.map +1 -0
- package/dist/core/ClaudeKeyHealth.js +467 -0
- package/dist/core/ClaudeKeyHealth.js.map +1 -0
- package/dist/core/CodexTaskContinuationStore.d.ts.map +1 -1
- package/dist/core/CodexTaskContinuationStore.js +7 -0
- package/dist/core/CodexTaskContinuationStore.js.map +1 -1
- package/dist/core/CoherenceJournal.d.ts +1 -1
- package/dist/core/CoherenceJournal.d.ts.map +1 -1
- package/dist/core/CoherenceJournal.js +11 -2
- package/dist/core/CoherenceJournal.js.map +1 -1
- package/dist/core/Config.d.ts +8 -0
- package/dist/core/Config.d.ts.map +1 -1
- package/dist/core/Config.js +26 -0
- package/dist/core/Config.js.map +1 -1
- package/dist/core/CredentialSwapExecutor.d.ts.map +1 -1
- package/dist/core/CredentialSwapExecutor.js +10 -0
- package/dist/core/CredentialSwapExecutor.js.map +1 -1
- package/dist/core/DecisionQualityRecorderImpl.d.ts.map +1 -1
- package/dist/core/DecisionQualityRecorderImpl.js +6 -0
- package/dist/core/DecisionQualityRecorderImpl.js.map +1 -1
- package/dist/core/DiscoveryEvaluator.d.ts.map +1 -1
- package/dist/core/DiscoveryEvaluator.js +4 -0
- package/dist/core/DiscoveryEvaluator.js.map +1 -1
- package/dist/core/IdentityReannounceClaimant.d.ts.map +1 -1
- package/dist/core/IdentityReannounceClaimant.js +4 -0
- package/dist/core/IdentityReannounceClaimant.js.map +1 -1
- package/dist/core/IntelligenceRouter.d.ts.map +1 -1
- package/dist/core/IntelligenceRouter.js +9 -0
- package/dist/core/IntelligenceRouter.js.map +1 -1
- package/dist/core/JournalSyncApplier.d.ts +1 -0
- package/dist/core/JournalSyncApplier.d.ts.map +1 -1
- package/dist/core/JournalSyncApplier.js +48 -0
- package/dist/core/JournalSyncApplier.js.map +1 -1
- package/dist/core/LeaseCoordinator.d.ts +4 -0
- package/dist/core/LeaseCoordinator.d.ts.map +1 -1
- package/dist/core/LeaseCoordinator.js +64 -1
- package/dist/core/LeaseCoordinator.js.map +1 -1
- package/dist/core/MessagingToneGate.d.ts +11 -7
- package/dist/core/MessagingToneGate.d.ts.map +1 -1
- package/dist/core/MessagingToneGate.js +15 -1
- package/dist/core/MessagingToneGate.js.map +1 -1
- package/dist/core/MobileDeviceKeys.d.ts +10 -0
- package/dist/core/MobileDeviceKeys.d.ts.map +1 -1
- package/dist/core/MobileDeviceKeys.js +17 -0
- package/dist/core/MobileDeviceKeys.js.map +1 -1
- package/dist/core/MultiMachineCoordinator.d.ts +12 -0
- package/dist/core/MultiMachineCoordinator.d.ts.map +1 -1
- package/dist/core/MultiMachineCoordinator.js +115 -3
- package/dist/core/MultiMachineCoordinator.js.map +1 -1
- package/dist/core/MutualSshRuntime.d.ts +1 -0
- package/dist/core/MutualSshRuntime.d.ts.map +1 -1
- package/dist/core/MutualSshRuntime.js +17 -1
- package/dist/core/MutualSshRuntime.js.map +1 -1
- package/dist/core/ObservedEndpointTracker.d.ts +1 -0
- package/dist/core/ObservedEndpointTracker.d.ts.map +1 -1
- package/dist/core/ObservedEndpointTracker.js +17 -0
- package/dist/core/ObservedEndpointTracker.js.map +1 -1
- package/dist/core/OverloadShedPlanner.d.ts.map +1 -1
- package/dist/core/OverloadShedPlanner.js +9 -0
- package/dist/core/OverloadShedPlanner.js.map +1 -1
- package/dist/core/OwnershipApplier.d.ts.map +1 -1
- package/dist/core/OwnershipApplier.js +7 -0
- package/dist/core/OwnershipApplier.js.map +1 -1
- package/dist/core/OwnershipReconciler.d.ts.map +1 -1
- package/dist/core/OwnershipReconciler.js +5 -0
- package/dist/core/OwnershipReconciler.js.map +1 -1
- package/dist/core/PostUpdateMigrator.d.ts +8 -0
- package/dist/core/PostUpdateMigrator.d.ts.map +1 -1
- package/dist/core/PostUpdateMigrator.js +76 -2
- package/dist/core/PostUpdateMigrator.js.map +1 -1
- package/dist/core/PrHandLease.d.ts.map +1 -1
- package/dist/core/PrHandLease.js +2 -0
- package/dist/core/PrHandLease.js.map +1 -1
- package/dist/core/ProactiveSwapMonitor.d.ts.map +1 -1
- package/dist/core/ProactiveSwapMonitor.js +7 -0
- package/dist/core/ProactiveSwapMonitor.js.map +1 -1
- package/dist/core/ProjectRoundExecution.d.ts.map +1 -1
- package/dist/core/ProjectRoundExecution.js +3 -2
- package/dist/core/ProjectRoundExecution.js.map +1 -1
- package/dist/core/QueueDrainLoop.d.ts +7 -0
- package/dist/core/QueueDrainLoop.d.ts.map +1 -1
- package/dist/core/QueueDrainLoop.js +37 -1
- package/dist/core/QueueDrainLoop.js.map +1 -1
- package/dist/core/RemoteAckStore.d.ts.map +1 -1
- package/dist/core/RemoteAckStore.js +4 -0
- package/dist/core/RemoteAckStore.js.map +1 -1
- package/dist/core/ReplicatedStoreReconcilerWiring.d.ts.map +1 -1
- package/dist/core/ReplicatedStoreReconcilerWiring.js +1 -0
- package/dist/core/ReplicatedStoreReconcilerWiring.js.map +1 -1
- package/dist/core/SecretSync.d.ts +1 -0
- package/dist/core/SecretSync.d.ts.map +1 -1
- package/dist/core/SecretSync.js +16 -0
- package/dist/core/SecretSync.js.map +1 -1
- package/dist/core/SessionManager.d.ts +11 -0
- package/dist/core/SessionManager.d.ts.map +1 -1
- package/dist/core/SessionManager.js +125 -14
- package/dist/core/SessionManager.js.map +1 -1
- package/dist/core/SessionPoolFailoverRunner.d.ts.map +1 -1
- package/dist/core/SessionPoolFailoverRunner.js +4 -0
- package/dist/core/SessionPoolFailoverRunner.js.map +1 -1
- package/dist/core/SleepWakeDetector.d.ts.map +1 -1
- package/dist/core/SleepWakeDetector.js +10 -0
- package/dist/core/SleepWakeDetector.js.map +1 -1
- package/dist/core/SubscriptionReloginStore.d.ts.map +1 -1
- package/dist/core/SubscriptionReloginStore.js +10 -1
- package/dist/core/SubscriptionReloginStore.js.map +1 -1
- package/dist/core/TopicPinMutation.d.ts.map +1 -1
- package/dist/core/TopicPinMutation.js +5 -0
- package/dist/core/TopicPinMutation.js.map +1 -1
- package/dist/core/UnjustifiedStopGate.d.ts.map +1 -1
- package/dist/core/UnjustifiedStopGate.js +22 -0
- package/dist/core/UnjustifiedStopGate.js.map +1 -1
- package/dist/core/WindowRunCadenceExecutor.d.ts.map +1 -1
- package/dist/core/WindowRunCadenceExecutor.js +20 -0
- package/dist/core/WindowRunCadenceExecutor.js.map +1 -1
- package/dist/core/claudeChildAuth.d.ts +68 -0
- package/dist/core/claudeChildAuth.d.ts.map +1 -0
- package/dist/core/claudeChildAuth.js +173 -0
- package/dist/core/claudeChildAuth.js.map +1 -0
- package/dist/core/claudeKeyProbe.d.ts +23 -0
- package/dist/core/claudeKeyProbe.d.ts.map +1 -0
- package/dist/core/claudeKeyProbe.js +68 -0
- package/dist/core/claudeKeyProbe.js.map +1 -0
- package/dist/core/codexDeviceLimitWiring.d.ts.map +1 -1
- package/dist/core/codexDeviceLimitWiring.js +12 -0
- package/dist/core/codexDeviceLimitWiring.js.map +1 -1
- package/dist/core/deliverToConversation.d.ts.map +1 -1
- package/dist/core/deliverToConversation.js +11 -0
- package/dist/core/deliverToConversation.js.map +1 -1
- package/dist/core/meteredCallEntry.d.ts.map +1 -1
- package/dist/core/meteredCallEntry.js +21 -0
- package/dist/core/meteredCallEntry.js.map +1 -1
- package/dist/core/nobodyPollingActuator.d.ts.map +1 -1
- package/dist/core/nobodyPollingActuator.js +5 -0
- package/dist/core/nobodyPollingActuator.js.map +1 -1
- package/dist/core/operatorSurfaceReferral.d.ts +18 -0
- package/dist/core/operatorSurfaceReferral.d.ts.map +1 -0
- package/dist/core/operatorSurfaceReferral.js +32 -0
- package/dist/core/operatorSurfaceReferral.js.map +1 -0
- package/dist/core/ownershipFollowsLiveWork.d.ts.map +1 -1
- package/dist/core/ownershipFollowsLiveWork.js +10 -1
- package/dist/core/ownershipFollowsLiveWork.js.map +1 -1
- package/dist/core/types.d.ts +15 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js.map +1 -1
- package/dist/core/worktreeDirtyCheck.d.ts.map +1 -1
- package/dist/core/worktreeDirtyCheck.js +2 -0
- package/dist/core/worktreeDirtyCheck.js.map +1 -1
- package/dist/data/stageBCertifiedSet.d.ts +9 -0
- package/dist/data/stageBCertifiedSet.d.ts.map +1 -1
- package/dist/data/stageBCertifiedSet.js +12 -0
- package/dist/data/stageBCertifiedSet.js.map +1 -1
- package/dist/data/standards-guard-index.json +1 -1
- package/dist/data/standards-guard-index.meta.json +2 -2
- package/dist/data/standards-registry.meta.json +1 -1
- package/dist/lifeline/TelegramLifeline.d.ts.map +1 -1
- package/dist/lifeline/TelegramLifeline.js +17 -3
- package/dist/lifeline/TelegramLifeline.js.map +1 -1
- package/dist/messaging/attentionHubPolicy.d.ts.map +1 -1
- package/dist/messaging/attentionHubPolicy.js +1 -0
- package/dist/messaging/attentionHubPolicy.js.map +1 -1
- package/dist/monitoring/AgentWorktreeReaper.d.ts.map +1 -1
- package/dist/monitoring/AgentWorktreeReaper.js +15 -0
- package/dist/monitoring/AgentWorktreeReaper.js.map +1 -1
- package/dist/monitoring/ApprenticeshipCycleSlaMonitor.d.ts.map +1 -1
- package/dist/monitoring/ApprenticeshipCycleSlaMonitor.js +18 -9
- package/dist/monitoring/ApprenticeshipCycleSlaMonitor.js.map +1 -1
- package/dist/monitoring/CodexArmSessionSweeper.d.ts.map +1 -1
- package/dist/monitoring/CodexArmSessionSweeper.js +11 -0
- package/dist/monitoring/CodexArmSessionSweeper.js.map +1 -1
- package/dist/monitoring/CrashLoopPauser.d.ts.map +1 -1
- package/dist/monitoring/CrashLoopPauser.js +8 -0
- package/dist/monitoring/CrashLoopPauser.js.map +1 -1
- package/dist/monitoring/DegradationReporter.d.ts.map +1 -1
- package/dist/monitoring/DegradationReporter.js +7 -1
- package/dist/monitoring/DegradationReporter.js.map +1 -1
- package/dist/monitoring/DegradedTmuxGuard.d.ts +2 -0
- package/dist/monitoring/DegradedTmuxGuard.d.ts.map +1 -1
- package/dist/monitoring/DegradedTmuxGuard.js +14 -0
- package/dist/monitoring/DegradedTmuxGuard.js.map +1 -1
- package/dist/monitoring/DurableOutputScrubber.d.ts.map +1 -1
- package/dist/monitoring/DurableOutputScrubber.js +7 -0
- package/dist/monitoring/DurableOutputScrubber.js.map +1 -1
- package/dist/monitoring/DurableVaultSession.d.ts.map +1 -1
- package/dist/monitoring/DurableVaultSession.js +15 -0
- package/dist/monitoring/DurableVaultSession.js.map +1 -1
- package/dist/monitoring/ExternalHogSentinel.d.ts +2 -0
- package/dist/monitoring/ExternalHogSentinel.d.ts.map +1 -1
- package/dist/monitoring/ExternalHogSentinel.js +27 -1
- package/dist/monitoring/ExternalHogSentinel.js.map +1 -1
- package/dist/monitoring/FailureLedger.d.ts.map +1 -1
- package/dist/monitoring/FailureLedger.js +38 -1
- package/dist/monitoring/FailureLedger.js.map +1 -1
- package/dist/monitoring/FeatureEvidenceLog.d.ts +5 -0
- package/dist/monitoring/FeatureEvidenceLog.d.ts.map +1 -1
- package/dist/monitoring/FeatureEvidenceLog.js +25 -0
- package/dist/monitoring/FeatureEvidenceLog.js.map +1 -1
- package/dist/monitoring/GeminiCapacityEscalationMonitor.d.ts.map +1 -1
- package/dist/monitoring/GeminiCapacityEscalationMonitor.js +20 -2
- package/dist/monitoring/GeminiCapacityEscalationMonitor.js.map +1 -1
- package/dist/monitoring/GeminiLoopRunner.d.ts.map +1 -1
- package/dist/monitoring/GeminiLoopRunner.js +11 -1
- package/dist/monitoring/GeminiLoopRunner.js.map +1 -1
- package/dist/monitoring/GreenPrAutoMerger.d.ts.map +1 -1
- package/dist/monitoring/GreenPrAutoMerger.js +11 -0
- package/dist/monitoring/GreenPrAutoMerger.js.map +1 -1
- package/dist/monitoring/GrowthDigestPublisher.d.ts.map +1 -1
- package/dist/monitoring/GrowthDigestPublisher.js +16 -0
- package/dist/monitoring/GrowthDigestPublisher.js.map +1 -1
- package/dist/monitoring/GrowthMilestoneAnalyst.d.ts +3 -0
- package/dist/monitoring/GrowthMilestoneAnalyst.d.ts.map +1 -1
- package/dist/monitoring/GrowthMilestoneAnalyst.js +45 -1
- package/dist/monitoring/GrowthMilestoneAnalyst.js.map +1 -1
- package/dist/monitoring/McpProcessReaper.d.ts +2 -0
- package/dist/monitoring/McpProcessReaper.d.ts.map +1 -1
- package/dist/monitoring/McpProcessReaper.js +32 -0
- package/dist/monitoring/McpProcessReaper.js.map +1 -1
- package/dist/monitoring/MissingLoginSessionDetector.d.ts +2 -1
- package/dist/monitoring/MissingLoginSessionDetector.d.ts.map +1 -1
- package/dist/monitoring/MissingLoginSessionDetector.js +23 -0
- package/dist/monitoring/MissingLoginSessionDetector.js.map +1 -1
- package/dist/monitoring/OrchestratorPoller.d.ts +1 -0
- package/dist/monitoring/OrchestratorPoller.d.ts.map +1 -1
- package/dist/monitoring/OrchestratorPoller.js +13 -0
- package/dist/monitoring/OrchestratorPoller.js.map +1 -1
- package/dist/monitoring/OrphanedWorkSentinel.d.ts.map +1 -1
- package/dist/monitoring/OrphanedWorkSentinel.js +7 -0
- package/dist/monitoring/OrphanedWorkSentinel.js.map +1 -1
- package/dist/monitoring/PresenceProxy.d.ts.map +1 -1
- package/dist/monitoring/PresenceProxy.js +9 -1
- package/dist/monitoring/PresenceProxy.js.map +1 -1
- package/dist/monitoring/ProcessFootprintMonitor.d.ts.map +1 -1
- package/dist/monitoring/ProcessFootprintMonitor.js +20 -2
- package/dist/monitoring/ProcessFootprintMonitor.js.map +1 -1
- package/dist/monitoring/PromiseBeacon.d.ts.map +1 -1
- package/dist/monitoring/PromiseBeacon.js +20 -0
- package/dist/monitoring/PromiseBeacon.js.map +1 -1
- package/dist/monitoring/ReleaseReadinessSentinel.d.ts +2 -0
- package/dist/monitoring/ReleaseReadinessSentinel.d.ts.map +1 -1
- package/dist/monitoring/ReleaseReadinessSentinel.js +26 -0
- package/dist/monitoring/ReleaseReadinessSentinel.js.map +1 -1
- package/dist/monitoring/RopeHealthMonitor.d.ts.map +1 -1
- package/dist/monitoring/RopeHealthMonitor.js +35 -1
- package/dist/monitoring/RopeHealthMonitor.js.map +1 -1
- package/dist/monitoring/SentinelNotifier.d.ts.map +1 -1
- package/dist/monitoring/SentinelNotifier.js +16 -0
- package/dist/monitoring/SentinelNotifier.js.map +1 -1
- package/dist/monitoring/SessionReaper.d.ts.map +1 -1
- package/dist/monitoring/SessionReaper.js +11 -2
- package/dist/monitoring/SessionReaper.js.map +1 -1
- package/dist/monitoring/SingleMachineFailoverGapDetector.d.ts +2 -0
- package/dist/monitoring/SingleMachineFailoverGapDetector.d.ts.map +1 -1
- package/dist/monitoring/SingleMachineFailoverGapDetector.js +20 -0
- package/dist/monitoring/SingleMachineFailoverGapDetector.js.map +1 -1
- package/dist/monitoring/SpeakerElection.d.ts.map +1 -1
- package/dist/monitoring/SpeakerElection.js +8 -0
- package/dist/monitoring/SpeakerElection.js.map +1 -1
- package/dist/monitoring/StrandedTopicSentinel.d.ts +3 -0
- package/dist/monitoring/StrandedTopicSentinel.d.ts.map +1 -1
- package/dist/monitoring/StrandedTopicSentinel.js +33 -0
- package/dist/monitoring/StrandedTopicSentinel.js.map +1 -1
- package/dist/native/InstarWedgeCanary.app/Contents/MacOS/InstarWedgeCanary +0 -0
- package/dist/native/instar-desktop-host +0 -0
- package/dist/providers/adapters/anthropic-headless/transport/oneShotCompletion.d.ts.map +1 -1
- package/dist/providers/adapters/anthropic-headless/transport/oneShotCompletion.js +5 -2
- package/dist/providers/adapters/anthropic-headless/transport/oneShotCompletion.js.map +1 -1
- package/dist/recommended/RecommendedServicesLedger.d.ts +91 -0
- package/dist/recommended/RecommendedServicesLedger.d.ts.map +1 -0
- package/dist/recommended/RecommendedServicesLedger.js +193 -0
- package/dist/recommended/RecommendedServicesLedger.js.map +1 -0
- package/dist/recommended/RecommendedServicesReplicatedStore.d.ts +14 -0
- package/dist/recommended/RecommendedServicesReplicatedStore.d.ts.map +1 -0
- package/dist/recommended/RecommendedServicesReplicatedStore.js +34 -0
- package/dist/recommended/RecommendedServicesReplicatedStore.js.map +1 -0
- package/dist/recommended/legacyDeclines.d.ts +11 -0
- package/dist/recommended/legacyDeclines.d.ts.map +1 -0
- package/dist/recommended/legacyDeclines.js +17 -0
- package/dist/recommended/legacyDeclines.js.map +1 -0
- package/dist/recommended/serviceIds.d.ts +3 -0
- package/dist/recommended/serviceIds.d.ts.map +1 -0
- package/dist/recommended/serviceIds.js +6 -0
- package/dist/recommended/serviceIds.js.map +1 -0
- package/dist/scaffold/templates.d.ts +2 -0
- package/dist/scaffold/templates.d.ts.map +1 -1
- package/dist/scaffold/templates.js +8 -0
- package/dist/scaffold/templates.js.map +1 -1
- package/dist/scheduler/JobResultTriage.d.ts.map +1 -1
- package/dist/scheduler/JobResultTriage.js +10 -0
- package/dist/scheduler/JobResultTriage.js.map +1 -1
- package/dist/scheduler/JobScheduler.d.ts.map +1 -1
- package/dist/scheduler/JobScheduler.js +12 -0
- package/dist/scheduler/JobScheduler.js.map +1 -1
- package/dist/scheduler/MentorOnboardingRunner.d.ts +3 -0
- package/dist/scheduler/MentorOnboardingRunner.d.ts.map +1 -1
- package/dist/scheduler/MentorOnboardingRunner.js +24 -2
- package/dist/scheduler/MentorOnboardingRunner.js.map +1 -1
- package/dist/server/AgentServer.d.ts +2 -0
- package/dist/server/AgentServer.d.ts.map +1 -1
- package/dist/server/AgentServer.js +76 -15
- package/dist/server/AgentServer.js.map +1 -1
- package/dist/server/BootHealthBeacon.d.ts +3 -0
- package/dist/server/BootHealthBeacon.d.ts.map +1 -1
- package/dist/server/BootHealthBeacon.js +9 -0
- package/dist/server/BootHealthBeacon.js.map +1 -1
- package/dist/server/CapabilityIndex.d.ts.map +1 -1
- package/dist/server/CapabilityIndex.js +10 -1
- package/dist/server/CapabilityIndex.js.map +1 -1
- package/dist/server/LifelineIngressGuard.d.ts.map +1 -1
- package/dist/server/LifelineIngressGuard.js +11 -0
- package/dist/server/LifelineIngressGuard.js.map +1 -1
- package/dist/server/PoolPollCache.d.ts +4 -0
- package/dist/server/PoolPollCache.d.ts.map +1 -1
- package/dist/server/PoolPollCache.js +33 -0
- package/dist/server/PoolPollCache.js.map +1 -1
- package/dist/server/machineRoutes.d.ts.map +1 -1
- package/dist/server/machineRoutes.js +6 -0
- package/dist/server/machineRoutes.js.map +1 -1
- package/dist/server/middleware.d.ts.map +1 -1
- package/dist/server/middleware.js +6 -0
- package/dist/server/middleware.js.map +1 -1
- package/dist/server/mobileConsoleTicket.d.ts +113 -0
- package/dist/server/mobileConsoleTicket.d.ts.map +1 -0
- package/dist/server/mobileConsoleTicket.js +405 -0
- package/dist/server/mobileConsoleTicket.js.map +1 -0
- package/dist/server/mobileConversationRoutes.d.ts.map +1 -1
- package/dist/server/mobileConversationRoutes.js +20 -1
- package/dist/server/mobileConversationRoutes.js.map +1 -1
- package/dist/server/mobileMediaRoutes.d.ts.map +1 -1
- package/dist/server/mobileMediaRoutes.js +3 -0
- package/dist/server/mobileMediaRoutes.js.map +1 -1
- package/dist/server/mobilePairingRoutes.d.ts +8 -2
- package/dist/server/mobilePairingRoutes.d.ts.map +1 -1
- package/dist/server/mobilePairingRoutes.js +67 -6
- package/dist/server/mobilePairingRoutes.js.map +1 -1
- package/dist/server/mobileSessionTerminalRoutes.d.ts +128 -0
- package/dist/server/mobileSessionTerminalRoutes.d.ts.map +1 -0
- package/dist/server/mobileSessionTerminalRoutes.js +389 -0
- package/dist/server/mobileSessionTerminalRoutes.js.map +1 -0
- package/dist/server/recommendedServiceRoutes.d.ts +13 -0
- package/dist/server/recommendedServiceRoutes.d.ts.map +1 -0
- package/dist/server/recommendedServiceRoutes.js +49 -0
- package/dist/server/recommendedServiceRoutes.js.map +1 -0
- package/dist/server/routes.d.ts +2 -0
- package/dist/server/routes.d.ts.map +1 -1
- package/dist/server/routes.js +170 -4
- package/dist/server/routes.js.map +1 -1
- package/dist/testing/selfActionRegistry.d.ts.map +1 -1
- package/dist/testing/selfActionRegistry.js +36 -0
- package/dist/testing/selfActionRegistry.js.map +1 -1
- package/dist/threadline/A2ACheckInProxy.d.ts.map +1 -1
- package/dist/threadline/A2ACheckInProxy.js +26 -15
- package/dist/threadline/A2ACheckInProxy.js.map +1 -1
- package/dist/threadline/AgentTrustManager.d.ts.map +1 -1
- package/dist/threadline/AgentTrustManager.js +3 -0
- package/dist/threadline/AgentTrustManager.js.map +1 -1
- package/dist/threadline/InboundIdLedger.d.ts.map +1 -1
- package/dist/threadline/InboundIdLedger.js +18 -1
- package/dist/threadline/InboundIdLedger.js.map +1 -1
- package/dist/threadline/NegotiatorGate.d.ts.map +1 -1
- package/dist/threadline/NegotiatorGate.js +11 -0
- package/dist/threadline/NegotiatorGate.js.map +1 -1
- package/dist/threadline/PipeSessionSpawner.d.ts.map +1 -1
- package/dist/threadline/PipeSessionSpawner.js +8 -0
- package/dist/threadline/PipeSessionSpawner.js.map +1 -1
- package/dist/threadline/ThreadlineRouter.d.ts.map +1 -1
- package/dist/threadline/ThreadlineRouter.js +13 -0
- package/dist/threadline/ThreadlineRouter.js.map +1 -1
- package/dist/threadline/pairingReplicationWiring.d.ts.map +1 -1
- package/dist/threadline/pairingReplicationWiring.js +9 -0
- package/dist/threadline/pairingReplicationWiring.js.map +1 -1
- package/dist/threadline/relayForward.d.ts.map +1 -1
- package/dist/threadline/relayForward.js +13 -2
- package/dist/threadline/relayForward.js.map +1 -1
- package/dist/threadline/relayUnknownSenderTrust.d.ts +0 -9
- package/dist/threadline/relayUnknownSenderTrust.d.ts.map +1 -1
- package/dist/threadline/relayUnknownSenderTrust.js +16 -0
- package/dist/threadline/relayUnknownSenderTrust.js.map +1 -1
- package/package.json +1 -1
- package/scripts/check-constitution-pairing.mjs +273 -0
- package/scripts/safe-merge.mjs +9 -0
- package/src/data/builtin-manifest.json +103 -103
- package/src/data/feature-ladders.json +113 -113
- package/src/data/stageBCertifiedSet.ts +12 -0
- package/src/data/standards-guard-index.json +1 -1
- package/src/data/standards-guard-index.meta.json +2 -2
- package/src/data/standards-registry.meta.json +1 -1
- package/src/data/state-coherence-registry.json +18 -0
- package/src/scaffold/templates.ts +9 -0
- package/upgrades/1.3.1650.md +105 -0
- package/upgrades/mobile-console-device-signin.eli16.md +5 -0
- package/upgrades/side-effects/cloud-key-internal-calls.md +116 -0
- package/upgrades/side-effects/constitution-alignment.eli16.md +11 -0
- package/upgrades/side-effects/constitution-alignment.md +69 -0
- package/upgrades/side-effects/feature-evidence-recording.eli16.md +3 -0
- package/upgrades/side-effects/feature-evidence-recording.md +66 -0
- package/upgrades/side-effects/feedback-reroute-admission-parity.md +77 -0
- package/upgrades/side-effects/mobile-console-device-signin.md +102 -0
- package/upgrades/side-effects/mobile-native-session-screen.md +88 -0
- package/upgrades/side-effects/operator-needs-first-screen.md +87 -0
- package/upgrades/side-effects/recommended-services-choices.md +50 -0
- package/upgrades/side-effects/rerouted-lifetime-active-process.md +63 -0
- package/upgrades/side-effects/undated-resurfacer-e2e-wait.eli16.md +5 -0
- package/upgrades/side-effects/undated-resurfacer-e2e-wait.md +9 -0
|
@@ -0,0 +1,405 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Console sign-in from an owner's paired phone (docs/specs/mobile-console-device-signin.md).
|
|
3
|
+
*
|
|
4
|
+
* The phone proves two things the server can check: it holds the paired device key (the device
|
|
5
|
+
* authenticator), and its owner has just authenticated on it (a second Secure Enclave key, the
|
|
6
|
+
* "presence key", that cannot sign without Face ID / Touch ID / the passcode). It then receives a
|
|
7
|
+
* one-minute, single-use ticket, which the console page redeems for exactly what the dashboard
|
|
8
|
+
* PIN unlock returns as its console credential: the API token. Never the operator session.
|
|
9
|
+
*
|
|
10
|
+
* Challenges and tickets live only in this process's memory, bound to the device and the Host
|
|
11
|
+
* the request was signed for (machine-local by design: spec, Multi-machine posture).
|
|
12
|
+
*/
|
|
13
|
+
import crypto from 'node:crypto';
|
|
14
|
+
import fs from 'node:fs';
|
|
15
|
+
import path from 'node:path';
|
|
16
|
+
import { deviceKeyHashOf } from '../core/AppRecordSignatures.js';
|
|
17
|
+
import { arrivedOverLocalTls } from '../core/desktopTransport.js';
|
|
18
|
+
import { normalizeRequestHost } from '../core/MobileOwnNames.js';
|
|
19
|
+
import { isStrictLowSDer, parseDevicePublicKey } from '../core/MobileDeviceKeys.js';
|
|
20
|
+
import { maybeRotateJsonl } from '../utils/jsonl-rotation.js';
|
|
21
|
+
export const CONSOLE_TICKET_TTL_MS = 60_000;
|
|
22
|
+
export const CONSOLE_TICKET_PER_DEVICE = 4;
|
|
23
|
+
export const CONSOLE_TICKET_TOTAL = 64;
|
|
24
|
+
export const CONSOLE_REDEEM_PATH = '/dashboard/console-ticket';
|
|
25
|
+
export const CONSOLE_TICKET_PATH = '/mobile/console-ticket';
|
|
26
|
+
export const CONSOLE_CHALLENGE_PATH = '/mobile/console-ticket/challenge';
|
|
27
|
+
export const PRESENCE_KEY_PATH = '/mobile/device/presence-key';
|
|
28
|
+
export const PRESENCE_MESSAGE_VERSION = 'instar-console-ticket-v1';
|
|
29
|
+
export const PRESENCE_ENROLL_VERSION = 'instar-presence-enroll-v1';
|
|
30
|
+
const REDEEM_PER_ADDRESS_PER_MIN = 10;
|
|
31
|
+
const REDEEM_TOTAL_PER_MIN = 120;
|
|
32
|
+
const AUDIT_MAX_BYTES = 1024 * 1024;
|
|
33
|
+
const SECRET_PATTERN = /^[A-Za-z0-9_-]{43}$/;
|
|
34
|
+
/** `mobilePairing.consoleTicket.enabled`: omitted ⇒ on wherever mobile pairing is on. Read live. */
|
|
35
|
+
export function isConsoleTicketEnabled(config) {
|
|
36
|
+
const mp = config.mobilePairing;
|
|
37
|
+
return mp?.consoleTicket?.enabled !== false;
|
|
38
|
+
}
|
|
39
|
+
const sha256 = (s) => crypto.createHash('sha256').update(s).digest('hex');
|
|
40
|
+
/** The exact bytes the presence key signs. */
|
|
41
|
+
export function presenceMessage(deviceId, host, challenge) {
|
|
42
|
+
return `${PRESENCE_MESSAGE_VERSION}\n${deviceId}\n${host.toLowerCase()}\n${challenge}`;
|
|
43
|
+
}
|
|
44
|
+
/** The bytes the presence key signs to prove possession at enrollment. */
|
|
45
|
+
export function presenceEnrollMessage(deviceId, host, publicKey) {
|
|
46
|
+
return `${PRESENCE_ENROLL_VERSION}\n${deviceId}\n${host.toLowerCase()}\n${publicKey}`;
|
|
47
|
+
}
|
|
48
|
+
/** The decoded bytes of a base64url public key, for comparing keys as keys rather than as text. */
|
|
49
|
+
export function samePublicKey(a, b) {
|
|
50
|
+
const x = Buffer.from(a, 'base64url'), y = Buffer.from(b, 'base64url');
|
|
51
|
+
return x.length === 65 && y.length === 65 && crypto.timingSafeEqual(x, y);
|
|
52
|
+
}
|
|
53
|
+
/** True when `sigB64` is a strict low-S DER ECDSA-P256-SHA256 signature by `publicKeyB64` over `message`. */
|
|
54
|
+
export function verifyPresenceSignature(publicKeyB64, message, sigB64) {
|
|
55
|
+
if (typeof sigB64 !== 'string' || sigB64.length > 128 || !/^[A-Za-z0-9_-]+$/.test(sigB64))
|
|
56
|
+
return false;
|
|
57
|
+
const key = parseDevicePublicKey(publicKeyB64);
|
|
58
|
+
if (!key)
|
|
59
|
+
return false;
|
|
60
|
+
const sig = Buffer.from(sigB64, 'base64url');
|
|
61
|
+
if (!isStrictLowSDer(sig))
|
|
62
|
+
return false;
|
|
63
|
+
try {
|
|
64
|
+
return crypto.verify('sha256', Buffer.from(message), { key, dsaEncoding: 'der' }, sig);
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
// @silent-fallback-ok — a malformed signature is simply invalid
|
|
68
|
+
return false;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Single-use secrets bound to a device and a Host: used for both challenges and tickets. Only
|
|
73
|
+
* the SHA-256 of each secret is kept. Consuming deletes the entry before it is judged.
|
|
74
|
+
*/
|
|
75
|
+
export class BoundSecretStore {
|
|
76
|
+
now;
|
|
77
|
+
ttlMs;
|
|
78
|
+
perDevice;
|
|
79
|
+
total;
|
|
80
|
+
entries = new Map();
|
|
81
|
+
constructor(now = Date.now, ttlMs = CONSOLE_TICKET_TTL_MS, perDevice = CONSOLE_TICKET_PER_DEVICE, total = CONSOLE_TICKET_TOTAL) {
|
|
82
|
+
this.now = now;
|
|
83
|
+
this.ttlMs = ttlMs;
|
|
84
|
+
this.perDevice = perDevice;
|
|
85
|
+
this.total = total;
|
|
86
|
+
}
|
|
87
|
+
issue(deviceId, host) {
|
|
88
|
+
this.prune();
|
|
89
|
+
const mine = [...this.entries.entries()].filter(([, e]) => e.deviceId === deviceId);
|
|
90
|
+
for (let i = 0; i <= mine.length - this.perDevice; i++)
|
|
91
|
+
this.entries.delete(mine[i][0]);
|
|
92
|
+
while (this.entries.size >= this.total) {
|
|
93
|
+
const oldest = this.entries.keys().next().value;
|
|
94
|
+
if (oldest === undefined)
|
|
95
|
+
break;
|
|
96
|
+
this.entries.delete(oldest);
|
|
97
|
+
}
|
|
98
|
+
const secret = crypto.randomBytes(32).toString('base64url');
|
|
99
|
+
const expiresAt = this.now() + this.ttlMs;
|
|
100
|
+
const digest = sha256(secret);
|
|
101
|
+
this.entries.set(digest, { deviceId, host: host.toLowerCase(), expiresAt });
|
|
102
|
+
return { secret, expiresAt, ref: digest.slice(0, 12) };
|
|
103
|
+
}
|
|
104
|
+
/** Deletes the secret first; returns its binding only when it was live. */
|
|
105
|
+
consume(secret) {
|
|
106
|
+
if (typeof secret !== 'string' || !SECRET_PATTERN.test(secret))
|
|
107
|
+
return null;
|
|
108
|
+
const digest = sha256(secret);
|
|
109
|
+
const e = this.entries.get(digest);
|
|
110
|
+
if (!e)
|
|
111
|
+
return null;
|
|
112
|
+
this.entries.delete(digest);
|
|
113
|
+
if (e.expiresAt <= this.now())
|
|
114
|
+
return null;
|
|
115
|
+
return { deviceId: e.deviceId, host: e.host, ref: digest.slice(0, 12) };
|
|
116
|
+
}
|
|
117
|
+
size() { this.prune(); return this.entries.size; }
|
|
118
|
+
prune() {
|
|
119
|
+
const t = this.now();
|
|
120
|
+
for (const [k, e] of this.entries)
|
|
121
|
+
if (e.expiresAt <= t)
|
|
122
|
+
this.entries.delete(k);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
/** Fixed-window throughput limit for the public redeem: a limit on calls, never a lockout on a ticket. */
|
|
126
|
+
export class RedeemLimiter {
|
|
127
|
+
now;
|
|
128
|
+
perAddressMax;
|
|
129
|
+
totalMax;
|
|
130
|
+
windowStart = 0;
|
|
131
|
+
total = 0;
|
|
132
|
+
perAddress = new Map();
|
|
133
|
+
constructor(now = Date.now, perAddressMax = REDEEM_PER_ADDRESS_PER_MIN, totalMax = REDEEM_TOTAL_PER_MIN) {
|
|
134
|
+
this.now = now;
|
|
135
|
+
this.perAddressMax = perAddressMax;
|
|
136
|
+
this.totalMax = totalMax;
|
|
137
|
+
}
|
|
138
|
+
admit(address) {
|
|
139
|
+
const t = this.now();
|
|
140
|
+
if (t - this.windowStart >= 60_000) {
|
|
141
|
+
this.windowStart = t;
|
|
142
|
+
this.total = 0;
|
|
143
|
+
this.perAddress.clear();
|
|
144
|
+
}
|
|
145
|
+
const n = this.perAddress.get(address) ?? 0;
|
|
146
|
+
if (n >= this.perAddressMax || this.total >= this.totalMax)
|
|
147
|
+
return false;
|
|
148
|
+
this.perAddress.set(address, n + 1);
|
|
149
|
+
this.total++;
|
|
150
|
+
return true;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* The audit trail: metadata only, never a secret. Rows involving a real ticket, challenge or
|
|
155
|
+
* device are written before the answer; refusals of unknown tickets and throttled calls from
|
|
156
|
+
* anonymous callers are counted and written as one `refused-unknown` row at most once a minute.
|
|
157
|
+
* A failed write is reported and never fails the request (a record, not a gate).
|
|
158
|
+
*/
|
|
159
|
+
export class ConsoleTicketAudit {
|
|
160
|
+
now;
|
|
161
|
+
report;
|
|
162
|
+
file;
|
|
163
|
+
pendingUnknown = 0;
|
|
164
|
+
lastFlush = 0;
|
|
165
|
+
constructor(stateDir, now = Date.now, report = () => { }) {
|
|
166
|
+
this.now = now;
|
|
167
|
+
this.report = report;
|
|
168
|
+
this.file = path.join(stateDir, 'state', 'mobile-console-tickets.jsonl');
|
|
169
|
+
}
|
|
170
|
+
record(row) {
|
|
171
|
+
this.flushUnknown(false);
|
|
172
|
+
this.append({ at: new Date(this.now()).toISOString(), ...row });
|
|
173
|
+
}
|
|
174
|
+
unknownRefusal() {
|
|
175
|
+
this.pendingUnknown++;
|
|
176
|
+
this.flushUnknown(false);
|
|
177
|
+
}
|
|
178
|
+
/** Writes the aggregated unknown-refusal count when a minute has passed (or when forced). */
|
|
179
|
+
flushUnknown(force) {
|
|
180
|
+
if (this.pendingUnknown === 0)
|
|
181
|
+
return;
|
|
182
|
+
const t = this.now();
|
|
183
|
+
if (!force && t - this.lastFlush < 60_000)
|
|
184
|
+
return;
|
|
185
|
+
const count = this.pendingUnknown;
|
|
186
|
+
this.pendingUnknown = 0;
|
|
187
|
+
this.lastFlush = t;
|
|
188
|
+
this.append({ at: new Date(t).toISOString(), event: 'refused-unknown', count });
|
|
189
|
+
}
|
|
190
|
+
append(row) {
|
|
191
|
+
try {
|
|
192
|
+
fs.mkdirSync(path.dirname(this.file), { recursive: true });
|
|
193
|
+
maybeRotateJsonl(this.file, { maxBytes: AUDIT_MAX_BYTES, keepRatio: 0.5 });
|
|
194
|
+
fs.appendFileSync(this.file, JSON.stringify(row) + '\n', { mode: 0o600 });
|
|
195
|
+
}
|
|
196
|
+
catch (err) {
|
|
197
|
+
// @silent-fallback-ok — reported through the injected DegradationReporter hook; the audit never gates
|
|
198
|
+
this.report(err);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
const states = new WeakMap();
|
|
203
|
+
/** The per-process console-ticket state of one pairing service. */
|
|
204
|
+
export function consoleState(svc, now = Date.now) {
|
|
205
|
+
let s = states.get(svc);
|
|
206
|
+
if (!s) {
|
|
207
|
+
s = {
|
|
208
|
+
challenges: new BoundSecretStore(now),
|
|
209
|
+
tickets: new BoundSecretStore(now),
|
|
210
|
+
audit: new ConsoleTicketAudit(svc.deps.stateDir, now, (err) => svc.deps.reportDegradation?.('MobileConsoleTicket.audit', err)),
|
|
211
|
+
limiter: new RedeemLimiter(now),
|
|
212
|
+
};
|
|
213
|
+
states.set(svc, s);
|
|
214
|
+
}
|
|
215
|
+
return s;
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Whether the device is, right now, an active owner phone: registry status, the device-key
|
|
219
|
+
* ledger, and the resolved person. Read from the same sources the device authenticator trusts.
|
|
220
|
+
*/
|
|
221
|
+
export function activeOwnerPhone(svc, deviceId) {
|
|
222
|
+
if (!svc.enabled())
|
|
223
|
+
return false;
|
|
224
|
+
const d = svc.devices.get(deviceId);
|
|
225
|
+
if (!d || d.status !== 'active' || !d.publicKey)
|
|
226
|
+
return false;
|
|
227
|
+
if (svc.keyLedger && svc.keyLedger.isRevoked(deviceKeyHashOf(d.publicKey), d.id))
|
|
228
|
+
return false;
|
|
229
|
+
const p = svc.personOfDevice(d);
|
|
230
|
+
return p.ok && p.role === 'owner';
|
|
231
|
+
}
|
|
232
|
+
function devicePrincipal(req) {
|
|
233
|
+
const p = req.instarPrincipal;
|
|
234
|
+
return p && p.kind === 'device' && typeof p.deviceId === 'string' ? { kind: 'device', deviceId: p.deviceId } : null;
|
|
235
|
+
}
|
|
236
|
+
/** One normalization for every Host this feature compares: the device authenticator's, else lowercase. */
|
|
237
|
+
export function normalHost(raw) {
|
|
238
|
+
if (typeof raw !== 'string')
|
|
239
|
+
return '';
|
|
240
|
+
return normalizeRequestHost(raw) ?? raw.trim().toLowerCase();
|
|
241
|
+
}
|
|
242
|
+
function signedHost(req, svc, deviceId) {
|
|
243
|
+
const h = req.instarDeviceHost;
|
|
244
|
+
return normalHost(typeof h === 'string' && h.length > 0 ? h : svc.devices.get(deviceId)?.host ?? '');
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* The three device-signed routes. Each: feature on, local TLS or loopback, a device principal
|
|
248
|
+
* whose person is the owner. Mounted on the authed mobile-pairing router.
|
|
249
|
+
*/
|
|
250
|
+
export function mountConsoleTicketDeviceRoutes(router, svc) {
|
|
251
|
+
const gate = (req, res) => {
|
|
252
|
+
res.setHeader('Cache-Control', 'no-store');
|
|
253
|
+
if (!svc.enabled() || !isConsoleTicketEnabled(svc.deps.config) || !svc.deps.config.authToken) {
|
|
254
|
+
res.status(503).json({ error: 'console-ticket-off', detail: 'Opening the console from the app without the PIN is turned off on this agent.' });
|
|
255
|
+
return null;
|
|
256
|
+
}
|
|
257
|
+
const p = devicePrincipal(req);
|
|
258
|
+
if (!p) {
|
|
259
|
+
res.status(403).json({ error: 'device-signature-required' });
|
|
260
|
+
return null;
|
|
261
|
+
}
|
|
262
|
+
if (!arrivedOverLocalTls(req.secure, req.socket.remoteAddress, req.headers['x-forwarded-proto'])) {
|
|
263
|
+
res.status(403).json({ error: 'secure-transport-required' });
|
|
264
|
+
return null;
|
|
265
|
+
}
|
|
266
|
+
if (!activeOwnerPhone(svc, p.deviceId)) {
|
|
267
|
+
res.status(403).json({ error: 'owner-phone-required' });
|
|
268
|
+
return null;
|
|
269
|
+
}
|
|
270
|
+
return p.deviceId;
|
|
271
|
+
};
|
|
272
|
+
const st = () => consoleState(svc);
|
|
273
|
+
router.post(PRESENCE_KEY_PATH, (req, res) => {
|
|
274
|
+
const deviceId = gate(req, res);
|
|
275
|
+
if (!deviceId)
|
|
276
|
+
return;
|
|
277
|
+
const body = (req.body ?? {});
|
|
278
|
+
const key = body.publicKey;
|
|
279
|
+
if (typeof key !== 'string' || key.length > 128 || !parseDevicePublicKey(key)) {
|
|
280
|
+
res.status(400).json({ error: 'bad-public-key' });
|
|
281
|
+
return;
|
|
282
|
+
}
|
|
283
|
+
const d = svc.devices.get(deviceId);
|
|
284
|
+
if (!d) {
|
|
285
|
+
res.status(403).json({ error: 'owner-phone-required' });
|
|
286
|
+
return;
|
|
287
|
+
}
|
|
288
|
+
if (d.publicKey && samePublicKey(key, d.publicKey)) {
|
|
289
|
+
res.status(400).json({ error: 'bad-public-key', detail: 'The presence key must differ from the device key.' });
|
|
290
|
+
return;
|
|
291
|
+
}
|
|
292
|
+
// Proof of possession: the key signs, so a wrong or broken key is refused now, not stored.
|
|
293
|
+
if (!verifyPresenceSignature(key, presenceEnrollMessage(deviceId, signedHost(req, svc, deviceId), key), body.proof)) {
|
|
294
|
+
st().audit.record({ event: 'refused', deviceId, reason: 'presence-proof-invalid' });
|
|
295
|
+
res.status(400).json({ error: 'presence-proof-invalid' });
|
|
296
|
+
return;
|
|
297
|
+
}
|
|
298
|
+
// Same key again (as decoded bytes) is idempotent: store the stored text form.
|
|
299
|
+
const stored = d.presenceKey && samePublicKey(key, d.presenceKey) ? d.presenceKey : key;
|
|
300
|
+
let r;
|
|
301
|
+
try {
|
|
302
|
+
r = svc.devices.setPresenceKey(deviceId, stored);
|
|
303
|
+
}
|
|
304
|
+
catch (err) {
|
|
305
|
+
svc.deps.reportDegradation?.('MobileConsoleTicket.presenceKey', err);
|
|
306
|
+
res.status(500).json({ error: 'Could not record the key. Try again.' });
|
|
307
|
+
return;
|
|
308
|
+
}
|
|
309
|
+
if (r === 'conflict') {
|
|
310
|
+
res.status(409).json({ error: 'presence-key-set', detail: 'This phone already has a sign-in key. Remove and pair the phone again to replace it.' });
|
|
311
|
+
return;
|
|
312
|
+
}
|
|
313
|
+
if (r === 'not-active') {
|
|
314
|
+
res.status(403).json({ error: 'owner-phone-required' });
|
|
315
|
+
return;
|
|
316
|
+
}
|
|
317
|
+
if (r === 'set')
|
|
318
|
+
st().audit.record({ event: 'presence-key-set', deviceId });
|
|
319
|
+
res.json({ ok: true });
|
|
320
|
+
});
|
|
321
|
+
router.post(CONSOLE_CHALLENGE_PATH, (req, res) => {
|
|
322
|
+
const deviceId = gate(req, res);
|
|
323
|
+
if (!deviceId)
|
|
324
|
+
return;
|
|
325
|
+
const c = st().challenges.issue(deviceId, signedHost(req, svc, deviceId));
|
|
326
|
+
res.json({ challenge: c.secret, expiresAt: new Date(c.expiresAt).toISOString() });
|
|
327
|
+
});
|
|
328
|
+
router.post(CONSOLE_TICKET_PATH, (req, res) => {
|
|
329
|
+
const deviceId = gate(req, res);
|
|
330
|
+
if (!deviceId)
|
|
331
|
+
return;
|
|
332
|
+
const body = (req.body ?? {});
|
|
333
|
+
const d = svc.devices.get(deviceId);
|
|
334
|
+
if (!d?.presenceKey) {
|
|
335
|
+
res.status(409).json({ error: 'presence-key-missing' });
|
|
336
|
+
return;
|
|
337
|
+
}
|
|
338
|
+
const host = signedHost(req, svc, deviceId);
|
|
339
|
+
const c = st().challenges.consume(body.challenge);
|
|
340
|
+
if (!c || c.deviceId !== deviceId || c.host !== host) {
|
|
341
|
+
st().audit.record({ event: 'refused', deviceId, reason: 'challenge-invalid' });
|
|
342
|
+
res.status(401).json({ error: 'challenge-invalid' });
|
|
343
|
+
return;
|
|
344
|
+
}
|
|
345
|
+
if (!verifyPresenceSignature(d.presenceKey, presenceMessage(deviceId, host, body.challenge), body.presenceSig)) {
|
|
346
|
+
st().audit.record({ event: 'refused', deviceId, reason: 'presence-invalid' });
|
|
347
|
+
res.status(401).json({ error: 'presence-invalid' });
|
|
348
|
+
return;
|
|
349
|
+
}
|
|
350
|
+
const t = st().tickets.issue(deviceId, host);
|
|
351
|
+
st().audit.record({ event: 'minted', deviceId, ticketRef: t.ref });
|
|
352
|
+
res.json({ ticket: t.secret, expiresAt: new Date(t.expiresAt).toISOString(), redeemOrigin: `https://${host}` });
|
|
353
|
+
});
|
|
354
|
+
}
|
|
355
|
+
/**
|
|
356
|
+
* The public redeem, registered before the bearer gate (and exempted in authMiddleware by exact
|
|
357
|
+
* method + path). Answers only `{ token }`.
|
|
358
|
+
*/
|
|
359
|
+
export function mountConsoleTicketRedeemRoute(app, svc, apiToken) {
|
|
360
|
+
app.post(CONSOLE_REDEEM_PATH, (req, res) => {
|
|
361
|
+
res.setHeader('Cache-Control', 'no-store');
|
|
362
|
+
const st = consoleState(svc);
|
|
363
|
+
if (!arrivedOverLocalTls(req.secure, req.socket.remoteAddress, req.headers['x-forwarded-proto'])) {
|
|
364
|
+
res.status(403).json({ error: 'secure-transport-required' });
|
|
365
|
+
return;
|
|
366
|
+
}
|
|
367
|
+
const token = apiToken();
|
|
368
|
+
if (!svc.enabled() || !isConsoleTicketEnabled(svc.deps.config) || !token) {
|
|
369
|
+
res.status(503).json({ error: 'console-ticket-off' });
|
|
370
|
+
return;
|
|
371
|
+
}
|
|
372
|
+
const raw = req.body?.ticket;
|
|
373
|
+
if (typeof raw !== 'string' || raw.length === 0 || raw.length > 128) {
|
|
374
|
+
res.status(400).json({ error: 'bad-ticket' });
|
|
375
|
+
return;
|
|
376
|
+
}
|
|
377
|
+
// A known ticket is always judged; only the unknown-ticket path is throttled, so an anonymous
|
|
378
|
+
// caller cannot crowd out the operator's real ticket.
|
|
379
|
+
const t = st.tickets.consume(raw);
|
|
380
|
+
if (!t) {
|
|
381
|
+
st.audit.unknownRefusal();
|
|
382
|
+
const address = req.ip || req.socket.remoteAddress || 'unknown';
|
|
383
|
+
if (!st.limiter.admit(address)) {
|
|
384
|
+
res.status(429).json({ error: 'too-many-requests' });
|
|
385
|
+
return;
|
|
386
|
+
}
|
|
387
|
+
res.status(401).json({ error: 'ticket-invalid' });
|
|
388
|
+
return;
|
|
389
|
+
}
|
|
390
|
+
const host = normalHost(req.headers.host);
|
|
391
|
+
if (host === '' || host !== normalHost(t.host)) {
|
|
392
|
+
st.audit.record({ event: 'refused', deviceId: t.deviceId, reason: 'host-mismatch', ticketRef: t.ref });
|
|
393
|
+
res.status(401).json({ error: 'ticket-invalid' });
|
|
394
|
+
return;
|
|
395
|
+
}
|
|
396
|
+
if (!activeOwnerPhone(svc, t.deviceId)) {
|
|
397
|
+
st.audit.record({ event: 'refused', deviceId: t.deviceId, reason: 'device-not-active', ticketRef: t.ref });
|
|
398
|
+
res.status(401).json({ error: 'device-not-active' });
|
|
399
|
+
return;
|
|
400
|
+
}
|
|
401
|
+
st.audit.record({ event: 'redeemed', deviceId: t.deviceId, ticketRef: t.ref });
|
|
402
|
+
res.json({ token });
|
|
403
|
+
});
|
|
404
|
+
}
|
|
405
|
+
//# sourceMappingURL=mobileConsoleTicket.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mobileConsoleTicket.js","sourceRoot":"","sources":["../../src/server/mobileConsoleTicket.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mobileConversationRoutes.d.ts","sourceRoot":"","sources":["../../src/server/mobileConversationRoutes.ts"],"names":[],"mappings":"AA4BA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,uCAAuC,CAAC;AACnF,OAAO,EAA4C,KAAK,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAE/G,OAAO,EAAE,MAAM,EAAE,KAAK,OAAO,EAAiB,MAAM,SAAS,CAAC;AAC9D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAErE,OAAO,EAAgD,KAAK,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC/G,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAC;AAMhF,OAAO,KAAK,EAAE,cAAc,EAAE,kBAAkB,EAAE,cAAc,EAAmC,MAAM,iCAAiC,CAAC;AAC3I,OAAO,EAA0D,KAAK,aAAa,EAAE,KAAK,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAChJ,OAAO,EAC6B,KAAK,aAAa,EACrD,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"mobileConversationRoutes.d.ts","sourceRoot":"","sources":["../../src/server/mobileConversationRoutes.ts"],"names":[],"mappings":"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"}
|
|
@@ -39,6 +39,7 @@ import { MAX_ATTACHMENTS, pushPreviewBody, } from '../core/appMediaTypes.js';
|
|
|
39
39
|
import { detectOutboundCredential } from '../messaging/outbound-credential-guard.js';
|
|
40
40
|
import { isExactStopMessage } from '../core/MessageSentinel.js';
|
|
41
41
|
import { cleanText } from '../core/MobilePairing.js';
|
|
42
|
+
import { featureEvidence } from '../monitoring/FeatureEvidenceLog.js';
|
|
42
43
|
import { isPeerUrlAllowedForCredentials } from './peerUrlGuard.js';
|
|
43
44
|
import { poolPeerFetch } from './poolPeerFetch.js';
|
|
44
45
|
import { deviceTextForRow } from '../core/appPlatformMedia.js';
|
|
@@ -553,6 +554,7 @@ export function createMobileConversationRouter(deps) {
|
|
|
553
554
|
// Step 2 — look up. Step 7 — a done/unknown request answers from the CURRENT delivery state.
|
|
554
555
|
const prior = requests.lookup(deviceId, requestId, hash);
|
|
555
556
|
if (prior.kind === 'done' || prior.kind === 'outcome-unknown') {
|
|
557
|
+
featureEvidence.record('mobilePairing.native', { kind: 'held', reason: `duplicate send answered from record: ${prior.kind}`, context: { messageId, deviceId, priorKind: prior.kind } });
|
|
556
558
|
const state = s.store.deliveryState(messageId);
|
|
557
559
|
if (state === 'delivered' || state === 'refused' || state === 'intercepted') {
|
|
558
560
|
const recorded = prior.kind === 'done' ? prior.body : {};
|
|
@@ -630,6 +632,7 @@ export function createMobileConversationRouter(deps) {
|
|
|
630
632
|
r = requests.reserve(deviceId, requestId, hash, 0, { op: 'send', conversationKey: key, messageId });
|
|
631
633
|
}
|
|
632
634
|
catch {
|
|
635
|
+
featureEvidence.record('mobilePairing.native', { kind: 'error', reason: 'loss: request could not be recorded', context: { messageId, deviceId } });
|
|
633
636
|
res.status(503).json({ error: 'chat-unavailable', detail: 'The message could not be recorded, so it was not sent. Try again.' });
|
|
634
637
|
return;
|
|
635
638
|
}
|
|
@@ -645,6 +648,7 @@ export function createMobileConversationRouter(deps) {
|
|
|
645
648
|
if (msg.kind === 'media-message') {
|
|
646
649
|
const refused = await claimMediaUploads(s, uploadIds, messageId, (detail) => s.deps.reportDegradation?.('AppMedia.publish', detail));
|
|
647
650
|
if (refused) {
|
|
651
|
+
featureEvidence.record('mobilePairing.native.media', { kind: 'error', reason: 'files could not be claimed for the message', context: { messageId, files: uploadIds.length, status: refused.status } });
|
|
648
652
|
requests.release(deviceId, requestId);
|
|
649
653
|
res.status(refused.status).json(refused.body);
|
|
650
654
|
return;
|
|
@@ -661,9 +665,15 @@ export function createMobileConversationRouter(deps) {
|
|
|
661
665
|
catch (err) {
|
|
662
666
|
requests.release(deviceId, requestId);
|
|
663
667
|
s.deps.reportDegradation?.('AppConversations.persist', err instanceof Error ? err.message : String(err));
|
|
668
|
+
featureEvidence.record('mobilePairing.native', { kind: 'error', reason: 'loss: message could not be saved', context: { messageId, deviceId, files: stored.length } });
|
|
669
|
+
if (stored.length > 0)
|
|
670
|
+
featureEvidence.record('mobilePairing.native.media', { kind: 'error', reason: 'files not published: message could not be saved', context: { messageId, files: stored.length } });
|
|
664
671
|
res.status(503).json({ error: 'chat-unavailable', detail: 'The message could not be saved, so it was not sent. Try again.' });
|
|
665
672
|
return;
|
|
666
673
|
}
|
|
674
|
+
for (const a of stored) {
|
|
675
|
+
featureEvidence.record('mobilePairing.native.media', { kind: 'fired', reason: 'file sent', context: { messageId, index: a.index, fileKind: a.kind, declaredKind: a.declaredKind, size: a.size, files: stored.length } });
|
|
676
|
+
}
|
|
667
677
|
const reclassified = stored.filter((a) => a.kind !== a.declaredKind).map((a) => a.index);
|
|
668
678
|
const extras = {
|
|
669
679
|
...(removedKinds.size > 0 ? { redacted: true, removed: [...removedKinds] } : {}),
|
|
@@ -678,12 +688,14 @@ export function createMobileConversationRouter(deps) {
|
|
|
678
688
|
if (exactStop) {
|
|
679
689
|
const stop = s.emergencyStop(key);
|
|
680
690
|
s.appendDelivery(key, messageId, 'intercepted', seed);
|
|
691
|
+
featureEvidence.record('mobilePairing.native', { kind: 'held', reason: 'intercepted: exact emergency stop', context: { messageId, deviceId, stopped: typeof stop.stopped === 'number' ? stop.stopped : null } });
|
|
681
692
|
finish(200, { ok: true, outcome: 'sentinel-kill', stopped: stop.stopped, conversationKey: key, eventId, messageId, deliveryState: 'intercepted', ...extras });
|
|
682
693
|
return;
|
|
683
694
|
}
|
|
684
695
|
// Step 5 — ownership (pool dark: the serving-lease holder), the pause intercept, dispatch.
|
|
685
696
|
const alias = s.deps.registry.appAliasFor(key) ?? (() => { const m = s.deps.registry.mintAppAlias(key); return m.ok ? m.id : null; })();
|
|
686
697
|
if (alias === null || !s.isOwner()) {
|
|
698
|
+
featureEvidence.record('mobilePairing.native', { kind: 'error', reason: 'saved, not delivered: owner unavailable', context: { messageId, deviceId, aliasMinted: alias !== null } });
|
|
687
699
|
finish(503, { error: 'owner-unavailable', detail: 'Your message is saved, but the machine that runs this conversation is not available right now. Try again shortly.', conversationKey: key, eventId, messageId, ...extras });
|
|
688
700
|
return;
|
|
689
701
|
}
|
|
@@ -695,6 +707,7 @@ export function createMobileConversationRouter(deps) {
|
|
|
695
707
|
// The message is already saved; a failed binding write must not leave the request hanging.
|
|
696
708
|
requests.markUnknown(deviceId, requestId);
|
|
697
709
|
s.deps.reportDegradation?.('AppConversations.bind', err instanceof Error ? err.message : String(err));
|
|
710
|
+
featureEvidence.record('mobilePairing.native', { kind: 'error', reason: 'outcome unknown: binding write failed', context: { messageId, deviceId, alias } });
|
|
698
711
|
res.status(409).json({ error: 'outcome-unknown', eventId, messageId, detail: 'This message is saved but may not have reached the agent. Check the conversation.' });
|
|
699
712
|
return;
|
|
700
713
|
}
|
|
@@ -704,6 +717,7 @@ export function createMobileConversationRouter(deps) {
|
|
|
704
717
|
if (d.disposition === 'kill' || d.disposition === 'pause') {
|
|
705
718
|
const out = d.disposition === 'kill' ? { outcome: 'sentinel-kill', stopped: s.emergencyStop(key).stopped } : { outcome: 'sentinel-pause', paused: s.pause(key) };
|
|
706
719
|
s.appendDelivery(key, messageId, 'intercepted', seed);
|
|
720
|
+
featureEvidence.record('mobilePairing.native', { kind: 'held', reason: `intercepted: sentinel ${d.disposition}`, context: { messageId, deviceId, disposition: d.disposition } });
|
|
707
721
|
finish(200, { ok: true, ...out, conversationKey: key, eventId, messageId, deliveryState: 'intercepted', ...extras });
|
|
708
722
|
return;
|
|
709
723
|
}
|
|
@@ -714,6 +728,7 @@ export function createMobileConversationRouter(deps) {
|
|
|
714
728
|
if (!dispatch) {
|
|
715
729
|
// Nothing was dispatched: an honest refusal, not an unknown outcome.
|
|
716
730
|
s.appendDelivery(key, messageId, 'refused', seed);
|
|
731
|
+
featureEvidence.record('mobilePairing.native', { kind: 'error', reason: 'saved, not delivered: no dispatcher on this machine', context: { messageId, deviceId } });
|
|
717
732
|
finish(503, { error: 'chat-unavailable', detail: 'Your message is saved, but this machine cannot start a session for it right now.', conversationKey: key, eventId, messageId, deliveryState: 'refused', ...extras });
|
|
718
733
|
return;
|
|
719
734
|
}
|
|
@@ -727,8 +742,10 @@ export function createMobileConversationRouter(deps) {
|
|
|
727
742
|
}
|
|
728
743
|
const pending = s.pendingContext(key);
|
|
729
744
|
let outcome;
|
|
745
|
+
let originVerdict = 'unknown';
|
|
730
746
|
try {
|
|
731
|
-
|
|
747
|
+
originVerdict = s.verify(msg);
|
|
748
|
+
outcome = await dispatch({ conversationKey: key, alias, title: conv.title ?? 'Untitled', text: sessionText, messageId, ownerName: sender?.name ?? s.ownerName(), originVerdict, ...(pending.lines.length > 0 ? { notes: pending.lines } : {}) });
|
|
732
749
|
if (outcome === 'delivered')
|
|
733
750
|
pending.ack();
|
|
734
751
|
}
|
|
@@ -739,10 +756,12 @@ export function createMobileConversationRouter(deps) {
|
|
|
739
756
|
catch { /* @silent-fallback-ok — the request itself is recorded outcome-unknown below */ }
|
|
740
757
|
requests.markUnknown(deviceId, requestId);
|
|
741
758
|
s.deps.reportDegradation?.('AppConversations.dispatch', err instanceof Error ? err.message : String(err));
|
|
759
|
+
featureEvidence.record('mobilePairing.native', { kind: 'error', reason: 'outcome unknown: dispatch threw', context: { messageId, deviceId, originVerdict, files: stored.length } });
|
|
742
760
|
res.status(409).json({ error: 'outcome-unknown', eventId, messageId, detail: 'This message may or may not have reached the agent. Check the conversation.' });
|
|
743
761
|
return;
|
|
744
762
|
}
|
|
745
763
|
s.appendDelivery(key, messageId, outcome, seed);
|
|
764
|
+
featureEvidence.record('mobilePairing.native', { kind: outcome === 'delivered' && originVerdict !== 'failed' ? 'fired' : 'error', reason: originVerdict === 'failed' ? `failed verdict on a message: ${outcome}` : `message ${outcome}`, context: { messageId, deviceId, outcome, originVerdict, files: stored.length, redacted: removedKinds.size > 0, senderRole: sender?.role ?? null } });
|
|
746
765
|
finish(200, { ok: true, outcome, conversationKey: key, eventId, messageId, deliveryState: outcome, ...extras });
|
|
747
766
|
});
|
|
748
767
|
// ── Browse ──
|