agent-hitch 0.2.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (263) hide show
  1. package/README.md +16 -10
  2. package/README.zh-CN.md +13 -8
  3. package/dist/bin/hitch.js +1 -1
  4. package/dist/bin/hitch.js.map +1 -1
  5. package/dist/scripts/check-architecture.js +159 -0
  6. package/dist/scripts/check-architecture.js.map +1 -0
  7. package/dist/scripts/check-release.js +1 -1
  8. package/dist/scripts/check-release.js.map +1 -1
  9. package/dist/src/adapters/catalog.js +55 -0
  10. package/dist/src/adapters/catalog.js.map +1 -0
  11. package/dist/src/adapters/contract.js +2 -0
  12. package/dist/src/adapters/contract.js.map +1 -0
  13. package/dist/src/adapters/discovery.js +22 -0
  14. package/dist/src/adapters/discovery.js.map +1 -0
  15. package/dist/src/adapters/index.js +3 -0
  16. package/dist/src/adapters/index.js.map +1 -0
  17. package/dist/src/adapters/providers/claude.js +69 -0
  18. package/dist/src/adapters/providers/claude.js.map +1 -0
  19. package/dist/src/adapters/providers/codex.js +74 -0
  20. package/dist/src/adapters/providers/codex.js.map +1 -0
  21. package/dist/src/adapters/providers/deepseek.js +51 -0
  22. package/dist/src/adapters/providers/deepseek.js.map +1 -0
  23. package/dist/src/adapters/providers/opencode.js +73 -0
  24. package/dist/src/adapters/providers/opencode.js.map +1 -0
  25. package/dist/src/adapters/providers/pi.js +82 -0
  26. package/dist/src/adapters/providers/pi.js.map +1 -0
  27. package/dist/src/adapters/providers/shared.js +82 -0
  28. package/dist/src/adapters/providers/shared.js.map +1 -0
  29. package/dist/src/artifacts/index.js +3 -0
  30. package/dist/src/artifacts/index.js.map +1 -0
  31. package/dist/src/artifacts/integrity.js +188 -0
  32. package/dist/src/artifacts/integrity.js.map +1 -0
  33. package/dist/src/artifacts/preparer.js +379 -0
  34. package/dist/src/artifacts/preparer.js.map +1 -0
  35. package/dist/src/artifacts/store.js +87 -0
  36. package/dist/src/artifacts/store.js.map +1 -0
  37. package/dist/src/artifacts/types.js +2 -0
  38. package/dist/src/artifacts/types.js.map +1 -0
  39. package/dist/src/backends/contract.js +2 -0
  40. package/dist/src/backends/contract.js.map +1 -0
  41. package/dist/src/{harbor-backend.js → backends/harbor/backend.js} +39 -14
  42. package/dist/src/backends/harbor/backend.js.map +1 -0
  43. package/dist/src/backends/harbor/index.js +4 -0
  44. package/dist/src/backends/harbor/index.js.map +1 -0
  45. package/dist/src/backends/harbor/local-git-transport.js +447 -0
  46. package/dist/src/backends/harbor/local-git-transport.js.map +1 -0
  47. package/dist/src/{eval-tools.js → backends/harbor/tools.js} +2 -6
  48. package/dist/src/backends/harbor/tools.js.map +1 -0
  49. package/dist/src/backends/index.js +4 -0
  50. package/dist/src/backends/index.js.map +1 -0
  51. package/dist/src/cli/arguments.js +123 -0
  52. package/dist/src/cli/arguments.js.map +1 -0
  53. package/dist/src/cli/commands/compare.js +55 -0
  54. package/dist/src/cli/commands/compare.js.map +1 -0
  55. package/dist/src/cli/commands/daemon.js +106 -0
  56. package/dist/src/cli/commands/daemon.js.map +1 -0
  57. package/dist/src/cli/commands/eval.js +126 -0
  58. package/dist/src/cli/commands/eval.js.map +1 -0
  59. package/dist/src/cli/commands/feedback.js +84 -0
  60. package/dist/src/cli/commands/feedback.js.map +1 -0
  61. package/dist/src/cli/commands/inspect.js +20 -0
  62. package/dist/src/cli/commands/inspect.js.map +1 -0
  63. package/dist/src/cli/commands/list.js +17 -0
  64. package/dist/src/cli/commands/list.js.map +1 -0
  65. package/dist/src/cli/commands/prepare.js +21 -0
  66. package/dist/src/cli/commands/prepare.js.map +1 -0
  67. package/dist/src/cli/commands/resolve.js +17 -0
  68. package/dist/src/cli/commands/resolve.js.map +1 -0
  69. package/dist/src/cli/commands/run.js +83 -0
  70. package/dist/src/cli/commands/run.js.map +1 -0
  71. package/dist/src/cli/commands/runs.js +45 -0
  72. package/dist/src/cli/commands/runs.js.map +1 -0
  73. package/dist/src/cli/commands/trajectory.js +31 -0
  74. package/dist/src/cli/commands/trajectory.js.map +1 -0
  75. package/dist/src/cli/commands/workspace.js +44 -0
  76. package/dist/src/cli/commands/workspace.js.map +1 -0
  77. package/dist/src/cli/index.js +2 -0
  78. package/dist/src/cli/index.js.map +1 -0
  79. package/dist/src/cli/main.js +48 -0
  80. package/dist/src/cli/main.js.map +1 -0
  81. package/dist/src/cli/output.js +96 -0
  82. package/dist/src/cli/output.js.map +1 -0
  83. package/dist/src/controller-runtime/index.js +3 -0
  84. package/dist/src/controller-runtime/index.js.map +1 -0
  85. package/dist/src/controller-runtime/store.js +2 -7
  86. package/dist/src/controller-runtime/store.js.map +1 -1
  87. package/dist/src/daemon/auth.js +108 -0
  88. package/dist/src/daemon/auth.js.map +1 -0
  89. package/dist/src/daemon/client.js +76 -0
  90. package/dist/src/daemon/client.js.map +1 -0
  91. package/dist/src/daemon/index.js +5 -0
  92. package/dist/src/daemon/index.js.map +1 -0
  93. package/dist/src/daemon/launcher.js +24 -0
  94. package/dist/src/daemon/launcher.js.map +1 -0
  95. package/dist/src/{scheduler.js → daemon/scheduler.js} +6 -7
  96. package/dist/src/daemon/scheduler.js.map +1 -0
  97. package/dist/src/{daemon.js → daemon/server.js} +10 -155
  98. package/dist/src/daemon/server.js.map +1 -0
  99. package/dist/src/domain/artifacts.js +2 -0
  100. package/dist/src/domain/artifacts.js.map +1 -0
  101. package/dist/src/domain/controller-runtime.js +2 -0
  102. package/dist/src/domain/controller-runtime.js.map +1 -0
  103. package/dist/src/domain/eval-records.js +2 -0
  104. package/dist/src/domain/eval-records.js.map +1 -0
  105. package/dist/src/domain/evals.js +2 -0
  106. package/dist/src/domain/evals.js.map +1 -0
  107. package/dist/src/domain/feedback.js +2 -0
  108. package/dist/src/domain/feedback.js.map +1 -0
  109. package/dist/src/domain/{types.js → ids.js} +1 -1
  110. package/dist/src/domain/ids.js.map +1 -0
  111. package/dist/src/domain/index.js +11 -0
  112. package/dist/src/domain/index.js.map +1 -0
  113. package/dist/src/domain/revisions.js +2 -0
  114. package/dist/src/domain/revisions.js.map +1 -0
  115. package/dist/src/domain/runs.js +3 -0
  116. package/dist/src/domain/runs.js.map +1 -0
  117. package/dist/src/domain/trajectories.js +2 -0
  118. package/dist/src/domain/trajectories.js.map +1 -0
  119. package/dist/src/domain/{validate.js → validation.js} +194 -5
  120. package/dist/src/domain/validation.js.map +1 -0
  121. package/dist/src/domain/workspaces.js +2 -0
  122. package/dist/src/domain/workspaces.js.map +1 -0
  123. package/dist/src/evals/events.js +67 -0
  124. package/dist/src/evals/events.js.map +1 -0
  125. package/dist/src/evals/index.js +5 -0
  126. package/dist/src/evals/index.js.map +1 -0
  127. package/dist/src/evals/records.js +55 -0
  128. package/dist/src/evals/records.js.map +1 -0
  129. package/dist/src/evals/request.js +109 -0
  130. package/dist/src/evals/request.js.map +1 -0
  131. package/dist/src/evals/service.js +227 -0
  132. package/dist/src/evals/service.js.map +1 -0
  133. package/dist/src/evals/trial-import.js +394 -0
  134. package/dist/src/evals/trial-import.js.map +1 -0
  135. package/dist/src/feedback/index.js +2 -0
  136. package/dist/src/feedback/index.js.map +1 -0
  137. package/dist/src/feedback/service.js +3 -4
  138. package/dist/src/feedback/service.js.map +1 -1
  139. package/dist/src/{config.js → foundation/config.js} +1 -0
  140. package/dist/src/foundation/config.js.map +1 -0
  141. package/dist/src/foundation/errors.js.map +1 -0
  142. package/dist/src/foundation/executable.js +135 -0
  143. package/dist/src/foundation/executable.js.map +1 -0
  144. package/dist/src/foundation/fs.js.map +1 -0
  145. package/dist/src/foundation/hash.js +24 -0
  146. package/dist/src/foundation/hash.js.map +1 -0
  147. package/dist/src/foundation/index.js +11 -0
  148. package/dist/src/foundation/index.js.map +1 -0
  149. package/dist/src/foundation/line-stream.js.map +1 -0
  150. package/dist/src/foundation/locks.js +114 -0
  151. package/dist/src/foundation/locks.js.map +1 -0
  152. package/dist/src/{package-root.js → foundation/package-root.js} +3 -2
  153. package/dist/src/foundation/package-root.js.map +1 -0
  154. package/dist/src/foundation/process.js.map +1 -0
  155. package/dist/src/revisions/index.js +4 -0
  156. package/dist/src/revisions/index.js.map +1 -0
  157. package/dist/src/{harness-reference.js → revisions/reference.js} +16 -2
  158. package/dist/src/revisions/reference.js.map +1 -0
  159. package/dist/src/revisions/resolver.js +25 -0
  160. package/dist/src/revisions/resolver.js.map +1 -0
  161. package/dist/src/revisions/sources/git.js +180 -0
  162. package/dist/src/revisions/sources/git.js.map +1 -0
  163. package/dist/src/revisions/sources/installed.js +45 -0
  164. package/dist/src/revisions/sources/installed.js.map +1 -0
  165. package/dist/src/revisions/sources/npm.js +97 -0
  166. package/dist/src/revisions/sources/npm.js.map +1 -0
  167. package/dist/src/runs/compare.js +132 -0
  168. package/dist/src/runs/compare.js.map +1 -0
  169. package/dist/src/{events.js → runs/events.js} +1 -2
  170. package/dist/src/runs/events.js.map +1 -0
  171. package/dist/src/{engine.js → runs/executor.js} +166 -151
  172. package/dist/src/runs/executor.js.map +1 -0
  173. package/dist/src/runs/finalizer.js +22 -0
  174. package/dist/src/runs/finalizer.js.map +1 -0
  175. package/dist/src/runs/identity.js +35 -0
  176. package/dist/src/runs/identity.js.map +1 -0
  177. package/dist/src/runs/index.js +11 -0
  178. package/dist/src/runs/index.js.map +1 -0
  179. package/dist/src/runs/manifest.js +70 -0
  180. package/dist/src/runs/manifest.js.map +1 -0
  181. package/dist/src/runs/outcome.js +49 -0
  182. package/dist/src/runs/outcome.js.map +1 -0
  183. package/dist/src/runs/query.js +104 -0
  184. package/dist/src/runs/query.js.map +1 -0
  185. package/dist/src/runs/queued.js +54 -0
  186. package/dist/src/runs/queued.js.map +1 -0
  187. package/dist/src/runs/records.js +288 -0
  188. package/dist/src/runs/records.js.map +1 -0
  189. package/dist/src/runs/request.js +169 -0
  190. package/dist/src/runs/request.js.map +1 -0
  191. package/dist/src/trajectories/format.js +1 -1
  192. package/dist/src/trajectories/format.js.map +1 -1
  193. package/dist/src/trajectories/index.js +7 -0
  194. package/dist/src/trajectories/index.js.map +1 -0
  195. package/dist/src/trajectories/projector.js +1 -1
  196. package/dist/src/trajectories/projector.js.map +1 -1
  197. package/dist/src/trajectories/provider-capture.js +133 -0
  198. package/dist/src/trajectories/provider-capture.js.map +1 -0
  199. package/dist/src/trajectories/providers/deepseek.js +179 -0
  200. package/dist/src/trajectories/providers/deepseek.js.map +1 -0
  201. package/dist/src/trajectories/store.js +148 -8
  202. package/dist/src/trajectories/store.js.map +1 -1
  203. package/dist/src/workspaces/copy.js +142 -0
  204. package/dist/src/workspaces/copy.js.map +1 -0
  205. package/dist/src/workspaces/digest.js +47 -0
  206. package/dist/src/workspaces/digest.js.map +1 -0
  207. package/dist/src/workspaces/git.js +164 -0
  208. package/dist/src/workspaces/git.js.map +1 -0
  209. package/dist/src/workspaces/index.js +6 -0
  210. package/dist/src/workspaces/index.js.map +1 -0
  211. package/dist/src/workspaces/lifecycle.js +313 -0
  212. package/dist/src/workspaces/lifecycle.js.map +1 -0
  213. package/dist/src/workspaces/planner.js +80 -0
  214. package/dist/src/workspaces/planner.js.map +1 -0
  215. package/dist/src/workspaces/store.js +25 -0
  216. package/dist/src/workspaces/store.js.map +1 -0
  217. package/dist/src/workspaces/types.js +4 -0
  218. package/dist/src/workspaces/types.js.map +1 -0
  219. package/dist/src/workspaces/utils.js +56 -0
  220. package/dist/src/workspaces/utils.js.map +1 -0
  221. package/docs/schemas/eval-request.schema.json +2 -0
  222. package/docs/schemas/eval-result.schema.json +36 -1
  223. package/docs/schemas/local-git-transport-manifest.schema.json +34 -0
  224. package/docs/schemas/result.schema.json +9 -0
  225. package/docs/schemas/run-context.schema.json +39 -0
  226. package/docs/schemas/run-manifest.schema.json +81 -0
  227. package/docs/schemas/run-request.schema.json +16 -1
  228. package/docs/schemas/trajectory-ref.schema.json +66 -23
  229. package/integrations/harbor/hitch_harbor_agent.py +375 -1
  230. package/package.json +21 -3
  231. package/dist/src/adapters.js +0 -461
  232. package/dist/src/adapters.js.map +0 -1
  233. package/dist/src/artifacts.js +0 -1081
  234. package/dist/src/artifacts.js.map +0 -1
  235. package/dist/src/cli.js +0 -699
  236. package/dist/src/cli.js.map +0 -1
  237. package/dist/src/config.js.map +0 -1
  238. package/dist/src/daemon.js.map +0 -1
  239. package/dist/src/domain/types.js.map +0 -1
  240. package/dist/src/domain/validate.js.map +0 -1
  241. package/dist/src/engine.js.map +0 -1
  242. package/dist/src/errors.js.map +0 -1
  243. package/dist/src/eval-tools.js.map +0 -1
  244. package/dist/src/evals.js +0 -313
  245. package/dist/src/evals.js.map +0 -1
  246. package/dist/src/events.js.map +0 -1
  247. package/dist/src/fs.js.map +0 -1
  248. package/dist/src/harbor-backend.js.map +0 -1
  249. package/dist/src/harness-reference.js.map +0 -1
  250. package/dist/src/line-stream.js.map +0 -1
  251. package/dist/src/locks.js +0 -38
  252. package/dist/src/locks.js.map +0 -1
  253. package/dist/src/package-root.js.map +0 -1
  254. package/dist/src/process.js.map +0 -1
  255. package/dist/src/registry.js +0 -81
  256. package/dist/src/registry.js.map +0 -1
  257. package/dist/src/scheduler.js.map +0 -1
  258. package/dist/src/workspaces.js +0 -858
  259. package/dist/src/workspaces.js.map +0 -1
  260. /package/dist/src/{errors.js → foundation/errors.js} +0 -0
  261. /package/dist/src/{fs.js → foundation/fs.js} +0 -0
  262. /package/dist/src/{line-stream.js → foundation/line-stream.js} +0 -0
  263. /package/dist/src/{process.js → foundation/process.js} +0 -0
