@triflux/core 10.50.1 → 10.51.0

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.
Files changed (90) hide show
  1. package/hooks/agy-session-hook.mjs +11 -56
  2. package/hooks/codex-session-hook.mjs +11 -101
  3. package/hub/bridge.mjs +1 -79
  4. package/hub/cli-adapter-base.mjs +12 -90
  5. package/hub/codex-adapter.mjs +0 -1
  6. package/hub/codex-preflight.mjs +5 -28
  7. package/hub/index.mjs +3 -9
  8. package/hub/lib/cto-env.mjs +0 -23
  9. package/hub/lib/known-errors.json +2 -2
  10. package/hub/lib/process-utils.mjs +0 -123
  11. package/hub/lib/spawn-trace.mjs +3 -2
  12. package/hub/lib/timeout-defaults.mjs +0 -1
  13. package/hub/paths.mjs +0 -6
  14. package/hub/pipeline/index.mjs +0 -190
  15. package/hub/pipeline/transitions.mjs +0 -10
  16. package/hub/reflexion.mjs +1 -84
  17. package/hub/role-contract.mjs +0 -2
  18. package/hud/cli-policy.mjs +0 -26
  19. package/hud/colors.mjs +0 -13
  20. package/hud/constants.mjs +7 -153
  21. package/hud/context-monitor.mjs +3 -64
  22. package/hud/hud-qos-status.mjs +54 -264
  23. package/hud/providers/claude.mjs +4 -16
  24. package/hud/providers/gemini.mjs +83 -689
  25. package/hud/renderers.mjs +59 -367
  26. package/hud/terminal.mjs +1 -63
  27. package/hud/utils.mjs +2 -26
  28. package/package.json +1 -4
  29. package/scripts/lib/agent-route-policy.mjs +162 -14
  30. package/scripts/lib/claudemd-scanner.mjs +2 -199
  31. package/scripts/lib/cli-claude.mjs +0 -2
  32. package/scripts/lib/context.mjs +3 -19
  33. package/scripts/lib/env-probe.mjs +5 -64
  34. package/scripts/lib/gemini-profiles.mjs +2 -69
  35. package/scripts/lib/legacy-mcp-cleanup.mjs +14 -3
  36. package/scripts/lib/machine-profile.mjs +3 -17
  37. package/scripts/lib/mcp-filter.mjs +109 -53
  38. package/scripts/lib/mcp-health.mjs +2 -2
  39. package/scripts/lib/mcp-server-catalog.mjs +2 -2
  40. package/scripts/lib/psmux-info.mjs +25 -104
  41. package/scripts/lib/session-presence.mjs +1 -1
  42. package/scripts/lib/skill-template.mjs +0 -271
  43. package/hub/codex-compat.mjs +0 -12
  44. package/hub/dynamic-routing-engine.mjs +0 -511
  45. package/hub/fullcycle.mjs +0 -113
  46. package/hub/gemini-adapter.mjs +0 -174
  47. package/hub/intent.mjs +0 -321
  48. package/hub/lib/mcp-response-cache.mjs +0 -239
  49. package/hub/lib/path-utils.mjs +0 -165
  50. package/hub/lib/risk-tier.mjs +0 -53
  51. package/hub/lib/ssh-command.mjs +0 -231
  52. package/hub/lib/staged-file-detect.mjs +0 -43
  53. package/hub/lib/tfx-route-args.mjs +0 -353
  54. package/hub/lib/timeline-adapter.mjs +0 -190
  55. package/hub/pipeline/gates/confidence.mjs +0 -75
  56. package/hub/pipeline/gates/consensus.mjs +0 -106
  57. package/hub/pipeline/gates/index.mjs +0 -9
  58. package/hub/pipeline/gates/selfcheck.mjs +0 -120
  59. package/hub/quality/deslop.mjs +0 -274
  60. package/hub/research.mjs +0 -155
  61. package/hub/role-control-events.mjs +0 -113
  62. package/hub/routing/complexity.mjs +0 -269
  63. package/hub/routing/index.mjs +0 -122
  64. package/hub/routing/q-learning.mjs +0 -387
  65. package/hub/routing-snapshot.mjs +0 -261
  66. package/hub/token-mode.mjs +0 -228
  67. package/hud/mission-board.mjs +0 -56
  68. package/hud/providers/cto.mjs +0 -76
  69. package/mesh/index.mjs +0 -69
  70. package/mesh/mesh-budget.mjs +0 -137
  71. package/mesh/mesh-heartbeat.mjs +0 -100
  72. package/mesh/mesh-protocol.mjs +0 -96
  73. package/mesh/mesh-queue.mjs +0 -163
  74. package/mesh/mesh-registry.mjs +0 -78
  75. package/mesh/mesh-router.mjs +0 -77
  76. package/scripts/lib/agent-json.mjs +0 -27
  77. package/scripts/lib/async.mjs +0 -174
  78. package/scripts/lib/cli-agy.mjs +0 -85
  79. package/scripts/lib/cli-codex.mjs +0 -62
  80. package/scripts/lib/cli-gemini.mjs +0 -37
  81. package/scripts/lib/dynamic-route-cli.mjs +0 -107
  82. package/scripts/lib/env.mjs +0 -14
  83. package/scripts/lib/hub.mjs +0 -48
  84. package/scripts/lib/pid.mjs +0 -63
  85. package/scripts/lib/quota.mjs +0 -47
  86. package/scripts/lib/skill-state.mjs +0 -220
  87. package/scripts/lib/team.mjs +0 -75
  88. package/scripts/lib/timeout.mjs +0 -66
  89. package/scripts/lib/tmp.mjs +0 -26
  90. package/scripts/lib/toml.mjs +0 -132
