@jinn-network/client 0.1.5 → 0.1.6-canary.0b4ff7f9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (326) hide show
  1. package/CHANGELOG.md +98 -0
  2. package/dist/adapters/mech/adapter.js +7 -7
  3. package/dist/adapters/mech/adapter.js.map +1 -1
  4. package/dist/adapters/mech/ipfs-pinfile.d.ts +22 -0
  5. package/dist/adapters/mech/ipfs-pinfile.js +54 -0
  6. package/dist/adapters/mech/ipfs-pinfile.js.map +1 -0
  7. package/dist/adapters/mech/ipfs.d.ts +1 -0
  8. package/dist/adapters/mech/ipfs.js +24 -1
  9. package/dist/adapters/mech/ipfs.js.map +1 -1
  10. package/dist/api/bootstrap-endpoint.js +2 -0
  11. package/dist/api/bootstrap-endpoint.js.map +1 -1
  12. package/dist/api/discovery-endpoint.d.ts +18 -0
  13. package/dist/api/discovery-endpoint.js +65 -0
  14. package/dist/api/discovery-endpoint.js.map +1 -0
  15. package/dist/api/fleet-build.d.ts +7 -0
  16. package/dist/api/fleet-build.js +6 -1
  17. package/dist/api/fleet-build.js.map +1 -1
  18. package/dist/api/harness-readiness-endpoint.d.ts +13 -0
  19. package/dist/api/harness-readiness-endpoint.js +15 -0
  20. package/dist/api/harness-readiness-endpoint.js.map +1 -0
  21. package/dist/api/hermes-doctor-endpoint.d.ts +26 -0
  22. package/dist/api/hermes-doctor-endpoint.js +29 -0
  23. package/dist/api/hermes-doctor-endpoint.js.map +1 -0
  24. package/dist/api/server.d.ts +21 -0
  25. package/dist/api/server.js +22 -0
  26. package/dist/api/server.js.map +1 -1
  27. package/dist/build-info.json +4 -4
  28. package/dist/build-meta.json +1 -1
  29. package/dist/cli/commands/create.d.ts +5 -3
  30. package/dist/cli/commands/create.js +101 -36
  31. package/dist/cli/commands/create.js.map +1 -1
  32. package/dist/cli/commands/solver-nets.d.ts +19 -0
  33. package/dist/cli/commands/solver-nets.js +140 -2
  34. package/dist/cli/commands/solver-nets.js.map +1 -1
  35. package/dist/cli/commands/solver-plugins-publish.d.ts +31 -0
  36. package/dist/cli/commands/solver-plugins-publish.js +169 -0
  37. package/dist/cli/commands/solver-plugins-publish.js.map +1 -0
  38. package/dist/cli/commands/solver-plugins-revoke.d.ts +15 -0
  39. package/dist/cli/commands/solver-plugins-revoke.js +91 -0
  40. package/dist/cli/commands/solver-plugins-revoke.js.map +1 -0
  41. package/dist/cli/commands/solver-plugins.d.ts +50 -6
  42. package/dist/cli/commands/solver-plugins.js +205 -68
  43. package/dist/cli/commands/solver-plugins.js.map +1 -1
  44. package/dist/config.d.ts +27 -0
  45. package/dist/config.js +24 -0
  46. package/dist/config.js.map +1 -1
  47. package/dist/conformance/checks/hash-signature.js +6 -2
  48. package/dist/conformance/checks/hash-signature.js.map +1 -1
  49. package/dist/conformance/checks/payload.js +4 -2
  50. package/dist/conformance/checks/payload.js.map +1 -1
  51. package/dist/conformance/checks/verdict.d.ts +10 -10
  52. package/dist/conformance/checks/verdict.js +16 -15
  53. package/dist/conformance/checks/verdict.js.map +1 -1
  54. package/dist/conformance/harness.d.ts +1 -1
  55. package/dist/conformance/harness.js +16 -9
  56. package/dist/conformance/harness.js.map +1 -1
  57. package/dist/conformance/types.d.ts +10 -3
  58. package/dist/conformance/types.js.map +1 -1
  59. package/dist/corpus/acquire.d.ts +1 -3
  60. package/dist/corpus/acquire.js.map +1 -1
  61. package/dist/corpus/envelope-projection.d.ts +1 -1
  62. package/dist/corpus/envelope-projection.js +14 -7
  63. package/dist/corpus/envelope-projection.js.map +1 -1
  64. package/dist/corpus/index.d.ts +2 -1
  65. package/dist/corpus/index.js.map +1 -1
  66. package/dist/corpus/prediction-brier-scoreboard-report.js +1 -1
  67. package/dist/corpus/prediction-brier-scoreboard-report.js.map +1 -1
  68. package/dist/corpus/prediction-brier-scoreboard.js +3 -1
  69. package/dist/corpus/prediction-brier-scoreboard.js.map +1 -1
  70. package/dist/corpus/types.d.ts +2 -2
  71. package/dist/daemon/daemon.d.ts +17 -1
  72. package/dist/daemon/daemon.js +15 -0
  73. package/dist/daemon/daemon.js.map +1 -1
  74. package/dist/daemon/freeze-fence.js +6 -3
  75. package/dist/daemon/freeze-fence.js.map +1 -1
  76. package/dist/daemon/readiness-gate.d.ts +30 -0
  77. package/dist/daemon/readiness-gate.js +31 -0
  78. package/dist/daemon/readiness-gate.js.map +1 -0
  79. package/dist/dashboard/assets/{index-D_NMfDfV.css → index-B4sTrvQD.css} +1 -1
  80. package/dist/dashboard/assets/index-C5j0ZJWS.js +140 -0
  81. package/dist/dashboard/index.html +2 -2
  82. package/dist/discovery/http.js +121 -0
  83. package/dist/discovery/http.js.map +1 -1
  84. package/dist/discovery/onchain.js +11 -0
  85. package/dist/discovery/onchain.js.map +1 -1
  86. package/dist/discovery/types.d.ts +112 -0
  87. package/dist/discovery/types.js.map +1 -1
  88. package/dist/discovery/with-fallback.js +9 -0
  89. package/dist/discovery/with-fallback.js.map +1 -1
  90. package/dist/earning/agent-wallet-binding.d.ts +20 -1
  91. package/dist/earning/agent-wallet-binding.js +54 -16
  92. package/dist/earning/agent-wallet-binding.js.map +1 -1
  93. package/dist/earning/bootstrap.d.ts +55 -0
  94. package/dist/earning/bootstrap.js +376 -20
  95. package/dist/earning/bootstrap.js.map +1 -1
  96. package/dist/earning/store.js +48 -1
  97. package/dist/earning/store.js.map +1 -1
  98. package/dist/earning/types.d.ts +30 -0
  99. package/dist/earning/types.js +37 -0
  100. package/dist/earning/types.js.map +1 -1
  101. package/dist/erc8004/abis.d.ts +64 -0
  102. package/dist/erc8004/abis.js +48 -0
  103. package/dist/erc8004/abis.js.map +1 -1
  104. package/dist/erc8004/plugin-registry.d.ts +102 -0
  105. package/dist/erc8004/plugin-registry.js +165 -0
  106. package/dist/erc8004/plugin-registry.js.map +1 -0
  107. package/dist/harnesses/engine/engine.js +15 -3
  108. package/dist/harnesses/engine/engine.js.map +1 -1
  109. package/dist/harnesses/engine/envelope-assembly.d.ts +2 -2
  110. package/dist/harnesses/engine/envelope-assembly.js +4 -2
  111. package/dist/harnesses/engine/envelope-assembly.js.map +1 -1
  112. package/dist/harnesses/freeze.d.ts +4 -1
  113. package/dist/harnesses/freeze.js +12 -2
  114. package/dist/harnesses/freeze.js.map +1 -1
  115. package/dist/harnesses/impls/claude-mcp-prediction/index.d.ts +4 -1
  116. package/dist/harnesses/impls/claude-mcp-prediction/index.js +7 -2
  117. package/dist/harnesses/impls/claude-mcp-prediction/index.js.map +1 -1
  118. package/dist/harnesses/impls/claude-mcp-prediction-apy/index.d.ts +4 -1
  119. package/dist/harnesses/impls/claude-mcp-prediction-apy/index.js +7 -2
  120. package/dist/harnesses/impls/claude-mcp-prediction-apy/index.js.map +1 -1
  121. package/dist/harnesses/impls/evaluation-context.d.ts +15 -4
  122. package/dist/harnesses/impls/evaluation-context.js +24 -8
  123. package/dist/harnesses/impls/evaluation-context.js.map +1 -1
  124. package/dist/harnesses/impls/hermes-agent/adapter.d.ts +34 -0
  125. package/dist/harnesses/impls/hermes-agent/adapter.js +184 -0
  126. package/dist/harnesses/impls/hermes-agent/adapter.js.map +1 -0
  127. package/dist/harnesses/impls/hermes-agent/bootstrap.d.ts +18 -0
  128. package/dist/harnesses/impls/hermes-agent/bootstrap.js +231 -0
  129. package/dist/harnesses/impls/hermes-agent/bootstrap.js.map +1 -0
  130. package/dist/harnesses/impls/hermes-agent/config-builder.d.ts +49 -0
  131. package/dist/harnesses/impls/hermes-agent/config-builder.js +104 -0
  132. package/dist/harnesses/impls/hermes-agent/config-builder.js.map +1 -0
  133. package/dist/harnesses/impls/hermes-agent/harness.d.ts +30 -0
  134. package/dist/harnesses/impls/hermes-agent/harness.js +52 -0
  135. package/dist/harnesses/impls/hermes-agent/harness.js.map +1 -0
  136. package/dist/harnesses/impls/hermes-agent/index.d.ts +5 -0
  137. package/dist/harnesses/impls/hermes-agent/index.js +7 -0
  138. package/dist/harnesses/impls/hermes-agent/index.js.map +1 -0
  139. package/dist/harnesses/impls/hermes-agent/prompt.d.ts +15 -0
  140. package/dist/harnesses/impls/hermes-agent/prompt.js +37 -0
  141. package/dist/harnesses/impls/hermes-agent/prompt.js.map +1 -0
  142. package/dist/harnesses/impls/index.d.ts +6 -0
  143. package/dist/harnesses/impls/index.js +17 -4
  144. package/dist/harnesses/impls/index.js.map +1 -1
  145. package/dist/harnesses/impls/learner/adapters/claude-code.js.map +1 -0
  146. package/dist/harnesses/impls/{claude-code-learner → learner}/adapters/codex-code.js +13 -34
  147. package/dist/harnesses/impls/learner/adapters/codex-code.js.map +1 -0
  148. package/dist/harnesses/impls/learner/adapters/codex-workspace.js.map +1 -0
  149. package/dist/harnesses/impls/{claude-code-learner → learner}/harness.d.ts +9 -3
  150. package/dist/harnesses/impls/{claude-code-learner → learner}/harness.js +24 -1
  151. package/dist/harnesses/impls/learner/harness.js.map +1 -0
  152. package/dist/harnesses/impls/{claude-code-learner → learner}/harvest.js +15 -3
  153. package/dist/harnesses/impls/learner/harvest.js.map +1 -0
  154. package/dist/harnesses/impls/{claude-code-learner → learner}/index.d.ts +5 -5
  155. package/dist/harnesses/impls/{claude-code-learner → learner}/index.js +4 -4
  156. package/dist/harnesses/impls/learner/index.js.map +1 -0
  157. package/dist/harnesses/impls/{claude-code-learner → learner}/plugin-path.d.ts +4 -4
  158. package/dist/harnesses/impls/{claude-code-learner → learner}/plugin-path.js +7 -7
  159. package/dist/harnesses/impls/learner/plugin-path.js.map +1 -0
  160. package/dist/harnesses/impls/{claude-code-learner → learner}/restoration-patch.js +3 -1
  161. package/dist/harnesses/impls/learner/restoration-patch.js.map +1 -0
  162. package/dist/harnesses/impls/learner/test-utils/fake-plugin-outputs.js.map +1 -0
  163. package/dist/harnesses/impls/learner/test-utils/noop-adapter.js.map +1 -0
  164. package/dist/harnesses/impls/{claude-code-learner → learner}/types.d.ts +12 -2
  165. package/dist/harnesses/impls/learner/types.js.map +1 -0
  166. package/dist/harnesses/impls/portfolio-v0-evaluator/index.js +13 -12
  167. package/dist/harnesses/impls/portfolio-v0-evaluator/index.js.map +1 -1
  168. package/dist/harnesses/impls/prediction-apy-v0-evaluator/index.js +7 -7
  169. package/dist/harnesses/impls/prediction-apy-v0-evaluator/index.js.map +1 -1
  170. package/dist/harnesses/impls/prediction-apy-v0-evaluator/parse-submission.d.ts +3 -3
  171. package/dist/harnesses/impls/prediction-apy-v0-evaluator/parse-submission.js +7 -6
  172. package/dist/harnesses/impls/prediction-apy-v0-evaluator/parse-submission.js.map +1 -1
  173. package/dist/harnesses/impls/prediction-v0-evaluator/checks/integrity.js +1 -1
  174. package/dist/harnesses/impls/prediction-v0-evaluator/checks/integrity.js.map +1 -1
  175. package/dist/harnesses/impls/prediction-v0-evaluator/index.js +11 -10
  176. package/dist/harnesses/impls/prediction-v0-evaluator/index.js.map +1 -1
  177. package/dist/harnesses/impls/prediction-v1-evaluator/index.js +11 -10
  178. package/dist/harnesses/impls/prediction-v1-evaluator/index.js.map +1 -1
  179. package/dist/harnesses/impls/swe-rebench-v2-evaluator/eval-runner.d.ts +1 -0
  180. package/dist/harnesses/impls/swe-rebench-v2-evaluator/eval-runner.js +10 -2
  181. package/dist/harnesses/impls/swe-rebench-v2-evaluator/eval-runner.js.map +1 -1
  182. package/dist/harnesses/impls/swe-rebench-v2-evaluator/harness.d.ts +24 -5
  183. package/dist/harnesses/impls/swe-rebench-v2-evaluator/harness.js +104 -4
  184. package/dist/harnesses/impls/swe-rebench-v2-evaluator/harness.js.map +1 -1
  185. package/dist/harnesses/impls/swe-rebench-v2-evaluator/hf-fetcher.d.ts +9 -0
  186. package/dist/harnesses/impls/swe-rebench-v2-evaluator/hf-fetcher.js +25 -1
  187. package/dist/harnesses/impls/swe-rebench-v2-evaluator/hf-fetcher.js.map +1 -1
  188. package/dist/harnesses/names.d.ts +1 -0
  189. package/dist/harnesses/names.js +3 -0
  190. package/dist/harnesses/names.js.map +1 -1
  191. package/dist/harnesses/readiness-registry.d.ts +48 -0
  192. package/dist/harnesses/readiness-registry.js +136 -0
  193. package/dist/harnesses/readiness-registry.js.map +1 -0
  194. package/dist/harnesses/types.d.ts +7 -0
  195. package/dist/main.d.ts +14 -0
  196. package/dist/main.js +70 -35
  197. package/dist/main.js.map +1 -1
  198. package/dist/mcp/server.js +14 -13
  199. package/dist/mcp/server.js.map +1 -1
  200. package/dist/preflight/claude-auth.d.ts +18 -0
  201. package/dist/preflight/claude-auth.js +38 -0
  202. package/dist/preflight/claude-auth.js.map +1 -1
  203. package/dist/scripts/donation-consumption-acceptance.js +1 -1
  204. package/dist/scripts/donation-consumption-acceptance.js.map +1 -1
  205. package/dist/scripts/swe-rebench-v2-known-bad.json +12 -0
  206. package/dist/scripts/swe-rebench-v2-seed-pool.json +26 -0
  207. package/dist/solver-types/_swe-rebench-v2-substrate.d.ts +52 -0
  208. package/dist/solver-types/_swe-rebench-v2-substrate.js +76 -0
  209. package/dist/solver-types/_swe-rebench-v2-substrate.js.map +1 -0
  210. package/dist/solver-types/_swe-rebench-v2-validated-pool.d.ts +38 -12
  211. package/dist/solver-types/_swe-rebench-v2-validated-pool.js +136 -27
  212. package/dist/solver-types/_swe-rebench-v2-validated-pool.js.map +1 -1
  213. package/dist/solver-types/swe-rebench-v2-auto.d.ts +6 -0
  214. package/dist/solver-types/swe-rebench-v2-auto.js.map +1 -1
  215. package/dist/solver-types/swe-rebench-v2.d.ts +1 -0
  216. package/dist/solver-types/swe-rebench-v2.js +19 -6
  217. package/dist/solver-types/swe-rebench-v2.js.map +1 -1
  218. package/dist/store/store.js +12 -4
  219. package/dist/store/store.js.map +1 -1
  220. package/dist/templates/plugins/runtime-plugin/.mcp.json.tmpl +8 -0
  221. package/dist/templates/plugins/runtime-plugin/README.md.tmpl +30 -0
  222. package/dist/templates/plugins/runtime-plugin/gitignore.tmpl +3 -0
  223. package/dist/templates/plugins/runtime-plugin/jinn.plugin.json.tmpl +21 -0
  224. package/dist/templates/plugins/runtime-plugin/mcp/server.mjs.tmpl +33 -0
  225. package/dist/templates/plugins/runtime-plugin/package.json.tmpl +15 -0
  226. package/dist/templates/plugins/runtime-plugin/test/plugin.test.ts.tmpl +35 -0
  227. package/dist/templates/plugins/runtime-plugin/tsconfig.json.tmpl +11 -0
  228. package/dist/templates/plugins/solver-type-plugin/README.md.tmpl +35 -0
  229. package/dist/templates/plugins/solver-type-plugin/gitignore.tmpl +3 -0
  230. package/dist/templates/plugins/solver-type-plugin/jinn.plugin.json.tmpl +11 -0
  231. package/dist/templates/plugins/solver-type-plugin/package.json.tmpl +15 -0
  232. package/dist/templates/plugins/solver-type-plugin/skills/example/SKILL.md.tmpl +10 -0
  233. package/dist/templates/plugins/solver-type-plugin/test/plugin.test.ts.tmpl +25 -0
  234. package/dist/templates/plugins/solver-type-plugin/tsconfig.json.tmpl +11 -0
  235. package/dist/types/envelope.d.ts +28 -21
  236. package/dist/types/envelope.js +8 -3
  237. package/dist/types/envelope.js.map +1 -1
  238. package/dist/types/payloads/index.d.ts +2 -2
  239. package/dist/types/payloads/index.js +13 -12
  240. package/dist/types/payloads/index.js.map +1 -1
  241. package/dist/types/payloads/portfolio-v0.d.ts +60 -10
  242. package/dist/types/payloads/portfolio-v0.js +16 -6
  243. package/dist/types/payloads/portfolio-v0.js.map +1 -1
  244. package/dist/types/payloads/prediction-apy-v0.d.ts +52 -10
  245. package/dist/types/payloads/prediction-apy-v0.js +16 -6
  246. package/dist/types/payloads/prediction-apy-v0.js.map +1 -1
  247. package/dist/types/payloads/prediction-v0.d.ts +49 -10
  248. package/dist/types/payloads/prediction-v0.js +16 -6
  249. package/dist/types/payloads/prediction-v0.js.map +1 -1
  250. package/dist/vendor/@jinn-network/sdk/dist/payloads/prediction-v1.d.ts +45 -6
  251. package/dist/vendor/@jinn-network/sdk/dist/payloads/prediction-v1.js +16 -6
  252. package/dist/x402/handler.js +51 -20
  253. package/dist/x402/handler.js.map +1 -1
  254. package/package.json +8 -3
  255. package/plugins/swe-rebench-v2-diffmin/.claude-plugin/plugin.json +5 -0
  256. package/plugins/swe-rebench-v2-diffmin/.mcp.json +8 -0
  257. package/plugins/swe-rebench-v2-diffmin/README.md +69 -0
  258. package/plugins/swe-rebench-v2-diffmin/jinn.plugin.json +12 -0
  259. package/plugins/swe-rebench-v2-diffmin/mcp/diff-stats-server.mjs +72 -0
  260. package/plugins/swe-rebench-v2-diffmin/mcp/diff-stats.mjs +48 -0
  261. package/plugins/swe-rebench-v2-diffmin/package.json +19 -0
  262. package/plugins/swe-rebench-v2-diffmin/skills/diffmin/SKILL.md +116 -0
  263. package/plugins/swe-rebench-v2-diffmin/skills/test-map/SKILL.md +126 -0
  264. package/plugins/swe-rebench-v2-diffmin/test/diff-stats.test.ts +62 -0
  265. package/plugins/swe-rebench-v2-diffmin/test/manifest.test.ts +53 -0
  266. package/plugins/swe-rebench-v2-diffmin/tsconfig.json +12 -0
  267. package/plugins/swe-rebench-v2-runtime/README.md +13 -0
  268. package/plugins/swe-rebench-v2-runtime/skills/orient/SKILL.md +7 -3
  269. package/plugins/swe-rebench-v2-runtime/skills/plan/SKILL.md +6 -17
  270. package/templates/plugins/runtime-plugin/.mcp.json.tmpl +8 -0
  271. package/templates/plugins/runtime-plugin/README.md.tmpl +30 -0
  272. package/templates/plugins/runtime-plugin/gitignore.tmpl +3 -0
  273. package/templates/plugins/runtime-plugin/jinn.plugin.json.tmpl +21 -0
  274. package/templates/plugins/runtime-plugin/mcp/server.mjs.tmpl +33 -0
  275. package/templates/plugins/runtime-plugin/package.json.tmpl +15 -0
  276. package/templates/plugins/runtime-plugin/test/plugin.test.ts.tmpl +35 -0
  277. package/templates/plugins/runtime-plugin/tsconfig.json.tmpl +11 -0
  278. package/templates/plugins/solver-type-plugin/README.md.tmpl +35 -0
  279. package/templates/plugins/solver-type-plugin/gitignore.tmpl +3 -0
  280. package/templates/plugins/solver-type-plugin/jinn.plugin.json.tmpl +11 -0
  281. package/templates/plugins/solver-type-plugin/package.json.tmpl +15 -0
  282. package/templates/plugins/solver-type-plugin/skills/example/SKILL.md.tmpl +10 -0
  283. package/templates/plugins/solver-type-plugin/test/plugin.test.ts.tmpl +25 -0
  284. package/templates/plugins/solver-type-plugin/tsconfig.json.tmpl +11 -0
  285. package/dist/dashboard/assets/index-BjtltOGc.js +0 -76
  286. package/dist/harnesses/impls/claude-code-learner/adapters/claude-code.js.map +0 -1
  287. package/dist/harnesses/impls/claude-code-learner/adapters/codex-code.js.map +0 -1
  288. package/dist/harnesses/impls/claude-code-learner/adapters/codex-workspace.js.map +0 -1
  289. package/dist/harnesses/impls/claude-code-learner/harness.js.map +0 -1
  290. package/dist/harnesses/impls/claude-code-learner/harvest.js.map +0 -1
  291. package/dist/harnesses/impls/claude-code-learner/index.js.map +0 -1
  292. package/dist/harnesses/impls/claude-code-learner/plugin-path.js.map +0 -1
  293. package/dist/harnesses/impls/claude-code-learner/restoration-patch.js.map +0 -1
  294. package/dist/harnesses/impls/claude-code-learner/test-utils/fake-plugin-outputs.js.map +0 -1
  295. package/dist/harnesses/impls/claude-code-learner/test-utils/noop-adapter.js.map +0 -1
  296. package/dist/harnesses/impls/claude-code-learner/types.js.map +0 -1
  297. package/dist/preflight/claude-required.d.ts +0 -8
  298. package/dist/preflight/claude-required.js +0 -17
  299. package/dist/preflight/claude-required.js.map +0 -1
  300. /package/dist/harnesses/impls/{claude-code-learner → learner}/adapters/claude-code.d.ts +0 -0
  301. /package/dist/harnesses/impls/{claude-code-learner → learner}/adapters/claude-code.js +0 -0
  302. /package/dist/harnesses/impls/{claude-code-learner → learner}/adapters/codex-code.d.ts +0 -0
  303. /package/dist/harnesses/impls/{claude-code-learner → learner}/adapters/codex-workspace.d.ts +0 -0
  304. /package/dist/harnesses/impls/{claude-code-learner → learner}/adapters/codex-workspace.js +0 -0
  305. /package/dist/harnesses/impls/{claude-code-learner → learner}/harvest.d.ts +0 -0
  306. /package/dist/harnesses/impls/{claude-code-learner → learner}/restoration-patch.d.ts +0 -0
  307. /package/dist/harnesses/impls/{claude-code-learner → learner}/test-utils/fake-plugin-outputs.d.ts +0 -0
  308. /package/dist/harnesses/impls/{claude-code-learner → learner}/test-utils/fake-plugin-outputs.js +0 -0
  309. /package/dist/harnesses/impls/{claude-code-learner → learner}/test-utils/noop-adapter.d.ts +0 -0
  310. /package/dist/harnesses/impls/{claude-code-learner → learner}/test-utils/noop-adapter.js +0 -0
  311. /package/dist/harnesses/impls/{claude-code-learner → learner}/types.js +0 -0
  312. /package/plugins/{claude-code-learner → learner}/.claude-plugin/plugin.json +0 -0
  313. /package/plugins/{claude-code-learner → learner}/.codex-plugin/plugin.json +0 -0
  314. /package/plugins/{claude-code-learner → learner}/AGENTS.md +0 -0
  315. /package/plugins/{claude-code-learner → learner}/CLAUDE.md +0 -0
  316. /package/plugins/{claude-code-learner → learner}/README.md +0 -0
  317. /package/plugins/{claude-code-learner → learner}/hooks/hooks.json +0 -0
  318. /package/plugins/{claude-code-learner → learner}/hooks/session-start +0 -0
  319. /package/plugins/{claude-code-learner → learner}/skills/learn/SKILL.md +0 -0
  320. /package/plugins/{claude-code-learner → learner}/skills/learn/analyst-prompt.md +0 -0
  321. /package/plugins/{claude-code-learner → learner}/skills/learn/consolidator-prompt.md +0 -0
  322. /package/plugins/{claude-code-learner → learner}/skills/learn/explorer-prompt.md +0 -0
  323. /package/plugins/{claude-code-learner → learner}/skills/learn/planner-prompt.md +0 -0
  324. /package/plugins/{claude-code-learner → learner}/skills/learn/promoter-prompt.md +0 -0
  325. /package/plugins/{claude-code-learner → learner}/skills/learn/step-worker-prompt.md +0 -0
  326. /package/plugins/{claude-code-learner → learner}/skills/learn/strategist-prompt.md +0 -0
