@coool/opencode-adaptive 0.0.0-stage → 1.0.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 (440) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +98 -2
  3. package/dist/adapters/codex-capacity/index.d.ts +5 -0
  4. package/dist/adapters/codex-capacity/index.d.ts.map +1 -0
  5. package/dist/adapters/codex-capacity/index.js +5 -0
  6. package/dist/adapters/codex-capacity/index.js.map +1 -0
  7. package/dist/adapters/codex-capacity/parse.d.ts +28 -0
  8. package/dist/adapters/codex-capacity/parse.d.ts.map +1 -0
  9. package/dist/adapters/codex-capacity/parse.js +130 -0
  10. package/dist/adapters/codex-capacity/parse.js.map +1 -0
  11. package/dist/adapters/codex-capacity/reading.d.ts +10 -0
  12. package/dist/adapters/codex-capacity/reading.d.ts.map +1 -0
  13. package/dist/adapters/codex-capacity/reading.js +45 -0
  14. package/dist/adapters/codex-capacity/reading.js.map +1 -0
  15. package/dist/adapters/codex-capacity/sensor.d.ts +24 -0
  16. package/dist/adapters/codex-capacity/sensor.d.ts.map +1 -0
  17. package/dist/adapters/codex-capacity/sensor.js +30 -0
  18. package/dist/adapters/codex-capacity/sensor.js.map +1 -0
  19. package/dist/adapters/codex-capacity/types.d.ts +35 -0
  20. package/dist/adapters/codex-capacity/types.d.ts.map +1 -0
  21. package/dist/adapters/codex-capacity/types.js +4 -0
  22. package/dist/adapters/codex-capacity/types.js.map +1 -0
  23. package/dist/adapters/opencode/escalation-tool.d.ts +52 -0
  24. package/dist/adapters/opencode/escalation-tool.d.ts.map +1 -0
  25. package/dist/adapters/opencode/escalation-tool.js +59 -0
  26. package/dist/adapters/opencode/escalation-tool.js.map +1 -0
  27. package/dist/adapters/opencode/events.d.ts +24 -0
  28. package/dist/adapters/opencode/events.d.ts.map +1 -0
  29. package/dist/adapters/opencode/events.js +68 -0
  30. package/dist/adapters/opencode/events.js.map +1 -0
  31. package/dist/adapters/opencode/hooks.d.ts +35 -0
  32. package/dist/adapters/opencode/hooks.d.ts.map +1 -0
  33. package/dist/adapters/opencode/hooks.js +12 -0
  34. package/dist/adapters/opencode/hooks.js.map +1 -0
  35. package/dist/adapters/opencode/index.d.ts +17 -0
  36. package/dist/adapters/opencode/index.d.ts.map +1 -0
  37. package/dist/adapters/opencode/index.js +9 -0
  38. package/dist/adapters/opencode/index.js.map +1 -0
  39. package/dist/adapters/opencode/inventory.d.ts +31 -0
  40. package/dist/adapters/opencode/inventory.d.ts.map +1 -0
  41. package/dist/adapters/opencode/inventory.js +53 -0
  42. package/dist/adapters/opencode/inventory.js.map +1 -0
  43. package/dist/adapters/opencode/report.d.ts +92 -0
  44. package/dist/adapters/opencode/report.d.ts.map +1 -0
  45. package/dist/adapters/opencode/report.js +145 -0
  46. package/dist/adapters/opencode/report.js.map +1 -0
  47. package/dist/adapters/opencode/session-ops.d.ts +40 -0
  48. package/dist/adapters/opencode/session-ops.d.ts.map +1 -0
  49. package/dist/adapters/opencode/session-ops.js +32 -0
  50. package/dist/adapters/opencode/session-ops.js.map +1 -0
  51. package/dist/adapters/opencode/storage.d.ts +16 -0
  52. package/dist/adapters/opencode/storage.d.ts.map +1 -0
  53. package/dist/adapters/opencode/storage.js +8 -0
  54. package/dist/adapters/opencode/storage.js.map +1 -0
  55. package/dist/adapters/opencode/tier-tool.d.ts +38 -0
  56. package/dist/adapters/opencode/tier-tool.d.ts.map +1 -0
  57. package/dist/adapters/opencode/tier-tool.js +72 -0
  58. package/dist/adapters/opencode/tier-tool.js.map +1 -0
  59. package/dist/adapters/opencode/types.d.ts +102 -0
  60. package/dist/adapters/opencode/types.d.ts.map +1 -0
  61. package/dist/adapters/opencode/types.js +2 -0
  62. package/dist/adapters/opencode/types.js.map +1 -0
  63. package/dist/core/compatibility/gate.d.ts +10 -0
  64. package/dist/core/compatibility/gate.d.ts.map +1 -0
  65. package/dist/core/compatibility/gate.js +55 -0
  66. package/dist/core/compatibility/gate.js.map +1 -0
  67. package/dist/core/compatibility/index.d.ts +3 -0
  68. package/dist/core/compatibility/index.d.ts.map +1 -0
  69. package/dist/core/compatibility/index.js +3 -0
  70. package/dist/core/compatibility/index.js.map +1 -0
  71. package/dist/core/compatibility/types.d.ts +54 -0
  72. package/dist/core/compatibility/types.d.ts.map +1 -0
  73. package/dist/core/compatibility/types.js +27 -0
  74. package/dist/core/compatibility/types.js.map +1 -0
  75. package/dist/core/scheduler/admit.d.ts +7 -0
  76. package/dist/core/scheduler/admit.d.ts.map +1 -0
  77. package/dist/core/scheduler/admit.js +153 -0
  78. package/dist/core/scheduler/admit.js.map +1 -0
  79. package/dist/core/scheduler/escalate.d.ts +7 -0
  80. package/dist/core/scheduler/escalate.d.ts.map +1 -0
  81. package/dist/core/scheduler/escalate.js +56 -0
  82. package/dist/core/scheduler/escalate.js.map +1 -0
  83. package/dist/core/scheduler/index.d.ts +5 -0
  84. package/dist/core/scheduler/index.d.ts.map +1 -0
  85. package/dist/core/scheduler/index.js +5 -0
  86. package/dist/core/scheduler/index.js.map +1 -0
  87. package/dist/core/scheduler/mode.d.ts +9 -0
  88. package/dist/core/scheduler/mode.d.ts.map +1 -0
  89. package/dist/core/scheduler/mode.js +10 -0
  90. package/dist/core/scheduler/mode.js.map +1 -0
  91. package/dist/core/scheduler/types.d.ts +143 -0
  92. package/dist/core/scheduler/types.d.ts.map +1 -0
  93. package/dist/core/scheduler/types.js +74 -0
  94. package/dist/core/scheduler/types.js.map +1 -0
  95. package/dist/core/tier-policy/index.d.ts +4 -0
  96. package/dist/core/tier-policy/index.d.ts.map +1 -0
  97. package/dist/core/tier-policy/index.js +4 -0
  98. package/dist/core/tier-policy/index.js.map +1 -0
  99. package/dist/core/tier-policy/resolve.d.ts +19 -0
  100. package/dist/core/tier-policy/resolve.d.ts.map +1 -0
  101. package/dist/core/tier-policy/resolve.js +52 -0
  102. package/dist/core/tier-policy/resolve.js.map +1 -0
  103. package/dist/core/tier-policy/tier-list.d.ts +11 -0
  104. package/dist/core/tier-policy/tier-list.d.ts.map +1 -0
  105. package/dist/core/tier-policy/tier-list.js +23 -0
  106. package/dist/core/tier-policy/tier-list.js.map +1 -0
  107. package/dist/core/tier-policy/types.d.ts +85 -0
  108. package/dist/core/tier-policy/types.d.ts.map +1 -0
  109. package/dist/core/tier-policy/types.js +45 -0
  110. package/dist/core/tier-policy/types.js.map +1 -0
  111. package/dist/core/work-unit/index.d.ts +4 -0
  112. package/dist/core/work-unit/index.d.ts.map +1 -0
  113. package/dist/core/work-unit/index.js +4 -0
  114. package/dist/core/work-unit/index.js.map +1 -0
  115. package/dist/core/work-unit/interruption.d.ts +8 -0
  116. package/dist/core/work-unit/interruption.d.ts.map +1 -0
  117. package/dist/core/work-unit/interruption.js +12 -0
  118. package/dist/core/work-unit/interruption.js.map +1 -0
  119. package/dist/core/work-unit/tracker.d.ts +46 -0
  120. package/dist/core/work-unit/tracker.d.ts.map +1 -0
  121. package/dist/core/work-unit/tracker.js +136 -0
  122. package/dist/core/work-unit/tracker.js.map +1 -0
  123. package/dist/core/work-unit/types.d.ts +146 -0
  124. package/dist/core/work-unit/types.d.ts.map +1 -0
  125. package/dist/core/work-unit/types.js +23 -0
  126. package/dist/core/work-unit/types.js.map +1 -0
  127. package/dist/execution/continuation/execute.d.ts +19 -0
  128. package/dist/execution/continuation/execute.d.ts.map +1 -0
  129. package/dist/execution/continuation/execute.js +31 -0
  130. package/dist/execution/continuation/execute.js.map +1 -0
  131. package/dist/execution/continuation/index.d.ts +6 -0
  132. package/dist/execution/continuation/index.d.ts.map +1 -0
  133. package/dist/execution/continuation/index.js +5 -0
  134. package/dist/execution/continuation/index.js.map +1 -0
  135. package/dist/execution/continuation/ledger.d.ts +20 -0
  136. package/dist/execution/continuation/ledger.d.ts.map +1 -0
  137. package/dist/execution/continuation/ledger.js +31 -0
  138. package/dist/execution/continuation/ledger.js.map +1 -0
  139. package/dist/execution/continuation/plan.d.ts +13 -0
  140. package/dist/execution/continuation/plan.d.ts.map +1 -0
  141. package/dist/execution/continuation/plan.js +20 -0
  142. package/dist/execution/continuation/plan.js.map +1 -0
  143. package/dist/execution/continuation/prompts.d.ts +8 -0
  144. package/dist/execution/continuation/prompts.d.ts.map +1 -0
  145. package/dist/execution/continuation/prompts.js +8 -0
  146. package/dist/execution/continuation/prompts.js.map +1 -0
  147. package/dist/execution/continuation/types.d.ts +70 -0
  148. package/dist/execution/continuation/types.d.ts.map +1 -0
  149. package/dist/execution/continuation/types.js +15 -0
  150. package/dist/execution/continuation/types.js.map +1 -0
  151. package/dist/execution/escalation/index.d.ts +2 -0
  152. package/dist/execution/escalation/index.d.ts.map +1 -0
  153. package/dist/execution/escalation/index.js +2 -0
  154. package/dist/execution/escalation/index.js.map +1 -0
  155. package/dist/execution/escalation/types.d.ts +31 -0
  156. package/dist/execution/escalation/types.d.ts.map +1 -0
  157. package/dist/execution/escalation/types.js +49 -0
  158. package/dist/execution/escalation/types.js.map +1 -0
  159. package/dist/execution/index.d.ts +5 -0
  160. package/dist/execution/index.d.ts.map +1 -0
  161. package/dist/execution/index.js +5 -0
  162. package/dist/execution/index.js.map +1 -0
  163. package/dist/execution/parking/index.d.ts +3 -0
  164. package/dist/execution/parking/index.d.ts.map +1 -0
  165. package/dist/execution/parking/index.js +2 -0
  166. package/dist/execution/parking/index.js.map +1 -0
  167. package/dist/execution/parking/plan.d.ts +40 -0
  168. package/dist/execution/parking/plan.d.ts.map +1 -0
  169. package/dist/execution/parking/plan.js +34 -0
  170. package/dist/execution/parking/plan.js.map +1 -0
  171. package/dist/execution/recovery/gate.d.ts +20 -0
  172. package/dist/execution/recovery/gate.d.ts.map +1 -0
  173. package/dist/execution/recovery/gate.js +23 -0
  174. package/dist/execution/recovery/gate.js.map +1 -0
  175. package/dist/execution/recovery/index.d.ts +3 -0
  176. package/dist/execution/recovery/index.d.ts.map +1 -0
  177. package/dist/execution/recovery/index.js +2 -0
  178. package/dist/execution/recovery/index.js.map +1 -0
  179. package/dist/execution/retry/decide.d.ts +30 -0
  180. package/dist/execution/retry/decide.d.ts.map +1 -0
  181. package/dist/execution/retry/decide.js +76 -0
  182. package/dist/execution/retry/decide.js.map +1 -0
  183. package/dist/execution/retry/index.d.ts +3 -0
  184. package/dist/execution/retry/index.d.ts.map +1 -0
  185. package/dist/execution/retry/index.js +3 -0
  186. package/dist/execution/retry/index.js.map +1 -0
  187. package/dist/execution/retry/types.d.ts +66 -0
  188. package/dist/execution/retry/types.d.ts.map +1 -0
  189. package/dist/execution/retry/types.js +9 -0
  190. package/dist/execution/retry/types.js.map +1 -0
  191. package/dist/gui-experimental.cjs +1 -0
  192. package/dist/gui.d.ts +17 -0
  193. package/dist/gui.d.ts.map +1 -0
  194. package/dist/gui.js +70 -0
  195. package/dist/gui.js.map +1 -0
  196. package/dist/health/capacity/index.d.ts +4 -0
  197. package/dist/health/capacity/index.d.ts.map +1 -0
  198. package/dist/health/capacity/index.js +4 -0
  199. package/dist/health/capacity/index.js.map +1 -0
  200. package/dist/health/capacity/merge.d.ts +58 -0
  201. package/dist/health/capacity/merge.d.ts.map +1 -0
  202. package/dist/health/capacity/merge.js +154 -0
  203. package/dist/health/capacity/merge.js.map +1 -0
  204. package/dist/health/capacity/registry.d.ts +41 -0
  205. package/dist/health/capacity/registry.d.ts.map +1 -0
  206. package/dist/health/capacity/registry.js +106 -0
  207. package/dist/health/capacity/registry.js.map +1 -0
  208. package/dist/health/capacity/types.d.ts +74 -0
  209. package/dist/health/capacity/types.d.ts.map +1 -0
  210. package/dist/health/capacity/types.js +6 -0
  211. package/dist/health/capacity/types.js.map +1 -0
  212. package/dist/health/circuit-breaker/breaker.d.ts +84 -0
  213. package/dist/health/circuit-breaker/breaker.d.ts.map +1 -0
  214. package/dist/health/circuit-breaker/breaker.js +132 -0
  215. package/dist/health/circuit-breaker/breaker.js.map +1 -0
  216. package/dist/health/circuit-breaker/index.d.ts +3 -0
  217. package/dist/health/circuit-breaker/index.d.ts.map +1 -0
  218. package/dist/health/circuit-breaker/index.js +3 -0
  219. package/dist/health/circuit-breaker/index.js.map +1 -0
  220. package/dist/health/circuit-breaker/types.d.ts +53 -0
  221. package/dist/health/circuit-breaker/types.d.ts.map +1 -0
  222. package/dist/health/circuit-breaker/types.js +13 -0
  223. package/dist/health/circuit-breaker/types.js.map +1 -0
  224. package/dist/health/classifier/classify.d.ts +9 -0
  225. package/dist/health/classifier/classify.d.ts.map +1 -0
  226. package/dist/health/classifier/classify.js +245 -0
  227. package/dist/health/classifier/classify.js.map +1 -0
  228. package/dist/health/classifier/index.d.ts +3 -0
  229. package/dist/health/classifier/index.d.ts.map +1 -0
  230. package/dist/health/classifier/index.js +3 -0
  231. package/dist/health/classifier/index.js.map +1 -0
  232. package/dist/health/classifier/types.d.ts +72 -0
  233. package/dist/health/classifier/types.d.ts.map +1 -0
  234. package/dist/health/classifier/types.js +27 -0
  235. package/dist/health/classifier/types.js.map +1 -0
  236. package/dist/health/index.d.ts +5 -0
  237. package/dist/health/index.d.ts.map +1 -0
  238. package/dist/health/index.js +5 -0
  239. package/dist/health/index.js.map +1 -0
  240. package/dist/health/resource-health/index.d.ts +5 -0
  241. package/dist/health/resource-health/index.d.ts.map +1 -0
  242. package/dist/health/resource-health/index.js +5 -0
  243. package/dist/health/resource-health/index.js.map +1 -0
  244. package/dist/health/resource-health/key.d.ts +19 -0
  245. package/dist/health/resource-health/key.d.ts.map +1 -0
  246. package/dist/health/resource-health/key.js +54 -0
  247. package/dist/health/resource-health/key.js.map +1 -0
  248. package/dist/health/resource-health/registry.d.ts +41 -0
  249. package/dist/health/resource-health/registry.d.ts.map +1 -0
  250. package/dist/health/resource-health/registry.js +258 -0
  251. package/dist/health/resource-health/registry.js.map +1 -0
  252. package/dist/health/resource-health/transitions.d.ts +11 -0
  253. package/dist/health/resource-health/transitions.d.ts.map +1 -0
  254. package/dist/health/resource-health/transitions.js +165 -0
  255. package/dist/health/resource-health/transitions.js.map +1 -0
  256. package/dist/health/resource-health/types.d.ts +116 -0
  257. package/dist/health/resource-health/types.d.ts.map +1 -0
  258. package/dist/health/resource-health/types.js +43 -0
  259. package/dist/health/resource-health/types.js.map +1 -0
  260. package/dist/index.d.ts +17 -0
  261. package/dist/index.d.ts.map +1 -0
  262. package/dist/index.js +80 -0
  263. package/dist/index.js.map +1 -0
  264. package/dist/plugin-id.d.ts +3 -0
  265. package/dist/plugin-id.d.ts.map +1 -0
  266. package/dist/plugin-id.js +3 -0
  267. package/dist/plugin-id.js.map +1 -0
  268. package/dist/rpc/definition.d.ts +100 -0
  269. package/dist/rpc/definition.d.ts.map +1 -0
  270. package/dist/rpc/definition.js +104 -0
  271. package/dist/rpc/definition.js.map +1 -0
  272. package/dist/rpc/handlers.d.ts +65 -0
  273. package/dist/rpc/handlers.d.ts.map +1 -0
  274. package/dist/rpc/handlers.js +111 -0
  275. package/dist/rpc/handlers.js.map +1 -0
  276. package/dist/rpc/status.d.ts +43 -0
  277. package/dist/rpc/status.d.ts.map +1 -0
  278. package/dist/rpc/status.js +45 -0
  279. package/dist/rpc/status.js.map +1 -0
  280. package/dist/rpc.d.ts +11 -0
  281. package/dist/rpc.d.ts.map +1 -0
  282. package/dist/rpc.js +8 -0
  283. package/dist/rpc.js.map +1 -0
  284. package/dist/state/capacity/index.d.ts +4 -0
  285. package/dist/state/capacity/index.d.ts.map +1 -0
  286. package/dist/state/capacity/index.js +4 -0
  287. package/dist/state/capacity/index.js.map +1 -0
  288. package/dist/state/capacity/parse.d.ts +3 -0
  289. package/dist/state/capacity/parse.d.ts.map +1 -0
  290. package/dist/state/capacity/parse.js +110 -0
  291. package/dist/state/capacity/parse.js.map +1 -0
  292. package/dist/state/capacity/store.d.ts +19 -0
  293. package/dist/state/capacity/store.d.ts.map +1 -0
  294. package/dist/state/capacity/store.js +64 -0
  295. package/dist/state/capacity/store.js.map +1 -0
  296. package/dist/state/capacity/types.d.ts +38 -0
  297. package/dist/state/capacity/types.d.ts.map +1 -0
  298. package/dist/state/capacity/types.js +11 -0
  299. package/dist/state/capacity/types.js.map +1 -0
  300. package/dist/state/health/index.d.ts +5 -0
  301. package/dist/state/health/index.d.ts.map +1 -0
  302. package/dist/state/health/index.js +4 -0
  303. package/dist/state/health/index.js.map +1 -0
  304. package/dist/state/health/parse.d.ts +3 -0
  305. package/dist/state/health/parse.d.ts.map +1 -0
  306. package/dist/state/health/parse.js +121 -0
  307. package/dist/state/health/parse.js.map +1 -0
  308. package/dist/state/health/store.d.ts +18 -0
  309. package/dist/state/health/store.d.ts.map +1 -0
  310. package/dist/state/health/store.js +55 -0
  311. package/dist/state/health/store.js.map +1 -0
  312. package/dist/state/health/types.d.ts +24 -0
  313. package/dist/state/health/types.d.ts.map +1 -0
  314. package/dist/state/health/types.js +5 -0
  315. package/dist/state/health/types.js.map +1 -0
  316. package/dist/state/parked-work/index.d.ts +5 -0
  317. package/dist/state/parked-work/index.d.ts.map +1 -0
  318. package/dist/state/parked-work/index.js +4 -0
  319. package/dist/state/parked-work/index.js.map +1 -0
  320. package/dist/state/parked-work/parse.d.ts +7 -0
  321. package/dist/state/parked-work/parse.d.ts.map +1 -0
  322. package/dist/state/parked-work/parse.js +83 -0
  323. package/dist/state/parked-work/parse.js.map +1 -0
  324. package/dist/state/parked-work/store.d.ts +18 -0
  325. package/dist/state/parked-work/store.d.ts.map +1 -0
  326. package/dist/state/parked-work/store.js +81 -0
  327. package/dist/state/parked-work/store.js.map +1 -0
  328. package/dist/state/parked-work/types.d.ts +42 -0
  329. package/dist/state/parked-work/types.d.ts.map +1 -0
  330. package/dist/state/parked-work/types.js +7 -0
  331. package/dist/state/parked-work/types.js.map +1 -0
  332. package/dist/state/receipts/bound.d.ts +15 -0
  333. package/dist/state/receipts/bound.d.ts.map +1 -0
  334. package/dist/state/receipts/bound.js +77 -0
  335. package/dist/state/receipts/bound.js.map +1 -0
  336. package/dist/state/receipts/index.d.ts +7 -0
  337. package/dist/state/receipts/index.d.ts.map +1 -0
  338. package/dist/state/receipts/index.js +5 -0
  339. package/dist/state/receipts/index.js.map +1 -0
  340. package/dist/state/receipts/parse.d.ts +7 -0
  341. package/dist/state/receipts/parse.d.ts.map +1 -0
  342. package/dist/state/receipts/parse.js +226 -0
  343. package/dist/state/receipts/parse.js.map +1 -0
  344. package/dist/state/receipts/store.d.ts +35 -0
  345. package/dist/state/receipts/store.d.ts.map +1 -0
  346. package/dist/state/receipts/store.js +128 -0
  347. package/dist/state/receipts/store.js.map +1 -0
  348. package/dist/state/receipts/types.d.ts +62 -0
  349. package/dist/state/receipts/types.d.ts.map +1 -0
  350. package/dist/state/receipts/types.js +12 -0
  351. package/dist/state/receipts/types.js.map +1 -0
  352. package/dist/state/session-modes/index.d.ts +5 -0
  353. package/dist/state/session-modes/index.d.ts.map +1 -0
  354. package/dist/state/session-modes/index.js +4 -0
  355. package/dist/state/session-modes/index.js.map +1 -0
  356. package/dist/state/session-modes/parse.d.ts +9 -0
  357. package/dist/state/session-modes/parse.d.ts.map +1 -0
  358. package/dist/state/session-modes/parse.js +62 -0
  359. package/dist/state/session-modes/parse.js.map +1 -0
  360. package/dist/state/session-modes/store.d.ts +21 -0
  361. package/dist/state/session-modes/store.d.ts.map +1 -0
  362. package/dist/state/session-modes/store.js +73 -0
  363. package/dist/state/session-modes/store.js.map +1 -0
  364. package/dist/state/session-modes/types.d.ts +42 -0
  365. package/dist/state/session-modes/types.d.ts.map +1 -0
  366. package/dist/state/session-modes/types.js +7 -0
  367. package/dist/state/session-modes/types.js.map +1 -0
  368. package/dist/state/settings/index.d.ts +5 -0
  369. package/dist/state/settings/index.d.ts.map +1 -0
  370. package/dist/state/settings/index.js +4 -0
  371. package/dist/state/settings/index.js.map +1 -0
  372. package/dist/state/settings/parse.d.ts +34 -0
  373. package/dist/state/settings/parse.d.ts.map +1 -0
  374. package/dist/state/settings/parse.js +261 -0
  375. package/dist/state/settings/parse.js.map +1 -0
  376. package/dist/state/settings/store.d.ts +22 -0
  377. package/dist/state/settings/store.d.ts.map +1 -0
  378. package/dist/state/settings/store.js +57 -0
  379. package/dist/state/settings/store.js.map +1 -0
  380. package/dist/state/settings/types.d.ts +63 -0
  381. package/dist/state/settings/types.d.ts.map +1 -0
  382. package/dist/state/settings/types.js +12 -0
  383. package/dist/state/settings/types.js.map +1 -0
  384. package/dist/supervisor/index.d.ts +5 -0
  385. package/dist/supervisor/index.d.ts.map +1 -0
  386. package/dist/supervisor/index.js +4 -0
  387. package/dist/supervisor/index.js.map +1 -0
  388. package/dist/supervisor/log.d.ts +11 -0
  389. package/dist/supervisor/log.d.ts.map +1 -0
  390. package/dist/supervisor/log.js +14 -0
  391. package/dist/supervisor/log.js.map +1 -0
  392. package/dist/supervisor/supervisor.d.ts +69 -0
  393. package/dist/supervisor/supervisor.d.ts.map +1 -0
  394. package/dist/supervisor/supervisor.js +1343 -0
  395. package/dist/supervisor/supervisor.js.map +1 -0
  396. package/dist/supervisor/types.d.ts +50 -0
  397. package/dist/supervisor/types.d.ts.map +1 -0
  398. package/dist/supervisor/types.js +3 -0
  399. package/dist/supervisor/types.js.map +1 -0
  400. package/dist/supervisor/view.d.ts +4 -0
  401. package/dist/supervisor/view.d.ts.map +1 -0
  402. package/dist/supervisor/view.js +4 -0
  403. package/dist/supervisor/view.js.map +1 -0
  404. package/dist/tui.d.ts +16 -0
  405. package/dist/tui.d.ts.map +1 -0
  406. package/dist/tui.js +252 -0
  407. package/dist/tui.js.map +1 -0
  408. package/dist/ui/gui/api.d.ts +18 -0
  409. package/dist/ui/gui/api.d.ts.map +1 -0
  410. package/dist/ui/gui/api.js +21 -0
  411. package/dist/ui/gui/api.js.map +1 -0
  412. package/dist/ui/gui/view.d.ts +27 -0
  413. package/dist/ui/gui/view.d.ts.map +1 -0
  414. package/dist/ui/gui/view.js +49 -0
  415. package/dist/ui/gui/view.js.map +1 -0
  416. package/dist/ui/tui/controller.d.ts +98 -0
  417. package/dist/ui/tui/controller.d.ts.map +1 -0
  418. package/dist/ui/tui/controller.js +399 -0
  419. package/dist/ui/tui/controller.js.map +1 -0
  420. package/dist/ui/tui/menu.d.ts +56 -0
  421. package/dist/ui/tui/menu.d.ts.map +1 -0
  422. package/dist/ui/tui/menu.js +176 -0
  423. package/dist/ui/tui/menu.js.map +1 -0
  424. package/dist/ui/tui/options.d.ts +20 -0
  425. package/dist/ui/tui/options.d.ts.map +1 -0
  426. package/dist/ui/tui/options.js +17 -0
  427. package/dist/ui/tui/options.js.map +1 -0
  428. package/dist/ui/tui/receipts.d.ts +22 -0
  429. package/dist/ui/tui/receipts.d.ts.map +1 -0
  430. package/dist/ui/tui/receipts.js +109 -0
  431. package/dist/ui/tui/receipts.js.map +1 -0
  432. package/dist/ui/tui/status.d.ts +23 -0
  433. package/dist/ui/tui/status.d.ts.map +1 -0
  434. package/dist/ui/tui/status.js +90 -0
  435. package/dist/ui/tui/status.js.map +1 -0
  436. package/dist/ui/tui/tiers.d.ts +52 -0
  437. package/dist/ui/tui/tiers.d.ts.map +1 -0
  438. package/dist/ui/tui/tiers.js +108 -0
  439. package/dist/ui/tui/tiers.js.map +1 -0
  440. package/package.json +85 -4
