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
@@ -0,0 +1,194 @@
1
+ // engine/handlers/mode.ts
2
+ // pane TUI との相互作用: permission mode の読み取り/切替(BTab 巡回)と、
3
+ // Codex TUI 番号付きダイアログへの選択返送(pane_choice_send)。
4
+ import { parsePermissionMode } from "../../shared/permissionMode.js";
5
+ import { sleep } from "../../shared/sleep.js";
6
+ import { engineDiag, writeError } from "../context.js";
7
+ export const modeHandlers = {
8
+ mode_get: async (message, ctx) => {
9
+ const { writer, state, sessionManager } = ctx;
10
+ const v = state.negotiatedVersion;
11
+ // 現在の permission mode を pane 表示から判定して返す(dialog 中は短く再試行)。
12
+ try {
13
+ const mode = await waitForPermissionMode(sessionManager, message.session, ctx.modeTiming.getAttempts, ctx.modeTiming.getPollMs);
14
+ if (mode === null) {
15
+ writeError(writer, v, message.id, "mode_unavailable", "ダイアログ表示中のためモードを判定できません");
16
+ }
17
+ else {
18
+ writer.write({ type: "mode_set_response", v, id: message.id, mode });
19
+ }
20
+ }
21
+ catch (error) {
22
+ writeError(writer, v, message.id, "mode_get_failed", String(error));
23
+ }
24
+ },
25
+ mode_set: (message, ctx) => {
26
+ const { writer, state, sessionManager } = ctx;
27
+ const v = state.negotiatedVersion;
28
+ // mode_set は dialog 待ちが長くなり得るため、read loop を塞がず detached で処理する。
29
+ if (state.modeSetInFlight.has(message.session)) {
30
+ writeError(writer, v, message.id, "mode_set_busy", "mode_set が実行中です。");
31
+ return;
32
+ }
33
+ state.modeSetInFlight.add(message.session);
34
+ void (async () => {
35
+ try {
36
+ const result = await setPermissionMode(sessionManager, message.session, message.mode, ctx.modeTiming);
37
+ if (result.kind === "unavailable") {
38
+ writeError(writer, v, message.id, "mode_unavailable", "ダイアログ表示中のためモードを判定できません");
39
+ }
40
+ else if (result.mode === null) {
41
+ writeError(writer, v, message.id, "mode_set_failed", "permission mode の切替に失敗しました。");
42
+ }
43
+ else {
44
+ writer.write({ type: "mode_set_response", v, id: message.id, mode: result.mode });
45
+ }
46
+ }
47
+ catch (error) {
48
+ writeError(writer, v, message.id, "mode_set_failed", String(error));
49
+ }
50
+ finally {
51
+ state.modeSetInFlight.delete(message.session);
52
+ }
53
+ })();
54
+ },
55
+ pane_choice_send: async (message, ctx) => {
56
+ const { writer, state, sessionManager } = ctx;
57
+ const v = state.negotiatedVersion;
58
+ // Codex TUI の番号付きダイアログ(CLI 更新確認・フック信頼確認など)への選択返送。
59
+ // iOS の PTY(tmux attach) 束縛は herdr セッションでは効かないため、SessionBackend
60
+ // 経由で pane へ番号キー + Enter を注入する(tmux / herdr 両対応)。
61
+ engineDiag(`pane_choice_send id=${message.id} session=${message.session} key=${message.key}`);
62
+ if (!/^\d{1,3}$/.test(message.key)) {
63
+ writer.write({
64
+ type: "pane_choice_send_result", v, id: message.id,
65
+ ok: false, error: `不正な選択キーです: ${message.key}`,
66
+ });
67
+ return;
68
+ }
69
+ try {
70
+ await sessionManager.sendKeys(message.session, [message.key], true);
71
+ // ダイアログの再描画を待ってから確定する(連続注入の取りこぼし防止。
72
+ // 番号キーだけで確定するダイアログでは、遅れて届く Enter は入力欄への
73
+ // 空 submit となり no-op)。
74
+ await sleep(120);
75
+ await sessionManager.sendKeys(message.session, ["Enter"]);
76
+ writer.write({ type: "pane_choice_send_result", v, id: message.id, ok: true, error: null });
77
+ }
78
+ catch (error) {
79
+ engineDiag(`pane_choice_send 失敗 id=${message.id}: ${String(error)}`);
80
+ writer.write({
81
+ type: "pane_choice_send_result", v, id: message.id, ok: false, error: String(error),
82
+ });
83
+ }
84
+ },
85
+ pane_key_send: async (message, ctx) => {
86
+ const { writer, state, sessionManager } = ctx;
87
+ const v = state.negotiatedVersion;
88
+ // 制御キー(中断 C-c 等)の pane 注入。iOS の PTY(tmux attach) 束縛は herdr
89
+ // セッションでは attach 失敗後の生シェルに吸われて claude へ届かないため、
90
+ // pane_choice_send と同じく SessionBackend 経由で注入する(tmux / herdr 両対応)。
91
+ engineDiag(`pane_key_send id=${message.id} session=${message.session} key=${message.key}`);
92
+ if (!PANE_KEY_ALLOWLIST.has(message.key)) {
93
+ writer.write({
94
+ type: "pane_key_send_result", v, id: message.id,
95
+ ok: false, error: `不正なキーです: ${message.key}`,
96
+ });
97
+ return;
98
+ }
99
+ try {
100
+ await sessionManager.sendKeys(message.session, [message.key]);
101
+ writer.write({ type: "pane_key_send_result", v, id: message.id, ok: true, error: null });
102
+ }
103
+ catch (error) {
104
+ engineDiag(`pane_key_send 失敗 id=${message.id}: ${String(error)}`);
105
+ writer.write({
106
+ type: "pane_key_send_result", v, id: message.id, ok: false, error: String(error),
107
+ });
108
+ }
109
+ },
110
+ };
111
+ /**
112
+ * pane_key_send が受理する制御キー(tmux 互換キー名)。テキスト注入経路には使わせない。
113
+ * Up/Down/Enter は Claude TUI の選択ダイアログ(/remote-control 等)の転写カードから
114
+ * カーソル移動 + 確定を返すために使う(pane-menu 転写, 2026-07-28)。
115
+ */
116
+ const PANE_KEY_ALLOWLIST = new Set(["C-c", "Escape", "Up", "Down", "Enter"]);
117
+ /**
118
+ * pane から mode が判定できるまで、指定回数だけ短く待つ。
119
+ *
120
+ * capture の失敗は「まだ判定できない」として次の試行へ進む: 新規セッションでは
121
+ * アプリの楽観オープン(mode_get)が launch のメタデータ記録より先に届き、
122
+ * backend 未記録 → tmux フォールバック → pane 不在で capture が throw する
123
+ * (mode-get-race, 2026-08-03)。メタが書かれれば次試行が正しい backend へ乗る。
124
+ * 一度も capture できずに終わったときだけ、最後の失敗を投げて実障害として返す。
125
+ */
126
+ async function waitForPermissionMode(sessionManager, session, attempts, intervalMs) {
127
+ let captured = false;
128
+ let lastError = null;
129
+ for (let i = 0; i < attempts; i += 1) {
130
+ try {
131
+ const mode = parsePermissionMode(await sessionManager.capturePane(session));
132
+ captured = true;
133
+ if (mode !== null)
134
+ return mode;
135
+ }
136
+ catch (error) {
137
+ lastError = error;
138
+ }
139
+ if (i < attempts - 1)
140
+ await sleep(intervalMs);
141
+ }
142
+ if (!captured && lastError !== null)
143
+ throw lastError;
144
+ return null;
145
+ }
146
+ /** mode_set の実体。dialog が閉じるのを待ち、BTab 後は実際に変化した mode だけを採用する。 */
147
+ async function setPermissionMode(sessionManager, session, target, timing) {
148
+ let current = null;
149
+ let captureFailureLogged = false;
150
+ const initialDeadline = Date.now() + timing.setInitialTimeoutMs;
151
+ while (Date.now() <= initialDeadline) {
152
+ try {
153
+ current = parsePermissionMode(await sessionManager.capturePane(session));
154
+ }
155
+ catch (error) {
156
+ // 起動直後はメタ未記録で capture が失敗し得る(mode-get-race)。deadline まで待つ。
157
+ // 実死亡セッションだと deadline まで失敗し続けて unavailable になるため、
158
+ // 実因(pane 不在等)を診断ログへ一度だけ残す。
159
+ if (!captureFailureLogged) {
160
+ captureFailureLogged = true;
161
+ engineDiag(`mode_set capture 失敗(リトライ継続) session=${session}: ${String(error)}`);
162
+ }
163
+ current = null;
164
+ }
165
+ if (current !== null)
166
+ break;
167
+ await sleep(timing.setInitialPollMs);
168
+ }
169
+ if (current === null)
170
+ return { kind: "unavailable" };
171
+ if (current === target)
172
+ return { kind: "ok", mode: target };
173
+ for (let i = 0; i < 4 && current !== target; i += 1) {
174
+ const before = current;
175
+ await sessionManager.sendKeys(session, ["BTab"]);
176
+ const changeDeadline = Date.now() + timing.setChangeTimeoutMs;
177
+ let changed = false;
178
+ while (Date.now() <= changeDeadline) {
179
+ const next = parsePermissionMode(await sessionManager.capturePane(session));
180
+ // BTab 直後はステータス行が一瞬消える。判定不能を失敗や default とせず、
181
+ // 明示的な次モードが描画されるまで待つ。
182
+ if (next !== null && next !== before) {
183
+ current = next;
184
+ changed = true;
185
+ break;
186
+ }
187
+ await sleep(timing.setChangePollMs);
188
+ }
189
+ if (!changed)
190
+ break;
191
+ }
192
+ return { kind: "ok", mode: current };
193
+ }
194
+ //# sourceMappingURL=mode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mode.js","sourceRoot":"","sources":["../../../src/engine/handlers/mode.ts"],"names":[],"mappings":"AAAA,0BAA0B;AAC1B,uDAAuD;AACvD,+CAA+C;AAE/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAE9C,OAAO,EAAE,UAAU,EAAE,UAAU,EAAyC,MAAM,eAAe,CAAC;AAE9F,MAAM,CAAC,MAAM,YAAY,GAAoB;IAC3C,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE;QAC/B,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,GAAG,GAAG,CAAC;QAC9C,MAAM,CAAC,GAAG,KAAK,CAAC,iBAAiB,CAAC;QAClC,yDAAyD;QACzD,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,qBAAqB,CACtC,cAAc,EACd,OAAO,CAAC,OAAO,EACf,GAAG,CAAC,UAAU,CAAC,WAAW,EAC1B,GAAG,CAAC,UAAU,CAAC,SAAS,CACzB,CAAC;YACF,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;gBAClB,UAAU,CACR,MAAM,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,EACrB,kBAAkB,EAAE,wBAAwB,CAC7C,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;YACvE,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,EAAE,iBAAiB,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QACtE,CAAC;IACH,CAAC;IAED,QAAQ,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,EAAE;QACzB,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,GAAG,GAAG,CAAC;QAC9C,MAAM,CAAC,GAAG,KAAK,CAAC,iBAAiB,CAAC;QAClC,+DAA+D;QAC/D,IAAI,KAAK,CAAC,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YAC/C,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,EAAE,eAAe,EAAE,kBAAkB,CAAC,CAAC;YACvE,OAAO;QACT,CAAC;QACD,KAAK,CAAC,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC3C,KAAK,CAAC,KAAK,IAAI,EAAE;YACf,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,iBAAiB,CACpC,cAAc,EACd,OAAO,CAAC,OAAO,EACf,OAAO,CAAC,IAAI,EACZ,GAAG,CAAC,UAAU,CACf,CAAC;gBACF,IAAI,MAAM,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;oBAClC,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,EAAE,kBAAkB,EAAE,wBAAwB,CAAC,CAAC;gBAClF,CAAC;qBAAM,IAAI,MAAM,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;oBAChC,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,EAAE,iBAAiB,EAAE,6BAA6B,CAAC,CAAC;gBACtF,CAAC;qBAAM,CAAC;oBACN,MAAM,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;gBACpF,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,EAAE,iBAAiB,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YACtE,CAAC;oBAAS,CAAC;gBACT,KAAK,CAAC,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAChD,CAAC;QACH,CAAC,CAAC,EAAE,CAAC;IACP,CAAC;IAED,gBAAgB,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE;QACvC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,GAAG,GAAG,CAAC;QAC9C,MAAM,CAAC,GAAG,KAAK,CAAC,iBAAiB,CAAC;QAClC,kDAAkD;QAClD,gEAAgE;QAChE,kDAAkD;QAClD,UAAU,CAAC,uBAAuB,OAAO,CAAC,EAAE,YAAY,OAAO,CAAC,OAAO,QAAQ,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QAC9F,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YACnC,MAAM,CAAC,KAAK,CAAC;gBACX,IAAI,EAAE,yBAAyB,EAAE,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE;gBAClD,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,cAAc,OAAO,CAAC,GAAG,EAAE;aAC9C,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QACD,IAAI,CAAC;YACH,MAAM,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;YACpE,oCAAoC;YACpC,wCAAwC;YACxC,uBAAuB;YACvB,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;YACjB,MAAM,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;YAC1D,MAAM,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,yBAAyB,EAAE,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9F,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,UAAU,CAAC,0BAA0B,OAAO,CAAC,EAAE,KAAK,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACrE,MAAM,CAAC,KAAK,CAAC;gBACX,IAAI,EAAE,yBAAyB,EAAE,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC;aACpF,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,aAAa,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE;QACpC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,GAAG,GAAG,CAAC;QAC9C,MAAM,CAAC,GAAG,KAAK,CAAC,iBAAiB,CAAC;QAClC,2DAA2D;QAC3D,+CAA+C;QAC/C,kEAAkE;QAClE,UAAU,CAAC,oBAAoB,OAAO,CAAC,EAAE,YAAY,OAAO,CAAC,OAAO,QAAQ,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QAC3F,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YACzC,MAAM,CAAC,KAAK,CAAC;gBACX,IAAI,EAAE,sBAAsB,EAAE,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE;gBAC/C,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,OAAO,CAAC,GAAG,EAAE;aAC5C,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QACD,IAAI,CAAC;YACH,MAAM,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9D,MAAM,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,sBAAsB,EAAE,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3F,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,UAAU,CAAC,uBAAuB,OAAO,CAAC,EAAE,KAAK,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAClE,MAAM,CAAC,KAAK,CAAC;gBACX,IAAI,EAAE,sBAAsB,EAAE,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC;aACjF,CAAC,CAAC;QACL,CAAC;IACH,CAAC;CACF,CAAC;AAEF;;;;GAIG;AACH,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AAE7E;;;;;;;;GAQG;AACH,KAAK,UAAU,qBAAqB,CAClC,cAA8B,EAC9B,OAAe,EACf,QAAgB,EAChB,UAAkB;IAElB,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,SAAS,GAAY,IAAI,CAAC;IAC9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACrC,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,mBAAmB,CAAC,MAAM,cAAc,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC;YAC5E,QAAQ,GAAG,IAAI,CAAC;YAChB,IAAI,IAAI,KAAK,IAAI;gBAAE,OAAO,IAAI,CAAC;QACjC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,SAAS,GAAG,KAAK,CAAC;QACpB,CAAC;QACD,IAAI,CAAC,GAAG,QAAQ,GAAG,CAAC;YAAE,MAAM,KAAK,CAAC,UAAU,CAAC,CAAC;IAChD,CAAC;IACD,IAAI,CAAC,QAAQ,IAAI,SAAS,KAAK,IAAI;QAAE,MAAM,SAAS,CAAC;IACrD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,gEAAgE;AAChE,KAAK,UAAU,iBAAiB,CAC9B,cAA8B,EAC9B,OAAe,EACf,MAAc,EACd,MAAkB;IAElB,IAAI,OAAO,GAAkB,IAAI,CAAC;IAClC,IAAI,oBAAoB,GAAG,KAAK,CAAC;IACjC,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,mBAAmB,CAAC;IAChE,OAAO,IAAI,CAAC,GAAG,EAAE,IAAI,eAAe,EAAE,CAAC;QACrC,IAAI,CAAC;YACH,OAAO,GAAG,mBAAmB,CAAC,MAAM,cAAc,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC;QAC3E,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,2DAA2D;YAC3D,kDAAkD;YAClD,4BAA4B;YAC5B,IAAI,CAAC,oBAAoB,EAAE,CAAC;gBAC1B,oBAAoB,GAAG,IAAI,CAAC;gBAC5B,UAAU,CAAC,uCAAuC,OAAO,KAAK,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACjF,CAAC;YACD,OAAO,GAAG,IAAI,CAAC;QACjB,CAAC;QACD,IAAI,OAAO,KAAK,IAAI;YAAE,MAAM;QAC5B,MAAM,KAAK,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;IACvC,CAAC;IACD,IAAI,OAAO,KAAK,IAAI;QAAE,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;IACrD,IAAI,OAAO,KAAK,MAAM;QAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAE5D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACpD,MAAM,MAAM,GAAW,OAAO,CAAC;QAC/B,MAAM,cAAc,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;QACjD,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,kBAAkB,CAAC;QAC9D,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,OAAO,IAAI,CAAC,GAAG,EAAE,IAAI,cAAc,EAAE,CAAC;YACpC,MAAM,IAAI,GAAG,mBAAmB,CAAC,MAAM,cAAc,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC;YAC5E,6CAA6C;YAC7C,sBAAsB;YACtB,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;gBACrC,OAAO,GAAG,IAAI,CAAC;gBACf,OAAO,GAAG,IAAI,CAAC;gBACf,MAAM;YACR,CAAC;YACD,MAAM,KAAK,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;QACtC,CAAC;QACD,IAAI,CAAC,OAAO;YAAE,MAAM;IACtB,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AACvC,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { type HandlerRegistry } from "../context.js";
2
+ export declare const officialAppHandlers: HandlerRegistry;
@@ -0,0 +1,79 @@
1
+ // engine/handlers/officialApps.ts
2
+ // Claude / ChatGPT 公式アプリ連携: 状態問い合わせと action 実行。
3
+ // action 実行の前後でフォーカス・provider・生存を再検証し、別セッションへ
4
+ // URL / pairing material を返さない。
5
+ import { officialAppRuntimeContext } from "../context.js";
6
+ export const officialAppHandlers = {
7
+ official_app_status_request: async (message, ctx) => {
8
+ const { writer, state } = ctx;
9
+ const v = state.negotiatedVersion;
10
+ if (ctx.officialApps === null) {
11
+ writer.write({
12
+ type: "official_app_status_response",
13
+ v,
14
+ id: message.id,
15
+ provider: message.provider,
16
+ state: "unavailable",
17
+ canOpen: false,
18
+ canStart: false,
19
+ unavailableReason: "official_feature_unavailable",
20
+ });
21
+ return;
22
+ }
23
+ const resolved = await officialAppRuntimeContext(ctx, message.session, message.provider);
24
+ const status = "reason" in resolved
25
+ ? {
26
+ provider: message.provider,
27
+ state: "unavailable",
28
+ canOpen: false,
29
+ canStart: false,
30
+ unavailableReason: resolved.reason,
31
+ }
32
+ : await ctx.officialApps.status(resolved.context);
33
+ writer.write({ type: "official_app_status_response", v, id: message.id, ...status });
34
+ },
35
+ official_app_action_request: async (message, ctx) => {
36
+ const { writer, state } = ctx;
37
+ const v = state.negotiatedVersion;
38
+ if (ctx.officialApps === null) {
39
+ writer.write({
40
+ type: "official_app_action_response",
41
+ v,
42
+ id: message.id,
43
+ provider: message.provider,
44
+ outcome: "unavailable",
45
+ unavailableReason: "official_feature_unavailable",
46
+ });
47
+ return;
48
+ }
49
+ const before = await officialAppRuntimeContext(ctx, message.session, message.provider);
50
+ if ("reason" in before) {
51
+ writer.write({
52
+ type: "official_app_action_response",
53
+ v,
54
+ id: message.id,
55
+ provider: message.provider,
56
+ outcome: "unavailable",
57
+ unavailableReason: before.reason,
58
+ });
59
+ return;
60
+ }
61
+ const result = await ctx.officialApps.perform(before.context, message.action, message.automaticEnable, message.paired);
62
+ // 外部 CLI / pane 操作の間に対象が失われた場合、別セッションへ URL や
63
+ // pairing material を返さない。再フォーカス後の再試行だけを許す。
64
+ const after = await officialAppRuntimeContext(ctx, message.session, message.provider);
65
+ if ("reason" in after) {
66
+ writer.write({
67
+ type: "official_app_action_response",
68
+ v,
69
+ id: message.id,
70
+ provider: message.provider,
71
+ outcome: "unavailable",
72
+ unavailableReason: after.reason,
73
+ });
74
+ return;
75
+ }
76
+ writer.write({ type: "official_app_action_response", v, id: message.id, ...result });
77
+ },
78
+ };
79
+ //# sourceMappingURL=officialApps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"officialApps.js","sourceRoot":"","sources":["../../../src/engine/handlers/officialApps.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { type HandlerRegistry } from "../context.js";
2
+ export declare const previewHandlers: HandlerRegistry;
@@ -0,0 +1,59 @@
1
+ // engine/handlers/preview.ts
2
+ // Web プレビューと開発サーバー: loopback 静的配信の開始/終了、LISTEN 中サーバーの
3
+ // 一覧(serve-list)と停止(pid+port 照合)。
4
+ import { listServeProcesses, stopServeProcess } from "../../services/serveService.js";
5
+ import { engineDiag } from "../context.js";
6
+ export const previewHandlers = {
7
+ preview_open: async (message, ctx) => {
8
+ const { writer, state } = ctx;
9
+ const v = state.negotiatedVersion;
10
+ // Web プレビュー: HTML ファイルの loopback 静的配信を開始し、到達 URL を返す。
11
+ // iOS はこの URL の port へ direct-tcpip トンネルを張って開く。
12
+ try {
13
+ const { url } = await ctx.previewServer.open(message.id, message.target);
14
+ writer.write({ type: "preview_ready", v, id: message.id, url });
15
+ }
16
+ catch (error) {
17
+ const detail = error instanceof Error ? error.message : String(error);
18
+ try {
19
+ writer.write({ type: "preview_error", v, id: message.id, message: detail });
20
+ }
21
+ catch (writeError) {
22
+ process.stderr.write(`[tailii-host engine] preview_error 書込失敗: ${String(writeError)}\n`);
23
+ }
24
+ }
25
+ },
26
+ preview_close: async (message, ctx) => {
27
+ await ctx.previewServer.close(message.id);
28
+ },
29
+ serve_list_request: async (message, ctx) => {
30
+ const { writer, state } = ctx;
31
+ const v = state.negotiatedVersion;
32
+ // Mac 上で LISTEN 中の開発サーバー一覧(serve-list)。engine 自身
33
+ // (previewServer の loopback 静的サーバー含む)は除外する。
34
+ engineDiag(`serve_list_request id=${message.id}`);
35
+ try {
36
+ const servers = await listServeProcesses({ excludePids: [process.pid], withTitles: true });
37
+ writer.write({ type: "serve_list_response", v, id: message.id, servers });
38
+ }
39
+ catch (error) {
40
+ engineDiag(`serve_list_response 失敗 id=${message.id}: ${String(error)}`);
41
+ writer.write({ type: "serve_list_response", v, id: message.id, servers: [] });
42
+ }
43
+ },
44
+ serve_stop_request: async (message, ctx) => {
45
+ const { writer, state } = ctx;
46
+ const v = state.negotiatedVersion;
47
+ // 開発サーバーの停止。pid+port の現在照合つき(pid 再利用の誤爆防止)。
48
+ engineDiag(`serve_stop_request id=${message.id} pid=${message.pid} port=${message.port}`);
49
+ try {
50
+ const result = await stopServeProcess(message.pid, message.port);
51
+ writer.write({ type: "serve_stop_response", v, id: message.id, ...result });
52
+ }
53
+ catch (error) {
54
+ engineDiag(`serve_stop_response 失敗 id=${message.id}: ${String(error)}`);
55
+ writer.write({ type: "serve_stop_response", v, id: message.id, ok: false, error: String(error) });
56
+ }
57
+ },
58
+ };
59
+ //# sourceMappingURL=preview.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preview.js","sourceRoot":"","sources":["../../../src/engine/handlers/preview.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { type HandlerRegistry } from "../context.js";
2
+ export declare const sessionHandlers: HandlerRegistry;