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
|
@@ -4,7 +4,11 @@
|
|
|
4
4
|
// Claude Code の PreToolUse / PostToolUse フック。stdin JSON の `hook_event_name` で分岐する。
|
|
5
5
|
//
|
|
6
6
|
// PreToolUse(ツール実行の唯一のゲート意思決定点):
|
|
7
|
-
//
|
|
7
|
+
// まず hook 入力の `permission_mode`(Claude Code が渡す現在値)を判定し、
|
|
8
|
+
// 旧版互換で欠落時だけ tmux pane の mode-picker 表示へフォールバックする。
|
|
9
|
+
// auto(全自動)なら即 allow、acceptEdits なら編集系ツールのみ即 allow して
|
|
10
|
+
// iPhone 承認をスキップする(mode_set での途中切替が確認モーダルに反映される)。
|
|
11
|
+
// それ以外は summary と構造化 diff(Write=create+全文 / Edit=edit+old/new)を生成し、
|
|
8
12
|
// unix domain socket クライアントとして broker(=iPhone)へ approval_request(一意 id)を
|
|
9
13
|
// 送り、内部デッドライン内に approval_decision を受信して permissionDecision を stdout 出力。
|
|
10
14
|
// 決定はブロードキャストされるため自 id のみ受理する(5.4)。tool_input のパスが
|
|
@@ -14,6 +18,9 @@
|
|
|
14
18
|
// 即 deny せず背景 push(notifier 注入時のみ・このブランチのみ, 相互排他 7.1)→
|
|
15
19
|
// 内部デッドライン内で同一 SocketPath へ retry-connect(8.1)。接続できたら残り予算で
|
|
16
20
|
// 送出+決定待ち(8.2)。デッドライン到達で安全側 deny(8.3)。
|
|
21
|
+
// 決定待ち中の切断(iOS の chat 離脱=serve チャネル close / SSH 断)も同じフォールバック
|
|
22
|
+
// に合流する: remote_pending(一覧バッジ/バナー)と push で気づかせ、再接続後に同一 id で
|
|
23
|
+
// approval_request を送り直す(chat を開き直せば承認を続行できる)。
|
|
17
24
|
//
|
|
18
25
|
// PostToolUse(別呼び出し、ゲートしない): ObservationLog に監査追記して exit 0(5.8)。
|
|
19
26
|
//
|
|
@@ -24,11 +31,20 @@ import * as net from "node:net";
|
|
|
24
31
|
import * as os from "node:os";
|
|
25
32
|
import * as path from "node:path";
|
|
26
33
|
import { randomUUID } from "node:crypto";
|
|
27
|
-
import { makeProductionPushNotifier } from "
|
|
28
|
-
import {
|
|
29
|
-
import {
|
|
30
|
-
import {
|
|
31
|
-
import {
|
|
34
|
+
import { makeProductionPushNotifier, ObservationLogPushObserver, } from "../push/approvalPushNotifier.js";
|
|
35
|
+
import { sendQuestionEventToEngine, sendRemotePendingToEngine, sendSessionProcessingToEngine, } from "../hub/engineRelaySocket.js";
|
|
36
|
+
import { questionsFromToolInput } from "../chat/transcriptTailer.js";
|
|
37
|
+
import { defaultHeartbeatDir, writeHeartbeat } from "../sessions/heartbeat.js";
|
|
38
|
+
import { ensureHubDaemon } from "../hub/hubDaemon.js";
|
|
39
|
+
import { decodeHubServerLine, encodeHubMessage } from "../hub/hubProtocol.js";
|
|
40
|
+
import { ObservationLog, defaultObservationBase } from "../shared/observationLog.js";
|
|
41
|
+
import { parsePermissionMode } from "../shared/permissionMode.js";
|
|
42
|
+
import { resolveHubSocketPath, resolveSocketPath } from "../shared/socketPath.js";
|
|
43
|
+
import { attachedSessions } from "../hub/reaper.js";
|
|
44
|
+
import { sleep } from "../shared/sleep.js";
|
|
45
|
+
import { makeBackendForSession } from "../backend/sessionBackend.js";
|
|
46
|
+
import { processTmuxCommandRunner } from "../backend/tmux.js";
|
|
47
|
+
import { PROTOCOL_V1, decodeControlMessage, encodeControlMessage, } from "../protocol.js";
|
|
32
48
|
// MARK: - 定数
|
|
33
49
|
/**
|
|
34
50
|
* hook 内部デッドラインの既定値(秒)。settings の外部タイムアウト
|
|
@@ -47,17 +63,79 @@ const IMAGE_EXTENSIONS = new Set(["png", "jpg", "jpeg", "gif", "webp", "heic", "
|
|
|
47
63
|
export function defaultImagesPendingBase() {
|
|
48
64
|
return path.join(os.homedir(), ".tailii", "images", "pending");
|
|
49
65
|
}
|
|
66
|
+
/** presence 判定全体の上限。失敗・超過は push 送信へ倒す。 */
|
|
67
|
+
export const PRESENCE_PROBE_TIME_LIMIT_MS = 500;
|
|
68
|
+
/** Hub への使い捨て presence RPC の上限。 */
|
|
69
|
+
export const HUB_PRESENCE_RPC_TIMEOUT_MS = 300;
|
|
50
70
|
/** hook の本体(テスタブル・完全版)。stdin JSON の `hook_event_name` で分岐する。 */
|
|
51
71
|
export async function runHookCore(options) {
|
|
52
72
|
const session = options.session ?? "default";
|
|
53
73
|
const deadlineSeconds = options.deadlineSeconds;
|
|
54
|
-
const retryIntervalSeconds = options.retryConnectIntervalSeconds ?? HOOK_RETRY_CONNECT_INTERVAL_SECONDS;
|
|
55
74
|
const parsed = parsePreToolUse(options.stdinData);
|
|
56
75
|
// --- 0. hook_event_name で分岐 ---
|
|
76
|
+
// 処理中/処理完了のライフサイクル通知(idle reaper の「処理中は殺さない」判定用)。
|
|
77
|
+
// UserPromptSubmit=処理開始 / Stop=処理完了。engine relay へ一方向送信して即終了する。
|
|
78
|
+
// UserPromptSubmit の stdout は Claude のコンテキストへ注入されるため、必ず無出力にする。
|
|
79
|
+
if (parsed.eventName === "UserPromptSubmit" || parsed.eventName === "Stop") {
|
|
80
|
+
if (parsed.eventName === "UserPromptSubmit") {
|
|
81
|
+
// ターン開始=Session Hub の常駐を保証する好機(engine 不在でも hook は発火する)。
|
|
82
|
+
try {
|
|
83
|
+
options.ensureHub?.();
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
// ensure は best-effort。
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
await notifySessionProcessing(options, session, parsed.eventName === "Stop" ? "done" : "active", parsed.eventName);
|
|
90
|
+
return { exitCode: 0, stdout: "" };
|
|
91
|
+
}
|
|
57
92
|
if (parsed.eventName === "PostToolUse") {
|
|
93
|
+
// ツールイベント=処理中ハートビート(長時間ターンでも処理中判定が失効しないよう更新)。
|
|
94
|
+
await notifySessionProcessing(options, session, "active", parsed.eventName);
|
|
95
|
+
// 設問の解決通知(iOS/TUI どちらで回答されても sheet/バッジを閉じる, question-hook-relay)。
|
|
96
|
+
if (parsed.toolName === "AskUserQuestion") {
|
|
97
|
+
await notifyQuestionEvent(options, {
|
|
98
|
+
type: "question_event",
|
|
99
|
+
session,
|
|
100
|
+
event: "dismiss",
|
|
101
|
+
id: parsed.toolUseId,
|
|
102
|
+
});
|
|
103
|
+
}
|
|
58
104
|
return runPostToolUse(parsed, session, options.observationBase);
|
|
59
105
|
}
|
|
60
106
|
// === 以降 PreToolUse(既定) ===
|
|
107
|
+
// ツールイベント=処理中ハートビート(承認ゲート待ちの間も処理中扱いを維持する)。
|
|
108
|
+
await notifySessionProcessing(options, session, "active", parsed.eventName);
|
|
109
|
+
// --- 0.4 設問ツール(承認ゲートせず、設問を engine relay 経由で iOS へ届ける) ---
|
|
110
|
+
// AskUserQuestion は「ユーザーへの設問」そのもので実行許可を問う意味がなく、ゲートすると
|
|
111
|
+
// iPhone に設問シートではなく承認モーダルが出てしまう。さらに Claude Code は設問が未回答の
|
|
112
|
+
// 間 transcript に tool_use 行を書かない(v2.1.206 実測)ため、transcript tail では設問を
|
|
113
|
+
// リアルタイム検知できない。よってここが唯一の即時ソース: tool_input から設問を抽出して
|
|
114
|
+
// engine relay へ question_event(prompt) を送り(engine が question_prompt / remote_pending に
|
|
115
|
+
// 変換)、即 allow で TUI ダイアログを出す。回答は従来どおり question_answer のキー注入。
|
|
116
|
+
if (parsed.toolName === "AskUserQuestion") {
|
|
117
|
+
const questions = questionsFromToolInput(parsed.toolInput);
|
|
118
|
+
if (questions.length > 0) {
|
|
119
|
+
await notifyQuestionEvent(options, {
|
|
120
|
+
type: "question_event",
|
|
121
|
+
session,
|
|
122
|
+
event: "prompt",
|
|
123
|
+
id: parsed.toolUseId,
|
|
124
|
+
questions,
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
return allow("AskUserQuestion is presented natively (Tailii auto-approved)");
|
|
128
|
+
}
|
|
129
|
+
// --- 0.5 permission mode による自動許可(mode-picker 連動) ---
|
|
130
|
+
// TUI が auto(全自動)のとき、および acceptEdits の編集系ツールは iPhone 承認を
|
|
131
|
+
// 出さずに即 allow する。これが無いと mode_set で Auto に切り替えても hook が
|
|
132
|
+
// 常にゲートし、確認モーダルが出続ける(= モード変更が反映されない)。
|
|
133
|
+
// hook 入力の permission_mode は処理中にも消えない権威値として優先する。旧版で
|
|
134
|
+
// 欠落する場合だけ provider を使い、provider 無し・capture 失敗・ダイアログ表示中
|
|
135
|
+
// = null なら従来どおり iPhone ゲートへフォールバックする(安全側)。
|
|
136
|
+
const autoAllowReason = autoAllowReasonForMode(await currentPermissionMode(options, parsed.permissionMode), parsed.toolName);
|
|
137
|
+
if (autoAllowReason !== null)
|
|
138
|
+
return allow(autoAllowReason);
|
|
61
139
|
const summary = buildSummary(parsed.toolName, parsed.toolInput);
|
|
62
140
|
const diff = buildDiff(parsed.toolName, parsed.toolInput);
|
|
63
141
|
// 単一の内部デッドライン。push→retry-connect→send→waitForDecision の全フェーズが
|
|
@@ -73,22 +151,168 @@ export async function runHookCore(options) {
|
|
|
73
151
|
return sendRequestAndReflect(socket, parsed, summary, diff, options, deadlineAtMs);
|
|
74
152
|
}
|
|
75
153
|
// === connect 不能ブランチ(Req 2.1 / 8.1〜8.3) ===
|
|
154
|
+
return publishPendingAndAwaitReconnect(options.socketPath, parsed, summary, diff, options, deadlineAtMs, randomUUID(), false);
|
|
155
|
+
}
|
|
156
|
+
// MARK: - 処理中/処理完了ライフサイクル通知
|
|
157
|
+
/**
|
|
158
|
+
* engine relay へ session_processing を送り、reaper daemon の判定権威である heartbeat
|
|
159
|
+
* ファイルも更新する(失敗は握り潰し=ゲート/監査へ影響させない)。
|
|
160
|
+
* `engineRelaySocketPath: null` は「送らない」明示指定(テスト密閉用)。
|
|
161
|
+
*/
|
|
162
|
+
async function notifySessionProcessing(options, session, state, event) {
|
|
163
|
+
// heartbeat は engine の生死と無関係に書ける唯一の経路(reaper daemon が読む)。
|
|
164
|
+
// session 未解決("default")は書かない — 実在しない tmux 名の残骸ファイルを作らない。
|
|
165
|
+
if (options.heartbeatDir !== undefined && session !== "default") {
|
|
166
|
+
try {
|
|
167
|
+
writeHeartbeat(options.heartbeatDir, session, {
|
|
168
|
+
ts: Math.floor(Date.now() / 1000),
|
|
169
|
+
state: state === "done" ? "idle" : "active",
|
|
170
|
+
event,
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
catch {
|
|
174
|
+
// heartbeat 書込失敗は無視(reaper 保護が弱まるだけで安全性は変わらない)。
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
if (options.engineRelaySocketPath === null)
|
|
178
|
+
return;
|
|
179
|
+
try {
|
|
180
|
+
const message = { type: "session_processing", session, state };
|
|
181
|
+
// best-effort・短予算(60ms): engine 不在時にゲート/監査を遅らせない。
|
|
182
|
+
if (options.engineRelaySocketPath !== undefined) {
|
|
183
|
+
await sendSessionProcessingToEngine(message, options.engineRelaySocketPath, 60);
|
|
184
|
+
}
|
|
185
|
+
else {
|
|
186
|
+
await sendSessionProcessingToEngine(message, undefined, 60);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
catch {
|
|
190
|
+
// relay 不達(engine 不在等)は無視する。reaper 保護が弱まるだけで安全性は変わらない。
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* engine relay へ question_event を送る(失敗は握り潰し=設問表示は best-effort、allow は阻害しない)。
|
|
195
|
+
* `engineRelaySocketPath: null` は「送らない」明示指定(テスト密閉用)。
|
|
196
|
+
*/
|
|
197
|
+
async function notifyQuestionEvent(options, message) {
|
|
198
|
+
if (options.engineRelaySocketPath === null)
|
|
199
|
+
return;
|
|
200
|
+
try {
|
|
201
|
+
if (options.engineRelaySocketPath !== undefined) {
|
|
202
|
+
await sendQuestionEventToEngine(message, options.engineRelaySocketPath);
|
|
203
|
+
}
|
|
204
|
+
else {
|
|
205
|
+
await sendQuestionEventToEngine(message);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
catch {
|
|
209
|
+
// relay 不達(engine 不在等)は無視する。TUI 側のダイアログは出るため回答手段は残る。
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
// MARK: - permission mode 自動許可(mode-picker 連動)
|
|
213
|
+
/** acceptEdits で自動許可するファイル編集系ツール名(Claude Code の accept-edits 対象に合わせる)。 */
|
|
214
|
+
const ACCEPT_EDITS_TOOLS = new Set(["Write", "Edit", "MultiEdit", "NotebookEdit"]);
|
|
215
|
+
/**
|
|
216
|
+
* permission mode によって iPhone 承認をスキップできる場合、その理由文字列を返す(純ロジック)。
|
|
217
|
+
* - auto: 全ツールを自動許可。
|
|
218
|
+
* - acceptEdits: 編集系ツール(Write/Edit/MultiEdit/NotebookEdit)のみ自動許可。
|
|
219
|
+
* - それ以外(default / plan / null = 判定不能): null(従来どおり iPhone ゲート)。
|
|
220
|
+
*/
|
|
221
|
+
export function autoAllowReasonForMode(mode, toolName) {
|
|
222
|
+
if (mode === "auto")
|
|
223
|
+
return "auto mode on (Tailii auto-approved)";
|
|
224
|
+
if (mode === "acceptEdits" && ACCEPT_EDITS_TOOLS.has(toolName)) {
|
|
225
|
+
return "accept edits on (Tailii auto-approved)";
|
|
226
|
+
}
|
|
227
|
+
return null;
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* 現在の permission mode を取得する。
|
|
231
|
+
* Claude Code の hook 入力値を権威として優先し、フィールド自体が無い旧版だけ provider へ
|
|
232
|
+
* フォールバックする。未知の入力値も provider で上書きせず、そのまま安全側判定へ渡す。
|
|
233
|
+
*/
|
|
234
|
+
async function currentPermissionMode(options, hookPermissionMode) {
|
|
235
|
+
if (hookPermissionMode !== undefined)
|
|
236
|
+
return hookPermissionMode;
|
|
237
|
+
if (options.permissionModeProvider === undefined)
|
|
238
|
+
return null;
|
|
239
|
+
try {
|
|
240
|
+
return await options.permissionModeProvider();
|
|
241
|
+
}
|
|
242
|
+
catch {
|
|
243
|
+
return null;
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* pane 表示から permission mode を判定する本番 provider を作る(claude 専用)。
|
|
248
|
+
* capture が timeLimitMs 内に返らない・失敗する場合は null(判定不能 → 従来ゲート)。
|
|
249
|
+
* 本番の hook CLI は Claude 専用なので、この provider も Claude にだけ配線する。
|
|
250
|
+
* セッションの属するバックエンド(tmux / herdr)はメタデータで解決する。
|
|
251
|
+
*/
|
|
252
|
+
export function makeTmuxPermissionModeProvider(session, timeLimitMs = 1500) {
|
|
253
|
+
return async () => {
|
|
254
|
+
try {
|
|
255
|
+
const manager = makeBackendForSession(session);
|
|
256
|
+
const pane = await Promise.race([
|
|
257
|
+
manager.capturePane(session),
|
|
258
|
+
sleep(timeLimitMs).then(() => null),
|
|
259
|
+
]);
|
|
260
|
+
return pane === null ? null : parsePermissionMode(pane);
|
|
261
|
+
}
|
|
262
|
+
catch {
|
|
263
|
+
return null;
|
|
264
|
+
}
|
|
265
|
+
};
|
|
266
|
+
}
|
|
267
|
+
// MARK: - 接続不能/切断フォールバック(Req 8.1〜8.3)
|
|
268
|
+
/**
|
|
269
|
+
* 承認を iPhone に届けられない間の共有フォールバック(connect 不能と決定待ち中の切断の両方)。
|
|
270
|
+
* remote_pending を engine relay へ流して会話一覧のバッジ/バナーに出し、背景 push
|
|
271
|
+
* (notifier 注入時のみ, 相互排他 7.1 — 前面 connect 済み経路では送らない)で気づかせた
|
|
272
|
+
* うえで、内部デッドラインの残りで同一 socket パスへ retry-connect する(8.1)。
|
|
273
|
+
* 再接続できたら同一 id で approval_request を送り直す(8.2 — iOS 側は id で pending と
|
|
274
|
+
* 突合できる)。デッドラインまで回復しなければ安全側 deny(8.3)。
|
|
275
|
+
*/
|
|
276
|
+
async function publishPendingAndAwaitReconnect(socketPath, parsed, summary, diff, options, deadlineAtMs, requestId, imagesAlreadyEnqueued) {
|
|
277
|
+
const session = options.session ?? "default";
|
|
278
|
+
if (options.engineRelaySocketPath !== null) {
|
|
279
|
+
await sendRemotePendingToEngine({
|
|
280
|
+
type: "remote_pending",
|
|
281
|
+
v: PROTOCOL_V1,
|
|
282
|
+
id: requestId,
|
|
283
|
+
session,
|
|
284
|
+
kind: "approval",
|
|
285
|
+
tool: parsed.toolName,
|
|
286
|
+
summary,
|
|
287
|
+
}, options.engineRelaySocketPath).catch(() => { });
|
|
288
|
+
}
|
|
76
289
|
if (options.notifier) {
|
|
77
|
-
|
|
290
|
+
const presence = await probePresence(options.presenceProbe, session);
|
|
291
|
+
if (presence !== null) {
|
|
292
|
+
try {
|
|
293
|
+
options.pushObserver?.recordSkipped(requestId, presence, session);
|
|
294
|
+
}
|
|
295
|
+
catch { /* 観測失敗は無視。 */ }
|
|
296
|
+
}
|
|
297
|
+
else {
|
|
298
|
+
await sendBackgroundPush(options.notifier, { approvalId: requestId, tool: parsed.toolName, session }, options.notifierTimeLimitMs ?? 5000);
|
|
299
|
+
}
|
|
78
300
|
}
|
|
79
|
-
const
|
|
301
|
+
const retryIntervalSeconds = options.retryConnectIntervalSeconds ?? HOOK_RETRY_CONNECT_INTERVAL_SECONDS;
|
|
302
|
+
const reconnected = await retryConnect(socketPath, deadlineAtMs, retryIntervalSeconds);
|
|
80
303
|
if (reconnected) {
|
|
81
|
-
return sendRequestAndReflect(reconnected, parsed, summary, diff, options, deadlineAtMs);
|
|
304
|
+
return sendRequestAndReflect(reconnected, parsed, summary, diff, options, deadlineAtMs, requestId, imagesAlreadyEnqueued);
|
|
82
305
|
}
|
|
83
306
|
// 内部デッドライン内に一度も再接続できなかった → 安全側 deny(8.3)。
|
|
84
|
-
return deny(`iPhone unavailable (no reconnect within ${Math.round(deadlineSeconds)}s)`);
|
|
307
|
+
return deny(`iPhone unavailable (no reconnect within ${Math.round(options.deadlineSeconds)}s)`);
|
|
85
308
|
}
|
|
86
309
|
// MARK: - approval_request 送出+決定反映(connect 成功/再接続で共有)
|
|
87
|
-
async function sendRequestAndReflect(socket, parsed, summary, diff, options, deadlineAtMs) {
|
|
310
|
+
async function sendRequestAndReflect(socket, parsed, summary, diff, options, deadlineAtMs, requestIdOverride, imagesAlreadyEnqueued = false) {
|
|
88
311
|
try {
|
|
89
|
-
const requestId = randomUUID();
|
|
312
|
+
const requestId = requestIdOverride ?? randomUUID();
|
|
90
313
|
// 画像パス検出 → pending キュー投入(非ブロッキング・リサイズなし, 8.1/8.2/8.5)。
|
|
91
|
-
|
|
314
|
+
// 切断→再接続の送り直しでは投入済み(同一承認 id での二重投入を防ぐ)。
|
|
315
|
+
if (options.imagesPendingBase !== undefined && !imagesAlreadyEnqueued) {
|
|
92
316
|
enqueuePendingImages(parsed.toolInput, requestId, options.imagesPendingBase);
|
|
93
317
|
}
|
|
94
318
|
const encoded = encodeControlMessage({
|
|
@@ -104,25 +328,47 @@ async function sendRequestAndReflect(socket, parsed, summary, diff, options, dea
|
|
|
104
328
|
socket.write(encoded + "\n");
|
|
105
329
|
}
|
|
106
330
|
catch {
|
|
107
|
-
|
|
331
|
+
// 送出直前に serve チャネルが落ちた(chat 離脱/開き直しレース)。切断と同じ扱い。
|
|
332
|
+
if (options.socketPath === null)
|
|
333
|
+
return deny("iPhone disconnected (write failed)");
|
|
334
|
+
return publishPendingAndAwaitReconnect(options.socketPath, parsed, summary, diff, options, deadlineAtMs, requestId, true);
|
|
108
335
|
}
|
|
109
336
|
// 残りデッドライン内で approval_decision を待つ(自 id のみ受理, 5.4)。
|
|
110
337
|
const outcome = await waitForDecision(socket, requestId, deadlineAtMs);
|
|
111
338
|
switch (outcome.kind) {
|
|
112
339
|
case "allow":
|
|
340
|
+
await clearRemotePendingIfNeeded(requestId, options);
|
|
113
341
|
return allow(outcome.reason ?? "Approved on iPhone");
|
|
114
342
|
case "deny":
|
|
343
|
+
await clearRemotePendingIfNeeded(requestId, options);
|
|
115
344
|
return deny(outcome.reason ?? "Denied on iPhone");
|
|
116
345
|
case "timeout":
|
|
346
|
+
await clearRemotePendingIfNeeded(requestId, options);
|
|
117
347
|
return deny(`No response within ${Math.round(options.deadlineSeconds)}s`);
|
|
118
348
|
case "disconnected":
|
|
119
|
-
|
|
349
|
+
// 決定待ち中の切断 = iOS の chat 離脱(serve チャネル close)や SSH 断。
|
|
350
|
+
// 承認自体はまだ生きているので即 deny せず、connect 不能ブランチと同じ
|
|
351
|
+
// フォールバックに合流して再接続(chat 開き直し)後に同一 id で送り直す。
|
|
352
|
+
if (options.socketPath === null)
|
|
353
|
+
return deny("iPhone disconnected");
|
|
354
|
+
return publishPendingAndAwaitReconnect(options.socketPath, parsed, summary, diff, options, deadlineAtMs, requestId, true);
|
|
120
355
|
}
|
|
121
356
|
}
|
|
122
357
|
finally {
|
|
123
358
|
socket.destroy();
|
|
124
359
|
}
|
|
125
360
|
}
|
|
361
|
+
async function clearRemotePendingIfNeeded(id, options) {
|
|
362
|
+
if (options.engineRelaySocketPath === null)
|
|
363
|
+
return;
|
|
364
|
+
await sendRemotePendingToEngine({
|
|
365
|
+
type: "remote_pending_cleared",
|
|
366
|
+
v: PROTOCOL_V1,
|
|
367
|
+
id,
|
|
368
|
+
session: options.session ?? "default",
|
|
369
|
+
kind: "approval",
|
|
370
|
+
}, options.engineRelaySocketPath).catch(() => { });
|
|
371
|
+
}
|
|
126
372
|
/**
|
|
127
373
|
* デッドライン内で approval_decision を1行ずつ受信し、id が一致する有効決定を待つ。
|
|
128
374
|
* id 不一致・undecodable・非対応 v の行はスキップして読み続ける(残り時間内)。
|
|
@@ -228,6 +474,75 @@ async function retryConnect(socketPath, deadlineAtMs, intervalSeconds) {
|
|
|
228
474
|
}
|
|
229
475
|
}
|
|
230
476
|
// MARK: - 背景 push 送出(connect 不能ブランチのみ)
|
|
477
|
+
/** 注入された presence 判定を全体上限内で実行する。失敗・超過は null(push 継続)。 */
|
|
478
|
+
async function probePresence(probe, session) {
|
|
479
|
+
if (probe === undefined)
|
|
480
|
+
return null;
|
|
481
|
+
let timer;
|
|
482
|
+
try {
|
|
483
|
+
const timeout = new Promise((resolve) => {
|
|
484
|
+
timer = setTimeout(() => resolve(null), PRESENCE_PROBE_TIME_LIMIT_MS);
|
|
485
|
+
});
|
|
486
|
+
return await Promise.race([probe(session).catch(() => null), timeout]);
|
|
487
|
+
}
|
|
488
|
+
catch {
|
|
489
|
+
return null;
|
|
490
|
+
}
|
|
491
|
+
finally {
|
|
492
|
+
if (timer !== undefined)
|
|
493
|
+
clearTimeout(timer);
|
|
494
|
+
}
|
|
495
|
+
}
|
|
496
|
+
/**
|
|
497
|
+
* Hub socket へ短命接続し、1回だけ presence RPC を行う。
|
|
498
|
+
* false は正常応答で購読者なし、null は接続・応答失敗を表す。
|
|
499
|
+
*/
|
|
500
|
+
export function requestHubPresence(session, socketPath, timeoutMs = HUB_PRESENCE_RPC_TIMEOUT_MS) {
|
|
501
|
+
return new Promise((resolve) => {
|
|
502
|
+
const id = randomUUID();
|
|
503
|
+
const socket = net.createConnection(socketPath);
|
|
504
|
+
let buffer = "";
|
|
505
|
+
let settled = false;
|
|
506
|
+
const finish = (value) => {
|
|
507
|
+
if (settled)
|
|
508
|
+
return;
|
|
509
|
+
settled = true;
|
|
510
|
+
clearTimeout(timer);
|
|
511
|
+
socket.destroy();
|
|
512
|
+
resolve(value);
|
|
513
|
+
};
|
|
514
|
+
const timer = setTimeout(() => finish(null), Math.max(0, timeoutMs));
|
|
515
|
+
socket.once("connect", () => {
|
|
516
|
+
socket.write(encodeHubMessage({ type: "presence_request", id, session }));
|
|
517
|
+
});
|
|
518
|
+
socket.on("data", (chunk) => {
|
|
519
|
+
buffer += chunk.toString("utf8");
|
|
520
|
+
for (;;) {
|
|
521
|
+
const newline = buffer.indexOf("\n");
|
|
522
|
+
if (newline < 0)
|
|
523
|
+
break;
|
|
524
|
+
const line = buffer.slice(0, newline);
|
|
525
|
+
buffer = buffer.slice(newline + 1);
|
|
526
|
+
const message = decodeHubServerLine(line);
|
|
527
|
+
if (message?.type === "presence_response" && message.id === id && message.session === session) {
|
|
528
|
+
finish(message.subscriberCount > 0);
|
|
529
|
+
return;
|
|
530
|
+
}
|
|
531
|
+
}
|
|
532
|
+
});
|
|
533
|
+
socket.once("error", () => finish(null));
|
|
534
|
+
socket.once("close", () => finish(null));
|
|
535
|
+
});
|
|
536
|
+
}
|
|
537
|
+
/** tmux attach と Hub subscriber を順に調べる本番 presence probe。 */
|
|
538
|
+
export function makePresenceProbe(runner = processTmuxCommandRunner(), hubSocketPath) {
|
|
539
|
+
return async (session) => {
|
|
540
|
+
if ((await attachedSessions(runner)).has(session))
|
|
541
|
+
return "mac-attached";
|
|
542
|
+
const effectiveHubSocketPath = hubSocketPath ?? resolveHubSocketPath();
|
|
543
|
+
return await requestHubPresence(session, effectiveHubSocketPath) === true ? "client-live" : null;
|
|
544
|
+
};
|
|
545
|
+
}
|
|
231
546
|
/** 背景 push を送出する。timeLimit で打ち切り、成否は deny 判断に影響しない。 */
|
|
232
547
|
async function sendBackgroundPush(notifier, request, timeLimitMs) {
|
|
233
548
|
await Promise.race([notifier(request, timeLimitMs).catch(() => { }), sleep(timeLimitMs)]);
|
|
@@ -371,6 +686,9 @@ function parsePreToolUse(data) {
|
|
|
371
686
|
}
|
|
372
687
|
if (typeof raw["cwd"] === "string")
|
|
373
688
|
parsed.cwd = raw["cwd"];
|
|
689
|
+
if (typeof raw["permission_mode"] === "string") {
|
|
690
|
+
parsed.permissionMode = raw["permission_mode"];
|
|
691
|
+
}
|
|
374
692
|
if (typeof raw["tool_use_id"] === "string" && raw["tool_use_id"].length > 0) {
|
|
375
693
|
parsed.toolUseId = raw["tool_use_id"];
|
|
376
694
|
}
|
|
@@ -424,11 +742,8 @@ export async function runHookCommand(args) {
|
|
|
424
742
|
let imagesDirArg = null;
|
|
425
743
|
let deadlineSeconds = HOOK_INTERNAL_DEADLINE_SECONDS;
|
|
426
744
|
let retryIntervalSeconds = HOOK_RETRY_CONNECT_INTERVAL_SECONDS;
|
|
427
|
-
//
|
|
428
|
-
//
|
|
429
|
-
// 承認(allow)時は decision JSON を出さず exit 0 無出力=続行にし、拒否時のみ deny JSON を出す。
|
|
430
|
-
// 承認ゲートは codex がフック完了を同期ブロックで待つ性質で成立する(既定 timeout 600s > 内部 540s)。
|
|
431
|
-
let agent = "claude";
|
|
745
|
+
// Codex の承認は App Server native 経路(codexNativeTurnController)に統一済み。
|
|
746
|
+
// この hook CLI は Claude のフックだけを扱う。
|
|
432
747
|
for (let i = 0; i < args.length; i += 1) {
|
|
433
748
|
const next = () => (i + 1 < args.length ? args[++i] : null);
|
|
434
749
|
switch (args[i]) {
|
|
@@ -438,12 +753,6 @@ export async function runHookCommand(args) {
|
|
|
438
753
|
case "--session":
|
|
439
754
|
sessionArg = next();
|
|
440
755
|
break;
|
|
441
|
-
case "--agent": {
|
|
442
|
-
const raw = next();
|
|
443
|
-
if (raw === "codex" || raw === "claude")
|
|
444
|
-
agent = raw;
|
|
445
|
-
break;
|
|
446
|
-
}
|
|
447
756
|
case "--deadline": {
|
|
448
757
|
const raw = next();
|
|
449
758
|
const value = raw === null ? Number.NaN : Number.parseFloat(raw);
|
|
@@ -465,47 +774,47 @@ export async function runHookCommand(args) {
|
|
|
465
774
|
break;
|
|
466
775
|
}
|
|
467
776
|
}
|
|
777
|
+
const chunks = [];
|
|
778
|
+
for await (const chunk of process.stdin) {
|
|
779
|
+
chunks.push(typeof chunk === "string" ? Buffer.from(chunk) : chunk);
|
|
780
|
+
}
|
|
781
|
+
const stdinData = Buffer.concat(chunks);
|
|
782
|
+
const effectiveSession = sessionArg !== null && sessionArg.trim().length > 0 ? sessionArg : null;
|
|
468
783
|
let socketPath = null;
|
|
469
784
|
if (socketArg !== null) {
|
|
470
785
|
socketPath = socketArg;
|
|
471
786
|
}
|
|
472
|
-
else if (
|
|
787
|
+
else if (effectiveSession !== null) {
|
|
473
788
|
try {
|
|
474
|
-
socketPath = resolveSocketPath(
|
|
789
|
+
socketPath = resolveSocketPath(effectiveSession);
|
|
475
790
|
}
|
|
476
791
|
catch {
|
|
477
792
|
socketPath = null;
|
|
478
793
|
}
|
|
479
794
|
}
|
|
480
|
-
const
|
|
481
|
-
for await (const chunk of process.stdin) {
|
|
482
|
-
chunks.push(typeof chunk === "string" ? Buffer.from(chunk) : chunk);
|
|
483
|
-
}
|
|
795
|
+
const pushObserver = new ObservationLogPushObserver();
|
|
484
796
|
const { exitCode, stdout } = await runHookCore({
|
|
485
|
-
stdinData
|
|
797
|
+
stdinData,
|
|
486
798
|
socketPath,
|
|
487
799
|
deadlineSeconds,
|
|
488
|
-
session:
|
|
800
|
+
session: effectiveSession ?? "default",
|
|
489
801
|
observationBase: defaultObservationBase(),
|
|
490
802
|
imagesPendingBase: imagesDirArg !== null ? path.join(imagesDirArg, "pending") : defaultImagesPendingBase(),
|
|
491
803
|
notifier: makeProductionPushNotifier(),
|
|
804
|
+
pushObserver,
|
|
492
805
|
retryConnectIntervalSeconds: retryIntervalSeconds,
|
|
806
|
+
heartbeatDir: defaultHeartbeatDir(),
|
|
807
|
+
ensureHub: ensureHubDaemon,
|
|
808
|
+
// 現行 Claude は hook 入力の permission_mode を使う。tmux provider は旧版互換の
|
|
809
|
+
// 欠落時フォールバックとしてだけ呼ばれる。
|
|
810
|
+
...(effectiveSession !== null
|
|
811
|
+
? {
|
|
812
|
+
permissionModeProvider: makeTmuxPermissionModeProvider(effectiveSession),
|
|
813
|
+
presenceProbe: makePresenceProbe(),
|
|
814
|
+
}
|
|
815
|
+
: {}),
|
|
493
816
|
});
|
|
494
|
-
|
|
495
|
-
if (out !== null)
|
|
496
|
-
process.stdout.write(out + "\n");
|
|
817
|
+
process.stdout.write(stdout + "\n");
|
|
497
818
|
return exitCode;
|
|
498
819
|
}
|
|
499
|
-
/**
|
|
500
|
-
* エージェント別にフックが実際に stdout へ書く文字列を決める(TESTABLE)。
|
|
501
|
-
* claude: 生成した decision JSON をそのまま出す。
|
|
502
|
-
* codex : allow/ask を「unsupported」として拒否するため、承認(allow 決定)時は無出力(null)で
|
|
503
|
-
* exit 0 続行にする。拒否(deny)や監査出力はそのまま出す(deny JSON は codex も解釈する)。
|
|
504
|
-
*/
|
|
505
|
-
export function hookStdoutForAgent(agent, stdout) {
|
|
506
|
-
if (agent === "codex" && stdout.includes('"permissionDecision":"allow"')) {
|
|
507
|
-
return null;
|
|
508
|
-
}
|
|
509
|
-
return stdout;
|
|
510
|
-
}
|
|
511
820
|
//# sourceMappingURL=hook.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hook.js","sourceRoot":"","sources":["../../src/approval/hook.ts"],"names":[],"mappings":"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"}
|