niceeval 0.15.1-canary.76 → 0.16.1

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 (714) hide show
  1. package/INDEX.md +45 -40
  2. package/dist/adapter-execution-trace.cjs.map +1 -1
  3. package/dist/adapter-execution-trace.d.cts +26 -0
  4. package/dist/adapter-execution-trace.d.mts +26 -0
  5. package/dist/adapter-execution-trace.d.ts +26 -0
  6. package/dist/adapter-usage.cjs.map +1 -1
  7. package/dist/adapter-usage.d.cts +9 -0
  8. package/dist/adapter-usage.d.mts +9 -0
  9. package/dist/adapter-usage.d.ts +9 -0
  10. package/dist/adapter.cjs +19 -4
  11. package/dist/adapter.cjs.map +1 -1
  12. package/dist/adapter.d.cts +37 -12
  13. package/dist/adapter.d.mts +37 -12
  14. package/dist/adapter.d.ts +37 -12
  15. package/dist/agents/ai-sdk.cjs +3 -0
  16. package/dist/agents/ai-sdk.cjs.map +1 -1
  17. package/dist/agents/bub.cjs +3 -0
  18. package/dist/agents/bub.cjs.map +1 -1
  19. package/dist/agents/claude-code-native.cjs +28 -2
  20. package/dist/agents/claude-code-native.cjs.map +1 -1
  21. package/dist/agents/claude-code.cjs +3 -0
  22. package/dist/agents/claude-code.cjs.map +1 -1
  23. package/dist/agents/codex.cjs +3 -0
  24. package/dist/agents/codex.cjs.map +1 -1
  25. package/dist/agents/coding-cli-versions.cjs +9 -10
  26. package/dist/agents/coding-cli-versions.cjs.map +1 -1
  27. package/dist/agents/coding-cli-versions.d.cts +1 -1
  28. package/dist/agents/coding-cli-versions.d.mts +1 -1
  29. package/dist/agents/coding-cli-versions.d.ts +1 -1
  30. package/dist/agents/deepseek-harness.cjs +3 -0
  31. package/dist/agents/deepseek-harness.cjs.map +1 -1
  32. package/dist/agents/hermes.cjs +3 -0
  33. package/dist/agents/hermes.cjs.map +1 -1
  34. package/dist/agents/index.cjs.map +1 -1
  35. package/dist/agents/index.d.cts +3 -2
  36. package/dist/agents/index.d.mts +3 -2
  37. package/dist/agents/index.d.ts +3 -2
  38. package/dist/agents/omp.cjs +3 -0
  39. package/dist/agents/omp.cjs.map +1 -1
  40. package/dist/agents/openai-compat.cjs +6 -0
  41. package/dist/agents/openai-compat.cjs.map +1 -1
  42. package/dist/agents/openclaw.cjs +3 -0
  43. package/dist/agents/openclaw.cjs.map +1 -1
  44. package/dist/agents/opencode.cjs +3 -0
  45. package/dist/agents/opencode.cjs.map +1 -1
  46. package/dist/agents/sdk-streams.cjs +9 -0
  47. package/dist/agents/sdk-streams.cjs.map +1 -1
  48. package/dist/agents/ui-message-stream.cjs +3 -0
  49. package/dist/agents/ui-message-stream.cjs.map +1 -1
  50. package/dist/assertions/api.cjs.map +1 -1
  51. package/dist/assertions/api.d.cts +27 -5
  52. package/dist/assertions/api.d.mts +27 -5
  53. package/dist/assertions/api.d.ts +27 -5
  54. package/dist/assertions/collection.cjs +6 -0
  55. package/dist/assertions/collection.cjs.map +1 -1
  56. package/dist/assertions/collection.d.cts +4 -2
  57. package/dist/assertions/collection.d.mts +4 -2
  58. package/dist/assertions/collection.d.ts +4 -2
  59. package/dist/assertions/collection.js +12 -8
  60. package/dist/assertions/context-match.cjs +70 -0
  61. package/dist/assertions/context-match.cjs.map +1 -0
  62. package/dist/assertions/context-match.d.cts +107 -0
  63. package/dist/assertions/context-match.d.mts +107 -0
  64. package/dist/assertions/context-match.d.ts +107 -0
  65. package/dist/assertions/context-match.js +12 -0
  66. package/dist/assertions/context-match.js.map +1 -0
  67. package/dist/assertions/full-content.cjs +109 -0
  68. package/dist/assertions/full-content.cjs.map +1 -0
  69. package/dist/assertions/full-content.d.cts +6 -0
  70. package/dist/assertions/full-content.d.mts +6 -0
  71. package/dist/assertions/full-content.d.ts +6 -0
  72. package/dist/assertions/full-content.js +12 -0
  73. package/dist/assertions/full-content.js.map +1 -0
  74. package/dist/assertions/judge-presets.cjs +2 -34
  75. package/dist/assertions/judge-presets.cjs.map +1 -1
  76. package/dist/assertions/judge-presets.d.cts +6 -9
  77. package/dist/assertions/judge-presets.d.mts +6 -9
  78. package/dist/assertions/judge-presets.d.ts +6 -9
  79. package/dist/assertions/judge-presets.js +8 -8
  80. package/dist/assertions/judge.cjs +107 -29
  81. package/dist/assertions/judge.cjs.map +1 -1
  82. package/dist/assertions/judge.d.cts +2 -0
  83. package/dist/assertions/judge.d.mts +2 -0
  84. package/dist/assertions/judge.d.ts +2 -0
  85. package/dist/assertions/match.cjs +244 -5
  86. package/dist/assertions/match.cjs.map +1 -1
  87. package/dist/assertions/match.d.cts +43 -3
  88. package/dist/assertions/match.d.mts +43 -3
  89. package/dist/assertions/match.d.ts +43 -3
  90. package/dist/assertions/match.js +88 -78
  91. package/dist/assertions/material.cjs +520 -0
  92. package/dist/assertions/material.cjs.map +1 -0
  93. package/dist/assertions/material.d.cts +56 -0
  94. package/dist/assertions/material.d.mts +56 -0
  95. package/dist/assertions/material.d.ts +56 -0
  96. package/dist/assertions/material.js +20 -0
  97. package/dist/assertions/material.js.map +1 -0
  98. package/dist/assertions/record/attachment.cjs +5 -2
  99. package/dist/assertions/record/attachment.cjs.map +1 -1
  100. package/dist/assertions/record/codec.cjs +2 -1
  101. package/dist/assertions/record/codec.cjs.map +1 -1
  102. package/dist/assertions/record/model.cjs.map +1 -1
  103. package/dist/assertions/record/model.d.cts +6 -1
  104. package/dist/assertions/record/model.d.mts +6 -1
  105. package/dist/assertions/record/model.d.ts +6 -1
  106. package/dist/assertions/runtime.cjs +207 -14
  107. package/dist/assertions/runtime.cjs.map +1 -1
  108. package/dist/assertions/runtime.d.cts +9 -0
  109. package/dist/assertions/runtime.d.mts +9 -0
  110. package/dist/assertions/runtime.d.ts +9 -0
  111. package/dist/assertions/runtime.js +14 -8
  112. package/dist/assertions/score-match-audit.cjs +18 -8
  113. package/dist/assertions/score-match-audit.cjs.map +1 -1
  114. package/dist/assertions/score-match-gateway.cjs +83 -25
  115. package/dist/assertions/score-match-gateway.cjs.map +1 -1
  116. package/dist/assertions/score-match-gateway.d.cts +2 -0
  117. package/dist/assertions/score-match-gateway.d.mts +2 -0
  118. package/dist/assertions/score-match-gateway.d.ts +2 -0
  119. package/dist/assertions/value-composition.test-d.cjs +77 -0
  120. package/dist/assertions/value-composition.test-d.cjs.map +1 -0
  121. package/dist/assertions/value-composition.test-d.d.cts +1 -0
  122. package/dist/assertions/value-composition.test-d.d.mts +1 -0
  123. package/dist/assertions/value-composition.test-d.d.ts +1 -0
  124. package/dist/assertions/value-composition.test-d.js +4 -0
  125. package/dist/assertions/value-composition.test-d.js.map +1 -0
  126. package/dist/context/assert-first.cjs +207 -213
  127. package/dist/context/assert-first.cjs.map +1 -1
  128. package/dist/context/assert-first.d.cts +49 -23
  129. package/dist/context/assert-first.d.mts +49 -23
  130. package/dist/context/assert-first.d.ts +49 -23
  131. package/dist/context/session.cjs +111 -9
  132. package/dist/context/session.cjs.map +1 -1
  133. package/dist/context/session.d.cts +18 -0
  134. package/dist/context/session.d.mts +18 -0
  135. package/dist/context/session.d.ts +18 -0
  136. package/dist/define.cjs +17 -1
  137. package/dist/define.cjs.map +1 -1
  138. package/dist/eval/cli/contribution.cjs +2 -0
  139. package/dist/eval/cli/contribution.cjs.map +1 -1
  140. package/dist/eval/host/index.cjs +2 -0
  141. package/dist/eval/host/index.cjs.map +1 -1
  142. package/dist/eval/record/evaluation.cjs +3 -0
  143. package/dist/eval/record/evaluation.cjs.map +1 -1
  144. package/dist/eval/record/membership-provenance.d.cts +15 -15
  145. package/dist/eval/record/membership-provenance.d.mts +15 -15
  146. package/dist/eval/record/membership-provenance.d.ts +15 -15
  147. package/dist/eval/record/score.cjs +7 -0
  148. package/dist/eval/record/score.cjs.map +1 -1
  149. package/dist/eval/record/sealed-assertion.cjs +3 -0
  150. package/dist/eval/record/sealed-assertion.cjs.map +1 -1
  151. package/dist/eval/record/verdict.cjs +7 -0
  152. package/dist/eval/record/verdict.cjs.map +1 -1
  153. package/dist/expect/index.cjs +8 -2
  154. package/dist/expect/index.cjs.map +1 -1
  155. package/dist/expect/index.d.cts +9 -4
  156. package/dist/expect/index.d.mts +9 -4
  157. package/dist/expect/index.d.ts +9 -4
  158. package/dist/expect/index.js +72 -62
  159. package/dist/expect/index.mjs +72 -62
  160. package/dist/experiment/host/cli/contribution.cjs +37 -23
  161. package/dist/experiment/host/cli/contribution.cjs.map +1 -1
  162. package/dist/experiment/host/cli/contribution.d.cts +9 -1
  163. package/dist/experiment/host/cli/contribution.d.mts +9 -1
  164. package/dist/experiment/host/cli/contribution.d.ts +9 -1
  165. package/dist/experiment/host/current.cjs +74 -0
  166. package/dist/experiment/host/current.cjs.map +1 -0
  167. package/dist/experiment/host/current.d.cts +33 -0
  168. package/dist/experiment/host/current.d.mts +33 -0
  169. package/dist/experiment/host/current.d.ts +33 -0
  170. package/dist/experiment/host/current.js +10 -0
  171. package/dist/experiment/host/current.js.map +1 -0
  172. package/dist/experiment/host/index.cjs +17 -174
  173. package/dist/experiment/host/index.cjs.map +1 -1
  174. package/dist/experiment/host/index.d.cts +8 -54
  175. package/dist/experiment/host/index.d.mts +8 -54
  176. package/dist/experiment/host/index.d.ts +8 -54
  177. package/dist/experiment/host/operations.cjs +33 -10
  178. package/dist/experiment/host/operations.cjs.map +1 -1
  179. package/dist/experiment/host/operations.d.cts +29 -1
  180. package/dist/experiment/host/operations.d.mts +29 -1
  181. package/dist/experiment/host/operations.d.ts +29 -1
  182. package/dist/experiment/host/operations.js +6 -4
  183. package/dist/experiment/host/requirements.cjs +3 -0
  184. package/dist/experiment/host/requirements.cjs.map +1 -0
  185. package/dist/experiment/host/requirements.d.cts +3 -0
  186. package/dist/experiment/host/requirements.d.mts +3 -0
  187. package/dist/experiment/host/requirements.d.ts +3 -0
  188. package/dist/experiment/host/requirements.js +4 -0
  189. package/dist/experiment/host/requirements.js.map +1 -0
  190. package/dist/experiment/host/runtime.cjs +179 -0
  191. package/dist/experiment/host/runtime.cjs.map +1 -0
  192. package/dist/experiment/host/runtime.d.cts +79 -0
  193. package/dist/experiment/host/runtime.d.mts +79 -0
  194. package/dist/experiment/host/runtime.d.ts +79 -0
  195. package/dist/experiment/host/runtime.js +6 -0
  196. package/dist/experiment/host/runtime.js.map +1 -0
  197. package/dist/experiment/host/types.cjs.map +1 -1
  198. package/dist/experiment/host/types.d.cts +17 -16
  199. package/dist/experiment/host/types.d.mts +17 -16
  200. package/dist/experiment/host/types.d.ts +17 -16
  201. package/dist/fresh-import.cjs +2 -1
  202. package/dist/fresh-import.cjs.map +1 -1
  203. package/dist/index.cjs +4 -2
  204. package/dist/index.cjs.map +1 -1
  205. package/dist/index.d.cts +12 -6
  206. package/dist/index.d.mts +12 -6
  207. package/dist/index.d.ts +12 -6
  208. package/dist/index.js +32 -30
  209. package/dist/index.mjs +32 -30
  210. package/dist/inspection/artifacts.cjs +83 -54
  211. package/dist/inspection/artifacts.cjs.map +1 -1
  212. package/dist/inspection/artifacts.d.cts +8 -0
  213. package/dist/inspection/artifacts.d.mts +8 -0
  214. package/dist/inspection/artifacts.d.ts +8 -0
  215. package/dist/inspection/artifacts.js +2 -0
  216. package/dist/inspection/assertions.cjs +4 -1
  217. package/dist/inspection/assertions.cjs.map +1 -1
  218. package/dist/inspection/cli/contribution.cjs +27 -4
  219. package/dist/inspection/cli/contribution.cjs.map +1 -1
  220. package/dist/inspection/cli/contribution.d.cts +2 -1
  221. package/dist/inspection/cli/contribution.d.mts +2 -1
  222. package/dist/inspection/cli/contribution.d.ts +2 -1
  223. package/dist/inspection/execution-traces.cjs +114 -8
  224. package/dist/inspection/execution-traces.cjs.map +1 -1
  225. package/dist/inspection/execution-traces.d.cts +38 -0
  226. package/dist/inspection/execution-traces.d.mts +38 -0
  227. package/dist/inspection/execution-traces.d.ts +38 -0
  228. package/dist/inspection/facts.cjs +12 -0
  229. package/dist/inspection/facts.cjs.map +1 -1
  230. package/dist/inspection/limits.cjs +5 -1
  231. package/dist/inspection/limits.cjs.map +1 -1
  232. package/dist/inspection/limits.d.cts +4 -0
  233. package/dist/inspection/limits.d.mts +4 -0
  234. package/dist/inspection/limits.d.ts +4 -0
  235. package/dist/inspection/limits.js +6 -2
  236. package/dist/inspection/overview.cjs +74 -33
  237. package/dist/inspection/overview.cjs.map +1 -1
  238. package/dist/inspection/overview.d.cts +19 -1
  239. package/dist/inspection/overview.d.mts +19 -1
  240. package/dist/inspection/overview.d.ts +19 -1
  241. package/dist/inspection/overview.js +4 -2
  242. package/dist/inspection/project-input.cjs +9 -0
  243. package/dist/inspection/project-input.cjs.map +1 -0
  244. package/dist/inspection/project-input.d.cts +20 -0
  245. package/dist/inspection/project-input.d.mts +20 -0
  246. package/dist/inspection/project-input.d.ts +20 -0
  247. package/dist/inspection/project-input.js +8 -0
  248. package/dist/inspection/project-input.js.map +1 -0
  249. package/dist/inspection/project-result.cjs +60 -0
  250. package/dist/inspection/project-result.cjs.map +1 -0
  251. package/dist/inspection/project-result.d.cts +1264 -0
  252. package/dist/inspection/project-result.d.mts +1264 -0
  253. package/dist/inspection/project-result.d.ts +1264 -0
  254. package/dist/inspection/project-result.js +10 -0
  255. package/dist/inspection/project-result.js.map +1 -0
  256. package/dist/inspection/project-source.cjs +109 -0
  257. package/dist/inspection/project-source.cjs.map +1 -0
  258. package/dist/inspection/project-source.d.cts +10 -0
  259. package/dist/inspection/project-source.d.mts +10 -0
  260. package/dist/inspection/project-source.d.ts +10 -0
  261. package/dist/inspection/project-source.js +6 -0
  262. package/dist/inspection/project-source.js.map +1 -0
  263. package/dist/inspection/project.cjs +100 -0
  264. package/dist/inspection/project.cjs.map +1 -0
  265. package/dist/inspection/project.d.cts +3 -0
  266. package/dist/inspection/project.d.mts +3 -0
  267. package/dist/inspection/project.d.ts +3 -0
  268. package/dist/inspection/project.js +6 -0
  269. package/dist/inspection/project.js.map +1 -0
  270. package/dist/inspection/protocol.cjs +19 -9
  271. package/dist/inspection/protocol.cjs.map +1 -1
  272. package/dist/inspection/protocol.d.cts +5506 -38189
  273. package/dist/inspection/protocol.d.mts +5506 -38189
  274. package/dist/inspection/protocol.d.ts +5506 -38189
  275. package/dist/inspection/public.mjs +896 -84
  276. package/dist/inspection/query.cjs +2 -0
  277. package/dist/inspection/query.cjs.map +1 -1
  278. package/dist/inspection/results.cjs +234 -29
  279. package/dist/inspection/results.cjs.map +1 -1
  280. package/dist/inspection/results.d.cts +870 -13
  281. package/dist/inspection/results.d.mts +870 -13
  282. package/dist/inspection/results.d.ts +870 -13
  283. package/dist/inspection/results.js +36 -34
  284. package/dist/inspection/select.cjs +126 -14
  285. package/dist/inspection/select.cjs.map +1 -1
  286. package/dist/inspection/select.d.cts +1 -1
  287. package/dist/inspection/select.d.mts +1 -1
  288. package/dist/inspection/select.d.ts +1 -1
  289. package/dist/inspection/source.cjs +4 -0
  290. package/dist/inspection/source.cjs.map +1 -1
  291. package/dist/inspection/sources.cjs +5 -0
  292. package/dist/inspection/sources.cjs.map +1 -1
  293. package/dist/inspection/trace.cjs +82 -84
  294. package/dist/inspection/trace.cjs.map +1 -1
  295. package/dist/inspection/trace.d.cts +7 -2
  296. package/dist/inspection/trace.d.mts +7 -2
  297. package/dist/inspection/trace.d.ts +7 -2
  298. package/dist/model-slots.cjs +35 -0
  299. package/dist/model-slots.cjs.map +1 -0
  300. package/dist/model-slots.d.cts +19 -0
  301. package/dist/model-slots.d.mts +19 -0
  302. package/dist/model-slots.d.ts +19 -0
  303. package/dist/model-slots.js +8 -0
  304. package/dist/model-slots.js.map +1 -0
  305. package/dist/o11y/adapter-call-price.cjs +4 -0
  306. package/dist/o11y/adapter-call-price.cjs.map +1 -1
  307. package/dist/o11y/adapter-call-price.d.cts +24 -0
  308. package/dist/o11y/adapter-call-price.d.mts +24 -0
  309. package/dist/o11y/adapter-call-price.d.ts +24 -0
  310. package/dist/o11y/adapter-call-price.js +6 -2
  311. package/dist/o11y/adapter-usage-projection.cjs +158 -0
  312. package/dist/o11y/adapter-usage-projection.cjs.map +1 -0
  313. package/dist/o11y/adapter-usage-projection.d.cts +141 -0
  314. package/dist/o11y/adapter-usage-projection.d.mts +141 -0
  315. package/dist/o11y/adapter-usage-projection.d.ts +141 -0
  316. package/dist/o11y/adapter-usage-projection.js +20 -0
  317. package/dist/o11y/adapter-usage-projection.js.map +1 -0
  318. package/dist/o11y/eval-usage.cjs +149 -0
  319. package/dist/o11y/eval-usage.cjs.map +1 -0
  320. package/dist/o11y/eval-usage.d.cts +46 -0
  321. package/dist/o11y/eval-usage.d.mts +46 -0
  322. package/dist/o11y/eval-usage.d.ts +46 -0
  323. package/dist/o11y/eval-usage.js +8 -0
  324. package/dist/o11y/eval-usage.js.map +1 -0
  325. package/dist/o11y/judge-call-price.cjs +62 -0
  326. package/dist/o11y/judge-call-price.cjs.map +1 -0
  327. package/dist/o11y/judge-call-price.d.cts +3 -0
  328. package/dist/o11y/judge-call-price.d.mts +3 -0
  329. package/dist/o11y/judge-call-price.d.ts +3 -0
  330. package/dist/o11y/judge-call-price.js +6 -0
  331. package/dist/o11y/judge-call-price.js.map +1 -0
  332. package/dist/o11y/judge-usage-projection.cjs +134 -0
  333. package/dist/o11y/judge-usage-projection.cjs.map +1 -0
  334. package/dist/o11y/judge-usage-projection.d.cts +18 -0
  335. package/dist/o11y/judge-usage-projection.d.mts +18 -0
  336. package/dist/o11y/judge-usage-projection.d.ts +18 -0
  337. package/dist/o11y/judge-usage-projection.js +20 -0
  338. package/dist/o11y/judge-usage-projection.js.map +1 -0
  339. package/dist/o11y/judge-usage-receipt.cjs +135 -0
  340. package/dist/o11y/judge-usage-receipt.cjs.map +1 -0
  341. package/dist/o11y/judge-usage-receipt.d.cts +5 -0
  342. package/dist/o11y/judge-usage-receipt.d.mts +5 -0
  343. package/dist/o11y/judge-usage-receipt.d.ts +5 -0
  344. package/dist/o11y/judge-usage-receipt.js +6 -0
  345. package/dist/o11y/judge-usage-receipt.js.map +1 -0
  346. package/dist/o11y/judge-usage.cjs +171 -0
  347. package/dist/o11y/judge-usage.cjs.map +1 -0
  348. package/dist/o11y/judge-usage.d.cts +35 -0
  349. package/dist/o11y/judge-usage.d.mts +35 -0
  350. package/dist/o11y/judge-usage.d.ts +35 -0
  351. package/dist/o11y/judge-usage.js +6 -0
  352. package/dist/o11y/judge-usage.js.map +1 -0
  353. package/dist/plugin/contracts.cjs +2 -0
  354. package/dist/plugin/contracts.cjs.map +1 -1
  355. package/dist/plugin/link.cjs +7 -0
  356. package/dist/plugin/link.cjs.map +1 -1
  357. package/dist/record/attachment/protocol.cjs +8 -6
  358. package/dist/record/attachment/protocol.cjs.map +1 -1
  359. package/dist/record/attachment/protocol.d.cts +10 -0
  360. package/dist/record/attachment/protocol.d.mts +10 -0
  361. package/dist/record/attachment/protocol.d.ts +10 -0
  362. package/dist/record/attachment/protocol.js +38 -36
  363. package/dist/record/codec/seal-manifest.d.cts +3 -3
  364. package/dist/record/codec/seal-manifest.d.mts +3 -3
  365. package/dist/record/codec/seal-manifest.d.ts +3 -3
  366. package/dist/record/family/adapter-usage/definition.d.cts +1 -0
  367. package/dist/record/family/adapter-usage/definition.d.mts +1 -0
  368. package/dist/record/family/adapter-usage/definition.d.ts +1 -0
  369. package/dist/record/family/adapter-usage/persistence.cjs +1 -1
  370. package/dist/record/family/adapter-usage/persistence.cjs.map +1 -1
  371. package/dist/record/family/adapter-usage/persistence.d.cts +2 -1
  372. package/dist/record/family/adapter-usage/persistence.d.mts +2 -1
  373. package/dist/record/family/adapter-usage/persistence.d.ts +2 -1
  374. package/dist/record/family/adapter-usage/schema.cjs +21 -2
  375. package/dist/record/family/adapter-usage/schema.cjs.map +1 -1
  376. package/dist/record/family/adapter-usage/schema.d.cts +85 -0
  377. package/dist/record/family/adapter-usage/schema.d.mts +85 -0
  378. package/dist/record/family/adapter-usage/schema.d.ts +85 -0
  379. package/dist/record/family/adapter-usage/schema.js +18 -12
  380. package/dist/record/family/catalog.cjs +31 -27
  381. package/dist/record/family/catalog.cjs.map +1 -1
  382. package/dist/record/family/catalog.d.cts +94 -3
  383. package/dist/record/family/catalog.d.mts +94 -3
  384. package/dist/record/family/catalog.d.ts +94 -3
  385. package/dist/record/family/current.cjs +45 -42
  386. package/dist/record/family/current.cjs.map +1 -1
  387. package/dist/record/family/current.d.cts +240 -1
  388. package/dist/record/family/current.d.mts +240 -1
  389. package/dist/record/family/current.d.ts +240 -1
  390. package/dist/record/family/execution-traces/definition.d.cts +26 -0
  391. package/dist/record/family/execution-traces/definition.d.mts +26 -0
  392. package/dist/record/family/execution-traces/definition.d.ts +26 -0
  393. package/dist/record/family/execution-traces/definition.js +20 -14
  394. package/dist/record/family/execution-traces/schema.cjs +57 -1
  395. package/dist/record/family/execution-traces/schema.cjs.map +1 -1
  396. package/dist/record/family/execution-traces/schema.d.cts +114 -0
  397. package/dist/record/family/execution-traces/schema.d.mts +114 -0
  398. package/dist/record/family/execution-traces/schema.d.ts +114 -0
  399. package/dist/record/family/execution-traces/schema.js +18 -12
  400. package/dist/record/family/judge-usage/definition.cjs +12 -0
  401. package/dist/record/family/judge-usage/definition.cjs.map +1 -0
  402. package/dist/record/family/judge-usage/definition.d.cts +91 -0
  403. package/dist/record/family/judge-usage/definition.d.mts +91 -0
  404. package/dist/record/family/judge-usage/definition.d.ts +91 -0
  405. package/dist/record/family/judge-usage/definition.js +6 -0
  406. package/dist/record/family/judge-usage/definition.js.map +1 -0
  407. package/dist/record/family/judge-usage/persistence.cjs +10 -0
  408. package/dist/record/family/judge-usage/persistence.cjs.map +1 -0
  409. package/dist/record/family/judge-usage/persistence.d.cts +91 -0
  410. package/dist/record/family/judge-usage/persistence.d.mts +91 -0
  411. package/dist/record/family/judge-usage/persistence.d.ts +91 -0
  412. package/dist/record/family/judge-usage/persistence.js +6 -0
  413. package/dist/record/family/judge-usage/persistence.js.map +1 -0
  414. package/dist/record/family/judge-usage/schema.cjs +307 -0
  415. package/dist/record/family/judge-usage/schema.cjs.map +1 -0
  416. package/dist/record/family/judge-usage/schema.d.cts +351 -0
  417. package/dist/record/family/judge-usage/schema.d.mts +351 -0
  418. package/dist/record/family/judge-usage/schema.d.ts +351 -0
  419. package/dist/record/family/judge-usage/schema.js +18 -0
  420. package/dist/record/family/judge-usage/schema.js.map +1 -0
  421. package/dist/record/host/sqlite-host.cjs +55 -9
  422. package/dist/record/host/sqlite-host.cjs.map +1 -1
  423. package/dist/record/host/types.cjs.map +1 -1
  424. package/dist/record/host/types.d.cts +7 -0
  425. package/dist/record/host/types.d.mts +7 -0
  426. package/dist/record/host/types.d.ts +7 -0
  427. package/dist/record/model/run-context.cjs +7 -1
  428. package/dist/record/model/run-context.cjs.map +1 -1
  429. package/dist/record/model/run-context.d.cts +4 -0
  430. package/dist/record/model/run-context.d.mts +4 -0
  431. package/dist/record/model/run-context.d.ts +4 -0
  432. package/dist/record/model/seal-manifest.d.cts +1 -1
  433. package/dist/record/model/seal-manifest.d.mts +1 -1
  434. package/dist/record/model/seal-manifest.d.ts +1 -1
  435. package/dist/record/sqlite/client.cjs +18 -5
  436. package/dist/record/sqlite/client.cjs.map +1 -1
  437. package/dist/record/sqlite/client.d.cts +1 -1
  438. package/dist/record/sqlite/client.d.mts +1 -1
  439. package/dist/record/sqlite/client.d.ts +1 -1
  440. package/dist/record/sqlite/project-state-database.cjs +29 -8
  441. package/dist/record/sqlite/project-state-database.cjs.map +1 -1
  442. package/dist/run/host/runtime.cjs +4 -0
  443. package/dist/run/host/runtime.cjs.map +1 -1
  444. package/dist/run/storage/sqlite.cjs +20 -0
  445. package/dist/run/storage/sqlite.cjs.map +1 -1
  446. package/dist/runner/adapter-execution-trace.cjs +125 -2
  447. package/dist/runner/adapter-execution-trace.cjs.map +1 -1
  448. package/dist/runner/adapter-execution-trace.d.cts +1 -1
  449. package/dist/runner/adapter-execution-trace.d.mts +1 -1
  450. package/dist/runner/adapter-execution-trace.d.ts +1 -1
  451. package/dist/runner/adapter-usage.cjs +55 -7
  452. package/dist/runner/adapter-usage.cjs.map +1 -1
  453. package/dist/runner/adapter-usage.d.cts +9 -2
  454. package/dist/runner/adapter-usage.d.mts +9 -2
  455. package/dist/runner/adapter-usage.d.ts +9 -2
  456. package/dist/runner/adoption.cjs +9 -0
  457. package/dist/runner/adoption.cjs.map +1 -1
  458. package/dist/runner/attempt-cancellation.cjs +12 -0
  459. package/dist/runner/attempt-cancellation.cjs.map +1 -0
  460. package/dist/runner/attempt-cancellation.d.cts +6 -0
  461. package/dist/runner/attempt-cancellation.d.mts +6 -0
  462. package/dist/runner/attempt-cancellation.d.ts +6 -0
  463. package/dist/runner/attempt-cancellation.js +6 -0
  464. package/dist/runner/attempt-cancellation.js.map +1 -0
  465. package/dist/runner/attempt-resources.cjs +10 -4
  466. package/dist/runner/attempt-resources.cjs.map +1 -1
  467. package/dist/runner/attempt-resources.d.cts +2 -1
  468. package/dist/runner/attempt-resources.d.mts +2 -1
  469. package/dist/runner/attempt-resources.d.ts +2 -1
  470. package/dist/runner/attempt.cjs +1177 -1139
  471. package/dist/runner/attempt.cjs.map +1 -1
  472. package/dist/runner/config-identity.cjs +20 -1
  473. package/dist/runner/config-identity.cjs.map +1 -1
  474. package/dist/runner/config-identity.d.cts +5 -0
  475. package/dist/runner/config-identity.d.mts +5 -0
  476. package/dist/runner/config-identity.d.ts +5 -0
  477. package/dist/runner/discover.cjs +14 -0
  478. package/dist/runner/discover.cjs.map +1 -1
  479. package/dist/runner/discover.d.cts +3 -0
  480. package/dist/runner/discover.d.mts +3 -0
  481. package/dist/runner/discover.d.ts +3 -0
  482. package/dist/runner/feedback/human.cjs +9 -4
  483. package/dist/runner/feedback/human.cjs.map +1 -1
  484. package/dist/runner/fingerprint.cjs +1 -0
  485. package/dist/runner/fingerprint.cjs.map +1 -1
  486. package/dist/runner/judge-usage.cjs +18 -0
  487. package/dist/runner/judge-usage.cjs.map +1 -0
  488. package/dist/runner/judge-usage.d.cts +5 -0
  489. package/dist/runner/judge-usage.d.mts +5 -0
  490. package/dist/runner/judge-usage.d.ts +5 -0
  491. package/dist/runner/judge-usage.js +8 -0
  492. package/dist/runner/judge-usage.js.map +1 -0
  493. package/dist/runner/project-target.cjs.map +1 -1
  494. package/dist/runner/project-target.d.cts +2 -0
  495. package/dist/runner/project-target.d.mts +2 -0
  496. package/dist/runner/project-target.d.ts +2 -0
  497. package/dist/runner/record/planning.cjs +1 -0
  498. package/dist/runner/record/planning.cjs.map +1 -1
  499. package/dist/runner/record.cjs +4 -0
  500. package/dist/runner/record.cjs.map +1 -1
  501. package/dist/runner/reporters/braintrust.cjs +2 -0
  502. package/dist/runner/reporters/braintrust.cjs.map +1 -1
  503. package/dist/runner/reuse-diagnostics.cjs +9 -10
  504. package/dist/runner/reuse-diagnostics.cjs.map +1 -1
  505. package/dist/runner/reuse-diagnostics.d.cts +5 -6
  506. package/dist/runner/reuse-diagnostics.d.mts +5 -6
  507. package/dist/runner/reuse-diagnostics.d.ts +5 -6
  508. package/dist/runner/reuse-diagnostics.js +4 -4
  509. package/dist/runner/reuse-plan.cjs +100 -48
  510. package/dist/runner/reuse-plan.cjs.map +1 -1
  511. package/dist/runner/reuse-plan.d.cts +60 -3
  512. package/dist/runner/reuse-plan.d.mts +60 -3
  513. package/dist/runner/reuse-plan.d.ts +60 -3
  514. package/dist/runner/reuse-plan.js +14 -10
  515. package/dist/runner/run.cjs +8 -6
  516. package/dist/runner/run.cjs.map +1 -1
  517. package/dist/runner/session.cjs +1 -1
  518. package/dist/runner/session.cjs.map +1 -1
  519. package/dist/runner/session.d.cts +1 -1
  520. package/dist/runner/session.d.mts +1 -1
  521. package/dist/runner/session.d.ts +1 -1
  522. package/dist/runner/source-producer.cjs +3 -1
  523. package/dist/runner/source-producer.cjs.map +1 -1
  524. package/dist/runner/types.cjs.map +1 -1
  525. package/dist/runner/types.d.cts +26 -5
  526. package/dist/runner/types.d.mts +26 -5
  527. package/dist/runner/types.d.ts +26 -5
  528. package/dist/sandbox/action.cjs +3 -0
  529. package/dist/sandbox/action.cjs.map +1 -1
  530. package/dist/sandbox/commands.cjs +3 -0
  531. package/dist/sandbox/commands.cjs.map +1 -1
  532. package/dist/sandbox/compose.cjs +6 -0
  533. package/dist/sandbox/compose.cjs.map +1 -1
  534. package/dist/sandbox/docker-profile/registry.cjs +7 -0
  535. package/dist/sandbox/docker-profile/registry.cjs.map +1 -1
  536. package/dist/sandbox/docker-profile/runtime.cjs +3 -0
  537. package/dist/sandbox/docker-profile/runtime.cjs.map +1 -1
  538. package/dist/sandbox/docker-profile/schema.cjs +7 -0
  539. package/dist/sandbox/docker-profile/schema.cjs.map +1 -1
  540. package/dist/sandbox/incus.cjs +7 -0
  541. package/dist/sandbox/incus.cjs.map +1 -1
  542. package/dist/sandbox/layer.cjs +12 -0
  543. package/dist/sandbox/layer.cjs.map +1 -1
  544. package/dist/shared/adapter-cleanup.cjs +18 -0
  545. package/dist/shared/adapter-cleanup.cjs.map +1 -0
  546. package/dist/shared/adapter-cleanup.d.cts +4 -0
  547. package/dist/shared/adapter-cleanup.d.mts +4 -0
  548. package/dist/shared/adapter-cleanup.d.ts +4 -0
  549. package/dist/shared/adapter-cleanup.js +10 -0
  550. package/dist/shared/adapter-cleanup.js.map +1 -0
  551. package/dist/shared/attempt-lifecycle.cjs +3 -0
  552. package/dist/shared/attempt-lifecycle.cjs.map +1 -0
  553. package/dist/shared/attempt-lifecycle.d.cts +13 -0
  554. package/dist/shared/attempt-lifecycle.d.mts +13 -0
  555. package/dist/shared/attempt-lifecycle.d.ts +13 -0
  556. package/dist/shared/attempt-lifecycle.js +4 -0
  557. package/dist/shared/attempt-lifecycle.js.map +1 -0
  558. package/dist/show/contribution.cjs +52 -14
  559. package/dist/show/contribution.cjs.map +1 -1
  560. package/dist/show/contribution.d.cts +23 -1
  561. package/dist/show/contribution.d.mts +23 -1
  562. package/dist/show/contribution.d.ts +23 -1
  563. package/dist/show/model.cjs +8 -1
  564. package/dist/show/model.cjs.map +1 -1
  565. package/dist/show/model.d.cts +10 -1
  566. package/dist/show/model.d.mts +10 -1
  567. package/dist/show/model.d.ts +10 -1
  568. package/dist/show/render.cjs +287 -49
  569. package/dist/show/render.cjs.map +1 -1
  570. package/dist/show/render.d.cts +3 -0
  571. package/dist/show/render.d.mts +3 -0
  572. package/dist/show/render.d.ts +3 -0
  573. package/dist/sources/projector.cjs +3 -0
  574. package/dist/sources/projector.cjs.map +1 -1
  575. package/dist/types.cjs.map +1 -1
  576. package/dist/types.d.cts +1 -1
  577. package/dist/types.d.mts +1 -1
  578. package/dist/types.d.ts +1 -1
  579. package/dist/view/app-dist/.vite/manifest.json +2 -2
  580. package/dist/view/app-dist/assets/index-CmVoXbwG.js +63 -0
  581. package/dist/view/app-dist/assets/{quality-cost-scatter-CFB3wnkN.js → quality-cost-scatter-BuLISaH4.js} +1 -1
  582. package/dist/view/app-dist/index.html +1 -1
  583. package/dist/view/cli/contribution.cjs +54 -21
  584. package/dist/view/cli/contribution.cjs.map +1 -1
  585. package/dist/view/cli/contribution.d.cts +2 -1
  586. package/dist/view/cli/contribution.d.mts +2 -1
  587. package/dist/view/cli/contribution.d.ts +2 -1
  588. package/dist/view/function-runtime.mjs +13231 -11647
  589. package/dist/view/http-protocol.cjs +3 -0
  590. package/dist/view/http-protocol.cjs.map +1 -1
  591. package/dist/view/http-protocol.d.cts +8 -0
  592. package/dist/view/http-protocol.d.mts +8 -0
  593. package/dist/view/http-protocol.d.ts +8 -0
  594. package/dist/view/inspection-host.cjs +17 -1
  595. package/dist/view/inspection-host.cjs.map +1 -1
  596. package/dist/view/render.cjs +1 -0
  597. package/dist/view/render.cjs.map +1 -1
  598. package/dist/view/render.d.cts +2 -1
  599. package/dist/view/render.d.mts +2 -1
  600. package/dist/view/render.d.ts +2 -1
  601. package/dist/view/revision.cjs.map +1 -1
  602. package/dist/view/revision.d.cts +12 -0
  603. package/dist/view/revision.d.mts +12 -0
  604. package/dist/view/revision.d.ts +12 -0
  605. package/dist/view/server.cjs +10 -9
  606. package/dist/view/server.cjs.map +1 -1
  607. package/docs-site/zh/examples/ai-agent-application.mdx +1 -1
  608. package/docs-site/zh/explanation/adapter.mdx +2 -2
  609. package/docs-site/zh/explanation/assert.mdx +60 -24
  610. package/docs-site/zh/explanation/drive.mdx +1 -1
  611. package/docs-site/zh/explanation/evals.mdx +31 -29
  612. package/docs-site/zh/explanation/experiment.mdx +15 -15
  613. package/docs-site/zh/explanation/judge.mdx +23 -15
  614. package/docs-site/zh/explanation/overview.mdx +44 -21
  615. package/docs-site/zh/explanation/record.mdx +28 -13
  616. package/docs-site/zh/explanation/results-flow.mdx +37 -0
  617. package/docs-site/zh/explanation/runner.mdx +27 -6
  618. package/docs-site/zh/index.mdx +22 -115
  619. package/docs-site/zh/introduction.mdx +89 -61
  620. package/docs-site/zh/reference/cli.mdx +50 -26
  621. package/docs-site/zh/reference/define-agent.mdx +37 -5
  622. package/docs-site/zh/reference/define-eval.mdx +130 -29
  623. package/docs-site/zh/reference/define-experiment.mdx +251 -0
  624. package/docs-site/zh/reference/events.mdx +34 -30
  625. package/docs-site/zh/reference/expect.mdx +77 -2
  626. package/docs-site/zh/reference/official-adapters.mdx +2 -2
  627. package/docs-site/zh/troubleshooting/debug-sandbox.mdx +43 -24
  628. package/docs-site/zh/troubleshooting/debugging.mdx +65 -42
  629. package/docs-site/zh/troubleshooting/recover-after-kill.mdx +35 -28
  630. package/docs-site/zh/tutorials/accept-results.mdx +34 -24
  631. package/docs-site/zh/tutorials/agent-feedback-loop.mdx +74 -43
  632. package/docs-site/zh/tutorials/agent-onboarding.mdx +27 -20
  633. package/docs-site/zh/tutorials/authoring.mdx +138 -121
  634. package/docs-site/zh/tutorials/ci-integration.mdx +46 -22
  635. package/docs-site/zh/tutorials/compare-runs.mdx +40 -13
  636. package/docs-site/zh/tutorials/concurrency.mdx +66 -62
  637. package/docs-site/zh/tutorials/configuration.mdx +17 -17
  638. package/docs-site/zh/tutorials/connect-otel.mdx +48 -37
  639. package/docs-site/zh/tutorials/connect-your-agent.mdx +80 -173
  640. package/docs-site/zh/tutorials/control-run-cost.mdx +63 -12
  641. package/docs-site/zh/tutorials/criteria-files.mdx +28 -21
  642. package/docs-site/zh/tutorials/custom-application.mdx +75 -55
  643. package/docs-site/zh/tutorials/dataset-fanout.mdx +32 -22
  644. package/docs-site/zh/tutorials/debug-lifecycle-plan.mdx +38 -31
  645. package/docs-site/zh/tutorials/docker-in-docker.mdx +83 -89
  646. package/docs-site/zh/tutorials/eval-groups.mdx +70 -89
  647. package/docs-site/zh/tutorials/evaluation-kinds.mdx +12 -5
  648. package/docs-site/zh/tutorials/experiment-services.mdx +243 -0
  649. package/docs-site/zh/tutorials/fixtures.mdx +42 -26
  650. package/docs-site/zh/tutorials/handle-execution-failures.mdx +41 -19
  651. package/docs-site/zh/tutorials/install-custom-sandbox-agent.mdx +21 -16
  652. package/docs-site/zh/tutorials/niceeval-taste-application.mdx +394 -0
  653. package/docs-site/zh/tutorials/niceeval-taste.mdx +190 -0
  654. package/docs-site/zh/tutorials/nixos-managed-dind.mdx +51 -39
  655. package/docs-site/zh/tutorials/plugins.mdx +55 -31
  656. package/docs-site/zh/tutorials/prebuilt-sandbox.mdx +204 -0
  657. package/docs-site/zh/tutorials/quickstart.mdx +91 -47
  658. package/docs-site/zh/tutorials/reporters.mdx +45 -30
  659. package/docs-site/zh/tutorials/rerun-and-cache.mdx +39 -40
  660. package/docs-site/zh/tutorials/sandbox-agent.mdx +65 -40
  661. package/docs-site/zh/tutorials/sandbox-providers.mdx +104 -282
  662. package/docs-site/zh/tutorials/sandbox-reuse.mdx +65 -97
  663. package/docs-site/zh/tutorials/select-and-preview.mdx +25 -20
  664. package/docs-site/zh/tutorials/verify-judge.mdx +49 -26
  665. package/docs-site/zh/tutorials/viewing-results.mdx +130 -80
  666. package/docs-site/zh/tutorials/write-experiment.mdx +116 -298
  667. package/docs-site/zh/tutorials/write-send.mdx +53 -52
  668. package/node_modules/undici/docs/docs/api/Agent.md +8 -8
  669. package/node_modules/undici/docs/docs/api/DiagnosticsChannel.md +9 -6
  670. package/node_modules/undici/docs/docs/api/Errors.md +25 -0
  671. package/node_modules/undici/docs/docs/api/Interceptors.md +4 -3
  672. package/node_modules/undici/docs/docs/api/Pool.md +5 -6
  673. package/node_modules/undici/lib/api/readable.js +1 -2
  674. package/node_modules/undici/lib/core/request.js +23 -2
  675. package/node_modules/undici/lib/core/util.js +0 -39
  676. package/node_modules/undici/lib/dispatcher/client-h1.js +11 -4
  677. package/node_modules/undici/lib/dispatcher/client-h2.js +52 -8
  678. package/node_modules/undici/lib/dispatcher/client.js +1 -1
  679. package/node_modules/undici/lib/dispatcher/dispatcher1-wrapper.js +3 -2
  680. package/node_modules/undici/lib/dispatcher/env-http-proxy-agent.js +21 -6
  681. package/node_modules/undici/lib/dispatcher/pool-base.js +63 -2
  682. package/node_modules/undici/lib/dispatcher/pool.js +90 -7
  683. package/node_modules/undici/lib/dispatcher/proxy-agent.js +16 -3
  684. package/node_modules/undici/lib/handler/deduplication-handler.js +24 -11
  685. package/node_modules/undici/lib/handler/redirect-handler.js +5 -0
  686. package/node_modules/undici/lib/handler/retry-handler.js +72 -13
  687. package/node_modules/undici/lib/interceptor/cache.js +4 -1
  688. package/node_modules/undici/lib/interceptor/decompress.js +236 -69
  689. package/node_modules/undici/lib/web/cache/cache.js +17 -8
  690. package/node_modules/undici/lib/web/cache/cachestorage.js +11 -5
  691. package/node_modules/undici/lib/web/cookies/index.js +19 -7
  692. package/node_modules/undici/lib/web/cookies/util.js +3 -1
  693. package/node_modules/undici/lib/web/eventsource/eventsource.js +25 -1
  694. package/node_modules/undici/lib/web/fetch/body.js +22 -15
  695. package/node_modules/undici/lib/web/fetch/data-url.js +6 -6
  696. package/node_modules/undici/lib/web/fetch/formdata.js +30 -36
  697. package/node_modules/undici/lib/web/fetch/headers.js +34 -31
  698. package/node_modules/undici/lib/web/fetch/index.js +38 -14
  699. package/node_modules/undici/lib/web/fetch/request.js +74 -79
  700. package/node_modules/undici/lib/web/fetch/response.js +43 -44
  701. package/node_modules/undici/lib/web/fetch/util.js +7 -7
  702. package/node_modules/undici/lib/web/infra/index.js +16 -1
  703. package/node_modules/undici/lib/web/webidl/index.js +2 -14
  704. package/node_modules/undici/lib/web/websocket/events.js +43 -26
  705. package/node_modules/undici/lib/web/websocket/receiver.js +5 -0
  706. package/node_modules/undici/lib/web/websocket/stream/websocketerror.js +13 -10
  707. package/node_modules/undici/lib/web/websocket/websocket.js +44 -41
  708. package/node_modules/undici/package.json +1 -1
  709. package/node_modules/undici/types/diagnostics-channel.d.ts +2 -1
  710. package/node_modules/undici/types/interceptors.d.ts +1 -1
  711. package/node_modules/undici/types/webidl.d.ts +13 -7
  712. package/package.json +4 -4
  713. package/dist/view/app-dist/assets/index-DFzw1L97.js +0 -63
  714. package/docs-site/zh/tutorials/experiments.mdx +0 -101
