harness-engineering-agent 0.1.0

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 (327) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +191 -0
  3. package/dist/config/config-defaults.d.ts +32 -0
  4. package/dist/config/config-defaults.d.ts.map +1 -0
  5. package/dist/config/config-defaults.js +32 -0
  6. package/dist/config/config-defaults.js.map +1 -0
  7. package/dist/config/config-errors.d.ts +7 -0
  8. package/dist/config/config-errors.d.ts.map +1 -0
  9. package/dist/config/config-errors.js +11 -0
  10. package/dist/config/config-errors.js.map +1 -0
  11. package/dist/config/config-file.d.ts +3 -0
  12. package/dist/config/config-file.d.ts.map +1 -0
  13. package/dist/config/config-file.js +31 -0
  14. package/dist/config/config-file.js.map +1 -0
  15. package/dist/config/config-merge.d.ts +8 -0
  16. package/dist/config/config-merge.d.ts.map +1 -0
  17. package/dist/config/config-merge.js +50 -0
  18. package/dist/config/config-merge.js.map +1 -0
  19. package/dist/config/config-schema.d.ts +135 -0
  20. package/dist/config/config-schema.d.ts.map +1 -0
  21. package/dist/config/config-schema.js +94 -0
  22. package/dist/config/config-schema.js.map +1 -0
  23. package/dist/config/config-types.d.ts +21 -0
  24. package/dist/config/config-types.d.ts.map +1 -0
  25. package/dist/config/config-types.js +2 -0
  26. package/dist/config/config-types.js.map +1 -0
  27. package/dist/config/harness-config.d.ts +6 -0
  28. package/dist/config/harness-config.d.ts.map +1 -0
  29. package/dist/config/harness-config.js +4 -0
  30. package/dist/config/harness-config.js.map +1 -0
  31. package/dist/config/index.d.ts +2 -0
  32. package/dist/config/index.d.ts.map +1 -0
  33. package/dist/config/index.js +2 -0
  34. package/dist/config/index.js.map +1 -0
  35. package/dist/config/load-harness-config.d.ts +9 -0
  36. package/dist/config/load-harness-config.d.ts.map +1 -0
  37. package/dist/config/load-harness-config.js +25 -0
  38. package/dist/config/load-harness-config.js.map +1 -0
  39. package/dist/controller/agent-output.d.ts +21 -0
  40. package/dist/controller/agent-output.d.ts.map +1 -0
  41. package/dist/controller/agent-output.js +75 -0
  42. package/dist/controller/agent-output.js.map +1 -0
  43. package/dist/controller/agent-session.d.ts +49 -0
  44. package/dist/controller/agent-session.d.ts.map +1 -0
  45. package/dist/controller/agent-session.js +220 -0
  46. package/dist/controller/agent-session.js.map +1 -0
  47. package/dist/controller/contracts.d.ts +65 -0
  48. package/dist/controller/contracts.d.ts.map +1 -0
  49. package/dist/controller/contracts.js +2 -0
  50. package/dist/controller/contracts.js.map +1 -0
  51. package/dist/controller/errors.d.ts +23 -0
  52. package/dist/controller/errors.d.ts.map +1 -0
  53. package/dist/controller/errors.js +37 -0
  54. package/dist/controller/errors.js.map +1 -0
  55. package/dist/controller/evidence-factory.d.ts +15 -0
  56. package/dist/controller/evidence-factory.d.ts.map +1 -0
  57. package/dist/controller/evidence-factory.js +38 -0
  58. package/dist/controller/evidence-factory.js.map +1 -0
  59. package/dist/controller/failure-analysis.d.ts +36 -0
  60. package/dist/controller/failure-analysis.d.ts.map +1 -0
  61. package/dist/controller/failure-analysis.js +175 -0
  62. package/dist/controller/failure-analysis.js.map +1 -0
  63. package/dist/controller/failure-factory.d.ts +85 -0
  64. package/dist/controller/failure-factory.d.ts.map +1 -0
  65. package/dist/controller/failure-factory.js +124 -0
  66. package/dist/controller/failure-factory.js.map +1 -0
  67. package/dist/controller/graph-validator.d.ts +4 -0
  68. package/dist/controller/graph-validator.d.ts.map +1 -0
  69. package/dist/controller/graph-validator.js +102 -0
  70. package/dist/controller/graph-validator.js.map +1 -0
  71. package/dist/controller/index.d.ts +15 -0
  72. package/dist/controller/index.d.ts.map +1 -0
  73. package/dist/controller/index.js +11 -0
  74. package/dist/controller/index.js.map +1 -0
  75. package/dist/controller/repair-loop.d.ts +42 -0
  76. package/dist/controller/repair-loop.d.ts.map +1 -0
  77. package/dist/controller/repair-loop.js +385 -0
  78. package/dist/controller/repair-loop.js.map +1 -0
  79. package/dist/controller/report-factory.d.ts +4 -0
  80. package/dist/controller/report-factory.d.ts.map +1 -0
  81. package/dist/controller/report-factory.js +107 -0
  82. package/dist/controller/report-factory.js.map +1 -0
  83. package/dist/controller/role-prompts.d.ts +8 -0
  84. package/dist/controller/role-prompts.d.ts.map +1 -0
  85. package/dist/controller/role-prompts.js +35 -0
  86. package/dist/controller/role-prompts.js.map +1 -0
  87. package/dist/controller/run-controller.d.ts +3 -0
  88. package/dist/controller/run-controller.d.ts.map +1 -0
  89. package/dist/controller/run-controller.js +291 -0
  90. package/dist/controller/run-controller.js.map +1 -0
  91. package/dist/controller/run-persistence.d.ts +15 -0
  92. package/dist/controller/run-persistence.d.ts.map +1 -0
  93. package/dist/controller/run-persistence.js +83 -0
  94. package/dist/controller/run-persistence.js.map +1 -0
  95. package/dist/controller/run-state.d.ts +61 -0
  96. package/dist/controller/run-state.d.ts.map +1 -0
  97. package/dist/controller/run-state.js +151 -0
  98. package/dist/controller/run-state.js.map +1 -0
  99. package/dist/controller/task-agent-output.d.ts +70 -0
  100. package/dist/controller/task-agent-output.d.ts.map +1 -0
  101. package/dist/controller/task-agent-output.js +256 -0
  102. package/dist/controller/task-agent-output.js.map +1 -0
  103. package/dist/controller/task-agent-schemas.d.ts +217 -0
  104. package/dist/controller/task-agent-schemas.d.ts.map +1 -0
  105. package/dist/controller/task-agent-schemas.js +171 -0
  106. package/dist/controller/task-agent-schemas.js.map +1 -0
  107. package/dist/controller/task-executor.d.ts +15 -0
  108. package/dist/controller/task-executor.d.ts.map +1 -0
  109. package/dist/controller/task-executor.js +751 -0
  110. package/dist/controller/task-executor.js.map +1 -0
  111. package/dist/controller/task-paths.d.ts +3 -0
  112. package/dist/controller/task-paths.d.ts.map +1 -0
  113. package/dist/controller/task-paths.js +20 -0
  114. package/dist/controller/task-paths.js.map +1 -0
  115. package/dist/controller/task-retry.d.ts +24 -0
  116. package/dist/controller/task-retry.d.ts.map +1 -0
  117. package/dist/controller/task-retry.js +42 -0
  118. package/dist/controller/task-retry.js.map +1 -0
  119. package/dist/controller/worktree-eligibility.d.ts +15 -0
  120. package/dist/controller/worktree-eligibility.d.ts.map +1 -0
  121. package/dist/controller/worktree-eligibility.js +38 -0
  122. package/dist/controller/worktree-eligibility.js.map +1 -0
  123. package/dist/controller/worktree-scheduler.d.ts +72 -0
  124. package/dist/controller/worktree-scheduler.d.ts.map +1 -0
  125. package/dist/controller/worktree-scheduler.js +142 -0
  126. package/dist/controller/worktree-scheduler.js.map +1 -0
  127. package/dist/domain/agent-result.d.ts +83 -0
  128. package/dist/domain/agent-result.d.ts.map +1 -0
  129. package/dist/domain/agent-result.js +44 -0
  130. package/dist/domain/agent-result.js.map +1 -0
  131. package/dist/domain/evidence.d.ts +97 -0
  132. package/dist/domain/evidence.d.ts.map +1 -0
  133. package/dist/domain/evidence.js +85 -0
  134. package/dist/domain/evidence.js.map +1 -0
  135. package/dist/domain/failure.d.ts +121 -0
  136. package/dist/domain/failure.d.ts.map +1 -0
  137. package/dist/domain/failure.js +72 -0
  138. package/dist/domain/failure.js.map +1 -0
  139. package/dist/domain/index.d.ts +19 -0
  140. package/dist/domain/index.d.ts.map +1 -0
  141. package/dist/domain/index.js +10 -0
  142. package/dist/domain/index.js.map +1 -0
  143. package/dist/domain/report.d.ts +904 -0
  144. package/dist/domain/report.d.ts.map +1 -0
  145. package/dist/domain/report.js +90 -0
  146. package/dist/domain/report.js.map +1 -0
  147. package/dist/domain/requirement.d.ts +10 -0
  148. package/dist/domain/requirement.d.ts.map +1 -0
  149. package/dist/domain/requirement.js +12 -0
  150. package/dist/domain/requirement.js.map +1 -0
  151. package/dist/domain/run.d.ts +857 -0
  152. package/dist/domain/run.d.ts.map +1 -0
  153. package/dist/domain/run.js +129 -0
  154. package/dist/domain/run.js.map +1 -0
  155. package/dist/domain/shared.d.ts +60 -0
  156. package/dist/domain/shared.d.ts.map +1 -0
  157. package/dist/domain/shared.js +66 -0
  158. package/dist/domain/shared.js.map +1 -0
  159. package/dist/domain/task.d.ts +316 -0
  160. package/dist/domain/task.d.ts.map +1 -0
  161. package/dist/domain/task.js +116 -0
  162. package/dist/domain/task.js.map +1 -0
  163. package/dist/index.d.ts +15 -0
  164. package/dist/index.d.ts.map +1 -0
  165. package/dist/index.js +15 -0
  166. package/dist/index.js.map +1 -0
  167. package/dist/path/workspace-path.d.ts +6 -0
  168. package/dist/path/workspace-path.d.ts.map +1 -0
  169. package/dist/path/workspace-path.js +36 -0
  170. package/dist/path/workspace-path.js.map +1 -0
  171. package/dist/plugin/create-harness-plugin.d.ts +40 -0
  172. package/dist/plugin/create-harness-plugin.d.ts.map +1 -0
  173. package/dist/plugin/create-harness-plugin.js +169 -0
  174. package/dist/plugin/create-harness-plugin.js.map +1 -0
  175. package/dist/plugin/harness-agent-config.d.ts +6 -0
  176. package/dist/plugin/harness-agent-config.d.ts.map +1 -0
  177. package/dist/plugin/harness-agent-config.js +130 -0
  178. package/dist/plugin/harness-agent-config.js.map +1 -0
  179. package/dist/plugin/harness-chat-hook.d.ts +27 -0
  180. package/dist/plugin/harness-chat-hook.d.ts.map +1 -0
  181. package/dist/plugin/harness-chat-hook.js +72 -0
  182. package/dist/plugin/harness-chat-hook.js.map +1 -0
  183. package/dist/plugin/harness-chat-parts.d.ts +10 -0
  184. package/dist/plugin/harness-chat-parts.d.ts.map +1 -0
  185. package/dist/plugin/harness-chat-parts.js +36 -0
  186. package/dist/plugin/harness-chat-parts.js.map +1 -0
  187. package/dist/plugin/harness-chat-protocol.d.ts +9 -0
  188. package/dist/plugin/harness-chat-protocol.d.ts.map +1 -0
  189. package/dist/plugin/harness-chat-protocol.js +23 -0
  190. package/dist/plugin/harness-chat-protocol.js.map +1 -0
  191. package/dist/plugin/harness-coordinator.d.ts +33 -0
  192. package/dist/plugin/harness-coordinator.d.ts.map +1 -0
  193. package/dist/plugin/harness-coordinator.js +188 -0
  194. package/dist/plugin/harness-coordinator.js.map +1 -0
  195. package/dist/plugin/harness-intake-prompt.d.ts +2 -0
  196. package/dist/plugin/harness-intake-prompt.d.ts.map +1 -0
  197. package/dist/plugin/harness-intake-prompt.js +52 -0
  198. package/dist/plugin/harness-intake-prompt.js.map +1 -0
  199. package/dist/plugin/harness-intent.d.ts +72 -0
  200. package/dist/plugin/harness-intent.d.ts.map +1 -0
  201. package/dist/plugin/harness-intent.js +82 -0
  202. package/dist/plugin/harness-intent.js.map +1 -0
  203. package/dist/plugin/harness-parent-session-dispatcher.d.ts +46 -0
  204. package/dist/plugin/harness-parent-session-dispatcher.d.ts.map +1 -0
  205. package/dist/plugin/harness-parent-session-dispatcher.js +33 -0
  206. package/dist/plugin/harness-parent-session-dispatcher.js.map +1 -0
  207. package/dist/plugin/harness-requirement.d.ts +4 -0
  208. package/dist/plugin/harness-requirement.d.ts.map +1 -0
  209. package/dist/plugin/harness-requirement.js +37 -0
  210. package/dist/plugin/harness-requirement.js.map +1 -0
  211. package/dist/session/contracts.d.ts +178 -0
  212. package/dist/session/contracts.d.ts.map +1 -0
  213. package/dist/session/contracts.js +28 -0
  214. package/dist/session/contracts.js.map +1 -0
  215. package/dist/session/fake-session-adapter.d.ts +22 -0
  216. package/dist/session/fake-session-adapter.d.ts.map +1 -0
  217. package/dist/session/fake-session-adapter.js +238 -0
  218. package/dist/session/fake-session-adapter.js.map +1 -0
  219. package/dist/session/fake-session-errors.d.ts +23 -0
  220. package/dist/session/fake-session-errors.d.ts.map +1 -0
  221. package/dist/session/fake-session-errors.js +37 -0
  222. package/dist/session/fake-session-errors.js.map +1 -0
  223. package/dist/session/harness-agent-names.d.ts +51 -0
  224. package/dist/session/harness-agent-names.d.ts.map +1 -0
  225. package/dist/session/harness-agent-names.js +98 -0
  226. package/dist/session/harness-agent-names.js.map +1 -0
  227. package/dist/session/index.d.ts +9 -0
  228. package/dist/session/index.d.ts.map +1 -0
  229. package/dist/session/index.js +9 -0
  230. package/dist/session/index.js.map +1 -0
  231. package/dist/session/opencode-session-adapter.d.ts +9 -0
  232. package/dist/session/opencode-session-adapter.d.ts.map +1 -0
  233. package/dist/session/opencode-session-adapter.js +243 -0
  234. package/dist/session/opencode-session-adapter.js.map +1 -0
  235. package/dist/session/opencode-session-client.d.ts +58 -0
  236. package/dist/session/opencode-session-client.d.ts.map +1 -0
  237. package/dist/session/opencode-session-client.js +17 -0
  238. package/dist/session/opencode-session-client.js.map +1 -0
  239. package/dist/session/opencode-session-errors.d.ts +15 -0
  240. package/dist/session/opencode-session-errors.d.ts.map +1 -0
  241. package/dist/session/opencode-session-errors.js +19 -0
  242. package/dist/session/opencode-session-errors.js.map +1 -0
  243. package/dist/session/opencode-session-prompts.d.ts +12 -0
  244. package/dist/session/opencode-session-prompts.d.ts.map +1 -0
  245. package/dist/session/opencode-session-prompts.js +16 -0
  246. package/dist/session/opencode-session-prompts.js.map +1 -0
  247. package/dist/store/filesystem-run-store-io.d.ts +9 -0
  248. package/dist/store/filesystem-run-store-io.d.ts.map +1 -0
  249. package/dist/store/filesystem-run-store-io.js +85 -0
  250. package/dist/store/filesystem-run-store-io.js.map +1 -0
  251. package/dist/store/filesystem-run-store.d.ts +16 -0
  252. package/dist/store/filesystem-run-store.d.ts.map +1 -0
  253. package/dist/store/filesystem-run-store.js +286 -0
  254. package/dist/store/filesystem-run-store.js.map +1 -0
  255. package/dist/store/index.d.ts +5 -0
  256. package/dist/store/index.d.ts.map +1 -0
  257. package/dist/store/index.js +4 -0
  258. package/dist/store/index.js.map +1 -0
  259. package/dist/store/run-event.d.ts +786 -0
  260. package/dist/store/run-event.d.ts.map +1 -0
  261. package/dist/store/run-event.js +24 -0
  262. package/dist/store/run-event.js.map +1 -0
  263. package/dist/store/run-store-errors.d.ts +38 -0
  264. package/dist/store/run-store-errors.d.ts.map +1 -0
  265. package/dist/store/run-store-errors.js +62 -0
  266. package/dist/store/run-store-errors.js.map +1 -0
  267. package/dist/tools/context7-client.d.ts +22 -0
  268. package/dist/tools/context7-client.d.ts.map +1 -0
  269. package/dist/tools/context7-client.js +108 -0
  270. package/dist/tools/context7-client.js.map +1 -0
  271. package/dist/tools/grep-app-client.d.ts +21 -0
  272. package/dist/tools/grep-app-client.d.ts.map +1 -0
  273. package/dist/tools/grep-app-client.js +136 -0
  274. package/dist/tools/grep-app-client.js.map +1 -0
  275. package/dist/tools/harness-research-tools.d.ts +21 -0
  276. package/dist/tools/harness-research-tools.d.ts.map +1 -0
  277. package/dist/tools/harness-research-tools.js +101 -0
  278. package/dist/tools/harness-research-tools.js.map +1 -0
  279. package/dist/tools/lsp-client.d.ts +32 -0
  280. package/dist/tools/lsp-client.d.ts.map +1 -0
  281. package/dist/tools/lsp-client.js +234 -0
  282. package/dist/tools/lsp-client.js.map +1 -0
  283. package/dist/tools/lsp-json-rpc.d.ts +13 -0
  284. package/dist/tools/lsp-json-rpc.d.ts.map +1 -0
  285. package/dist/tools/lsp-json-rpc.js +98 -0
  286. package/dist/tools/lsp-json-rpc.js.map +1 -0
  287. package/dist/verification/command-policy.d.ts +11 -0
  288. package/dist/verification/command-policy.d.ts.map +1 -0
  289. package/dist/verification/command-policy.js +262 -0
  290. package/dist/verification/command-policy.js.map +1 -0
  291. package/dist/verification/contracts.d.ts +82 -0
  292. package/dist/verification/contracts.d.ts.map +1 -0
  293. package/dist/verification/contracts.js +6 -0
  294. package/dist/verification/contracts.js.map +1 -0
  295. package/dist/verification/fake-process-runner.d.ts +16 -0
  296. package/dist/verification/fake-process-runner.d.ts.map +1 -0
  297. package/dist/verification/fake-process-runner.js +28 -0
  298. package/dist/verification/fake-process-runner.js.map +1 -0
  299. package/dist/verification/index.d.ts +6 -0
  300. package/dist/verification/index.d.ts.map +1 -0
  301. package/dist/verification/index.js +5 -0
  302. package/dist/verification/index.js.map +1 -0
  303. package/dist/verification/node-process-runner.d.ts +12 -0
  304. package/dist/verification/node-process-runner.d.ts.map +1 -0
  305. package/dist/verification/node-process-runner.js +103 -0
  306. package/dist/verification/node-process-runner.js.map +1 -0
  307. package/dist/verification/verification-runner.d.ts +3 -0
  308. package/dist/verification/verification-runner.d.ts.map +1 -0
  309. package/dist/verification/verification-runner.js +101 -0
  310. package/dist/verification/verification-runner.js.map +1 -0
  311. package/dist/workspace/git-baseline.d.ts +63 -0
  312. package/dist/workspace/git-baseline.d.ts.map +1 -0
  313. package/dist/workspace/git-baseline.js +53 -0
  314. package/dist/workspace/git-baseline.js.map +1 -0
  315. package/dist/workspace/git-workspace-adapter.d.ts +43 -0
  316. package/dist/workspace/git-workspace-adapter.d.ts.map +1 -0
  317. package/dist/workspace/git-workspace-adapter.js +279 -0
  318. package/dist/workspace/git-workspace-adapter.js.map +1 -0
  319. package/dist/workspace/git-worktree-adapter.d.ts +45 -0
  320. package/dist/workspace/git-worktree-adapter.d.ts.map +1 -0
  321. package/dist/workspace/git-worktree-adapter.js +104 -0
  322. package/dist/workspace/git-worktree-adapter.js.map +1 -0
  323. package/dist/workspace/index.d.ts +7 -0
  324. package/dist/workspace/index.d.ts.map +1 -0
  325. package/dist/workspace/index.js +4 -0
  326. package/dist/workspace/index.js.map +1 -0
  327. package/package.json +45 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 YiLaoWei
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,191 @@
1
+ # Harness Engineering Agent
2
+
3
+ 面向复杂项目工程的 OpenCode 自动开发插件。
4
+
5
+ 该插件采用全局安装、按项目配置的运行方式,通过专用 primary `harness` Agent 与内部 Harness agent set 协调完成需求拆解、实现、确定性校验、有限重试和最终报告,不依赖 Sisyphus、OMO 或 OpenSpec 运行时。
6
+
7
+ ## 当前能力
8
+
9
+ - 选择 `harness` Agent 后,使用自然语言发起 `start`、`status`、`resume`、`pause`、`cancel`、`answer`、`waive`、`report` 生命周期操作。
10
+ - 插件只在当前消息的 `agent === "harness"` 时触发 Harness 协调;普通 Agent 和普通聊天不会自动拦截。
11
+ - 自然语言请求先进入内部 Intake Session,转换为严格 JSON intent,再由确定性的 RunController 执行对应操作。
12
+ - `chat.message` 采用两阶段非阻塞流程:前台先返回 synthetic 受理确认,协调工作在后台运行;后台完成后再向同一父会话补发 Harness 内部完成消息,供 `harness` Agent 做最终总结。
13
+ - 所有内部 Session 都显式绑定到 Harness 自有 agent,并同时保留稳定旧 ID 与英文显示名映射。
14
+ - 当前激活链为 `Nuwa -> Fuxi -> Luban -> deterministic verification -> Zhulong -> Yinglong`;失败时经 `Xingtian` 归因,允许自动修复时由 `Jingwei` 生成 Repair Task,再交回 `Luban` 在受限范围内执行。
15
+ - `resume` 会从 `.harness/runs/<run-id>/` 的快照与事件恢复上下文,不会重复已完成 Task 或丢失既有 evidence。
16
+ - Git 基线、脏工作区、外部修改、scope drift、merge conflict 与 verification evidence gap 全部由 Controller 的确定性状态机保护,不能被 Agent 自报绕过。
17
+ - 并行仅在依赖、路径范围和验证资源都无冲突时启用,且必须在独立 git worktree 中执行;冲突或集成失败时保留诊断 worktree refs,并让主仓库 `merge --abort` 回到无 unmerged 状态。
18
+ - 验证命令通过结构化 argv、`shell: false`、工作区包含校验、嵌套解释器/包管理器绕过检查和审批元数据约束执行,不接受 Agent 自报“已通过”替代命令证据。
19
+
20
+ ## 内部工程工具
21
+
22
+ Harness 自研并注册以下只读工程工具,不依赖 OMO 或用户的 MCP 配置:
23
+
24
+ - `harness_context7_resolve`、`harness_context7_query`:直连 Context7 官方 HTTP API。
25
+ - `harness_grep_app_search`:通过自研 Streamable HTTP MCP 客户端调用 grep.app 官方 `searchGitHub`。
26
+ - `harness_lsp_status`、`harness_lsp_diagnostics`、`harness_lsp_definition`、`harness_lsp_references`:通过自研 JSON-RPC stdio 客户端访问 JDT LS 和 TypeScript Language Server。
27
+
28
+ 这些工具在执行边界校验 Agent 身份,普通 OpenCode Agent 无法调用。Planner、Worker、Verifier 和 Failure Analyzer 可以使用全部研究工具;Acceptance 只使用 grep.app 与 LSP;Intake 和主 Harness Agent不使用这些工具。LSP 只提供只读查询,不实现重命名或代码写入。JDT LS 数据目录位于系统临时目录,并在插件释放时清理。
29
+
30
+ Context7 默认匿名访问;可通过环境变量 `CONTEXT7_API_KEY` 提升限额。JDT LS 命令可通过 `HARNESS_JDTLS_COMMAND` 覆盖。
31
+
32
+ ## 构建与全局加载
33
+
34
+ ```bash
35
+ pnpm install
36
+ pnpm build
37
+ ```
38
+
39
+ OpenCode 会自动加载 `~/.config/opencode/plugins/` 下的插件。开发环境可创建:
40
+
41
+ ```typescript
42
+ // ~/.config/opencode/plugins/harness-engineering-agent.ts
43
+ export { server } from "/workspace/CnbProjectSpace/harness-engineering-agent/dist/index.js"
44
+ ```
45
+
46
+ 修改插件或配置后需要重新执行 `pnpm build`,并重启 OpenCode。
47
+
48
+ ## 发布到 npm
49
+
50
+ 交互式发布脚本会调用 npm 官方登录流程。用户名正常显示,密码由 npm
51
+ 隐藏读取,不会作为命令参数、环境变量或脚本变量保存。账号启用 2FA 时,
52
+ npm 会继续提示输入 OTP。
53
+
54
+ 先执行不发布的完整检查:
55
+
56
+ ```bash
57
+ pnpm publish:npm -- --dry-run
58
+ ```
59
+
60
+ 确认包名和版本无误后执行真实发布:
61
+
62
+ ```bash
63
+ pnpm publish:npm
64
+ ```
65
+
66
+ 脚本依次执行登录、版本占用检查、类型检查、Lint、测试、构建、打包预览
67
+ 和发布确认。npm 不允许覆盖已有版本,后续发布前先升级版本:
68
+
69
+ ```bash
70
+ npm version patch --no-git-tag-version
71
+ ```
72
+
73
+ npm registry 要求发布者启用双重验证。账号密码登录后先执行:
74
+
75
+ ```bash
76
+ npm profile enable-2fa auth-and-writes
77
+ ```
78
+
79
+ 重新运行 `pnpm publish:npm`,发布阶段按 npm 提示输入 OTP。另一种方式是
80
+ 在 npm 网站创建 granular access token,为目标包授予 `Read and write`
81
+ 权限并启用 `Bypass 2FA`。运行脚本时隐藏输入 token:
82
+
83
+ ```bash
84
+ pnpm publish:npm -- --token-auth
85
+ ```
86
+
87
+ 脚本将 token 临时写入权限为 `600` 的 npmrc,并仅通过
88
+ `NPM_CONFIG_USERCONFIG` 传给 npm 子进程;`pnpm test/build` 不会继承该
89
+ 认证文件。脚本结束后自动删除。token 不会写入命令参数、shell 历史、
90
+ 项目文件或日志。该参数不能绕过 npm registry 的服务端权限校验。
91
+
92
+ 如果 token 曾经出现在日志、聊天或公开文件中,应立即在 npm 网站撤销并
93
+ 重新创建,不要继续使用泄露的 token。
94
+
95
+ 发布后在 `opencode.json` 中通过 npm 包名加载:
96
+
97
+ ```json
98
+ {
99
+ "$schema": "https://opencode.ai/config.json",
100
+ "plugin": ["harness-engineering-agent"]
101
+ }
102
+ ```
103
+
104
+ ## 项目配置
105
+
106
+ 在目标项目创建 `.harness/config.yaml`:
107
+
108
+ ```yaml
109
+ schemaVersion: "1.0.0"
110
+ enabled: true
111
+ harness:
112
+ provider: openai
113
+ model: gpt-5.5
114
+ planner:
115
+ provider: openai
116
+ model: gpt-5.5
117
+ worker:
118
+ provider: deepseek
119
+ model: deepseek-v4-pro
120
+ verifier:
121
+ provider: openai
122
+ model: gpt-5.5
123
+ acceptance:
124
+ provider: openai
125
+ model: gpt-5.5
126
+ failureAnalyzer:
127
+ provider: openai
128
+ model: gpt-5.5
129
+ maxRunAttempts: 3
130
+ stateDirectory: .harness/runs
131
+ ```
132
+
133
+ `harness` profile 只用于专用 `harness` Agent 和内部 Intake Session;不要在这里重新引入 `maxSteps` 等 OpenCode Agent 运行时字段。
134
+
135
+ `acceptance` 缺省继承 `verifier`,`failureAnalyzer` 缺省继承 `planner`。`repair-worker` 当前复用 `worker` profile,而不是单独配置项。三者都会参与实际控制链,不再只是预留配置。
136
+
137
+ `stateDirectory`、任务 `allowedPaths` 和验证工作目录只能是项目内相对路径。
138
+
139
+ ## 使用方式
140
+
141
+ 1. 在 OpenCode 中选择 primary `harness` Agent。
142
+ 2. 直接发送自然语言请求,例如“启动一个 run,目标是……”“查询 run-abc 状态”“恢复 run-abc”“取消 run-abc”“生成 run-abc 报告”。
143
+ 3. `start` 请求必须能被 Intake 提炼成 title、summary、acceptanceCriteria;如果缺少必要信息,Harness 会返回 clarification 响应而不是猜测。
144
+ 4. `status`、`resume`、`cancel`、`report` 必须显式提供 `runId`;Harness 不会默认选择“最近一次运行”。
145
+
146
+ ## Agent 集与权限矩阵
147
+
148
+ 当前独立 Harness agent set 固定为:
149
+
150
+ - primary:`harness`
151
+ - internal:`Nuwa`、`Fuxi`、`Luban`、`Zhulong`、`Yinglong`、`Xingtian`、`Jingwei`
152
+
153
+ 角色到 agent 的单一映射:
154
+
155
+ - `intake -> Nuwa`(兼容 ID:`harness-intake`)
156
+ - `planner -> Fuxi`(兼容 ID:`harness-planner`)
157
+ - `worker -> Luban`(兼容 ID:`harness-worker`)
158
+ - `verifier -> Zhulong`(兼容 ID:`harness-verifier`)
159
+ - `acceptance -> Yinglong`(兼容 ID:`harness-acceptance`)
160
+ - `failure-analyzer -> Xingtian`(兼容 ID:`harness-failure-analyzer`)
161
+ - `repair-worker -> Jingwei`(兼容 ID:`harness-repair-worker`)
162
+
163
+ 权限矩阵:
164
+
165
+ - `Luban` / `harness-worker`:`task=false`,`edit/write/patch/bash=true`,`permission.edit=allow`,`permission.bash=allow`
166
+ - 其他全部 Harness agent:`task/edit/write/patch/bash=false`,`permission.edit=deny`,`permission.bash=deny`
167
+
168
+ 当前确定性生命周期保持为 `intake -> planner -> worker -> deterministic verification -> verifier -> acceptance -> report`。失败路径会进入 `failure-analyzer`,必要时再进入 `repair-worker -> worker -> deterministic verification -> verifier -> acceptance` 修复闭环。
169
+
170
+ ## 恢复与证据
171
+
172
+ - `.harness/runs/<run-id>/state.json` 使用原子替换写入,`events.jsonl` 追加持久化并带稳定幂等键。
173
+ - `FilesystemRunStore` 会在读取时重放快照后的事件,并拒绝未知 major schema version。
174
+ - Evidence Ledger 记录 requirement、acceptance criterion、task、changed paths、verification command、输出摘要 digest 和 redaction metadata。
175
+ - Bug 修复与 `repairEnabled` Task 要求 RED/GREEN/REFACTOR 三阶段 evidence;Design Bundle 场景要求 requirement / acceptance / tasks / evidence / report 结构可追踪。
176
+ - 最终报告会汇总 `traceability`、`unfinishedTasks`、`verificationSummaries`、`failures`、`evidenceGaps` 和 `residualRisks`,不会因为 run 结束就抹平历史失败记录。
177
+
178
+ ## 设计来源
179
+
180
+ - Harness Engineering:将上下文、工具、状态、反馈、验证和恢复构造成模型外部的确定性控制平面。
181
+ - Superpowers:吸收 brainstorming、writing plans、TDD、systematic debugging、subagent development 和 verification before completion 的工程纪律。
182
+ - 自有 Harness 文档:使用 overview、architecture、specs、implementation-plan 分离动机、技术决策、行为契约和实施计划。
183
+
184
+ ## 设计文档
185
+
186
+ - [设计概览](harness/overview.md)
187
+ - [总体架构](harness/architecture.md)
188
+ - [实施计划](harness/implementation-plan.md)
189
+ - [能力规格](harness/specs/)
190
+
191
+ 插件运行时只依赖 OpenCode Plugin/SDK、配置解析库和目标项目自身的构建测试工具。
@@ -0,0 +1,32 @@
1
+ export declare const HARNESS_CONFIG_DEFAULTS: {
2
+ readonly schemaVersion: "1.0.0";
3
+ readonly enabled: true;
4
+ readonly harness: {
5
+ readonly provider: "openai";
6
+ readonly model: "gpt-5.5";
7
+ };
8
+ readonly planner: {
9
+ readonly provider: "openai";
10
+ readonly model: "gpt-5.5";
11
+ };
12
+ readonly worker: {
13
+ readonly provider: "deepseek";
14
+ readonly model: "deepseek-v4-pro";
15
+ };
16
+ readonly verifier: {
17
+ readonly provider: "openai";
18
+ readonly model: "gpt-5.5";
19
+ };
20
+ readonly acceptance: {
21
+ readonly provider: "openai";
22
+ readonly model: "gpt-5.5";
23
+ };
24
+ readonly failureAnalyzer: {
25
+ readonly provider: "openai";
26
+ readonly model: "gpt-5.5";
27
+ };
28
+ readonly verificationCommands: readonly [];
29
+ readonly maxRunAttempts: 3;
30
+ readonly stateDirectory: ".harness/runs";
31
+ };
32
+ //# sourceMappingURL=config-defaults.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-defaults.d.ts","sourceRoot":"","sources":["../../src/config/config-defaults.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8BF,CAAA"}
@@ -0,0 +1,32 @@
1
+ export const HARNESS_CONFIG_DEFAULTS = {
2
+ schemaVersion: "1.0.0",
3
+ enabled: true,
4
+ harness: {
5
+ provider: "openai",
6
+ model: "gpt-5.5",
7
+ },
8
+ planner: {
9
+ provider: "openai",
10
+ model: "gpt-5.5",
11
+ },
12
+ worker: {
13
+ provider: "deepseek",
14
+ model: "deepseek-v4-pro",
15
+ },
16
+ verifier: {
17
+ provider: "openai",
18
+ model: "gpt-5.5",
19
+ },
20
+ acceptance: {
21
+ provider: "openai",
22
+ model: "gpt-5.5",
23
+ },
24
+ failureAnalyzer: {
25
+ provider: "openai",
26
+ model: "gpt-5.5",
27
+ },
28
+ verificationCommands: [],
29
+ maxRunAttempts: 3,
30
+ stateDirectory: ".harness/runs",
31
+ };
32
+ //# sourceMappingURL=config-defaults.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-defaults.js","sourceRoot":"","sources":["../../src/config/config-defaults.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,uBAAuB,GAAG;IACrC,aAAa,EAAE,OAAO;IACtB,OAAO,EAAE,IAAI;IACb,OAAO,EAAE;QACP,QAAQ,EAAE,QAAQ;QAClB,KAAK,EAAE,SAAS;KACjB;IACD,OAAO,EAAE;QACP,QAAQ,EAAE,QAAQ;QAClB,KAAK,EAAE,SAAS;KACjB;IACD,MAAM,EAAE;QACN,QAAQ,EAAE,UAAU;QACpB,KAAK,EAAE,iBAAiB;KACzB;IACD,QAAQ,EAAE;QACR,QAAQ,EAAE,QAAQ;QAClB,KAAK,EAAE,SAAS;KACjB;IACD,UAAU,EAAE;QACV,QAAQ,EAAE,QAAQ;QAClB,KAAK,EAAE,SAAS;KACjB;IACD,eAAe,EAAE;QACf,QAAQ,EAAE,QAAQ;QAClB,KAAK,EAAE,SAAS;KACjB;IACD,oBAAoB,EAAE,EAAE;IACxB,cAAc,EAAE,CAAC;IACjB,cAAc,EAAE,eAAe;CACC,CAAA"}
@@ -0,0 +1,7 @@
1
+ export declare class ConfigLoadError extends Error {
2
+ readonly name = "ConfigLoadError";
3
+ readonly sourcePath: string;
4
+ readonly cause: unknown;
5
+ constructor(sourcePath: string, cause: unknown);
6
+ }
7
+ //# sourceMappingURL=config-errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-errors.d.ts","sourceRoot":"","sources":["../../src/config/config-errors.ts"],"names":[],"mappings":"AAAA,qBAAa,eAAgB,SAAQ,KAAK;IACxC,SAAkB,IAAI,qBAAoB;IAC1C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,SAAkB,KAAK,EAAE,OAAO,CAAA;gBAEpB,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO;CAK/C"}
@@ -0,0 +1,11 @@
1
+ export class ConfigLoadError extends Error {
2
+ name = "ConfigLoadError";
3
+ sourcePath;
4
+ cause;
5
+ constructor(sourcePath, cause) {
6
+ super(`Failed to load harness config from ${sourcePath}`, { cause });
7
+ this.sourcePath = sourcePath;
8
+ this.cause = cause;
9
+ }
10
+ }
11
+ //# sourceMappingURL=config-errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-errors.js","sourceRoot":"","sources":["../../src/config/config-errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,eAAgB,SAAQ,KAAK;IACtB,IAAI,GAAG,iBAAiB,CAAA;IACjC,UAAU,CAAQ;IACT,KAAK,CAAS;IAEhC,YAAY,UAAkB,EAAE,KAAc;QAC5C,KAAK,CAAC,sCAAsC,UAAU,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAA;QACpE,IAAI,CAAC,UAAU,GAAG,UAAU,CAAA;QAC5B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;IACpB,CAAC;CACF"}
@@ -0,0 +1,3 @@
1
+ import { type HarnessConfigInput } from "./config-schema.js";
2
+ export declare const readHarnessConfigFile: (sourcePath: string) => Promise<HarnessConfigInput | undefined>;
3
+ //# sourceMappingURL=config-file.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-file.d.ts","sourceRoot":"","sources":["../../src/config/config-file.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,kBAAkB,EAA4B,MAAM,oBAAoB,CAAA;AAEtF,eAAO,MAAM,qBAAqB,GAChC,YAAY,MAAM,KACjB,OAAO,CAAC,kBAAkB,GAAG,SAAS,CAWxC,CAAA"}
@@ -0,0 +1,31 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { parse as parseYaml } from "yaml";
3
+ import { ConfigLoadError } from "./config-errors.js";
4
+ import { HarnessConfigInputSchema } from "./config-schema.js";
5
+ export const readHarnessConfigFile = async (sourcePath) => {
6
+ try {
7
+ const rawDocument = await readFile(sourcePath, "utf8");
8
+ return parseHarnessConfigDocument(sourcePath, rawDocument);
9
+ }
10
+ catch (error) {
11
+ if (isFileNotFoundError(error)) {
12
+ return undefined;
13
+ }
14
+ throw new ConfigLoadError(sourcePath, error);
15
+ }
16
+ };
17
+ const parseHarnessConfigDocument = (sourcePath, rawDocument) => {
18
+ try {
19
+ return HarnessConfigInputSchema.parse(parseYaml(rawDocument));
20
+ }
21
+ catch (error) {
22
+ throw new ConfigLoadError(sourcePath, error);
23
+ }
24
+ };
25
+ const isFileNotFoundError = (error) => {
26
+ if (typeof error !== "object" || error === null) {
27
+ return false;
28
+ }
29
+ return Reflect.get(error, "code") === "ENOENT";
30
+ };
31
+ //# sourceMappingURL=config-file.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-file.js","sourceRoot":"","sources":["../../src/config/config-file.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAE3C,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,MAAM,CAAA;AAEzC,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACpD,OAAO,EAA2B,wBAAwB,EAAE,MAAM,oBAAoB,CAAA;AAEtF,MAAM,CAAC,MAAM,qBAAqB,GAAG,KAAK,EACxC,UAAkB,EACuB,EAAE;IAC3C,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,CAAA;QACtD,OAAO,0BAA0B,CAAC,UAAU,EAAE,WAAW,CAAC,CAAA;IAC5D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,mBAAmB,CAAC,KAAK,CAAC,EAAE,CAAC;YAC/B,OAAO,SAAS,CAAA;QAClB,CAAC;QAED,MAAM,IAAI,eAAe,CAAC,UAAU,EAAE,KAAK,CAAC,CAAA;IAC9C,CAAC;AACH,CAAC,CAAA;AAED,MAAM,0BAA0B,GAAG,CACjC,UAAkB,EAClB,WAAmB,EACC,EAAE;IACtB,IAAI,CAAC;QACH,OAAO,wBAAwB,CAAC,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAA;IAC/D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,eAAe,CAAC,UAAU,EAAE,KAAK,CAAC,CAAA;IAC9C,CAAC;AACH,CAAC,CAAA;AAED,MAAM,mBAAmB,GAAG,CAAC,KAAc,EAAW,EAAE;IACtD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAChD,OAAO,KAAK,CAAA;IACd,CAAC;IAED,OAAO,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,QAAQ,CAAA;AAChD,CAAC,CAAA"}
@@ -0,0 +1,8 @@
1
+ import type { HarnessConfig, HarnessConfigInput } from "./config-schema.js";
2
+ import type { MergedHarnessConfig } from "./config-types.js";
3
+ export declare const mergeHarnessConfig: ({ defaults, projectConfig, runOverride, }: {
4
+ readonly defaults: HarnessConfig;
5
+ readonly projectConfig: HarnessConfigInput | undefined;
6
+ readonly runOverride: HarnessConfigInput | undefined;
7
+ }) => MergedHarnessConfig;
8
+ //# sourceMappingURL=config-merge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-merge.d.ts","sourceRoot":"","sources":["../../src/config/config-merge.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,aAAa,EACb,kBAAkB,EAEnB,MAAM,oBAAoB,CAAA;AAC3B,OAAO,KAAK,EAAE,mBAAmB,EAAwB,MAAM,mBAAmB,CAAA;AAElF,eAAO,MAAM,kBAAkB,GAAI,2CAIhC;IACD,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAA;IAChC,QAAQ,CAAC,aAAa,EAAE,kBAAkB,GAAG,SAAS,CAAA;IACtD,QAAQ,CAAC,WAAW,EAAE,kBAAkB,GAAG,SAAS,CAAA;CACrD,KAAG,mBA8CH,CAAA"}
@@ -0,0 +1,50 @@
1
+ export const mergeHarnessConfig = ({ defaults, projectConfig, runOverride, }) => {
2
+ const projectValue = projectConfig ?? {};
3
+ const overrideValue = runOverride ?? {};
4
+ return {
5
+ schemaVersion: projectValue.schemaVersion ?? defaults.schemaVersion,
6
+ enabled: overrideValue.enabled ?? projectValue.enabled ?? defaults.enabled,
7
+ harness: mergeHarnessProfile({
8
+ defaults: defaults.harness,
9
+ projectProfile: projectValue.harness,
10
+ runOverride: overrideValue.harness,
11
+ }),
12
+ planner: mergeHarnessProfile({
13
+ defaults: defaults.planner,
14
+ projectProfile: projectValue.planner,
15
+ runOverride: overrideValue.planner,
16
+ }),
17
+ worker: mergeHarnessProfile({
18
+ defaults: defaults.worker,
19
+ projectProfile: projectValue.worker,
20
+ runOverride: overrideValue.worker,
21
+ }),
22
+ verifier: mergeHarnessProfile({
23
+ defaults: defaults.verifier,
24
+ projectProfile: projectValue.verifier,
25
+ runOverride: overrideValue.verifier,
26
+ }),
27
+ acceptance: mergeHarnessProfile({
28
+ defaults: defaults.acceptance,
29
+ projectProfile: projectValue.acceptance ?? projectValue.verifier,
30
+ runOverride: overrideValue.acceptance,
31
+ }),
32
+ failureAnalyzer: mergeHarnessProfile({
33
+ defaults: defaults.failureAnalyzer,
34
+ projectProfile: projectValue.failureAnalyzer ?? projectValue.planner,
35
+ runOverride: overrideValue.failureAnalyzer,
36
+ }),
37
+ verificationCommands: overrideValue.verificationCommands ??
38
+ projectValue.verificationCommands ??
39
+ defaults.verificationCommands,
40
+ maxRunAttempts: overrideValue.maxRunAttempts ?? projectValue.maxRunAttempts ?? defaults.maxRunAttempts,
41
+ stateDirectory: overrideValue.stateDirectory ?? projectValue.stateDirectory ?? defaults.stateDirectory,
42
+ };
43
+ };
44
+ const mergeHarnessProfile = ({ defaults, projectProfile, runOverride, }) => {
45
+ return {
46
+ provider: runOverride?.provider ?? projectProfile?.provider ?? defaults.provider,
47
+ model: runOverride?.model ?? projectProfile?.model ?? defaults.model,
48
+ };
49
+ };
50
+ //# sourceMappingURL=config-merge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-merge.js","sourceRoot":"","sources":["../../src/config/config-merge.ts"],"names":[],"mappings":"AAQA,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,EACjC,QAAQ,EACR,aAAa,EACb,WAAW,GAKZ,EAAuB,EAAE;IACxB,MAAM,YAAY,GAAG,aAAa,IAAI,EAAE,CAAA;IACxC,MAAM,aAAa,GAAG,WAAW,IAAI,EAAE,CAAA;IAEvC,OAAO;QACL,aAAa,EAAE,YAAY,CAAC,aAAa,IAAI,QAAQ,CAAC,aAAa;QACnE,OAAO,EAAE,aAAa,CAAC,OAAO,IAAI,YAAY,CAAC,OAAO,IAAI,QAAQ,CAAC,OAAO;QAC1E,OAAO,EAAE,mBAAmB,CAAC;YAC3B,QAAQ,EAAE,QAAQ,CAAC,OAAO;YAC1B,cAAc,EAAE,YAAY,CAAC,OAAO;YACpC,WAAW,EAAE,aAAa,CAAC,OAAO;SACnC,CAAC;QACF,OAAO,EAAE,mBAAmB,CAAC;YAC3B,QAAQ,EAAE,QAAQ,CAAC,OAAO;YAC1B,cAAc,EAAE,YAAY,CAAC,OAAO;YACpC,WAAW,EAAE,aAAa,CAAC,OAAO;SACnC,CAAC;QACF,MAAM,EAAE,mBAAmB,CAAC;YAC1B,QAAQ,EAAE,QAAQ,CAAC,MAAM;YACzB,cAAc,EAAE,YAAY,CAAC,MAAM;YACnC,WAAW,EAAE,aAAa,CAAC,MAAM;SAClC,CAAC;QACF,QAAQ,EAAE,mBAAmB,CAAC;YAC5B,QAAQ,EAAE,QAAQ,CAAC,QAAQ;YAC3B,cAAc,EAAE,YAAY,CAAC,QAAQ;YACrC,WAAW,EAAE,aAAa,CAAC,QAAQ;SACpC,CAAC;QACF,UAAU,EAAE,mBAAmB,CAAC;YAC9B,QAAQ,EAAE,QAAQ,CAAC,UAAU;YAC7B,cAAc,EAAE,YAAY,CAAC,UAAU,IAAI,YAAY,CAAC,QAAQ;YAChE,WAAW,EAAE,aAAa,CAAC,UAAU;SACtC,CAAC;QACF,eAAe,EAAE,mBAAmB,CAAC;YACnC,QAAQ,EAAE,QAAQ,CAAC,eAAe;YAClC,cAAc,EAAE,YAAY,CAAC,eAAe,IAAI,YAAY,CAAC,OAAO;YACpE,WAAW,EAAE,aAAa,CAAC,eAAe;SAC3C,CAAC;QACF,oBAAoB,EAClB,aAAa,CAAC,oBAAoB;YAClC,YAAY,CAAC,oBAAoB;YACjC,QAAQ,CAAC,oBAAoB;QAC/B,cAAc,EACZ,aAAa,CAAC,cAAc,IAAI,YAAY,CAAC,cAAc,IAAI,QAAQ,CAAC,cAAc;QACxF,cAAc,EACZ,aAAa,CAAC,cAAc,IAAI,YAAY,CAAC,cAAc,IAAI,QAAQ,CAAC,cAAc;KACzF,CAAA;AACH,CAAC,CAAA;AAED,MAAM,mBAAmB,GAAG,CAAC,EAC3B,QAAQ,EACR,cAAc,EACd,WAAW,GAKZ,EAAwB,EAAE;IACzB,OAAO;QACL,QAAQ,EAAE,WAAW,EAAE,QAAQ,IAAI,cAAc,EAAE,QAAQ,IAAI,QAAQ,CAAC,QAAQ;QAChF,KAAK,EAAE,WAAW,EAAE,KAAK,IAAI,cAAc,EAAE,KAAK,IAAI,QAAQ,CAAC,KAAK;KACrE,CAAA;AACH,CAAC,CAAA"}
@@ -0,0 +1,135 @@
1
+ import { z } from "zod";
2
+ import type { AvailableModelRegistry, MergedHarnessConfig } from "./config-types.js";
3
+ declare const HarnessProfileInputSchema: z.ZodReadonly<z.ZodObject<{
4
+ provider: z.ZodOptional<z.ZodString>;
5
+ model: z.ZodOptional<z.ZodString>;
6
+ }, z.core.$strict>>;
7
+ export declare const HarnessConfigInputSchema: z.ZodReadonly<z.ZodObject<{
8
+ schemaVersion: z.ZodOptional<z.ZodLiteral<"1.0.0">>;
9
+ enabled: z.ZodOptional<z.ZodBoolean>;
10
+ harness: z.ZodOptional<z.ZodReadonly<z.ZodObject<{
11
+ provider: z.ZodOptional<z.ZodString>;
12
+ model: z.ZodOptional<z.ZodString>;
13
+ }, z.core.$strict>>>;
14
+ planner: z.ZodOptional<z.ZodReadonly<z.ZodObject<{
15
+ provider: z.ZodOptional<z.ZodString>;
16
+ model: z.ZodOptional<z.ZodString>;
17
+ }, z.core.$strict>>>;
18
+ worker: z.ZodOptional<z.ZodReadonly<z.ZodObject<{
19
+ provider: z.ZodOptional<z.ZodString>;
20
+ model: z.ZodOptional<z.ZodString>;
21
+ }, z.core.$strict>>>;
22
+ verifier: z.ZodOptional<z.ZodReadonly<z.ZodObject<{
23
+ provider: z.ZodOptional<z.ZodString>;
24
+ model: z.ZodOptional<z.ZodString>;
25
+ }, z.core.$strict>>>;
26
+ acceptance: z.ZodOptional<z.ZodReadonly<z.ZodObject<{
27
+ provider: z.ZodOptional<z.ZodString>;
28
+ model: z.ZodOptional<z.ZodString>;
29
+ }, z.core.$strict>>>;
30
+ failureAnalyzer: z.ZodOptional<z.ZodReadonly<z.ZodObject<{
31
+ provider: z.ZodOptional<z.ZodString>;
32
+ model: z.ZodOptional<z.ZodString>;
33
+ }, z.core.$strict>>>;
34
+ verificationCommands: z.ZodOptional<z.ZodReadonly<z.ZodArray<z.ZodReadonly<z.ZodObject<{
35
+ name: z.ZodString;
36
+ command: z.ZodString;
37
+ args: z.ZodOptional<z.ZodReadonly<z.ZodArray<z.ZodString>>>;
38
+ workingDirectory: z.ZodString;
39
+ scope: z.ZodEnum<{
40
+ task: "task";
41
+ project: "project";
42
+ integration: "integration";
43
+ }>;
44
+ sideEffectLevel: z.ZodEnum<{
45
+ read_only: "read_only";
46
+ workspace_write: "workspace_write";
47
+ external_side_effect: "external_side_effect";
48
+ }>;
49
+ timeoutMs: z.ZodNumber;
50
+ origin: z.ZodOptional<z.ZodEnum<{
51
+ config: "config";
52
+ planner: "planner";
53
+ worker: "worker";
54
+ repair: "repair";
55
+ }>>;
56
+ requiresConfirmation: z.ZodOptional<z.ZodBoolean>;
57
+ confirmation: z.ZodOptional<z.ZodReadonly<z.ZodObject<{
58
+ approvedBy: z.ZodString;
59
+ reason: z.ZodString;
60
+ }, z.core.$strip>>>;
61
+ allowedEnv: z.ZodOptional<z.ZodReadonly<z.ZodRecord<z.ZodString, z.ZodString>>>;
62
+ }, z.core.$strip>>>>>;
63
+ maxRunAttempts: z.ZodOptional<z.ZodNumber>;
64
+ stateDirectory: z.ZodOptional<z.ZodString>;
65
+ }, z.core.$strict>>;
66
+ export declare const HarnessProfileSchema: z.ZodReadonly<z.ZodObject<{
67
+ provider: z.ZodString;
68
+ model: z.ZodString;
69
+ }, z.core.$strip>>;
70
+ export declare const HarnessConfigSchema: z.ZodReadonly<z.ZodObject<{
71
+ schemaVersion: z.ZodLiteral<"1.0.0">;
72
+ enabled: z.ZodBoolean;
73
+ harness: z.ZodReadonly<z.ZodObject<{
74
+ provider: z.ZodString;
75
+ model: z.ZodString;
76
+ }, z.core.$strip>>;
77
+ planner: z.ZodReadonly<z.ZodObject<{
78
+ provider: z.ZodString;
79
+ model: z.ZodString;
80
+ }, z.core.$strip>>;
81
+ worker: z.ZodReadonly<z.ZodObject<{
82
+ provider: z.ZodString;
83
+ model: z.ZodString;
84
+ }, z.core.$strip>>;
85
+ verifier: z.ZodReadonly<z.ZodObject<{
86
+ provider: z.ZodString;
87
+ model: z.ZodString;
88
+ }, z.core.$strip>>;
89
+ acceptance: z.ZodReadonly<z.ZodObject<{
90
+ provider: z.ZodString;
91
+ model: z.ZodString;
92
+ }, z.core.$strip>>;
93
+ failureAnalyzer: z.ZodReadonly<z.ZodObject<{
94
+ provider: z.ZodString;
95
+ model: z.ZodString;
96
+ }, z.core.$strip>>;
97
+ verificationCommands: z.ZodReadonly<z.ZodArray<z.ZodReadonly<z.ZodObject<{
98
+ name: z.ZodString;
99
+ command: z.ZodString;
100
+ args: z.ZodOptional<z.ZodReadonly<z.ZodArray<z.ZodString>>>;
101
+ workingDirectory: z.ZodString;
102
+ scope: z.ZodEnum<{
103
+ task: "task";
104
+ project: "project";
105
+ integration: "integration";
106
+ }>;
107
+ sideEffectLevel: z.ZodEnum<{
108
+ read_only: "read_only";
109
+ workspace_write: "workspace_write";
110
+ external_side_effect: "external_side_effect";
111
+ }>;
112
+ timeoutMs: z.ZodNumber;
113
+ origin: z.ZodOptional<z.ZodEnum<{
114
+ config: "config";
115
+ planner: "planner";
116
+ worker: "worker";
117
+ repair: "repair";
118
+ }>>;
119
+ requiresConfirmation: z.ZodOptional<z.ZodBoolean>;
120
+ confirmation: z.ZodOptional<z.ZodReadonly<z.ZodObject<{
121
+ approvedBy: z.ZodString;
122
+ reason: z.ZodString;
123
+ }, z.core.$strip>>>;
124
+ allowedEnv: z.ZodOptional<z.ZodReadonly<z.ZodRecord<z.ZodString, z.ZodString>>>;
125
+ }, z.core.$strip>>>>;
126
+ maxRunAttempts: z.ZodNumber;
127
+ stateDirectory: z.ZodString;
128
+ }, z.core.$strict>>;
129
+ export type HarnessAgentProfile = z.infer<typeof HarnessProfileSchema>;
130
+ export type HarnessConfig = z.infer<typeof HarnessConfigSchema>;
131
+ export type HarnessConfigInput = z.infer<typeof HarnessConfigInputSchema>;
132
+ export type HarnessProfileInput = z.infer<typeof HarnessProfileInputSchema>;
133
+ export declare const parseHarnessConfig: (config: MergedHarnessConfig, availableModels?: AvailableModelRegistry) => HarnessConfig;
134
+ export {};
135
+ //# sourceMappingURL=config-schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-schema.d.ts","sourceRoot":"","sources":["../../src/config/config-schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAIvB,OAAO,KAAK,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AAEpF,QAAA,MAAM,yBAAyB;;;mBAMlB,CAAA;AAEb,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mBAexB,CAAA;AAEb,eAAO,MAAM,oBAAoB;;;kBAKpB,CAAA;AAEb,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mBAenB,CAAA;AAEb,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAA;AACtE,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAA;AAC/D,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAA;AACzE,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAA;AAE3E,eAAO,MAAM,kBAAkB,GAC7B,QAAQ,mBAAmB,EAC3B,kBAAkB,sBAAsB,KACvC,aAIF,CAAA"}