package/README.md CHANGED
@@ -154,15 +154,18 @@ records:
154
154
 
155
155
  - normalized JSONL events describe Hitch's control plane, including resolution,
156
156
  preparation, process lifecycle, cancellation, and terminal status;
157
- - a DSH-compatible canonical trajectory records the agent session, messages,
158
- tool calls, and tool results with an explicit fidelity level;
159
- - `trajectory.ref.json` binds the run to the canonical trajectory and its
160
- SHA-256 digest; and
157
+ - supported adapters preserve redacted provider-native events before any
158
+ translation, while a DSH-compatible canonical trajectory remains available
159
+ as a derived view;
160
+ - `trajectory.ref.json` V2 binds every trajectory file by relative path, byte
161
+ size, role, and SHA-256 digest; and
161
162
  - feedback sidecars attach versioned positive or negative ratings and notes to
162
163
  assistant messages without rewriting the immutable trajectory.
163
164
 
164
165
  ```bash
165
166
  hitch trajectory inspect RUN_ID
167
+ hitch runs list --context-kind benchmark_task --json
168
+ hitch compare model --benchmark BENCHMARK --task TASK --json
166
169
  hitch feedback list RUN_ID --json
167
170
  hitch feedback put RUN_ID \
168
171
  --message MESSAGE_ID \
@@ -204,11 +207,14 @@ The resulting eval record links the request, resolved revision, controller
204
207
  runtime, backend configuration and logs, normalized result, reward summary, and
205
208
  trajectory evidence.
206
209
 
207
- Eval accepts exact `version:` refs and `commit:` refs backed by a registered
208
- remote source. Installed executables and local `git+file://` refs are rejected
209
- because they are not portable into Harbor containers. Common provider
210
- credentials are forwarded by environment-variable reference; use `--pass-env
211
- NAME` for an additional variable.
210
+ Eval accepts exact `version:` refs, registered `commit:` refs, and explicit
211
+ local `git+file:///absolute/repo#<full-lowercase-commit>` refs. For local Git,
212
+ Hitch transports a verified exact-commit object pack into each Harbor trial;
213
+ uncommitted files, Git config, credentials, and unrelated history are excluded.
214
+ The local repository must be clean and abbreviated commits, branches, tags,
215
+ `HEAD`, and installed executables are rejected. Common provider credentials are
216
+ forwarded by environment-variable reference; use `--pass-env NAME` for an
217
+ additional variable.
212
218
 
