@cocorograph/hub-agent 0.6.22 → 0.6.24
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 +36 -5
- package/src/usage.mjs +1 -1
package/package.json
CHANGED
package/src/main.mjs
CHANGED
|
@@ -37,7 +37,12 @@ import {
|
|
|
37
37
|
listWorktreeStubs,
|
|
38
38
|
removeWorktree as removeWorktreeDir,
|
|
39
39
|
} from "./tmux.mjs"
|
|
40
|
-
import {
|
|
40
|
+
import {
|
|
41
|
+
contextWindowSize,
|
|
42
|
+
getSessionUsages,
|
|
43
|
+
getUsage,
|
|
44
|
+
recordChatRateLimit,
|
|
45
|
+
} from "./usage.mjs"
|
|
41
46
|
import { getChatSignal, recordChatActivity } from "./chat-signals.mjs"
|
|
42
47
|
|
|
43
48
|
const logger = pino({ name: "hub-agent" })
|
|
@@ -319,15 +324,38 @@ export async function startDaemon({ version, ptyModule, claudeSdk } = {}) {
|
|
|
319
324
|
const SESSION_EVENTS_DIR =
|
|
320
325
|
process.env.COCKPIT_SESSION_EVENTS_DIR || "/tmp/cockpit_session_events"
|
|
321
326
|
|
|
322
|
-
// context 窓サイズ (トークン)
|
|
323
|
-
|
|
327
|
+
// context 窓サイズ (トークン) の既定。env HUB_CONTEXT_WINDOW があれば最優先 (手動上書き)。
|
|
328
|
+
// 無ければ起動後に statusLine cache の context_window_size (Opus 4.8 の 1M 等) を
|
|
329
|
+
// refreshContextWindow() で解決して resolvedContextWindow を上書きする。
|
|
330
|
+
const CONTEXT_WINDOW_FALLBACK = Number(process.env.HUB_CONTEXT_WINDOW) || 200000
|
|
331
|
+
|
|
332
|
+
// 実際に context% 計算で使う窓サイズ。startStateLoop の tick で定期リフレッシュされる。
|
|
333
|
+
// 200k 固定だと 1M ベータのセッションで分母が 5 倍小さく、ドーナツが常に振り切れる
|
|
334
|
+
// (273k トークン → 137% を 100% にクランプ表示) 不具合があったため、実窓サイズを使う。
|
|
335
|
+
let resolvedContextWindow = CONTEXT_WINDOW_FALLBACK
|
|
336
|
+
|
|
337
|
+
/**
|
|
338
|
+
* 実コンテキスト窓サイズ (1M ベータ等) を statusLine cache から解決して
|
|
339
|
+
* resolvedContextWindow を更新する。env HUB_CONTEXT_WINDOW 指定時は手動上書きを
|
|
340
|
+
* 尊重して何もしない。ファイル読み失敗時は前回値を保持する。
|
|
341
|
+
*/
|
|
342
|
+
export async function refreshContextWindow() {
|
|
343
|
+
if (process.env.HUB_CONTEXT_WINDOW) return // 手動上書きが最優先
|
|
344
|
+
try {
|
|
345
|
+
const size = await contextWindowSize()
|
|
346
|
+
if (typeof size === "number" && size > 0) resolvedContextWindow = size
|
|
347
|
+
} catch {
|
|
348
|
+
/* 前回値を保持 */
|
|
349
|
+
}
|
|
350
|
+
}
|
|
324
351
|
|
|
325
352
|
/**
|
|
326
353
|
* SDK assistant メッセージの usage から context 使用率 (%) を概算する。
|
|
327
354
|
* context = input + cache_read + cache_creation + output(直近応答)。
|
|
328
355
|
* プロンプトキャッシュ有効時は cache_* に大半が乗るため 4 種を合算する。
|
|
356
|
+
* 分母は resolvedContextWindow (実窓サイズ。1M ベータ等を自動反映)。
|
|
329
357
|
*/
|
|
330
|
-
function contextPctFromUsage(u) {
|
|
358
|
+
export function contextPctFromUsage(u) {
|
|
331
359
|
if (!u) return null
|
|
332
360
|
const tokens =
|
|
333
361
|
(u.input_tokens || 0) +
|
|
@@ -335,7 +363,7 @@ function contextPctFromUsage(u) {
|
|
|
335
363
|
(u.cache_creation_input_tokens || 0) +
|
|
336
364
|
(u.output_tokens || 0)
|
|
337
365
|
if (tokens <= 0) return null
|
|
338
|
-
return Math.min(100, Math.round((tokens /
|
|
366
|
+
return Math.min(100, Math.round((tokens / resolvedContextWindow) * 1000) / 10)
|
|
339
367
|
}
|
|
340
368
|
|
|
341
369
|
/**
|
|
@@ -483,6 +511,9 @@ function startStateLoop({ client, plugins, logger, intervalMs }) {
|
|
|
483
511
|
const tick = async () => {
|
|
484
512
|
if (stopped) return
|
|
485
513
|
try {
|
|
514
|
+
// 実コンテキスト窓サイズ (1M ベータ等) を反映。contextPctFromUsage の分母を
|
|
515
|
+
// 5s ごとに最新化し、ドーナツが 200k 固定で振り切れるのを防ぐ。
|
|
516
|
+
await refreshContextWindow()
|
|
486
517
|
const states = await listSessionStates({ plugins, logger })
|
|
487
518
|
for (const s of states) {
|
|
488
519
|
let status = s.status
|
package/src/usage.mjs
CHANGED
|
@@ -360,7 +360,7 @@ async function statuslineCacheMtime() {
|
|
|
360
360
|
* あればそれを使う (1M ベータ等を自動反映)。無ければ HUB_CONTEXT_WINDOW / 200000。
|
|
361
361
|
* ※ cache が stale でも窓サイズ自体は不変なので利用できる。
|
|
362
362
|
*/
|
|
363
|
-
async function contextWindowSize() {
|
|
363
|
+
export async function contextWindowSize() {
|
|
364
364
|
const text = await readOrNull(statuslineCache())
|
|
365
365
|
if (text) {
|
|
366
366
|
try {
|