@cocorograph/hub-agent 0.7.28 → 0.7.29
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/package.json +1 -1
- package/src/claude-stream-bridge.mjs +34 -5
- package/src/main.mjs +13 -4
package/package.json
CHANGED
|
@@ -568,18 +568,27 @@ class ClaudeStreamSession {
|
|
|
568
568
|
}
|
|
569
569
|
}
|
|
570
570
|
|
|
571
|
-
/** モデルが Opus 4.6+
|
|
571
|
+
/** モデルが effort / adaptive thinking 対応 (Opus 4.6+ / Fable 5) かどうか。
|
|
572
572
|
* budget 方式 (maxThinkingTokens) は Opus 4.7+ で廃止扱いのため、effort モデルでは
|
|
573
|
-
* effort + thinking:{type:'adaptive'} に切り替える。
|
|
573
|
+
* effort + thinking:{type:'adaptive'} に切り替える。
|
|
574
|
+
* ⚠️ frontend の isEffortModelByPattern (types/cockpit.ts) と同一パターンを維持する
|
|
575
|
+
* こと。旧実装は fable-5 を含まず、frontend が effort を送っても bridge が非 effort
|
|
576
|
+
* 分岐に入り「effort も budget も未適用」になる不整合があった (2026-07-02 修正)。 */
|
|
574
577
|
_isEffortModel() {
|
|
575
|
-
return
|
|
578
|
+
return (
|
|
579
|
+
typeof this.model === "string" && /claude-fable-5|claude-opus-4-[678]/.test(this.model)
|
|
580
|
+
)
|
|
576
581
|
}
|
|
577
582
|
|
|
578
583
|
/** 思考関連オプション (effort / adaptive thinking / 旧 budget) を options へ適用する。
|
|
579
584
|
* per-message / 常駐 query の両方から呼ぶ共通ロジック (分岐の二重定義を避ける)。 */
|
|
580
585
|
_applyThinkingOptions(options) {
|
|
581
|
-
|
|
582
|
-
|
|
586
|
+
// model 未指定 (= browser が agent/アカウント既定モデルへ委任) でも、browser が
|
|
587
|
+
// effort を明示送信してきた場合は effort 分岐に入れる。frontend は system/init の
|
|
588
|
+
// 実効モデル (runtimeModel) で capability 判定してから effort を送るため、ここでは
|
|
589
|
+
// その判断を信頼する (2026-07-02)。
|
|
590
|
+
if (this._isEffortModel() || (!this.model && this.effort)) {
|
|
591
|
+
// effort モデル: adaptive thinking を明示 ON にし、effort で深さを指定する。
|
|
583
592
|
// budget 方式 (maxThinkingTokens) は使わない (Opus 4.7+ で非対応)。
|
|
584
593
|
options.thinking = { type: "adaptive" }
|
|
585
594
|
if (this.effort) options.effort = this.effort
|
|
@@ -803,6 +812,26 @@ class ClaudeStreamSession {
|
|
|
803
812
|
} catch {
|
|
804
813
|
/* ignore */
|
|
805
814
|
}
|
|
815
|
+
// 停止即時化 (2026-07-02): onTurnSettled はチャット信号 (サイドバードット) 専用で、
|
|
816
|
+
// browser の SDK ストリーム UI (turnActive / interrupting) を解除するイベントでは
|
|
817
|
+
// ない。abort でターンが終わると result が届かず、UI は 120s 無音ウォッチドッグ
|
|
818
|
+
// まで「停止中…」のまま固着する。合成 result を通常のイベント経路 (claude.event)
|
|
819
|
+
// へ流し、reducer にターン終了を即時確定させる。subtype はユーザー中断 (abort) と
|
|
820
|
+
// 異常終了 (result 無しの自然終了) を区別する (frontend は前者を「中断しました」
|
|
821
|
+
// フッターで表示する)。uuid を持たせるのは重複排除 (isDuplicateEvent) が result
|
|
822
|
+
// 署名 (session_id + num_turns + duration_ms + cost) で判定するため — 合成 result
|
|
823
|
+
// はこれらが毎回同値になり、2 回目以降の中断で「重複」と誤判定され捨てられるのを防ぐ。
|
|
824
|
+
try {
|
|
825
|
+
this._emit({
|
|
826
|
+
type: "result",
|
|
827
|
+
subtype: aborted ? "aborted_by_user" : "turn_settled",
|
|
828
|
+
uuid: randomUUID(),
|
|
829
|
+
session_id: this.sessionId ?? undefined,
|
|
830
|
+
timestamp: new Date().toISOString(),
|
|
831
|
+
})
|
|
832
|
+
} catch {
|
|
833
|
+
/* ignore */
|
|
834
|
+
}
|
|
806
835
|
}
|
|
807
836
|
// graceful detach: browser が切れている間にターンが完走したら、ここで遅延
|
|
808
837
|
// クローズする。manager 側で sessions Map から撤去 + exit を emit する。
|
package/src/main.mjs
CHANGED
|
@@ -271,12 +271,21 @@ async function loadClaudeSdk(logger) {
|
|
|
271
271
|
|
|
272
272
|
/**
|
|
273
273
|
* B7: 直列 dispatchChain をバイパスして即時処理してよい高頻度・低レイテンシ経路かを判定する。
|
|
274
|
-
* pty 出力データ (pty.data) と resize (pty.resize)
|
|
275
|
-
*
|
|
276
|
-
*
|
|
274
|
+
* - pty 出力データ (pty.data) と resize (pty.resize): 高頻度・順序保証不要。
|
|
275
|
+
* - claude.interrupt / codex.interrupt (2026-07-02): 停止指示。前段に重い dispatch
|
|
276
|
+
* (tmux.exec 等) が滞留していると停止が遅延するため直列キューをバイパスする。
|
|
277
|
+
* 中断は「現ターンを止める」冪等な制御で、入力系のような順序依存が無い (むしろ
|
|
278
|
+
* キュー内の後続入力より先に届くべき)。
|
|
279
|
+
* 入力系 (claude.input)・他の制御系 (tmux.exec / permission / cancel→paste 等) は
|
|
280
|
+
* WS 受信順 = pane 反映順を守るため false (= 直列キューに残す)。
|
|
277
281
|
*/
|
|
278
282
|
export function isFastPathMessage(type) {
|
|
279
|
-
return
|
|
283
|
+
return (
|
|
284
|
+
type === "pty.data" ||
|
|
285
|
+
type === "pty.resize" ||
|
|
286
|
+
type === "claude.interrupt" ||
|
|
287
|
+
type === "codex.interrupt"
|
|
288
|
+
)
|
|
280
289
|
}
|
|
281
290
|
|
|
282
291
|
/**
|