@jinn-network/client 0.1.7-canary.d4e4e183 → 0.1.7-canary.eb5ac0de

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 (132) hide show
  1. package/README.md +67 -1
  2. package/dist/adapters/mech/adapter.js +27 -3
  3. package/dist/adapters/mech/adapter.js.map +1 -1
  4. package/dist/adapters/mech/safe.d.ts +1 -1
  5. package/dist/adapters/mech/safe.js +5 -3
  6. package/dist/adapters/mech/safe.js.map +1 -1
  7. package/dist/adapters/mech/types.d.ts +6 -1
  8. package/dist/adapters/mech/types.js.map +1 -1
  9. package/dist/api/activity-events-endpoint.d.ts +14 -0
  10. package/dist/api/activity-events-endpoint.js +59 -0
  11. package/dist/api/activity-events-endpoint.js.map +1 -0
  12. package/dist/api/bootstrap-endpoint.d.ts +1 -2
  13. package/dist/api/bootstrap-endpoint.js +0 -1
  14. package/dist/api/bootstrap-endpoint.js.map +1 -1
  15. package/dist/api/gather-status.d.ts +3 -0
  16. package/dist/api/gather-status.js +105 -26
  17. package/dist/api/gather-status.js.map +1 -1
  18. package/dist/api/launcher-status.d.ts +1 -1
  19. package/dist/api/launcher-status.js +11 -10
  20. package/dist/api/launcher-status.js.map +1 -1
  21. package/dist/api/launcher-tasks.d.ts +1 -1
  22. package/dist/api/launcher-tasks.js +12 -8
  23. package/dist/api/launcher-tasks.js.map +1 -1
  24. package/dist/api/server.js +4 -0
  25. package/dist/api/server.js.map +1 -1
  26. package/dist/api/setup-endpoints.js +11 -131
  27. package/dist/api/setup-endpoints.js.map +1 -1
  28. package/dist/api/status-build.d.ts +40 -0
  29. package/dist/api/status-build.js +25 -0
  30. package/dist/api/status-build.js.map +1 -1
  31. package/dist/build-info.json +4 -4
  32. package/dist/build-meta.json +1 -1
  33. package/dist/cli/commands/solver-nets.js +92 -21
  34. package/dist/cli/commands/solver-nets.js.map +1 -1
  35. package/dist/cli/commands/solver-plugins-block.d.ts +33 -0
  36. package/dist/cli/commands/solver-plugins-block.js +118 -0
  37. package/dist/cli/commands/solver-plugins-block.js.map +1 -0
  38. package/dist/cli/commands/solver-plugins-feedback.d.ts +72 -0
  39. package/dist/cli/commands/solver-plugins-feedback.js +262 -0
  40. package/dist/cli/commands/solver-plugins-feedback.js.map +1 -0
  41. package/dist/cli/commands/solver-plugins-read.d.ts +54 -0
  42. package/dist/cli/commands/solver-plugins-read.js +259 -0
  43. package/dist/cli/commands/solver-plugins-read.js.map +1 -0
  44. package/dist/cli/commands/solver-plugins.d.ts +35 -0
  45. package/dist/cli/commands/solver-plugins.js +399 -2
  46. package/dist/cli/commands/solver-plugins.js.map +1 -1
  47. package/dist/cli/commands/tasks.js +15 -2
  48. package/dist/cli/commands/tasks.js.map +1 -1
  49. package/dist/cli/task-native-readiness.d.ts +7 -0
  50. package/dist/cli/task-native-readiness.js +7 -5
  51. package/dist/cli/task-native-readiness.js.map +1 -1
  52. package/dist/config.d.ts +169 -232
  53. package/dist/config.js +219 -107
  54. package/dist/config.js.map +1 -1
  55. package/dist/daemon/daemon.d.ts +3 -0
  56. package/dist/daemon/daemon.js +88 -22
  57. package/dist/daemon/daemon.js.map +1 -1
  58. package/dist/daemon/gate-logger.d.ts +9 -0
  59. package/dist/daemon/gate-logger.js +2 -0
  60. package/dist/daemon/gate-logger.js.map +1 -0
  61. package/dist/daemon/readiness-gate.d.ts +1 -4
  62. package/dist/daemon/readiness-gate.js.map +1 -1
  63. package/dist/daemon/spend-cap-gate.d.ts +40 -0
  64. package/dist/daemon/spend-cap-gate.js +46 -0
  65. package/dist/daemon/spend-cap-gate.js.map +1 -0
  66. package/dist/dashboard/assets/index-CKTc0D37.css +32 -0
  67. package/dist/dashboard/assets/index-h2ATCtSA.js +345 -0
  68. package/dist/dashboard/index.html +2 -2
  69. package/dist/earning/safe-adapter.js +23 -11
  70. package/dist/earning/safe-adapter.js.map +1 -1
  71. package/dist/earning/types.d.ts +6 -6
  72. package/dist/earning/viem-clients.d.ts +11 -4
  73. package/dist/earning/viem-clients.js +14 -5
  74. package/dist/earning/viem-clients.js.map +1 -1
  75. package/dist/events/types.d.ts +2 -2
  76. package/dist/harnesses/engine/engine.js +13 -0
  77. package/dist/harnesses/engine/engine.js.map +1 -1
  78. package/dist/harnesses/impls/swe-rebench-v2-evaluator/hf-fetcher.d.ts +74 -5
  79. package/dist/harnesses/impls/swe-rebench-v2-evaluator/hf-fetcher.js +103 -32
  80. package/dist/harnesses/impls/swe-rebench-v2-evaluator/hf-fetcher.js.map +1 -1
  81. package/dist/main.js +44 -31
  82. package/dist/main.js.map +1 -1
  83. package/dist/observability/emit-event.d.ts +3 -2
  84. package/dist/observability/emit-event.js +22 -1
  85. package/dist/observability/emit-event.js.map +1 -1
  86. package/dist/preflight/rpc-network.d.ts +40 -0
  87. package/dist/preflight/rpc-network.js +67 -1
  88. package/dist/preflight/rpc-network.js.map +1 -1
  89. package/dist/rpc/transport.d.ts +109 -0
  90. package/dist/rpc/transport.js +220 -0
  91. package/dist/rpc/transport.js.map +1 -0
  92. package/dist/scripts/donation-consumption-acceptance.js +7 -28
  93. package/dist/scripts/donation-consumption-acceptance.js.map +1 -1
  94. package/dist/solver-nets/prediction-operator-ux.d.ts +1 -2
  95. package/dist/solver-nets/prediction-operator-ux.js +56 -53
  96. package/dist/solver-nets/prediction-operator-ux.js.map +1 -1
  97. package/dist/solver-nets/registry.d.ts +19 -1
  98. package/dist/solver-nets/registry.js +37 -24
  99. package/dist/solver-nets/registry.js.map +1 -1
  100. package/dist/solver-types/_swe-rebench-v2-pool.d.ts +9 -2
  101. package/dist/solver-types/_swe-rebench-v2-pool.js +15 -20
  102. package/dist/solver-types/_swe-rebench-v2-pool.js.map +1 -1
  103. package/dist/solver-types/_swe-rebench-v2-validated-pool.d.ts +29 -1
  104. package/dist/solver-types/_swe-rebench-v2-validated-pool.js +62 -13
  105. package/dist/solver-types/_swe-rebench-v2-validated-pool.js.map +1 -1
  106. package/dist/solver-types/swe-rebench-v2.js +4 -1
  107. package/dist/solver-types/swe-rebench-v2.js.map +1 -1
  108. package/dist/spend/credential.d.ts +8 -0
  109. package/dist/spend/credential.js +30 -0
  110. package/dist/spend/credential.js.map +1 -0
  111. package/dist/spend/daemon-config.d.ts +13 -0
  112. package/dist/spend/daemon-config.js +24 -0
  113. package/dist/spend/daemon-config.js.map +1 -0
  114. package/dist/spend/pricing.d.ts +16 -0
  115. package/dist/spend/pricing.js +26 -0
  116. package/dist/spend/pricing.js.map +1 -0
  117. package/dist/spend/record.d.ts +13 -0
  118. package/dist/spend/record.js +30 -0
  119. package/dist/spend/record.js.map +1 -0
  120. package/dist/spend/usage.d.ts +27 -0
  121. package/dist/spend/usage.js +113 -0
  122. package/dist/spend/usage.js.map +1 -0
  123. package/dist/store/store.d.ts +28 -0
  124. package/dist/store/store.js +118 -4
  125. package/dist/store/store.js.map +1 -1
  126. package/dist/trajectory/transcript-parsers/types.d.ts +8 -8
  127. package/dist/tx-retry.d.ts +15 -0
  128. package/dist/tx-retry.js +30 -6
  129. package/dist/tx-retry.js.map +1 -1
  130. package/package.json +2 -1
  131. package/dist/dashboard/assets/index-BUlE8F3Y.js +0 -330
  132. package/dist/dashboard/assets/index-blqc7eqq.css +0 -32
