niceeval 0.13.2-canary.35 → 0.13.2

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 (485) hide show
  1. package/INDEX.md +24 -2
  2. package/dist/agents/bub-install-spec.cjs +19 -5
  3. package/dist/agents/bub-install-spec.cjs.map +1 -1
  4. package/dist/agents/bub-install-spec.d.cts +9 -2
  5. package/dist/agents/bub-install-spec.d.mts +9 -2
  6. package/dist/agents/bub-install-spec.d.ts +9 -2
  7. package/dist/agents/bub-install-spec.js +14 -12
  8. package/dist/agents/bub.cjs +10 -6
  9. package/dist/agents/bub.cjs.map +1 -1
  10. package/dist/agents/bub.d.cts +2 -2
  11. package/dist/agents/bub.d.mts +2 -2
  12. package/dist/agents/bub.d.ts +2 -2
  13. package/dist/agents/claude-code.cjs.map +1 -1
  14. package/dist/agents/claude-code.d.cts +2 -2
  15. package/dist/agents/claude-code.d.mts +2 -2
  16. package/dist/agents/claude-code.d.ts +2 -2
  17. package/dist/agents/codex.cjs +4 -4
  18. package/dist/agents/codex.cjs.map +1 -1
  19. package/dist/agents/codex.d.cts +3 -3
  20. package/dist/agents/codex.d.mts +3 -3
  21. package/dist/agents/codex.d.ts +3 -3
  22. package/dist/agents/deepseek-harness.cjs +50 -2
  23. package/dist/agents/deepseek-harness.cjs.map +1 -1
  24. package/dist/agents/deepseek-harness.d.cts +2 -0
  25. package/dist/agents/deepseek-harness.d.mts +2 -0
  26. package/dist/agents/deepseek-harness.d.ts +2 -0
  27. package/dist/agents/exact-npm-plugins.cjs +28 -0
  28. package/dist/agents/exact-npm-plugins.cjs.map +1 -0
  29. package/dist/agents/exact-npm-plugins.d.cts +10 -0
  30. package/dist/agents/exact-npm-plugins.d.mts +10 -0
  31. package/dist/agents/exact-npm-plugins.d.ts +10 -0
  32. package/dist/agents/exact-npm-plugins.js +8 -0
  33. package/dist/agents/exact-npm-plugins.js.map +1 -0
  34. package/dist/agents/openclaw.cjs +51 -2
  35. package/dist/agents/openclaw.cjs.map +1 -1
  36. package/dist/agents/openclaw.d.cts +2 -0
  37. package/dist/agents/openclaw.d.mts +2 -0
  38. package/dist/agents/openclaw.d.ts +2 -0
  39. package/dist/agents/types.cjs.map +1 -1
  40. package/dist/agents/types.d.cts +2 -2
  41. package/dist/agents/types.d.mts +2 -2
  42. package/dist/agents/types.d.ts +2 -2
  43. package/dist/agents/ui-message-stream.cjs +24 -7
  44. package/dist/agents/ui-message-stream.cjs.map +1 -1
  45. package/dist/analysis/api.cjs +19 -1
  46. package/dist/analysis/api.cjs.map +1 -1
  47. package/dist/analysis/api.d.cts +2 -2
  48. package/dist/analysis/api.d.mts +2 -2
  49. package/dist/analysis/api.d.ts +2 -2
  50. package/dist/analysis/bindings.cjs +11 -18
  51. package/dist/analysis/bindings.cjs.map +1 -1
  52. package/dist/analysis/bindings.d.cts +177 -49
  53. package/dist/analysis/bindings.d.mts +177 -49
  54. package/dist/analysis/bindings.d.ts +177 -49
  55. package/dist/analysis/contracts.cjs +1 -0
  56. package/dist/analysis/contracts.cjs.map +1 -1
  57. package/dist/analysis/contracts.d.cts +43 -3
  58. package/dist/analysis/contracts.d.mts +43 -3
  59. package/dist/analysis/contracts.d.ts +43 -3
  60. package/dist/analysis/cost-projection.cjs +2 -1
  61. package/dist/analysis/cost-projection.cjs.map +1 -1
  62. package/dist/analysis/cost-projection.d.cts +1 -1
  63. package/dist/analysis/cost-projection.d.mts +1 -1
  64. package/dist/analysis/cost-projection.d.ts +1 -1
  65. package/dist/analysis/cost.cjs +13 -3
  66. package/dist/analysis/cost.cjs.map +1 -1
  67. package/dist/analysis/cost.d.cts +10 -3
  68. package/dist/analysis/cost.d.mts +10 -3
  69. package/dist/analysis/cost.d.ts +10 -3
  70. package/dist/analysis/experiment-groups.cjs +96 -0
  71. package/dist/analysis/experiment-groups.cjs.map +1 -0
  72. package/dist/analysis/experiment-groups.d.cts +9 -0
  73. package/dist/analysis/experiment-groups.d.mts +9 -0
  74. package/dist/analysis/experiment-groups.d.ts +9 -0
  75. package/dist/analysis/experiment-groups.js +10 -0
  76. package/dist/analysis/experiment-groups.js.map +1 -0
  77. package/dist/analysis/index.cjs +4 -1
  78. package/dist/analysis/index.cjs.map +1 -1
  79. package/dist/analysis/index.d.cts +4 -2
  80. package/dist/analysis/index.d.mts +4 -2
  81. package/dist/analysis/index.d.ts +4 -2
  82. package/dist/analysis/index.js +40 -36
  83. package/dist/analysis/index.mjs +40 -36
  84. package/dist/assertions/limits.cjs +4 -0
  85. package/dist/assertions/limits.cjs.map +1 -1
  86. package/dist/assertions/limits.d.cts +4 -0
  87. package/dist/assertions/limits.d.mts +4 -0
  88. package/dist/assertions/limits.d.ts +4 -0
  89. package/dist/assertions/match.cjs +63 -25
  90. package/dist/assertions/match.cjs.map +1 -1
  91. package/dist/assertions/match.d.cts +7 -0
  92. package/dist/assertions/match.d.mts +7 -0
  93. package/dist/assertions/match.d.ts +7 -0
  94. package/dist/assertions/record/attachment.cjs +32 -4
  95. package/dist/assertions/record/attachment.cjs.map +1 -1
  96. package/dist/assertions/record/diff.cjs +10 -4
  97. package/dist/assertions/record/diff.cjs.map +1 -1
  98. package/dist/assertions/record/producer.cjs +101 -4
  99. package/dist/assertions/record/producer.cjs.map +1 -1
  100. package/dist/assertions/record/producer.d.cts +4 -1
  101. package/dist/assertions/record/producer.d.mts +4 -1
  102. package/dist/assertions/record/producer.d.ts +4 -1
  103. package/dist/assertions/runtime.cjs +45 -5
  104. package/dist/assertions/runtime.cjs.map +1 -1
  105. package/dist/cli/record.cjs +113 -8
  106. package/dist/cli/record.cjs.map +1 -1
  107. package/dist/cli/record.d.cts +20 -1
  108. package/dist/cli/record.d.mts +20 -1
  109. package/dist/cli/record.d.ts +20 -1
  110. package/dist/cli/record.js +4 -2
  111. package/dist/cli.cjs +386 -31
  112. package/dist/cli.cjs.map +1 -1
  113. package/dist/cli.d.cts +10 -2
  114. package/dist/cli.d.mts +10 -2
  115. package/dist/cli.d.ts +10 -2
  116. package/dist/context/send-retry.cjs +4 -4
  117. package/dist/context/send-retry.cjs.map +1 -1
  118. package/dist/coordination/host/runtime.cjs +8 -30
  119. package/dist/coordination/host/runtime.cjs.map +1 -1
  120. package/dist/coordination/host/runtime.d.cts +3 -3
  121. package/dist/coordination/host/runtime.d.mts +3 -3
  122. package/dist/coordination/host/runtime.d.ts +3 -3
  123. package/dist/coordination/host/types.cjs.map +1 -1
  124. package/dist/coordination/host/types.d.cts +0 -5
  125. package/dist/coordination/host/types.d.mts +0 -5
  126. package/dist/coordination/host/types.d.ts +0 -5
  127. package/dist/coordination/platform/node.cjs +90 -9
  128. package/dist/coordination/platform/node.cjs.map +1 -1
  129. package/dist/define.cjs +25 -1
  130. package/dist/define.cjs.map +1 -1
  131. package/dist/experiment/host/index.cjs +1 -0
  132. package/dist/experiment/host/index.cjs.map +1 -1
  133. package/dist/i18n/en.cjs +19 -6
  134. package/dist/i18n/en.cjs.map +1 -1
  135. package/dist/i18n/en.d.cts +12 -4
  136. package/dist/i18n/en.d.mts +12 -4
  137. package/dist/i18n/en.d.ts +12 -4
  138. package/dist/index.cjs.map +1 -1
  139. package/dist/index.d.cts +1 -1
  140. package/dist/index.d.mts +1 -1
  141. package/dist/index.d.ts +1 -1
  142. package/dist/o11y/prices.json +1 -1
  143. package/dist/o11y/record/families.cjs +12 -3
  144. package/dist/o11y/record/families.cjs.map +1 -1
  145. package/dist/o11y/record/families.d.cts +8 -8
  146. package/dist/o11y/record/families.d.mts +8 -8
  147. package/dist/o11y/record/families.d.ts +8 -8
  148. package/dist/o11y/record/family-projectors.d.cts +66 -18
  149. package/dist/o11y/record/family-projectors.d.mts +66 -18
  150. package/dist/o11y/record/family-projectors.d.ts +66 -18
  151. package/dist/o11y/record/family-writers.d.cts +11 -3
  152. package/dist/o11y/record/family-writers.d.mts +11 -3
  153. package/dist/o11y/record/family-writers.d.ts +11 -3
  154. package/dist/o11y/record/runner-producer.cjs +14 -4
  155. package/dist/o11y/record/runner-producer.cjs.map +1 -1
  156. package/dist/record/codec/core.d.cts +2 -2
  157. package/dist/record/codec/core.d.mts +2 -2
  158. package/dist/record/codec/core.d.ts +2 -2
  159. package/dist/record/family/catalog.d.cts +44 -12
  160. package/dist/record/family/catalog.d.mts +44 -12
  161. package/dist/record/family/catalog.d.ts +44 -12
  162. package/dist/record/family/index.js +128 -124
  163. package/dist/record/family/observability-v1.cjs +35 -0
  164. package/dist/record/family/observability-v1.cjs.map +1 -0
  165. package/dist/record/family/observability-v1.d.cts +3 -0
  166. package/dist/record/family/observability-v1.d.mts +3 -0
  167. package/dist/record/family/observability-v1.d.ts +3 -0
  168. package/dist/record/family/observability-v1.js +6 -0
  169. package/dist/record/family/observability-v1.js.map +1 -0
  170. package/dist/record/family/observability.cjs +58 -9
  171. package/dist/record/family/observability.cjs.map +1 -1
  172. package/dist/record/family/observability.d.cts +1014 -15
  173. package/dist/record/family/observability.d.mts +1014 -15
  174. package/dist/record/family/observability.d.ts +1014 -15
  175. package/dist/record/family/observability.js +22 -18
  176. package/dist/record/host/runtime.cjs +600 -31
  177. package/dist/record/host/runtime.cjs.map +1 -1
  178. package/dist/record/host/types.cjs.map +1 -1
  179. package/dist/record/host/types.d.cts +33 -9
  180. package/dist/record/host/types.d.mts +33 -9
  181. package/dist/record/host/types.d.ts +33 -9
  182. package/dist/record/maintenance/runtime.cjs +1 -2
  183. package/dist/record/maintenance/runtime.cjs.map +1 -1
  184. package/dist/record/model/core.cjs.map +1 -1
  185. package/dist/record/model/core.d.cts +1 -1
  186. package/dist/record/model/core.d.mts +1 -1
  187. package/dist/record/model/core.d.ts +1 -1
  188. package/dist/record/model/definition.d.cts +6 -6
  189. package/dist/record/model/definition.d.mts +6 -6
  190. package/dist/record/model/definition.d.ts +6 -6
  191. package/dist/record/model/identifiers.cjs +1 -1
  192. package/dist/record/model/identifiers.cjs.map +1 -1
  193. package/dist/record/model/identifiers.d.cts +1 -1
  194. package/dist/record/model/identifiers.d.mts +1 -1
  195. package/dist/record/model/identifiers.d.ts +1 -1
  196. package/dist/record/platform/node.cjs +159 -23
  197. package/dist/record/platform/node.cjs.map +1 -1
  198. package/dist/record/platform/services.cjs.map +1 -1
  199. package/dist/record/platform/services.d.cts +15 -2
  200. package/dist/record/platform/services.d.mts +15 -2
  201. package/dist/record/platform/services.d.ts +15 -2
  202. package/dist/record/reader/errors.cjs +37 -1
  203. package/dist/record/reader/errors.cjs.map +1 -1
  204. package/dist/record/reader/errors.d.cts +49 -1
  205. package/dist/record/reader/errors.d.mts +49 -1
  206. package/dist/record/reader/errors.d.ts +49 -1
  207. package/dist/record/reader/errors.js +22 -12
  208. package/dist/record/reader/format.cjs +76 -17
  209. package/dist/record/reader/format.cjs.map +1 -1
  210. package/dist/record/reader/format.d.cts +11 -4
  211. package/dist/record/reader/format.d.mts +11 -4
  212. package/dist/record/reader/format.d.ts +11 -4
  213. package/dist/record/reader/format.js +2 -0
  214. package/dist/record/reader/index.js +32 -18
  215. package/dist/record/reader/runtime.cjs +64 -0
  216. package/dist/record/reader/runtime.cjs.map +1 -1
  217. package/dist/record/reader/runtime.d.cts +15 -0
  218. package/dist/record/reader/runtime.d.mts +15 -0
  219. package/dist/record/reader/runtime.d.ts +15 -0
  220. package/dist/record/reader/runtime.js +2 -0
  221. package/dist/report/assets/styles.css +53 -29
  222. package/dist/report/built-in/analysis-values.cjs +0 -8
  223. package/dist/report/built-in/analysis-values.cjs.map +1 -1
  224. package/dist/report/built-in/analysis-values.d.cts +0 -13
  225. package/dist/report/built-in/analysis-values.d.mts +0 -13
  226. package/dist/report/built-in/analysis-values.d.ts +0 -13
  227. package/dist/report/built-in/analysis-values.js +4 -6
  228. package/dist/report/built-in/index.cjs +1 -3
  229. package/dist/report/built-in/index.cjs.map +1 -1
  230. package/dist/report/built-in/index.d.cts +1 -1
  231. package/dist/report/built-in/index.d.mts +1 -1
  232. package/dist/report/built-in/index.d.ts +1 -1
  233. package/dist/report/built-in/index.js +4 -8
  234. package/dist/report/built-in/index.mjs +4 -8
  235. package/dist/report/built-in/machine.cjs +0 -2
  236. package/dist/report/built-in/machine.cjs.map +1 -1
  237. package/dist/report/built-in/machine.d.cts +0 -2
  238. package/dist/report/built-in/machine.d.mts +0 -2
  239. package/dist/report/built-in/machine.d.ts +0 -2
  240. package/dist/report/built-in/result-components.cjs +25 -73
  241. package/dist/report/built-in/result-components.cjs.map +1 -1
  242. package/dist/report/built-in/result-components.d.cts +3 -19
  243. package/dist/report/built-in/result-components.d.mts +3 -19
  244. package/dist/report/built-in/result-components.d.ts +3 -19
  245. package/dist/report/built-in/result-components.js +0 -4
  246. package/dist/report/built-in/run-membership-overview.cjs +30 -17
  247. package/dist/report/built-in/run-membership-overview.cjs.map +1 -1
  248. package/dist/report/built-in/run-membership-overview.d.cts +14 -0
  249. package/dist/report/built-in/run-membership-overview.d.mts +14 -0
  250. package/dist/report/built-in/run-membership-overview.d.ts +14 -0
  251. package/dist/report/built-in/run-membership-overview.js +4 -2
  252. package/dist/report/built-in/standard.cjs +80 -46
  253. package/dist/report/built-in/standard.cjs.map +1 -1
  254. package/dist/report/built-in/standard.d.cts +19 -42
  255. package/dist/report/built-in/standard.d.mts +19 -42
  256. package/dist/report/built-in/standard.d.ts +19 -42
  257. package/dist/report/built-in/standard.js +6 -6
  258. package/dist/report/components/attempt-detail/compute.cjs +78 -2
  259. package/dist/report/components/attempt-detail/compute.cjs.map +1 -1
  260. package/dist/report/components/attempt-detail/compute.d.cts +1 -1
  261. package/dist/report/components/attempt-detail/compute.d.mts +1 -1
  262. package/dist/report/components/attempt-detail/compute.d.ts +1 -1
  263. package/dist/report/components/attempt-detail/content.cjs +1 -1
  264. package/dist/report/components/attempt-detail/content.cjs.map +1 -1
  265. package/dist/report/components/entity-lists/compute.cjs +2 -2
  266. package/dist/report/components/entity-lists/compute.cjs.map +1 -1
  267. package/dist/report/components/entity-lists/compute.d.cts +2 -2
  268. package/dist/report/components/entity-lists/compute.d.mts +2 -2
  269. package/dist/report/components/entity-lists/compute.d.ts +2 -2
  270. package/dist/report/components/entity-lists/index.cjs +6 -2
  271. package/dist/report/components/entity-lists/index.cjs.map +1 -1
  272. package/dist/report/components/entity-lists/index.d.cts +3 -6
  273. package/dist/report/components/entity-lists/index.d.mts +3 -6
  274. package/dist/report/components/entity-lists/index.d.ts +3 -6
  275. package/dist/report/components/summaries/compute.cjs +8 -1
  276. package/dist/report/components/summaries/compute.cjs.map +1 -1
  277. package/dist/report/components/summaries/compute.d.cts +9 -1
  278. package/dist/report/components/summaries/compute.d.mts +9 -1
  279. package/dist/report/components/summaries/compute.d.ts +9 -1
  280. package/dist/report/components/summaries/index.cjs +48 -4
  281. package/dist/report/components/summaries/index.cjs.map +1 -1
  282. package/dist/report/components/summaries/index.d.cts +7 -4
  283. package/dist/report/components/summaries/index.d.mts +7 -4
  284. package/dist/report/components/summaries/index.d.ts +7 -4
  285. package/dist/report/definition/primitives/chart.cjs +8 -5
  286. package/dist/report/definition/primitives/chart.cjs.map +1 -1
  287. package/dist/report/definition/primitives/points-dataset.cjs +1 -0
  288. package/dist/report/definition/primitives/points-dataset.cjs.map +1 -1
  289. package/dist/report/definition/primitives.cjs +6 -0
  290. package/dist/report/definition/primitives.cjs.map +1 -1
  291. package/dist/report/definition/report.cjs +27 -3
  292. package/dist/report/definition/report.cjs.map +1 -1
  293. package/dist/report/definition/report.d.cts +8 -0
  294. package/dist/report/definition/report.d.mts +8 -0
  295. package/dist/report/definition/report.d.ts +8 -0
  296. package/dist/report/execution/machine.cjs +30 -14
  297. package/dist/report/execution/machine.cjs.map +1 -1
  298. package/dist/report/execution/machine.d.cts +20 -10
  299. package/dist/report/execution/machine.d.mts +20 -10
  300. package/dist/report/execution/machine.d.ts +20 -10
  301. package/dist/report/execution/machine.js +6 -6
  302. package/dist/report/host/execute.cjs +25 -16
  303. package/dist/report/host/execute.cjs.map +1 -1
  304. package/dist/report/host/execute.d.cts +4 -0
  305. package/dist/report/host/execute.d.mts +4 -0
  306. package/dist/report/host/execute.d.ts +4 -0
  307. package/dist/report/host/from-record.cjs +22 -5
  308. package/dist/report/host/from-record.cjs.map +1 -1
  309. package/dist/report/host/machine.cjs +53 -11
  310. package/dist/report/host/machine.cjs.map +1 -1
  311. package/dist/report/host/site-runtime.cjs +9 -8
  312. package/dist/report/host/site-runtime.cjs.map +1 -1
  313. package/dist/report/host/site-runtime.d.cts +1 -1
  314. package/dist/report/host/site-runtime.d.mts +1 -1
  315. package/dist/report/host/site-runtime.d.ts +1 -1
  316. package/dist/report/host/static.cjs +56 -9
  317. package/dist/report/host/static.cjs.map +1 -1
  318. package/dist/report/index.cjs.map +1 -1
  319. package/dist/report/index.d.cts +1 -1
  320. package/dist/report/index.d.mts +1 -1
  321. package/dist/report/index.d.ts +1 -1
  322. package/dist/report/model/dataset.cjs +7 -2
  323. package/dist/report/model/dataset.cjs.map +1 -1
  324. package/dist/report/model/locale.cjs +2 -0
  325. package/dist/report/model/locale.cjs.map +1 -1
  326. package/dist/report/model/locale.d.cts +1 -0
  327. package/dist/report/model/locale.d.mts +1 -0
  328. package/dist/report/model/locale.d.ts +1 -0
  329. package/dist/report/model/metrics.cjs +3 -1
  330. package/dist/report/model/metrics.cjs.map +1 -1
  331. package/dist/report/model/pricing.cjs +16 -11
  332. package/dist/report/model/pricing.cjs.map +1 -1
  333. package/dist/report/react/styles.css +53 -29
  334. package/dist/runner/adoption.cjs +1 -0
  335. package/dist/runner/adoption.cjs.map +1 -1
  336. package/dist/runner/attempt.cjs +44 -5
  337. package/dist/runner/attempt.cjs.map +1 -1
  338. package/dist/runner/attempt.d.cts +13 -1
  339. package/dist/runner/attempt.d.mts +13 -1
  340. package/dist/runner/attempt.d.ts +13 -1
  341. package/dist/runner/config-identity.cjs +10 -2
  342. package/dist/runner/config-identity.cjs.map +1 -1
  343. package/dist/runner/config-identity.d.cts +4 -2
  344. package/dist/runner/config-identity.d.mts +4 -2
  345. package/dist/runner/config-identity.d.ts +4 -2
  346. package/dist/runner/feedback/human.cjs +139 -64
  347. package/dist/runner/feedback/human.cjs.map +1 -1
  348. package/dist/runner/feedback/json.cjs +14 -6
  349. package/dist/runner/feedback/json.cjs.map +1 -1
  350. package/dist/runner/feedback/json.d.cts +3 -2
  351. package/dist/runner/feedback/json.d.mts +3 -2
  352. package/dist/runner/feedback/json.d.ts +3 -2
  353. package/dist/runner/feedback/reducer.cjs +2 -0
  354. package/dist/runner/feedback/reducer.cjs.map +1 -1
  355. package/dist/runner/judge-config.cjs +1 -1
  356. package/dist/runner/judge-config.cjs.map +1 -1
  357. package/dist/runner/ledger.cjs +124 -12
  358. package/dist/runner/ledger.cjs.map +1 -1
  359. package/dist/runner/project-current.cjs +13 -5
  360. package/dist/runner/project-current.cjs.map +1 -1
  361. package/dist/runner/run.cjs +521 -256
  362. package/dist/runner/run.cjs.map +1 -1
  363. package/dist/runner/sandbox-pool.cjs +161 -30
  364. package/dist/runner/sandbox-pool.cjs.map +1 -1
  365. package/dist/runner/sandbox-pool.d.cts +34 -2
  366. package/dist/runner/sandbox-pool.d.mts +34 -2
  367. package/dist/runner/sandbox-pool.d.ts +34 -2
  368. package/dist/runner/shared-state-lease.cjs +803 -0
  369. package/dist/runner/shared-state-lease.cjs.map +1 -0
  370. package/dist/runner/shared-state-lease.d.cts +121 -0
  371. package/dist/runner/shared-state-lease.d.mts +121 -0
  372. package/dist/runner/shared-state-lease.d.ts +121 -0
  373. package/dist/runner/shared-state-lease.js +24 -0
  374. package/dist/runner/shared-state-lease.js.map +1 -0
  375. package/dist/runner/teardown-registry.cjs +97 -34
  376. package/dist/runner/teardown-registry.cjs.map +1 -1
  377. package/dist/runner/teardown-registry.d.cts +27 -1
  378. package/dist/runner/teardown-registry.d.mts +27 -1
  379. package/dist/runner/teardown-registry.d.ts +27 -1
  380. package/dist/runner/teardown-registry.js +20 -16
  381. package/dist/runner/types.cjs.map +1 -1
  382. package/dist/runner/types.d.cts +31 -5
  383. package/dist/runner/types.d.mts +31 -5
  384. package/dist/runner/types.d.ts +31 -5
  385. package/dist/sample/analysis.cjs +249 -459
  386. package/dist/sample/analysis.cjs.map +1 -1
  387. package/dist/sample/capability.cjs +46 -8
  388. package/dist/sample/capability.cjs.map +1 -1
  389. package/dist/sandbox/docker-profile/schema.cjs +283 -534
  390. package/dist/sandbox/docker-profile/schema.cjs.map +1 -1
  391. package/dist/sandbox/docker-profile/schema.d.cts +10 -27
  392. package/dist/sandbox/docker-profile/schema.d.mts +10 -27
  393. package/dist/sandbox/docker-profile/schema.d.ts +10 -27
  394. package/dist/sandbox/e2b-agent-template.cjs +5 -2
  395. package/dist/sandbox/e2b-agent-template.cjs.map +1 -1
  396. package/dist/sandbox/keep-registry.cjs +28 -66
  397. package/dist/sandbox/keep-registry.cjs.map +1 -1
  398. package/dist/sandbox/types.cjs.map +1 -1
  399. package/dist/sandbox/types.d.cts +1 -1
  400. package/dist/sandbox/types.d.mts +1 -1
  401. package/dist/sandbox/types.d.ts +1 -1
  402. package/dist/shared/aggregate.cjs +16 -6
  403. package/dist/shared/aggregate.cjs.map +1 -1
  404. package/dist/shared/aggregate.d.cts +12 -4
  405. package/dist/shared/aggregate.d.mts +12 -4
  406. package/dist/shared/aggregate.d.ts +12 -4
  407. package/dist/shared/turn-label.cjs +20 -2
  408. package/dist/shared/turn-label.cjs.map +1 -1
  409. package/dist/shared/turn-label.d.cts +2 -0
  410. package/dist/shared/turn-label.d.mts +2 -0
  411. package/dist/shared/turn-label.d.ts +2 -0
  412. package/dist/shared/turn-label.js +4 -2
  413. package/dist/vendor/remark/remark-gfm.cjs +7 -7
  414. package/dist/vendor/remark/remark-gfm.cjs.map +1 -1
  415. package/dist/vendor/remark/remark-parse.cjs +12 -12
  416. package/dist/vendor/remark/remark-parse.cjs.map +1 -1
  417. package/dist/vendor/remark/remark.cjs +13 -13
  418. package/dist/vendor/remark/remark.cjs.map +1 -1
  419. package/dist/view/server.cjs +6 -0
  420. package/dist/view/server.cjs.map +1 -1
  421. package/docs-site/zh/examples/ai-agent-application.mdx +1 -1
  422. package/docs-site/zh/examples/coding-agent-extensions.mdx +1 -1
  423. package/docs-site/zh/examples/integrations/ai-sdk-v7.mdx +1 -0
  424. package/docs-site/zh/examples/integrations/langgraph.mdx +1 -1
  425. package/docs-site/zh/explanation/assert.mdx +6 -6
  426. package/docs-site/zh/explanation/drive.mdx +1 -1
  427. package/docs-site/zh/explanation/evals.mdx +9 -9
  428. package/docs-site/zh/explanation/experiment.mdx +2 -2
  429. package/docs-site/zh/explanation/hitl.mdx +3 -3
  430. package/docs-site/zh/explanation/judge.mdx +5 -5
  431. package/docs-site/zh/explanation/overview.mdx +3 -3
  432. package/docs-site/zh/explanation/runner.mdx +1 -1
  433. package/docs-site/zh/index.mdx +3 -3
  434. package/docs-site/zh/reference/builtin-agents.mdx +9 -9
  435. package/docs-site/zh/reference/cli.mdx +18 -12
  436. package/docs-site/zh/reference/define-agent.mdx +130 -5
  437. package/docs-site/zh/reference/define-config.mdx +2 -2
  438. package/docs-site/zh/reference/define-eval.mdx +4 -4
  439. package/docs-site/zh/reference/events.mdx +1 -1
  440. package/docs-site/zh/reference/official-adapters.mdx +5 -5
  441. package/docs-site/zh/troubleshooting/debugging.mdx +1 -1
  442. package/docs-site/zh/troubleshooting/recover-after-kill.mdx +37 -5
  443. package/docs-site/zh/tutorials/accept-results.mdx +72 -0
  444. package/docs-site/zh/tutorials/agent-onboarding.mdx +6 -6
  445. package/docs-site/zh/tutorials/authoring.mdx +9 -13
  446. package/docs-site/zh/tutorials/ci-integration.mdx +6 -6
  447. package/docs-site/zh/tutorials/compare-runs.mdx +61 -0
  448. package/docs-site/zh/tutorials/concurrency.mdx +13 -12
  449. package/docs-site/zh/tutorials/configuration.mdx +4 -6
  450. package/docs-site/zh/tutorials/connect-your-agent.mdx +1 -1
  451. package/docs-site/zh/tutorials/control-run-cost.mdx +58 -0
  452. package/docs-site/zh/tutorials/criteria-files.mdx +2 -2
  453. package/docs-site/zh/tutorials/custom-reports.mdx +2 -2
  454. package/docs-site/zh/tutorials/debug-lifecycle-plan.mdx +46 -0
  455. package/docs-site/zh/tutorials/docker-in-docker.mdx +50 -44
  456. package/docs-site/zh/tutorials/eval-groups.mdx +6 -6
  457. package/docs-site/zh/tutorials/evaluation-kinds.mdx +3 -3
  458. package/docs-site/zh/tutorials/experiments.mdx +2 -3
  459. package/docs-site/zh/tutorials/handle-execution-failures.mdx +18 -10
  460. package/docs-site/zh/tutorials/install-custom-sandbox-agent.mdx +16 -8
  461. package/docs-site/zh/tutorials/plugins.mdx +14 -0
  462. package/docs-site/zh/tutorials/rerun-and-cache.mdx +3 -17
  463. package/docs-site/zh/tutorials/sandbox-agent.mdx +17 -11
  464. package/docs-site/zh/tutorials/sandbox-providers.mdx +17 -13
  465. package/docs-site/zh/tutorials/sandbox-reuse.mdx +12 -19
  466. package/docs-site/zh/tutorials/select-and-preview.mdx +65 -0
  467. package/docs-site/zh/tutorials/verify-judge.mdx +78 -0
  468. package/docs-site/zh/tutorials/viewing-results.mdx +27 -8
  469. package/docs-site/zh/tutorials/write-experiment.mdx +7 -5
  470. package/docs-site/zh/tutorials/write-send.mdx +2 -2
  471. package/package.json +9 -5
  472. package/dist/report/built-in/overview.cjs +0 -45
  473. package/dist/report/built-in/overview.cjs.map +0 -1
  474. package/dist/report/built-in/overview.d.cts +0 -6
  475. package/dist/report/built-in/overview.d.mts +0 -6
  476. package/dist/report/built-in/overview.d.ts +0 -6
  477. package/dist/report/built-in/overview.js +0 -9
  478. package/dist/report/built-in/overview.js.map +0 -1
  479. package/dist/runner/gate-lease.cjs +0 -283
  480. package/dist/runner/gate-lease.cjs.map +0 -1
  481. package/dist/runner/gate-lease.d.cts +0 -62
  482. package/dist/runner/gate-lease.d.mts +0 -62
  483. package/dist/runner/gate-lease.d.ts +0 -62
  484. package/dist/runner/gate-lease.js +0 -22
  485. package/dist/runner/gate-lease.js.map +0 -1
