tailii-host 0.1.1 → 0.3.0

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 (348) hide show
  1. package/README.md +27 -10
  2. package/dist/{broker.d.ts → approval/broker.d.ts} +9 -5
  3. package/dist/{broker.js → approval/broker.js} +42 -6
  4. package/dist/approval/broker.js.map +1 -0
  5. package/dist/{hook.d.ts → approval/hook.d.ts} +48 -7
  6. package/dist/{hook.js → approval/hook.js} +359 -50
  7. package/dist/approval/hook.js.map +1 -0
  8. package/dist/backend/herdr.d.ts +226 -0
  9. package/dist/backend/herdr.js +749 -0
  10. package/dist/backend/herdr.js.map +1 -0
  11. package/dist/backend/sessionBackend.d.ts +81 -0
  12. package/dist/backend/sessionBackend.js +114 -0
  13. package/dist/backend/sessionBackend.js.map +1 -0
  14. package/dist/backend/tmux.d.ts +125 -0
  15. package/dist/backend/tmux.js +392 -0
  16. package/dist/backend/tmux.js.map +1 -0
  17. package/dist/{chatTailController.d.ts → chat/chatTailController.d.ts} +29 -6
  18. package/dist/{chatTailController.js → chat/chatTailController.js} +94 -18
  19. package/dist/chat/chatTailController.js.map +1 -0
  20. package/dist/{imageService.d.ts → chat/imageService.d.ts} +12 -1
  21. package/dist/{imageService.js → chat/imageService.js} +39 -11
  22. package/dist/chat/imageService.js.map +1 -0
  23. package/dist/chat/remoteQuestionMonitor.d.ts +27 -0
  24. package/dist/chat/remoteQuestionMonitor.js +128 -0
  25. package/dist/chat/remoteQuestionMonitor.js.map +1 -0
  26. package/dist/chat/subagentTailer.d.ts +30 -0
  27. package/dist/chat/subagentTailer.js +704 -0
  28. package/dist/chat/subagentTailer.js.map +1 -0
  29. package/dist/chat/subagentTranscript.d.ts +20 -0
  30. package/dist/chat/subagentTranscript.js +273 -0
  31. package/dist/chat/subagentTranscript.js.map +1 -0
  32. package/dist/{transcriptTailer.d.ts → chat/transcriptTailer.d.ts} +12 -1
  33. package/dist/{transcriptTailer.js → chat/transcriptTailer.js} +183 -10
  34. package/dist/chat/transcriptTailer.js.map +1 -0
  35. package/dist/cli.js +15 -10
  36. package/dist/cli.js.map +1 -1
  37. package/dist/codex/codexAccountUsage.d.ts +22 -0
  38. package/dist/codex/codexAccountUsage.js +128 -0
  39. package/dist/codex/codexAccountUsage.js.map +1 -0
  40. package/dist/codex/codexAppServer.d.ts +166 -0
  41. package/dist/codex/codexAppServer.js +1297 -0
  42. package/dist/codex/codexAppServer.js.map +1 -0
  43. package/dist/codex/codexNativeTurnController.d.ts +153 -0
  44. package/dist/codex/codexNativeTurnController.js +673 -0
  45. package/dist/codex/codexNativeTurnController.js.map +1 -0
  46. package/dist/codex/codexRolloutTailer.d.ts +100 -0
  47. package/dist/codex/codexRolloutTailer.js +568 -0
  48. package/dist/codex/codexRolloutTailer.js.map +1 -0
  49. package/dist/{codexSessionStore.d.ts → codex/codexSessionStore.d.ts} +10 -2
  50. package/dist/{codexSessionStore.js → codex/codexSessionStore.js} +184 -15
  51. package/dist/codex/codexSessionStore.js.map +1 -0
  52. package/dist/codex/codexSubagentTracker.d.ts +21 -0
  53. package/dist/codex/codexSubagentTracker.js +281 -0
  54. package/dist/codex/codexSubagentTracker.js.map +1 -0
  55. package/dist/codex/codexToolActivity.d.ts +69 -0
  56. package/dist/codex/codexToolActivity.js +425 -0
  57. package/dist/codex/codexToolActivity.js.map +1 -0
  58. package/dist/{codexUsage.d.ts → codex/codexUsage.d.ts} +1 -1
  59. package/dist/{codexUsage.js → codex/codexUsage.js} +19 -26
  60. package/dist/codex/codexUsage.js.map +1 -0
  61. package/dist/commands/doctor.d.ts +65 -0
  62. package/dist/commands/doctor.js +425 -0
  63. package/dist/commands/doctor.js.map +1 -0
  64. package/dist/{hookSettings.d.ts → commands/hookSettings.d.ts} +14 -1
  65. package/dist/{hookSettings.js → commands/hookSettings.js} +96 -12
  66. package/dist/commands/hookSettings.js.map +1 -0
  67. package/dist/{kick.js → commands/kick.js} +16 -1
  68. package/dist/commands/kick.js.map +1 -0
  69. package/dist/{launch.d.ts → commands/launch.d.ts} +67 -5
  70. package/dist/commands/launch.js +716 -0
  71. package/dist/commands/launch.js.map +1 -0
  72. package/dist/commands/legacyHomeMigration.js.map +1 -0
  73. package/dist/{pairingCode.d.ts → commands/pairingCode.d.ts} +29 -2
  74. package/dist/{pairingCode.js → commands/pairingCode.js} +120 -11
  75. package/dist/commands/pairingCode.js.map +1 -0
  76. package/dist/{pushTokenCommand.d.ts → commands/pushTokenCommand.d.ts} +1 -1
  77. package/dist/{pushTokenCommand.js → commands/pushTokenCommand.js} +2 -2
  78. package/dist/commands/pushTokenCommand.js.map +1 -0
  79. package/dist/{setup.d.ts → commands/setup.d.ts} +17 -6
  80. package/dist/{setup.js → commands/setup.js} +133 -75
  81. package/dist/commands/setup.js.map +1 -0
  82. package/dist/engine/context.d.ts +145 -0
  83. package/dist/engine/context.js +184 -0
  84. package/dist/engine/context.js.map +1 -0
  85. package/dist/engine/engine.d.ts +121 -0
  86. package/dist/engine/engine.js +799 -0
  87. package/dist/engine/engine.js.map +1 -0
  88. package/dist/engine/handlers/accountUsage.d.ts +53 -0
  89. package/dist/engine/handlers/accountUsage.js +203 -0
  90. package/dist/engine/handlers/accountUsage.js.map +1 -0
  91. package/dist/engine/handlers/claudeModels.d.ts +2 -0
  92. package/dist/engine/handlers/claudeModels.js +23 -0
  93. package/dist/engine/handlers/claudeModels.js.map +1 -0
  94. package/dist/engine/handlers/codex.d.ts +2 -0
  95. package/dist/engine/handlers/codex.js +97 -0
  96. package/dist/engine/handlers/codex.js.map +1 -0
  97. package/dist/engine/handlers/conversation.d.ts +2 -0
  98. package/dist/engine/handlers/conversation.js +259 -0
  99. package/dist/engine/handlers/conversation.js.map +1 -0
  100. package/dist/engine/handlers/core.d.ts +2 -0
  101. package/dist/engine/handlers/core.js +66 -0
  102. package/dist/engine/handlers/core.js.map +1 -0
  103. package/dist/engine/handlers/git.d.ts +2 -0
  104. package/dist/engine/handlers/git.js +127 -0
  105. package/dist/engine/handlers/git.js.map +1 -0
  106. package/dist/engine/handlers/index.d.ts +2 -0
  107. package/dist/engine/handlers/index.js +32 -0
  108. package/dist/engine/handlers/index.js.map +1 -0
  109. package/dist/engine/handlers/mode.d.ts +2 -0
  110. package/dist/engine/handlers/mode.js +194 -0
  111. package/dist/engine/handlers/mode.js.map +1 -0
  112. package/dist/engine/handlers/officialApps.d.ts +2 -0
  113. package/dist/engine/handlers/officialApps.js +79 -0
  114. package/dist/engine/handlers/officialApps.js.map +1 -0
  115. package/dist/engine/handlers/preview.d.ts +2 -0
  116. package/dist/engine/handlers/preview.js +59 -0
  117. package/dist/engine/handlers/preview.js.map +1 -0
  118. package/dist/engine/handlers/session.d.ts +2 -0
  119. package/dist/engine/handlers/session.js +385 -0
  120. package/dist/engine/handlers/session.js.map +1 -0
  121. package/dist/engine/handlers/usage.d.ts +2 -0
  122. package/dist/engine/handlers/usage.js +96 -0
  123. package/dist/engine/handlers/usage.js.map +1 -0
  124. package/dist/engine/handlers/workspace.d.ts +2 -0
  125. package/dist/engine/handlers/workspace.js +110 -0
  126. package/dist/engine/handlers/workspace.js.map +1 -0
  127. package/dist/engine/slashCommands.d.ts +3 -0
  128. package/dist/engine/slashCommands.js +211 -0
  129. package/dist/engine/slashCommands.js.map +1 -0
  130. package/dist/hub/engineRelaySocket.d.ts +58 -0
  131. package/dist/hub/engineRelaySocket.js +161 -0
  132. package/dist/hub/engineRelaySocket.js.map +1 -0
  133. package/dist/hub/hubClient.d.ts +28 -0
  134. package/dist/hub/hubClient.js +187 -0
  135. package/dist/hub/hubClient.js.map +1 -0
  136. package/dist/hub/hubDaemon.d.ts +69 -0
  137. package/dist/hub/hubDaemon.js +466 -0
  138. package/dist/hub/hubDaemon.js.map +1 -0
  139. package/dist/hub/hubProtocol.d.ts +161 -0
  140. package/dist/hub/hubProtocol.js +379 -0
  141. package/dist/hub/hubProtocol.js.map +1 -0
  142. package/dist/hub/panePreviewPump.d.ts +65 -0
  143. package/dist/hub/panePreviewPump.js +187 -0
  144. package/dist/hub/panePreviewPump.js.map +1 -0
  145. package/dist/hub/questionInjection.d.ts +19 -0
  146. package/dist/hub/questionInjection.js +126 -0
  147. package/dist/hub/questionInjection.js.map +1 -0
  148. package/dist/hub/reaper.d.ts +74 -0
  149. package/dist/hub/reaper.js +333 -0
  150. package/dist/hub/reaper.js.map +1 -0
  151. package/dist/hub/sessionHub.d.ts +203 -0
  152. package/dist/hub/sessionHub.js +1862 -0
  153. package/dist/hub/sessionHub.js.map +1 -0
  154. package/dist/protocol/common.d.ts +18 -0
  155. package/dist/protocol/common.js +78 -0
  156. package/dist/protocol/common.js.map +1 -0
  157. package/dist/protocol/decode.d.ts +3 -0
  158. package/dist/protocol/decode.js +1036 -0
  159. package/dist/protocol/decode.js.map +1 -0
  160. package/dist/protocol/encode.d.ts +3 -0
  161. package/dist/protocol/encode.js +84 -0
  162. package/dist/protocol/encode.js.map +1 -0
  163. package/dist/protocol/messages.d.ts +1002 -0
  164. package/dist/protocol/messages.js +8 -0
  165. package/dist/protocol/messages.js.map +1 -0
  166. package/dist/protocol.d.ts +4 -329
  167. package/dist/protocol.js +13 -531
  168. package/dist/protocol.js.map +1 -1
  169. package/dist/push/apnsConfigStore.js.map +1 -0
  170. package/dist/push/apnsJwtProvider.js.map +1 -0
  171. package/dist/{apnsSender.js.map → push/apnsSender.js.map} +1 -1
  172. package/dist/{approvalPushNotifier.js → push/approvalPushNotifier.js} +1 -1
  173. package/dist/push/approvalPushNotifier.js.map +1 -0
  174. package/dist/push/deviceTokenStore.js.map +1 -0
  175. package/dist/{pushTypes.js → push/pushTypes.js} +1 -1
  176. package/dist/push/pushTypes.js.map +1 -0
  177. package/dist/push/sendLog.js.map +1 -0
  178. package/dist/services/accountIdentity.d.ts +44 -0
  179. package/dist/services/accountIdentity.js +184 -0
  180. package/dist/services/accountIdentity.js.map +1 -0
  181. package/dist/services/claudeCredentialRefresh.d.ts +30 -0
  182. package/dist/services/claudeCredentialRefresh.js +345 -0
  183. package/dist/services/claudeCredentialRefresh.js.map +1 -0
  184. package/dist/services/claudeModelCatalog.d.ts +21 -0
  185. package/dist/services/claudeModelCatalog.js +181 -0
  186. package/dist/services/claudeModelCatalog.js.map +1 -0
  187. package/dist/{dirLister.d.ts → services/dirLister.d.ts} +9 -4
  188. package/dist/services/dirLister.js +169 -0
  189. package/dist/services/dirLister.js.map +1 -0
  190. package/dist/services/fileService.d.ts +10 -0
  191. package/dist/services/fileService.js +123 -0
  192. package/dist/services/fileService.js.map +1 -0
  193. package/dist/services/gitService.d.ts +79 -0
  194. package/dist/services/gitService.js +648 -0
  195. package/dist/services/gitService.js.map +1 -0
  196. package/dist/services/hostVersions.d.ts +38 -0
  197. package/dist/services/hostVersions.js +120 -0
  198. package/dist/services/hostVersions.js.map +1 -0
  199. package/dist/services/officialApps.d.ts +148 -0
  200. package/dist/services/officialApps.js +1079 -0
  201. package/dist/services/officialApps.js.map +1 -0
  202. package/dist/services/planUsageFetcher.d.ts +119 -0
  203. package/dist/services/planUsageFetcher.js +357 -0
  204. package/dist/services/planUsageFetcher.js.map +1 -0
  205. package/dist/services/previewServer.d.ts +31 -0
  206. package/dist/services/previewServer.js +233 -0
  207. package/dist/services/previewServer.js.map +1 -0
  208. package/dist/services/quicGateway.d.ts +143 -0
  209. package/dist/services/quicGateway.js +292 -0
  210. package/dist/services/quicGateway.js.map +1 -0
  211. package/dist/services/serveService.d.ts +50 -0
  212. package/dist/services/serveService.js +302 -0
  213. package/dist/services/serveService.js.map +1 -0
  214. package/dist/services/usageAggregator.js.map +1 -0
  215. package/dist/sessions/claudeSessionStore.d.ts +80 -0
  216. package/dist/sessions/claudeSessionStore.js +477 -0
  217. package/dist/sessions/claudeSessionStore.js.map +1 -0
  218. package/dist/sessions/heartbeat.d.ts +24 -0
  219. package/dist/sessions/heartbeat.js +86 -0
  220. package/dist/sessions/heartbeat.js.map +1 -0
  221. package/dist/sessions/liveSessionJoin.d.ts +20 -0
  222. package/dist/sessions/liveSessionJoin.js +80 -0
  223. package/dist/sessions/liveSessionJoin.js.map +1 -0
  224. package/dist/sessions/sessionActivityProvider.d.ts +14 -0
  225. package/dist/sessions/sessionActivityProvider.js +57 -0
  226. package/dist/sessions/sessionActivityProvider.js.map +1 -0
  227. package/dist/{sessionListService.d.ts → sessions/sessionListService.d.ts} +3 -3
  228. package/dist/{sessionListService.js → sessions/sessionListService.js} +23 -6
  229. package/dist/sessions/sessionListService.js.map +1 -0
  230. package/dist/{sessionMetadataStore.d.ts → sessions/sessionMetadataStore.d.ts} +18 -0
  231. package/dist/{sessionMetadataStore.js → sessions/sessionMetadataStore.js} +36 -1
  232. package/dist/sessions/sessionMetadataStore.js.map +1 -0
  233. package/dist/{sessionSearch.d.ts → sessions/sessionSearch.d.ts} +1 -1
  234. package/dist/sessions/sessionSearch.js.map +1 -0
  235. package/dist/shared/hostDisplayName.d.ts +11 -0
  236. package/dist/shared/hostDisplayName.js +50 -0
  237. package/dist/shared/hostDisplayName.js.map +1 -0
  238. package/dist/{lineWriter.d.ts → shared/lineWriter.d.ts} +1 -1
  239. package/dist/{lineWriter.js → shared/lineWriter.js} +1 -1
  240. package/dist/shared/lineWriter.js.map +1 -0
  241. package/dist/{observationLog.js.map → shared/observationLog.js.map} +1 -1
  242. package/dist/{paths.d.ts → shared/paths.d.ts} +7 -0
  243. package/dist/{paths.js → shared/paths.js} +9 -0
  244. package/dist/shared/paths.js.map +1 -0
  245. package/dist/shared/permissionMode.d.ts +10 -0
  246. package/dist/shared/permissionMode.js +51 -0
  247. package/dist/shared/permissionMode.js.map +1 -0
  248. package/dist/shared/skillInjection.d.ts +9 -0
  249. package/dist/shared/skillInjection.js +16 -0
  250. package/dist/shared/skillInjection.js.map +1 -0
  251. package/dist/shared/sleep.js.map +1 -0
  252. package/dist/{socketPath.d.ts → shared/socketPath.d.ts} +4 -0
  253. package/dist/{socketPath.js → shared/socketPath.js} +22 -0
  254. package/dist/shared/socketPath.js.map +1 -0
  255. package/dist/shared/version.js.map +1 -0
  256. package/package.json +13 -7
  257. package/dist/apnsConfigStore.js.map +0 -1
  258. package/dist/apnsJwtProvider.js.map +0 -1
  259. package/dist/approvalPushNotifier.js.map +0 -1
  260. package/dist/broker.js.map +0 -1
  261. package/dist/chatTailController.js.map +0 -1
  262. package/dist/claudeSessionStore.d.ts +0 -15
  263. package/dist/claudeSessionStore.js +0 -201
  264. package/dist/claudeSessionStore.js.map +0 -1
  265. package/dist/codexRolloutTailer.d.ts +0 -56
  266. package/dist/codexRolloutTailer.js +0 -303
  267. package/dist/codexRolloutTailer.js.map +0 -1
  268. package/dist/codexSessionStore.js.map +0 -1
  269. package/dist/codexUsage.js.map +0 -1
  270. package/dist/deviceTokenStore.js.map +0 -1
  271. package/dist/dirLister.js +0 -98
  272. package/dist/dirLister.js.map +0 -1
  273. package/dist/doctor.d.ts +0 -36
  274. package/dist/doctor.js +0 -162
  275. package/dist/doctor.js.map +0 -1
  276. package/dist/engine.d.ts +0 -85
  277. package/dist/engine.js +0 -962
  278. package/dist/engine.js.map +0 -1
  279. package/dist/hook.js.map +0 -1
  280. package/dist/hookSettings.js.map +0 -1
  281. package/dist/idleReaper.d.ts +0 -13
  282. package/dist/idleReaper.js +0 -30
  283. package/dist/idleReaper.js.map +0 -1
  284. package/dist/imageService.js.map +0 -1
  285. package/dist/kick.js.map +0 -1
  286. package/dist/launch.js +0 -396
  287. package/dist/launch.js.map +0 -1
  288. package/dist/legacyHomeMigration.js.map +0 -1
  289. package/dist/lineWriter.js.map +0 -1
  290. package/dist/mdnsAdvertiser.d.ts +0 -46
  291. package/dist/mdnsAdvertiser.js +0 -268
  292. package/dist/mdnsAdvertiser.js.map +0 -1
  293. package/dist/pairingCode.js.map +0 -1
  294. package/dist/paths.js.map +0 -1
  295. package/dist/permissionMode.d.ts +0 -8
  296. package/dist/permissionMode.js +0 -32
  297. package/dist/permissionMode.js.map +0 -1
  298. package/dist/planUsageFetcher.d.ts +0 -35
  299. package/dist/planUsageFetcher.js +0 -172
  300. package/dist/planUsageFetcher.js.map +0 -1
  301. package/dist/pushTokenCommand.js.map +0 -1
  302. package/dist/pushTypes.js.map +0 -1
  303. package/dist/sendLog.js.map +0 -1
  304. package/dist/sessionActivityProvider.d.ts +0 -7
  305. package/dist/sessionActivityProvider.js +0 -44
  306. package/dist/sessionActivityProvider.js.map +0 -1
  307. package/dist/sessionIdleTracker.d.ts +0 -19
  308. package/dist/sessionIdleTracker.js +0 -42
  309. package/dist/sessionIdleTracker.js.map +0 -1
  310. package/dist/sessionListService.js.map +0 -1
  311. package/dist/sessionMetadataStore.js.map +0 -1
  312. package/dist/sessionSearch.js.map +0 -1
  313. package/dist/setup.js.map +0 -1
  314. package/dist/sleep.js.map +0 -1
  315. package/dist/socketPath.js.map +0 -1
  316. package/dist/subagentTailer.d.ts +0 -15
  317. package/dist/subagentTailer.js +0 -399
  318. package/dist/subagentTailer.js.map +0 -1
  319. package/dist/tmux.d.ts +0 -62
  320. package/dist/tmux.js +0 -163
  321. package/dist/tmux.js.map +0 -1
  322. package/dist/transcriptTailer.js.map +0 -1
  323. package/dist/usageAggregator.js.map +0 -1
  324. package/dist/version.js.map +0 -1
  325. /package/dist/{kick.d.ts → commands/kick.d.ts} +0 -0
  326. /package/dist/{legacyHomeMigration.d.ts → commands/legacyHomeMigration.d.ts} +0 -0
  327. /package/dist/{legacyHomeMigration.js → commands/legacyHomeMigration.js} +0 -0
  328. /package/dist/{apnsConfigStore.d.ts → push/apnsConfigStore.d.ts} +0 -0
  329. /package/dist/{apnsConfigStore.js → push/apnsConfigStore.js} +0 -0
  330. /package/dist/{apnsJwtProvider.d.ts → push/apnsJwtProvider.d.ts} +0 -0
  331. /package/dist/{apnsJwtProvider.js → push/apnsJwtProvider.js} +0 -0
  332. /package/dist/{apnsSender.d.ts → push/apnsSender.d.ts} +0 -0
  333. /package/dist/{apnsSender.js → push/apnsSender.js} +0 -0
  334. /package/dist/{approvalPushNotifier.d.ts → push/approvalPushNotifier.d.ts} +0 -0
  335. /package/dist/{deviceTokenStore.d.ts → push/deviceTokenStore.d.ts} +0 -0
  336. /package/dist/{deviceTokenStore.js → push/deviceTokenStore.js} +0 -0
  337. /package/dist/{pushTypes.d.ts → push/pushTypes.d.ts} +0 -0
  338. /package/dist/{sendLog.d.ts → push/sendLog.d.ts} +0 -0
  339. /package/dist/{sendLog.js → push/sendLog.js} +0 -0
  340. /package/dist/{usageAggregator.d.ts → services/usageAggregator.d.ts} +0 -0
  341. /package/dist/{usageAggregator.js → services/usageAggregator.js} +0 -0
  342. /package/dist/{sessionSearch.js → sessions/sessionSearch.js} +0 -0
  343. /package/dist/{observationLog.d.ts → shared/observationLog.d.ts} +0 -0
  344. /package/dist/{observationLog.js → shared/observationLog.js} +0 -0
  345. /package/dist/{sleep.d.ts → shared/sleep.d.ts} +0 -0
  346. /package/dist/{sleep.js → shared/sleep.js} +0 -0
  347. /package/dist/{version.d.ts → shared/version.d.ts} +0 -0
  348. /package/dist/{version.js → shared/version.js} +0 -0
