dual-brain 0.2.30 → 0.3.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 (309) hide show
  1. package/.dual-brain/docs/claude-code-extension-points.md +32 -0
  2. package/.dual-brain/docs/data-tools-capabilities.md +181 -0
  3. package/.dual-brain/docs/ecosystem-tools.md +91 -0
  4. package/.dual-brain/docs/panel-handoff.md +124 -0
  5. package/.dual-brain/docs/ruflo-analysis.md +48 -0
  6. package/bin/dual-brain.mjs +56 -56
  7. package/dist/mcp-server/index.d.ts +27 -0
  8. package/dist/mcp-server/index.js +359 -0
  9. package/dist/mcp-server/index.js.map +1 -0
  10. package/dist/src/agent-protocol.d.ts +163 -0
  11. package/dist/src/agent-protocol.js +368 -0
  12. package/dist/src/agent-protocol.js.map +1 -0
  13. package/dist/src/agents/registry.d.ts +52 -0
  14. package/dist/src/agents/registry.js +393 -0
  15. package/dist/src/agents/registry.js.map +1 -0
  16. package/dist/src/awareness.d.ts +93 -0
  17. package/dist/src/awareness.js +406 -0
  18. package/dist/src/awareness.js.map +1 -0
  19. package/dist/src/brief.d.ts +48 -0
  20. package/dist/src/brief.js +179 -0
  21. package/dist/src/brief.js.map +1 -0
  22. package/dist/src/calibration.d.ts +32 -0
  23. package/dist/src/calibration.js +133 -0
  24. package/dist/src/calibration.js.map +1 -0
  25. package/dist/src/checkpoint.d.ts +33 -0
  26. package/dist/src/checkpoint.js +99 -0
  27. package/dist/src/checkpoint.js.map +1 -0
  28. package/dist/src/ci-triage.d.ts +33 -0
  29. package/dist/src/ci-triage.js +193 -0
  30. package/dist/src/ci-triage.js.map +1 -0
  31. package/dist/src/cognitive-loop.d.ts +56 -0
  32. package/dist/src/cognitive-loop.js +495 -0
  33. package/dist/src/cognitive-loop.js.map +1 -0
  34. package/dist/src/collaboration.d.ts +147 -0
  35. package/dist/src/collaboration.js +438 -0
  36. package/dist/src/collaboration.js.map +1 -0
  37. package/dist/src/context-intel.d.ts +47 -0
  38. package/dist/src/context-intel.js +156 -0
  39. package/dist/src/context-intel.js.map +1 -0
  40. package/dist/src/context.d.ts +53 -0
  41. package/dist/src/context.js +332 -0
  42. package/dist/src/context.js.map +1 -0
  43. package/dist/src/continuity.d.ts +89 -0
  44. package/dist/src/continuity.js +230 -0
  45. package/dist/src/continuity.js.map +1 -0
  46. package/dist/src/cost-tracker.d.ts +47 -0
  47. package/dist/src/cost-tracker.js +170 -0
  48. package/dist/src/cost-tracker.js.map +1 -0
  49. package/dist/src/debrief.d.ts +53 -0
  50. package/dist/src/debrief.js +222 -0
  51. package/dist/src/debrief.js.map +1 -0
  52. package/dist/src/decide.d.ts +96 -0
  53. package/dist/src/decide.js +744 -0
  54. package/dist/src/decide.js.map +1 -0
  55. package/dist/src/decompose.d.ts +39 -0
  56. package/dist/src/decompose.js +218 -0
  57. package/dist/src/decompose.js.map +1 -0
  58. package/dist/src/detect.d.ts +91 -0
  59. package/dist/src/detect.js +544 -0
  60. package/dist/src/detect.js.map +1 -0
  61. package/dist/src/dispatch.d.ts +154 -0
  62. package/dist/src/dispatch.js +1306 -0
  63. package/dist/src/dispatch.js.map +1 -0
  64. package/dist/src/doctor.d.ts +421 -0
  65. package/dist/src/doctor.js +1689 -0
  66. package/dist/src/doctor.js.map +1 -0
  67. package/dist/src/engine.d.ts +70 -0
  68. package/dist/src/engine.js +155 -0
  69. package/dist/src/engine.js.map +1 -0
  70. package/dist/src/envelope.d.ts +36 -0
  71. package/dist/src/envelope.js +80 -0
  72. package/dist/src/envelope.js.map +1 -0
  73. package/dist/src/failure-memory.d.ts +55 -0
  74. package/dist/src/failure-memory.js +175 -0
  75. package/dist/src/failure-memory.js.map +1 -0
  76. package/dist/src/fx.d.ts +87 -0
  77. package/dist/src/fx.js +272 -0
  78. package/dist/src/fx.js.map +1 -0
  79. package/dist/src/governance.d.ts +93 -0
  80. package/dist/src/governance.js +261 -0
  81. package/dist/src/governance.js.map +1 -0
  82. package/dist/src/handoff.d.ts +11 -0
  83. package/dist/src/handoff.js +90 -0
  84. package/dist/src/handoff.js.map +1 -0
  85. package/dist/src/head-protocol.d.ts +76 -0
  86. package/dist/src/head-protocol.js +109 -0
  87. package/dist/src/head-protocol.js.map +1 -0
  88. package/dist/src/head.d.ts +222 -0
  89. package/dist/src/head.js +765 -0
  90. package/dist/src/head.js.map +1 -0
  91. package/dist/src/health.d.ts +132 -0
  92. package/dist/src/health.js +435 -0
  93. package/dist/src/health.js.map +1 -0
  94. package/dist/src/inbox.d.ts +70 -0
  95. package/dist/src/inbox.js +218 -0
  96. package/dist/src/inbox.js.map +1 -0
  97. package/dist/src/index.d.ts +33 -0
  98. package/dist/src/index.js +38 -0
  99. package/dist/src/index.js.map +1 -0
  100. package/dist/src/install-hooks.d.ts +13 -0
  101. package/dist/src/install-hooks.js +88 -0
  102. package/dist/src/install-hooks.js.map +1 -0
  103. package/dist/src/integrity.d.ts +59 -0
  104. package/dist/src/integrity.js +206 -0
  105. package/dist/src/integrity.js.map +1 -0
  106. package/dist/src/intelligence.d.ts +104 -0
  107. package/dist/src/intelligence.js +391 -0
  108. package/dist/src/intelligence.js.map +1 -0
  109. package/dist/src/ledger.d.ts +54 -0
  110. package/dist/src/ledger.js +179 -0
  111. package/dist/src/ledger.js.map +1 -0
  112. package/dist/src/living-docs.d.ts +14 -0
  113. package/dist/src/living-docs.js +197 -0
  114. package/dist/src/living-docs.js.map +1 -0
  115. package/dist/src/memory-tiers.d.ts +37 -0
  116. package/dist/src/memory-tiers.js +160 -0
  117. package/dist/src/memory-tiers.js.map +1 -0
  118. package/dist/src/model-profiles.d.ts +65 -0
  119. package/dist/src/model-profiles.js +568 -0
  120. package/dist/src/model-profiles.js.map +1 -0
  121. package/dist/src/models.d.ts +58 -0
  122. package/dist/src/models.js +327 -0
  123. package/dist/src/models.js.map +1 -0
  124. package/dist/src/narrative.d.ts +54 -0
  125. package/dist/src/narrative.js +163 -0
  126. package/dist/src/narrative.js.map +1 -0
  127. package/dist/src/nextstep.d.ts +16 -0
  128. package/dist/src/nextstep.js +103 -0
  129. package/dist/src/nextstep.js.map +1 -0
  130. package/dist/src/observer.d.ts +18 -0
  131. package/dist/src/observer.js +251 -0
  132. package/dist/src/observer.js.map +1 -0
  133. package/dist/src/outcome.d.ts +110 -0
  134. package/dist/src/outcome.js +377 -0
  135. package/dist/src/outcome.js.map +1 -0
  136. package/dist/src/pipeline.d.ts +167 -0
  137. package/dist/src/pipeline.js +1503 -0
  138. package/dist/src/pipeline.js.map +1 -0
  139. package/dist/src/playbook.d.ts +59 -0
  140. package/dist/src/playbook.js +238 -0
  141. package/dist/src/playbook.js.map +1 -0
  142. package/dist/src/pr-agent.d.ts +97 -0
  143. package/dist/src/pr-agent.js +195 -0
  144. package/dist/src/pr-agent.js.map +1 -0
  145. package/dist/src/predictive.d.ts +57 -0
  146. package/dist/src/predictive.js +230 -0
  147. package/dist/src/predictive.js.map +1 -0
  148. package/dist/src/profile.d.ts +294 -0
  149. package/dist/src/profile.js +1347 -0
  150. package/dist/src/profile.js.map +1 -0
  151. package/dist/src/prompt-audit.d.ts +22 -0
  152. package/dist/src/prompt-audit.js +194 -0
  153. package/dist/src/prompt-audit.js.map +1 -0
  154. package/dist/src/prompt-intel.d.ts +12 -0
  155. package/dist/src/prompt-intel.js +321 -0
  156. package/dist/src/prompt-intel.js.map +1 -0
  157. package/dist/src/provider-context.d.ts +121 -0
  158. package/dist/src/provider-context.js +222 -0
  159. package/dist/src/provider-context.js.map +1 -0
  160. package/dist/src/provider-manager.d.ts +92 -0
  161. package/dist/src/provider-manager.js +428 -0
  162. package/dist/src/provider-manager.js.map +1 -0
  163. package/dist/src/receipt.d.ts +87 -0
  164. package/dist/src/receipt.js +326 -0
  165. package/dist/src/receipt.js.map +1 -0
  166. package/dist/src/recommendations.d.ts +13 -0
  167. package/dist/src/recommendations.js +291 -0
  168. package/dist/src/recommendations.js.map +1 -0
  169. package/dist/src/redact.d.ts +15 -0
  170. package/dist/src/redact.js +129 -0
  171. package/dist/src/redact.js.map +1 -0
  172. package/dist/src/replit.d.ts +397 -0
  173. package/dist/src/replit.js +1160 -0
  174. package/dist/src/replit.js.map +1 -0
  175. package/dist/src/repo.d.ts +149 -0
  176. package/dist/src/repo.js +416 -0
  177. package/dist/src/repo.js.map +1 -0
  178. package/dist/src/revert.d.ts +30 -0
  179. package/dist/src/revert.js +166 -0
  180. package/dist/src/revert.js.map +1 -0
  181. package/dist/src/room.d.ts +102 -0
  182. package/dist/src/room.js +212 -0
  183. package/dist/src/room.js.map +1 -0
  184. package/dist/src/routing-advisor.d.ts +57 -0
  185. package/dist/src/routing-advisor.js +221 -0
  186. package/dist/src/routing-advisor.js.map +1 -0
  187. package/dist/src/self-correct.d.ts +40 -0
  188. package/dist/src/self-correct.js +137 -0
  189. package/dist/src/self-correct.js.map +1 -0
  190. package/dist/src/session-lock.d.ts +35 -0
  191. package/dist/src/session-lock.js +134 -0
  192. package/dist/src/session-lock.js.map +1 -0
  193. package/dist/src/session.d.ts +267 -0
  194. package/dist/src/session.js +1660 -0
  195. package/dist/src/session.js.map +1 -0
  196. package/dist/src/settings-tui.d.ts +5 -0
  197. package/dist/src/settings-tui.js +422 -0
  198. package/dist/src/settings-tui.js.map +1 -0
  199. package/dist/src/setup-flow.d.ts +63 -0
  200. package/dist/src/setup-flow.js +233 -0
  201. package/dist/src/setup-flow.js.map +1 -0
  202. package/dist/src/signal.d.ts +19 -0
  203. package/dist/src/signal.js +122 -0
  204. package/dist/src/signal.js.map +1 -0
  205. package/dist/src/simmer.d.ts +85 -0
  206. package/dist/src/simmer.js +224 -0
  207. package/dist/src/simmer.js.map +1 -0
  208. package/dist/src/state-export.d.ts +129 -0
  209. package/dist/src/state-export.js +233 -0
  210. package/dist/src/state-export.js.map +1 -0
  211. package/dist/src/strategy.d.ts +54 -0
  212. package/dist/src/strategy.js +95 -0
  213. package/dist/src/strategy.js.map +1 -0
  214. package/dist/src/subscription.d.ts +40 -0
  215. package/dist/src/subscription.js +189 -0
  216. package/dist/src/subscription.js.map +1 -0
  217. package/dist/src/templates.d.ts +208 -0
  218. package/dist/src/templates.js +238 -0
  219. package/dist/src/templates.js.map +1 -0
  220. package/dist/src/test.d.ts +9 -0
  221. package/dist/src/test.js +1173 -0
  222. package/dist/src/test.js.map +1 -0
  223. package/dist/src/think-engine.d.ts +67 -0
  224. package/dist/src/think-engine.js +412 -0
  225. package/dist/src/think-engine.js.map +1 -0
  226. package/dist/src/tui.d.ts +71 -0
  227. package/dist/src/tui.js +242 -0
  228. package/dist/src/tui.js.map +1 -0
  229. package/dist/src/types.d.ts +177 -0
  230. package/dist/src/types.js +6 -0
  231. package/dist/src/types.js.map +1 -0
  232. package/dist/src/update-check.d.ts +7 -0
  233. package/dist/src/update-check.js +36 -0
  234. package/dist/src/update-check.js.map +1 -0
  235. package/dist/src/wave-planner.d.ts +30 -0
  236. package/dist/src/wave-planner.js +281 -0
  237. package/dist/src/wave-planner.js.map +1 -0
  238. package/hooks/head-guard.sh +41 -0
  239. package/hooks/task-classifier.mjs +328 -0
  240. package/hooks/vibe-router.mjs +387 -0
  241. package/package.json +29 -153
  242. package/src/agents/registry.mjs +0 -405
  243. package/src/awareness.mjs +0 -425
  244. package/src/brief.mjs +0 -266
  245. package/src/calibration.mjs +0 -148
  246. package/src/checkpoint.mjs +0 -109
  247. package/src/ci-triage.mjs +0 -191
  248. package/src/cognitive-loop.mjs +0 -562
  249. package/src/collaboration.mjs +0 -545
  250. package/src/context-intel.mjs +0 -158
  251. package/src/context.mjs +0 -389
  252. package/src/continuity.mjs +0 -298
  253. package/src/cost-tracker.mjs +0 -184
  254. package/src/debrief.mjs +0 -228
  255. package/src/decide.mjs +0 -1099
  256. package/src/decompose.mjs +0 -331
  257. package/src/detect.mjs +0 -702
  258. package/src/dispatch.mjs +0 -1447
  259. package/src/doctor.mjs +0 -1607
  260. package/src/envelope.mjs +0 -139
  261. package/src/failure-memory.mjs +0 -178
  262. package/src/fx.mjs +0 -276
  263. package/src/governance.mjs +0 -279
  264. package/src/handoff.mjs +0 -87
  265. package/src/head-protocol.mjs +0 -128
  266. package/src/head.mjs +0 -952
  267. package/src/health.mjs +0 -528
  268. package/src/inbox.mjs +0 -195
  269. package/src/index.mjs +0 -44
  270. package/src/install-hooks.mjs +0 -100
  271. package/src/integrity.mjs +0 -245
  272. package/src/intelligence.mjs +0 -447
  273. package/src/ledger.mjs +0 -196
  274. package/src/living-docs.mjs +0 -210
  275. package/src/memory-tiers.mjs +0 -193
  276. package/src/models.mjs +0 -363
  277. package/src/narrative.mjs +0 -169
  278. package/src/nextstep.mjs +0 -100
  279. package/src/observer.mjs +0 -241
  280. package/src/outcome.mjs +0 -400
  281. package/src/pipeline.mjs +0 -1711
  282. package/src/playbook.mjs +0 -257
  283. package/src/pr-agent.mjs +0 -214
  284. package/src/predictive.mjs +0 -250
  285. package/src/profile.mjs +0 -1411
  286. package/src/prompt-audit.mjs +0 -231
  287. package/src/prompt-intel.mjs +0 -325
  288. package/src/provider-context.mjs +0 -257
  289. package/src/receipt.mjs +0 -344
  290. package/src/recommendations.mjs +0 -296
  291. package/src/redact.mjs +0 -192
  292. package/src/replit.mjs +0 -1210
  293. package/src/repo.mjs +0 -445
  294. package/src/revert.mjs +0 -149
  295. package/src/routing-advisor.mjs +0 -204
  296. package/src/self-correct.mjs +0 -147
  297. package/src/session-lock.mjs +0 -160
  298. package/src/session.mjs +0 -1655
  299. package/src/settings-tui.mjs +0 -373
  300. package/src/setup-flow.mjs +0 -223
  301. package/src/signal.mjs +0 -115
  302. package/src/simmer.mjs +0 -241
  303. package/src/strategy.mjs +0 -235
  304. package/src/subscription.mjs +0 -212
  305. package/src/templates.mjs +0 -260
  306. package/src/think-engine.mjs +0 -428
  307. package/src/tui.mjs +0 -276
  308. package/src/update-check.mjs +0 -35
  309. package/src/wave-planner.mjs +0 -294