@@ -0,0 +1,34 @@
1
+ import { spawn } from 'node:child_process';
2
+ import type { TaskSessionInputs } from '../learner/types.js';
3
+ import type { ConfigBuilderEnv } from './config-builder.js';
4
+ export interface HermesHarnessAdapterConfig {
5
+ hermesPath?: string;
6
+ hermesModel?: string;
7
+ hermesProvider?: string;
8
+ daemonApiUrl: string;
9
+ daemonApiToken: string;
10
+ corpusEnv: ConfigBuilderEnv['corpusEnv'];
11
+ storePath?: string;
12
+ /**
13
+ * The operator's real Hermes home — auth credentials are seeded from here
14
+ * into each per-Task `$HERMES_HOME`. Defaults to `process.env.HERMES_HOME`
15
+ * (if the operator customised it) or `~/.hermes`. Tests pass an empty dir to
16
+ * make the seed a no-op.
17
+ */
18
+ operatorHermesHome?: string;
19
+ _spawnFn?: typeof spawn;
20
+ }
21
+ export declare class HermesHarnessAdapter {
22
+ readonly name = "hermes-agent";
23
+ private readonly hermesPath;
24
+ private readonly hermesModel;
25
+ private readonly hermesProvider;
26
+ private readonly daemonApiUrl;
27
+ private readonly daemonApiToken;
28
+ private readonly corpusEnv;
29
+ private readonly storePath;
30
+ private readonly operatorHermesHome;
31
+ private readonly spawnFn;
32
+ constructor(config: HermesHarnessAdapterConfig);
33
+ runTask(inputs: TaskSessionInputs): Promise<void>;
34
+ }
@@ -0,0 +1,184 @@
1
+ // client/src/harnesses/impls/hermes-agent/adapter.ts
2
+ import { spawn } from 'node:child_process';
3
+ import { createWriteStream, mkdirSync } from 'node:fs';
4
+ import { homedir } from 'node:os';
5
+ import { join } from 'node:path';
6
+ import { finished } from 'node:stream/promises';
7
+ import { HERMES_AGENT_HARNESS } from '../../names.js';
8
+ import { writePerTaskHermesConfig } from './bootstrap.js';
9
+ import { buildInitialPrompt } from './prompt.js';
10
+ const ENV_ALLOWLIST = [
11
+ 'PATH', 'HOME', 'USER', 'SHELL', 'LANG', 'TERM', 'TMPDIR',
12
+ 'XDG_CONFIG_HOME', 'XDG_DATA_HOME', 'XDG_CACHE_HOME',
13
+ 'NODE_PATH', 'NODE_OPTIONS', 'NPM_CONFIG_PREFIX',
14
+ ];
15
+ function buildAgentEnv(extra) {
16
+ const env = {};
17
+ for (const key of ENV_ALLOWLIST) {
18
+ if (process.env[key])
19
+ env[key] = process.env[key];
20
+ }
21
+ return { ...env, ...extra };
22
+ }
23
+ export class HermesHarnessAdapter {
24
+ name = HERMES_AGENT_HARNESS;
25
+ hermesPath;
26
+ hermesModel;
27
+ hermesProvider;
28
+ daemonApiUrl;
29
+ daemonApiToken;
30
+ corpusEnv;
31
+ storePath;
32
+ operatorHermesHome;
33
+ spawnFn;
34
+ constructor(config) {
35
+ this.hermesPath = config.hermesPath ?? 'hermes';
36
+ this.hermesModel = config.hermesModel;
37
+ this.hermesProvider = config.hermesProvider;
38
+ this.daemonApiUrl = config.daemonApiUrl;
39
+ this.daemonApiToken = config.daemonApiToken;
40
+ this.corpusEnv = config.corpusEnv;
41
+ this.storePath = config.storePath;
42
+ this.operatorHermesHome =
43
+ config.operatorHermesHome ?? (process.env['HERMES_HOME']?.trim() || join(homedir(), '.hermes'));
44
+ this.spawnFn = config._spawnFn ?? spawn;
45
+ }
46
+ async runTask(inputs) {
47
+ const hermesHome = inputs.implStateDir;
48
+ const model = inputs.model ?? inputs.claudeModel ?? this.hermesModel;
49
+ // Step 1: bootstrap — seed auth from the operator's home, write config.yaml + .env.
50
+ //
51
+ // The MCP server (`client/src/mcp/server.ts`) reads task identity from a
52
+ // family of `DESIRED_STATE_*` env vars; without them, `submit_typed_payload`
53
+ // fails with `missing_solver_type` and `get_task` returns an empty record.
54
+ // Mirror what claude-code-learner / codex-code-learner adapters do.
55
+ const taskContextJson = (() => {
56
+ const ctx = inputs.taskBody?.['context'];
57
+ if (!ctx || typeof ctx !== 'object')
58
+ return '';
59
+ try {
60
+ return JSON.stringify(ctx);
61
+ }
62
+ catch {
63
+ return '';
64
+ }
65
+ })();
66
+ writePerTaskHermesConfig({
67
+ hermesHome,
68
+ workingDir: inputs.workingDir,
69
+ model,
70
+ provider: this.hermesProvider,
71
+ solverPluginRoots: inputs.pluginRoots ?? [],
72
+ env: {
73
+ storePath: this.storePath,
74
+ daemonApiUrl: this.daemonApiUrl,
75
+ daemonApiToken: this.daemonApiToken,
76
+ corpusEnv: this.corpusEnv,
77
+ task: {
78
+ id: inputs.taskId,
79
+ description: typeof inputs.taskBody?.description === 'string' ? inputs.taskBody.description : '',
80
+ contextJson: taskContextJson,
81
+ role: typeof inputs.taskBody?.role === 'string' ? inputs.taskBody.role : '',
82
+ solverType: inputs.taskBody?.solverType ?? inputs.solverType ?? '',
83
+ restorationRequestId: typeof inputs.taskBody?.restorationRequestId === 'string'
84
+ ? inputs.taskBody.restorationRequestId : '',
85
+ requestId: inputs.requestId ?? inputs.taskId,
86
+ workingDir: inputs.workingDir,
87
+ },
88
+ },
89
+ seedFrom: this.operatorHermesHome,
90
+ });
91
+ // Step 2: build prompt + args.
92
+ //
93
+ // `hermes chat -q <prompt> -Q --yolo --accept-hooks` —
94
+ // -q PROMPT single-query non-interactive mode
95
+ // -Q quiet/programmatic (suppress banner, spinner, tool previews)
96
+ // --yolo bypass dangerous-command approval prompts (hardline floor
97
+ // — rm -rf /, mkfs, sudo password injection, etc. — still
98
+ // blocks even with --yolo). Required for daemon-driven
99
+ // execution: there is no human at a TTY to approve, so
100
+ // without this flag any tirith "warn" or pattern-based
101
+ // "dangerous command" verdict (e.g. git reset --hard,
102
+ // chmod -R 777) drops to the default-deny prompt path and
103
+ // the agent dead-ends. The per-Task workingDir is a fresh
104
+ // sandboxed tmpdir, so blast radius is bounded.
105
+ // --accept-hooks auto-approve any unseen shell hooks (config.yaml
106
+ // `hooks:` declarations) without a TTY prompt.
107
+ // Model/provider passed when the daemon or SolverNet config specifies
108
+ // them; otherwise Hermes resolves from $HERMES_HOME/config.yaml. No `-w`
109
+ // flag — `hermes chat` has `--worktree` (a boolean that makes Hermes
110
+ // create a git worktree, which we do NOT want); the working directory is
111
+ // set via the spawn cwd + `terminal.cwd` in the per-Task config.yaml.
112
+ const prompt = buildInitialPrompt(inputs);
113
+ const args = ['chat', '-q', prompt, '-Q', '--yolo', '--accept-hooks'];
114
+ if (model) {
115
+ args.push('--model', model);
116
+ }
117
+ if (this.hermesProvider) {
118
+ args.push('--provider', this.hermesProvider);
119
+ }
120
+ const env = buildAgentEnv({
121
+ HERMES_HOME: hermesHome,
122
+ });
123
+ const spawnOpts = {
124
+ stdio: ['ignore', 'pipe', 'pipe'],
125
+ env,
126
+ cwd: inputs.workingDir,
127
+ };
128
+ // Step 3: spawn + lifecycle
129
+ return new Promise((resolvePromise, reject) => {
130
+ const logDir = join(inputs.workingDir, '.hermes-agent');
131
+ mkdirSync(logDir, { recursive: true });
132
+ const stdoutLog = createWriteStream(join(logDir, 'stdout.log'), { flags: 'a' });
133
+ const stderrLog = createWriteStream(join(logDir, 'stderr.log'), { flags: 'a' });
134
+ const closeLogs = async () => {
135
+ if (!stdoutLog.writableEnded)
136
+ stdoutLog.end();
137
+ if (!stderrLog.writableEnded)
138
+ stderrLog.end();
139
+ await Promise.all([finished(stdoutLog), finished(stderrLog)]);
140
+ };
141
+ const child = this.spawnFn(this.hermesPath, args, spawnOpts);
142
+ if (inputs.abort.aborted) {
143
+ if (!child.killed)
144
+ child.kill('SIGTERM');
145
+ }
146
+ const onAbort = () => {
147
+ if (!child.killed)
148
+ child.kill('SIGTERM');
149
+ };
150
+ inputs.abort.addEventListener('abort', onAbort);
151
+ let stderr = '';
152
+ child.stdout?.on('data', (d) => stdoutLog.write(d));
153
+ child.stderr?.on('data', (d) => {
154
+ stderrLog.write(d);
155
+ stderr += d.toString();
156
+ });
157
+ let settled = false;
158
+ const settle = (cb, onLogErr = reject) => {
159
+ if (settled)
160
+ return;
161
+ settled = true;
162
+ inputs.abort.removeEventListener('abort', onAbort);
163
+ closeLogs().then(cb, onLogErr);
164
+ };
165
+ child.on('exit', (code, signal) => {
166
+ settle(() => {
167
+ if (code === 0) {
168
+ resolvePromise();
169
+ }
170
+ else if (inputs.abort.aborted) {
171
+ resolvePromise(); // graceful-abort exits are success
172
+ }
173
+ else {
174
+ reject(new Error(`hermes-agent: child exited code=${code} signal=${signal}: ${stderr.slice(0, 500)}`));
175
+ }
176
+ });
177
+ });
178
+ child.on('error', (err) => {
179
+ settle(() => reject(err), () => reject(err));
180
+ });
181
+ });
182
+ }
183
+ }
184
+ //# sourceMappingURL=adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../../../src/harnesses/impls/hermes-agent/adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { type ConfigBuilderEnv } from './config-builder.js';
2
+ export interface WritePerTaskConfigInputs {
3
+ hermesHome: string;
4
+ workingDir: string;
5
+ model?: string;
6
+ provider?: string;
7
+ solverPluginRoots: readonly string[];
8
+ env: ConfigBuilderEnv;
9
+ /**
10
+ * The operator's real Hermes home (typically `process.env.HERMES_HOME` or
11
+ * `~/.hermes`). The operator's `config.yaml`, `.env`, and `auth/` are
12
+ * inherited from here — see the merge contract in `mergePerTaskConfig`.
13
+ * Omit (or pass a path equal to `hermesHome`) to skip inheritance — useful
14
+ * in tests.
15
+ */
16
+ seedFrom?: string;
17
+ }
18
+ export declare function writePerTaskHermesConfig(inputs: WritePerTaskConfigInputs): void;
@@ -0,0 +1,231 @@
1
+ // client/src/harnesses/impls/hermes-agent/bootstrap.ts
2
+ import { cpSync, existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
3
+ import { join } from 'node:path';
4
+ import { parse as yamlParse, stringify as yamlStringify } from 'yaml';
5
+ import { hermesConfigFromSolverPlugins, } from './config-builder.js';
6
+ /**
7
+ * Toolset allowlist for Jinn-run Hermes sessions.
8
+ *
9
+ * Hermes's default-ON toolset surface is broader than Claude Code's built-ins
10
+ * and includes footguns under unattended automation (`messaging` can send
11
+ * messages; `cronjob` can schedule things; `computer_use`, `browser`,
12
+ * `tts`/`vision`/`image_gen` are out of scope for text code-issue tasks). We
13
+ * pin an explicit allowlist for `hermes-cli` (the platform Jinn spawns Hermes
14
+ * as); operators who want to expand it for a Jinn task can request a daemon
15
+ * config option later — they can NOT widen the allowlist by editing their
16
+ * `~/.hermes/config.yaml`'s `platform_toolsets.hermes-cli` because Jinn
17
+ * deliberately replaces that key (other `platform_toolsets.*` entries — e.g.
18
+ * for `hermes-telegram` — pass through unchanged).
19
+ */
20
+ const TOOLSET_ALLOWLIST = [
21
+ 'terminal',
22
+ 'file',
23
+ 'web',
24
+ 'skills',
25
+ 'memory',
26
+ 'session_search',
27
+ 'todo',
28
+ 'code_execution',
29
+ ];
30
+ /**
31
+ * Files copied verbatim from the operator's real Hermes home into the per-Task
32
+ * `$HERMES_HOME`. Hermes resolves OAuth creds from `$HERMES_HOME/auth/...` and
33
+ * pooled creds from `$HERMES_HOME/auth.json` with NO real-home fallback, so a
34
+ * fresh per-Task home (which the freeze contract requires) would otherwise
35
+ * have no credentials and Hermes would fail with "No … credentials found."
36
+ *
37
+ * `bin/` carries Hermes-managed binaries — most importantly `bin/tirith`, the
38
+ * shell-command security scanner Hermes runs before every `terminal_tool`
39
+ * invocation. Hermes resolves it from `$HERMES_HOME/bin/tirith` and falls back
40
+ * to an auto-download from `github.com/sheeki03/tirith/releases/latest` on
41
+ * first use. Without seeding, every per-Task run pays the multi-MB download
42
+ * cost on its first shell command — long enough to blow the harness budget.
43
+ *
44
+ * Hermes may refresh OAuth access tokens mid-task. The HermesHarness excludes
45
+ * these runtime-only files from the daemon state digest while still fencing the
46
+ * learning surface (memories/, skills/, sessions/, and ordinary files). The
47
+ * binary exception is intentionally limited to Hermes's managed `bin/tirith`
48
+ * security scanner instead of the whole `bin/` tree.
49
+ */
50
+ const OPERATOR_STATE_TO_SEED = ['auth', 'auth.json', 'bin'];
51
+ function seedOperatorState(hermesHome, seedFrom) {
52
+ if (seedFrom === hermesHome || !existsSync(seedFrom))
53
+ return;
54
+ for (const name of OPERATOR_STATE_TO_SEED) {
55
+ const src = join(seedFrom, name);
56
+ const dst = join(hermesHome, name);
57
+ if (existsSync(src) && !existsSync(dst)) {
58
+ cpSync(src, dst, { recursive: true });
59
+ }
60
+ }
61
+ }
62
+ // ────────────────────────────────────────────────────────────────────────────
63
+ // Operator config.yaml inheritance — the merge contract.
64
+ // ────────────────────────────────────────────────────────────────────────────
65
+ //
66
+ // Goal: anything the operator set in `~/.hermes/config.yaml` flows into the
67
+ // per-Task config, EXCEPT for the small set of keys Jinn must own per Task.
68
+ // This is the comprehensive form of operator-config inheritance — it replaces
69
+ // the prior "fresh per-Task config with hand-written Jinn fields only" path,
70
+ // which was a whack-a-mole source (auth/, then .env, then max_tokens; each
71
+ // real-binary run surfaced another orphaned setting). With the merge, ANY
72
+ // operator setting (model.max_tokens, model.context_length, model.base_url,
73
+ // provider_routing, openrouter.response_cache, agent.iteration_budget,
74
+ // compression.threshold, auxiliary.*, display.*, voice.*, security.*,
75
+ // approvals.*, delegation.*, web.*, custom providers: overrides, etc.) just
76
+ // flows through.
77
+ //
78
+ // Jinn-managed keys (per-Task authoritative; Jinn writes these every Task):
79
+ // - model.default — if a daemon/SolverNet override was provided
80
+ // - model.provider — if a daemon/SolverNet override was provided
81
+ // - terminal.backend — forced to `local` (the per-Task workingDir is a
82
+ // host filesystem path; remote backends would need
83
+ // additional setup Jinn doesn't yet do)
84
+ // - terminal.cwd — the per-Task workingDir
85
+ // - platform_toolsets['hermes-cli'] — the Jinn allowlist (replaces any
86
+ // operator value; other platforms pass through)
87
+ // - mcp_servers.<name> — operator's MCP servers preserved; Jinn adds its
88
+ // SolverPlugin MCP servers; Jinn wins on collision
89
+ // - skills.external_dirs — operator's dirs preserved; Jinn appends the
90
+ // SolverPlugin skill dirs
91
+ //
92
+ // Everything else from the operator's config.yaml passes through unchanged.
93
+ //
94
+ // Operator-set keys that DO inherit and matter for budget-capped providers:
95
+ // - model.max_tokens — OpenRouter pre-bills on max_tokens; operators
96
+ // with low monthly caps must lower this to fit.
97
+ // - model.context_length — total context window cap.
98
+ // - provider_routing — OpenRouter routing knobs (sort by price, etc.).
99
+ // - providers.<name> — per-provider timeout / model-specific overrides.
100
+ function isObj(v) {
101
+ return typeof v === 'object' && v !== null && !Array.isArray(v);
102
+ }
103
+ function readOperatorConfigYaml(seedFrom) {
104
+ const path = join(seedFrom, 'config.yaml');
105
+ if (!existsSync(path))
106
+ return {};
107
+ try {
108
+ const text = readFileSync(path, 'utf8');
109
+ const parsed = yamlParse(text);
110
+ return isObj(parsed) ? parsed : {};
111
+ }
112
+ catch {
113
+ // Operator config is unparseable — proceed with Jinn-only. Hermes would
114
+ // also fail to read it, so this isn't hiding any real signal.
115
+ return {};
116
+ }
117
+ }
118
+ function mergePerTaskConfig(operator, jinn, opts) {
119
+ const out = { ...operator };
120
+ // model: deep-merge — operator's max_tokens/context_length/base_url/
121
+ // provider_routing/etc. preserved; Jinn overrides default+provider only if
122
+ // specified by daemon/SolverNet config.
123
+ if (opts.model || opts.provider || isObj(out.model)) {
124
+ const opModel = isObj(out.model) ? out.model : {};
125
+ const jinnModel = {};
126
+ if (opts.model)
127
+ jinnModel.default = opts.model;
128
+ if (opts.provider)
129
+ jinnModel.provider = opts.provider;
130
+ out.model = { ...opModel, ...jinnModel };
131
+ }
132
+ // terminal: Jinn forces backend + cwd; operator's timeout / lifetime /
133
+ // sudo_password / docker_* fields preserved (the docker_* fields are inert
134
+ // under `backend: local`, which is fine).
135
+ const opTerminal = isObj(out.terminal) ? out.terminal : {};
136
+ out.terminal = {
137
+ ...opTerminal,
138
+ backend: 'local',
139
+ cwd: opts.workingDir,
140
+ };
141
+ // platform_toolsets: Jinn enforces its allowlist for the `hermes-cli`
142
+ // platform (the platform Jinn spawns Hermes as); other platforms
143
+ // (hermes-telegram, etc.) pass through unchanged.
144
+ const opPlatformToolsets = isObj(out.platform_toolsets) ? out.platform_toolsets : {};
145
+ out.platform_toolsets = {
146
+ ...opPlatformToolsets,
147
+ 'hermes-cli': [...TOOLSET_ALLOWLIST],
148
+ };
149
+ // mcp_servers: operator's MCP servers preserved; Jinn adds its SolverPlugin
150
+ // MCP servers via key-merge (Jinn wins on name collision — the SolverPlugin
151
+ // MCP definition is the authority on what `jinn-client` etc. mean).
152
+ if (jinn.mcp_servers && Object.keys(jinn.mcp_servers).length > 0) {
153
+ const opMcp = isObj(out.mcp_servers) ? out.mcp_servers : {};
154
+ out.mcp_servers = { ...opMcp, ...jinn.mcp_servers };
155
+ }
156
+ // skills.external_dirs: operator's dirs preserved; Jinn appends SolverPlugin
157
+ // skill dirs. Duplicates de-duped (preserves order — operator first).
158
+ if (jinn.skills?.external_dirs && jinn.skills.external_dirs.length > 0) {
159
+ const opSkills = isObj(out.skills) ? out.skills : {};
160
+ const opDirs = Array.isArray(opSkills.external_dirs)
161
+ ? opSkills.external_dirs.filter((d) => typeof d === 'string')
162
+ : [];
163
+ const merged = [...opDirs];
164
+ for (const d of jinn.skills.external_dirs) {
165
+ if (!merged.includes(d))
166
+ merged.push(d);
167
+ }
168
+ out.skills = { ...opSkills, external_dirs: merged };
169
+ }
170
+ return out;
171
+ }
172
+ function snippetToEnvFile(env) {
173
+ const lines = [];
174
+ lines.push(`DAEMON_API_URL=${env.daemonApiUrl}`);
175
+ lines.push(`DAEMON_API_TOKEN=${env.daemonApiToken}`);
176
+ if (env.storePath)
177
+ lines.push(`STORE_PATH=${env.storePath}`);
178
+ if (env.corpusEnv.subgraphUrl)
179
+ lines.push(`JINN_CORPUS_SUBGRAPH_URL=${env.corpusEnv.subgraphUrl}`);
180
+ if (env.corpusEnv.ipfsGatewayUrl)
181
+ lines.push(`JINN_CORPUS_IPFS_GATEWAY_URL=${env.corpusEnv.ipfsGatewayUrl}`);
182
+ if (env.corpusEnv.rpcUrl)
183
+ lines.push(`JINN_CORPUS_RPC_URL=${env.corpusEnv.rpcUrl}`);
184
+ if (env.corpusEnv.chainId != null)
185
+ lines.push(`JINN_CORPUS_CHAIN_ID=${env.corpusEnv.chainId}`);
186
+ if (env.corpusEnv.identityRegistryAddress)
187
+ lines.push(`JINN_CORPUS_IDENTITY_REGISTRY_ADDRESS=${env.corpusEnv.identityRegistryAddress}`);
188
+ if (env.corpusEnv.fromBlock != null)
189
+ lines.push(`JINN_CORPUS_FROM_BLOCK=${env.corpusEnv.fromBlock}`);
190
+ return lines.join('\n') + '\n';
191
+ }
192
+ export function writePerTaskHermesConfig(inputs) {
193
+ mkdirSync(inputs.hermesHome, { recursive: true });
194
+ if (inputs.seedFrom) {
195
+ seedOperatorState(inputs.hermesHome, inputs.seedFrom);
196
+ }
197
+ const operator = inputs.seedFrom ? readOperatorConfigYaml(inputs.seedFrom) : {};
198
+ const snippet = hermesConfigFromSolverPlugins(inputs.solverPluginRoots, inputs.env);
199
+ const merged = mergePerTaskConfig(operator, snippet, {
200
+ model: inputs.model,
201
+ provider: inputs.provider,
202
+ workingDir: inputs.workingDir,
203
+ });
204
+ writeFileSync(join(inputs.hermesHome, 'config.yaml'), yamlStringify(merged, { lineWidth: 0 }), 'utf8');
205
+ // Per-Task .env = operator's .env (provider API keys, debug toggles, etc.)
206
+ // + Jinn-runtime keys. Jinn keys go LAST so they win on duplicate names
207
+ // (most dotenv loaders use last-wins; Hermes uses python-dotenv). Without
208
+ // the operator's keys, Jinn-run Hermes can't authenticate to any provider
209
+ // except google-gemini-cli (whose OAuth creds are seeded via auth/), so
210
+ // Hermes-as-default with OpenRouter / Anthropic / etc. requires this merge.
211
+ const operatorEnv = inputs.seedFrom ? readOperatorEnvFile(inputs.seedFrom) : '';
212
+ const trailingNewline = operatorEnv.endsWith('\n') ? '' : '\n';
213
+ const header = operatorEnv
214
+ ? `${operatorEnv}${trailingNewline}# --- Jinn-runtime keys (per-Task, override any operator entries above) ---\n`
215
+ : '';
216
+ const envFile = header + snippetToEnvFile(inputs.env);
217
+ writeFileSync(join(inputs.hermesHome, '.env'), envFile, 'utf8');
218
+ }
219
+ function readOperatorEnvFile(seedFrom) {
220
+ const path = join(seedFrom, '.env');
221
+ if (!existsSync(path))
222
+ return '';
223
+ try {
224
+ return readFileSync(path, 'utf8');
225
+ }
226
+ catch {
227
+ // Permissions / race — better to proceed with just Jinn keys than crash.
228
+ return '';
229
+ }
230
+ }
231
+ //# sourceMappingURL=bootstrap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../../../src/harnesses/impls/hermes-agent/bootstrap.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ export interface McpStdioServer {
2
+ command: string;
3
+ args: string[];
4
+ cwd?: string;
5
+ env?: Record<string, string>;
6
+ }
7
+ export interface McpHttpServer {
8
+ url: string;
9
+ headers?: Record<string, string>;
10
+ }
11
+ export type McpServer = McpStdioServer | McpHttpServer;
12
+ export interface HermesConfigSnippet {
13
+ mcp_servers?: Record<string, McpServer>;
14
+ skills?: {
15
+ external_dirs?: string[];
16
+ };
17
+ }
18
+ export interface ConfigBuilderEnv {
19
+ storePath?: string;
20
+ daemonApiUrl: string;
21
+ daemonApiToken: string;
22
+ corpusEnv: {
23
+ subgraphUrl?: string;
24
+ ipfsGatewayUrl?: string;
25
+ rpcUrl?: string;
26
+ chainId?: number;
27
+ identityRegistryAddress?: string;
28
+ fromBlock?: number;
29
+ };
30
+ /**
31
+ * Active-task identifiers injected into MCP server env so jinn-client tools
32
+ * (get_task, submit_typed_payload, …) know which Task they are operating on.
33
+ * Mirrors what claude-code and codex-code adapters thread through in
34
+ * `buildSubprocessEnv`. When unset (e.g. unit tests), the MCP server returns
35
+ * a default empty task — fine for tests, broken for live runs.
36
+ */
37
+ task?: {
38
+ id?: string;
39
+ description?: string;
40
+ /** Already-stringified JSON of `taskBody.context`; empty string when absent. */
41
+ contextJson?: string;
42
+ role?: string;
43
+ solverType?: string;
44
+ restorationRequestId?: string;
45
+ requestId?: string;
46
+ workingDir?: string;
47
+ };
48
+ }
49
+ export declare function hermesConfigFromSolverPlugins(roots: readonly string[], env: ConfigBuilderEnv): HermesConfigSnippet;
@@ -0,0 +1,104 @@
1
+ // client/src/harnesses/impls/hermes-agent/config-builder.ts
2
+ import { existsSync, readFileSync } from 'node:fs';
3
+ import { isAbsolute, join, resolve } from 'node:path';
4
+ function buildJinnRuntimeEnv(env) {
5
+ const out = {
6
+ DAEMON_API_URL: env.daemonApiUrl,
7
+ DAEMON_API_TOKEN: env.daemonApiToken,
8
+ };
9
+ if (env.storePath)
10
+ out.STORE_PATH = env.storePath;
11
+ if (env.corpusEnv.subgraphUrl)
12
+ out.JINN_CORPUS_SUBGRAPH_URL = env.corpusEnv.subgraphUrl;
13
+ if (env.corpusEnv.ipfsGatewayUrl)
14
+ out.JINN_CORPUS_IPFS_GATEWAY_URL = env.corpusEnv.ipfsGatewayUrl;
15
+ if (env.corpusEnv.rpcUrl)
16
+ out.JINN_CORPUS_RPC_URL = env.corpusEnv.rpcUrl;
17
+ if (env.corpusEnv.chainId != null)
18
+ out.JINN_CORPUS_CHAIN_ID = String(env.corpusEnv.chainId);
19
+ if (env.corpusEnv.identityRegistryAddress) {
20
+ out.JINN_CORPUS_IDENTITY_REGISTRY_ADDRESS = env.corpusEnv.identityRegistryAddress;
21
+ }
22
+ if (env.corpusEnv.fromBlock != null)
23
+ out.JINN_CORPUS_FROM_BLOCK = String(env.corpusEnv.fromBlock);
24
+ // Active-task env — read by the jinn-client MCP server in
25
+ // `client/src/mcp/server.ts` to populate the `task` runtime context. Without
26
+ // these, submit_typed_payload errors with `missing_solver_type` and get_task
27
+ // returns an empty record.
28
+ if (env.task) {
29
+ if (env.task.id)
30
+ out.DESIRED_STATE_ID = env.task.id;
31
+ if (env.task.description)
32
+ out.DESIRED_STATE_DESCRIPTION = env.task.description;
33
+ if (env.task.contextJson)
34
+ out.DESIRED_STATE_CONTEXT = env.task.contextJson;
35
+ if (env.task.role)
36
+ out.DESIRED_STATE_ROLE = env.task.role;
37
+ if (env.task.solverType)
38
+ out.DESIRED_STATE_SOLVER_TYPE = env.task.solverType;
39
+ if (env.task.restorationRequestId)
40
+ out.RESTORATION_REQUEST_ID = env.task.restorationRequestId;
41
+ if (env.task.requestId)
42
+ out.REQUEST_ID = env.task.requestId;
43
+ if (env.task.workingDir)
44
+ out.JINN_WORKING_DIR = env.task.workingDir;
45
+ }
46
+ return out;
47
+ }
48
+ function resolvePathTemplate(value, pluginRoot) {
49
+ // Resolve ${CLAUDE_PLUGIN_ROOT} / ${CODEX_PLUGIN_ROOT} → pluginRoot,
50
+ // then resolve relative paths against pluginRoot.
51
+ const substituted = value
52
+ .replaceAll('${CLAUDE_PLUGIN_ROOT}', pluginRoot)
53
+ .replaceAll('${CODEX_PLUGIN_ROOT}', pluginRoot);
54
+ if (isAbsolute(substituted))
55
+ return substituted;
56
+ return resolve(pluginRoot, substituted);
57
+ }
58
+ function translateMcpFromFile(pluginRoot, jinnEnv) {
59
+ const mcpFile = join(pluginRoot, '.mcp.json');
60
+ if (!existsSync(mcpFile))
61
+ return {};
62
+ const raw = JSON.parse(readFileSync(mcpFile, 'utf8'));
63
+ const servers = raw.mcpServers ?? {};
64
+ const out = {};
65
+ for (const [name, server] of Object.entries(servers)) {
66
+ if ('url' in server) {
67
+ // HTTP MCP — pass through unchanged (no path resolution needed)
68
+ out[name] = { url: server.url, ...(server.headers ? { headers: server.headers } : {}) };
69
+ continue;
70
+ }
71
+ // Stdio MCP — resolve paths and merge env
72
+ const resolvedArgs = server.args.map((a) => resolvePathTemplate(a, pluginRoot));
73
+ const resolvedCwd = server.cwd ? resolvePathTemplate(server.cwd, pluginRoot) : pluginRoot;
74
+ out[name] = {
75
+ command: server.command,
76
+ args: resolvedArgs,
77
+ cwd: resolvedCwd,
78
+ env: { ...jinnEnv, ...(server.env ?? {}) },
79
+ };
80
+ }
81
+ return out;
82
+ }
83
+ function translateSkillsDir(pluginRoot) {
84
+ const skillsDir = join(pluginRoot, 'skills');
85
+ return existsSync(skillsDir) ? skillsDir : null;
86
+ }
87
+ export function hermesConfigFromSolverPlugins(roots, env) {
88
+ const jinnEnv = buildJinnRuntimeEnv(env);
89
+ const mcpServers = {};
90
+ const externalDirs = [];
91
+ for (const root of roots) {
92
+ Object.assign(mcpServers, translateMcpFromFile(root, jinnEnv));
93
+ const skills = translateSkillsDir(root);
94
+ if (skills)
95
+ externalDirs.push(skills);
96
+ }
97
+ const snippet = {};
98
+ if (Object.keys(mcpServers).length > 0)
99
+ snippet.mcp_servers = mcpServers;
100
+ if (externalDirs.length > 0)
101
+ snippet.skills = { external_dirs: externalDirs };
102
+ return snippet;
103
+ }
104
+ //# sourceMappingURL=config-builder.js.map