tailii-host 0.5.0 → 0.7.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/dist/approval/hook.js +11 -1
- package/dist/approval/hook.js.map +1 -1
- package/dist/backend/herdr.d.ts +60 -6
- package/dist/backend/herdr.js +180 -27
- package/dist/backend/herdr.js.map +1 -1
- package/dist/backend/sessionBackend.d.ts +22 -3
- package/dist/backend/sessionBackend.js +11 -2
- package/dist/backend/sessionBackend.js.map +1 -1
- package/dist/backend/tmux.d.ts +197 -3
- package/dist/backend/tmux.js +565 -16
- package/dist/backend/tmux.js.map +1 -1
- package/dist/chat/chatTailController.d.ts +4 -2
- package/dist/chat/chatTailController.js +19 -33
- package/dist/chat/chatTailController.js.map +1 -1
- package/dist/chat/imageService.d.ts +9 -1
- package/dist/chat/imageService.js +39 -0
- package/dist/chat/imageService.js.map +1 -1
- package/dist/chat/subagentTailer.d.ts +10 -0
- package/dist/chat/subagentTailer.js +234 -51
- package/dist/chat/subagentTailer.js.map +1 -1
- package/dist/chat/subagentTranscript.js +51 -5
- package/dist/chat/subagentTranscript.js.map +1 -1
- package/dist/chat/transcriptTailer.d.ts +53 -1
- package/dist/chat/transcriptTailer.js +313 -2
- package/dist/chat/transcriptTailer.js.map +1 -1
- package/dist/codex/codexAppServer.d.ts +54 -9
- package/dist/codex/codexAppServer.js +495 -76
- package/dist/codex/codexAppServer.js.map +1 -1
- package/dist/codex/codexNativeTurnController.d.ts +22 -1
- package/dist/codex/codexNativeTurnController.js +76 -11
- package/dist/codex/codexNativeTurnController.js.map +1 -1
- package/dist/codex/codexRolloutTailer.d.ts +3 -0
- package/dist/codex/codexRolloutTailer.js +85 -13
- package/dist/codex/codexRolloutTailer.js.map +1 -1
- package/dist/codex/codexSessionStore.js +54 -16
- package/dist/codex/codexSessionStore.js.map +1 -1
- package/dist/codex/codexSubagentTracker.d.ts +13 -0
- package/dist/codex/codexSubagentTracker.js +55 -1
- package/dist/codex/codexSubagentTracker.js.map +1 -1
- package/dist/codex/codexSystemNotice.d.ts +18 -0
- package/dist/codex/codexSystemNotice.js +212 -0
- package/dist/codex/codexSystemNotice.js.map +1 -0
- package/dist/commands/launch.js +50 -13
- package/dist/commands/launch.js.map +1 -1
- package/dist/engine/context.d.ts +32 -1
- package/dist/engine/context.js +39 -3
- package/dist/engine/context.js.map +1 -1
- package/dist/engine/engine.d.ts +5 -1
- package/dist/engine/engine.js +87 -4
- package/dist/engine/engine.js.map +1 -1
- package/dist/engine/handlers/accountUsage.d.ts +17 -0
- package/dist/engine/handlers/accountUsage.js +40 -6
- package/dist/engine/handlers/accountUsage.js.map +1 -1
- package/dist/engine/handlers/codex.js +37 -0
- package/dist/engine/handlers/codex.js.map +1 -1
- package/dist/engine/handlers/core.js +14 -1
- package/dist/engine/handlers/core.js.map +1 -1
- package/dist/engine/handlers/mode.js +105 -1
- package/dist/engine/handlers/mode.js.map +1 -1
- package/dist/engine/handlers/session.js +17 -33
- package/dist/engine/handlers/session.js.map +1 -1
- package/dist/engine/handlers/usage.js +4 -1
- package/dist/engine/handlers/usage.js.map +1 -1
- package/dist/engine/handlers/workspace.js +22 -1
- package/dist/engine/handlers/workspace.js.map +1 -1
- package/dist/hub/effortDialog.d.ts +15 -0
- package/dist/hub/effortDialog.js +60 -16
- package/dist/hub/effortDialog.js.map +1 -1
- package/dist/hub/engineRelaySocket.d.ts +7 -0
- package/dist/hub/engineRelaySocket.js +7 -1
- package/dist/hub/engineRelaySocket.js.map +1 -1
- package/dist/hub/hubDaemon.js +30 -5
- package/dist/hub/hubDaemon.js.map +1 -1
- package/dist/hub/hubProtocol.d.ts +10 -0
- package/dist/hub/hubProtocol.js +19 -2
- package/dist/hub/hubProtocol.js.map +1 -1
- package/dist/hub/panePreviewPump.d.ts +27 -0
- package/dist/hub/panePreviewPump.js +62 -1
- package/dist/hub/panePreviewPump.js.map +1 -1
- package/dist/hub/sessionHub.d.ts +125 -4
- package/dist/hub/sessionHub.js +413 -48
- package/dist/hub/sessionHub.js.map +1 -1
- package/dist/protocol/decode.js +84 -15
- package/dist/protocol/decode.js.map +1 -1
- package/dist/protocol/encode.js +2 -0
- package/dist/protocol/encode.js.map +1 -1
- package/dist/protocol/messages.d.ts +87 -1
- package/dist/services/accountIdentity.js +3 -1
- package/dist/services/accountIdentity.js.map +1 -1
- package/dist/services/fileService.d.ts +15 -0
- package/dist/services/fileService.js +176 -14
- package/dist/services/fileService.js.map +1 -1
- package/dist/services/officialApps.d.ts +21 -1
- package/dist/services/officialApps.js +201 -53
- package/dist/services/officialApps.js.map +1 -1
- package/dist/services/planUsageFetcher.d.ts +35 -3
- package/dist/services/planUsageFetcher.js +34 -6
- package/dist/services/planUsageFetcher.js.map +1 -1
- package/dist/services/previewServer.js +15 -6
- package/dist/services/previewServer.js.map +1 -1
- package/dist/sessions/claudeSessionStore.js +30 -0
- package/dist/sessions/claudeSessionStore.js.map +1 -1
- package/dist/sessions/heartbeat.d.ts +7 -1
- package/dist/sessions/heartbeat.js +3 -1
- package/dist/sessions/heartbeat.js.map +1 -1
- package/dist/sessions/sessionSearch.js +23 -5
- package/dist/sessions/sessionSearch.js.map +1 -1
- package/dist/sessions/transcriptPath.d.ts +3 -0
- package/dist/sessions/transcriptPath.js +15 -0
- package/dist/sessions/transcriptPath.js.map +1 -0
- package/dist/shared/clientBuild.d.ts +26 -0
- package/dist/shared/clientBuild.js +89 -0
- package/dist/shared/clientBuild.js.map +1 -0
- package/dist/shared/crossSession.d.ts +15 -0
- package/dist/shared/crossSession.js +75 -0
- package/dist/shared/crossSession.js.map +1 -0
- package/dist/shared/harnessReminder.d.ts +32 -0
- package/dist/shared/harnessReminder.js +124 -0
- package/dist/shared/harnessReminder.js.map +1 -0
- package/dist/shared/systemNotice.d.ts +30 -0
- package/dist/shared/systemNotice.js +209 -0
- package/dist/shared/systemNotice.js.map +1 -0
- package/package.json +3 -3
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
// panePreviewPump.ts
|
|
2
2
|
// tailii (TS host) — foreground tmux pane のライブプレビュー配信。
|
|
3
3
|
import { parsePermissionMode } from "../shared/permissionMode.js";
|
|
4
|
+
import { extractInputBoxSuggestion } from "../backend/tmux.js";
|
|
4
5
|
import { PROTOCOL_V2 } from "../protocol.js";
|
|
5
6
|
import { abortableSleep } from "../shared/sleep.js";
|
|
6
7
|
/** tmux pane の画面内容が変化したときだけ pane_preview を流す。 */
|
|
@@ -24,6 +25,12 @@ export class PanePreviewPump {
|
|
|
24
25
|
mode = "claude_status";
|
|
25
26
|
onPermissionMode;
|
|
26
27
|
log;
|
|
28
|
+
emitInitialIf;
|
|
29
|
+
captureSuggestion;
|
|
30
|
+
suggestionIntervalMs;
|
|
31
|
+
/** 直近に配信した提案文(null=未配信・"" =提案なし)。変化時だけ流す。 */
|
|
32
|
+
lastSuggestion = null;
|
|
33
|
+
lastSuggestionAt = 0;
|
|
27
34
|
lastPermissionMode = null;
|
|
28
35
|
lastEmittedDialog = false;
|
|
29
36
|
emitInitial = false;
|
|
@@ -37,6 +44,25 @@ export class PanePreviewPump {
|
|
|
37
44
|
this.protocolVersion = options.protocolVersion ?? (() => PROTOCOL_V2);
|
|
38
45
|
this.onPermissionMode = options.onPermissionMode ?? null;
|
|
39
46
|
this.log = options.log ?? null;
|
|
47
|
+
this.emitInitialIf = options.emitInitialIf ?? null;
|
|
48
|
+
this.captureSuggestion = options.captureSuggestion ?? null;
|
|
49
|
+
this.suggestionIntervalMs = options.suggestionIntervalMs ?? 1000;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* 直近フレームを再送する(前面購読者の(再)参加時)。pump が動いていても pane が静止して
|
|
53
|
+
* いれば変化フレームは出ないため、入力待ちダイアログの転写が開き直しで出ない。
|
|
54
|
+
* 送るのは `emitInitialIf` が真のフレームだけ(静止 pane の古い status 行で誤点灯しない)。
|
|
55
|
+
*/
|
|
56
|
+
resendLastIfInteractive() {
|
|
57
|
+
const session = this.session;
|
|
58
|
+
const text = this.lastText;
|
|
59
|
+
if (session === null || text === null || this.emitInitialIf === null)
|
|
60
|
+
return;
|
|
61
|
+
if (!this.emitInitialIf(text))
|
|
62
|
+
return;
|
|
63
|
+
this.lastChangeAt = Date.now();
|
|
64
|
+
this.inactiveSent = false;
|
|
65
|
+
this.emitActive(session, text, Date.now(), this.mode);
|
|
40
66
|
}
|
|
41
67
|
/**
|
|
42
68
|
* 対象セッションの preview を開始/切替する。同一セッションの二重 start は無視する。
|
|
@@ -58,6 +84,8 @@ export class PanePreviewPump {
|
|
|
58
84
|
this.hasEmitted = false;
|
|
59
85
|
this.active = false;
|
|
60
86
|
this.inactiveSent = false;
|
|
87
|
+
this.lastSuggestion = null;
|
|
88
|
+
this.lastSuggestionAt = 0;
|
|
61
89
|
const ac = new AbortController();
|
|
62
90
|
this.abortController = ac;
|
|
63
91
|
this.task = this.run(session, mode, ac.signal);
|
|
@@ -71,6 +99,12 @@ export class PanePreviewPump {
|
|
|
71
99
|
if (this.session !== null && this.active && !this.inactiveSent) {
|
|
72
100
|
this.emit(this.session, false, "");
|
|
73
101
|
}
|
|
102
|
+
// 提案チップを残さないよう、離脱時に提案があればクリアを一度流す。
|
|
103
|
+
if (this.session !== null && this.lastSuggestion !== null && this.lastSuggestion !== "") {
|
|
104
|
+
this.emitSuggestion(this.session, "");
|
|
105
|
+
}
|
|
106
|
+
this.lastSuggestion = null;
|
|
107
|
+
this.lastSuggestionAt = 0;
|
|
74
108
|
this.session = null;
|
|
75
109
|
this.mode = "claude_status";
|
|
76
110
|
this.emitInitial = false;
|
|
@@ -117,7 +151,8 @@ export class PanePreviewPump {
|
|
|
117
151
|
// Codex は接続時点ですでに turn が進行中の場合があるため、初回 capture も送り、
|
|
118
152
|
// iOS 側で現在の処理中ステータスだけを抽出する。
|
|
119
153
|
// emitInitial 指定時(処理中会話の watch 開始)は Claude も初回から送る。
|
|
120
|
-
|
|
154
|
+
const interactive = this.emitInitialIf !== null && this.emitInitialIf(text);
|
|
155
|
+
if ((mode === "codex_terminal" || this.emitInitial || interactive) && text.trim().length > 0) {
|
|
121
156
|
this.lastChangeAt = now;
|
|
122
157
|
this.inactiveSent = false;
|
|
123
158
|
this.queueActive(session, text, now, mode);
|
|
@@ -144,9 +179,35 @@ export class PanePreviewPump {
|
|
|
144
179
|
this.inactiveSent = true;
|
|
145
180
|
this.active = false;
|
|
146
181
|
}
|
|
182
|
+
// プロンプト提案(薄字ゴースト)の抽出・配信(claude_status のみ・低頻度・変化時だけ)。
|
|
183
|
+
if (mode === "claude_status" &&
|
|
184
|
+
this.captureSuggestion !== null &&
|
|
185
|
+
now - this.lastSuggestionAt >= this.suggestionIntervalMs) {
|
|
186
|
+
this.lastSuggestionAt = now;
|
|
187
|
+
try {
|
|
188
|
+
const ansi = await this.captureSuggestion(session);
|
|
189
|
+
const suggestion = extractInputBoxSuggestion(ansi) ?? "";
|
|
190
|
+
// 未配信(null)から「提案なし("")」への遷移は流さない(購読開始のたびの無駄打ちを避ける)。
|
|
191
|
+
// 以降は変化時だけ流す。baseline は常に更新して後続の遷移検出を成立させる。
|
|
192
|
+
const firstEmptyBaseline = this.lastSuggestion === null && suggestion === "";
|
|
193
|
+
if (suggestion !== this.lastSuggestion && !firstEmptyBaseline) {
|
|
194
|
+
this.emitSuggestion(session, suggestion);
|
|
195
|
+
}
|
|
196
|
+
this.lastSuggestion = suggestion;
|
|
197
|
+
}
|
|
198
|
+
catch {
|
|
199
|
+
// capture 失敗は無視(次周期で再試行。提案は補助機能なので表に出さない)。
|
|
200
|
+
}
|
|
201
|
+
}
|
|
147
202
|
await abortableSleep(this.pollIntervalMs(), signal);
|
|
148
203
|
}
|
|
149
204
|
}
|
|
205
|
+
emitSuggestion(session, text) {
|
|
206
|
+
const v = this.protocolVersion();
|
|
207
|
+
if (v < PROTOCOL_V2)
|
|
208
|
+
return;
|
|
209
|
+
this.writer.write({ type: "input_suggestion", v, session, text });
|
|
210
|
+
}
|
|
150
211
|
queueActive(session, text, now, mode) {
|
|
151
212
|
if (!this.hasEmitted || now - this.lastEmitAt >= PanePreviewPump.minEmitIntervalMs) {
|
|
152
213
|
this.emitActive(session, text, now, mode);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"panePreviewPump.js","sourceRoot":"","sources":["../../src/hub/panePreviewPump.ts"],"names":[],"mappings":"AAAA,qBAAqB;AACrB,uDAAuD;AAGvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"panePreviewPump.js","sourceRoot":"","sources":["../../src/hub/panePreviewPump.ts"],"names":[],"mappings":"AAAA,qBAAqB;AACrB,uDAAuD;AAGvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAyCpD,iDAAiD;AACjD,MAAM,OAAO,eAAe;IACT,MAAM,CAAa;IACnB,OAAO,CAAqB;IAC5B,cAAc,CAAe;IAC7B,gBAAgB,CAAS;IACzB,eAAe,CAAe;IACvC,eAAe,GAA2B,IAAI,CAAC;IAC/C,IAAI,GAAyB,IAAI,CAAC;IAClC,GAAG,GAAG,CAAC,CAAC;IACR,QAAQ,GAAkB,IAAI,CAAC;IAC/B,YAAY,GAAG,CAAC,CAAC;IACjB,UAAU,GAAG,CAAC,CAAC;IACf,WAAW,GAAkB,IAAI,CAAC;IAClC,UAAU,GAAG,KAAK,CAAC;IACnB,MAAM,GAAG,KAAK,CAAC;IACf,YAAY,GAAG,KAAK,CAAC;IACrB,OAAO,GAAkB,IAAI,CAAC;IAC9B,IAAI,GAAoB,eAAe,CAAC;IAC/B,gBAAgB,CAAkC;IAClD,GAAG,CAAqC;IACxC,aAAa,CAAqC;IAClD,iBAAiB,CAAgD;IACjE,oBAAoB,CAAS;IAC9C,6CAA6C;IACrC,cAAc,GAAkB,IAAI,CAAC;IACrC,gBAAgB,GAAG,CAAC,CAAC;IACrB,kBAAkB,GAAkB,IAAI,CAAC;IACzC,iBAAiB,GAAG,KAAK,CAAC;IAC1B,WAAW,GAAG,KAAK,CAAC;IACpB,MAAM,CAAU,iBAAiB,GAAG,GAAG,CAAC;IAEhD,YAAY,OAA+B;QACzC,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAC7B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QAC/B,MAAM,cAAc,GAAG,OAAO,CAAC,cAAc,IAAI,GAAG,CAAC;QACrD,IAAI,CAAC,cAAc,GAAG,OAAO,cAAc,KAAK,UAAU,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC;QACnG,IAAI,CAAC,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,IAAI,IAAI,CAAC;QACzD,IAAI,CAAC,eAAe,GAAG,OAAO,CAAC,eAAe,IAAI,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC,CAAC;QACtE,IAAI,CAAC,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,IAAI,IAAI,CAAC;QACzD,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC;QAC/B,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,aAAa,IAAI,IAAI,CAAC;QACnD,IAAI,CAAC,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,IAAI,IAAI,CAAC;QAC3D,IAAI,CAAC,oBAAoB,GAAG,OAAO,CAAC,oBAAoB,IAAI,IAAI,CAAC;IACnE,CAAC;IAED;;;;OAIG;IACH,uBAAuB;QACrB,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC3B,IAAI,OAAO,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,CAAC,aAAa,KAAK,IAAI;YAAE,OAAO;QAC7E,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;YAAE,OAAO;QACtC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC/B,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;QAC1B,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IACxD,CAAC;IAED;;;;OAIG;IACH,KAAK,CACH,OAAe,EACf,IAAI,GAAoB,eAAe,EACvC,IAAgC;QAEhC,IAAI,IAAI,CAAC,OAAO,KAAK,OAAO,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI;YAAE,OAAO;QACjF,IAAI,CAAC,IAAI,EAAE,CAAC;QACZ,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,WAAW,GAAG,IAAI,EAAE,WAAW,IAAI,KAAK,CAAC;QAC9C,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;QAC/B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;QACtB,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;QACpB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;QACxB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;QAC1B,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC3B,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC;QAC1B,MAAM,EAAE,GAAG,IAAI,eAAe,EAAE,CAAC;QACjC,IAAI,CAAC,eAAe,GAAG,EAAE,CAAC;QAC1B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC;QAC/C,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAC5B,CAAC;IAED,8DAA8D;IAC9D,IAAI;QACF,IAAI,CAAC,eAAe,EAAE,KAAK,EAAE,CAAC;QAC9B,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAC5B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,IAAI,CAAC,OAAO,KAAK,IAAI,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YAC/D,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;QACrC,CAAC;QACD,mCAAmC;QACnC,IAAI,IAAI,CAAC,OAAO,KAAK,IAAI,IAAI,IAAI,CAAC,cAAc,KAAK,IAAI,IAAI,IAAI,CAAC,cAAc,KAAK,EAAE,EAAE,CAAC;YACxF,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QACxC,CAAC;QACD,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC3B,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC;QAC1B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;QAC5B,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;QACzB,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;QAC/B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;QACtB,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;QACpB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;QACxB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;IAC5B,CAAC;IAEO,KAAK,CAAC,GAAG,CAAC,OAAe,EAAE,IAAqB,EAAE,MAAmB;QAC3E,iDAAiD;QACjD,4CAA4C;QAC5C,IAAI,mBAAmB,GAAG,CAAC,CAAC;QAC5B,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACvB,IAAI,IAAI,GAAkB,IAAI,CAAC;YAC/B,IAAI,CAAC;gBACH,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;gBACnC,mBAAmB,GAAG,CAAC,CAAC;YAC1B,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,mBAAmB,IAAI,CAAC,CAAC;gBACzB,IAAI,mBAAmB,KAAK,CAAC,IAAI,mBAAmB,GAAG,GAAG,KAAK,CAAC,EAAE,CAAC;oBACjE,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,8CAA8C;wBAC5C,CAAC,mBAAmB,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,mBAAmB,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;wBAC/D,KAAK,MAAM,CAAC,KAAK,CAAC,IAAI,CACzB,CAAC;gBACJ,CAAC;YACH,CAAC;YAED,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,eAAe,IAAI,IAAI,CAAC,gBAAgB,KAAK,IAAI,EAAE,CAAC;gBAChF,+CAA+C;gBAC/C,MAAM,cAAc,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;gBACjD,IAAI,cAAc,KAAK,IAAI,IAAI,cAAc,KAAK,IAAI,CAAC,kBAAkB,EAAE,CAAC;oBAC1E,IAAI,CAAC,kBAAkB,GAAG,cAAc,CAAC;oBACzC,IAAI,CAAC,gBAAgB,CAAC,cAAc,CAAC,CAAC;gBACxC,CAAC;YACH,CAAC;YAED,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACvB,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAC5C,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;oBAC3B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;oBACrB,oCAAoC;oBACpC,oDAAoD;oBACpD,4BAA4B;oBAC5B,oDAAoD;oBACpD,MAAM,WAAW,GAAG,IAAI,CAAC,aAAa,KAAK,IAAI,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;oBAC5E,IAAI,CAAC,IAAI,KAAK,gBAAgB,IAAI,IAAI,CAAC,WAAW,IAAI,WAAW,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBAC7F,IAAI,CAAC,YAAY,GAAG,GAAG,CAAC;wBACxB,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;wBAC1B,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;oBAC7C,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;oBACrB,IAAI,CAAC,YAAY,GAAG,GAAG,CAAC;oBACxB,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;oBAC1B,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;gBAC7C,CAAC;YACH,CAAC;YAED,IACE,IAAI,CAAC,WAAW,KAAK,IAAI;gBACzB,GAAG,GAAG,IAAI,CAAC,UAAU,IAAI,eAAe,CAAC,iBAAiB,EAC1D,CAAC;gBACD,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;YACxD,CAAC;iBAAM,IACL,IAAI,KAAK,gBAAgB;gBACzB,IAAI,CAAC,MAAM;gBACX,CAAC,IAAI,CAAC,YAAY;gBAClB,IAAI,CAAC,UAAU;gBACf,IAAI,CAAC,YAAY,GAAG,CAAC;gBACrB,GAAG,GAAG,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,gBAAgB,EAChD,CAAC;gBACD,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;gBAC9B,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;gBACzB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;YACtB,CAAC;YAED,qDAAqD;YACrD,IACE,IAAI,KAAK,eAAe;gBACxB,IAAI,CAAC,iBAAiB,KAAK,IAAI;gBAC/B,GAAG,GAAG,IAAI,CAAC,gBAAgB,IAAI,IAAI,CAAC,oBAAoB,EACxD,CAAC;gBACD,IAAI,CAAC,gBAAgB,GAAG,GAAG,CAAC;gBAC5B,IAAI,CAAC;oBACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;oBACnD,MAAM,UAAU,GAAG,yBAAyB,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;oBACzD,oDAAoD;oBACpD,4CAA4C;oBAC5C,MAAM,kBAAkB,GAAG,IAAI,CAAC,cAAc,KAAK,IAAI,IAAI,UAAU,KAAK,EAAE,CAAC;oBAC7E,IAAI,UAAU,KAAK,IAAI,CAAC,cAAc,IAAI,CAAC,kBAAkB,EAAE,CAAC;wBAC9D,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;oBAC3C,CAAC;oBACD,IAAI,CAAC,cAAc,GAAG,UAAU,CAAC;gBACnC,CAAC;gBAAC,MAAM,CAAC;oBACP,2CAA2C;gBAC7C,CAAC;YACH,CAAC;YAED,MAAM,cAAc,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,MAAM,CAAC,CAAC;QACtD,CAAC;IACH,CAAC;IAEO,cAAc,CAAC,OAAe,EAAE,IAAY;QAClD,MAAM,CAAC,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QACjC,IAAI,CAAC,GAAG,WAAW;YAAE,OAAO;QAC5B,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IACpE,CAAC;IAEO,WAAW,CAAC,OAAe,EAAE,IAAY,EAAE,GAAW,EAAE,IAAqB;QACnF,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,GAAG,GAAG,IAAI,CAAC,UAAU,IAAI,eAAe,CAAC,iBAAiB,EAAE,CAAC;YACnF,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;YAC1C,OAAO;QACT,CAAC;QACD,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;IAC1B,CAAC;IAEO,UAAU,CAAC,OAAe,EAAE,IAAY,EAAE,GAAW,EAAE,IAAqB;QAClF,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,IAAI,CAAC,UAAU,GAAG,GAAG,CAAC;QACtB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;QAC1B,yCAAyC;QACzC,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC;QACrD,IAAI,WAAW,KAAK,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC3C,IAAI,CAAC,iBAAiB,GAAG,WAAW,CAAC;YACrC,IAAI,CAAC,GAAG,EAAE,CACR,6BAA6B,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,YAAY,OAAO,UAAU,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,CACrH,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IACvC,CAAC;IAEO,IAAI,CACV,OAAe,EACf,MAAe,EACf,IAAY,EACZ,IAAI,GAAoB,IAAI,CAAC,IAAI;QAEjC,MAAM,CAAC,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QACjC,IAAI,CAAC,GAAG,WAAW;YAAE,OAAO;QAC5B,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;QACd,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACvB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;YAChB,IAAI,EAAE,cAAc;YACpB,CAAC;YACD,OAAO;YACP,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,MAAM;YACN,IAAI;YACJ,GAAG,CAAC,IAAI,KAAK,gBAAgB,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC/C,CAAC,CAAC;IACL,CAAC;CACF"}
|
package/dist/hub/sessionHub.d.ts
CHANGED
|
@@ -2,11 +2,14 @@ import type { ReaperTickOptions, ReaperTickResult } from "./reaper.js";
|
|
|
2
2
|
import type { EngineRelayMessage } from "./engineRelaySocket.js";
|
|
3
3
|
import { type HubClientMessage, type HubServerMessage } from "./hubProtocol.js";
|
|
4
4
|
import type { ControlMessage, QuestionPromptQuestion, SubagentTranscriptEntry } from "../protocol.js";
|
|
5
|
+
import { type ClaudeTurnLifecycleEvent } from "../chat/transcriptTailer.js";
|
|
5
6
|
import type { ChatAgent } from "../chat/chatTailController.js";
|
|
7
|
+
import type { ImageService } from "../chat/imageService.js";
|
|
6
8
|
import type { PanePreviewMode } from "./panePreviewPump.js";
|
|
7
9
|
import type { QuestionAnswer } from "../protocol.js";
|
|
8
10
|
import { type CodexAppServerThreadRuntime, type CodexNativeTurnControllerOptions, type CodexTurnControllerRuntime } from "../codex/codexNativeTurnController.js";
|
|
9
11
|
import { type CodexTurnLifecycleEvent } from "../codex/codexRolloutTailer.js";
|
|
12
|
+
import type { SessionMeta } from "../sessions/sessionMetadataStore.js";
|
|
10
13
|
export interface HubTail {
|
|
11
14
|
open(cwd: string, preferredSessionId: string | null, newerThanMs?: number | null, agent?: ChatAgent): void;
|
|
12
15
|
stop(): void;
|
|
@@ -20,19 +23,41 @@ export interface HubPreviewPump {
|
|
|
20
23
|
emitInitial?: boolean;
|
|
21
24
|
}): void;
|
|
22
25
|
stop(): void;
|
|
26
|
+
/** 前面購読者の参加時に、直近の入力待ちフレームを再送する(任意実装)。 */
|
|
27
|
+
resendLastIfInteractive?(): void;
|
|
23
28
|
}
|
|
24
|
-
|
|
29
|
+
/**
|
|
30
|
+
* chat 注入(chatInjector)へ渡す会話文脈。backend の sendTextSubmit が入力欄の残存テキストの
|
|
31
|
+
* 身元判定(restored-prompt-discard)に使う。遅延評価なので残存が無ければ transcript は読まない。
|
|
32
|
+
*/
|
|
33
|
+
export interface ChatInjectContext {
|
|
34
|
+
/** transcript に記録済みの直近の発話本文(claude 会話のみ。不明は null)。 */
|
|
35
|
+
recordedPromptText: () => string | null;
|
|
36
|
+
}
|
|
37
|
+
export type HubTailFactory = (write: (payload: ControlMessage) => void, onCodexTurnLifecycle?: (event: CodexTurnLifecycleEvent) => void, onClaudeTurnLifecycle?: (event: ClaudeTurnLifecycleEvent) => void) => HubTail;
|
|
25
38
|
export type HubPreviewPumpFactory = (write: (payload: ControlMessage) => void, onPermissionMode?: (mode: string) => void,
|
|
26
39
|
/** 毎周期評価するポーリング間隔(ms)。前面購読あり=高頻度 / 一覧 watch のみ=低頻度。 */
|
|
27
40
|
pollIntervalMs?: () => number) => HubPreviewPump;
|
|
28
41
|
export type SessionHubOptions = Omit<ReaperTickOptions, "now"> & {
|
|
29
42
|
/** Unix 秒。テストでは固定時計を注入する。 */
|
|
30
43
|
now?: () => number;
|
|
44
|
+
/**
|
|
45
|
+
* Unix ms。処理開始時刻と transcript 行 timestamp の比較用(既定 Date.now)。`now`(秒)から
|
|
46
|
+
* 派生させると境界が最大 999ms 早まり、中断直後の再送信でマーカーが新ターンを落とす。
|
|
47
|
+
*/
|
|
48
|
+
nowMs?: () => number;
|
|
49
|
+
/**
|
|
50
|
+
* 復元時に照合する claude transcript の場所(テスト注入用)。既定は
|
|
51
|
+
* `~/.claude/projects/<slug>/<claudeSessionId>.jsonl`。null は照合しない。
|
|
52
|
+
*/
|
|
53
|
+
transcriptPathFor?: (meta: SessionMeta) => string | null;
|
|
31
54
|
tailFactory?: HubTailFactory;
|
|
55
|
+
/** Codex live/fallback 本文の添付サムネ。履歴 tail と同じ原本 index を共有する。 */
|
|
56
|
+
imageService?: ImageService;
|
|
32
57
|
previewPumpFactory?: HubPreviewPumpFactory;
|
|
33
58
|
replayLimit?: number;
|
|
34
59
|
questionInjector?: (answers: QuestionAnswer[], session: string) => Promise<void>;
|
|
35
|
-
chatInjector?: (text: string, session: string) => Promise<void>;
|
|
60
|
+
chatInjector?: (text: string, session: string, context: ChatInjectContext) => Promise<void>;
|
|
36
61
|
codexAppServerFactory?: () => CodexAppServerThreadRuntime;
|
|
37
62
|
codexTurnControllerFactory?: (options: CodexNativeTurnControllerOptions) => CodexTurnControllerRuntime;
|
|
38
63
|
/** 未回答設問の永続化先。省略時は永続化しない(daemon は既定パスを明示する)。 */
|
|
@@ -73,7 +98,15 @@ interface CodexBufferedItem {
|
|
|
73
98
|
payload: ControlMessage;
|
|
74
99
|
}
|
|
75
100
|
interface CodexLiveState {
|
|
76
|
-
phase: "
|
|
101
|
+
phase: "backfill" | "live" | "fallback-scan" | "fallback-live";
|
|
102
|
+
/**
|
|
103
|
+
* App Server 購読(thread/resume + 履歴スナップショット)が確定したか。rollout の backfill は
|
|
104
|
+
* 購読の完了を待たずに始めるため、`pc:history-done` と snapshot の到着順は不定。両方が揃った
|
|
105
|
+
* 時点で live へ切り替える(片方だけでは backfill のまま rollout を一次ソースにし続ける)。
|
|
106
|
+
*/
|
|
107
|
+
snapshotReady: boolean;
|
|
108
|
+
/** rollout backfill が `pc:history-done` まで到達したか(snapshot 待ちの間だけ意味を持つ)。 */
|
|
109
|
+
historyDone: boolean;
|
|
77
110
|
initialItemIds: ReadonlySet<string>;
|
|
78
111
|
initialContentCounts: ReadonlyMap<string, number>;
|
|
79
112
|
buffered: CodexBufferedItem[];
|
|
@@ -83,6 +116,18 @@ interface CodexLiveState {
|
|
|
83
116
|
scanContentCounts: Map<string, number>;
|
|
84
117
|
fallbackBaselineCounts: Map<string, number>;
|
|
85
118
|
disconnected: boolean;
|
|
119
|
+
/**
|
|
120
|
+
* この会話へ最後に配信した `pc:model` の値。App Server 通知(onModel)と rollout の
|
|
121
|
+
* turn_context は同じ「実際に使うモデル」を別経路で伝えるため、同値は 1 回に畳む。
|
|
122
|
+
*/
|
|
123
|
+
lastModel: string | null;
|
|
124
|
+
/** 購読時点の thread のモデル(thread/resume 応答)。初回 backfill 完了後に配信する。 */
|
|
125
|
+
subscribedModel: string | null;
|
|
126
|
+
/**
|
|
127
|
+
* fallback-scan(切断後の rollout 再走査)で最後に見た `pc:model`。再走査は履歴を頭から
|
|
128
|
+
* 読み直すため、途中の旧モデルを配信せず走査完了時に最新値だけを配る。
|
|
129
|
+
*/
|
|
130
|
+
scanLastModel: string | null;
|
|
86
131
|
}
|
|
87
132
|
interface SessionActor {
|
|
88
133
|
pendingQuestion: {
|
|
@@ -93,6 +138,31 @@ interface SessionActor {
|
|
|
93
138
|
restoredAfterInjectionFailure?: boolean;
|
|
94
139
|
} | null;
|
|
95
140
|
processingSince: number | null;
|
|
141
|
+
/**
|
|
142
|
+
* 現ターンの開始時刻(Unix ms)= UserPromptSubmit(または復元時刻)を hub が受けた時刻。
|
|
143
|
+
* Pre/PostToolUse の継続 active では進めない(マーカーより後に遅着した継続 hook で境界が
|
|
144
|
+
* マーカーを追い越すと、中断が棄却されて停止ボタンが残る)。
|
|
145
|
+
*/
|
|
146
|
+
processingSinceMs: number | null;
|
|
147
|
+
/** 中断マーカーで done にした時刻(Unix ms)。直後に遅着する継続 hook の active を残響として無視する。 */
|
|
148
|
+
lastInterruptDoneMs: number | null;
|
|
149
|
+
/**
|
|
150
|
+
* transcript で観測した最新のターン終端行(中断確定 / API エラー)の timestamp(Unix ms)。処理中で
|
|
151
|
+
* なくても更新する。発火時刻(`atMs`)付きの hook がこれより前(かつ LATE_HOOK_MAX_AGE_MS 以内)に
|
|
152
|
+
* 発火していれば、既に終わったターンの遅着 hook として無視する(late-hook-before-turn-end)。
|
|
153
|
+
*/
|
|
154
|
+
lastTurnEndMs: number | null;
|
|
155
|
+
/**
|
|
156
|
+
* 現ターンを開始した UserPromptSubmit hook の発火時刻(Unix ms。旧 hook は null)。これより前に
|
|
157
|
+
* 発火した Stop(前ターンの遅着 done)で現ターンを落とさない(late-stop-before-turn-start)。
|
|
158
|
+
*/
|
|
159
|
+
turnStartFiredAtMs: number | null;
|
|
160
|
+
/**
|
|
161
|
+
* transcript で観測した最新の発話行(type=user の本文行)の timestamp(Unix ms)。終端マーカーより
|
|
162
|
+
* 後に発話が現れていれば、終端より前に発火した UserPromptSubmit でも新ターン(queued 発話の
|
|
163
|
+
* dequeue)として採用する(transcript を権威にして生きたターンを idle に固定しない)。
|
|
164
|
+
*/
|
|
165
|
+
lastTurnStartMs: number | null;
|
|
96
166
|
focusedBy: Set<object>;
|
|
97
167
|
subscribers: Map<object, SubscriberState>;
|
|
98
168
|
nextServerSeq: number;
|
|
@@ -137,6 +207,7 @@ export declare class SessionHub {
|
|
|
137
207
|
private readonly previewWatchers;
|
|
138
208
|
readonly actors: Map<string, SessionActor>;
|
|
139
209
|
private readonly now;
|
|
210
|
+
private readonly nowMs;
|
|
140
211
|
private readonly replayLimit;
|
|
141
212
|
private injectionsInFlight;
|
|
142
213
|
private codexStartsInFlight;
|
|
@@ -153,6 +224,17 @@ export declare class SessionHub {
|
|
|
153
224
|
get processingSessionNames(): string[];
|
|
154
225
|
/** Hub 再起動前から active の heartbeat を actor の処理中状態へ戻す。 */
|
|
155
226
|
restoreFromHeartbeats(): void;
|
|
227
|
+
/**
|
|
228
|
+
* 復元時の照合用: transcript 末尾のターン終端マーカー(中断確定 / API エラー終端)の timestamp
|
|
229
|
+
* (claude 会話のみ。不明は null)。
|
|
230
|
+
*/
|
|
231
|
+
private trailingInterruptMarkerMs;
|
|
232
|
+
/**
|
|
233
|
+
* chat 注入前の残存テキスト照合用: transcript 末尾に記録済みの直近の発話本文(claude 会話のみ。
|
|
234
|
+
* 不明は null)。中断で入力欄へ書き戻された配送済み発話を Enter で送り直さないための材料
|
|
235
|
+
* (restored-prompt-discard。詳細は `findTrailingUserPromptText`)。
|
|
236
|
+
*/
|
|
237
|
+
private trailingUserPromptText;
|
|
156
238
|
/** 永続化済み設問を復元する。App Server の request handle は再起動を越せないため TUI のみ対象。 */
|
|
157
239
|
restorePendingQuestions(): void;
|
|
158
240
|
/** daemon 再起動前に durable enqueue 済みだった chat_send と receipt を復元する。 */
|
|
@@ -171,11 +253,20 @@ export declare class SessionHub {
|
|
|
171
253
|
private unsubscribe;
|
|
172
254
|
private startSharedTail;
|
|
173
255
|
private startCodexSharedStream;
|
|
256
|
+
/**
|
|
257
|
+
* 購読が成立しない(未materialize・履歴読み取り失敗・購読エラー)と分かった時点で、既に開いて
|
|
258
|
+
* いる rollout tail をそのまま一次ソースに降格する。tail を開き直すと履歴を頭から二重再生する
|
|
259
|
+
* ため再利用する(接続断と同じ扱い: history-done で fallback-live へ、到達済みなら即座に)。
|
|
260
|
+
*/
|
|
261
|
+
private degradeCodexToFallback;
|
|
262
|
+
/** backfill 完了(history-done)と購読の確定(snapshot または fallback)が揃った時点の切り替え。 */
|
|
263
|
+
private finishCodexBackfill;
|
|
174
264
|
private openCodexRollout;
|
|
175
265
|
private handleCodexChatItem;
|
|
176
266
|
private flushCodexBuffer;
|
|
177
267
|
private handleCodexDisconnect;
|
|
178
|
-
|
|
268
|
+
/** live 移行後の接続断: rollout を頭から再走査し、配信済み本文を occurrence 照合で除外して継続する。 */
|
|
269
|
+
private startCodexFallbackRescan;
|
|
179
270
|
private publishCodexContent;
|
|
180
271
|
private publishConversationEvent;
|
|
181
272
|
private startBackfill;
|
|
@@ -192,6 +283,36 @@ export declare class SessionHub {
|
|
|
192
283
|
private drainCodexQueue;
|
|
193
284
|
private startCodexTurn;
|
|
194
285
|
private publishCodexMarker;
|
|
286
|
+
/**
|
|
287
|
+
* 利用中モデルの marker を、直前に配信した値と異なるときだけ配信する。App Server 通知
|
|
288
|
+
* (thread/settings/updated / model/rerouted)・rollout の turn_context・購読時の
|
|
289
|
+
* thread モデルは同じ値を別経路で運ぶため、ここで 1 本に畳む。
|
|
290
|
+
*/
|
|
291
|
+
private publishCodexModelMarker;
|
|
292
|
+
/**
|
|
293
|
+
* transcript の中断確定マーカーで処理完了を補完する。Claude Code の Stop hook は利用者の中断
|
|
294
|
+
* (Esc / Ctrl-C)では発火しないため、hook だけでは処理中状態がターン終了後も残り、iOS は
|
|
295
|
+
* 会話を開き直す・再接続するたびに停止ボタン/処理中表示を張り直してしまう(実機 09-02)。
|
|
296
|
+
* 共有 tail は購読の張り直しで履歴から再生されるため、マーカーの timestamp が現ターンの
|
|
297
|
+
* 処理開始時刻以降のものだけを採用する(過去ターンのマーカーで進行中ターンを落とさない)。
|
|
298
|
+
*
|
|
299
|
+
* 時刻の比較根拠: `processingSinceMs` は UserPromptSubmit hook を hub が受信した時刻(ターン
|
|
300
|
+
* 開始。継続 hook では進めない)。中断→即再送信(実測 10〜200ms 後)でも、新ターンの hook
|
|
301
|
+
* 受信は必ずマーカー書込より後(同一マシンの時計・因果順)なので、マーカーは新ターンの開始
|
|
302
|
+
* より古く見えて棄却される。tail がマーカーを hook より先に届けた場合は前ターンを done に
|
|
303
|
+
* し、直後の UserPromptSubmit で active に戻る。中断直後に遅着する Pre/PostToolUse の active
|
|
304
|
+
* は `applyProcessing` が残響として無視する。
|
|
305
|
+
*
|
|
306
|
+
* 副作用は hook の Stop と同じ `applyProcessing("done")` 一式(heartbeat idle。設問提示中なら
|
|
307
|
+
* その dismiss と chat queue の drain)。中断はターン終了なので Stop 後と同じ振る舞い。
|
|
308
|
+
*/
|
|
309
|
+
private handleClaudeTurnLifecycle;
|
|
310
|
+
/** 遅着 hook が直書きした active の heartbeat を idle へ戻す(その hook の書込のままのときだけ)。 */
|
|
311
|
+
private revertLateHookHeartbeat;
|
|
312
|
+
/**
|
|
313
|
+
* 処理中状態を反映する。戻り値 false は「中断済みターンの残響として無視した」(呼び手は
|
|
314
|
+
* broadcast しない)。`event` は hook 名(relay 由来。codex controller / 旧 hook は undefined)。
|
|
315
|
+
*/
|
|
195
316
|
private applyProcessing;
|
|
196
317
|
private bumpSafe;
|
|
197
318
|
private setPendingQuestion;
|