package/dist/config.d.ts CHANGED
@@ -15,45 +15,6 @@
15
15
  */
16
16
  import { z } from 'zod';
17
17
  import type { Task } from './types/task.js';
18
- export interface DefaultSolverNetConfig extends Record<string, unknown> {
19
- enabled?: boolean;
20
- solverType: string;
21
- /**
22
- * Operator-selected roles for this SolverNet. A non-empty subset of
23
- * `['solving', 'evaluating']`. Multiple roles can run concurrently — the
24
- * daemon enforces `disallowSolverSelfEvaluation` on-chain so the operator
25
- * never evaluates its own Solutions, and the on-chain
26
- * TaskActivityCheckerV3 keeps `solutionDeliveryWeight` and
27
- * `verdictDeliveryWeight` as independent additive counters.
28
- *
29
- * Launcher-side flagging is no longer expressed as an operator role —
30
- * launcher ownership is determined by the launched-record subsystem
31
- * (spec/2026-05-05-solvernet-creation-and-launch.md §11). Operator config
32
- * carries only the participation roles.
33
- *
34
- * Legacy `role: 'solving' | 'evaluating'` configs are auto-migrated to
35
- * `roles: [<role>]` by the loader (zod preprocessor on solverNets[*]).
36
- */
37
- roles?: Array<'solving' | 'evaluating'>;
38
- harness?: string;
39
- model?: string;
40
- plugins?: Array<string | {
41
- name?: string;
42
- source: string;
43
- version?: string;
44
- }>;
45
- taskGenerator?: {
46
- enabled?: boolean;
47
- };
48
- }
49
- /**
50
- * Default `solverNets` is empty per Decision 5 of
51
- * spec/2026-05-05-solvernet-creation-and-launch.md — pre-release, no
52
- * migration burden. Fresh installs no longer seed the `prediction` entry;
53
- * the operator joins SolverNets through the registry (Task 21's
54
- * `joinedSolverNets` block).
55
- */
56
- export declare const DEFAULT_SOLVER_NETS: Record<string, DefaultSolverNetConfig>;
57
18
  export declare const JinnConfigSchema: z.ZodEffects<z.ZodObject<{
58
19
  /**
59
20
  * Network to connect to.
@@ -64,19 +25,24 @@ export declare const JinnConfigSchema: z.ZodEffects<z.ZodObject<{
64
25
  */
65
26
  network: z.ZodDefault<z.ZodEnum<["mainnet", "testnet"]>>;
66
27
  /**
67
- * Base RPC endpoint.
68
- * Defaults to https://mainnet.base.org for 'mainnet' and
69
- * https://sepolia.base.org for 'testnet'. Set explicitly to override.
28
+ * Base RPC endpoint(s). Accepts either a single URL string or an array of
29
+ * URLs. When an array (or a comma-separated env var) is supplied, the
30
+ * daemon builds a viem `fallback()` chain in slot order (primary first).
31
+ * See `client/src/rpc/transport.ts` for the wrapper. Defaults to the
32
+ * publicnode+sepolia.base.org two-provider chain on testnet and the public
33
+ * `mainnet.base.org` on mainnet. Set explicitly to override.
34
+ *
35
+ * Env: JINN_RPC_URL / BASE_SEPOLIA_RPC_URL / BASE_RPC_URL (comma-separated).
70
36
  */
71
- rpcUrl: z.ZodOptional<z.ZodString>;
72
- archiveRpcUrl: z.ZodOptional<z.ZodString>;
37
+ rpcUrl: z.ZodOptional<z.ZodUnion<[z.ZodString, z.ZodArray<z.ZodString, "many">]>>;
38
+ archiveRpcUrl: z.ZodOptional<z.ZodUnion<[z.ZodString, z.ZodArray<z.ZodString, "many">]>>;
73
39
  /**
74
- * Optional L2 proof/archive RPC endpoint for canonical cross-chain canaries.
40
+ * Optional L2 proof/archive RPC endpoint(s) for canonical cross-chain canaries.
75
41
  * The daemon can use its normal rpcUrl for writes while proof construction
76
42
  * uses this endpoint for historical eth_getProof at OP dispute-game blocks.
77
- * Env: JINN_L2_PROOF_RPC_URL.
43
+ * Accepts string or array form (see rpcUrl). Env: JINN_L2_PROOF_RPC_URL.
78
44
  */
79
- l2ProofRpcUrl: z.ZodOptional<z.ZodString>;
45
+ l2ProofRpcUrl: z.ZodOptional<z.ZodUnion<[z.ZodString, z.ZodArray<z.ZodString, "many">]>>;
80
46
  /** Earning state directory */
81
47
  earningDir: z.ZodDefault<z.ZodString>;
82
48
  /** SQLite database path */
@@ -970,18 +936,19 @@ export declare const JinnConfigSchema: z.ZodEffects<z.ZodObject<{
970
936
  */
971
937
  jinnMviL2DeploymentPath: z.ZodOptional<z.ZodString>;
972
938
  /**
973
- * RPC endpoint for the L1 governance chain (Ethereum / Sepolia) where the
974
- * JinnDistributor lives. Testnet defaults to a public Sepolia RPC; mainnet
975
- * requires an operator override when L1 submit mode is configured.
976
- * Env: JINN_ETHEREUM_RPC_URL.
939
+ * RPC endpoint(s) for the L1 governance chain (Ethereum / Sepolia) where
940
+ * the JinnDistributor lives. Accepts string or array form (see rpcUrl) and
941
+ * supports comma-separated env values. Testnet defaults to a public Sepolia
942
+ * RPC; mainnet requires an operator override when L1 submit mode is
943
+ * configured. Env: JINN_ETHEREUM_RPC_URL.
977
944
  */
978
- ethereumRpcUrl: z.ZodOptional<z.ZodString>;
945
+ ethereumRpcUrl: z.ZodOptional<z.ZodUnion<[z.ZodString, z.ZodArray<z.ZodString, "many">]>>;
979
946
  /**
980
- * Optional archive RPC endpoint for the L1 governance chain. Used for
981
- * historical block lookups when constructing canonical-mode proofs.
982
- * Env: JINN_ETHEREUM_ARCHIVE_RPC_URL.
947
+ * Optional archive RPC endpoint(s) for the L1 governance chain. Used for
948
+ * historical block lookups when constructing canonical-mode proofs. Accepts
949
+ * string or array form. Env: JINN_ETHEREUM_ARCHIVE_RPC_URL.
983
950
  */
984
- ethereumArchiveRpcUrl: z.ZodOptional<z.ZodString>;
951
+ ethereumArchiveRpcUrl: z.ZodOptional<z.ZodUnion<[z.ZodString, z.ZodArray<z.ZodString, "many">]>>;
985
952
  /**
986
953
  * L1 network used by the cross-chain claim loop. 'sepolia' tracks Base
987
954
  * Sepolia testnet; 'ethereum' tracks Base mainnet. Defaults to 'sepolia'
@@ -1137,97 +1104,7 @@ export declare const JinnConfigSchema: z.ZodEffects<z.ZodObject<{
1137
1104
  mode?: "train" | "frozen" | undefined;
1138
1105
  }>>;
1139
1106
  /**
1140
- * SolverNet activation, Harness selection, and operator-configured runtime plugins.
1141
- *
1142
- * Each entry's `roles` is a non-empty subset of `['solving', 'evaluating']`.
1143
- * Multiple roles can run concurrently for the same SolverNet; the
1144
- * protocol-level `disallowSolverSelfEvaluation` flag prevents the operator
1145
- * from evaluating its own Solutions and the on-chain
1146
- * TaskActivityCheckerV3 tracks Solution and Verdict counters independently
1147
- * (additive into `eligibleActivityWeight`).
1148
- *
1149
- * Launcher ownership lives in the launched-record subsystem
1150
- * (spec/2026-05-05-solvernet-creation-and-launch.md §11), not in operator
1151
- * config — there is no `'launching'` operator role. Legacy entries that
1152
- * include `'launching'` in `roles` have it stripped by the preprocessor so
1153
- * older config files keep loading.
1154
- *
1155
- * Backwards-compat: a legacy `role: 'solving' | 'evaluating'` field is
1156
- * auto-promoted to `roles: [<role>]` by the zod preprocessor below so
1157
- * existing `~/.jinn-client/config.json` files keep loading without an
1158
- * operator migration step.
1159
- */
1160
- solverNets: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodEffects<z.ZodObject<{
1161
- enabled: z.ZodDefault<z.ZodBoolean>;
1162
- solverType: z.ZodString;
1163
- roles: z.ZodEffects<z.ZodDefault<z.ZodArray<z.ZodEnum<["solving", "evaluating"]>, "many">>, ("solving" | "evaluating")[], ("solving" | "evaluating")[] | undefined>;
1164
- harness: z.ZodDefault<z.ZodEffects<z.ZodString, string, string>>;
1165
- model: z.ZodOptional<z.ZodString>;
1166
- plugins: z.ZodDefault<z.ZodArray<z.ZodUnion<[z.ZodString, z.ZodObject<{
1167
- name: z.ZodOptional<z.ZodString>;
1168
- source: z.ZodString;
1169
- version: z.ZodOptional<z.ZodString>;
1170
- }, "strip", z.ZodTypeAny, {
1171
- source: string;
1172
- name?: string | undefined;
1173
- version?: string | undefined;
1174
- }, {
1175
- source: string;
1176
- name?: string | undefined;
1177
- version?: string | undefined;
1178
- }>]>, "many">>;
1179
- taskGenerator: z.ZodDefault<z.ZodObject<{
1180
- enabled: z.ZodDefault<z.ZodBoolean>;
1181
- }, "strip", z.ZodTypeAny, {
1182
- enabled: boolean;
1183
- }, {
1184
- enabled?: boolean | undefined;
1185
- }>>;
1186
- }, "strip", z.ZodTypeAny, {
1187
- solverType: string;
1188
- enabled: boolean;
1189
- roles: ("solving" | "evaluating")[];
1190
- harness: string;
1191
- plugins: (string | {
1192
- source: string;
1193
- name?: string | undefined;
1194
- version?: string | undefined;
1195
- })[];
1196
- taskGenerator: {
1197
- enabled: boolean;
1198
- };
1199
- model?: string | undefined;
1200
- }, {
1201
- solverType: string;
1202
- enabled?: boolean | undefined;
1203
- roles?: ("solving" | "evaluating")[] | undefined;
1204
- harness?: string | undefined;
1205
- model?: string | undefined;
1206
- plugins?: (string | {
1207
- source: string;
1208
- name?: string | undefined;
1209
- version?: string | undefined;
1210
- })[] | undefined;
1211
- taskGenerator?: {
1212
- enabled?: boolean | undefined;
1213
- } | undefined;
1214
- }>, {
1215
- solverType: string;
1216
- enabled: boolean;
1217
- roles: ("solving" | "evaluating")[];
1218
- harness: string;
1219
- plugins: (string | {
1220
- source: string;
1221
- name?: string | undefined;
1222
- version?: string | undefined;
1223
- })[];
1224
- taskGenerator: {
1225
- enabled: boolean;
1226
- };
1227
- model?: string | undefined;
1228
- }, unknown>>>;
1229
- /**
1230
- * Manifest-keyed joined SolverNets (Task 21).
1107
+ * Manifest-keyed joined SolverNets.
1231
1108
  *
1232
1109
  * Spec: spec/2026-05-05-solvernet-creation-and-launch.md §12.
1233
1110
  *
@@ -1236,10 +1113,10 @@ export declare const JinnConfigSchema: z.ZodEffects<z.ZodObject<{
1236
1113
  * (CIDv0 / CIDv1) — the only stable identifier that maps back to a
1237
1114
  * launched-instance authority across launchers.
1238
1115
  *
1239
- * Kept structurally separate from legacy `solverNets` for now. The daemon
1240
- * narrows this block into runtime SolverNet registry entries on restart, and
1241
- * Task 22 collapses both branches into a single manifest-keyed shape once
1242
- * the legacy block is fully drained.
1116
+ * The daemon narrows this block into runtime SolverNet registry entries on
1117
+ * restart. Legacy short-name-keyed `solverNets` blocks on operator config
1118
+ * files are auto-migrated into synthetic `legacy:<short-name>`-keyed
1119
+ * entries at load time (see `migrateLegacySolverNets`).
1243
1120
  */
1244
1121
  joinedSolverNets: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
1245
1122
  manifestCid: z.ZodString;
@@ -1260,28 +1137,28 @@ export declare const JinnConfigSchema: z.ZodEffects<z.ZodObject<{
1260
1137
  plugins: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
1261
1138
  disabledDefaultPlugins: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
1262
1139
  }, "strip", z.ZodTypeAny, {
1140
+ manifestCid: string;
1263
1141
  roles: ("solver" | "evaluator")[];
1264
1142
  plugins: string[];
1265
- manifestCid: string;
1266
1143
  disabledDefaultPlugins: string[];
1267
1144
  name?: string | undefined;
1268
1145
  harness?: string | undefined;
1269
- model?: string | undefined;
1270
1146
  contract?: {
1271
1147
  id: string;
1272
1148
  version: string;
1273
1149
  } | undefined;
1150
+ model?: string | undefined;
1274
1151
  }, {
1275
- roles: ("solver" | "evaluator")[];
1276
1152
  manifestCid: string;
1153
+ roles: ("solver" | "evaluator")[];
1277
1154
  name?: string | undefined;
1278
1155
  harness?: string | undefined;
1279
- model?: string | undefined;
1280
- plugins?: string[] | undefined;
1281
1156
  contract?: {
1282
1157
  id: string;
1283
1158
  version: string;
1284
1159
  } | undefined;
1160
+ model?: string | undefined;
1161
+ plugins?: string[] | undefined;
1285
1162
  disabledDefaultPlugins?: string[] | undefined;
1286
1163
  }>>>;
1287
1164
  /**
@@ -1438,10 +1315,36 @@ export declare const JinnConfigSchema: z.ZodEffects<z.ZodObject<{
1438
1315
  * Env: JINN_REPUTATION_ENABLED
1439
1316
  */
1440
1317
  reputationEnabled: z.ZodDefault<z.ZodBoolean>;
1318
+ /**
1319
+ * Per-credential daily spend caps (USD). Keys are credential identifiers
1320
+ * (e.g. `'anthropic:api-key'`); values are positive numbers representing
1321
+ * the maximum USD spend per day for that credential.
1322
+ *
1323
+ * `JINN_SPEND_CAP_USD` (env-only, consumed directly by the spend-budget
1324
+ * subsystem in Task 9) is tracked for provenance in TRACKED_ENV_VARS below
1325
+ * but is NOT a config-file field and has no entry in this schema.
1326
+ */
1327
+ spendCaps: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodNumber>>;
1328
+ /**
1329
+ * Operator-local SolverPlugin trust state.
1330
+ *
1331
+ * `blockedCids` is the list of plug-in CIDs the operator has chosen to
1332
+ * refuse to load — populated by `jinn solver-plugins block <cid>` and read
1333
+ * at daemon startup. The block list complements the on-chain
1334
+ * `giveFeedback(score=0)` write (which is the public-trust signal); the
1335
+ * local list is the operator's own refusal to execute, applied even when
1336
+ * the network write fails. File-managed only — no env override.
1337
+ *
1338
+ * See spec/2026-05-26-117-design.md "Failure modes" and "Local-only effects".
1339
+ */
1340
+ solverPlugins: z.ZodDefault<z.ZodObject<{
1341
+ blockedCids: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
1342
+ }, "strip", z.ZodTypeAny, {
1343
+ blockedCids: string[];
1344
+ }, {
1345
+ blockedCids?: string[] | undefined;
1346
+ }>>;
1441
1347
  }, "strip", z.ZodTypeAny, {
1442
- harness: {
1443
- mode: "train" | "frozen";
1444
- };
1445
1348
  network: "testnet" | "mainnet";
1446
1349
  earningDir: string;
1447
1350
  dbPath: string;
@@ -1536,21 +1439,9 @@ export declare const JinnConfigSchema: z.ZodEffects<z.ZodObject<{
1536
1439
  stakingMode: "standard" | "self-bond";
1537
1440
  targetServices: number;
1538
1441
  debug: boolean;
1539
- solverNets: Record<string, {
1540
- solverType: string;
1541
- enabled: boolean;
1542
- roles: ("solving" | "evaluating")[];
1543
- harness: string;
1544
- plugins: (string | {
1545
- source: string;
1546
- name?: string | undefined;
1547
- version?: string | undefined;
1548
- })[];
1549
- taskGenerator: {
1550
- enabled: boolean;
1551
- };
1552
- model?: string | undefined;
1553
- }>;
1442
+ harness: {
1443
+ mode: "train" | "frozen";
1444
+ };
1554
1445
  captures: {
1555
1446
  llmProxy: {
1556
1447
  enabled: boolean;
@@ -1559,9 +1450,12 @@ export declare const JinnConfigSchema: z.ZodEffects<z.ZodObject<{
1559
1450
  };
1560
1451
  runLegacyMigrations: boolean;
1561
1452
  reputationEnabled: boolean;
1562
- rpcUrl?: string | undefined;
1563
- archiveRpcUrl?: string | undefined;
1564
- l2ProofRpcUrl?: string | undefined;
1453
+ solverPlugins: {
1454
+ blockedCids: string[];
1455
+ };
1456
+ rpcUrl?: string | string[] | undefined;
1457
+ archiveRpcUrl?: string | string[] | undefined;
1458
+ l2ProofRpcUrl?: string | string[] | undefined;
1565
1459
  apiBindHost?: string | undefined;
1566
1460
  hermesPath?: string | undefined;
1567
1461
  hermesModel?: string | undefined;
@@ -1581,8 +1475,8 @@ export declare const JinnConfigSchema: z.ZodEffects<z.ZodObject<{
1581
1475
  testnetStolasDeploymentPath?: string | undefined;
1582
1476
  jinnMviL1DeploymentPath?: string | undefined;
1583
1477
  jinnMviL2DeploymentPath?: string | undefined;
1584
- ethereumRpcUrl?: string | undefined;
1585
- ethereumArchiveRpcUrl?: string | undefined;
1478
+ ethereumRpcUrl?: string | string[] | undefined;
1479
+ ethereumArchiveRpcUrl?: string | string[] | undefined;
1586
1480
  jinnDistributorAddress?: string | undefined;
1587
1481
  jinnClaimEmitterAddress?: string | undefined;
1588
1482
  jinnMessengerAddress?: string | undefined;
@@ -1600,17 +1494,17 @@ export declare const JinnConfigSchema: z.ZodEffects<z.ZodObject<{
1600
1494
  }[] | undefined;
1601
1495
  } | undefined;
1602
1496
  joinedSolverNets?: Record<string, {
1497
+ manifestCid: string;
1603
1498
  roles: ("solver" | "evaluator")[];
1604
1499
  plugins: string[];
1605
- manifestCid: string;
1606
1500
  disabledDefaultPlugins: string[];
1607
1501
  name?: string | undefined;
1608
1502
  harness?: string | undefined;
1609
- model?: string | undefined;
1610
1503
  contract?: {
1611
1504
  id: string;
1612
1505
  version: string;
1613
1506
  } | undefined;
1507
+ model?: string | undefined;
1614
1508
  }> | undefined;
1615
1509
  trustedImplSigners?: {
1616
1510
  publicKey: string;
@@ -1631,14 +1525,12 @@ export declare const JinnConfigSchema: z.ZodEffects<z.ZodObject<{
1631
1525
  } | undefined;
1632
1526
  identityRegistryAddress?: string | undefined;
1633
1527
  validationRegistryAddress?: string | undefined;
1528
+ spendCaps?: Record<string, number> | undefined;
1634
1529
  }, {
1635
- harness?: {
1636
- mode?: "train" | "frozen" | undefined;
1637
- } | undefined;
1638
1530
  network?: "testnet" | "mainnet" | undefined;
1639
- rpcUrl?: string | undefined;
1640
- archiveRpcUrl?: string | undefined;
1641
- l2ProofRpcUrl?: string | undefined;
1531
+ rpcUrl?: string | string[] | undefined;
1532
+ archiveRpcUrl?: string | string[] | undefined;
1533
+ l2ProofRpcUrl?: string | string[] | undefined;
1642
1534
  earningDir?: string | undefined;
1643
1535
  dbPath?: string | undefined;
1644
1536
  pollIntervalMs?: number | undefined;
@@ -1783,8 +1675,8 @@ export declare const JinnConfigSchema: z.ZodEffects<z.ZodObject<{
1783
1675
  testnetStolasDeploymentPath?: string | undefined;
1784
1676
  jinnMviL1DeploymentPath?: string | undefined;
1785
1677
  jinnMviL2DeploymentPath?: string | undefined;
1786
- ethereumRpcUrl?: string | undefined;
1787
- ethereumArchiveRpcUrl?: string | undefined;
1678
+ ethereumRpcUrl?: string | string[] | undefined;
1679
+ ethereumArchiveRpcUrl?: string | string[] | undefined;
1788
1680
  jinnL1Network?: "sepolia" | "ethereum" | undefined;
1789
1681
  jinnDistributorAddress?: string | undefined;
1790
1682
  jinnClaimEmitterAddress?: string | undefined;
@@ -1809,18 +1701,20 @@ export declare const JinnConfigSchema: z.ZodEffects<z.ZodObject<{
1809
1701
  version?: string | undefined;
1810
1702
  }[] | undefined;
1811
1703
  } | undefined;
1812
- solverNets?: Record<string, unknown> | undefined;
1704
+ harness?: {
1705
+ mode?: "train" | "frozen" | undefined;
1706
+ } | undefined;
1813
1707
  joinedSolverNets?: Record<string, {
1814
- roles: ("solver" | "evaluator")[];
1815
1708
  manifestCid: string;
1709
+ roles: ("solver" | "evaluator")[];
1816
1710
  name?: string | undefined;
1817
1711
  harness?: string | undefined;
1818
- model?: string | undefined;
1819
- plugins?: string[] | undefined;
1820
1712
  contract?: {
1821
1713
  id: string;
1822
1714
  version: string;
1823
1715
  } | undefined;
1716
+ model?: string | undefined;
1717
+ plugins?: string[] | undefined;
1824
1718
  disabledDefaultPlugins?: string[] | undefined;
1825
1719
  }> | undefined;
1826
1720
  trustedImplSigners?: {
@@ -1850,10 +1744,11 @@ export declare const JinnConfigSchema: z.ZodEffects<z.ZodObject<{
1850
1744
  identityRegistryAddress?: string | undefined;
1851
1745
  validationRegistryAddress?: string | undefined;
1852
1746
  reputationEnabled?: boolean | undefined;
1747
+ spendCaps?: Record<string, number> | undefined;
1748
+ solverPlugins?: {
1749
+ blockedCids?: string[] | undefined;
1750
+ } | undefined;
1853
1751
  }>, {
1854
- harness: {
1855
- mode: "train" | "frozen";
1856
- };
1857
1752
  network: "testnet" | "mainnet";
1858
1753
  earningDir: string;
1859
1754
  dbPath: string;
@@ -1948,21 +1843,9 @@ export declare const JinnConfigSchema: z.ZodEffects<z.ZodObject<{
1948
1843
  stakingMode: "standard" | "self-bond";
1949
1844
  targetServices: number;
1950
1845
  debug: boolean;
1951
- solverNets: Record<string, {
1952
- solverType: string;
1953
- enabled: boolean;
1954
- roles: ("solving" | "evaluating")[];
1955
- harness: string;
1956
- plugins: (string | {
1957
- source: string;
1958
- name?: string | undefined;
1959
- version?: string | undefined;
1960
- })[];
1961
- taskGenerator: {
1962
- enabled: boolean;
1963
- };
1964
- model?: string | undefined;
1965
- }>;
1846
+ harness: {
1847
+ mode: "train" | "frozen";
1848
+ };
1966
1849
  captures: {
1967
1850
  llmProxy: {
1968
1851
  enabled: boolean;
@@ -1971,9 +1854,12 @@ export declare const JinnConfigSchema: z.ZodEffects<z.ZodObject<{
1971
1854
  };
1972
1855
  runLegacyMigrations: boolean;
1973
1856
  reputationEnabled: boolean;
1974
- rpcUrl?: string | undefined;
1975
- archiveRpcUrl?: string | undefined;
1976
- l2ProofRpcUrl?: string | undefined;
1857
+ solverPlugins: {
1858
+ blockedCids: string[];
1859
+ };
1860
+ rpcUrl?: string | string[] | undefined;
1861
+ archiveRpcUrl?: string | string[] | undefined;
1862
+ l2ProofRpcUrl?: string | string[] | undefined;
1977
1863
  apiBindHost?: string | undefined;
1978
1864
  hermesPath?: string | undefined;
1979
1865
  hermesModel?: string | undefined;
@@ -1993,8 +1879,8 @@ export declare const JinnConfigSchema: z.ZodEffects<z.ZodObject<{
1993
1879
  testnetStolasDeploymentPath?: string | undefined;
1994
1880
  jinnMviL1DeploymentPath?: string | undefined;
1995
1881
  jinnMviL2DeploymentPath?: string | undefined;
1996
- ethereumRpcUrl?: string | undefined;
1997
- ethereumArchiveRpcUrl?: string | undefined;
1882
+ ethereumRpcUrl?: string | string[] | undefined;
1883
+ ethereumArchiveRpcUrl?: string | string[] | undefined;
1998
1884
  jinnDistributorAddress?: string | undefined;
1999
1885
  jinnClaimEmitterAddress?: string | undefined;
2000
1886
  jinnMessengerAddress?: string | undefined;
@@ -2012,17 +1898,17 @@ export declare const JinnConfigSchema: z.ZodEffects<z.ZodObject<{
2012
1898
  }[] | undefined;
2013
1899
  } | undefined;
2014
1900
  joinedSolverNets?: Record<string, {
1901
+ manifestCid: string;
2015
1902
  roles: ("solver" | "evaluator")[];
2016
1903
  plugins: string[];
2017
- manifestCid: string;
2018
1904
  disabledDefaultPlugins: string[];
2019
1905
  name?: string | undefined;
2020
1906
  harness?: string | undefined;
2021
- model?: string | undefined;
2022
1907
  contract?: {
2023
1908
  id: string;
2024
1909
  version: string;
2025
1910
  } | undefined;
1911
+ model?: string | undefined;
2026
1912
  }> | undefined;
2027
1913
  trustedImplSigners?: {
2028
1914
  publicKey: string;
@@ -2043,14 +1929,12 @@ export declare const JinnConfigSchema: z.ZodEffects<z.ZodObject<{
2043
1929
  } | undefined;
2044
1930
  identityRegistryAddress?: string | undefined;
2045
1931
  validationRegistryAddress?: string | undefined;
1932
+ spendCaps?: Record<string, number> | undefined;
2046
1933
  }, {
2047
- harness?: {
2048
- mode?: "train" | "frozen" | undefined;
2049
- } | undefined;
2050
1934
  network?: "testnet" | "mainnet" | undefined;
2051
- rpcUrl?: string | undefined;
2052
- archiveRpcUrl?: string | undefined;
2053
- l2ProofRpcUrl?: string | undefined;
1935
+ rpcUrl?: string | string[] | undefined;
1936
+ archiveRpcUrl?: string | string[] | undefined;
1937
+ l2ProofRpcUrl?: string | string[] | undefined;
2054
1938
  earningDir?: string | undefined;
2055
1939
  dbPath?: string | undefined;
2056
1940
  pollIntervalMs?: number | undefined;
@@ -2195,8 +2079,8 @@ export declare const JinnConfigSchema: z.ZodEffects<z.ZodObject<{
2195
2079
  testnetStolasDeploymentPath?: string | undefined;
2196
2080
  jinnMviL1DeploymentPath?: string | undefined;
2197
2081
  jinnMviL2DeploymentPath?: string | undefined;
2198
- ethereumRpcUrl?: string | undefined;
2199
- ethereumArchiveRpcUrl?: string | undefined;
2082
+ ethereumRpcUrl?: string | string[] | undefined;
2083
+ ethereumArchiveRpcUrl?: string | string[] | undefined;
2200
2084
  jinnL1Network?: "sepolia" | "ethereum" | undefined;
2201
2085
  jinnDistributorAddress?: string | undefined;
2202
2086
  jinnClaimEmitterAddress?: string | undefined;
@@ -2221,18 +2105,20 @@ export declare const JinnConfigSchema: z.ZodEffects<z.ZodObject<{
2221
2105
  version?: string | undefined;
2222
2106
  }[] | undefined;
2223
2107
  } | undefined;
2224
- solverNets?: Record<string, unknown> | undefined;
2108
+ harness?: {
2109
+ mode?: "train" | "frozen" | undefined;
2110
+ } | undefined;
2225
2111
  joinedSolverNets?: Record<string, {
2226
- roles: ("solver" | "evaluator")[];
2227
2112
  manifestCid: string;
2113
+ roles: ("solver" | "evaluator")[];
2228
2114
  name?: string | undefined;
2229
2115
  harness?: string | undefined;
2230
- model?: string | undefined;
2231
- plugins?: string[] | undefined;
2232
2116
  contract?: {
2233
2117
  id: string;
2234
2118
  version: string;
2235
2119
  } | undefined;
2120
+ model?: string | undefined;
2121
+ plugins?: string[] | undefined;
2236
2122
  disabledDefaultPlugins?: string[] | undefined;
2237
2123
  }> | undefined;
2238
2124
  trustedImplSigners?: {
@@ -2262,10 +2148,33 @@ export declare const JinnConfigSchema: z.ZodEffects<z.ZodObject<{
2262
2148
  identityRegistryAddress?: string | undefined;
2263
2149
  validationRegistryAddress?: string | undefined;
2264
2150
  reputationEnabled?: boolean | undefined;
2151
+ spendCaps?: Record<string, number> | undefined;
2152
+ solverPlugins?: {
2153
+ blockedCids?: string[] | undefined;
2154
+ } | undefined;
2265
2155
  }>;
2266
- /** JinnConfig with rpcUrl guaranteed to be resolved (never undefined) and tasks with id always assigned. */
2267
- export type JinnConfig = Omit<z.infer<typeof JinnConfigSchema>, 'rpcUrl' | 'tasks' | 'engine'> & {
2156
+ /**
2157
+ * JinnConfig with rpcUrl guaranteed to be resolved (never undefined) and tasks
2158
+ * with id always assigned.
2159
+ *
2160
+ * `rpcUrl` is the head of the fallback chain (the slot-0 URL) and is kept as
2161
+ * a `string` for display continuity — the ~30 places that log/display
2162
+ * `config.rpcUrl` (provenance, error formatting, `[main] daemon starting on …`)
2163
+ * keep working unchanged. The full chain lives in `rpcUrls: readonly string[]`,
2164
+ * which is what `buildFallbackTransport()` consumes. Same shape for the L1
2165
+ * (ethereum) and optional archive/proof variants.
2166
+ */
2167
+ export type JinnConfig = Omit<z.infer<typeof JinnConfigSchema>, 'rpcUrl' | 'archiveRpcUrl' | 'l2ProofRpcUrl' | 'ethereumRpcUrl' | 'ethereumArchiveRpcUrl' | 'tasks' | 'engine'> & {
2268
2168
  rpcUrl: string;
2169
+ rpcUrls: readonly string[];
2170
+ archiveRpcUrl?: string;
2171
+ archiveRpcUrls?: readonly string[];
2172
+ l2ProofRpcUrl?: string;
2173
+ l2ProofRpcUrls?: readonly string[];
2174
+ ethereumRpcUrl?: string;
2175
+ ethereumRpcUrls?: readonly string[];
2176
+ ethereumArchiveRpcUrl?: string;
2177
+ ethereumArchiveRpcUrls?: readonly string[];
2269
2178
  tasks: Task[];
2270
2179
  engine: {
2271
2180
  workingDirRoot: string;
@@ -2282,12 +2191,40 @@ export declare const DEFAULT_CONFIG_PATH: string;
2282
2191
  */
2283
2192
  export declare const DEFAULT_TESTNET_DISCOVERY_URL = "https://jinn-indexer-production.up.railway.app";
2284
2193
  export declare const DEFAULT_TESTNET_ETHEREUM_RPC_URL = "https://ethereum-sepolia-rpc.publicnode.com";
2194
+ /**
2195
+ * Default fallback chain for the L2 measurement chain (Base Sepolia) on
2196
+ * testnet. Per AC2 of issue #592:
2197
+ * slot 0 — `https://base-sepolia.publicnode.com` (no-auth, 50k-block
2198
+ * getLogs cap, no shared-quota cliff).
2199
+ * slot 1 — `https://sepolia.base.org` (free public Coinbase endpoint,
2200
+ * 2k-block cap; last-resort backup).
2201
+ * Operators are encouraged to prepend a paid primary key (Alchemy, Tenderly,
2202
+ * etc.) via `rpcUrl` config or `JINN_RPC_URL` / `BASE_SEPOLIA_RPC_URL` env.
2203
+ */
2204
+ export declare const DEFAULT_TESTNET_RPC_URLS: readonly string[];
2285
2205
  export type ConfigLoadErrorCode = 'config_file_not_found' | 'config_json_invalid' | 'tasks_file_not_found' | 'tasks_json_invalid' | 'config_invalid';
2286
2206
  export declare class ConfigLoadError extends Error {
2287
2207
  readonly code: ConfigLoadErrorCode;
2288
2208
  readonly details?: Record<string, unknown>;
2289
2209
  constructor(code: ConfigLoadErrorCode, message: string, details?: Record<string, unknown>);
2290
2210
  }
2211
+ /**
2212
+ * Translate any legacy short-name-keyed `solverNets` block on the raw parsed
2213
+ * config into manifest-keyed `joinedSolverNets` entries with synthetic
2214
+ * `legacy:<short-name>` keys.
2215
+ *
2216
+ * This is the auto-migration path for operators upgrading past issue #421.
2217
+ * The runtime claim filter remains manifest-digest gated, so synthetic-keyed
2218
+ * entries don't change task eligibility — they exist purely so the diagnostic
2219
+ * surfaces (Overview SOLVING-ON eyebrow, prediction-operator-status) keep
2220
+ * showing the operator's previous SolverNets until they re-join via the SPA.
2221
+ *
2222
+ * Returns the number of legacy entries migrated. Idempotent — calling on an
2223
+ * already-migrated raw config is a no-op.
2224
+ *
2225
+ * @param raw — the JSON-parsed config file contents (mutated in place).
2226
+ */
2227
+ export declare function migrateLegacySolverNets(raw: Record<string, unknown>): number;
2291
2228
  /**
2292
2229
  * Load config with resolution: env > config file > defaults.
2293
2230
  *