@cocorograph/hub-agent 0.8.6 → 0.8.7
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 +30 -3
package/package.json
CHANGED
package/src/main.mjs
CHANGED
|
@@ -1786,12 +1786,21 @@ function isSafeSessionIdForPath(id) {
|
|
|
1786
1786
|
*
|
|
1787
1787
|
* @param {Array} sessions listTmuxSessions の素の行 (name / cwd を使う)
|
|
1788
1788
|
* @param {((name: string) => object | null) | undefined} getSnap state loop の getSnapshot
|
|
1789
|
+
* @param {object} [options] I/O と session ID 解決の注入点
|
|
1790
|
+
* @param {((session: object) => string | null) | undefined} [options.resolveFallbackSessionId]
|
|
1791
|
+
* snapshot の context_session_id が再起動後の `unbound:*` のとき、TUI bind / live
|
|
1792
|
+
* Claude bridge から同じ cwd の会話 ID を復元する。戻り値にも containment 検査を行う。
|
|
1789
1793
|
* @returns {Promise<Map<string, {user: string, assistant: string}>>}
|
|
1790
1794
|
*/
|
|
1791
1795
|
export async function readAllSessionLastTexts(
|
|
1792
1796
|
sessions,
|
|
1793
1797
|
getSnap,
|
|
1794
|
-
{
|
|
1798
|
+
{
|
|
1799
|
+
extract = extractLastTurnTexts,
|
|
1800
|
+
statFn = stat,
|
|
1801
|
+
resolvePath = jsonlPath,
|
|
1802
|
+
resolveFallbackSessionId,
|
|
1803
|
+
} = {},
|
|
1795
1804
|
) {
|
|
1796
1805
|
const out = new Map()
|
|
1797
1806
|
if (!getSnap) return out
|
|
@@ -1801,7 +1810,17 @@ export async function readAllSessionLastTexts(
|
|
|
1801
1810
|
try {
|
|
1802
1811
|
const snap = getSnap(s.name)
|
|
1803
1812
|
if (!snap || snap.cli_kind !== "claude") return
|
|
1804
|
-
|
|
1813
|
+
let sessionId = snap.context_session_id
|
|
1814
|
+
// hub-agent 再起動で in-memory の TUI bind が消えると、state loop の snapshot は
|
|
1815
|
+
// `unbound:<session>` へ落ちる。一方、Claude bridge の warm/live session は cwd
|
|
1816
|
+
// から同じ会話 ID を復元できる。ここでフォールバックしないと、再起動後に全行の
|
|
1817
|
+
// 「最後の依頼 / 応答」だけが消え、次に chat signal が fresh になるまで戻らない。
|
|
1818
|
+
//
|
|
1819
|
+
// snapshot が安全な実 ID を持つ場合は必ずそちらを優先し、fallback は placeholder /
|
|
1820
|
+
// 危険値の場合だけ使う。fallback も同じ containment 検査を通してから path 化する。
|
|
1821
|
+
if (!isSafeSessionIdForPath(sessionId) && resolveFallbackSessionId) {
|
|
1822
|
+
sessionId = resolveFallbackSessionId(s)
|
|
1823
|
+
}
|
|
1805
1824
|
// パス要素として安全な形だけを通す (外部由来の値なので containment を局所保証)。
|
|
1806
1825
|
if (!isSafeSessionIdForPath(sessionId)) return
|
|
1807
1826
|
if (!s.cwd) return
|
|
@@ -4739,7 +4758,15 @@ async function dispatch(msg, ctx) {
|
|
|
4739
4758
|
})
|
|
4740
4759
|
const [lastEventByName, lastTextsByName] = await Promise.all([
|
|
4741
4760
|
readAllSessionEvents(),
|
|
4742
|
-
readAllSessionLastTexts(sessions, ctx.getSessionStateSnapshot
|
|
4761
|
+
readAllSessionLastTexts(sessions, ctx.getSessionStateSnapshot, {
|
|
4762
|
+
resolveFallbackSessionId: (session) =>
|
|
4763
|
+
resolveStateLoopBoundSessionId(
|
|
4764
|
+
ctx.tuiReboundSessions,
|
|
4765
|
+
session.name,
|
|
4766
|
+
session.cwd,
|
|
4767
|
+
ctx.claudeBridge,
|
|
4768
|
+
),
|
|
4769
|
+
}),
|
|
4743
4770
|
])
|
|
4744
4771
|
const enriched = enrichTmuxSessionsForListResponse(
|
|
4745
4772
|
sessions,
|