213
219
  See [Harbor-backed agent evals](docs/evals.md) for setup, portability rules, and
214
220
  the execution boundary.
@@ -304,7 +310,7 @@ Workspace isolation is not a process security sandbox.
304
310
 
305
311
  ## Planned work
306
312
 
307
- - [ ] Comparison primitives for harness revisions and their evidence
313
+ - [x] Strict model/harness comparison primitives over run evidence
308
314
  - [ ] Named candidate and champion references
309
315
  - [ ] Promotion and rollback records without embedding promotion policy
310
316
  - [ ] Remote artifact and evidence synchronization
package/README.zh-CN.md CHANGED
@@ -142,14 +142,17 @@ Hitch 将生命周期事件与智能体轨迹保存为两类相关但相互独
142
142
 
143
143
  - 规范化 JSONL 事件描述 Hitch 的控制平面,包括解析、准备、进程生命周期、
144
144
  取消和最终状态;
145
- - 兼容 DSH 的规范化轨迹以明确的保真度记录智能体会话、消息、工具调用与
146
- 工具结果;
147
- - `trajectory.ref.json` 将运行与规范化轨迹及其 SHA-256 摘要绑定;
145
+ - 支持结构化输出的 adapter 会先保存经过显式脱敏的 provider-native 事件,
146
+ 兼容 DSH 的规范化轨迹则作为派生视图继续提供;
147
+ - `trajectory.ref.json` V2 通过相对路径、文件角色、字节数与 SHA-256 摘要
148
+ 绑定完整轨迹文件集;
148
149
  - 反馈 sidecar 可以为助手消息附加带版本的正向或负向评分与备注,而无需
