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.
- package/README.md +16 -10
- package/README.zh-CN.md +13 -8
- package/dist/bin/hitch.js +1 -1
- package/dist/bin/hitch.js.map +1 -1
- package/dist/scripts/check-architecture.js +159 -0
- package/dist/scripts/check-architecture.js.map +1 -0
- package/dist/scripts/check-release.js +1 -1
- package/dist/scripts/check-release.js.map +1 -1
- package/dist/src/adapters/catalog.js +55 -0
- package/dist/src/adapters/catalog.js.map +1 -0
- package/dist/src/adapters/contract.js +2 -0
- package/dist/src/adapters/contract.js.map +1 -0
- package/dist/src/adapters/discovery.js +22 -0
- package/dist/src/adapters/discovery.js.map +1 -0
- package/dist/src/adapters/index.js +3 -0
- package/dist/src/adapters/index.js.map +1 -0
- package/dist/src/adapters/providers/claude.js +69 -0
- package/dist/src/adapters/providers/claude.js.map +1 -0
- package/dist/src/adapters/providers/codex.js +74 -0
- package/dist/src/adapters/providers/codex.js.map +1 -0
- package/dist/src/adapters/providers/deepseek.js +51 -0
- package/dist/src/adapters/providers/deepseek.js.map +1 -0
- package/dist/src/adapters/providers/opencode.js +73 -0
- package/dist/src/adapters/providers/opencode.js.map +1 -0
- package/dist/src/adapters/providers/pi.js +82 -0
- package/dist/src/adapters/providers/pi.js.map +1 -0
- package/dist/src/adapters/providers/shared.js +82 -0
- package/dist/src/adapters/providers/shared.js.map +1 -0
- package/dist/src/artifacts/index.js +3 -0
- package/dist/src/artifacts/index.js.map +1 -0
- package/dist/src/artifacts/integrity.js +188 -0
- package/dist/src/artifacts/integrity.js.map +1 -0
- package/dist/src/artifacts/preparer.js +379 -0
- package/dist/src/artifacts/preparer.js.map +1 -0
- package/dist/src/artifacts/store.js +87 -0
- package/dist/src/artifacts/store.js.map +1 -0
- package/dist/src/artifacts/types.js +2 -0
- package/dist/src/artifacts/types.js.map +1 -0
- package/dist/src/backends/contract.js +2 -0
- package/dist/src/backends/contract.js.map +1 -0
- package/dist/src/{harbor-backend.js → backends/harbor/backend.js} +39 -14
- package/dist/src/backends/harbor/backend.js.map +1 -0
- package/dist/src/backends/harbor/index.js +4 -0
- package/dist/src/backends/harbor/index.js.map +1 -0
- package/dist/src/backends/harbor/local-git-transport.js +447 -0
- package/dist/src/backends/harbor/local-git-transport.js.map +1 -0
- package/dist/src/{eval-tools.js → backends/harbor/tools.js} +2 -6
- package/dist/src/backends/harbor/tools.js.map +1 -0
- package/dist/src/backends/index.js +4 -0
- package/dist/src/backends/index.js.map +1 -0
- package/dist/src/cli/arguments.js +123 -0
- package/dist/src/cli/arguments.js.map +1 -0
- package/dist/src/cli/commands/compare.js +55 -0
- package/dist/src/cli/commands/compare.js.map +1 -0
- package/dist/src/cli/commands/daemon.js +106 -0
- package/dist/src/cli/commands/daemon.js.map +1 -0
- package/dist/src/cli/commands/eval.js +126 -0
- package/dist/src/cli/commands/eval.js.map +1 -0
- package/dist/src/cli/commands/feedback.js +84 -0
- package/dist/src/cli/commands/feedback.js.map +1 -0
- package/dist/src/cli/commands/inspect.js +20 -0
- package/dist/src/cli/commands/inspect.js.map +1 -0
- package/dist/src/cli/commands/list.js +17 -0
- package/dist/src/cli/commands/list.js.map +1 -0
- package/dist/src/cli/commands/prepare.js +21 -0
- package/dist/src/cli/commands/prepare.js.map +1 -0
- package/dist/src/cli/commands/resolve.js +17 -0
- package/dist/src/cli/commands/resolve.js.map +1 -0
- package/dist/src/cli/commands/run.js +83 -0
- package/dist/src/cli/commands/run.js.map +1 -0
- package/dist/src/cli/commands/runs.js +45 -0
- package/dist/src/cli/commands/runs.js.map +1 -0
- package/dist/src/cli/commands/trajectory.js +31 -0
- package/dist/src/cli/commands/trajectory.js.map +1 -0
- package/dist/src/cli/commands/workspace.js +44 -0
- package/dist/src/cli/commands/workspace.js.map +1 -0
- package/dist/src/cli/index.js +2 -0
- package/dist/src/cli/index.js.map +1 -0
- package/dist/src/cli/main.js +48 -0
- package/dist/src/cli/main.js.map +1 -0
- package/dist/src/cli/output.js +96 -0
- package/dist/src/cli/output.js.map +1 -0
- package/dist/src/controller-runtime/index.js +3 -0
- package/dist/src/controller-runtime/index.js.map +1 -0
- package/dist/src/controller-runtime/store.js +2 -7
- package/dist/src/controller-runtime/store.js.map +1 -1
- package/dist/src/daemon/auth.js +108 -0
- package/dist/src/daemon/auth.js.map +1 -0
- package/dist/src/daemon/client.js +76 -0
- package/dist/src/daemon/client.js.map +1 -0
- package/dist/src/daemon/index.js +5 -0
- package/dist/src/daemon/index.js.map +1 -0
- package/dist/src/daemon/launcher.js +24 -0
- package/dist/src/daemon/launcher.js.map +1 -0
- package/dist/src/{scheduler.js → daemon/scheduler.js} +6 -7
- package/dist/src/daemon/scheduler.js.map +1 -0
- package/dist/src/{daemon.js → daemon/server.js} +10 -155
- package/dist/src/daemon/server.js.map +1 -0
- package/dist/src/domain/artifacts.js +2 -0
- package/dist/src/domain/artifacts.js.map +1 -0
- package/dist/src/domain/controller-runtime.js +2 -0
- package/dist/src/domain/controller-runtime.js.map +1 -0
- package/dist/src/domain/eval-records.js +2 -0
- package/dist/src/domain/eval-records.js.map +1 -0
- package/dist/src/domain/evals.js +2 -0
- package/dist/src/domain/evals.js.map +1 -0
- package/dist/src/domain/feedback.js +2 -0
- package/dist/src/domain/feedback.js.map +1 -0
- package/dist/src/domain/{types.js → ids.js} +1 -1
- package/dist/src/domain/ids.js.map +1 -0
- package/dist/src/domain/index.js +11 -0
- package/dist/src/domain/index.js.map +1 -0
- package/dist/src/domain/revisions.js +2 -0
- package/dist/src/domain/revisions.js.map +1 -0
- package/dist/src/domain/runs.js +3 -0
- package/dist/src/domain/runs.js.map +1 -0
- package/dist/src/domain/trajectories.js +2 -0
- package/dist/src/domain/trajectories.js.map +1 -0
- package/dist/src/domain/{validate.js → validation.js} +194 -5
- package/dist/src/domain/validation.js.map +1 -0
- package/dist/src/domain/workspaces.js +2 -0
- package/dist/src/domain/workspaces.js.map +1 -0
- package/dist/src/evals/events.js +67 -0
- package/dist/src/evals/events.js.map +1 -0
- package/dist/src/evals/index.js +5 -0
- package/dist/src/evals/index.js.map +1 -0
- package/dist/src/evals/records.js +55 -0
- package/dist/src/evals/records.js.map +1 -0
- package/dist/src/evals/request.js +109 -0
- package/dist/src/evals/request.js.map +1 -0
- package/dist/src/evals/service.js +227 -0
- package/dist/src/evals/service.js.map +1 -0
- package/dist/src/evals/trial-import.js +394 -0
- package/dist/src/evals/trial-import.js.map +1 -0
- package/dist/src/feedback/index.js +2 -0
- package/dist/src/feedback/index.js.map +1 -0
- package/dist/src/feedback/service.js +3 -4
- package/dist/src/feedback/service.js.map +1 -1
- package/dist/src/{config.js → foundation/config.js} +1 -0
- package/dist/src/foundation/config.js.map +1 -0
- package/dist/src/foundation/errors.js.map +1 -0
- package/dist/src/foundation/executable.js +135 -0
- package/dist/src/foundation/executable.js.map +1 -0
- package/dist/src/foundation/fs.js.map +1 -0
- package/dist/src/foundation/hash.js +24 -0
- package/dist/src/foundation/hash.js.map +1 -0
- package/dist/src/foundation/index.js +11 -0
- package/dist/src/foundation/index.js.map +1 -0
- package/dist/src/foundation/line-stream.js.map +1 -0
- package/dist/src/foundation/locks.js +114 -0
- package/dist/src/foundation/locks.js.map +1 -0
- package/dist/src/{package-root.js → foundation/package-root.js} +3 -2
- package/dist/src/foundation/package-root.js.map +1 -0
- package/dist/src/foundation/process.js.map +1 -0
- package/dist/src/revisions/index.js +4 -0
- package/dist/src/revisions/index.js.map +1 -0
- package/dist/src/{harness-reference.js → revisions/reference.js} +16 -2
- package/dist/src/revisions/reference.js.map +1 -0
- package/dist/src/revisions/resolver.js +25 -0
- package/dist/src/revisions/resolver.js.map +1 -0
- package/dist/src/revisions/sources/git.js +180 -0
- package/dist/src/revisions/sources/git.js.map +1 -0
- package/dist/src/revisions/sources/installed.js +45 -0
- package/dist/src/revisions/sources/installed.js.map +1 -0
- package/dist/src/revisions/sources/npm.js +97 -0
- package/dist/src/revisions/sources/npm.js.map +1 -0
- package/dist/src/runs/compare.js +132 -0
- package/dist/src/runs/compare.js.map +1 -0
- package/dist/src/{events.js → runs/events.js} +1 -2
- package/dist/src/runs/events.js.map +1 -0
- package/dist/src/{engine.js → runs/executor.js} +166 -151
- package/dist/src/runs/executor.js.map +1 -0
- package/dist/src/runs/finalizer.js +22 -0
- package/dist/src/runs/finalizer.js.map +1 -0
- package/dist/src/runs/identity.js +35 -0
- package/dist/src/runs/identity.js.map +1 -0
- package/dist/src/runs/index.js +11 -0
- package/dist/src/runs/index.js.map +1 -0
- package/dist/src/runs/manifest.js +70 -0
- package/dist/src/runs/manifest.js.map +1 -0
- package/dist/src/runs/outcome.js +49 -0
- package/dist/src/runs/outcome.js.map +1 -0
- package/dist/src/runs/query.js +104 -0
- package/dist/src/runs/query.js.map +1 -0
- package/dist/src/runs/queued.js +54 -0
- package/dist/src/runs/queued.js.map +1 -0
- package/dist/src/runs/records.js +288 -0
- package/dist/src/runs/records.js.map +1 -0
- package/dist/src/runs/request.js +169 -0
- package/dist/src/runs/request.js.map +1 -0
- package/dist/src/trajectories/format.js +1 -1
- package/dist/src/trajectories/format.js.map +1 -1
- package/dist/src/trajectories/index.js +7 -0
- package/dist/src/trajectories/index.js.map +1 -0
- package/dist/src/trajectories/projector.js +1 -1
- package/dist/src/trajectories/projector.js.map +1 -1
- package/dist/src/trajectories/provider-capture.js +133 -0
- package/dist/src/trajectories/provider-capture.js.map +1 -0
- package/dist/src/trajectories/providers/deepseek.js +179 -0
- package/dist/src/trajectories/providers/deepseek.js.map +1 -0
- package/dist/src/trajectories/store.js +148 -8
- package/dist/src/trajectories/store.js.map +1 -1
- package/dist/src/workspaces/copy.js +142 -0
- package/dist/src/workspaces/copy.js.map +1 -0
- package/dist/src/workspaces/digest.js +47 -0
- package/dist/src/workspaces/digest.js.map +1 -0
- package/dist/src/workspaces/git.js +164 -0
- package/dist/src/workspaces/git.js.map +1 -0
- package/dist/src/workspaces/index.js +6 -0
- package/dist/src/workspaces/index.js.map +1 -0
- package/dist/src/workspaces/lifecycle.js +313 -0
- package/dist/src/workspaces/lifecycle.js.map +1 -0
- package/dist/src/workspaces/planner.js +80 -0
- package/dist/src/workspaces/planner.js.map +1 -0
- package/dist/src/workspaces/store.js +25 -0
- package/dist/src/workspaces/store.js.map +1 -0
- package/dist/src/workspaces/types.js +4 -0
- package/dist/src/workspaces/types.js.map +1 -0
- package/dist/src/workspaces/utils.js +56 -0
- package/dist/src/workspaces/utils.js.map +1 -0
- package/docs/schemas/eval-request.schema.json +2 -0
- package/docs/schemas/eval-result.schema.json +36 -1
- package/docs/schemas/local-git-transport-manifest.schema.json +34 -0
- package/docs/schemas/result.schema.json +9 -0
- package/docs/schemas/run-context.schema.json +39 -0
- package/docs/schemas/run-manifest.schema.json +81 -0
- package/docs/schemas/run-request.schema.json +16 -1
- package/docs/schemas/trajectory-ref.schema.json +66 -23
- package/integrations/harbor/hitch_harbor_agent.py +375 -1
- package/package.json +21 -3
- package/dist/src/adapters.js +0 -461
- package/dist/src/adapters.js.map +0 -1
- package/dist/src/artifacts.js +0 -1081
- package/dist/src/artifacts.js.map +0 -1
- package/dist/src/cli.js +0 -699
- package/dist/src/cli.js.map +0 -1
- package/dist/src/config.js.map +0 -1
- package/dist/src/daemon.js.map +0 -1
- package/dist/src/domain/types.js.map +0 -1
- package/dist/src/domain/validate.js.map +0 -1
- package/dist/src/engine.js.map +0 -1
- package/dist/src/errors.js.map +0 -1
- package/dist/src/eval-tools.js.map +0 -1
- package/dist/src/evals.js +0 -313
- package/dist/src/evals.js.map +0 -1
- package/dist/src/events.js.map +0 -1
- package/dist/src/fs.js.map +0 -1
- package/dist/src/harbor-backend.js.map +0 -1
- package/dist/src/harness-reference.js.map +0 -1
- package/dist/src/line-stream.js.map +0 -1
- package/dist/src/locks.js +0 -38
- package/dist/src/locks.js.map +0 -1
- package/dist/src/package-root.js.map +0 -1
- package/dist/src/process.js.map +0 -1
- package/dist/src/registry.js +0 -81
- package/dist/src/registry.js.map +0 -1
- package/dist/src/scheduler.js.map +0 -1
- package/dist/src/workspaces.js +0 -858
- package/dist/src/workspaces.js.map +0 -1
- /package/dist/src/{errors.js → foundation/errors.js} +0 -0
- /package/dist/src/{fs.js → foundation/fs.js} +0 -0
- /package/dist/src/{line-stream.js → foundation/line-stream.js} +0 -0
- /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
|
-
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
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
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
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
|
-
- [
|
|
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
|
-
-
|
|
146
|
-
|
|
147
|
-
- `trajectory.ref.json`
|
|
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
|
-
|
|
192
|
-
|
|
193
|
-
|
|
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
|
-
- [
|
|
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`);
|
package/dist/bin/hitch.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hitch.js","sourceRoot":"","sources":["../../bin/hitch.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,IAAI,EAAE,MAAM,
|
|
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":"AAAA,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AACrC,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC;IACtB,QAAQ,EAAE,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,oBAAoB;IAClF,cAAc,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK;CACvF,CAAC,CAAC;AACH,MAAM,OAAO,GAAG,IAAI,GAAG,CAAsB;IAC3C,CAAC,QAAQ,EAAE,IAAI,GAAG,EAAE,CAAC;IACrB,CAAC,YAAY,EAAE,IAAI,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;IACnC,CAAC,UAAU,EAAE,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC,CAAC;IAC/C,CAAC,WAAW,EAAE,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,YAAY,EAAE,UAAU,CAAC,CAAC,CAAC;IAC5D,CAAC,WAAW,EAAE,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,YAAY,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC,CAAC;IACzE,CAAC,oBAAoB,EAAE,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC,CAAC;IACzD,CAAC,cAAc,EAAE,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,YAAY,EAAE,UAAU,CAAC,CAAC,CAAC;IAC/D,CAAC,UAAU,EAAE,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,YAAY,EAAE,cAAc,CAAC,CAAC,CAAC;IAC/D,CAAC,YAAY,EAAE,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC,CAAC;IACjD,CAAC,MAAM,EAAE,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,cAAc,CAAC,CAAC,CAAC;IAC/G,CAAC,UAAU,EAAE,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC,CAAC;IAC/C,CAAC,OAAO,EAAE,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,oBAAoB,EAAE,YAAY,EAAE,cAAc,CAAC,CAAC,CAAC;IAC9I,CAAC,QAAQ,EAAE,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC;IACnE,CAAC,KAAK,EAAE,IAAI,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC;CAChE,CAAC,CAAC;AAkBH,MAAM,UAAU,GAAgB,EAAE,CAAC;AACnC,MAAM,KAAK,GAAiB,EAAE,CAAC;AAC/B,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,CAAC;AAE1C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;IACzB,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC;IACtD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC7C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACrC,MAAM,YAAY,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;IAEzC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAC5B,MAAM,CAAC,QAAQ,EAAE,CAAC,EAAE,aAAa,EAAE,yCAAyC,EAAE,iDAAiD,CAAC,CAAC;IACnI,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,GAAG,GAAG,EAAE,CAAC;QAC3B,MAAM,CAAC,QAAQ,EAAE,GAAG,EAAE,WAAW,EAAE,sBAAsB,KAAK,CAAC,MAAM,GAAG,CAAC,sBAAsB,EAAE,qDAAqD,CAAC,CAAC;IAC1J,CAAC;IACD,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,UAAU;QAAE,WAAW,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAErE,KAAK,MAAM,QAAQ,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACxC,IAAI,YAAY,KAAK,QAAQ,IAAI,QAAQ,CAAC,SAAS,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YACxE,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,IAAI,EAAE,eAAe,EAAE,kCAAkC,QAAQ,CAAC,SAAS,EAAE,EAAE,4CAA4C,CAAC,CAAC;QACzJ,CAAC;QACD,IAAI,QAAQ,CAAC,UAAU,CAAC,eAAe,CAAC,IAAI,QAAQ,CAAC,SAAS,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YACrF,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,IAAI,EAAE,gBAAgB,EAAE,0CAA0C,QAAQ,CAAC,SAAS,EAAE,EAAE,mDAAmD,CAAC,CAAC;QACzK,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QAClD,MAAM,UAAU,GAAG,aAAa,CAAC,IAAI,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC;QAC3D,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,GAAG,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAAE,SAAS;QAC/D,MAAM,cAAc,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC;QAClE,MAAM,YAAY,GAAG,SAAS,CAAC,cAAc,CAAC,CAAC;QAC/C,IAAI,CAAC,YAAY;YAAE,SAAS;QAE5B,IAAI,YAAY,IAAI,YAAY,IAAI,YAAY,KAAK,YAAY,EAAE,CAAC;YAClE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC;gBAClD,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,IAAI,EAAE,sBAAsB,EAAE,GAAG,YAAY,sBAAsB,YAAY,EAAE,EAAE,kCAAkC,YAAY,iCAAiC,CAAC,CAAC;YAChM,CAAC;YACD,IAAI,cAAc,KAAK,GAAG,YAAY,WAAW,EAAE,CAAC;gBAClD,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,IAAI,EAAE,aAAa,EAAE,oCAAoC,cAAc,EAAE,EAAE,eAAe,YAAY,WAAW,CAAC,CAAC;YAC/I,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,YAAY,EAAE,UAAU,EAAE,cAAc,EAAE,YAAY,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;QACpH,CAAC;IACH,CAAC;AACH,CAAC;AAED,iBAAiB,CAAC,KAAK,CAAC,CAAC;AAEzB,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;IAC1B,KAAK,MAAM,IAAI,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;QAC9H,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC,UAAU,IAAI,CAAC,CAAC;IACzG,CAAC;IACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,kCAAkC,UAAU,CAAC,MAAM,iBAAiB,CAAC,CAAC;IAC3F,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACvB,CAAC;KAAM,CAAC;IACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,8BAA8B,KAAK,CAAC,MAAM,kBAAkB,KAAK,CAAC,MAAM,wBAAwB,CAAC,CAAC;AACzH,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,SAAiB;IAC1C,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,KAAK,MAAM,KAAK,IAAI,MAAM,OAAO,CAAC,SAAS,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QACtE,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACnD,IAAI,KAAK,CAAC,WAAW,EAAE;YAAE,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC;aACjE,IAAI,KAAK,CAAC,MAAM,EAAE,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAChF,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC;AACvB,CAAC;AAED,SAAS,OAAO,CAAC,OAAe;IAC9B,MAAM,MAAM,GAA+C,EAAE,CAAC;IAC9D,MAAM,OAAO,GAAG,4CAA4C,CAAC;IAC7D,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAC9C,MAAM,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC,CAAW,EAAE,IAAI,EAAE,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,CAAC;IACjH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,aAAa,CAAC,UAAkB,EAAE,SAAiB;IAC1D,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,SAAS,CAAC,CAAC;IAC9D,IAAI,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;IACzD,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC;QAAE,OAAO,GAAG,CAAC;IAClC,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;AACpC,CAAC;AAED,SAAS,SAAS,CAAC,QAAgB;IACjC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC5C,OAAO,MAAM,IAAI,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;AAC9D,CAAC;AAED,SAAS,WAAW,CAAC,QAAgB,EAAE,KAAe;IACpD,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC;YAAE,OAAO;QACtK,MAAM,CAAC,QAAQ,EAAE,KAAK,GAAG,CAAC,EAAE,cAAc,EAAE,oCAAoC,EAAE,mEAAmE,CAAC,CAAC;IACzJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,iBAAiB,CAAC,WAAyB;IAClD,MAAM,KAAK,GAAG,IAAI,GAAG,EAAuB,CAAC;IAC7C,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;QAC/B,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,IAAI,GAAG,EAAU,CAAC;QAClE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC/B,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IACxC,CAAC;IACD,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;IACnC,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,MAAM,KAAK,GAAG,CAAC,MAAc,EAAE,EAAE;QAC/B,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC;YAAE,OAAO;QAChC,IAAI,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YACzB,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YACpC,MAAM,KAAK,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,CAAC;YAC9C,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC/B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBACtB,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBACjB,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,YAAY,KAAK,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,YAAY,KAAK,MAAM,CAAC,CAAC;gBAC5G,MAAM,CAAC,IAAI,EAAE,UAAU,IAAI,GAAG,MAAM,WAAW,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,EAAE,cAAc,EAAE,GAAG,EAAE,sDAAsD,CAAC,CAAC;YACjJ,CAAC;YACD,OAAO;QACT,CAAC;QACD,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACrB,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACnB,KAAK,MAAM,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE;YAAE,KAAK,CAAC,MAAM,CAAC,CAAC;QAC5D,KAAK,CAAC,GAAG,EAAE,CAAC;QACZ,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACtB,CAAC,CAAC;IACF,KAAK,MAAM,MAAM,IAAI,OAAO;QAAE,KAAK,CAAC,MAAM,CAAC,CAAC;AAC9C,CAAC;AAED,SAAS,MAAM,CAAC,IAAY,EAAE,IAAY,EAAE,IAAY,EAAE,OAAe,EAAE,UAAkB;IAC3F,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC;AAC7D,CAAC;AAED,SAAS,KAAK,CAAC,KAAa;IAC1B,OAAO,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACzC,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { packageVersion } from "../src/
|
|
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,
|
|
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 @@
|
|
|
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 @@
|
|
|
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
|