instar 0.28.75 → 0.28.77

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 (436) hide show
  1. package/dashboard/index.html +306 -0
  2. package/dist/cli.js +5 -4
  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 -1
  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 -2
  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 -1
  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 -1
  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 -6
  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 -15
  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 +35 -3
  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 -9
  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 -4
  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 -1
  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 -1
  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 -7
  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 -2
  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 -1
  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 -1
  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 -1
  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 -1
  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 -2
  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 -1
  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 -1
  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 -2
  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 -1
  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 -1
  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 -1
  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 -13
  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 -2
  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 -11
  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 -3
  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 -2
  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 -2
  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 -3
  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 -1
  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 -1
  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 -5
  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 -44
  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 -9
  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 -3
  123. package/dist/core/RelationshipManager.js.map +1 -1
  124. package/dist/core/SafeFsExecutor.d.ts +41 -0
  125. package/dist/core/SafeFsExecutor.d.ts.map +1 -0
  126. package/dist/core/SafeFsExecutor.js +146 -0
  127. package/dist/core/SafeFsExecutor.js.map +1 -0
  128. package/dist/core/SafeGitExecutor.d.ts +145 -0
  129. package/dist/core/SafeGitExecutor.d.ts.map +1 -0
  130. package/dist/core/SafeGitExecutor.js +717 -0
  131. package/dist/core/SafeGitExecutor.js.map +1 -0
  132. package/dist/core/ScopeVerifier.d.ts.map +1 -1
  133. package/dist/core/ScopeVerifier.js +3 -5
  134. package/dist/core/ScopeVerifier.js.map +1 -1
  135. package/dist/core/SecretStore.d.ts.map +1 -1
  136. package/dist/core/SecretStore.js +2 -1
  137. package/dist/core/SecretStore.js.map +1 -1
  138. package/dist/core/SharedStateLedger.d.ts.map +1 -1
  139. package/dist/core/SharedStateLedger.js +2 -1
  140. package/dist/core/SharedStateLedger.js.map +1 -1
  141. package/dist/core/SoulManager.d.ts.map +1 -1
  142. package/dist/core/SoulManager.js +3 -2
  143. package/dist/core/SoulManager.js.map +1 -1
  144. package/dist/core/StateManager.d.ts.map +1 -1
  145. package/dist/core/StateManager.js +4 -3
  146. package/dist/core/StateManager.js.map +1 -1
  147. package/dist/core/SyncOrchestrator.d.ts.map +1 -1
  148. package/dist/core/SyncOrchestrator.js +6 -4
  149. package/dist/core/SyncOrchestrator.js.map +1 -1
  150. package/dist/core/UpdateChecker.d.ts.map +1 -1
  151. package/dist/core/UpdateChecker.js +3 -2
  152. package/dist/core/UpdateChecker.js.map +1 -1
  153. package/dist/core/UpgradeGuideProcessor.d.ts.map +1 -1
  154. package/dist/core/UpgradeGuideProcessor.js +3 -2
  155. package/dist/core/UpgradeGuideProcessor.js.map +1 -1
  156. package/dist/core/WorktreeManager.d.ts.map +1 -1
  157. package/dist/core/WorktreeManager.js +9 -7
  158. package/dist/core/WorktreeManager.js.map +1 -1
  159. package/dist/knowledge/KnowledgeManager.d.ts.map +1 -1
  160. package/dist/knowledge/KnowledgeManager.js +2 -1
  161. package/dist/knowledge/KnowledgeManager.js.map +1 -1
  162. package/dist/lifeline/ServerSupervisor.d.ts +28 -0
  163. package/dist/lifeline/ServerSupervisor.d.ts.map +1 -1
  164. package/dist/lifeline/ServerSupervisor.js +171 -59
  165. package/dist/lifeline/ServerSupervisor.js.map +1 -1
  166. package/dist/lifeline/TelegramLifeline.d.ts.map +1 -1
  167. package/dist/lifeline/TelegramLifeline.js +10 -3
  168. package/dist/lifeline/TelegramLifeline.js.map +1 -1
  169. package/dist/lifeline/detectLaunchdSupervised.d.ts +43 -0
  170. package/dist/lifeline/detectLaunchdSupervised.d.ts.map +1 -0
  171. package/dist/lifeline/detectLaunchdSupervised.js +106 -0
  172. package/dist/lifeline/detectLaunchdSupervised.js.map +1 -0
  173. package/dist/lifeline/droppedMessages.d.ts.map +1 -1
  174. package/dist/lifeline/droppedMessages.js +2 -1
  175. package/dist/lifeline/droppedMessages.js.map +1 -1
  176. package/dist/memory/EpisodicMemory.d.ts.map +1 -1
  177. package/dist/memory/EpisodicMemory.js +2 -1
  178. package/dist/memory/EpisodicMemory.js.map +1 -1
  179. package/dist/memory/TopicMemory.d.ts.map +1 -1
  180. package/dist/memory/TopicMemory.js +5 -4
  181. package/dist/memory/TopicMemory.js.map +1 -1
  182. package/dist/messaging/AgentTokenManager.d.ts.map +1 -1
  183. package/dist/messaging/AgentTokenManager.js +2 -1
  184. package/dist/messaging/AgentTokenManager.js.map +1 -1
  185. package/dist/messaging/DropPickup.d.ts.map +1 -1
  186. package/dist/messaging/DropPickup.js +2 -1
  187. package/dist/messaging/DropPickup.js.map +1 -1
  188. package/dist/messaging/GitSyncTransport.d.ts.map +1 -1
  189. package/dist/messaging/GitSyncTransport.js +4 -3
  190. package/dist/messaging/GitSyncTransport.js.map +1 -1
  191. package/dist/messaging/MessageStore.d.ts.map +1 -1
  192. package/dist/messaging/MessageStore.js +3 -2
  193. package/dist/messaging/MessageStore.js.map +1 -1
  194. package/dist/messaging/TelegramAdapter.d.ts.map +1 -1
  195. package/dist/messaging/TelegramAdapter.js +5 -4
  196. package/dist/messaging/TelegramAdapter.js.map +1 -1
  197. package/dist/messaging/backends/BaileysBackend.d.ts.map +1 -1
  198. package/dist/messaging/backends/BaileysBackend.js +3 -2
  199. package/dist/messaging/backends/BaileysBackend.js.map +1 -1
  200. package/dist/messaging/local-tone-check.d.ts +61 -0
  201. package/dist/messaging/local-tone-check.d.ts.map +1 -0
  202. package/dist/messaging/local-tone-check.js +78 -0
  203. package/dist/messaging/local-tone-check.js.map +1 -0
  204. package/dist/messaging/pending-relay-store.d.ts +153 -0
  205. package/dist/messaging/pending-relay-store.d.ts.map +1 -0
  206. package/dist/messaging/pending-relay-store.js +351 -0
  207. package/dist/messaging/pending-relay-store.js.map +1 -0
  208. package/dist/messaging/secret-patterns.d.ts +35 -0
  209. package/dist/messaging/secret-patterns.d.ts.map +1 -0
  210. package/dist/messaging/secret-patterns.js +70 -0
  211. package/dist/messaging/secret-patterns.js.map +1 -0
  212. package/dist/messaging/shared/EncryptedAuthStore.d.ts.map +1 -1
  213. package/dist/messaging/shared/EncryptedAuthStore.js +3 -2
  214. package/dist/messaging/shared/EncryptedAuthStore.js.map +1 -1
  215. package/dist/messaging/shared/MessageLogger.d.ts.map +1 -1
  216. package/dist/messaging/shared/MessageLogger.js +2 -1
  217. package/dist/messaging/shared/MessageLogger.js.map +1 -1
  218. package/dist/messaging/shared/PrivacyConsent.d.ts.map +1 -1
  219. package/dist/messaging/shared/PrivacyConsent.js +2 -1
  220. package/dist/messaging/shared/PrivacyConsent.js.map +1 -1
  221. package/dist/messaging/shared/SessionChannelRegistry.d.ts.map +1 -1
  222. package/dist/messaging/shared/SessionChannelRegistry.js +2 -1
  223. package/dist/messaging/shared/SessionChannelRegistry.js.map +1 -1
  224. package/dist/messaging/system-templates.d.ts +87 -0
  225. package/dist/messaging/system-templates.d.ts.map +1 -0
  226. package/dist/messaging/system-templates.js +236 -0
  227. package/dist/messaging/system-templates.js.map +1 -0
  228. package/dist/messaging/whoami-cache.d.ts +66 -0
  229. package/dist/messaging/whoami-cache.d.ts.map +1 -0
  230. package/dist/messaging/whoami-cache.js +149 -0
  231. package/dist/messaging/whoami-cache.js.map +1 -0
  232. package/dist/moltbridge/ProfileCompiler.d.ts.map +1 -1
  233. package/dist/moltbridge/ProfileCompiler.js +13 -4
  234. package/dist/moltbridge/ProfileCompiler.js.map +1 -1
  235. package/dist/monitoring/CommitmentTracker.d.ts.map +1 -1
  236. package/dist/monitoring/CommitmentTracker.js +2 -1
  237. package/dist/monitoring/CommitmentTracker.js.map +1 -1
  238. package/dist/monitoring/CredentialProvider.d.ts.map +1 -1
  239. package/dist/monitoring/CredentialProvider.js +2 -1
  240. package/dist/monitoring/CredentialProvider.js.map +1 -1
  241. package/dist/monitoring/DegradationReporter.d.ts +41 -0
  242. package/dist/monitoring/DegradationReporter.d.ts.map +1 -1
  243. package/dist/monitoring/DegradationReporter.js +96 -4
  244. package/dist/monitoring/DegradationReporter.js.map +1 -1
  245. package/dist/monitoring/HealthChecker.d.ts.map +1 -1
  246. package/dist/monitoring/HealthChecker.js +2 -1
  247. package/dist/monitoring/HealthChecker.js.map +1 -1
  248. package/dist/monitoring/HookEventReceiver.d.ts.map +1 -1
  249. package/dist/monitoring/HookEventReceiver.js +2 -1
  250. package/dist/monitoring/HookEventReceiver.js.map +1 -1
  251. package/dist/monitoring/InstructionsVerifier.d.ts.map +1 -1
  252. package/dist/monitoring/InstructionsVerifier.js +2 -1
  253. package/dist/monitoring/InstructionsVerifier.js.map +1 -1
  254. package/dist/monitoring/PresenceProxy.d.ts.map +1 -1
  255. package/dist/monitoring/PresenceProxy.js +5 -4
  256. package/dist/monitoring/PresenceProxy.js.map +1 -1
  257. package/dist/monitoring/QuotaTracker.d.ts.map +1 -1
  258. package/dist/monitoring/QuotaTracker.js +2 -1
  259. package/dist/monitoring/QuotaTracker.js.map +1 -1
  260. package/dist/monitoring/SessionMigrator.d.ts.map +1 -1
  261. package/dist/monitoring/SessionMigrator.js +2 -1
  262. package/dist/monitoring/SessionMigrator.js.map +1 -1
  263. package/dist/monitoring/SessionRecovery.d.ts.map +1 -1
  264. package/dist/monitoring/SessionRecovery.js +2 -1
  265. package/dist/monitoring/SessionRecovery.js.map +1 -1
  266. package/dist/monitoring/TelemetryAuth.d.ts.map +1 -1
  267. package/dist/monitoring/TelemetryAuth.js +3 -2
  268. package/dist/monitoring/TelemetryAuth.js.map +1 -1
  269. package/dist/monitoring/TokenLedger.d.ts +91 -0
  270. package/dist/monitoring/TokenLedger.d.ts.map +1 -0
  271. package/dist/monitoring/TokenLedger.js +426 -0
  272. package/dist/monitoring/TokenLedger.js.map +1 -0
  273. package/dist/monitoring/TokenLedgerPoller.d.ts +26 -0
  274. package/dist/monitoring/TokenLedgerPoller.d.ts.map +1 -0
  275. package/dist/monitoring/TokenLedgerPoller.js +44 -0
  276. package/dist/monitoring/TokenLedgerPoller.js.map +1 -0
  277. package/dist/monitoring/TriageOrchestrator.d.ts.map +1 -1
  278. package/dist/monitoring/TriageOrchestrator.js +3 -2
  279. package/dist/monitoring/TriageOrchestrator.js.map +1 -1
  280. package/dist/monitoring/WorktreeReaper.d.ts.map +1 -1
  281. package/dist/monitoring/WorktreeReaper.js +5 -4
  282. package/dist/monitoring/WorktreeReaper.js.map +1 -1
  283. package/dist/monitoring/delivery-failure-sentinel/recovery-policy.d.ts +83 -0
  284. package/dist/monitoring/delivery-failure-sentinel/recovery-policy.d.ts.map +1 -0
  285. package/dist/monitoring/delivery-failure-sentinel/recovery-policy.js +218 -0
  286. package/dist/monitoring/delivery-failure-sentinel/recovery-policy.js.map +1 -0
  287. package/dist/monitoring/delivery-failure-sentinel.d.ts +177 -0
  288. package/dist/monitoring/delivery-failure-sentinel.d.ts.map +1 -0
  289. package/dist/monitoring/delivery-failure-sentinel.js +598 -0
  290. package/dist/monitoring/delivery-failure-sentinel.js.map +1 -0
  291. package/dist/monitoring/probes/PlatformProbe.d.ts.map +1 -1
  292. package/dist/monitoring/probes/PlatformProbe.js +3 -2
  293. package/dist/monitoring/probes/PlatformProbe.js.map +1 -1
  294. package/dist/monitoring/templates-drift-verifier.d.ts +109 -0
  295. package/dist/monitoring/templates-drift-verifier.d.ts.map +1 -0
  296. package/dist/monitoring/templates-drift-verifier.js +324 -0
  297. package/dist/monitoring/templates-drift-verifier.js.map +1 -0
  298. package/dist/paste/PasteManager.d.ts.map +1 -1
  299. package/dist/paste/PasteManager.js +5 -4
  300. package/dist/paste/PasteManager.js.map +1 -1
  301. package/dist/publishing/PrivateViewer.d.ts.map +1 -1
  302. package/dist/publishing/PrivateViewer.js +2 -1
  303. package/dist/publishing/PrivateViewer.js.map +1 -1
  304. package/dist/scheduler/JobScheduler.d.ts.map +1 -1
  305. package/dist/scheduler/JobScheduler.js +2 -1
  306. package/dist/scheduler/JobScheduler.js.map +1 -1
  307. package/dist/server/AgentServer.d.ts +18 -0
  308. package/dist/server/AgentServer.d.ts.map +1 -1
  309. package/dist/server/AgentServer.js +186 -1
  310. package/dist/server/AgentServer.js.map +1 -1
  311. package/dist/server/WebSocketManager.d.ts +11 -0
  312. package/dist/server/WebSocketManager.d.ts.map +1 -1
  313. package/dist/server/WebSocketManager.js +28 -0
  314. package/dist/server/WebSocketManager.js.map +1 -1
  315. package/dist/server/boot-id.d.ts +58 -0
  316. package/dist/server/boot-id.d.ts.map +1 -0
  317. package/dist/server/boot-id.js +121 -0
  318. package/dist/server/boot-id.js.map +1 -0
  319. package/dist/server/middleware.d.ts +14 -1
  320. package/dist/server/middleware.d.ts.map +1 -1
  321. package/dist/server/middleware.js +81 -1
  322. package/dist/server/middleware.js.map +1 -1
  323. package/dist/server/routes.d.ts +69 -0
  324. package/dist/server/routes.d.ts.map +1 -1
  325. package/dist/server/routes.js +545 -16
  326. package/dist/server/routes.js.map +1 -1
  327. package/dist/threadline/AgentDiscovery.d.ts.map +1 -1
  328. package/dist/threadline/AgentDiscovery.js +2 -1
  329. package/dist/threadline/AgentDiscovery.js.map +1 -1
  330. package/dist/threadline/AgentTrustManager.d.ts.map +1 -1
  331. package/dist/threadline/AgentTrustManager.js +2 -1
  332. package/dist/threadline/AgentTrustManager.js.map +1 -1
  333. package/dist/threadline/CircuitBreaker.d.ts.map +1 -1
  334. package/dist/threadline/CircuitBreaker.js +2 -1
  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 -1
  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 -1
  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 -1
  352. package/dist/threadline/InvitationManager.js.map +1 -1
  353. package/dist/threadline/ListenerSessionManager.d.ts +24 -0
  354. package/dist/threadline/ListenerSessionManager.d.ts.map +1 -1
  355. package/dist/threadline/ListenerSessionManager.js +38 -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 -1
  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 -2
  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 -1
  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 -1
  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/TelegramBridgeConfig.d.ts +79 -0
  382. package/dist/threadline/TelegramBridgeConfig.d.ts.map +1 -0
  383. package/dist/threadline/TelegramBridgeConfig.js +168 -0
  384. package/dist/threadline/TelegramBridgeConfig.js.map +1 -0
  385. package/dist/threadline/ThreadlineBootstrap.d.ts.map +1 -1
  386. package/dist/threadline/ThreadlineBootstrap.js +2 -1
  387. package/dist/threadline/ThreadlineBootstrap.js.map +1 -1
  388. package/dist/threadline/WakeSocketServer.d.ts.map +1 -1
  389. package/dist/threadline/WakeSocketServer.js +3 -2
  390. package/dist/threadline/WakeSocketServer.js.map +1 -1
  391. package/dist/threadline/listener-daemon.d.ts.map +1 -1
  392. package/dist/threadline/listener-daemon.js +3 -2
  393. package/dist/threadline/listener-daemon.js.map +1 -1
  394. package/dist/users/UserManager.d.ts.map +1 -1
  395. package/dist/users/UserManager.js +2 -1
  396. package/dist/users/UserManager.js.map +1 -1
  397. package/dist/users/UserOnboarding.d.ts.map +1 -1
  398. package/dist/users/UserOnboarding.js +2 -1
  399. package/dist/users/UserOnboarding.js.map +1 -1
  400. package/dist/utils/jsonl-rotation.d.ts.map +1 -1
  401. package/dist/utils/jsonl-rotation.js +2 -1
  402. package/dist/utils/jsonl-rotation.js.map +1 -1
  403. package/package.json +4 -2
  404. package/scripts/add-migration-marker.js +121 -0
  405. package/scripts/analyze-release.js +7 -6
  406. package/scripts/check-contract-evidence.js +27 -8
  407. package/scripts/destructive-command-shim.js +1 -0
  408. package/scripts/generate-builtin-manifest.cjs +1 -0
  409. package/scripts/lint-no-direct-destructive.js +617 -0
  410. package/scripts/lint-template-sha-history.ts +183 -0
  411. package/scripts/migrate-incident-2026-04-17.mjs +2 -1
  412. package/scripts/pre-push-gate.js +24 -0
  413. package/scripts/run-migration.js +500 -0
  414. package/scripts/test-bootstrap-relay.mjs +2 -1
  415. package/scripts/verify-deployed-templates.ts +87 -0
  416. package/scripts/worktree-commit-msg-hook.js +4 -0
  417. package/scripts/worktree-precommit-gate.js +1 -0
  418. package/src/data/builtin-manifest.json +139 -131
  419. package/src/templates/scripts/telegram-reply.sh +318 -13
  420. package/upgrades/0.28.76.md +67 -0
  421. package/upgrades/0.28.77.md +133 -0
  422. package/upgrades/side-effects/0.28.76.md +76 -0
  423. package/upgrades/side-effects/agent-health-alert-authority-routing.md +121 -0
  424. package/upgrades/side-effects/comprehensive-destructive-tool-containment-foundation.md +74 -0
  425. package/upgrades/side-effects/comprehensive-destructive-tool-containment-migration.md +82 -0
  426. package/upgrades/side-effects/deferral-detector-orphan-todo.md +101 -0
  427. package/upgrades/side-effects/lifeline-self-heal-hardening.md +151 -0
  428. package/upgrades/side-effects/relay-spawn-ghost-reply-phase1.md +139 -0
  429. package/upgrades/side-effects/telegram-delivery-robustness-layer-2.md +320 -0
  430. package/upgrades/side-effects/telegram-delivery-robustness-layer-3.md +202 -0
  431. package/upgrades/side-effects/telegram-delivery-robustness-layer-7.md +339 -0
  432. package/upgrades/side-effects/telegram-delivery-robustness.md +178 -0
  433. package/upgrades/side-effects/threadline-canonical-inbox-write.md +218 -0
  434. package/upgrades/side-effects/threadline-tg-bridge-settings-surface.md +208 -0
  435. package/upgrades/side-effects/token-ledger-phase1.md +123 -0
  436. package/upgrades/NEXT.md +0 -53
