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.
Files changed (448) hide show
  1. package/dashboard/index.html +486 -0
  2. package/dist/cli.js +5 -8
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/discovery.d.ts.map +1 -1
  5. package/dist/commands/discovery.js +2 -2
  6. package/dist/commands/discovery.js.map +1 -1
  7. package/dist/commands/init.d.ts.map +1 -1
  8. package/dist/commands/init.js +22 -4
  9. package/dist/commands/init.js.map +1 -1
  10. package/dist/commands/job.d.ts.map +1 -1
  11. package/dist/commands/job.js +2 -2
  12. package/dist/commands/job.js.map +1 -1
  13. package/dist/commands/ledgerCleanup.d.ts.map +1 -1
  14. package/dist/commands/ledgerCleanup.js +2 -2
  15. package/dist/commands/ledgerCleanup.js.map +1 -1
  16. package/dist/commands/listener.d.ts.map +1 -1
  17. package/dist/commands/listener.js +7 -12
  18. package/dist/commands/listener.js.map +1 -1
  19. package/dist/commands/nuke.d.ts.map +1 -1
  20. package/dist/commands/nuke.js +11 -21
  21. package/dist/commands/nuke.js.map +1 -1
  22. package/dist/commands/server.d.ts.map +1 -1
  23. package/dist/commands/server.js +79 -5
  24. package/dist/commands/server.js.map +1 -1
  25. package/dist/commands/setup.d.ts.map +1 -1
  26. package/dist/commands/setup.js +11 -15
  27. package/dist/commands/setup.js.map +1 -1
  28. package/dist/commands/slack-cli.d.ts.map +1 -1
  29. package/dist/commands/slack-cli.js +5 -8
  30. package/dist/commands/slack-cli.js.map +1 -1
  31. package/dist/commands/whatsapp.d.ts.map +1 -1
  32. package/dist/commands/whatsapp.js +2 -2
  33. package/dist/commands/whatsapp.js.map +1 -1
  34. package/dist/commands/worktree.d.ts.map +1 -1
  35. package/dist/commands/worktree.js +2 -2
  36. package/dist/commands/worktree.js.map +1 -1
  37. package/dist/core/AgentConnector.d.ts.map +1 -1
  38. package/dist/core/AgentConnector.js +9 -10
  39. package/dist/core/AgentConnector.js.map +1 -1
  40. package/dist/core/AgentRegistry.d.ts.map +1 -1
  41. package/dist/core/AgentRegistry.js +3 -4
  42. package/dist/core/AgentRegistry.js.map +1 -1
  43. package/dist/core/AutoDispatcher.d.ts.map +1 -1
  44. package/dist/core/AutoDispatcher.js +2 -2
  45. package/dist/core/AutoDispatcher.js.map +1 -1
  46. package/dist/core/AutoUpdater.d.ts.map +1 -1
  47. package/dist/core/AutoUpdater.js +2 -2
  48. package/dist/core/AutoUpdater.js.map +1 -1
  49. package/dist/core/AutonomousEvolution.d.ts.map +1 -1
  50. package/dist/core/AutonomousEvolution.js +2 -2
  51. package/dist/core/AutonomousEvolution.js.map +1 -1
  52. package/dist/core/BackupManager.d.ts.map +1 -1
  53. package/dist/core/BackupManager.js +2 -2
  54. package/dist/core/BackupManager.js.map +1 -1
  55. package/dist/core/BranchManager.d.ts.map +1 -1
  56. package/dist/core/BranchManager.js +3 -3
  57. package/dist/core/BranchManager.js.map +1 -1
  58. package/dist/core/CaffeinateManager.d.ts.map +1 -1
  59. package/dist/core/CaffeinateManager.js +2 -2
  60. package/dist/core/CaffeinateManager.js.map +1 -1
  61. package/dist/core/DeferredDispatchTracker.d.ts.map +1 -1
  62. package/dist/core/DeferredDispatchTracker.js +2 -2
  63. package/dist/core/DeferredDispatchTracker.js.map +1 -1
  64. package/dist/core/DispatchManager.d.ts.map +1 -1
  65. package/dist/core/DispatchManager.js +3 -4
  66. package/dist/core/DispatchManager.js.map +1 -1
  67. package/dist/core/EvolutionManager.d.ts.map +1 -1
  68. package/dist/core/EvolutionManager.js +2 -2
  69. package/dist/core/EvolutionManager.js.map +1 -1
  70. package/dist/core/ExecutionJournal.d.ts.map +1 -1
  71. package/dist/core/ExecutionJournal.js +2 -2
  72. package/dist/core/ExecutionJournal.js.map +1 -1
  73. package/dist/core/FeedbackManager.d.ts.map +1 -1
  74. package/dist/core/FeedbackManager.js +2 -2
  75. package/dist/core/FeedbackManager.js.map +1 -1
  76. package/dist/core/FileClassifier.d.ts.map +1 -1
  77. package/dist/core/FileClassifier.js +8 -17
  78. package/dist/core/FileClassifier.js.map +1 -1
  79. package/dist/core/ForegroundRestartWatcher.d.ts.map +1 -1
  80. package/dist/core/ForegroundRestartWatcher.js +3 -4
  81. package/dist/core/ForegroundRestartWatcher.js.map +1 -1
  82. package/dist/core/GitStateManager.d.ts.map +1 -1
  83. package/dist/core/GitStateManager.js +3 -12
  84. package/dist/core/GitStateManager.js.map +1 -1
  85. package/dist/core/GitSync.d.ts.map +1 -1
  86. package/dist/core/GitSync.js +6 -6
  87. package/dist/core/GitSync.js.map +1 -1
  88. package/dist/core/GlobalInstallCleanup.d.ts.map +1 -1
  89. package/dist/core/GlobalInstallCleanup.js +3 -4
  90. package/dist/core/GlobalInstallCleanup.js.map +1 -1
  91. package/dist/core/GlobalSecretStore.d.ts.map +1 -1
  92. package/dist/core/GlobalSecretStore.js +3 -4
  93. package/dist/core/GlobalSecretStore.js.map +1 -1
  94. package/dist/core/HandoffManager.d.ts.map +1 -1
  95. package/dist/core/HandoffManager.js +5 -5
  96. package/dist/core/HandoffManager.js.map +1 -1
  97. package/dist/core/JargonDetector.d.ts +28 -0
  98. package/dist/core/JargonDetector.d.ts.map +1 -0
  99. package/dist/core/JargonDetector.js +59 -0
  100. package/dist/core/JargonDetector.js.map +1 -0
  101. package/dist/core/LedgerSessionRegistry.d.ts.map +1 -1
  102. package/dist/core/LedgerSessionRegistry.js +2 -2
  103. package/dist/core/LedgerSessionRegistry.js.map +1 -1
  104. package/dist/core/MachineIdentity.d.ts.map +1 -1
  105. package/dist/core/MachineIdentity.js +2 -2
  106. package/dist/core/MachineIdentity.js.map +1 -1
  107. package/dist/core/MessagingToneGate.d.ts +42 -5
  108. package/dist/core/MessagingToneGate.d.ts.map +1 -1
  109. package/dist/core/MessagingToneGate.js +40 -6
  110. package/dist/core/MessagingToneGate.js.map +1 -1
  111. package/dist/core/ParallelDevWiring.d.ts.map +1 -1
  112. package/dist/core/ParallelDevWiring.js +3 -6
  113. package/dist/core/ParallelDevWiring.js.map +1 -1
  114. package/dist/core/PostUpdateMigrator.d.ts +26 -0
  115. package/dist/core/PostUpdateMigrator.d.ts.map +1 -1
  116. package/dist/core/PostUpdateMigrator.js +249 -46
  117. package/dist/core/PostUpdateMigrator.js.map +1 -1
  118. package/dist/core/ProjectMapper.d.ts.map +1 -1
  119. package/dist/core/ProjectMapper.js +5 -11
  120. package/dist/core/ProjectMapper.js.map +1 -1
  121. package/dist/core/RelationshipManager.d.ts.map +1 -1
  122. package/dist/core/RelationshipManager.js +4 -5
  123. package/dist/core/RelationshipManager.js.map +1 -1
  124. package/dist/core/SafeGitExecutor.d.ts +11 -5
  125. package/dist/core/SafeGitExecutor.d.ts.map +1 -1
  126. package/dist/core/SafeGitExecutor.js +87 -1
  127. package/dist/core/SafeGitExecutor.js.map +1 -1
  128. package/dist/core/ScopeVerifier.d.ts.map +1 -1
  129. package/dist/core/ScopeVerifier.js +3 -6
  130. package/dist/core/ScopeVerifier.js.map +1 -1
  131. package/dist/core/SecretStore.d.ts.map +1 -1
  132. package/dist/core/SecretStore.js +2 -2
  133. package/dist/core/SecretStore.js.map +1 -1
  134. package/dist/core/SharedStateLedger.d.ts.map +1 -1
  135. package/dist/core/SharedStateLedger.js +2 -2
  136. package/dist/core/SharedStateLedger.js.map +1 -1
  137. package/dist/core/SoulManager.d.ts.map +1 -1
  138. package/dist/core/SoulManager.js +3 -4
  139. package/dist/core/SoulManager.js.map +1 -1
  140. package/dist/core/StateManager.d.ts.map +1 -1
  141. package/dist/core/StateManager.js +4 -6
  142. package/dist/core/StateManager.js.map +1 -1
  143. package/dist/core/SyncOrchestrator.d.ts.map +1 -1
  144. package/dist/core/SyncOrchestrator.js +6 -7
  145. package/dist/core/SyncOrchestrator.js.map +1 -1
  146. package/dist/core/UpdateChecker.d.ts.map +1 -1
  147. package/dist/core/UpdateChecker.js +3 -4
  148. package/dist/core/UpdateChecker.js.map +1 -1
  149. package/dist/core/UpgradeGuideProcessor.d.ts.map +1 -1
  150. package/dist/core/UpgradeGuideProcessor.js +3 -4
  151. package/dist/core/UpgradeGuideProcessor.js.map +1 -1
  152. package/dist/core/WorktreeManager.d.ts.map +1 -1
  153. package/dist/core/WorktreeManager.js +9 -14
  154. package/dist/core/WorktreeManager.js.map +1 -1
  155. package/dist/knowledge/KnowledgeManager.d.ts.map +1 -1
  156. package/dist/knowledge/KnowledgeManager.js +2 -2
  157. package/dist/knowledge/KnowledgeManager.js.map +1 -1
  158. package/dist/lifeline/ServerSupervisor.d.ts +28 -0
  159. package/dist/lifeline/ServerSupervisor.d.ts.map +1 -1
  160. package/dist/lifeline/ServerSupervisor.js +171 -73
  161. package/dist/lifeline/ServerSupervisor.js.map +1 -1
  162. package/dist/lifeline/TelegramLifeline.d.ts.map +1 -1
  163. package/dist/lifeline/TelegramLifeline.js +10 -4
  164. package/dist/lifeline/TelegramLifeline.js.map +1 -1
  165. package/dist/lifeline/detectLaunchdSupervised.d.ts +43 -0
  166. package/dist/lifeline/detectLaunchdSupervised.d.ts.map +1 -0
  167. package/dist/lifeline/detectLaunchdSupervised.js +106 -0
  168. package/dist/lifeline/detectLaunchdSupervised.js.map +1 -0
  169. package/dist/lifeline/droppedMessages.d.ts.map +1 -1
  170. package/dist/lifeline/droppedMessages.js +2 -2
  171. package/dist/lifeline/droppedMessages.js.map +1 -1
  172. package/dist/memory/EpisodicMemory.d.ts.map +1 -1
  173. package/dist/memory/EpisodicMemory.js +2 -2
  174. package/dist/memory/EpisodicMemory.js.map +1 -1
  175. package/dist/memory/TopicMemory.d.ts.map +1 -1
  176. package/dist/memory/TopicMemory.js +5 -8
  177. package/dist/memory/TopicMemory.js.map +1 -1
  178. package/dist/messaging/AgentTokenManager.d.ts.map +1 -1
  179. package/dist/messaging/AgentTokenManager.js +2 -2
  180. package/dist/messaging/AgentTokenManager.js.map +1 -1
  181. package/dist/messaging/DropPickup.d.ts.map +1 -1
  182. package/dist/messaging/DropPickup.js +2 -2
  183. package/dist/messaging/DropPickup.js.map +1 -1
  184. package/dist/messaging/GitSyncTransport.d.ts.map +1 -1
  185. package/dist/messaging/GitSyncTransport.js +4 -6
  186. package/dist/messaging/GitSyncTransport.js.map +1 -1
  187. package/dist/messaging/MessageStore.d.ts.map +1 -1
  188. package/dist/messaging/MessageStore.js +3 -4
  189. package/dist/messaging/MessageStore.js.map +1 -1
  190. package/dist/messaging/TelegramAdapter.d.ts.map +1 -1
  191. package/dist/messaging/TelegramAdapter.js +5 -8
  192. package/dist/messaging/TelegramAdapter.js.map +1 -1
  193. package/dist/messaging/backends/BaileysBackend.d.ts.map +1 -1
  194. package/dist/messaging/backends/BaileysBackend.js +3 -4
  195. package/dist/messaging/backends/BaileysBackend.js.map +1 -1
  196. package/dist/messaging/local-tone-check.d.ts +61 -0
  197. package/dist/messaging/local-tone-check.d.ts.map +1 -0
  198. package/dist/messaging/local-tone-check.js +78 -0
  199. package/dist/messaging/local-tone-check.js.map +1 -0
  200. package/dist/messaging/pending-relay-store.d.ts +153 -0
  201. package/dist/messaging/pending-relay-store.d.ts.map +1 -0
  202. package/dist/messaging/pending-relay-store.js +351 -0
  203. package/dist/messaging/pending-relay-store.js.map +1 -0
  204. package/dist/messaging/secret-patterns.d.ts +35 -0
  205. package/dist/messaging/secret-patterns.d.ts.map +1 -0
  206. package/dist/messaging/secret-patterns.js +70 -0
  207. package/dist/messaging/secret-patterns.js.map +1 -0
  208. package/dist/messaging/shared/EncryptedAuthStore.d.ts.map +1 -1
  209. package/dist/messaging/shared/EncryptedAuthStore.js +3 -4
  210. package/dist/messaging/shared/EncryptedAuthStore.js.map +1 -1
  211. package/dist/messaging/shared/MessageLogger.d.ts.map +1 -1
  212. package/dist/messaging/shared/MessageLogger.js +2 -2
  213. package/dist/messaging/shared/MessageLogger.js.map +1 -1
  214. package/dist/messaging/shared/PrivacyConsent.d.ts.map +1 -1
  215. package/dist/messaging/shared/PrivacyConsent.js +2 -2
  216. package/dist/messaging/shared/PrivacyConsent.js.map +1 -1
  217. package/dist/messaging/shared/SessionChannelRegistry.d.ts.map +1 -1
  218. package/dist/messaging/shared/SessionChannelRegistry.js +2 -2
  219. package/dist/messaging/shared/SessionChannelRegistry.js.map +1 -1
  220. package/dist/messaging/system-templates.d.ts +87 -0
  221. package/dist/messaging/system-templates.d.ts.map +1 -0
  222. package/dist/messaging/system-templates.js +236 -0
  223. package/dist/messaging/system-templates.js.map +1 -0
  224. package/dist/messaging/whoami-cache.d.ts +66 -0
  225. package/dist/messaging/whoami-cache.d.ts.map +1 -0
  226. package/dist/messaging/whoami-cache.js +149 -0
  227. package/dist/messaging/whoami-cache.js.map +1 -0
  228. package/dist/moltbridge/ProfileCompiler.d.ts.map +1 -1
  229. package/dist/moltbridge/ProfileCompiler.js +13 -7
  230. package/dist/moltbridge/ProfileCompiler.js.map +1 -1
  231. package/dist/monitoring/CommitmentTracker.d.ts.map +1 -1
  232. package/dist/monitoring/CommitmentTracker.js +2 -2
  233. package/dist/monitoring/CommitmentTracker.js.map +1 -1
  234. package/dist/monitoring/CredentialProvider.d.ts.map +1 -1
  235. package/dist/monitoring/CredentialProvider.js +2 -2
  236. package/dist/monitoring/CredentialProvider.js.map +1 -1
  237. package/dist/monitoring/DegradationReporter.d.ts +41 -0
  238. package/dist/monitoring/DegradationReporter.d.ts.map +1 -1
  239. package/dist/monitoring/DegradationReporter.js +96 -4
  240. package/dist/monitoring/DegradationReporter.js.map +1 -1
  241. package/dist/monitoring/HealthChecker.d.ts.map +1 -1
  242. package/dist/monitoring/HealthChecker.js +2 -2
  243. package/dist/monitoring/HealthChecker.js.map +1 -1
  244. package/dist/monitoring/HookEventReceiver.d.ts.map +1 -1
  245. package/dist/monitoring/HookEventReceiver.js +2 -2
  246. package/dist/monitoring/HookEventReceiver.js.map +1 -1
  247. package/dist/monitoring/InstructionsVerifier.d.ts.map +1 -1
  248. package/dist/monitoring/InstructionsVerifier.js +2 -2
  249. package/dist/monitoring/InstructionsVerifier.js.map +1 -1
  250. package/dist/monitoring/PresenceProxy.d.ts.map +1 -1
  251. package/dist/monitoring/PresenceProxy.js +5 -8
  252. package/dist/monitoring/PresenceProxy.js.map +1 -1
  253. package/dist/monitoring/QuotaTracker.d.ts.map +1 -1
  254. package/dist/monitoring/QuotaTracker.js +2 -2
  255. package/dist/monitoring/QuotaTracker.js.map +1 -1
  256. package/dist/monitoring/SessionMigrator.d.ts.map +1 -1
  257. package/dist/monitoring/SessionMigrator.js +2 -2
  258. package/dist/monitoring/SessionMigrator.js.map +1 -1
  259. package/dist/monitoring/SessionRecovery.d.ts.map +1 -1
  260. package/dist/monitoring/SessionRecovery.js +2 -2
  261. package/dist/monitoring/SessionRecovery.js.map +1 -1
  262. package/dist/monitoring/TelemetryAuth.d.ts.map +1 -1
  263. package/dist/monitoring/TelemetryAuth.js +3 -4
  264. package/dist/monitoring/TelemetryAuth.js.map +1 -1
  265. package/dist/monitoring/TokenLedger.d.ts +130 -0
  266. package/dist/monitoring/TokenLedger.d.ts.map +1 -0
  267. package/dist/monitoring/TokenLedger.js +523 -0
  268. package/dist/monitoring/TokenLedger.js.map +1 -0
  269. package/dist/monitoring/TokenLedgerPoller.d.ts +26 -0
  270. package/dist/monitoring/TokenLedgerPoller.d.ts.map +1 -0
  271. package/dist/monitoring/TokenLedgerPoller.js +44 -0
  272. package/dist/monitoring/TokenLedgerPoller.js.map +1 -0
  273. package/dist/monitoring/TriageOrchestrator.d.ts.map +1 -1
  274. package/dist/monitoring/TriageOrchestrator.js +3 -4
  275. package/dist/monitoring/TriageOrchestrator.js.map +1 -1
  276. package/dist/monitoring/WorktreeReaper.d.ts.map +1 -1
  277. package/dist/monitoring/WorktreeReaper.js +5 -7
  278. package/dist/monitoring/WorktreeReaper.js.map +1 -1
  279. package/dist/monitoring/delivery-failure-sentinel/recovery-policy.d.ts +83 -0
  280. package/dist/monitoring/delivery-failure-sentinel/recovery-policy.d.ts.map +1 -0
  281. package/dist/monitoring/delivery-failure-sentinel/recovery-policy.js +218 -0
  282. package/dist/monitoring/delivery-failure-sentinel/recovery-policy.js.map +1 -0
  283. package/dist/monitoring/delivery-failure-sentinel.d.ts +177 -0
  284. package/dist/monitoring/delivery-failure-sentinel.d.ts.map +1 -0
  285. package/dist/monitoring/delivery-failure-sentinel.js +598 -0
  286. package/dist/monitoring/delivery-failure-sentinel.js.map +1 -0
  287. package/dist/monitoring/probes/PlatformProbe.d.ts.map +1 -1
  288. package/dist/monitoring/probes/PlatformProbe.js +3 -4
  289. package/dist/monitoring/probes/PlatformProbe.js.map +1 -1
  290. package/dist/monitoring/templates-drift-verifier.d.ts +109 -0
  291. package/dist/monitoring/templates-drift-verifier.d.ts.map +1 -0
  292. package/dist/monitoring/templates-drift-verifier.js +324 -0
  293. package/dist/monitoring/templates-drift-verifier.js.map +1 -0
  294. package/dist/paste/PasteManager.d.ts.map +1 -1
  295. package/dist/paste/PasteManager.js +5 -8
  296. package/dist/paste/PasteManager.js.map +1 -1
  297. package/dist/publishing/PrivateViewer.d.ts.map +1 -1
  298. package/dist/publishing/PrivateViewer.js +2 -2
  299. package/dist/publishing/PrivateViewer.js.map +1 -1
  300. package/dist/scheduler/JobScheduler.d.ts.map +1 -1
  301. package/dist/scheduler/JobScheduler.js +2 -2
  302. package/dist/scheduler/JobScheduler.js.map +1 -1
  303. package/dist/server/AgentServer.d.ts +22 -0
  304. package/dist/server/AgentServer.d.ts.map +1 -1
  305. package/dist/server/AgentServer.js +199 -1
  306. package/dist/server/AgentServer.js.map +1 -1
  307. package/dist/server/WebSocketManager.d.ts +11 -0
  308. package/dist/server/WebSocketManager.d.ts.map +1 -1
  309. package/dist/server/WebSocketManager.js +28 -0
  310. package/dist/server/WebSocketManager.js.map +1 -1
  311. package/dist/server/boot-id.d.ts +58 -0
  312. package/dist/server/boot-id.d.ts.map +1 -0
  313. package/dist/server/boot-id.js +121 -0
  314. package/dist/server/boot-id.js.map +1 -0
  315. package/dist/server/middleware.d.ts +14 -1
  316. package/dist/server/middleware.d.ts.map +1 -1
  317. package/dist/server/middleware.js +81 -1
  318. package/dist/server/middleware.js.map +1 -1
  319. package/dist/server/routes.d.ts +76 -0
  320. package/dist/server/routes.d.ts.map +1 -1
  321. package/dist/server/routes.js +626 -11
  322. package/dist/server/routes.js.map +1 -1
  323. package/dist/threadline/AgentDiscovery.d.ts.map +1 -1
  324. package/dist/threadline/AgentDiscovery.js +2 -2
  325. package/dist/threadline/AgentDiscovery.js.map +1 -1
  326. package/dist/threadline/AgentTrustManager.d.ts.map +1 -1
  327. package/dist/threadline/AgentTrustManager.js +2 -2
  328. package/dist/threadline/AgentTrustManager.js.map +1 -1
  329. package/dist/threadline/BackfillCore.d.ts +70 -0
  330. package/dist/threadline/BackfillCore.d.ts.map +1 -0
  331. package/dist/threadline/BackfillCore.js +117 -0
  332. package/dist/threadline/BackfillCore.js.map +1 -0
  333. package/dist/threadline/CircuitBreaker.d.ts.map +1 -1
  334. package/dist/threadline/CircuitBreaker.js +2 -2
  335. package/dist/threadline/CircuitBreaker.js.map +1 -1
  336. package/dist/threadline/ComputeMeter.d.ts.map +1 -1
  337. package/dist/threadline/ComputeMeter.js +2 -2
  338. package/dist/threadline/ComputeMeter.js.map +1 -1
  339. package/dist/threadline/ContextThreadMap.d.ts.map +1 -1
  340. package/dist/threadline/ContextThreadMap.js +2 -2
  341. package/dist/threadline/ContextThreadMap.js.map +1 -1
  342. package/dist/threadline/HeartbeatWatchdog.d.ts +78 -0
  343. package/dist/threadline/HeartbeatWatchdog.d.ts.map +1 -0
  344. package/dist/threadline/HeartbeatWatchdog.js +212 -0
  345. package/dist/threadline/HeartbeatWatchdog.js.map +1 -0
  346. package/dist/threadline/HeartbeatWriter.d.ts +79 -0
  347. package/dist/threadline/HeartbeatWriter.d.ts.map +1 -0
  348. package/dist/threadline/HeartbeatWriter.js +109 -0
  349. package/dist/threadline/HeartbeatWriter.js.map +1 -0
  350. package/dist/threadline/InvitationManager.d.ts.map +1 -1
  351. package/dist/threadline/InvitationManager.js +2 -2
  352. package/dist/threadline/InvitationManager.js.map +1 -1
  353. package/dist/threadline/ListenerSessionManager.d.ts +59 -0
  354. package/dist/threadline/ListenerSessionManager.d.ts.map +1 -1
  355. package/dist/threadline/ListenerSessionManager.js +79 -0
  356. package/dist/threadline/ListenerSessionManager.js.map +1 -1
  357. package/dist/threadline/MCPAuth.d.ts.map +1 -1
  358. package/dist/threadline/MCPAuth.js +2 -2
  359. package/dist/threadline/MCPAuth.js.map +1 -1
  360. package/dist/threadline/PipeSessionSpawner.d.ts.map +1 -1
  361. package/dist/threadline/PipeSessionSpawner.js +3 -4
  362. package/dist/threadline/PipeSessionSpawner.js.map +1 -1
  363. package/dist/threadline/RateLimiter.d.ts.map +1 -1
  364. package/dist/threadline/RateLimiter.js +2 -2
  365. package/dist/threadline/RateLimiter.js.map +1 -1
  366. package/dist/threadline/RelaySpawnFailureHandler.d.ts +53 -0
  367. package/dist/threadline/RelaySpawnFailureHandler.d.ts.map +1 -0
  368. package/dist/threadline/RelaySpawnFailureHandler.js +73 -0
  369. package/dist/threadline/RelaySpawnFailureHandler.js.map +1 -0
  370. package/dist/threadline/SessionLifecycle.d.ts.map +1 -1
  371. package/dist/threadline/SessionLifecycle.js +2 -2
  372. package/dist/threadline/SessionLifecycle.js.map +1 -1
  373. package/dist/threadline/SpawnLedger.d.ts +94 -0
  374. package/dist/threadline/SpawnLedger.d.ts.map +1 -0
  375. package/dist/threadline/SpawnLedger.js +194 -0
  376. package/dist/threadline/SpawnLedger.js.map +1 -0
  377. package/dist/threadline/SpawnNonce.d.ts +49 -0
  378. package/dist/threadline/SpawnNonce.d.ts.map +1 -0
  379. package/dist/threadline/SpawnNonce.js +99 -0
  380. package/dist/threadline/SpawnNonce.js.map +1 -0
  381. package/dist/threadline/TelegramBridge.d.ts +140 -0
  382. package/dist/threadline/TelegramBridge.d.ts.map +1 -0
  383. package/dist/threadline/TelegramBridge.js +224 -0
  384. package/dist/threadline/TelegramBridge.js.map +1 -0
  385. package/dist/threadline/TelegramBridgeConfig.d.ts +79 -0
  386. package/dist/threadline/TelegramBridgeConfig.d.ts.map +1 -0
  387. package/dist/threadline/TelegramBridgeConfig.js +168 -0
  388. package/dist/threadline/TelegramBridgeConfig.js.map +1 -0
  389. package/dist/threadline/ThreadlineBootstrap.d.ts.map +1 -1
  390. package/dist/threadline/ThreadlineBootstrap.js +2 -2
  391. package/dist/threadline/ThreadlineBootstrap.js.map +1 -1
  392. package/dist/threadline/ThreadlineMCPServer.d.ts.map +1 -1
  393. package/dist/threadline/ThreadlineMCPServer.js +5 -0
  394. package/dist/threadline/ThreadlineMCPServer.js.map +1 -1
  395. package/dist/threadline/ThreadlineObservability.d.ts +95 -0
  396. package/dist/threadline/ThreadlineObservability.d.ts.map +1 -0
  397. package/dist/threadline/ThreadlineObservability.js +310 -0
  398. package/dist/threadline/ThreadlineObservability.js.map +1 -0
  399. package/dist/threadline/WakeSocketServer.d.ts.map +1 -1
  400. package/dist/threadline/WakeSocketServer.js +3 -4
  401. package/dist/threadline/WakeSocketServer.js.map +1 -1
  402. package/dist/threadline/listener-daemon.d.ts.map +1 -1
  403. package/dist/threadline/listener-daemon.js +3 -4
  404. package/dist/threadline/listener-daemon.js.map +1 -1
  405. package/dist/users/UserManager.d.ts.map +1 -1
  406. package/dist/users/UserManager.js +2 -2
  407. package/dist/users/UserManager.js.map +1 -1
  408. package/dist/users/UserOnboarding.d.ts.map +1 -1
  409. package/dist/users/UserOnboarding.js +2 -2
  410. package/dist/users/UserOnboarding.js.map +1 -1
  411. package/dist/utils/jsonl-rotation.d.ts.map +1 -1
  412. package/dist/utils/jsonl-rotation.js +2 -2
  413. package/dist/utils/jsonl-rotation.js.map +1 -1
  414. package/package.json +1 -1
  415. package/scripts/analyze-release.js +7 -12
  416. package/scripts/check-contract-evidence.js +27 -10
  417. package/scripts/fix-better-sqlite3.cjs +0 -2
  418. package/scripts/instar-dev-precommit.js +0 -2
  419. package/scripts/lint-no-direct-destructive.js +24 -4
  420. package/scripts/lint-template-sha-history.ts +183 -0
  421. package/scripts/migrate-incident-2026-04-17.mjs +2 -2
  422. package/scripts/run-migration.js +500 -0
  423. package/scripts/test-bootstrap-relay.mjs +2 -2
  424. package/scripts/threadline-bridge-backfill.mjs +379 -0
  425. package/scripts/verify-deployed-templates.ts +87 -0
  426. package/src/data/builtin-manifest.json +140 -132
  427. package/src/templates/scripts/git-sync-gate.sh +0 -4
  428. package/src/templates/scripts/telegram-reply.sh +318 -13
  429. package/upgrades/0.28.77.md +133 -0
  430. package/upgrades/0.28.78.md +90 -0
  431. package/upgrades/side-effects/agent-health-alert-authority-routing.md +121 -0
  432. package/upgrades/side-effects/comprehensive-destructive-tool-containment-migration.md +82 -0
  433. package/upgrades/side-effects/deferral-detector-orphan-todo.md +101 -0
  434. package/upgrades/side-effects/lifeline-self-heal-hardening.md +151 -0
  435. package/upgrades/side-effects/relay-spawn-ghost-reply-phase1.md +139 -0
  436. package/upgrades/side-effects/telegram-delivery-robustness-layer-2.md +320 -0
  437. package/upgrades/side-effects/telegram-delivery-robustness-layer-3.md +202 -0
  438. package/upgrades/side-effects/telegram-delivery-robustness-layer-7.md +339 -0
  439. package/upgrades/side-effects/telegram-delivery-robustness.md +178 -0
  440. package/upgrades/side-effects/threadline-bridge-backfill.md +203 -0
  441. package/upgrades/side-effects/threadline-canonical-inbox-write.md +218 -0
  442. package/upgrades/side-effects/threadline-observability-tab.md +206 -0
  443. package/upgrades/side-effects/threadline-tg-bridge-module.md +196 -0
  444. package/upgrades/side-effects/threadline-tg-bridge-settings-surface.md +208 -0
  445. package/upgrades/side-effects/token-ledger-bounded-scan.md +230 -0
  446. package/upgrades/side-effects/token-ledger-phase1.md +123 -0
  447. package/upgrades/NEXT.md +0 -53
  448. /package/upgrades/side-effects/{telegram-lifeline-version-missing-info.md → 0.28.76.md} +0 -0
