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
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
// panePreviewPump.ts
|
|
2
|
+
// tailii (TS host) — foreground tmux pane のライブプレビュー配信。
|
|
3
|
+
import { parsePermissionMode } from "../shared/permissionMode.js";
|
|
4
|
+
import { PROTOCOL_V2 } from "../protocol.js";
|
|
5
|
+
import { abortableSleep } from "../shared/sleep.js";
|
|
6
|
+
/** tmux pane の画面内容が変化したときだけ pane_preview を流す。 */
|
|
7
|
+
export class PanePreviewPump {
|
|
8
|
+
writer;
|
|
9
|
+
capture;
|
|
10
|
+
pollIntervalMs;
|
|
11
|
+
quietThresholdMs;
|
|
12
|
+
protocolVersion;
|
|
13
|
+
abortController = null;
|
|
14
|
+
task = null;
|
|
15
|
+
seq = 0;
|
|
16
|
+
lastText = null;
|
|
17
|
+
lastChangeAt = 0;
|
|
18
|
+
lastEmitAt = 0;
|
|
19
|
+
pendingText = null;
|
|
20
|
+
hasEmitted = false;
|
|
21
|
+
active = false;
|
|
22
|
+
inactiveSent = false;
|
|
23
|
+
session = null;
|
|
24
|
+
mode = "claude_status";
|
|
25
|
+
onPermissionMode;
|
|
26
|
+
log;
|
|
27
|
+
lastPermissionMode = null;
|
|
28
|
+
lastEmittedDialog = false;
|
|
29
|
+
emitInitial = false;
|
|
30
|
+
static minEmitIntervalMs = 500;
|
|
31
|
+
constructor(options) {
|
|
32
|
+
this.writer = options.writer;
|
|
33
|
+
this.capture = options.capture;
|
|
34
|
+
const pollIntervalMs = options.pollIntervalMs ?? 250;
|
|
35
|
+
this.pollIntervalMs = typeof pollIntervalMs === "function" ? pollIntervalMs : () => pollIntervalMs;
|
|
36
|
+
this.quietThresholdMs = options.quietThresholdMs ?? 2500;
|
|
37
|
+
this.protocolVersion = options.protocolVersion ?? (() => PROTOCOL_V2);
|
|
38
|
+
this.onPermissionMode = options.onPermissionMode ?? null;
|
|
39
|
+
this.log = options.log ?? null;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* 対象セッションの preview を開始/切替する。同一セッションの二重 start は無視する。
|
|
43
|
+
* emitInitial=true は初回 capture も active フレームとして送る(処理中会話を一覧 watch で
|
|
44
|
+
* 開いた直後、pane が静止していてもカードを空にしないため)。
|
|
45
|
+
*/
|
|
46
|
+
start(session, mode = "claude_status", opts) {
|
|
47
|
+
if (this.session === session && this.mode === mode && this.task !== null)
|
|
48
|
+
return;
|
|
49
|
+
this.stop();
|
|
50
|
+
this.session = session;
|
|
51
|
+
this.mode = mode;
|
|
52
|
+
this.emitInitial = opts?.emitInitial ?? false;
|
|
53
|
+
this.lastPermissionMode = null;
|
|
54
|
+
this.lastText = null;
|
|
55
|
+
this.lastChangeAt = 0;
|
|
56
|
+
this.lastEmitAt = 0;
|
|
57
|
+
this.pendingText = null;
|
|
58
|
+
this.hasEmitted = false;
|
|
59
|
+
this.active = false;
|
|
60
|
+
this.inactiveSent = false;
|
|
61
|
+
const ac = new AbortController();
|
|
62
|
+
this.abortController = ac;
|
|
63
|
+
this.task = this.run(session, mode, ac.signal);
|
|
64
|
+
this.task.catch(() => { });
|
|
65
|
+
}
|
|
66
|
+
/** preview を停止する。active 中なら UI 側の表示を消すため inactive を一度だけ流す。 */
|
|
67
|
+
stop() {
|
|
68
|
+
this.abortController?.abort();
|
|
69
|
+
this.abortController = null;
|
|
70
|
+
this.task = null;
|
|
71
|
+
if (this.session !== null && this.active && !this.inactiveSent) {
|
|
72
|
+
this.emit(this.session, false, "");
|
|
73
|
+
}
|
|
74
|
+
this.session = null;
|
|
75
|
+
this.mode = "claude_status";
|
|
76
|
+
this.emitInitial = false;
|
|
77
|
+
this.lastPermissionMode = null;
|
|
78
|
+
this.lastText = null;
|
|
79
|
+
this.lastChangeAt = 0;
|
|
80
|
+
this.lastEmitAt = 0;
|
|
81
|
+
this.pendingText = null;
|
|
82
|
+
this.hasEmitted = false;
|
|
83
|
+
this.active = false;
|
|
84
|
+
this.inactiveSent = false;
|
|
85
|
+
}
|
|
86
|
+
async run(session, mode, signal) {
|
|
87
|
+
// pane 消滅(reaper kill 等)後も購読が残る間はポーリングが失敗し続けるため、
|
|
88
|
+
// 連続失敗は初回と約1分ごとだけログする(250ms 間隔の連打でログを埋めない)。
|
|
89
|
+
let consecutiveFailures = 0;
|
|
90
|
+
while (!signal.aborted) {
|
|
91
|
+
let text = null;
|
|
92
|
+
try {
|
|
93
|
+
text = await this.capture(session);
|
|
94
|
+
consecutiveFailures = 0;
|
|
95
|
+
}
|
|
96
|
+
catch (error) {
|
|
97
|
+
consecutiveFailures += 1;
|
|
98
|
+
if (consecutiveFailures === 1 || consecutiveFailures % 240 === 0) {
|
|
99
|
+
process.stderr.write(`[tailii-host engine] pane_preview capture 失敗` +
|
|
100
|
+
(consecutiveFailures > 1 ? `(連続${consecutiveFailures}回目)` : "") +
|
|
101
|
+
`: ${String(error)}\n`);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
if (text !== null && mode === "claude_status" && this.onPermissionMode !== null) {
|
|
105
|
+
// ダイアログ表示中は null(判定不能)になるため、直前の確定値を保持して揺れを抑える。
|
|
106
|
+
const permissionMode = parsePermissionMode(text);
|
|
107
|
+
if (permissionMode !== null && permissionMode !== this.lastPermissionMode) {
|
|
108
|
+
this.lastPermissionMode = permissionMode;
|
|
109
|
+
this.onPermissionMode(permissionMode);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
const now = Date.now();
|
|
113
|
+
if (text !== null && text !== this.lastText) {
|
|
114
|
+
if (this.lastText === null) {
|
|
115
|
+
this.lastText = text;
|
|
116
|
+
// Claude は従来どおり初回を基準フレームとして黙って保持する。
|
|
117
|
+
// Codex は接続時点ですでに turn が進行中の場合があるため、初回 capture も送り、
|
|
118
|
+
// iOS 側で現在の処理中ステータスだけを抽出する。
|
|
119
|
+
// emitInitial 指定時(処理中会話の watch 開始)は Claude も初回から送る。
|
|
120
|
+
if ((mode === "codex_terminal" || this.emitInitial) && text.trim().length > 0) {
|
|
121
|
+
this.lastChangeAt = now;
|
|
122
|
+
this.inactiveSent = false;
|
|
123
|
+
this.queueActive(session, text, now, mode);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
this.lastText = text;
|
|
128
|
+
this.lastChangeAt = now;
|
|
129
|
+
this.inactiveSent = false;
|
|
130
|
+
this.queueActive(session, text, now, mode);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
if (this.pendingText !== null &&
|
|
134
|
+
now - this.lastEmitAt >= PanePreviewPump.minEmitIntervalMs) {
|
|
135
|
+
this.emitActive(session, this.pendingText, now, mode);
|
|
136
|
+
}
|
|
137
|
+
else if (mode !== "codex_terminal" &&
|
|
138
|
+
this.active &&
|
|
139
|
+
!this.inactiveSent &&
|
|
140
|
+
this.hasEmitted &&
|
|
141
|
+
this.lastChangeAt > 0 &&
|
|
142
|
+
now - this.lastChangeAt >= this.quietThresholdMs) {
|
|
143
|
+
this.emit(session, false, "");
|
|
144
|
+
this.inactiveSent = true;
|
|
145
|
+
this.active = false;
|
|
146
|
+
}
|
|
147
|
+
await abortableSleep(this.pollIntervalMs(), signal);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
queueActive(session, text, now, mode) {
|
|
151
|
+
if (!this.hasEmitted || now - this.lastEmitAt >= PanePreviewPump.minEmitIntervalMs) {
|
|
152
|
+
this.emitActive(session, text, now, mode);
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
this.pendingText = text;
|
|
156
|
+
}
|
|
157
|
+
emitActive(session, text, now, mode) {
|
|
158
|
+
this.pendingText = null;
|
|
159
|
+
this.lastEmitAt = now;
|
|
160
|
+
this.active = true;
|
|
161
|
+
this.inactiveSent = false;
|
|
162
|
+
// 選択ダイアログ(転写カード対象)のフレームが実際に流れたかを追える遷移ログ。
|
|
163
|
+
const dialogFrame = text.includes("Enter to select");
|
|
164
|
+
if (dialogFrame !== this.lastEmittedDialog) {
|
|
165
|
+
this.lastEmittedDialog = dialogFrame;
|
|
166
|
+
this.log?.(`pane_preview dialog-frame ${dialogFrame ? "開始" : "終了"} session=${session} bytes=${Buffer.byteLength(text, "utf8")}`);
|
|
167
|
+
}
|
|
168
|
+
this.emit(session, true, text, mode);
|
|
169
|
+
}
|
|
170
|
+
emit(session, active, text, mode = this.mode) {
|
|
171
|
+
const v = this.protocolVersion();
|
|
172
|
+
if (v < PROTOCOL_V2)
|
|
173
|
+
return;
|
|
174
|
+
this.seq += 1;
|
|
175
|
+
this.hasEmitted = true;
|
|
176
|
+
this.writer.write({
|
|
177
|
+
type: "pane_preview",
|
|
178
|
+
v,
|
|
179
|
+
session,
|
|
180
|
+
seq: this.seq,
|
|
181
|
+
active,
|
|
182
|
+
text,
|
|
183
|
+
...(mode === "codex_terminal" ? { mode } : {}),
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
//# sourceMappingURL=panePreviewPump.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"panePreviewPump.js","sourceRoot":"","sources":["../../src/hub/panePreviewPump.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { QuestionAnswer } from "../protocol.js";
|
|
2
|
+
import type { SessionBackend } from "../backend/sessionBackend.js";
|
|
3
|
+
/**
|
|
4
|
+
* AskUserQuestion ダイアログのフレームか。`Enter to select` は /remote-control 等の
|
|
5
|
+
* ❯ メニューにも出るため、設問 TUI 固有の要素(質問タブ・回答レビュー・notes 等)との
|
|
6
|
+
* AND で判定する(承認ダイアログは Enter to select を含まないので対象外)。
|
|
7
|
+
*/
|
|
8
|
+
export declare function isQuestionDialogFrame(text: string): boolean;
|
|
9
|
+
/**
|
|
10
|
+
* question_answer → Claude AskUserQuestion TUI のキー操作。
|
|
11
|
+
* 各キー間の待機は、Ink の再描画中に連続入力が欠落するのを避けるために設ける。
|
|
12
|
+
* - 単一選択 = 数字キーで即確定。Other は行番号 → literal 入力 → Enter。
|
|
13
|
+
* - multiSelect = 数字キーは無反応。カーソル(先頭 index 0 から開始)を ↓ で対象行へ移動し
|
|
14
|
+
* Space でトグル → Right でレビュー → 最終問後に「1」Submit answers。
|
|
15
|
+
* Other 行は Space でチェック&入力欄化 → literal 入力 → ↑ でテキスト欄を抜けてから Right。
|
|
16
|
+
* - Other の synthetic index(= options.count)は選択肢中で最大の index になるため、
|
|
17
|
+
* otherText があるときは最大 index を Other 行とみなす。
|
|
18
|
+
*/
|
|
19
|
+
export declare function injectQuestionAnswers(answers: QuestionAnswer[], session: string, sessionManager: SessionBackend): Promise<void>;
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
// questionInjection.ts
|
|
2
|
+
// tailii (TS host) — AskUserQuestion の回答を Claude TUI へ注入する。
|
|
3
|
+
import { sleep } from "../shared/sleep.js";
|
|
4
|
+
const KEY_STEP_MS = 150;
|
|
5
|
+
/** Other 本文 → Enter の猶予(herdr 実測: 300ms 未満だと CR が本文に飲まれる)。 */
|
|
6
|
+
const OTHER_TEXT_CR_GAP_MS = 400;
|
|
7
|
+
/** 注入完了からダイアログ消滅検証までの猶予(TUI の再描画待ち)。 */
|
|
8
|
+
const VERIFY_DELAY_MS = 600;
|
|
9
|
+
/** 1回目の検証でダイアログ残存だったときの再検証までの猶予。 */
|
|
10
|
+
const VERIFY_RETRY_DELAY_MS = 1_500;
|
|
11
|
+
/**
|
|
12
|
+
* AskUserQuestion ダイアログのフレームか。`Enter to select` は /remote-control 等の
|
|
13
|
+
* ❯ メニューにも出るため、設問 TUI 固有の要素(質問タブ・回答レビュー・notes 等)との
|
|
14
|
+
* AND で判定する(承認ダイアログは Enter to select を含まないので対象外)。
|
|
15
|
+
*/
|
|
16
|
+
export function isQuestionDialogFrame(text) {
|
|
17
|
+
if (!text.includes("Enter to select"))
|
|
18
|
+
return false;
|
|
19
|
+
return (text.includes("Tab to switch questions") ||
|
|
20
|
+
text.includes("Ready to submit your answers?") ||
|
|
21
|
+
text.includes("Chat about this") ||
|
|
22
|
+
text.includes("Type something.") ||
|
|
23
|
+
text.includes("to add notes"));
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* question_answer → Claude AskUserQuestion TUI のキー操作。
|
|
27
|
+
* 各キー間の待機は、Ink の再描画中に連続入力が欠落するのを避けるために設ける。
|
|
28
|
+
* - 単一選択 = 数字キーで即確定。Other は行番号 → literal 入力 → Enter。
|
|
29
|
+
* - multiSelect = 数字キーは無反応。カーソル(先頭 index 0 から開始)を ↓ で対象行へ移動し
|
|
30
|
+
* Space でトグル → Right でレビュー → 最終問後に「1」Submit answers。
|
|
31
|
+
* Other 行は Space でチェック&入力欄化 → literal 入力 → ↑ でテキスト欄を抜けてから Right。
|
|
32
|
+
* - Other の synthetic index(= options.count)は選択肢中で最大の index になるため、
|
|
33
|
+
* otherText があるときは最大 index を Other 行とみなす。
|
|
34
|
+
*/
|
|
35
|
+
export async function injectQuestionAnswers(answers, session, sessionManager) {
|
|
36
|
+
const sorted = answers.slice().sort((a, b) => a.questionIndex - b.questionIndex);
|
|
37
|
+
// 2 問以上では、最後の設問が単一選択でも回答レビュー画面を経由する。
|
|
38
|
+
// 単一選択の数字キーは「その設問を確定」するだけで、AskUserQuestion 全体の
|
|
39
|
+
// Submit answers までは行わない。1 問だけの単一選択のみ即時完了する。
|
|
40
|
+
const needsReviewSubmit = sorted.length > 1 || sorted.some((answer) => answer.multiSelect);
|
|
41
|
+
for (const answer of sorted) {
|
|
42
|
+
const other = (answer.otherText ?? "").trim();
|
|
43
|
+
let indexes = answer.selectedOptionIndexes.filter((i) => i >= 0).sort((a, b) => a - b);
|
|
44
|
+
// otherText があるとき、最大 index は Other(Type something.)行。
|
|
45
|
+
let otherIndex = null;
|
|
46
|
+
if (other.length > 0 && indexes.length > 0) {
|
|
47
|
+
otherIndex = indexes[indexes.length - 1];
|
|
48
|
+
indexes = indexes.slice(0, -1);
|
|
49
|
+
}
|
|
50
|
+
if (answer.multiSelect) {
|
|
51
|
+
// multiSelect は数字キーではトグルできない(実 TUI)。カーソルを ↓ で移動し Space でトグルする。
|
|
52
|
+
// カーソルは先頭(index 0)から開始。indexes / otherIndex は昇順なので下方向のみで足りる。
|
|
53
|
+
let cursor = 0;
|
|
54
|
+
const moveTo = async (target) => {
|
|
55
|
+
for (let n = cursor; n < target; n += 1) {
|
|
56
|
+
await sessionManager.sendKeys(session, ["Down"]);
|
|
57
|
+
await sleep(KEY_STEP_MS);
|
|
58
|
+
}
|
|
59
|
+
cursor = target;
|
|
60
|
+
};
|
|
61
|
+
for (const idx of indexes) {
|
|
62
|
+
await moveTo(idx);
|
|
63
|
+
await sessionManager.sendKeys(session, ["Space"]);
|
|
64
|
+
await sleep(KEY_STEP_MS);
|
|
65
|
+
}
|
|
66
|
+
if (otherIndex !== null) {
|
|
67
|
+
await moveTo(otherIndex);
|
|
68
|
+
// Other 行を Space でチェックすると同時に入力欄がフォーカスされる。
|
|
69
|
+
await sessionManager.sendKeys(session, ["Space"]);
|
|
70
|
+
await sleep(KEY_STEP_MS);
|
|
71
|
+
await sessionManager.sendKeys(session, [other], true);
|
|
72
|
+
await sleep(KEY_STEP_MS);
|
|
73
|
+
// テキスト欄にいると Right がタブ移動に効かないため、↑ で通常行へ退避してから進む。
|
|
74
|
+
await sessionManager.sendKeys(session, ["Up"]);
|
|
75
|
+
await sleep(KEY_STEP_MS);
|
|
76
|
+
cursor = otherIndex - 1;
|
|
77
|
+
}
|
|
78
|
+
// レビュー(最終問)または次の質問タブへ進む。
|
|
79
|
+
await sessionManager.sendKeys(session, ["Right"]);
|
|
80
|
+
}
|
|
81
|
+
else if (otherIndex !== null) {
|
|
82
|
+
await sessionManager.sendKeys(session, [String(otherIndex + 1)]);
|
|
83
|
+
await sleep(KEY_STEP_MS);
|
|
84
|
+
// 本文は生キーで注入する。sendTextSubmit は「選択ダイアログ残存 → Esc で閉じる」防御を
|
|
85
|
+
// 持ち、AskUserQuestion ダイアログ自体(Enter to select フッター)を誤認して Esc で
|
|
86
|
+
// 設問を却下してしまう(実機FB 2026-08-05: その他回答が Request interrupted になり、
|
|
87
|
+
// 本文が通常メッセージとして送信される)。CR は本文から 300ms 以上空ければ飲まれない
|
|
88
|
+
// (herdr 実測 2026-07-22)ので、本文 → 猶予 → Enter の open-loop で確定し、
|
|
89
|
+
// 取りこぼしは末尾のダイアログ残存検証(throw → pending 復元)に任せる。
|
|
90
|
+
await sessionManager.sendKeys(session, [other], true);
|
|
91
|
+
await sleep(OTHER_TEXT_CR_GAP_MS);
|
|
92
|
+
await sessionManager.sendKeys(session, ["Enter"]);
|
|
93
|
+
}
|
|
94
|
+
else if (indexes.length > 0) {
|
|
95
|
+
// 数字キーで即確定(Enter は送らない)。
|
|
96
|
+
await sessionManager.sendKeys(session, [String(indexes[0] + 1)]);
|
|
97
|
+
}
|
|
98
|
+
// TUI の再描画/タブ送りを待つ(連続注入の取りこぼし防止)。
|
|
99
|
+
await sleep(200);
|
|
100
|
+
}
|
|
101
|
+
if (needsReviewSubmit) {
|
|
102
|
+
// 複数設問または複数選択では、最後に必ず回答レビュー画面を経由する。
|
|
103
|
+
// 「Ready to submit your answers?」で 1. Submit answers を確定する。
|
|
104
|
+
await sessionManager.sendKeys(session, ["1"]);
|
|
105
|
+
}
|
|
106
|
+
// 注入は TUI への open-loop キー操作で、キーが取りこぼされても各コマンドは exit 0 のまま
|
|
107
|
+
// 静かに失敗する。ダイアログが閉じたかを pane で検証し、残存なら throw して呼び出し側
|
|
108
|
+
// (hub)に pendingQuestion の復元と prompt 再配信をさせる(詰み防止, question-answer-retry)。
|
|
109
|
+
await sleep(VERIFY_DELAY_MS);
|
|
110
|
+
if (!(await questionDialogStillVisible(session, sessionManager)))
|
|
111
|
+
return;
|
|
112
|
+
await sleep(VERIFY_RETRY_DELAY_MS);
|
|
113
|
+
if (await questionDialogStillVisible(session, sessionManager)) {
|
|
114
|
+
throw new Error("AskUserQuestion dialog still visible after key injection");
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
/** pane 読取失敗は「検証不能」= 残存扱いにしない(誤復元でユーザーを二重回答に誘導しない)。 */
|
|
118
|
+
async function questionDialogStillVisible(session, sessionManager) {
|
|
119
|
+
try {
|
|
120
|
+
return isQuestionDialogFrame(await sessionManager.capturePane(session, { lines: 40 }));
|
|
121
|
+
}
|
|
122
|
+
catch {
|
|
123
|
+
return false;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=questionInjection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"questionInjection.js","sourceRoot":"","sources":["../../src/hub/questionInjection.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import type { SessionInfo } from "../protocol.js";
|
|
2
|
+
import { SessionMetadataStore } from "../sessions/sessionMetadataStore.js";
|
|
3
|
+
import { type TmuxCommandRunner } from "../backend/tmux.js";
|
|
4
|
+
/** 一律のアイドル timeout(秒)。idle/active(bump 停止)の両方に同じ値を使う。 */
|
|
5
|
+
export declare const REAPER_IDLE_TIMEOUT_SECONDS = 1800;
|
|
6
|
+
/** 巡回間隔(秒)。 */
|
|
7
|
+
export declare const REAPER_CHECK_INTERVAL_SECONDS = 60;
|
|
8
|
+
/** tailii が管理する tmux セッション名(これ以外は絶対に触らない)。 */
|
|
9
|
+
export declare const TAILII_SESSION_PATTERN: RegExp;
|
|
10
|
+
/** herdr backend セッションの reaper 操作面(テストはモックを注入する)。 */
|
|
11
|
+
export interface HerdrReaperOps {
|
|
12
|
+
list(): Promise<SessionInfo[]>;
|
|
13
|
+
agentProcessAlive(name: string): Promise<boolean>;
|
|
14
|
+
kill(name: string): Promise<void>;
|
|
15
|
+
/** 生存 Tailii セッションが 0 のとき、pane ゼロの専用 server を停止する(任意実装)。 */
|
|
16
|
+
stopServerIfEmpty?(): Promise<void>;
|
|
17
|
+
/** 生存 pane の session 名 → タブ情報(session-title 自動タイトル同期用, 任意実装)。 */
|
|
18
|
+
tabInfoByName?(): Promise<Map<string, {
|
|
19
|
+
tabId: string;
|
|
20
|
+
label: string | null;
|
|
21
|
+
}>>;
|
|
22
|
+
/** タブラベルの書換(session-title, 任意実装)。 */
|
|
23
|
+
setDisplayTitle?(name: string, title: string | null): Promise<void>;
|
|
24
|
+
}
|
|
25
|
+
export interface ReaperTickOptions {
|
|
26
|
+
runner: TmuxCommandRunner;
|
|
27
|
+
heartbeatDir: string;
|
|
28
|
+
metadataStore: SessionMetadataStore;
|
|
29
|
+
timeoutSeconds: number;
|
|
30
|
+
now: number;
|
|
31
|
+
log?: (message: string) => void;
|
|
32
|
+
/**
|
|
33
|
+
* LISTEN 中のローカル開発サーバーが持つ cwd 集合。timeout 候補がある tick でだけ呼ぶ。
|
|
34
|
+
* null は検出不能。サーバーなしの空集合とは区別し、回収を次 tick へ延期する。
|
|
35
|
+
*/
|
|
36
|
+
listLocalServerCwds?: () => Promise<ReadonlySet<string> | null>;
|
|
37
|
+
/**
|
|
38
|
+
* herdr backend の操作面。省略時は herdr メタが存在するときだけ実 HerdrSessionManager を使う
|
|
39
|
+
* (純 tmux 環境では herdr CLI を一切呼ばない)。null で herdr 巡回を無効化。
|
|
40
|
+
*/
|
|
41
|
+
herdrOps?: HerdrReaperOps | null;
|
|
42
|
+
/**
|
|
43
|
+
* claude 会話タイトルの導出(session-title 自動タイトル同期用, テスト注入可)。
|
|
44
|
+
* 省略時は transcript の明示タイトル(custom-title/ai-title)優先 → 最初のユーザー発話。
|
|
45
|
+
*/
|
|
46
|
+
deriveClaudeTitle?: (claudeSessionId: string) => string | null;
|
|
47
|
+
/**
|
|
48
|
+
* Codex の正式な会話名(thread.name)の導出(session-title 自動タイトル同期用)。
|
|
49
|
+
* 省略時は稼働中の共有 App Server の thread/list を巡回ごとに一度だけ読む。
|
|
50
|
+
*/
|
|
51
|
+
deriveCodexTitle?: (threadId: string) => string | null | Promise<string | null>;
|
|
52
|
+
}
|
|
53
|
+
export interface ReaperTickResult {
|
|
54
|
+
/** 巡回時点で生存していた tailii セッション数(kill 前)。0 なら daemon は自然終了してよい。 */
|
|
55
|
+
liveCount: number;
|
|
56
|
+
killed: string[];
|
|
57
|
+
/** active のままプロセスだけ死んでいて idle へ降格したセッション。 */
|
|
58
|
+
demoted: string[];
|
|
59
|
+
/** 生存セッションが無く heartbeat 残骸を掃除したセッション。 */
|
|
60
|
+
reclaimed: string[];
|
|
61
|
+
}
|
|
62
|
+
/** server cwd がセッション cwd 自身またはその子孫か(prefix sibling は除外)。 */
|
|
63
|
+
export declare function serverCwdBelongsToSession(sessionCwd: string, serverCwd: string): boolean;
|
|
64
|
+
/** 生存中の tailii セッション名(`cs-*`/`s-*`)。tmux サーバ不在は空集合。 */
|
|
65
|
+
export declare function liveTailiiSessions(runner: TmuxCommandRunner): Promise<string[]>;
|
|
66
|
+
/** ターミナルクライアントが attach 中のセッション名集合。取得失敗は空集合(保護なしに倒す)。 */
|
|
67
|
+
export declare function attachedSessions(runner: TmuxCommandRunner): Promise<Set<string>>;
|
|
68
|
+
/**
|
|
69
|
+
* pane のエージェントプロセス生存判定。判定不能(tmux エラー等)は true(=保護、安全側)。
|
|
70
|
+
* pane_current_command がシェル名なら claude/codex プロセスは終了している。
|
|
71
|
+
*/
|
|
72
|
+
export declare function agentProcessAlive(runner: TmuxCommandRunner, name: string, metadataStore: SessionMetadataStore): Promise<boolean>;
|
|
73
|
+
/** 巡回 1 回分。判定表は docs/architecture.md「セッション自動掃除」を参照。 */
|
|
74
|
+
export declare function reaperTick(options: ReaperTickOptions): Promise<ReaperTickResult>;
|