@@ -2418,6 +2418,8 @@
2418
2418
  <button class="tab" data-tab="pr-pipeline" onclick="switchTab('pr-pipeline')">PR Pipeline</button>
2419
2419
  <button class="tab" data-tab="initiatives" onclick="switchTab('initiatives')">Initiatives <span class="tab-count" id="tabInitiativeCount">0</span></button>
2420
2420
  <button class="tab" data-tab="commitments" onclick="switchTab('commitments')">Commitments <span class="tab-count" id="tabCommitmentCount">0</span></button>
2421
+ <button class="tab" data-tab="tokens" onclick="switchTab('tokens')">Tokens</button>
2422
+ <button class="tab" data-tab="threadline" onclick="switchTab('threadline')">Threadline</button>
2421
2423
  </nav>
2422
2424
  </div>
2423
2425
  <div class="vital-signs" id="vitalSigns">
@@ -2846,6 +2848,110 @@
2846
2848
  <div id="commitmentsList" style="display:flex;flex-direction:column;gap:12px"></div>
2847
2849
  </div>
2848
2850
 
2851
+ <!-- Tokens Tab — read-only token-usage observability -->
2852
+ <div id="tokensPanel" style="display:none;flex-direction:column;padding:20px;gap:16px;overflow-y:auto">
2853
+ <div style="display:flex;justify-content:space-between;align-items:center">
2854
+ <h2 style="margin:0">Tokens</h2>
2855
+ <button onclick="loadTokens()" style="padding:6px 12px">Refresh</button>
2856
+ </div>
2857
+ <div style="font-size:12px;color:var(--text-dim);line-height:1.4">
2858
+ Token usage rolled up from Claude Code session transcripts. Last 24 hours unless noted.
2859
+ </div>
2860
+
2861
+ <!-- Summary card -->
2862
+ <div id="tokensSummaryCard" style="border:1px solid var(--border);border-radius:8px;padding:16px;display:flex;flex-direction:column;gap:8px">
2863
+ <div style="font-weight:600">Last 24h</div>
2864
+ <div id="tokensSummaryBody" style="display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:12px;font-size:13px">
2865
+ <div style="color:var(--text-dim)">Loading...</div>
2866
+ </div>
2867
+ </div>
2868
+
2869
+ <!-- Top sessions -->
2870
+ <div style="border:1px solid var(--border);border-radius:8px;padding:16px;display:flex;flex-direction:column;gap:8px">
2871
+ <div style="font-weight:600">Top Sessions</div>
2872
+ <div id="tokensSessionsBody" style="font-size:13px">
2873
+ <div style="color:var(--text-dim)">Loading...</div>
2874
+ </div>
2875
+ </div>
2876
+
2877
+ <!-- Orphans -->
2878
+ <div style="border:1px solid var(--border);border-radius:8px;padding:16px;display:flex;flex-direction:column;gap:8px">
2879
+ <div style="font-weight:600">Idle Sessions (&gt; 30 min)</div>
2880
+ <div id="tokensOrphansBody" style="font-size:13px">
2881
+ <div style="color:var(--text-dim)">Loading...</div>
2882
+ </div>
2883
+ </div>
2884
+ </div>
2885
+
2886
+ <!-- Threadline Tab — agent-to-agent conversations + Telegram bridge settings -->
2887
+ <div id="threadlineTab" style="display:none;flex-direction:column;padding:20px;gap:16px;overflow-y:auto">
2888
+ <div style="display:flex;justify-content:space-between;align-items:center">
2889
+ <h2 style="margin:0">Threadline</h2>
2890
+ <button onclick="loadThreadlineBridgeConfig()" style="padding:6px 12px">Refresh</button>
2891
+ </div>
2892
+ <div style="font-size:12px;color:var(--text-dim);line-height:1.4">
2893
+ Threadline is your agent's secure channel to other AI agents. The Telegram bridge mirrors those conversations into per-thread Telegram topics so you can watch every exchange. Quiet by default — flip the master switch below to opt in.
2894
+ </div>
2895
+
2896
+ <!-- Bridge settings card -->
2897
+ <div id="tlBridgeCard" style="border:1px solid var(--border);border-radius:8px;padding:16px;display:flex;flex-direction:column;gap:14px">
2898
+ <div style="font-weight:600">Telegram bridge settings</div>
2899
+ <div id="tlBridgeStatus" style="font-size:12px;color:var(--text-dim)">Loading…</div>
2900
+
2901
+ <label style="display:flex;align-items:flex-start;gap:10px;font-size:13px">
2902
+ <input type="checkbox" id="tlBridgeEnabled" style="margin-top:3px" />
2903
+ <span>
2904
+ <strong>Bridge enabled (master switch)</strong>
2905
+ <div style="color:var(--text-dim);font-size:12px;margin-top:2px">When off, no threadline traffic reaches Telegram, regardless of the toggles below.</div>
2906
+ </span>
2907
+ </label>
2908
+
2909
+ <label style="display:flex;align-items:flex-start;gap:10px;font-size:13px">
2910
+ <input type="checkbox" id="tlBridgeAutoCreate" style="margin-top:3px" />
2911
+ <span>
2912
+ <strong>Auto-create Telegram topics for new threads</strong>
2913
+ <div style="color:var(--text-dim);font-size:12px;margin-top:2px">Default off. When off, a brand-new agent reaching out won't spawn a Telegram topic unless you've allow-listed them below.</div>
2914
+ </span>
2915
+ </label>
2916
+
2917
+ <label style="display:flex;align-items:flex-start;gap:10px;font-size:13px">
2918
+ <input type="checkbox" id="tlBridgeMirrorExisting" style="margin-top:3px" />
2919
+ <span>
2920
+ <strong>Mirror messages into existing topics</strong>
2921
+ <div style="color:var(--text-dim);font-size:12px;margin-top:2px">Default on. Once a Telegram topic exists for a thread, both inbound and outbound messages on that thread show up there.</div>
2922
+ </span>
2923
+ </label>
2924
+
2925
+ <div style="display:grid;grid-template-columns:1fr 1fr;gap:14px">
2926
+ <div>
2927
+ <div style="font-weight:600;font-size:13px;margin-bottom:6px">Allow-list</div>
2928
+ <div style="font-size:11px;color:var(--text-dim);margin-bottom:6px">Always auto-create topics for these remote agents (overrides "auto-create off").</div>
2929
+ <ul id="tlBridgeAllowList" style="list-style:none;padding:0;margin:0;font-size:13px;display:flex;flex-direction:column;gap:4px"></ul>
2930
+ <div style="display:flex;gap:6px;margin-top:8px">
2931
+ <input type="text" id="tlBridgeAllowInput" placeholder="agent fingerprint or name" style="flex:1;padding:6px 8px;font-size:12px" />
2932
+ <button onclick="tlBridgeAddListEntry('allowList', 'tlBridgeAllowInput')" style="padding:6px 10px;font-size:12px">Add</button>
2933
+ </div>
2934
+ </div>
2935
+ <div>
2936
+ <div style="font-weight:600;font-size:13px;margin-bottom:6px">Deny-list</div>
2937
+ <div style="font-size:11px;color:var(--text-dim);margin-bottom:6px">Never auto-create topics for these remote agents (overrides "auto-create on").</div>
2938
+ <ul id="tlBridgeDenyList" style="list-style:none;padding:0;margin:0;font-size:13px;display:flex;flex-direction:column;gap:4px"></ul>
2939
+ <div style="display:flex;gap:6px;margin-top:8px">
2940
+ <input type="text" id="tlBridgeDenyInput" placeholder="agent fingerprint or name" style="flex:1;padding:6px 8px;font-size:12px" />
2941
+ <button onclick="tlBridgeAddListEntry('denyList', 'tlBridgeDenyInput')" style="padding:6px 10px;font-size:12px">Add</button>
2942
+ </div>
2943
+ </div>
2944
+ </div>
2945
+
2946
+ <div id="tlBridgeError" style="color:var(--err, #c44);font-size:12px;display:none"></div>
2947
+ </div>
2948
+
2949
+ <!-- Future home of the conversation observability view (deliverable 4) -->
2950
+ <div style="border:1px dashed var(--border);border-radius:8px;padding:16px;font-size:12px;color:var(--text-dim);line-height:1.5">
2951
+ The conversation observability view — threads list, color-coded message stream, latency metrics, FTS search — lands here in a follow-up. The settings above ship now so the bridge stays quiet by default once it goes live.
2952
+ </div>
2953
+ </div>
2954
+
2849
2955
  <!-- Health Tab (was Systems) -->