149
150
  改写不可变轨迹。
150
151
 
151
152
  ```bash
152
153
  hitch trajectory inspect RUN_ID
154
+ hitch runs list --context-kind benchmark_task --json
155
+ hitch compare model --benchmark BENCHMARK --task TASK --json
153
156
  hitch feedback list RUN_ID --json
154
157
  hitch feedback put RUN_ID \
155
158
  --message MESSAGE_ID \
@@ -188,10 +191,12 @@ Harbor 负责任务发现、Docker 生命周期、验证与奖励。它的自定
188
191
  并在 `/app` 中执行选定的 Harness 版本。生成的评测记录会关联请求、已解析
189
192
  版本、控制器运行时、后端配置与日志、规范化结果、奖励摘要和轨迹证据。
190
193
 
191
- 评测接受由已注册远端源码支持的确定 `version:` 引用和 `commit:` 引用。
192
- 已安装可执行文件与本地 `git+file://` 引用无法移植到 Harbor 容器,因此会被
193
- 拒绝。常用的模型供应商凭证通过环境变量引用转发;使用 `--pass-env NAME`
194
- 可以额外传入一个环境变量。
194
+ 评测接受确定的 `version:`、已注册远端的 `commit:`,以及显式本地
195
+ `git+file:///绝对路径#<完整小写commit>` 引用。本地 Git 评测只会将该提交
196
+ 所需并经过校验的 Git 对象包传入 Harbor trial;未提交文件、Git 配置、凭证
197
+ 和无关历史不会被携带。仓库必须干净,缩写 commit、分支、tag、`HEAD` 和
198
+ 已安装可执行文件会被拒绝。常用模型供应商凭证通过环境变量引用转发;使用
199
+ `--pass-env NAME` 可以额外传入一个环境变量。
195
200
 
196
201
  有关安装、可移植性规则和执行边界,请参阅
197
202
  [Harbor 智能体评测](docs/evals.md)。
@@ -286,7 +291,7 @@ hitch daemon cancel RUN_ID
286
291
 
287
292
  ## 计划中的工作
288
293
 
289
- - [ ] Harness 版本及其证据的比较原语
294
+ - [x] 基于 run 证据的严格模型/Harness 比较原语
290
295
  - [ ] 命名的候选与 champion 引用
291
296
  - [ ] 不内嵌晋级策略的晋级与回滚记录
292
297
  - [ ] 远端制品与证据同步
