@cocorograph/hub-agent 0.8.87 → 0.8.88
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/main.mjs +18 -3
package/package.json
CHANGED
package/src/main.mjs
CHANGED
|
@@ -1572,7 +1572,10 @@ async function startSessionEventWatcher({ client, logger, readinessTracker }) {
|
|
|
1572
1572
|
const data = JSON.parse(text)
|
|
1573
1573
|
if (!data || typeof data.event !== "string") return
|
|
1574
1574
|
const at = typeof data.at === "number" ? data.at : Date.now()
|
|
1575
|
-
|
|
1575
|
+
// チャットの行は state loop が返答付きの stop を送る。ここでも送ると Hub が完了通知を
|
|
1576
|
+
// 2 通 (定型文だけ + 返答付き) 出すため、送信だけ省く (並び順・readiness は取り込む)。
|
|
1577
|
+
const send = !(data.event === "stop" && chatStopNotifyingSessionNames.has(sessionName))
|
|
1578
|
+
await publishSessionEvent({ client, readinessTracker, logger }, sessionName, data.event, at, { send })
|
|
1576
1579
|
} catch {
|
|
1577
1580
|
// 一時欠如 / parse 失敗等は無視 (次の変更で読み直す)
|
|
1578
1581
|
}
|
|
@@ -1613,13 +1616,20 @@ async function startSessionEventWatcher({ client, logger, readinessTracker }) {
|
|
|
1613
1616
|
}
|
|
1614
1617
|
}
|
|
1615
1618
|
|
|
1619
|
+
/**
|
|
1620
|
+
* state loop が直近の tick で観測したチャット行の session 名。これらの行の stop は
|
|
1621
|
+
* state loop が返答付きで送るので、bundle hook 由来の stop は WS へ送らない。
|
|
1622
|
+
* 行を観測する前 (起動直後の最初の tick まで) は空なので、hook の stop がそのまま送られる。
|
|
1623
|
+
*/
|
|
1624
|
+
export const chatStopNotifyingSessionNames = new Set()
|
|
1625
|
+
|
|
1616
1626
|
/** session-event をプロセス内で取り込み、並び順を更新して WS push する。 */
|
|
1617
1627
|
export async function publishSessionEvent(
|
|
1618
1628
|
{ client, readinessTracker, logger },
|
|
1619
1629
|
sessionName,
|
|
1620
1630
|
event,
|
|
1621
1631
|
at,
|
|
1622
|
-
{ fresh = false, arm = !fresh, text = "" } = {},
|
|
1632
|
+
{ fresh = false, arm = !fresh, text = "", send = true } = {},
|
|
1623
1633
|
) {
|
|
1624
1634
|
// readiness (proc 内省の ready 判定) を動かすのはファイル監視経路だけ。直接 publish (fresh) は
|
|
1625
1635
|
// 「人間が送った」事実を並び順へ流すだけで、ターンの開始を意味しない (bridge が拒否すれば
|
|
@@ -1651,7 +1661,7 @@ export async function publishSessionEvent(
|
|
|
1651
1661
|
}
|
|
1652
1662
|
// 通知本文に添える最後の返答。空なら項目ごと送らない (Hub は固定文だけにする)。
|
|
1653
1663
|
if (typeof text === "string" && text) message.text = text
|
|
1654
|
-
client.send(message)
|
|
1664
|
+
if (send) client.send(message)
|
|
1655
1665
|
return { sortAffecting }
|
|
1656
1666
|
}
|
|
1657
1667
|
|
|
@@ -2031,6 +2041,7 @@ export function startStateLoop({ client, logger, intervalMs, claudeBridge, codex
|
|
|
2031
2041
|
// 直列実行する (tmux.mjs)。無関係な worktree の Git 処理待ちで全会話の通知観測が止まる。
|
|
2032
2042
|
// 現在の target 名は workspace / worktree とも sanitizeTmuxName(basename(cwd)) と同値
|
|
2033
2043
|
// なので、cwd から直接導出する。この同値は test/chat-targets-naming.test.mjs で固定する。
|
|
2044
|
+
const observedChatNames = new Set()
|
|
2034
2045
|
for (const kind of ["claude", "codex"]) {
|
|
2035
2046
|
for (const cwd of representativeRows(kind)) {
|
|
2036
2047
|
// 観測キーは行名でなく cwd+kind。同名 worktree は 1 行へ畳まれるため、
|
|
@@ -2042,6 +2053,7 @@ export function startStateLoop({ client, logger, intervalMs, claudeBridge, codex
|
|
|
2042
2053
|
previousChatEvents.delete(key)
|
|
2043
2054
|
continue
|
|
2044
2055
|
}
|
|
2056
|
+
observedChatNames.add(sessionName)
|
|
2045
2057
|
const directAt = getPromptAcceptedAt(cwd, kind)
|
|
2046
2058
|
const previous = previousChatEvents.get(key)
|
|
2047
2059
|
// 起動時の過去状態は通知せず、次の変化を比較する基準だけを保存する。
|
|
@@ -2084,6 +2096,9 @@ export function startStateLoop({ client, logger, intervalMs, claudeBridge, codex
|
|
|
2084
2096
|
.catch(err => logger?.warn({ err: err?.message }, "chat session.event publish failed"))
|
|
2085
2097
|
}
|
|
2086
2098
|
}
|
|
2099
|
+
// 走査を完走した tick の観測だけで置き換える (途中で例外なら前回の集合を保つ)。
|
|
2100
|
+
chatStopNotifyingSessionNames.clear()
|
|
2101
|
+
for (const name of observedChatNames) chatStopNotifyingSessionNames.add(name)
|
|
2087
2102
|
} catch (err) {
|
|
2088
2103
|
logger?.warn({ err: err?.message }, "chat session.event tick failed")
|
|
2089
2104
|
}
|