@@ -0,0 +1,379 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * threadline-bridge-backfill.mjs — one-shot backfill of threadline messages
4
+ * into Telegram topics via the local agent's HTTP API.
5
+ *
6
+ * Use case: the canonical inbox / outbox files (introduced in PRs #113
7
+ * and #118) accrue going forward, and the bridge module (#117) mirrors
8
+ * NEW traffic into Telegram topics. But threads that landed BEFORE the
9
+ * bridge shipped — including the four documented in topic-8686 — need to
10
+ * be reconstructed manually so the user has visibility on those too.
11
+ *
12
+ * What this script does:
13
+ *
14
+ * 1. Reads the agent's canonical inbox/outbox JSONL files.
15
+ * 2. Optionally enriches with a seed file (--seed) of historical
16
+ * messages reconstructed from spawn-session transcripts.
17
+ * 3. For each thread to backfill (default: all threads with no
18
+ * existing bridge binding):
19
+ * a. POST /telegram/topics with a bridge-style name.
20
+ * b. POST a backfill banner explaining what the user is seeing.
21
+ * c. POST each message chronologically, chunked under 4000 chars.
22
+ * 4. Records what it did in
23
+ * .instar/threadline/bridge-backfill-ledger.json so reruns are
24
+ * idempotent — already-backfilled threads are skipped.
25
+ *
26
+ * Safety:
27
+ * - --dry-run prints the plan without making any HTTP calls.
28
+ * - --threads <id1,id2,...> limits to specific threadIds.
29
+ * - --no-create skips topic creation; only posts when a binding
30
+ * already exists.
31
+ * - 250ms gap between sends to avoid hitting Telegram rate limits.
32
+ *
33
+ * Usage:
34
+ * node scripts/threadline-bridge-backfill.mjs [--state-dir .instar] \
35
+ * [--port 4042] [--threads tA,tB] [--seed seed.json] \
36
+ * [--dry-run] [--no-create]
37
+ *
38
+ * The seed file format is a JSON array of message records:
39
+ * [
40
+ * {
41
+ * "threadId": "thread-bdc12cb0",
42
+ * "direction": "in" | "out",
43
+ * "timestamp": "2026-04-28T12:34:56Z",
44
+ * "remoteAgent": "fp-dawn",
45
+ * "remoteAgentName": "Dawn",
46
+ * "text": "..."
47
+ * },
48
+ * ...
49
+ * ]
50
+ * Seed messages are merged with the on-disk inbox/outbox per thread,
51
+ * sorted chronologically, and posted as one stream.
52
+ */
53
+
54
+ import fs from 'node:fs';
55
+ import path from 'node:path';
56
+ import process from 'node:process';
57
+
58
+ const ARGS = parseArgs(process.argv.slice(2));
59
+ const STATE_DIR = path.resolve(ARGS['--state-dir'] ?? '.instar');
60
+ const PORT = parseInt(ARGS['--port'] ?? '4042', 10);
61
+ const DRY_RUN = '--dry-run' in ARGS;
62
+ const NO_CREATE = '--no-create' in ARGS;
63
+ const ONLY_THREADS = (ARGS['--threads'] ?? '').split(',').map(s => s.trim()).filter(Boolean);
64
+ const SEED_PATH = ARGS['--seed'];
65
+ const SEND_GAP_MS = 250;
66
+ const MAX_BODY_CHARS = 3800; // Telegram cap is 4096; leave room for headers
67
+ const TOPIC_NAME_MAX = 96;
68
+
69
+ const AUTH = readAuthToken();
70
+ const BASE = `http://localhost:${PORT}`;
71
+ const LEDGER_PATH = path.join(STATE_DIR, 'threadline', 'bridge-backfill-ledger.json');
72
+
73
+ const log = (msg) => console.log(`[backfill] ${msg}`);
74
+ const warn = (msg) => console.warn(`[backfill] ${msg}`);
75
+
76
+ main().catch(err => {
77
+ console.error(`[backfill] FATAL: ${err.stack || err.message || err}`);
78
+ process.exit(1);
79
+ });
80
+
81
+ async function main() {
82
+ const inbox = readJsonl(path.join(STATE_DIR, 'threadline', 'inbox.jsonl.active'));
83
+ const outbox = readJsonl(path.join(STATE_DIR, 'threadline', 'outbox.jsonl.active'));
84
+ const bindings = loadBindings();
85
+ const ledger = loadLedger();
86
+ const seed = loadSeed(SEED_PATH);
87
+
88
+ const byThread = groupByThread(inbox, outbox, seed);
89
+ const targetIds = ONLY_THREADS.length > 0 ? ONLY_THREADS : Array.from(byThread.keys());
90
+ log(`Found ${byThread.size} threads in canonical files; targeting ${targetIds.length} for backfill (dry-run=${DRY_RUN}).`);
91
+
92
+ let bridgedCount = 0;
93
+ let postedCount = 0;
94
+ for (const threadId of targetIds) {
95
+ const messages = byThread.get(threadId) ?? [];
96
+ if (messages.length === 0) {
97
+ warn(`thread ${threadId.slice(0, 12)}: no messages on disk or in seed; skipping`);
98
+ continue;
99
+ }
100
+ messages.sort((a, b) => (a.timestamp || '').localeCompare(b.timestamp || ''));
101
+
102
+ const existingBinding = bindings.get(threadId);
103
+ let topicId = existingBinding?.topicId;
104
+ let topicName = existingBinding?.topicName;
105
+ const remoteAgent = pickCounterparty(messages);
106
+
107
+ if (!topicId) {
108
+ if (NO_CREATE) {
109
+ warn(`thread ${threadId.slice(0, 12)}: no binding and --no-create — skipping`);
110
+ continue;
111
+ }
112
+ const localAgentName = readAgentName();
113
+ topicName = buildTopicName(localAgentName, remoteAgent.name, messages[0]?.text || 'reconstructed thread');
114
+ if (DRY_RUN) {
115
+ log(`[plan] CREATE topic "${topicName}" for thread ${threadId.slice(0, 12)} (${messages.length} msgs)`);
116
+ } else {
117
+ const created = await createTopic(topicName);
118
+ topicId = created.topicId;
119
+ log(`Created topic ${topicId} ("${topicName}") for thread ${threadId.slice(0, 12)}`);
120
+ }
121
+ bridgedCount++;
122
+ }
123
+
124
+ // Banner
125
+ const bannerLines = [
126
+ '📚 Backfill: reconstructed thread history',
127
+ `Thread: ${threadId}`,
128
+ `Remote agent: ${remoteAgent.name} (${remoteAgent.id})`,
129
+ `Messages: ${messages.length} (${messages.filter(m => m.direction === 'in').length} in / ${messages.filter(m => m.direction === 'out').length} out)`,
130
+ `Span: ${messages[0]?.timestamp || 'unknown'} → ${messages[messages.length-1]?.timestamp || 'unknown'}`,
131
+ '',
132
+ 'New traffic on this thread will mirror in real time once the bridge is enabled.',
133
+ ];
134
+ const banner = bannerLines.join('\n');
135
+ if (DRY_RUN) {
136
+ log(`[plan] POST banner to topic ${topicId ?? '(would-create)'}`);
137
+ } else if (topicId) {
138
+ await postToTopic(topicId, banner);
139
+ await sleep(SEND_GAP_MS);
140
+ }
141
+
142
+ // Messages
143
+ const ledgerThread = ledger.threads[threadId] ?? { posted: [] };
144
+ const alreadyPosted = new Set(ledgerThread.posted);
145
+ let postedThisRun = 0;
146
+ for (const m of messages) {
147
+ const key = m.id || `${m.direction}:${m.timestamp}:${m.text.slice(0, 32)}`;
148
+ if (alreadyPosted.has(key)) continue;
149
+ const formatted = formatBackfillMessage(m, remoteAgent);
150
+ const chunks = chunkBody(formatted);
151
+ for (const chunk of chunks) {
152
+ if (DRY_RUN) {
153
+ log(`[plan] POST to topic ${topicId ?? '?'}: ${oneLine(chunk).slice(0, 80)}…`);
154
+ } else if (topicId) {
155
+ await postToTopic(topicId, chunk);
156
+ await sleep(SEND_GAP_MS);
157
+ }
158
+ }
159
+ alreadyPosted.add(key);
160
+ postedThisRun++;
161
+ postedCount++;
162
+ }
163
+
164
+ if (!DRY_RUN) {
165
+ ledger.threads[threadId] = {
166
+ topicId: topicId ?? null,
167
+ topicName: topicName ?? null,
168
+ posted: Array.from(alreadyPosted),
169
+ lastBackfillAt: new Date().toISOString(),
170
+ };
171
+ saveLedger(ledger);
172
+ }
173
+ log(`Thread ${threadId.slice(0, 12)}: posted ${postedThisRun} new message(s).`);
174
+ }
175
+
176
+ log(`Done. Threads bridged this run: ${bridgedCount}; messages posted: ${postedCount}; dry-run: ${DRY_RUN}.`);
177
+ }
178
+
179
+ // ── Helpers ─────────────────────────────────────────────────────────
180
+
181
+ function parseArgs(argv) {
182
+ const out = {};
183
+ for (let i = 0; i < argv.length; i++) {
184
+ const a = argv[i];
185
+ if (a.startsWith('--')) {
186
+ const next = argv[i + 1];
187
+ if (next && !next.startsWith('--')) { out[a] = next; i++; }
188
+ else { out[a] = ''; }
189
+ }
190
+ }
191
+ return out;
192
+ }
193
+
194
+ function readAuthToken() {
195
+ try {
196
+ const raw = fs.readFileSync(path.join(STATE_DIR, 'config.json'), 'utf-8');
197
+ const cfg = JSON.parse(raw);
198
+ return cfg.authToken ?? '';
199
+ } catch { return ''; }
200
+ }
201
+
202
+ function readAgentName() {
203
+ try {
204
+ const raw = fs.readFileSync(path.join(STATE_DIR, 'config.json'), 'utf-8');
205
+ const cfg = JSON.parse(raw);
206
+ return cfg.projectName || 'agent';
207
+ } catch { return 'agent'; }
208
+ }
209
+
210
+ function readJsonl(filePath) {
211
+ if (!fs.existsSync(filePath)) return [];
212
+ return fs.readFileSync(filePath, 'utf-8').split('\n').filter(Boolean).map(line => {
213
+ try { return JSON.parse(line); } catch { return null; }
214
+ }).filter(Boolean);
215
+ }
216
+
217
+ function loadBindings() {
218
+ const map = new Map();
219
+ const filePath = path.join(STATE_DIR, 'threadline', 'telegram-bridge-bindings.json');
220
+ if (!fs.existsSync(filePath)) return map;
221
+ try {
222
+ const parsed = JSON.parse(fs.readFileSync(filePath, 'utf-8'));
223
+ for (const b of parsed.bindings ?? []) {
224
+ if (b.threadId) map.set(b.threadId, b);
225
+ }
226
+ } catch { /* ignore */ }
227
+ return map;
228
+ }
229
+
230
+ function loadLedger() {
231
+ if (!fs.existsSync(LEDGER_PATH)) return { version: 1, threads: {} };
232
+ try {
233
+ const parsed = JSON.parse(fs.readFileSync(LEDGER_PATH, 'utf-8'));
234
+ if (!parsed.threads) parsed.threads = {};
235
+ return parsed;
236
+ } catch {
237
+ return { version: 1, threads: {} };
238
+ }
239
+ }
240
+
241
+ function saveLedger(ledger) {
242
+ const dir = path.dirname(LEDGER_PATH);
243
+ if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });
244
+ fs.writeFileSync(LEDGER_PATH, JSON.stringify(ledger, null, 2), { mode: 0o600 });
245
+ }
246
+
247
+ function loadSeed(seedPath) {
248
+ if (!seedPath) return [];
249
+ if (!fs.existsSync(seedPath)) {
250
+ warn(`Seed file not found: ${seedPath}`);
251
+ return [];
252
+ }
253
+ try {
254
+ const parsed = JSON.parse(fs.readFileSync(seedPath, 'utf-8'));
255
+ if (!Array.isArray(parsed)) {
256
+ warn(`Seed file did not parse as array; ignoring`);
257
+ return [];
258
+ }
259
+ return parsed;
260
+ } catch (err) {
261
+ warn(`Failed to parse seed file: ${err.message}`);
262
+ return [];
263
+ }
264
+ }
265
+
266
+ function groupByThread(inbox, outbox, seed) {
267
+ const map = new Map();
268
+ const push = (threadId, msg) => {
269
+ if (!threadId) return;
270
+ if (!map.has(threadId)) map.set(threadId, []);
271
+ map.get(threadId).push(msg);
272
+ };
273
+ for (const e of inbox) {
274
+ push(e.threadId, {
275
+ id: e.id,
276
+ direction: 'in',
277
+ timestamp: e.timestamp,
278
+ remoteAgent: e.from,
279
+ remoteAgentName: e.senderName || e.from?.slice(0, 8) || '(unknown)',
280
+ text: e.text || '',
281
+ });
282
+ }
283
+ for (const e of outbox) {
284
+ push(e.threadId, {
285
+ id: e.id,
286
+ direction: 'out',
287
+ timestamp: e.timestamp,
288
+ remoteAgent: e.to,
289
+ remoteAgentName: e.recipientName || e.to?.slice(0, 8) || '(unknown)',
290
+ text: e.text || '',
291
+ outcome: e.outcome,
292
+ });
293
+ }
294
+ for (const e of seed) {
295
+ if (!e.threadId) continue;
296
+ push(e.threadId, {
297
+ id: e.id ?? `seed-${e.timestamp ?? ''}`,
298
+ direction: e.direction === 'out' ? 'out' : 'in',
299
+ timestamp: e.timestamp,
300
+ remoteAgent: e.remoteAgent,
301
+ remoteAgentName: e.remoteAgentName ?? e.remoteAgent?.slice(0, 8) ?? '(unknown)',
302
+ text: e.text ?? '',
303
+ });
304
+ }
305
+ return map;
306
+ }
307
+
308
+ function pickCounterparty(messages) {
309
+ for (const m of messages) {
310
+ if (m.direction === 'in') return { id: m.remoteAgent, name: m.remoteAgentName };
311
+ }
312
+ for (const m of messages) {
313
+ if (m.direction === 'out') return { id: m.remoteAgent, name: m.remoteAgentName };
314
+ }
315
+ return { id: '(unknown)', name: '(unknown)' };
316
+ }
317
+
318
+ function buildTopicName(localAgent, remoteName, subject) {
319
+ const baseSubject = (subject || 'thread').trim().replace(/\s+/g, ' ');
320
+ const head = `${localAgent}↔${remoteName}`;
321
+ const sep = ' — ';
322
+ const remaining = TOPIC_NAME_MAX - head.length - sep.length;
323
+ const trimmedSubject = remaining > 4 && baseSubject.length > remaining
324
+ ? baseSubject.slice(0, remaining - 1) + '…'
325
+ : baseSubject;
326
+ return `${head}${sep}${trimmedSubject}`.slice(0, TOPIC_NAME_MAX);
327
+ }
328
+
329
+ function formatBackfillMessage(m, remoteAgent) {
330
+ const arrow = m.direction === 'in' ? '📥' : '📤';
331
+ const head = m.direction === 'in'
332
+ ? `${arrow} ${m.remoteAgentName} → us`
333
+ : `${arrow} us → ${m.remoteAgentName}`;
334
+ const meta = m.timestamp ? `\n${m.timestamp}` : '';
335
+ return `${head}${meta}\n${m.text}`;
336
+ }
337
+
338
+ function chunkBody(body) {
339
+ if (body.length <= MAX_BODY_CHARS) return [body];
340
+ const chunks = [];
341
+ for (let i = 0; i < body.length; i += MAX_BODY_CHARS) {
342
+ chunks.push(body.slice(i, i + MAX_BODY_CHARS));
343
+ }
344
+ return chunks;
345
+ }
346
+
347
+ function oneLine(s) {
348
+ return s.replace(/\s+/g, ' ');
349
+ }
350
+
351
+ async function createTopic(name) {
352
+ const resp = await fetch(`${BASE}/telegram/topics`, {
353
+ method: 'POST',
354
+ headers: { 'content-type': 'application/json', 'authorization': `Bearer ${AUTH}` },
355
+ body: JSON.stringify({ name }),
356
+ });
357
+ if (!resp.ok) {
358
+ const text = await resp.text().catch(() => '');
359
+ throw new Error(`POST /telegram/topics ${resp.status}: ${text.slice(0, 200)}`);
360
+ }
361
+ return resp.json();
362
+ }
363
+
364
+ async function postToTopic(topicId, body) {
365
+ const resp = await fetch(`${BASE}/telegram/post-update`, {
366
+ method: 'POST',
367
+ headers: { 'content-type': 'application/json', 'authorization': `Bearer ${AUTH}` },
368
+ body: JSON.stringify({ topicId, message: body, silent: true }),
369
+ });
370
+ if (!resp.ok) {
371
+ const text = await resp.text().catch(() => '');
372
+ throw new Error(`POST /telegram/post-update ${resp.status}: ${text.slice(0, 200)}`);
373
+ }
374
+ return resp.json();
375
+ }
376
+
377
+ function sleep(ms) {
378
+ return new Promise(r => setTimeout(r, ms));
379
+ }
@@ -0,0 +1,87 @@
1
+ #!/usr/bin/env tsx
2
+ /**
3
+ * verify-deployed-templates.ts — Layer 7 CLI entry for the templates-drift
4
+ * verifier.
5
+ *
6
+ * Spec: docs/specs/telegram-delivery-robustness.md § 7.
7
+ *
8
+ * Wired as a daily job in `getDefaultJobs(...)` (see src/commands/init.ts).
9
+ * Operators can disable the daily run via:
10
+ *
11
+ * "monitoring": { "templatesDriftVerifier": { "enabled": false } }
12
+ *
13
+ * in `.instar/config.json`. Default is enabled.
14
+ *
15
+ * The actual verifier logic lives in `src/monitoring/templates-drift-
16
+ * verifier.ts` so it gets type-checked by the main `tsc --noEmit` pass.
17
+ * This file is the thin CLI wrapper invoked by tsx from the daily job.
18
+ */
19
+
20
+ import fs from 'node:fs';
21
+ import os from 'node:os';
22
+ import path from 'node:path';
23
+ import { runVerifier } from '../src/monitoring/templates-drift-verifier.js';
24
+ import { DegradationReporter } from '../src/monitoring/DegradationReporter.js';
25
+
26
+ interface ConfigShape {
27
+ monitoring?: {
28
+ templatesDriftVerifier?: {
29
+ enabled?: boolean;
30
+ };
31
+ };
32
+ }
33
+
34
+ function readEnabledFromConfig(stateDir: string): boolean {
35
+ const configPath = path.join(stateDir, 'config.json');
36
+ if (!fs.existsSync(configPath)) return true; // default-on
37
+ try {
38
+ const raw = fs.readFileSync(configPath, 'utf-8');
39
+ const config = JSON.parse(raw) as ConfigShape;
40
+ const enabled = config.monitoring?.templatesDriftVerifier?.enabled;
41
+ if (enabled === false) return false;
42
+ return true;
43
+ } catch {
44
+ return true; // unparseable config: fall back to default-on
45
+ }
46
+ }
47
+
48
+ async function main(): Promise<void> {
49
+ const homeDir = os.homedir();
50
+ const stateDir = path.join(homeDir, '.instar');
51
+ const enabled = readEnabledFromConfig(stateDir);
52
+
53
+ // Configure the reporter with the host-level state dir so the daily
54
+ // job can drain to the same DegradationReporter the server uses.
55
+ const reporter = DegradationReporter.getInstance();
56
+ reporter.configure({
57
+ stateDir: path.join(stateDir, 'state'),
58
+ agentName: 'host',
59
+ instarVersion: process.env.npm_package_version ?? 'unknown',
60
+ });
61
+
62
+ const result = await runVerifier({ enabled, reporter });
63
+
64
+ // Single-line summary so the daily job's stdout is grep-friendly.
65
+ // The DegradationReporter handles operator-visible signal; this is
66
+ // operator-curiosity output only.
67
+ console.log(
68
+ JSON.stringify({
69
+ verifier: 'templates-drift',
70
+ ...result,
71
+ }),
72
+ );
73
+
74
+ if (result.errors.length > 0) {
75
+ // Non-fatal: errors are still surfaced through the reporter. Exit
76
+ // 0 so the daily job doesn't get marked as failed for a single
77
+ // unreadable agent dir.
78
+ process.stderr.write(
79
+ `templates-drift-verifier errors:\n - ${result.errors.join('\n - ')}\n`,
80
+ );
81
+ }
82
+ }
83
+
84
+ main().catch((err) => {
85
+ process.stderr.write(`templates-drift-verifier crashed: ${err instanceof Error ? err.stack : String(err)}\n`);
86
+ process.exit(1);
87
+ });