tailii-host 0.1.1 → 0.4.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.
- package/README.md +28 -10
- package/dist/{broker.d.ts → approval/broker.d.ts} +9 -5
- package/dist/{broker.js → approval/broker.js} +42 -6
- package/dist/approval/broker.js.map +1 -0
- package/dist/{hook.d.ts → approval/hook.d.ts} +48 -7
- package/dist/{hook.js → approval/hook.js} +359 -50
- package/dist/approval/hook.js.map +1 -0
- package/dist/backend/herdr.d.ts +260 -0
- package/dist/backend/herdr.js +838 -0
- package/dist/backend/herdr.js.map +1 -0
- package/dist/backend/sessionBackend.d.ts +81 -0
- package/dist/backend/sessionBackend.js +114 -0
- package/dist/backend/sessionBackend.js.map +1 -0
- package/dist/backend/tmux.d.ts +125 -0
- package/dist/backend/tmux.js +392 -0
- package/dist/backend/tmux.js.map +1 -0
- package/dist/{chatTailController.d.ts → chat/chatTailController.d.ts} +29 -6
- package/dist/{chatTailController.js → chat/chatTailController.js} +94 -18
- package/dist/chat/chatTailController.js.map +1 -0
- package/dist/{imageService.d.ts → chat/imageService.d.ts} +12 -1
- package/dist/{imageService.js → chat/imageService.js} +39 -11
- package/dist/chat/imageService.js.map +1 -0
- package/dist/chat/remoteQuestionMonitor.d.ts +27 -0
- package/dist/chat/remoteQuestionMonitor.js +128 -0
- package/dist/chat/remoteQuestionMonitor.js.map +1 -0
- package/dist/chat/subagentTailer.d.ts +30 -0
- package/dist/chat/subagentTailer.js +704 -0
- package/dist/chat/subagentTailer.js.map +1 -0
- package/dist/chat/subagentTranscript.d.ts +20 -0
- package/dist/chat/subagentTranscript.js +273 -0
- package/dist/chat/subagentTranscript.js.map +1 -0
- package/dist/{transcriptTailer.d.ts → chat/transcriptTailer.d.ts} +12 -1
- package/dist/{transcriptTailer.js → chat/transcriptTailer.js} +183 -10
- package/dist/chat/transcriptTailer.js.map +1 -0
- package/dist/cli.js +24 -10
- package/dist/cli.js.map +1 -1
- package/dist/codex/codexAccountUsage.d.ts +22 -0
- package/dist/codex/codexAccountUsage.js +128 -0
- package/dist/codex/codexAccountUsage.js.map +1 -0
- package/dist/codex/codexAppServer.d.ts +166 -0
- package/dist/codex/codexAppServer.js +1297 -0
- package/dist/codex/codexAppServer.js.map +1 -0
- package/dist/codex/codexNativeTurnController.d.ts +153 -0
- package/dist/codex/codexNativeTurnController.js +673 -0
- package/dist/codex/codexNativeTurnController.js.map +1 -0
- package/dist/codex/codexRolloutTailer.d.ts +100 -0
- package/dist/codex/codexRolloutTailer.js +568 -0
- package/dist/codex/codexRolloutTailer.js.map +1 -0
- package/dist/{codexSessionStore.d.ts → codex/codexSessionStore.d.ts} +10 -2
- package/dist/{codexSessionStore.js → codex/codexSessionStore.js} +184 -15
- package/dist/codex/codexSessionStore.js.map +1 -0
- package/dist/codex/codexSubagentTracker.d.ts +21 -0
- package/dist/codex/codexSubagentTracker.js +281 -0
- package/dist/codex/codexSubagentTracker.js.map +1 -0
- package/dist/codex/codexToolActivity.d.ts +69 -0
- package/dist/codex/codexToolActivity.js +425 -0
- package/dist/codex/codexToolActivity.js.map +1 -0
- package/dist/{codexUsage.d.ts → codex/codexUsage.d.ts} +1 -1
- package/dist/{codexUsage.js → codex/codexUsage.js} +19 -26
- package/dist/codex/codexUsage.js.map +1 -0
- package/dist/commands/doctor.d.ts +65 -0
- package/dist/commands/doctor.js +425 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/{hookSettings.d.ts → commands/hookSettings.d.ts} +14 -1
- package/dist/{hookSettings.js → commands/hookSettings.js} +96 -12
- package/dist/commands/hookSettings.js.map +1 -0
- package/dist/{kick.js → commands/kick.js} +16 -1
- package/dist/commands/kick.js.map +1 -0
- package/dist/{launch.d.ts → commands/launch.d.ts} +67 -5
- package/dist/commands/launch.js +716 -0
- package/dist/commands/launch.js.map +1 -0
- package/dist/commands/legacyHomeMigration.js.map +1 -0
- package/dist/{pairingCode.d.ts → commands/pairingCode.d.ts} +29 -2
- package/dist/{pairingCode.js → commands/pairingCode.js} +120 -11
- package/dist/commands/pairingCode.js.map +1 -0
- package/dist/{pushTokenCommand.d.ts → commands/pushTokenCommand.d.ts} +1 -1
- package/dist/{pushTokenCommand.js → commands/pushTokenCommand.js} +2 -2
- package/dist/commands/pushTokenCommand.js.map +1 -0
- package/dist/commands/selfUpdate.d.ts +71 -0
- package/dist/commands/selfUpdate.js +536 -0
- package/dist/commands/selfUpdate.js.map +1 -0
- package/dist/{setup.d.ts → commands/setup.d.ts} +17 -6
- package/dist/{setup.js → commands/setup.js} +133 -75
- package/dist/commands/setup.js.map +1 -0
- package/dist/engine/context.d.ts +145 -0
- package/dist/engine/context.js +184 -0
- package/dist/engine/context.js.map +1 -0
- package/dist/engine/engine.d.ts +121 -0
- package/dist/engine/engine.js +808 -0
- package/dist/engine/engine.js.map +1 -0
- package/dist/engine/handlers/accountUsage.d.ts +53 -0
- package/dist/engine/handlers/accountUsage.js +203 -0
- package/dist/engine/handlers/accountUsage.js.map +1 -0
- package/dist/engine/handlers/claudeModels.d.ts +2 -0
- package/dist/engine/handlers/claudeModels.js +23 -0
- package/dist/engine/handlers/claudeModels.js.map +1 -0
- package/dist/engine/handlers/codex.d.ts +2 -0
- package/dist/engine/handlers/codex.js +97 -0
- package/dist/engine/handlers/codex.js.map +1 -0
- package/dist/engine/handlers/conversation.d.ts +2 -0
- package/dist/engine/handlers/conversation.js +259 -0
- package/dist/engine/handlers/conversation.js.map +1 -0
- package/dist/engine/handlers/core.d.ts +2 -0
- package/dist/engine/handlers/core.js +66 -0
- package/dist/engine/handlers/core.js.map +1 -0
- package/dist/engine/handlers/git.d.ts +2 -0
- package/dist/engine/handlers/git.js +127 -0
- package/dist/engine/handlers/git.js.map +1 -0
- package/dist/engine/handlers/index.d.ts +2 -0
- package/dist/engine/handlers/index.js +34 -0
- package/dist/engine/handlers/index.js.map +1 -0
- package/dist/engine/handlers/mode.d.ts +2 -0
- package/dist/engine/handlers/mode.js +194 -0
- package/dist/engine/handlers/mode.js.map +1 -0
- package/dist/engine/handlers/officialApps.d.ts +2 -0
- package/dist/engine/handlers/officialApps.js +79 -0
- package/dist/engine/handlers/officialApps.js.map +1 -0
- package/dist/engine/handlers/preview.d.ts +2 -0
- package/dist/engine/handlers/preview.js +59 -0
- package/dist/engine/handlers/preview.js.map +1 -0
- package/dist/engine/handlers/selfUpdate.d.ts +2 -0
- package/dist/engine/handlers/selfUpdate.js +52 -0
- package/dist/engine/handlers/selfUpdate.js.map +1 -0
- package/dist/engine/handlers/session.d.ts +2 -0
- package/dist/engine/handlers/session.js +385 -0
- package/dist/engine/handlers/session.js.map +1 -0
- package/dist/engine/handlers/usage.d.ts +2 -0
- package/dist/engine/handlers/usage.js +96 -0
- package/dist/engine/handlers/usage.js.map +1 -0
- package/dist/engine/handlers/workspace.d.ts +2 -0
- package/dist/engine/handlers/workspace.js +110 -0
- package/dist/engine/handlers/workspace.js.map +1 -0
- package/dist/engine/slashCommands.d.ts +3 -0
- package/dist/engine/slashCommands.js +211 -0
- package/dist/engine/slashCommands.js.map +1 -0
- package/dist/hub/engineRelaySocket.d.ts +58 -0
- package/dist/hub/engineRelaySocket.js +161 -0
- package/dist/hub/engineRelaySocket.js.map +1 -0
- package/dist/hub/hubClient.d.ts +28 -0
- package/dist/hub/hubClient.js +187 -0
- package/dist/hub/hubClient.js.map +1 -0
- package/dist/hub/hubDaemon.d.ts +69 -0
- package/dist/hub/hubDaemon.js +466 -0
- package/dist/hub/hubDaemon.js.map +1 -0
- package/dist/hub/hubProtocol.d.ts +161 -0
- package/dist/hub/hubProtocol.js +379 -0
- package/dist/hub/hubProtocol.js.map +1 -0
- package/dist/hub/panePreviewPump.d.ts +65 -0
- package/dist/hub/panePreviewPump.js +187 -0
- package/dist/hub/panePreviewPump.js.map +1 -0
- package/dist/hub/questionInjection.d.ts +19 -0
- package/dist/hub/questionInjection.js +126 -0
- package/dist/hub/questionInjection.js.map +1 -0
- package/dist/hub/reaper.d.ts +74 -0
- package/dist/hub/reaper.js +333 -0
- package/dist/hub/reaper.js.map +1 -0
- package/dist/hub/sessionHub.d.ts +203 -0
- package/dist/hub/sessionHub.js +1862 -0
- package/dist/hub/sessionHub.js.map +1 -0
- package/dist/protocol/common.d.ts +18 -0
- package/dist/protocol/common.js +78 -0
- package/dist/protocol/common.js.map +1 -0
- package/dist/protocol/decode.d.ts +3 -0
- package/dist/protocol/decode.js +1058 -0
- package/dist/protocol/decode.js.map +1 -0
- package/dist/protocol/encode.d.ts +3 -0
- package/dist/protocol/encode.js +84 -0
- package/dist/protocol/encode.js.map +1 -0
- package/dist/protocol/messages.d.ts +1025 -0
- package/dist/protocol/messages.js +8 -0
- package/dist/protocol/messages.js.map +1 -0
- package/dist/protocol.d.ts +4 -329
- package/dist/protocol.js +13 -531
- package/dist/protocol.js.map +1 -1
- package/dist/push/apnsConfigStore.js.map +1 -0
- package/dist/push/apnsJwtProvider.js.map +1 -0
- package/dist/{apnsSender.js.map → push/apnsSender.js.map} +1 -1
- package/dist/{approvalPushNotifier.js → push/approvalPushNotifier.js} +1 -1
- package/dist/push/approvalPushNotifier.js.map +1 -0
- package/dist/push/deviceTokenStore.js.map +1 -0
- package/dist/{pushTypes.js → push/pushTypes.js} +1 -1
- package/dist/push/pushTypes.js.map +1 -0
- package/dist/push/sendLog.js.map +1 -0
- package/dist/services/accountIdentity.d.ts +44 -0
- package/dist/services/accountIdentity.js +184 -0
- package/dist/services/accountIdentity.js.map +1 -0
- package/dist/services/claudeCredentialRefresh.d.ts +30 -0
- package/dist/services/claudeCredentialRefresh.js +345 -0
- package/dist/services/claudeCredentialRefresh.js.map +1 -0
- package/dist/services/claudeModelCatalog.d.ts +21 -0
- package/dist/services/claudeModelCatalog.js +181 -0
- package/dist/services/claudeModelCatalog.js.map +1 -0
- package/dist/{dirLister.d.ts → services/dirLister.d.ts} +9 -4
- package/dist/services/dirLister.js +169 -0
- package/dist/services/dirLister.js.map +1 -0
- package/dist/services/fileService.d.ts +10 -0
- package/dist/services/fileService.js +123 -0
- package/dist/services/fileService.js.map +1 -0
- package/dist/services/gitService.d.ts +79 -0
- package/dist/services/gitService.js +648 -0
- package/dist/services/gitService.js.map +1 -0
- package/dist/services/hostVersions.d.ts +38 -0
- package/dist/services/hostVersions.js +120 -0
- package/dist/services/hostVersions.js.map +1 -0
- package/dist/services/officialApps.d.ts +148 -0
- package/dist/services/officialApps.js +1079 -0
- package/dist/services/officialApps.js.map +1 -0
- package/dist/services/planUsageFetcher.d.ts +119 -0
- package/dist/services/planUsageFetcher.js +357 -0
- package/dist/services/planUsageFetcher.js.map +1 -0
- package/dist/services/previewServer.d.ts +31 -0
- package/dist/services/previewServer.js +233 -0
- package/dist/services/previewServer.js.map +1 -0
- package/dist/services/quicGateway.d.ts +143 -0
- package/dist/services/quicGateway.js +292 -0
- package/dist/services/quicGateway.js.map +1 -0
- package/dist/services/serveService.d.ts +50 -0
- package/dist/services/serveService.js +302 -0
- package/dist/services/serveService.js.map +1 -0
- package/dist/services/usageAggregator.js.map +1 -0
- package/dist/sessions/claudeSessionStore.d.ts +80 -0
- package/dist/sessions/claudeSessionStore.js +477 -0
- package/dist/sessions/claudeSessionStore.js.map +1 -0
- package/dist/sessions/heartbeat.d.ts +24 -0
- package/dist/sessions/heartbeat.js +86 -0
- package/dist/sessions/heartbeat.js.map +1 -0
- package/dist/sessions/liveSessionJoin.d.ts +20 -0
- package/dist/sessions/liveSessionJoin.js +80 -0
- package/dist/sessions/liveSessionJoin.js.map +1 -0
- package/dist/sessions/sessionActivityProvider.d.ts +14 -0
- package/dist/sessions/sessionActivityProvider.js +57 -0
- package/dist/sessions/sessionActivityProvider.js.map +1 -0
- package/dist/{sessionListService.d.ts → sessions/sessionListService.d.ts} +3 -3
- package/dist/{sessionListService.js → sessions/sessionListService.js} +23 -6
- package/dist/sessions/sessionListService.js.map +1 -0
- package/dist/{sessionMetadataStore.d.ts → sessions/sessionMetadataStore.d.ts} +18 -0
- package/dist/{sessionMetadataStore.js → sessions/sessionMetadataStore.js} +36 -1
- package/dist/sessions/sessionMetadataStore.js.map +1 -0
- package/dist/{sessionSearch.d.ts → sessions/sessionSearch.d.ts} +1 -1
- package/dist/sessions/sessionSearch.js.map +1 -0
- package/dist/shared/hostDisplayName.d.ts +11 -0
- package/dist/shared/hostDisplayName.js +50 -0
- package/dist/shared/hostDisplayName.js.map +1 -0
- package/dist/{lineWriter.d.ts → shared/lineWriter.d.ts} +1 -1
- package/dist/{lineWriter.js → shared/lineWriter.js} +1 -1
- package/dist/shared/lineWriter.js.map +1 -0
- package/dist/{observationLog.js.map → shared/observationLog.js.map} +1 -1
- package/dist/{paths.d.ts → shared/paths.d.ts} +7 -0
- package/dist/{paths.js → shared/paths.js} +9 -0
- package/dist/shared/paths.js.map +1 -0
- package/dist/shared/permissionMode.d.ts +10 -0
- package/dist/shared/permissionMode.js +51 -0
- package/dist/shared/permissionMode.js.map +1 -0
- package/dist/shared/skillInjection.d.ts +9 -0
- package/dist/shared/skillInjection.js +16 -0
- package/dist/shared/skillInjection.js.map +1 -0
- package/dist/shared/sleep.js.map +1 -0
- package/dist/{socketPath.d.ts → shared/socketPath.d.ts} +4 -0
- package/dist/{socketPath.js → shared/socketPath.js} +22 -0
- package/dist/shared/socketPath.js.map +1 -0
- package/dist/shared/version.js.map +1 -0
- package/package.json +13 -7
- package/dist/apnsConfigStore.js.map +0 -1
- package/dist/apnsJwtProvider.js.map +0 -1
- package/dist/approvalPushNotifier.js.map +0 -1
- package/dist/broker.js.map +0 -1
- package/dist/chatTailController.js.map +0 -1
- package/dist/claudeSessionStore.d.ts +0 -15
- package/dist/claudeSessionStore.js +0 -201
- package/dist/claudeSessionStore.js.map +0 -1
- package/dist/codexRolloutTailer.d.ts +0 -56
- package/dist/codexRolloutTailer.js +0 -303
- package/dist/codexRolloutTailer.js.map +0 -1
- package/dist/codexSessionStore.js.map +0 -1
- package/dist/codexUsage.js.map +0 -1
- package/dist/deviceTokenStore.js.map +0 -1
- package/dist/dirLister.js +0 -98
- package/dist/dirLister.js.map +0 -1
- package/dist/doctor.d.ts +0 -36
- package/dist/doctor.js +0 -162
- package/dist/doctor.js.map +0 -1
- package/dist/engine.d.ts +0 -85
- package/dist/engine.js +0 -962
- package/dist/engine.js.map +0 -1
- package/dist/hook.js.map +0 -1
- package/dist/hookSettings.js.map +0 -1
- package/dist/idleReaper.d.ts +0 -13
- package/dist/idleReaper.js +0 -30
- package/dist/idleReaper.js.map +0 -1
- package/dist/imageService.js.map +0 -1
- package/dist/kick.js.map +0 -1
- package/dist/launch.js +0 -396
- package/dist/launch.js.map +0 -1
- package/dist/legacyHomeMigration.js.map +0 -1
- package/dist/lineWriter.js.map +0 -1
- package/dist/mdnsAdvertiser.d.ts +0 -46
- package/dist/mdnsAdvertiser.js +0 -268
- package/dist/mdnsAdvertiser.js.map +0 -1
- package/dist/pairingCode.js.map +0 -1
- package/dist/paths.js.map +0 -1
- package/dist/permissionMode.d.ts +0 -8
- package/dist/permissionMode.js +0 -32
- package/dist/permissionMode.js.map +0 -1
- package/dist/planUsageFetcher.d.ts +0 -35
- package/dist/planUsageFetcher.js +0 -172
- package/dist/planUsageFetcher.js.map +0 -1
- package/dist/pushTokenCommand.js.map +0 -1
- package/dist/pushTypes.js.map +0 -1
- package/dist/sendLog.js.map +0 -1
- package/dist/sessionActivityProvider.d.ts +0 -7
- package/dist/sessionActivityProvider.js +0 -44
- package/dist/sessionActivityProvider.js.map +0 -1
- package/dist/sessionIdleTracker.d.ts +0 -19
- package/dist/sessionIdleTracker.js +0 -42
- package/dist/sessionIdleTracker.js.map +0 -1
- package/dist/sessionListService.js.map +0 -1
- package/dist/sessionMetadataStore.js.map +0 -1
- package/dist/sessionSearch.js.map +0 -1
- package/dist/setup.js.map +0 -1
- package/dist/sleep.js.map +0 -1
- package/dist/socketPath.js.map +0 -1
- package/dist/subagentTailer.d.ts +0 -15
- package/dist/subagentTailer.js +0 -399
- package/dist/subagentTailer.js.map +0 -1
- package/dist/tmux.d.ts +0 -62
- package/dist/tmux.js +0 -163
- package/dist/tmux.js.map +0 -1
- package/dist/transcriptTailer.js.map +0 -1
- package/dist/usageAggregator.js.map +0 -1
- package/dist/version.js.map +0 -1
- /package/dist/{kick.d.ts → commands/kick.d.ts} +0 -0
- /package/dist/{legacyHomeMigration.d.ts → commands/legacyHomeMigration.d.ts} +0 -0
- /package/dist/{legacyHomeMigration.js → commands/legacyHomeMigration.js} +0 -0
- /package/dist/{apnsConfigStore.d.ts → push/apnsConfigStore.d.ts} +0 -0
- /package/dist/{apnsConfigStore.js → push/apnsConfigStore.js} +0 -0
- /package/dist/{apnsJwtProvider.d.ts → push/apnsJwtProvider.d.ts} +0 -0
- /package/dist/{apnsJwtProvider.js → push/apnsJwtProvider.js} +0 -0
- /package/dist/{apnsSender.d.ts → push/apnsSender.d.ts} +0 -0
- /package/dist/{apnsSender.js → push/apnsSender.js} +0 -0
- /package/dist/{approvalPushNotifier.d.ts → push/approvalPushNotifier.d.ts} +0 -0
- /package/dist/{deviceTokenStore.d.ts → push/deviceTokenStore.d.ts} +0 -0
- /package/dist/{deviceTokenStore.js → push/deviceTokenStore.js} +0 -0
- /package/dist/{pushTypes.d.ts → push/pushTypes.d.ts} +0 -0
- /package/dist/{sendLog.d.ts → push/sendLog.d.ts} +0 -0
- /package/dist/{sendLog.js → push/sendLog.js} +0 -0
- /package/dist/{usageAggregator.d.ts → services/usageAggregator.d.ts} +0 -0
- /package/dist/{usageAggregator.js → services/usageAggregator.js} +0 -0
- /package/dist/{sessionSearch.js → sessions/sessionSearch.js} +0 -0
- /package/dist/{observationLog.d.ts → shared/observationLog.d.ts} +0 -0
- /package/dist/{observationLog.js → shared/observationLog.js} +0 -0
- /package/dist/{sleep.d.ts → shared/sleep.d.ts} +0 -0
- /package/dist/{sleep.js → shared/sleep.js} +0 -0
- /package/dist/{version.d.ts → shared/version.d.ts} +0 -0
- /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
|
-
//
|
|
6
|
-
//
|
|
7
|
-
//
|
|
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
|
-
// 注意:
|
|
25
|
-
//
|
|
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
|
-
|
|
252
|
-
|
|
253
|
-
|
|
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
|
-
// ---
|
|
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
|
|
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
|
-
|
|
312
|
-
const
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
"
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
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(
|
|
338
|
+
process.stderr.write(`ペアリング待受サーバの起動に失敗: ${String(error)}\n`);
|
|
355
339
|
return 1;
|
|
356
340
|
}
|
|
357
341
|
const address = server.address();
|
|
358
|
-
const
|
|
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 の
|
|
415
|
+
` 接続先 : ${host}:${options.port}\n` +
|
|
416
|
+
" iPhone の Tailii →「ペアリング」→「直接入力」に上の host:port を入力\n" +
|
|
363
417
|
" → 接続すると両側に 6桁コードが出るので、一致を確認して承認\n" +
|
|
364
|
-
" (QR
|
|
418
|
+
" (QR をスキャンした場合は何もしなくてよい — 自動で完了します)\n" +
|
|
365
419
|
"================================================\n");
|
|
366
420
|
try {
|
|
367
|
-
const socket = await acceptOneConnection(server,
|
|
421
|
+
const socket = await acceptOneConnection(server, 600_000);
|
|
368
422
|
if (socket === null) {
|
|
369
|
-
|
|
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(
|
|
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;
|