@@ -24,15 +24,15 @@ export interface CodexPluginSpec {
24
24
  name: string;
25
25
  }
26
26
  export interface CodexConfig {
27
- /** 代理 / OpenAI API key。省略时读 CODEX_API_KEY env。 */
27
+ /** 代理 / OpenAI API key。省略时读 OPENAI_API_KEY env。 */
28
28
  apiKey?: string;
29
- /** OpenAI 兼容代理 base URL(如 https://s2a.example.com/v1)。省略时读 CODEX_BASE_URL env。 */
29
+ /** OpenAI 兼容代理 base URL(如 https://s2a.example.com/v1)。省略时读 OPENAI_BASE_URL env。 */
30
30
  baseUrl?: string;
31
31
  /**
32
32
  * 注入每次 Codex CLI 进程的额外环境变量。首轮 `codex exec` 与续轮 `codex exec resume`
33
33
  * 使用同一份声明;Codex 启动的 lifecycle Hook、MCP 动态 header 与命令子进程都会继承。
34
34
  * 值只经 Sandbox command options 传入,不拼进 shell 文本或写入 setup manifest,并全部按
35
- * 潜在敏感值从 timing / execution / error 证据中脱敏。`CODEX_API_KEY` 仍由 `apiKey` 或
35
+ * 潜在敏感值从 timing / execution / error 证据中脱敏。`OPENAI_API_KEY` 仍由 `apiKey` 或
36
36
  * 宿主同名环境变量提供,Adapter 的鉴权值会覆盖这里的同名键。
37
37
  * env value 不进入 carry 身份。会改变被测行为的非敏感值必须同时声明在 Experiment flags
38
38
  * 或所属 Plugin identity;只轮换凭据不会让旧结果失效。
@@ -24,15 +24,15 @@ export interface CodexPluginSpec {
24
24
  name: string;
25
25
  }
26
26
  export interface CodexConfig {
27
- /** 代理 / OpenAI API key。省略时读 CODEX_API_KEY env。 */
27
+ /** 代理 / OpenAI API key。省略时读 OPENAI_API_KEY env。 */
28
28
  apiKey?: string;
29
- /** OpenAI 兼容代理 base URL(如 https://s2a.example.com/v1)。省略时读 CODEX_BASE_URL env。 */
29
+ /** OpenAI 兼容代理 base URL(如 https://s2a.example.com/v1)。省略时读 OPENAI_BASE_URL env。 */
30
30
  baseUrl?: string;
31
31
  /**
32
32
  * 注入每次 Codex CLI 进程的额外环境变量。首轮 `codex exec` 与续轮 `codex exec resume`
33
33
  * 使用同一份声明;Codex 启动的 lifecycle Hook、MCP 动态 header 与命令子进程都会继承。
34
34
  * 值只经 Sandbox command options 传入,不拼进 shell 文本或写入 setup manifest,并全部按
35
- * 潜在敏感值从 timing / execution / error 证据中脱敏。`CODEX_API_KEY` 仍由 `apiKey` 或
35
+ * 潜在敏感值从 timing / execution / error 证据中脱敏。`OPENAI_API_KEY` 仍由 `apiKey` 或
36
36
  * 宿主同名环境变量提供,Adapter 的鉴权值会覆盖这里的同名键。
37
37
  * env value 不进入 carry 身份。会改变被测行为的非敏感值必须同时声明在 Experiment flags
38
38
  * 或所属 Plugin identity;只轮换凭据不会让旧结果失效。
@@ -24,15 +24,15 @@ export interface CodexPluginSpec {
24
24
  name: string;
25
25
  }
26
26
  export interface CodexConfig {
27
- /** 代理 / OpenAI API key。省略时读 CODEX_API_KEY env。 */
27
+ /** 代理 / OpenAI API key。省略时读 OPENAI_API_KEY env。 */
28
28
  apiKey?: string;
29
- /** OpenAI 兼容代理 base URL(如 https://s2a.example.com/v1)。省略时读 CODEX_BASE_URL env。 */
29
+ /** OpenAI 兼容代理 base URL(如 https://s2a.example.com/v1)。省略时读 OPENAI_BASE_URL env。 */
30
30
  baseUrl?: string;
31
31
  /**
32
32
  * 注入每次 Codex CLI 进程的额外环境变量。首轮 `codex exec` 与续轮 `codex exec resume`
33
33
  * 使用同一份声明;Codex 启动的 lifecycle Hook、MCP 动态 header 与命令子进程都会继承。
34
34
  * 值只经 Sandbox command options 传入,不拼进 shell 文本或写入 setup manifest,并全部按
35
- * 潜在敏感值从 timing / execution / error 证据中脱敏。`CODEX_API_KEY` 仍由 `apiKey` 或
35
+ * 潜在敏感值从 timing / execution / error 证据中脱敏。`OPENAI_API_KEY` 仍由 `apiKey` 或
36
36
  * 宿主同名环境变量提供,Adapter 的鉴权值会覆盖这里的同名键。
37
37
  * env value 不进入 carry 身份。会改变被测行为的非敏感值必须同时声明在 Experiment flags
38
38
  * 或所属 Plugin identity;只轮换凭据不会让旧结果失效。
@@ -7,6 +7,9 @@ const util_ts_1 = require("../util.cjs");
7
7
  const send_failures_ts_1 = require("../context/send-failures.cjs");
8
8
  const shared_ts_1 = require("./shared.cjs");
9
9
  const npm_staged_ts_1 = require("./npm-staged.cjs");
10
+ const commands_ts_1 = require("../sandbox/commands.cjs");
11
+ const shell_ts_1 = require("../sandbox/shell.cjs");
12
+ const exact_npm_plugins_ts_1 = require("./exact-npm-plugins.cjs");
10
13
  const coding_cli_versions_ts_1 = require("./coding-cli-versions.cjs");
11
14
  const DSH_EVIDENCE_COVERAGE = {
12
15
  events: { status: "unavailable", reason: "DSH headless mode exposes only the final assistant text." },
@@ -16,6 +19,47 @@ const DSH_EVIDENCE_COVERAGE = {
16
19
  status: { status: "complete" },
17
20
  data: { status: "unavailable", reason: "DSH headless mode does not expose a separate Turn.data value." },
18
21
  };
22
+ const DSH_PNPM_VERSION = "10.17.1";
23
+ function dshPluginLayer(cliVersion, plugins) {
24
+ const identity = {
25
+ agent: "deepseek-harness-plugins",
26
+ version: cliVersion,
27
+ revision: (0, exact_npm_plugins_ts_1.exactNpmPluginRevision)(plugins),
28
+ };
29
+ const expected = JSON.stringify(plugins);
30
+ const verify = `const fs=require("node:fs"),path=require("node:path");` +
31
+ `const expected=${expected},root=process.env.DSH_HOME+"/profiles/headless";` +
32
+ `const profile=JSON.parse(fs.readFileSync(path.join(root,"package.json"),"utf8"));` +
33
+ `const deps=profile.dependencies||{},names=Object.keys(deps);` +
34
+ `if(JSON.stringify(names)!==JSON.stringify(expected.map(x=>x.name)))process.exit(1);` +
35
+ `const bundles=profile.dsh?.profile?.bundles||[];` +
36
+ `const external=bundles.filter(x=>x!=="@deepseek-ai/dsh-base"&&x!=="@deepseek-ai/dsh-headless");` +
37
+ `if(JSON.stringify(external)!==JSON.stringify(expected.map(x=>x.name)))process.exit(1);` +
38
+ `for(const x of expected){if(deps[x.name]!==x.version)process.exit(1);` +
39
+ `const p=JSON.parse(fs.readFileSync(path.join(root,"node_modules",x.name,"package.json"),"utf8"));` +
40
+ `if(p.name!==x.name||p.version!==x.version||!p.dsh?.bundle)process.exit(1);}`;
41
+ const probeScript = `DSH_HOME="$HOME/.niceeval-dsh" node -e ${(0, shell_ts_1.shellQuote)(verify)}`;
42
+ return {
43
+ ensure: { identity, probe: (0, commands_ts_1.shell)(probeScript) },
44
+ installer: {
45
+ identity,
46
+ installMode: "sandbox-network",
47
+ install: async (sandbox, context) => {
48
+ const specs = plugins.map((plugin) => (0, shell_ts_1.shellQuote)(plugin.spec)).join(" ");
49
+ const script = `set -eu
50
+ export DSH_HOME="$HOME/.niceeval-dsh"
51
+ rm -rf "$DSH_HOME/profiles/headless"
52
+ wrapper_dir="$HOME/.niceeval-dsh/.niceeval-bin"
53
+ mkdir -p "$wrapper_dir"
54
+ printf '%s\n' '#!/bin/sh' 'exec corepack pnpm@${DSH_PNPM_VERSION} "$@"' > "$wrapper_dir/pnpm"
55
+ chmod +x "$wrapper_dir/pnpm"
56
+ PATH="$wrapper_dir:$PATH" dsh plugin --profile headless add ${specs}
57
+ DSH_HOME="$DSH_HOME" dsh --profile headless --dump-config >/dev/null`;
58
+ await sandbox.runShellOrThrow(script, { signal: context.signal });
59
+ },
60
+ },
61
+ };
62
+ }
19
63
  function resolveApiKey(config) {
20
64
  return config?.apiKey ?? (0, util_ts_1.getEnv)("DSH_API_KEY") ?? (0, util_ts_1.requireEnv)("DEEPSEEK_API_KEY");
21
65
  }
@@ -25,6 +69,7 @@ function resolveBaseUrl(config) {
25
69
  /** DeepSeek Harness sandbox adapter backed by its one-shot headless profile. */
26
70
  function deepSeekHarnessAgent(config) {
27
71
  const version = config?.version ?? coding_cli_versions_ts_1.DEFAULT_DEEPSEEK_HARNESS_CLI_VERSION;
72
+ const plugins = (0, exact_npm_plugins_ts_1.normalizeExactNpmPlugins)(config?.plugins, "deepSeekHarnessAgent plugins");
28
73
  const install = (0, npm_staged_ts_1.createNpmCliInstaller)({
29
74
  identity: {
30
75
  agent: "deepseek-harness",
@@ -35,11 +80,14 @@ function deepSeekHarnessAgent(config) {
35
80
  bin: "dsh",
36
81
  });
37
82
  const homes = new Map();
83
+ const pluginLayer = plugins.length === 0 ? undefined : dshPluginLayer(version, plugins);
38
84
  return (0, define_ts_1.defineSandboxAgent)({
39
85
  name: "deepseek-harness",
40
86
  evidenceCoverage: DSH_EVIDENCE_COVERAGE,
41
- ensure: install.ensure,
42
- installers: [install.installer],
87
+ ensure: pluginLayer === undefined ? install.ensure : [install.ensure, pluginLayer.ensure],
88
+ installers: pluginLayer === undefined
89
+ ? [install.installer]
90
+ : [install.installer, pluginLayer.installer],
43
91
  async setup(sb, ctx) {
44
92
  const homeResult = await sb.runShell('test -n "$HOME" && printf "%s" "$HOME"');
45
93
  const home = homeResult.stdout.trim();
@@ -1 +1 @@
1
- {"version":3,"file":"deepseek-harness.js","sourceRoot":"","sources":["deepseek-harness.ts"],"names":[],"mappings":"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","sourcesContent":["import { Effect } from \"effect\";\nimport { defineSandboxAgent } 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 { 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}\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 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 return defineSandboxAgent({\n name: \"deepseek-harness\",\n evidenceCoverage: DSH_EVIDENCE_COVERAGE,\n ensure: install.ensure,\n installers: [install.installer],\n async setup(sb, ctx) {\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 send: (input, ctx) => Effect.runPromise(Effect.scoped(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 })), { signal: ctx.signal }),\n });\n}\nexport default deepSeekHarnessAgent;\n"]}
1
+ {"version":3,"file":"deepseek-harness.js","sourceRoot":"","sources":["deepseek-harness.ts"],"names":[],"mappings":"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","sourcesContent":["import { Effect } from \"effect\";\nimport { defineSandboxAgent } 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 defineSandboxAgent({\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 async setup(sb, ctx) {\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 send: (input, ctx) => Effect.runPromise(Effect.scoped(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 })), { signal: ctx.signal }),\n });\n}\nexport default deepSeekHarnessAgent;\n"]}
@@ -6,6 +6,8 @@ export interface DeepSeekHarnessConfig {
6
6
  baseUrl?: string;
7
7
  /** Exact npm version of `@deepseek-ai/dsh`. */
8
8
  version?: string;
9
+ /** Native DSH bundles as exact npm package@version declarations. */
10
+ plugins?: readonly string[];
9
11
  }
10
12
  /** DeepSeek Harness sandbox adapter backed by its one-shot headless profile. */
11
13
  export declare function deepSeekHarnessAgent(config?: DeepSeekHarnessConfig): Agent;
@@ -6,6 +6,8 @@ export interface DeepSeekHarnessConfig {
6
6
  baseUrl?: string;
7
7
  /** Exact npm version of `@deepseek-ai/dsh`. */
8
8
  version?: string;
9
+ /** Native DSH bundles as exact npm package@version declarations. */
10
+ plugins?: readonly string[];
9
11
  }
10
12
  /** DeepSeek Harness sandbox adapter backed by its one-shot headless profile. */
11
13
  export declare function deepSeekHarnessAgent(config?: DeepSeekHarnessConfig): Agent;
@@ -6,6 +6,8 @@ export interface DeepSeekHarnessConfig {
6
6
  baseUrl?: string;
7
7
  /** Exact npm version of `@deepseek-ai/dsh`. */
8
8
  version?: string;
9
+ /** Native DSH bundles as exact npm package@version declarations. */
10
+ plugins?: readonly string[];
9
11
  }
10
12
  /** DeepSeek Harness sandbox adapter backed by its one-shot headless profile. */
11
13
  export declare function deepSeekHarnessAgent(config?: DeepSeekHarnessConfig): Agent;
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.normalizeExactNpmPlugins = normalizeExactNpmPlugins;
4
+ exports.exactNpmPluginRevision = exactNpmPluginRevision;
5
+ const PACKAGE = String.raw `(?:@[a-z0-9][a-z0-9._-]*/)?[a-z0-9][a-z0-9._-]*`;
6
+ const VERSION = String.raw `\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?`;
7
+ const EXACT_NPM_SPEC = new RegExp(`^(${PACKAGE})@(${VERSION})$`);
8
+ /** Keep declaration order, but reject tags/ranges/duplicates before a Sandbox is created. */
9
+ function normalizeExactNpmPlugins(input, label) {
10
+ const seen = new Set();
11
+ return Object.freeze((input ?? []).map((raw, index) => {
12
+ const spec = raw.trim();
13
+ const match = EXACT_NPM_SPEC.exec(spec);
14
+ if (match === null) {
15
+ throw new TypeError(`${label}[${index}] must be an exact npm package@version (tags and ranges are not accepted).`);
16
+ }
17
+ const [, name, version] = match;
18
+ if (seen.has(name))
19
+ throw new TypeError(`${label} contains duplicate package ${name}.`);
20
+ seen.add(name);
21
+ return Object.freeze({ name, version, spec });
22
+ }));
23
+ }
24
+ /** Readable identity: the normalized declaration itself is persisted in agentInstalls/config identity. */
25
+ function exactNpmPluginRevision(plugins) {
26
+ return `exact-npm-v1:${plugins.map((plugin) => plugin.spec).join(",")}`;
27
+ }
28
+ //# sourceMappingURL=exact-npm-plugins.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exact-npm-plugins.js","sourceRoot":"","sources":["exact-npm-plugins.ts"],"names":[],"mappings":";;AAUA,4DAcC;AAED,wDAEC;AAtBD,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,iDAAiD,CAAC;AAC7E,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,wDAAwD,CAAC;AACpF,MAAM,cAAc,GAAG,IAAI,MAAM,CAAC,KAAK,OAAO,MAAM,OAAO,IAAI,CAAC,CAAC;AACjE,6FAA6F;AAC7F,SAAgB,wBAAwB,CAAC,KAAoC,EAAE,KAAa;IACxF,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;QAClD,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;QACxB,MAAM,KAAK,GAAG,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxC,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACjB,MAAM,IAAI,SAAS,CAAC,GAAG,KAAK,IAAI,KAAK,4EAA4E,CAAC,CAAC;QACvH,CAAC;QACD,MAAM,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,GAAG,KAAK,CAAC;QAChC,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;YACd,MAAM,IAAI,SAAS,CAAC,GAAG,KAAK,+BAA+B,IAAI,GAAG,CAAC,CAAC;QACxE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACf,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC,CAAC;AACR,CAAC;AACD,0GAA0G;AAC1G,SAAgB,sBAAsB,CAAC,OAAkC;IACrE,OAAO,gBAAgB,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;AAC5E,CAAC","sourcesContent":["/** A provider-owned native plugin pinned to one immutable npm version. */\nexport interface ExactNpmPlugin {\n readonly name: string;\n readonly version: string;\n readonly spec: string;\n}\nconst PACKAGE = String.raw `(?:@[a-z0-9][a-z0-9._-]*/)?[a-z0-9][a-z0-9._-]*`;\nconst VERSION = String.raw `\\d+\\.\\d+\\.\\d+(?:-[0-9A-Za-z.-]+)?(?:\\+[0-9A-Za-z.-]+)?`;\nconst EXACT_NPM_SPEC = new RegExp(`^(${PACKAGE})@(${VERSION})$`);\n/** Keep declaration order, but reject tags/ranges/duplicates before a Sandbox is created. */\nexport function normalizeExactNpmPlugins(input: readonly string[] | undefined, label: string): readonly ExactNpmPlugin[] {\n const seen = new Set<string>();\n return Object.freeze((input ?? []).map((raw, index) => {\n const spec = raw.trim();\n const match = EXACT_NPM_SPEC.exec(spec);\n if (match === null) {\n throw new TypeError(`${label}[${index}] must be an exact npm package@version (tags and ranges are not accepted).`);\n }\n const [, name, version] = match;\n if (seen.has(name))\n throw new TypeError(`${label} contains duplicate package ${name}.`);\n seen.add(name);\n return Object.freeze({ name, version, spec });\n }));\n}\n/** Readable identity: the normalized declaration itself is persisted in agentInstalls/config identity. */\nexport function exactNpmPluginRevision(plugins: readonly ExactNpmPlugin[]): string {\n return `exact-npm-v1:${plugins.map((plugin) => plugin.spec).join(\",\")}`;\n}\n"]}
@@ -0,0 +1,10 @@
1
+ /** A provider-owned native plugin pinned to one immutable npm version. */
2
+ export interface ExactNpmPlugin {
3
+ readonly name: string;
4
+ readonly version: string;
5
+ readonly spec: string;
6
+ }
7
+ /** Keep declaration order, but reject tags/ranges/duplicates before a Sandbox is created. */
8
+ export declare function normalizeExactNpmPlugins(input: readonly string[] | undefined, label: string): readonly ExactNpmPlugin[];
9
+ /** Readable identity: the normalized declaration itself is persisted in agentInstalls/config identity. */
10
+ export declare function exactNpmPluginRevision(plugins: readonly ExactNpmPlugin[]): string;
@@ -0,0 +1,10 @@
1
+ /** A provider-owned native plugin pinned to one immutable npm version. */
2
+ export interface ExactNpmPlugin {
3
+ readonly name: string;
4
+ readonly version: string;
5
+ readonly spec: string;
6
+ }
7
+ /** Keep declaration order, but reject tags/ranges/duplicates before a Sandbox is created. */
8
+ export declare function normalizeExactNpmPlugins(input: readonly string[] | undefined, label: string): readonly ExactNpmPlugin[];
9
+ /** Readable identity: the normalized declaration itself is persisted in agentInstalls/config identity. */
10
+ export declare function exactNpmPluginRevision(plugins: readonly ExactNpmPlugin[]): string;
@@ -0,0 +1,10 @@
1
+ /** A provider-owned native plugin pinned to one immutable npm version. */
2
+ export interface ExactNpmPlugin {
3
+ readonly name: string;
4
+ readonly version: string;
5
+ readonly spec: string;
6
+ }
7
+ /** Keep declaration order, but reject tags/ranges/duplicates before a Sandbox is created. */
8
+ export declare function normalizeExactNpmPlugins(input: readonly string[] | undefined, label: string): readonly ExactNpmPlugin[];
9
+ /** Readable identity: the normalized declaration itself is persisted in agentInstalls/config identity. */
10
+ export declare function exactNpmPluginRevision(plugins: readonly ExactNpmPlugin[]): string;
@@ -0,0 +1,8 @@
1
+ import { createRequire as __niceevalCreateRequire } from "node:module";
2
+ const __niceevalRequire = __niceevalCreateRequire(import.meta.url);
3
+ const __niceevalCanonical = __niceevalRequire("./exact-npm-plugins.cjs");
4
+ const __niceevalExport0 = __niceevalCanonical["exactNpmPluginRevision"];
5
+ export { __niceevalExport0 as exactNpmPluginRevision };
6
+ const __niceevalExport1 = __niceevalCanonical["normalizeExactNpmPlugins"];
7
+ export { __niceevalExport1 as normalizeExactNpmPlugins };
8
+ //# sourceMappingURL=exact-npm-plugins.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exact-npm-plugins.js","sources":[],"names":[],"mappings":""}
@@ -14,6 +14,9 @@ const coding_cli_versions_ts_1 = require("./coding-cli-versions.cjs");
14
14
  const npm_staged_ts_1 = require("./npm-staged.cjs");
15
15
  const node_crypto_1 = require("node:crypto");
16
16
  const send_failures_ts_1 = require("../context/send-failures.cjs");
17
+ const commands_ts_1 = require("../sandbox/commands.cjs");
18
+ const shell_ts_1 = require("../sandbox/shell.cjs");
19
+ const exact_npm_plugins_ts_1 = require("./exact-npm-plugins.cjs");
17
20
  // ───────────────────────────────────────────────────────────────────────────
18
21
  // OpenClaw 的 agent adapter(沙箱型)。
19
22
  //
@@ -29,6 +32,40 @@ const send_failures_ts_1 = require("../context/send-failures.cjs");
29
32
  const SKILL_DIR = ".agents/skills";
30
33
  /** 自定义 OpenAI 兼容网关在 openclaw.json 里的 provider id。 */
31
34
  const COMPAT_PROVIDER = "compat";
35
+ function openClawPluginLayer(cliVersion, plugins) {
36
+ const identity = {
37
+ agent: "openclaw-plugins",
38
+ version: cliVersion,
39
+ revision: (0, exact_npm_plugins_ts_1.exactNpmPluginRevision)(plugins),
40
+ };
41
+ const verifyFiles = `const fs=require("node:fs"),path=require("node:path");` +
42
+ `const expected=${JSON.stringify(plugins)},base=path.join(process.env.HOME,".openclaw");` +
43
+ `const projects=path.join(base,"npm/projects"),found=[];` +
44
+ `for(const dir of fs.readdirSync(projects)){const root=path.join(projects,dir),p=JSON.parse(fs.readFileSync(path.join(root,"package.json"),"utf8"));` +
45
+ `for(const [name,version] of Object.entries(p.dependencies||{})){const pkg=JSON.parse(fs.readFileSync(path.join(root,"node_modules",name,"package.json"),"utf8"));` +
46
+ `const manifest=JSON.parse(fs.readFileSync(path.join(root,"node_modules",name,"openclaw.plugin.json"),"utf8"));found.push({name,version,pkgVersion:pkg.version,id:manifest.id});}}` +
47
+ `if(found.length!==expected.length)process.exit(1);` +
48
+ `const config=JSON.parse(fs.readFileSync(path.join(base,"openclaw.json"),"utf8"));` +
49
+ `const ordered=expected.map(e=>found.find(x=>x.name===e.name&&x.version===e.version));` +
50
+ `for(const x of ordered){if(!x||x.pkgVersion!==x.version||!config.plugins?.entries?.[x.id]?.enabled||!/^[A-Za-z0-9._-]+$/.test(x.id))process.exit(1);}`;
51
+ return {
52
+ ensure: { identity, probe: (0, commands_ts_1.shell)(`node -e ${(0, shell_ts_1.shellQuote)(verifyFiles)}`) },
53
+ installer: {
54
+ identity,
55
+ installMode: "sandbox-network",
56
+ install: async (sandbox, context) => {
57
+ const installs = plugins
58
+ .map((plugin) => `openclaw plugins install --pin ${(0, shell_ts_1.shellQuote)(plugin.spec)}`)
59
+ .join("\n");
60
+ const script = `set -eu
61
+ ids=$(openclaw plugins list --json | node -e ${(0, shell_ts_1.shellQuote)(`let s="";process.stdin.on("data",c=>s+=c).on("end",()=>{const x=JSON.parse(s);for(const p of x.plugins||[])if(p.origin==="global")console.log(p.id)})`)})
62
+ for id in $ids; do openclaw plugins uninstall --force "$id"; done
63
+ ${installs}`;
64
+ await sandbox.runShellOrThrow(script, { signal: context.signal });
65
+ },
66
+ },
67
+ };
68
+ }
32
69
  function resolveApiKey(config) {
33
70
  return config?.apiKey ?? (0, util_ts_1.getEnv)("OPENCLAW_API_KEY") ?? (0, util_ts_1.requireEnv)("ANTHROPIC_API_KEY");
34
71
  }
@@ -54,6 +91,7 @@ function resolveModelFlag(model, hasCompatBase) {
54
91
  */
55
92
  function openClawAgent(config) {
56
93
  const version = config?.version ?? coding_cli_versions_ts_1.DEFAULT_OPENCLAW_CLI_VERSION;
94
+ const plugins = (0, exact_npm_plugins_ts_1.normalizeExactNpmPlugins)(config?.plugins, "openClawAgent plugins");
57
95
  const { ensure, installer } = (0, npm_staged_ts_1.createNpmCliInstaller)({
58
96
  identity: {
59
97
  agent: "openclaw",
@@ -63,6 +101,7 @@ function openClawAgent(config) {
63
101
  packageName: "openclaw",
64
102
  bin: "openclaw",
65
103
  });
104
+ const pluginLayer = plugins.length === 0 ? undefined : openClawPluginLayer(version, plugins);
66
105
  return (0, define_ts_1.defineSandboxAgent)({
67
106
  name: "openclaw",
68
107
  // e2e 已用真实 CLI 证明 session transcript 能给出工具轨 / 消息 / 用量;
@@ -71,8 +110,8 @@ function openClawAgent(config) {
71
110
  // OpenClaw 没有专属 span 方言 mapper:原生 span 走 canonical 通用 heuristic。
72
111
  // OTel 内容采集关闭时只影响 trace 证据面;行为轨(下面的 transcript 解析)不受影响。
73
112
  spanMapper: canonical_ts_1.mapGenericSpans,
74
- ensure,
75
- installers: [installer],
113
+ ensure: pluginLayer === undefined ? ensure : [ensure, pluginLayer.ensure],
114
+ installers: pluginLayer === undefined ? [installer] : [installer, pluginLayer.installer],
76
115
  tracing: {
77
116
  protocol: "http/protobuf",
78
117
  env: (endpoint) => ({
@@ -88,7 +127,17 @@ function openClawAgent(config) {
88
127
  // OpenAI 兼容网关走自定义 provider + openai-completions;
89
128
  // skipBootstrap 跳过首轮身份仪式,否则 agent 会先问 "Who am I"。
90
129
  // workspace 钉沙箱工作目录,文件工具写到 eval 可见的路径。
130
+ let persistentConfig = {};
131
+ try {
132
+ const existing = await sb.runShell('cat "$HOME/.openclaw/openclaw.json"');
133
+ if (existing.exitCode === 0)
134
+ persistentConfig = JSON.parse(existing.stdout);
135
+ }
136
+ catch {
137
+ persistentConfig = {};
138
+ }
91
139
  const openclawConfig = {
140
+ ...persistentConfig,
92
141
  agents: {
93
142
  defaults: {
94
143
  skipBootstrap: true,
@@ -1 +1 @@
1
- {"version":3,"file":"openclaw.js","sourceRoot":"","sources":["openclaw.ts"],"names":[],"mappings":"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","sourcesContent":["import { defineSandboxAgent } from \"../define.ts\";\nimport { Effect } from \"effect\";\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 { parseOpenClawTranscript, parseOpenClawRunJson } from \"../o11y/parsers/openclaw.ts\";\nimport { completeEvidenceCoverage } from \"../assertions/coverage.ts\";\nimport { DEFAULT_OPENCLAW_CLI_VERSION, AGENT_BASELINE_RECIPE_REVISION } from \"./coding-cli-versions.ts\";\nimport { createNpmCliInstaller, resolveAgentBinEffect } from \"./npm-staged.ts\";\nimport { randomUUID } from \"node:crypto\";\nimport type { Agent, AgentSetupManifest, SkillSpec, StreamEvent, TurnEvidenceCoverage } from \"../types.ts\";\nimport { makeSendFailure, sendAcceptanceFromEvents } from \"../context/send-failures.ts\";\n// ───────────────────────────────────────────────────────────────────────────\n// OpenClaw 的 agent adapter(沙箱型)。\n//\n// 连接方式:在沙箱里 spawn `openclaw agent --local --json`(嵌入式 agent 循环,不依赖\n// 长驻 gateway),读回结果封包 + session transcript → 标准事件流。方言解析全部住\n// src/o11y/parsers/openclaw.ts,不进 core(契约见 docs/feature/adapters/sdk/openclaw/README.md)。\n//\n// 行为轨优先级(collection.md):session transcript(完整工具轨迹)优先;transcript 拿不到\n// 时只保留 `--json` 封包的最终回复,不从最终文本猜工具行为——此时负断言不可信,send 会\n// 经 ctx.log 明确记录这个限制。\n// ───────────────────────────────────────────────────────────────────────────\n/** OpenClaw 的 skill 目录(`skills` 生态的「通用」目录);发现靠 AGENTS.md 指引,不依赖原生扫描。 */\nconst SKILL_DIR = \".agents/skills\";\n/** 自定义 OpenAI 兼容网关在 openclaw.json 里的 provider id。 */\nconst COMPAT_PROVIDER = \"compat\";\nexport interface OpenClawConfig {\n /** 模型 API key。省略时读 OPENCLAW_API_KEY,再回落 ANTHROPIC_API_KEY。 */\n apiKey?: string;\n /** OpenAI 兼容端点。省略时读 OPENCLAW_BASE_URL。 */\n baseUrl?: string;\n /** 固定安装的 openclaw npm 版本(如 \"1.2.3\");省略时用内置默认。 */\n version?: string;\n /**\n * 装进沙箱的 Skill(本地目录/文件,或 repo + 可钉 ref + 可选启用集)。\n * 落在 `.agents/skills/<name>/`,并写一段发现指引进 AGENTS.md。\n */\n skills?: SkillSpec[];\n}\nfunction resolveApiKey(config?: OpenClawConfig): string {\n return config?.apiKey ?? getEnv(\"OPENCLAW_API_KEY\") ?? requireEnv(\"ANTHROPIC_API_KEY\");\n}\nfunction resolveBaseUrl(config?: OpenClawConfig): string | undefined {\n return config?.baseUrl ?? getEnv(\"OPENCLAW_BASE_URL\");\n}\n/** experiment.model → `--model`。裸模型名在自定义网关下补成 `compat/<model>`。 */\nfunction resolveModelFlag(model: string | undefined, hasCompatBase: boolean): string | undefined {\n if (!model)\n return undefined;\n if (model.includes(\"/\"))\n return model;\n return hasCompatBase ? `${COMPAT_PROVIDER}/${model}` : model;\n}\n/**\n * OpenClaw 的内置 sandbox Agent 工厂。复用 `defineSandboxAgent`、`shared` 安装工具、\n * `ctx.session` 存取器与 canonical OTel 通用 mapper(`mapGenericSpans`);OpenClaw 方言\n * (transcript / `agent --json` 字段)只住 `src/o11y/parsers/openclaw.ts`,不进 core。\n *\n * 会话契约:首轮显式发一个全新 session id 并 `ctx.session.capture()`(不依赖 OpenClaw 的\n * 默认主会话——否则相邻 attempt 会静默共享历史),后续轮用 `ctx.session.id` resume;\n * `t.newSession()` 后的新会话线自然拿到新 id,session 之间互相隔离。\n */\nexport function openClawAgent(config?: OpenClawConfig): Agent {\n const version = config?.version ?? DEFAULT_OPENCLAW_CLI_VERSION;\n const { ensure, installer } = createNpmCliInstaller({\n identity: {\n agent: \"openclaw\",\n version,\n revision: String(AGENT_BASELINE_RECIPE_REVISION.openclaw),\n },\n packageName: \"openclaw\",\n bin: \"openclaw\",\n });\n return defineSandboxAgent({\n name: \"openclaw\",\n // e2e 已用真实 CLI 证明 session transcript 能给出工具轨 / 消息 / 用量;\n // 采集失败的单轮仍会在 send 里把 coverage 降成 unavailable/partial。\n evidenceCoverage: completeEvidenceCoverage,\n // OpenClaw 没有专属 span 方言 mapper:原生 span 走 canonical 通用 heuristic。\n // OTel 内容采集关闭时只影响 trace 证据面;行为轨(下面的 transcript 解析)不受影响。\n spanMapper: mapGenericSpans,\n ensure,\n installers: [installer],\n tracing: {\n protocol: \"http/protobuf\",\n env: (endpoint) => ({\n OTEL_TRACES_EXPORTER: \"otlp\",\n OTEL_EXPORTER_OTLP_TRACES_ENDPOINT: endpoint,\n OTEL_EXPORTER_OTLP_TRACES_PROTOCOL: \"http/protobuf\",\n }),\n },\n async setup(sb, ctx) {\n const baseUrl = resolveBaseUrl(config);\n if (baseUrl) {\n const apiKey = resolveApiKey(config);\n // OpenAI 兼容网关走自定义 provider + openai-completions;\n // skipBootstrap 跳过首轮身份仪式,否则 agent 会先问 \"Who am I\"。\n // workspace 钉沙箱工作目录,文件工具写到 eval 可见的路径。\n const openclawConfig = {\n agents: {\n defaults: {\n skipBootstrap: true,\n workspace: sb.workdir,\n },\n },\n models: {\n mode: \"merge\",\n providers: {\n [COMPAT_PROVIDER]: {\n baseUrl,\n apiKey,\n api: \"openai-completions\",\n models: [\n { id: \"gpt-5.6-luna\", name: \"gpt-5.6-luna\" },\n { id: \"gpt-5.4-mini\", name: \"gpt-5.4-mini\" },\n { id: \"gpt-5.4\", name: \"gpt-5.4\" },\n ],\n },\n },\n },\n };\n await shared.writeFile(sb, \"~/.openclaw/openclaw.json\", JSON.stringify(openclawConfig, null, 2), { sensitiveValues: [apiKey] });\n // 预置最小身份文件,避免缺 IDENTITY 时仍触发仪式文案。\n await shared.writeFile(sb, `${sb.workdir}/IDENTITY.md`, \"# Identity\\n\\nName: niceeval\\nEmoji: ✓\\n\");\n await shared.writeFile(sb, `${sb.workdir}/USER.md`, \"# User\\n\\nEval harness operator.\\n\");\n await shared.writeFile(sb, `${sb.workdir}/SOUL.md`, \"# Soul\\n\\nExecute the user's task directly. Do not ask who you are.\\n\");\n }\n const manifest: AgentSetupManifest = { skills: [] };\n if (config?.skills?.length) {\n manifest.skills = await installSkills(sb, config.skills, { dir: SKILL_DIR });\n // 发现指引跟着一起写:不提示 = 白装。\n await appendProjectInstruction(sb, skillDiscoveryInstruction(SKILL_DIR, installedSkillNames(manifest.skills)));\n }\n if (manifest.skills.length) {\n ctx.reportSetup(manifest);\n }\n },\n send: (input, ctx) => Effect.runPromise(Effect.scoped(Effect.gen(function* () {\n const sb = ctx.sandbox;\n const openclawBin = yield* resolveAgentBinEffect(sb, \"openclaw\");\n return yield* Effect.tryPromise({\n try: async (signal) => {\n // 会话契约:新会话线显式发新 session id(隔离);后续轮 resume 记录的 id。\n const sessionId = ctx.session.id ?? `niceeval-${sb.sandboxId}-${randomUUID().slice(0, 8)}`;\n ctx.session.capture(sessionId);\n const baseUrl = resolveBaseUrl(config);\n const args = [\"agent\", \"--local\", \"--session-id\", sessionId, \"--message\", input.text, \"--json\"];\n const model = resolveModelFlag(ctx.model, Boolean(baseUrl));\n if (model)\n args.push(\"--model\", model);\n const apiKey = resolveApiKey(config);\n const env: globalThis.Record<string, string> = {\n OPENCLAW_API_KEY: apiKey,\n ANTHROPIC_API_KEY: apiKey,\n OPENAI_API_KEY: apiKey,\n ...ctx.telemetry?.env,\n };\n if (baseUrl) {\n env.OPENCLAW_BASE_URL = baseUrl;\n env.OPENAI_BASE_URL = baseUrl;\n }\n const res = await sb.runCommand(openclawBin, args, {\n env,\n sensitiveValues: [apiKey],\n stream: true,\n signal,\n });\n const runJson = parseOpenClawRunJson(res.stdout);\n // 封包若带回服务端分配的 session key,后续轮以它为准(capture first-writer-wins,\n // 首轮已用自发 id 落地时不覆盖)。\n ctx.session.capture(runJson.sessionId);\n // 完整工具轨迹的唯一来源:session transcript。\n // 优先读封包给出的 sessionFile(精确);否则在 agents 目录取最新 *.jsonl,\n // 但排除同目录旁路产物 *.trajectory.jsonl(mtime 常更新、却不是消息轨——\n // 误读会导致 events 为空、整轮 coverage 降成 unavailable)。\n let raw: string | undefined;\n if (runJson.sessionFile) {\n try {\n raw = await sb.readText(runJson.sessionFile);\n }\n catch {\n raw = undefined;\n }\n }\n if (raw === undefined) {\n raw = await shared.captureLatestJsonl(sb, \"~/.openclaw/agents\", {\n excludeName: /\\.trajectory\\.jsonl$/i,\n });\n }\n const parsed = parseOpenClawTranscript(raw);\n const events: StreamEvent[] = [...parsed.events];\n // transcript 缺失 / 有解析不了的行:这一轮的工具轨迹不可信,coverage 降级说出来\n // (负断言由此落 unavailable,而不是在空流上假通过),不从最终文本猜工具行为。\n let turnEvidenceCoverage: TurnEvidenceCoverage | undefined;\n if (raw === undefined || parsed.events.length === 0) {\n const reason = \"session transcript unavailable; only the --json final reply was collected\";\n turnEvidenceCoverage = {\n events: { status: \"unavailable\", reason },\n actions: { status: \"unavailable\", reason },\n usage: { status: \"unavailable\", reason },\n };\n ctx.log(\"openclaw transcript unavailable: tool trajectory missing for this turn, negative assertions are unreliable\");\n if (runJson.text)\n events.push({ type: \"message\", role: \"assistant\", text: runJson.text });\n }\n else if (!parsed.parseSuccess) {\n const reason = \"some 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 // 用量:transcript 逐消息累加优先;transcript 没报时用封包摘要,都没有就是空对象。\n const usage = (parsed.usage.inputTokens ?? 0) > 0 || (parsed.usage.outputTokens ?? 0) > 0\n ? parsed.usage\n : (runJson.usage ?? parsed.usage);\n if (res.exitCode !== 0) {\n throw makeSendFailure({\n acceptance: sendAcceptanceFromEvents(events),\n message: shared.diagnoseFailure(res, parsed.events, raw),\n events,\n usage,\n process: res,\n });\n }\n if (runJson.failed)\n events.push({ type: \"error\", message: shared.diagnoseFailure(res, parsed.events, raw) });\n return {\n events,\n usage,\n status: runJson.failed ? \"failed\" as const : \"completed\" as const,\n ...(turnEvidenceCoverage ? { evidenceCoverage: turnEvidenceCoverage } : {}),\n };\n },\n catch: (cause) => cause,\n });\n })), { signal: ctx.signal }),\n });\n}\nexport default openClawAgent();\n"]}
1
+ {"version":3,"file":"openclaw.js","sourceRoot":"","sources":["openclaw.ts"],"names":[],"mappings":"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","sourcesContent":["import { defineSandboxAgent } from \"../define.ts\";\nimport { Effect } from \"effect\";\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 { parseOpenClawTranscript, parseOpenClawRunJson } from \"../o11y/parsers/openclaw.ts\";\nimport { completeEvidenceCoverage } from \"../assertions/coverage.ts\";\nimport { DEFAULT_OPENCLAW_CLI_VERSION, AGENT_BASELINE_RECIPE_REVISION } from \"./coding-cli-versions.ts\";\nimport { createNpmCliInstaller, resolveAgentBinEffect } from \"./npm-staged.ts\";\nimport { randomUUID } from \"node:crypto\";\nimport type { Agent, AgentSetupManifest, SkillSpec, StreamEvent, TurnEvidenceCoverage } from \"../types.ts\";\nimport { makeSendFailure, sendAcceptanceFromEvents } from \"../context/send-failures.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\";\n// ───────────────────────────────────────────────────────────────────────────\n// OpenClaw 的 agent adapter(沙箱型)。\n//\n// 连接方式:在沙箱里 spawn `openclaw agent --local --json`(嵌入式 agent 循环,不依赖\n// 长驻 gateway),读回结果封包 + session transcript → 标准事件流。方言解析全部住\n// src/o11y/parsers/openclaw.ts,不进 core(契约见 docs/feature/adapters/sdk/openclaw/README.md)。\n//\n// 行为轨优先级(collection.md):session transcript(完整工具轨迹)优先;transcript 拿不到\n// 时只保留 `--json` 封包的最终回复,不从最终文本猜工具行为——此时负断言不可信,send 会\n// 经 ctx.log 明确记录这个限制。\n// ───────────────────────────────────────────────────────────────────────────\n/** OpenClaw 的 skill 目录(`skills` 生态的「通用」目录);发现靠 AGENTS.md 指引,不依赖原生扫描。 */\nconst SKILL_DIR = \".agents/skills\";\n/** 自定义 OpenAI 兼容网关在 openclaw.json 里的 provider id。 */\nconst COMPAT_PROVIDER = \"compat\";\nexport interface OpenClawConfig {\n /** 模型 API key。省略时读 OPENCLAW_API_KEY,再回落 ANTHROPIC_API_KEY。 */\n apiKey?: string;\n /** OpenAI 兼容端点。省略时读 OPENCLAW_BASE_URL。 */\n baseUrl?: string;\n /** 固定安装的 openclaw npm 版本(如 \"1.2.3\");省略时用内置默认。 */\n version?: string;\n /**\n * 装进沙箱的 Skill(本地目录/文件,或 repo + 可钉 ref + 可选启用集)。\n * 落在 `.agents/skills/<name>/`,并写一段发现指引进 AGENTS.md。\n */\n skills?: SkillSpec[];\n /** Native OpenClaw plugins as exact npm package@version declarations. */\n plugins?: readonly string[];\n}\nfunction openClawPluginLayer(cliVersion: string, plugins: readonly ExactNpmPlugin[]): {\n ensure: AgentEnsure;\n installer: AgentInstaller;\n} {\n const identity = {\n agent: \"openclaw-plugins\",\n version: cliVersion,\n revision: exactNpmPluginRevision(plugins),\n };\n const verifyFiles = `const fs=require(\"node:fs\"),path=require(\"node:path\");` +\n `const expected=${JSON.stringify(plugins)},base=path.join(process.env.HOME,\".openclaw\");` +\n `const projects=path.join(base,\"npm/projects\"),found=[];` +\n `for(const dir of fs.readdirSync(projects)){const root=path.join(projects,dir),p=JSON.parse(fs.readFileSync(path.join(root,\"package.json\"),\"utf8\"));` +\n `for(const [name,version] of Object.entries(p.dependencies||{})){const pkg=JSON.parse(fs.readFileSync(path.join(root,\"node_modules\",name,\"package.json\"),\"utf8\"));` +\n `const manifest=JSON.parse(fs.readFileSync(path.join(root,\"node_modules\",name,\"openclaw.plugin.json\"),\"utf8\"));found.push({name,version,pkgVersion:pkg.version,id:manifest.id});}}` +\n `if(found.length!==expected.length)process.exit(1);` +\n `const config=JSON.parse(fs.readFileSync(path.join(base,\"openclaw.json\"),\"utf8\"));` +\n `const ordered=expected.map(e=>found.find(x=>x.name===e.name&&x.version===e.version));` +\n `for(const x of ordered){if(!x||x.pkgVersion!==x.version||!config.plugins?.entries?.[x.id]?.enabled||!/^[A-Za-z0-9._-]+$/.test(x.id))process.exit(1);}`;\n return {\n ensure: { identity, probe: shell(`node -e ${shellQuote(verifyFiles)}`) },\n installer: {\n identity,\n installMode: \"sandbox-network\",\n install: async (sandbox, context) => {\n const installs = plugins\n .map((plugin) => `openclaw plugins install --pin ${shellQuote(plugin.spec)}`)\n .join(\"\\n\");\n const script = `set -eu\nids=$(openclaw plugins list --json | node -e ${shellQuote(`let s=\"\";process.stdin.on(\"data\",c=>s+=c).on(\"end\",()=>{const x=JSON.parse(s);for(const p of x.plugins||[])if(p.origin===\"global\")console.log(p.id)})`)})\nfor id in $ids; do openclaw plugins uninstall --force \"$id\"; done\n${installs}`;\n await sandbox.runShellOrThrow(script, { signal: context.signal });\n },\n },\n };\n}\nfunction resolveApiKey(config?: OpenClawConfig): string {\n return config?.apiKey ?? getEnv(\"OPENCLAW_API_KEY\") ?? requireEnv(\"ANTHROPIC_API_KEY\");\n}\nfunction resolveBaseUrl(config?: OpenClawConfig): string | undefined {\n return config?.baseUrl ?? getEnv(\"OPENCLAW_BASE_URL\");\n}\n/** experiment.model → `--model`。裸模型名在自定义网关下补成 `compat/<model>`。 */\nfunction resolveModelFlag(model: string | undefined, hasCompatBase: boolean): string | undefined {\n if (!model)\n return undefined;\n if (model.includes(\"/\"))\n return model;\n return hasCompatBase ? `${COMPAT_PROVIDER}/${model}` : model;\n}\n/**\n * OpenClaw 的内置 sandbox Agent 工厂。复用 `defineSandboxAgent`、`shared` 安装工具、\n * `ctx.session` 存取器与 canonical OTel 通用 mapper(`mapGenericSpans`);OpenClaw 方言\n * (transcript / `agent --json` 字段)只住 `src/o11y/parsers/openclaw.ts`,不进 core。\n *\n * 会话契约:首轮显式发一个全新 session id 并 `ctx.session.capture()`(不依赖 OpenClaw 的\n * 默认主会话——否则相邻 attempt 会静默共享历史),后续轮用 `ctx.session.id` resume;\n * `t.newSession()` 后的新会话线自然拿到新 id,session 之间互相隔离。\n */\nexport function openClawAgent(config?: OpenClawConfig): Agent {\n const version = config?.version ?? DEFAULT_OPENCLAW_CLI_VERSION;\n const plugins = normalizeExactNpmPlugins(config?.plugins, \"openClawAgent plugins\");\n const { ensure, installer } = createNpmCliInstaller({\n identity: {\n agent: \"openclaw\",\n version,\n revision: String(AGENT_BASELINE_RECIPE_REVISION.openclaw),\n },\n packageName: \"openclaw\",\n bin: \"openclaw\",\n });\n const pluginLayer = plugins.length === 0 ? undefined : openClawPluginLayer(version, plugins);\n return defineSandboxAgent({\n name: \"openclaw\",\n // e2e 已用真实 CLI 证明 session transcript 能给出工具轨 / 消息 / 用量;\n // 采集失败的单轮仍会在 send 里把 coverage 降成 unavailable/partial。\n evidenceCoverage: completeEvidenceCoverage,\n // OpenClaw 没有专属 span 方言 mapper:原生 span 走 canonical 通用 heuristic。\n // OTel 内容采集关闭时只影响 trace 证据面;行为轨(下面的 transcript 解析)不受影响。\n spanMapper: mapGenericSpans,\n ensure: pluginLayer === undefined ? ensure : [ensure, pluginLayer.ensure],\n installers: pluginLayer === undefined ? [installer] : [installer, pluginLayer.installer],\n tracing: {\n protocol: \"http/protobuf\",\n env: (endpoint) => ({\n OTEL_TRACES_EXPORTER: \"otlp\",\n OTEL_EXPORTER_OTLP_TRACES_ENDPOINT: endpoint,\n OTEL_EXPORTER_OTLP_TRACES_PROTOCOL: \"http/protobuf\",\n }),\n },\n async setup(sb, ctx) {\n const baseUrl = resolveBaseUrl(config);\n if (baseUrl) {\n const apiKey = resolveApiKey(config);\n // OpenAI 兼容网关走自定义 provider + openai-completions;\n // skipBootstrap 跳过首轮身份仪式,否则 agent 会先问 \"Who am I\"。\n // workspace 钉沙箱工作目录,文件工具写到 eval 可见的路径。\n let persistentConfig: globalThis.Record<string, unknown> = {};\n try {\n const existing = await sb.runShell('cat \"$HOME/.openclaw/openclaw.json\"');\n if (existing.exitCode === 0)\n persistentConfig = JSON.parse(existing.stdout);\n }\n catch {\n persistentConfig = {};\n }\n const openclawConfig = {\n ...persistentConfig,\n agents: {\n defaults: {\n skipBootstrap: true,\n workspace: sb.workdir,\n },\n },\n models: {\n mode: \"merge\",\n providers: {\n [COMPAT_PROVIDER]: {\n baseUrl,\n apiKey,\n api: \"openai-completions\",\n models: [\n { id: \"gpt-5.6-luna\", name: \"gpt-5.6-luna\" },\n { id: \"gpt-5.4-mini\", name: \"gpt-5.4-mini\" },\n { id: \"gpt-5.4\", name: \"gpt-5.4\" },\n ],\n },\n },\n },\n };\n await shared.writeFile(sb, \"~/.openclaw/openclaw.json\", JSON.stringify(openclawConfig, null, 2), { sensitiveValues: [apiKey] });\n // 预置最小身份文件,避免缺 IDENTITY 时仍触发仪式文案。\n await shared.writeFile(sb, `${sb.workdir}/IDENTITY.md`, \"# Identity\\n\\nName: niceeval\\nEmoji: ✓\\n\");\n await shared.writeFile(sb, `${sb.workdir}/USER.md`, \"# User\\n\\nEval harness operator.\\n\");\n await shared.writeFile(sb, `${sb.workdir}/SOUL.md`, \"# Soul\\n\\nExecute the user's task directly. Do not ask who you are.\\n\");\n }\n const manifest: AgentSetupManifest = { skills: [] };\n if (config?.skills?.length) {\n manifest.skills = await installSkills(sb, config.skills, { dir: SKILL_DIR });\n // 发现指引跟着一起写:不提示 = 白装。\n await appendProjectInstruction(sb, skillDiscoveryInstruction(SKILL_DIR, installedSkillNames(manifest.skills)));\n }\n if (manifest.skills.length) {\n ctx.reportSetup(manifest);\n }\n },\n send: (input, ctx) => Effect.runPromise(Effect.scoped(Effect.gen(function* () {\n const sb = ctx.sandbox;\n const openclawBin = yield* resolveAgentBinEffect(sb, \"openclaw\");\n return yield* Effect.tryPromise({\n try: async (signal) => {\n // 会话契约:新会话线显式发新 session id(隔离);后续轮 resume 记录的 id。\n const sessionId = ctx.session.id ?? `niceeval-${sb.sandboxId}-${randomUUID().slice(0, 8)}`;\n ctx.session.capture(sessionId);\n const baseUrl = resolveBaseUrl(config);\n const args = [\"agent\", \"--local\", \"--session-id\", sessionId, \"--message\", input.text, \"--json\"];\n const model = resolveModelFlag(ctx.model, Boolean(baseUrl));\n if (model)\n args.push(\"--model\", model);\n const apiKey = resolveApiKey(config);\n const env: globalThis.Record<string, string> = {\n OPENCLAW_API_KEY: apiKey,\n ANTHROPIC_API_KEY: apiKey,\n OPENAI_API_KEY: apiKey,\n ...ctx.telemetry?.env,\n };\n if (baseUrl) {\n env.OPENCLAW_BASE_URL = baseUrl;\n env.OPENAI_BASE_URL = baseUrl;\n }\n const res = await sb.runCommand(openclawBin, args, {\n env,\n sensitiveValues: [apiKey],\n stream: true,\n signal,\n });\n const runJson = parseOpenClawRunJson(res.stdout);\n // 封包若带回服务端分配的 session key,后续轮以它为准(capture first-writer-wins,\n // 首轮已用自发 id 落地时不覆盖)。\n ctx.session.capture(runJson.sessionId);\n // 完整工具轨迹的唯一来源:session transcript。\n // 优先读封包给出的 sessionFile(精确);否则在 agents 目录取最新 *.jsonl,\n // 但排除同目录旁路产物 *.trajectory.jsonl(mtime 常更新、却不是消息轨——\n // 误读会导致 events 为空、整轮 coverage 降成 unavailable)。\n let raw: string | undefined;\n if (runJson.sessionFile) {\n try {\n raw = await sb.readText(runJson.sessionFile);\n }\n catch {\n raw = undefined;\n }\n }\n if (raw === undefined) {\n raw = await shared.captureLatestJsonl(sb, \"~/.openclaw/agents\", {\n excludeName: /\\.trajectory\\.jsonl$/i,\n });\n }\n const parsed = parseOpenClawTranscript(raw);\n const events: StreamEvent[] = [...parsed.events];\n // transcript 缺失 / 有解析不了的行:这一轮的工具轨迹不可信,coverage 降级说出来\n // (负断言由此落 unavailable,而不是在空流上假通过),不从最终文本猜工具行为。\n let turnEvidenceCoverage: TurnEvidenceCoverage | undefined;\n if (raw === undefined || parsed.events.length === 0) {\n const reason = \"session transcript unavailable; only the --json final reply was collected\";\n turnEvidenceCoverage = {\n events: { status: \"unavailable\", reason },\n actions: { status: \"unavailable\", reason },\n usage: { status: \"unavailable\", reason },\n };\n ctx.log(\"openclaw transcript unavailable: tool trajectory missing for this turn, negative assertions are unreliable\");\n if (runJson.text)\n events.push({ type: \"message\", role: \"assistant\", text: runJson.text });\n }\n else if (!parsed.parseSuccess) {\n const reason = \"some 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 // 用量:transcript 逐消息累加优先;transcript 没报时用封包摘要,都没有就是空对象。\n const usage = (parsed.usage.inputTokens ?? 0) > 0 || (parsed.usage.outputTokens ?? 0) > 0\n ? parsed.usage\n : (runJson.usage ?? parsed.usage);\n if (res.exitCode !== 0) {\n throw makeSendFailure({\n acceptance: sendAcceptanceFromEvents(events),\n message: shared.diagnoseFailure(res, parsed.events, raw),\n events,\n usage,\n process: res,\n });\n }\n if (runJson.failed)\n events.push({ type: \"error\", message: shared.diagnoseFailure(res, parsed.events, raw) });\n return {\n events,\n usage,\n status: runJson.failed ? \"failed\" as const : \"completed\" as const,\n ...(turnEvidenceCoverage ? { evidenceCoverage: turnEvidenceCoverage } : {}),\n };\n },\n catch: (cause) => cause,\n });\n })), { signal: ctx.signal }),\n });\n}\nexport default openClawAgent();\n"]}
@@ -11,6 +11,8 @@ export interface OpenClawConfig {
11
11
  * 落在 `.agents/skills/<name>/`,并写一段发现指引进 AGENTS.md。
12
12
  */
13
13
  skills?: SkillSpec[];
14
+ /** Native OpenClaw plugins as exact npm package@version declarations. */
15
+ plugins?: readonly string[];
14
16
  }
15
17
  /**
16
18
  * OpenClaw 的内置 sandbox Agent 工厂。复用 `defineSandboxAgent`、`shared` 安装工具、
@@ -11,6 +11,8 @@ export interface OpenClawConfig {
11
11
  * 落在 `.agents/skills/<name>/`,并写一段发现指引进 AGENTS.md。
12
12
  */
13
13
  skills?: SkillSpec[];
14
+ /** Native OpenClaw plugins as exact npm package@version declarations. */
15
+ plugins?: readonly string[];
14
16
  }
15
17
  /**
16
18
  * OpenClaw 的内置 sandbox Agent 工厂。复用 `defineSandboxAgent`、`shared` 安装工具、
@@ -11,6 +11,8 @@ export interface OpenClawConfig {
11
11
  * 落在 `.agents/skills/<name>/`,并写一段发现指引进 AGENTS.md。
12
12
  */
13
13
  skills?: SkillSpec[];
14
+ /** Native OpenClaw plugins as exact npm package@version declarations. */
15
+ plugins?: readonly string[];
14
16
  }
15
17
  /**
16
18
  * OpenClaw 的内置 sandbox Agent 工厂。复用 `defineSandboxAgent`、`shared` 安装工具、