@jinn-network/client 0.1.7 → 0.1.8-canary.0c159d7e

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 (326) hide show
  1. package/README.md +67 -1
  2. package/dist/adapters/mech/adapter.d.ts +19 -1
  3. package/dist/adapters/mech/adapter.js +130 -14
  4. package/dist/adapters/mech/adapter.js.map +1 -1
  5. package/dist/adapters/mech/contracts.d.ts +22 -1
  6. package/dist/adapters/mech/contracts.js +34 -24
  7. package/dist/adapters/mech/contracts.js.map +1 -1
  8. package/dist/adapters/mech/safe.d.ts +1 -1
  9. package/dist/adapters/mech/safe.js +5 -3
  10. package/dist/adapters/mech/safe.js.map +1 -1
  11. package/dist/adapters/mech/types.d.ts +6 -1
  12. package/dist/adapters/mech/types.js.map +1 -1
  13. package/dist/agent/operator-claude.js +8 -0
  14. package/dist/agent/operator-claude.js.map +1 -1
  15. package/dist/api/activity-events-endpoint.d.ts +14 -0
  16. package/dist/api/activity-events-endpoint.js +59 -0
  17. package/dist/api/activity-events-endpoint.js.map +1 -0
  18. package/dist/api/bootstrap-endpoint.d.ts +1 -2
  19. package/dist/api/bootstrap-endpoint.js +42 -24
  20. package/dist/api/bootstrap-endpoint.js.map +1 -1
  21. package/dist/api/codex-doctor-endpoint.d.ts +22 -5
  22. package/dist/api/codex-doctor-endpoint.js +136 -17
  23. package/dist/api/codex-doctor-endpoint.js.map +1 -1
  24. package/dist/api/debug-report-endpoint.d.ts +27 -0
  25. package/dist/api/debug-report-endpoint.js +157 -0
  26. package/dist/api/debug-report-endpoint.js.map +1 -0
  27. package/dist/api/discovery-endpoint.d.ts +1 -0
  28. package/dist/api/discovery-endpoint.js +24 -0
  29. package/dist/api/discovery-endpoint.js.map +1 -1
  30. package/dist/api/gather-status.d.ts +33 -0
  31. package/dist/api/gather-status.js +211 -26
  32. package/dist/api/gather-status.js.map +1 -1
  33. package/dist/api/hermes-doctor-endpoint.d.ts +15 -7
  34. package/dist/api/hermes-doctor-endpoint.js +56 -19
  35. package/dist/api/hermes-doctor-endpoint.js.map +1 -1
  36. package/dist/api/launcher-status.d.ts +4 -2
  37. package/dist/api/launcher-status.js +11 -10
  38. package/dist/api/launcher-status.js.map +1 -1
  39. package/dist/api/launcher-tasks.d.ts +1 -1
  40. package/dist/api/launcher-tasks.js +12 -8
  41. package/dist/api/launcher-tasks.js.map +1 -1
  42. package/dist/api/operator-artifacts-endpoint.js +73 -6
  43. package/dist/api/operator-artifacts-endpoint.js.map +1 -1
  44. package/dist/api/portfolio-v0-build.d.ts +7 -1
  45. package/dist/api/portfolio-v0-build.js +6 -2
  46. package/dist/api/portfolio-v0-build.js.map +1 -1
  47. package/dist/api/prediction-v1-build.d.ts +6 -0
  48. package/dist/api/prediction-v1-build.js +3 -1
  49. package/dist/api/prediction-v1-build.js.map +1 -1
  50. package/dist/api/server.d.ts +17 -0
  51. package/dist/api/server.js +40 -1
  52. package/dist/api/server.js.map +1 -1
  53. package/dist/api/setup-endpoints.d.ts +0 -9
  54. package/dist/api/setup-endpoints.js +11 -153
  55. package/dist/api/setup-endpoints.js.map +1 -1
  56. package/dist/api/solvernets-endpoints.js +30 -63
  57. package/dist/api/solvernets-endpoints.js.map +1 -1
  58. package/dist/api/status-build.d.ts +115 -2
  59. package/dist/api/status-build.js +47 -11
  60. package/dist/api/status-build.js.map +1 -1
  61. package/dist/api/status-harness-rollup.d.ts +35 -0
  62. package/dist/api/status-harness-rollup.js +45 -0
  63. package/dist/api/status-harness-rollup.js.map +1 -0
  64. package/dist/api/task-runs-build.d.ts +8 -0
  65. package/dist/api/task-runs-build.js +5 -1
  66. package/dist/api/task-runs-build.js.map +1 -1
  67. package/dist/build-info.json +4 -4
  68. package/dist/build-meta.json +1 -1
  69. package/dist/captures/live-publisher.js +24 -4
  70. package/dist/captures/live-publisher.js.map +1 -1
  71. package/dist/captures/publish.d.ts +1 -1
  72. package/dist/chain-read-errors.d.ts +12 -0
  73. package/dist/chain-read-errors.js +26 -1
  74. package/dist/chain-read-errors.js.map +1 -1
  75. package/dist/cli/commands/codedigest-revert-check.d.ts +33 -0
  76. package/dist/cli/commands/codedigest-revert-check.js +249 -0
  77. package/dist/cli/commands/codedigest-revert-check.js.map +1 -0
  78. package/dist/cli/commands/solver-nets.d.ts +1 -0
  79. package/dist/cli/commands/solver-nets.js +177 -22
  80. package/dist/cli/commands/solver-nets.js.map +1 -1
  81. package/dist/cli/commands/solver-plugins-block.d.ts +33 -0
  82. package/dist/cli/commands/solver-plugins-block.js +118 -0
  83. package/dist/cli/commands/solver-plugins-block.js.map +1 -0
  84. package/dist/cli/commands/solver-plugins-feedback.d.ts +72 -0
  85. package/dist/cli/commands/solver-plugins-feedback.js +262 -0
  86. package/dist/cli/commands/solver-plugins-feedback.js.map +1 -0
  87. package/dist/cli/commands/solver-plugins-read.d.ts +54 -0
  88. package/dist/cli/commands/solver-plugins-read.js +259 -0
  89. package/dist/cli/commands/solver-plugins-read.js.map +1 -0
  90. package/dist/cli/commands/solver-plugins.d.ts +35 -0
  91. package/dist/cli/commands/solver-plugins.js +399 -2
  92. package/dist/cli/commands/solver-plugins.js.map +1 -1
  93. package/dist/cli/commands/tasks.js +15 -2
  94. package/dist/cli/commands/tasks.js.map +1 -1
  95. package/dist/cli/index.js +2 -0
  96. package/dist/cli/index.js.map +1 -1
  97. package/dist/cli/task-native-readiness.d.ts +7 -0
  98. package/dist/cli/task-native-readiness.js +7 -5
  99. package/dist/cli/task-native-readiness.js.map +1 -1
  100. package/dist/config.d.ts +183 -232
  101. package/dist/config.js +232 -107
  102. package/dist/config.js.map +1 -1
  103. package/dist/daemon/ai-units-gate.d.ts +54 -0
  104. package/dist/daemon/ai-units-gate.js +82 -0
  105. package/dist/daemon/ai-units-gate.js.map +1 -0
  106. package/dist/daemon/creator.js +13 -0
  107. package/dist/daemon/creator.js.map +1 -1
  108. package/dist/daemon/daemon.d.ts +10 -0
  109. package/dist/daemon/daemon.js +203 -30
  110. package/dist/daemon/daemon.js.map +1 -1
  111. package/dist/daemon/eviction-loop.d.ts +7 -0
  112. package/dist/daemon/eviction-loop.js +16 -0
  113. package/dist/daemon/eviction-loop.js.map +1 -1
  114. package/dist/daemon/gate-logger.d.ts +9 -0
  115. package/dist/daemon/gate-logger.js +2 -0
  116. package/dist/daemon/gate-logger.js.map +1 -0
  117. package/dist/daemon/jinn-claim-loop.js +22 -4
  118. package/dist/daemon/jinn-claim-loop.js.map +1 -1
  119. package/dist/daemon/readiness-gate.d.ts +1 -4
  120. package/dist/daemon/readiness-gate.js.map +1 -1
  121. package/dist/daemon/spend-cap-gate.d.ts +40 -0
  122. package/dist/daemon/spend-cap-gate.js +46 -0
  123. package/dist/daemon/spend-cap-gate.js.map +1 -0
  124. package/dist/dashboard/assets/index-Bwn1qan1.js +351 -0
  125. package/dist/dashboard/assets/index-CzKxvMcU.css +32 -0
  126. package/dist/dashboard/index.html +2 -2
  127. package/dist/discovery/http.js +411 -2
  128. package/dist/discovery/http.js.map +1 -1
  129. package/dist/discovery/onchain.js +123 -5
  130. package/dist/discovery/onchain.js.map +1 -1
  131. package/dist/discovery/types.d.ts +202 -0
  132. package/dist/discovery/types.js +40 -0
  133. package/dist/discovery/types.js.map +1 -1
  134. package/dist/discovery/with-fallback.js +34 -0
  135. package/dist/discovery/with-fallback.js.map +1 -1
  136. package/dist/earning/bootstrap.d.ts +25 -3
  137. package/dist/earning/bootstrap.js +69 -15
  138. package/dist/earning/bootstrap.js.map +1 -1
  139. package/dist/earning/safe-adapter.js +23 -11
  140. package/dist/earning/safe-adapter.js.map +1 -1
  141. package/dist/earning/types.d.ts +6 -6
  142. package/dist/earning/viem-clients.d.ts +11 -4
  143. package/dist/earning/viem-clients.js +14 -5
  144. package/dist/earning/viem-clients.js.map +1 -1
  145. package/dist/erc8004/identity.d.ts +19 -3
  146. package/dist/erc8004/identity.js +38 -11
  147. package/dist/erc8004/identity.js.map +1 -1
  148. package/dist/erc8004/index.d.ts +1 -1
  149. package/dist/erc8004/index.js.map +1 -1
  150. package/dist/events/types.d.ts +2 -2
  151. package/dist/harnesses/cost-estimates.d.ts +10 -31
  152. package/dist/harnesses/cost-estimates.js +11 -43
  153. package/dist/harnesses/cost-estimates.js.map +1 -1
  154. package/dist/harnesses/engine/engine.d.ts +37 -4
  155. package/dist/harnesses/engine/engine.js +138 -17
  156. package/dist/harnesses/engine/engine.js.map +1 -1
  157. package/dist/harnesses/engine/persistence.d.ts +21 -4
  158. package/dist/harnesses/engine/persistence.js +43 -6
  159. package/dist/harnesses/engine/persistence.js.map +1 -1
  160. package/dist/harnesses/engine/state.d.ts +9 -0
  161. package/dist/harnesses/engine/state.js +23 -10
  162. package/dist/harnesses/engine/state.js.map +1 -1
  163. package/dist/harnesses/impls/hermes-agent/bootstrap.js +4 -2
  164. package/dist/harnesses/impls/hermes-agent/bootstrap.js.map +1 -1
  165. package/dist/harnesses/impls/hermes-agent/config-builder.d.ts +1 -1
  166. package/dist/harnesses/impls/hermes-agent/config-builder.js +4 -2
  167. package/dist/harnesses/impls/hermes-agent/config-builder.js.map +1 -1
  168. package/dist/harnesses/impls/hermes-agent/harness.d.ts +14 -0
  169. package/dist/harnesses/impls/hermes-agent/harness.js +16 -2
  170. package/dist/harnesses/impls/hermes-agent/harness.js.map +1 -1
  171. package/dist/harnesses/impls/hermes-agent/prompt.d.ts +6 -6
  172. package/dist/harnesses/impls/hermes-agent/prompt.js +6 -6
  173. package/dist/harnesses/impls/learner/adapters/claude-code.d.ts +17 -0
  174. package/dist/harnesses/impls/learner/adapters/claude-code.js +113 -14
  175. package/dist/harnesses/impls/learner/adapters/claude-code.js.map +1 -1
  176. package/dist/harnesses/impls/learner/adapters/codex-code.d.ts +9 -0
  177. package/dist/harnesses/impls/learner/adapters/codex-code.js +30 -8
  178. package/dist/harnesses/impls/learner/adapters/codex-code.js.map +1 -1
  179. package/dist/harnesses/impls/learner/harness.d.ts +24 -0
  180. package/dist/harnesses/impls/learner/harness.js +27 -3
  181. package/dist/harnesses/impls/learner/harness.js.map +1 -1
  182. package/dist/harnesses/impls/learner/harvest.d.ts +1 -1
  183. package/dist/harnesses/impls/learner/harvest.js +23 -5
  184. package/dist/harnesses/impls/learner/harvest.js.map +1 -1
  185. package/dist/harnesses/impls/learner/restoration-patch.d.ts +2 -2
  186. package/dist/harnesses/impls/learner/restoration-patch.js +25 -6
  187. package/dist/harnesses/impls/learner/restoration-patch.js.map +1 -1
  188. package/dist/harnesses/impls/swe-rebench-v2-evaluator/eval-runner.js +21 -1
  189. package/dist/harnesses/impls/swe-rebench-v2-evaluator/eval-runner.js.map +1 -1
  190. package/dist/harnesses/impls/swe-rebench-v2-evaluator/hf-fetcher.d.ts +74 -5
  191. package/dist/harnesses/impls/swe-rebench-v2-evaluator/hf-fetcher.js +103 -32
  192. package/dist/harnesses/impls/swe-rebench-v2-evaluator/hf-fetcher.js.map +1 -1
  193. package/dist/harnesses/readiness-registry.d.ts +7 -0
  194. package/dist/harnesses/readiness-registry.js +9 -0
  195. package/dist/harnesses/readiness-registry.js.map +1 -1
  196. package/dist/learner/revert-decision.d.ts +59 -0
  197. package/dist/learner/revert-decision.js +53 -0
  198. package/dist/learner/revert-decision.js.map +1 -0
  199. package/dist/learner/revert-stats.d.ts +24 -0
  200. package/dist/learner/revert-stats.js +44 -0
  201. package/dist/learner/revert-stats.js.map +1 -0
  202. package/dist/main.js +178 -104
  203. package/dist/main.js.map +1 -1
  204. package/dist/mcp/get-codedigest-reward.d.ts +13 -0
  205. package/dist/mcp/get-codedigest-reward.js +23 -0
  206. package/dist/mcp/get-codedigest-reward.js.map +1 -0
  207. package/dist/mcp/server.js +23 -0
  208. package/dist/mcp/server.js.map +1 -1
  209. package/dist/observability/debug-report-assemble.d.ts +43 -0
  210. package/dist/observability/debug-report-assemble.js +80 -0
  211. package/dist/observability/debug-report-assemble.js.map +1 -0
  212. package/dist/observability/emit-event.d.ts +9 -2
  213. package/dist/observability/emit-event.js +36 -2
  214. package/dist/observability/emit-event.js.map +1 -1
  215. package/dist/observability/file-logger.d.ts +69 -0
  216. package/dist/observability/file-logger.js +177 -0
  217. package/dist/observability/file-logger.js.map +1 -0
  218. package/dist/observability/redact-secrets.d.ts +65 -0
  219. package/dist/observability/redact-secrets.js +300 -0
  220. package/dist/observability/redact-secrets.js.map +1 -0
  221. package/dist/observability/tar.d.ts +30 -0
  222. package/dist/observability/tar.js +102 -0
  223. package/dist/observability/tar.js.map +1 -0
  224. package/dist/plugins/learner/skills/learn/consolidator-prompt.md +18 -1
  225. package/dist/plugins/learner/skills/learn/promoter-prompt.md +72 -1
  226. package/dist/preflight/pidfile-liveness.d.ts +44 -0
  227. package/dist/preflight/pidfile-liveness.js +103 -0
  228. package/dist/preflight/pidfile-liveness.js.map +1 -0
  229. package/dist/preflight/rpc-network.d.ts +40 -0
  230. package/dist/preflight/rpc-network.js +67 -1
  231. package/dist/preflight/rpc-network.js.map +1 -1
  232. package/dist/rpc/transport.d.ts +109 -0
  233. package/dist/rpc/transport.js +220 -0
  234. package/dist/rpc/transport.js.map +1 -0
  235. package/dist/scripts/donation-consumption-acceptance.js +7 -28
  236. package/dist/scripts/donation-consumption-acceptance.js.map +1 -1
  237. package/dist/scripts/swe-rebench-v2-pytest-missing.json +16 -0
  238. package/dist/solver-nets/prediction-operator-ux.d.ts +1 -2
  239. package/dist/solver-nets/prediction-operator-ux.js +56 -53
  240. package/dist/solver-nets/prediction-operator-ux.js.map +1 -1
  241. package/dist/solver-nets/registry.d.ts +19 -1
  242. package/dist/solver-nets/registry.js +37 -24
  243. package/dist/solver-nets/registry.js.map +1 -1
  244. package/dist/solver-types/_swe-rebench-v2-pool.d.ts +9 -2
  245. package/dist/solver-types/_swe-rebench-v2-pool.js +15 -20
  246. package/dist/solver-types/_swe-rebench-v2-pool.js.map +1 -1
  247. package/dist/solver-types/_swe-rebench-v2-state.d.ts +15 -0
  248. package/dist/solver-types/_swe-rebench-v2-state.js +19 -0
  249. package/dist/solver-types/_swe-rebench-v2-state.js.map +1 -1
  250. package/dist/solver-types/_swe-rebench-v2-validated-pool.d.ts +116 -2
  251. package/dist/solver-types/_swe-rebench-v2-validated-pool.js +296 -21
  252. package/dist/solver-types/_swe-rebench-v2-validated-pool.js.map +1 -1
  253. package/dist/solver-types/swe-rebench-v2-auto.d.ts +20 -11
  254. package/dist/solver-types/swe-rebench-v2-auto.js +64 -19
  255. package/dist/solver-types/swe-rebench-v2-auto.js.map +1 -1
  256. package/dist/solver-types/swe-rebench-v2.d.ts +8 -2
  257. package/dist/solver-types/swe-rebench-v2.js +127 -11
  258. package/dist/solver-types/swe-rebench-v2.js.map +1 -1
  259. package/dist/solvernets/daemon-init.d.ts +1 -1
  260. package/dist/solvernets/daemon-init.js +19 -4
  261. package/dist/solvernets/daemon-init.js.map +1 -1
  262. package/dist/solvernets/launched-record-dispatcher.d.ts +4 -0
  263. package/dist/solvernets/launched-record-dispatcher.js +10 -4
  264. package/dist/solvernets/launched-record-dispatcher.js.map +1 -1
  265. package/dist/solvernets/registry-client-erc8004.js +11 -0
  266. package/dist/solvernets/registry-client-erc8004.js.map +1 -1
  267. package/dist/solvernets/store.d.ts +2 -2
  268. package/dist/spend/ai-units-config.d.ts +39 -0
  269. package/dist/spend/ai-units-config.js +28 -0
  270. package/dist/spend/ai-units-config.js.map +1 -0
  271. package/dist/spend/ai-units.d.ts +89 -0
  272. package/dist/spend/ai-units.js +156 -0
  273. package/dist/spend/ai-units.js.map +1 -0
  274. package/dist/spend/cost-surface-status.d.ts +12 -0
  275. package/dist/spend/cost-surface-status.js +24 -0
  276. package/dist/spend/cost-surface-status.js.map +1 -0
  277. package/dist/spend/credential.d.ts +39 -0
  278. package/dist/spend/credential.js +71 -0
  279. package/dist/spend/credential.js.map +1 -0
  280. package/dist/spend/daemon-config.d.ts +13 -0
  281. package/dist/spend/daemon-config.js +24 -0
  282. package/dist/spend/daemon-config.js.map +1 -0
  283. package/dist/spend/pricing.d.ts +16 -0
  284. package/dist/spend/pricing.js +26 -0
  285. package/dist/spend/pricing.js.map +1 -0
  286. package/dist/spend/record.d.ts +13 -0
  287. package/dist/spend/record.js +36 -0
  288. package/dist/spend/record.js.map +1 -0
  289. package/dist/spend/usage.d.ts +27 -0
  290. package/dist/spend/usage.js +113 -0
  291. package/dist/spend/usage.js.map +1 -0
  292. package/dist/store/store.d.ts +101 -0
  293. package/dist/store/store.js +304 -4
  294. package/dist/store/store.js.map +1 -1
  295. package/dist/trajectory/transcript-parsers/codex-session.d.ts +12 -6
  296. package/dist/trajectory/transcript-parsers/codex-session.js +114 -13
  297. package/dist/trajectory/transcript-parsers/codex-session.js.map +1 -1
  298. package/dist/trajectory/transcript-parsers/types.d.ts +8 -8
  299. package/dist/trajectory/transcript-session-dirs.d.ts +18 -0
  300. package/dist/trajectory/transcript-session-dirs.js +85 -0
  301. package/dist/trajectory/transcript-session-dirs.js.map +1 -0
  302. package/dist/trajectory/transcript-watcher.d.ts +20 -1
  303. package/dist/trajectory/transcript-watcher.js +108 -32
  304. package/dist/trajectory/transcript-watcher.js.map +1 -1
  305. package/dist/tx-retry.d.ts +25 -0
  306. package/dist/tx-retry.js +95 -7
  307. package/dist/tx-retry.js.map +1 -1
  308. package/dist/types/payloads/portfolio-v0.d.ts +3 -3
  309. package/dist/types/payloads/prediction-apy-v0.d.ts +3 -3
  310. package/dist/types/payloads/prediction-v0.d.ts +12 -12
  311. package/package.json +11 -3
  312. package/plugins/learner/skills/learn/consolidator-prompt.md +18 -1
  313. package/plugins/learner/skills/learn/promoter-prompt.md +72 -1
  314. package/plugins/swe-rebench-v2-diffmin/README.md +10 -9
  315. package/plugins/swe-rebench-v2-diffmin/jinn.plugin.json +1 -1
  316. package/plugins/swe-rebench-v2-diffmin/skills/diffmin/SKILL.md +15 -10
  317. package/plugins/swe-rebench-v2-diffmin/skills/test-map/SKILL.md +10 -12
  318. package/plugins/swe-rebench-v2-runtime/.claude-plugin/plugin.json +1 -1
  319. package/plugins/swe-rebench-v2-runtime/.codex-plugin/plugin.json +3 -3
  320. package/plugins/swe-rebench-v2-runtime/README.md +6 -6
  321. package/plugins/swe-rebench-v2-runtime/jinn.plugin.json +2 -3
  322. package/plugins/swe-rebench-v2-runtime/skills/task/SKILL.md +81 -0
  323. package/dist/dashboard/assets/index-BUlE8F3Y.js +0 -330
  324. package/dist/dashboard/assets/index-blqc7eqq.css +0 -32
  325. package/plugins/swe-rebench-v2-runtime/skills/orient/SKILL.md +0 -29
  326. package/plugins/swe-rebench-v2-runtime/skills/plan/SKILL.md +0 -53
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Copyright (c) 2014 The xterm.js authors. All rights reserved.
3
+ * Copyright (c) 2012-2013, Christopher Jeffrey (MIT License)
4
+ * https://github.com/chjj/term.js
5
+ * @license MIT
6
+ *
7
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
8
+ * of this software and associated documentation files (the "Software"), to deal
9
+ * in the Software without restriction, including without limitation the rights
10
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11
+ * copies of the Software, and to permit persons to whom the Software is
12
+ * furnished to do so, subject to the following conditions:
13
+ *
14
+ * The above copyright notice and this permission notice shall be included in
15
+ * all copies or substantial portions of the Software.
16
+ *
17
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
23
+ * THE SOFTWARE.
24
+ *
25
+ * Originally forked from (with the author's permission):
26
+ * Fabrice Bellard's javascript vt100 for jslinux:
27
+ * http://bellard.org/jslinux/
28
+ * Copyright (c) 2011 Fabrice Bellard
29
+ * The original design remains. The terminal itself
30
+ * has been extended to include xterm CSI codes, among
31
+ * other features.
32
+ */.xterm{cursor:text;position:relative;-moz-user-select:none;user-select:none;-ms-user-select:none;-webkit-user-select:none}.xterm.focus,.xterm:focus{outline:none}.xterm .xterm-helpers{position:absolute;top:0;z-index:5}.xterm .xterm-helper-textarea{padding:0;border:0;margin:0;position:absolute;opacity:0;left:-9999em;top:0;width:0;height:0;z-index:-5;white-space:nowrap;overflow:hidden;resize:none}.xterm .composition-view{background:#000;color:#fff;display:none;position:absolute;white-space:nowrap;z-index:1}.xterm .composition-view.active{display:block}.xterm .xterm-viewport{background-color:#000;overflow-y:scroll;cursor:default;position:absolute;right:0;left:0;top:0;bottom:0}.xterm .xterm-screen{position:relative}.xterm .xterm-screen canvas{position:absolute;left:0;top:0}.xterm .xterm-scroll-area{visibility:hidden}.xterm-char-measure-element{display:inline-block;visibility:hidden;position:absolute;top:0;left:-9999em;line-height:normal}.xterm.enable-mouse-events{cursor:default}.xterm.xterm-cursor-pointer,.xterm .xterm-cursor-pointer{cursor:pointer}.xterm.column-select.focus{cursor:crosshair}.xterm .xterm-accessibility,.xterm .xterm-message{position:absolute;left:0;top:0;bottom:0;right:0;z-index:10;color:transparent;pointer-events:none}.xterm .live-region{position:absolute;left:-9999px;width:1px;height:1px;overflow:hidden}.xterm-dim{opacity:1!important}.xterm-underline-1{text-decoration:underline}.xterm-underline-2{-webkit-text-decoration:double underline;text-decoration:double underline}.xterm-underline-3{-webkit-text-decoration:wavy underline;text-decoration:wavy underline}.xterm-underline-4{-webkit-text-decoration:dotted underline;text-decoration:dotted underline}.xterm-underline-5{-webkit-text-decoration:dashed underline;text-decoration:dashed underline}.xterm-overline{text-decoration:overline}.xterm-overline.xterm-underline-1{text-decoration:overline underline}.xterm-overline.xterm-underline-2{-webkit-text-decoration:overline double underline;text-decoration:overline double underline}.xterm-overline.xterm-underline-3{-webkit-text-decoration:overline wavy underline;text-decoration:overline wavy underline}.xterm-overline.xterm-underline-4{-webkit-text-decoration:overline dotted underline;text-decoration:overline dotted underline}.xterm-overline.xterm-underline-5{-webkit-text-decoration:overline dashed underline;text-decoration:overline dashed underline}.xterm-strikethrough{text-decoration:line-through}.xterm-screen .xterm-decoration-container .xterm-decoration{z-index:6;position:absolute}.xterm-screen .xterm-decoration-container .xterm-decoration.xterm-decoration-top-layer{z-index:7}.xterm-decoration-overview-ruler{z-index:8;position:absolute;top:0;right:0;pointer-events:none}.xterm-decoration-top{z-index:2;position:relative}*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--mono);font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.container{width:100%;margin-right:auto;margin-left:auto;padding-right:2rem;padding-left:2rem}@media (min-width: 1400px){.container{max-width:1400px}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.pointer-events-none{pointer-events:none}.visible{visibility:visible}.invisible{visibility:hidden}.collapse{visibility:collapse}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{top:0;right:0;bottom:0;left:0}.inset-x-0{left:0;right:0}.inset-y-0{top:0;bottom:0}.bottom-0{bottom:0}.left-0{left:0}.left-2{left:.5rem}.left-\[3px\]{left:3px}.left-\[50\%\]{left:50%}.right-0{right:0}.right-4{right:1rem}.right-\[3px\]{right:3px}.top-0{top:0}.top-4{top:1rem}.top-8{top:2rem}.top-\[2px\]{top:2px}.top-\[50\%\]{top:50%}.z-50{z-index:50}.col-span-12{grid-column:span 12 / span 12}.col-span-2{grid-column:span 2 / span 2}.col-span-full{grid-column:1 / -1}.m-0{margin:0}.m-3{margin:.75rem}.-mx-1{margin-left:-.25rem;margin-right:-.25rem}.mx-auto{margin-left:auto;margin-right:auto}.my-1{margin-top:.25rem;margin-bottom:.25rem}.my-5{margin-top:1.25rem;margin-bottom:1.25rem}.my-8{margin-top:2rem;margin-bottom:2rem}.-mb-px{margin-bottom:-1px}.mb-0\.5{margin-bottom:.125rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-5{margin-bottom:1.25rem}.ml-1{margin-left:.25rem}.ml-12{margin-left:3rem}.ml-2\.5{margin-left:.625rem}.ml-auto{margin-left:auto}.mr-2{margin-right:.5rem}.mr-auto{margin-right:auto}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-1\.5{margin-top:.375rem}.mt-2{margin-top:.5rem}.mt-2\.5{margin-top:.625rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-6{margin-top:1.5rem}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.contents{display:contents}.hidden{display:none}.\!size-3{width:.75rem!important;height:.75rem!important}.\!size-3\.5{width:.875rem!important;height:.875rem!important}.size-3{width:.75rem;height:.75rem}.size-3\.5{width:.875rem;height:.875rem}.h-1\.5{height:.375rem}.h-10{height:2.5rem}.h-2{height:.5rem}.h-2\.5{height:.625rem}.h-20{height:5rem}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-64{height:16rem}.h-7{height:1.75rem}.h-8{height:2rem}.h-9{height:2.25rem}.h-\[18px\]{height:18px}.h-\[3px\]{height:3px}.h-\[calc\(100vh-220px\)\]{height:calc(100vh - 220px)}.h-auto{height:auto}.h-full{height:100%}.h-px{height:1px}.h-screen{height:100vh}.max-h-60{max-height:15rem}.max-h-\[280px\]{max-height:280px}.max-h-\[560px\]{max-height:560px}.min-h-0{min-height:0px}.min-h-\[1\.5em\]{min-height:1.5em}.min-h-\[400px\]{min-height:400px}.min-h-\[520px\]{min-height:520px}.min-h-\[96px\]{min-height:96px}.min-h-screen{min-height:100vh}.w-1\.5{width:.375rem}.w-2{width:.5rem}.w-2\.5{width:.625rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-3\/4{width:75%}.w-4{width:1rem}.w-4\/6{width:66.666667%}.w-40{width:10rem}.w-5{width:1.25rem}.w-5\/6{width:83.333333%}.w-72{width:18rem}.w-8{width:2rem}.w-9{width:2.25rem}.w-\[14\%\]{width:14%}.w-\[16\%\]{width:16%}.w-\[22\%\]{width:22%}.w-\[34\%\]{width:34%}.w-\[min\(28rem\,90vw\)\]{width:min(28rem,90vw)}.w-full{width:100%}.w-px{width:1px}.min-w-0{min-width:0px}.min-w-\[100px\]{min-width:100px}.min-w-\[160px\]{min-width:160px}.min-w-\[180px\]{min-width:180px}.min-w-\[260px\]{min-width:260px}.min-w-\[64px\]{min-width:64px}.min-w-\[80px\]{min-width:80px}.min-w-\[8rem\]{min-width:8rem}.max-w-4xl{max-width:56rem}.max-w-6xl{max-width:72rem}.max-w-\[1100px\]{max-width:1100px}.max-w-\[1280px\]{max-width:1280px}.max-w-\[280px\]{max-width:280px}.max-w-\[320px\]{max-width:320px}.max-w-\[34ch\]{max-width:34ch}.max-w-\[420px\]{max-width:420px}.max-w-\[440px\]{max-width:440px}.max-w-\[64ch\]{max-width:64ch}.max-w-\[720px\]{max-width:720px}.max-w-\[72ch\]{max-width:72ch}.max-w-\[880px\]{max-width:880px}.max-w-\[960px\]{max-width:960px}.max-w-lg{max-width:32rem}.max-w-xl{max-width:36rem}.flex-1{flex:1 1 0%}.flex-\[1_1_360px\]{flex:1 1 360px}.shrink-0{flex-shrink:0}.table-fixed{table-layout:fixed}.caption-bottom{caption-side:bottom}.translate-x-\[-50\%\]{--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-y-\[-50\%\]{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.cursor-default{cursor:default}.cursor-help{cursor:help}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.touch-none{touch-action:none}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.resize-y{resize:vertical}.resize{resize:both}.list-none{list-style-type:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-\[140px_1fr\]{grid-template-columns:140px 1fr}.grid-cols-\[160px_1fr\]{grid-template-columns:160px 1fr}.grid-cols-\[1fr_320px\]{grid-template-columns:1fr 320px}.grid-cols-\[1fr_auto\]{grid-template-columns:1fr auto}.grid-cols-\[3rem_1fr_auto\]{grid-template-columns:3rem 1fr auto}.grid-cols-\[68px_84px_1fr\]{grid-template-columns:68px 84px 1fr}.grid-cols-\[90px_1fr\]{grid-template-columns:90px 1fr}.grid-cols-\[auto_1fr\]{grid-template-columns:auto 1fr}.grid-cols-\[auto_1fr_auto\]{grid-template-columns:auto 1fr auto}.grid-cols-\[auto_1fr_auto_auto\]{grid-template-columns:auto 1fr auto auto}.grid-cols-\[minmax\(0\,1fr\)_auto\]{grid-template-columns:minmax(0,1fr) auto}.grid-rows-\[auto_auto_auto_minmax\(0\,1fr\)\]{grid-template-rows:auto auto auto minmax(0,1fr)}.grid-rows-\[auto_auto_minmax\(0\,1fr\)\]{grid-template-rows:auto auto minmax(0,1fr)}.flex-row{flex-direction:row}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.items-baseline{align-items:baseline}.items-stretch{align-items:stretch}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-0{gap:0px}.gap-0\.5{gap:.125rem}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-10{gap:2.5rem}.gap-2{gap:.5rem}.gap-2\.5{gap:.625rem}.gap-3{gap:.75rem}.gap-3\.5{gap:.875rem}.gap-4{gap:1rem}.gap-5{gap:1.25rem}.gap-6{gap:1.5rem}.gap-8{gap:2rem}.gap-\[3px\]{gap:3px}.gap-x-3{-moz-column-gap:.75rem;column-gap:.75rem}.gap-x-3\.5{-moz-column-gap:.875rem;column-gap:.875rem}.gap-x-4{-moz-column-gap:1rem;column-gap:1rem}.gap-y-1{row-gap:.25rem}.gap-y-1\.5{row-gap:.375rem}.gap-y-2{row-gap:.5rem}.gap-y-2\.5{row-gap:.625rem}.self-start{align-self:flex-start}.self-center{align-self:center}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-line{white-space:pre-line}.whitespace-pre-wrap{white-space:pre-wrap}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.rounded{border-radius:.25rem}.rounded-\[inherit\]{border-radius:inherit}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:var(--radius-3)}.rounded-md{border-radius:var(--radius-2)}.rounded-none{border-radius:0}.rounded-sm{border-radius:var(--radius-1)}.border{border-width:1px}.border-0{border-width:0px}.border-b{border-bottom-width:1px}.border-l{border-left-width:1px}.border-l-0{border-left-width:0px}.border-l-2{border-left-width:2px}.border-r{border-right-width:1px}.border-t{border-top-width:1px}.border-dashed{border-style:dashed}.border-\[var\(--accent-sky\)\]{border-color:var(--accent-sky)}.border-\[var\(--border\)\]{border-color:var(--border)}.border-\[var\(--break-red\)\]{border-color:var(--break-red)}.border-\[var\(--severity-blocking-border\)\]{border-color:var(--severity-blocking-border)}.border-\[var\(--severity-blocking-fg\)\]{border-color:var(--severity-blocking-fg)}.border-\[var\(--severity-info-fg\)\]{border-color:var(--severity-info-fg)}.border-\[var\(--severity-success-border\)\]{border-color:var(--severity-success-border)}.border-\[var\(--severity-warning-border\)\]{border-color:var(--severity-warning-border)}.border-\[var\(--severity-warning-fg\)\]{border-color:var(--severity-warning-fg)}.border-\[var\(--vow-green\)\]{border-color:var(--vow-green)}.border-\[var\(--wane\)\]{border-color:var(--wane)}.border-border{border-color:var(--border)}.border-break-red{border-color:var(--break-red)}.border-destructive{border-color:var(--destructive)}.border-input{border-color:var(--input)}.border-muted-foreground{border-color:var(--muted-foreground)}.border-primary{border-color:var(--primary)}.border-transparent{border-color:transparent}.border-wane{border-color:var(--wane)}.border-l-\[var\(\$\{expectedToken\}\)\]{border-left-color:var(${expectedToken})}.border-l-\[var\(--severity-blocking-fg\)\]{border-left-color:var(--severity-blocking-fg)}.border-l-\[var\(--severity-info-fg\)\]{border-left-color:var(--severity-info-fg)}.border-l-\[var\(--severity-warning-fg\)\]{border-left-color:var(--severity-warning-fg)}.border-l-primary{border-left-color:var(--primary)}.border-l-transparent{border-left-color:transparent}.border-t-transparent{border-top-color:transparent}.bg-\[var\(--accent-gold\)\]{background-color:var(--accent-gold)}.bg-\[var\(--accent-sky\)\]{background-color:var(--accent-sky)}.bg-\[var\(--bg\)\]{background-color:var(--bg)}.bg-\[var\(--bg-elevated\)\]{background-color:var(--bg-elevated)}.bg-\[var\(--bg-sunken\)\]{background-color:var(--bg-sunken)}.bg-\[var\(--border-strong\)\]{background-color:var(--border-strong)}.bg-\[var\(--break-red\)\]{background-color:var(--break-red)}.bg-\[var\(--fg-muted\)\]{background-color:var(--fg-muted)}.bg-\[var\(--seer-violet\)\]{background-color:var(--seer-violet)}.bg-\[var\(--severity-blocking-bg\)\]{background-color:var(--severity-blocking-bg)}.bg-\[var\(--severity-success-bg\)\]{background-color:var(--severity-success-bg)}.bg-\[var\(--severity-warning-bg\)\]{background-color:var(--severity-warning-bg)}.bg-\[var\(--vow-green\)\]{background-color:var(--vow-green)}.bg-accent{background-color:var(--accent)}.bg-accent-sky{background-color:var(--accent-sky)}.bg-background{background-color:var(--background)}.bg-black\/70{background-color:#000000b3}.bg-border{background-color:var(--border)}.bg-card{background-color:var(--card)}.bg-elevated{background-color:var(--bg-elevated)}.bg-muted{background-color:var(--muted)}.bg-muted-foreground{background-color:var(--muted-foreground)}.bg-popover{background-color:var(--popover)}.bg-primary{background-color:var(--primary)}.bg-sunken,.bg-surface-sunken{background-color:var(--bg-sunken)}.bg-transparent{background-color:transparent}.p-0{padding:0}.p-1{padding:.25rem}.p-2\.5{padding:.625rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.p-6{padding:1.5rem}.p-8{padding:2rem}.p-px{padding:1px}.px-0{padding-left:0;padding-right:0}.px-0\.5{padding-left:.125rem;padding-right:.125rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-10{padding-left:2.5rem;padding-right:2.5rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-3\.5{padding-left:.875rem;padding-right:.875rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-10{padding-top:2.5rem;padding-bottom:2.5rem}.py-16{padding-top:4rem;padding-bottom:4rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-3\.5{padding-top:.875rem;padding-bottom:.875rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-5{padding-top:1.25rem;padding-bottom:1.25rem}.py-\[5px\]{padding-top:5px;padding-bottom:5px}.py-px{padding-top:1px;padding-bottom:1px}.pb-12{padding-bottom:3rem}.pb-2{padding-bottom:.5rem}.pb-3{padding-bottom:.75rem}.pb-5{padding-bottom:1.25rem}.pb-6{padding-bottom:1.5rem}.pb-px{padding-bottom:1px}.pl-2{padding-left:.5rem}.pl-2\.5{padding-left:.625rem}.pl-8{padding-left:2rem}.pl-\[22px\]{padding-left:22px}.pr-2{padding-right:.5rem}.pt-0{padding-top:0}.pt-1{padding-top:.25rem}.pt-2{padding-top:.5rem}.pt-3{padding-top:.75rem}.pt-3\.5{padding-top:.875rem}.pt-4{padding-top:1rem}.pt-8{padding-top:2rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.align-baseline{vertical-align:baseline}.align-middle{vertical-align:middle}.font-mono{font-family:var(--mono)}.font-sans{font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji"}.font-serif{font-family:var(--serif)}.text-2xl{font-size:1.5rem;line-height:2rem}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[12px\]{font-size:12px}.text-\[13px\]{font-size:13px}.text-\[14px\]{font-size:14px}.text-\[15px\]{font-size:15px}.text-\[17px\]{font-size:17px}.text-\[18px\]{font-size:18px}.text-\[20px\]{font-size:20px}.text-\[22px\]{font-size:22px}.text-\[24px\]{font-size:24px}.text-\[26px\]{font-size:26px}.text-\[28px\]{font-size:28px}.text-\[32px\]{font-size:32px}.text-\[64px\]{font-size:64px}.text-\[76px\]{font-size:76px}.text-\[9px\]{font-size:9px}.text-base{font-size:1rem;line-height:1.5rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-normal{font-weight:400}.uppercase{text-transform:uppercase}.capitalize{text-transform:capitalize}.normal-case{text-transform:none}.italic{font-style:italic}.tabular-nums{--tw-numeric-spacing: tabular-nums;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.leading-\[1\.05\]{line-height:1.05}.leading-\[1\.25\]{line-height:1.25}.leading-\[1\.2\]{line-height:1.2}.leading-\[1\.5\]{line-height:1.5}.leading-\[1\.6\]{line-height:1.6}.leading-\[1\.7\]{line-height:1.7}.leading-relaxed{line-height:1.625}.leading-snug{line-height:1.375}.leading-tight{line-height:1.25}.tracking-\[-0\.01em\]{letter-spacing:-.01em}.tracking-\[0\.05em\]{letter-spacing:.05em}.tracking-\[0\.06em\]{letter-spacing:.06em}.tracking-\[0\.08em\]{letter-spacing:.08em}.tracking-\[0\.12em\]{letter-spacing:.12em}.tracking-\[0\.14em\]{letter-spacing:.14em}.tracking-\[0\.1em\]{letter-spacing:.1em}.tracking-normal{letter-spacing:0em}.tracking-tight{letter-spacing:-.025em}.tracking-wide{letter-spacing:.025em}.text-\[var\(--accent-gold\)\]{color:var(--accent-gold)}.text-\[var\(--accent-sky\)\]{color:var(--accent-sky)}.text-\[var\(--bg\)\]{color:var(--bg)}.text-\[var\(--bg-sunken\)\]{color:var(--bg-sunken)}.text-\[var\(--break-red\)\]{color:var(--break-red)}.text-\[var\(--fg\)\]{color:var(--fg)}.text-\[var\(--fg-dim\)\]{color:var(--fg-dim)}.text-\[var\(--fg-muted\)\]{color:var(--fg-muted)}.text-\[var\(--severity-blocking-fg\)\]{color:var(--severity-blocking-fg)}.text-\[var\(--severity-info-fg\)\]{color:var(--severity-info-fg)}.text-\[var\(--severity-success-fg\)\]{color:var(--severity-success-fg)}.text-\[var\(--severity-warning-fg\)\]{color:var(--severity-warning-fg)}.text-\[var\(--vow-green\)\]{color:var(--vow-green)}.text-\[var\(--wane\)\]{color:var(--wane)}.text-accent-sky{color:var(--accent-sky)}.text-break-red{color:var(--break-red)}.text-card-foreground{color:var(--card-foreground)}.text-destructive{color:var(--destructive)}.text-dim,.text-fg-dim{color:var(--fg-dim)}.text-fg-muted{color:var(--fg-muted)}.text-foreground{color:var(--foreground)}.text-inherit{color:inherit}.text-muted-foreground{color:var(--muted-foreground)}.text-popover-foreground{color:var(--popover-foreground)}.text-primary{color:var(--primary)}.underline{text-decoration-line:underline}.no-underline{text-decoration-line:none}.underline-offset-2{text-underline-offset:2px}.underline-offset-4{text-underline-offset:4px}.accent-accent-sky{accent-color:var(--accent-sky)}.accent-destructive{accent-color:var(--destructive)}.accent-primary{accent-color:var(--primary)}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.shadow{--tw-shadow: 0 1px 3px 0 rgb(0 0 0 / .1), 0 1px 2px -1px rgb(0 0 0 / .1);--tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-md{--tw-shadow: 0 4px 6px -1px rgb(0 0 0 / .1), 0 2px 4px -2px rgb(0 0 0 / .1);--tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.outline-none{outline:2px solid transparent;outline-offset:2px}.outline{outline-style:solid}.ring{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-0{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-offset-background{--tw-ring-offset-color: var(--background)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-blur-sm{--tw-backdrop-blur: blur(4px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-200{transition-duration:.2s}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}@keyframes enter{0%{opacity:var(--tw-enter-opacity, 1);transform:translate3d(var(--tw-enter-translate-x, 0),var(--tw-enter-translate-y, 0),0) scale3d(var(--tw-enter-scale, 1),var(--tw-enter-scale, 1),var(--tw-enter-scale, 1)) rotate(var(--tw-enter-rotate, 0))}}@keyframes exit{to{opacity:var(--tw-exit-opacity, 1);transform:translate3d(var(--tw-exit-translate-x, 0),var(--tw-exit-translate-y, 0),0) scale3d(var(--tw-exit-scale, 1),var(--tw-exit-scale, 1),var(--tw-exit-scale, 1)) rotate(var(--tw-exit-rotate, 0))}}.duration-200{animation-duration:.2s}.ease-in-out{animation-timing-function:cubic-bezier(.4,0,.2,1)}.running{animation-play-state:running}.paused{animation-play-state:paused}.\[grid-template-columns\:120px_minmax\(0\,1fr\)\]{grid-template-columns:120px minmax(0,1fr)}.\[grid-template-columns\:140px_minmax\(0\,1fr\)\]{grid-template-columns:140px minmax(0,1fr)}.\[grid-template-columns\:minmax\(0\,1fr\)_minmax\(0\,380px\)\]{grid-template-columns:minmax(0,1fr) minmax(0,380px)}.\[grid-template-columns\:minmax\(120px\,180px\)_minmax\(0\,1fr\)\]{grid-template-columns:minmax(120px,180px) minmax(0,1fr)}.\[grid-template-columns\:minmax\(160px\,200px\)_minmax\(0\,1fr\)_minmax\(180px\,220px\)\]{grid-template-columns:minmax(160px,200px) minmax(0,1fr) minmax(180px,220px)}.\[grid-template-columns\:repeat\(auto-fit\,minmax\(120px\,1fr\)\)\]{grid-template-columns:repeat(auto-fit,minmax(120px,1fr))}.\[grid-template-columns\:repeat\(auto-fit\,minmax\(150px\,1fr\)\)\]{grid-template-columns:repeat(auto-fit,minmax(150px,1fr))}.\[grid-template-columns\:repeat\(auto-fit\,minmax\(180px\,1fr\)\)\]{grid-template-columns:repeat(auto-fit,minmax(180px,1fr))}.\[grid-template-columns\:repeat\(auto-fit\,minmax\(220px\,1fr\)\)\]{grid-template-columns:repeat(auto-fit,minmax(220px,1fr))}.\[overflow-wrap\:anywhere\]{overflow-wrap:anywhere}:root{--bg: #0c1628;--bg-elevated: #142340;--bg-sunken: #070d18;--fg: #f2f7fc;--fg-muted: #a4b0c2;--fg-dim: #7d8ba3;--border: #1f3a66;--border-strong: #7aa7dc;--border-accent: #c9a048;--accent-sky: #7aa7dc;--accent-sky-hover: #a8c8ea;--accent-gold: #dcb866;--accent-gold-hover: #ead08e;--vow-green: #6a9b8f;--wane: #b8802f;--break-red: #a85a5a;--seer-violet: #7a6db0;--surface: var(--bg-elevated);--surface-sunken: var(--bg-sunken);--radius-1: 4px;--radius-2: 6px;--radius-3: 10px;--radius-pill: 999px;--serif: "Instrument Serif", "Times New Roman", serif;--mono: "JetBrains Mono", ui-monospace, "SF Mono", Menlo, monospace;--text-2xs: 10px;--text-xs: 11px;--text-sm: 12px;--text-base: 14px;--text-md: 17px;--text-lg: 20px;--text-xl: 24px;--text-2xl: 26px;--text-display: 64px;--text-display-xl: 88px;--space-1: 4px;--space-2: 8px;--space-3: 12px;--space-4: 16px;--space-5: 24px;--space-6: 32px;--space-7: 48px;--space-8: 64px;--dur-fast: 80ms;--dur-base: .14s;--dur-slow: .24s;--ease-out: cubic-bezier(.16, 1, .3, 1);--ease-in-out: cubic-bezier(.4, 0, .2, 1);--severity-blocking-fg: var(--break-red);--severity-blocking-border: rgba(168, 90, 90, .6);--severity-blocking-bg: rgba(168, 90, 90, .06);--severity-warning-fg: var(--wane);--severity-warning-border: rgba(184, 128, 47, .6);--severity-warning-bg: rgba(184, 128, 47, .06);--severity-info-fg: var(--accent-sky);--severity-info-border: rgba(122, 167, 220, .4);--severity-info-bg: transparent;--severity-success-fg: var(--vow-green);--severity-success-border: rgba(106, 155, 143, .6);--severity-success-bg: rgba(106, 155, 143, .06);--background: var(--bg);--foreground: var(--fg);--card: var(--bg-elevated);--card-foreground: var(--fg);--popover: var(--bg-elevated);--popover-foreground: var(--fg);--primary: var(--accent-sky);--primary-foreground: var(--bg-sunken);--secondary: var(--bg-elevated);--secondary-foreground: var(--fg-muted);--muted: var(--bg-elevated);--muted-foreground: var(--fg-muted);--accent: var(--bg-elevated);--accent-foreground: var(--accent-sky);--destructive: var(--break-red);--destructive-foreground: var(--fg);--input: var(--border);--ring: var(--accent-sky);--radius: var(--radius-2)}html,body{background:var(--bg);color:var(--fg);font-family:var(--mono);font-feature-settings:"ss01" on,"ss02" on,"cv01" on}#root{min-height:100vh}button:focus-visible,input:focus-visible,textarea:focus-visible{outline:1px solid var(--accent-sky);outline-offset:2px}@keyframes jinnPulse{0%{box-shadow:0 0 #dcb8668c}70%{box-shadow:0 0 0 10px #dcb86600}to{box-shadow:0 0 #dcb86600}}@keyframes jinnFadeSlide{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}.jinn-anim-pulse{animation:jinnPulse 1.6s ease-out infinite}.jinn-anim-fade-slide{animation:jinnFadeSlide .32s ease-out both}.phase-row[data-status=active]{background:linear-gradient(90deg,rgba(220,184,102,.04) 0%,transparent 60%);transition:background .32s ease}.xterm,.xterm-viewport,.xterm-screen{width:100%!important}.agent-rail .xterm{min-width:0;overflow:hidden}.agent-rail .xterm-viewport{overflow-x:hidden}.agent-rail .xterm-accessibility-tree{display:none}.hfmf-intro-markdown h1{font-family:var(--serif);font-weight:400;font-size:40px;line-height:1.1;letter-spacing:0;color:var(--fg);margin:0 0 16px}.hfmf-intro-markdown h2{font-family:var(--serif);font-weight:400;font-size:22px;line-height:1.25;letter-spacing:0;color:var(--fg);margin:28px 0 8px;padding-top:20px;border-top:1px solid var(--border)}.hfmf-intro-markdown h2:first-child,.hfmf-intro-markdown h1+h2{padding-top:0;border-top:none}.hfmf-intro-markdown h3{font-family:var(--mono);font-size:11px;font-weight:500;letter-spacing:.14em;text-transform:uppercase;color:var(--fg-muted);margin:20px 0 8px}.hfmf-intro-markdown p{font-family:var(--mono);font-size:13px;line-height:1.7;letter-spacing:-.01em;color:var(--fg-muted);margin:0 0 12px;max-width:72ch}.hfmf-intro-markdown ul{font-family:var(--mono);font-size:13px;line-height:1.7;color:var(--fg-muted);list-style:none;padding:0;margin:0 0 12px}.hfmf-intro-markdown ul li{position:relative;padding-left:16px;margin:4px 0}.hfmf-intro-markdown ul li:before{content:"—";position:absolute;left:0;color:var(--fg-dim)}.hfmf-intro-markdown code{font-family:var(--mono);font-size:12px;color:var(--accent-sky);background:var(--bg-sunken);border:1px solid var(--border);border-radius:var(--radius-1);padding:1px 6px}.hfmf-intro-markdown pre{font-family:var(--mono);font-size:12px;line-height:1.6;color:var(--fg);background:var(--bg-sunken);border:1px solid var(--border);border-radius:var(--radius-2);padding:14px 16px;margin:0 0 14px;overflow-x:auto}.hfmf-intro-markdown pre code{background:transparent;border:0;padding:0;color:inherit}.hfmf-intro-markdown a{color:var(--accent-sky);text-decoration:none;border-bottom:1px solid var(--border)}.hfmf-intro-markdown a:hover{color:var(--accent-sky-hover);border-bottom-color:var(--accent-sky)}.placeholder\:text-\[var\(--fg-dim\)\]::-moz-placeholder{color:var(--fg-dim)}.placeholder\:text-\[var\(--fg-dim\)\]::placeholder{color:var(--fg-dim)}.placeholder\:text-fg-dim::-moz-placeholder{color:var(--fg-dim)}.placeholder\:text-fg-dim::placeholder{color:var(--fg-dim)}.hover\:border-foreground:hover{border-color:var(--foreground)}.hover\:bg-\[var\(--accent-gold-hover\)\]:hover{background-color:var(--accent-gold-hover)}.hover\:bg-\[var\(--accent-sky-hover\)\]:hover{background-color:var(--accent-sky-hover)}.hover\:bg-\[var\(--bg\)\]:hover{background-color:var(--bg)}.hover\:bg-\[var\(--bg-sunken\)\]:hover{background-color:var(--bg-sunken)}.hover\:bg-\[var\(--severity-blocking-bg\)\]:hover{background-color:var(--severity-blocking-bg)}.hover\:bg-accent:hover{background-color:var(--accent)}.hover\:bg-elevated:hover{background-color:var(--bg-elevated)}.hover\:bg-sunken:hover{background-color:var(--bg-sunken)}.hover\:bg-transparent:hover{background-color:transparent}.hover\:text-\[var\(--accent-sky-hover\)\]:hover{color:var(--accent-sky-hover)}.hover\:text-\[var\(--fg\)\]:hover{color:var(--fg)}.hover\:text-foreground:hover{color:var(--foreground)}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-100:hover{opacity:1}.focus\:bg-\[var\(--bg-sunken\)\]:focus{background-color:var(--bg-sunken)}.focus\:text-foreground:focus{color:var(--foreground)}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-1:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-ring:focus{--tw-ring-color: var(--ring)}.focus\:ring-offset-2:focus{--tw-ring-offset-width: 2px}.focus-visible\:bg-sunken:focus-visible{background-color:var(--bg-sunken)}.focus-visible\:outline-none:focus-visible{outline:2px solid transparent;outline-offset:2px}.focus-visible\:ring-0:focus-visible{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus-visible\:ring-1:focus-visible{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus-visible\:ring-2:focus-visible{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus-visible\:ring-ring:focus-visible{--tw-ring-color: var(--ring)}.focus-visible\:ring-offset-2:focus-visible{--tw-ring-offset-width: 2px}.focus-visible\:ring-offset-background:focus-visible{--tw-ring-offset-color: var(--background)}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}.group.toaster .group-\[\.toaster\]\:border-border{border-color:var(--border)}.group.toast .group-\[\.toast\]\:bg-\[var\(--accent-sky\)\]{background-color:var(--accent-sky)}.group.toast .group-\[\.toast\]\:bg-transparent{background-color:transparent}.group.toaster .group-\[\.toaster\]\:bg-card{background-color:var(--card)}.group.toast .group-\[\.toast\]\:text-\[var\(--bg-sunken\)\]{color:var(--bg-sunken)}.group.toast .group-\[\.toast\]\:text-\[var\(--fg-muted\)\]{color:var(--fg-muted)}.group.toaster .group-\[\.toaster\]\:text-card-foreground{color:var(--card-foreground)}.group.toaster .group-\[\.toaster\]\:shadow-lg{--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.peer:disabled~.peer-disabled\:cursor-not-allowed{cursor:not-allowed}.peer:disabled~.peer-disabled\:opacity-70{opacity:.7}.data-\[disabled\]\:pointer-events-none[data-disabled]{pointer-events:none}.data-\[state\=checked\]\:translate-x-4[data-state=checked]{--tw-translate-x: 1rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[state\=unchecked\]\:translate-x-0\.5[data-state=unchecked]{--tw-translate-x: .125rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[state\=active\]\:bg-\[var\(--bg-sunken\)\][data-state=active]{background-color:var(--bg-sunken)}.data-\[state\=checked\]\:bg-\[var\(--vow-green\)\][data-state=checked]{background-color:var(--vow-green)}.data-\[state\=selected\]\:bg-\[var\(--bg-sunken\)\][data-state=selected]{background-color:var(--bg-sunken)}.data-\[state\=unchecked\]\:bg-border[data-state=unchecked]{background-color:var(--border)}.data-\[state\=active\]\:text-foreground[data-state=active]{color:var(--foreground)}.data-\[disabled\]\:opacity-50[data-disabled]{opacity:.5}.data-\[state\=closed\]\:duration-300[data-state=closed]{transition-duration:.3s}.data-\[state\=open\]\:duration-500[data-state=open]{transition-duration:.5s}.data-\[state\=delayed-open\]\:animate-in[data-state=delayed-open],.data-\[state\=open\]\:animate-in[data-state=open]{animation-name:enter;animation-duration:.15s;--tw-enter-opacity: initial;--tw-enter-scale: initial;--tw-enter-rotate: initial;--tw-enter-translate-x: initial;--tw-enter-translate-y: initial}.data-\[state\=closed\]\:animate-out[data-state=closed]{animation-name:exit;animation-duration:.15s;--tw-exit-opacity: initial;--tw-exit-scale: initial;--tw-exit-rotate: initial;--tw-exit-translate-x: initial;--tw-exit-translate-y: initial}.data-\[state\=closed\]\:fade-out-0[data-state=closed]{--tw-exit-opacity: 0}.data-\[state\=delayed-open\]\:fade-in-0[data-state=delayed-open],.data-\[state\=open\]\:fade-in-0[data-state=open]{--tw-enter-opacity: 0}.data-\[state\=closed\]\:zoom-out-95[data-state=closed]{--tw-exit-scale: .95}.data-\[state\=delayed-open\]\:zoom-in-95[data-state=delayed-open],.data-\[state\=open\]\:zoom-in-95[data-state=open]{--tw-enter-scale: .95}.data-\[side\=bottom\]\:slide-in-from-top-2[data-side=bottom]{--tw-enter-translate-y: -.5rem}.data-\[side\=left\]\:slide-in-from-right-2[data-side=left]{--tw-enter-translate-x: .5rem}.data-\[side\=right\]\:slide-in-from-left-2[data-side=right]{--tw-enter-translate-x: -.5rem}.data-\[side\=top\]\:slide-in-from-bottom-2[data-side=top]{--tw-enter-translate-y: .5rem}.data-\[state\=closed\]\:slide-out-to-bottom[data-state=closed]{--tw-exit-translate-y: 100%}.data-\[state\=closed\]\:slide-out-to-left[data-state=closed]{--tw-exit-translate-x: -100%}.data-\[state\=closed\]\:slide-out-to-left-1\/2[data-state=closed]{--tw-exit-translate-x: -50%}.data-\[state\=closed\]\:slide-out-to-right[data-state=closed]{--tw-exit-translate-x: 100%}.data-\[state\=closed\]\:slide-out-to-top[data-state=closed]{--tw-exit-translate-y: -100%}.data-\[state\=closed\]\:slide-out-to-top-\[48\%\][data-state=closed]{--tw-exit-translate-y: -48%}.data-\[state\=open\]\:slide-in-from-bottom[data-state=open]{--tw-enter-translate-y: 100%}.data-\[state\=open\]\:slide-in-from-left[data-state=open]{--tw-enter-translate-x: -100%}.data-\[state\=open\]\:slide-in-from-left-1\/2[data-state=open]{--tw-enter-translate-x: -50%}.data-\[state\=open\]\:slide-in-from-right[data-state=open]{--tw-enter-translate-x: 100%}.data-\[state\=open\]\:slide-in-from-top[data-state=open]{--tw-enter-translate-y: -100%}.data-\[state\=open\]\:slide-in-from-top-\[48\%\][data-state=open]{--tw-enter-translate-y: -48%}.data-\[state\=closed\]\:duration-300[data-state=closed]{animation-duration:.3s}.data-\[state\=open\]\:duration-500[data-state=open]{animation-duration:.5s}@media (min-width: 640px){.sm\:mt-0{margin-top:0}.sm\:hidden{display:none}.sm\:max-w-sm{max-width:24rem}.sm\:max-w-xl{max-width:36rem}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-\[160px_minmax\(0\,1fr\)\]{grid-template-columns:160px minmax(0,1fr)}.sm\:flex-row{flex-direction:row}.sm\:justify-end{justify-content:flex-end}.sm\:gap-4{gap:1rem}.sm\:rounded-lg{border-radius:var(--radius-3)}}@media (min-width: 768px){.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-\[120px_1fr\]{grid-template-columns:120px 1fr}}@media (min-width: 1024px){.lg\:col-span-5{grid-column:span 5 / span 5}.lg\:col-span-7{grid-column:span 7 / span 7}}.\[\&\>div\]\:bg-\[var\(--accent-gold\)\]>div{background-color:var(--accent-gold)}.\[\&\>svg\+div\]\:translate-y-\[-3px\]>svg+div{--tw-translate-y: -3px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.\[\&\>svg\]\:absolute>svg{position:absolute}.\[\&\>svg\]\:left-4>svg{left:1rem}.\[\&\>svg\]\:top-3>svg{top:.75rem}.\[\&\>tr\]\:last\:border-b-0:last-child>tr{border-bottom-width:0px}.\[\&_p\]\:leading-relaxed p{line-height:1.625}.\[\&_svg\]\:pointer-events-none svg{pointer-events:none}.\[\&_svg\]\:size-4 svg{width:1rem;height:1rem}.\[\&_svg\]\:shrink-0 svg{flex-shrink:0}.\[\&_tr\:last-child\]\:border-0 tr:last-child{border-width:0px}.\[\&_tr\]\:border-b tr{border-bottom-width:1px}.\[\&_tr\]\:border-border tr{border-color:var(--border)}
@@ -10,8 +10,8 @@
10
10
  href="https://fonts.googleapis.com/css2?family=Instrument+Serif:ital@0;1&family=JetBrains+Mono:wght@400;500;600&display=swap"
11
11
  rel="stylesheet"
12
12
  />
13
- <script type="module" crossorigin src="/assets/index-BUlE8F3Y.js"></script>
14
- <link rel="stylesheet" crossorigin href="/assets/index-blqc7eqq.css">
13
+ <script type="module" crossorigin src="/assets/index-Bwn1qan1.js"></script>
14
+ <link rel="stylesheet" crossorigin href="/assets/index-CzKxvMcU.css">
15
15
  </head>
16
16
  <body>
17
17
  <div id="root"></div>
@@ -1,4 +1,4 @@
1
- import { DiscoveryUnavailableError } from './types.js';
1
+ import { DiscoveryUnavailableError, TASK_POST_WINDOW_BLOCKS, bucketTaskPostCounts } from './types.js';
2
2
  import { manifestDigestForCid } from '../adapters/mech/digest.js';
3
3
  // ── GraphQL query strings ─────────────────────────────────────────────────────
4
4
  /**
@@ -68,6 +68,8 @@ const ATTEMPTS_PAGE_LIMIT = 1000;
68
68
  * the resulting count is a lower bound; see `getSolverNetOperatorCount`.
69
69
  */
70
70
  const MAX_OPERATOR_COUNT_TASK_PAGES = 50;
71
+ /** Page cap for the task-post-rate scan (1000 rows/page → 50k recent tasks). */
72
+ const MAX_TASK_POST_PAGES = 50;
71
73
  const ATTEMPTS_FOR_TASKS_QUERY = `
72
74
  query AttemptsForTasks($taskIds: [String!]!, $chainId: Int!, $limit: Int!, $after: String) {
73
75
  attempts(
@@ -181,6 +183,104 @@ query OperatorCountAttempts($taskIds: [String!]!, $chainId: Int!, $limit: Int!,
181
183
  }
182
184
  }
183
185
  `;
186
+ /**
187
+ * Paginated read of verdictEnvelopeMeta rows for swe-rebench-v2 successes,
188
+ * scoped to a single SolverNet via `solverNetManifestCid` so multi-SolverNet
189
+ * operators with overlapping instance_id pools don't cross-tenant over-count
190
+ * (#669 Finding 2).
191
+ *
192
+ * Ponder's auto-GraphQL does not expose GROUP BY / count aggregations, so
193
+ * getInstanceSuccessCounts pages this query with the `after` cursor and
194
+ * groups client-side. Capped at 1000 per page (Ponder's upper bound on
195
+ * plural-query `limit`).
196
+ */
197
+ const INSTANCE_SUCCESS_COUNTS_QUERY = `
198
+ query InstanceSuccessCounts($solverNetManifestCid: String!, $limit: Int!, $after: String) {
199
+ verdictEnvelopeMetas(
200
+ where: {
201
+ solverNetManifestCid: $solverNetManifestCid,
202
+ solverType_starts_with: "swe-rebench-v2",
203
+ actualPassed: true,
204
+ enrichmentStatus: "ok",
205
+ instanceId_not: ""
206
+ },
207
+ limit: $limit,
208
+ after: $after,
209
+ orderBy: "enrichedAtBlock",
210
+ orderDirection: "asc"
211
+ ) {
212
+ items {
213
+ requestId
214
+ chainId
215
+ instanceId
216
+ }
217
+ pageInfo {
218
+ hasNextPage
219
+ endCursor
220
+ }
221
+ }
222
+ }
223
+ `;
224
+ /**
225
+ * Leg 1 of getInstanceClaimCounts (#802): page every task id + maxClaims for a
226
+ * SolverNet's manifestDigest. Leg 2 reuses ATTEMPTS_FOR_TASKS_QUERY to count
227
+ * attempts (= consumed slots) per task. Same two-leg shape as
228
+ * getSolverNetOperatorCount; the only delta is selecting maxClaims here.
229
+ */
230
+ const CLAIM_COUNT_TASKS_QUERY = `
231
+ query ClaimCountTasks($manifestDigest: String!, $limit: Int!, $after: String) {
232
+ tasks(
233
+ where: { manifestDigest: $manifestDigest },
234
+ limit: $limit,
235
+ after: $after,
236
+ orderBy: "id",
237
+ orderDirection: "asc"
238
+ ) {
239
+ items {
240
+ id
241
+ maxClaims
242
+ chainId
243
+ }
244
+ pageInfo {
245
+ hasNextPage
246
+ endCursor
247
+ }
248
+ }
249
+ }
250
+ `;
251
+ /**
252
+ * Task-post-rate query (#918). Pages the most-recent tasks ordered by
253
+ * createdAtBlock desc; the daemon reads the top row's block as the window head
254
+ * and buckets the three windows (1h / 6h / 24h) AND the per-cid totals
255
+ * client-side from createdAtBlock + manifestDigest.
256
+ *
257
+ * We do NOT push a `manifestDigest_in` / `createdAtBlock_gte` filter into the
258
+ * query: `manifestDigest_in` is not a stable Ponder filter operator across all
259
+ * deploys, and the chain-wide total needs every recent task anyway. A
260
+ * client-side scan-then-bucket over the most-recent N pages is the portable
261
+ * shape. `windowEndBlock` for the HTTP backing is the indexer's latest indexed
262
+ * task block (the top row), not the chain head.
263
+ */
264
+ const TASK_POST_COUNTS_QUERY = `
265
+ query TaskPostCounts($limit: Int!, $after: String) {
266
+ tasks(
267
+ limit: $limit,
268
+ after: $after,
269
+ orderBy: "createdAtBlock",
270
+ orderDirection: "desc"
271
+ ) {
272
+ items {
273
+ id
274
+ manifestDigest
275
+ createdAtBlock
276
+ }
277
+ pageInfo {
278
+ hasNextPage
279
+ endCursor
280
+ }
281
+ }
282
+ }
283
+ `;
184
284
  const QUERY_ENVELOPES_QUERY = `
185
285
  query QueryEnvelopes($where: envelopeFilter, $limit: Int!) {
186
286
  envelopes(
@@ -199,6 +299,61 @@ query QueryEnvelopes($where: envelopeFilter, $limit: Int!) {
199
299
  }
200
300
  }
201
301
  `;
302
+ // ── Per-codeDigest reward aggregates (#764) ──────────────────────────────────
303
+ const CODEDIGEST_ATTEMPTS_QUERY = `
304
+ query CodeDigestAttempts($codeDigests: [String!]!, $limit: Int!, $after: String) {
305
+ attemptEnvelopeMetas(
306
+ where: { codeDigest_in: $codeDigests, mode: "train", enrichmentStatus: "ok" },
307
+ limit: $limit,
308
+ after: $after,
309
+ orderBy: "enrichedAtBlock",
310
+ orderDirection: "desc"
311
+ ) {
312
+ items { requestId chainId codeDigest }
313
+ pageInfo { hasNextPage endCursor }
314
+ }
315
+ }
316
+ `;
317
+ // The verdict leg is the only place per-SolverNet scoping is queryable: of the
318
+ // tables this method touches, only `verdictEnvelopeMeta` carries
319
+ // `solverNetManifestCid` (ponder.schema.ts:657 — written by the same IPFS
320
+ // task-body enrichment that resolves instanceId). `attemptEnvelopeMeta` has no
321
+ // SolverNet column. Aggregation (step 4) only counts requests that HAVE a
322
+ // verdict, so filtering the verdict leg correctly scopes the whole aggregate to
323
+ // the given SolverNet. The filter is emitted only when scoping is requested —
324
+ // Ponder treats a `null` `where` value as "IS NULL", not "skip the filter", so
325
+ // an unscoped call must omit the field entirely (#764).
326
+ function codeDigestVerdictsQuery(scopeBySolverNet) {
327
+ return `
328
+ query CodeDigestVerdicts($requestIds: [String!]!, $limit: Int!, $after: String${scopeBySolverNet ? ', $solverNetManifestCid: String!' : ''}) {
329
+ verdictEnvelopeMetas(
330
+ where: { requestId_in: $requestIds${scopeBySolverNet ? ', solverNetManifestCid: $solverNetManifestCid' : ''} },
331
+ limit: $limit,
332
+ after: $after,
333
+ orderBy: "requestId",
334
+ orderDirection: "asc"
335
+ ) {
336
+ items { requestId chainId actualPassed actualScore }
337
+ pageInfo { hasNextPage endCursor }
338
+ }
339
+ }
340
+ `;
341
+ }
342
+ // Optional operator scoping: restrict attempts to those the operator claimed.
343
+ const CODEDIGEST_OPERATOR_ATTEMPTS_QUERY = `
344
+ query CodeDigestOperatorAttempts($requestIds: [String!]!, $operator: String!, $limit: Int!, $after: String) {
345
+ attempts(
346
+ where: { requestId_in: $requestIds, operator: $operator },
347
+ limit: $limit,
348
+ after: $after,
349
+ orderBy: "createdAtBlock",
350
+ orderDirection: "asc"
351
+ ) {
352
+ items { requestId chainId }
353
+ pageInfo { hasNextPage endCursor }
354
+ }
355
+ }
356
+ `;
202
357
  // ── Plug-in publication queries (attd) ───────────────────────────────────────
203
358
  const LIST_PLUGIN_PUBLICATIONS_QUERY = `
204
359
  query ListPluginPublications($where: pluginPublicationFilter, $limit: Int!) {
@@ -448,7 +603,10 @@ export function createHttpDiscoveryAPI(opts) {
448
603
  // by id ASC and pages are appended in page order), but sort defensively
449
604
  // so the round-robin always pulls the lowest unclaimed id from each CID
450
605
  // even if upstream ordering ever changes.
451
- bucket.sort((a, b) => Number(BigInt(a.taskId) - BigInt(b.taskId)));
606
+ bucket.sort((a, b) => {
607
+ const diff = BigInt(a.taskId) - BigInt(b.taskId);
608
+ return diff < 0n ? -1 : diff > 0n ? 1 : 0;
609
+ });
452
610
  buckets.push(bucket);
453
611
  }
454
612
  // Round-robin interleave across CID buckets: pull index 0 from each CID
@@ -672,6 +830,253 @@ export function createHttpDiscoveryAPI(opts) {
672
830
  });
673
831
  return plugins;
674
832
  }
833
+ // ── getInstanceSuccessCounts (#669) ────────────────────────────────────────
834
+ // Scoped to a single SolverNet via `verdictEnvelopeMeta.solverNetManifestCid`
835
+ // — the indexer enrichment writes this column from the task body's top-level
836
+ // `solverNetManifestCid` (task.v1 schema). Prevents multi-SolverNet operators
837
+ // with overlapping instance_id pools from cross-tenant over-counting
838
+ // (#669 Finding 2).
839
+ async function getInstanceSuccessCounts(args) {
840
+ await ensureReady();
841
+ // Defensive cap: 10 × 1000 rows. Expected ~125 successes per SolverNet
842
+ // (25 candidates × N_target_successes), so two orders of magnitude head.
843
+ const MAX_PAGES = 10;
844
+ const PAGE_LIMIT = 1000;
845
+ const counts = new Map();
846
+ const seen = new Set(); // (requestId|chainId) dedupe across pages
847
+ let cursor = null;
848
+ for (let page = 0; page < MAX_PAGES; page++) {
849
+ const data = await postGql(gqlUrl, fetchImpl, INSTANCE_SUCCESS_COUNTS_QUERY, { solverNetManifestCid: args.manifestCid, limit: PAGE_LIMIT, after: cursor });
850
+ const rows = data.verdictEnvelopeMetas?.items ?? [];
851
+ for (const row of rows) {
852
+ const key = `${row.requestId}|${row.chainId}`;
853
+ if (seen.has(key))
854
+ continue;
855
+ seen.add(key);
856
+ const id = row.instanceId;
857
+ if (!id)
858
+ continue;
859
+ counts.set(id, (counts.get(id) ?? 0) + 1);
860
+ }
861
+ const pageInfo = data.verdictEnvelopeMetas?.pageInfo;
862
+ if (!pageInfo?.hasNextPage || !pageInfo.endCursor)
863
+ break;
864
+ cursor = pageInfo.endCursor;
865
+ }
866
+ return counts;
867
+ }
868
+ async function getCodeDigestRewards(args) {
869
+ if (args.codeDigests.length === 0)
870
+ return [];
871
+ await ensureReady();
872
+ const MAX_PAGES = 20;
873
+ const PAGE_LIMIT = 1000;
874
+ // Per-digest recency cap (#764 C1). CODEDIGEST_ATTEMPTS_QUERY orders by
875
+ // enrichedAtBlock desc, so attempt rows arrive newest-first. Ponder's
876
+ // GraphQL `limit` is global across all requested codeDigests, so the window
877
+ // MUST be enforced client-side per-digest — we keep only the first `window`
878
+ // rows seen for each codeDigest (i.e. the most recent). When undefined, no
879
+ // cap is applied (behaviour identical to before this change).
880
+ const windowCap = typeof args.window === 'number' && Number.isFinite(args.window) && args.window > 0
881
+ ? Math.floor(args.window)
882
+ : undefined;
883
+ // 1) Pull train-mode attempt-meta rows for the requested codeDigests,
884
+ // capped to the most-recent `window` per codeDigest when set.
885
+ const requestKeyToDigest = new Map(); // "requestId|chainId" -> codeDigest
886
+ const keptPerDigest = new Map(); // codeDigest -> rows kept
887
+ let cursor = null;
888
+ for (let page = 0; page < MAX_PAGES; page++) {
889
+ const data = await postGql(gqlUrl, fetchImpl, CODEDIGEST_ATTEMPTS_QUERY, { codeDigests: args.codeDigests, limit: PAGE_LIMIT, after: cursor });
890
+ for (const row of data.attemptEnvelopeMetas?.items ?? []) {
891
+ if (windowCap !== undefined) {
892
+ const kept = keptPerDigest.get(row.codeDigest) ?? 0;
893
+ if (kept >= windowCap)
894
+ continue; // already have the window's worth for this digest
895
+ keptPerDigest.set(row.codeDigest, kept + 1);
896
+ }
897
+ requestKeyToDigest.set(`${row.requestId}|${row.chainId}`, row.codeDigest);
898
+ }
899
+ const pi = data.attemptEnvelopeMetas?.pageInfo;
900
+ if (!pi?.hasNextPage || !pi.endCursor)
901
+ break;
902
+ // Short-circuit pagination once every requested digest has filled its
903
+ // window — no need to keep paging history we'll discard.
904
+ if (windowCap !== undefined &&
905
+ args.codeDigests.every((d) => (keptPerDigest.get(d) ?? 0) >= windowCap))
906
+ break;
907
+ cursor = pi.endCursor;
908
+ }
909
+ if (requestKeyToDigest.size === 0)
910
+ return [];
911
+ const requestIds = [...new Set([...requestKeyToDigest.keys()].map((k) => k.split('|')[0]))];
912
+ // 2) Optional operator scoping: keep only requests the operator claimed.
913
+ let allowedKeys = null;
914
+ if (args.operator) {
915
+ allowedKeys = new Set();
916
+ cursor = null;
917
+ for (let page = 0; page < MAX_PAGES; page++) {
918
+ const data = await postGql(gqlUrl, fetchImpl, CODEDIGEST_OPERATOR_ATTEMPTS_QUERY, { requestIds, operator: args.operator, limit: PAGE_LIMIT, after: cursor });
919
+ for (const row of data.attempts?.items ?? [])
920
+ allowedKeys.add(`${row.requestId}|${row.chainId}`);
921
+ const pi = data.attempts?.pageInfo;
922
+ if (!pi?.hasNextPage || !pi.endCursor)
923
+ break;
924
+ cursor = pi.endCursor;
925
+ }
926
+ }
927
+ // 3) Pull verdict-meta rows for those requestIds (actualPassed/actualScore).
928
+ // Optionally scope to a single SolverNet: verdictEnvelopeMeta is the only
929
+ // queryable table carrying solverNetManifestCid, and only requests with a
930
+ // verdict are aggregated (step 4), so filtering here scopes the aggregate.
931
+ const scopeBySolverNet = typeof args.solverNetManifestCid === 'string' && args.solverNetManifestCid.length > 0;
932
+ const verdictsQuery = codeDigestVerdictsQuery(scopeBySolverNet);
933
+ const verdictByKey = new Map();
934
+ cursor = null;
935
+ for (let page = 0; page < MAX_PAGES; page++) {
936
+ const variables = { requestIds, limit: PAGE_LIMIT, after: cursor };
937
+ if (scopeBySolverNet)
938
+ variables.solverNetManifestCid = args.solverNetManifestCid;
939
+ const data = await postGql(gqlUrl, fetchImpl, verdictsQuery, variables);
940
+ for (const row of data.verdictEnvelopeMetas?.items ?? []) {
941
+ const key = `${row.requestId}|${row.chainId}`;
942
+ const scoreNum = Number(row.actualScore);
943
+ verdictByKey.set(key, {
944
+ passed: Boolean(row.actualPassed),
945
+ score: Number.isFinite(scoreNum) && row.actualScore !== '' ? scoreNum : null,
946
+ });
947
+ }
948
+ const pi = data.verdictEnvelopeMetas?.pageInfo;
949
+ if (!pi?.hasNextPage || !pi.endCursor)
950
+ break;
951
+ cursor = pi.endCursor;
952
+ }
953
+ // 4) Aggregate per codeDigest (only requests that HAVE a verdict count).
954
+ const agg = new Map();
955
+ for (const [key, digest] of requestKeyToDigest) {
956
+ if (allowedKeys && !allowedKeys.has(key))
957
+ continue;
958
+ const v = verdictByKey.get(key);
959
+ if (!v)
960
+ continue; // no verdict yet — not a completed attempt
961
+ const cur = agg.get(digest) ?? { attempts: 0, passes: 0, scoreSum: 0, scoreN: 0 };
962
+ cur.attempts += 1;
963
+ if (v.passed)
964
+ cur.passes += 1;
965
+ if (v.score !== null) {
966
+ cur.scoreSum += v.score;
967
+ cur.scoreN += 1;
968
+ }
969
+ agg.set(digest, cur);
970
+ }
971
+ const rows = [];
972
+ for (const [codeDigest, a] of agg) {
973
+ rows.push({
974
+ codeDigest,
975
+ attempts: a.attempts,
976
+ passes: a.passes,
977
+ passRate: a.attempts > 0 ? a.passes / a.attempts : 0,
978
+ avgScore: a.scoreN > 0 ? a.scoreSum / a.scoreN : 0,
979
+ });
980
+ }
981
+ return rows;
982
+ }
983
+ // ── getInstanceClaimCounts (#802) ──────────────────────────────────────────
984
+ // Per-task consumed-vs-maxClaims for a SolverNet. Two legs, mirroring
985
+ // getSolverNetOperatorCount: leg 1 pages tasks (+ maxClaims) for the
986
+ // manifestDigest; leg 2 pages attempts (consumed slots) batched by taskId_in.
987
+ async function getInstanceClaimCounts(args) {
988
+ await ensureReady();
989
+ const manifestDigest = manifestDigestForCid(args.manifestCid).toLowerCase();
990
+ // Leg 1: task ids + maxClaims for this SolverNet (single-chain → shared chainId).
991
+ const maxClaimsByTaskId = new Map();
992
+ const taskIds = [];
993
+ let chainId;
994
+ let taskCursor = null;
995
+ for (let page = 0; page < MAX_OPERATOR_COUNT_TASK_PAGES; page++) {
996
+ const data = await postGql(gqlUrl, fetchImpl, CLAIM_COUNT_TASKS_QUERY, { manifestDigest, limit: ATTEMPTS_PAGE_LIMIT, after: taskCursor });
997
+ for (const row of data.tasks?.items ?? []) {
998
+ taskIds.push(row.id);
999
+ maxClaimsByTaskId.set(row.id, row.maxClaims);
1000
+ if (chainId === undefined)
1001
+ chainId = row.chainId;
1002
+ }
1003
+ const pageInfo = data.tasks?.pageInfo;
1004
+ if (!pageInfo?.hasNextPage || !pageInfo.endCursor)
1005
+ break;
1006
+ taskCursor = pageInfo.endCursor;
1007
+ }
1008
+ if (taskIds.length === 0 || chainId === undefined) {
1009
+ return new Map();
1010
+ }
1011
+ // Leg 2: count attempts per taskId (= consumed slots), batched by taskId_in.
1012
+ const consumedByTaskId = new Map();
1013
+ let attemptCursor = null;
1014
+ for (;;) {
1015
+ const data = await postGql(gqlUrl, fetchImpl, ATTEMPTS_FOR_TASKS_QUERY, { taskIds, chainId, limit: ATTEMPTS_PAGE_LIMIT, after: attemptCursor });
1016
+ for (const a of data.attempts?.items ?? []) {
1017
+ consumedByTaskId.set(a.taskId, (consumedByTaskId.get(a.taskId) ?? 0) + 1);
1018
+ }
1019
+ const pageInfo = data.attempts?.pageInfo;
1020
+ if (!pageInfo?.hasNextPage || !pageInfo.endCursor)
1021
+ break;
1022
+ attemptCursor = pageInfo.endCursor;
1023
+ }
1024
+ const out = new Map();
1025
+ for (const taskId of taskIds) {
1026
+ out.set(taskId, {
1027
+ taskId,
1028
+ consumed: consumedByTaskId.get(taskId) ?? 0,
1029
+ maxClaims: maxClaimsByTaskId.get(taskId) ?? 0,
1030
+ });
1031
+ }
1032
+ return out;
1033
+ }
1034
+ // ── getTaskPostCounts (#918) ───────────────────────────────────────────────
1035
+ // Page the most-recent tasks (createdAtBlock desc); the top row's block is the
1036
+ // window head. Bucket the three windows AND the per-cid totals client-side.
1037
+ // windowEndBlock here is the indexer's latest indexed task block, not the
1038
+ // chain head (the indexer is the source of truth on the HTTP path).
1039
+ async function getTaskPostCounts(args) {
1040
+ await ensureReady();
1041
+ const windowEndTs = Math.floor(Date.now() / 1000);
1042
+ const cids = Array.from(new Set((args?.manifestCids ?? []).filter(Boolean)));
1043
+ const cidByDigest = new Map();
1044
+ for (const cid of cids) {
1045
+ cidByDigest.set(manifestDigestForCid(cid).toLowerCase(), cid);
1046
+ }
1047
+ // Page createdAtBlock desc. The first row sets the window head; we stop
1048
+ // paging once a page's oldest row falls before the 24h cut (everything
1049
+ // beyond is outside every window).
1050
+ const rows = [];
1051
+ let head;
1052
+ let cursor = null;
1053
+ for (let page = 0; page < MAX_TASK_POST_PAGES; page++) {
1054
+ const data = await postGql(gqlUrl, fetchImpl, TASK_POST_COUNTS_QUERY, { limit: 1000, after: cursor });
1055
+ const items = data.tasks?.items ?? [];
1056
+ for (const row of items) {
1057
+ const block = Number(row.createdAtBlock);
1058
+ if (!Number.isFinite(block))
1059
+ continue;
1060
+ if (head === undefined)
1061
+ head = block;
1062
+ rows.push({ digest: (row.manifestDigest ?? '').toLowerCase(), block });
1063
+ }
1064
+ const pageInfo = data.tasks?.pageInfo;
1065
+ // Once the oldest row this page is past the 24h cut, no further page can
1066
+ // contribute (desc order) — stop early.
1067
+ if (head !== undefined && items.length > 0) {
1068
+ const oldest = Number(items[items.length - 1].createdAtBlock);
1069
+ if (Number.isFinite(oldest) && oldest < head - TASK_POST_WINDOW_BLOCKS.h24)
1070
+ break;
1071
+ }
1072
+ if (!pageInfo?.hasNextPage || !pageInfo.endCursor)
1073
+ break;
1074
+ cursor = pageInfo.endCursor;
1075
+ }
1076
+ const windowEndBlock = head ?? 0;
1077
+ const { chain, byCid } = bucketTaskPostCounts(windowEndBlock, windowEndTs, rows, cidByDigest);
1078
+ return { windowEndBlock, windowEndTs, chain, byCid };
1079
+ }
675
1080
  return {
676
1081
  findClaimableTasks,
677
1082
  listLaunchedSolverNets,
@@ -681,6 +1086,10 @@ export function createHttpDiscoveryAPI(opts) {
681
1086
  listPluginPublications,
682
1087
  getPluginScores,
683
1088
  listBuilderArtifacts,
1089
+ getInstanceSuccessCounts,
1090
+ getCodeDigestRewards,
1091
+ getInstanceClaimCounts,
1092
+ getTaskPostCounts,
684
1093
  };
685
1094
  }
686
1095
  //# sourceMappingURL=http.js.map