package/hud/constants.mjs CHANGED
@@ -6,13 +6,6 @@ import { join } from "node:path";
6
6
 
7
7
  export const VERSION = "2.0";
8
8
 
9
- export const QOS_PATH = join(
10
- homedir(),
11
- ".claude",
12
- "cache",
13
- "tfx-hub",
14
- "cli_qos_profile.json",
15
- );
16
9
  export const ACCOUNTS_CONFIG_PATH = join(
17
10
  homedir(),
18
11
  ".claude",
@@ -38,21 +31,6 @@ export const CLAUDE_BAND_MARKER_DIR = join(
38
31
  );
39
32
  export const CLAUDE_BAND_MARKER_TTL_MS = 12 * 60 * 60 * 1000;
40
33
 
41
- // tfx-multi 상태 (v2.2 HUD 통합)
42
- export const TEAM_STATE_PATH = join(
43
- homedir(),
44
- ".claude",
45
- "cache",
46
- "tfx-hub",
47
- "team-state.json",
48
- );
49
- export const CTO_LAKE_CURRENT_RELATIVE_PATH = join(
50
- ".triflux",
51
- "lake",
52
- "current.md",
53
- );
54
- export const CTO_STATUS_STALE_MS = 60 * 60 * 1000; // 1시간
55
- export const CTO_STATUS_LINE_MAX_CHARS = 140;
56
34
  export const CONTEXT_MONITOR_CACHE_PATH = join(
57
35
  homedir(),
58
36
  ".claude",
@@ -67,12 +45,6 @@ export const HUB_REQUEST_MONITOR_CACHE_PATH = join(
67
45
  "tfx-hub",
68
46
  "hub-request-context-monitor.json",
69
47
  );
70
- export const CONTEXT_MONITOR_LEGACY_PATH = join(
71
- homedir(),
72
- ".omc",
73
- "state",
74
- "context-monitor.json",
75
- );
76
48
  export const CONTEXT_MONITOR_LOG_DIR = join(
77
49
  homedir(),
78
50
  ".claude",
@@ -81,16 +53,6 @@ export const CONTEXT_MONITOR_LOG_DIR = join(
81
53
  "logs",
82
54
  );
83
55
 
84
- // 원격 프로브 캐시 (tfx-remote)
85
- export const REMOTE_ENV_CACHE_DIR = join(
86
- homedir(),
87
- ".claude",
88
- "cache",
89
- "tfx-hub",
90
- "remote-env",
91
- );
92
- export const REMOTE_ENV_CACHE_TTL_MS = 24 * 60 * 60 * 1000; // 24시간
93
-
94
56
  // Claude OAuth Usage API (api.anthropic.com/api/oauth/usage)
95
57
  export const CLAUDE_CREDENTIALS_PATH = join(
96
58
  homedir(),
@@ -182,26 +144,11 @@ export const CODEX_REFRESH_LOCK_PATH = join(
182
144
  "cache",
183
145
  ".codex-refresh-lock",
184
146
  );
185
- export const GEMINI_QUOTA_REFRESH_LOCK_PATH = join(
186
- homedir(),
187
- ".claude",
188
- "cache",
189
- ".gemini-quota-refresh-lock",
190
- );
191
- export const GEMINI_SESSION_REFRESH_LOCK_PATH = join(
192
- homedir(),
193
- ".claude",
194
- "cache",
195
- ".gemini-session-refresh-lock",
196
- );
197
147
  export const SPAWN_LOCK_TTL_MS = 30 * 1000; // 30초 spawn dedup
198
148
 
199
- // Gemini 쿼터 API 관련
200
- export const GEMINI_OAUTH_PATH = join(homedir(), ".gemini", "oauth_creds.json");
201
149
  export const ANTIGRAVITY_OAUTH_PATHS = [
202
150
  join(homedir(), ".gemini", "antigravity-cli", "oauth_creds.json"),
203
151
  join(homedir(), ".gemini", "antigravity-cli", "credentials.json"),
204
- GEMINI_OAUTH_PATH,
205
152
  ];
206
153
  export const ANTIGRAVITY_KEYCHAIN_SERVICE = "gemini";
207
154
  export const ANTIGRAVITY_KEYCHAIN_ACCOUNT = "antigravity";
@@ -211,122 +158,29 @@ export const ANTIGRAVITY_SETTINGS_PATH = join(
211
158
  "antigravity-cli",
212
159
  "settings.json",
213
160
  );
214
- // Antigravity CLI 현재 장착 모델 라벨 → HUD 2자 약어 매핑
215
- // /usage 실측 (2026-05-22): Gemini 4개 모델이 동일 reset window 공유 (family-pool).
216
- // Claude/GPT-OSS family는 Gemini와 별도 quota 윈도우.
217
- export const ANTIGRAVITY_MODEL_ABBREV = {
218
- // Gemini family — 통합 quota. 3.6+ Flash 는 세대 숫자 + 등급으로 구분한다.
219
- "Gemini 3.8 Flash (High)": "8h",
220
- "Gemini 3.8 Flash (Medium)": "8m",
221
- "Gemini 3.8 Flash (Low)": "8l",
222
- "Gemini 3.7 Flash (High)": "7h",
223
- "Gemini 3.7 Flash (Medium)": "7m",
224
- "Gemini 3.7 Flash (Low)": "7l",
225
- "Gemini 3.6 Flash (High)": "6h",
226
- "Gemini 3.6 Flash (Medium)": "6m",
227
- "Gemini 3.6 Flash (Low)": "6l",
228
- "Gemini 3.5 Flash (High)": "Fh",
229
- "Gemini 3.5 Flash (Medium)": "Fm",
230
- "Gemini 3.5 Flash (Low)": "Fl",
231
- "Gemini 3.1 Pro (High)": "Ph",
232
- "Gemini 3.1 Pro (Low)": "Pl",
233
- "Gemini 3 Flash": "F3",
234
- // Claude family — 각자 별도 quota
235
- "Claude Sonnet 4.6 (Thinking)": "Cs",
236
- "Claude Opus 4.6 (Thinking)": "Co",
237
- // GPT-OSS family — 각자 별도 quota
238
- "GPT-OSS 120B (Medium)": "Go",
239
- };
240
- export const GEMINI_QUOTA_CACHE_PATH = join(
241
- homedir(),
242
- ".claude",
243
- "cache",
244
- "gemini-quota-cache.json",
245
- );
246
- export const GEMINI_PROJECT_CACHE_PATH = join(
247
- homedir(),
248
- ".claude",
249
- "cache",
250
- "gemini-project-id.json",
251
- );
252
- export const GEMINI_SESSION_CACHE_PATH = join(
253
- homedir(),
254
- ".claude",
255
- "cache",
256
- "gemini-session-cache.json",
257
- );
258
- export const TFX_PREFLIGHT_CACHE_PATH = join(
161
+ export const ANTIGRAVITY_QUOTA_CACHE_PATH = join(
259
162
  homedir(),
260
163
  ".claude",
261
164
  "cache",
262
- "tfx-preflight.json",
165
+ "antigravity-quota-cache.json",
263
166
  );
264
- export const TFX_PREFLIGHT_CACHE_STALE_MS = 60 * 60 * 1000;
265
- export const GEMINI_RPM_TRACKER_PATH = join(
167
+ export const ANTIGRAVITY_REFRESH_LOCK_PATH = join(
266
168
  homedir(),
267
169
  ".claude",
268
170
  "cache",
269
- "gemini-rpm-tracker.json",
270
- );
271
- // 이전 .omc/ 경로 fallback (기존 환경 호환)
272
- export const LEGACY_GEMINI_QUOTA_CACHE = join(
273
- homedir(),
274
- ".omc",
275
- "state",
276
- "gemini_quota_cache.json",
277
- );
278
- export const LEGACY_GEMINI_PROJECT_CACHE = join(
279
- homedir(),
280
- ".omc",
281
- "state",
282
- "gemini_project_id.json",
283
- );
284
- export const LEGACY_GEMINI_SESSION_CACHE = join(
285
- homedir(),
286
- ".omc",
287
- "state",
288
- "gemini_session_tokens_cache.json",
171
+ ".antigravity-refresh-lock",
289
172
  );
290
- export const LEGACY_GEMINI_RPM_TRACKER = join(
291
- homedir(),
292
- ".omc",
293
- "state",
294
- "gemini_rpm_tracker.json",
295
- );
296
-
297
- export const GEMINI_RPM_WINDOW_MS = 60 * 1000; // 60초 슬라이딩 윈도우
298
- export const GEMINI_QUOTA_STALE_MS = 5 * 60 * 1000; // 5분
299
- export const GEMINI_SESSION_STALE_MS = 30 * 1000; // 30초
300
- export const GEMINI_API_TIMEOUT_MS = 3000; // 3초
301
-
173
+ export const ANTIGRAVITY_QUOTA_STALE_MS = 5 * 60 * 1000;
174
+ export const ANTIGRAVITY_REFRESH_FLAG = "--refresh-antigravity-quota";
302
175
  export const ACCOUNT_LABEL_WIDTH = 10;
303
176
  export const PROVIDER_PREFIX_WIDTH = 2;
304
- export const PERCENT_CELL_WIDTH = 3;
177
+ export const PERCENT_CELL_WIDTH = 4;
305
178
  export const TIME_CELL_INNER_WIDTH = 6;
306
179
 
307
180
  export const CLAUDE_REFRESH_FLAG = "--refresh-claude-usage";
308
181
  export const CODEX_REFRESH_FLAG = "--refresh-codex-rate-limits";
309
- export const GEMINI_REFRESH_FLAG = "--refresh-gemini-quota";
310
- export const GEMINI_SESSION_REFRESH_FLAG = "--refresh-gemini-session";
311
182
 
312
183
  // 모바일/Termux 컴팩트 모드 감지
313
184
  export const HUD_CONFIG_PATH = join(homedir(), ".omc", "config", "hud.json");
314
185
  export const COMPACT_COLS_THRESHOLD = 80;
315
186
  export const MINIMAL_COLS_THRESHOLD = 60;
316
-
317
- // rows 임계값 상수 (selectTier 에서 tier 결정에 사용)
318
- export const ROWS_BUDGET_FULL = 40;
319
- export const ROWS_BUDGET_LARGE = 35;
320
- export const ROWS_BUDGET_MEDIUM = 28;
321
- export const ROWS_BUDGET_SMALL = 22;
322
-
323
- // Gemini Pro 풀 공유 그룹: 같은 remainingFraction을 공유하는 모델 ID들
324
- export const GEMINI_PRO_POOL = new Set([
325
- "gemini-2.5-pro",
326
- "gemini-3-pro-preview",
327
- "gemini-3.1-pro-preview",
328
- ]);
329
- export const GEMINI_FLASH_POOL = new Set([
330
- "gemini-2.5-flash",
331
- "gemini-3-flash-preview",
332
- ]);
@@ -4,60 +4,15 @@ import { dirname, join } from "node:path";
4
4
 
5
5
  import {
6
6
  CONTEXT_MONITOR_CACHE_PATH,
7
- CONTEXT_MONITOR_LEGACY_PATH,
8
7
  CONTEXT_MONITOR_LOG_DIR,
9
8
  } from "./constants.mjs";
10
- import { clampPercent, formatTokenCount, readJsonMigrate } from "./utils.mjs";
9
+ import { clampPercent, formatTokenCount } from "./utils.mjs";
11
10
 
12
11
  const DEFAULT_CONTEXT_LIMIT = 200_000;
13
12
  const MILLION_CONTEXT_LIMIT = 1_000_000;
14
13
  const MAX_CAPTURE_BYTES = 256 * 1024;
15
14
  const MAX_TOP_KEYS = 20;
16
15
 
17
- // stdin 이 context_window_size 를 제공하지 않을 때 모델 ID 로 한도를 추정한다.
18
- // Anthropic 공식 문서(2026-09-30 기준): Opus 4.6 이상, Sonnet 4.6/5/5.5,
19
- // Fable 5/5.1 = 1M. Sonnet 4.5 / Haiku 4.5 = 200K이며 [1m]도 유지한다.
20
- const MODEL_HINT_1M_PREFIXES = [
21
- "claude-sonnet-4-6",
22
- "claude-sonnet-5",
23
- "claude-fable-5",
24
- ];
25
-
26
- function normalizeModelId(modelId) {
27
- if (!modelId) return "";
28
- return String(modelId).toLowerCase();
29
- }
30
-
31
- function isMillionContextOpusModel(modelId) {
32
- const match = /^claude-opus-(\d+)(?:-(\d+))?(?:$|[-[\s])/u.exec(modelId);
33
- if (!match) return false;
34
-
35
- const major = Number(match[1]);
36
- const minor = Number(match[2] || 0);
37
- return major > 4 || (major === 4 && minor >= 6);
38
- }
39
-
40
- function isMillionContextModel(modelId) {
41
- const id = normalizeModelId(modelId);
42
- if (!id) return false;
43
- if (id.includes("[1m]")) return true;
44
- if (isMillionContextOpusModel(id)) return true;
45
- return MODEL_HINT_1M_PREFIXES.some((prefix) => id.startsWith(prefix));
46
- }
47
-
48
- function resolveModelLimit(modelId) {
49
- return isMillionContextModel(modelId)
50
- ? MILLION_CONTEXT_LIMIT
51
- : DEFAULT_CONTEXT_LIMIT;
52
- }
53
-
54
- export function shouldSuppressInfoOnlyContextStatus(modelId, contextLimit = 0) {
55
- const explicitLimit = Number(contextLimit);
56
- return explicitLimit > 0
57
- ? explicitLimit >= MILLION_CONTEXT_LIMIT
58
- : isMillionContextModel(modelId);
59
- }
60
-
61
16
  const WARNING_LEVELS = Object.freeze({
62
17
  ok: { min: 0, message: "" },
63
18
  info: { min: 60, message: "컨텍스트 절반 이상 사용" },
@@ -244,14 +199,6 @@ export function formatContextUsage(usedTokens, limitTokens, percent = null) {
244
199
  return `${formatTokenCount(used)}/${formatTokenCount(limit)} (${pct}%)`;
245
200
  }
246
201
 
247
- export function readContextMonitorSnapshot() {
248
- return readJsonMigrate(
249
- CONTEXT_MONITOR_CACHE_PATH,
250
- CONTEXT_MONITOR_LEGACY_PATH,
251
- null,
252
- );
253
- }
254
-
255
202
  function getStdinContextUsage(stdin) {
256
203
  const limitTokens = Number(stdin?.context_window?.context_window_size || 0);
257
204
  const nativePercent = Number(stdin?.context_window?.used_percentage);
@@ -284,14 +231,7 @@ function getStdinContextUsage(stdin) {
284
231
  return null;
285
232
  }
286
233
 
287
- export function deriveContextLimit(stdin) {
288
- const explicit = Number(stdin?.context_window?.context_window_size || 0);
289
- const modelHint = resolveModelLimit(stdin?.model?.id ?? stdin?.model);
290
- return Math.max(explicit, modelHint);
291
- }
292
-
293
- export function buildContextUsageView(stdin, snapshot = null) {
294
- const modelId = stdin?.model?.id ?? stdin?.model;
234
+ export function buildContextUsageView(stdin) {
295
235
  const stdinUsage = getStdinContextUsage(stdin);
296
236
  if (!stdinUsage) {
297
237
  return {
@@ -312,8 +252,7 @@ export function buildContextUsageView(stdin, snapshot = null) {
312
252
 
313
253
  const warning = classifyContextThreshold(percent);
314
254
  const showInfoOnlyStatus = !(
315
- warning.level === "info" &&
316
- shouldSuppressInfoOnlyContextStatus(modelId, stdinUsage.limitTokens)
255
+ warning.level === "info" && stdinUsage.limitTokens >= MILLION_CONTEXT_LIMIT
317
256
  );
318
257
  return {
319
258
  usedTokens,