2850
2956
  <div class="systems-container" id="systemsTab" style="display:none">
2851
2957
  <div class="systems-main">
@@ -3892,6 +3998,18 @@
3892
3998
  display: ['flex'],
3893
3999
  onActivate: () => { if (typeof loadCommitments === 'function') loadCommitments(); },
3894
4000
  },
4001
+ {
4002
+ id: 'tokens',
4003
+ panels: ['tokensPanel'],
4004
+ display: ['flex'],
4005
+ onActivate: () => { if (typeof loadTokens === 'function') loadTokens(); },
4006
+ },
4007
+ {
4008
+ id: 'threadline',
4009
+ panels: ['threadlineTab'],
4010
+ display: ['flex'],
4011
+ onActivate: () => { if (typeof loadThreadlineBridgeConfig === 'function') loadThreadlineBridgeConfig(); },
4012
+ },
3895
4013
  {
3896
4014
  id: 'secrets',
3897
4015
  panels: ['secretsPanel'],
@@ -3997,6 +4115,194 @@
3997
4115
  return resp.json();
3998
4116
  }
3999
4117
 
4118
+ // ── Tokens Tab ──────────────────────────────────────────────────
4119
+ function fmtTokens(n) {
4120
+ if (n == null) return '0';
4121
+ if (n >= 1e9) return (n / 1e9).toFixed(2) + 'B';
4122
+ if (n >= 1e6) return (n / 1e6).toFixed(2) + 'M';
4123
+ if (n >= 1e3) return (n / 1e3).toFixed(1) + 'k';
4124
+ return String(n);
4125
+ }
4126
+ function fmtRelTime(ts) {
4127
+ if (!ts) return '—';
4128
+ const diff = Date.now() - ts;
4129
+ const min = Math.floor(diff / 60000);
4130
+ if (min < 1) return 'just now';
4131
+ if (min < 60) return min + 'm ago';
4132
+ const hr = Math.floor(min / 60);
4133
+ if (hr < 24) return hr + 'h ago';
4134
+ return Math.floor(hr / 24) + 'd ago';
4135
+ }
4136
+ function escapeHtml(s) {
4137
+ return String(s ?? '').replace(/[&<>"']/g, c => ({ '&':'&amp;','<':'&lt;','>':'&gt;','"':'&quot;',"'":'&#39;' }[c]));
4138
+ }
4139
+ async function loadTokens() {
4140
+ const summaryEl = document.getElementById('tokensSummaryBody');
4141
+ const sessionsEl = document.getElementById('tokensSessionsBody');
4142
+ const orphansEl = document.getElementById('tokensOrphansBody');
4143
+ try {
4144
+ const [summaryResp, sessionsResp, orphansResp] = await Promise.all([
4145
+ apiFetch('/tokens/summary'),
4146
+ apiFetch('/tokens/sessions?limit=10'),
4147
+ apiFetch('/tokens/orphans?idleMs=' + (30 * 60 * 1000)),
4148
+ ]);
4149
+ const s = summaryResp.summary || {};
4150
+ summaryEl.innerHTML = `
4151
+ <div><div style="color:var(--text-dim)">Total tokens</div><div style="font-size:18px;font-weight:600">${fmtTokens(s.totalTokens)}</div></div>
4152
+ <div><div style="color:var(--text-dim)">Input</div><div>${fmtTokens(s.totalInput)}</div></div>
4153
+ <div><div style="color:var(--text-dim)">Output</div><div>${fmtTokens(s.totalOutput)}</div></div>
4154
+ <div><div style="color:var(--text-dim)">Cache read</div><div>${fmtTokens(s.totalCacheRead)}</div></div>
4155
+ <div><div style="color:var(--text-dim)">Cache create</div><div>${fmtTokens(s.totalCacheCreate)}</div></div>
4156
+ <div><div style="color:var(--text-dim)">Events</div><div>${fmtTokens(s.eventCount)}</div></div>
4157
+ <div><div style="color:var(--text-dim)">Sessions</div><div>${fmtTokens(s.sessionsActive)}</div></div>
4158
+ `;
4159
+
4160
+ const sessions = sessionsResp.sessions || [];
4161
+ if (sessions.length === 0) {
4162
+ sessionsEl.innerHTML = '<div style="color:var(--text-dim)">No sessions in window.</div>';
4163
+ } else {
4164
+ sessionsEl.innerHTML = `
4165
+ <table style="width:100%;border-collapse:collapse;font-size:13px">
4166
+ <thead><tr style="text-align:left;color:var(--text-dim)">
4167
+ <th style="padding:6px 8px">Session</th>
4168
+ <th style="padding:6px 8px">Project</th>
4169
+ <th style="padding:6px 8px;text-align:right">Tokens</th>
4170
+ <th style="padding:6px 8px;text-align:right">Events</th>
4171
+ <th style="padding:6px 8px">Last activity</th>
4172
+ </tr></thead>
4173
+ <tbody>
4174
+ ${sessions.map(r => `
4175
+ <tr style="border-top:1px solid var(--border)">
4176
+ <td style="padding:6px 8px;font-family:monospace">${escapeHtml((r.sessionId || '').slice(0, 8))}</td>
4177
+ <td style="padding:6px 8px">${escapeHtml(r.projectPath || '—')}</td>
4178
+ <td style="padding:6px 8px;text-align:right">${fmtTokens(r.totalTokens)}</td>
4179
+ <td style="padding:6px 8px;text-align:right">${fmtTokens(r.eventCount)}</td>
4180
+ <td style="padding:6px 8px">${fmtRelTime(r.lastTs)}</td>
4181
+ </tr>
4182
+ `).join('')}
4183
+ </tbody>
4184
+ </table>
4185
+ `;
4186
+ }
4187
+
4188
+ const orphans = orphansResp.orphans || [];
4189
+ if (orphans.length === 0) {
4190
+ orphansEl.innerHTML = '<div style="color:var(--text-dim)">No idle sessions.</div>';
4191
+ } else {
4192
+ orphansEl.innerHTML = orphans.map(o => `
4193
+ <div style="padding:6px 0;border-top:1px solid var(--border);display:flex;justify-content:space-between;font-family:monospace;font-size:12px">
4194
+ <span>${escapeHtml((o.sessionId || '').slice(0, 12))}</span>
4195
+ <span style="color:var(--text-dim)">${escapeHtml(o.projectPath || '—')}</span>
4196
+ <span>${fmtRelTime(o.lastTs)}</span>
4197
+ </div>
4198
+ `).join('');
4199
+ }
4200
+ } catch (err) {
4201
+ const msg = `<div style="color:var(--red)">Error: ${escapeHtml(err.message || String(err))}</div>`;
4202
+ summaryEl.innerHTML = msg;
4203
+ sessionsEl.innerHTML = '';
4204
+ orphansEl.innerHTML = '';
4205
+ }
4206
+ }
4207
+
4208
+ // ── Threadline → Telegram bridge settings ──────────────────
4209
+ let tlBridgeSettings = null;
4210
+ let tlBridgeWiring = false;
4211
+
4212
+ async function loadThreadlineBridgeConfig() {
4213
+ const statusEl = document.getElementById('tlBridgeStatus');
4214
+ const errEl = document.getElementById('tlBridgeError');
4215
+ if (errEl) { errEl.style.display = 'none'; errEl.textContent = ''; }
4216
+ try {
4217
+ const resp = await apiFetch('/threadline/telegram-bridge/config');
4218
+ tlBridgeSettings = resp;
4219
+ renderThreadlineBridgeConfig();
4220
+ if (statusEl) statusEl.textContent = `Bridge is ${resp.enabled ? 'ENABLED' : 'OFF'} · auto-create ${resp.autoCreateTopics ? 'on' : 'off'} · mirror existing ${resp.mirrorExisting ? 'on' : 'off'}.`;
4221
+ } catch (err) {
4222
+ if (statusEl) statusEl.textContent = '';
4223
+ if (errEl) { errEl.style.display = 'block'; errEl.textContent = `Could not load bridge config: ${err.message || String(err)}`; }
4224
+ }
4225
+ }
4226
+
4227
+ function renderThreadlineBridgeConfig() {
4228
+ if (!tlBridgeSettings) return;
4229
+ tlBridgeWiring = true;
4230
+ try {
4231
+ document.getElementById('tlBridgeEnabled').checked = !!tlBridgeSettings.enabled;
4232
+ document.getElementById('tlBridgeAutoCreate').checked = !!tlBridgeSettings.autoCreateTopics;
4233
+ document.getElementById('tlBridgeMirrorExisting').checked = !!tlBridgeSettings.mirrorExisting;
4234
+ renderTlBridgeListEntries('allowList', 'tlBridgeAllowList', tlBridgeSettings.allowList || []);
4235
+ renderTlBridgeListEntries('denyList', 'tlBridgeDenyList', tlBridgeSettings.denyList || []);
4236
+ } finally {
4237
+ tlBridgeWiring = false;
4238
+ }
4239
+ }
4240
+
4241
+ function renderTlBridgeListEntries(field, listElId, entries) {
4242
+ const ul = document.getElementById(listElId);
4243
+ if (!ul) return;
4244
+ if (entries.length === 0) {
4245
+ ul.innerHTML = '<li style="color:var(--text-dim);font-size:12px;font-style:italic">(empty)</li>';
4246
+ return;
4247
+ }
4248
+ ul.innerHTML = entries.map(e => `
4249
+ <li style="display:flex;justify-content:space-between;align-items:center;padding:4px 8px;border:1px solid var(--border);border-radius:4px;font-family:monospace;font-size:12px">
4250
+ <span>${escapeHtml(e)}</span>
4251
+ <button onclick="tlBridgeRemoveListEntry('${field}', ${JSON.stringify(e).replace(/'/g, "\\'")})" style="padding:2px 8px;font-size:11px">remove</button>
4252
+ </li>
4253
+ `).join('');
4254
+ }
4255
+
4256
+ async function tlBridgePatchConfig(patch) {
4257
+ const errEl = document.getElementById('tlBridgeError');
4258
+ if (errEl) { errEl.style.display = 'none'; errEl.textContent = ''; }
4259
+ try {
4260
+ const resp = await apiFetch('/threadline/telegram-bridge/config', {
4261
+ method: 'PATCH',
4262
+ headers: { 'Content-Type': 'application/json' },
4263
+ body: JSON.stringify(patch),
4264
+ });
4265
+ tlBridgeSettings = resp;
4266
+ renderThreadlineBridgeConfig();
4267
+ const statusEl = document.getElementById('tlBridgeStatus');
4268
+ if (statusEl) statusEl.textContent = `Saved · bridge is ${resp.enabled ? 'ENABLED' : 'OFF'}.`;
4269
+ } catch (err) {
4270
+ if (errEl) { errEl.style.display = 'block'; errEl.textContent = `Update failed: ${err.message || String(err)}`; }
4271
+ // Reload to roll back the optimistic UI
4272
+ loadThreadlineBridgeConfig();
4273
+ }
4274
+ }
4275
+
4276
+ function tlBridgeAddListEntry(field, inputId) {
4277
+ const input = document.getElementById(inputId);
4278
+ const val = (input?.value || '').trim();
4279
+ if (!val) return;
4280
+ const current = (tlBridgeSettings?.[field] || []).slice();
4281
+ if (!current.includes(val)) current.push(val);
4282
+ tlBridgePatchConfig({ [field]: current });
4283
+ if (input) input.value = '';
4284
+ }
4285
+
4286
+ function tlBridgeRemoveListEntry(field, entry) {
4287
+ const current = (tlBridgeSettings?.[field] || []).filter(x => x !== entry);
4288
+ tlBridgePatchConfig({ [field]: current });
4289
+ }
4290
+
4291
+ // Wire up toggle change-handlers once the panel exists
4292
+ document.addEventListener('DOMContentLoaded', () => {
4293
+ const wire = (id, field) => {
4294
+ const el = document.getElementById(id);
4295
+ if (!el) return;
4296
+ el.addEventListener('change', () => {
4297
+ if (tlBridgeWiring) return;
4298
+ tlBridgePatchConfig({ [field]: el.checked });
4299
+ });
4300
+ };
4301
+ wire('tlBridgeEnabled', 'enabled');
4302
+ wire('tlBridgeAutoCreate', 'autoCreateTopics');
4303
+ wire('tlBridgeMirrorExisting', 'mirrorExisting');
4304
+ });
4305
+
4000
4306
  async function loadFileTree() {
4001
4307
  fileTreeLoaded = true;
4002
4308
  const list = document.getElementById('fileTreeList');
package/dist/cli.js CHANGED
@@ -21,6 +21,7 @@ import fs from 'node:fs';
21
21
  import path from 'node:path';
22
22
  import { Command } from 'commander';
23
23
  import { initProject } from './commands/init.js';
24
+ import { SafeFsExecutor } from './core/SafeFsExecutor.js';
24
25
  // setup.ts is imported dynamically — it depends on @inquirer/prompts which requires Node 20.12+
25
26
  import { startServer, stopServer, restartServer } from './commands/server.js';
26
27
  import { showStatus } from './commands/status.js';
@@ -83,7 +84,7 @@ async function addTelegram(opts) {
83
84
  }
84
85
  catch (err) {
85
86
  try {
86
- fs.unlinkSync(tmpPath);
87
+ SafeFsExecutor.safeUnlinkSync(tmpPath, { operation: 'src/cli.ts:93' });
87
88
  }
88
89
  catch { /* ignore */ }
89
90
  throw err;
@@ -135,7 +136,7 @@ async function addSentry(opts) {
135
136
  }
136
137
  catch (err) {
137
138
  try {
138
- fs.unlinkSync(tmpPath);
139
+ SafeFsExecutor.safeUnlinkSync(tmpPath, { operation: 'src/cli.ts:148' });
139
140
  }
140
141
  catch { /* ignore */ }
141
142
  throw err;
@@ -195,7 +196,7 @@ async function addEmail(opts) {
195
196
  }
196
197
  catch (err) {
197
198
  try {
198
- fs.unlinkSync(tmpPath);
199
+ SafeFsExecutor.safeUnlinkSync(tmpPath, { operation: 'src/cli.ts:211' });
199
200
  }
200
201
  catch { /* ignore */ }
201
202
  throw err;
@@ -238,7 +239,7 @@ async function addQuota(opts) {
238
239
  }
239
240
  catch (err) {
240
241
  try {
241
- fs.unlinkSync(tmpPath);
242
+ SafeFsExecutor.safeUnlinkSync(tmpPath, { operation: 'src/cli.ts:257' });
242
243
  }
243
244
  catch { /* ignore */ }
244
245
  throw err;