@@ -0,0 +1 @@
1
+ {"version":3,"file":"head.js","sourceRoot":"","sources":["../../src/head.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,132 @@
1
+ /**
2
+ * health.ts — Reactive provider health tracking for the Dual-Brain Orchestrator.
3
+ *
4
+ * Replaces budget-pressure estimation with real cooldown state persisted to
5
+ * .dualbrain/health.json. No external dependencies.
6
+ *
7
+ * Exports: getHealth, markHot, markDegraded, markHealthy, checkCooldown,
8
+ * getProviderScore, recordDispatch, getSessionStats, resetHealth
9
+ */
10
+ type HealthStatus = 'healthy' | 'degraded' | 'probing' | 'hot';
11
+ interface HealthState {
12
+ status: HealthStatus;
13
+ since: string;
14
+ cooldownMinutes?: number;
15
+ attempts?: number;
16
+ probingAt?: string;
17
+ }
18
+ interface DispatchRecord {
19
+ provider: string;
20
+ model: string;
21
+ tokens: number;
22
+ at: string;
23
+ }
24
+ interface SessionData {
25
+ startedAt: string;
26
+ dispatches: DispatchRecord[];
27
+ }
28
+ interface HealthData {
29
+ states: Record<string, HealthState>;
30
+ session: SessionData | null;
31
+ }
32
+ export interface AuthHealthStatus {
33
+ ok: boolean;
34
+ detail: string;
35
+ source: 'replit-tools' | 'direct' | 'unknown';
36
+ }
37
+ interface PingOptions {
38
+ timeoutMs?: number;
39
+ headers?: Record<string, string>;
40
+ }
41
+ export interface PingResult {
42
+ ok: boolean;
43
+ status: 'ok' | 'timeout' | 'error';
44
+ detail?: string;
45
+ }
46
+ interface HookResult {
47
+ path: string;
48
+ exists: boolean;
49
+ syntaxValid: boolean;
50
+ source: 'local' | 'global';
51
+ duplicate: boolean;
52
+ }
53
+ export interface HookHealthResult {
54
+ healthy: boolean;
55
+ hooks: HookResult[];
56
+ conflicts: string[];
57
+ degraded: string[];
58
+ missing: string[];
59
+ }
60
+ export interface HookSmokeResult {
61
+ path: string;
62
+ failsOpen: boolean;
63
+ stderr?: string;
64
+ error?: string;
65
+ }
66
+ /**
67
+ * Get Claude auth status, preferring replit-tools as the authoritative source.
68
+ */
69
+ export declare function getAuthHealthStatus(cwd?: string): Promise<AuthHealthStatus>;
70
+ /**
71
+ * Return the raw health data (states + session).
72
+ */
73
+ export declare function getHealth(cwd?: string): HealthData;
74
+ /**
75
+ * Mark a provider+model as hot (rate-limited). Escalates cooldown on repeat.
76
+ */
77
+ export declare function markHot(provider: string, modelClass: string, cwd?: string): void;
78
+ /**
79
+ * Signal soft degradation (slow responses, elevated errors) without full cooldown.
80
+ */
81
+ export declare function markDegraded(provider: string, modelClass: string, cwd?: string): void;
82
+ /**
83
+ * Clear hot/degraded state and reset attempt counter.
84
+ */
85
+ export declare function markHealthy(provider: string, modelClass: string, cwd?: string): void;
86
+ /**
87
+ * Returns true if the cooldown for a hot provider+model has expired.
88
+ * Side-effect: transitions status from 'hot' to 'probing' when expired.
89
+ */
90
+ export declare function checkCooldown(provider: string, modelClass: string, cwd?: string): boolean;
91
+ /**
92
+ * Returns a 0-100 routing preference score for a provider+model.
93
+ * healthy=100, degraded=50, probing=25, hot=0
94
+ */
95
+ export declare function getProviderScore(provider: string, modelClass: string, cwd?: string): number;
96
+ /**
97
+ * Log a successful dispatch for session tracking.
98
+ */
99
+ export declare function recordDispatch(provider: string, modelClass: string, tokens: number, cwd?: string): void;
100
+ /**
101
+ * Return per-provider aggregated call + token counts for the current session.
102
+ */
103
+ export declare function getSessionStats(cwd?: string): Record<string, {
104
+ calls: number;
105
+ tokens: number;
106
+ }>;
107
+ /**
108
+ * Wipe all health state (states + session).
109
+ */
110
+ export declare function resetHealth(cwd?: string): void;
111
+ /**
112
+ * Ping a provider URL with a bounded timeout so slow networks don't hang the CLI.
113
+ *
114
+ * Uses AbortController to enforce the deadline. On timeout or network error the
115
+ * caller receives { ok: false, status: 'timeout' } rather than hanging forever.
116
+ */
117
+ export declare function pingProvider(url: string, opts?: PingOptions): Promise<PingResult>;
118
+ /**
119
+ * Returns remaining cooldown in minutes for a hot provider+model, or 0.
120
+ */
121
+ export declare function remainingCooldownMinutes(provider: string, modelClass: string, cwd?: string): number;
122
+ /**
123
+ * Check the health of all hook files referenced in project-local and global
124
+ * Claude Code settings.
125
+ */
126
+ export declare function checkHookHealth(cwd?: string): HookHealthResult;
127
+ /**
128
+ * Run a hook with deliberately malformed input to verify it fails open
129
+ * (exits 0 even on bad input, so it never blocks the Claude Code flow).
130
+ */
131
+ export declare function runHookSmoke(hookPath: string): HookSmokeResult;
132
+ export {};
@@ -0,0 +1,435 @@
1
+ /**
2
+ * health.ts — Reactive provider health tracking for the Dual-Brain Orchestrator.
3
+ *
4
+ * Replaces budget-pressure estimation with real cooldown state persisted to
5
+ * .dualbrain/health.json. No external dependencies.
6
+ *
7
+ * Exports: getHealth, markHot, markDegraded, markHealthy, checkCooldown,
8
+ * getProviderScore, recordDispatch, getSessionStats, resetHealth
9
+ */
10
+ import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';
11
+ import { join } from 'node:path';
12
+ import { spawnSync } from 'node:child_process';
13
+ // ─── Auth status (delegates to replit-tools when available) ──────────────────
14
+ /**
15
+ * Get Claude auth status, preferring replit-tools as the authoritative source.
16
+ */
17
+ export async function getAuthHealthStatus(cwd) {
18
+ const root = cwd ?? process.cwd();
19
+ // Try replit-tools first (dynamic import — never breaks if absent)
20
+ try {
21
+ // @ts-ignore — replit.mjs not yet migrated
22
+ const { getAuthStatus } = await import('./replit.js');
23
+ const status = getAuthStatus(root);
24
+ if (status.available) {
25
+ const tokenOk = status.tokenStatus === 'valid' || status.tokenStatus === 'unknown';
26
+ const detail = status.tokenStatus === 'valid'
27
+ ? `Auth: OK (via replit-tools${status.expiresAt ? ', expires ' + status.expiresAt : ''})`
28
+ : status.tokenStatus === 'expired'
29
+ ? 'Auth: expired (via replit-tools)'
30
+ : status.tokenStatus === 'expiring'
31
+ ? 'Auth: expiring soon (via replit-tools)'
32
+ : 'Auth: status unknown (via replit-tools)';
33
+ return { ok: tokenOk, detail, source: 'replit-tools' };
34
+ }
35
+ }
36
+ catch {
37
+ // replit-tools unavailable — fall through to direct check
38
+ }
39
+ // Fall back: check for .credentials.json directly
40
+ const home = process.env.HOME || '/root';
41
+ const credPaths = [
42
+ join(home, '.claude', '.credentials.json'),
43
+ join(root, '.replit-tools', '.claude-persistent', '.credentials.json'),
44
+ join(root, '.claude-persistent', '.credentials.json'),
45
+ ];
46
+ for (const p of credPaths) {
47
+ if (!existsSync(p))
48
+ continue;
49
+ try {
50
+ const creds = JSON.parse(readFileSync(p, 'utf8'));
51
+ const oauth = (creds?.claudeAiOauth ?? null);
52
+ if (oauth?.accessToken) {
53
+ const remainingMs = oauth.expiresAt ? oauth.expiresAt - Date.now() : Infinity;
54
+ const remainingHours = Math.floor(remainingMs / 1000 / 60 / 60);
55
+ if (remainingMs <= 0) {
56
+ return { ok: false, detail: 'Auth: token expired (direct check)', source: 'direct' };
57
+ }
58
+ return {
59
+ ok: true,
60
+ detail: `Auth: OK (direct check, ${remainingHours}h remaining)`,
61
+ source: 'direct',
62
+ };
63
+ }
64
+ }
65
+ catch {
66
+ // continue to next path
67
+ }
68
+ }
69
+ // .claude.json oauthAccount check
70
+ const claudeJsonPaths = [
71
+ join(root, '.replit-tools', '.claude-persistent', '.claude.json'),
72
+ join(home, '.claude', '.claude.json'),
73
+ ];
74
+ for (const p of claudeJsonPaths) {
75
+ if (!existsSync(p))
76
+ continue;
77
+ try {
78
+ const data = JSON.parse(readFileSync(p, 'utf8'));
79
+ if (data?.oauthAccount || data?.apiKey) {
80
+ return { ok: true, detail: 'Auth: OK (direct check via .claude.json)', source: 'direct' };
81
+ }
82
+ }
83
+ catch {
84
+ // continue
85
+ }
86
+ }
87
+ return { ok: false, detail: 'Auth: no credentials found (direct check)', source: 'unknown' };
88
+ }
89
+ const HEALTH_CHECK_TIMEOUT_MS = 5000;
90
+ const HEALTH_FILE = '.dualbrain/health.json';
91
+ // Cooldown ladder in minutes: index = attempts - 1, capped at last entry
92
+ const COOLDOWN_LADDER = [5, 15, 45];
93
+ // Window in which repeated hot marks escalate the ladder (ms)
94
+ const ESCALATION_WINDOW_MS = 2 * 60 * 60 * 1000;
95
+ // ─── File I/O ────────────────────────────────────────────────────────────────
96
+ function healthPath(cwd) {
97
+ return join(cwd ?? process.cwd(), HEALTH_FILE);
98
+ }
99
+ function loadRaw(cwd) {
100
+ const p = healthPath(cwd);
101
+ if (!existsSync(p))
102
+ return { states: {}, session: null };
103
+ try {
104
+ return JSON.parse(readFileSync(p, 'utf8'));
105
+ }
106
+ catch {
107
+ return { states: {}, session: null };
108
+ }
109
+ }
110
+ function saveRaw(data, cwd) {
111
+ const p = healthPath(cwd);
112
+ mkdirSync(join(cwd ?? process.cwd(), '.dualbrain'), { recursive: true });
113
+ writeFileSync(p, JSON.stringify(data, null, 2) + '\n', 'utf8');
114
+ }
115
+ function key(provider, modelClass) {
116
+ return `${provider}:${modelClass}`;
117
+ }
118
+ // ─── Session helpers ──────────────────────────────────────────────────────────
119
+ function ensureSession(data) {
120
+ if (!data.session || typeof data.session !== 'object') {
121
+ data.session = { startedAt: new Date().toISOString(), dispatches: [] };
122
+ }
123
+ if (!Array.isArray(data.session.dispatches))
124
+ data.session.dispatches = [];
125
+ return data;
126
+ }
127
+ // ─── Exported: getHealth ─────────────────────────────────────────────────────
128
+ /**
129
+ * Return the raw health data (states + session).
130
+ */
131
+ export function getHealth(cwd) {
132
+ return loadRaw(cwd);
133
+ }
134
+ // ─── Exported: markHot ───────────────────────────────────────────────────────
135
+ /**
136
+ * Mark a provider+model as hot (rate-limited). Escalates cooldown on repeat.
137
+ */
138
+ export function markHot(provider, modelClass, cwd) {
139
+ const data = loadRaw(cwd);
140
+ const k = key(provider, modelClass);
141
+ const existing = data.states[k] ?? {};
142
+ const now = Date.now();
143
+ // Count how many times this was already marked hot within the escalation window
144
+ let attempts = (existing.attempts ?? 0);
145
+ const sinceMs = existing.since ? now - Date.parse(existing.since) : Infinity;
146
+ if (sinceMs < ESCALATION_WINDOW_MS && existing.status === 'hot') {
147
+ attempts += 1;
148
+ }
149
+ else if (existing.status !== 'hot') {
150
+ // First time hot (or was healthy/probing before): reset counter to 1
151
+ attempts = 1;
152
+ }
153
+ // Clamp to ladder length
154
+ const ladderIdx = Math.min(attempts - 1, COOLDOWN_LADDER.length - 1);
155
+ const cooldownMinutes = COOLDOWN_LADDER[ladderIdx];
156
+ data.states[k] = {
157
+ status: 'hot',
158
+ since: new Date().toISOString(),
159
+ cooldownMinutes,
160
+ attempts,
161
+ };
162
+ saveRaw(data, cwd);
163
+ }
164
+ // ─── Exported: markDegraded ──────────────────────────────────────────────────
165
+ /**
166
+ * Signal soft degradation (slow responses, elevated errors) without full cooldown.
167
+ */
168
+ export function markDegraded(provider, modelClass, cwd) {
169
+ const data = loadRaw(cwd);
170
+ const k = key(provider, modelClass);
171
+ // Only downgrade if currently healthy or probing — never upgrade from hot
172
+ if (!data.states[k] || ['healthy', 'probing'].includes(data.states[k].status)) {
173
+ data.states[k] = { status: 'degraded', since: new Date().toISOString() };
174
+ saveRaw(data, cwd);
175
+ }
176
+ }
177
+ // ─── Exported: markHealthy ───────────────────────────────────────────────────
178
+ /**
179
+ * Clear hot/degraded state and reset attempt counter.
180
+ */
181
+ export function markHealthy(provider, modelClass, cwd) {
182
+ const data = loadRaw(cwd);
183
+ const k = key(provider, modelClass);
184
+ data.states[k] = { status: 'healthy', since: new Date().toISOString() };
185
+ saveRaw(data, cwd);
186
+ }
187
+ // ─── Exported: checkCooldown ─────────────────────────────────────────────────
188
+ /**
189
+ * Returns true if the cooldown for a hot provider+model has expired.
190
+ * Side-effect: transitions status from 'hot' to 'probing' when expired.
191
+ */
192
+ export function checkCooldown(provider, modelClass, cwd) {
193
+ const data = loadRaw(cwd);
194
+ const k = key(provider, modelClass);
195
+ const state = data.states[k];
196
+ if (!state || state.status !== 'hot')
197
+ return true; // not hot → no cooldown
198
+ const sinceMs = Date.parse(state.since);
199
+ const cooldownMs = (state.cooldownMinutes ?? 5) * 60 * 1000;
200
+ const expired = Date.now() - sinceMs >= cooldownMs;
201
+ if (expired) {
202
+ // Transition to probing
203
+ data.states[k] = { ...state, status: 'probing', probingAt: new Date().toISOString() };
204
+ saveRaw(data, cwd);
205
+ return true;
206
+ }
207
+ return false;
208
+ }
209
+ // ─── Exported: getProviderScore ──────────────────────────────────────────────
210
+ /**
211
+ * Returns a 0-100 routing preference score for a provider+model.
212
+ * healthy=100, degraded=50, probing=25, hot=0
213
+ */
214
+ export function getProviderScore(provider, modelClass, cwd) {
215
+ const data = loadRaw(cwd);
216
+ const k = key(provider, modelClass);
217
+ const state = data.states[k];
218
+ if (!state)
219
+ return 100;
220
+ switch (state.status) {
221
+ case 'healthy': return 100;
222
+ case 'degraded': return 50;
223
+ case 'probing': return 25;
224
+ case 'hot': return 0;
225
+ default: return 100;
226
+ }
227
+ }
228
+ // ─── Exported: recordDispatch ────────────────────────────────────────────────
229
+ /**
230
+ * Log a successful dispatch for session tracking.
231
+ */
232
+ export function recordDispatch(provider, modelClass, tokens, cwd) {
233
+ const data = ensureSession(loadRaw(cwd));
234
+ data.session.dispatches.push({
235
+ provider,
236
+ model: modelClass,
237
+ tokens: tokens ?? 0,
238
+ at: new Date().toISOString(),
239
+ });
240
+ saveRaw(data, cwd);
241
+ }
242
+ // ─── Exported: getSessionStats ───────────────────────────────────────────────
243
+ /**
244
+ * Return per-provider aggregated call + token counts for the current session.
245
+ */
246
+ export function getSessionStats(cwd) {
247
+ const { session } = loadRaw(cwd);
248
+ const stats = {};
249
+ for (const d of (session?.dispatches ?? [])) {
250
+ if (!stats[d.provider])
251
+ stats[d.provider] = { calls: 0, tokens: 0 };
252
+ stats[d.provider].calls += 1;
253
+ stats[d.provider].tokens += (d.tokens ?? 0);
254
+ }
255
+ return stats;
256
+ }
257
+ // ─── Exported: resetHealth ───────────────────────────────────────────────────
258
+ /**
259
+ * Wipe all health state (states + session).
260
+ */
261
+ export function resetHealth(cwd) {
262
+ saveRaw({ states: {}, session: null }, cwd);
263
+ }
264
+ // ─── Network timeout guard ────────────────────────────────────────────────────
265
+ /**
266
+ * Ping a provider URL with a bounded timeout so slow networks don't hang the CLI.
267
+ *
268
+ * Uses AbortController to enforce the deadline. On timeout or network error the
269
+ * caller receives { ok: false, status: 'timeout' } rather than hanging forever.
270
+ */
271
+ export async function pingProvider(url, opts = {}) {
272
+ const timeoutMs = opts.timeoutMs ?? HEALTH_CHECK_TIMEOUT_MS;
273
+ const controller = new AbortController();
274
+ const timer = setTimeout(() => controller.abort(), timeoutMs);
275
+ try {
276
+ const res = await fetch(url, {
277
+ method: 'HEAD',
278
+ signal: controller.signal,
279
+ headers: opts.headers ?? {},
280
+ });
281
+ clearTimeout(timer);
282
+ return { ok: res.ok, status: 'ok', detail: String(res.status) };
283
+ }
284
+ catch (err) {
285
+ clearTimeout(timer);
286
+ const isTimeout = err instanceof Error && err.name === 'AbortError';
287
+ return {
288
+ ok: false,
289
+ status: isTimeout ? 'timeout' : 'error',
290
+ detail: isTimeout ? `Provider health: unknown (timeout after ${timeoutMs}ms)` : String(err instanceof Error ? err.message : err),
291
+ };
292
+ }
293
+ }
294
+ // ─── Remaining cooldown helper (used by status display) ──────────────────────
295
+ /**
296
+ * Returns remaining cooldown in minutes for a hot provider+model, or 0.
297
+ */
298
+ export function remainingCooldownMinutes(provider, modelClass, cwd) {
299
+ const data = loadRaw(cwd);
300
+ const k = key(provider, modelClass);
301
+ const state = data.states[k];
302
+ if (!state || state.status !== 'hot')
303
+ return 0;
304
+ const elapsedMs = Date.now() - Date.parse(state.since);
305
+ const cooldownMs = (state.cooldownMinutes ?? 5) * 60 * 1000;
306
+ const remaining = cooldownMs - elapsedMs;
307
+ return remaining > 0 ? Math.ceil(remaining / 60_000) : 0;
308
+ }
309
+ // ─── Hook health check ────────────────────────────────────────────────────────
310
+ /**
311
+ * Extract the file path from a hook command string.
312
+ * Handles patterns like `node /path/to/hook.mjs` or `node /path/to/hook.mjs --flag`.
313
+ * Returns null if the pattern doesn't match.
314
+ */
315
+ function extractHookPath(command) {
316
+ if (typeof command !== 'string')
317
+ return null;
318
+ const match = command.match(/node\s+([^\s]+\.mjs)/);
319
+ return match ? match[1] : null;
320
+ }
321
+ /**
322
+ * Collect all hook entries from a settings object, returning
323
+ * [{ command, eventType }] pairs.
324
+ */
325
+ function collectHookCommands(settings) {
326
+ const entries = [];
327
+ const hooks = (settings?.hooks ?? {});
328
+ for (const [eventType, matchers] of Object.entries(hooks)) {
329
+ if (!Array.isArray(matchers))
330
+ continue;
331
+ for (const matcher of matchers) {
332
+ const m = matcher;
333
+ for (const hook of (m?.hooks ?? [])) {
334
+ if (hook?.type === 'command' && typeof hook.command === 'string') {
335
+ entries.push({ command: hook.command, eventType });
336
+ }
337
+ }
338
+ }
339
+ }
340
+ return entries;
341
+ }
342
+ /**
343
+ * Load and parse a JSON settings file. Returns {} on any error.
344
+ */
345
+ function loadSettings(filePath) {
346
+ if (!existsSync(filePath))
347
+ return {};
348
+ try {
349
+ return JSON.parse(readFileSync(filePath, 'utf8'));
350
+ }
351
+ catch {
352
+ return {};
353
+ }
354
+ }
355
+ /**
356
+ * Check the health of all hook files referenced in project-local and global
357
+ * Claude Code settings.
358
+ */
359
+ export function checkHookHealth(cwd) {
360
+ const root = cwd ?? process.cwd();
361
+ const home = process.env.HOME || '/root';
362
+ const localSettingsPath = join(root, '.claude', 'settings.local.json');
363
+ const globalSettingsPath = join(home, '.claude', 'settings.json');
364
+ const localSettings = loadSettings(localSettingsPath);
365
+ const globalSettings = loadSettings(globalSettingsPath);
366
+ const localCommands = collectHookCommands(localSettings);
367
+ const globalCommands = collectHookCommands(globalSettings);
368
+ // Build a set of hook paths from local settings for duplicate detection
369
+ const localPaths = new Set(localCommands.map(e => extractHookPath(e.command)).filter((p) => p !== null));
370
+ const globalPaths = new Set(globalCommands.map(e => extractHookPath(e.command)).filter((p) => p !== null));
371
+ // Paths that appear in both local and global are conflicts
372
+ const conflictPaths = new Set([...localPaths].filter(p => globalPaths.has(p)));
373
+ const hookResults = [];
374
+ const conflicts = [];
375
+ const degraded = [];
376
+ const missing = [];
377
+ function processEntry(entry, source) {
378
+ const path = extractHookPath(entry.command);
379
+ if (!path)
380
+ return; // non-node hook — skip
381
+ const fileExists = existsSync(path);
382
+ const isDuplicate = conflictPaths.has(path);
383
+ let syntaxValid = false;
384
+ if (fileExists) {
385
+ try {
386
+ const check = spawnSync('node', ['--check', path], {
387
+ timeout: 3000,
388
+ encoding: 'utf8',
389
+ });
390
+ syntaxValid = check.status === 0;
391
+ }
392
+ catch {
393
+ syntaxValid = false;
394
+ }
395
+ }
396
+ const record = { path, exists: fileExists, syntaxValid, source, duplicate: isDuplicate };
397
+ hookResults.push(record);
398
+ if (!fileExists) {
399
+ missing.push(`${source}: ${path} (file not found)`);
400
+ }
401
+ else if (!syntaxValid) {
402
+ degraded.push(`${source}: ${path} (syntax error)`);
403
+ }
404
+ if (isDuplicate && source === 'global') {
405
+ // Only report the conflict once (when we encounter it from the global side)
406
+ conflicts.push(`Hook defined in both local and global settings: ${path}`);
407
+ }
408
+ }
409
+ for (const entry of localCommands)
410
+ processEntry(entry, 'local');
411
+ for (const entry of globalCommands)
412
+ processEntry(entry, 'global');
413
+ const healthy = missing.length === 0 && degraded.length === 0 && conflicts.length === 0;
414
+ return { healthy, hooks: hookResults, conflicts, degraded, missing };
415
+ }
416
+ // ─── Hook smoke test ──────────────────────────────────────────────────────────
417
+ /**
418
+ * Run a hook with deliberately malformed input to verify it fails open
419
+ * (exits 0 even on bad input, so it never blocks the Claude Code flow).
420
+ */
421
+ export function runHookSmoke(hookPath) {
422
+ try {
423
+ const result = spawnSync('node', [hookPath], {
424
+ input: 'not valid json',
425
+ timeout: 5000,
426
+ encoding: 'utf8',
427
+ });
428
+ // Exit 0 = fails open (good), Exit non-0 = fails closed (bad)
429
+ return { path: hookPath, failsOpen: result.status === 0, stderr: (result.stderr || '').slice(0, 200) };
430
+ }
431
+ catch {
432
+ return { path: hookPath, failsOpen: false, error: 'smoke test crashed' };
433
+ }
434
+ }
435
+ //# sourceMappingURL=health.js.map