tailii-host 0.1.0 → 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 +35 -14
  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
@@ -2,9 +2,10 @@
2
2
  // tailii (TS host) — setup サブコマンド実装
3
3
  // Swift スクリプト scripts/poc-host-setup.swift の移植(Moshi `host setup` 相当)。
4
4
  //
5
- // このホストでペアごとの ed25519 鍵を生成し、公開鍵を authorized_keys に登録、
6
- // {host, port, user, 秘密鍵PEM}(+ v2 では sessionName/sessionCwd)を
7
- // ペアリング payload として発行する。iPhone アプリはこれを QR スキャン / クリップボード貼付で取り込む。
5
+ // ペアリングの提供コマンド。QR には「接続先 + ワンタイム PSK」だけを載せ(spec v1.1 ブートストラップ)、
6
+ // スキャン後は pairing-code プロトコル(TCP)で iPhone 生成の公開鍵を authorized_keys へ登録する
7
+ // (client-key enrollment・秘密鍵はワイヤに載せない)。旧アプリの直接入力向けには従来どおり
8
+ // ホスト側 ed25519 鍵を用意し、key あり payload(v1/2/3)へフォールバックする。
8
9
  //
9
10
  // 使い方: tailii setup
10
11
  // tailii setup --session <name> [--session-cwd <cwd>]
@@ -21,8 +22,8 @@
21
22
  // --emit-payload 副作用なし検証モード。keygen/QR/ファイル操作を行わず payload JSON を stdout に出すだけ。
22
23
  // 既存の鍵があれば読むが無くても擬似値で継続。
23
24
  //
24
- // 注意: 秘密鍵を payload に載せるため、表示した QR は信頼できる端末でのみスキャンすること。
25
- // リモートログイン(ON)が前提。公開鍵の authorized_keys 登録を行う。
25
+ // 注意: リモートログイン(ON)が前提。公開鍵の authorized_keys 登録を行う。
26
+ // QR は setup 実行中のみ有効(ワンタイム PSK)。--emit-payload の byte 契約は legacy(key あり)のまま。
26
27
  //
27
28
  // Swift 版との差分:
28
29
  // - QR は macOS 限定の PNG+open ではなく、ゼロ依存 `qrcode-terminal` でターミナルに直接描画する
@@ -31,6 +32,7 @@
31
32
  // - payload の JSON は Swift JSONEncoder `.prettyPrinted + .sortedKeys` と byte 一致で符号化する
32
33
  // (2スペース字下げ・`" : "` 区切り・キー辞書順・`/`→`\/` エスケープ)。golden 契約を維持。
33
34
  import { execFileSync } from "node:child_process";
35
+ import * as crypto from "node:crypto";
34
36
  import * as fs from "node:fs";
35
37
  import * as net from "node:net";
36
38
  import * as os from "node:os";
@@ -38,24 +40,32 @@ import * as path from "node:path";
38
40
  import qrcode from "qrcode-terminal";
39
41
  import { runPairingResponder } from "./pairingCode.js";
40
42
  import { collectDoctorChecks, defaultShimBinDir, ensureHostShim, formatDoctorChecks, resolveOwnCliPath, } from "./doctor.js";
43
+ import { ensureQuicCredentials, installQuicLaunchAgent, resolveQuicGatewayBinary, } from "../services/quicGateway.js";
41
44
  /**
42
45
  * ペアリング payload を Swift `JSONEncoder`(`.prettyPrinted + .sortedKeys`)と byte 一致で符号化する。
43
- * 末尾改行は含めない(呼び出し側が付与)。golden `protocol/pairing-payload-v{1,2}.json` と契約整合。
46
+ * 末尾改行は含めない(呼び出し側が付与)。golden `protocol/pairing-payload-v{1,2,3,4}.json` と契約整合。
44
47
  */
