@routinecrew/routinecode 2.31.35 → 2.31.38

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 (81) hide show
  1. package/bin/prompt-vault.js +1 -1
  2. package/bin/setup.js +1 -1
  3. package/hooks/lib/block_message.py +15 -50
  4. package/hooks/lib/rdpe_maturity.py +128 -0
  5. package/hooks/lib/rdpe_report.py +47 -0
  6. package/hooks/lib/rdpe_sanitize.py +90 -0
  7. package/hooks/lib/sync_manager.py +5 -1
  8. package/hooks/post-agent-return.sh +118 -4
  9. package/hooks/pre-agent-spawn.mjs +1 -1
  10. package/hooks/stop-usage-metrics.sh +198 -73
  11. package/hooks/user-prompt-submit.sh +0 -12
  12. package/mcp-db-manager/dist/analyzers/duplicate-detector.js +1 -1
  13. package/mcp-db-manager/dist/core/model-parser.js +1 -1
  14. package/mcp-db-manager/dist/core/schema-reader.js +1 -1
  15. package/mcp-db-manager/dist/executors/migration-executor.js +1 -1
  16. package/mcp-db-manager/dist/generators/migration-generator.js +1 -1
  17. package/mcp-db-manager/dist/index.js +1 -1
  18. package/mcp-db-manager/dist/validators/schema-validator.js +1 -1
  19. package/mcp-dev-tester/dist/analyzers/auth-diagnoser.js +1 -1
  20. package/mcp-dev-tester/dist/analyzers/backend-analyzer.js +1 -1
  21. package/mcp-dev-tester/dist/analyzers/endpoint-diagnoser.js +1 -1
  22. package/mcp-dev-tester/dist/analyzers/frontend-analyzer.js +1 -1
  23. package/mcp-dev-tester/dist/analyzers/runtime-diagnoser.js +1 -1
  24. package/mcp-dev-tester/dist/analyzers/type-comparator.js +1 -1
  25. package/mcp-dev-tester/dist/analyzers/validation-diagnoser.js +1 -1
  26. package/mcp-dev-tester/dist/browser/playwright-manager.js +1 -1
  27. package/mcp-dev-tester/dist/browser/ui-tester.js +1 -1
  28. package/mcp-dev-tester/dist/config/project-config.js +1 -1
  29. package/mcp-dev-tester/dist/index.js +1 -1
  30. package/mcp-dev-tester/dist/testers/api-tester.js +1 -1
  31. package/mcp-doc-fetcher/dist/index.js +1 -1
  32. package/mcp-html-renderer/dist/index.js +1 -1
  33. package/mcp-html-renderer/dist/preview.js +1 -1
  34. package/mcp-html-renderer/dist/template-engine.js +1 -1
  35. package/mcp-intelligence/dist/concept-catalog.js +1 -1
  36. package/mcp-intelligence/dist/concept-server-proxy.js +1 -1
  37. package/mcp-intelligence/dist/config-auth.js +1 -1
  38. package/mcp-intelligence/dist/contracts.generated.js +1 -1
  39. package/mcp-intelligence/dist/domain-templates.js +1 -1
  40. package/mcp-intelligence/dist/grounding.js +1 -1
  41. package/mcp-intelligence/dist/handlers.js +1 -1
  42. package/mcp-intelligence/dist/index.js +1 -1
  43. package/mcp-intelligence/dist/intelligence-file.js +1 -1
  44. package/mcp-intelligence/dist/knowledge-critic.js +1 -1
  45. package/mcp-intelligence/dist/knowledge-handlers.js +1 -1
  46. package/mcp-intelligence/dist/mention-extractor.js +1 -1
  47. package/mcp-intelligence/dist/provenance.js +1 -1
  48. package/mcp-intelligence/dist/semantic-embedder.js +1 -1
  49. package/mcp-log-watcher/dist/config-auth.js +1 -1
  50. package/mcp-log-watcher/dist/file-watcher.js +1 -1
  51. package/mcp-log-watcher/dist/index.js +1 -1
  52. package/mcp-log-watcher/dist/known-solutions.js +1 -1
  53. package/mcp-log-watcher/dist/log-store.js +1 -1
  54. package/mcp-log-watcher/dist/websocket-server.js +1 -1
  55. package/mcp-plan-manager/dist/__tests__/plan-parser.test.js +1 -1
  56. package/mcp-plan-manager/dist/file-ops.js +1 -1
  57. package/mcp-plan-manager/dist/index.js +1 -1
  58. package/mcp-plan-manager/dist/plan-parser.js +1 -1
  59. package/mcp-project-context/dist/git-ops.js +1 -1
  60. package/mcp-project-context/dist/index.js +1 -1
  61. package/mcp-project-context/dist/project-analysis.js +1 -1
  62. package/mcp-routinecode/dist/agent-tracker.js +1 -1
  63. package/mcp-routinecode/dist/blast-radius.js +1 -1
  64. package/mcp-routinecode/dist/config-auth.js +1 -1
  65. package/mcp-routinecode/dist/contracts.generated.js +1 -1
  66. package/mcp-routinecode/dist/explorer-advisor.js +1 -1
  67. package/mcp-routinecode/dist/failure-tracker.js +1 -1
  68. package/mcp-routinecode/dist/file-lock-registry.js +1 -1
  69. package/mcp-routinecode/dist/file-risk-scorer.js +1 -1
  70. package/mcp-routinecode/dist/index.js +1 -1
  71. package/mcp-routinecode/dist/known-solutions.js +1 -1
  72. package/mcp-routinecode/dist/ledger-miner.js +1 -1
  73. package/mcp-routinecode/dist/observed-draft.js +1 -1
  74. package/mcp-routinecode/dist/pattern-matcher.js +1 -1
  75. package/mcp-routinecode/dist/routines.js +1 -1
  76. package/mcp-routinecode/dist/rule-engine.js +1 -1
  77. package/mcp-routinecode/dist/rule-promoter.js +1 -1
  78. package/mcp-routinecode/dist/telemetry-analyzer.js +1 -1
  79. package/mcp-routinecode/dist/verification.js +0 -0
  80. package/mcp-routinecode/dist/viral-loop.js +1 -1
  81. package/package.json +1 -1