package/dist/bin/hitch.js CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { main } from "../src/cli.js";
2
+ import { main } from "../src/cli/index.js";
3
3
  main(process.argv.slice(2)).catch((error) => {
4
4
  const message = error instanceof Error ? error.message : String(error);
5
5
  process.stderr.write(`hitch: ${message}\n`);
@@ -1 +1 @@
1
- {"version":3,"file":"hitch.js","sourceRoot":"","sources":["../../bin/hitch.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAErC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;IACnD,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,OAAO,IAAI,CAAC,CAAC;IAC5C,MAAM,QAAQ,GAAI,KAAgC,CAAC,QAAQ,CAAC;IAC5D,OAAO,CAAC,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAkB,CAAC,CAAC,CAAC,EAAE,CAAC;AAC1E,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"hitch.js","sourceRoot":"","sources":["../../bin/hitch.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAE3C,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;IACnD,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,OAAO,IAAI,CAAC,CAAC;IAC5C,MAAM,QAAQ,GAAI,KAAgC,CAAC,QAAQ,CAAC;IAC5D,OAAO,CAAC,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAkB,CAAC,CAAC,CAAC,EAAE,CAAC;AAC1E,CAAC,CAAC,CAAC"}
@@ -0,0 +1,159 @@
1
+ import { readFile, readdir } from "node:fs/promises";
2
+ import path from "node:path";
3
+ const SRC_ROOT = path.resolve("src");
4
+ const MODULES = new Set([
5
+ "domain", "foundation", "adapters", "revisions", "artifacts", "controller-runtime",
6
+ "trajectories", "feedback", "workspaces", "runs", "backends", "evals", "daemon", "cli",
7
+ ]);
8
+ const ALLOWED = new Map([
9
+ ["domain", new Set()],
10
+ ["foundation", new Set(["domain"])],
11
+ ["adapters", new Set(["domain", "foundation"])],
12
+ ["revisions", new Set(["domain", "foundation", "adapters"])],
13
+ ["artifacts", new Set(["domain", "foundation", "adapters", "revisions"])],
14
+ ["controller-runtime", new Set(["domain", "foundation"])],
15
+ ["trajectories", new Set(["domain", "foundation", "adapters"])],
16
+ ["feedback", new Set(["domain", "foundation", "trajectories"])],
17
+ ["workspaces", new Set(["domain", "foundation"])],
18
+ ["runs", new Set(["domain", "foundation", "adapters", "revisions", "artifacts", "workspaces", "trajectories"])],
19
+ ["backends", new Set(["domain", "foundation"])],
20
+ ["evals", new Set(["domain", "foundation", "backends", "runs", "artifacts", "revisions", "controller-runtime", "workspaces", "trajectories"])],
21
+ ["daemon", new Set(["domain", "foundation", "runs", "workspaces"])],
22
+ ["cli", new Set([...MODULES].filter((name) => name !== "cli"))],
23
+ ]);
24
+ const violations = [];
25
+ const edges = [];
26
+ const files = await sourceFiles(SRC_ROOT);
27
+ for (const file of files) {
28
+ const relative = slash(path.relative(SRC_ROOT, file));
29
+ const content = await readFile(file, "utf8");
30
+ const lines = content.split(/\r?\n/);
31
+ const sourceModule = topModule(relative);
32
+ if (!relative.includes("/")) {
33
+ report(relative, 1, "root-source", "root-level source files are not allowed", "move the public API to the owning module facade");
34
+ }
35
+ if (lines.length - 1 > 500) {
36
+ report(relative, 501, "file-size", `implementation has ${lines.length - 1} lines (maximum 500)`, "split by responsibility before adding more behavior");
37
+ }
38
+ if (path.basename(file) === "index.ts")
39
+ checkFacade(relative, lines);
40
+ for (const imported of imports(content)) {
41
+ if (sourceModule === "domain" && imported.specifier.startsWith("node:")) {
42
+ report(relative, imported.line, "domain-purity", `domain imports Node.js builtin ${imported.specifier}`, "move I/O or runtime behavior to foundation");
43
+ }
44
+ if (relative.startsWith("cli/commands/") && imported.specifier.startsWith("node:fs")) {
45
+ report(relative, imported.line, "cli-command-io", `CLI command imports filesystem builtin ${imported.specifier}`, "move state access behind the owning module facade");
46
+ }
47
+ if (!imported.specifier.startsWith("."))
48
+ continue;
49
+ const targetFile = resolveSource(file, imported.specifier);
50
+ if (!targetFile.startsWith(`${SRC_ROOT}${path.sep}`))
51
+ continue;
52
+ const targetRelative = slash(path.relative(SRC_ROOT, targetFile));
53
+ const targetModule = topModule(targetRelative);
54
+ if (!targetModule)
55
+ continue;
56
+ if (sourceModule && targetModule && sourceModule !== targetModule) {
57
+ if (!ALLOWED.get(sourceModule)?.has(targetModule)) {
58
+ report(relative, imported.line, "dependency-direction", `${sourceModule} may not depend on ${targetModule}`, `move the contract down or call ${targetModule}/index.ts from an allowed owner`);
59
+ }
60
+ if (targetRelative !== `${targetModule}/index.ts`) {
61
+ report(relative, imported.line, "deep-import", `cross-module deep import targets ${targetRelative}`, `import from ${targetModule}/index.ts`);
62
+ }
63
+ edges.push({ sourceFile: relative, sourceModule, targetFile: targetRelative, targetModule, line: imported.line });
64
+ }
65
+ }
66
+ }
67
+ checkModuleCycles(edges);
68
+ if (violations.length > 0) {
69
+ for (const item of violations.sort((a, b) => a.file.localeCompare(b.file) || a.line - b.line || a.rule.localeCompare(b.rule))) {
70
+ process.stderr.write(`${item.file}:${item.line} [${item.rule}] ${item.message}; ${item.suggestion}\n`);
71
+ }
72
+ process.stderr.write(`architecture check failed with ${violations.length} violation(s)\n`);
73
+ process.exitCode = 1;
74
+ }
75
+ else {
76
+ process.stdout.write(`architecture check passed (${files.length} source files, ${edges.length} cross-module edges)\n`);
77
+ }
78
+ async function sourceFiles(directory) {
79
+ const result = [];
80
+ for (const entry of await readdir(directory, { withFileTypes: true })) {
81
+ const candidate = path.join(directory, entry.name);
82
+ if (entry.isDirectory())
83
+ result.push(...await sourceFiles(candidate));
84
+ else if (entry.isFile() && entry.name.endsWith(".ts"))
85
+ result.push(candidate);
86
+ }
87
+ return result.sort();
88
+ }
89
+ function imports(content) {
90
+ const result = [];
91
+ const pattern = /(?:\bfrom\s+|\bimport\s*)["']([^"']+)["']/g;
92
+ for (const match of content.matchAll(pattern)) {
93
+ result.push({ specifier: match[1], line: 1 + content.slice(0, match.index).split("\n").length - 1 });
94
+ }
95
+ return result;
96
+ }
97
+ function resolveSource(sourceFile, specifier) {
98
+ const raw = path.resolve(path.dirname(sourceFile), specifier);
99
+ if (raw.endsWith(".js"))
100
+ return `${raw.slice(0, -3)}.ts`;
101
+ if (path.extname(raw))
102
+ return raw;
103
+ return path.join(raw, "index.ts");
104
+ }
105
+ function topModule(relative) {
106
+ const [first, second] = relative.split("/");
107
+ return second && first && MODULES.has(first) ? first : null;
108
+ }
109
+ function checkFacade(relative, lines) {
110
+ lines.forEach((line, index) => {
111
+ const trimmed = line.trim();
112
+ if (!trimmed || trimmed.startsWith("//") || trimmed.startsWith("/**") || trimmed.startsWith("*") || trimmed.startsWith("*/") || trimmed.startsWith("export "))
113
+ return;
114
+ report(relative, index + 1, "facade-logic", "index.ts contains non-export logic", "move logic to an implementation file and export its public symbol");
115
+ });
116
+ }
117
+ function checkModuleCycles(importEdges) {
118
+ const graph = new Map();
119
+ for (const edge of importEdges) {
120
+ const targets = graph.get(edge.sourceModule) || new Set();
121
+ targets.add(edge.targetModule);
122
+ graph.set(edge.sourceModule, targets);
123
+ }
124
+ const visiting = new Set();
125
+ const visited = new Set();
126
+ const stack = [];
127
+ const emitted = new Set();
128
+ const visit = (module) => {
129
+ if (visited.has(module))
130
+ return;
131
+ if (visiting.has(module)) {
132
+ const start = stack.indexOf(module);
133
+ const cycle = [...stack.slice(start), module];
134
+ const key = cycle.join(" -> ");
135
+ if (!emitted.has(key)) {
136
+ emitted.add(key);
137
+ const edge = importEdges.find((item) => item.sourceModule === cycle.at(-2) && item.targetModule === module);
138
+ report(edge?.sourceFile || `${module}/index.ts`, edge?.line || 1, "module-cycle", key, "invert the shared contract into domain or foundation");
139
+ }
140
+ return;
141
+ }
142
+ visiting.add(module);
143
+ stack.push(module);
144
+ for (const target of graph.get(module) || [])
145
+ visit(target);
146
+ stack.pop();
147
+ visiting.delete(module);
148
+ visited.add(module);
149
+ };
150
+ for (const module of MODULES)
151
+ visit(module);
152
+ }
153
+ function report(file, line, rule, message, suggestion) {
154
+ violations.push({ file, line, rule, message, suggestion });
155
+ }
156
+ function slash(value) {
157
+ return value.split(path.sep).join("/");
158
+ }
159
+ //# sourceMappingURL=check-architecture.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-architecture.js","sourceRoot":"","sources":["../../scripts/check-architecture.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { packageVersion } from "../src/package-root.js";
2
+ import { packageVersion } from "../src/foundation/index.js";
3
3
  const [tag, prereleaseValue] = process.argv.slice(2);
4
4
  const version = packageVersion();
5
5
  const expectedTag = `v${version}`;
@@ -1 +1 @@
1
- {"version":3,"file":"check-release.js","sourceRoot":"","sources":["../../scripts/check-release.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD,MAAM,CAAC,GAAG,EAAE,eAAe,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACrD,MAAM,OAAO,GAAG,cAAc,EAAE,CAAC;AACjC,MAAM,WAAW,GAAG,IAAI,OAAO,EAAE,CAAC;AAElC,IAAI,GAAG,KAAK,WAAW,EAAE,CAAC;IACxB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,GAAG,IAAI,WAAW,mCAAmC,OAAO,cAAc,WAAW,IAAI,CAAC,CAAC;IAC/H,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACvB,CAAC;KAAM,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,eAAe,IAAI,EAAE,CAAC,EAAE,CAAC;IAClE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,kDAAkD,CAAC,CAAC;IACzE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACvB,CAAC;KAAM,CAAC;IACN,MAAM,mBAAmB,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IAClD,MAAM,mBAAmB,GAAG,eAAe,KAAK,MAAM,CAAC;IACvD,IAAI,mBAAmB,KAAK,mBAAmB,EAAE,CAAC;QAChD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,mBAAmB,OAAO,6CAA6C,CAAC,CAAC;QAC9F,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,GAAG,4BAA4B,OAAO,IAAI,CAAC,CAAC;IAC9E,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"check-release.js","sourceRoot":"","sources":["../../scripts/check-release.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAE5D,MAAM,CAAC,GAAG,EAAE,eAAe,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACrD,MAAM,OAAO,GAAG,cAAc,EAAE,CAAC;AACjC,MAAM,WAAW,GAAG,IAAI,OAAO,EAAE,CAAC;AAElC,IAAI,GAAG,KAAK,WAAW,EAAE,CAAC;IACxB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,GAAG,IAAI,WAAW,mCAAmC,OAAO,cAAc,WAAW,IAAI,CAAC,CAAC;IAC/H,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACvB,CAAC;KAAM,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,eAAe,IAAI,EAAE,CAAC,EAAE,CAAC;IAClE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,kDAAkD,CAAC,CAAC;IACzE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACvB,CAAC;KAAM,CAAC;IACN,MAAM,mBAAmB,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IAClD,MAAM,mBAAmB,GAAG,eAAe,KAAK,MAAM,CAAC;IACvD,IAAI,mBAAmB,KAAK,mBAAmB,EAAE,CAAC;QAChD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,mBAAmB,OAAO,6CAA6C,CAAC,CAAC;QAC9F,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,GAAG,4BAA4B,OAAO,IAAI,CAAC,CAAC;IAC9E,CAAC;AACH,CAAC"}
@@ -0,0 +1,55 @@
1
+ import path from "node:path";
2
+ import { HitchError } from "../foundation/index.js";
3
+ import { claudeAdapter } from "./providers/claude.js";
4
+ import { codexAdapter } from "./providers/codex.js";
5
+ import { deepseekAdapter } from "./providers/deepseek.js";
6
+ import { opencodeAdapter } from "./providers/opencode.js";
7
+ import { piAdapter } from "./providers/pi.js";
8
+ const definitions = Object.fromEntries([codexAdapter, claudeAdapter, piAdapter, opencodeAdapter, deepseekAdapter].map((definition) => [definition.id, definition]));
9
+ export function listDefinitions() {
10
+ return Object.values(definitions).map(publicDefinition);
11
+ }
12
+ export function getAdapter(id) {
13
+ const adapter = definitions[id];
14
+ if (!adapter)
15
+ throw new HitchError(`unknown harness: ${id}`, { code: "harness_not_found", exitCode: 3 });
16
+ return adapter;
17
+ }
18
+ export function publicDefinition(definition) {
19
+ const revisionSources = definition.revision_sources || {};
20
+ return {
21
+ id: definition.id,
22
+ display_name: definition.display_name,
23
+ command: definition.command,
24
+ path_env: definition.path_env,
25
+ capabilities: definition.capabilities,
26
+ revision_selectors: ["installed", ...Object.keys(revisionSources)],
27
+ revision_sources: Object.fromEntries(Object.entries(revisionSources).map(([selector, source]) => [
28
+ selector,
29
+ {
30
+ type: source.type,
31
+ ...(source.package ? { package: source.package } : {}),
32
+ ...(source.packages ? { packages: source.packages } : {}),
33
+ ...(source.url ? { url: source.url } : {}),
34
+ },
35
+ ])),
36
+ };
37
+ }
38
+ export function normalizeRequest(input) {
39
+ const cwd = path.resolve(typeof input?.cwd === "string" && input.cwd ? input.cwd : process.cwd());
40
+ const harnessRef = typeof input?.harness_ref === "string"
41
+ ? input.harness_ref.trim()
42
+ : typeof input?.agent === "string" && input.agent.trim()
43
+ ? `${input.agent.trim()}@installed`
44
+ : "";
45
+ return {
46
+ harness_ref: harnessRef,
47
+ model: typeof input?.model === "string" ? input.model : "",
48
+ cwd,
49
+ workspace_mode: typeof input?.workspace_mode === "string" ? input.workspace_mode : "shared",
50
+ prompt: typeof input?.prompt === "string" ? input.prompt : "",
51
+ timeout_ms: typeof input?.timeout_ms === "number" ? input.timeout_ms : 0,
52
+ agent_args: Array.isArray(input?.agent_args) ? [...input.agent_args] : [],
53
+ };
54
+ }
55
+ //# sourceMappingURL=catalog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../../src/adapters/catalog.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=contract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contract.js","sourceRoot":"","sources":["../../../src/adapters/contract.ts"],"names":[],"mappings":""}
@@ -0,0 +1,22 @@
1
+ import { detectVersion, fingerprintExecutable, resolveExecutable } from "../foundation/index.js";
2
+ export { detectVersion, fingerprintExecutable, resolveExecutable, selectVersionLine } from "../foundation/index.js";
3
+ import { getAdapter, listDefinitions, publicDefinition } from "./catalog.js";
4
+ export async function discoverAgents({ env = process.env, probeVersions = true, } = {}) {
5
+ return Promise.all(listDefinitions().map((definition) => inspectDefinition(definition, { env, probeVersions })));
6
+ }
7
+ export async function inspectAgent(id, { env = process.env, probeVersions = true } = {}) {
8
+ const definition = publicDefinition(getAdapter(id));
9
+ return inspectDefinition(definition, { env, probeVersions });
10
+ }
11
+ async function inspectDefinition(definition, { env, probeVersions }) {
12
+ const configured = env[definition.path_env]?.trim() || definition.command;
13
+ const executable = await resolveExecutable(configured, env.PATH || "");
14
+ if (!executable)
15
+ return { ...definition, status: "unavailable" };
16
+ const version = probeVersions
17
+ ? await detectVersion(executable, getAdapter(definition.id).version_args)
18
+ : "";
19
+ const identity = await fingerprintExecutable(executable);
20
+ return { ...definition, status: "available", executable, version, identity };
21
+ }
22
+ //# sourceMappingURL=discovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery.js","sourceRoot":"","sources":["../../../src/adapters/discovery.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AACjG,OAAO,EAAE,aAAa,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AACpH,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAU7E,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,EACnC,GAAG,GAAG,OAAO,CAAC,GAAG,EACjB,aAAa,GAAG,IAAI,MACoC,EAAE;IAC1D,OAAO,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,iBAAiB,CAAC,UAAU,EAAE,EAAE,GAAG,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,CAAC;AACnH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,EAAU,EACV,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,aAAa,GAAG,IAAI,KAA2D,EAAE;IAEtG,MAAM,UAAU,GAAG,gBAAgB,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;IACpD,OAAO,iBAAiB,CAAC,UAAU,EAAE,EAAE,GAAG,EAAE,aAAa,EAAE,CAAC,CAAC;AAC/D,CAAC;AAED,KAAK,UAAU,iBAAiB,CAC9B,UAAmC,EACnC,EAAE,GAAG,EAAE,aAAa,EAAsD;IAE1E,MAAM,UAAU,GAAG,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,IAAI,UAAU,CAAC,OAAO,CAAC;IAC1E,MAAM,UAAU,GAAG,MAAM,iBAAiB,CAAC,UAAU,EAAE,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;IACvE,IAAI,CAAC,UAAU;QAAE,OAAO,EAAE,GAAG,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;IAEjE,MAAM,OAAO,GAAG,aAAa;QAC3B,CAAC,CAAC,MAAM,aAAa,CAAC,UAAU,EAAE,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,YAAY,CAAC;QACzE,CAAC,CAAC,EAAE,CAAC;IACP,MAAM,QAAQ,GAAG,MAAM,qBAAqB,CAAC,UAAU,CAAC,CAAC;IACzD,OAAO,EAAE,GAAG,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;AAC/E,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { getAdapter, listDefinitions, normalizeRequest, publicDefinition } from "./catalog.js";
2
+ export { detectVersion, discoverAgents, fingerprintExecutable, inspectAgent, resolveExecutable, selectVersionLine } from "./discovery.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/adapters/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAE/F,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,qBAAqB,EAAE,YAAY,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,69 @@
1
+ import { asString, claudeToolResultText } from "./shared.js";
2
+ export const claudeAdapter = {
3
+ id: "claude",
4
+ display_name: "Claude Code",
5
+ command: "claude",
6
+ path_env: "HITCH_CLAUDE_PATH",
7
+ version_args: ["--version"],
8
+ revision_sources: {
9
+ version: { type: "npm", package: "@anthropic-ai/claude-code", bin: "claude" },
10
+ },
11
+ capabilities: {
12
+ non_interactive: true,
13
+ streaming: true,
14
+ structured_messages: true,
15
+ structured_tool_events: true,
16
+ sessions: true,
17
+ resume: false,
18
+ model_selection: true,
19
+ graceful_cancel: true,
20
+ },
21
+ process(request, executable) {
22
+ const args = ["-p", "--output-format", "stream-json", "--verbose"];
23
+ if (request.model)
24
+ args.push("--model", request.model);
25
+ args.push(...request.agent_args);
26
+ return { executable, args, input: request.prompt };
27
+ },
28
+ translate(event) {
29
+ if (event.type === "system" && event.session_id) {
30
+ return [{ type: "session.created", session_id: asString(event.session_id) }];
31
+ }
32
+ if (event.type === "assistant") {
33
+ const content = event.message?.content || [];
34
+ return content.flatMap((block) => {
35
+ const item = block;
36
+ if (item.type === "text")
37
+ return [{ type: "message.delta", text: asString(item.text) }];
38
+ if (item.type === "tool_use") {
39
+ return [{ type: "tool.started", call_id: asString(item.id), name: asString(item.name), input: item.input }];
40
+ }
41
+ return [];
42
+ });
43
+ }
44
+ if (event.type === "user") {
45
+ const content = event.message?.content || [];
46
+ return content.flatMap((block) => {
47
+ const item = block;
48
+ if (item.type !== "tool_result")
49
+ return [];
50
+ return [{
51
+ type: "tool.completed",
52
+ call_id: asString(item.tool_use_id),
53
+ status: item.is_error ? "failed" : "succeeded",
54
+ output: claudeToolResultText(item.content),
55
+ }];
56
+ });
57
+ }
58
+ if (event.type === "result") {
59
+ const translated = [];
60
+ if (typeof event.result === "string")
61
+ translated.push({ type: "message.completed", text: event.result });
62
+ if (event.usage)
63
+ translated.push({ type: "usage.updated", usage: event.usage });
64
+ return translated;
65
+ }
66
+ return [{ type: "provider.event", provider_type: event.type || "unknown", native: event }];
67
+ },
68
+ };
69
+ //# sourceMappingURL=claude.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude.js","sourceRoot":"","sources":["../../../../src/adapters/providers/claude.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,74 @@
1
+ import { asString, codexSupportsEphemeral } from "./shared.js";
2
+ export const codexAdapter = {
3
+ id: "codex",
4
+ display_name: "Codex CLI",
5
+ command: "codex",
6
+ path_env: "HITCH_CODEX_PATH",
7
+ version_args: ["--version"],
8
+ revision_sources: {
9
+ version: { type: "npm", package: "@openai/codex", bin: "codex" },
10
+ commit: {
11
+ type: "git",
12
+ url: "https://github.com/openai/codex.git",
13
+ commands: [
14
+ { executable: "cargo", args: ["build", "--release", "--locked", "--bin", "codex"], cwd: "codex-rs" },
15
+ ],
16
+ entrypoint: "codex-rs/target/release/codex",
17
+ },
18
+ },
19
+ capabilities: {
20
+ non_interactive: true,
21
+ streaming: true,
22
+ structured_messages: true,
23
+ structured_tool_events: true,
24
+ sessions: true,
25
+ resume: false,
26
+ model_selection: true,
27
+ graceful_cancel: true,
28
+ },
29
+ process(request, executable, runtime = {}) {
30
+ const args = ["exec", "--json"];
31
+ if (codexSupportsEphemeral(runtime.observed_version))
32
+ args.push("--ephemeral");
33
+ args.push("--skip-git-repo-check", "--color", "never", "-C", request.cwd);
34
+ if (request.model)
35
+ args.push("--model", request.model);
36
+ args.push(...request.agent_args, "-");
37
+ return { executable, args, input: request.prompt };
38
+ },
39
+ translate(event) {
40
+ if (event.type === "thread.started") {
41
+ return [{ type: "session.created", session_id: asString(event.thread_id) }];
42
+ }
43
+ if (event.type === "item.completed" && event.item?.type === "agent_message") {
44
+ return [{ type: "message.delta", text: asString(event.item.text) }];
45
+ }
46
+ const toolTypes = new Set(["command_execution", "file_change", "mcp_tool_call", "web_search"]);
47
+ const item = (event.item || {});
48
+ if (event.type === "item.started" && toolTypes.has(item.type)) {
49
+ return [{
50
+ type: "tool.started",
51
+ call_id: asString(item.id),
52
+ name: asString(item.type),
53
+ native: item,
54
+ }];
55
+ }
56
+ if (event.type === "item.completed" && toolTypes.has(item.type)) {
57
+ return [{
58
+ type: "tool.completed",
59
+ call_id: asString(item.id),
60
+ name: asString(item.type),
61
+ status: item.status || "completed",
62
+ native: item,
63
+ }];
64
+ }
65
+ if (event.type === "turn.completed" && event.usage) {
66
+ return [{ type: "usage.updated", usage: event.usage }];
67
+ }
68
+ if (event.type === "error") {
69
+ return [{ type: "diagnostic", level: "error", message: asString(event.message) || "Codex error" }];
70
+ }
71
+ return [{ type: "provider.event", provider_type: event.type || "unknown", native: event }];
72
+ },
73
+ };
74
+ //# sourceMappingURL=codex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex.js","sourceRoot":"","sources":["../../../../src/adapters/providers/codex.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ import { writeDeepseekRuntimePatch } from "./shared.js";
2
+ export const deepseekAdapter = {
3
+ id: "deepseek",
4
+ display_name: "DeepSeek Harness",
5
+ command: "dsh",
6
+ path_env: "HITCH_DEEPSEEK_PATH",
7
+ version_args: ["--version"],
8
+ revision_sources: {
9
+ version: { type: "npm", package: "@deepseek-ai/dsh", bin: "dsh", install_mode: "global" },
10
+ commit: {
11
+ type: "git",
12
+ url: "https://github.com/deepseek-ai/deepseek-harness.git",
13
+ commands: [
14
+ { executable: "pnpm", args: ["install", "--frozen-lockfile"] },
15
+ { executable: "pnpm", args: ["run", "build"] },
16
+ ],
17
+ entrypoint: "apps/cli/lib/bin.js",
18
+ },
19
+ },
20
+ capabilities: {
21
+ non_interactive: true,
22
+ streaming: false,
23
+ // Headless stdout is only the final text, but DSH persists the complete
24
+ // structured session before the process exits. The engine imports that
25
+ // native session after exit rather than treating stdout as the trace.
26
+ structured_messages: true,
27
+ structured_tool_events: true,
28
+ sessions: true,
29
+ resume: false,
30
+ model_selection: true,
31
+ graceful_cancel: true,
32
+ },
33
+ async process(request, executable, runtime = {}) {
34
+ const args = ["--profile", "headless", ...request.agent_args];
35
+ const patchFile = await writeDeepseekRuntimePatch(request.model, runtime.run_directory, runtime.runtime_home);
36
+ args.push("--patch", patchFile);
37
+ args.push(request.prompt);
38
+ return {
39
+ executable,
40
+ args,
41
+ input: "",
42
+ ...(runtime.runtime_home ? { env: { DSH_HOME: runtime.runtime_home } } : {}),
43
+ };
44
+ },
45
+ translateLine(line, state) {
46
+ const text = state.has_stdout_line ? `\n${line}` : line;
47
+ state.has_stdout_line = true;
48
+ return [{ type: "message.delta", text }];
49
+ },
50
+ };
51
+ //# sourceMappingURL=deepseek.js.map