@jinn-network/client 0.1.8 → 0.1.9-canary.050a41b1

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 (263) hide show
  1. package/dist/adapters/mech/adapter.d.ts +21 -1
  2. package/dist/adapters/mech/adapter.js +77 -10
  3. package/dist/adapters/mech/adapter.js.map +1 -1
  4. package/dist/adapters/mech/contracts.js +62 -28
  5. package/dist/adapters/mech/contracts.js.map +1 -1
  6. package/dist/adapters/mech/safe-revert.d.ts +4 -0
  7. package/dist/adapters/mech/safe-revert.js +5 -1
  8. package/dist/adapters/mech/safe-revert.js.map +1 -1
  9. package/dist/adapters/mech/safe.js +5 -1
  10. package/dist/adapters/mech/safe.js.map +1 -1
  11. package/dist/adapters/mech/verdict-code.js +1 -1
  12. package/dist/adapters/mech/verdict-code.js.map +1 -1
  13. package/dist/api/bootstrap-endpoint.d.ts +1 -0
  14. package/dist/api/bootstrap-endpoint.js +1 -0
  15. package/dist/api/bootstrap-endpoint.js.map +1 -1
  16. package/dist/api/discovery-endpoint.d.ts +1 -0
  17. package/dist/api/discovery-endpoint.js +24 -0
  18. package/dist/api/discovery-endpoint.js.map +1 -1
  19. package/dist/api/fleet-build.d.ts +1 -7
  20. package/dist/api/fleet-build.js +0 -7
  21. package/dist/api/fleet-build.js.map +1 -1
  22. package/dist/api/gather-status.d.ts +8 -2
  23. package/dist/api/gather-status.js +29 -117
  24. package/dist/api/gather-status.js.map +1 -1
  25. package/dist/api/loop-completion-build.d.ts +79 -0
  26. package/dist/api/loop-completion-build.js +155 -0
  27. package/dist/api/loop-completion-build.js.map +1 -0
  28. package/dist/api/peers.js +2 -0
  29. package/dist/api/peers.js.map +1 -1
  30. package/dist/api/setup-endpoints.d.ts +32 -0
  31. package/dist/api/setup-endpoints.js +93 -23
  32. package/dist/api/setup-endpoints.js.map +1 -1
  33. package/dist/api/solvernets-endpoints.js +3 -0
  34. package/dist/api/solvernets-endpoints.js.map +1 -1
  35. package/dist/api/status-build.d.ts +43 -33
  36. package/dist/api/status-build.js +3 -26
  37. package/dist/api/status-build.js.map +1 -1
  38. package/dist/api/status-rollup-build.d.ts +0 -4
  39. package/dist/api/status-rollup-build.js +0 -4
  40. package/dist/api/status-rollup-build.js.map +1 -1
  41. package/dist/build-info.json +4 -4
  42. package/dist/build-meta.json +1 -1
  43. package/dist/cli/commands/codedigest-revert-check.js +6 -2
  44. package/dist/cli/commands/codedigest-revert-check.js.map +1 -1
  45. package/dist/cli/commands/doctor.d.ts +3 -0
  46. package/dist/cli/commands/doctor.js +37 -2
  47. package/dist/cli/commands/doctor.js.map +1 -1
  48. package/dist/cli/commands/eval.d.ts +76 -0
  49. package/dist/cli/commands/eval.js +401 -0
  50. package/dist/cli/commands/eval.js.map +1 -0
  51. package/dist/cli/commands/rewards.d.ts +2 -0
  52. package/dist/cli/commands/rewards.js +30 -3
  53. package/dist/cli/commands/rewards.js.map +1 -1
  54. package/dist/cli/commands/solver-nets.js +68 -0
  55. package/dist/cli/commands/solver-nets.js.map +1 -1
  56. package/dist/cli/commands/status.js +0 -1
  57. package/dist/cli/commands/status.js.map +1 -1
  58. package/dist/cli/index.js +2 -0
  59. package/dist/cli/index.js.map +1 -1
  60. package/dist/config.d.ts +58 -7
  61. package/dist/config.js +96 -7
  62. package/dist/config.js.map +1 -1
  63. package/dist/daemon/ai-units-gate.d.ts +6 -6
  64. package/dist/daemon/ai-units-gate.js +11 -10
  65. package/dist/daemon/ai-units-gate.js.map +1 -1
  66. package/dist/daemon/balance-topup-loop.js +3 -0
  67. package/dist/daemon/balance-topup-loop.js.map +1 -1
  68. package/dist/daemon/creator.js +2 -0
  69. package/dist/daemon/creator.js.map +1 -1
  70. package/dist/daemon/daemon.d.ts +15 -0
  71. package/dist/daemon/daemon.js +78 -22
  72. package/dist/daemon/daemon.js.map +1 -1
  73. package/dist/daemon/eviction-loop.d.ts +7 -0
  74. package/dist/daemon/eviction-loop.js +16 -0
  75. package/dist/daemon/eviction-loop.js.map +1 -1
  76. package/dist/daemon/jinn-claim-loop.js +3 -0
  77. package/dist/daemon/jinn-claim-loop.js.map +1 -1
  78. package/dist/daemon/join-applier.d.ts +35 -0
  79. package/dist/daemon/join-applier.js +49 -0
  80. package/dist/daemon/join-applier.js.map +1 -0
  81. package/dist/daemon/loop-heartbeat.d.ts +34 -0
  82. package/dist/daemon/loop-heartbeat.js +39 -0
  83. package/dist/daemon/loop-heartbeat.js.map +1 -0
  84. package/dist/daemon/reward-claim-loop.js +3 -0
  85. package/dist/daemon/reward-claim-loop.js.map +1 -1
  86. package/dist/daemon/watchdog-loop.d.ts +84 -0
  87. package/dist/daemon/watchdog-loop.js +91 -0
  88. package/dist/daemon/watchdog-loop.js.map +1 -0
  89. package/dist/dashboard/assets/index-8tAiMbUV.css +1 -0
  90. package/dist/dashboard/assets/index-CSFVwGFh.js +167 -0
  91. package/dist/dashboard/index.html +2 -2
  92. package/dist/discovery/http.d.ts +7 -0
  93. package/dist/discovery/http.js +241 -25
  94. package/dist/discovery/http.js.map +1 -1
  95. package/dist/discovery/onchain.js +155 -1
  96. package/dist/discovery/onchain.js.map +1 -1
  97. package/dist/discovery/types.d.ts +106 -0
  98. package/dist/discovery/types.js +40 -0
  99. package/dist/discovery/types.js.map +1 -1
  100. package/dist/discovery/with-fallback.js +14 -0
  101. package/dist/discovery/with-fallback.js.map +1 -1
  102. package/dist/earning/bootstrap.d.ts +23 -0
  103. package/dist/earning/bootstrap.js +76 -27
  104. package/dist/earning/bootstrap.js.map +1 -1
  105. package/dist/earning/faucet.d.ts +1 -1
  106. package/dist/earning/faucet.js +2 -2
  107. package/dist/earning/faucet.js.map +1 -1
  108. package/dist/earning/safe-adapter.js +11 -0
  109. package/dist/earning/safe-adapter.js.map +1 -1
  110. package/dist/eval/eval-harness-run.d.ts +63 -0
  111. package/dist/eval/eval-harness-run.js +123 -0
  112. package/dist/eval/eval-harness-run.js.map +1 -0
  113. package/dist/eval/orchestrator.d.ts +163 -0
  114. package/dist/eval/orchestrator.js +232 -0
  115. package/dist/eval/orchestrator.js.map +1 -0
  116. package/dist/eval/paired.d.ts +68 -0
  117. package/dist/eval/paired.js +93 -0
  118. package/dist/eval/paired.js.map +1 -0
  119. package/dist/eval/resolve-slate-tasks.d.ts +35 -0
  120. package/dist/eval/resolve-slate-tasks.js +56 -0
  121. package/dist/eval/resolve-slate-tasks.js.map +1 -0
  122. package/dist/eval/screen-discovery.d.ts +22 -0
  123. package/dist/eval/screen-discovery.js +71 -0
  124. package/dist/eval/screen-discovery.js.map +1 -0
  125. package/dist/eval/screen-progress.d.ts +41 -0
  126. package/dist/eval/screen-progress.js +60 -0
  127. package/dist/eval/screen-progress.js.map +1 -0
  128. package/dist/eval/screen-runner.d.ts +30 -0
  129. package/dist/eval/screen-runner.js +289 -0
  130. package/dist/eval/screen-runner.js.map +1 -0
  131. package/dist/eval/screen.d.ts +107 -0
  132. package/dist/eval/screen.js +159 -0
  133. package/dist/eval/screen.js.map +1 -0
  134. package/dist/eval/slope.d.ts +29 -0
  135. package/dist/eval/slope.js +46 -0
  136. package/dist/eval/slope.js.map +1 -0
  137. package/dist/eval/train-sequence.d.ts +35 -0
  138. package/dist/eval/train-sequence.js +59 -0
  139. package/dist/eval/train-sequence.js.map +1 -0
  140. package/dist/eval/wilson.d.ts +45 -0
  141. package/dist/eval/wilson.js +48 -0
  142. package/dist/eval/wilson.js.map +1 -0
  143. package/dist/harnesses/engine/canonical-json.js +5 -3
  144. package/dist/harnesses/engine/canonical-json.js.map +1 -1
  145. package/dist/harnesses/engine/engine.d.ts +24 -0
  146. package/dist/harnesses/engine/engine.js +72 -9
  147. package/dist/harnesses/engine/engine.js.map +1 -1
  148. package/dist/harnesses/engine/persistence.d.ts +17 -0
  149. package/dist/harnesses/engine/persistence.js +28 -0
  150. package/dist/harnesses/engine/persistence.js.map +1 -1
  151. package/dist/harnesses/impls/hermes-agent/adapter.d.ts +2 -0
  152. package/dist/harnesses/impls/hermes-agent/adapter.js +8 -5
  153. package/dist/harnesses/impls/hermes-agent/adapter.js.map +1 -1
  154. package/dist/harnesses/impls/hermes-agent/bootstrap.d.ts +1 -0
  155. package/dist/harnesses/impls/hermes-agent/bootstrap.js +6 -1
  156. package/dist/harnesses/impls/hermes-agent/bootstrap.js.map +1 -1
  157. package/dist/harnesses/impls/hermes-agent/harness.d.ts +17 -3
  158. package/dist/harnesses/impls/hermes-agent/harness.js +68 -5
  159. package/dist/harnesses/impls/hermes-agent/harness.js.map +1 -1
  160. package/dist/harnesses/impls/index.d.ts +2 -0
  161. package/dist/harnesses/impls/index.js +2 -0
  162. package/dist/harnesses/impls/index.js.map +1 -1
  163. package/dist/harnesses/impls/learner/adapters/claude-code.js +5 -0
  164. package/dist/harnesses/impls/learner/adapters/claude-code.js.map +1 -1
  165. package/dist/harnesses/impls/learner/harness.d.ts +17 -1
  166. package/dist/harnesses/impls/learner/harness.js +51 -1
  167. package/dist/harnesses/impls/learner/harness.js.map +1 -1
  168. package/dist/harnesses/impls/learner/harvest.d.ts +2 -0
  169. package/dist/harnesses/impls/learner/harvest.js +7 -1
  170. package/dist/harnesses/impls/learner/harvest.js.map +1 -1
  171. package/dist/harnesses/impls/learner/plugin-path.js +1 -0
  172. package/dist/harnesses/impls/learner/plugin-path.js.map +1 -1
  173. package/dist/harnesses/impls/swe-rebench-v2-evaluator/harness.js +3 -1
  174. package/dist/harnesses/impls/swe-rebench-v2-evaluator/harness.js.map +1 -1
  175. package/dist/harnesses/impls/swe-rebench-v2-evaluator/index.d.ts +2 -2
  176. package/dist/harnesses/impls/swe-rebench-v2-evaluator/index.js +3 -1
  177. package/dist/harnesses/impls/swe-rebench-v2-evaluator/index.js.map +1 -1
  178. package/dist/harnesses/readiness-registry.d.ts +10 -0
  179. package/dist/harnesses/readiness-registry.js +13 -0
  180. package/dist/harnesses/readiness-registry.js.map +1 -1
  181. package/dist/harnesses/types.d.ts +14 -0
  182. package/dist/learner/revert-decision.d.ts +16 -1
  183. package/dist/learner/revert-decision.js +38 -18
  184. package/dist/learner/revert-decision.js.map +1 -1
  185. package/dist/learner/revert-stats.d.ts +14 -0
  186. package/dist/learner/revert-stats.js +42 -0
  187. package/dist/learner/revert-stats.js.map +1 -1
  188. package/dist/local-provider-url.d.ts +3 -0
  189. package/dist/local-provider-url.js +28 -0
  190. package/dist/local-provider-url.js.map +1 -0
  191. package/dist/main.js +94 -25
  192. package/dist/main.js.map +1 -1
  193. package/dist/plugins/learner/.claude-plugin/plugin.json +1 -1
  194. package/dist/plugins/learner/.codex-plugin/plugin.json +1 -1
  195. package/dist/plugins/learner/hooks/session-start +30 -1
  196. package/dist/plugins/learner/skills/learn/consolidator-prompt.md +4 -0
  197. package/dist/preflight/deployment-readiness.d.ts +147 -0
  198. package/dist/preflight/deployment-readiness.js +366 -0
  199. package/dist/preflight/deployment-readiness.js.map +1 -0
  200. package/dist/preflight/pidfile-liveness.d.ts +7 -1
  201. package/dist/preflight/pidfile-liveness.js +14 -0
  202. package/dist/preflight/pidfile-liveness.js.map +1 -1
  203. package/dist/rpc/transport.d.ts +36 -0
  204. package/dist/rpc/transport.js +123 -24
  205. package/dist/rpc/transport.js.map +1 -1
  206. package/dist/scripts/swe-rebench-v2-seed-pool.json +2 -1
  207. package/dist/solver-nets/registry.d.ts +19 -0
  208. package/dist/solver-nets/registry.js +92 -66
  209. package/dist/solver-nets/registry.js.map +1 -1
  210. package/dist/solver-types/_swe-rebench-v2-held-out-slate.d.ts +76 -0
  211. package/dist/solver-types/_swe-rebench-v2-held-out-slate.js +156 -0
  212. package/dist/solver-types/_swe-rebench-v2-held-out-slate.js.map +1 -0
  213. package/dist/solver-types/_swe-rebench-v2-pool-recovery.d.ts +81 -0
  214. package/dist/solver-types/_swe-rebench-v2-pool-recovery.js +116 -0
  215. package/dist/solver-types/_swe-rebench-v2-pool-recovery.js.map +1 -0
  216. package/dist/solver-types/_swe-rebench-v2-state.d.ts +9 -0
  217. package/dist/solver-types/_swe-rebench-v2-state.js +14 -0
  218. package/dist/solver-types/_swe-rebench-v2-state.js.map +1 -1
  219. package/dist/solver-types/_swe-rebench-v2-validated-pool.d.ts +30 -0
  220. package/dist/solver-types/_swe-rebench-v2-validated-pool.js +40 -0
  221. package/dist/solver-types/_swe-rebench-v2-validated-pool.js.map +1 -1
  222. package/dist/solver-types/slates/held-out-slate.swe-rebench-v2.v1.json +20 -0
  223. package/dist/solver-types/slates/held-out-slate.swe-rebench-v2.v2.json +19 -0
  224. package/dist/solver-types/slates/held-out-slate.swe-rebench-v2.v2.screening-report.json +628 -0
  225. package/dist/solver-types/solver-type.d.ts +8 -0
  226. package/dist/solver-types/swe-rebench-v2.d.ts +2 -0
  227. package/dist/solver-types/swe-rebench-v2.js +115 -10
  228. package/dist/solver-types/swe-rebench-v2.js.map +1 -1
  229. package/dist/solvernets/launched-record-dispatcher.d.ts +3 -0
  230. package/dist/solvernets/launched-record-dispatcher.js.map +1 -1
  231. package/dist/solvernets/registry-client-erc8004.js +29 -37
  232. package/dist/solvernets/registry-client-erc8004.js.map +1 -1
  233. package/dist/solvernets/registry-client.d.ts +6 -0
  234. package/dist/solvernets/store.js +7 -2
  235. package/dist/solvernets/store.js.map +1 -1
  236. package/dist/spend/ai-units-config.d.ts +10 -0
  237. package/dist/spend/ai-units-config.js +7 -1
  238. package/dist/spend/ai-units-config.js.map +1 -1
  239. package/dist/spend/ai-units.d.ts +51 -0
  240. package/dist/spend/ai-units.js +73 -0
  241. package/dist/spend/ai-units.js.map +1 -1
  242. package/dist/spend/record.js +12 -5
  243. package/dist/spend/record.js.map +1 -1
  244. package/dist/store/store.d.ts +91 -5
  245. package/dist/store/store.js +170 -7
  246. package/dist/store/store.js.map +1 -1
  247. package/dist/vendor/@jinn-network/sdk/dist/payloads/swe-rebench-v2.d.ts +108 -1
  248. package/dist/vendor/@jinn-network/sdk/dist/payloads/swe-rebench-v2.js +25 -1
  249. package/dist/vendor/@jinn-network/sdk/dist/solvernets/swe-rebench-v2-held-out-slate.d.ts +65 -0
  250. package/dist/vendor/@jinn-network/sdk/dist/solvernets/swe-rebench-v2-held-out-slate.js +123 -0
  251. package/dist/vendor/@jinn-network/sdk/dist/solvernets/swe-rebench-v2.d.ts +2 -2
  252. package/dist/vendor/@jinn-network/sdk/dist/solvernets/swe-rebench-v2.js +1 -1
  253. package/dist/vendor/@jinn-network/sdk/package.json +4 -0
  254. package/docker-compose.yml +3 -2
  255. package/package.json +22 -18
  256. package/plugins/learner/.claude-plugin/plugin.json +1 -1
  257. package/plugins/learner/.codex-plugin/plugin.json +1 -1
  258. package/plugins/learner/hooks/session-start +30 -1
  259. package/plugins/learner/skills/learn/consolidator-prompt.md +4 -0
  260. package/plugins/swe-rebench-v2-runtime/hooks/hooks.json +16 -0
  261. package/plugins/swe-rebench-v2-runtime/hooks/session-start +74 -0
  262. package/dist/dashboard/assets/index-CzKxvMcU.css +0 -32
  263. package/dist/dashboard/assets/index-yVemxHot.js +0 -351
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jinn-network/client",
3
- "version": "0.1.8",
3
+ "version": "0.1.9-canary.050a41b1",
4
4
  "description": "Jinn protocol client — headless daemon for the restoration training loop",