@@ -0,0 +1,466 @@
1
+ // hubDaemon.ts
2
+ // tailii (TS host) — Session Hub の unix socket / lock / daemon lifecycle。
3
+ //
4
+ // reaper の heartbeat 判定は SessionHub.tick() に吸収する。heartbeat.ts が唯一の判定権威で、
5
+ // Hub は engine / hook と並ぶ書き手・周期実行者にすぎない。
6
+ import { spawn } from "node:child_process";
7
+ import { randomUUID } from "node:crypto";
8
+ import * as fs from "node:fs";
9
+ import * as net from "node:net";
10
+ import * as os from "node:os";
11
+ import * as path from "node:path";
12
+ import { fileURLToPath } from "node:url";
13
+ import { defaultHeartbeatDir } from "../sessions/heartbeat.js";
14
+ import { startEngineRelaySocket } from "./engineRelaySocket.js";
15
+ import { encodeHubMessage } from "./hubProtocol.js";
16
+ import { ensureDirectory0700 } from "../shared/paths.js";
17
+ import { REAPER_CHECK_INTERVAL_SECONDS, REAPER_IDLE_TIMEOUT_SECONDS, } from "./reaper.js";
18
+ import { SessionHub } from "./sessionHub.js";
19
+ import { SessionMetadataStore } from "../sessions/sessionMetadataStore.js";
20
+ import { abortableSleep } from "../shared/sleep.js";
21
+ import { resolveHubSocketPath } from "../shared/socketPath.js";
22
+ import { processTmuxCommandRunner } from "../backend/tmux.js";
23
+ import { readPackageVersion } from "../shared/version.js";
24
+ import { ChatTailController } from "../chat/chatTailController.js";
25
+ import { TranscriptTailer } from "../chat/transcriptTailer.js";
26
+ import { LineWriter } from "../shared/lineWriter.js";
27
+ import { PanePreviewPump } from "./panePreviewPump.js";
28
+ import { makeSessionBackend } from "../backend/sessionBackend.js";
29
+ import { Writable } from "node:stream";
30
+ import { decodeControlMessage, PROTOCOL_MAX_SUPPORTED, } from "../protocol.js";
31
+ import { injectQuestionAnswers } from "./questionInjection.js";
32
+ import { ImageService } from "../chat/imageService.js";
33
+ import { listServeProcessesWithStatus } from "../services/serveService.js";
34
+ export function defaultHubLockPath() {
35
+ return path.join(os.homedir(), ".tailii", "hub.lock");
36
+ }
37
+ export function defaultPendingQuestionsPath() {
38
+ return path.join(os.homedir(), ".tailii", "hub", "pending-questions.json");
39
+ }
40
+ export function defaultChatReceiptsPath() {
41
+ return path.join(os.homedir(), ".tailii", "hub", "chat-receipts.json");
42
+ }
43
+ /**
44
+ * LineWriter の canonical flat wire を Hub 内部の ControlMessage へ戻す adapter。
45
+ *
46
+ * tool_activity / subagent_node は内部表現だけ nested で、wire は flat になる。
47
+ * JSON.parse の型 assertion だけでは activity/node が欠けた偽 ControlMessage を作るため、
48
+ * 必ず protocol decoder を通して境界を検証・復元する。
49
+ */
50
+ export function controlMessageCallbackWriter(write) {
51
+ return new LineWriter(new Writable({
52
+ write(chunk, _encoding, callback) {
53
+ try {
54
+ write(decodeControlMessage(String(chunk).trimEnd()));
55
+ callback();
56
+ }
57
+ catch (error) {
58
+ callback(error);
59
+ }
60
+ },
61
+ }));
62
+ }
63
+ /** lockfile を読む。不在・壊れは null。 */
64
+ export function readHubLock(lockPath) {
65
+ try {
66
+ const parsed = JSON.parse(fs.readFileSync(lockPath, "utf8"));
67
+ if (typeof parsed.pid !== "number")
68
+ return null;
69
+ return { pid: parsed.pid, version: typeof parsed.version === "string" ? parsed.version : null };
70
+ }
71
+ catch {
72
+ return null;
73
+ }
74
+ }
75
+ /** 生存中の別 pid が所有していなければ lock を取得する。 */
76
+ export function acquireHubLock(lockPath, version, ownerPid = process.pid) {
77
+ ensureDirectory0700(path.dirname(lockPath));
78
+ const payload = JSON.stringify({ pid: ownerPid, version });
79
+ for (let attempt = 0; attempt < 2; attempt++) {
80
+ const existing = readHubLock(lockPath);
81
+ if (existing !== null && existing.pid !== ownerPid && pidAlive(existing.pid))
82
+ return false;
83
+ if (existing !== null && existing.pid === ownerPid) {
84
+ fs.writeFileSync(lockPath, payload);
85
+ return true;
86
+ }
87
+ // 死んだ所有者・壊れた lock は退けてから O_EXCL で作成する。
88
+ // 同時起動の 2 プロセスが両方 lock を書けてしまうと、socket bind に
89
+ // 負けた側の後始末が勝者の lock を巻き添えにする(実観測済み)。
90
+ try {
91
+ fs.unlinkSync(lockPath);
92
+ }
93
+ catch {
94
+ // 不在ならそのまま作成へ。
95
+ }
96
+ try {
97
+ fs.writeFileSync(lockPath, payload, { flag: "wx" });
98
+ }
99
+ catch {
100
+ continue; // 競合相手が先に作成 → 相手の生存判定からやり直す。
101
+ }
102
+ // unlink 競合で相手に上書きされていないことを確認して確定する。
103
+ if (readHubLock(lockPath)?.pid === ownerPid)
104
+ return true;
105
+ }
106
+ return false;
107
+ }
108
+ /** pid が生きているか。権限不足(EPERM)は生存扱い。 */
109
+ export function pidAlive(pid) {
110
+ try {
111
+ process.kill(pid, 0);
112
+ return true;
113
+ }
114
+ catch (error) {
115
+ return error.code === "EPERM";
116
+ }
117
+ }
118
+ async function isSocketAlive(socketPath) {
119
+ return new Promise((resolve) => {
120
+ const probe = net.connect(socketPath);
121
+ probe.once("connect", () => {
122
+ probe.destroy();
123
+ resolve(true);
124
+ });
125
+ probe.once("error", () => resolve(false));
126
+ });
127
+ }
128
+ export const HUB_SOCKET_WRITABLE_LENGTH_LIMIT = 4 * 1024 * 1024;
129
+ export const HUB_SOCKET_CONVERSATION_EVENT_BATCH_SIZE = 16;
130
+ export const HUB_SOCKET_CONVERSATION_EVENT_FLUSH_INTERVAL_MS = 8;
131
+ /** Hub から client へ書く直前に滞留量を検査し、遅延 client を切断する。 */
132
+ export function writeHubSocketLine(socket, line, writableLengthLimit, log) {
133
+ if (socket.destroyed)
134
+ return;
135
+ const writableLength = socket.writableLength;
136
+ if (writableLength > writableLengthLimit) {
137
+ log(`audit slow_client_disconnect writableLength=${writableLength} threshold=${writableLengthLimit}`);
138
+ socket.destroy();
139
+ return;
140
+ }
141
+ socket.write(line);
142
+ }
143
+ /**
144
+ * 大量の履歴 conversation_event を同期的に socket へ積むと、後着した pane_preview が
145
+ * history-done の後ろまで待たされる。履歴だけを小分けにし、ライブ状態・RPC応答は
146
+ * 直送して追い越せるようにする。conversation_event 同士の順序は FIFO で維持する。
147
+ */
148
+ export function createPrioritizedHubSocketWriter(socket, writableLengthLimit, log, options = {}) {
149
+ const batchSize = options.batchSize ?? HUB_SOCKET_CONVERSATION_EVENT_BATCH_SIZE;
150
+ const flushIntervalMs = options.flushIntervalMs ??
151
+ HUB_SOCKET_CONVERSATION_EVENT_FLUSH_INTERVAL_MS;
152
+ const conversationEvents = [];
153
+ let queuedBytes = 0;
154
+ let flushTimer = null;
155
+ const clearQueue = () => {
156
+ conversationEvents.length = 0;
157
+ queuedBytes = 0;
158
+ };
159
+ const scheduleFlush = () => {
160
+ if (flushTimer !== null || conversationEvents.length === 0 || socket.destroyed)
161
+ return;
162
+ flushTimer = setTimeout(() => {
163
+ flushTimer = null;
164
+ if (socket.destroyed) {
165
+ clearQueue();
166
+ return;
167
+ }
168
+ for (let index = 0; index < batchSize; index += 1) {
169
+ const line = conversationEvents.shift();
170
+ if (line === undefined)
171
+ break;
172
+ queuedBytes -= Buffer.byteLength(line, "utf8");
173
+ writeHubSocketLine(socket, line, writableLengthLimit, log);
174
+ if (socket.destroyed) {
175
+ clearQueue();
176
+ return;
177
+ }
178
+ }
179
+ scheduleFlush();
180
+ }, flushIntervalMs);
181
+ };
182
+ return (line) => {
183
+ // 外側 envelope の type だけを照合する。payload 内の同名 type では誤判定しない。
184
+ if (line.startsWith('{"type":"conversation_event"')) {
185
+ const lineBytes = Buffer.byteLength(line, "utf8");
186
+ if (socket.writableLength + queuedBytes + lineBytes > writableLengthLimit) {
187
+ log(`audit slow_client_disconnect writableLength=${socket.writableLength + queuedBytes}` +
188
+ ` threshold=${writableLengthLimit}`);
189
+ clearQueue();
190
+ socket.destroy();
191
+ return;
192
+ }
193
+ conversationEvents.push(line);
194
+ queuedBytes += lineBytes;
195
+ scheduleFlush();
196
+ return;
197
+ }
198
+ // pane_preview / processing state / RPC応答は履歴キューを待たせず即時配送する。
199
+ writeHubSocketLine(socket, line, writableLengthLimit, log);
200
+ };
201
+ }
202
+ /** engine 接続の各行を SessionHub コアへ渡す NDJSON socket。 */
203
+ export async function startHubSocket(options) {
204
+ const socketPath = options.socketPath ?? resolveHubSocketPath();
205
+ const log = options.log ?? (() => { });
206
+ const bootId = options.bootId ?? randomUUID();
207
+ const writableLengthLimit = options.writableLengthLimit ?? HUB_SOCKET_WRITABLE_LENGTH_LIMIT;
208
+ if (await isSocketAlive(socketPath))
209
+ return null;
210
+ fs.rmSync(socketPath, { force: true });
211
+ const clients = new Set();
212
+ const server = net.createServer((socket) => {
213
+ clients.add(socket);
214
+ log(`audit client_connect clients=${clients.size}`);
215
+ const write = createPrioritizedHubSocketWriter(socket, writableLengthLimit, log);
216
+ options.hub.registerClient(socket, write);
217
+ let buffer = Buffer.alloc(0);
218
+ socket.on("data", (chunk) => {
219
+ buffer = buffer.length === 0 ? chunk : Buffer.concat([buffer, chunk]);
220
+ let newline;
221
+ while ((newline = buffer.indexOf(0x0a)) >= 0) {
222
+ const line = buffer.subarray(0, newline).toString("utf8");
223
+ buffer = buffer.subarray(newline + 1);
224
+ try {
225
+ const message = JSON.parse(line);
226
+ if (message.type === "hub_hello") {
227
+ write(encodeHubMessage({
228
+ type: "hub_hello_ack",
229
+ version: options.version,
230
+ bootId,
231
+ processingSessions: options.hub.processingSessionNames,
232
+ }));
233
+ }
234
+ }
235
+ catch { /* Hub コア側でも不正行を破棄する。 */ }
236
+ options.hub.handleClientMessage(socket, line);
237
+ }
238
+ });
239
+ socket.on("error", () => { });
240
+ socket.on("close", () => {
241
+ clients.delete(socket);
242
+ options.hub.unregisterClient(socket);
243
+ log(`audit client_disconnect clients=${clients.size}`);
244
+ });
245
+ });
246
+ server.maxConnections = 16;
247
+ await new Promise((resolve, reject) => {
248
+ server.once("error", reject);
249
+ server.listen(socketPath, () => {
250
+ server.removeListener("error", reject);
251
+ resolve();
252
+ });
253
+ });
254
+ log(`socket listen ${socketPath}`);
255
+ return {
256
+ socketPath,
257
+ close: () => new Promise((resolve) => {
258
+ // socket の close イベント(非同期)を待たず、close 完了時点で clientCount を確定させる。
259
+ // clients の削除は close イベントへ任せ、監査行の接続数を接続ごとに正しく減らす。
260
+ // イベント側の unregister は冪等なので二重解除は無害。
261
+ for (const client of clients) {
262
+ options.hub.unregisterClient(client);
263
+ client.destroy();
264
+ }
265
+ server.close(() => {
266
+ fs.rmSync(socketPath, { force: true });
267
+ resolve();
268
+ });
269
+ }),
270
+ };
271
+ }
272
+ /** engine / hook から Hub の常駐を冪等・best-effort で保証する。 */
273
+ export function ensureHubDaemon(options = {}) {
274
+ let logFd = null;
275
+ try {
276
+ const lockPath = options.lockPath ?? defaultHubLockPath();
277
+ const currentVersion = readPackageVersion();
278
+ const lock = readHubLock(lockPath);
279
+ if (lock !== null && pidAlive(lock.pid)) {
280
+ if (lock.version === currentVersion)
281
+ return;
282
+ // stale dist は退かせ、現行 cli から立て直す。
283
+ try {
284
+ process.kill(lock.pid, "SIGTERM");
285
+ }
286
+ catch {
287
+ // 消えていればそのまま起動へ進む。
288
+ }
289
+ }
290
+ const cliPath = options.cliPath ?? fileURLToPath(new URL("../cli.js", import.meta.url));
291
+ const logPath = options.logPath ?? path.join(os.homedir(), ".tailii", "hub.log");
292
+ ensureDirectory0700(path.dirname(logPath));
293
+ logFd = fs.openSync(logPath, "a");
294
+ const child = (options.spawnImpl ?? spawn)(process.execPath, [cliPath, "hub"], {
295
+ detached: true,
296
+ stdio: ["ignore", logFd, logFd],
297
+ });
298
+ child.unref();
299
+ }
300
+ catch {
301
+ // 次の engine 接続 / hook 発火で再試行する。
302
+ }
303
+ finally {
304
+ if (logFd !== null)
305
+ fs.closeSync(logFd);
306
+ }
307
+ }
308
+ /** `tailii hub` エントリ。 */
309
+ export async function runHubCommand(args) {
310
+ let timeoutSeconds = REAPER_IDLE_TIMEOUT_SECONDS;
311
+ let intervalSeconds = REAPER_CHECK_INTERVAL_SECONDS;
312
+ let once = false;
313
+ for (let i = 0; i < args.length; i += 1) {
314
+ const arg = args[i];
315
+ if (arg === "--timeout-seconds")
316
+ timeoutSeconds = Number(args[++i]);
317
+ else if (arg === "--interval-seconds")
318
+ intervalSeconds = Number(args[++i]);
319
+ else if (arg === "--once")
320
+ once = true;
321
+ }
322
+ if (!Number.isFinite(timeoutSeconds) || timeoutSeconds <= 0)
323
+ return 64;
324
+ if (!Number.isFinite(intervalSeconds) || intervalSeconds <= 0)
325
+ return 64;
326
+ const lockPath = defaultHubLockPath();
327
+ const existing = readHubLock(lockPath);
328
+ if (existing !== null && existing.pid !== process.pid && pidAlive(existing.pid)) {
329
+ log(`既存 daemon 生存(pid=${existing.pid})のため終了`);
330
+ return 0;
331
+ }
332
+ const socketPath = resolveHubSocketPath();
333
+ if (await isSocketAlive(socketPath)) {
334
+ log(`既存 Hub socket 生存(${socketPath})のため終了`);
335
+ return 0;
336
+ }
337
+ const startupVersion = readPackageVersion();
338
+ const bootId = randomUUID();
339
+ if (!acquireHubLock(lockPath, startupVersion)) {
340
+ log("lock 取得競合のため終了");
341
+ return 0;
342
+ }
343
+ const abort = new AbortController();
344
+ const onSignal = (signal) => {
345
+ if (!abort.signal.aborted)
346
+ log(`audit hub_exit reason=signal signal=${signal}`);
347
+ abort.abort();
348
+ };
349
+ process.on("SIGTERM", onSignal);
350
+ process.on("SIGINT", onSignal);
351
+ const runner = processTmuxCommandRunner();
352
+ const metadataStore = new SessionMetadataStore();
353
+ // 端末バックエンド(tmux / herdr)。常時 Composite(メタの backend 欄で per-session ルーティング)
354
+ // なので、アプリの backend_set による切替後も hub 再起動なしで両方のセッションへ届く。
355
+ const sessionBackend = makeSessionBackend({ store: metadataStore });
356
+ // Session Hub 導入後は Hub 所有の ChatTailController が会話を配信する。
357
+ // ここで ImageService を渡さないと engine 側のサービスは tail を通らず、
358
+ // user 添付の image_available が消失する。index は engine と共通の既定パスへ書く。
359
+ const imageService = new ImageService();
360
+ const hub = new SessionHub({
361
+ runner,
362
+ heartbeatDir: defaultHeartbeatDir(),
363
+ metadataStore,
364
+ timeoutSeconds,
365
+ // ローカル開発サーバー稼働中の cwd は activity とみなし、pane close / kill-session に
366
+ // よる巻き添え終了を防ぐ。reaper は timeout 候補がある tick でのみこの検出を呼ぶ。
367
+ listLocalServerCwds: async () => {
368
+ const result = await listServeProcessesWithStatus({ excludePids: [process.pid] });
369
+ if (!result.ok)
370
+ return null;
371
+ return new Set(result.servers.flatMap((server) => server.cwd === undefined ? [] : [server.cwd]));
372
+ },
373
+ pendingQuestionsPath: defaultPendingQuestionsPath(),
374
+ chatReceiptsPath: defaultChatReceiptsPath(),
375
+ log,
376
+ tailFactory: (write, onCodexTurnLifecycle) => new ChatTailController({
377
+ writer: controlMessageCallbackWriter(write),
378
+ tailer: new TranscriptTailer({ tailIndefinitely: true, emitReplayDoneMarker: true }),
379
+ projectsRoot: path.join(os.homedir(), ".claude", "projects"),
380
+ imageService,
381
+ protocolVersion: () => PROTOCOL_MAX_SUPPORTED,
382
+ onCodexTurnLifecycle,
383
+ }),
384
+ previewPumpFactory: (write, onPermissionMode, pollIntervalMs) => new PanePreviewPump({
385
+ writer: controlMessageCallbackWriter(write),
386
+ capture: (session) => sessionBackend.capturePane(session, { lines: 60, joinWrappedLines: true }),
387
+ onPermissionMode,
388
+ ...(pollIntervalMs !== undefined ? { pollIntervalMs } : {}),
389
+ log,
390
+ }),
391
+ questionInjector: (answers, session) => injectQuestionAnswers(answers, session, sessionBackend),
392
+ // 本文+送信確定は backend 側の 1 操作に委ねる(herdr は本文+CR 単一コール必須。
393
+ // 分割すると Ink のペースト取り込み窓に CR が飲まれ送信されない)。
394
+ chatInjector: (text, session) => sessionBackend.sendTextSubmit(session, text),
395
+ });
396
+ hub.restoreFromHeartbeats();
397
+ hub.restorePendingQuestions();
398
+ hub.restoreChatReceipts();
399
+ let socketServer = null;
400
+ let relayServer = null;
401
+ log(`起動 pid=${process.pid} version=${startupVersion ?? "?"} ` +
402
+ `timeout=${timeoutSeconds}s interval=${intervalSeconds}s`);
403
+ try {
404
+ try {
405
+ socketServer = await startHubSocket({ hub, socketPath, version: startupVersion, bootId, log });
406
+ }
407
+ catch (error) {
408
+ if (error.code === "EADDRINUSE") {
409
+ log("socket listen 競合のため終了");
410
+ return 0;
411
+ }
412
+ throw error;
413
+ }
414
+ if (socketServer === null)
415
+ return 0;
416
+ // socket を勝ち取った時点で lock の権威は自分。起動競合の名残(敗者の lock や
417
+ // own-pid ガード付き削除)があっても、ここで上書きすれば最終状態は必ず整合する。
418
+ fs.writeFileSync(lockPath, JSON.stringify({ pid: process.pid, version: startupVersion }));
419
+ relayServer = await startEngineRelaySocket({ onMessage: (message) => hub.handleRelayMessage(message), log });
420
+ while (!abort.signal.aborted) {
421
+ let result;
422
+ try {
423
+ result = await hub.tick();
424
+ }
425
+ catch (error) {
426
+ // tmux 一時失敗等は daemon を落とさず次周期へ送る。
427
+ log(`tick 失敗(継続): ${String(error)}`);
428
+ result = { liveCount: 1, killed: [], demoted: [], reclaimed: [] };
429
+ }
430
+ if (once)
431
+ break;
432
+ if (result.liveCount === 0 && hub.clientCount === 0 && !hub.hasPendingQuestions &&
433
+ !hub.hasInjectionsInFlight && !hub.hasCodexTurnsInFlight) {
434
+ log("対象セッション 0 / client 0 → 自然終了");
435
+ break;
436
+ }
437
+ const currentVersion = readPackageVersion();
438
+ if (startupVersion !== null && currentVersion !== null && currentVersion !== startupVersion) {
439
+ log(`stale dist 検知(${startupVersion} → ${currentVersion}) → 終了`);
440
+ break;
441
+ }
442
+ await abortableSleep(intervalSeconds * 1000, abort.signal);
443
+ }
444
+ }
445
+ finally {
446
+ hub.close();
447
+ process.off("SIGTERM", onSignal);
448
+ process.off("SIGINT", onSignal);
449
+ await relayServer?.close();
450
+ await socketServer?.close();
451
+ // 後継 daemon の lock を壊さず、自分の lock だけを消す。
452
+ if (readHubLock(lockPath)?.pid === process.pid) {
453
+ try {
454
+ fs.unlinkSync(lockPath);
455
+ }
456
+ catch {
457
+ // pid 生存判定があるため残っても無害。
458
+ }
459
+ }
460
+ }
461
+ return 0;
462
+ function log(message) {
463
+ process.stderr.write(`[tailii-hub ${new Date().toISOString()}] ${message}\n`);
464
+ }
465
+ }
466
+ //# sourceMappingURL=hubDaemon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hubDaemon.js","sourceRoot":"","sources":["../../src/hub/hubDaemon.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,161 @@
1
+ import type { EngineRelayMessage, SessionProcessingMessage } from "./engineRelaySocket.js";
2
+ import { type ControlMessage, type QuestionAnswer, type QuestionPromptQuestion } from "../protocol.js";
3
+ export type HubClientMessage = {
4
+ type: "hub_hello";
5
+ } | {
6
+ type: "conversation_subscribe";
7
+ session: string;
8
+ afterSeq?: number;
9
+ newerThanMs?: number;
10
+ preview?: boolean;
11
+ } | {
12
+ type: "conversation_unsubscribe";
13
+ session: string;
14
+ } | {
15
+ type: "session_retire";
16
+ session: string;
17
+ } | {
18
+ type: "conversation_subagent_transcript_request";
19
+ id: string;
20
+ session: string;
21
+ nodeId: string;
22
+ } | {
23
+ type: "hub_state_request";
24
+ id: string;
25
+ session: string;
26
+ } | {
27
+ type: "presence_request";
28
+ id: string;
29
+ session: string;
30
+ } | {
31
+ type: "question_answer_submit";
32
+ id: string;
33
+ session: string;
34
+ questionId: string;
35
+ answers: QuestionAnswer[];
36
+ } | {
37
+ type: "input_claim";
38
+ id: string;
39
+ session: string;
40
+ clientMessageId: string;
41
+ } | {
42
+ type: "codex_turn_submit";
43
+ id: string;
44
+ session: string;
45
+ text: string;
46
+ clientUserMessageId: string;
47
+ effort: string | null;
48
+ approvalPolicy: "untrusted" | "on-request" | "never" | null;
49
+ sandbox: "read-only" | "workspace-write" | "danger-full-access" | null;
50
+ threadId: string;
51
+ cwd: string;
52
+ explicitRetry?: boolean;
53
+ } | {
54
+ type: "codex_turn_interrupt";
55
+ id: string;
56
+ session: string;
57
+ } | {
58
+ type: "chat_send";
59
+ id: string;
60
+ session: string;
61
+ clientMessageId: string;
62
+ text: string;
63
+ explicitRetry?: boolean;
64
+ } | {
65
+ type: "pending_message_delete";
66
+ id: string;
67
+ session: string;
68
+ clientMessageId: string;
69
+ kind: "chat" | "codex";
70
+ } | {
71
+ type: "runtime_claim";
72
+ id: string;
73
+ session: string;
74
+ } | {
75
+ type: "runtime_claim_release";
76
+ session: string;
77
+ } | {
78
+ type: "session_preview_watch";
79
+ enabled: boolean;
80
+ } | SessionProcessingMessage;
81
+ export type HubServerMessage = {
82
+ type: "hub_hello_ack";
83
+ version: string | null;
84
+ bootId: string;
85
+ processingSessions?: string[];
86
+ } | {
87
+ type: "hub_state_response";
88
+ id: string;
89
+ session: string;
90
+ pendingQuestion: {
91
+ id: string;
92
+ questions: QuestionPromptQuestion[];
93
+ } | null;
94
+ processing: boolean;
95
+ } | {
96
+ type: "presence_response";
97
+ id: string;
98
+ session: string;
99
+ subscriberCount: number;
100
+ } | {
101
+ type: "conversation_event";
102
+ session: string;
103
+ serverSeq: number;
104
+ payload: ControlMessage;
105
+ } | {
106
+ type: "conversation_subagent_transcript_response";
107
+ id: string;
108
+ session: string;
109
+ payload: Extract<ControlMessage, {
110
+ type: "subagent_transcript_response";
111
+ }>;
112
+ } | {
113
+ type: "conversation_pane_preview";
114
+ session: string;
115
+ payload: ControlMessage;
116
+ } | {
117
+ type: "conversation_mode";
118
+ session: string;
119
+ payload: ControlMessage;
120
+ }
121
+ /**
122
+ * セッションの死亡通知(hub→engine, live-pill Phase 2)。retireSession(tick の
123
+ * killed/demoted/reclaimed と engine 発 kill の集約点)から一覧 watcher へだけ送る。
124
+ * 誕生イベントは出さない割り切りのため `alive` は常に false。
125
+ */
126
+ | {
127
+ type: "conversation_liveness";
128
+ session: string;
129
+ alive: false;
130
+ } | {
131
+ type: "question_answer_result";
132
+ id: string;
133
+ status: "accepted" | "already_resolved" | "unknown";
134
+ } | {
135
+ type: "input_claim_result";
136
+ id: string;
137
+ status: "granted" | "duplicate";
138
+ } | {
139
+ type: "codex_turn_result";
140
+ id: string;
141
+ status: "started" | "duplicate" | "failed";
142
+ error?: string;
143
+ } | {
144
+ type: "chat_send_result";
145
+ id: string;
146
+ status: "accepted" | "duplicate" | "failed";
147
+ error?: string;
148
+ } | {
149
+ type: "pending_message_delete_result";
150
+ id: string;
151
+ status: "deleted" | "not_found" | "processing" | "failed";
152
+ error?: string;
153
+ } | {
154
+ type: "runtime_claim_result";
155
+ id: string;
156
+ status: "granted" | "held";
157
+ } | EngineRelayMessage;
158
+ export declare function encodeHubMessage(message: HubClientMessage | HubServerMessage): string;
159
+ /** 不正・未知の行を接続エラーにせず捨てる。 */
160
+ export declare function decodeHubClientLine(line: string): HubClientMessage | null;
161
+ export declare function decodeHubServerLine(line: string): HubServerMessage | null;