@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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cocorograph/hub-agent",
3
- "version": "0.6.22",
3
+ "version": "0.6.24",
4
4
  "description": "Hub Hosted Cockpit のローカル常駐 agent。Hub と outbound WSS で接続し、ローカルの tmux/pty を中継する。",
5
5
  "type": "module",
6
6
  "license": "UNLICENSED",
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 { getSessionUsages, getUsage, recordChatRateLimit } from "./usage.mjs"
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 窓サイズ (トークン)。usage.mjs と同じ既定。1M ベータ等は env で上書き。
323
- const CONTEXT_WINDOW_TOKENS = Number(process.env.HUB_CONTEXT_WINDOW) || 200000
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 / CONTEXT_WINDOW_TOKENS) * 1000) / 10)
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 {