5
5
  "type": "module",
6
6
  "packageManager": "yarn@4.13.0",
@@ -41,14 +41,17 @@
41
41
  "scripts": {
42
42
  "postinstall": "node dist/scripts/fix-node-pty.mjs 2>/dev/null || node scripts/fix-node-pty.mjs 2>/dev/null || true",
43
43
  "e2e:cold-start-builder": "vitest run --config vitest.acceptance.config.ts",
44
- "e2e:full-cycle": "tsx test/e2e/learner-full-cycle.ts",
45
- "e2e:full-cycle-swe-rebench-v2": "tsx test/e2e/learner-full-cycle-swe-rebench-v2.ts",
44
+ "e2e:full-cycle": "yarn build:sdk && tsx test/e2e/learner-full-cycle.ts",
45
+ "e2e:full-cycle-swe-rebench-v2": "yarn build:sdk && tsx test/e2e/learner-full-cycle-swe-rebench-v2.ts",
46
+ "e2e:train-arm-slope": "tsx test/e2e/train-arm-slope-swe-rebench-v2.ts",
47
+ "e2e:train-arm-efficacy": "tsx test/e2e/train-arm-efficacy-swe-rebench-v2.ts",
46
48
  "jinn": "tsx src/bin/jinn.ts",
47
49
  "dev": "yarn build && node dist/bin/jinn.js",
48
50
  "build:sdk": "yarn --cwd ../packages/sdk install --immutable && yarn --cwd ../packages/sdk build",
49
- "build": "yarn build:sdk && yarn build:spa && tsc && chmod +x dist/bin/jinn.js && rm -rf dist/dashboard && mkdir -p dist/dashboard && cp -R src/dashboard/spa/dist/. dist/dashboard/ && rm -rf dist/templates && cp -R templates dist/templates && rm -rf dist/plugins/learner && mkdir -p dist/plugins && cp -R plugins/learner dist/plugins/learner && mkdir -p dist/scripts && cp scripts/fix-node-pty.mjs scripts/swe-rebench-v2-seed-pool.json scripts/swe-rebench-v2-known-bad.json scripts/swe-rebench-v2-pytest-missing.json dist/scripts/ && node scripts/vendor-sdk.mjs && node scripts/write-dist-build-meta.mjs",
51
+ "build": "yarn build:sdk && yarn build:spa && tsc && chmod +x dist/bin/jinn.js && rm -rf dist/dashboard && mkdir -p dist/dashboard && cp -R src/dashboard/spa/dist/. dist/dashboard/ && rm -rf dist/templates && cp -R templates dist/templates && rm -rf dist/plugins/learner && mkdir -p dist/plugins && cp -R plugins/learner dist/plugins/learner && mkdir -p dist/scripts && cp scripts/fix-node-pty.mjs scripts/swe-rebench-v2-seed-pool.json scripts/swe-rebench-v2-known-bad.json scripts/swe-rebench-v2-pytest-missing.json dist/scripts/ && mkdir -p dist/solver-types/slates && cp src/solver-types/slates/*.json dist/solver-types/slates/ && node scripts/vendor-sdk.mjs && node scripts/write-dist-build-meta.mjs",
50
52
  "typecheck": "yarn build:sdk && tsc --noEmit",
51
53
  "test": "yarn build:sdk && vitest run",
54
+ "test:hermetic": "yarn build:sdk && vitest run --config vitest.hermetic.config.ts",
52
55
  "lint:no-late-mount": "node scripts/check-no-late-route-mount.mjs",
53
56
  "test:watch": "vitest",
54
57
  "test:claude-prediction": "yarn build && JINN_TEST_CLAUDE_PREDICTION=1 vitest run test/harnesses/impls/claude-mcp-prediction/isolation.test.ts",
@@ -62,12 +65,11 @@
62
65
  "release:tier-1": "tsx scripts/release/run-tier-1.ts",
63
66
  "release:tier-1:T1.1": "vitest run --config vitest.release-tier-1.config.ts test/release/tier-1/T1.1-bootstrap-fresh-anvil.test.ts",
64
67
  "release:tier-1:T1.2": "vitest run --config vitest.release-tier-1.config.ts test/release/tier-1/T1.2-harness-readiness-contract.test.ts",
65
- "release:tier-1:T1.3": "vitest run test/release/tier-1/T1.3-indexer-round-trip.test.ts",
68
+ "release:tier-1:T1.3": "vitest run --config vitest.release-tier-1.config.ts test/release/tier-1/T1.3-indexer-round-trip.test.ts",
66
69
  "release:tier-1:T1.4": "playwright test --config=playwright.config.ts test/dashboard/release-prep/spa-route-smoke.e2e.test.ts",
67
70
  "release:tier-2": "tsx scripts/release/run-tier-2.ts",
68
71
  "release:tier-2:T2.1": "vitest run test/release/tier-2/T2.1-cross-op-donation.test.ts",
69
72
  "release:tier-2:T2.2": "vitest run test/release/tier-2/T2.2-producer-evaluator.test.ts",
70
- "release:tier-2:T2.3": "playwright test --config=playwright.config.ts test/dashboard/multi-op/launcher-join-flow.e2e.test.ts",
71
73
  "release:tier-3": "tsx scripts/release/run-tier-3.ts",
72
74
  "release:tier-3:T3.1": "JINN_T31_REAL=1 vitest run test/release/tier-3/T3.1-producer-evaluator-real.test.ts",
73
75
  "release:donation-consumption": "node dist/scripts/donation-consumption-acceptance.js",
@@ -103,6 +105,8 @@
103
105
  "dev:spa": "yarn workspace @jinn-network/operator-spa dev",
104
106
  "e2e:spa": "yarn build && playwright test --config=playwright.config.ts test/dashboard/spa.e2e.test.ts",
105
107
  "e2e:solvernet-flow": "yarn build && playwright test --config=playwright.config.ts test/dashboard/solvernet-flow.e2e.test.ts",
108
+ "e2e:join": "yarn build && playwright test --config=playwright.config.ts test/dashboard/join.e2e.test.ts",
109
+ "e2e:app-flow": "yarn build && playwright test --config=playwright.config.ts test/dashboard/solvernet-flow.e2e.test.ts test/dashboard/join.e2e.test.ts",
106
110
  "e2e:funding-sequence": "yarn build && playwright test --config=playwright.config.ts test/dashboard/funding-sequence.e2e.test.ts",
107
111
  "e2e:dashboard": "yarn build && playwright test --config=playwright.config.ts",
108
112
  "e2e:donation": "vitest run test/smoke/donation-mode-smoke.test.ts test/smoke/donation-ipfs-http-smoke.test.ts"
@@ -123,24 +127,24 @@
123
127
  "@opentelemetry/api": "^1.9.1",
124
128
  "@opentelemetry/core": "^2.7.1",
125
129
  "@opentelemetry/exporter-trace-otlp-grpc": "^0.218.0",
126
- "@opentelemetry/exporter-trace-otlp-http": "^0.217.0",
130
+ "@opentelemetry/exporter-trace-otlp-http": "^0.218.0",
127
131
  "@opentelemetry/resources": "^2.7.1",
128
132
  "@opentelemetry/sdk-node": "^0.217.0",
129
133
  "@opentelemetry/sdk-trace-base": "^2.7.1",
130
- "@safe-global/protocol-kit": "^6.1.2",
134
+ "@safe-global/protocol-kit": "^7.2.0",
131
135
  "@safe-global/types-kit": "^3.0.0",
132
- "@scure/bip32": "^1.7.0",
136
+ "@scure/bip32": "^2.2.0",
133
137
  "@scure/bip39": "^1.4.0",
134
138
  "@slicekit/erc8128": "^0.3.3",
135
- "@x402/core": "^2.9.0",
136
- "@x402/evm": "^2.9.0",
137
- "@x402/fetch": "^2.9.0",
138
- "@x402/hono": "^2.9.0",
139
+ "@x402/core": "^2.14.0",
140
+ "@x402/evm": "^2.14.0",
141
+ "@x402/fetch": "^2.14.0",
142
+ "@x402/hono": "^2.14.0",
139
143
  "ajv": "^8.20.0",
140
144
  "ajv-formats": "^3.0.1",
141
- "better-sqlite3": "^11.0.0",
145
+ "better-sqlite3": "^12.10.0",
142
146
  "bs58": "^6.0.0",
143
- "canonicalize": "^2.0.0",
147
+ "canonicalize": "^3.0.0",
144
148
  "chokidar": "^5.0.0",
145
149
  "dotenv": "^17.4.1",
146
150
  "hono": "^4.12.10",
@@ -160,11 +164,11 @@
160
164
  "@jinn-network/sdk": "portal:../packages/sdk",
161
165
  "@playwright/test": "^1.59.1",
162
166
  "@types/better-sqlite3": "^7.6.0",
163
- "@types/node": "^20.0.0",
167
+ "@types/node": "^25.9.1",
164
168
  "@types/semver": "^7.7.1",
165
169
  "@types/ws": "^8.18.1",
166
170
  "tsx": "^4.0.0",
167
- "typescript": "^5.5.0",
168
- "vitest": "^2.0.0"
171
+ "typescript": "^6.0.3",
172
+ "vitest": "^4.1.8"
169
173
  }