45
48
  export function encodePairingPayload(input) {
46
49
  const obj = {
47
50
  host: input.host,
48
- key: input.key,
49
51
  port: input.port,
50
52
  user: input.user,
51
- v: input.sessionName !== undefined ? 2 : 1,
53
+ v: input.key === undefined ? 4 : input.quic !== undefined ? 3 : input.sessionName !== undefined ? 2 : 1,
52
54
  };
55
+ if (input.key !== undefined)
56
+ obj["key"] = input.key;
53
57
  if (input.sessionName !== undefined) {
54
58
  obj["sessionName"] = input.sessionName;
55
59
  // v2 でも cwd 未指定なら Swift の optional=nil と同じく JSON から省略する。
56
60
  if (input.sessionCwd !== undefined)
57
61
  obj["sessionCwd"] = input.sessionCwd;
58
62
  }
63
+ if (input.quic !== undefined) {
64
+ // フィールド名は凍結対象(docs/quic-transport.md「凍結対象」)。
65
+ obj["quicPort"] = input.quic.port;
66
+ obj["quicPin"] = input.quic.pin;
67
+ obj["quicToken"] = input.quic.token;
68
+ }
59
69
  // sortedKeys: キーを辞書順に並べ、prettyPrinted(2スペース字下げ・" : " 区切り)で整形する。
60
70
  const lines = Object.keys(obj)
61
71
  .sort()
@@ -247,29 +257,11 @@ export async function runSetupCommand(argv) {
247
257
  process.stdout.write(json + "\n");
248
258
  return 0;
249
259
  }
250
- // --- 1) 鍵ペアを用意(無ければ生成) ---
251
- let keypair;
252
- try {
253
- keypair = ensureKeypair(base, sshKeygenEd25519);
254
- }
255
- catch (error) {
256
- process.stderr.write(`鍵生成に失敗: ${String(error)}\n`);
257
- return 1;
258
- }
259
- process.stdout.write(keypair.status === "generated"
260
- ? "ed25519 鍵を生成しました。\n"
261
- : `既存の鍵を再利用: ${path.join(base, "poc_id_ed25519")}\n`);
262
- // --- 2) 公開鍵を authorized_keys に登録 ---
263
- const sshDir = path.join(os.homedir(), ".ssh");
264
- try {
265
- const result = registerAuthorizedKey(sshDir, keypair.publicKeyLine);
266
- process.stdout.write(result === "added" ? "公開鍵を authorized_keys に登録しました。\n" : "公開鍵は登録済みです。\n");
267
- }
268
- catch (error) {
269
- process.stderr.write(`authorized_keys 登録に失敗: ${String(error)}\n`);
270
- return 1;
271
- }
272
- // --- 2.5) ホストシムを生成 + 環境診断 ---
260
+ // --- 1) ホストシムを生成 + 環境診断 ---
261
+ // 注: ホスト側 ed25519 鍵の生成・authorized_keys 登録はここでは行わない。
262
+ // 新アプリは自分で鍵を作り公開鍵だけを登録させる(spec v1.1)ので、ホスト生成の秘密鍵は
263
+ // 旧アプリが直接入力で来たときだけ必要になる。使わない秘密鍵をディスクに残さないため、
264
+ // 生成・登録は legacy フォールバックが実際に発生する瞬間まで遅延させる(下記 ensureLegacyPayload)。
273
265
  // iPhone は SSH 非対話シェルから ~/.local/bin/tailii-host を exec する。
274
266
  // node が PATH に無い環境でも動くよう、node 絶対パス固定のシムを自動生成する。
275
267
  try {
@@ -293,52 +285,44 @@ export async function runSetupCommand(argv) {
293
285
  if (failedRequired.length > 0) {
294
286
  process.stderr.write(`注意: 必須項目 ${failedRequired.length} 件が未充足です(ペアリング自体は続行できます)。\n`);
295
287
  }
296
- // --- 3) ペアリング payload を構築(v1/v2) ---
288
+ // --- 2.7) QUIC ゲートウェイ(任意機能): 資格情報生成 + launchd 常駐 ---
289
+ // 失敗しても SSH-only でペアリングを続行する(QUIC は優先経路であって必須ではない)。
290
+ const quic = await setupQuicGateway();
291
+ // --- 3) ペアリング payload を構築 ---
297
292
  // 接続先は自動選定(Tailscale があれば優先・無ければ LAN)。--host で明示上書きも可。
298
293
  // ユーザーは経路(Tailscale か LAN か)を意識しなくてよい。
294
+ // legacy(key あり v1/2/3)は旧アプリの直接入力フォールバック用。
295
+ // enrollment(key なし v4)は新アプリ用 — 秘密鍵はワイヤに載せない(spec v1.1)。
299
296
  const lanIP = args.host ?? detectPreferredIP();
300
297
  if (lanIP === "") {
301
298
  process.stderr.write("接続先 IP を取得できません(ネットワーク未接続?)\n");
302
299
  }
303
- const json = encodePairingPayload({
300
+ const commonPayloadFields = {
304
301
  host: lanIP,
305
302
  port: 22,
306
303
  user: username,
307
- key: keypair.privateKeyPem,
308
304
  ...(args.sessionName !== undefined ? { sessionName: args.sessionName } : {}),
309
305
  ...(args.sessionCwd !== undefined ? { sessionCwd: args.sessionCwd } : {}),
310
- });
311
- // --- 4) QR(スキャン用)を表示 ---
312
- const qr = await renderTerminalQR(json);
313
- const versionLine = args.sessionName !== undefined
314
- ? ` version : v2 (session)\n session : ${args.sessionName}\n cwd : ${args.sessionCwd ?? "(未指定)"}`
315
- : " version : v1";
316
- process.stdout.write("\n================ ① QR でペアリング ================\n" +
317
- `${versionLine}\n` +
318
- ` host : ${lanIP}\n` +
319
- ` user : ${username}\n` +
320
- ` port : 22\n` +
321
- " iPhone の TailiiPoC →「ペアリング」→「QR をスキャン」で下の QR を読む\n" +
322
- " ※ 秘密鍵が含まれます。信頼できる端末でのみ取り込んでください\n" +
323
- "==================================================\n\n" +
324
- `${qr}\n`);
325
- // --- 5) 直接入力(host:port + 6桁コード)用サーバを起動して待受 ---
326
- // 同じ setup で QR と直接入力の両方を提供する(コマンドを分けない)。
327
- // QR を使った場合はこの待受は不要なので Ctrl-C で終了してよい。
328
- return runCodePairingServer({
329
- payloadJSON: json,
330
- lanIP,
331
- sessionName: args.sessionName,
332
- sessionCwd: args.sessionCwd,
333
- });
334
- }
335
- /** payload をターミナル QR 文字列へ描画する(ゼロ依存 qrcode-terminal, small=密度重視)。 */
336
- function renderTerminalQR(text) {
337
- return new Promise((resolve) => {
338
- qrcode.generate(text, { small: true }, (qr) => resolve(qr));
339
- });
340
- }
341
- async function runCodePairingServer(options) {
306
+ ...(quic !== null ? { quic } : {}),
307
+ };
308
+ const noKeyPayloadJSON = encodePairingPayload(commonPayloadFields);
309
+ /**
310
+ * legacy(key あり)payload を必要になった瞬間に用意する。
311
+ * ホスト側 ed25519 鍵の生成と authorized_keys 登録もここで初めて行うので、
312
+ * 新アプリだけを使う環境にはホスト生成の秘密鍵が一切残らない。
313
+ */
314
+ const ensureLegacyPayload = () => {
315
+ const keypair = ensureKeypair(base, sshKeygenEd25519);
316
+ process.stdout.write(keypair.status === "generated"
317
+ ? "旧アプリ向けにホスト側 ed25519 鍵を生成しました。\n"
318
+ : `旧アプリ向けに既存のホスト側鍵を再利用: ${path.join(base, "poc_id_ed25519")}\n`);
319
+ const registered = registerAuthorizedKey(path.join(os.homedir(), ".ssh"), keypair.publicKeyLine);
320
+ process.stdout.write(registered === "added"
321
+ ? "ホスト側公開鍵を authorized_keys に登録しました。\n"
322
+ : "ホスト側公開鍵は登録済みです。\n");
323
+ return encodePairingPayload({ ...commonPayloadFields, key: keypair.privateKeyPem });
324
+ };
325
+ // --- 4) ペアリング待受サーバを先に bind(QR に bind 後の port を載せるため順序が必要) ---
342
326
  const server = net.createServer();
343
327
  server.maxConnections = 1;
344
328
  try {
@@ -351,32 +335,106 @@ async function runCodePairingServer(options) {
351
335
  });
352
336
  }
353
337
  catch (error) {
354
- process.stderr.write(`直接入力サーバの起動に失敗: ${String(error)}\n`);
338
+ process.stderr.write(`ペアリング待受サーバの起動に失敗: ${String(error)}\n`);
355
339
  return 1;
356
340
  }
357
341
  const address = server.address();
358
- const port = typeof address === "object" && address !== null ? address.port : 0;
342
+ const boundPort = typeof address === "object" && address !== null ? address.port : 0;
343
+ // --- 5) QR(ブートストラップ)を表示 ---
344
+ // QR には秘密を含む payload ではなく「接続先 + ワンタイム PSK」だけを載せる(spec v1.1)。
345
+ // スキャン後、アプリは下記サーバへ TCP 接続して公開鍵登録(enrollment)まで自動で行う。
346
+ const psk = crypto.randomBytes(32);
347
+ const bootstrapJSON = JSON.stringify({
348
+ pair: "code-v1",
349
+ host: lanIP,
350
+ port: boundPort,
351
+ psk: psk.toString("base64"),
352
+ });
353
+ const qr = await renderTerminalQR(bootstrapJSON);
354
+ const sessionLine = args.sessionName !== undefined
355
+ ? ` session : ${args.sessionName}\n cwd : ${args.sessionCwd ?? "(未指定)"}\n`
356
+ : "";
357
+ const quicLine = quic !== null ? ` quic : udp/${quic.port}(SSH フォールバック付き)\n` : "";
358
+ process.stdout.write("\n================ ① QR でペアリング ================\n" +
359
+ ` host : ${lanIP}\n` +
360
+ ` user : ${username}\n` +
361
+ sessionLine +
362
+ quicLine +
363
+ " iPhone の Tailii →「ペアリング」→「QR をスキャン」で下の QR を読む\n" +
364
+ " ※ QR はこのコマンドの実行中のみ有効です(秘密鍵は含まれません。\n" +
365
+ " iPhone 側で生成した公開鍵をこの Mac に登録します)\n" +
366
+ "==================================================\n\n" +
367
+ `${qr}\n`);
368
+ // --- 6) 直接入力(host:port + 6桁コード)の案内を出し、同じサーバで両モードを待受 ---
369
+ // QR スキャン客は psk 付き hello、直接入力客は psk なし hello(SAS 照合)で到着する。
370
+ return runCodePairingServer(server, {
371
+ payloadJSON: ensureLegacyPayload,
372
+ payloadJSONNoKey: noKeyPayloadJSON,
373
+ psk,
374
+ registerClientKey: (line) => {
375
+ const result = registerAuthorizedKey(path.join(os.homedir(), ".ssh"), line);
376
+ process.stdout.write(result === "added"
377
+ ? "iPhone の公開鍵を authorized_keys に登録しました。\n"
378
+ : "iPhone の公開鍵は登録済みです。\n");
379
+ },
380
+ lanIP,
381
+ port: boundPort,
382
+ });
383
+ }
384
+ /**
385
+ * QUIC ゲートウェイの用意(任意機能・失敗しても null で SSH-only 続行)。
386
+ * 資格情報の生成(冪等)→ launchd LaunchAgent 設置(冪等)→ payload v3 用の 3 点セットを返す。
387
+ */
388
+ async function setupQuicGateway() {
389
+ const gatewayPath = resolveQuicGatewayBinary();
390
+ if (gatewayPath === null) {
391
+ process.stdout.write("QUIC ゲートウェイ: バイナリ未検出のためスキップ(SSH のみでペアリングします)。\n");
392
+ return null;
393
+ }
394
+ try {
395
+ const creds = await ensureQuicCredentials(gatewayPath);
396
+ await installQuicLaunchAgent({ gatewayPath });
397
+ process.stdout.write(`QUIC ゲートウェイ: 常駐を設置しました(udp/${creds.port}, pin=${creds.spkiPin})。\n`);
398
+ return { port: creds.port, pin: creds.spkiPin, token: creds.token };
399
+ }
400
+ catch (error) {
401
+ process.stderr.write(`QUIC ゲートウェイの設置に失敗(SSH のみで続行します): ${String(error)}\n`);
402
+ return null;
403
+ }
404
+ }
405
+ /** payload をターミナル QR 文字列へ描画する(ゼロ依存 qrcode-terminal, small=密度重視)。 */
406
+ function renderTerminalQR(text) {
407
+ return new Promise((resolve) => {
408
+ qrcode.generate(text, { small: true }, (qr) => resolve(qr));
409
+ });
410
+ }
411
+ /** bind 済みサーバで QR(psk)/ 直接入力(SAS)両モードのペアリングを 1 接続だけ受理する。 */
412
+ async function runCodePairingServer(server, options) {
359
413
  const host = options.lanIP === "" ? "0.0.0.0" : options.lanIP;
360
414
  process.stdout.write("\n============ ② 直接入力でペアリング ============\n" +
361
- ` 接続先 : ${host}:${port}\n` +
362
- " iPhone の TailiiPoC →「ペアリング」→「直接入力」に上の host:port を入力\n" +
415
+ ` 接続先 : ${host}:${options.port}\n` +
416
+ " iPhone の Tailii →「ペアリング」→「直接入力」に上の host:port を入力\n" +
363
417
  " → 接続すると両側に 6桁コードが出るので、一致を確認して承認\n" +
364
- " (QR で済ませた場合はこの待受は不要 — Ctrl-C で終了してください)\n" +
418
+ " (QR をスキャンした場合は何もしなくてよい — 自動で完了します)\n" +
365
419
  "================================================\n");
366
420
  try {
367
- const socket = await acceptOneConnection(server, 300_000);
421
+ const socket = await acceptOneConnection(server, 600_000);
368
422
  if (socket === null) {
369
- // QR で完了済みのことも多いので、時間切れはエラー扱いにしない。
370
- process.stdout.write("直接入力の待受を終了しました(QR を使った場合は問題ありません)。\n");
423
+ process.stdout.write("ペアリングの待受を終了しました(時間切れ)。再実行してください。\n");
371
424
  return 0;
372
425
  }
373
426
  server.close();
374
427
  const result = await runPairingResponder({ readable: socket, writable: socket }, {
375
428
  payloadJSON: options.payloadJSON,
429
+ payloadJSONNoKey: options.payloadJSONNoKey,
430
+ psk: options.psk,
431
+ registerClientKey: options.registerClientKey,
376
432
  displaySAS: (code) => process.stdout.write(`ペアリングコード: ${code}\n`),
377
433
  });
378
434
  if (result.status === "paired") {
379
- process.stdout.write("ペアリングが完了しました。\n");
435
+ process.stdout.write(result.clientKeyLine !== undefined
436
+ ? "ペアリングが完了しました(iPhone 生成の鍵を登録・秘密鍵転送なし)。\n"
437
+ : "ペアリングが完了しました。\n");
380
438
  return 0;
381
439
  }
382
440
  process.stderr.write(`ペアリングを中止しました: ${result.reason}\n`);
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/commands/setup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,145 @@
1
+ import type { ChatAgent } from "../chat/chatTailController.js";
2
+ import type { CodexAccountUsageProvider } from "../codex/codexAccountUsage.js";
3
+ import type { CodexAppServerManager } from "../codex/codexAppServer.js";
4
+ import type { CodexTurnControllerRuntime } from "../codex/codexNativeTurnController.js";
5
+ import type { ClaudeSessionStore } from "../sessions/claudeSessionStore.js";
6
+ import type { CodexSessionStore } from "../codex/codexSessionStore.js";
7
+ import type { HubLink } from "../hub/hubClient.js";
8
+ import type { HubClientMessage, HubServerMessage } from "../hub/hubProtocol.js";
9
+ import type { ImageService } from "../chat/imageService.js";
10
+ import type { EngineLauncher } from "../commands/launch.js";
11
+ import type { LineWriter } from "../shared/lineWriter.js";
12
+ import type { AccountIdentityProvider } from "../services/accountIdentity.js";
13
+ import type { ClaudeModelListProvider } from "../services/claudeModelCatalog.js";
14
+ import type { HostVersionsProvider } from "../services/hostVersions.js";
15
+ import type { PlanUsageProvider } from "../services/planUsageFetcher.js";
16
+ import type { PreviewServer } from "../services/previewServer.js";
17
+ import { type ControlMessage, type QuestionPromptQuestion, type SessionInfo } from "../protocol.js";
18
+ import type { SessionListService } from "../sessions/sessionListService.js";
19
+ import type { SessionMetadataStore } from "../sessions/sessionMetadataStore.js";
20
+ import type { OfficialAppProvider, OfficialAppRuntimeContext, OfficialAppsService } from "../services/officialApps.js";
21
+ import type { SessionBackend, SessionBackendKind } from "../backend/sessionBackend.js";
22
+ export declare function engineDiag(message: string): void;
23
+ export interface EngineState {
24
+ negotiatedVersion: number;
25
+ ownMaxVersion: number;
26
+ modeSetInFlight: Set<string>;
27
+ }
28
+ export interface ModeTiming {
29
+ getPollMs: number;
30
+ getAttempts: number;
31
+ setInitialPollMs: number;
32
+ setInitialTimeoutMs: number;
33
+ setChangePollMs: number;
34
+ setChangeTimeoutMs: number;
35
+ }
36
+ export declare const DEFAULT_MODE_TIMING: ModeTiming;
37
+ export interface HandlerContext {
38
+ writer: LineWriter;
39
+ state: EngineState;
40
+ sessionManager: SessionBackend;
41
+ /** 新規セッションの端末バックエンド解決子(launch 毎に読む)。 */
42
+ backendKind: () => SessionBackendKind;
43
+ /** backend_set の永続化先。 */
44
+ backendWriter: (kind: SessionBackendKind) => void;
45
+ /** herdr 導入済み判定。 */
46
+ herdrInstalledProbe: () => boolean;
47
+ imageService: ImageService | null;
48
+ launcher: EngineLauncher | null;
49
+ /** codex セッション用 launcher(session_start の agentType=codex 時に使用)。 */
50
+ codexLauncher: EngineLauncher | null;
51
+ sessionListService: SessionListService | null;
52
+ metadataStore: SessionMetadataStore | null;
53
+ hubLink: HubLink;
54
+ requestHubState: (session: string) => Promise<{
55
+ id: string;
56
+ questions: QuestionPromptQuestion[];
57
+ } | null>;
58
+ hubRpc: <T extends HubServerMessage>(request: HubClientMessage, id: string, timeoutMs: number) => Promise<T>;
59
+ codexHubRpcTimeoutMs: number;
60
+ heartbeatDir: string;
61
+ resumeLauncher: EngineLauncher | null;
62
+ /** codex セッションの reattach 時 resume 用 launcher。 */
63
+ codexResumeLauncher: EngineLauncher | null;
64
+ claudeSessionStore: ClaudeSessionStore | null;
65
+ /** codex 会話一覧の導出(agent-tag)。 */
66
+ codexSessionStore: CodexSessionStore | null;
67
+ planUsage: PlanUsageProvider;
68
+ /** Claude モデル一覧の取得(Models API, ベストエフォート。テストは固定値/null を注入)。 */
69
+ claudeModelList: ClaudeModelListProvider;
70
+ /**
71
+ * Codex アカウント使用量の取得(App Server `account/rateLimits/read`, ベストエフォート,
72
+ * account-usage)。テストは固定値/null を注入する。
73
+ */
74
+ codexAccountUsage: CodexAccountUsageProvider;
75
+ /**
76
+ * ホスト環境のバージョン情報(tailii host / claude / codex, account-usage)。
77
+ * プロセス内キャッシュは provider 側が持つ。テストは固定値/null を注入する。
78
+ */
79
+ hostVersions: HostVersionsProvider;
80
+ /**
81
+ * ログイン中アカウントのマスク済み表示(account-usage)。
82
+ * 生 email は provider の内側で捨てる(ここへ来るのは既にマスク済みの文字列だけ)。
83
+ */
84
+ accountIdentity: AccountIdentityProvider;
85
+ homeDir: string;
86
+ modeTiming: ModeTiming;
87
+ /** host 側の既定エージェント(session_start が agentType を指定しないときのフォールバック)。 */
88
+ defaultAgent: ChatAgent;
89
+ activeChatSession: {
90
+ name: string | null;
91
+ };
92
+ /** 一覧 Mission Control の watch 状態(有効中は非前面会話の pane_preview もリレーする)。 */
93
+ listPreviewWatch: {
94
+ enabled: boolean;
95
+ };
96
+ /** 処理中セッションの最終ハートビート(Unix 秒)。明示 kill 時に掃除する。 */
97
+ processingSessions: Map<string, number>;
98
+ /** 一覧・別画面でも差分同期を続けるフォーカス外会話。 */
99
+ backgroundChatSessions: Set<string>;
100
+ /** Hub 世代内で iOS へ連続配送済みの最後の conversation seq。 */
101
+ lastServerSeq: Map<string, number>;
102
+ /** Codex モデル一覧を取得する共有 App Server。 */
103
+ codexAppServer: CodexAppServerManager | null;
104
+ /** Codex native turn/approval 接続。 */
105
+ codexTurnController: CodexTurnControllerRuntime | null;
106
+ /** Claude / ChatGPT 公式アプリ連携。 */
107
+ officialApps: OfficialAppsService | null;
108
+ /** Web プレビュー用 loopback 静的ファイルサーバー。 */
109
+ previewServer: PreviewServer;
110
+ }
111
+ /** ドメイン別ハンドラの契約: message type ごとに narrow された ControlMessage を受ける。 */
112
+ export type MessageHandler<K extends ControlMessage["type"]> = (message: Extract<ControlMessage, {
113
+ type: K;
114
+ }>, ctx: HandlerContext) => void | Promise<void>;
115
+ export type HandlerRegistry = {
116
+ [K in ControlMessage["type"]]?: MessageHandler<K>;
117
+ };
118
+ /**
119
+ * chat オープン/再オープン時、そのセッションに未回答の設問があれば question_prompt を再送する。
120
+ * 未回答の間 transcript に tool_use 行が無く履歴再生では設問が復元されないため、engine の
121
+ * 保持分から再掲する(question-hook-relay)。
122
+ */
123
+ export declare function emitPendingQuestion(ctx: HandlerContext, session: string): Promise<void>;
124
+ export declare function subscribeConversation(ctx: HandlerContext, session: string, newerThanMs?: number): void;
125
+ /** prepare 中は購読を始めず、reaper が読む権威ファイルの idle deadline だけを即時に更新する。 */
126
+ export declare function touchPreparedSession(ctx: HandlerContext, session: string): boolean;
127
+ /** 通常オープンは購読を開始し、prepare は購読せず heartbeat だけを保護する。 */
128
+ export declare function activateOrTouchSession(ctx: HandlerContext, writer: LineWriter, version: number, requestId: string, session: string, shouldSubscribe: boolean, newerThanMs?: number): Promise<boolean>;
129
+ export declare function claimRuntime(ctx: HandlerContext, session: string): Promise<"granted" | "held">;
130
+ export declare function waitForLiveSession(sessionManager: SessionBackend, predicate: (info: SessionInfo) => boolean): Promise<SessionInfo | null>;
131
+ export declare function officialAppRuntimeContext(ctx: HandlerContext, session: string, provider: OfficialAppProvider): Promise<{
132
+ context: OfficialAppRuntimeContext;
133
+ } | {
134
+ reason: string;
135
+ }>;
136
+ /** session_list_response の worktree 掃除結果フィールド(session_kill 応答に同乗)。 */
137
+ export interface WorktreeResponseFields {
138
+ worktreePath: string;
139
+ worktreeRemoved?: boolean;
140
+ worktreeDirty?: boolean;
141
+ }
142
+ /** session_list_response を書き出す(optional cursor / host 採用名は null なら省略)。 */
143
+ export declare function writeSessionListResponse(writer: LineWriter, v: number, id: string, sessions: SessionInfo[], nextCursor: string | null, adoptedName?: string | null, worktree?: WorktreeResponseFields | null): void;
144
+ /** error 封筒を書き出す小ヘルパー。 */
145
+ export declare function writeError(writer: LineWriter, v: number, id: string | undefined, code: string, message: string): void;