@@ -1 +1 @@
1
- {"version":3,"file":"codex.js","sourceRoot":"","sources":["codex.ts"],"names":[],"mappings":"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","sourcesContent":["import { completeEvidenceCoverage } from \"../assertions/coverage.ts\";\nimport { Effect } from \"effect\";\nimport { makeSandboxAgent } from \"../define.ts\";\nimport { requireEnv, getEnv } from \"../util.ts\";\nimport { shared } from \"./shared.ts\";\nimport { appendProjectInstruction, installSkills, installedSkillNames, skillDiscoveryInstruction, } from \"./skills.ts\";\nimport { verifyMarketplaceName } from \"./marketplace.ts\";\nimport { appendNativeConfigFileEffect, assertTomlNativeConfig, loadNativeConfigFileEffect, type LoadedNativeConfig, } from \"./native-config.ts\";\nimport { mapCodexSpans } from \"../o11y/otlp/mappers/codex.ts\";\nimport { DEFAULT_CODEX_CLI_VERSION, AGENT_BASELINE_RECIPE_REVISION } from \"./coding-cli-versions.ts\";\nimport { assertMcpServers, isHttpMcp, mcpManifestEntries } from \"./mcp.ts\";\nimport { registerAgentLifecycleHookCommands, runPostSetupHooks, runPreTeardownHooks, } from \"./post-setup.ts\";\nimport { createNpmCliInstaller } from \"./npm-staged.ts\";\nimport type { Agent, AgentSetupManifest, McpServer, Sandbox, SkillSpec } from \"../types.ts\";\nimport type { SandboxCommand } from \"../sandbox/commands.ts\";\nimport type { AgentArtifactPlatform } from \"./types.ts\";\nimport { sendAcceptanceFromEvents, sendFailureText, type SendFailure, } from \"../context/send-failures.ts\";\nimport { normalizeExternalCause } from \"../shared/external-cause.ts\";\nimport type { FailureClass } from \"../shared/failure-class.ts\";\nimport { requireManagedProcessCapability } from \"../sandbox/backend.ts\";\nimport { attemptResources } from \"../context/attempt-resources.ts\";\nimport { sendCodexAppServer } from \"./codex-app-server.ts\";\n// ───────────────────────────────────────────────────────────────────────────\n// OpenAI Codex CLI 的 agent adapter(沙箱型)。\n//\n// 连接方式:在沙箱里维护 Codex app-server stdio,原生通知 → 标准事件流。\n// 配置:鉴权本地(config / env),模型交给实验(ctx.model),推理努力程度经 ctx.reasoningEffort,\n// 其余参数经 ctx.flags。\n// 扩展(skill / plugin / MCP)是构造参数,setup 翻译成 codex 的原生形态并写 manifest。\n// ───────────────────────────────────────────────────────────────────────────\n/** codex 的 skill 目录(`skills` 生态的「通用」目录);codex 不原生扫描它,靠下面的发现指引。 */\nconst SKILL_DIR = \".agents/skills\";\n/**\n * `configFile` 的保留键:model / provider 路由 / 推理努力归 experiment 与 Adapter 的生成层,\n * MCP 表与 OTel 导出归 Adapter。清单定稿见 docs/feature/adapters/sdk/codex-cli/README.md。\n */\nconst RESERVED_CONFIG_KEYS = [\n \"model\",\n \"model_provider\",\n \"model_providers\",\n \"model_reasoning_effort\",\n \"mcp_servers\",\n \"otel\",\n] as const;\n/**\n * Codex 的原生 Plugin —— **只属于 Codex**,不能传给 Claude Code(它有自己的\n * {@link import(\"./claude-code.ts\").ClaudeCodePluginSpec})。字段当前相似不等于同一个类型:\n * 任一方的 Marketplace 鉴权、锁文件、选择规则或安装参数变化时,另一方不必接受无意义字段。\n */\nexport interface CodexPluginSpec {\n marketplace: {\n /** 目标仓库 manifest 声明的真实 name;CLI 不支持由调用方另取连接别名。 */\n name: string;\n /** Marketplace 来源:`owner/repo`、Git URL 或本地路径。 */\n source: string;\n /** 固定 Marketplace 的 Tag、Commit 或 Branch(→ `codex plugin marketplace add --ref`)。 */\n ref?: string;\n /**\n * sparse 拉取的路径列表,每项生成一个 `codex plugin marketplace add --sparse <path>`\n * (codex 的 `--sparse` 必须带路径参数、可重复):大仓库只取插件所需路径,省略或空数组即全量 clone。\n * 只影响拉取速度,不影响装出来的内容;manifest 不记录它。\n */\n sparse?: readonly string[];\n };\n /** Marketplace 中的 Plugin 名。 */\n name: string;\n}\nexport interface CodexConfig {\n /** 代理 / OpenAI API key。省略时读 CODEX_API_KEY env。 */\n apiKey?: string;\n /** OpenAI 兼容代理 base URL(如 https://s2a.example.com/v1)。省略时读 CODEX_BASE_URL env。 */\n baseUrl?: string;\n /**\n * 注入每次 Codex CLI 进程的额外环境变量。首轮 `codex exec` 与续轮 `codex exec resume`\n * 使用同一份声明;Codex 启动的 lifecycle Hook、MCP 动态 header 与命令子进程都会继承。\n * 值只经 Sandbox command options 传入,不拼进 shell 文本或写入 setup manifest,并全部按\n * 潜在敏感值从 timing / execution / error 证据中脱敏。`CODEX_API_KEY` 仍由 `apiKey` 或\n * 宿主同名环境变量提供,Adapter 的鉴权值会覆盖这里的同名键。\n * env value 不进入 carry 身份。会改变被测行为的非敏感值必须同时声明在 Experiment flags\n * 或所属 Plugin identity;只轮换凭据不会让旧结果失效。\n * `PATH` 是 Sandbox 受管变量,不接受经这里声明——出现即在 factory 构造时报错,改用\n * Sandbox factory 的 `pathPrepend`(见 docs/feature/sandbox/library.md)。\n */\n env?: Readonly<globalThis.Record<string, string>>;\n /**\n * 额外 MCP server(每个 Sandbox setup 时追加进 ~/.codex/config.toml)。\n * stdio 形态(command/args/env)写 [mcp_servers.<name>] 的 command 行;\n * Streamable HTTP 形态(url/headers)写 url 行,headers 进 [mcp_servers.<name>.http_headers] 子表。\n */\n mcpServers?: readonly McpServer[];\n /**\n * 装进 Sandbox 的 Skill(本地目录/文件,或 repo + 可钉 ref + 可选启用集)。\n * 落在 `.agents/skills/<name>/`,并写一段发现指引进 AGENTS.md —— codex 没有 Claude Code 那种\n * 原生 Skill 工具,只把文件装进去它不会自己去读(见 memory/codex-no-native-skill-tool.md)。\n */\n skills?: readonly SkillSpec[];\n /** Codex 原生 Plugin(先连 Marketplace,再从中装指定 Plugin)。 */\n plugins?: readonly CodexPluginSpec[];\n /**\n * 一份完整的 Codex `config.toml`(官方 TOML 格式)在本地项目里的路径 —— 相对运行\n * niceeval 的项目根(含 `niceeval.config.ts` 的目录)解析,不是 Sandbox 内路径;只接受\n * 项目根内的相对路径,包含 `..` 的路径、绝对路径、`~` 路径和解析后逃出项目根的符号链接\n * 都在 setup 阶段报错。原始字节原样并入 Sandbox 里原本为空的用户级 `~/.codex/config.toml`\n * (不继承宿主机配置、不解析后重写);保留键 `model`、`model_provider`、`model_providers`、\n * `model_reasoning_effort`、`mcp_servers`、`otel` 出现在文件里 setup 报错。manifest 只记\n * 项目相对路径与字节 SHA-256,不落正文。\n */\n configFile?: string;\n /**\n * 安装后按数组顺序运行的用户 Hook(复用 SandboxCommand 的窄上下文):在写主配置、挂 MCP、\n * 装 Skills / Plugin、写 manifest 全部完成后执行,适合跑插件自带的 setup 脚本这类\n * 「安装产物就位后才能跑」的过程动作。抛错按基础设施错误计(attempt errored)。\n * 见 docs/feature/adapters/library/coding-agent-extensions.md「安装后运行脚本」。\n */\n postSetup?: readonly SandboxCommand[];\n /**\n * 与 `postSetup` 成对的收尾 Hook:按 `postSetup` 的逆序语义,在 agent 自己的 teardown 步骤\n * 之前执行(LIFO 镜像 —— `postSetup` 跑在 agent 安装之后,`preTeardown` 就跑在 agent 收尾\n * 之前),当且仅当 `postSetup` 的时点走到过才触发。抛错按基础设施错误计,由 teardown 段\n * 按 teardown-failed 诊断收束。\n * 见 docs/feature/adapters/library/coding-agent-extensions.md「安装后运行脚本」。\n */\n preTeardown?: readonly SandboxCommand[];\n}\nconst CODEX_CAPACITY_CODES = new Set([\n \"ADMISSION_FAILED\",\n \"ADMISSION_FAILURE\",\n \"ADMISSION_REJECTED\",\n \"MODEL_AT_CAPACITY\",\n \"MODEL_CAPACITY\",\n \"MODEL_OVERLOADED\",\n]);\nfunction normalizedCodexCode(value: unknown): string | undefined {\n if (typeof value !== \"string\")\n return undefined;\n return value.trim().toUpperCase().replace(/[ -]+/g, \"_\");\n}\nfunction codexCapacityCode(raw: string | undefined): string | undefined {\n if (raw === undefined)\n return undefined;\n for (const line of raw.split(\"\\n\")) {\n try {\n const value: unknown = JSON.parse(line);\n if (!value || typeof value !== \"object\")\n continue;\n const record = value as globalThis.Record<string, unknown>;\n const error = record.error;\n const candidates = [\n record.code,\n record.reason,\n record.type,\n error && typeof error === \"object\" ? (error as globalThis.Record<string, unknown>).code : undefined,\n error && typeof error === \"object\" ? (error as globalThis.Record<string, unknown>).reason : undefined,\n error && typeof error === \"object\" ? (error as globalThis.Record<string, unknown>).type : undefined,\n ];\n const code = candidates.map(normalizedCodexCode).find((candidate) => candidate !== undefined && CODEX_CAPACITY_CODES.has(candidate));\n if (code !== undefined)\n return code;\n }\n catch {\n // Native stderr fallback is handled separately and remains deliberately narrow.\n }\n }\n return undefined;\n}\nfunction codexCapacityMessage(raw: string | undefined): string {\n if (raw === undefined)\n return \"\";\n const messages: string[] = [];\n for (const line of raw.split(\"\\n\")) {\n try {\n const value: unknown = JSON.parse(line);\n if (!value || typeof value !== \"object\")\n continue;\n const record = value as globalThis.Record<string, unknown>;\n if (record.type !== \"turn.failed\" && record.type !== \"response.failed\")\n continue;\n const error = record.error;\n if (error && typeof error === \"object\") {\n const message = (error as globalThis.Record<string, unknown>).message;\n if (typeof message === \"string\")\n messages.push(message);\n }\n }\n catch {\n // Native stderr fallback is handled separately and remains deliberately narrow.\n }\n }\n return messages.join(\"\\n\");\n}\nconst CODEX_CAPACITY_TEXT = /\\bmodel(?:[ _-]+is)?[ _-]+at[ _-]+capacity\\b|\\badmission[ _-]+(?:failed|failure|rejected)\\b/i;\nfunction codexCapacityFromFailure(failure: SendFailure): boolean {\n if (failure.acceptance !== \"rejected\")\n return false;\n if (failure.events !== undefined && sendAcceptanceFromEvents(failure.events) === \"started\")\n return false;\n for (let cause = failure.cause; cause !== undefined;) {\n if (cause._tag === \"Error\" || cause._tag === \"Object\") {\n const code = cause.code._tag === \"Present\" ? normalizedCodexCode(cause.code.value) : undefined;\n if (code !== undefined && CODEX_CAPACITY_CODES.has(code))\n return true;\n cause = cause.cause._tag === \"Cause\" ? cause.cause.value : undefined;\n continue;\n }\n cause = undefined;\n }\n return CODEX_CAPACITY_TEXT.test(sendFailureText(failure));\n}\nfunction classifyCodexSendFailure(failure: SendFailure): FailureClass | undefined {\n return codexCapacityFromFailure(failure) ? { retryable: true, reason: \"model_capacity\" } : undefined;\n}\nfunction codexAcceptance(raw: string | undefined, events: readonly import(\"../types.ts\").StreamEvent[], nativeErrorText = \"\"): \"rejected\" | \"started\" | \"unknown\" {\n const acceptance = sendAcceptanceFromEvents(events);\n if (acceptance === \"started\")\n return \"started\";\n return codexCapacityCode(raw) !== undefined || CODEX_CAPACITY_TEXT.test(`${codexCapacityMessage(raw)}\\n${nativeErrorText}`)\n ? \"rejected\"\n : acceptance;\n}\n/**\n * `@openai/codex` 的 npm 主包只是个 node shim,真正的 CLI 在平台包里\n * (`npm:@openai/codex@<ver>-linux-arm64`),是自带运行时的 musl 静态二进制。\n * 装这一份:沙箱里不需要 node / npm,任务镜像带什么都能装。\n */\nfunction codexPlatformPackage(platform: AgentArtifactPlatform, version: string): {\n spec: string;\n binPath: string;\n} | undefined {\n const target = platform.os === \"linux\" && platform.arch === \"x64\"\n ? { suffix: \"linux-x64\", triple: \"x86_64-unknown-linux-musl\" }\n : platform.os === \"linux\" && platform.arch === \"arm64\"\n ? { suffix: \"linux-arm64\", triple: \"aarch64-unknown-linux-musl\" }\n : platform.os === \"darwin\" && platform.arch === \"x64\"\n ? { suffix: \"darwin-x64\", triple: \"x86_64-apple-darwin\" }\n : platform.os === \"darwin\" && platform.arch === \"arm64\"\n ? { suffix: \"darwin-arm64\", triple: \"aarch64-apple-darwin\" }\n : undefined;\n if (target === undefined)\n return undefined;\n return {\n spec: `@openai/codex@${version}-${target.suffix}`,\n binPath: `vendor/${target.triple}/bin/codex`,\n };\n}\n// Codex 0.144.1 会把「hook 命令已正常退出、随后写 stdin 撞 BrokenPipe」误判成 hook\n// 失败并丢掉 stdout。0.146.0 的官方 command runner 已忽略这个竞态;配置 Plugin 时必须\n// 选择包含该修复的 CLI。未配置 Plugin 的官方基线仍保持当前已发布版本,避免引用尚未发布\n// 的 Docker/E2B 制品。\nconst CODEX_PLUGIN_HOOK_SAFE_CLI_VERSION = \"0.146.0\";\nexport function codexAgent(config?: CodexConfig): Agent {\n const getApiKey = () => config?.apiKey ?? requireEnv(\"CODEX_API_KEY\");\n const getBaseUrl = () => config?.baseUrl ?? getEnv(\"CODEX_BASE_URL\");\n // PATH 是 Sandbox 受管变量,在 factory 构造时(link/配置校验期)同步拒绝,不留到 setup()\n // 才炸,也不静默丢弃——被覆盖的 PATH 会让 hooks / 子进程读到错误的可执行文件而零报错\n // (见 docs/feature/sandbox/library.md「PATH:受管变量与 pathPrepend」)。\n if (config?.env && \"PATH\" in config.env) {\n throw new TypeError(`codexAgent config.env.PATH is not supported: PATH is a Sandbox-managed variable, so silently dropping or overriding it would break hooks and child processes without any error. Prepend directories to it with the Sandbox factory's pathPrepend option instead (see docs/feature/sandbox/library.md).`);\n }\n // factory 构造时快照:一份 Agent 配置服务并发 attempt,不能让调用方随后改原对象造成\n // 不同 run/resume 轮拿到不同 Space。值不进入 shell 或 manifest,只交给 command options。\n const agentEnv = Object.freeze({ ...(config?.env ?? {}) });\n const agentEnvSensitiveValues = Object.freeze(Object.values(agentEnv));\n const cliVersion = config?.plugins?.length\n ? CODEX_PLUGIN_HOOK_SAFE_CLI_VERSION\n : DEFAULT_CODEX_CLI_VERSION;\n const cliRecipeRevision = config?.plugins?.length\n ? \"plugin-hook-safe-r1\"\n : String(AGENT_BASELINE_RECIPE_REVISION.codex);\n const { ensure, installer } = createNpmCliInstaller({\n identity: {\n agent: \"codex\",\n version: cliVersion,\n revision: cliRecipeRevision,\n },\n packageName: \"@openai/codex\",\n bin: \"codex\",\n platformPackage: (platform) => codexPlatformPackage(platform, cliVersion),\n progress: {\n checking: `checking Codex CLI ${cliVersion}`,\n installing: `installing official OpenAI Codex CLI ${cliVersion}`,\n ready: `Codex CLI ${cliVersion} ready`,\n },\n });\n return registerAgentLifecycleHookCommands(makeSandboxAgent({\n name: \"codex\",\n // 官方 adapter:transcript 经生命周期 fixture 验证,全通道 complete。\n evidenceCoverage: completeEvidenceCoverage,\n spanMapper: mapCodexSpans,\n classifySendFailure: classifyCodexSendFailure,\n ensure,\n installers: [installer],\n setup: (sb, ctx) => Effect.gen(function* () {\n yield* Effect.try({ try: () => requireManagedProcessCapability(sb, \"codex\"), catch: (cause) => cause });\n // 用户的原生配置文件:本地读原始字节 → 验 TOML 语法与保留键。字节 SHA-256 进\n // manifest 与安装 checkpoint key(见 native-config.ts 的 nativeConfigCheckpointItem)。\n let nativeConfig: LoadedNativeConfig | undefined;\n if (config?.configFile !== undefined) {\n nativeConfig = yield* loadNativeConfigFileEffect({ agent: \"codex\", field: \"configFile\", path: config.configFile });\n yield* Effect.try({\n try: () => assertTomlNativeConfig(nativeConfig!, {\n agent: \"codex\",\n field: \"configFile\",\n reservedKeys: RESERVED_CONFIG_KEYS,\n }),\n catch: (cause) => cause,\n });\n }\n // Codex 把 Plugin 的声明态写在 config.toml、安装体写在 cache。必须在覆盖用户配置前\n // 同时摘掉两边:覆盖后 `plugin list` 已看不见旧声明,旧安装体却仍会影响下一次 add\n // 的版本选择。先完整收敛,再写本 Attempt 的唯一配置层。\n if (config?.plugins?.length) {\n const plugins = config.plugins;\n yield* Effect.tryPromise({\n try: () => resetPluginState(sb, plugins),\n catch: (cause) => cause,\n });\n }\n // model 归属:实验决定(ctx.model);省略时不写 model 行,交给 codex CLI 原生默认,\n // 不在 adapter 里硬编码一个会过期的模型名。\n const modelLine = ctx.model ? `model = \"${ctx.model}\"\\n` : \"\";\n const effortLine = ctx.reasoningEffort === undefined\n ? \"\"\n : `model_reasoning_effort = \"${ctx.reasoningEffort}\"\\n`;\n const base = getBaseUrl();\n // 自定义 endpoint 常从项目的私有环境注入。它仍是 Codex 的真实运行配置,但不能因\n // Adapter 用 heredoc 写 config.toml 而进入 command/timing/error 证据;一旦在这里登记,\n // Attempt 最终封口也会清掉随后 hook 或 CLI 错误里回显的同一值。\n const providerSensitiveValues = base ? [base] : [];\n const topLevel = base\n ? modelLine + `model_provider = \"s2a\"\\n` + effortLine\n : modelLine + effortLine;\n const providerTable = base\n ? `[model_providers.s2a]\\n` +\n `name = \"s2a\"\\n` +\n `base_url = \"${base}\"\\n` +\n `env_key = \"CODEX_API_KEY\"\\n` +\n `wire_api = \"responses\"\\n`\n : \"\";\n if (!nativeConfig) {\n yield* Effect.tryPromise({\n try: () => shared.writeFile(sb, \"~/.codex/config.toml\", providerTable ? `${topLevel}\\n${providerTable}` : topLevel, { sensitiveValues: providerSensitiveValues }),\n catch: (cause) => cause,\n });\n }\n else {\n // codex 只读一份用户级 config.toml(没有 include / 第二配置层),Adapter 生成层与\n // 用户文件只能同文件分段共存。TOML 没有「回到根表」的语法,顶层键必须先于任何表头,\n // 所以布局固定为:Adapter 顶层键 → 用户文件原始字节(逐字节保留,自带表随意)→\n // Adapter 的表([model_providers.*] 以及后续追加的 [mcp_servers.*]、[otel])。\n // 保留键校验保证两层键不重叠,用户内容不被解析重写。\n yield* Effect.tryPromise({\n try: () => shared.writeFile(sb, \"~/.codex/config.toml\", topLevel),\n catch: (cause) => cause,\n });\n yield* appendNativeConfigFileEffect(sb, nativeConfig, \"~/.codex/config.toml\");\n if (providerTable) {\n yield* Effect.tryPromise({\n try: (signal) => sb.runShell(`cat >> ~/.codex/config.toml <<'NICEEVAL_PROVIDER_EOF'\\n\\n${providerTable}NICEEVAL_PROVIDER_EOF\\n`, { signal, sensitiveValues: providerSensitiveValues }),\n catch: (cause) => cause,\n });\n }\n }\n yield* Effect.tryPromise({\n try: async (signal) => {\n if (config?.mcpServers?.length) {\n assertMcpServers(config.mcpServers);\n const sensitiveValues: string[] = [];\n const mcpToml = config.mcpServers\n .map((s) => {\n // 注意是复数 mcp_servers:单数 [mcp_server.x] 会被 codex 静默忽略,\n // MCP 压根挂不上(实测 codex-cli 0.142.x,`codex mcp list` 可核对)。\n const lines: string[] = [`[mcp_servers.${s.name}]`];\n if (isHttpMcp(s)) {\n lines.push(`url = \"${s.url}\"`);\n const headers = s.headers;\n if (headers && Object.keys(headers).length) {\n lines.push(`[mcp_servers.${s.name}.http_headers]`);\n for (const [k, v] of Object.entries(headers)) {\n sensitiveValues.push(v);\n lines.push(`\"${k}\" = \"${v}\"`);\n }\n }\n }\n else {\n lines.push(`command = \"${s.command}\"`);\n if (s.args?.length)\n lines.push(`args = [${s.args.map((a) => `\"${a}\"`).join(\", \")}]`);\n const env = s.env;\n if (env && Object.keys(env).length) {\n lines.push(`[mcp_servers.${s.name}.env]`);\n for (const [k, v] of Object.entries(env)) {\n sensitiveValues.push(v);\n lines.push(`${k} = \"${v}\"`);\n }\n }\n }\n return lines.join(\"\\n\");\n })\n .join(\"\\n\\n\");\n await sb.runShell(`cat >> ~/.codex/config.toml <<'MCPEOF'\\n\\n${mcpToml}\\nMCPEOF\\n`, { sensitiveValues, signal });\n }\n const manifest: AgentSetupManifest = { skills: [] };\n if (config?.skills?.length) {\n manifest.skills = await installSkills(sb, config.skills, { dir: SKILL_DIR });\n // 发现指引不是可选装饰:没有它,codex 连一次读 skill 文件的 shell 调用都不会发生。\n await appendProjectInstruction(sb, skillDiscoveryInstruction(SKILL_DIR, installedSkillNames(manifest.skills)));\n }\n if (config?.plugins?.length) {\n manifest.nativePlugins = await installPluginsFromResetState(sb, config.plugins);\n }\n if (config?.mcpServers?.length) {\n // manifest 只记「挂了哪个 server、怎么连」;env / headers 里可能有 token,不落盘。\n manifest.mcpServers = mcpManifestEntries(config.mcpServers);\n }\n if (nativeConfig) {\n // 只记来源路径与字节哈希,不落正文(任意官方配置都可能带敏感字符串)。\n manifest.nativeConfigFile = { agent: \"codex\", path: nativeConfig.path, sha256: nativeConfig.sha256 };\n }\n if (manifest.skills.length ||\n manifest.nativePlugins?.length ||\n manifest.mcpServers?.length ||\n manifest.nativeConfigFile) {\n ctx.reportSetup(manifest);\n }\n // 安装后钩子(postSetup):排在 manifest 之后——manifest 审计 Adapter 自身的安装事实,\n // 钩子失败不该丢掉这份证据。\n await runPostSetupHooks(sb, ctx, \"codex\", config?.postSetup);\n },\n catch: (cause) => cause,\n });\n }),\n teardown: (sb, ctx) => Effect.tryPromise({\n try: async (signal) => {\n // preTeardown 与 postSetup 成对:LIFO 镜像,先于 agent 自己的收尾步骤执行。\n // codex 目前没有其它收尾步骤,这段就是整个 teardown。\n await runPreTeardownHooks(sb, { ...ctx, signal }, \"codex\", config?.preTeardown);\n await attemptResources(ctx)?.shutdownAll(signal);\n },\n catch: (cause) => cause,\n }),\n tracing: {\n protocol: \"http/json\",\n async configure(sb, ctx) {\n const endpoint = ctx.telemetry!.endpoint;\n const otel = `\\n[otel]\\n` +\n `environment = \"niceeval\"\\n` +\n `exporter = \"none\"\\n` +\n `metrics_exporter = \"none\"\\n\\n` +\n `[otel.trace_exporter.otlp-http]\\n` +\n `endpoint = \"${endpoint}\"\\n` +\n `protocol = \"json\"\\n`;\n await sb.runShell(`cat >> ~/.codex/config.toml <<'EOF'\\n${otel}EOF\\n`);\n },\n },\n send: (input, ctx) => Effect.tryPromise({\n try: () => {\n const apiKey = getApiKey();\n return sendCodexAppServer(input, ctx, {\n ...agentEnv,\n CODEX_API_KEY: apiKey,\n ...ctx.telemetry?.env,\n }, (raw, events, nativeText) => {\n const code = codexCapacityCode(raw);\n return {\n acceptance: codexAcceptance(raw, events, nativeText),\n ...(code === undefined ? {} : { cause: normalizeExternalCause({ code }) }),\n };\n });\n },\n catch: (cause) => cause,\n }),\n }), config?.postSetup, config?.preTeardown);\n}\n/**\n * 先按 `marketplace.name` 连 Marketplace(同名只连一次,`--ref` 钉版本,add 后回读注册\n * 列表校验名字真的注册上了),再装指定 Plugin。\n * 只按 codex 自己的 marketplace / plugin 协议走 —— 与 claude-code 的实现不共用命令、不共用类型。\n *\n * 注册类命令是追加式的,而 Sandbox 复用下沙箱带着上一条 attempt 的 `$HOME` 进场,所以每一步\n * 先读沙箱真实状态、把它收敛到声明,再执行 add / install(契约见 docs/feature/adapters/\n * architecture/coding-agent-extensions.md「安装收敛:不假设沙箱空白」)。空白沙箱读回为空,\n * 走的是同一条代码路径。\n */\nexport async function installPlugins(sb: Sandbox, plugins: readonly CodexPluginSpec[]): Promise<NonNullable<AgentSetupManifest[\"nativePlugins\"]>> {\n await resetPluginState(sb, plugins);\n return installPluginsFromResetState(sb, plugins);\n}\n/**\n * 在 config.toml 仍保留上一条 Attempt 的 Plugin 声明时清理声明态与安装体。\n * setup 必须先调用它再覆盖 config;直接调用 installPlugins() 时也走同一收敛入口。\n */\nasync function resetPluginState(sb: Sandbox, plugins: readonly CodexPluginSpec[]): Promise<void> {\n // 摘除顺序固定「先卸完全部同名插件、后摘 marketplace」:marketplace 注册一摘,\n // `codex plugin list` 就不再列出挂在它名下的安装(真机核对 codex-cli 0.146.0),\n // 残留的那份从此定位不到。多个插件共用一个 marketplace 时只需摘一次注册。\n for (const plugin of plugins) {\n await removeInstalledPlugins(sb, plugin.name);\n }\n const marketplaces = new Set<string>();\n for (const plugin of plugins) {\n if (marketplaces.has(plugin.marketplace.name))\n continue;\n await dropRegisteredMarketplace(sb, plugin.marketplace.name);\n marketplaces.add(plugin.marketplace.name);\n }\n}\n/** 安装阶段只接受已经由 resetPluginState() 收敛过的 Sandbox。 */\nasync function installPluginsFromResetState(sb: Sandbox, plugins: readonly CodexPluginSpec[]): Promise<NonNullable<AgentSetupManifest[\"nativePlugins\"]>> {\n const connected = new Set<string>();\n const out: NonNullable<AgentSetupManifest[\"nativePlugins\"]> = [];\n for (const plugin of plugins) {\n const { marketplace } = plugin;\n if (!connected.has(marketplace.name)) {\n const refFlag = marketplace.ref ? ` --ref ${shared.shellQuote(marketplace.ref)}` : \"\";\n // --sparse 只影响拉取速度,不影响装出来的内容;manifest 不记录它。\n const sparseFlags = (marketplace.sparse ?? [])\n .map((path) => ` --sparse ${shared.shellQuote(path)}`)\n .join(\"\");\n const add = await sb.runShell(`${shared.agentBin(\"codex\")} plugin marketplace add ${shared.shellQuote(marketplace.source)}${refFlag}${sparseFlags}`);\n if (add.exitCode !== 0) {\n throw new Error(`Could not connect ${\"codex\"} marketplace \"${marketplace.name}\" (source: ${marketplace.source}, ref: ${marketplace.ref ?? \"(default)\"}):\n${outputTail(add)}`);\n }\n // add 静默按目标仓库 manifest 的 name 注册,错名会拖到 plugin add 才炸;\n // 回读注册列表立刻校验(契约与真机复现见 marketplace.ts 顶部说明)。\n await verifyMarketplaceName(sb, {\n agent: \"codex\",\n listCommand: \"codex plugin marketplace list --json\",\n marketplace,\n knownNames: connected,\n });\n connected.add(marketplace.name);\n }\n const install = await sb.runShell(`${shared.agentBin(\"codex\")} plugin add ${shared.shellQuote(`${plugin.name}@${marketplace.name}`)}`);\n if (install.exitCode !== 0) {\n throw new Error(`Could not install ${\"codex\"} plugin \"${plugin.name}\" (marketplace: ${marketplace.name}):\n${outputTail(install)}`);\n }\n const resolvedVersion = await installedVersion(sb, plugin.name, marketplace.name);\n out.push({\n agent: \"codex\",\n marketplace: {\n name: marketplace.name,\n source: marketplace.source,\n ...(marketplace.ref !== undefined ? { ref: marketplace.ref } : {}),\n },\n name: plugin.name,\n ...(resolvedVersion !== undefined ? { resolvedVersion } : {}),\n });\n }\n return out;\n}\n/**\n * `codex plugin list --json` 的已安装条目。真实输出(实测 codex-cli 0.144.1 / 0.146.0)是\n * `{ installed: [...], available: [...] }`,已安装的这条在 `installed` 数组里,字段名是\n * `pluginId`(不是 `id`)——早前按裸数组 / `{ plugins: [...] }` 猜的形状全部猜错,\n * `installedVersion` 曾对任何真实安装恒返回 undefined(见\n * memory/native-plugin-marketplace-name-not-caller-assignable.md 的姊妹发现,2026-07-13 e2e 复现)。\n * 形状按 CLI 宽容解析,抠不出(非 JSON / 未知形状)返回 undefined,由调用方决定放行还是抛错。\n */\ninterface CodexInstalledPlugin {\n pluginId?: string;\n id?: string;\n name?: string;\n marketplaceName?: string;\n version?: string;\n}\nfunction codexInstalledPlugins(stdout: string): CodexInstalledPlugin[] | undefined {\n let raw: unknown;\n try {\n raw = JSON.parse(stdout);\n }\n catch {\n return undefined;\n }\n const arr = Array.isArray(raw)\n ? raw\n : raw && typeof raw === \"object\"\n ? (raw as {\n installed?: unknown;\n }).installed\n : undefined;\n if (!Array.isArray(arr))\n return undefined;\n return arr.filter((item): item is CodexInstalledPlugin => !!item && typeof item === \"object\");\n}\n/** 已安装条目的可寻址 id(`<plugin>@<marketplace>`);codex 的 remove 不接受裸插件名。 */\nfunction codexPluginId(entry: CodexInstalledPlugin): string | undefined {\n const id = entry.pluginId ??\n entry.id ??\n (entry.name && entry.marketplaceName ? `${entry.name}@${entry.marketplaceName}` : undefined);\n return id?.includes(\"@\") ? id : undefined;\n}\n/**\n * 与声明同名的 Plugin 已安装就先移除(不论它出自哪个 marketplace),让本条 attempt 的安装与\n * manifest 里的解析版本同源。已装即跳过会把上一条 attempt 装出的内容记成本条的安装事实。\n */\nasync function removeInstalledPlugins(sb: Sandbox, name: string): Promise<void> {\n const listCommand = \"codex plugin list --json\";\n const res = await sb.runShell(`${shared.agentBin(\"codex\")} plugin list --json`);\n const list = res.exitCode === 0 ? codexInstalledPlugins(res.stdout) : undefined;\n if (list === undefined) {\n throw new Error(`Could not read the installed ${\"codex\"} plugin list (${listCommand}):\n${outputTail(res)}`);\n }\n const ids = new Set<string>();\n for (const entry of list) {\n const id = codexPluginId(entry);\n if (id && (entry.name ?? id.split(\"@\")[0]) === name)\n ids.add(id);\n }\n for (const id of ids) {\n const remove = await sb.runShell(`${shared.agentBin(\"codex\")} plugin remove ${shared.shellQuote(id)}`);\n if (remove.exitCode !== 0) {\n throw new Error(`Could not remove the same-named installed ${\"codex\"} plugin \"${id}\":\n${outputTail(remove)}\nInstallation converges the sandbox to the declaration: a leftover install under the same name is removed first, then reinstalled from the declared marketplace.`);\n }\n }\n}\n/**\n * 按声明名字无条件摘除同名 marketplace 注册,再由调用方按声明 source 与 ref 重新 add。\n * 不以「注册在 `marketplace list --json` 里可见」为前提:注册状态分两半——用户配置里的注册项\n * 和磁盘上的 marketplace 数据。原生配置整层替换会抹掉前一半,残下的后一半 list 报告不出来,\n * add 却会撞它报 `marketplace '<name>' is already added from a different source`\n * (复用沙箱第二条 attempt 真机复现,codex-cli 0.146.0;`remove` 对这种残根照样清得掉)。\n * 「本就没有可摘的」(`is not configured or installed`,exit 1)按已收敛处理;其它失败也不在\n * 这里报错——紧随其后的 add 是权威失败面,摘不干净它会带着 codex 的原话失败。\n */\nasync function dropRegisteredMarketplace(sb: Sandbox, name: string): Promise<void> {\n await sb.runShell(`${shared.agentBin(\"codex\")} plugin marketplace remove ${shared.shellQuote(name)}`);\n}\n/** 装完回读版本;取不到不阻断安装(manifest 里 resolvedVersion 省略)。 */\nasync function installedVersion(sb: Sandbox, name: string, marketplace: string): Promise<string | undefined> {\n const res = await sb.runShell(`${shared.agentBin(\"codex\")} plugin list --json --marketplace ${shared.shellQuote(marketplace)}`);\n if (res.exitCode !== 0)\n return undefined;\n const list = codexInstalledPlugins(res.stdout);\n const hit = list?.find((p) => p.pluginId === `${name}@${marketplace}` || p.id === `${name}@${marketplace}` || p.name === name);\n return typeof hit?.version === \"string\" ? hit.version : undefined;\n}\nfunction outputTail(res: {\n stdout: string;\n stderr: string;\n}, n = 12): string {\n return (res.stdout + res.stderr).trim().split(\"\\n\").slice(-n).join(\"\\n\");\n}\nexport default codexAgent();\n"]}
1
+ {"version":3,"file":"codex.js","sourceRoot":"","sources":["codex.ts"],"names":[],"mappings":";;AA4PA,gCA+NC;AAWD,wCAGC;AAzeD,2DAAqE;AACrE,mCAAgC;AAChC,4CAAgD;AAChD,wCAAgD;AAChD,2CAAqC;AACrC,2CAAuH;AACvH,qDAAyD;AACzD,yDAAgJ;AAChJ,4DAA8D;AAC9D,qEAAqG;AACrG,qCAA2E;AAC3E,mDAA8G;AAC9G,mDAAwD;AAIxD,kEAA2G;AAC3G,mEAAqE;AAErE,sDAAwE;AACxE,0EAAmE;AACnE,+DAA2D;AAC3D,8EAA8E;AAC9E,yCAAyC;AACzC,EAAE;AACF,mDAAmD;AACnD,uEAAuE;AACvE,mBAAmB;AACnB,kEAAkE;AAClE,8EAA8E;AAC9E,kEAAkE;AAClE,MAAM,SAAS,GAAG,gBAAgB,CAAC;AACnC;;;GAGG;AACH,MAAM,oBAAoB,GAAG;IACzB,OAAO;IACP,gBAAgB;IAChB,iBAAiB;IACjB,wBAAwB;IACxB,aAAa;IACb,MAAM;CACA,CAAC;AAiFX,MAAM,oBAAoB,GAAG,IAAI,GAAG,CAAC;IACjC,kBAAkB;IAClB,mBAAmB;IACnB,oBAAoB;IACpB,mBAAmB;IACnB,gBAAgB;IAChB,kBAAkB;CACrB,CAAC,CAAC;AACH,SAAS,mBAAmB,CAAC,KAAc;IACvC,IAAI,OAAO,KAAK,KAAK,QAAQ;QACzB,OAAO,SAAS,CAAC;IACrB,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;AAC7D,CAAC;AACD,SAAS,iBAAiB,CAAC,GAAuB;IAC9C,IAAI,GAAG,KAAK,SAAS;QACjB,OAAO,SAAS,CAAC;IACrB,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACjC,IAAI,CAAC;YACD,MAAM,KAAK,GAAY,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACxC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;gBACnC,SAAS;YACb,MAAM,MAAM,GAAG,KAA2C,CAAC;YAC3D,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;YAC3B,MAAM,UAAU,GAAG;gBACf,MAAM,CAAC,IAAI;gBACX,MAAM,CAAC,MAAM;gBACb,MAAM,CAAC,IAAI;gBACX,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAE,KAA4C,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;gBACnG,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAE,KAA4C,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;gBACrG,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAE,KAA4C,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;aACtG,CAAC;YACF,MAAM,IAAI,GAAG,UAAU,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,KAAK,SAAS,IAAI,oBAAoB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;YACrI,IAAI,IAAI,KAAK,SAAS;gBAClB,OAAO,IAAI,CAAC;QACpB,CAAC;QACD,MAAM,CAAC;YACH,gFAAgF;QACpF,CAAC;IACL,CAAC;IACD,OAAO,SAAS,CAAC;AACrB,CAAC;AACD,SAAS,oBAAoB,CAAC,GAAuB;IACjD,IAAI,GAAG,KAAK,SAAS;QACjB,OAAO,EAAE,CAAC;IACd,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACjC,IAAI,CAAC;YACD,MAAM,KAAK,GAAY,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACxC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;gBACnC,SAAS;YACb,MAAM,MAAM,GAAG,KAA2C,CAAC;YAC3D,IAAI,MAAM,CAAC,IAAI,KAAK,aAAa,IAAI,MAAM,CAAC,IAAI,KAAK,iBAAiB;gBAClE,SAAS;YACb,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;YAC3B,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;gBACrC,MAAM,OAAO,GAAI,KAA4C,CAAC,OAAO,CAAC;gBACtE,IAAI,OAAO,OAAO,KAAK,QAAQ;oBAC3B,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC/B,CAAC;QACL,CAAC;QACD,MAAM,CAAC;YACH,gFAAgF;QACpF,CAAC;IACL,CAAC;IACD,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC/B,CAAC;AACD,MAAM,mBAAmB,GAAG,8FAA8F,CAAC;AAC3H,SAAS,wBAAwB,CAAC,OAAoB;IAClD,IAAI,OAAO,CAAC,UAAU,KAAK,UAAU;QACjC,OAAO,KAAK,CAAC;IACjB,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,IAAI,IAAA,2CAAwB,EAAC,OAAO,CAAC,MAAM,CAAC,KAAK,SAAS;QACtF,OAAO,KAAK,CAAC;IACjB,KAAK,IAAI,KAAK,GAAG,OAAO,CAAC,KAAK,EAAE,KAAK,KAAK,SAAS,GAAG,CAAC;QACnD,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACpD,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,mBAAmB,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YAC/F,IAAI,IAAI,KAAK,SAAS,IAAI,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC;gBACpD,OAAO,IAAI,CAAC;YAChB,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;YACrE,SAAS;QACb,CAAC;QACD,KAAK,GAAG,SAAS,CAAC;IACtB,CAAC;IACD,OAAO,mBAAmB,CAAC,IAAI,CAAC,IAAA,kCAAe,EAAC,OAAO,CAAC,CAAC,CAAC;AAC9D,CAAC;AACD,SAAS,wBAAwB,CAAC,OAAoB;IAClD,OAAO,wBAAwB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;AACzG,CAAC;AACD,SAAS,eAAe,CAAC,GAAuB,EAAE,MAAoD,EAAE,eAAe,GAAG,EAAE;IACxH,MAAM,UAAU,GAAG,IAAA,2CAAwB,EAAC,MAAM,CAAC,CAAC;IACpD,IAAI,UAAU,KAAK,SAAS;QACxB,OAAO,SAAS,CAAC;IACrB,OAAO,iBAAiB,CAAC,GAAG,CAAC,KAAK,SAAS,IAAI,mBAAmB,CAAC,IAAI,CAAC,GAAG,oBAAoB,CAAC,GAAG,CAAC,KAAK,eAAe,EAAE,CAAC;QACvH,CAAC,CAAC,UAAU;QACZ,CAAC,CAAC,UAAU,CAAC;AACrB,CAAC;AACD;;;;GAIG;AACH,SAAS,oBAAoB,CAAC,QAA+B,EAAE,OAAe;IAI1E,MAAM,MAAM,GAAG,QAAQ,CAAC,EAAE,KAAK,OAAO,IAAI,QAAQ,CAAC,IAAI,KAAK,KAAK;QAC7D,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,2BAA2B,EAAE;QAC9D,CAAC,CAAC,QAAQ,CAAC,EAAE,KAAK,OAAO,IAAI,QAAQ,CAAC,IAAI,KAAK,OAAO;YAClD,CAAC,CAAC,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,4BAA4B,EAAE;YACjE,CAAC,CAAC,QAAQ,CAAC,EAAE,KAAK,QAAQ,IAAI,QAAQ,CAAC,IAAI,KAAK,KAAK;gBACjD,CAAC,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,qBAAqB,EAAE;gBACzD,CAAC,CAAC,QAAQ,CAAC,EAAE,KAAK,QAAQ,IAAI,QAAQ,CAAC,IAAI,KAAK,OAAO;oBACnD,CAAC,CAAC,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,sBAAsB,EAAE;oBAC5D,CAAC,CAAC,SAAS,CAAC;IAC5B,IAAI,MAAM,KAAK,SAAS;QACpB,OAAO,SAAS,CAAC;IACrB,OAAO;QACH,IAAI,EAAE,iBAAiB,OAAO,IAAI,MAAM,CAAC,MAAM,EAAE;QACjD,OAAO,EAAE,UAAU,MAAM,CAAC,MAAM,YAAY;KAC/C,CAAC;AACN,CAAC;AACD,gEAAgE;AAChE,gEAAgE;AAChE,mDAAmD;AACnD,mBAAmB;AACnB,MAAM,kCAAkC,GAAG,SAAS,CAAC;AACrD,uCAAuC;AACvC,sDAAsD;AACtD,oEAAoE;AACpE,SAAgB,UAAU,CAAC,MAAoB;IAC3C,MAAM,SAAS,GAAG,GAAG,EAAE,CAAC,MAAM,EAAE,MAAM,IAAI,IAAA,oBAAU,EAAC,eAAe,CAAC,CAAC;IACtE,MAAM,UAAU,GAAG,GAAG,EAAE,CAAC,MAAM,EAAE,OAAO,IAAI,IAAA,gBAAM,EAAC,gBAAgB,CAAC,CAAC;IACrE,gEAAgE;IAChE,oDAAoD;IACpD,+DAA+D;IAC/D,IAAI,MAAM,EAAE,GAAG,IAAI,MAAM,IAAI,MAAM,CAAC,GAAG,EAAE,CAAC;QACtC,MAAM,IAAI,SAAS,CAAC,wSAAwS,CAAC,CAAC;IAClU,CAAC;IACD,uDAAuD;IACvD,uEAAuE;IACvE,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;IAC3D,MAAM,uBAAuB,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;IACvE,MAAM,UAAU,GAAG,MAAM,EAAE,OAAO,EAAE,MAAM;QACtC,CAAC,CAAC,kCAAkC;QACpC,CAAC,CAAC,kDAAyB,CAAC;IAChC,MAAM,iBAAiB,GAAG,MAAM,EAAE,OAAO,EAAE,MAAM;QAC7C,CAAC,CAAC,qBAAqB;QACvB,CAAC,CAAC,MAAM,CAAC,uDAA8B,CAAC,KAAK,CAAC,CAAC;IACnD,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,IAAA,qCAAqB,EAAC;QAChD,QAAQ,EAAE;YACN,KAAK,EAAE,OAAO;YACd,OAAO,EAAE,UAAU;YACnB,QAAQ,EAAE,iBAAiB;SAC9B;QACD,WAAW,EAAE,eAAe;QAC5B,GAAG,EAAE,OAAO;QACZ,eAAe,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,oBAAoB,CAAC,QAAQ,EAAE,UAAU,CAAC;QACzE,QAAQ,EAAE;YACN,QAAQ,EAAE,sBAAsB,UAAU,EAAE;YAC5C,UAAU,EAAE,wCAAwC,UAAU,EAAE;YAChE,KAAK,EAAE,aAAa,UAAU,QAAQ;SACzC;KACJ,CAAC,CAAC;IACH,OAAO,IAAA,kDAAkC,EAAC,IAAA,4BAAgB,EAAC;QACvD,IAAI,EAAE,OAAO;QACb,uDAAuD;QACvD,gBAAgB,EAAE,sCAAwB;QAC1C,UAAU,EAAE,wBAAa;QACzB,mBAAmB,EAAE,wBAAwB;QAC7C,MAAM;QACN,UAAU,EAAE,CAAC,SAAS,CAAC;QACvB,KAAK,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,eAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;YACpC,KAAK,CAAC,CAAC,eAAM,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,IAAA,4CAA+B,EAAC,EAAE,EAAE,OAAO,CAAC,EAAE,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC;YACxG,iDAAiD;YACjD,gFAAgF;YAChF,IAAI,YAA4C,CAAC;YACjD,IAAI,MAAM,EAAE,UAAU,KAAK,SAAS,EAAE,CAAC;gBACnC,YAAY,GAAG,KAAK,CAAC,CAAC,IAAA,6CAA0B,EAAC,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;gBACnH,KAAK,CAAC,CAAC,eAAM,CAAC,GAAG,CAAC;oBACd,GAAG,EAAE,GAAG,EAAE,CAAC,IAAA,yCAAsB,EAAC,YAAa,EAAE;wBAC7C,KAAK,EAAE,OAAO;wBACd,KAAK,EAAE,YAAY;wBACnB,YAAY,EAAE,oBAAoB;qBACrC,CAAC;oBACF,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK;iBAC1B,CAAC,CAAC;YACP,CAAC;YACD,2DAA2D;YAC3D,oDAAoD;YACpD,kCAAkC;YAClC,IAAI,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;gBAC1B,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;gBAC/B,KAAK,CAAC,CAAC,eAAM,CAAC,UAAU,CAAC;oBACrB,GAAG,EAAE,GAAG,EAAE,CAAC,gBAAgB,CAAC,EAAE,EAAE,OAAO,CAAC;oBACxC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK;iBAC1B,CAAC,CAAC;YACP,CAAC;YACD,4DAA4D;YAC5D,4BAA4B;YAC5B,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,YAAY,GAAG,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9D,MAAM,UAAU,GAAG,GAAG,CAAC,eAAe,KAAK,SAAS;gBAChD,CAAC,CAAC,EAAE;gBACJ,CAAC,CAAC,6BAA6B,GAAG,CAAC,eAAe,KAAK,CAAC;YAC5D,MAAM,IAAI,GAAG,UAAU,EAAE,CAAC;YAC1B,kDAAkD;YAClD,uEAAuE;YACvE,2CAA2C;YAC3C,MAAM,uBAAuB,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACnD,MAAM,QAAQ,GAAG,IAAI;gBACjB,CAAC,CAAC,SAAS,GAAG,0BAA0B,GAAG,UAAU;gBACrD,CAAC,CAAC,SAAS,GAAG,UAAU,CAAC;YAC7B,MAAM,aAAa,GAAG,IAAI;gBACtB,CAAC,CAAC,yBAAyB;oBACvB,gBAAgB;oBAChB,eAAe,IAAI,KAAK;oBACxB,6BAA6B;oBAC7B,0BAA0B;gBAC9B,CAAC,CAAC,EAAE,CAAC;YACT,IAAI,CAAC,YAAY,EAAE,CAAC;gBAChB,KAAK,CAAC,CAAC,eAAM,CAAC,UAAU,CAAC;oBACrB,GAAG,EAAE,GAAG,EAAE,CAAC,kBAAM,CAAC,SAAS,CAAC,EAAE,EAAE,sBAAsB,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,QAAQ,KAAK,aAAa,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,EAAE,eAAe,EAAE,uBAAuB,EAAE,CAAC;oBACjK,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK;iBAC1B,CAAC,CAAC;YACP,CAAC;iBACI,CAAC;gBACF,6DAA6D;gBAC7D,8CAA8C;gBAC9C,+CAA+C;gBAC/C,kEAAkE;gBAClE,4BAA4B;gBAC5B,KAAK,CAAC,CAAC,eAAM,CAAC,UAAU,CAAC;oBACrB,GAAG,EAAE,GAAG,EAAE,CAAC,kBAAM,CAAC,SAAS,CAAC,EAAE,EAAE,sBAAsB,EAAE,QAAQ,CAAC;oBACjE,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK;iBAC1B,CAAC,CAAC;gBACH,KAAK,CAAC,CAAC,IAAA,+CAA4B,EAAC,EAAE,EAAE,YAAY,EAAE,sBAAsB,CAAC,CAAC;gBAC9E,IAAI,aAAa,EAAE,CAAC;oBAChB,KAAK,CAAC,CAAC,eAAM,CAAC,UAAU,CAAC;wBACrB,GAAG,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,4DAA4D,aAAa,yBAAyB,EAAE,EAAE,MAAM,EAAE,eAAe,EAAE,uBAAuB,EAAE,CAAC;wBACtL,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK;qBAC1B,CAAC,CAAC;gBACP,CAAC;YACL,CAAC;YACD,KAAK,CAAC,CAAC,eAAM,CAAC,UAAU,CAAC;gBACrB,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;oBAClB,IAAI,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC;wBAC7B,IAAA,yBAAgB,EAAC,MAAM,CAAC,UAAU,CAAC,CAAC;wBACpC,MAAM,eAAe,GAAa,EAAE,CAAC;wBACrC,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU;6BAC5B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;4BACX,qDAAqD;4BACrD,wDAAwD;4BACxD,MAAM,KAAK,GAAa,CAAC,gBAAgB,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC;4BACpD,IAAI,IAAA,kBAAS,EAAC,CAAC,CAAC,EAAE,CAAC;gCACf,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;gCAC/B,MAAM,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC;gCAC1B,IAAI,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC;oCACzC,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,IAAI,gBAAgB,CAAC,CAAC;oCACnD,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;wCAC3C,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;wCACxB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;oCAClC,CAAC;gCACL,CAAC;4BACL,CAAC;iCACI,CAAC;gCACF,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC;gCACvC,IAAI,CAAC,CAAC,IAAI,EAAE,MAAM;oCACd,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gCACrE,MAAM,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC;gCAClB,IAAI,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC;oCACjC,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC;oCAC1C,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;wCACvC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;wCACxB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;oCAChC,CAAC;gCACL,CAAC;4BACL,CAAC;4BACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;wBAC5B,CAAC,CAAC;6BACG,IAAI,CAAC,MAAM,CAAC,CAAC;wBAClB,MAAM,EAAE,CAAC,QAAQ,CAAC,6CAA6C,OAAO,YAAY,EAAE,EAAE,eAAe,EAAE,MAAM,EAAE,CAAC,CAAC;oBACrH,CAAC;oBACD,MAAM,QAAQ,GAAuB,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;oBACpD,IAAI,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;wBACzB,QAAQ,CAAC,MAAM,GAAG,MAAM,IAAA,yBAAa,EAAC,EAAE,EAAE,MAAM,CAAC,MAAM,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,CAAC;wBAC7E,qDAAqD;wBACrD,MAAM,IAAA,oCAAwB,EAAC,EAAE,EAAE,IAAA,qCAAyB,EAAC,SAAS,EAAE,IAAA,+BAAmB,EAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;oBACnH,CAAC;oBACD,IAAI,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;wBAC1B,QAAQ,CAAC,aAAa,GAAG,MAAM,4BAA4B,CAAC,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;oBACpF,CAAC;oBACD,IAAI,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC;wBAC7B,6DAA6D;wBAC7D,QAAQ,CAAC,UAAU,GAAG,IAAA,2BAAkB,EAAC,MAAM,CAAC,UAAU,CAAC,CAAC;oBAChE,CAAC;oBACD,IAAI,YAAY,EAAE,CAAC;wBACf,qCAAqC;wBACrC,QAAQ,CAAC,gBAAgB,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC,MAAM,EAAE,CAAC;oBACzG,CAAC;oBACD,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM;wBACtB,QAAQ,CAAC,aAAa,EAAE,MAAM;wBAC9B,QAAQ,CAAC,UAAU,EAAE,MAAM;wBAC3B,QAAQ,CAAC,gBAAgB,EAAE,CAAC;wBAC5B,GAAG,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;oBAC9B,CAAC;oBACD,gEAAgE;oBAChE,gBAAgB;oBAChB,MAAM,IAAA,iCAAiB,EAAC,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;gBACjE,CAAC;gBACD,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK;aAC1B,CAAC,CAAC;QACP,CAAC,CAAC;QACF,QAAQ,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,eAAM,CAAC,UAAU,CAAC;YACrC,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;gBAClB,yDAAyD;gBACzD,oCAAoC;gBACpC,MAAM,IAAA,mCAAmB,EAAC,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;gBAChF,MAAM,IAAA,uCAAgB,EAAC,GAAG,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;YACrD,CAAC;YACD,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK;SAC1B,CAAC;QACF,OAAO,EAAE;YACL,QAAQ,EAAE,WAAW;YACrB,KAAK,CAAC,SAAS,CAAC,EAAE,EAAE,GAAG;gBACnB,MAAM,QAAQ,GAAG,GAAG,CAAC,SAAU,CAAC,QAAQ,CAAC;gBACzC,MAAM,IAAI,GAAG,YAAY;oBACrB,4BAA4B;oBAC5B,qBAAqB;oBACrB,+BAA+B;oBAC/B,mCAAmC;oBACnC,eAAe,QAAQ,KAAK;oBAC5B,qBAAqB,CAAC;gBAC1B,MAAM,EAAE,CAAC,QAAQ,CAAC,wCAAwC,IAAI,OAAO,CAAC,CAAC;YAC3E,CAAC;SACJ;QACD,IAAI,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC,eAAM,CAAC,UAAU,CAAC;YACpC,GAAG,EAAE,GAAG,EAAE;gBACN,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;gBAC3B,OAAO,IAAA,wCAAkB,EAAC,KAAK,EAAE,GAAG,EAAE;oBAClC,GAAG,QAAQ;oBACX,aAAa,EAAE,MAAM;oBACrB,GAAG,GAAG,CAAC,SAAS,EAAE,GAAG;iBACxB,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE;oBAC3B,MAAM,IAAI,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;oBACpC,OAAO;wBACH,UAAU,EAAE,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,CAAC;wBACpD,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAA,0CAAsB,EAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;qBAC7E,CAAC;gBACN,CAAC,CAAC,CAAC;YACP,CAAC;YACD,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK;SAC1B,CAAC;KACL,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;AAChD,CAAC;AACD;;;;;;;;;GASG;AACI,KAAK,UAAU,cAAc,CAAC,EAAW,EAAE,OAAmC;IACjF,MAAM,gBAAgB,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;IACpC,OAAO,4BAA4B,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;AACrD,CAAC;AACD;;;GAGG;AACH,KAAK,UAAU,gBAAgB,CAAC,EAAW,EAAE,OAAmC;IAC5E,qDAAqD;IACrD,6DAA6D;IAC7D,6CAA6C;IAC7C,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC3B,MAAM,sBAAsB,CAAC,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IAClD,CAAC;IACD,MAAM,YAAY,GAAG,IAAI,GAAG,EAAU,CAAC;IACvC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC3B,IAAI,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC;YACzC,SAAS;QACb,MAAM,yBAAyB,CAAC,EAAE,EAAE,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QAC7D,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAC9C,CAAC;AACL,CAAC;AACD,kDAAkD;AAClD,KAAK,UAAU,4BAA4B,CAAC,EAAW,EAAE,OAAmC;IACxF,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;IACpC,MAAM,GAAG,GAAqD,EAAE,CAAC;IACjE,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC3B,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,CAAC;QAC/B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;YACnC,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,kBAAM,CAAC,UAAU,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACtF,4CAA4C;YAC5C,MAAM,WAAW,GAAG,CAAC,WAAW,CAAC,MAAM,IAAI,EAAE,CAAC;iBACzC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,kBAAM,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;iBACrD,IAAI,CAAC,EAAE,CAAC,CAAC;YACd,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,GAAG,kBAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,2BAA2B,kBAAM,CAAC,UAAU,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,OAAO,GAAG,WAAW,EAAE,CAAC,CAAC;YACrJ,IAAI,GAAG,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;gBACrB,MAAM,IAAI,KAAK,CAAC,qBAAqB,OAAO,iBAAiB,WAAW,CAAC,IAAI,cAAc,WAAW,CAAC,MAAM,UAAU,WAAW,CAAC,GAAG,IAAI,WAAW;EACnK,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACT,CAAC;YACD,sDAAsD;YACtD,4CAA4C;YAC5C,MAAM,IAAA,sCAAqB,EAAC,EAAE,EAAE;gBAC5B,KAAK,EAAE,OAAO;gBACd,WAAW,EAAE,sCAAsC;gBACnD,WAAW;gBACX,UAAU,EAAE,SAAS;aACxB,CAAC,CAAC;YACH,SAAS,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QACpC,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,GAAG,kBAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,eAAe,kBAAM,CAAC,UAAU,CAAC,GAAG,MAAM,CAAC,IAAI,IAAI,WAAW,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;QACvI,IAAI,OAAO,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,qBAAqB,OAAO,YAAY,MAAM,CAAC,IAAI,mBAAmB,WAAW,CAAC,IAAI;EAChH,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACjB,CAAC;QACD,MAAM,eAAe,GAAG,MAAM,gBAAgB,CAAC,EAAE,EAAE,MAAM,CAAC,IAAI,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC;QAClF,GAAG,CAAC,IAAI,CAAC;YACL,KAAK,EAAE,OAAO;YACd,WAAW,EAAE;gBACT,IAAI,EAAE,WAAW,CAAC,IAAI;gBACtB,MAAM,EAAE,WAAW,CAAC,MAAM;gBAC1B,GAAG,CAAC,WAAW,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,WAAW,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACrE;YACD,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,GAAG,CAAC,eAAe,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAChE,CAAC,CAAC;IACP,CAAC;IACD,OAAO,GAAG,CAAC;AACf,CAAC;AAgBD,SAAS,qBAAqB,CAAC,MAAc;IACzC,IAAI,GAAY,CAAC;IACjB,IAAI,CAAC;QACD,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC7B,CAAC;IACD,MAAM,CAAC;QACH,OAAO,SAAS,CAAC;IACrB,CAAC;IACD,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;QAC1B,CAAC,CAAC,GAAG;QACL,CAAC,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;YAC5B,CAAC,CAAE,GAED,CAAC,SAAS;YACZ,CAAC,CAAC,SAAS,CAAC;IACpB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;QACnB,OAAO,SAAS,CAAC;IACrB,OAAO,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,EAAgC,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC;AAClG,CAAC;AACD,qEAAqE;AACrE,SAAS,aAAa,CAAC,KAA2B;IAC9C,MAAM,EAAE,GAAG,KAAK,CAAC,QAAQ;QACrB,KAAK,CAAC,EAAE;QACR,CAAC,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IACjG,OAAO,EAAE,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;AAC9C,CAAC;AACD;;;GAGG;AACH,KAAK,UAAU,sBAAsB,CAAC,EAAW,EAAE,IAAY;IAC3D,MAAM,WAAW,GAAG,0BAA0B,CAAC;IAC/C,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,GAAG,kBAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;IAChF,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,qBAAqB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAChF,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,gCAAgC,OAAO,iBAAiB,WAAW;EACzF,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IACD,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU,CAAC;IAC9B,KAAK,MAAM,KAAK,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,EAAE,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;QAChC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI;YAC/C,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC;IACD,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;QACnB,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,GAAG,kBAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,kBAAkB,kBAAM,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QACvG,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,6CAA6C,OAAO,YAAY,EAAE;EAC5F,UAAU,CAAC,MAAM,CAAC;gKAC4I,CAAC,CAAC;QAC1J,CAAC;IACL,CAAC;AACL,CAAC;AACD;;;;;;;;GAQG;AACH,KAAK,UAAU,yBAAyB,CAAC,EAAW,EAAE,IAAY;IAC9D,MAAM,EAAE,CAAC,QAAQ,CAAC,GAAG,kBAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,8BAA8B,kBAAM,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC1G,CAAC;AACD,sDAAsD;AACtD,KAAK,UAAU,gBAAgB,CAAC,EAAW,EAAE,IAAY,EAAE,WAAmB;IAC1E,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,GAAG,kBAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,qCAAqC,kBAAM,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;IAChI,IAAI,GAAG,CAAC,QAAQ,KAAK,CAAC;QAClB,OAAO,SAAS,CAAC;IACrB,MAAM,IAAI,GAAG,qBAAqB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC/C,MAAM,GAAG,GAAG,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,GAAG,IAAI,IAAI,WAAW,EAAE,IAAI,CAAC,CAAC,EAAE,KAAK,GAAG,IAAI,IAAI,WAAW,EAAE,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IAC/H,OAAO,OAAO,GAAG,EAAE,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;AACtE,CAAC;AACD,SAAS,UAAU,CAAC,GAGnB,EAAE,CAAC,GAAG,EAAE;IACL,OAAO,CAAC,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC7E,CAAC;AACD,kBAAe,UAAU,EAAE,CAAC","sourcesContent":["import { completeEvidenceCoverage } from \"../assertions/coverage.ts\";\nimport { Effect } from \"effect\";\nimport { makeSandboxAgent } from \"../define.ts\";\nimport { requireEnv, getEnv } from \"../util.ts\";\nimport { shared } from \"./shared.ts\";\nimport { appendProjectInstruction, installSkills, installedSkillNames, skillDiscoveryInstruction, } from \"./skills.ts\";\nimport { verifyMarketplaceName } from \"./marketplace.ts\";\nimport { appendNativeConfigFileEffect, assertTomlNativeConfig, loadNativeConfigFileEffect, type LoadedNativeConfig, } from \"./native-config.ts\";\nimport { mapCodexSpans } from \"../o11y/otlp/mappers/codex.ts\";\nimport { DEFAULT_CODEX_CLI_VERSION, AGENT_BASELINE_RECIPE_REVISION } from \"./coding-cli-versions.ts\";\nimport { assertMcpServers, isHttpMcp, mcpManifestEntries } from \"./mcp.ts\";\nimport { registerAgentLifecycleHookCommands, runPostSetupHooks, runPreTeardownHooks, } from \"./post-setup.ts\";\nimport { createNpmCliInstaller } from \"./npm-staged.ts\";\nimport type { Agent, AgentSetupManifest, McpServer, Sandbox, SkillSpec } from \"../types.ts\";\nimport type { SandboxCommand } from \"../sandbox/commands.ts\";\nimport type { AgentArtifactPlatform } from \"./types.ts\";\nimport { sendAcceptanceFromEvents, sendFailureText, type SendFailure, } from \"../context/send-failures.ts\";\nimport { normalizeExternalCause } from \"../shared/external-cause.ts\";\nimport type { FailureClass } from \"../shared/failure-class.ts\";\nimport { requireManagedProcessCapability } from \"../sandbox/backend.ts\";\nimport { attemptResources } from \"../context/attempt-resources.ts\";\nimport { sendCodexAppServer } from \"./codex-app-server.ts\";\n// ───────────────────────────────────────────────────────────────────────────\n// OpenAI Codex CLI 的 agent adapter(沙箱型)。\n//\n// 连接方式:在沙箱里维护 Codex app-server stdio,原生通知 → 标准事件流。\n// 配置:鉴权本地(config / env),模型交给实验(ctx.model),推理努力程度经 ctx.reasoningEffort,\n// 其余参数经 ctx.flags。\n// 扩展(skill / plugin / MCP)是构造参数,setup 翻译成 codex 的原生形态并写 manifest。\n// ───────────────────────────────────────────────────────────────────────────\n/** codex 的 skill 目录(`skills` 生态的「通用」目录);codex 不原生扫描它,靠下面的发现指引。 */\nconst SKILL_DIR = \".agents/skills\";\n/**\n * `configFile` 的保留键:model / provider 路由 / 推理努力归 experiment 与 Adapter 的生成层,\n * MCP 表与 OTel 导出归 Adapter。清单定稿见 docs/feature/adapters/sdk/codex-cli/README.md。\n */\nconst RESERVED_CONFIG_KEYS = [\n \"model\",\n \"model_provider\",\n \"model_providers\",\n \"model_reasoning_effort\",\n \"mcp_servers\",\n \"otel\",\n] as const;\n/**\n * Codex 的原生 Plugin —— **只属于 Codex**,不能传给 Claude Code(它有自己的\n * {@link import(\"./claude-code.ts\").ClaudeCodePluginSpec})。字段当前相似不等于同一个类型:\n * 任一方的 Marketplace 鉴权、锁文件、选择规则或安装参数变化时,另一方不必接受无意义字段。\n */\nexport interface CodexPluginSpec {\n marketplace: {\n /** 目标仓库 manifest 声明的真实 name;CLI 不支持由调用方另取连接别名。 */\n name: string;\n /** Marketplace 来源:`owner/repo`、Git URL 或本地路径。 */\n source: string;\n /** 固定 Marketplace 的 Tag、Commit 或 Branch(→ `codex plugin marketplace add --ref`)。 */\n ref?: string;\n /**\n * sparse 拉取的路径列表,每项生成一个 `codex plugin marketplace add --sparse <path>`\n * (codex 的 `--sparse` 必须带路径参数、可重复):大仓库只取插件所需路径,省略或空数组即全量 clone。\n * 只影响拉取速度,不影响装出来的内容;manifest 不记录它。\n */\n sparse?: readonly string[];\n };\n /** Marketplace 中的 Plugin 名。 */\n name: string;\n}\nexport interface CodexConfig {\n /** 代理 / OpenAI API key。省略时读 CODEX_API_KEY env。 */\n apiKey?: string;\n /** OpenAI 兼容代理 base URL(如 https://s2a.example.com/v1)。省略时读 CODEX_BASE_URL env。 */\n baseUrl?: string;\n /**\n * 注入每次 Codex CLI 进程的额外环境变量。首轮 `codex exec` 与续轮 `codex exec resume`\n * 使用同一份声明;Codex 启动的 lifecycle Hook、MCP 动态 header 与命令子进程都会继承。\n * 值只经 Sandbox command options 传入,不拼进 shell 文本或写入 setup manifest,并全部按\n * 潜在敏感值从 timing / execution / error 证据中脱敏。`CODEX_API_KEY` 仍由 `apiKey` 或\n * 宿主同名环境变量提供,Adapter 的鉴权值会覆盖这里的同名键。\n * env value 不进入 carry 身份。会改变被测行为的非敏感值必须同时声明在 Experiment flags\n * 或所属 Plugin identity;只轮换凭据不会让旧结果失效。\n * `PATH` 是 Sandbox 受管变量,不接受经这里声明——出现即在 factory 构造时报错,改用\n * Sandbox factory 的 `pathPrepend`(见 docs/feature/sandbox/library.md)。\n */\n env?: Readonly<globalThis.Record<string, string>>;\n /**\n * 额外 MCP server(每个 Sandbox setup 时追加进 ~/.codex/config.toml)。\n * stdio 形态(command/args/env)写 [mcp_servers.<name>] 的 command 行;\n * Streamable HTTP 形态(url/headers)写 url 行,headers 进 [mcp_servers.<name>.http_headers] 子表。\n */\n mcpServers?: readonly McpServer[];\n /**\n * 装进 Sandbox 的 Skill(本地目录/文件,或 repo + 可钉 ref + 可选启用集)。\n * 落在 `.agents/skills/<name>/`,并写一段发现指引进 AGENTS.md —— codex 没有 Claude Code 那种\n * 原生 Skill 工具,只把文件装进去它不会自己去读(见 memory/codex-no-native-skill-tool.md)。\n */\n skills?: readonly SkillSpec[];\n /** Codex 原生 Plugin(先连 Marketplace,再从中装指定 Plugin)。 */\n plugins?: readonly CodexPluginSpec[];\n /**\n * 一份完整的 Codex `config.toml`(官方 TOML 格式)在本地项目里的路径 —— 相对运行\n * niceeval 的项目根(含 `niceeval.config.ts` 的目录)解析,不是 Sandbox 内路径;只接受\n * 项目根内的相对路径,包含 `..` 的路径、绝对路径、`~` 路径和解析后逃出项目根的符号链接\n * 都在 setup 阶段报错。原始字节原样并入 Sandbox 里原本为空的用户级 `~/.codex/config.toml`\n * (不继承宿主机配置、不解析后重写);保留键 `model`、`model_provider`、`model_providers`、\n * `model_reasoning_effort`、`mcp_servers`、`otel` 出现在文件里 setup 报错。manifest 只记\n * 项目相对路径与字节 SHA-256,不落正文。\n */\n configFile?: string;\n /**\n * 安装后按数组顺序运行的用户 Hook(复用 SandboxCommand 的窄上下文):在写主配置、挂 MCP、\n * 装 Skills / Plugin、写 manifest 全部完成后执行,适合跑插件自带的 setup 脚本这类\n * 「安装产物就位后才能跑」的过程动作。抛错按基础设施错误计(attempt errored)。\n * 见 docs/feature/adapters/library/coding-agent-extensions.md「安装后运行脚本」。\n */\n postSetup?: readonly SandboxCommand[];\n /**\n * 与 `postSetup` 成对的收尾 Hook:按 `postSetup` 的逆序语义,在 agent 自己的 teardown 步骤\n * 之前执行(LIFO 镜像 —— `postSetup` 跑在 agent 安装之后,`preTeardown` 就跑在 agent 收尾\n * 之前),当且仅当 `postSetup` 的时点走到过才触发。抛错按基础设施错误计,由 teardown 段\n * 按 teardown-failed 诊断收束。\n * 见 docs/feature/adapters/library/coding-agent-extensions.md「安装后运行脚本」。\n */\n preTeardown?: readonly SandboxCommand[];\n}\nconst CODEX_CAPACITY_CODES = new Set([\n \"ADMISSION_FAILED\",\n \"ADMISSION_FAILURE\",\n \"ADMISSION_REJECTED\",\n \"MODEL_AT_CAPACITY\",\n \"MODEL_CAPACITY\",\n \"MODEL_OVERLOADED\",\n]);\nfunction normalizedCodexCode(value: unknown): string | undefined {\n if (typeof value !== \"string\")\n return undefined;\n return value.trim().toUpperCase().replace(/[ -]+/g, \"_\");\n}\nfunction codexCapacityCode(raw: string | undefined): string | undefined {\n if (raw === undefined)\n return undefined;\n for (const line of raw.split(\"\\n\")) {\n try {\n const value: unknown = JSON.parse(line);\n if (!value || typeof value !== \"object\")\n continue;\n const record = value as globalThis.Record<string, unknown>;\n const error = record.error;\n const candidates = [\n record.code,\n record.reason,\n record.type,\n error && typeof error === \"object\" ? (error as globalThis.Record<string, unknown>).code : undefined,\n error && typeof error === \"object\" ? (error as globalThis.Record<string, unknown>).reason : undefined,\n error && typeof error === \"object\" ? (error as globalThis.Record<string, unknown>).type : undefined,\n ];\n const code = candidates.map(normalizedCodexCode).find((candidate) => candidate !== undefined && CODEX_CAPACITY_CODES.has(candidate));\n if (code !== undefined)\n return code;\n }\n catch {\n // Native stderr fallback is handled separately and remains deliberately narrow.\n }\n }\n return undefined;\n}\nfunction codexCapacityMessage(raw: string | undefined): string {\n if (raw === undefined)\n return \"\";\n const messages: string[] = [];\n for (const line of raw.split(\"\\n\")) {\n try {\n const value: unknown = JSON.parse(line);\n if (!value || typeof value !== \"object\")\n continue;\n const record = value as globalThis.Record<string, unknown>;\n if (record.type !== \"turn.failed\" && record.type !== \"response.failed\")\n continue;\n const error = record.error;\n if (error && typeof error === \"object\") {\n const message = (error as globalThis.Record<string, unknown>).message;\n if (typeof message === \"string\")\n messages.push(message);\n }\n }\n catch {\n // Native stderr fallback is handled separately and remains deliberately narrow.\n }\n }\n return messages.join(\"\\n\");\n}\nconst CODEX_CAPACITY_TEXT = /\\bmodel(?:[ _-]+is)?[ _-]+at[ _-]+capacity\\b|\\badmission[ _-]+(?:failed|failure|rejected)\\b/i;\nfunction codexCapacityFromFailure(failure: SendFailure): boolean {\n if (failure.acceptance !== \"rejected\")\n return false;\n if (failure.events !== undefined && sendAcceptanceFromEvents(failure.events) === \"started\")\n return false;\n for (let cause = failure.cause; cause !== undefined;) {\n if (cause._tag === \"Error\" || cause._tag === \"Object\") {\n const code = cause.code._tag === \"Present\" ? normalizedCodexCode(cause.code.value) : undefined;\n if (code !== undefined && CODEX_CAPACITY_CODES.has(code))\n return true;\n cause = cause.cause._tag === \"Cause\" ? cause.cause.value : undefined;\n continue;\n }\n cause = undefined;\n }\n return CODEX_CAPACITY_TEXT.test(sendFailureText(failure));\n}\nfunction classifyCodexSendFailure(failure: SendFailure): FailureClass | undefined {\n return codexCapacityFromFailure(failure) ? { retryable: true, reason: \"model_capacity\" } : undefined;\n}\nfunction codexAcceptance(raw: string | undefined, events: readonly import(\"../types.ts\").StreamEvent[], nativeErrorText = \"\"): \"rejected\" | \"started\" | \"unknown\" {\n const acceptance = sendAcceptanceFromEvents(events);\n if (acceptance === \"started\")\n return \"started\";\n return codexCapacityCode(raw) !== undefined || CODEX_CAPACITY_TEXT.test(`${codexCapacityMessage(raw)}\\n${nativeErrorText}`)\n ? \"rejected\"\n : acceptance;\n}\n/**\n * `@openai/codex` 的 npm 主包只是个 node shim,真正的 CLI 在平台包里\n * (`npm:@openai/codex@<ver>-linux-arm64`),是自带运行时的 musl 静态二进制。\n * 装这一份:沙箱里不需要 node / npm,任务镜像带什么都能装。\n */\nfunction codexPlatformPackage(platform: AgentArtifactPlatform, version: string): {\n spec: string;\n binPath: string;\n} | undefined {\n const target = platform.os === \"linux\" && platform.arch === \"x64\"\n ? { suffix: \"linux-x64\", triple: \"x86_64-unknown-linux-musl\" }\n : platform.os === \"linux\" && platform.arch === \"arm64\"\n ? { suffix: \"linux-arm64\", triple: \"aarch64-unknown-linux-musl\" }\n : platform.os === \"darwin\" && platform.arch === \"x64\"\n ? { suffix: \"darwin-x64\", triple: \"x86_64-apple-darwin\" }\n : platform.os === \"darwin\" && platform.arch === \"arm64\"\n ? { suffix: \"darwin-arm64\", triple: \"aarch64-apple-darwin\" }\n : undefined;\n if (target === undefined)\n return undefined;\n return {\n spec: `@openai/codex@${version}-${target.suffix}`,\n binPath: `vendor/${target.triple}/bin/codex`,\n };\n}\n// Codex 0.144.1 会把「hook 命令已正常退出、随后写 stdin 撞 BrokenPipe」误判成 hook\n// 失败并丢掉 stdout。0.146.0 的官方 command runner 已忽略这个竞态;配置 Plugin 时必须\n// 选择包含该修复的 CLI。未配置 Plugin 的官方基线仍保持当前已发布版本,避免引用尚未发布\n// 的 Docker/E2B 制品。\nconst CODEX_PLUGIN_HOOK_SAFE_CLI_VERSION = \"0.146.0\";\n// @concord-code ne-adapter-codex-agent\n// @concord-implements docs/feature/adapters/README.md\n// @concord-implements docs/feature/adapters/sdk/codex-cli/README.md\nexport function codexAgent(config?: CodexConfig): Agent {\n const getApiKey = () => config?.apiKey ?? requireEnv(\"CODEX_API_KEY\");\n const getBaseUrl = () => config?.baseUrl ?? getEnv(\"CODEX_BASE_URL\");\n // PATH 是 Sandbox 受管变量,在 factory 构造时(link/配置校验期)同步拒绝,不留到 setup()\n // 才炸,也不静默丢弃——被覆盖的 PATH 会让 hooks / 子进程读到错误的可执行文件而零报错\n // (见 docs/feature/sandbox/library.md「PATH:受管变量与 pathPrepend」)。\n if (config?.env && \"PATH\" in config.env) {\n throw new TypeError(`codexAgent config.env.PATH is not supported: PATH is a Sandbox-managed variable, so silently dropping or overriding it would break hooks and child processes without any error. Prepend directories to it with the Sandbox factory's pathPrepend option instead (see docs/feature/sandbox/library.md).`);\n }\n // factory 构造时快照:一份 Agent 配置服务并发 attempt,不能让调用方随后改原对象造成\n // 不同 run/resume 轮拿到不同 Space。值不进入 shell 或 manifest,只交给 command options。\n const agentEnv = Object.freeze({ ...(config?.env ?? {}) });\n const agentEnvSensitiveValues = Object.freeze(Object.values(agentEnv));\n const cliVersion = config?.plugins?.length\n ? CODEX_PLUGIN_HOOK_SAFE_CLI_VERSION\n : DEFAULT_CODEX_CLI_VERSION;\n const cliRecipeRevision = config?.plugins?.length\n ? \"plugin-hook-safe-r1\"\n : String(AGENT_BASELINE_RECIPE_REVISION.codex);\n const { ensure, installer } = createNpmCliInstaller({\n identity: {\n agent: \"codex\",\n version: cliVersion,\n revision: cliRecipeRevision,\n },\n packageName: \"@openai/codex\",\n bin: \"codex\",\n platformPackage: (platform) => codexPlatformPackage(platform, cliVersion),\n progress: {\n checking: `checking Codex CLI ${cliVersion}`,\n installing: `installing official OpenAI Codex CLI ${cliVersion}`,\n ready: `Codex CLI ${cliVersion} ready`,\n },\n });\n return registerAgentLifecycleHookCommands(makeSandboxAgent({\n name: \"codex\",\n // 官方 adapter:transcript 经生命周期 fixture 验证,全通道 complete。\n evidenceCoverage: completeEvidenceCoverage,\n spanMapper: mapCodexSpans,\n classifySendFailure: classifyCodexSendFailure,\n ensure,\n installers: [installer],\n setup: (sb, ctx) => Effect.gen(function* () {\n yield* Effect.try({ try: () => requireManagedProcessCapability(sb, \"codex\"), catch: (cause) => cause });\n // 用户的原生配置文件:本地读原始字节 → 验 TOML 语法与保留键。字节 SHA-256 进\n // manifest 与安装 checkpoint key(见 native-config.ts 的 nativeConfigCheckpointItem)。\n let nativeConfig: LoadedNativeConfig | undefined;\n if (config?.configFile !== undefined) {\n nativeConfig = yield* loadNativeConfigFileEffect({ agent: \"codex\", field: \"configFile\", path: config.configFile });\n yield* Effect.try({\n try: () => assertTomlNativeConfig(nativeConfig!, {\n agent: \"codex\",\n field: \"configFile\",\n reservedKeys: RESERVED_CONFIG_KEYS,\n }),\n catch: (cause) => cause,\n });\n }\n // Codex 把 Plugin 的声明态写在 config.toml、安装体写在 cache。必须在覆盖用户配置前\n // 同时摘掉两边:覆盖后 `plugin list` 已看不见旧声明,旧安装体却仍会影响下一次 add\n // 的版本选择。先完整收敛,再写本 Attempt 的唯一配置层。\n if (config?.plugins?.length) {\n const plugins = config.plugins;\n yield* Effect.tryPromise({\n try: () => resetPluginState(sb, plugins),\n catch: (cause) => cause,\n });\n }\n // model 归属:实验决定(ctx.model);省略时不写 model 行,交给 codex CLI 原生默认,\n // 不在 adapter 里硬编码一个会过期的模型名。\n const modelLine = ctx.model ? `model = \"${ctx.model}\"\\n` : \"\";\n const effortLine = ctx.reasoningEffort === undefined\n ? \"\"\n : `model_reasoning_effort = \"${ctx.reasoningEffort}\"\\n`;\n const base = getBaseUrl();\n // 自定义 endpoint 常从项目的私有环境注入。它仍是 Codex 的真实运行配置,但不能因\n // Adapter 用 heredoc 写 config.toml 而进入 command/timing/error 证据;一旦在这里登记,\n // Attempt 最终封口也会清掉随后 hook 或 CLI 错误里回显的同一值。\n const providerSensitiveValues = base ? [base] : [];\n const topLevel = base\n ? modelLine + `model_provider = \"s2a\"\\n` + effortLine\n : modelLine + effortLine;\n const providerTable = base\n ? `[model_providers.s2a]\\n` +\n `name = \"s2a\"\\n` +\n `base_url = \"${base}\"\\n` +\n `env_key = \"CODEX_API_KEY\"\\n` +\n `wire_api = \"responses\"\\n`\n : \"\";\n if (!nativeConfig) {\n yield* Effect.tryPromise({\n try: () => shared.writeFile(sb, \"~/.codex/config.toml\", providerTable ? `${topLevel}\\n${providerTable}` : topLevel, { sensitiveValues: providerSensitiveValues }),\n catch: (cause) => cause,\n });\n }\n else {\n // codex 只读一份用户级 config.toml(没有 include / 第二配置层),Adapter 生成层与\n // 用户文件只能同文件分段共存。TOML 没有「回到根表」的语法,顶层键必须先于任何表头,\n // 所以布局固定为:Adapter 顶层键 → 用户文件原始字节(逐字节保留,自带表随意)→\n // Adapter 的表([model_providers.*] 以及后续追加的 [mcp_servers.*]、[otel])。\n // 保留键校验保证两层键不重叠,用户内容不被解析重写。\n yield* Effect.tryPromise({\n try: () => shared.writeFile(sb, \"~/.codex/config.toml\", topLevel),\n catch: (cause) => cause,\n });\n yield* appendNativeConfigFileEffect(sb, nativeConfig, \"~/.codex/config.toml\");\n if (providerTable) {\n yield* Effect.tryPromise({\n try: (signal) => sb.runShell(`cat >> ~/.codex/config.toml <<'NICEEVAL_PROVIDER_EOF'\\n\\n${providerTable}NICEEVAL_PROVIDER_EOF\\n`, { signal, sensitiveValues: providerSensitiveValues }),\n catch: (cause) => cause,\n });\n }\n }\n yield* Effect.tryPromise({\n try: async (signal) => {\n if (config?.mcpServers?.length) {\n assertMcpServers(config.mcpServers);\n const sensitiveValues: string[] = [];\n const mcpToml = config.mcpServers\n .map((s) => {\n // 注意是复数 mcp_servers:单数 [mcp_server.x] 会被 codex 静默忽略,\n // MCP 压根挂不上(实测 codex-cli 0.142.x,`codex mcp list` 可核对)。\n const lines: string[] = [`[mcp_servers.${s.name}]`];\n if (isHttpMcp(s)) {\n lines.push(`url = \"${s.url}\"`);\n const headers = s.headers;\n if (headers && Object.keys(headers).length) {\n lines.push(`[mcp_servers.${s.name}.http_headers]`);\n for (const [k, v] of Object.entries(headers)) {\n sensitiveValues.push(v);\n lines.push(`\"${k}\" = \"${v}\"`);\n }\n }\n }\n else {\n lines.push(`command = \"${s.command}\"`);\n if (s.args?.length)\n lines.push(`args = [${s.args.map((a) => `\"${a}\"`).join(\", \")}]`);\n const env = s.env;\n if (env && Object.keys(env).length) {\n lines.push(`[mcp_servers.${s.name}.env]`);\n for (const [k, v] of Object.entries(env)) {\n sensitiveValues.push(v);\n lines.push(`${k} = \"${v}\"`);\n }\n }\n }\n return lines.join(\"\\n\");\n })\n .join(\"\\n\\n\");\n await sb.runShell(`cat >> ~/.codex/config.toml <<'MCPEOF'\\n\\n${mcpToml}\\nMCPEOF\\n`, { sensitiveValues, signal });\n }\n const manifest: AgentSetupManifest = { skills: [] };\n if (config?.skills?.length) {\n manifest.skills = await installSkills(sb, config.skills, { dir: SKILL_DIR });\n // 发现指引不是可选装饰:没有它,codex 连一次读 skill 文件的 shell 调用都不会发生。\n await appendProjectInstruction(sb, skillDiscoveryInstruction(SKILL_DIR, installedSkillNames(manifest.skills)));\n }\n if (config?.plugins?.length) {\n manifest.nativePlugins = await installPluginsFromResetState(sb, config.plugins);\n }\n if (config?.mcpServers?.length) {\n // manifest 只记「挂了哪个 server、怎么连」;env / headers 里可能有 token,不落盘。\n manifest.mcpServers = mcpManifestEntries(config.mcpServers);\n }\n if (nativeConfig) {\n // 只记来源路径与字节哈希,不落正文(任意官方配置都可能带敏感字符串)。\n manifest.nativeConfigFile = { agent: \"codex\", path: nativeConfig.path, sha256: nativeConfig.sha256 };\n }\n if (manifest.skills.length ||\n manifest.nativePlugins?.length ||\n manifest.mcpServers?.length ||\n manifest.nativeConfigFile) {\n ctx.reportSetup(manifest);\n }\n // 安装后钩子(postSetup):排在 manifest 之后——manifest 审计 Adapter 自身的安装事实,\n // 钩子失败不该丢掉这份证据。\n await runPostSetupHooks(sb, ctx, \"codex\", config?.postSetup);\n },\n catch: (cause) => cause,\n });\n }),\n teardown: (sb, ctx) => Effect.tryPromise({\n try: async (signal) => {\n // preTeardown 与 postSetup 成对:LIFO 镜像,先于 agent 自己的收尾步骤执行。\n // codex 目前没有其它收尾步骤,这段就是整个 teardown。\n await runPreTeardownHooks(sb, { ...ctx, signal }, \"codex\", config?.preTeardown);\n await attemptResources(ctx)?.shutdownAll(signal);\n },\n catch: (cause) => cause,\n }),\n tracing: {\n protocol: \"http/json\",\n async configure(sb, ctx) {\n const endpoint = ctx.telemetry!.endpoint;\n const otel = `\\n[otel]\\n` +\n `environment = \"niceeval\"\\n` +\n `exporter = \"none\"\\n` +\n `metrics_exporter = \"none\"\\n\\n` +\n `[otel.trace_exporter.otlp-http]\\n` +\n `endpoint = \"${endpoint}\"\\n` +\n `protocol = \"json\"\\n`;\n await sb.runShell(`cat >> ~/.codex/config.toml <<'EOF'\\n${otel}EOF\\n`);\n },\n },\n send: (input, ctx) => Effect.tryPromise({\n try: () => {\n const apiKey = getApiKey();\n return sendCodexAppServer(input, ctx, {\n ...agentEnv,\n CODEX_API_KEY: apiKey,\n ...ctx.telemetry?.env,\n }, (raw, events, nativeText) => {\n const code = codexCapacityCode(raw);\n return {\n acceptance: codexAcceptance(raw, events, nativeText),\n ...(code === undefined ? {} : { cause: normalizeExternalCause({ code }) }),\n };\n });\n },\n catch: (cause) => cause,\n }),\n }), config?.postSetup, config?.preTeardown);\n}\n/**\n * 先按 `marketplace.name` 连 Marketplace(同名只连一次,`--ref` 钉版本,add 后回读注册\n * 列表校验名字真的注册上了),再装指定 Plugin。\n * 只按 codex 自己的 marketplace / plugin 协议走 —— 与 claude-code 的实现不共用命令、不共用类型。\n *\n * 注册类命令是追加式的,而 Sandbox 复用下沙箱带着上一条 attempt 的 `$HOME` 进场,所以每一步\n * 先读沙箱真实状态、把它收敛到声明,再执行 add / install(契约见 docs/feature/adapters/\n * architecture/coding-agent-extensions.md「安装收敛:不假设沙箱空白」)。空白沙箱读回为空,\n * 走的是同一条代码路径。\n */\nexport async function installPlugins(sb: Sandbox, plugins: readonly CodexPluginSpec[]): Promise<NonNullable<AgentSetupManifest[\"nativePlugins\"]>> {\n await resetPluginState(sb, plugins);\n return installPluginsFromResetState(sb, plugins);\n}\n/**\n * 在 config.toml 仍保留上一条 Attempt 的 Plugin 声明时清理声明态与安装体。\n * setup 必须先调用它再覆盖 config;直接调用 installPlugins() 时也走同一收敛入口。\n */\nasync function resetPluginState(sb: Sandbox, plugins: readonly CodexPluginSpec[]): Promise<void> {\n // 摘除顺序固定「先卸完全部同名插件、后摘 marketplace」:marketplace 注册一摘,\n // `codex plugin list` 就不再列出挂在它名下的安装(真机核对 codex-cli 0.146.0),\n // 残留的那份从此定位不到。多个插件共用一个 marketplace 时只需摘一次注册。\n for (const plugin of plugins) {\n await removeInstalledPlugins(sb, plugin.name);\n }\n const marketplaces = new Set<string>();\n for (const plugin of plugins) {\n if (marketplaces.has(plugin.marketplace.name))\n continue;\n await dropRegisteredMarketplace(sb, plugin.marketplace.name);\n marketplaces.add(plugin.marketplace.name);\n }\n}\n/** 安装阶段只接受已经由 resetPluginState() 收敛过的 Sandbox。 */\nasync function installPluginsFromResetState(sb: Sandbox, plugins: readonly CodexPluginSpec[]): Promise<NonNullable<AgentSetupManifest[\"nativePlugins\"]>> {\n const connected = new Set<string>();\n const out: NonNullable<AgentSetupManifest[\"nativePlugins\"]> = [];\n for (const plugin of plugins) {\n const { marketplace } = plugin;\n if (!connected.has(marketplace.name)) {\n const refFlag = marketplace.ref ? ` --ref ${shared.shellQuote(marketplace.ref)}` : \"\";\n // --sparse 只影响拉取速度,不影响装出来的内容;manifest 不记录它。\n const sparseFlags = (marketplace.sparse ?? [])\n .map((path) => ` --sparse ${shared.shellQuote(path)}`)\n .join(\"\");\n const add = await sb.runShell(`${shared.agentBin(\"codex\")} plugin marketplace add ${shared.shellQuote(marketplace.source)}${refFlag}${sparseFlags}`);\n if (add.exitCode !== 0) {\n throw new Error(`Could not connect ${\"codex\"} marketplace \"${marketplace.name}\" (source: ${marketplace.source}, ref: ${marketplace.ref ?? \"(default)\"}):\n${outputTail(add)}`);\n }\n // add 静默按目标仓库 manifest 的 name 注册,错名会拖到 plugin add 才炸;\n // 回读注册列表立刻校验(契约与真机复现见 marketplace.ts 顶部说明)。\n await verifyMarketplaceName(sb, {\n agent: \"codex\",\n listCommand: \"codex plugin marketplace list --json\",\n marketplace,\n knownNames: connected,\n });\n connected.add(marketplace.name);\n }\n const install = await sb.runShell(`${shared.agentBin(\"codex\")} plugin add ${shared.shellQuote(`${plugin.name}@${marketplace.name}`)}`);\n if (install.exitCode !== 0) {\n throw new Error(`Could not install ${\"codex\"} plugin \"${plugin.name}\" (marketplace: ${marketplace.name}):\n${outputTail(install)}`);\n }\n const resolvedVersion = await installedVersion(sb, plugin.name, marketplace.name);\n out.push({\n agent: \"codex\",\n marketplace: {\n name: marketplace.name,\n source: marketplace.source,\n ...(marketplace.ref !== undefined ? { ref: marketplace.ref } : {}),\n },\n name: plugin.name,\n ...(resolvedVersion !== undefined ? { resolvedVersion } : {}),\n });\n }\n return out;\n}\n/**\n * `codex plugin list --json` 的已安装条目。真实输出(实测 codex-cli 0.144.1 / 0.146.0)是\n * `{ installed: [...], available: [...] }`,已安装的这条在 `installed` 数组里,字段名是\n * `pluginId`(不是 `id`)——早前按裸数组 / `{ plugins: [...] }` 猜的形状全部猜错,\n * `installedVersion` 曾对任何真实安装恒返回 undefined(见\n * memory/native-plugin-marketplace-name-not-caller-assignable.md 的姊妹发现,2026-07-13 e2e 复现)。\n * 形状按 CLI 宽容解析,抠不出(非 JSON / 未知形状)返回 undefined,由调用方决定放行还是抛错。\n */\ninterface CodexInstalledPlugin {\n pluginId?: string;\n id?: string;\n name?: string;\n marketplaceName?: string;\n version?: string;\n}\nfunction codexInstalledPlugins(stdout: string): CodexInstalledPlugin[] | undefined {\n let raw: unknown;\n try {\n raw = JSON.parse(stdout);\n }\n catch {\n return undefined;\n }\n const arr = Array.isArray(raw)\n ? raw\n : raw && typeof raw === \"object\"\n ? (raw as {\n installed?: unknown;\n }).installed\n : undefined;\n if (!Array.isArray(arr))\n return undefined;\n return arr.filter((item): item is CodexInstalledPlugin => !!item && typeof item === \"object\");\n}\n/** 已安装条目的可寻址 id(`<plugin>@<marketplace>`);codex 的 remove 不接受裸插件名。 */\nfunction codexPluginId(entry: CodexInstalledPlugin): string | undefined {\n const id = entry.pluginId ??\n entry.id ??\n (entry.name && entry.marketplaceName ? `${entry.name}@${entry.marketplaceName}` : undefined);\n return id?.includes(\"@\") ? id : undefined;\n}\n/**\n * 与声明同名的 Plugin 已安装就先移除(不论它出自哪个 marketplace),让本条 attempt 的安装与\n * manifest 里的解析版本同源。已装即跳过会把上一条 attempt 装出的内容记成本条的安装事实。\n */\nasync function removeInstalledPlugins(sb: Sandbox, name: string): Promise<void> {\n const listCommand = \"codex plugin list --json\";\n const res = await sb.runShell(`${shared.agentBin(\"codex\")} plugin list --json`);\n const list = res.exitCode === 0 ? codexInstalledPlugins(res.stdout) : undefined;\n if (list === undefined) {\n throw new Error(`Could not read the installed ${\"codex\"} plugin list (${listCommand}):\n${outputTail(res)}`);\n }\n const ids = new Set<string>();\n for (const entry of list) {\n const id = codexPluginId(entry);\n if (id && (entry.name ?? id.split(\"@\")[0]) === name)\n ids.add(id);\n }\n for (const id of ids) {\n const remove = await sb.runShell(`${shared.agentBin(\"codex\")} plugin remove ${shared.shellQuote(id)}`);\n if (remove.exitCode !== 0) {\n throw new Error(`Could not remove the same-named installed ${\"codex\"} plugin \"${id}\":\n${outputTail(remove)}\nInstallation converges the sandbox to the declaration: a leftover install under the same name is removed first, then reinstalled from the declared marketplace.`);\n }\n }\n}\n/**\n * 按声明名字无条件摘除同名 marketplace 注册,再由调用方按声明 source 与 ref 重新 add。\n * 不以「注册在 `marketplace list --json` 里可见」为前提:注册状态分两半——用户配置里的注册项\n * 和磁盘上的 marketplace 数据。原生配置整层替换会抹掉前一半,残下的后一半 list 报告不出来,\n * add 却会撞它报 `marketplace '<name>' is already added from a different source`\n * (复用沙箱第二条 attempt 真机复现,codex-cli 0.146.0;`remove` 对这种残根照样清得掉)。\n * 「本就没有可摘的」(`is not configured or installed`,exit 1)按已收敛处理;其它失败也不在\n * 这里报错——紧随其后的 add 是权威失败面,摘不干净它会带着 codex 的原话失败。\n */\nasync function dropRegisteredMarketplace(sb: Sandbox, name: string): Promise<void> {\n await sb.runShell(`${shared.agentBin(\"codex\")} plugin marketplace remove ${shared.shellQuote(name)}`);\n}\n/** 装完回读版本;取不到不阻断安装(manifest 里 resolvedVersion 省略)。 */\nasync function installedVersion(sb: Sandbox, name: string, marketplace: string): Promise<string | undefined> {\n const res = await sb.runShell(`${shared.agentBin(\"codex\")} plugin list --json --marketplace ${shared.shellQuote(marketplace)}`);\n if (res.exitCode !== 0)\n return undefined;\n const list = codexInstalledPlugins(res.stdout);\n const hit = list?.find((p) => p.pluginId === `${name}@${marketplace}` || p.id === `${name}@${marketplace}` || p.name === name);\n return typeof hit?.version === \"string\" ? hit.version : undefined;\n}\nfunction outputTail(res: {\n stdout: string;\n stderr: string;\n}, n = 12): string {\n return (res.stdout + res.stderr).trim().split(\"\\n\").slice(-n).join(\"\\n\");\n}\nexport default codexAgent();\n"]}
@@ -22,7 +22,7 @@ exports.DEFAULT_OPENCLAW_CLI_VERSION = "2026.7.1-2";
22
22
  exports.DEFAULT_OMP_CLI_VERSION = "17.3.5";
