@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,66 @@
1
+ import type { ModelRef } from "../../core/work-unit/types.js";
2
+ import type { FailureClassification } from "../../health/classifier/types.js";
3
+ /**
4
+ * Mirror of the host retry-hook decision shape (`SessionRetryDecision` from
5
+ * `@opencode/plugin`). The execution core never imports the plugin package —
6
+ * the adapter passes `hook.decision` straight through; the shapes are
7
+ * structurally identical.
8
+ */
9
+ export type NativeRetryDecision = {
10
+ retry: false;
11
+ } | {
12
+ retry: true;
13
+ delay: number;
14
+ };
15
+ /**
16
+ * Horizontal-recovery option computed by the wiring for the failing work
17
+ * unit, from the same tier (ADP-013). `none` means no healthy alternative
18
+ * exists right now — OpenCode's native retry of the same resource is then
19
+ * the preferred recovery. `switch` carries the candidate chosen by the
20
+ * scheduler over the remaining tier candidates; `probeId` is present when
21
+ * that candidate was admitted as a circuit-breaker probe.
22
+ */
23
+ export type RecoveryOption = {
24
+ kind: "none";
25
+ } | {
26
+ kind: "switch";
27
+ model: ModelRef;
28
+ probeId?: string | undefined;
29
+ };
30
+ export interface RetryInput {
31
+ /** Classification of the failure that triggered the retry hook. */
32
+ readonly classification: FailureClassification;
33
+ /** The resource whose execution just failed. */
34
+ readonly failingModel: ModelRef;
35
+ /** The host's own retry decision; left untouched unless we veto. */
36
+ readonly native: NativeRetryDecision;
37
+ readonly recovery: RecoveryOption;
38
+ /** Vetoes already issued for this work unit (per-unit budget). */
39
+ readonly vetoesUsed: number;
40
+ }
41
+ /**
42
+ * Per-work-unit budget on owned-recovery vetoes. Each veto switches to one
43
+ * alternative; health state already blocks repeats, but the explicit budget
44
+ * makes loop boundedness trivially provable (ADP-038). After exhaustion the
45
+ * policy leaves OpenCode's native retry — its built-in max attempts are the
46
+ * hard limit — and future units re-route fresh at safe boundaries.
47
+ */
48
+ export declare const MAX_VETOES_PER_UNIT = 4;
49
+ /**
50
+ * Core decision, mode-independent. `veto` takes ownership of recovery
51
+ * (`{retry: false}` in the hook + a native continuation by switching to the
52
+ * recovered candidate); `leave` keeps the host's own `decision` untouched.
53
+ */
54
+ export type RetryCoreDecision = {
55
+ kind: "veto";
56
+ model: ModelRef;
57
+ probeId?: string | undefined;
58
+ } | {
59
+ kind: "leave";
60
+ };
61
+ /** Mode-wrapped decision. Observe records `would` without intervening. */
62
+ export type RetryDecision = RetryCoreDecision | {
63
+ kind: "observe-only";
64
+ would: RetryCoreDecision;
65
+ };
66
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/execution/retry/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAA;AAC7D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAA;AAE7E;;;;;GAKG;AACH,MAAM,MAAM,mBAAmB,GAAG;IAAE,KAAK,EAAE,KAAK,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAA;AAEnF;;;;;;;GAOG;AACH,MAAM,MAAM,cAAc,GACxB;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,QAAQ,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAAA;AAEtF,MAAM,WAAW,UAAU;IACzB,mEAAmE;IACnE,QAAQ,CAAC,cAAc,EAAE,qBAAqB,CAAA;IAC9C,gDAAgD;IAChD,QAAQ,CAAC,YAAY,EAAE,QAAQ,CAAA;IAC/B,oEAAoE;IACpE,QAAQ,CAAC,MAAM,EAAE,mBAAmB,CAAA;IACpC,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAA;IACjC,kEAAkE;IAClE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;CAC5B;AAED;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB,IAAI,CAAA;AAEpC;;;;GAIG;AACH,MAAM,MAAM,iBAAiB,GAC3B;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,QAAQ,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,CAAA;AAErF,0EAA0E;AAC1E,MAAM,MAAM,aAAa,GAAG,iBAAiB,GAAG;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,KAAK,EAAE,iBAAiB,CAAA;CAAE,CAAA"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Per-work-unit budget on owned-recovery vetoes. Each veto switches to one
3
+ * alternative; health state already blocks repeats, but the explicit budget
4
+ * makes loop boundedness trivially provable (ADP-038). After exhaustion the
5
+ * policy leaves OpenCode's native retry — its built-in max attempts are the
6
+ * hard limit — and future units re-route fresh at safe boundaries.
7
+ */
8
+ export const MAX_VETOES_PER_UNIT = 4;
9
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/execution/retry/types.ts"],"names":[],"mappings":"AAkCA;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAA"}
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const n=require("solid-js/web"),_=require("@opencode/plugin/gui"),u=require("solid-js"),O=require("@opencode/schema/rpc"),q="coool.adaptive",C="coool.adaptive";function a(e,t){return{"~standard":{version:1,vendor:C,validate:i=>e(i)?{value:i}:{issues:[{message:t}]}}}}function w(){return{"~standard":{version:1,vendor:C,validate:e=>e===void 0?{value:void 0}:{issues:[{message:"unexpected input: no input expected"}]}}}}const r=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),v=e=>typeof e=="string",m=e=>r(e)&&v(e.sessionID),M=e=>r(e)&&v(e.sessionID)&&(e.mode===null||v(e.mode)),L=e=>r(e)&&v(e.sessionID)&&(e.tier===null||v(e.tier)),N=O.Rpc.define({id:q,methods:{"settings.get":{input:w(),output:a(r,"output must be an object")},"settings.set":{input:a(r,"input must be an object"),output:a(r,"output must be an object")},"status.get":{input:w(),output:a(r,"output must be an object")},"receipts.list":{input:w(),output:a(Array.isArray,"output must be an array")},"session-mode.get":{input:a(m,"input must be an object with a sessionID string"),output:a(r,"output must be an object")},"session-mode.set":{input:a(M,"input must be an object with a sessionID string and a mode string or null"),output:a(r,"output must be an object")},"tier-request.get":{input:a(m,"input must be an object with a sessionID string"),output:a(r,"output must be an object")},"tier-request.set":{input:a(L,"input must be an object with a sessionID string and a tier string or null"),output:a(r,"output must be an object")}},events:{"settings-changed":{schema:a(r,"event data must be an object")},"session-mode-changed":{schema:a(m,"event data must be an object with a sessionID string")},"tier-request-changed":{schema:a(m,"event data must be an object with a sessionID string")}}}),I=["off","observe","active"],V=["quick","standard","advanced"];function F(e){const t=e.rpc(N);return{status:()=>t["status.get"]().catch(()=>{}),receipts:()=>t["receipts.list"]().catch(()=>{}),update:async i=>{try{return(await t["settings.set"](i)).ok}catch{return!1}},watchSettings:i=>t.events.on("settings-changed",()=>{i()})}}function h(e){const t=`${e.providerID}/${e.id}`;return e.variant===void 0?t:`${t}@${e.variant}`}function G(e){if(e===void 0)return"";const t=[];return e.health!=="healthy"&&t.push(e.health),e.breaker==="open"?t.push("breaker-open"):e.breaker==="half_open"&&t.push("half-open"),e.windowed&&t.push("windowed"),t.length===0?"":` [${t.join(", ")}]`}function j(e){switch(e.kind){case"apply":{const t=e.tier===void 0?"":` [${e.tier}]`;return`apply ${h(e.model)}${t} (${e.reason})`}case"defer":{const t=e.detail===void 0?"":` — ${e.detail}`;return`defer: ${e.reason}${t}`}case"park":{const t=e.detail===void 0?"":` — ${e.detail}`;return`park: ${e.reason}${t}`}case"escalate":return`escalate ${e.step} → ${h(e.target)} [${e.tier}]`;case"observe-only":return`observe: ${j(e.would)}`}}function W(e){return e===void 0?"pending":e.status==="succeeded"?"succeeded":e.status==="failed"?`failed (${e.category})`:`interrupted (${e.reason})`}function x(e){return`#${String(e.id)} ${j(e.decision)} — ${W(e.outcome)}`}const z="connection";function J(e){if(e===void 0)return[{id:z,label:"Server",value:"disconnected",tone:"warning"}];const t=[{id:"mode",label:"Mode",value:e.mode},{id:"pin",label:"Pin",value:e.pin===null?"none":h(e.pin)}];for(const i of V){const l=e.tiers[i],f=l.length===0?"empty":l.map(g=>`${h(g.ref)}${G(g)}`).join(", ");t.push({id:`tier-${i}`,label:`Tier ${i}`,value:f})}return t.push({id:"parked",label:"Parked",value:String(e.parked)}),t.push({id:"receipts",label:"Receipts",value:String(e.receipts)}),t}function B(e){return I.map(t=>({value:t,title:t===e?`${t} (current)`:t}))}function H(e){return I.find(t=>t===e)}function K(e){return e.map(t=>x(t))}var Q=n.template("<span class=adaptive-saved role=status>Saved"),U=n.template("<div class=adaptive-receipts>"),X=n.template('<div class=adaptive-page><table class=adaptive-status aria-label="OpenCode Adaptive status"><tbody></tbody></table><label class=adaptive-mode><span class=adaptive-row-label>Mode</span><select class=adaptive-mode-select>'),Y=n.template("<tr class=adaptive-row><td class=adaptive-row-label></td><td class=adaptive-row-value>"),Z=n.template("<option>"),ee=n.template("<div class=adaptive-receipt-line>");const te=5;function y(e){const[t,i]=u.createSignal(void 0),[l,f]=u.createSignal("observe"),[g,D]=u.createSignal([]),[A,R]=u.createSignal(!1),$=()=>{e.api.status().then(s=>{i(s),s!==void 0&&f(s.mode)}),e.api.receipts().then(s=>{D(s??[])})};u.onCleanup(e.api.watchSettings($)),$();const E=s=>{const c=H(s);c!==void 0&&e.api.update({mode:c}).then(S=>{R(S),$()})};return(()=>{var s=X(),c=s.firstChild,S=c.firstChild,P=c.nextSibling,k=P.firstChild,b=k.nextSibling;return n.insert(S,n.createComponent(u.For,{get each(){return J(t())},children:o=>(()=>{var d=Y(),p=d.firstChild,T=p.nextSibling;return n.insert(p,()=>o.label),n.insert(T,()=>o.value),n.effect(()=>n.setAttribute(d,"data-tone",o.tone)),d})()})),b.addEventListener("change",o=>{E(o.currentTarget.value)}),n.insert(b,n.createComponent(u.For,{get each(){return B(l())},children:o=>(()=>{var d=Z();return n.insert(d,()=>o.title),n.effect(()=>d.value=o.value),d})()})),n.insert(s,n.createComponent(u.Show,{get when(){return A()},get children(){return Q()}}),null),n.insert(s,n.createComponent(u.Show,{get when(){return t()!==void 0},get children(){var o=U();return n.insert(o,n.createComponent(u.For,{get each(){return K(g()).slice(0,te)},children:d=>(()=>{var p=ee();return n.insert(p,d),p})()})),o}}),null),n.effect(()=>b.disabled=t()===void 0),n.effect(()=>b.value=l()),s})()}const ne=_.Plugin.define({setup(e){const t=F(e.client);e.add(_.SettingsPage,{id:"adaptive",title:"OpenCode Adaptive",entries:[{id:"adaptive",title:"OpenCode Adaptive",description:"Execution tier routing, operating mode and resource health"}],render:()=>n.createComponent(y,{api:t})}),e.add(_.Command,{id:"open",title:"OpenCode Adaptive",group:"Adaptive",run:()=>{e.layout.settings("adaptive")}})}});exports.AdaptiveStatusPage=y;exports.default=ne;
package/dist/gui.d.ts ADDED
@@ -0,0 +1,17 @@
1
+ import { Plugin } from "@opencode/plugin/gui";
2
+ import type { JSX } from "solid-js";
3
+ import { type GuiApi } from "./ui/gui/api.js";
4
+ /**
5
+ * Native GUI settings page body (ADP-034). All data comes from the typed RPC adapter; the component holds no
6
+ * local settings state. A failed read renders the disconnected row instead of stale data.
7
+ */
8
+ export declare function AdaptiveStatusPage(props: {
9
+ api: GuiApi;
10
+ }): JSX.Element;
11
+ /**
12
+ * GUI plugin entry (the `./gui-experimental` bundle default export). Thin adapter: registers a native
13
+ * SettingsPage and a palette command that opens it; no routing logic lives here (ADP-034/035).
14
+ */
15
+ declare const _default: Plugin.Definition<{}>;
16
+ export default _default;
17
+ //# sourceMappingURL=gui.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gui.d.ts","sourceRoot":"","sources":["../src/gui.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAW,MAAM,EAA8B,MAAM,sBAAsB,CAAA;AAElF,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,UAAU,CAAA;AAKnC,OAAO,EAAkB,KAAK,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAK7D;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG,GAAG,CAAC,OAAO,CAuEtE;AAED;;;GAGG;;AACH,wBAwBE"}
package/dist/gui.js ADDED
@@ -0,0 +1,70 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "solid-js/jsx-runtime";
2
+ import { Command, Plugin, SettingsPage } from "@opencode/plugin/gui";
3
+ import { For, Show, createSignal, onCleanup } from "solid-js";
4
+ import { adaptiveGuiApi } from "./ui/gui/api.js";
5
+ import { modeChoices, parseModeValue, receiptLines, statusRows } from "./ui/gui/view.js";
6
+ const RECEIPTS_PREVIEW_LIMIT = 5;
7
+ /**
8
+ * Native GUI settings page body (ADP-034). All data comes from the typed RPC adapter; the component holds no
9
+ * local settings state. A failed read renders the disconnected row instead of stale data.
10
+ */
11
+ export function AdaptiveStatusPage(props) {
12
+ const [snapshot, setSnapshot] = createSignal(undefined);
13
+ const [mode, setMode] = createSignal("observe");
14
+ const [receipts, setReceipts] = createSignal([]);
15
+ const [saved, setSaved] = createSignal(false);
16
+ const refresh = () => {
17
+ void props.api.status().then((next) => {
18
+ setSnapshot(next);
19
+ if (next !== undefined)
20
+ setMode(next.mode);
21
+ });
22
+ void props.api.receipts().then((next) => {
23
+ setReceipts(next ?? []);
24
+ });
25
+ };
26
+ onCleanup(props.api.watchSettings(refresh));
27
+ refresh();
28
+ const pick = (raw) => {
29
+ const value = parseModeValue(raw);
30
+ if (value === undefined)
31
+ return;
32
+ void props.api.update({ mode: value }).then((ok) => {
33
+ setSaved(ok);
34
+ refresh();
35
+ });
36
+ };
37
+ return (_jsxs("div", { class: "adaptive-page", children: [_jsx("table", { class: "adaptive-status", "aria-label": "OpenCode Adaptive status", children: _jsx("tbody", { children: _jsx(For, { each: statusRows(snapshot()), children: (row) => (_jsxs("tr", { class: "adaptive-row", "data-tone": row.tone, children: [_jsx("td", { class: "adaptive-row-label", children: row.label }), _jsx("td", { class: "adaptive-row-value", children: row.value })] })) }) }) }), _jsxs("label", { class: "adaptive-mode", children: [_jsx("span", { class: "adaptive-row-label", children: "Mode" }), _jsx("select", { class: "adaptive-mode-select", disabled: snapshot() === undefined, value: mode(), onChange: (event) => {
38
+ pick(event.currentTarget.value);
39
+ }, children: _jsx(For, { each: modeChoices(mode()), children: (choice) => _jsx("option", { value: choice.value, children: choice.title }) }) })] }), _jsx(Show, { when: saved(), children: _jsx("span", { class: "adaptive-saved", role: "status", children: "Saved" }) }), _jsx(Show, { when: snapshot() !== undefined, children: _jsx("div", { class: "adaptive-receipts", children: _jsx(For, { each: receiptLines(receipts()).slice(0, RECEIPTS_PREVIEW_LIMIT), children: (line) => _jsx("div", { class: "adaptive-receipt-line", children: line }) }) }) })] }));
40
+ }
41
+ /**
42
+ * GUI plugin entry (the `./gui-experimental` bundle default export). Thin adapter: registers a native
43
+ * SettingsPage and a palette command that opens it; no routing logic lives here (ADP-034/035).
44
+ */
45
+ export default Plugin.define({
46
+ setup(context) {
47
+ const api = adaptiveGuiApi(context.client);
48
+ context.add(SettingsPage, {
49
+ id: "adaptive",
50
+ title: "OpenCode Adaptive",
51
+ entries: [
52
+ {
53
+ id: "adaptive",
54
+ title: "OpenCode Adaptive",
55
+ description: "Execution tier routing, operating mode and resource health",
56
+ },
57
+ ],
58
+ render: () => _jsx(AdaptiveStatusPage, { api: api }),
59
+ });
60
+ context.add(Command, {
61
+ id: "open",
62
+ title: "OpenCode Adaptive",
63
+ group: "Adaptive",
64
+ run: () => {
65
+ context.layout.settings("adaptive");
66
+ },
67
+ });
68
+ },
69
+ });
70
+ //# sourceMappingURL=gui.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gui.js","sourceRoot":"","sources":["../src/gui.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export * from "./merge.js";
2
+ export * from "./registry.js";
3
+ export * from "./types.js";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/health/capacity/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA;AAC1B,cAAc,eAAe,CAAA;AAC7B,cAAc,YAAY,CAAA"}
@@ -0,0 +1,4 @@
1
+ export * from "./merge.js";
2
+ export * from "./registry.js";
3
+ export * from "./types.js";
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/health/capacity/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA;AAC1B,cAAc,eAAe,CAAA;AAC7B,cAAc,YAAY,CAAA"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Deterministic capacity merge semantics (ADP-020).
3
+ *
4
+ * Several sensors may observe the same resource (e.g. passive headers and an
5
+ * optional quota endpoint). The merge picks one coherent story instead of
6
+ * synthesizing chimera numbers: readings are prioritized by confidence, then
7
+ * by conservativeness (lower remaining ratio first), then by input order, and
8
+ * each measured field is taken from the first reading in priority order that
9
+ * supplies it. Trust is reduced, never amplified:
10
+ *
11
+ * - the merged confidence is the LOWEST confidence among all surviving fresh
12
+ * readings, because any concurrent contradictory observation unsettles the
13
+ * whole picture (a sensor that merely corroborates still shares its doubt);
14
+ * - `observedAt` is the oldest surviving observation, so the merged reading
15
+ * ages honestly;
16
+ * - `evidence` follows the base (highest-priority) reading, which owns the
17
+ * merged story.
18
+ *
19
+ * Exact bounds are facts, not estimates: `remainingRatio === 0` or
20
+ * `usedRatio === 1` signals exhaustion at any confidence, while the softer
21
+ * `draining` signal requires `high` confidence (ADP-021). Anything that is
22
+ * not a well-formed measurement is rejected — untrusted data becomes "no
23
+ * estimate", never a guess.
24
+ */
25
+ import type { HealthEvent, ResourceKey } from "../resource-health/types.js";
26
+ import { type CapacityConfig, type CapacityReading, type CapacitySignals, type Confidence } from "./types.js";
27
+ /** Evidence labels are bounded so unbounded header text cannot be persisted. */
28
+ export declare const MAX_EVIDENCE_LENGTH = 128;
29
+ export declare function confidenceRank(confidence: Confidence): number;
30
+ /**
31
+ * Re-validates a reading field by field. A reading with an invalid ratio is
32
+ * rejected entirely (its numbers cannot be partially trusted); invalid
33
+ * `retryAfterMs`/`resetAt` values only drop their own field. A reading with
34
+ * no measured field left is discarded as pure noise.
35
+ */
36
+ export declare function normalizeReading(reading: unknown): CapacityReading | null;
37
+ /**
38
+ * Merges concurrent readings for one resource. Returns `null` when nothing
39
+ * survives normalization and the freshness window — an explicit "no estimate".
40
+ *
41
+ * Selection runs over the input order with a strict priority comparator, so
42
+ * ties keep the earliest reading and both comparator outcomes stay reachable.
43
+ */
44
+ export declare function mergeReadings(readings: readonly CapacityReading[], now: number, config?: CapacityConfig): CapacityReading | null;
45
+ /**
46
+ * Drain/exhaust derivation. Exhaustion is signaled by exact bounds at any
47
+ * confidence (a header stating zero remaining is a fact, not a guess);
48
+ * draining additionally requires `high` confidence because it withdraws new
49
+ * work before hard evidence exists (ADP-021).
50
+ */
51
+ export declare function capacitySignals(reading: CapacityReading, config?: CapacityConfig): CapacitySignals;
52
+ /**
53
+ * Pure bridge to the health layer: converts a merged reading into the
54
+ * capacity event consumed by resource-health transitions (ADP-021). The
55
+ * scheduler wiring decides when to observe it; this function only shapes it.
56
+ */
57
+ export declare function capacityHealthEvent(key: ResourceKey, reading: CapacityReading): HealthEvent;
58
+ //# sourceMappingURL=merge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge.d.ts","sourceRoot":"","sources":["../../../src/health/capacity/merge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAA;AAC3E,OAAO,EAEL,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,eAAe,EAEpB,KAAK,UAAU,EAChB,MAAM,YAAY,CAAA;AAEnB,gFAAgF;AAChF,eAAO,MAAM,mBAAmB,MAAM,CAAA;AAEtC,wBAAgB,cAAc,CAAC,UAAU,EAAE,UAAU,GAAG,MAAM,CAE7D;AAUD;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,eAAe,GAAG,IAAI,CA+CzE;AAsBD;;;;;;GAMG;AACH,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,SAAS,eAAe,EAAE,EACpC,GAAG,EAAE,MAAM,EACX,MAAM,GAAE,cAAwC,GAC/C,eAAe,GAAG,IAAI,CA6CxB;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,eAAe,EACxB,MAAM,GAAE,cAAwC,GAC/C,eAAe,CAUjB;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,WAAW,EAAE,OAAO,EAAE,eAAe,GAAG,WAAW,CAO3F"}
@@ -0,0 +1,154 @@
1
+ import { CONFIDENCE_LEVELS, DEFAULT_CAPACITY_CONFIG, } from "./types.js";
2
+ /** Evidence labels are bounded so unbounded header text cannot be persisted. */
3
+ export const MAX_EVIDENCE_LENGTH = 128;
4
+ export function confidenceRank(confidence) {
5
+ return CONFIDENCE_LEVELS.indexOf(confidence);
6
+ }
7
+ function isFiniteNumber(value) {
8
+ return typeof value === "number" && Number.isFinite(value);
9
+ }
10
+ function isValidRatio(value) {
11
+ return isFiniteNumber(value) && value >= 0 && value <= 1;
12
+ }
13
+ /**
14
+ * Re-validates a reading field by field. A reading with an invalid ratio is
15
+ * rejected entirely (its numbers cannot be partially trusted); invalid
16
+ * `retryAfterMs`/`resetAt` values only drop their own field. A reading with
17
+ * no measured field left is discarded as pure noise.
18
+ */
19
+ export function normalizeReading(reading) {
20
+ if (typeof reading !== "object" || reading === null) {
21
+ return null;
22
+ }
23
+ const candidate = reading;
24
+ if (!CONFIDENCE_LEVELS.includes(candidate.confidence)) {
25
+ return null;
26
+ }
27
+ if (!isFiniteNumber(candidate.observedAt) || candidate.observedAt < 0) {
28
+ return null;
29
+ }
30
+ if ((candidate.usedRatio !== undefined && !isValidRatio(candidate.usedRatio)) ||
31
+ (candidate.remainingRatio !== undefined && !isValidRatio(candidate.remainingRatio))) {
32
+ return null;
33
+ }
34
+ const retryAfterMs = candidate.retryAfterMs !== undefined &&
35
+ isFiniteNumber(candidate.retryAfterMs) &&
36
+ Number.isInteger(candidate.retryAfterMs) &&
37
+ candidate.retryAfterMs >= 0
38
+ ? candidate.retryAfterMs
39
+ : undefined;
40
+ const resetAt = isFiniteNumber(candidate.resetAt) && candidate.resetAt >= 0 ? candidate.resetAt : undefined;
41
+ const evidence = typeof candidate.evidence === "string"
42
+ ? candidate.evidence.slice(0, MAX_EVIDENCE_LENGTH)
43
+ : undefined;
44
+ if (candidate.usedRatio === undefined &&
45
+ candidate.remainingRatio === undefined &&
46
+ retryAfterMs === undefined &&
47
+ resetAt === undefined) {
48
+ return null;
49
+ }
50
+ return {
51
+ ...(candidate.usedRatio !== undefined ? { usedRatio: candidate.usedRatio } : {}),
52
+ ...(candidate.remainingRatio !== undefined ? { remainingRatio: candidate.remainingRatio } : {}),
53
+ ...(retryAfterMs !== undefined ? { retryAfterMs } : {}),
54
+ ...(resetAt !== undefined ? { resetAt } : {}),
55
+ confidence: candidate.confidence,
56
+ observedAt: candidate.observedAt,
57
+ ...(evidence !== undefined ? { evidence } : {}),
58
+ };
59
+ }
60
+ function isFresh(reading, now, config) {
61
+ return now - reading.observedAt <= config.maxAgeMs;
62
+ }
63
+ /**
64
+ * Strict priority between two readings: higher confidence wins; on equal
65
+ * confidence the more conservative remaining ratio wins (a missing remaining
66
+ * ratio cannot prove scarcity, so it counts as the least conservative value).
67
+ * Equal readings keep their relative order.
68
+ */
69
+ function strictlyHigherPriority(candidate, incumbent) {
70
+ const byConfidence = confidenceRank(candidate.confidence) - confidenceRank(incumbent.confidence);
71
+ if (byConfidence !== 0) {
72
+ return byConfidence > 0;
73
+ }
74
+ const candidateRemaining = candidate.remainingRatio ?? 1;
75
+ const incumbentRemaining = incumbent.remainingRatio ?? 1;
76
+ return candidateRemaining < incumbentRemaining;
77
+ }
78
+ /**
79
+ * Merges concurrent readings for one resource. Returns `null` when nothing
80
+ * survives normalization and the freshness window — an explicit "no estimate".
81
+ *
82
+ * Selection runs over the input order with a strict priority comparator, so
83
+ * ties keep the earliest reading and both comparator outcomes stay reachable.
84
+ */
85
+ export function mergeReadings(readings, now, config = DEFAULT_CAPACITY_CONFIG) {
86
+ const survivors = readings
87
+ .map(normalizeReading)
88
+ .filter((reading) => reading !== null)
89
+ .filter((reading) => isFresh(reading, now, config));
90
+ if (survivors.length === 0) {
91
+ return null;
92
+ }
93
+ const base = survivors.reduce((best, reading) => strictlyHigherPriority(reading, best) ? reading : best);
94
+ const bestField = (pick) => {
95
+ let best;
96
+ let bestValue;
97
+ for (const reading of survivors) {
98
+ const value = pick(reading);
99
+ if (value === undefined) {
100
+ continue;
101
+ }
102
+ if (best === undefined || strictlyHigherPriority(reading, best)) {
103
+ best = reading;
104
+ bestValue = value;
105
+ }
106
+ }
107
+ return bestValue;
108
+ };
109
+ const usedRatio = bestField((reading) => reading.usedRatio);
110
+ const remainingRatio = bestField((reading) => reading.remainingRatio);
111
+ const retryAfterMs = bestField((reading) => reading.retryAfterMs);
112
+ const resetAt = bestField((reading) => reading.resetAt);
113
+ const confidence = survivors.reduce((lowest, reading) => confidenceRank(reading.confidence) < confidenceRank(lowest) ? reading.confidence : lowest, base.confidence);
114
+ const observedAt = Math.min(...survivors.map((reading) => reading.observedAt));
115
+ return {
116
+ ...(usedRatio !== undefined ? { usedRatio } : {}),
117
+ ...(remainingRatio !== undefined ? { remainingRatio } : {}),
118
+ ...(retryAfterMs !== undefined ? { retryAfterMs } : {}),
119
+ ...(resetAt !== undefined ? { resetAt } : {}),
120
+ confidence,
121
+ observedAt,
122
+ ...(base.evidence !== undefined ? { evidence: base.evidence } : {}),
123
+ };
124
+ }
125
+ /**
126
+ * Drain/exhaust derivation. Exhaustion is signaled by exact bounds at any
127
+ * confidence (a header stating zero remaining is a fact, not a guess);
128
+ * draining additionally requires `high` confidence because it withdraws new
129
+ * work before hard evidence exists (ADP-021).
130
+ */
131
+ export function capacitySignals(reading, config = DEFAULT_CAPACITY_CONFIG) {
132
+ const exhausted = reading.remainingRatio === 0 || reading.usedRatio === 1;
133
+ const draining = !exhausted &&
134
+ reading.confidence === "high" &&
135
+ ((reading.remainingRatio !== undefined &&
136
+ reading.remainingRatio <= config.drainingRemainingThreshold) ||
137
+ (reading.usedRatio !== undefined &&
138
+ reading.usedRatio >= 1 - config.drainingRemainingThreshold));
139
+ return { exhausted, draining };
140
+ }
141
+ /**
142
+ * Pure bridge to the health layer: converts a merged reading into the
143
+ * capacity event consumed by resource-health transitions (ADP-021). The
144
+ * scheduler wiring decides when to observe it; this function only shapes it.
145
+ */
146
+ export function capacityHealthEvent(key, reading) {
147
+ return {
148
+ kind: "capacity",
149
+ key,
150
+ exhausted: capacitySignals(reading).exhausted,
151
+ ...(reading.retryAfterMs !== undefined ? { retryAfterMs: reading.retryAfterMs } : {}),
152
+ };
153
+ }
154
+ //# sourceMappingURL=merge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge.js","sourceRoot":"","sources":["../../../src/health/capacity/merge.ts"],"names":[],"mappings":"AAyBA,OAAO,EACL,iBAAiB,EAIjB,uBAAuB,GAExB,MAAM,YAAY,CAAA;AAEnB,gFAAgF;AAChF,MAAM,CAAC,MAAM,mBAAmB,GAAG,GAAG,CAAA;AAEtC,MAAM,UAAU,cAAc,CAAC,UAAsB;IACnD,OAAO,iBAAiB,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;AAC9C,CAAC;AAED,SAAS,cAAc,CAAC,KAAc;IACpC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;AAC5D,CAAC;AAED,SAAS,YAAY,CAAC,KAAc;IAClC,OAAO,cAAc,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,CAAA;AAC1D,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAgB;IAC/C,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACpD,OAAO,IAAI,CAAA;IACb,CAAC;IACD,MAAM,SAAS,GAAG,OAA0B,CAAA;IAC5C,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,CAAC;QACtD,OAAO,IAAI,CAAA;IACb,CAAC;IACD,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,SAAS,CAAC,UAAU,GAAG,CAAC,EAAE,CAAC;QACtE,OAAO,IAAI,CAAA;IACb,CAAC;IACD,IACE,CAAC,SAAS,CAAC,SAAS,KAAK,SAAS,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QACzE,CAAC,SAAS,CAAC,cAAc,KAAK,SAAS,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC,EACnF,CAAC;QACD,OAAO,IAAI,CAAA;IACb,CAAC;IACD,MAAM,YAAY,GAChB,SAAS,CAAC,YAAY,KAAK,SAAS;QACpC,cAAc,CAAC,SAAS,CAAC,YAAY,CAAC;QACtC,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,YAAY,CAAC;QACxC,SAAS,CAAC,YAAY,IAAI,CAAC;QACzB,CAAC,CAAC,SAAS,CAAC,YAAY;QACxB,CAAC,CAAC,SAAS,CAAA;IACf,MAAM,OAAO,GACX,cAAc,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,SAAS,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAA;IAC7F,MAAM,QAAQ,GACZ,OAAO,SAAS,CAAC,QAAQ,KAAK,QAAQ;QACpC,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,mBAAmB,CAAC;QAClD,CAAC,CAAC,SAAS,CAAA;IACf,IACE,SAAS,CAAC,SAAS,KAAK,SAAS;QACjC,SAAS,CAAC,cAAc,KAAK,SAAS;QACtC,YAAY,KAAK,SAAS;QAC1B,OAAO,KAAK,SAAS,EACrB,CAAC;QACD,OAAO,IAAI,CAAA;IACb,CAAC;IACD,OAAO;QACL,GAAG,CAAC,SAAS,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAChF,GAAG,CAAC,SAAS,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,SAAS,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/F,GAAG,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACvD,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7C,UAAU,EAAE,SAAS,CAAC,UAAU;QAChC,UAAU,EAAE,SAAS,CAAC,UAAU;QAChC,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAChD,CAAA;AACH,CAAC;AAED,SAAS,OAAO,CAAC,OAAwB,EAAE,GAAW,EAAE,MAAsB;IAC5E,OAAO,GAAG,GAAG,OAAO,CAAC,UAAU,IAAI,MAAM,CAAC,QAAQ,CAAA;AACpD,CAAC;AAED;;;;;GAKG;AACH,SAAS,sBAAsB,CAAC,SAA0B,EAAE,SAA0B;IACpF,MAAM,YAAY,GAAG,cAAc,CAAC,SAAS,CAAC,UAAU,CAAC,GAAG,cAAc,CAAC,SAAS,CAAC,UAAU,CAAC,CAAA;IAChG,IAAI,YAAY,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,YAAY,GAAG,CAAC,CAAA;IACzB,CAAC;IACD,MAAM,kBAAkB,GAAG,SAAS,CAAC,cAAc,IAAI,CAAC,CAAA;IACxD,MAAM,kBAAkB,GAAG,SAAS,CAAC,cAAc,IAAI,CAAC,CAAA;IACxD,OAAO,kBAAkB,GAAG,kBAAkB,CAAA;AAChD,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAC3B,QAAoC,EACpC,GAAW,EACX,SAAyB,uBAAuB;IAEhD,MAAM,SAAS,GAAG,QAAQ;SACvB,GAAG,CAAC,gBAAgB,CAAC;SACrB,MAAM,CAAC,CAAC,OAAO,EAA8B,EAAE,CAAC,OAAO,KAAK,IAAI,CAAC;SACjE,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC,CAAA;IACrD,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,IAAI,CAAA;IACb,CAAC;IACD,MAAM,IAAI,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,CAC9C,sBAAsB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CACvD,CAAA;IACD,MAAM,SAAS,GAAG,CAAI,IAAiD,EAAiB,EAAE;QACxF,IAAI,IAAiC,CAAA;QACrC,IAAI,SAAwB,CAAA;QAC5B,KAAK,MAAM,OAAO,IAAI,SAAS,EAAE,CAAC;YAChC,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,CAAA;YAC3B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,SAAQ;YACV,CAAC;YACD,IAAI,IAAI,KAAK,SAAS,IAAI,sBAAsB,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC;gBAChE,IAAI,GAAG,OAAO,CAAA;gBACd,SAAS,GAAG,KAAK,CAAA;YACnB,CAAC;QACH,CAAC;QACD,OAAO,SAAS,CAAA;IAClB,CAAC,CAAA;IACD,MAAM,SAAS,GAAG,SAAS,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;IAC3D,MAAM,cAAc,GAAG,SAAS,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,cAAc,CAAC,CAAA;IACrE,MAAM,YAAY,GAAG,SAAS,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC,CAAA;IACjE,MAAM,OAAO,GAAG,SAAS,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;IACvD,MAAM,UAAU,GAAG,SAAS,CAAC,MAAM,CACjC,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,CAClB,cAAc,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,EAC3F,IAAI,CAAC,UAAU,CAChB,CAAA;IACD,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAA;IAC9E,OAAO;QACL,GAAG,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACjD,GAAG,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3D,GAAG,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACvD,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7C,UAAU;QACV,UAAU;QACV,GAAG,CAAC,IAAI,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACpE,CAAA;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAC7B,OAAwB,EACxB,SAAyB,uBAAuB;IAEhD,MAAM,SAAS,GAAG,OAAO,CAAC,cAAc,KAAK,CAAC,IAAI,OAAO,CAAC,SAAS,KAAK,CAAC,CAAA;IACzE,MAAM,QAAQ,GACZ,CAAC,SAAS;QACV,OAAO,CAAC,UAAU,KAAK,MAAM;QAC7B,CAAC,CAAC,OAAO,CAAC,cAAc,KAAK,SAAS;YACpC,OAAO,CAAC,cAAc,IAAI,MAAM,CAAC,0BAA0B,CAAC;YAC5D,CAAC,OAAO,CAAC,SAAS,KAAK,SAAS;gBAC9B,OAAO,CAAC,SAAS,IAAI,CAAC,GAAG,MAAM,CAAC,0BAA0B,CAAC,CAAC,CAAA;IAClE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAA;AAChC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,GAAgB,EAAE,OAAwB;IAC5E,OAAO;QACL,IAAI,EAAE,UAAU;QAChB,GAAG;QACH,SAAS,EAAE,eAAe,CAAC,OAAO,CAAC,CAAC,SAAS;QAC7C,GAAG,CAAC,OAAO,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACtF,CAAA;AACH,CAAC"}
@@ -0,0 +1,41 @@
1
+ import type { Clock } from "../resource-health/types.js";
2
+ import type { ResourceKey } from "../resource-health/types.js";
3
+ import type { CapacityAssessment, CapacityConfig, CapacityReading, CapacitySensor } from "./types.js";
4
+ /** One registry snapshot row: the sensor's resource and its latest reading. */
5
+ export interface SensorSnapshot {
6
+ readonly resource: ResourceKey;
7
+ readonly latest: CapacityReading | null;
8
+ }
9
+ export declare class CapacityRegistry {
10
+ #private;
11
+ constructor(clock: Clock, config?: CapacityConfig);
12
+ /** Registers a sensor; re-registering an id replaces its previous sensor. */
13
+ register(sensor: CapacitySensor): void;
14
+ /** Removes a sensor; returns whether an entry existed. */
15
+ unregister(id: string): boolean;
16
+ /**
17
+ * Every registered sensor's latest reading alongside the resource it
18
+ * observes. The persisted-mirror path uses this to save what any instance
19
+ * observed; an entry whose sensor has no reading yet carries `null`.
20
+ */
21
+ snapshot(): readonly SensorSnapshot[];
22
+ /**
23
+ * Reads every sensor registered at call time once. A sensor already being
24
+ * read is skipped (its in-flight result will land) so concurrent refreshes
25
+ * never hammer a quota endpoint. A sensor that throws or returns malformed
26
+ * data stores "no observation" — fail-open, never a guess. A sensor
27
+ * unregistered or replaced while its read is in flight stores nothing.
28
+ */
29
+ refresh(): Promise<void>;
30
+ /**
31
+ * Merged reading for a resource, from sensors at the key itself or any of
32
+ * its ancestors. `null` means no fresh trustworthy estimate.
33
+ */
34
+ reading(key: ResourceKey): CapacityReading | null;
35
+ /**
36
+ * Scheduler-facing assessment for a resource. `none` is unknown capacity —
37
+ * callers must not interpret it as healthy.
38
+ */
39
+ assessment(key: ResourceKey): CapacityAssessment;
40
+ }
41
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/health/capacity/registry.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,6BAA6B,CAAA;AACxD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAA;AAE9D,OAAO,KAAK,EACV,kBAAkB,EAClB,cAAc,EACd,eAAe,EACf,cAAc,EACf,MAAM,YAAY,CAAA;AAQnB,+EAA+E;AAC/E,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAA;IAC9B,QAAQ,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI,CAAA;CACxC;AAED,qBAAa,gBAAgB;;gBAMf,KAAK,EAAE,KAAK,EAAE,MAAM,GAAE,cAAwC;IAK1E,6EAA6E;IAC7E,QAAQ,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI;IAItC,0DAA0D;IAC1D,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAI/B;;;;OAIG;IACH,QAAQ,IAAI,SAAS,cAAc,EAAE;IAOrC;;;;;;OAMG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IA2B9B;;;OAGG;IACH,OAAO,CAAC,GAAG,EAAE,WAAW,GAAG,eAAe,GAAG,IAAI;IAcjD;;;OAGG;IACH,UAAU,CAAC,GAAG,EAAE,WAAW,GAAG,kBAAkB;CAOjD"}
@@ -0,0 +1,106 @@
1
+ /**
2
+ * Capacity registry: owns sensors, refreshes them, and answers scheduler
3
+ * queries (ADP-020). Pull-based and timer-free — the wiring layer decides
4
+ * when to refresh; queries sweep for staleness lazily, mirroring the
5
+ * resource-health registry.
6
+ *
7
+ * Lookups are hierarchical: a sensor attached to any ancestor of the queried
8
+ * key (provider → account → model → variant) contributes to it, so a
9
+ * provider- or account-wide quota reading covers its models without each
10
+ * model needing its own sensor.
11
+ */
12
+ import { resourceChain, resourceKeyID } from "../resource-health/key.js";
13
+ import { capacitySignals, mergeReadings, normalizeReading } from "./merge.js";
14
+ import { DEFAULT_CAPACITY_CONFIG } from "./types.js";
15
+ export class CapacityRegistry {
16
+ #clock;
17
+ #config;
18
+ #sensors = new Map();
19
+ #inFlight = new Set();
20
+ constructor(clock, config = DEFAULT_CAPACITY_CONFIG) {
21
+ this.#clock = clock;
22
+ this.#config = config;
23
+ }
24
+ /** Registers a sensor; re-registering an id replaces its previous sensor. */
25
+ register(sensor) {
26
+ this.#sensors.set(sensor.id, { sensor, latest: null });
27
+ }
28
+ /** Removes a sensor; returns whether an entry existed. */
29
+ unregister(id) {
30
+ return this.#sensors.delete(id);
31
+ }
32
+ /**
33
+ * Every registered sensor's latest reading alongside the resource it
34
+ * observes. The persisted-mirror path uses this to save what any instance
35
+ * observed; an entry whose sensor has no reading yet carries `null`.
36
+ */
37
+ snapshot() {
38
+ return [...this.#sensors.values()].map((entry) => ({
39
+ resource: entry.sensor.resource,
40
+ latest: entry.latest,
41
+ }));
42
+ }
43
+ /**
44
+ * Reads every sensor registered at call time once. A sensor already being
45
+ * read is skipped (its in-flight result will land) so concurrent refreshes
46
+ * never hammer a quota endpoint. A sensor that throws or returns malformed
47
+ * data stores "no observation" — fail-open, never a guess. A sensor
48
+ * unregistered or replaced while its read is in flight stores nothing.
49
+ */
50
+ async refresh() {
51
+ const entries = [...this.#sensors.values()];
52
+ await Promise.all(entries.map(async (entry) => this.#readSensor(entry)));
53
+ }
54
+ async #readSensor(entry) {
55
+ const id = entry.sensor.id;
56
+ if (this.#inFlight.has(id)) {
57
+ return;
58
+ }
59
+ this.#inFlight.add(id);
60
+ try {
61
+ let reading = null;
62
+ try {
63
+ reading = await entry.sensor.read();
64
+ }
65
+ catch {
66
+ reading = null;
67
+ }
68
+ const current = this.#sensors.get(id);
69
+ if (current?.sensor === entry.sensor) {
70
+ current.latest = reading === null ? null : normalizeReading(reading);
71
+ }
72
+ }
73
+ finally {
74
+ this.#inFlight.delete(id);
75
+ }
76
+ }
77
+ /**
78
+ * Merged reading for a resource, from sensors at the key itself or any of
79
+ * its ancestors. `null` means no fresh trustworthy estimate.
80
+ */
81
+ reading(key) {
82
+ const chainIDs = new Set(resourceChain(key).map(resourceKeyID));
83
+ const candidates = [];
84
+ for (const entry of this.#sensors.values()) {
85
+ if (!chainIDs.has(resourceKeyID(entry.sensor.resource))) {
86
+ continue;
87
+ }
88
+ if (entry.latest !== null) {
89
+ candidates.push(entry.latest);
90
+ }
91
+ }
92
+ return mergeReadings(candidates, this.#clock(), this.#config);
93
+ }
94
+ /**
95
+ * Scheduler-facing assessment for a resource. `none` is unknown capacity —
96
+ * callers must not interpret it as healthy.
97
+ */
98
+ assessment(key) {
99
+ const reading = this.reading(key);
100
+ if (reading === null) {
101
+ return { kind: "none" };
102
+ }
103
+ return { kind: "estimate", reading, signals: capacitySignals(reading, this.#config) };
104
+ }
105
+ }
106
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/health/capacity/registry.ts"],"names":[],"mappings":"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"}