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.
- package/README.md +35 -14
- 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 +226 -0
- package/dist/backend/herdr.js +749 -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 +15 -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/{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 +799 -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 +32 -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/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 +1036 -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 +1002 -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
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
// hookSettings.ts
|
|
2
|
-
// tailii (TS host) —
|
|
2
|
+
// tailii (TS host) — Claude 起動時に渡す承認フック設定と、旧 Codex hook の移行用管理。
|
|
3
3
|
// claude 側はファイル(settings.json)へは書かず、`claude --settings '<json>'` でこの起動プロセス
|
|
4
|
-
// 限定にフックを渡す(後述 claudeHookLaunchSettings 参照)。
|
|
5
|
-
//
|
|
4
|
+
// 限定にフックを渡す(後述 claudeHookLaunchSettings 参照)。Codex App Server 経路は承認を
|
|
5
|
+
// JSON-RPC で受けるため hook を使わず、旧版 Tailii が登録した Codex hook は起動時に除去する。
|
|
6
6
|
import * as fs from "node:fs";
|
|
7
7
|
import * as os from "node:os";
|
|
8
8
|
import * as path from "node:path";
|
|
@@ -45,7 +45,19 @@ export function claudeHookLaunchSettings(options) {
|
|
|
45
45
|
hooks: [{ type: "command", command, timeout: HOOK_EXTERNAL_TIMEOUT_SECONDS }],
|
|
46
46
|
},
|
|
47
47
|
];
|
|
48
|
-
|
|
48
|
+
// UserPromptSubmit(処理開始)+ Stop(処理完了): reaper daemon の「処理中は殺さない」判定用の
|
|
49
|
+
// heartbeat 書込 + engine relay への一方向送信のみで即終了するため timeout は短くてよい。
|
|
50
|
+
const lifecycleEntry = () => [
|
|
51
|
+
{ hooks: [{ type: "command", command, timeout: 30 }] },
|
|
52
|
+
];
|
|
53
|
+
return JSON.stringify({
|
|
54
|
+
hooks: {
|
|
55
|
+
PreToolUse: entry(),
|
|
56
|
+
PostToolUse: entry(),
|
|
57
|
+
UserPromptSubmit: lifecycleEntry(),
|
|
58
|
+
Stop: lifecycleEntry(),
|
|
59
|
+
},
|
|
60
|
+
});
|
|
49
61
|
}
|
|
50
62
|
/**
|
|
51
63
|
* `<dir>/.codex/hooks.json` に codex(Codex CLI)用の PreToolUse フックを書き込む(既存ならマージ)。
|
|
@@ -53,10 +65,13 @@ export function claudeHookLaunchSettings(options) {
|
|
|
53
65
|
* (`{ "hooks": { "PreToolUse": [...] } }`)でフックを実行する。stdin/permissionDecision も互換だが、
|
|
54
66
|
* codex は allow/ask を拒否し deny のみ有効なため、hook 側は `--agent codex` で allow を無出力にする。
|
|
55
67
|
* codex はフック完了を同期ブロックで待つので、承認プッシュ待ちがそのままゲートになる。
|
|
68
|
+
* command はセッション非依存の dispatcher 1 組だけにする。セッション名を command に埋め込むと、
|
|
69
|
+
* 同一 cwd で会話を開くたびに全 command hook が累積・並列実行され、同じ承認が複数届くため。
|
|
70
|
+
* 実セッションは Tailii 起動時に付ける `TAILII_SESSION` 環境変数から hook 側で解決する。
|
|
56
71
|
* グローバル `~/.codex/hooks.json`(ユーザーの既存フック)には触れない(非侵襲)。
|
|
57
72
|
*/
|
|
58
73
|
export function installCodexHookSettings(options) {
|
|
59
|
-
const { dir, binaryPath
|
|
74
|
+
const { dir, binaryPath } = options;
|
|
60
75
|
// グローバル/ローカル無効化マーカーは claude 版と共通。
|
|
61
76
|
const globalMarker = options.globalMarkerPath ?? path.join(os.homedir(), ".tailii", "nohook");
|
|
62
77
|
if (fs.existsSync(globalMarker)) {
|
|
@@ -82,7 +97,7 @@ export function installCodexHookSettings(options) {
|
|
|
82
97
|
}
|
|
83
98
|
}
|
|
84
99
|
// 承認ゲート対象: シェル実行(Bash)とファイル編集(Write|Edit)。codex 実績のある matcher。
|
|
85
|
-
const command = `${binaryPath} hook --
|
|
100
|
+
const command = `${binaryPath} hook --agent codex`;
|
|
86
101
|
const hooksObject = typeof root["hooks"] === "object" && root["hooks"] !== null && !Array.isArray(root["hooks"])
|
|
87
102
|
? root["hooks"]
|
|
88
103
|
: {};
|
|
@@ -90,14 +105,17 @@ export function installCodexHookSettings(options) {
|
|
|
90
105
|
let list = Array.isArray(rawList)
|
|
91
106
|
? rawList.filter((e) => typeof e === "object" && e !== null)
|
|
92
107
|
: [];
|
|
93
|
-
//
|
|
94
|
-
|
|
108
|
+
// Tailii 所有の旧/現行 command をすべて除去する。旧版は `--session <name>` を含むため、
|
|
109
|
+
// 完全一致だけを消すとセッションごとに残り続ける。1 entry に他社 hook が混在する場合は
|
|
110
|
+
// Tailii command だけを抜き、残りは保持する。
|
|
111
|
+
list = list.flatMap((entry) => {
|
|
95
112
|
const inner = entry["hooks"];
|
|
96
113
|
if (!Array.isArray(inner))
|
|
97
|
-
return
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
114
|
+
return [entry];
|
|
115
|
+
const remaining = inner.filter((hook) => !isTailiiCodexHook(hook, binaryPath));
|
|
116
|
+
if (remaining.length === 0)
|
|
117
|
+
return [];
|
|
118
|
+
return [{ ...entry, hooks: remaining }];
|
|
101
119
|
});
|
|
102
120
|
for (const matcher of ["Bash", "Write|Edit"]) {
|
|
103
121
|
list.push({
|
|
@@ -112,6 +130,72 @@ export function installCodexHookSettings(options) {
|
|
|
112
130
|
fs.writeFileSync(tmp, out);
|
|
113
131
|
fs.renameSync(tmp, hooksPath);
|
|
114
132
|
}
|
|
133
|
+
/**
|
|
134
|
+
* 旧版 Tailii が `<dir>/.codex/hooks.json` に追加した Codex hook だけを除去する。
|
|
135
|
+
*
|
|
136
|
+
* Codex App Server は承認要求を server-initiated JSON-RPC request として配信するため、
|
|
137
|
+
* App Server 経路に PreToolUse hook を重ねると同じ承認が二重化する。無関係なユーザー hook は
|
|
138
|
+
* event/entry 内で混在していても保持し、Tailii hook を除いた結果が空なら hooks.json 自体を消す。
|
|
139
|
+
*/
|
|
140
|
+
export function removeCodexHookSettings(options) {
|
|
141
|
+
const hooksPath = path.join(options.dir, ".codex", "hooks.json");
|
|
142
|
+
if (!fs.existsSync(hooksPath))
|
|
143
|
+
return;
|
|
144
|
+
const text = fs.readFileSync(hooksPath, "utf8");
|
|
145
|
+
if (text.trim().length === 0)
|
|
146
|
+
return;
|
|
147
|
+
const parsed = JSON.parse(text);
|
|
148
|
+
if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
|
|
149
|
+
throw new Error(`既存 .codex/hooks.json が JSON オブジェクトとして解釈できない: ${hooksPath}`);
|
|
150
|
+
}
|
|
151
|
+
const root = parsed;
|
|
152
|
+
const rawHooks = root["hooks"];
|
|
153
|
+
if (typeof rawHooks !== "object" || rawHooks === null || Array.isArray(rawHooks))
|
|
154
|
+
return;
|
|
155
|
+
const hooksObject = rawHooks;
|
|
156
|
+
for (const [event, rawEntries] of Object.entries(hooksObject)) {
|
|
157
|
+
if (!Array.isArray(rawEntries))
|
|
158
|
+
continue;
|
|
159
|
+
const entries = rawEntries.flatMap((rawEntry) => {
|
|
160
|
+
if (typeof rawEntry !== "object" || rawEntry === null || Array.isArray(rawEntry)) {
|
|
161
|
+
return [rawEntry];
|
|
162
|
+
}
|
|
163
|
+
const entry = rawEntry;
|
|
164
|
+
const rawInner = entry["hooks"];
|
|
165
|
+
if (!Array.isArray(rawInner))
|
|
166
|
+
return [entry];
|
|
167
|
+
const remaining = rawInner.filter((hook) => !isTailiiCodexHook(hook, options.binaryPath));
|
|
168
|
+
if (remaining.length === 0)
|
|
169
|
+
return [];
|
|
170
|
+
return [{ ...entry, hooks: remaining }];
|
|
171
|
+
});
|
|
172
|
+
if (entries.length === 0)
|
|
173
|
+
delete hooksObject[event];
|
|
174
|
+
else
|
|
175
|
+
hooksObject[event] = entries;
|
|
176
|
+
}
|
|
177
|
+
if (Object.keys(hooksObject).length === 0)
|
|
178
|
+
delete root["hooks"];
|
|
179
|
+
else
|
|
180
|
+
root["hooks"] = hooksObject;
|
|
181
|
+
if (Object.keys(root).length === 0) {
|
|
182
|
+
fs.rmSync(hooksPath);
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
const out = JSON.stringify(sortKeysDeep(root), null, 2);
|
|
186
|
+
const tmp = hooksPath + ".tmp";
|
|
187
|
+
fs.writeFileSync(tmp, out);
|
|
188
|
+
fs.renameSync(tmp, hooksPath);
|
|
189
|
+
}
|
|
190
|
+
/** 指定 binary が登録した Codex hook か。旧 `--session` 形式もまとめて所有扱いする。 */
|
|
191
|
+
function isTailiiCodexHook(value, binaryPath) {
|
|
192
|
+
if (typeof value !== "object" || value === null)
|
|
193
|
+
return false;
|
|
194
|
+
const hookCommand = value["command"];
|
|
195
|
+
if (typeof hookCommand !== "string")
|
|
196
|
+
return false;
|
|
197
|
+
return hookCommand.startsWith(`${binaryPath} hook `) && /(?:^|\s)--agent\s+codex(?:\s|$)/.test(hookCommand);
|
|
198
|
+
}
|
|
115
199
|
/** オブジェクトのキーを再帰的に辞書順へ並べ替える(Swift 版 .sortedKeys 相当)。 */
|
|
116
200
|
function sortKeysDeep(value) {
|
|
117
201
|
if (Array.isArray(value))
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hookSettings.js","sourceRoot":"","sources":["../../src/commands/hookSettings.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,7 +6,9 @@
|
|
|
6
6
|
// E2E(承認1往復)の再現専用であり、プロダクトの導線には出さない非機能(test-only, Req 7.3)。
|
|
7
7
|
// tmux は絶対パス指定(PATH 外のため)。
|
|
8
8
|
import { spawnSync } from "node:child_process";
|
|
9
|
-
import {
|
|
9
|
+
import { makeBackendForSession } from "../backend/sessionBackend.js";
|
|
10
|
+
import { SessionMetadataStore } from "../sessions/sessionMetadataStore.js";
|
|
11
|
+
import { DEFAULT_TMUX_PATH } from "../backend/tmux.js";
|
|
10
12
|
/**
|
|
11
13
|
* kick の純ロジック。tmux パスを注入できるためテスト可能。
|
|
12
14
|
* `tmux send-keys -t <session> <prompt> Enter` を実行する。指定セッションが存在しない、
|
|
@@ -55,6 +57,19 @@ export async function runKickCommand(args) {
|
|
|
55
57
|
process.stderr.write("tailii kick: --prompt <text> が必要です\n");
|
|
56
58
|
return 2;
|
|
57
59
|
}
|
|
60
|
+
// herdr backend のセッションは herdr pane へ送出する(メタデータの backend 欄で判定)。
|
|
61
|
+
const store = new SessionMetadataStore();
|
|
62
|
+
if (store.get(sessionArg)?.backend === "herdr") {
|
|
63
|
+
try {
|
|
64
|
+
const backend = makeBackendForSession(sessionArg, store);
|
|
65
|
+
await backend.sendTextSubmit(sessionArg, promptArg);
|
|
66
|
+
return 0;
|
|
67
|
+
}
|
|
68
|
+
catch (error) {
|
|
69
|
+
process.stderr.write(`tailii kick: herdr 送出失敗: ${String(error)}\n`);
|
|
70
|
+
return 1;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
58
73
|
return kickCore(sessionArg, promptArg, DEFAULT_TMUX_PATH, (m) => process.stderr.write(m));
|
|
59
74
|
}
|
|
60
75
|
//# sourceMappingURL=kick.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kick.js","sourceRoot":"","sources":["../../src/commands/kick.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { type CodexThreadStartOptions } from "../codex/codexAppServer.js";
|
|
2
|
+
import { type SessionBackendKind } from "../backend/sessionBackend.js";
|
|
3
|
+
import { SessionMetadataStore } from "../sessions/sessionMetadataStore.js";
|
|
2
4
|
/** tmux 内で起動する既定コマンド(claude TUI)。テストでは無害な値に差し替える。 */
|
|
3
5
|
export declare const DEFAULT_INNER_COMMAND = "claude";
|
|
4
6
|
/**
|
|
@@ -14,13 +16,22 @@ export declare const DEFAULT_CODEX_COMMAND = "codex -a never -s workspace-write"
|
|
|
14
16
|
* (同一 cwd の新しい rollout があるとそちらを追い得る。既知の制約)。
|
|
15
17
|
*/
|
|
16
18
|
export declare const CODEX_RESUME_FLAGS = "-a never -s workspace-write";
|
|
17
|
-
/** codex
|
|
19
|
+
/** codex サンドボックスモード(承認要求は App Server の JSON-RPC で処理する)。 */
|
|
18
20
|
export type CodexSandbox = "read-only" | "workspace-write" | "danger-full-access";
|
|
21
|
+
/**
|
|
22
|
+
* claude 新規起動の inner コマンドを組み立てる(起動前モデル/モード選択の反映)。
|
|
23
|
+
* @param model 省略/不正文字は無視(アカウント既定モデル)。alias('opus' 等)と完全 id の両方可。
|
|
24
|
+
* @param permissionMode 既知 4 値のみ採用。"default" はフラグ無しと等価なので付けない。
|
|
25
|
+
*/
|
|
26
|
+
export declare function claudeInnerCommand(opts: {
|
|
27
|
+
model?: string | null;
|
|
28
|
+
permissionMode?: string | null;
|
|
29
|
+
}): string;
|
|
19
30
|
/**
|
|
20
31
|
* codex 新規起動の inner コマンドを組み立てる(codex-input)。
|
|
21
|
-
* 承認は
|
|
32
|
+
* 承認は App Server の JSON-RPC で処理する。ここでは TUI 単体起動用のsandboxとモデルを組み立てる。
|
|
22
33
|
* @param model 省略/不正文字は無視(既定モデル)。
|
|
23
|
-
* @param sandbox
|
|
34
|
+
* @param sandbox TUI 単体起動では省略時 workspace-write。remote resume ではこの文字列を使わない。
|
|
24
35
|
*/
|
|
25
36
|
export declare function codexInnerCommand(opts: {
|
|
26
37
|
model?: string | null;
|
|
@@ -38,10 +49,22 @@ export type EngineLauncher = (cwd: string, name: string, baseDir: string | null,
|
|
|
38
49
|
/** 新規起動(resume なし)で claude の会話 id を固定する uuid(`--session-id`)。null なら claude 生成。 */
|
|
39
50
|
newSessionId?: string | null,
|
|
40
51
|
/** Claude の表示名(`claude --name`。会話名を付けた新規起動のみ, lazy-session)。null なら付与しない。 */
|
|
41
|
-
title?: string | null
|
|
52
|
+
title?: string | null,
|
|
53
|
+
/** Codex 新規threadのApp Server設定。Claude/resumeでは無視。 */
|
|
54
|
+
launchOptions?: {
|
|
55
|
+
codexModel?: string | null;
|
|
56
|
+
codexSandbox?: CodexSandbox | null;
|
|
57
|
+
}) => Promise<{
|
|
42
58
|
exitCode: number;
|
|
43
59
|
errorText: string;
|
|
60
|
+
providerSessionId?: string;
|
|
44
61
|
}>;
|
|
62
|
+
/** makeSessionLauncher が必要とする共有App Serverの最小境界。 */
|
|
63
|
+
export interface CodexAppServerRuntime {
|
|
64
|
+
readonly remoteEndpoint: string;
|
|
65
|
+
ensureRunning(): Promise<void>;
|
|
66
|
+
startThread(options: CodexThreadStartOptions): Promise<string>;
|
|
67
|
+
}
|
|
45
68
|
/** シェル single-quote で安全に包む(内部の `'` は `'\''` へ)。tmux new に渡す inner コマンド用。 */
|
|
46
69
|
export declare function shellSingleQuote(value: string): string;
|
|
47
70
|
/** 子プロセス実行の注入点(テストは実 tmux を起動しないモックを注入する)。 */
|
|
@@ -63,9 +86,21 @@ export declare function makeSessionLauncher(options?: {
|
|
|
63
86
|
innerCommand?: string | null;
|
|
64
87
|
tmuxPath?: string | null;
|
|
65
88
|
runner?: ProcessRunner;
|
|
89
|
+
codexAppServer?: CodexAppServerRuntime;
|
|
66
90
|
/** 起動対象エージェント(既定 claude)。codex は claude 固有処理を行わない。 */
|
|
67
91
|
agent?: LaunchAgent;
|
|
92
|
+
/**
|
|
93
|
+
* 新規セッションの端末バックエンド(既定 tmux。テスト決定性のためここでは設定ファイルを読まない)。
|
|
94
|
+
* 関数を渡すと launch 毎に解決する(engine は resolveSessionBackendKind を渡し、
|
|
95
|
+
* アプリの backend_set が engine 再起動なしで次の起動から反映される)。
|
|
96
|
+
*/
|
|
97
|
+
backend?: SessionBackendKind | (() => SessionBackendKind);
|
|
98
|
+
herdrPath?: string | null;
|
|
99
|
+
/** `~/.claude/projects` の場所(deleted-worktree-resume の transcript 移設用)。テスト注入用。 */
|
|
100
|
+
claudeProjectsDir?: string;
|
|
68
101
|
}): EngineLauncher;
|
|
102
|
+
/** Codex TUIを共有App Serverの同一threadへ接続する安全なresumeコマンド。 */
|
|
103
|
+
export declare function codexRemoteResumeCommand(_innerCommand: string, sessionId: string, remoteEndpoint: string): string;
|
|
69
104
|
/**
|
|
70
105
|
* launch の純ロジック(プロセス起動とパス類を注入できるためテスト可能)。
|
|
71
106
|
* 1. cwd 解決 + base 配下限定自動作成 → 2. フォルダ事前信頼 → 3. `--settings` へ承認フックを合成 →
|
|
@@ -83,10 +118,22 @@ export declare function launchCore(options: {
|
|
|
83
118
|
now: () => number;
|
|
84
119
|
errorSink: (message: string) => void;
|
|
85
120
|
runner?: ProcessRunner;
|
|
121
|
+
/** 新規セッションの端末バックエンド(既定 tmux)。 */
|
|
122
|
+
backend?: SessionBackendKind;
|
|
123
|
+
/** herdr 実行ファイルの絶対パス(backend=herdr のときのみ使用)。 */
|
|
124
|
+
herdrPath?: string | null;
|
|
125
|
+
/** detached プロセス起動の注入点(herdr tailii セッションサーバーの ensure 用, テスト注入可)。 */
|
|
126
|
+
spawnDetached?: (executable: string, args: string[]) => void;
|
|
127
|
+
/** herdr ensure のポーリング待機 ms(テストは 0 に差し替え可能)。 */
|
|
128
|
+
ensurePollMs?: number;
|
|
86
129
|
/** 起動対象エージェント(既定 claude)。codex は claude 固有の事前信頼/フック注入を行わない。 */
|
|
87
130
|
agent?: LaunchAgent;
|
|
88
131
|
/** host が `--session-id` で固定した Claude 会話 id。新規 claude 起動だけに記録する。 */
|
|
89
132
|
claudeSessionId?: string | null;
|
|
133
|
+
/** provider 共通の論理会話 ID(Claude UUID / Codex thread ID)。 */
|
|
134
|
+
providerSessionId?: string | null;
|
|
135
|
+
/** 会話の表示タイトル(session-title)。herdr 起動時のタブラベルに使う(未命名は session 名)。 */
|
|
136
|
+
displayTitle?: string | null;
|
|
90
137
|
/** `~/.claude.json`(事前信頼記録)の場所。テスト注入用。省略時は実ホーム。 */
|
|
91
138
|
claudeJsonPath?: string;
|
|
92
139
|
/** フックのグローバル無効化マーカーの場所。テスト注入用(実マシンのマーカーに左右されない密閉性)。 */
|
|
@@ -103,5 +150,20 @@ export declare function preTrustFolder(dir: string, claudeJsonPath?: string): vo
|
|
|
103
150
|
* `..` 脱出は拒否。不在 + 相対(= base 内側)のみ自動作成。失敗は errorSink へ出し null。
|
|
104
151
|
*/
|
|
105
152
|
export declare function resolveWorkdir(cwd: string, baseDir: string | null, errorSink: (message: string) => void): string | null;
|
|
153
|
+
/**
|
|
154
|
+
* resume 対象の cwd(絶対/`~`)が削除済みの Tailii worktree なら repo ルートへ振り替える。
|
|
155
|
+
* 公式 Claude Code CLI の「worktree が消えていたら起動元ディレクトリで再開」と同じ挙動
|
|
156
|
+
* (deleted-worktree-resume)。振り替え不要・不能なら null。
|
|
157
|
+
* claude の `--resume <id>` はカレントプロジェクトの slug に閉じて検索するため、
|
|
158
|
+
* transcript jsonl を repo ルート側 slug へ移設してから振り替える。
|
|
159
|
+
* 移設に失敗しても振り替え自体は行う(claude 側の未検出エラーの方が dir 不在より情報が多い)。
|
|
160
|
+
*/
|
|
161
|
+
export declare function rescueMissingWorktreeCwd(options: {
|
|
162
|
+
cwd: string;
|
|
163
|
+
/** claude の resume 会話 id(transcript 移設用)。codex 等は null。 */
|
|
164
|
+
claudeSessionId: string | null;
|
|
165
|
+
/** `~/.claude/projects` の場所。テスト注入用。 */
|
|
166
|
+
projectsDir?: string;
|
|
167
|
+
}): string | null;
|
|
106
168
|
/** THIS 実行中エントリスクリプトの絶対パスを解決する(フック command 埋め込み用)。 */
|
|
107
169
|
export declare function currentBinaryPath(): string;
|