@@ -0,0 +1,258 @@
1
+ /**
2
+ * Resource health registry (ADP-007, ADP-019, ADP-021).
3
+ *
4
+ * Stateful façade over the pure transition layer: one record per resource
5
+ * key, an injected clock, and assessment that composes the record's chain of
6
+ * ancestor scopes. Time only advances through the injected clock — there are
7
+ * no timers; windows and breaker backoffs are evaluated (swept) lazily on
8
+ * every observation, assessment, and snapshot.
9
+ *
10
+ * The single-probe guarantee (ADP-019) lives here: `assess` synchronously
11
+ * flips a due open breaker to half-open and issues the probe ticket, so
12
+ * concurrent assessors can never observe two admissions.
13
+ */
14
+ import { admitProbe, breakerBlockWait, expireProbe, recordProbeFailure, recordProbeSuccess, } from "../circuit-breaker/breaker.js";
15
+ import { resourceChain, resourceKeyID } from "./key.js";
16
+ import { applyHealthEvent, initialRecord, sweepRecord } from "./transitions.js";
17
+ import { DEFAULT_HEALTH_CONFIG, } from "./types.js";
18
+ /**
19
+ * Severity of the three hard resource states. Used only to choose which
20
+ * blocker a report names when several scopes in a chain are blocked at once;
21
+ * every candidate still blocks regardless of which wins the report.
22
+ */
23
+ const HARD_BLOCK_SEVERITY = {
24
+ unavailable: 3,
25
+ "quota-exhausted": 2,
26
+ "rate-limited": 1,
27
+ };
28
+ function blocked(reason, key, retryAtMs) {
29
+ if (retryAtMs === undefined) {
30
+ return { kind: "blocked", reason, key };
31
+ }
32
+ return { kind: "blocked", reason, key, retryAtMs };
33
+ }
34
+ function hardBlocker(record, now) {
35
+ const retryAtMs = record.window === undefined ? undefined : record.window.until - now;
36
+ switch (record.health) {
37
+ case "unavailable":
38
+ return {
39
+ reason: "unavailable",
40
+ key: record.key,
41
+ retryAtMs: undefined,
42
+ severity: HARD_BLOCK_SEVERITY.unavailable,
43
+ };
44
+ case "quota_exhausted":
45
+ return {
46
+ reason: "quota-exhausted",
47
+ key: record.key,
48
+ retryAtMs,
49
+ severity: HARD_BLOCK_SEVERITY["quota-exhausted"],
50
+ };
51
+ case "rate_limited":
52
+ return {
53
+ reason: "rate-limited",
54
+ key: record.key,
55
+ retryAtMs,
56
+ severity: HARD_BLOCK_SEVERITY["rate-limited"],
57
+ };
58
+ default:
59
+ return undefined;
60
+ }
61
+ }
62
+ /** Most severe hard block across a chain; narrowest scope wins ties. */
63
+ function hardest(records, now) {
64
+ let hard;
65
+ for (const record of records) {
66
+ if (record === undefined) {
67
+ continue;
68
+ }
69
+ const candidate = hardBlocker(record, now);
70
+ if (candidate === undefined) {
71
+ continue;
72
+ }
73
+ if (hard === undefined || candidate.severity >= hard.severity) {
74
+ hard = candidate;
75
+ }
76
+ }
77
+ return hard;
78
+ }
79
+ export class ResourceHealthRegistry {
80
+ #records = new Map();
81
+ #clock;
82
+ #config;
83
+ #probeCounter = 0;
84
+ constructor(clock, config = DEFAULT_HEALTH_CONFIG) {
85
+ this.#clock = clock;
86
+ this.#config = config;
87
+ }
88
+ /**
89
+ * Seeds the registry from persisted records (restart / cross-instance
90
+ * reload). Records are swept against the current clock and inserted
91
+ * without persisting — hydration must not write back what it just read.
92
+ * A hydrated half_open record cannot keep its probe (the ticket lived in
93
+ * the previous instance's memory), so it re-opens due immediately — its
94
+ * backoff window had already elapsed when it went half-open, and the next
95
+ * assessment admits exactly one probe as usual.
96
+ */
97
+ hydrate(records) {
98
+ const now = this.#clock();
99
+ for (const record of records) {
100
+ const swept = sweepRecord(record, now);
101
+ const breaker = swept.breaker.state === "half_open"
102
+ ? {
103
+ state: "open",
104
+ failures: swept.breaker.failures,
105
+ openCount: swept.breaker.openCount,
106
+ reopenAt: now,
107
+ }
108
+ : swept.breaker;
109
+ this.#records.set(resourceKeyID(swept.key), { ...swept, breaker, updatedAt: now });
110
+ }
111
+ }
112
+ observe(event) {
113
+ const now = this.#clock();
114
+ const id = resourceKeyID(event.key);
115
+ const existing = this.#records.get(id);
116
+ const swept = existing === undefined ? initialRecord(event.key, now) : sweepRecord(existing, now);
117
+ const updated = applyHealthEvent(swept, event, now, this.#config);
118
+ this.#records.set(id, updated);
119
+ return updated;
120
+ }
121
+ #sweptRecord(key, now) {
122
+ const id = resourceKeyID(key);
123
+ const record = this.#records.get(id);
124
+ if (record === undefined) {
125
+ return undefined;
126
+ }
127
+ const swept = sweepRecord(record, now);
128
+ if (swept !== record) {
129
+ this.#records.set(id, swept);
130
+ }
131
+ return swept;
132
+ }
133
+ /**
134
+ * Assesses whether the resource may take new work right now, composing the
135
+ * full ancestor chain. Precedence: the most severe hard resource state
136
+ * wins (narrowest scope on ties), then the breaker scan (widest scope
137
+ * first — a due wide breaker is probed before a narrow one), then draining,
138
+ * then available.
139
+ */
140
+ assess(key) {
141
+ const now = this.#clock();
142
+ const records = resourceChain(key).map((chainKey) => this.#sweptRecord(chainKey, now));
143
+ const hard = hardest(records, now);
144
+ if (hard !== undefined) {
145
+ return blocked(hard.reason, hard.key, hard.retryAtMs);
146
+ }
147
+ for (const record of records) {
148
+ if (record === undefined) {
149
+ continue;
150
+ }
151
+ // A probe whose outcome report never arrived must not wedge the
152
+ // resource in half_open: expire it (same backoff window, no doubling)
153
+ // before attempting admission.
154
+ const expired = expireProbe(record.breaker, now, this.#config.breaker);
155
+ const current = expired === record.breaker ? record : { ...record, breaker: expired, updatedAt: now };
156
+ if (current !== record) {
157
+ this.#records.set(resourceKeyID(record.key), current);
158
+ }
159
+ const admission = admitProbe(current.breaker, now);
160
+ if (admission.kind === "closed") {
161
+ continue;
162
+ }
163
+ if (admission.kind === "waiting") {
164
+ return blocked("breaker-open", record.key, admission.retryAtMs);
165
+ }
166
+ if (admission.kind === "in-flight") {
167
+ return blocked("probe-in-flight", record.key, undefined);
168
+ }
169
+ const probeId = String(++this.#probeCounter);
170
+ this.#records.set(resourceKeyID(record.key), {
171
+ ...record,
172
+ breaker: { ...admission.record, probeId, probeAt: now },
173
+ updatedAt: now,
174
+ });
175
+ return { kind: "probe", ticket: { id: probeId, key: record.key } };
176
+ }
177
+ // Draining is the softest blocker; report the narrowest draining scope.
178
+ let draining;
179
+ for (const record of records) {
180
+ if (record?.health === "draining") {
181
+ draining = record;
182
+ }
183
+ }
184
+ if (draining !== undefined) {
185
+ return blocked("draining", draining.key, undefined);
186
+ }
187
+ return { kind: "available" };
188
+ }
189
+ /**
190
+ * Non-mutating assessment for decisions that must not admit a probe
191
+ * (escalation-target gating): identical hard-state and draining walk, but
192
+ * an open or half-open breaker blocks without being flipped or ticketed.
193
+ */
194
+ evaluate(key) {
195
+ const now = this.#clock();
196
+ const records = resourceChain(key).map((chainKey) => this.#sweptRecord(chainKey, now));
197
+ const hard = hardest(records, now);
198
+ if (hard !== undefined) {
199
+ return blocked(hard.reason, hard.key, hard.retryAtMs);
200
+ }
201
+ for (const record of records) {
202
+ if (record === undefined)
203
+ continue;
204
+ // Observer view (non-mutating): an open breaker blocks even when its
205
+ // backoff elapsed — assess is what flips it to half_open and issues
206
+ // the probe ticket.
207
+ const wait = breakerBlockWait(record.breaker, now);
208
+ if (wait !== undefined) {
209
+ return blocked("breaker-open", record.key, wait);
210
+ }
211
+ if (record.breaker.state === "half_open") {
212
+ return blocked("probe-in-flight", record.key, undefined);
213
+ }
214
+ }
215
+ let draining;
216
+ for (const record of records) {
217
+ if (record?.health === "draining") {
218
+ draining = record;
219
+ }
220
+ }
221
+ if (draining !== undefined) {
222
+ return blocked("draining", draining.key, undefined);
223
+ }
224
+ return { kind: "available" };
225
+ }
226
+ /**
227
+ * Reports the outcome of an admitted probe. Only the ticket issued for the
228
+ * current half-open record is honored; stale tickets (probe already
229
+ * resolved, record reset, or unknown key) are rejected.
230
+ */
231
+ reportProbe(ticket, outcome) {
232
+ const now = this.#clock();
233
+ const id = resourceKeyID(ticket.key);
234
+ const record = this.#records.get(id);
235
+ if (record === undefined) {
236
+ return false;
237
+ }
238
+ const breaker = record.breaker;
239
+ if (breaker.state !== "half_open" || breaker.probeId !== ticket.id) {
240
+ return false;
241
+ }
242
+ const next = outcome.success
243
+ ? recordProbeSuccess(breaker)
244
+ : recordProbeFailure(breaker, outcome.category, now, this.#config.breaker);
245
+ this.#records.set(id, { ...record, breaker: next, updatedAt: now });
246
+ return true;
247
+ }
248
+ /** Current (swept) record for one key, if the registry tracks it. */
249
+ recordFor(key) {
250
+ return this.#sweptRecord(key, this.#clock());
251
+ }
252
+ /** All tracked records, swept against the clock. */
253
+ snapshot() {
254
+ const now = this.#clock();
255
+ return [...this.#records.values()].map((record) => sweepRecord(record, now));
256
+ }
257
+ }
258
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/health/resource-health/registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { HealthEvent, ResourceHealthConfig, ResourceKey, ResourceRecord } from "./types.js";
2
+ export declare function initialRecord(key: ResourceKey, now: number): ResourceRecord;
3
+ /**
4
+ * Elapses time-bounded windows: once a window's `until` passes, the windowed
5
+ * state (rate limited, quota exhausted with a known reset) lifts back to
6
+ * healthy. Records without a window, or with one still in the future, pass
7
+ * through unchanged.
8
+ */
9
+ export declare function sweepRecord(record: ResourceRecord, now: number): ResourceRecord;
10
+ export declare function applyHealthEvent(record: ResourceRecord, event: HealthEvent, now: number, config: ResourceHealthConfig): ResourceRecord;
11
+ //# sourceMappingURL=transitions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transitions.d.ts","sourceRoot":"","sources":["../../../src/health/resource-health/transitions.ts"],"names":[],"mappings":"AAoCA,OAAO,KAAK,EAAE,WAAW,EAAE,oBAAoB,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAEhG,wBAAgB,aAAa,CAAC,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,GAAG,cAAc,CAE3E;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,cAAc,EAAE,GAAG,EAAE,MAAM,GAAG,cAAc,CAM/E;AAoFD,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,cAAc,EACtB,KAAK,EAAE,WAAW,EAClB,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,oBAAoB,GAC3B,cAAc,CAgDhB"}
@@ -0,0 +1,165 @@
1
+ /**
2
+ * Pure resource health transitions (ADP-007, ADP-012, ADP-019, ADP-021).
3
+ *
4
+ * `applyHealthEvent` is the single authority for how evidence changes a
5
+ * resource record: total, synchronous, and clock-free (`now` is injected).
6
+ *
7
+ * Policy notes:
8
+ * - Rate limiting and quota exhaustion set their own windowed states;
9
+ * a windowed state is never downgraded by weaker evidence (a 429 while
10
+ * quota-exhausted does not erase the quota signal).
11
+ * - Outage, overload, and timeout count toward the circuit breaker and mark
12
+ * the resource degraded. They never hard-quarantine on their own: a single
13
+ * definitive outage signal can be a blip, so the breaker owns transient
14
+ * failure quarantine with backoff windows and probe recovery.
15
+ * - Definitive configuration failures (auth, invalid model) hard-quarantine
16
+ * the resource: the evidence proves the resource cannot work. Non-definitive
17
+ * evidence of the same categories (the textual last resort, ADP-008) is
18
+ * transient and breaker-owned instead — one fuzzy substring in an error
19
+ * body must never permanently blacklist a resource with no recovery path
20
+ * (ADP-012).
21
+ * - The `definitive` flag otherwise guides scheduling deference, not health:
22
+ * both definitive and non-definitive infra failures leave the resource
23
+ * degraded.
24
+ * - Ambiguous or request-level failures (context overflow, content policy,
25
+ * user cancellation, unknown) never change health: they say nothing about
26
+ * the resource.
27
+ * - Draining is a policy request (ADP-021), not degraded health: it applies
28
+ * on top of healthy/degraded and never masks a harder state.
29
+ */
30
+ import { recordBreakerFailure, recordBreakerSuccess, initialBreaker, } from "../circuit-breaker/breaker.js";
31
+ import { resourceScope } from "./key.js";
32
+ export function initialRecord(key, now) {
33
+ return { key, health: "healthy", breaker: initialBreaker(), updatedAt: now };
34
+ }
35
+ /**
36
+ * Elapses time-bounded windows: once a window's `until` passes, the windowed
37
+ * state (rate limited, quota exhausted with a known reset) lifts back to
38
+ * healthy. Records without a window, or with one still in the future, pass
39
+ * through unchanged.
40
+ */
41
+ export function sweepRecord(record, now) {
42
+ const window = record.window;
43
+ if (window === undefined || now < window.until) {
44
+ return record;
45
+ }
46
+ return { key: record.key, health: "healthy", breaker: record.breaker, updatedAt: now };
47
+ }
48
+ function touched(record, now) {
49
+ return { ...record, updatedAt: now };
50
+ }
51
+ /**
52
+ * Defensive re-validation of a parsed retry delay: the classifier already
53
+ * rejects malformed values, but the health layer never trusts a negative or
54
+ * fractional delay to compute a window.
55
+ */
56
+ function validRetryAfterMs(value) {
57
+ return value !== undefined && Number.isInteger(value) && value >= 0 ? value : undefined;
58
+ }
59
+ function failureEvent(record, event, now, config) {
60
+ switch (event.category) {
61
+ case "rate_limited": {
62
+ if (record.health === "quota_exhausted" || record.health === "unavailable") {
63
+ return touched(record, now);
64
+ }
65
+ const retryAfterMs = validRetryAfterMs(event.retryAfterMs);
66
+ const until = now + (retryAfterMs ?? config.defaultRateLimitWindowMs);
67
+ return {
68
+ ...record,
69
+ health: "rate_limited",
70
+ window: { kind: "rate-limit", until },
71
+ updatedAt: now,
72
+ };
73
+ }
74
+ case "quota_exhausted": {
75
+ if (record.health === "unavailable") {
76
+ return touched(record, now);
77
+ }
78
+ const retryAfterMs = validRetryAfterMs(event.retryAfterMs);
79
+ return {
80
+ ...record,
81
+ health: "quota_exhausted",
82
+ window: retryAfterMs === undefined ? undefined : { kind: "quota", until: now + retryAfterMs },
83
+ updatedAt: now,
84
+ };
85
+ }
86
+ case "outage":
87
+ case "overload":
88
+ case "timeout": {
89
+ const breaker = recordBreakerFailure(record.breaker, event.category, now, config.breaker);
90
+ const health = record.health === "healthy" || record.health === "draining" ? "degraded" : record.health;
91
+ return { ...record, health, breaker: breaker.record, updatedAt: now };
92
+ }
93
+ case "auth_failure":
94
+ case "invalid_model": {
95
+ // An invalid model says nothing about the provider or account; only
96
+ // model-scoped and variant-scoped keys may be quarantined by it.
97
+ if (event.category === "invalid_model") {
98
+ const scope = resourceScope(record.key);
99
+ if (scope !== "model" && scope !== "variant") {
100
+ return touched(record, now);
101
+ }
102
+ }
103
+ if (!event.definitive) {
104
+ // Non-definitive evidence (bounded-textual last resort) is not proof
105
+ // the resource cannot work: quarantine through the breaker's bounded
106
+ // failure counting instead of a windowless, unrecoverable state.
107
+ const breaker = recordBreakerFailure(record.breaker, event.category, now, config.breaker);
108
+ const health = record.health === "healthy" || record.health === "draining" ? "degraded" : record.health;
109
+ return { ...record, health, breaker: breaker.record, updatedAt: now };
110
+ }
111
+ return { ...record, health: "unavailable", updatedAt: now };
112
+ }
113
+ default:
114
+ // context_overflow, content_policy, user_cancelled, unknown:
115
+ // request-level evidence, not resource health.
116
+ return touched(record, now);
117
+ }
118
+ }
119
+ export function applyHealthEvent(record, event, now, config) {
120
+ switch (event.kind) {
121
+ case "failure":
122
+ return failureEvent(record, event, now, config);
123
+ case "success": {
124
+ const breaker = recordBreakerSuccess();
125
+ const health = record.health === "draining" || record.health === "quota_exhausted"
126
+ ? record.health
127
+ : "healthy";
128
+ return {
129
+ ...record,
130
+ health,
131
+ breaker,
132
+ window: health === record.health ? record.window : undefined,
133
+ updatedAt: now,
134
+ };
135
+ }
136
+ case "drain": {
137
+ const health = record.health === "healthy" || record.health === "degraded" ? "draining" : record.health;
138
+ return { ...record, health, updatedAt: now };
139
+ }
140
+ case "capacity": {
141
+ if (event.exhausted) {
142
+ if (record.health === "unavailable") {
143
+ return touched(record, now);
144
+ }
145
+ const retryAfterMs = validRetryAfterMs(event.retryAfterMs);
146
+ return {
147
+ ...record,
148
+ health: "quota_exhausted",
149
+ window: retryAfterMs === undefined ? undefined : { kind: "quota", until: now + retryAfterMs },
150
+ updatedAt: now,
151
+ };
152
+ }
153
+ const health = record.health === "quota_exhausted" ? "healthy" : record.health;
154
+ return {
155
+ ...record,
156
+ health,
157
+ window: health === record.health ? record.window : undefined,
158
+ updatedAt: now,
159
+ };
160
+ }
161
+ case "reset":
162
+ return { key: record.key, health: "healthy", breaker: initialBreaker(), updatedAt: now };
163
+ }
164
+ }
165
+ //# sourceMappingURL=transitions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transitions.js","sourceRoot":"","sources":["../../../src/health/resource-health/transitions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,116 @@
1
+ /**
2
+ * Resource health types (ADP-007, ADP-012, ADP-021).
3
+ *
4
+ * A resource is identified at the narrowest scope the evidence supports:
5
+ * provider → account → model → variant. Health states are a closed set and
6
+ * every transition between them is defined by the pure transition layer; the
7
+ * registry never invents states. The circuit breaker (ADP-019) is an
8
+ * orthogonal axis stored per resource record.
9
+ */
10
+ import { type BreakerConfig, type BreakerRecord } from "../circuit-breaker/types.js";
11
+ import type { FailureCategory } from "../classifier/types.js";
12
+ export declare const RESOURCE_SCOPES: readonly ["provider", "account", "model", "variant"];
13
+ export type ResourceScope = (typeof RESOURCE_SCOPES)[number];
14
+ /**
15
+ * Hierarchical resource identity. The scope is derived from the most specific
16
+ * field present, so callers attribute evidence at exactly the level they can
17
+ * prove (e.g. a provider-wide outage without a model id stays at provider
18
+ * scope; a per-variant failure quarantines only that variant).
19
+ */
20
+ export interface ResourceKey {
21
+ readonly providerID: string;
22
+ readonly accountID?: string | undefined;
23
+ readonly modelID?: string | undefined;
24
+ readonly variantID?: string | undefined;
25
+ }
26
+ export declare const HEALTH_STATES: readonly ["healthy", "draining", "degraded", "rate_limited", "quota_exhausted", "unavailable"];
27
+ export type HealthState = (typeof HEALTH_STATES)[number];
28
+ /**
29
+ * A time-bounded window during which the current state is known to hold
30
+ * (e.g. until a Retry-After delay or a quota reset elapses). Absent when no
31
+ * reset time is known — recovery then relies on probes, observed successes,
32
+ * or explicit resets.
33
+ */
34
+ export interface ResourceWindow {
35
+ readonly kind: "rate-limit" | "quota";
36
+ readonly until: number;
37
+ }
38
+ export interface ResourceRecord {
39
+ readonly key: ResourceKey;
40
+ readonly health: HealthState;
41
+ readonly breaker: BreakerRecord;
42
+ readonly window?: ResourceWindow | undefined;
43
+ readonly updatedAt: number;
44
+ }
45
+ /**
46
+ * Health evidence events. `failure` carries an already-classified category
47
+ * (from the error classifier, ADP-009) plus the classification's
48
+ * definitiveness and parsed retry delay. `capacity` carries a CapacitySensor
49
+ * reading (ADP-020) — `exhausted: false` is positive evidence of capacity.
50
+ * `reset` is the manual Control-mode recovery op.
51
+ */
52
+ export type HealthEvent = {
53
+ readonly kind: "failure";
54
+ readonly key: ResourceKey;
55
+ readonly category: FailureCategory;
56
+ readonly definitive: boolean;
57
+ readonly retryAfterMs?: number | undefined;
58
+ } | {
59
+ readonly kind: "success";
60
+ readonly key: ResourceKey;
61
+ } | {
62
+ readonly kind: "drain";
63
+ readonly key: ResourceKey;
64
+ } | {
65
+ readonly kind: "capacity";
66
+ readonly key: ResourceKey;
67
+ readonly exhausted: boolean;
68
+ readonly retryAfterMs?: number | undefined;
69
+ } | {
70
+ readonly kind: "reset";
71
+ readonly key: ResourceKey;
72
+ };
73
+ export interface ResourceHealthConfig {
74
+ readonly breaker: BreakerConfig;
75
+ /** Window applied to rate-limited evidence that carries no Retry-After. */
76
+ readonly defaultRateLimitWindowMs: number;
77
+ }
78
+ export declare const DEFAULT_HEALTH_CONFIG: ResourceHealthConfig;
79
+ /** Injected monotonic clock, milliseconds. */
80
+ export type Clock = () => number;
81
+ /**
82
+ * Why an assessment blocks new work. Ordered from hardest to softest fact:
83
+ * hard resource states (unavailable, quota, rate limit) are direct evidence;
84
+ * breaker reasons are inferred from failure counts; draining is a policy
85
+ * request, not a health fact.
86
+ */
87
+ export declare const BLOCKED_REASONS: readonly ["unavailable", "quota-exhausted", "rate-limited", "breaker-open", "probe-in-flight", "draining"];
88
+ export type BlockedReason = (typeof BLOCKED_REASONS)[number];
89
+ /** Opaque single-probe admission token; validated on report. */
90
+ export interface ProbeTicket {
91
+ readonly id: string;
92
+ readonly key: ResourceKey;
93
+ }
94
+ export type ProbeOutcome = {
95
+ readonly success: true;
96
+ } | {
97
+ readonly success: false;
98
+ readonly category: FailureCategory;
99
+ };
100
+ /**
101
+ * Result of assessing whether a resource may take new work right now. The
102
+ * `blocked` variant reports the winning blocker's key (which may be a wider
103
+ * scope than the assessed key) and, when known, when the block can lift.
104
+ */
105
+ export type Assessment = {
106
+ readonly kind: "available";
107
+ } | {
108
+ readonly kind: "probe";
109
+ readonly ticket: ProbeTicket;
110
+ } | {
111
+ readonly kind: "blocked";
112
+ readonly reason: BlockedReason;
113
+ readonly key: ResourceKey;
114
+ readonly retryAtMs?: number;
115
+ };
116
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/health/resource-health/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Resource health types (ADP-007, ADP-012, ADP-021).
3
+ *
4
+ * A resource is identified at the narrowest scope the evidence supports:
5
+ * provider → account → model → variant. Health states are a closed set and
6
+ * every transition between them is defined by the pure transition layer; the
7
+ * registry never invents states. The circuit breaker (ADP-019) is an
8
+ * orthogonal axis stored per resource record.
9
+ */
10
+ import { DEFAULT_BREAKER_CONFIG, } from "../circuit-breaker/types.js";
11
+ export const RESOURCE_SCOPES = [
12
+ "provider",
13
+ "account",
14
+ "model",
15
+ "variant",
16
+ ];
17
+ export const HEALTH_STATES = [
18
+ "healthy",
19
+ "draining",
20
+ "degraded",
21
+ "rate_limited",
22
+ "quota_exhausted",
23
+ "unavailable",
24
+ ];
25
+ export const DEFAULT_HEALTH_CONFIG = {
26
+ breaker: DEFAULT_BREAKER_CONFIG,
27
+ defaultRateLimitWindowMs: 30_000,
28
+ };
29
+ /**
30
+ * Why an assessment blocks new work. Ordered from hardest to softest fact:
31
+ * hard resource states (unavailable, quota, rate limit) are direct evidence;
32
+ * breaker reasons are inferred from failure counts; draining is a policy
33
+ * request, not a health fact.
34
+ */
35
+ export const BLOCKED_REASONS = [
36
+ "unavailable",
37
+ "quota-exhausted",
38
+ "rate-limited",
39
+ "breaker-open",
40
+ "probe-in-flight",
41
+ "draining",
42
+ ];
43
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/health/resource-health/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EACL,sBAAsB,GAGvB,MAAM,6BAA6B,CAAA;AAGpC,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,UAAU;IACV,SAAS;IACT,OAAO;IACP,SAAS;CAC2B,CAAA;AAiBtC,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,SAAS;IACT,UAAU;IACV,UAAU;IACV,cAAc;IACd,iBAAiB;IACjB,aAAa;CACuB,CAAA;AAsDtC,MAAM,CAAC,MAAM,qBAAqB,GAAyB;IACzD,OAAO,EAAE,sBAAsB;IAC/B,wBAAwB,EAAE,MAAM;CACjC,CAAA;AAKD;;;;;GAKG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,aAAa;IACb,iBAAiB;IACjB,cAAc;IACd,cAAc;IACd,iBAAiB;IACjB,UAAU;CAC0B,CAAA"}
@@ -0,0 +1,17 @@
1
+ import { Plugin } from "@opencode/plugin";
2
+ export { PLUGIN_ID } from "./plugin-id.js";
3
+ /**
4
+ * Plugin id as required by GOAL.md: must not collide with the `opencode.*`
5
+ * namespace and must stay stable across releases (referenced by settings
6
+ * storage keys and receipts).
7
+ */
8
+ /**
9
+ * Entry point wired into OpenCode via `opencode.json(c)`. Setup glues the
10
+ * adapter touchpoints (session hooks, event subscription, storage) to the
11
+ * supervisor and returns a cleanup that disposes every registration.
12
+ * All supervision errors are fail-open (ADP-031): the supervisor's public
13
+ * entry points never throw; the event pump's stream errors are logged.
14
+ */
15
+ declare const _default: Plugin.Plugin;
16
+ export default _default;
17
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAezC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAE1C;;;;GAIG;AAEH;;;;;;GAMG;;AACH,wBAyEE"}