23
23
  exports.DEFAULT_BUN_VERSION = "1.3.14";
24
24
  /** DeepSeek Harness CLI (npm `@deepseek-ai/dsh`). */
25
- exports.DEFAULT_DEEPSEEK_HARNESS_CLI_VERSION = "0.1.0-rc.7";
25
+ exports.DEFAULT_DEEPSEEK_HARNESS_CLI_VERSION = "0.1.7-rc.2";
26
26
  /** 每个官方基线制品里装的那个 Agent 的版本——制品版本号的版本位。 */
27
27
  exports.AGENT_BASELINE_VERSION = {
28
28
  "claude-code": exports.DEFAULT_CLAUDE_CODE_CLI_VERSION,
@@ -41,31 +41,30 @@ exports.AGENT_BASELINE_VERSION = {
41
41
  * Agent 版本一变归 1。已发布的 tag 不可原地覆盖,配方变更必须在版本里有位置表达。
42
42
  * 一个 Agent 的 E2B 与 Docker 制品共用这个号:一个版本号 = 一套基线配方,两侧同步重建。
43
43
  */
44
- // r4/r5(视 Agent 而定)未发布过镜像:补的「/usr/local/bin 与 /usr/local/lib/node_modules
45
- // 对运行用户可写」(跨 provider 基线工具面第三条)并进这次未发布修订,不再额外 +1。
44
+ // Docker base 支持非 root Node runtime 切换,并显式安装 Corepack。
46
45
  exports.AGENT_BASELINE_RECIPE_REVISION = {
47
46
  // r3: Dockerfile 里 npm 全局装完后显式 `USER node`——运行时不再强加执行身份,
48
47
  // 改为沿用镜像自己声明的 USER,非 root 必须由配方自己声明(见 docs/feature/sandbox/library.md「执行身份」)
49
48
  // r4: 跨 provider 基线工具面统一——不预装 yarn 实体,补齐 python3,
50
49
  // 并补 /usr/local 对运行用户可写(docs/feature/sandbox/library/prebuilt-environments.md
51
50
  // 「跨 provider 基线工具面」)
52
- "claude-code": 4,
51
+ "claude-code": 5,
53
52
  // r3: staged 安装改用自带运行时的原生平台包(不再要求沙箱里有 node / npm)
54
53
  // r4: 同上「USER node」配方变更
55
54
  // r5: 同上「跨 provider 基线工具面统一」配方变更(含可写性)
56
- codex: 5,
55
+ codex: 6,
57
56
  // r2: 跨 provider 基线工具面统一(同上,含可写性)
58
- bub: 2,
57
+ bub: 3,
59
58
  // r2: 同上「USER node」配方变更
60
59
  // r3: 同上「跨 provider 基线工具面统一」配方变更(含可写性)
61
- opencode: 3,
60
+ opencode: 4,
62
61
  // r2: 跨 provider 基线工具面统一——本 target 原本单独装的 python3 现由 base 统一提供,
63
62
  // 配方内容变了但不预装 yarn 不改变行为(同上,含可写性)
64
- hermes: 2,
63
+ hermes: 3,
65
64
  // r2: 同上「USER node」配方变更
66
65
  // r3: 同上「跨 provider 基线工具面统一」配方变更(含可写性)
67
- openclaw: 3,
68
- omp: 1,
66
+ openclaw: 4,
67
+ omp: 2,
69
68
  "deepseek-harness": 1,
70
69
  };
71
70
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"coding-cli-versions.js","sourceRoot":"","sources":["coding-cli-versions.ts"],"names":[],"mappings":";;;AA+EA,0DAEC;AAjFD,gGAAgG;AACnF,QAAA,yBAAyB,GAAG,SAAS,CAAC;AACtC,QAAA,+BAA+B,GAAG,SAAS,CAAC;AACzD;;;;;GAKG;AACU,QAAA,mBAAmB,GAAG,OAAO,CAAC;AAC3C,6CAA6C;AAChC,QAAA,4BAA4B,GAAG,QAAQ,CAAC;AACrD,+CAA+C;AAClC,QAAA,0BAA0B,GAAG,QAAQ,CAAC;AACnD,0CAA0C;AAC7B,QAAA,4BAA4B,GAAG,YAAY,CAAC;AACzD,2DAA2D;AAC9C,QAAA,uBAAuB,GAAG,QAAQ,CAAC;AACnC,QAAA,mBAAmB,GAAG,QAAQ,CAAC;AAC5C,qDAAqD;AACxC,QAAA,oCAAoC,GAAG,YAAY,CAAC;AAQjE,0CAA0C;AAC7B,QAAA,sBAAsB,GAAmD;IAClF,aAAa,EAAE,uCAA+B;IAC9C,KAAK,EAAE,iCAAyB;IAChC,GAAG,EAAE,2BAAmB;IACxB,QAAQ,EAAE,oCAA4B;IACtC,MAAM,EAAE,kCAA0B;IAClC,QAAQ,EAAE,oCAA4B;IACtC,GAAG,EAAE,+BAAuB;IAC5B,kBAAkB,EAAE,4CAAoC;CAC3D,CAAC;AACF;;;;;;GAMG;AACH,0EAA0E;AAC1E,kDAAkD;AACrC,QAAA,8BAA8B,GAAmD;IAC1F,yDAAyD;IACzD,6EAA6E;IAC7E,kDAAkD;IAClD,8EAA8E;IAC9E,sBAAsB;IACtB,aAAa,EAAE,CAAC;IAChB,kDAAkD;IAClD,wBAAwB;IACxB,uCAAuC;IACvC,KAAK,EAAE,CAAC;IACR,kCAAkC;IAClC,GAAG,EAAE,CAAC;IACN,wBAAwB;IACxB,uCAAuC;IACvC,QAAQ,EAAE,CAAC;IACX,gEAAgE;IAChE,iCAAiC;IACjC,MAAM,EAAE,CAAC;IACT,wBAAwB;IACxB,uCAAuC;IACvC,QAAQ,EAAE,CAAC;IACX,GAAG,EAAE,CAAC;IACN,kBAAkB,EAAE,CAAC;CACxB,CAAC;AACF;;;;;GAKG;AACH,SAAgB,uBAAuB,CAAC,KAA0B;IAC9D,OAAO,GAAG,8BAAsB,CAAC,KAAK,CAAC,KAAK,sCAA8B,CAAC,KAAK,CAAC,EAAE,CAAC;AACxF,CAAC","sourcesContent":["/** Coding-agent CLI versions used by runtime fallback installs and official sandbox recipes. */\nexport const DEFAULT_CODEX_CLI_VERSION = \"0.144.1\";\nexport const DEFAULT_CLAUDE_CODE_CLI_VERSION = \"2.1.207\";\n/**\n * Bub release installed from PyPI by runtime fallback installs and official sandbox recipes.\n *\n * 换版本时同批核对 `bub-install-spec.ts` 的 OTel 插件 pin:插件与 Bub 的 tape 协议同代,\n * 配错代不会安装失败,而是时间轨静默为空。\n */\nexport const DEFAULT_BUB_VERSION = \"0.4.0\";\n/** OpenCode CLI(npm `opencode-ai`)默认钉的版本。 */\nexport const DEFAULT_OPENCODE_CLI_VERSION = \"1.18.5\";\n/** Hermes Agent(PyPI `hermes-agent`)默认钉的版本。 */\nexport const DEFAULT_HERMES_CLI_VERSION = \"0.19.0\";\n/** OpenClaw CLI(npm `openclaw`)默认钉的版本。 */\nexport const DEFAULT_OPENCLAW_CLI_VERSION = \"2026.7.1-2\";\n/** Oh My Pi coding-agent CLI (npm) and its Bun runtime. */\nexport const DEFAULT_OMP_CLI_VERSION = \"17.3.5\";\nexport const DEFAULT_BUN_VERSION = \"1.3.14\";\n/** DeepSeek Harness CLI (npm `@deepseek-ai/dsh`). */\nexport const DEFAULT_DEEPSEEK_HARNESS_CLI_VERSION = \"0.1.0-rc.7\";\n/**\n * 有官方公共基线制品的 coding agent。\n *\n * Docker 侧八家齐全;E2B 侧目前只发布 Claude Code / Codex / Bub\n *(见 `E2BCodingAgent`),其余 Agent 的 E2B 模板尚未进台账。\n */\nexport type CodingAgentBaseline = \"claude-code\" | \"codex\" | \"bub\" | \"opencode\" | \"hermes\" | \"openclaw\" | \"omp\" | \"deepseek-harness\";\n/** 每个官方基线制品里装的那个 Agent 的版本——制品版本号的版本位。 */\nexport const AGENT_BASELINE_VERSION: globalThis.Record<CodingAgentBaseline, string> = {\n \"claude-code\": DEFAULT_CLAUDE_CODE_CLI_VERSION,\n codex: DEFAULT_CODEX_CLI_VERSION,\n bub: DEFAULT_BUB_VERSION,\n opencode: DEFAULT_OPENCODE_CLI_VERSION,\n hermes: DEFAULT_HERMES_CLI_VERSION,\n openclaw: DEFAULT_OPENCLAW_CLI_VERSION,\n omp: DEFAULT_OMP_CLI_VERSION,\n \"deepseek-harness\": DEFAULT_DEEPSEEK_HARNESS_CLI_VERSION,\n};\n/**\n * NiceEval 基线配方自身的修订号——制品版本号的 `-r` 位。\n *\n * Agent 版本没变、配方变了(Node 工具契约、PATH 规范化、换 pin 的 commit、插件集合)就 +1;\n * Agent 版本一变归 1。已发布的 tag 不可原地覆盖,配方变更必须在版本里有位置表达。\n * 一个 Agent 的 E2B 与 Docker 制品共用这个号:一个版本号 = 一套基线配方,两侧同步重建。\n */\n// r4/r5(视 Agent 而定)未发布过镜像:补的「/usr/local/bin 与 /usr/local/lib/node_modules\n// 对运行用户可写」(跨 provider 基线工具面第三条)并进这次未发布修订,不再额外 +1。\nexport const AGENT_BASELINE_RECIPE_REVISION: globalThis.Record<CodingAgentBaseline, number> = {\n // r3: Dockerfile 里 npm 全局装完后显式 `USER node`——运行时不再强加执行身份,\n // 改为沿用镜像自己声明的 USER,非 root 必须由配方自己声明(见 docs/feature/sandbox/library.md「执行身份」)\n // r4: 跨 provider 基线工具面统一——不预装 yarn 实体,补齐 python3,\n // 并补 /usr/local 对运行用户可写(docs/feature/sandbox/library/prebuilt-environments.md\n // 「跨 provider 基线工具面」)\n \"claude-code\": 4,\n // r3: staged 安装改用自带运行时的原生平台包(不再要求沙箱里有 node / npm)\n // r4: 同上「USER node」配方变更\n // r5: 同上「跨 provider 基线工具面统一」配方变更(含可写性)\n codex: 5,\n // r2: 跨 provider 基线工具面统一(同上,含可写性)\n bub: 2,\n // r2: 同上「USER node」配方变更\n // r3: 同上「跨 provider 基线工具面统一」配方变更(含可写性)\n opencode: 3,\n // r2: 跨 provider 基线工具面统一——本 target 原本单独装的 python3 现由 base 统一提供,\n // 配方内容变了但不预装 yarn 不改变行为(同上,含可写性)\n hermes: 2,\n // r2: 同上「USER node」配方变更\n // r3: 同上「跨 provider 基线工具面统一」配方变更(含可写性)\n openclaw: 3,\n omp: 1,\n \"deepseek-harness\": 1,\n};\n/**\n * 官方基线制品的版本 tag:`<Agent 版本>-r<配方修订>`,如 `0.144.1-r2`。\n *\n * niceeval 自身的版本不参与命名——库与制品内容无关,发版不该连带重建没变的制品,\n * 换 Agent 版本也不该等库发版。\n */\nexport function agentBaselineVersionTag(agent: CodingAgentBaseline): string {\n return `${AGENT_BASELINE_VERSION[agent]}-r${AGENT_BASELINE_RECIPE_REVISION[agent]}`;\n}\n"]}
1
+ {"version":3,"file":"coding-cli-versions.js","sourceRoot":"","sources":["coding-cli-versions.ts"],"names":[],"mappings":";;;AA8EA,0DAEC;AAhFD,gGAAgG;AACnF,QAAA,yBAAyB,GAAG,SAAS,CAAC;AACtC,QAAA,+BAA+B,GAAG,SAAS,CAAC;AACzD;;;;;GAKG;AACU,QAAA,mBAAmB,GAAG,OAAO,CAAC;AAC3C,6CAA6C;AAChC,QAAA,4BAA4B,GAAG,QAAQ,CAAC;AACrD,+CAA+C;AAClC,QAAA,0BAA0B,GAAG,QAAQ,CAAC;AACnD,0CAA0C;AAC7B,QAAA,4BAA4B,GAAG,YAAY,CAAC;AACzD,2DAA2D;AAC9C,QAAA,uBAAuB,GAAG,QAAQ,CAAC;AACnC,QAAA,mBAAmB,GAAG,QAAQ,CAAC;AAC5C,qDAAqD;AACxC,QAAA,oCAAoC,GAAG,YAAY,CAAC;AAQjE,0CAA0C;AAC7B,QAAA,sBAAsB,GAAmD;IAClF,aAAa,EAAE,uCAA+B;IAC9C,KAAK,EAAE,iCAAyB;IAChC,GAAG,EAAE,2BAAmB;IACxB,QAAQ,EAAE,oCAA4B;IACtC,MAAM,EAAE,kCAA0B;IAClC,QAAQ,EAAE,oCAA4B;IACtC,GAAG,EAAE,+BAAuB;IAC5B,kBAAkB,EAAE,4CAAoC;CAC3D,CAAC;AACF;;;;;;GAMG;AACH,uDAAuD;AAC1C,QAAA,8BAA8B,GAAmD;IAC1F,yDAAyD;IACzD,6EAA6E;IAC7E,kDAAkD;IAClD,8EAA8E;IAC9E,sBAAsB;IACtB,aAAa,EAAE,CAAC;IAChB,kDAAkD;IAClD,wBAAwB;IACxB,uCAAuC;IACvC,KAAK,EAAE,CAAC;IACR,kCAAkC;IAClC,GAAG,EAAE,CAAC;IACN,wBAAwB;IACxB,uCAAuC;IACvC,QAAQ,EAAE,CAAC;IACX,gEAAgE;IAChE,iCAAiC;IACjC,MAAM,EAAE,CAAC;IACT,wBAAwB;IACxB,uCAAuC;IACvC,QAAQ,EAAE,CAAC;IACX,GAAG,EAAE,CAAC;IACN,kBAAkB,EAAE,CAAC;CACxB,CAAC;AACF;;;;;GAKG;AACH,SAAgB,uBAAuB,CAAC,KAA0B;IAC9D,OAAO,GAAG,8BAAsB,CAAC,KAAK,CAAC,KAAK,sCAA8B,CAAC,KAAK,CAAC,EAAE,CAAC;AACxF,CAAC","sourcesContent":["/** Coding-agent CLI versions used by runtime fallback installs and official sandbox recipes. */\nexport const DEFAULT_CODEX_CLI_VERSION = \"0.144.1\";\nexport const DEFAULT_CLAUDE_CODE_CLI_VERSION = \"2.1.207\";\n/**\n * Bub release installed from PyPI by runtime fallback installs and official sandbox recipes.\n *\n * 换版本时同批核对 `bub-install-spec.ts` 的 OTel 插件 pin:插件与 Bub 的 tape 协议同代,\n * 配错代不会安装失败,而是时间轨静默为空。\n */\nexport const DEFAULT_BUB_VERSION = \"0.4.0\";\n/** OpenCode CLI(npm `opencode-ai`)默认钉的版本。 */\nexport const DEFAULT_OPENCODE_CLI_VERSION = \"1.18.5\";\n/** Hermes Agent(PyPI `hermes-agent`)默认钉的版本。 */\nexport const DEFAULT_HERMES_CLI_VERSION = \"0.19.0\";\n/** OpenClaw CLI(npm `openclaw`)默认钉的版本。 */\nexport const DEFAULT_OPENCLAW_CLI_VERSION = \"2026.7.1-2\";\n/** Oh My Pi coding-agent CLI (npm) and its Bun runtime. */\nexport const DEFAULT_OMP_CLI_VERSION = \"17.3.5\";\nexport const DEFAULT_BUN_VERSION = \"1.3.14\";\n/** DeepSeek Harness CLI (npm `@deepseek-ai/dsh`). */\nexport const DEFAULT_DEEPSEEK_HARNESS_CLI_VERSION = \"0.1.7-rc.2\";\n/**\n * 有官方公共基线制品的 coding agent。\n *\n * Docker 侧八家齐全;E2B 侧目前只发布 Claude Code / Codex / Bub\n *(见 `E2BCodingAgent`),其余 Agent 的 E2B 模板尚未进台账。\n */\nexport type CodingAgentBaseline = \"claude-code\" | \"codex\" | \"bub\" | \"opencode\" | \"hermes\" | \"openclaw\" | \"omp\" | \"deepseek-harness\";\n/** 每个官方基线制品里装的那个 Agent 的版本——制品版本号的版本位。 */\nexport const AGENT_BASELINE_VERSION: globalThis.Record<CodingAgentBaseline, string> = {\n \"claude-code\": DEFAULT_CLAUDE_CODE_CLI_VERSION,\n codex: DEFAULT_CODEX_CLI_VERSION,\n bub: DEFAULT_BUB_VERSION,\n opencode: DEFAULT_OPENCODE_CLI_VERSION,\n hermes: DEFAULT_HERMES_CLI_VERSION,\n openclaw: DEFAULT_OPENCLAW_CLI_VERSION,\n omp: DEFAULT_OMP_CLI_VERSION,\n \"deepseek-harness\": DEFAULT_DEEPSEEK_HARNESS_CLI_VERSION,\n};\n/**\n * NiceEval 基线配方自身的修订号——制品版本号的 `-r` 位。\n *\n * Agent 版本没变、配方变了(Node 工具契约、PATH 规范化、换 pin 的 commit、插件集合)就 +1;\n * Agent 版本一变归 1。已发布的 tag 不可原地覆盖,配方变更必须在版本里有位置表达。\n * 一个 Agent 的 E2B 与 Docker 制品共用这个号:一个版本号 = 一套基线配方,两侧同步重建。\n */\n// Docker base 支持非 root Node runtime 切换,并显式安装 Corepack。\nexport const AGENT_BASELINE_RECIPE_REVISION: globalThis.Record<CodingAgentBaseline, number> = {\n // r3: Dockerfile 里 npm 全局装完后显式 `USER node`——运行时不再强加执行身份,\n // 改为沿用镜像自己声明的 USER,非 root 必须由配方自己声明(见 docs/feature/sandbox/library.md「执行身份」)\n // r4: 跨 provider 基线工具面统一——不预装 yarn 实体,补齐 python3,\n // 并补 /usr/local 对运行用户可写(docs/feature/sandbox/library/prebuilt-environments.md\n // 「跨 provider 基线工具面」)\n \"claude-code\": 5,\n // r3: staged 安装改用自带运行时的原生平台包(不再要求沙箱里有 node / npm)\n // r4: 同上「USER node」配方变更\n // r5: 同上「跨 provider 基线工具面统一」配方变更(含可写性)\n codex: 6,\n // r2: 跨 provider 基线工具面统一(同上,含可写性)\n bub: 3,\n // r2: 同上「USER node」配方变更\n // r3: 同上「跨 provider 基线工具面统一」配方变更(含可写性)\n opencode: 4,\n // r2: 跨 provider 基线工具面统一——本 target 原本单独装的 python3 现由 base 统一提供,\n // 配方内容变了但不预装 yarn 不改变行为(同上,含可写性)\n hermes: 3,\n // r2: 同上「USER node」配方变更\n // r3: 同上「跨 provider 基线工具面统一」配方变更(含可写性)\n openclaw: 4,\n omp: 2,\n \"deepseek-harness\": 1,\n};\n/**\n * 官方基线制品的版本 tag:`<Agent 版本>-r<配方修订>`,如 `0.144.1-r2`。\n *\n * niceeval 自身的版本不参与命名——库与制品内容无关,发版不该连带重建没变的制品,\n * 换 Agent 版本也不该等库发版。\n */\nexport function agentBaselineVersionTag(agent: CodingAgentBaseline): string {\n return `${AGENT_BASELINE_VERSION[agent]}-r${AGENT_BASELINE_RECIPE_REVISION[agent]}`;\n}\n"]}
@@ -18,7 +18,7 @@ export declare const DEFAULT_OPENCLAW_CLI_VERSION = "2026.7.1-2";
18
18
  export declare const DEFAULT_OMP_CLI_VERSION = "17.3.5";
19
19
  export declare const DEFAULT_BUN_VERSION = "1.3.14";
20
20
  /** DeepSeek Harness CLI (npm `@deepseek-ai/dsh`). */
21
- export declare const DEFAULT_DEEPSEEK_HARNESS_CLI_VERSION = "0.1.0-rc.7";
21
+ export declare const DEFAULT_DEEPSEEK_HARNESS_CLI_VERSION = "0.1.7-rc.2";
22
22
  /**
23
23
  * 有官方公共基线制品的 coding agent。
24
24
  *
@@ -18,7 +18,7 @@ export declare const DEFAULT_OPENCLAW_CLI_VERSION = "2026.7.1-2";
18
18
  export declare const DEFAULT_OMP_CLI_VERSION = "17.3.5";
19
19
  export declare const DEFAULT_BUN_VERSION = "1.3.14";
20
20
  /** DeepSeek Harness CLI (npm `@deepseek-ai/dsh`). */
21
- export declare const DEFAULT_DEEPSEEK_HARNESS_CLI_VERSION = "0.1.0-rc.7";
21
+ export declare const DEFAULT_DEEPSEEK_HARNESS_CLI_VERSION = "0.1.7-rc.2";
22
22
  /**
23
23
  * 有官方公共基线制品的 coding agent。
24
24
  *
@@ -18,7 +18,7 @@ export declare const DEFAULT_OPENCLAW_CLI_VERSION = "2026.7.1-2";
18
18
  export declare const DEFAULT_OMP_CLI_VERSION = "17.3.5";
19
19
  export declare const DEFAULT_BUN_VERSION = "1.3.14";
20
20
  /** DeepSeek Harness CLI (npm `@deepseek-ai/dsh`). */
21
- export declare const DEFAULT_DEEPSEEK_HARNESS_CLI_VERSION = "0.1.0-rc.7";
21
+ export declare const DEFAULT_DEEPSEEK_HARNESS_CLI_VERSION = "0.1.7-rc.2";
22
22
  /**
23
23
  * 有官方公共基线制品的 coding agent。
24
24
  *
@@ -67,6 +67,9 @@ function resolveBaseUrl(config) {
67
67
  return config?.baseUrl ?? (0, util_ts_1.getEnv)("DSH_BASE_URL") ?? (0, util_ts_1.getEnv)("DEEPSEEK_BASE_URL");
68
68
  }
69
69
  /** DeepSeek Harness sandbox adapter backed by its one-shot headless profile. */
70
+ // @concord-code ne-adapter-deepseek-harness-agent
71
+ // @concord-implements docs/feature/adapters/README.md
72
+ // @concord-implements docs/feature/adapters/sdk/deepseek-harness/README.md
70
73
  function deepSeekHarnessAgent(config) {
71
74
  const version = config?.version ?? coding_cli_versions_ts_1.DEFAULT_DEEPSEEK_HARNESS_CLI_VERSION;
72
75
  const plugins = (0, exact_npm_plugins_ts_1.normalizeExactNpmPlugins)(config?.plugins, "deepSeekHarnessAgent plugins");
@@ -1 +1 @@
1
- {"version":3,"file":"deepseek-harness.js","sourceRoot":"","sources":["deepseek-harness.ts"],"names":[],"mappings":";;AAiFA,oDAkFC;AAnKD,mCAAgC;AAChC,4CAAgD;AAChD,wCAAgD;AAEhD,kEAA8D;AAC9D,2CAAqC;AACrC,mDAA+E;AAC/E,wDAA+C;AAC/C,kDAAiD;AAEjD,iEAAgH;AAChH,qEAAiH;AACjH,MAAM,qBAAqB,GAAqB;IAC5C,MAAM,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,0DAA0D,EAAE;IACrG,OAAO,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,0DAA0D,EAAE;IACtG,QAAQ,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE;IAChC,KAAK,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,gDAAgD,EAAE;IAC1F,MAAM,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE;IAC9B,IAAI,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,+DAA+D,EAAE;CAC3G,CAAC;AAWF,MAAM,gBAAgB,GAAG,SAAS,CAAC;AACnC,SAAS,cAAc,CAAC,UAAkB,EAAE,OAAkC;IAI1E,MAAM,QAAQ,GAAG;QACb,KAAK,EAAE,0BAA0B;QACjC,OAAO,EAAE,UAAU;QACnB,QAAQ,EAAE,IAAA,6CAAsB,EAAC,OAAO,CAAC;KAC5C,CAAC;IACF,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IACzC,MAAM,MAAM,GAAG,wDAAwD;QACnE,kBAAkB,QAAQ,kDAAkD;QAC5E,mFAAmF;QACnF,8DAA8D;QAC9D,qFAAqF;QACrF,kDAAkD;QAClD,iGAAiG;QACjG,wFAAwF;QACxF,uEAAuE;QACvE,mGAAmG;QACnG,6EAA6E,CAAC;IAClF,MAAM,WAAW,GAAG,0CAA0C,IAAA,qBAAU,EAAC,MAAM,CAAC,EAAE,CAAC;IACnF,OAAO;QACH,MAAM,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAA,mBAAK,EAAC,WAAW,CAAC,EAAE;QAC/C,SAAS,EAAE;YACP,QAAQ;YACR,WAAW,EAAE,iBAAiB;YAC9B,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE;gBAChC,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAA,qBAAU,EAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACzE,MAAM,MAAM,GAAG;;;;;gDAKiB,gBAAgB;;8DAEF,KAAK;qEACE,CAAC;gBACtD,MAAM,OAAO,CAAC,eAAe,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;YACtE,CAAC;SACJ;KACJ,CAAC;AACN,CAAC;AACD,SAAS,aAAa,CAAC,MAA8B;IACjD,OAAO,MAAM,EAAE,MAAM,IAAI,IAAA,gBAAM,EAAC,aAAa,CAAC,IAAI,IAAA,oBAAU,EAAC,kBAAkB,CAAC,CAAC;AACrF,CAAC;AACD,SAAS,cAAc,CAAC,MAA8B;IAClD,OAAO,MAAM,EAAE,OAAO,IAAI,IAAA,gBAAM,EAAC,cAAc,CAAC,IAAI,IAAA,gBAAM,EAAC,mBAAmB,CAAC,CAAC;AACpF,CAAC;AACD,gFAAgF;AAChF,SAAgB,oBAAoB,CAAC,MAA8B;IAC/D,MAAM,OAAO,GAAG,MAAM,EAAE,OAAO,IAAI,6DAAoC,CAAC;IACxE,MAAM,OAAO,GAAG,IAAA,+CAAwB,EAAC,MAAM,EAAE,OAAO,EAAE,8BAA8B,CAAC,CAAC;IAC1F,MAAM,OAAO,GAAG,IAAA,qCAAqB,EAAC;QAClC,QAAQ,EAAE;YACN,KAAK,EAAE,kBAAkB;YACzB,OAAO;YACP,QAAQ,EAAE,MAAM,CAAC,uDAA8B,CAAC,kBAAkB,CAAC,CAAC;SACvE;QACD,WAAW,EAAE,kBAAkB;QAC/B,GAAG,EAAE,KAAK;KACb,CAAC,CAAC;IACH,MAAM,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAC;IACxC,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACxF,OAAO,IAAA,4BAAgB,EAAC;QACpB,IAAI,EAAE,kBAAkB;QACxB,gBAAgB,EAAE,qBAAqB;QACvC,MAAM,EAAE,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC;QACzF,UAAU,EAAE,WAAW,KAAK,SAAS;YACjC,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC;YACrB,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,WAAW,CAAC,SAAS,CAAC;QAChD,KAAK,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,eAAM,CAAC,UAAU,CAAC;YAClC,GAAG,EAAE,KAAK,IAAI,EAAE;gBACZ,MAAM,UAAU,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,wCAAwC,CAAC,CAAC;gBAC/E,MAAM,IAAI,GAAG,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;gBACtC,IAAI,UAAU,CAAC,QAAQ,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;oBACrD,MAAM,IAAI,KAAK,CAAC,oEAAoE,CAAC,CAAC;gBAC1F,CAAC;gBACD,MAAM,OAAO,GAAG,GAAG,IAAI,gBAAgB,CAAC;gBACxC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;gBACjC,MAAM,QAAQ,GAAG;oBACb,qBAAqB,EAAE;wBACnB,QAAQ,EAAE,mBAAmB;wBAC7B,KAAK,EAAE,GAAG,CAAC,KAAK,IAAI,mBAAmB;qBAC1C;oBACD,UAAU,EAAE;wBACR,aAAa,EAAE,oBAAoB;qBACtC;iBACJ,CAAC;gBACF,MAAM,kBAAM,CAAC,SAAS,CAAC,EAAE,EAAE,GAAG,OAAO,gBAAgB,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAC9F,CAAC;YACD,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK;SAC1B,CAAC;QACF,IAAI,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC,eAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;YACtC,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,IAAA,qCAAqB,EAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAChE,OAAO,KAAK,CAAC,CAAC,eAAM,CAAC,UAAU,CAAC;gBAC5B,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;oBAClB,MAAM,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;oBACrC,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;oBACjD,IAAI,CAAC,OAAO;wBACR,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;oBACnE,MAAM,GAAG,GAAsC;wBAC3C,gBAAgB,EAAE,MAAM;wBACxB,QAAQ,EAAE,OAAO;wBACjB,GAAG,GAAG,CAAC,SAAS,EAAE,GAAG;qBACxB,CAAC;oBACF,MAAM,OAAO,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;oBACvC,IAAI,OAAO;wBACP,GAAG,CAAC,iBAAiB,GAAG,OAAO,CAAC;oBACpC,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,WAAW,EAAE,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE;wBACpF,GAAG;wBACH,eAAe,EAAE,CAAC,MAAM,CAAC;wBACzB,MAAM,EAAE,IAAI;wBACZ,MAAM;qBACT,CAAC,CAAC;oBACH,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;oBAC/B,IAAI,GAAG,CAAC,QAAQ,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;wBAC9B,MAAM,IAAA,kCAAe,EAAC;4BAClB,UAAU,EAAE,SAAS;4BACrB,OAAO,EAAE,GAAG,CAAC,QAAQ,KAAK,CAAC;gCACvB,CAAC,CAAC,kBAAM,CAAC,eAAe,CAAC,GAAG,EAAE,EAAE,EAAE,SAAS,CAAC;gCAC5C,CAAC,CAAC,yEAAyE;4BAC/E,OAAO,EAAE,GAAG;yBACf,CAAC,CAAC;oBACP,CAAC;oBACD,MAAM,MAAM,GAAkB,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;oBAC7E,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,WAAoB,EAAE,CAAC;gBACpD,CAAC;gBACD,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK;aAC1B,CAAC,CAAC;QACP,CAAC,CAAC;KACL,CAAC,CAAC;AACP,CAAC;AACD,kBAAe,oBAAoB,CAAC","sourcesContent":["import { Effect } from \"effect\";\nimport { makeSandboxAgent } from \"../define.ts\";\nimport { getEnv, requireEnv } from \"../util.ts\";\nimport type { Agent, EvidenceCoverage, StreamEvent } from \"../types.ts\";\nimport { makeSendFailure } from \"../context/send-failures.ts\";\nimport { shared } from \"./shared.ts\";\nimport { createNpmCliInstaller, resolveAgentBinEffect } from \"./npm-staged.ts\";\nimport { shell } from \"../sandbox/commands.ts\";\nimport { shellQuote } from \"../sandbox/shell.ts\";\nimport type { AgentEnsure, AgentInstaller } from \"./types.ts\";\nimport { exactNpmPluginRevision, normalizeExactNpmPlugins, type ExactNpmPlugin, } from \"./exact-npm-plugins.ts\";\nimport { AGENT_BASELINE_RECIPE_REVISION, DEFAULT_DEEPSEEK_HARNESS_CLI_VERSION, } from \"./coding-cli-versions.ts\";\nconst DSH_EVIDENCE_COVERAGE: EvidenceCoverage = {\n events: { status: \"unavailable\", reason: \"DSH headless mode exposes only the final assistant text.\" },\n actions: { status: \"unavailable\", reason: \"DSH headless mode does not expose tool lifecycle events.\" },\n messages: { status: \"complete\" },\n usage: { status: \"unavailable\", reason: \"DSH headless mode does not expose token usage.\" },\n status: { status: \"complete\" },\n data: { status: \"unavailable\", reason: \"DSH headless mode does not expose a separate Turn.data value.\" },\n};\nexport interface DeepSeekHarnessConfig {\n /** DeepSeek-compatible API key. Defaults to DSH_API_KEY, then DEEPSEEK_API_KEY. */\n apiKey?: string;\n /** DeepSeek-compatible endpoint. Defaults to DSH_BASE_URL, then DEEPSEEK_BASE_URL. */\n baseUrl?: string;\n /** Exact npm version of `@deepseek-ai/dsh`. */\n version?: string;\n /** Native DSH bundles as exact npm package@version declarations. */\n plugins?: readonly string[];\n}\nconst DSH_PNPM_VERSION = \"10.17.1\";\nfunction dshPluginLayer(cliVersion: string, plugins: readonly ExactNpmPlugin[]): {\n ensure: AgentEnsure;\n installer: AgentInstaller;\n} {\n const identity = {\n agent: \"deepseek-harness-plugins\",\n version: cliVersion,\n revision: exactNpmPluginRevision(plugins),\n };\n const expected = JSON.stringify(plugins);\n const verify = `const fs=require(\"node:fs\"),path=require(\"node:path\");` +\n `const expected=${expected},root=process.env.DSH_HOME+\"/profiles/headless\";` +\n `const profile=JSON.parse(fs.readFileSync(path.join(root,\"package.json\"),\"utf8\"));` +\n `const deps=profile.dependencies||{},names=Object.keys(deps);` +\n `if(JSON.stringify(names)!==JSON.stringify(expected.map(x=>x.name)))process.exit(1);` +\n `const bundles=profile.dsh?.profile?.bundles||[];` +\n `const external=bundles.filter(x=>x!==\"@deepseek-ai/dsh-base\"&&x!==\"@deepseek-ai/dsh-headless\");` +\n `if(JSON.stringify(external)!==JSON.stringify(expected.map(x=>x.name)))process.exit(1);` +\n `for(const x of expected){if(deps[x.name]!==x.version)process.exit(1);` +\n `const p=JSON.parse(fs.readFileSync(path.join(root,\"node_modules\",x.name,\"package.json\"),\"utf8\"));` +\n `if(p.name!==x.name||p.version!==x.version||!p.dsh?.bundle)process.exit(1);}`;\n const probeScript = `DSH_HOME=\"$HOME/.niceeval-dsh\" node -e ${shellQuote(verify)}`;\n return {\n ensure: { identity, probe: shell(probeScript) },\n installer: {\n identity,\n installMode: \"sandbox-network\",\n install: async (sandbox, context) => {\n const specs = plugins.map((plugin) => shellQuote(plugin.spec)).join(\" \");\n const script = `set -eu\nexport DSH_HOME=\"$HOME/.niceeval-dsh\"\nrm -rf \"$DSH_HOME/profiles/headless\"\nwrapper_dir=\"$HOME/.niceeval-dsh/.niceeval-bin\"\nmkdir -p \"$wrapper_dir\"\nprintf '%s\\n' '#!/bin/sh' 'exec corepack pnpm@${DSH_PNPM_VERSION} \"$@\"' > \"$wrapper_dir/pnpm\"\nchmod +x \"$wrapper_dir/pnpm\"\nPATH=\"$wrapper_dir:$PATH\" dsh plugin --profile headless add ${specs}\nDSH_HOME=\"$DSH_HOME\" dsh --profile headless --dump-config >/dev/null`;\n await sandbox.runShellOrThrow(script, { signal: context.signal });\n },\n },\n };\n}\nfunction resolveApiKey(config?: DeepSeekHarnessConfig): string {\n return config?.apiKey ?? getEnv(\"DSH_API_KEY\") ?? requireEnv(\"DEEPSEEK_API_KEY\");\n}\nfunction resolveBaseUrl(config?: DeepSeekHarnessConfig): string | undefined {\n return config?.baseUrl ?? getEnv(\"DSH_BASE_URL\") ?? getEnv(\"DEEPSEEK_BASE_URL\");\n}\n/** DeepSeek Harness sandbox adapter backed by its one-shot headless profile. */\nexport function deepSeekHarnessAgent(config?: DeepSeekHarnessConfig): Agent {\n const version = config?.version ?? DEFAULT_DEEPSEEK_HARNESS_CLI_VERSION;\n const plugins = normalizeExactNpmPlugins(config?.plugins, \"deepSeekHarnessAgent plugins\");\n const install = createNpmCliInstaller({\n identity: {\n agent: \"deepseek-harness\",\n version,\n revision: String(AGENT_BASELINE_RECIPE_REVISION[\"deepseek-harness\"]),\n },\n packageName: \"@deepseek-ai/dsh\",\n bin: \"dsh\",\n });\n const homes = new Map<string, string>();\n const pluginLayer = plugins.length === 0 ? undefined : dshPluginLayer(version, plugins);\n return makeSandboxAgent({\n name: \"deepseek-harness\",\n evidenceCoverage: DSH_EVIDENCE_COVERAGE,\n ensure: pluginLayer === undefined ? install.ensure : [install.ensure, pluginLayer.ensure],\n installers: pluginLayer === undefined\n ? [install.installer]\n : [install.installer, pluginLayer.installer],\n setup: (sb, ctx) => Effect.tryPromise({\n try: async () => {\n const homeResult = await sb.runShell('test -n \"$HOME\" && printf \"%s\" \"$HOME\"');\n const home = homeResult.stdout.trim();\n if (homeResult.exitCode !== 0 || !home.startsWith(\"/\")) {\n throw new Error(\"DeepSeek Harness setup requires an absolute sandbox HOME directory\");\n }\n const dshHome = `${home}/.niceeval-dsh`;\n homes.set(sb.sandboxId, dshHome);\n const settings = {\n \"agent-default-model\": {\n provider: \"deepseek-official\",\n model: ctx.model ?? \"deepseek-v4-flash\",\n },\n permission: {\n defaultPreset: \"danger-full-access\",\n },\n };\n await shared.writeFile(sb, `${dshHome}/settings.yaml`, JSON.stringify(settings, null, 2));\n },\n catch: (cause) => cause,\n }),\n send: (input, ctx) => Effect.gen(function* () {\n const dshBin = yield* resolveAgentBinEffect(ctx.sandbox, \"dsh\");\n return yield* Effect.tryPromise({\n try: async (signal) => {\n const apiKey = resolveApiKey(config);\n const dshHome = homes.get(ctx.sandbox.sandboxId);\n if (!dshHome)\n throw new Error(\"DeepSeek Harness setup state is unavailable\");\n const env: globalThis.Record<string, string> = {\n DEEPSEEK_API_KEY: apiKey,\n DSH_HOME: dshHome,\n ...ctx.telemetry?.env,\n };\n const baseUrl = resolveBaseUrl(config);\n if (baseUrl)\n env.DEEPSEEK_BASE_URL = baseUrl;\n const res = await ctx.sandbox.runCommand(dshBin, [\"--profile\", \"headless\", input.text], {\n env,\n sensitiveValues: [apiKey],\n stream: true,\n signal,\n });\n const text = res.stdout.trim();\n if (res.exitCode !== 0 || !text) {\n throw makeSendFailure({\n acceptance: \"unknown\",\n message: res.exitCode !== 0\n ? shared.diagnoseFailure(res, [], undefined)\n : \"DeepSeek Harness exited successfully without a final assistant message.\",\n process: res,\n });\n }\n const events: StreamEvent[] = [{ type: \"message\", role: \"assistant\", text }];\n return { events, status: \"completed\" as const };\n },\n catch: (cause) => cause,\n });\n }),\n });\n}\nexport default deepSeekHarnessAgent;\n"]}
1
+ {"version":3,"file":"deepseek-harness.js","sourceRoot":"","sources":["deepseek-harness.ts"],"names":[],"mappings":";;AAoFA,oDAkFC;AAtKD,mCAAgC;AAChC,4CAAgD;AAChD,wCAAgD;AAEhD,kEAA8D;AAC9D,2CAAqC;AACrC,mDAA+E;AAC/E,wDAA+C;AAC/C,kDAAiD;AAEjD,iEAAgH;AAChH,qEAAiH;AACjH,MAAM,qBAAqB,GAAqB;IAC5C,MAAM,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,0DAA0D,EAAE;IACrG,OAAO,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,0DAA0D,EAAE;IACtG,QAAQ,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE;IAChC,KAAK,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,gDAAgD,EAAE;IAC1F,MAAM,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE;IAC9B,IAAI,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,+DAA+D,EAAE;CAC3G,CAAC;AAWF,MAAM,gBAAgB,GAAG,SAAS,CAAC;AACnC,SAAS,cAAc,CAAC,UAAkB,EAAE,OAAkC;IAI1E,MAAM,QAAQ,GAAG;QACb,KAAK,EAAE,0BAA0B;QACjC,OAAO,EAAE,UAAU;QACnB,QAAQ,EAAE,IAAA,6CAAsB,EAAC,OAAO,CAAC;KAC5C,CAAC;IACF,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IACzC,MAAM,MAAM,GAAG,wDAAwD;QACnE,kBAAkB,QAAQ,kDAAkD;QAC5E,mFAAmF;QACnF,8DAA8D;QAC9D,qFAAqF;QACrF,kDAAkD;QAClD,iGAAiG;QACjG,wFAAwF;QACxF,uEAAuE;QACvE,mGAAmG;QACnG,6EAA6E,CAAC;IAClF,MAAM,WAAW,GAAG,0CAA0C,IAAA,qBAAU,EAAC,MAAM,CAAC,EAAE,CAAC;IACnF,OAAO;QACH,MAAM,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAA,mBAAK,EAAC,WAAW,CAAC,EAAE;QAC/C,SAAS,EAAE;YACP,QAAQ;YACR,WAAW,EAAE,iBAAiB;YAC9B,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE;gBAChC,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAA,qBAAU,EAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACzE,MAAM,MAAM,GAAG;;;;;gDAKiB,gBAAgB;;8DAEF,KAAK;qEACE,CAAC;gBACtD,MAAM,OAAO,CAAC,eAAe,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;YACtE,CAAC;SACJ;KACJ,CAAC;AACN,CAAC;AACD,SAAS,aAAa,CAAC,MAA8B;IACjD,OAAO,MAAM,EAAE,MAAM,IAAI,IAAA,gBAAM,EAAC,aAAa,CAAC,IAAI,IAAA,oBAAU,EAAC,kBAAkB,CAAC,CAAC;AACrF,CAAC;AACD,SAAS,cAAc,CAAC,MAA8B;IAClD,OAAO,MAAM,EAAE,OAAO,IAAI,IAAA,gBAAM,EAAC,cAAc,CAAC,IAAI,IAAA,gBAAM,EAAC,mBAAmB,CAAC,CAAC;AACpF,CAAC;AACD,gFAAgF;AAChF,kDAAkD;AAClD,sDAAsD;AACtD,2EAA2E;AAC3E,SAAgB,oBAAoB,CAAC,MAA8B;IAC/D,MAAM,OAAO,GAAG,MAAM,EAAE,OAAO,IAAI,6DAAoC,CAAC;IACxE,MAAM,OAAO,GAAG,IAAA,+CAAwB,EAAC,MAAM,EAAE,OAAO,EAAE,8BAA8B,CAAC,CAAC;IAC1F,MAAM,OAAO,GAAG,IAAA,qCAAqB,EAAC;QAClC,QAAQ,EAAE;YACN,KAAK,EAAE,kBAAkB;YACzB,OAAO;YACP,QAAQ,EAAE,MAAM,CAAC,uDAA8B,CAAC,kBAAkB,CAAC,CAAC;SACvE;QACD,WAAW,EAAE,kBAAkB;QAC/B,GAAG,EAAE,KAAK;KACb,CAAC,CAAC;IACH,MAAM,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAC;IACxC,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACxF,OAAO,IAAA,4BAAgB,EAAC;QACpB,IAAI,EAAE,kBAAkB;QACxB,gBAAgB,EAAE,qBAAqB;QACvC,MAAM,EAAE,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC;QACzF,UAAU,EAAE,WAAW,KAAK,SAAS;YACjC,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC;YACrB,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,WAAW,CAAC,SAAS,CAAC;QAChD,KAAK,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,eAAM,CAAC,UAAU,CAAC;YAClC,GAAG,EAAE,KAAK,IAAI,EAAE;gBACZ,MAAM,UAAU,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,wCAAwC,CAAC,CAAC;gBAC/E,MAAM,IAAI,GAAG,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;gBACtC,IAAI,UAAU,CAAC,QAAQ,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;oBACrD,MAAM,IAAI,KAAK,CAAC,oEAAoE,CAAC,CAAC;gBAC1F,CAAC;gBACD,MAAM,OAAO,GAAG,GAAG,IAAI,gBAAgB,CAAC;gBACxC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;gBACjC,MAAM,QAAQ,GAAG;oBACb,qBAAqB,EAAE;wBACnB,QAAQ,EAAE,mBAAmB;wBAC7B,KAAK,EAAE,GAAG,CAAC,KAAK,IAAI,mBAAmB;qBAC1C;oBACD,UAAU,EAAE;wBACR,aAAa,EAAE,oBAAoB;qBACtC;iBACJ,CAAC;gBACF,MAAM,kBAAM,CAAC,SAAS,CAAC,EAAE,EAAE,GAAG,OAAO,gBAAgB,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAC9F,CAAC;YACD,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK;SAC1B,CAAC;QACF,IAAI,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC,eAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;YACtC,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,IAAA,qCAAqB,EAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAChE,OAAO,KAAK,CAAC,CAAC,eAAM,CAAC,UAAU,CAAC;gBAC5B,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;oBAClB,MAAM,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;oBACrC,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;oBACjD,IAAI,CAAC,OAAO;wBACR,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;oBACnE,MAAM,GAAG,GAAsC;wBAC3C,gBAAgB,EAAE,MAAM;wBACxB,QAAQ,EAAE,OAAO;wBACjB,GAAG,GAAG,CAAC,SAAS,EAAE,GAAG;qBACxB,CAAC;oBACF,MAAM,OAAO,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;oBACvC,IAAI,OAAO;wBACP,GAAG,CAAC,iBAAiB,GAAG,OAAO,CAAC;oBACpC,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,WAAW,EAAE,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE;wBACpF,GAAG;wBACH,eAAe,EAAE,CAAC,MAAM,CAAC;wBACzB,MAAM,EAAE,IAAI;wBACZ,MAAM;qBACT,CAAC,CAAC;oBACH,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;oBAC/B,IAAI,GAAG,CAAC,QAAQ,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;wBAC9B,MAAM,IAAA,kCAAe,EAAC;4BAClB,UAAU,EAAE,SAAS;4BACrB,OAAO,EAAE,GAAG,CAAC,QAAQ,KAAK,CAAC;gCACvB,CAAC,CAAC,kBAAM,CAAC,eAAe,CAAC,GAAG,EAAE,EAAE,EAAE,SAAS,CAAC;gCAC5C,CAAC,CAAC,yEAAyE;4BAC/E,OAAO,EAAE,GAAG;yBACf,CAAC,CAAC;oBACP,CAAC;oBACD,MAAM,MAAM,GAAkB,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;oBAC7E,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,WAAoB,EAAE,CAAC;gBACpD,CAAC;gBACD,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK;aAC1B,CAAC,CAAC;QACP,CAAC,CAAC;KACL,CAAC,CAAC;AACP,CAAC;AACD,kBAAe,oBAAoB,CAAC","sourcesContent":["import { Effect } from \"effect\";\nimport { makeSandboxAgent } from \"../define.ts\";\nimport { getEnv, requireEnv } from \"../util.ts\";\nimport type { Agent, EvidenceCoverage, StreamEvent } from \"../types.ts\";\nimport { makeSendFailure } from \"../context/send-failures.ts\";\nimport { shared } from \"./shared.ts\";\nimport { createNpmCliInstaller, resolveAgentBinEffect } from \"./npm-staged.ts\";\nimport { shell } from \"../sandbox/commands.ts\";\nimport { shellQuote } from \"../sandbox/shell.ts\";\nimport type { AgentEnsure, AgentInstaller } from \"./types.ts\";\nimport { exactNpmPluginRevision, normalizeExactNpmPlugins, type ExactNpmPlugin, } from \"./exact-npm-plugins.ts\";\nimport { AGENT_BASELINE_RECIPE_REVISION, DEFAULT_DEEPSEEK_HARNESS_CLI_VERSION, } from \"./coding-cli-versions.ts\";\nconst DSH_EVIDENCE_COVERAGE: EvidenceCoverage = {\n events: { status: \"unavailable\", reason: \"DSH headless mode exposes only the final assistant text.\" },\n actions: { status: \"unavailable\", reason: \"DSH headless mode does not expose tool lifecycle events.\" },\n messages: { status: \"complete\" },\n usage: { status: \"unavailable\", reason: \"DSH headless mode does not expose token usage.\" },\n status: { status: \"complete\" },\n data: { status: \"unavailable\", reason: \"DSH headless mode does not expose a separate Turn.data value.\" },\n};\nexport interface DeepSeekHarnessConfig {\n /** DeepSeek-compatible API key. Defaults to DSH_API_KEY, then DEEPSEEK_API_KEY. */\n apiKey?: string;\n /** DeepSeek-compatible endpoint. Defaults to DSH_BASE_URL, then DEEPSEEK_BASE_URL. */\n baseUrl?: string;\n /** Exact npm version of `@deepseek-ai/dsh`. */\n version?: string;\n /** Native DSH bundles as exact npm package@version declarations. */\n plugins?: readonly string[];\n}\nconst DSH_PNPM_VERSION = \"10.17.1\";\nfunction dshPluginLayer(cliVersion: string, plugins: readonly ExactNpmPlugin[]): {\n ensure: AgentEnsure;\n installer: AgentInstaller;\n} {\n const identity = {\n agent: \"deepseek-harness-plugins\",\n version: cliVersion,\n revision: exactNpmPluginRevision(plugins),\n };\n const expected = JSON.stringify(plugins);\n const verify = `const fs=require(\"node:fs\"),path=require(\"node:path\");` +\n `const expected=${expected},root=process.env.DSH_HOME+\"/profiles/headless\";` +\n `const profile=JSON.parse(fs.readFileSync(path.join(root,\"package.json\"),\"utf8\"));` +\n `const deps=profile.dependencies||{},names=Object.keys(deps);` +\n `if(JSON.stringify(names)!==JSON.stringify(expected.map(x=>x.name)))process.exit(1);` +\n `const bundles=profile.dsh?.profile?.bundles||[];` +\n `const external=bundles.filter(x=>x!==\"@deepseek-ai/dsh-base\"&&x!==\"@deepseek-ai/dsh-headless\");` +\n `if(JSON.stringify(external)!==JSON.stringify(expected.map(x=>x.name)))process.exit(1);` +\n `for(const x of expected){if(deps[x.name]!==x.version)process.exit(1);` +\n `const p=JSON.parse(fs.readFileSync(path.join(root,\"node_modules\",x.name,\"package.json\"),\"utf8\"));` +\n `if(p.name!==x.name||p.version!==x.version||!p.dsh?.bundle)process.exit(1);}`;\n const probeScript = `DSH_HOME=\"$HOME/.niceeval-dsh\" node -e ${shellQuote(verify)}`;\n return {\n ensure: { identity, probe: shell(probeScript) },\n installer: {\n identity,\n installMode: \"sandbox-network\",\n install: async (sandbox, context) => {\n const specs = plugins.map((plugin) => shellQuote(plugin.spec)).join(\" \");\n const script = `set -eu\nexport DSH_HOME=\"$HOME/.niceeval-dsh\"\nrm -rf \"$DSH_HOME/profiles/headless\"\nwrapper_dir=\"$HOME/.niceeval-dsh/.niceeval-bin\"\nmkdir -p \"$wrapper_dir\"\nprintf '%s\\n' '#!/bin/sh' 'exec corepack pnpm@${DSH_PNPM_VERSION} \"$@\"' > \"$wrapper_dir/pnpm\"\nchmod +x \"$wrapper_dir/pnpm\"\nPATH=\"$wrapper_dir:$PATH\" dsh plugin --profile headless add ${specs}\nDSH_HOME=\"$DSH_HOME\" dsh --profile headless --dump-config >/dev/null`;\n await sandbox.runShellOrThrow(script, { signal: context.signal });\n },\n },\n };\n}\nfunction resolveApiKey(config?: DeepSeekHarnessConfig): string {\n return config?.apiKey ?? getEnv(\"DSH_API_KEY\") ?? requireEnv(\"DEEPSEEK_API_KEY\");\n}\nfunction resolveBaseUrl(config?: DeepSeekHarnessConfig): string | undefined {\n return config?.baseUrl ?? getEnv(\"DSH_BASE_URL\") ?? getEnv(\"DEEPSEEK_BASE_URL\");\n}\n/** DeepSeek Harness sandbox adapter backed by its one-shot headless profile. */\n// @concord-code ne-adapter-deepseek-harness-agent\n// @concord-implements docs/feature/adapters/README.md\n// @concord-implements docs/feature/adapters/sdk/deepseek-harness/README.md\nexport function deepSeekHarnessAgent(config?: DeepSeekHarnessConfig): Agent {\n const version = config?.version ?? DEFAULT_DEEPSEEK_HARNESS_CLI_VERSION;\n const plugins = normalizeExactNpmPlugins(config?.plugins, \"deepSeekHarnessAgent plugins\");\n const install = createNpmCliInstaller({\n identity: {\n agent: \"deepseek-harness\",\n version,\n revision: String(AGENT_BASELINE_RECIPE_REVISION[\"deepseek-harness\"]),\n },\n packageName: \"@deepseek-ai/dsh\",\n bin: \"dsh\",\n });\n const homes = new Map<string, string>();\n const pluginLayer = plugins.length === 0 ? undefined : dshPluginLayer(version, plugins);\n return makeSandboxAgent({\n name: \"deepseek-harness\",\n evidenceCoverage: DSH_EVIDENCE_COVERAGE,\n ensure: pluginLayer === undefined ? install.ensure : [install.ensure, pluginLayer.ensure],\n installers: pluginLayer === undefined\n ? [install.installer]\n : [install.installer, pluginLayer.installer],\n setup: (sb, ctx) => Effect.tryPromise({\n try: async () => {\n const homeResult = await sb.runShell('test -n \"$HOME\" && printf \"%s\" \"$HOME\"');\n const home = homeResult.stdout.trim();\n if (homeResult.exitCode !== 0 || !home.startsWith(\"/\")) {\n throw new Error(\"DeepSeek Harness setup requires an absolute sandbox HOME directory\");\n }\n const dshHome = `${home}/.niceeval-dsh`;\n homes.set(sb.sandboxId, dshHome);\n const settings = {\n \"agent-default-model\": {\n provider: \"deepseek-official\",\n model: ctx.model ?? \"deepseek-v4-flash\",\n },\n permission: {\n defaultPreset: \"danger-full-access\",\n },\n };\n await shared.writeFile(sb, `${dshHome}/settings.yaml`, JSON.stringify(settings, null, 2));\n },\n catch: (cause) => cause,\n }),\n send: (input, ctx) => Effect.gen(function* () {\n const dshBin = yield* resolveAgentBinEffect(ctx.sandbox, \"dsh\");\n return yield* Effect.tryPromise({\n try: async (signal) => {\n const apiKey = resolveApiKey(config);\n const dshHome = homes.get(ctx.sandbox.sandboxId);\n if (!dshHome)\n throw new Error(\"DeepSeek Harness setup state is unavailable\");\n const env: globalThis.Record<string, string> = {\n DEEPSEEK_API_KEY: apiKey,\n DSH_HOME: dshHome,\n ...ctx.telemetry?.env,\n };\n const baseUrl = resolveBaseUrl(config);\n if (baseUrl)\n env.DEEPSEEK_BASE_URL = baseUrl;\n const res = await ctx.sandbox.runCommand(dshBin, [\"--profile\", \"headless\", input.text], {\n env,\n sensitiveValues: [apiKey],\n stream: true,\n signal,\n });\n const text = res.stdout.trim();\n if (res.exitCode !== 0 || !text) {\n throw makeSendFailure({\n acceptance: \"unknown\",\n message: res.exitCode !== 0\n ? shared.diagnoseFailure(res, [], undefined)\n : \"DeepSeek Harness exited successfully without a final assistant message.\",\n process: res,\n });\n }\n const events: StreamEvent[] = [{ type: \"message\", role: \"assistant\", text }];\n return { events, status: \"completed\" as const };\n },\n catch: (cause) => cause,\n });\n }),\n });\n}\nexport default deepSeekHarnessAgent;\n"]}
@@ -89,6 +89,9 @@ async function hermesSkillDir(sb) {
89
89
  /**
90
90
  * Hermes Agent 的内置 sandbox Agent 工厂。
91
91
  */
92
+ // @concord-code ne-adapter-hermes-agent
93
+ // @concord-implements docs/feature/adapters/README.md
94
+ // @concord-implements docs/feature/adapters/sdk/hermes/README.md
92
95
  function hermesAgent(config) {
93
96
  const version = config?.version ?? coding_cli_versions_ts_1.DEFAULT_HERMES_CLI_VERSION;
94
97
  const identity = { agent: "hermes", version, revision: "1" };
@@ -1 +1 @@
1
- {"version":3,"file":"hermes.js","sourceRoot":"","sources":["hermes.ts"],"names":[],"mappings":"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","sourcesContent":["import { Effect } from \"effect\";\nimport { makeSandboxAgent } from \"../define.ts\";\nimport { requireEnv, getEnv } from \"../util.ts\";\nimport { shared } from \"./shared.ts\";\nimport { appendProjectInstruction, installSkills, installedSkillNames, skillDiscoveryInstruction, } from \"./skills.ts\";\nimport { mapGenericSpans } from \"../o11y/otlp/canonical.ts\";\nimport { unclassifiedToolActionsCoverage } from \"../o11y/command-projection.ts\";\nimport { completeEvidenceCoverage } from \"../assertions/coverage.ts\";\nimport { parseHermesTranscript, sessionIdFromHermesOutput } from \"../o11y/parsers/hermes.ts\";\nimport { DEFAULT_HERMES_CLI_VERSION } from \"./coding-cli-versions.ts\";\nimport { shellQuote } from \"../sandbox/shell.ts\";\nimport type { Agent, AgentSetupManifest, Sandbox, SkillSpec, StreamEvent, TurnEvidenceCoverage } from \"../types.ts\";\nimport { makeSendFailure, sendAcceptanceFromEvents } from \"../context/send-failures.ts\";\nimport { defineSandboxCommand } from \"../sandbox/commands.ts\";\n// Hermes Agent sandbox adapter。驱动:`hermes chat -q … --yolo`;\n// 行为轨优先 `hermes sessions export`,不足时 sqlite 读 messages。\n// 契约见 docs/feature/adapters/sdk/hermes/README.md。\n//\n// Docker 沙箱会覆盖 PATH(不含 $HOME/.local/bin),所以安装与调用一律走\n// `$HOME/.local/bin/hermes`(同 bub 裁决),不依赖 command -v。\nconst UV = \"$HOME/.local/bin/uv\";\nconst HERMES = \"$HOME/.local/bin/hermes\";\nexport interface HermesConfig {\n /** 模型 API key。省略时读 HERMES_API_KEY → OPENROUTER_API_KEY → ANTHROPIC_API_KEY。 */\n apiKey?: string;\n /** OpenAI 兼容端点。省略时读 HERMES_API_BASE。 */\n baseUrl?: string;\n /** 钉 PyPI `hermes-agent` 版本;省略时用 NiceEval 默认 pin。 */\n version?: string;\n /** 装进沙箱的 Skill,落在 `~/.hermes/skills/<name>/`。 */\n skills?: SkillSpec[];\n}\nfunction resolveApiKey(config?: HermesConfig): string {\n return (config?.apiKey ??\n getEnv(\"HERMES_API_KEY\") ??\n getEnv(\"OPENROUTER_API_KEY\") ??\n requireEnv(\"ANTHROPIC_API_KEY\"));\n}\nfunction resolveBaseUrl(config?: HermesConfig): string | undefined {\n return config?.baseUrl ?? getEnv(\"HERMES_API_BASE\");\n}\nasync function hermesShell(sb: Sandbox, args: string[], env: globalThis.Record<string, string>, opts?: {\n stream?: boolean;\n sensitiveValues?: readonly string[];\n}): Promise<{\n exitCode: number;\n stdout: string;\n stderr: string;\n}> {\n // HERMES 变量本身不要 quote,以便 shell 展开 $HOME。\n const script = `${HERMES} ${args.map(shellQuote).join(\" \")}`;\n return sb.runShell(script, {\n env,\n sensitiveValues: opts?.sensitiveValues,\n stream: opts?.stream,\n });\n}\nasync function exportSession(sb: Sandbox, sessionId: string, env: globalThis.Record<string, string>, sensitiveValues: readonly string[]): Promise<string | undefined> {\n const outPath = `/tmp/niceeval-hermes-${sessionId}.jsonl`;\n const res = await hermesShell(sb, [\"sessions\", \"export\", outPath, \"--session-id\", sessionId], env, { sensitiveValues });\n if (res.exitCode !== 0)\n return undefined;\n try {\n return await sb.readText(outPath);\n }\n catch {\n return undefined;\n }\n}\nasync function dumpMessagesFromDb(sb: Sandbox, sessionId: string): Promise<string | undefined> {\n // 不引入宿主 sqlite3 依赖:在沙箱里用 python 读 state.db(Hermes 自带 Python 运行时)。\n const script = `\nimport json, sqlite3, os, sys\ndb = os.path.expanduser(\"~/.hermes/state.db\")\nif not os.path.exists(db):\n sys.exit(0)\ncon = sqlite3.connect(db)\ncon.row_factory = sqlite3.Row\nsid = sys.argv[1]\nsess = con.execute(\"SELECT * FROM sessions WHERE id = ?\", (sid,)).fetchone()\nif sess:\n print(json.dumps(dict(sess), default=str))\nrows = con.execute(\n \"SELECT role, content, tool_call_id, tool_calls, tool_name, reasoning, reasoning_content FROM messages WHERE session_id = ? ORDER BY timestamp, id\",\n (sid,),\n).fetchall()\nfor r in rows:\n print(json.dumps(dict(r), default=str))\n`;\n const res = await sb.runShell(`python3 -c ${shellQuote(script)} ${shellQuote(sessionId)}`);\n if (res.exitCode !== 0 || !res.stdout.trim())\n return undefined;\n return res.stdout;\n}\n/** Hermes 只扫描其 profile home 下的 skills,不扫描 attempt 工作目录。 */\nasync function hermesSkillDir(sb: Sandbox): Promise<string> {\n const home = await sb.runShell('test -n \"$HOME\" && printf \"%s\" \"$HOME\"');\n const path = home.stdout.trim();\n if (home.exitCode !== 0 || !path.startsWith(\"/\")) {\n throw new Error(\"Hermes skill installation requires an absolute sandbox HOME directory\");\n }\n return `${path}/.hermes/skills`;\n}\n/**\n * Hermes Agent 的内置 sandbox Agent 工厂。\n */\nexport function hermesAgent(config?: HermesConfig): Agent {\n const version = config?.version ?? DEFAULT_HERMES_CLI_VERSION;\n const identity = { agent: \"hermes\", version, revision: \"1\" } as const;\n const probe = defineSandboxCommand({ id: \"niceeval.agent.probe.hermes\", revision: identity.revision, inputs: identity }, async (sandbox) => {\n await sandbox.runShellOrThrow(`test -x ${HERMES} && ${HERMES} --version 2>&1 | grep -F -- ${shellQuote(version)}`);\n });\n return makeSandboxAgent({\n name: \"hermes\",\n ensure: { identity, probe },\n installers: [{\n identity,\n installMode: \"sandbox-network\",\n install: async (sandbox) => {\n await sandbox.runShellOrThrow(`test -x ${UV} || (curl -LsSf https://astral.sh/uv/install.sh | sh)`);\n await sandbox.runShellOrThrow(`${UV} tool install hermes-agent==${version}`);\n },\n }],\n evidenceCoverage: completeEvidenceCoverage,\n spanMapper: mapGenericSpans,\n setup: (sb, ctx) => Effect.tryPromise({\n try: async () => {\n const baseUrl = resolveBaseUrl(config);\n if (baseUrl) {\n // OpenAI 兼容网关:写 custom provider + model.base_url;\n // secret 进 ~/.hermes/.env,不进 git 可见配置。\n const apiKey = resolveApiKey(config);\n const hermesConfig = [\n \"model:\",\n \" provider: custom\",\n ` base_url: ${baseUrl}`,\n \"custom_providers:\",\n \" - name: compat\",\n ` base_url: ${baseUrl}`,\n ` api_key: ${apiKey}`,\n \"\",\n ].join(\"\\n\");\n const hermesEnv = [\n `OPENAI_API_KEY=${apiKey}`,\n `OPENAI_BASE_URL=${baseUrl}`,\n \"\",\n ].join(\"\\n\");\n await shared.writeFile(sb, \"~/.hermes/config.yaml\", hermesConfig, { sensitiveValues: [apiKey] });\n await shared.writeFile(sb, \"~/.hermes/.env\", hermesEnv, { sensitiveValues: [apiKey] });\n }\n const manifest: AgentSetupManifest = { skills: [] };\n if (config?.skills?.length) {\n const skillDir = await hermesSkillDir(sb);\n manifest.skills = await installSkills(sb, config.skills, { dir: skillDir });\n await appendProjectInstruction(sb, skillDiscoveryInstruction(skillDir, installedSkillNames(manifest.skills)));\n }\n if (manifest.skills.length) {\n ctx.reportSetup(manifest);\n }\n },\n catch: (cause) => cause,\n }),\n send: (input, ctx) => Effect.tryPromise({\n try: async () => {\n const sb = ctx.sandbox;\n const baseUrl = resolveBaseUrl(config);\n const args = [\"chat\", \"-q\", input.text, \"--yolo\", \"-Q\"];\n if (ctx.model)\n args.push(\"--model\", ctx.model);\n if (baseUrl)\n args.push(\"--provider\", \"custom\");\n if (ctx.session.id)\n args.push(\"--resume\", ctx.session.id);\n const apiKey = resolveApiKey(config);\n const env: globalThis.Record<string, string> = {\n HERMES_API_KEY: apiKey,\n ANTHROPIC_API_KEY: apiKey,\n OPENROUTER_API_KEY: apiKey,\n OPENAI_API_KEY: apiKey,\n HERMES_YOLO_MODE: \"1\",\n ...ctx.telemetry?.env,\n };\n if (baseUrl) {\n env.HERMES_API_BASE = baseUrl;\n env.OPENAI_BASE_URL = baseUrl;\n env.ANTHROPIC_BASE_URL = baseUrl;\n }\n const sensitiveValues = [apiKey];\n const res = await hermesShell(sb, args, env, { stream: true, sensitiveValues });\n let sessionId = sessionIdFromHermesOutput(res.stdout) ??\n sessionIdFromHermesOutput(res.stderr) ??\n ctx.session.id;\n // 没从输出抠到 id 时,取 state.db 里最新 cli session\n if (!sessionId) {\n const latest = await sb.runShell([\n `python3 -c 'import sqlite3,os;db=os.path.expanduser(\"~/.hermes/state.db\");`,\n \"import sys\",\n \"if not os.path.exists(db): sys.exit(0)\",\n \"c=sqlite3.connect(db)\",\n `r=c.execute(\"select id from sessions where source=\\\\\"cli\\\\\" order by started_at desc limit 1\").fetchone()`,\n `print(r[0] if r else \"\")'`,\n ].join(\"\\n\"));\n const id = latest.stdout.trim();\n if (id)\n sessionId = id;\n }\n if (sessionId)\n ctx.session.capture(sessionId);\n let raw: string | undefined;\n if (sessionId) {\n raw = await exportSession(sb, sessionId, env, sensitiveValues);\n if (!raw)\n raw = await dumpMessagesFromDb(sb, sessionId);\n }\n const parsed = parseHermesTranscript(raw);\n const events: StreamEvent[] = [...parsed.events];\n let turnEvidenceCoverage: TurnEvidenceCoverage | undefined;\n if (!raw || parsed.events.length === 0) {\n const reason = \"hermes session export/state.db unavailable; tool trajectory missing\";\n turnEvidenceCoverage = {\n events: { status: \"unavailable\", reason },\n actions: { status: \"unavailable\", reason },\n usage: { status: \"unavailable\", reason },\n };\n ctx.log(\"hermes transcript unavailable: negative assertions are unreliable\");\n const text = res.stdout.trim().split(\"\\n\").filter((l) => !l.startsWith(\"{\")).slice(-8).join(\"\\n\");\n if (text)\n events.push({ type: \"message\", role: \"assistant\", text });\n }\n else if (!parsed.parseSuccess) {\n const reason = \"some Hermes transcript lines could not be parsed\";\n turnEvidenceCoverage = {\n events: { status: \"partial\", reason },\n actions: { status: \"partial\", reason },\n };\n }\n else {\n turnEvidenceCoverage = unclassifiedToolActionsCoverage(events);\n }\n if (res.exitCode !== 0) {\n throw makeSendFailure({\n acceptance: sendAcceptanceFromEvents(events),\n message: shared.diagnoseFailure(res, parsed.events, raw),\n events,\n usage: parsed.usage,\n process: res,\n });\n }\n return {\n events,\n usage: parsed.usage,\n status: \"completed\",\n ...(turnEvidenceCoverage ? { evidenceCoverage: turnEvidenceCoverage } : {}),\n };\n },\n catch: (cause) => cause,\n }),\n });\n}\nexport default hermesAgent();\n"]}
1
+ {"version":3,"file":"hermes.js","sourceRoot":"","sources":["hermes.ts"],"names":[],"mappings":"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","sourcesContent":["import { Effect } from \"effect\";\nimport { makeSandboxAgent } from \"../define.ts\";\nimport { requireEnv, getEnv } from \"../util.ts\";\nimport { shared } from \"./shared.ts\";\nimport { appendProjectInstruction, installSkills, installedSkillNames, skillDiscoveryInstruction, } from \"./skills.ts\";\nimport { mapGenericSpans } from \"../o11y/otlp/canonical.ts\";\nimport { unclassifiedToolActionsCoverage } from \"../o11y/command-projection.ts\";\nimport { completeEvidenceCoverage } from \"../assertions/coverage.ts\";\nimport { parseHermesTranscript, sessionIdFromHermesOutput } from \"../o11y/parsers/hermes.ts\";\nimport { DEFAULT_HERMES_CLI_VERSION } from \"./coding-cli-versions.ts\";\nimport { shellQuote } from \"../sandbox/shell.ts\";\nimport type { Agent, AgentSetupManifest, Sandbox, SkillSpec, StreamEvent, TurnEvidenceCoverage } from \"../types.ts\";\nimport { makeSendFailure, sendAcceptanceFromEvents } from \"../context/send-failures.ts\";\nimport { defineSandboxCommand } from \"../sandbox/commands.ts\";\n// Hermes Agent sandbox adapter。驱动:`hermes chat -q … --yolo`;\n// 行为轨优先 `hermes sessions export`,不足时 sqlite 读 messages。\n// 契约见 docs/feature/adapters/sdk/hermes/README.md。\n//\n// Docker 沙箱会覆盖 PATH(不含 $HOME/.local/bin),所以安装与调用一律走\n// `$HOME/.local/bin/hermes`(同 bub 裁决),不依赖 command -v。\nconst UV = \"$HOME/.local/bin/uv\";\nconst HERMES = \"$HOME/.local/bin/hermes\";\nexport interface HermesConfig {\n /** 模型 API key。省略时读 HERMES_API_KEY → OPENROUTER_API_KEY → ANTHROPIC_API_KEY。 */\n apiKey?: string;\n /** OpenAI 兼容端点。省略时读 HERMES_API_BASE。 */\n baseUrl?: string;\n /** 钉 PyPI `hermes-agent` 版本;省略时用 NiceEval 默认 pin。 */\n version?: string;\n /** 装进沙箱的 Skill,落在 `~/.hermes/skills/<name>/`。 */\n skills?: SkillSpec[];\n}\nfunction resolveApiKey(config?: HermesConfig): string {\n return (config?.apiKey ??\n getEnv(\"HERMES_API_KEY\") ??\n getEnv(\"OPENROUTER_API_KEY\") ??\n requireEnv(\"ANTHROPIC_API_KEY\"));\n}\nfunction resolveBaseUrl(config?: HermesConfig): string | undefined {\n return config?.baseUrl ?? getEnv(\"HERMES_API_BASE\");\n}\nasync function hermesShell(sb: Sandbox, args: string[], env: globalThis.Record<string, string>, opts?: {\n stream?: boolean;\n sensitiveValues?: readonly string[];\n}): Promise<{\n exitCode: number;\n stdout: string;\n stderr: string;\n}> {\n // HERMES 变量本身不要 quote,以便 shell 展开 $HOME。\n const script = `${HERMES} ${args.map(shellQuote).join(\" \")}`;\n return sb.runShell(script, {\n env,\n sensitiveValues: opts?.sensitiveValues,\n stream: opts?.stream,\n });\n}\nasync function exportSession(sb: Sandbox, sessionId: string, env: globalThis.Record<string, string>, sensitiveValues: readonly string[]): Promise<string | undefined> {\n const outPath = `/tmp/niceeval-hermes-${sessionId}.jsonl`;\n const res = await hermesShell(sb, [\"sessions\", \"export\", outPath, \"--session-id\", sessionId], env, { sensitiveValues });\n if (res.exitCode !== 0)\n return undefined;\n try {\n return await sb.readText(outPath);\n }\n catch {\n return undefined;\n }\n}\nasync function dumpMessagesFromDb(sb: Sandbox, sessionId: string): Promise<string | undefined> {\n // 不引入宿主 sqlite3 依赖:在沙箱里用 python 读 state.db(Hermes 自带 Python 运行时)。\n const script = `\nimport json, sqlite3, os, sys\ndb = os.path.expanduser(\"~/.hermes/state.db\")\nif not os.path.exists(db):\n sys.exit(0)\ncon = sqlite3.connect(db)\ncon.row_factory = sqlite3.Row\nsid = sys.argv[1]\nsess = con.execute(\"SELECT * FROM sessions WHERE id = ?\", (sid,)).fetchone()\nif sess:\n print(json.dumps(dict(sess), default=str))\nrows = con.execute(\n \"SELECT role, content, tool_call_id, tool_calls, tool_name, reasoning, reasoning_content FROM messages WHERE session_id = ? ORDER BY timestamp, id\",\n (sid,),\n).fetchall()\nfor r in rows:\n print(json.dumps(dict(r), default=str))\n`;\n const res = await sb.runShell(`python3 -c ${shellQuote(script)} ${shellQuote(sessionId)}`);\n if (res.exitCode !== 0 || !res.stdout.trim())\n return undefined;\n return res.stdout;\n}\n/** Hermes 只扫描其 profile home 下的 skills,不扫描 attempt 工作目录。 */\nasync function hermesSkillDir(sb: Sandbox): Promise<string> {\n const home = await sb.runShell('test -n \"$HOME\" && printf \"%s\" \"$HOME\"');\n const path = home.stdout.trim();\n if (home.exitCode !== 0 || !path.startsWith(\"/\")) {\n throw new Error(\"Hermes skill installation requires an absolute sandbox HOME directory\");\n }\n return `${path}/.hermes/skills`;\n}\n/**\n * Hermes Agent 的内置 sandbox Agent 工厂。\n */\n// @concord-code ne-adapter-hermes-agent\n// @concord-implements docs/feature/adapters/README.md\n// @concord-implements docs/feature/adapters/sdk/hermes/README.md\nexport function hermesAgent(config?: HermesConfig): Agent {\n const version = config?.version ?? DEFAULT_HERMES_CLI_VERSION;\n const identity = { agent: \"hermes\", version, revision: \"1\" } as const;\n const probe = defineSandboxCommand({ id: \"niceeval.agent.probe.hermes\", revision: identity.revision, inputs: identity }, async (sandbox) => {\n await sandbox.runShellOrThrow(`test -x ${HERMES} && ${HERMES} --version 2>&1 | grep -F -- ${shellQuote(version)}`);\n });\n return makeSandboxAgent({\n name: \"hermes\",\n ensure: { identity, probe },\n installers: [{\n identity,\n installMode: \"sandbox-network\",\n install: async (sandbox) => {\n await sandbox.runShellOrThrow(`test -x ${UV} || (curl -LsSf https://astral.sh/uv/install.sh | sh)`);\n await sandbox.runShellOrThrow(`${UV} tool install hermes-agent==${version}`);\n },\n }],\n evidenceCoverage: completeEvidenceCoverage,\n spanMapper: mapGenericSpans,\n setup: (sb, ctx) => Effect.tryPromise({\n try: async () => {\n const baseUrl = resolveBaseUrl(config);\n if (baseUrl) {\n // OpenAI 兼容网关:写 custom provider + model.base_url;\n // secret 进 ~/.hermes/.env,不进 git 可见配置。\n const apiKey = resolveApiKey(config);\n const hermesConfig = [\n \"model:\",\n \" provider: custom\",\n ` base_url: ${baseUrl}`,\n \"custom_providers:\",\n \" - name: compat\",\n ` base_url: ${baseUrl}`,\n ` api_key: ${apiKey}`,\n \"\",\n ].join(\"\\n\");\n const hermesEnv = [\n `OPENAI_API_KEY=${apiKey}`,\n `OPENAI_BASE_URL=${baseUrl}`,\n \"\",\n ].join(\"\\n\");\n await shared.writeFile(sb, \"~/.hermes/config.yaml\", hermesConfig, { sensitiveValues: [apiKey] });\n await shared.writeFile(sb, \"~/.hermes/.env\", hermesEnv, { sensitiveValues: [apiKey] });\n }\n const manifest: AgentSetupManifest = { skills: [] };\n if (config?.skills?.length) {\n const skillDir = await hermesSkillDir(sb);\n manifest.skills = await installSkills(sb, config.skills, { dir: skillDir });\n await appendProjectInstruction(sb, skillDiscoveryInstruction(skillDir, installedSkillNames(manifest.skills)));\n }\n if (manifest.skills.length) {\n ctx.reportSetup(manifest);\n }\n },\n catch: (cause) => cause,\n }),\n send: (input, ctx) => Effect.tryPromise({\n try: async () => {\n const sb = ctx.sandbox;\n const baseUrl = resolveBaseUrl(config);\n const args = [\"chat\", \"-q\", input.text, \"--yolo\", \"-Q\"];\n if (ctx.model)\n args.push(\"--model\", ctx.model);\n if (baseUrl)\n args.push(\"--provider\", \"custom\");\n if (ctx.session.id)\n args.push(\"--resume\", ctx.session.id);\n const apiKey = resolveApiKey(config);\n const env: globalThis.Record<string, string> = {\n HERMES_API_KEY: apiKey,\n ANTHROPIC_API_KEY: apiKey,\n OPENROUTER_API_KEY: apiKey,\n OPENAI_API_KEY: apiKey,\n HERMES_YOLO_MODE: \"1\",\n ...ctx.telemetry?.env,\n };\n if (baseUrl) {\n env.HERMES_API_BASE = baseUrl;\n env.OPENAI_BASE_URL = baseUrl;\n env.ANTHROPIC_BASE_URL = baseUrl;\n }\n const sensitiveValues = [apiKey];\n const res = await hermesShell(sb, args, env, { stream: true, sensitiveValues });\n let sessionId = sessionIdFromHermesOutput(res.stdout) ??\n sessionIdFromHermesOutput(res.stderr) ??\n ctx.session.id;\n // 没从输出抠到 id 时,取 state.db 里最新 cli session\n if (!sessionId) {\n const latest = await sb.runShell([\n `python3 -c 'import sqlite3,os;db=os.path.expanduser(\"~/.hermes/state.db\");`,\n \"import sys\",\n \"if not os.path.exists(db): sys.exit(0)\",\n \"c=sqlite3.connect(db)\",\n `r=c.execute(\"select id from sessions where source=\\\\\"cli\\\\\" order by started_at desc limit 1\").fetchone()`,\n `print(r[0] if r else \"\")'`,\n ].join(\"\\n\"));\n const id = latest.stdout.trim();\n if (id)\n sessionId = id;\n }\n if (sessionId)\n ctx.session.capture(sessionId);\n let raw: string | undefined;\n if (sessionId) {\n raw = await exportSession(sb, sessionId, env, sensitiveValues);\n if (!raw)\n raw = await dumpMessagesFromDb(sb, sessionId);\n }\n const parsed = parseHermesTranscript(raw);\n const events: StreamEvent[] = [...parsed.events];\n let turnEvidenceCoverage: TurnEvidenceCoverage | undefined;\n if (!raw || parsed.events.length === 0) {\n const reason = \"hermes session export/state.db unavailable; tool trajectory missing\";\n turnEvidenceCoverage = {\n events: { status: \"unavailable\", reason },\n actions: { status: \"unavailable\", reason },\n usage: { status: \"unavailable\", reason },\n };\n ctx.log(\"hermes transcript unavailable: negative assertions are unreliable\");\n const text = res.stdout.trim().split(\"\\n\").filter((l) => !l.startsWith(\"{\")).slice(-8).join(\"\\n\");\n if (text)\n events.push({ type: \"message\", role: \"assistant\", text });\n }\n else if (!parsed.parseSuccess) {\n const reason = \"some Hermes transcript lines could not be parsed\";\n turnEvidenceCoverage = {\n events: { status: \"partial\", reason },\n actions: { status: \"partial\", reason },\n };\n }\n else {\n turnEvidenceCoverage = unclassifiedToolActionsCoverage(events);\n }\n if (res.exitCode !== 0) {\n throw makeSendFailure({\n acceptance: sendAcceptanceFromEvents(events),\n message: shared.diagnoseFailure(res, parsed.events, raw),\n events,\n usage: parsed.usage,\n process: res,\n });\n }\n return {\n events,\n usage: parsed.usage,\n status: \"completed\",\n ...(turnEvidenceCoverage ? { evidenceCoverage: turnEvidenceCoverage } : {}),\n };\n },\n catch: (cause) => cause,\n }),\n });\n}\nexport default hermesAgent();\n"]}