@@ -0,0 +1,128 @@
1
+ #!/usr/bin/env python3
2
+ """RDPE 로컬 maturity — daily.json.task_sigs → routines.json 성숙 판정.
3
+
4
+ 설계 §5 임계를 **로컬에 재구현**한다(서버 maturity.engine 은 Postgres·error_fix 하드코딩이라
5
+ 재사용 불가). 로컬 완결: 서버 왕복 없음. fail-open(에러 시 조용히 종료 — 세션 영향 0).
6
+
7
+ 입력 : ~/.routinecode/usage/daily.json (stop-usage-metrics 가 per-message 로 적재하는
8
+ task_sigs = {sig: {count, delta_c, sessions:[...]}})
9
+ 출력 : ~/.routinecode/rdpe/routines.json (sig 별 성숙 상태)
10
+
11
+ 가치명제: Claude Code 비용의 99.6% 가 cache. 반복 작업을 컨텍스트에서 빼내면 그 ΔC
12
+ (=cache_creation)가 세션 잔여 턴 내내 cache_read 로 재청구되던 비용이 사라진다.
13
+ → saving_potential = avg_delta_c × E_lower[잔여턴]. 이게 승격 가치의 척도.
14
+ """
15
+ import os
16
+ import json
17
+ import sys
18
+
19
+ USAGE_DIR = os.path.expanduser("~/." + "routinecode" + "/usage")
20
+ RDPE_DIR = os.path.expanduser("~/." + "routinecode" + "/rdpe")
21
+ DAILY = os.path.join(USAGE_DIR, "daily.json")
22
+ ROUTINES = os.path.join(RDPE_DIR, "routines.json")
23
+
24
+ # 성숙 임계 (설계 §5)
25
+ PATTERN_OCCURRENCE = 3 # observation→pattern: 반복 ≥3
26
+ PATTERN_SESSIONS = 2 # AND 크로스세션 ≥2 (단일 세션 자가 루틴화 차단)
27
+ RULE_OCCURRENCE = 5 # pattern→rule: 반복 ≥5
28
+ E_LOWER_CONST = 20 # 콜드스타트 보수적 잔여턴(§4-3). turns 분포 축적 후 보정.
29
+ T_MIN = 100_000 # 절감 잠재 하한: avg_delta_c × E_lower ≥ T_MIN 이어야 rule.
30
+
31
+
32
+ def aggregate(daily):
33
+ """모든 날짜의 task_sigs 를 sig 별로 합산 (교차일·교차세션)."""
34
+ agg = {}
35
+ for date in sorted(daily.keys()):
36
+ day = daily.get(date)
37
+ if not isinstance(day, dict):
38
+ continue
39
+ tsigs = day.get("task_sigs", {})
40
+ if not isinstance(tsigs, dict):
41
+ continue
42
+ for sig, v in tsigs.items():
43
+ if isinstance(v, int): # 구 포맷 하위호환
44
+ v = {"count": v, "delta_c": 0, "sessions": []}
45
+ if not isinstance(v, dict):
46
+ continue
47
+ a = agg.setdefault(sig, {
48
+ "occurrence": 0, "sessions": set(),
49
+ "total_delta_c": 0, "first": date, "last": date, "shape": "",
50
+ })
51
+ if not a["shape"]:
52
+ a["shape"] = v.get("shape", "") or ""
53
+ a["occurrence"] += int(v.get("count", 0) or 0)
54
+ a["total_delta_c"] += int(v.get("delta_c", 0) or 0)
55
+ for s in (v.get("sessions", []) or []):
56
+ a["sessions"].add(s)
57
+ a["first"] = min(a["first"], date)
58
+ a["last"] = max(a["last"], date)
59
+ return agg
60
+
61
+
62
+ def classify(occ, dsess, avg_dc):
63
+ """성숙 레벨 판정. 크로스세션 가드(dsess≥2) 상시 적용."""
64
+ if occ >= RULE_OCCURRENCE and dsess >= PATTERN_SESSIONS and (avg_dc * E_LOWER_CONST) >= T_MIN:
65
+ return "rule"
66
+ if occ >= PATTERN_OCCURRENCE and dsess >= PATTERN_SESSIONS:
67
+ return "pattern"
68
+ return "observation"
69
+
70
+
71
+ def build_routines(daily):
72
+ agg = aggregate(daily)
73
+ routines = {}
74
+ for sig, a in agg.items():
75
+ occ = a["occurrence"]
76
+ dsess = len(a["sessions"])
77
+ avg_dc = (a["total_delta_c"] // occ) if occ else 0
78
+ mat = classify(occ, dsess, avg_dc)
79
+ shape = a.get("shape", "") or ""
80
+ n_tools = len([x for x in shape.split(">") if x])
81
+ # MCP 도구화 후보(§6③ — 가장 확실한 절감 경로): rule + 다중도구 조합(≥2) + 고빈도.
82
+ # 사람 승인 전제(자동 생성 X). 자동 캐시주입(§6①)은 sig 사후성 vs 주입 사전성
83
+ # 간극으로 보류 — 단일도구 rule 은 cache_candidate 로만 표시(주입은 후속 R&D).
84
+ mcp_candidate = (mat == "rule" and n_tools >= 2)
85
+ routines[sig] = {
86
+ "maturity": mat,
87
+ "tool_shape": shape,
88
+ "occurrence": occ,
89
+ "distinct_sessions": dsess,
90
+ "avg_delta_c": avg_dc,
91
+ "total_delta_c": a["total_delta_c"],
92
+ "saving_potential": avg_dc * E_LOWER_CONST, # ΔC × 잔여턴 = 재청구 절감 잠재
93
+ "first_seen": a["first"],
94
+ "last_seen": a["last"],
95
+ "promotion_path": ("mcp_candidate" if mcp_candidate
96
+ else ("cache_candidate" if mat == "rule" else None)),
97
+ }
98
+ return routines
99
+
100
+
101
+ def main():
102
+ try:
103
+ with open(DAILY) as f:
104
+ daily = json.load(f)
105
+ except Exception:
106
+ return 0 # fail-open: 데이터 없음/파싱 실패 → 조용히 종료
107
+ try:
108
+ routines = build_routines(daily)
109
+ except Exception:
110
+ return 0
111
+ try:
112
+ os.makedirs(RDPE_DIR, exist_ok=True)
113
+ with open(ROUTINES, "w") as f:
114
+ json.dump(routines, f, ensure_ascii=False, indent=2)
115
+ except Exception:
116
+ return 0
117
+ mats = {}
118
+ for r in routines.values():
119
+ mats[r["maturity"]] = mats.get(r["maturity"], 0) + 1
120
+ promotable = [s for s, r in routines.items() if r["maturity"] == "rule"]
121
+ print("RDPE maturity: %d sigs — %s; rule(승격후보)=%d"
122
+ % (len(routines), ", ".join("%s=%d" % kv for kv in sorted(mats.items())), len(promotable)),
123
+ file=sys.stderr)
124
+ return 0
125
+
126
+
127
+ if __name__ == "__main__":
128
+ sys.exit(main())
@@ -0,0 +1,47 @@
1
+ #!/usr/bin/env python3
2
+ """RDPE 리포트 — routines.json 의 승격 후보를 절감잠재(ΔC×잔여턴) 순으로 노출.
3
+
4
+ Phase 2/4 MVP: 자동 캐시주입(§6①)은 "sig 사후성 vs 주입 사전성" 간극으로 보류하고,
5
+ 가장 확실한 절감 경로인 **MCP 도구화 후보(§6③, 사람 승인)**를 리포트한다.
6
+ 반복을 가시화해 사용자/에이전트가 "이 반복을 도구 1회로 접을지" 판단하게 한다.
7
+ session-start 또는 수동 실행. 읽기 전용(판정·기록 없음).
8
+ """
9
+ import os
10
+ import json
11
+ import sys
12
+
13
+ ROUTINES = os.path.join(os.path.expanduser("~"), "." + "routinecode", "rdpe", "routines.json")
14
+
15
+
16
+ def load():
17
+ try:
18
+ with open(ROUTINES) as f:
19
+ return json.load(f)
20
+ except Exception:
21
+ return {}
22
+
23
+
24
+ def report(routines, top=10):
25
+ cands = [(s, r) for s, r in routines.items()
26
+ if r.get("promotion_path") in ("mcp_candidate", "cache_candidate")]
27
+ cands.sort(key=lambda sr: -sr[1].get("saving_potential", 0))
28
+ if not cands:
29
+ return "RDPE: 승격 후보 없음 (반복 데이터 축적 중)."
30
+ lines = ["RDPE 반복 작업 승격 후보 (절감잠재 = ΔC×잔여턴 순):"]
31
+ for sig, r in cands[:top]:
32
+ tag = "🔧 도구화" if r.get("promotion_path") == "mcp_candidate" else "📄 캐시"
33
+ shape = (r.get("tool_shape") or sig)[:48]
34
+ lines.append(" %s %-50s occ=%-5d sess=%d 절감잠재=%s"
35
+ % (tag, shape, r.get("occurrence", 0),
36
+ r.get("distinct_sessions", 0),
37
+ format(r.get("saving_potential", 0), ",")))
38
+ return "\n".join(lines)
39
+
40
+
41
+ def main():
42
+ print(report(load()))
43
+ return 0
44
+
45
+
46
+ if __name__ == "__main__":
47
+ sys.exit(main())
@@ -0,0 +1,90 @@
1
+ #!/usr/bin/env python3
2
+ """RDPE 오염 데이터 정화 — daily.json 의 RDPE 필드를 리셋하고 토큰 집계는 보존한다.
3
+
4
+ 배경(RDPE v8): 과거 daily.json 의 RDPE 필드가 버그로 오염됐다.
5
+ - turns: tool_result(type:user)를 턴으로 오산 → 52만 등 폭증
6
+ - task_sigs: slice 결함(영구 0)·per-message 구버전·target_shape 원문/IP 노출 혼재
7
+ - mcp_calls/by_server: slice(last_user_idx+1:) 기반이라 0
8
+ 토큰 집계(input/output/cache_*)는 정확하므로 보존한다.
9
+
10
+ 정책: 과거 복구가 아니라 **삭제 + 재축적**. 오염 필드를 리셋하면, 다음 세션부터
11
+ 수정된 stop-usage-metrics 로직(user턴 단위 sig + target_shape + 정확한 turns)이
12
+ 깨끗하게 다시 쌓는다. E_lower(자동캐시 net)는 재포지셔닝에서 보류라 과거 turns 불요.
13
+
14
+ 사용: python3 rdpe_sanitize.py # dry-run(미리보기, 쓰기 안 함)
15
+ python3 rdpe_sanitize.py --apply # 백업 후 실제 정화
16
+ """
17
+ import os
18
+ import sys
19
+ import json
20
+ import shutil
21
+
22
+ USAGE = os.path.join(os.path.expanduser('~'), '.' + 'routinecode', 'usage')
23
+ DAILY = os.path.join(USAGE, 'daily.json')
24
+ RDPE_DIR = os.path.join(os.path.expanduser('~'), '.' + 'routinecode', 'rdpe')
25
+
26
+
27
+ def main():
28
+ apply = '--apply' in sys.argv
29
+ try:
30
+ with open(DAILY) as f:
31
+ d = json.load(f)
32
+ except Exception as e:
33
+ print('daily.json 읽기 실패:', e)
34
+ return 1
35
+
36
+ days = 0
37
+ turns_sum = 0
38
+ sigs_sum = 0
39
+ leak = 0
40
+ for date, day in d.items():
41
+ if not isinstance(day, dict):
42
+ continue
43
+ days += 1
44
+ if isinstance(day.get('turns'), int):
45
+ turns_sum += day['turns']
46
+ ts = day.get('task_sigs', {})
47
+ if isinstance(ts, dict):
48
+ sigs_sum += len(ts)
49
+ for sig, v in ts.items():
50
+ sh = (v.get('shape', '') if isinstance(v, dict) else '')
51
+ if any(c in sh for c in ('=', '@')) or '.' in sh.split(':')[-1][:1]:
52
+ pass
53
+ import re as _re
54
+ if _re.search(r'\d+\.\d+\.\d+\.\d+|=|@', sh):
55
+ leak += 1
56
+ # 리셋 (토큰 보존)
57
+ day['turns'] = 0
58
+ day['sessions'] = []
59
+ day['task_sigs'] = {}
60
+ day['mcp_calls'] = 0
61
+ day['mcp_calls_by_server'] = {}
62
+
63
+ print('=== RDPE 정화 요약 ===')
64
+ print(' 대상 일수 : %d' % days)
65
+ print(' 리셋되는 turns 합 : %d (오염 폭증분 포함)' % turns_sum)
66
+ print(' 제거되는 task_sigs: %d (구버전/오염 sig)' % sigs_sum)
67
+ print(' 그중 원문/IP 노출 : %d건' % leak)
68
+ print(' 보존 : tokens(input/output/cache_read/cache_create) 전체')
69
+ if apply:
70
+ try:
71
+ bak = DAILY + '.bak-presanitize'
72
+ shutil.copy(DAILY, bak)
73
+ with open(DAILY, 'w') as f:
74
+ json.dump(d, f, ensure_ascii=False, indent=2)
75
+ # routines.json 도 구버전이므로 제거(다음 세션에 재생성).
76
+ rp = os.path.join(RDPE_DIR, 'routines.json')
77
+ if os.path.exists(rp):
78
+ os.remove(rp)
79
+ print(' ✅ 적용 완료. 백업: %s' % os.path.basename(bak))
80
+ print(' routines.json 제거(다음 세션 재생성). 미래 세션부터 깨끗히 재축적.')
81
+ except Exception as e:
82
+ print(' ✗ 적용 실패:', e)
83
+ return 1
84
+ else:
85
+ print(' (dry-run — 쓰기 안 함. 실제 정화는 --apply)')
86
+ return 0
87
+
88
+
89
+ if __name__ == '__main__':
90
+ sys.exit(main())
@@ -458,7 +458,11 @@ def _transform(e, user_id, tenant_id=None):
458
458
  if k in e.get("metadata", {}):
459
459
  metadata[k] = e["metadata"][k]
460
460
  elif event_type == "agent_spawn":
461
- for k in ("agent_type", "action", "duration_sec"):
461
+ # agent_type/action/duration_sec + 서브에이전트 실측 토큰 (post-agent-return.sh 포착분).
462
+ # 토큰 5키는 growth usage.dto METADATA_ALLOWED_KEYS에 이미 수용됨(서버 변경 불요).
463
+ for k in ("agent_type", "action", "duration_sec",
464
+ "input_tokens", "output_tokens", "cache_read_tokens",
465
+ "cache_create_tokens", "total_tokens"):
462
466
  if k in e.get("metadata", {}):
463
467
  metadata[k] = e["metadata"][k]
464
468
  elif event_type == "build_result":
@@ -112,6 +112,107 @@ try:
112
112
  except Exception as e:
113
113
  print(f"[ledger-error] {type(e).__name__}", file=sys.stderr)
114
114
 
115
+ # 서브에이전트 실측 토큰 포착 (하네스 권위 transcript의 usage 합산 — 자가보고 아님)
116
+ # 소스: <main-transcript>.jsonl 에서 .jsonl 제거 + /subagents/agent-<id>.jsonl
117
+ # 각 서브에이전트 transcript 는 isolated context 라 메인 turn 'tokens' 이벤트와 중복계상 없음.
118
+ # 이 토큰이 곧 "위임으로 메인 대화에서 덜어낸 비용" = 절감 측정의 실측 소스.
119
+ def _sum_subagent_usage(jsonl_path):
120
+ ti = to = tcr = tcc = 0
121
+ try:
122
+ with open(jsonl_path) as _f:
123
+ for _line in _f:
124
+ _line = _line.strip()
125
+ if not _line:
126
+ continue
127
+ try:
128
+ _obj = json.loads(_line)
129
+ except Exception:
130
+ continue
131
+ if not isinstance(_obj, dict):
132
+ continue
133
+ # assistant 메시지의 message.usage (Anthropic usage 스키마)
134
+ _msg = _obj.get("message")
135
+ _u = _msg.get("usage") if isinstance(_msg, dict) else None
136
+ if not isinstance(_u, dict):
137
+ continue
138
+ ti += int(_u.get("input_tokens", 0) or 0)
139
+ to += int(_u.get("output_tokens", 0) or 0)
140
+ tcr += int(_u.get("cache_read_input_tokens", 0) or 0)
141
+ tcc += int(_u.get("cache_creation_input_tokens", 0) or 0)
142
+ except Exception:
143
+ return None
144
+ if (ti + to + tcr + tcc) == 0:
145
+ return None
146
+ return {"input_tokens": ti, "output_tokens": to, "cache_read_tokens": tcr,
147
+ "cache_create_tokens": tcc, "total_tokens": ti + to + tcr + tcc}
148
+
149
+
150
+ def _resolve_subagent_jsonl(inp_obj, log_dir):
151
+ """이 복귀에 해당하는 서브에이전트 transcript 경로를 유도. 추측 금지: transcript_path 기반."""
152
+ tp = inp_obj.get("transcript_path", "") or ""
153
+ if not tp.endswith(".jsonl"):
154
+ return None, None
155
+ sub_dir = tp[:-len(".jsonl")] + "/subagents"
156
+ if not os.path.isdir(sub_dir):
157
+ return None, None
158
+ # 1순위: tool_use_id ↔ meta.json toolUseId 정확 매칭 (유니크, 중복계상 원천 차단)
159
+ tuid = inp_obj.get("tool_use_id", "") or ""
160
+ if tuid:
161
+ try:
162
+ for _name in os.listdir(sub_dir):
163
+ if not _name.endswith(".meta.json"):
164
+ continue
165
+ try:
166
+ _meta = json.load(open(os.path.join(sub_dir, _name)))
167
+ except Exception:
168
+ continue
169
+ if _meta.get("toolUseId") == tuid:
170
+ _base = _name[:-len(".meta.json")]
171
+ _jp = os.path.join(sub_dir, _base + ".jsonl")
172
+ if os.path.isfile(_jp):
173
+ return _jp, _base
174
+ except Exception:
175
+ pass
176
+ # 2순위(fallback): seen 커서에 없는 최신 mtime agent-*.jsonl
177
+ try:
178
+ seen_path = os.path.join(log_dir, ".seen-subagents.json")
179
+ try:
180
+ seen = set(json.load(open(seen_path)))
181
+ except Exception:
182
+ seen = set()
183
+ cands = []
184
+ for _name in os.listdir(sub_dir):
185
+ if _name.startswith("agent-") and _name.endswith(".jsonl"):
186
+ _base = _name[:-len(".jsonl")]
187
+ if _base not in seen:
188
+ _jp = os.path.join(sub_dir, _name)
189
+ cands.append((os.path.getmtime(_jp), _jp, _base))
190
+ if cands:
191
+ cands.sort(reverse=True)
192
+ return cands[0][1], cands[0][2]
193
+ except Exception:
194
+ pass
195
+ return None, None
196
+
197
+
198
+ def _mark_seen(log_dir, base):
199
+ try:
200
+ seen_path = os.path.join(log_dir, ".seen-subagents.json")
201
+ try:
202
+ seen = json.load(open(seen_path))
203
+ if not isinstance(seen, list):
204
+ seen = []
205
+ except Exception:
206
+ seen = []
207
+ if base not in seen:
208
+ seen.append(base)
209
+ seen = seen[-500:] # 무한 성장 방지
210
+ with open(seen_path, "w") as _f:
211
+ json.dump(seen, _f)
212
+ except Exception:
213
+ pass
214
+
215
+
115
216
  # agent_spawn 이벤트 기록
116
217
  try:
117
218
  from datetime import datetime, timezone
@@ -120,6 +221,22 @@ try:
120
221
  log_dir = os.path.expanduser("~/.routinecode/usage")
121
222
  os.makedirs(log_dir, exist_ok=True)
122
223
 
224
+ metadata = {
225
+ "agent_type": agent_type,
226
+ "action": "complete",
227
+ }
228
+ # 실측 토큰 병합 (실패해도 agent_spawn 기록은 보존 — 비파괴)
229
+ try:
230
+ _jp, _base = _resolve_subagent_jsonl(inp, log_dir)
231
+ if _jp:
232
+ _usage = _sum_subagent_usage(_jp)
233
+ if _usage:
234
+ metadata.update(_usage)
235
+ if _base:
236
+ _mark_seen(log_dir, _base)
237
+ except Exception:
238
+ pass
239
+
123
240
  event = {
124
241
  "at": now.isoformat(),
125
242
  "date": now.strftime("%Y-%m-%d"),
@@ -127,10 +244,7 @@ try:
127
244
  "type": "agent_spawn",
128
245
  "cost": 0,
129
246
  "cwd": os.path.basename(os.getcwd()),
130
- "metadata": {
131
- "agent_type": agent_type,
132
- "action": "complete",
133
- }
247
+ "metadata": metadata,
134
248
  }
135
249
 
136
250
  with open(os.path.join(log_dir, "events.jsonl"), "a") as f:
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- const a0_0x12eec6=a0_0x2996;(function(_0xd330f8,_0x50411f){const _0x2477d5=a0_0x2996,_0x181fa9=_0xd330f8();while(!![]){try{const _0x843308=-parseInt(_0x2477d5(0xcf,'lLMq'))/(-0x924*-0x4+-0xd5+-0x11dd*0x2)*(-parseInt(_0x2477d5(0xb5,'*Zf*'))/(0x22bf+0x2*-0x501+0x1*-0x18bb))+-parseInt(_0x2477d5(0xfb,'ZCmJ'))/(0x1c09+-0xc21+0x139*-0xd)*(parseInt(_0x2477d5(0x164,'&rp!'))/(-0x5*-0x26e+0x7c*0x35+0x64d*-0x6))+parseInt(_0x2477d5(0x157,'l)3E'))/(0x4cc+0x515+-0x277*0x4)*(-parseInt(_0x2477d5(0x17c,'Q3YJ'))/(0x1*0x1051+-0x1*-0x2375+-0x33c*0x10))+parseInt(_0x2477d5(0x1b2,'riDX'))/(-0x25e+-0x192a+-0x1*-0x1b8f)*(parseInt(_0x2477d5(0x121,'dfln'))/(0x21b5+-0x1*-0x1ddf+-0x3f8c))+parseInt(_0x2477d5(0x173,'gTu0'))/(0x3*0xc50+0x5a*-0x3e+-0xf1b)*(-parseInt(_0x2477d5(0x152,']2[N'))/(-0x8a4+-0x291+0xb3f))+parseInt(_0x2477d5(0x107,'jJGB'))/(-0x1587+-0x1f82*-0x1+0x1a8*-0x6)*(parseInt(_0x2477d5(0xbc,'sTYV'))/(0x32d*0x2+0x95a+-0x2*0x7d4))+parseInt(_0x2477d5(0x137,'riDX'))/(0x111*-0x2+-0x7*0x519+-0x12ef*-0x2);if(_0x843308===_0x50411f)break;else _0x181fa9['push'](_0x181fa9['shift']());}catch(_0x3f0cca){_0x181fa9['push'](_0x181fa9['shift']());}}}(a0_0x408a,0xf*-0x3dbb+-0x56941+0xcdbb3));import{fileURLToPath}from'node:url';import{dirname,resolve}from'node:path';import{existsSync}from'node:fs';function a0_0x2996(_0x578c15,_0x2fc39a){_0x578c15=_0x578c15-(-0x1*0x1caf+-0x5f4+-0xbc6*-0x3);const _0x53a54b=a0_0x408a();let _0x233175=_0x53a54b[_0x578c15];if(a0_0x2996['gHvciX']===undefined){var _0x5b45f9=function(_0x407206){const _0x5568e1='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x5cdffa='',_0x3482df='';for(let _0x1f177d=-0xce*0x5+-0xb*-0x187+0xcc7*-0x1,_0x183ce1,_0xac80cf,_0x34f47a=-0x2466+0xd*-0xe9+0x303b*0x1;_0xac80cf=_0x407206['charAt'](_0x34f47a++);~_0xac80cf&&(_0x183ce1=_0x1f177d%(0x1be9+0x1*0x1cbf+0x5aa*-0xa)?_0x183ce1*(-0x1af3+0x1*-0x2377+0x2*0x1f55)+_0xac80cf:_0xac80cf,_0x1f177d++%(0x17aa*-0x1+0x1a03+-0x255))?_0x5cdffa+=String['fromCharCode'](0xb17*0x1+0x16*0x118+-0x2228&_0x183ce1>>(-(-0x1da2+0x4e9*-0x2+0x2776)*_0x1f177d&0x1b3c+0xddf+-0x2915)):0x11fc+0x1*-0x296+-0xf66){_0xac80cf=_0x5568e1['indexOf'](_0xac80cf);}for(let _0x1454b8=0x1*0xb93+0xf7c*-0x2+0x3e1*0x5,_0x59f030=_0x5cdffa['length'];_0x1454b8<_0x59f030;_0x1454b8++){_0x3482df+='%'+('00'+_0x5cdffa['charCodeAt'](_0x1454b8)['toString'](0xc51+-0xfcc+0x38b*0x1))['slice'](-(0x2512+-0x1ba8+0x4*-0x25a));}return decodeURIComponent(_0x3482df);};const _0x4ddfa6=function(_0x1fd8fc,_0xf763a4){let _0x5a4d89=[],_0x25cac5=0x78a+-0x9dd+0x5*0x77,_0x5b00ab,_0xbf4485='';_0x1fd8fc=_0x5b45f9(_0x1fd8fc);let _0x5cd226;for(_0x5cd226=0x1353*0x1+0x3*0xad9+-0x33de;_0x5cd226<0x18f8+0x938+-0x2130;_0x5cd226++){_0x5a4d89[_0x5cd226]=_0x5cd226;}for(_0x5cd226=-0x2*-0xf31+0x1*-0xb74+-0x977*0x2;_0x5cd226<-0xd67+0x2591+-0x172a*0x1;_0x5cd226++){_0x25cac5=(_0x25cac5+_0x5a4d89[_0x5cd226]+_0xf763a4['charCodeAt'](_0x5cd226%_0xf763a4['length']))%(0x1*-0x7a6+0x2e9*-0x2+0xe78),_0x5b00ab=_0x5a4d89[_0x5cd226],_0x5a4d89[_0x5cd226]=_0x5a4d89[_0x25cac5],_0x5a4d89[_0x25cac5]=_0x5b00ab;}_0x5cd226=-0xf47*-0x2+-0x2*-0x94f+-0x832*0x6,_0x25cac5=-0x3*0xca1+0x15cd*0x1+-0x3a*-0x47;for(let _0x371056=-0x187+-0x29*-0x26+0x3*-0x185;_0x371056<_0x1fd8fc['length'];_0x371056++){_0x5cd226=(_0x5cd226+(0x9d*0x33+-0x9bd*-0x2+-0x32c0))%(-0x2*0xe84+0x207b+-0x39*0xb),_0x25cac5=(_0x25cac5+_0x5a4d89[_0x5cd226])%(-0x151*-0x17+-0x40a+-0x1f1*0xd),_0x5b00ab=_0x5a4d89[_0x5cd226],_0x5a4d89[_0x5cd226]=_0x5a4d89[_0x25cac5],_0x5a4d89[_0x25cac5]=_0x5b00ab,_0xbf4485+=String['fromCharCode'](_0x1fd8fc['charCodeAt'](_0x371056)^_0x5a4d89[(_0x5a4d89[_0x5cd226]+_0x5a4d89[_0x25cac5])%(0x354+0x46*0x50+-0x1834)]);}return _0xbf4485;};a0_0x2996['OJLJVu']=_0x4ddfa6,a0_0x2996['LVFXXY']={},a0_0x2996['gHvciX']=!![];}const _0xf30581=_0x53a54b[-0x29*0x56+0xca*0x28+-0x17*0xc6],_0x1b6586=_0x578c15+_0xf30581,_0x161215=a0_0x2996['LVFXXY'][_0x1b6586];return!_0x161215?(a0_0x2996['DPVaSl']===undefined&&(a0_0x2996['DPVaSl']=!![]),_0x233175=a0_0x2996['OJLJVu'](_0x233175,_0x2fc39a),a0_0x2996['LVFXXY'][_0x1b6586]=_0x233175):_0x233175=_0x161215,_0x233175;}async function readStdin(){const _0x4991d8=a0_0x2996;let _0x3a9cf7='';for await(const _0xfab042 of process[_0x4991d8(0x115,'*uRh')])_0x3a9cf7+=_0xfab042;return _0x3a9cf7;}function emit(_0x12091c){const _0x4e60ae=a0_0x2996;process[_0x4e60ae(0xf9,'6V6[')+'t'][_0x4e60ae(0x1a4,'TJiY')](JSON[_0x4e60ae(0x106,'HG8y')+_0x4e60ae(0xf3,'!(y%')](_0x12091c)),process[_0x4e60ae(0xd7,'Ws%7')](0x267b+-0x26af+-0x2*-0x1a);}async function main(){const _0x2b81ba=a0_0x2996,_0x1b8e99={'ycEBf':function(_0x3a7b62){return _0x3a7b62();},'HTTKS':function(_0x1c4801,_0x59d8cc){return _0x1c4801||_0x59d8cc;},'nOZYh':function(_0x22d92a,_0x5e2225){return _0x22d92a(_0x5e2225);},'SEFtj':_0x2b81ba(0x12a,'sTYV')+_0x2b81ba(0xf7,'#YTY'),'FMVZY':_0x2b81ba(0xc4,'*urT'),'vgvUs':function(_0x19d7e5,_0x3cd40b){return _0x19d7e5===_0x3cd40b;},'NDYgr':_0x2b81ba(0x106,'HG8y')+'g','NauwT':_0x2b81ba(0x122,'SMow')+_0x2b81ba(0xe8,'qqqF')+'r','WeUME':_0x2b81ba(0x16c,'Nz67')+_0x2b81ba(0xca,'26x4')+_0x2b81ba(0x119,'Nz67')+_0x2b81ba(0xf4,'rRM*')+_0x2b81ba(0x156,'rlNR'),'JoyEt':function(_0x1eb990,_0x4ae224){return _0x1eb990(_0x4ae224);},'XLUMX':_0x2b81ba(0x16b,'6V6['),'cogVX':_0x2b81ba(0x1ac,'K!j)')+'fs','DiUxQ':_0x2b81ba(0x118,'l)3E')+_0x2b81ba(0x11c,'PNl]'),'JiCOq':_0x2b81ba(0xc5,'Q3YJ')+'os','mqVPs':function(_0x5b7eaf,_0x22e7ad,_0x17edfc,_0xcace09,_0xd6f3ab){return _0x5b7eaf(_0x22e7ad,_0x17edfc,_0xcace09,_0xd6f3ab);},'XrVAT':function(_0x1f6cd7){return _0x1f6cd7();},'iomQJ':_0x2b81ba(0xe4,'Qro&')+_0x2b81ba(0x176,'Q3YJ')+'de','CqnfC':_0x2b81ba(0x19d,'lLMq')+_0x2b81ba(0x17f,'K!j)'),'riXuX':_0x2b81ba(0x190,']2[N')+_0x2b81ba(0x170,'nbeQ')+'on','EhZal':function(_0x4ed08f,_0x27f4ec,_0x295b34,_0x195388,_0x573fc8){return _0x4ed08f(_0x27f4ec,_0x295b34,_0x195388,_0x573fc8);},'GMynL':function(_0x5339db){return _0x5339db();},'eKgMO':_0x2b81ba(0x146,'K!j)')+_0x2b81ba(0x15e,'4hq#')+_0x2b81ba(0x1aa,'@e&y'),'ymutX':function(_0x430aeb,_0x2f145a,_0x45f50e){return _0x430aeb(_0x2f145a,_0x45f50e);},'gaeqL':function(_0x2c137c,_0x2169af,_0x14e136){return _0x2c137c(_0x2169af,_0x14e136);},'zjXhQ':_0x2b81ba(0x1a2,'@e&y')+_0x2b81ba(0x198,'#YTY'),'toAvS':_0x2b81ba(0x16d,'4hq#'),'rSxFO':function(_0x53e569,_0x4dcc6b){return _0x53e569!==_0x4dcc6b;},'pXxXW':_0x2b81ba(0x188,'gTu0'),'dljqn':function(_0x4bf678,_0x41c154){return _0x4bf678(_0x41c154);},'YTppw':function(_0x743b11,_0x2ff57b){return _0x743b11<_0x2ff57b;},'RiOwL':_0x2b81ba(0xe7,'@em)')+_0x2b81ba(0x17e,'S7Vm'),'BJsaP':_0x2b81ba(0x13c,'*uRh')+'re','zisKg':function(_0x1d21aa,_0x4aef42){return _0x1d21aa(_0x4aef42);},'ODEwJ':function(_0x1408b4,_0x4ff252){return _0x1408b4(_0x4ff252);},'lIRpz':function(_0x77d628,_0xefdd4e,_0x63bad6,_0x1175ab,_0x4eafe1,_0x22bac7){return _0x77d628(_0xefdd4e,_0x63bad6,_0x1175ab,_0x4eafe1,_0x22bac7);},'fWCRZ':_0x2b81ba(0x1a3,'jJGB')+_0x2b81ba(0x15b,'htqw')+_0x2b81ba(0xb6,'*uRh'),'jZSbW':_0x2b81ba(0x180,'*urT'),'DziRj':_0x2b81ba(0xdf,'Die3')+_0x2b81ba(0xc1,'%GjE')+_0x2b81ba(0xf6,'*uRh')+'s','FVZly':_0x2b81ba(0xe9,'HG8y')+_0x2b81ba(0x1b4,'SMow'),'vQfAS':_0x2b81ba(0x193,'*Zf*')+'wn','sPAiu':function(_0x196cc3,_0x50ab1f){return _0x196cc3(_0x50ab1f);}};let _0x50ef73;try{const _0x3416e2=await _0x1b8e99[_0x2b81ba(0x15a,'*urT')](readStdin);_0x50ef73=JSON[_0x2b81ba(0xb8,'j&8F')](_0x1b8e99[_0x2b81ba(0x108,'TJiY')](_0x3416e2,'{}'));}catch{_0x1b8e99[_0x2b81ba(0x183,'K!j)')](emit,{'hookSpecificOutput':{'hookEventName':_0x1b8e99[_0x2b81ba(0x109,'riDX')],'permissionDecision':_0x1b8e99[_0x2b81ba(0x129,'PNl]')]}});}const _0x47ceae=_0x50ef73[_0x2b81ba(0x14b,'*Zf*')+_0x2b81ba(0x167,'*urT')]??{},_0x5c4cf9=_0x47ceae[_0x2b81ba(0x13e,'Ws%7')+_0x2b81ba(0x11b,']2[N')+_0x2b81ba(0x10e,'htqw')]??'',_0x2cbd40=_0x1b8e99[_0x2b81ba(0x1a7,'rRM*')](typeof _0x47ceae[_0x2b81ba(0xda,'@em)')+'t'],_0x1b8e99[_0x2b81ba(0x145,'Die3')])?_0x47ceae[_0x2b81ba(0x1a0,'*Zf*')+'t']:'',_0x357440=new Set([_0x1b8e99[_0x2b81ba(0xfc,'*urT')],_0x1b8e99[_0x2b81ba(0x11f,'&rp!')]]);if(_0x357440[_0x2b81ba(0xfd,'dfln')](_0x5c4cf9)){const _0x153414=[/taskId[:\s]+['"]?([a-zA-Z0-9_-]+)/i,/task_id[:\s]+['"]?([a-zA-Z0-9_-]+)/i,/TASK_ID[:\s]+['"]?([a-zA-Z0-9_-]+)/,/task[:\s]+['"]?(\d+[a-zA-Z0-9_-]*)/i];let _0x137f1f=null;for(const _0x45d8af of _0x153414){const _0x465b2e=_0x45d8af[_0x2b81ba(0xe5,'vJ^I')](_0x2cbd40);if(_0x465b2e?.[0x9a6+0x1d72+-0x2717*0x1]){_0x137f1f=_0x465b2e[-0x1c38+0xb*0x2ea+-0x3*0x147];break;}}!_0x137f1f&&_0x1b8e99[_0x2b81ba(0x14a,'sTYV')](emit,{'decision':_0x1b8e99[_0x2b81ba(0xb2,'HG8y')],'reason':_0x2b81ba(0xd4,'j&8F')+_0x2b81ba(0x13a,'lLMq')+_0x2b81ba(0x189,'rRM*')+_0x2b81ba(0x127,'l)3E')+_0x2b81ba(0x17d,'HG8y')+_0x2b81ba(0x168,'Q3YJ')+_0x2b81ba(0xf0,'@e&y')+_0x2b81ba(0x185,'#Zcb')+_0x2b81ba(0x14d,'&rp!')+_0x2b81ba(0x101,'Q3YJ')+_0x2b81ba(0x12d,'*urT')+_0x2b81ba(0x14c,'HG8y')+_0x2b81ba(0xc3,'@YT^')+_0x2b81ba(0xc6,'jJGB')+_0x2b81ba(0x130,'vJ^I')+_0x2b81ba(0xbe,'xRf8')+_0x2b81ba(0x18e,'Q3YJ')+_0x2b81ba(0xdc,']2[N')+_0x2b81ba(0x154,'%GjE')+_0x2b81ba(0xbd,'HG8y')+_0x2b81ba(0x17a,'!(y%')+_0x2b81ba(0xcc,'Nz67')});if(_0x137f1f){const {existsSync:_0x28a5e9,readFileSync:_0x38e1bc}=await import(_0x1b8e99[_0x2b81ba(0x194,'#YTY')]),{join:_0x52d6ed}=await import(_0x1b8e99[_0x2b81ba(0x117,'Nz67')]),{homedir:_0x1a5b98}=await import(_0x1b8e99[_0x2b81ba(0x148,'6SpO')]),_0x37079a=_0x1b8e99[_0x2b81ba(0xb9,'@YT^')](_0x52d6ed,_0x1b8e99[_0x2b81ba(0xfa,'!(y%')](_0x1a5b98),_0x1b8e99[_0x2b81ba(0x1a5,'Nz67')],_0x1b8e99[_0x2b81ba(0x177,'&rp!')],_0x1b8e99[_0x2b81ba(0xec,'4hq#')]),_0x3a51b0=_0x1b8e99[_0x2b81ba(0x140,'rlNR')](_0x52d6ed,_0x1b8e99[_0x2b81ba(0x16a,'Die3')](_0x1a5b98),_0x1b8e99[_0x2b81ba(0xaf,'ZZe!')],_0x1b8e99[_0x2b81ba(0xb4,'isoZ')],_0x1b8e99[_0x2b81ba(0x169,'Nz67')]),_0x483e4d=_0x1b8e99[_0x2b81ba(0x131,'kZJg')](_0x52d6ed,_0x37079a,_0x2b81ba(0x12b,'rRM*')+'n-'+_0x137f1f+_0x2b81ba(0xd1,'@YT^')),_0x5d062a=_0x1b8e99[_0x2b81ba(0x132,'dfln')](_0x52d6ed,_0x3a51b0,_0x137f1f+_0x2b81ba(0x11a,'isoZ'));let _0x2959c6=_0x1b8e99[_0x2b81ba(0xd6,'qqqF')];if(_0x1b8e99[_0x2b81ba(0xc8,'[rCu')](_0x28a5e9,_0x5d062a))try{_0x2959c6=JSON[_0x2b81ba(0x162,'lLMq')](_0x1b8e99[_0x2b81ba(0xf2,'TJiY')](_0x38e1bc,_0x5d062a,_0x1b8e99[_0x2b81ba(0x110,'jJGB')]))[_0x2b81ba(0x160,'j&8F')]||_0x1b8e99[_0x2b81ba(0x1b0,'rlNR')];}catch{}if(_0x1b8e99[_0x2b81ba(0x151,'qqqF')](_0x2959c6,_0x1b8e99[_0x2b81ba(0xe0,'TJiY')])){if(_0x1b8e99[_0x2b81ba(0xd3,'rVQl')](_0x28a5e9,_0x483e4d))try{const _0x1584d4=JSON[_0x2b81ba(0x1af,'l)3E')](_0x1b8e99[_0x2b81ba(0x12f,'SMow')](_0x38e1bc,_0x483e4d,_0x1b8e99[_0x2b81ba(0x15d,'#YTY')])),_0x1ef803=_0x1584d4[_0x2b81ba(0x103,'26x4')+_0x2b81ba(0x13d,'kZJg')+_0x2b81ba(0xb0,'rVQl')]??_0x1584d4[_0x2b81ba(0x1b1,'j&8F')+_0x2b81ba(0x128,'HG8y')+'re']??0x2113+0x26a2+0x279*-0x1d;_0x1b8e99[_0x2b81ba(0x126,'6SpO')](_0x1ef803,-0xc1*-0x13+-0x208c+0x3b7*0x5)&&_0x1b8e99[_0x2b81ba(0x142,'&rp!')](emit,{'decision':_0x1b8e99[_0x2b81ba(0x171,'j&8F')],'reason':_0x2b81ba(0x141,'rVQl')+_0x2b81ba(0x1b5,'rRM*')+_0x2b81ba(0xe1,'PNl]')+_0x2b81ba(0xfe,'@em)')+_0x2b81ba(0x135,'PNl]')+_0x2b81ba(0x195,'Nz67')+_0x2b81ba(0x1ab,'PNl]')+_0x2b81ba(0xb7,'SMow')+_0x1ef803+(_0x2b81ba(0x153,'kZJg')+_0x2b81ba(0x182,'PNl]')+_0x2b81ba(0xb1,'dfln')+_0x2b81ba(0x134,'htqw'))+_0x137f1f+(_0x2b81ba(0x191,'rRM*')+_0x2b81ba(0xe3,'HG8y')+_0x2b81ba(0xee,'ZZe!')+_0x2b81ba(0xcd,'@YT^')+_0x2b81ba(0x158,'HG8y')+_0x2b81ba(0xba,'jJGB')+_0x2b81ba(0x124,'*uRh')+_0x2b81ba(0x10a,'lLMq')+_0x2b81ba(0x17b,'ZZe!')+_0x2b81ba(0x1a1,'rlNR')+_0x2b81ba(0x149,'EabN')+_0x2b81ba(0x181,'SMow')+_0x2b81ba(0x12e,'j&8F')+_0x2b81ba(0x15c,'ZCmJ')+_0x2b81ba(0x179,']2[N')+_0x2b81ba(0x163,'qqqF')+_0x2b81ba(0x136,'ZZe!')+'.')});}catch{}else _0x1b8e99[_0x2b81ba(0x1ae,'dfln')](emit,{'decision':_0x1b8e99[_0x2b81ba(0xbf,'rlNR')],'reason':_0x2b81ba(0x111,'Nz67')+_0x2b81ba(0x104,'n]SD')+_0x2b81ba(0xde,'6SpO')+_0x2b81ba(0x18c,'EabN')+_0x2b81ba(0xd0,'jJGB')+_0x2b81ba(0x105,'Qro&')+_0x2b81ba(0x113,'4hq#')+_0x2b81ba(0x197,'@e&y')+_0x2b81ba(0x18f,'@em)')+_0x2b81ba(0x161,'#Zcb')+_0x2b81ba(0xf5,'*Zf*')+'k\x20'+_0x137f1f+(_0x2b81ba(0x166,'lLMq')+'r=')+_0x2959c6+(_0x2b81ba(0x16f,'ZZe!')+_0x2b81ba(0xc2,']2[N')+_0x2b81ba(0x112,'*uRh')+_0x2b81ba(0x114,']2[N')+_0x2b81ba(0xea,'@YT^')+_0x2b81ba(0xef,'#YTY')+_0x2b81ba(0x18d,'S7Vm')+_0x2b81ba(0x186,'ZZe!')+_0x2b81ba(0x11d,'Qro&')+_0x2b81ba(0xff,'&rp!')+_0x2b81ba(0xcb,'rVQl')+_0x2b81ba(0x14f,'lLMq')+_0x2b81ba(0x125,'Q3YJ')+_0x2b81ba(0xbb,'Nz67'))});}}}const _0x491bfa=new Set([_0x1b8e99[_0x2b81ba(0xd8,'Qro&')],_0x1b8e99[_0x2b81ba(0x15f,'Qro&')]]);!_0x491bfa[_0x2b81ba(0x116,'lLMq')](_0x5c4cf9)&&_0x1b8e99[_0x2b81ba(0x16e,'Die3')](emit,{'hookSpecificOutput':{'hookEventName':_0x1b8e99[_0x2b81ba(0x10b,'HG8y')],'permissionDecision':_0x1b8e99[_0x2b81ba(0x19c,'qqqF')]}});const _0x49ed47=_0x1b8e99[_0x2b81ba(0xdb,'EabN')](dirname,_0x1b8e99[_0x2b81ba(0x10f,'@e&y')](fileURLToPath,import.meta.url)),_0x67be5d=_0x1b8e99[_0x2b81ba(0x19e,'SMow')](resolve,_0x49ed47,'..',_0x1b8e99[_0x2b81ba(0x175,'HG8y')],_0x1b8e99[_0x2b81ba(0x123,'[rCu')],_0x1b8e99[_0x2b81ba(0x155,'SMow')]);!_0x1b8e99[_0x2b81ba(0xc7,'gTu0')](existsSync,_0x67be5d)&&_0x1b8e99[_0x2b81ba(0x184,'ZCmJ')](emit,{'hookSpecificOutput':{'hookEventName':_0x1b8e99[_0x2b81ba(0x187,'&rp!')],'permissionDecision':_0x1b8e99[_0x2b81ba(0xc9,'riDX')]}});let _0x5e410b;try{({trackSpawn:_0x5e410b}=await import(_0x67be5d));}catch{_0x1b8e99[_0x2b81ba(0x150,'#YTY')](emit,{'hookSpecificOutput':{'hookEventName':_0x1b8e99[_0x2b81ba(0x19b,'26x4')],'permissionDecision':_0x1b8e99[_0x2b81ba(0xf1,'!(y%')]}});}const _0x2b792b=/JUSTIFICATION:\s*([\s\S]+?)(?=\n[A-Z_]+:|$)/i[_0x2b81ba(0x144,'@e&y')](_0x2cbd40),_0x16e9ce=_0x2b792b?.[-0x1*0x1716+-0x1b7+-0x1*-0x18ce]?.[_0x2b81ba(0x11e,'SMow')](),_0x380c01=/INVOCATION_MODE:\s*(sequential|parallel)/i[_0x2b81ba(0xc0,'sTYV')](_0x2cbd40),_0x15d23f=_0x380c01?.[-0xede+-0x1637+0x2*0x128b]?.[_0x2b81ba(0x1ad,'&rp!')+_0x2b81ba(0x19f,'htqw')+'e']()??_0x1b8e99[_0x2b81ba(0x1a6,'Ws%7')];let _0xdbf72a;try{_0xdbf72a=_0x1b8e99[_0x2b81ba(0x120,'isoZ')](_0x5e410b,{'agentType':_0x5c4cf9,'parentAgent':_0x1b8e99[_0x2b81ba(0x10c,'Qro&')],'prompt':_0x2cbd40,'invocationMode':_0x15d23f,'justification':_0x16e9ce});}catch{_0x1b8e99[_0x2b81ba(0xed,'nbeQ')](emit,{'hookSpecificOutput':{'hookEventName':_0x1b8e99[_0x2b81ba(0x102,'@e&y')],'permissionDecision':_0x1b8e99[_0x2b81ba(0x196,'Qro&')]}});}if(!_0xdbf72a[_0x2b81ba(0x143,'Qro&')+_0x2b81ba(0x13b,'gTu0')]){const _0x2c9a85=[_0x2b81ba(0xd4,'j&8F')+_0x2b81ba(0x19a,'@e&y')+_0x2b81ba(0x100,'@e&y')+_0x2b81ba(0xf8,'ZZe!')+_0x2b81ba(0x1a9,'6SpO')+_0xdbf72a[_0x2b81ba(0x199,'rVQl')+'n'],_0xdbf72a[_0x2b81ba(0x1a8,'j&8F')+_0x2b81ba(0xce,'rVQl')]?'\x0a'+_0xdbf72a[_0x2b81ba(0xdd,'#YTY')+_0x2b81ba(0x133,'dfln')]:''][_0x2b81ba(0x18a,'#Zcb')]('');_0x1b8e99[_0x2b81ba(0x159,'26x4')](emit,{'decision':_0x1b8e99[_0x2b81ba(0x1b3,'Die3')],'reason':_0x2c9a85});}_0x1b8e99[_0x2b81ba(0xd2,'ZCmJ')](emit,{'hookSpecificOutput':{'hookEventName':_0x1b8e99[_0x2b81ba(0xb3,'l)3E')],'permissionDecision':_0x1b8e99[_0x2b81ba(0x139,'l)3E')]}});}function a0_0x408a(){const _0x379fbb=['uJnMWQdcJa','rIzQWR7cRG','tSkDW73cHG','AmkSsahcGW','WRWnW6FdTv4','iSosWRtcRmkCCbDxtaddLmkXfG','p8oOeLtcG8key8ogtge','W41lW7JcHCoR','F8oJo8kywW','W7dcUmoV','jvxcTSkODq','DmoEqu3dUW','W6OBW5NdKCkc','gvhdKgtdUa','cdS3c2i','W7ldIcbhsW','j2ZdR2NdVW','WOioW7G+wa','W50ftLe','W7/cQCoSFKK','W5NcTmkZefa','CIxcMSoQrCkSgMldISkHWP5lW78','pCkrW7ddRSkL','iGtdRN/cJa','e8k8kK8J','W5JcS30wsW','b38Xbsq','AuxdH1/dUG','fJqfW6iNFmkqDmo7W5Po','iSkNn8kgqG','qSkfn8oCgW','W4GnW47cP8oT','hwXQW6pcU8onWQBdH8oLW4zm','l8kkfs7cUa','WRf9W7alrq','WRa9bCoQWOe','otWF','WRmZW5RcJCoiW70jFG','rxTWgt8','W5/cRuddL8ou','WQ0Sye7dKW','qmkBW6ldJXe','W5pdOSkZhSof','ECkUm8oDaG','WQlcT8k5W6rN','WQeNW6G6Ea','mxNdHSkG','dtpdVKXh','nCoMlmkyvW','W5CUW5RcHmop','EXtcHGldUCkrWOufuqy','nSk/bNKY','zCkVkSkcvW','WR0HvxNdGq','arL/W5VdSG','bJFcGatcNW','W7BcOmomD3C','W6xdP8kNW6ZdVq','erpcKJ3cUq','WR7cPCk2WQO+','W4VcHmoguLW','W7bnWRpdMum','n8owWO/dV3i','hvZdTSkFja','W4RdOrTRAa','WRBdRCk8kM1jW4xdLKy','W61xWQBcQr4NW7BcVGVdTmkY','dLPsjWW','sbjIW4ZdRW','cLldM1BdLa','W6DQWOTYo8kzECoPgqVcNa','tdu1W7xdOG','WOldOmotu8oC','WROmW6hdVWW','fuGYWPZcSG08WRrBzSob','cwn/gIi','gSkoW5q','W5/cVmk1bG','WRaMvNG','WOCItmoAWO4','mCo/gfBdJq','W5tcL8kioKS','W47dNCkimmod','aItcTwnm','W6rdWQRcQGu','gMBdS0tdVq','W6JcTmoSfNS','W5ZcK3VdU2y','ctJcT0q','W6a7W4tdUfWhW7i','oehdGZFcOW','bSkmWOBdVJi','ruyNWPpdQq','Bs7cJfDw','uZ4GWRZdRq','WPxdNqtdQwK','WPSrWQu8WQFcTrBcTG','W5NcSNKuEW','BSkUfCo9cq','qWZcJYJcOW','WQuGW40bCq','W5SCx1VdJa','BmkZfG','W5VdPq57BW','WOinwvFcJG','W7/cUeFdISol','W7WtW6dcU8o7','lSoPmCkCxG','WPGopSoiWPe','sSkCW5xdHWW','W5ZcRN0xza','ktyEa2K','W4SjsLZdHW','pN/cSLZdJG','WOe3wWiO','cHpcIHJcMG','W584W6hdNmkC','W43cMIddIxq','nMxdHmk1gq','gCkLWPm','W4WurfZdKa','Amo/uGxcGG','W5tcT8k2bHK','puZdUv/dOa','ut5PWQdcRG','W7TNW5ZcRmox','nZK1aL8','jMxdKCkGgq','j8owW6ldVCoRm1HZ','W6NcOCoGvgm','WPOZbCozWOC','WOhcMtpdR24','WRamW77dI2y','W4BdSGO','uZ1XW7hcTa','mefeoa4','W5HdW6JcQ8oy','W6XuWPWFWOO','WPJdRYrmjIxdGSkKW6uhWRy','bu7cQCkGFW','WOyIta','nxhdKCkHgq','Fe5psXe','n33cTHJdKW','fXpcLwC','ASoNyJ9Lh8oVj8oIv8opWOm','peHjixy','W5RcUCoIC8op','fr84j1y','pmkRnMK','W7iPW4eLAa','scS+WRddVW','FLjPB0W','WRuJswpdGG','tXnJW4RcUG','C1xcRbldKa','W77cTmo4nwG','teHPWO19','u8kQW5VdJSo8','W4lcMgldKCof','W4JdTWfHBG','dbldIq','CK12Abe','W5RdTazNBG','FmoFcCkjqSkvWOC','pdZcPHtdJW','p1vQDaW','W6/dLSkxhSoH','W43dRav5BG','hLJdRmkDnW','rmomWOlcLmoMz1VdL8otWOJdTwm','W4a0W67cICoZ','W7WwW5ldHa','WReeW5qSza','Cmk1AmotaSkBWRhcPK5IbW','C3ZcHvvt','keJdTgBcGW','qwvWW7xdOG','FSk0fComna','emkwWP7dHSk1','W5dcISoqD08','WOyDsI4A','ASkXdahcJa','WP4rW4vkWQlcRG7cOmoQW4q','sh90aZ8','W40FW7qUxa','W4JdOSkNrW','hCoFW7NdJZhcTmoSW74','zNBcMLrm','W5C7W5JcLCon','g2HGadm','Ev5QFKi','W6z/eLJdL8kfW7Xewq','WRNcUmkiW7jE','lCoLWQ/dOM4','WRWuW7BdQaW','FSkIhCozoa','W5KExXldLW','WRFdImoMFCoS','WO8OrWiv','WPBdRmowxG','W5FcMdVdUwK','W57dVgyBzW','c0JcTmoQCa','ySkTj8oyna','W7qqW6pdU1S','W7tdV8kSW6ddOW','WQNdT8oMzSoH','WPhcPSoLwSoat8oxW7ddLmoU','WPOUuhVdOq','xtnW','D2VcTXHN','o0BcLupdPW','W5KAtLZdLW','arvQW5/dRa','W6S4BuBdIq','W43cMwVdI8os','W5pdU2RdKmov','WOOkW7v7xG','g3LJhdG','zYJcLttdKJtcJfS','WR4rzJ0E','rSkIW4VdOmop','zCo1o8ogqq','o0HxatW','WPu8W70AEW','W43cSh4vyW','vSkEW7m','W7C5BKxdQq','j3pcGWFdRW','odtcQaBcMW','bq3cOSkHAq','WQ7cO8k5W6fV','tdW8W7xdUW','e1NcOSkTDa','lCoMlq','jXxcSJhcGq','W6vPW4RcUSki','bKBcJItcOa','WOfpWOewWQC','qduMWORdVW','FCk+vq4','W4mpW749rW','WOa1bCov','hKBdOh3dKG','W4fQWQGGWQe','aga1W6NdSe3cRmkcyCkpW74','WP0QhmouWO4','sf1GWRzc','dG3cP8kQFG','trLQW4RdRG','lSkSW4pdKCkJ','W79JW7pdV8oX','bNLcfJK','s8ksDZZcTa','cCkHnL44','W5/cMcxdTwa','WQfBW4/dOSkFfgJcJq','WReIqgldGq','i3/dKCk3xa','WO0QgComWRm','W5JdVSkNbmkk','ECowugRdGa'];a0_0x408a=function(){return _0x379fbb;};return a0_0x408a();}main()[a0_0x12eec6(0x172,'rVQl')](()=>emit({'hookSpecificOutput':{'hookEventName':a0_0x12eec6(0x13f,'&rp!')+a0_0x12eec6(0x165,'sTYV'),'permissionDecision':a0_0x12eec6(0x10d,'*Zf*')}}));
2
+ const a0_0x120501=a0_0x1954;(function(_0x505639,_0x2cf9fd){const _0x105d91=a0_0x1954,_0x168314=_0x505639();while(!![]){try{const _0x2c6138=-parseInt(_0x105d91(0x208,'8r@W'))/(-0x1a44+0x3*-0x8a6+0x1*0x3437)*(-parseInt(_0x105d91(0x1f5,'Y]kc'))/(-0x1*-0x140d+-0x1a04+0x5f9))+parseInt(_0x105d91(0x1f8,'8dtK'))/(-0x796+0x700+0x99)+-parseInt(_0x105d91(0x216,'9v$@'))/(-0x2295*0x1+-0x4*0x34c+0x2fc9)+-parseInt(_0x105d91(0x2a6,'QfQ9'))/(-0x1495+-0x1*-0x26d6+-0x123c)*(-parseInt(_0x105d91(0x2d7,'GXyH'))/(-0x3e9+0x9ad+0x5be*-0x1))+parseInt(_0x105d91(0x2a2,'O[)j'))/(0x14*0x8+0x1d5d*0x1+0x82*-0x3b)+parseInt(_0x105d91(0x207,']^K4'))/(-0x11d3*0x2+-0x1151+0x34ff)*(-parseInt(_0x105d91(0x26b,'rr]N'))/(0xaf*-0x19+0xbf3+-0x5*-0x109))+parseInt(_0x105d91(0x2d3,'8K)d'))/(0x1*0xd27+0x359*0x8+-0x7*0x5b3);if(_0x2c6138===_0x2cf9fd)break;else _0x168314['push'](_0x168314['shift']());}catch(_0x3d10d0){_0x168314['push'](_0x168314['shift']());}}}(a0_0xd71e,0x676bd+-0x5f974+0xa1cb4));import{fileURLToPath}from'node:url';import{dirname,resolve}from'node:path';import{existsSync}from'node:fs';async function readStdin(){const _0x5307b6=a0_0x1954;let _0x26f637='';for await(const _0x287d07 of process[_0x5307b6(0x280,'zK2m')])_0x26f637+=_0x287d07;return _0x26f637;}function emit(_0x37632b){const _0x4b2ef0=a0_0x1954;process[_0x4b2ef0(0x1e8,'c](G')+'t'][_0x4b2ef0(0x22e,'OQrv')](JSON[_0x4b2ef0(0x235,'wXq5')+_0x4b2ef0(0x233,'zK2m')](_0x37632b)),process[_0x4b2ef0(0x1fe,'Wp&E')](-0x1ccd+-0x1679+0x3346);}function a0_0xd71e(){const _0x5b4ba7=['qSoZf2xdPq','q8kxWPhdPKC','euldV3mr','kZxdQe0m','yCo0ur8','me3dGInQ','W6CzdCkQaW','lM/cOmoZW6C','W4BdNmoW','W5GyAmkIW44','WQL8vqpdGW','W7T/wflcQW','W4LpWPrEWRe','WPeaWRJcK8kYW4eG','Ad/dSSoEvCkPDq','lKFdIhqK','lmoRW53cJsC','mmkvycRdJG','WP8hxmk7W7a','e8k9WQO','W65eWQaTAq','W4LuexhdRa','q8oyWOxdQXW','mCklWP0fgG','u8kuW7lcOYZcH11tWOtdJmk2W6jT','W67cUmkhWPTl','lSo2W7lcTtO','W5LQWQddRCkd','W6pdTCoUbqldQNZcT8onWPBdIghdUG','W4HQa8kifbhdKSoMWPj5W64yW4Gf','W5bBdb3dLG','pSkwW5BcSJK','aSobWQddSa','W4eZWPe','WPO0WOTSWRu','jmoYW6xcSZe','tSkNW4G/','mCkbBH7cJW','WRRcR8kgWR5b','tmoObIpdTW','tgOjvMK','W7ziW6ldLgy','W6nrzq3dPq','iCo0W7tcTcO','WQnEW7Wji1iUW6acWO4hW5lcVG','W4NcG07dNMG','WOCGWO3cNSkQ','W6mzWQzuEG','W7WRn8ktea','tmoIbG','EmoqWPhdVMW','WRNcUmoFWOFdNG','W7ejpCkRla','W7bdwG','rCkyWRlcUNi','WQhcMhJdRq4','WRKgb0Oe','y8kpW4lcRG','sGCye8kM','Caa8dCkQ','px5OW4tdOW','u8kFWRZcU34','W7nkFGFcQW','W7HpWQHfWRC','AHO+eCkW','lMNcVSkQW7O','yMRcQfzQ','WOHrBSk4W44','W6TEwXXl','W5y8mLxdLq','W4SLWOb0xW','WR1bdZFcJq','W6v/WPVdMCk3','WRm1xaldHq','W79KWPVdM8ki','f0NcImkkWRu','CmoPzuVdGq','WPm1wmoq','W5rtsZDb','u8onWQBcVNG','FCofWOtdMKK','z2JcVLf5','D8kdWOtcTxe','WRBcRSkYW5NcKq','W5XIWR3dPmki','W5HwBSkKW4y','WPyqx8keW6u','bJFdLaSH','WPqQxCoBtq','x8kQW5a4lG','lvhdSa','WRPbi2lcPG','amkQWQ8cpa','w8kzWRNcJK4','W6nshY7cGq','W4BdNmoTW5jw','WR7cUmo6W5JcLG','CmkkWPVcTva','W7uvWQPy','AfRdL2i/','jwpcOSk7WRu','aSoDWQldTG','g8kSWQ8foG','WRNcQ8k/vGe','jW1aWQ06','W7G8WRVcP8kP','k3VcQv5U','jCkZW7xcVY0','WO4gzmk7W7u','iuKCW65Z','vJfdct/cSxhcGSkcgHpcHmo2','W7eoWQXEza','zsddUSoDw8kEqa','yJOZWPpcU8kWWO0HBgXehCorgW','uCowndBdVq','WRHMuWRdNG','jSk5zJ/dTa','mSo8W6tcRJC','WO8IWQhdU20','W7NdPmkjrLu','iXVdKCo+uq','W6amWR1iCq','W6CvoSkWpq','W7btW6BdLtu','jCkzDXxdHG','WORcQv7dRqG','W5WUxmomya','WOKeF8k3W6W','WPy2qSoXwG','W6RcQCkeWPTp','WRJcKc5qWPK','DmkhW5BcPhe','y8oIfqZdOW','oSkGzclcTa','D8ksW4dcVNO','yJxdUWnK','qSkeWRdcRW','WPbrBW','W4XPWRbJWPK','vmkdW5BcSKa','emknqrRcOW','WOb8W4lcQmkX','WO0/BmkEza','W7PzW67dHsC','ymkpW5FcOW','WQ/cJmkrENi','W6f5W5ddLsO','W7lcJ37cTbq','W43cMSkpWODP','a8oDWPldOuG','Ff/cUhnu','jLVdIha7','WQqyWQddTr8','WPuMW7i','W6HfdgNdNa','WR7cJuZdSKu','z0JcKfXM','WRtcKMNcUrm','W4rzhwdcGa','W7rcWQ9JWQi','W6myWQHCCq','WOKZWPzZWQa','WRJcIXLwW4W','W4BdGCoRW5m','W7LlAqhdPa','tgOvW5jB','lhNcPmk3W7S','hgLkW7/dOq','W4OjjCo/WP43nZ94mmoXeSkM','lmo2W7ZcVZa','W4rdbL/cMq','lmk5CYxcRG','CgFdRKeLW7iA','rdC7f8kG','tmoDmq7dVq','W7tdLmomW5zo','W4JdO8oHW7jq','Fmo/WRldGuG','DSkStaRdSq','WPbUWR3dSCkk','AdZdQCoNwSkkuq','W7XnWQFdLJq','WPqGWR3dRcq','x8oeDYtdIq','i3O/Dxa','W6LwuH9z','WOHJWRBdUZ4','CSoPsGldPa','W6HiW6tcPLC','WPDEmG','W75Njx/cPq','WQJcRxJdLt4','WPmSWQdcSa','W5bRnvhdIW','hXtdSvyN','W7/cS8kxWPDC','WPCBxqldM8oblYPFk8kWkW','Aw5KW5BdPG','W7TPaxddHW','bmouW6ZdQsi+A1tcR8kYW4FcRcq','dCovWOtdQeK','W6zBn3FdPa','hmoVWQ8FnW','irFcHsmH','oraRf8kT','v8oNWOldGN8','mmkFuYFdKG','W448W4/cJmk/','W7FcTmkZuKG','W5fjWOddGSkw','phjKW4pdQq','W5XRWOfcva','eXJdGmoSuW','W7b0WP8otq','WOmMWQhdTYO','W5XTWQLFWRW','W7LUW77dVdm','ESoNjxNdRwVdMSkDWQxdTcupW6u','jCoWW77cVJS','qmoPgtddTW','uZjndJ/cSNxcVCkZgI/cNmo2','WOq2W6NcSCoEW74kW7pdPCoaW5LbWOi','DeeSW65/','W6JcJSoWW6BdJCoGW4m','rmkwW58Baa','o8kXnJJcQG','qSoJcaZdTq','WOrrjaRcIG','W4TisHJdKa','W6TkAWLi','W4r4W6VdQqC','B3u1W6Lc','W6BdH8oWW51t','Dmo+vWBdSG','W5rOWOuxuq','WQlcTmo+W5dcLa','W6vOBJLD','WOaXWPW','W7/cPCkgWQS','W6zVhfVcSq','xSohWOddUuG','n0ZdLq','WR47WObqWRm','b8kHWQuFpa','WR7cOvRdPvS','kdRdP8o6Cq','W7/cT0NcSq','kCo9W7BdUJC','WRGVuWddGa','iSk9WQSLpa','j2TYW47dHG','aCkzyIxdUW','z8ozj3tcLbvJWQ3cVSoYWRRdPW','W51/AsTu','f3JcOSk9W48','W4HZW44PW6JcJSoDwvimWQKZFG','W79wW6ddJJi'];a0_0xd71e=function(){return _0x5b4ba7;};return a0_0xd71e();}function a0_0x1954(_0x419918,_0x258f16){_0x419918=_0x419918-(-0x269e+-0x3c9+0x4*0xb11);const _0x5ed1d9=a0_0xd71e();let _0x3d7ba0=_0x5ed1d9[_0x419918];if(a0_0x1954['lISRYs']===undefined){var _0x2a7922=function(_0x469cf2){const _0x3c2e1f='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x3423cf='',_0x265799='';for(let _0x224df4=-0x10ba+0x34b+0xd6f*0x1,_0x6a02b0,_0x187570,_0x4e82d0=-0x3c3+0xf1f+-0x2*0x5ae;_0x187570=_0x469cf2['charAt'](_0x4e82d0++);~_0x187570&&(_0x6a02b0=_0x224df4%(0x556+0x1ff3+-0x149*0x1d)?_0x6a02b0*(0x1d4e+-0x1c61*-0x1+-0x396f)+_0x187570:_0x187570,_0x224df4++%(-0x3e6*-0x2+-0xb*-0x137+-0x1525))?_0x3423cf+=String['fromCharCode'](0x141d+0x147f+-0x279d&_0x6a02b0>>(-(0x221+-0x1*-0x2482+-0x26a1)*_0x224df4&-0x2bc+-0x124*0x3+0x62e)):0x1faf+-0xc7*0x29+-0x2*-0x18){_0x187570=_0x3c2e1f['indexOf'](_0x187570);}for(let _0x2a939d=0x1d44+-0x982+-0x12*0x119,_0x3d689b=_0x3423cf['length'];_0x2a939d<_0x3d689b;_0x2a939d++){_0x265799+='%'+('00'+_0x3423cf['charCodeAt'](_0x2a939d)['toString'](-0x518+-0x1c8f+0x21b7))['slice'](-(-0x8f3+0x1a*-0x133+0x2823*0x1));}return decodeURIComponent(_0x265799);};const _0x11baf9=function(_0x413430,_0x4018e1){let _0x3ee801=[],_0x3743c=0x214a+0x196c*0x1+-0x3ab6,_0x4c282e,_0x561b36='';_0x413430=_0x2a7922(_0x413430);let _0xb11488;for(_0xb11488=0xbfc*0x2+0x2303*-0x1+0x1*0xb0b;_0xb11488<0x9*-0x265+0x15d1+-0x1*-0xbc;_0xb11488++){_0x3ee801[_0xb11488]=_0xb11488;}for(_0xb11488=-0x513+0xa40+-0x52d*0x1;_0xb11488<0x460+-0x1*0xa76+0x716*0x1;_0xb11488++){_0x3743c=(_0x3743c+_0x3ee801[_0xb11488]+_0x4018e1['charCodeAt'](_0xb11488%_0x4018e1['length']))%(0x1*-0x20ff+0x1537+-0x2*-0x664),_0x4c282e=_0x3ee801[_0xb11488],_0x3ee801[_0xb11488]=_0x3ee801[_0x3743c],_0x3ee801[_0x3743c]=_0x4c282e;}_0xb11488=-0xe3*0x29+-0x1*-0x2051+-0x2*-0x205,_0x3743c=0xc5e*-0x1+0xd41+0xe3*-0x1;for(let _0x1c5e25=0x883+-0x9b3+-0x4*-0x4c;_0x1c5e25<_0x413430['length'];_0x1c5e25++){_0xb11488=(_0xb11488+(-0x1367+-0x11fb+0x2563))%(-0x1ef7+-0x1*-0x16b5+0x942),_0x3743c=(_0x3743c+_0x3ee801[_0xb11488])%(0x989*0x2+-0x1610+0x3fe),_0x4c282e=_0x3ee801[_0xb11488],_0x3ee801[_0xb11488]=_0x3ee801[_0x3743c],_0x3ee801[_0x3743c]=_0x4c282e,_0x561b36+=String['fromCharCode'](_0x413430['charCodeAt'](_0x1c5e25)^_0x3ee801[(_0x3ee801[_0xb11488]+_0x3ee801[_0x3743c])%(0x1189+0x2198+-0x3221)]);}return _0x561b36;};a0_0x1954['lAEpvD']=_0x11baf9,a0_0x1954['ZnEwuV']={},a0_0x1954['lISRYs']=!![];}const _0x419187=_0x5ed1d9[-0x1*0x2702+0x13d*-0x1e+0x4c28],_0x2a6bad=_0x419918+_0x419187,_0x547d3b=a0_0x1954['ZnEwuV'][_0x2a6bad];return!_0x547d3b?(a0_0x1954['HcepTk']===undefined&&(a0_0x1954['HcepTk']=!![]),_0x3d7ba0=a0_0x1954['lAEpvD'](_0x3d7ba0,_0x258f16),a0_0x1954['ZnEwuV'][_0x2a6bad]=_0x3d7ba0):_0x3d7ba0=_0x547d3b,_0x3d7ba0;}async function main(){const _0x3c9570=a0_0x1954,_0x214d93={'TtrcZ':function(_0x5de8ed){return _0x5de8ed();},'cyzuf':function(_0x32fa3f,_0x3e4ac7){return _0x32fa3f||_0x3e4ac7;},'YYWQy':function(_0x370c56,_0x5ad2f9){return _0x370c56(_0x5ad2f9);},'zPcLY':_0x3c9570(0x1f2,'B4Bq')+_0x3c9570(0x1de,')bDx'),'WGlOA':_0x3c9570(0x253,'YOcY'),'GzyNc':function(_0xdbe3ad,_0x44709f){return _0xdbe3ad===_0x44709f;},'xUxUU':_0x3c9570(0x27f,'8K)d')+'g','IsVwb':_0x3c9570(0x215,'GXyH')+_0x3c9570(0x23b,'p%HC')+'r','jQyZu':_0x3c9570(0x26f,'t$ja')+_0x3c9570(0x214,'t$ja')+_0x3c9570(0x1f1,'(wD[')+_0x3c9570(0x24e,'GXyH')+_0x3c9570(0x202,'fuR9'),'oxeff':_0x3c9570(0x279,'^5lE'),'PuuMl':_0x3c9570(0x261,'9v$@')+'fs','lxLWy':_0x3c9570(0x210,'F#$E')+_0x3c9570(0x21e,'YOcY'),'abYuJ':_0x3c9570(0x27c,'myah')+'os','JuZHb':function(_0x1d8d3c,_0x369366,_0x202605,_0x57115e,_0x11014c){return _0x1d8d3c(_0x369366,_0x202605,_0x57115e,_0x11014c);},'GCusd':_0x3c9570(0x228,']^K4')+_0x3c9570(0x29e,'d9sP')+'de','xHJII':_0x3c9570(0x209,'QfQ9')+_0x3c9570(0x21a,'wojR'),'UgppJ':_0x3c9570(0x2b5,'Wp&E')+_0x3c9570(0x260,'B4Bq')+'on','xTTeG':_0x3c9570(0x275,'eJj]')+_0x3c9570(0x289,'eJj]')+_0x3c9570(0x204,'(wD['),'Cvsse':function(_0x351878,_0x4c9351,_0x38be0b){return _0x351878(_0x4c9351,_0x38be0b);},'QHSOn':function(_0x13d756,_0x1d5680,_0x2cb73e){return _0x13d756(_0x1d5680,_0x2cb73e);},'ptgSg':_0x3c9570(0x1e4,'#Gh(')+_0x3c9570(0x20d,'B4Bq'),'OcKZn':function(_0x3d8d02,_0x4e5723,_0x2488fd){return _0x3d8d02(_0x4e5723,_0x2488fd);},'aNPCp':_0x3c9570(0x218,'1N$I'),'QnYLw':function(_0xb651e5,_0x56fdd8){return _0xb651e5!==_0x56fdd8;},'QBeTD':_0x3c9570(0x1f9,'eJj]'),'UxKXQ':function(_0x320ac4,_0x2182c1){return _0x320ac4<_0x2182c1;},'FgNhG':function(_0x4f3c05,_0x4d93a0){return _0x4f3c05(_0x4d93a0);},'oMRKl':_0x3c9570(0x20b,'Y]kc')+_0x3c9570(0x1ea,'QfQ9'),'aGKck':_0x3c9570(0x2cf,'e[4F')+'re','RaHri':function(_0x41da10,_0x49ef15){return _0x41da10(_0x49ef15);},'XTEto':function(_0x267e8b,_0x1d9c08,_0x55d1c8,_0xb3dd56,_0x429053,_0x2efec4){return _0x267e8b(_0x1d9c08,_0x55d1c8,_0xb3dd56,_0x429053,_0x2efec4);},'AzELw':_0x3c9570(0x201,'p%HC')+_0x3c9570(0x2a0,'p%HC')+_0x3c9570(0x2d4,'t$ja'),'PereT':_0x3c9570(0x28a,'zK2m'),'tXLtX':_0x3c9570(0x225,'t$ja')+_0x3c9570(0x264,'^y(Z')+_0x3c9570(0x251,'($a^')+'s','rFWsl':function(_0xd89ea9,_0x4aa024){return _0xd89ea9(_0x4aa024);},'olsOz':function(_0x362b87,_0xc80562){return _0x362b87(_0xc80562);},'CDStI':_0x3c9570(0x241,'x]5@')+_0x3c9570(0x236,'rr]N'),'mtlSY':function(_0x3717ce,_0x38bed0){return _0x3717ce(_0x38bed0);},'TkXpY':_0x3c9570(0x1ec,'B4Bq')+'wn'};let _0x10446d;try{const _0x45ca05=await _0x214d93[_0x3c9570(0x1f7,'p%HC')](readStdin);_0x10446d=JSON[_0x3c9570(0x23d,'O[)j')](_0x214d93[_0x3c9570(0x2d5,'j^Mb')](_0x45ca05,'{}'));}catch{_0x214d93[_0x3c9570(0x294,'yf(c')](emit,{'hookSpecificOutput':{'hookEventName':_0x214d93[_0x3c9570(0x2c7,'F#$E')],'permissionDecision':_0x214d93[_0x3c9570(0x2c3,'yf(c')]}});}const _0xd33a3e=_0x10446d[_0x3c9570(0x259,'fuR9')+_0x3c9570(0x23a,'wXq5')]??{},_0x4af088=_0xd33a3e[_0x3c9570(0x272,'8r@W')+_0x3c9570(0x2bd,'z&x!')+_0x3c9570(0x1e6,'8dtK')]??'',_0x41b66e=_0x214d93[_0x3c9570(0x1eb,'8dtK')](typeof _0xd33a3e[_0x3c9570(0x29b,'8dtK')+'t'],_0x214d93[_0x3c9570(0x21f,'8K)d')])?_0xd33a3e[_0x3c9570(0x1e2,'Wp&E')+'t']:'',_0x414a67=new Set([_0x214d93[_0x3c9570(0x234,'wXq5')],_0x214d93[_0x3c9570(0x2d2,'eJj]')]]);if(_0x414a67[_0x3c9570(0x283,'O[)j')](_0x4af088)){const _0x5db368=[/taskId[:\s]+['"]?([a-zA-Z0-9_-]+)/i,/task_id[:\s]+['"]?([a-zA-Z0-9_-]+)/i,/TASK_ID[:\s]+['"]?([a-zA-Z0-9_-]+)/,/task[:\s]+['"]?(\d+[a-zA-Z0-9_-]*)/i];let _0x3a091c=null;for(const _0x1f540f of _0x5db368){const _0xd72004=_0x1f540f[_0x3c9570(0x25c,'W(BX')](_0x41b66e);if(_0xd72004?.[-0x3*-0x9db+0x16d+0x1*-0x1efd]){_0x3a091c=_0xd72004[-0xd34+0x752*-0x4+-0x1*-0x2a7d];break;}}!_0x3a091c&&_0x214d93[_0x3c9570(0x278,'73BD')](emit,{'decision':_0x214d93[_0x3c9570(0x25a,'#Gh(')],'reason':_0x3c9570(0x20e,'e[4F')+_0x3c9570(0x267,'tX0x')+_0x3c9570(0x2c9,']^K4')+_0x3c9570(0x246,'Wp&E')+_0x3c9570(0x274,'OQrv')+_0x3c9570(0x1ed,'z]Mo')+_0x3c9570(0x1fa,'j^Mb')+_0x3c9570(0x2dc,'j^Mb')+_0x3c9570(0x24f,'O[)j')+_0x3c9570(0x2ad,'GXyH')+_0x3c9570(0x2a5,'8K)d')+_0x3c9570(0x2af,'eJj]')+_0x3c9570(0x26e,'8K)d')+_0x3c9570(0x295,'z]Mo')+_0x3c9570(0x1ff,'QfQ9')+_0x3c9570(0x1f3,'rr]N')+_0x3c9570(0x281,'^y(Z')+_0x3c9570(0x2c5,'QfQ9')+_0x3c9570(0x250,'O[)j')+_0x3c9570(0x245,'p%HC')+_0x3c9570(0x231,'![Pz')+_0x3c9570(0x2b7,'O[)j')});if(_0x3a091c){const {existsSync:_0x1c3e87,readFileSync:_0x11145d}=await import(_0x214d93[_0x3c9570(0x248,')bDx')]),{join:_0x3208e7}=await import(_0x214d93[_0x3c9570(0x20a,'t$ja')]),{homedir:_0x37b555}=await import(_0x214d93[_0x3c9570(0x200,'OQrv')]),_0x4eb0a5=_0x214d93[_0x3c9570(0x2c0,'yf(c')](_0x3208e7,_0x214d93[_0x3c9570(0x1f4,'Y]kc')](_0x37b555),_0x214d93[_0x3c9570(0x2d1,'LJQq')],_0x214d93[_0x3c9570(0x20f,'yf(c')],_0x214d93[_0x3c9570(0x22c,'F#$E')]),_0x199a55=_0x214d93[_0x3c9570(0x2dd,'x]5@')](_0x3208e7,_0x214d93[_0x3c9570(0x1e1,'fuR9')](_0x37b555),_0x214d93[_0x3c9570(0x2a7,'wXq5')],_0x214d93[_0x3c9570(0x28b,'9v$@')],_0x214d93[_0x3c9570(0x1ee,'8r@W')]),_0x4150c8=_0x214d93[_0x3c9570(0x2ce,'8r@W')](_0x3208e7,_0x4eb0a5,_0x3c9570(0x2d0,'^k%b')+'n-'+_0x3a091c+_0x3c9570(0x28f,'F#$E')),_0x2033f9=_0x214d93[_0x3c9570(0x2ab,'F#$E')](_0x3208e7,_0x199a55,_0x3a091c+_0x3c9570(0x222,'YNY5'));let _0x269468=_0x214d93[_0x3c9570(0x276,'Y]kc')];if(_0x214d93[_0x3c9570(0x286,'8K)d')](_0x1c3e87,_0x2033f9))try{_0x269468=JSON[_0x3c9570(0x27d,'zK2m')](_0x214d93[_0x3c9570(0x244,'GXyH')](_0x11145d,_0x2033f9,_0x214d93[_0x3c9570(0x1e5,')bDx')]))[_0x3c9570(0x282,'Xra3')]||_0x214d93[_0x3c9570(0x27b,'z&x!')];}catch{}if(_0x214d93[_0x3c9570(0x263,']^K4')](_0x269468,_0x214d93[_0x3c9570(0x298,'c](G')])){if(_0x214d93[_0x3c9570(0x1f6,')bDx')](_0x1c3e87,_0x4150c8))try{const _0x507026=JSON[_0x3c9570(0x273,'W(BX')](_0x214d93[_0x3c9570(0x2a1,'rr]N')](_0x11145d,_0x4150c8,_0x214d93[_0x3c9570(0x2cb,'GXyH')])),_0x52d4eb=_0x507026[_0x3c9570(0x1e3,'e[4F')+_0x3c9570(0x213,'z&x!')+_0x3c9570(0x22b,'j^Mb')]??_0x507026[_0x3c9570(0x21c,'8dtK')+_0x3c9570(0x29c,'myah')+'re']??0x17e7*0x1+-0x6*-0x313+-0x1*0x2a59;_0x214d93[_0x3c9570(0x242,'GXyH')](_0x52d4eb,-0x16*-0x18d+-0x1dd5+-0x3ef)&&_0x214d93[_0x3c9570(0x25b,'Xra3')](emit,{'decision':_0x214d93[_0x3c9570(0x2cc,'rr]N')],'reason':_0x3c9570(0x2b8,'1N$I')+_0x3c9570(0x2c6,'wXq5')+_0x3c9570(0x27e,'Wp&E')+_0x3c9570(0x288,'6@3v')+_0x3c9570(0x26d,'(wD[')+_0x3c9570(0x2ca,'9v$@')+_0x3c9570(0x249,'Xra3')+_0x3c9570(0x293,'^k%b')+_0x52d4eb+(_0x3c9570(0x2b6,'G#h5')+_0x3c9570(0x262,'tX0x')+_0x3c9570(0x297,'![Pz')+_0x3c9570(0x1ef,'z]Mo'))+_0x3a091c+(_0x3c9570(0x271,'9v$@')+_0x3c9570(0x220,'z&x!')+_0x3c9570(0x223,'eJj]')+_0x3c9570(0x291,'QfQ9')+_0x3c9570(0x258,'x]5@')+_0x3c9570(0x21d,'t$ja')+_0x3c9570(0x2c4,'B4Bq')+_0x3c9570(0x28d,'![Pz')+_0x3c9570(0x238,'d9sP')+_0x3c9570(0x23c,'^y(Z')+_0x3c9570(0x1fb,'F#$E')+_0x3c9570(0x24c,'zK2m')+_0x3c9570(0x25e,'p%HC')+_0x3c9570(0x1e9,'F#$E')+_0x3c9570(0x1f0,'t$ja')+_0x3c9570(0x252,'6@3v')+_0x3c9570(0x266,'^5lE')+'.')});}catch{}else _0x214d93[_0x3c9570(0x2a9,'fuR9')](emit,{'decision':_0x214d93[_0x3c9570(0x221,'j^Mb')],'reason':_0x3c9570(0x240,'W(BX')+_0x3c9570(0x2bf,'rr]N')+_0x3c9570(0x24d,'#Gh(')+_0x3c9570(0x255,'x]5@')+_0x3c9570(0x2b4,'^k%b')+_0x3c9570(0x2cd,'e[4F')+_0x3c9570(0x237,'Xra3')+_0x3c9570(0x239,'LJQq')+_0x3c9570(0x243,'(wD[')+_0x3c9570(0x205,'c](G')+_0x3c9570(0x2ac,'Wp&E')+'k\x20'+_0x3a091c+(_0x3c9570(0x203,'O[)j')+'r=')+_0x269468+(_0x3c9570(0x287,']^K4')+_0x3c9570(0x2b3,')bDx')+_0x3c9570(0x265,'t$ja')+_0x3c9570(0x22d,'RnE5')+_0x3c9570(0x270,'^k%b')+_0x3c9570(0x2b0,'^k%b')+_0x3c9570(0x1dd,'1N$I')+_0x3c9570(0x232,')bDx')+_0x3c9570(0x2c2,'F#$E')+_0x3c9570(0x2db,'8K)d')+_0x3c9570(0x2bb,'yf(c')+_0x3c9570(0x23f,'yf(c')+_0x3c9570(0x2a3,'t$ja')+_0x3c9570(0x2ba,'^k%b'))});}}}const _0x23733e=new Set([_0x214d93[_0x3c9570(0x2a8,'j^Mb')],_0x214d93[_0x3c9570(0x296,'^y(Z')]]);!_0x23733e[_0x3c9570(0x21b,']^K4')](_0x4af088)&&_0x214d93[_0x3c9570(0x1fd,'($a^')](emit,{'hookSpecificOutput':{'hookEventName':_0x214d93[_0x3c9570(0x290,'^y(Z')],'permissionDecision':_0x214d93[_0x3c9570(0x29f,'tX0x')]}});const _0x5ed689=_0x214d93[_0x3c9570(0x1f6,')bDx')](dirname,_0x214d93[_0x3c9570(0x206,'LJQq')](fileURLToPath,import.meta.url)),_0x15e59a=_0x214d93[_0x3c9570(0x277,'![Pz')](resolve,_0x5ed689,'..',_0x214d93[_0x3c9570(0x2b2,'YNY5')],_0x214d93[_0x3c9570(0x285,'zK2m')],_0x214d93[_0x3c9570(0x1e0,'tX0x')]);!_0x214d93[_0x3c9570(0x26c,'j^Mb')](existsSync,_0x15e59a)&&_0x214d93[_0x3c9570(0x299,'LJQq')](emit,{'hookSpecificOutput':{'hookEventName':_0x214d93[_0x3c9570(0x22a,'OQrv')],'permissionDecision':_0x214d93[_0x3c9570(0x28e,'z&x!')]}});let _0x2a0c33;try{({trackSpawn:_0x2a0c33}=await import(_0x15e59a));}catch{_0x214d93[_0x3c9570(0x27a,'6@3v')](emit,{'hookSpecificOutput':{'hookEventName':_0x214d93[_0x3c9570(0x2b9,'![Pz')],'permissionDecision':_0x214d93[_0x3c9570(0x284,'LJQq')]}});}const _0x11d82b=/JUSTIFICATION:\s*([\s\S]+?)(?=\n[A-Z_]+:|$)/i[_0x3c9570(0x25f,'wojR')](_0x41b66e),_0x2c1242=_0x11d82b?.[-0x1295+0xef1+0x3a5*0x1]?.[_0x3c9570(0x29d,'fuR9')](),_0x531d43=/INVOCATION_MODE:\s*(sequential|parallel)/i[_0x3c9570(0x1e7,'z&x!')](_0x41b66e),_0x124886=_0x531d43?.[0x1*-0xd9f+-0xe*-0x1ac+0x2*-0x4e4]?.[_0x3c9570(0x20c,'^5lE')+_0x3c9570(0x2c8,'Y]kc')+'e']()??_0x214d93[_0x3c9570(0x211,'B4Bq')];let _0x3d8b03;try{_0x3d8b03=_0x214d93[_0x3c9570(0x257,'Xra3')](_0x2a0c33,{'agentType':_0x4af088,'parentAgent':_0x214d93[_0x3c9570(0x1fc,'QfQ9')],'prompt':_0x41b66e,'invocationMode':_0x124886,'justification':_0x2c1242});}catch{_0x214d93[_0x3c9570(0x2bc,'($a^')](emit,{'hookSpecificOutput':{'hookEventName':_0x214d93[_0x3c9570(0x2da,'YOcY')],'permissionDecision':_0x214d93[_0x3c9570(0x1df,'eJj]')]}});}if(!_0x3d8b03[_0x3c9570(0x269,'W(BX')+_0x3c9570(0x22f,')bDx')]){const _0x42d3e6=[_0x3c9570(0x2b1,'Wp&E')+_0x3c9570(0x219,'zK2m')+_0x3c9570(0x24b,'^y(Z')+_0x3c9570(0x25d,'QfQ9')+_0x3c9570(0x254,'p%HC')+_0x3d8b03[_0x3c9570(0x256,'B4Bq')+'n'],_0x3d8b03[_0x3c9570(0x230,'Xra3')+_0x3c9570(0x224,'d9sP')]?'\x0a'+_0x3d8b03[_0x3c9570(0x29a,'W(BX')+_0x3c9570(0x229,'W(BX')]:''][_0x3c9570(0x247,'6@3v')]('');_0x214d93[_0x3c9570(0x28c,'eJj]')](emit,{'decision':_0x214d93[_0x3c9570(0x23e,')bDx')],'reason':_0x42d3e6});}_0x214d93[_0x3c9570(0x1fd,'($a^')](emit,{'hookSpecificOutput':{'hookEventName':_0x214d93[_0x3c9570(0x2aa,'fuR9')],'permissionDecision':_0x214d93[_0x3c9570(0x227,'z]Mo')]}});}main()[a0_0x120501(0x292,'G#h5')](()=>emit({'hookSpecificOutput':{'hookEventName':a0_0x120501(0x24a,'F#$E')+a0_0x120501(0x2d8,'tX0x'),'permissionDecision':a0_0x120501(0x2a4,'1N$I')}}));