170
174
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "claude-code-learner",
3
3
  "description": "Generic learning agent plugin — runs a goal through a seven-phase pipeline (Orient → Strategize → Plan → Execute → Debrief → Improve → Memory consolidation) and self-improves between runs by mutating its own state directory.",
4
- "version": "0.1.0",
4
+ "version": "0.2.0",
5
5
  "author": {
6
6
  "name": "Jinn Network",
7
7
  "url": "https://github.com/Jinn-Network/mono"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claude-code-learner",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "description": "Generic learning agent plugin - runs a goal through a seven-phase pipeline and self-improves between runs by mutating its own state directory.",
5
5
  "author": {
6
6
  "name": "Jinn Network",
@@ -35,4 +35,33 @@ fi
35
35
  git config user.name "claude-code-learner"
36
36
  git config user.email "claude-code-learner@local"
37
37
 
38
- echo "session-start: implStateDir ready at $(pwd) (HEAD=$(git rev-parse HEAD))"
38
+ # Operational readiness goes to STDERR. Claude Code parses a SessionStart hook's
39
+ # STDOUT as JSON for `hookSpecificOutput`; any stray stdout would break that parse,
40
+ # so stdout below carries nothing but the additionalContext payload.
41
+ echo "session-start: implStateDir ready at $(pwd) (HEAD=$(git rev-parse HEAD))" >&2
42
+
43
+ # Steer skill-selection toward this plugin's OWN learn loop. This is the agnostic,
44
+ # plugin-owned mechanism: the learner plugin asserts its own behaviour from its own
45
+ # SessionStart hook, without any other plugin or the harness prompt knowing it exists.
46
+ #
47
+ # It is delivered via the documented `hookSpecificOutput.additionalContext` contract,
48
+ # which is injected into the model's context at session start. The previous plain
49
+ # `echo` was logged as a hook event (visible to the harness via --include-hook-events)
50
+ # but NEVER entered the model context — which is why, despite the learn skill being
51
+ # projected and available, the model kept selecting a direct-solve skill and the loop
52
+ # ran 0% of the time. (Verified: additionalContext reaches the model in headless
53
+ # `-p` / stream-json mode on claude 2.1.x.)
54
+ #
55
+ # MODE-AWARE (extends the original train-only steer for the held-out exam): in
56
+ # `frozen` mode the harness freeze-fences implStateDir, so running the learn loop's
57
+ # Improve/Memory phases would WRITE implStateDir and trip the fence → the eval
58
+ # aborts with a violation. The frozen steer therefore tells the model to CONSULT
59
+ # the accumulated knowledge (read-only) and solve directly — which is exactly how
60
+ # prior learning should raise the frozen score — and to NOT run the loop or modify
61
+ # implStateDir. `JINN_HARNESS_MODE` is set by the harness adapter (default train).
62
+ if [[ "${JINN_HARNESS_MODE:-train}" == "frozen" ]]; then
63
+ STEER="This is a FROZEN evaluation run. Before solving, CONSULT the accumulated learner knowledge under implStateDir (notes/, skills/, strategies/, patterns/, tests/) and apply any relevant strategy or pattern to this task. Then solve the task and call submit_typed_payload. Do NOT run the learn loop (no Orient/Improve/Memory phases) and do NOT create, edit, or commit anything under implStateDir — the harness verifies implStateDir is unchanged and will discard this run if it is modified."
64
+ else
65
+ STEER="A seven-phase self-improvement loop is available as the learn skill (claude-code-learner:learn): Orient, Strategize, Plan, Execute, Debrief, Improve, then Memory consolidation. For this session your FIRST action MUST be to invoke the learn skill (via the Skill tool) and run the full loop end-to-end, instead of solving the task directly or selecting another skill first. The Execute phase still performs the actual task work and still calls submit_typed_payload; the surrounding phases capture reusable strategy and persist it to implStateDir so future runs improve. Do not skip the loop."
66
+ fi
67
+ printf '{"hookSpecificOutput":{"hookEventName":"SessionStart","additionalContext":"%s"}}\n' "$STEER"
@@ -18,6 +18,10 @@ Anything that writes to `implStateDir` happens here, including:
18
18
  - **Unused skills / hooks / tools** — anything not invoked in the last N runs (default 20; check policy override). Move to `implStateDir/.archive/<ts>/` or delete per policy.
19
19
  - **Regressed promotions** — revert an Improve commit only when it actually made things worse. There are two triggers; act on either:
20
20
  1. **Qualitative trigger** — if the trend in `analysisPath` (the Debrief signal) indicates a recent change made things worse, `git revert <commit-sha>` it. Be specific: revert the exact commit identified, not a bulk rollback. The target sha is `improvePromotionsDir/<n>.json`'s `implStateDirShaAfter`.
21
+ > The graded score (Tier 2) lowers the variance of the keep/revert decision only.
22
+ > It never overrules the binary verdict, and it MUST NOT be used to size on-chain
23
+ > reward — that path is gated on the withheld-test challenge (#1019, design §5.5).
24
+
21
25
  2. **Quantitative trigger (#764)** — for each candidate Improve commit on recent `implStateDir` git history (the commits since `implStateDirShaBefore`, identified from each `improvePromotionsDir/<n>.json` `implStateDirShaAfter`), ask the network-truth indexer whether the commit's per-codeDigest pass rate is significantly worse than its parent's. **Do not hand-roll the codeDigest hash or the statistics — shell out to the CLI**, which exports each commit's tree (`git archive`, no `.git`) and hashes it the way production stamps codeDigest, then runs the documented test:
22
26
 
23
27
  ```bash
@@ -0,0 +1,16 @@
1
+ {
2
+ "hooks": {
3
+ "SessionStart": [
4
+ {
5
+ "matcher": "startup|clear|compact",
6
+ "hooks": [
7
+ {
8
+ "type": "command",
9
+ "command": "bash \"${CLAUDE_PLUGIN_ROOT}/hooks/session-start\"",
10
+ "async": false
11
+ }
12
+ ]
13
+ }
14
+ ]
15
+ }
16
+ }
@@ -0,0 +1,74 @@
1
+ #!/usr/bin/env bash
2
+ # swe-rebench-v2-runtime session-start hook.
3
+ #
4
+ # Deterministically materialises the task repository at `$WORKING_DIR/repo` at
5
+ # `base_commit` BEFORE the solver agent runs, so the agent never has to set it
6
+ # up itself. A direct-solving model (no steer hook, or one that skips the
7
+ # task SKILL) otherwise improvises `git clone … ; git checkout <SHA>` — which
8
+ # fails when `base_commit` is off the default branch, gets permission-gated as a
9
+ # compound command, or conflicts with the provisioned working dir — producing an
10
+ # unscorable run. This hook does what the task SKILL documents, deterministically.
11
+ #
12
+ # Inputs (env, set by the harness adapter):
13
+ # WORKING_DIR / JINN_WORKING_DIR — the episode working dir (holds task.json)
14
+ # Reads `spec.repo` + `spec.base_commit` from `$WORKING_DIR/task.json`
15
+ # (written by the harness's provisionWorkingDir).
16
+ #
17
+ # Contract: idempotent (provisions only when `$WORKING_DIR/repo/.git` is absent —
18
+ # never clobbers an existing checkout or agent edits); best-effort (logs to
19
+ # STDERR and exits 0 even on failure, so the agent can fall back to the task
20
+ # SKILL); emits NOTHING on STDOUT (Claude Code parses a SessionStart hook's
21
+ # stdout as hookSpecificOutput JSON — stray output would break that parse).
22
+ set -uo pipefail
23
+
24
+ WD="${WORKING_DIR:-${JINN_WORKING_DIR:-$PWD}}"
25
+ TASK_JSON="$WD/task.json"
26
+ log() { echo "swe-rebench-v2-runtime session-start: $*" >&2; }
27
+
28
+ [[ -f "$TASK_JSON" ]] || { log "no task.json at $WD — skip (not a harness episode)"; exit 0; }
29
+
30
+ # Extract spec.repo + spec.base_commit. shlex.quote keeps the eval injection-safe.
31
+ REPO=""
32
+ BASE=""
33
+ eval "$(python3 - "$TASK_JSON" <<'PY' 2>/dev/null || true
34
+ import json, sys, shlex
35
+ try:
36
+ spec = (json.load(open(sys.argv[1])) or {}).get("spec") or {}
37
+ except Exception:
38
+ sys.exit(0)
39
+ print("REPO=" + shlex.quote(spec.get("repo") or ""))
40
+ print("BASE=" + shlex.quote(spec.get("base_commit") or ""))
41
+ PY
42
+ )"
43
+
44
+ [[ -n "$REPO" && -n "$BASE" ]] || { log "task.json has no spec.repo/base_commit — skip (not a swe-rebench-v2 task)"; exit 0; }
45
+
46
+ REPO_DIR="$WD/repo"
47
+ if [[ -d "$REPO_DIR/.git" ]]; then
48
+ log "repo already present at $REPO_DIR — skip (idempotent)"
49
+ exit 0
50
+ fi
51
+
52
+ log "materialising $REPO @ $BASE into $REPO_DIR"
53
+ rm -rf "$REPO_DIR"
54
+ mkdir -p "$REPO_DIR"
55
+ # Fetch the exact SHA (base_commit is frequently off the default branch, so a
56
+ # plain clone+checkout fails). git serves any commit by id via fetch.
57
+ if ! (
58
+ cd "$REPO_DIR" &&
59
+ git init --quiet --initial-branch=main &&
60
+ git remote add origin "https://github.com/${REPO}.git" &&
61
+ git fetch --depth 1 --quiet origin "$BASE" &&
62
+ git checkout --quiet FETCH_HEAD
63
+ ); then
64
+ log "WARNING: provisioning failed for $REPO @ $BASE — agent will fall back to the task SKILL"
65
+ exit 0
66
+ fi
67
+
68
+ HEAD_SHA="$(git -C "$REPO_DIR" rev-parse HEAD 2>/dev/null || echo unknown)"
69
+ if [[ "$HEAD_SHA" == "$BASE" ]]; then
70
+ log "repo ready at $BASE"
71
+ else
72
+ log "WARNING: HEAD=$HEAD_SHA != base_commit=$BASE"
73
+ fi
74
+ exit 0
@@ -1,32 +0,0 @@
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)}