agent-hitch 0.1.1 → 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 +235 -132
  2. package/README.zh-CN.md +335 -0
  3. package/dist/bin/hitch.js +9 -0
  4. package/dist/bin/hitch.js.map +1 -0
  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 +25 -0
  8. package/dist/scripts/check-release.js.map +1 -0
  9. package/dist/scripts/check-syntax.js +32 -0
  10. package/dist/scripts/check-syntax.js.map +1 -0
  11. package/dist/src/adapters/catalog.js +55 -0
  12. package/dist/src/adapters/catalog.js.map +1 -0
  13. package/dist/src/adapters/contract.js +2 -0
  14. package/dist/src/adapters/contract.js.map +1 -0
  15. package/dist/src/adapters/discovery.js +22 -0
  16. package/dist/src/adapters/discovery.js.map +1 -0
  17. package/dist/src/adapters/index.js +3 -0
  18. package/dist/src/adapters/index.js.map +1 -0
  19. package/dist/src/adapters/providers/claude.js +69 -0
  20. package/dist/src/adapters/providers/claude.js.map +1 -0
  21. package/dist/src/adapters/providers/codex.js +74 -0
  22. package/dist/src/adapters/providers/codex.js.map +1 -0
  23. package/dist/src/adapters/providers/deepseek.js +51 -0
  24. package/dist/src/adapters/providers/deepseek.js.map +1 -0
  25. package/dist/src/adapters/providers/opencode.js +73 -0
  26. package/dist/src/adapters/providers/opencode.js.map +1 -0
  27. package/dist/src/adapters/providers/pi.js +82 -0
  28. package/dist/src/adapters/providers/pi.js.map +1 -0
  29. package/dist/src/adapters/providers/shared.js +82 -0
  30. package/dist/src/adapters/providers/shared.js.map +1 -0
  31. package/dist/src/artifacts/index.js +3 -0
  32. package/dist/src/artifacts/index.js.map +1 -0
  33. package/dist/src/artifacts/integrity.js +188 -0
  34. package/dist/src/artifacts/integrity.js.map +1 -0
  35. package/dist/src/artifacts/preparer.js +379 -0
  36. package/dist/src/artifacts/preparer.js.map +1 -0
  37. package/dist/src/artifacts/store.js +87 -0
  38. package/dist/src/artifacts/store.js.map +1 -0
  39. package/dist/src/artifacts/types.js +2 -0
  40. package/dist/src/artifacts/types.js.map +1 -0
  41. package/dist/src/backends/contract.js +2 -0
  42. package/dist/src/backends/contract.js.map +1 -0
  43. package/dist/src/backends/harbor/backend.js +305 -0
  44. package/dist/src/backends/harbor/backend.js.map +1 -0
  45. package/dist/src/backends/harbor/index.js +4 -0
  46. package/dist/src/backends/harbor/index.js.map +1 -0
  47. package/dist/src/backends/harbor/local-git-transport.js +447 -0
  48. package/dist/src/backends/harbor/local-git-transport.js.map +1 -0
  49. package/dist/src/backends/harbor/tools.js +314 -0
  50. package/dist/src/backends/harbor/tools.js.map +1 -0
  51. package/dist/src/backends/index.js +4 -0
  52. package/dist/src/backends/index.js.map +1 -0
  53. package/dist/src/cli/arguments.js +123 -0
  54. package/dist/src/cli/arguments.js.map +1 -0
  55. package/dist/src/cli/commands/compare.js +55 -0
  56. package/dist/src/cli/commands/compare.js.map +1 -0
  57. package/dist/src/cli/commands/daemon.js +106 -0
  58. package/dist/src/cli/commands/daemon.js.map +1 -0
  59. package/dist/src/cli/commands/eval.js +126 -0
  60. package/dist/src/cli/commands/eval.js.map +1 -0
  61. package/dist/src/cli/commands/feedback.js +84 -0
  62. package/dist/src/cli/commands/feedback.js.map +1 -0
  63. package/dist/src/cli/commands/inspect.js +20 -0
  64. package/dist/src/cli/commands/inspect.js.map +1 -0
  65. package/dist/src/cli/commands/list.js +17 -0
  66. package/dist/src/cli/commands/list.js.map +1 -0
  67. package/dist/src/cli/commands/prepare.js +21 -0
  68. package/dist/src/cli/commands/prepare.js.map +1 -0
  69. package/dist/src/cli/commands/resolve.js +17 -0
  70. package/dist/src/cli/commands/resolve.js.map +1 -0
  71. package/dist/src/cli/commands/run.js +83 -0
  72. package/dist/src/cli/commands/run.js.map +1 -0
  73. package/dist/src/cli/commands/runs.js +45 -0
  74. package/dist/src/cli/commands/runs.js.map +1 -0
  75. package/dist/src/cli/commands/trajectory.js +31 -0
  76. package/dist/src/cli/commands/trajectory.js.map +1 -0
  77. package/dist/src/cli/commands/workspace.js +44 -0
  78. package/dist/src/cli/commands/workspace.js.map +1 -0
  79. package/dist/src/cli/index.js +2 -0
  80. package/dist/src/cli/index.js.map +1 -0
  81. package/dist/src/cli/main.js +48 -0
  82. package/dist/src/cli/main.js.map +1 -0
  83. package/dist/src/cli/output.js +96 -0
  84. package/dist/src/cli/output.js.map +1 -0
  85. package/dist/src/controller-runtime/hash.js +353 -0
  86. package/dist/src/controller-runtime/hash.js.map +1 -0
  87. package/dist/src/controller-runtime/index.js +3 -0
  88. package/dist/src/controller-runtime/index.js.map +1 -0
  89. package/dist/src/controller-runtime/store.js +318 -0
  90. package/dist/src/controller-runtime/store.js.map +1 -0
  91. package/dist/src/daemon/auth.js +108 -0
  92. package/dist/src/daemon/auth.js.map +1 -0
  93. package/dist/src/daemon/client.js +76 -0
  94. package/dist/src/daemon/client.js.map +1 -0
  95. package/dist/src/daemon/index.js +5 -0
  96. package/dist/src/daemon/index.js.map +1 -0
  97. package/dist/src/daemon/launcher.js +24 -0
  98. package/dist/src/daemon/launcher.js.map +1 -0
  99. package/dist/src/daemon/scheduler.js +161 -0
  100. package/dist/src/daemon/scheduler.js.map +1 -0
  101. package/dist/src/daemon/server.js +316 -0
  102. package/dist/src/daemon/server.js.map +1 -0
  103. package/dist/src/domain/artifacts.js +2 -0
  104. package/dist/src/domain/artifacts.js.map +1 -0
  105. package/dist/src/domain/controller-runtime.js +2 -0
  106. package/dist/src/domain/controller-runtime.js.map +1 -0
  107. package/dist/src/domain/eval-records.js +2 -0
  108. package/dist/src/domain/eval-records.js.map +1 -0
  109. package/dist/src/domain/evals.js +2 -0
  110. package/dist/src/domain/evals.js.map +1 -0
  111. package/dist/src/domain/feedback.js +2 -0
  112. package/dist/src/domain/feedback.js.map +1 -0
  113. package/dist/src/domain/ids.js +10 -0
  114. package/dist/src/domain/ids.js.map +1 -0
  115. package/dist/src/domain/index.js +11 -0
  116. package/dist/src/domain/index.js.map +1 -0
  117. package/dist/src/domain/revisions.js +2 -0
  118. package/dist/src/domain/revisions.js.map +1 -0
  119. package/dist/src/domain/runs.js +3 -0
  120. package/dist/src/domain/runs.js.map +1 -0
  121. package/dist/src/domain/trajectories.js +2 -0
  122. package/dist/src/domain/trajectories.js.map +1 -0
  123. package/dist/src/domain/validation.js +429 -0
  124. package/dist/src/domain/validation.js.map +1 -0
  125. package/dist/src/domain/workspaces.js +2 -0
  126. package/dist/src/domain/workspaces.js.map +1 -0
  127. package/dist/src/evals/events.js +67 -0
  128. package/dist/src/evals/events.js.map +1 -0
  129. package/dist/src/evals/index.js +5 -0
  130. package/dist/src/evals/index.js.map +1 -0
  131. package/dist/src/evals/records.js +55 -0
  132. package/dist/src/evals/records.js.map +1 -0
  133. package/dist/src/evals/request.js +109 -0
  134. package/dist/src/evals/request.js.map +1 -0
  135. package/dist/src/evals/service.js +227 -0
  136. package/dist/src/evals/service.js.map +1 -0
  137. package/dist/src/evals/trial-import.js +394 -0
  138. package/dist/src/evals/trial-import.js.map +1 -0
  139. package/dist/src/feedback/index.js +2 -0
  140. package/dist/src/feedback/index.js.map +1 -0
  141. package/dist/src/feedback/service.js +314 -0
  142. package/dist/src/feedback/service.js.map +1 -0
  143. package/dist/src/foundation/config.js +54 -0
  144. package/dist/src/foundation/config.js.map +1 -0
  145. package/dist/src/foundation/errors.js +14 -0
  146. package/dist/src/foundation/errors.js.map +1 -0
  147. package/dist/src/foundation/executable.js +135 -0
  148. package/dist/src/foundation/executable.js.map +1 -0
  149. package/dist/src/foundation/fs.js +45 -0
  150. package/dist/src/foundation/fs.js.map +1 -0
  151. package/dist/src/foundation/hash.js +24 -0
  152. package/dist/src/foundation/hash.js.map +1 -0
  153. package/dist/src/foundation/index.js +11 -0
  154. package/dist/src/foundation/index.js.map +1 -0
  155. package/dist/src/foundation/line-stream.js +20 -0
  156. package/dist/src/foundation/line-stream.js.map +1 -0
  157. package/dist/src/foundation/locks.js +114 -0
  158. package/dist/src/foundation/locks.js.map +1 -0
  159. package/dist/src/foundation/package-root.js +41 -0
  160. package/dist/src/foundation/package-root.js.map +1 -0
  161. package/dist/src/foundation/process.js +50 -0
  162. package/dist/src/foundation/process.js.map +1 -0
  163. package/dist/src/revisions/index.js +4 -0
  164. package/dist/src/revisions/index.js.map +1 -0
  165. package/dist/src/revisions/reference.js +97 -0
  166. package/dist/src/revisions/reference.js.map +1 -0
  167. package/dist/src/revisions/resolver.js +25 -0
  168. package/dist/src/revisions/resolver.js.map +1 -0
  169. package/dist/src/revisions/sources/git.js +180 -0
  170. package/dist/src/revisions/sources/git.js.map +1 -0
  171. package/dist/src/revisions/sources/installed.js +45 -0
  172. package/dist/src/revisions/sources/installed.js.map +1 -0
  173. package/dist/src/revisions/sources/npm.js +97 -0
  174. package/dist/src/revisions/sources/npm.js.map +1 -0
  175. package/dist/src/runs/compare.js +132 -0
  176. package/dist/src/runs/compare.js.map +1 -0
  177. package/dist/src/runs/events.js +79 -0
  178. package/dist/src/runs/events.js.map +1 -0
  179. package/dist/src/runs/executor.js +480 -0
  180. package/dist/src/runs/executor.js.map +1 -0
  181. package/dist/src/runs/finalizer.js +22 -0
  182. package/dist/src/runs/finalizer.js.map +1 -0
  183. package/dist/src/runs/identity.js +35 -0
  184. package/dist/src/runs/identity.js.map +1 -0
  185. package/dist/src/runs/index.js +11 -0
  186. package/dist/src/runs/index.js.map +1 -0
  187. package/dist/src/runs/manifest.js +70 -0
  188. package/dist/src/runs/manifest.js.map +1 -0
  189. package/dist/src/runs/outcome.js +49 -0
  190. package/dist/src/runs/outcome.js.map +1 -0
  191. package/dist/src/runs/query.js +104 -0
  192. package/dist/src/runs/query.js.map +1 -0
  193. package/dist/src/runs/queued.js +54 -0
  194. package/dist/src/runs/queued.js.map +1 -0
  195. package/dist/src/runs/records.js +288 -0
  196. package/dist/src/runs/records.js.map +1 -0
  197. package/dist/src/runs/request.js +169 -0
  198. package/dist/src/runs/request.js.map +1 -0
  199. package/dist/src/trajectories/contract.js +17 -0
  200. package/dist/src/trajectories/contract.js.map +1 -0
  201. package/dist/src/trajectories/format.js +127 -0
  202. package/dist/src/trajectories/format.js.map +1 -0
  203. package/dist/src/trajectories/index.js +7 -0
  204. package/dist/src/trajectories/index.js.map +1 -0
  205. package/dist/src/trajectories/projector.js +385 -0
  206. package/dist/src/trajectories/projector.js.map +1 -0
  207. package/dist/src/trajectories/provider-capture.js +133 -0
  208. package/dist/src/trajectories/provider-capture.js.map +1 -0
  209. package/dist/src/trajectories/providers/deepseek.js +179 -0
  210. package/dist/src/trajectories/providers/deepseek.js.map +1 -0
  211. package/dist/src/trajectories/store.js +421 -0
  212. package/dist/src/trajectories/store.js.map +1 -0
  213. package/dist/src/workspaces/copy.js +142 -0
  214. package/dist/src/workspaces/copy.js.map +1 -0
  215. package/dist/src/workspaces/digest.js +47 -0
  216. package/dist/src/workspaces/digest.js.map +1 -0
  217. package/dist/src/workspaces/git.js +164 -0
  218. package/dist/src/workspaces/git.js.map +1 -0
  219. package/dist/src/workspaces/index.js +6 -0
  220. package/dist/src/workspaces/index.js.map +1 -0
  221. package/dist/src/workspaces/lifecycle.js +313 -0
  222. package/dist/src/workspaces/lifecycle.js.map +1 -0
  223. package/dist/src/workspaces/planner.js +80 -0
  224. package/dist/src/workspaces/planner.js.map +1 -0
  225. package/dist/src/workspaces/store.js +25 -0
  226. package/dist/src/workspaces/store.js.map +1 -0
  227. package/dist/src/workspaces/types.js +4 -0
  228. package/dist/src/workspaces/types.js.map +1 -0
  229. package/dist/src/workspaces/utils.js +56 -0
  230. package/dist/src/workspaces/utils.js.map +1 -0
  231. package/docs/schemas/controller-runtime-manifest.schema.json +57 -0
  232. package/docs/schemas/controller-runtime-ref.schema.json +16 -0
  233. package/docs/schemas/eval-request.schema.json +2 -0
  234. package/docs/schemas/eval-result.schema.json +36 -1
  235. package/docs/schemas/local-git-transport-manifest.schema.json +34 -0
  236. package/docs/schemas/message-feedback.schema.json +37 -0
  237. package/docs/schemas/result.schema.json +9 -0
  238. package/docs/schemas/run-context.schema.json +39 -0
  239. package/docs/schemas/run-manifest.schema.json +81 -0
  240. package/docs/schemas/run-request.schema.json +16 -1
  241. package/docs/schemas/trajectory-ref.schema.json +73 -0
  242. package/integrations/harbor/hitch_harbor_agent.py +551 -5
  243. package/package.json +37 -11
  244. package/bin/hitch.js +0 -9
  245. package/src/adapters.js +0 -435
  246. package/src/artifacts.js +0 -949
  247. package/src/cli.js +0 -505
  248. package/src/config.js +0 -51
  249. package/src/daemon.js +0 -416
  250. package/src/engine.js +0 -400
  251. package/src/errors.js +0 -12
  252. package/src/eval-tools.js +0 -334
  253. package/src/evals.js +0 -276
  254. package/src/events.js +0 -69
  255. package/src/fs.js +0 -43
  256. package/src/harbor-backend.js +0 -285
  257. package/src/harness-reference.js +0 -78
  258. package/src/line-stream.js +0 -17
  259. package/src/locks.js +0 -33
  260. package/src/process.js +0 -49
  261. package/src/registry.js +0 -84
  262. package/src/scheduler.js +0 -156
  263. package/src/workspaces.js +0 -893
@@ -0,0 +1,179 @@
1
+ import { createHash } from "node:crypto";
2
+ import { lstat, readFile, readdir, stat } from "node:fs/promises";
3
+ import path from "node:path";
4
+ import { writePrivateFile } from "../../foundation/index.js";
5
+ import { parseEventLine, parseHeaderLine } from "../format.js";
6
+ import { redactProviderJSON } from "../provider-capture.js";
7
+ import { finalizeInterruptedTrajectory, validateTrajectoryInvariants } from "../store.js";
8
+ const CANONICAL_EVENT_TYPES = new Set([
9
+ "turn/start", "turn/end", "step/start", "step/end",
10
+ "request/header", "user/message", "assistant/chunk", "assistant/message",
11
+ "tool/call", "tool/result",
12
+ ]);
13
+ /**
14
+ * Import the session flushed by DSH's headless profile. The original,
15
+ * redacted JSONL is retained as provider evidence; the canonical copy keeps
16
+ * DSH's native timestamps and structured events, while marking DSH-internal
17
+ * extension events as ignorable under the shared session contract.
18
+ */
19
+ export async function importDeepseekNativeSession(options) {
20
+ const located = await findSessionFiles(path.join(options.runtimeHome, "sessions"));
21
+ if (located.compressed.length > 0) {
22
+ throw new Error("DeepSeek wrote a compressed native session despite Hitch's compression:none runtime patch");
23
+ }
24
+ if (located.jsonl.length === 0)
25
+ return null;
26
+ const sessions = await Promise.all(located.jsonl.map((source) => readNativeSession(source)));
27
+ const roots = sessions.filter((session) => session.header.parentSession === undefined);
28
+ if (roots.length !== 1) {
29
+ throw new Error(`DeepSeek wrote ${roots.length} root native sessions for one run; refusing an ambiguous import`);
30
+ }
31
+ const primary = roots[0];
32
+ const header = { ...primary.header, id: options.runId };
33
+ const events = options.status === "succeeded"
34
+ ? primary.events
35
+ : finalizeInterruptedTrajectory(header, primary.events, options.status);
36
+ if (options.status === "succeeded")
37
+ validateTrajectoryInvariants(header, events);
38
+ const ordered = [primary, ...sessions.filter((session) => session !== primary)];
39
+ const providerFiles = [];
40
+ const redactionCounts = new Map();
41
+ for (let index = 0; index < ordered.length; index += 1) {
42
+ const session = ordered[index];
43
+ const relativePath = index === 0
44
+ ? "trajectory/provider/deepseek-session.jsonl"
45
+ : `trajectory/provider/deepseek-child-session-${index}.jsonl`;
46
+ const target = path.join(options.runDirectory, ...relativePath.split("/"));
47
+ const providerContent = `${session.providerRows.map((row) => JSON.stringify(row)).join("\n")}\n`;
48
+ await writePrivateFile(target, providerContent);
49
+ const info = await stat(target);
50
+ const digest = createHash("sha256").update(providerContent).digest("hex");
51
+ providerFiles.push({
52
+ role: "provider_events",
53
+ path: relativePath,
54
+ media_type: "application/x-ndjson",
55
+ sha256: `sha256:${digest}`,
56
+ bytes: info.size,
57
+ });
58
+ for (const [rule, count] of session.redactions) {
59
+ redactionCounts.set(rule, (redactionCounts.get(rule) || 0) + count);
60
+ }
61
+ }
62
+ const result = {
63
+ header,
64
+ events,
65
+ providerSessionId: primary.header.id,
66
+ providerFiles,
67
+ redactions: [...redactionCounts.entries()]
68
+ .sort(([left], [right]) => left.localeCompare(right))
69
+ .map(([rule_id, count]) => ({ rule_id, count })),
70
+ finalOutput: lastAssistantText(events),
71
+ };
72
+ const effectiveModel = lastEffectiveModel(events);
73
+ if (effectiveModel)
74
+ result.effectiveModel = effectiveModel;
75
+ return result;
76
+ }
77
+ async function readNativeSession(source) {
78
+ const input = await readFile(source, "utf8");
79
+ const lines = input.split(/\r?\n/).filter((line) => line.length > 0);
80
+ if (lines.length === 0)
81
+ throw new Error(`DeepSeek native session is empty: ${source}`);
82
+ const redactions = new Map();
83
+ const providerRows = [];
84
+ const redact = (value) => {
85
+ const result = redactProviderJSON(value);
86
+ for (const [rule, count] of result.redactions) {
87
+ redactions.set(rule, (redactions.get(rule) || 0) + count);
88
+ }
89
+ providerRows.push(result.value);
90
+ return result.value;
91
+ };
92
+ const header = parseHeaderLine(redact(parseJSON(lines[0], 1)));
93
+ const events = [];
94
+ for (let index = 1; index < lines.length; index += 1) {
95
+ const parsed = parseEventLine(redact(parseJSON(lines[index], index + 1)));
96
+ const expected = index - 1;
97
+ if (parsed.seq !== expected) {
98
+ throw new Error(`DeepSeek native session seq must be contiguous: expected ${expected}, got ${parsed.seq}`);
99
+ }
100
+ events.push(CANONICAL_EVENT_TYPES.has(parsed.type) ? parsed : { ...parsed, ignorable: true });
101
+ }
102
+ return { header, events, providerRows, redactions };
103
+ }
104
+ function parseJSON(line, lineNumber) {
105
+ try {
106
+ return JSON.parse(line);
107
+ }
108
+ catch (error) {
109
+ throw new Error(`invalid DeepSeek native session JSON at line ${lineNumber}`, { cause: error });
110
+ }
111
+ }
112
+ async function findSessionFiles(root) {
113
+ const result = { jsonl: [], compressed: [] };
114
+ let rootInfo;
115
+ try {
116
+ rootInfo = await lstat(root);
117
+ }
118
+ catch (error) {
119
+ if (error.code === "ENOENT")
120
+ return result;
121
+ throw error;
122
+ }
123
+ if (!rootInfo.isDirectory() || rootInfo.isSymbolicLink())
124
+ return result;
125
+ const visit = async (directory, depth) => {
126
+ if (depth > 8)
127
+ throw new Error("DeepSeek native session directory nesting is unexpectedly deep");
128
+ for (const entry of await readdir(directory, { withFileTypes: true })) {
129
+ const candidate = path.join(directory, entry.name);
130
+ if (entry.isSymbolicLink())
131
+ continue;
132
+ if (entry.isDirectory()) {
133
+ await visit(candidate, depth + 1);
134
+ }
135
+ else if (entry.isFile() && entry.name === "session.jsonl") {
136
+ result.jsonl.push(candidate);
137
+ }
138
+ else if (entry.isFile() && entry.name === "session.jsonl.zstd") {
139
+ result.compressed.push(candidate);
140
+ }
141
+ }
142
+ };
143
+ await visit(root, 0);
144
+ result.jsonl.sort();
145
+ result.compressed.sort();
146
+ return result;
147
+ }
148
+ function lastAssistantText(events) {
149
+ for (let index = events.length - 1; index >= 0; index -= 1) {
150
+ const event = events[index];
151
+ if (event.type !== "assistant/message")
152
+ continue;
153
+ const data = event.data;
154
+ const message = data.message;
155
+ const content = Array.isArray(message?.content) ? message.content : [];
156
+ const text = content
157
+ .filter((block) => Boolean(block) && typeof block === "object" && !Array.isArray(block))
158
+ .filter((block) => block.type === "text" && typeof block.text === "string")
159
+ .map((block) => block.text)
160
+ .join("");
161
+ if (text)
162
+ return text;
163
+ }
164
+ return "";
165
+ }
166
+ function lastEffectiveModel(events) {
167
+ for (let index = events.length - 1; index >= 0; index -= 1) {
168
+ const event = events[index];
169
+ if (event.type !== "assistant/message")
170
+ continue;
171
+ const data = event.data;
172
+ const message = data.message;
173
+ const source = message?.source;
174
+ if (typeof source?.model === "string" && source.model.trim())
175
+ return source.model.trim();
176
+ }
177
+ return undefined;
178
+ }
179
+ //# sourceMappingURL=deepseek.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deepseek.js","sourceRoot":"","sources":["../../../../src/trajectories/providers/deepseek.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,421 @@
1
+ /**
2
+ * Canonical trajectory store: per-run DSH-compatible persistence root
3
+ * (spec §5.2). One persistence root per run prevents collisions when two
4
+ * providers reuse a native session id while retaining the DSH
5
+ * project/session directory shape.
6
+ */
7
+ import { createHash, randomUUID } from "node:crypto";
8
+ import { createWriteStream } from "node:fs";
9
+ import { readFile, readdir, rm, stat } from "node:fs/promises";
10
+ import path from "node:path";
11
+ import { ensureDir, readJSON } from "../foundation/index.js";
12
+ import { eventLine, headerLine, logPath, parseEventLine, parseHeaderLine } from "./format.js";
13
+ import { TRAJECTORY_FORMAT } from "./contract.js";
14
+ import { validateTrajectoryRef } from "../domain/index.js";
15
+ /**
16
+ * Append-only writer for one canonical trajectory. The first logical line is
17
+ * the immutable session header; every following line is one `SessionEvent`
18
+ * JSON object. `seq` starts at 0 and remains contiguous. Writes are
19
+ * serialized through a promise chain so failures surface on `close()`.
20
+ */
21
+ export class TrajectoryWriter {
22
+ target;
23
+ stream;
24
+ pending = Promise.resolve();
25
+ nextSeq = 0;
26
+ closed = false;
27
+ streamError;
28
+ constructor(target, stream) {
29
+ this.target = target;
30
+ this.stream = stream;
31
+ stream.on("error", (error) => { this.streamError ||= error; });
32
+ }
33
+ static async open(options) {
34
+ const target = trajectoryLogPath(options.runDirectory, options.cwd, options.sessionId);
35
+ await ensureDir(path.dirname(target));
36
+ const writer = new TrajectoryWriter(target, createWriteStream(target, { flags: "ax", mode: 0o600 }));
37
+ await writer.enqueue(headerLine(options.header));
38
+ return writer;
39
+ }
40
+ get path() {
41
+ return this.target;
42
+ }
43
+ /** Append one event; `seq` must continue the log. */
44
+ append(event) {
45
+ if (this.closed)
46
+ throw new Error("trajectory writer is closed");
47
+ if (event.seq !== this.nextSeq) {
48
+ throw new Error(`trajectory seq must be contiguous: expected ${this.nextSeq}, got ${event.seq}`);
49
+ }
50
+ this.nextSeq += 1;
51
+ this.enqueue(eventLine(event));
52
+ }
53
+ enqueue(line) {
54
+ const operation = this.pending.then(() => new Promise((resolve, reject) => {
55
+ this.stream.write(line, (error) => error ? reject(error) : resolve());
56
+ }));
57
+ this.pending = operation.catch(() => { });
58
+ return operation;
59
+ }
60
+ async flush() {
61
+ await this.pending;
62
+ }
63
+ /** Close the writer; resolves with the canonical trajectory path. */
64
+ async close() {
65
+ if (this.closed) {
66
+ await this.pending;
67
+ return this.target;
68
+ }
69
+ this.closed = true;
70
+ let failure;
71
+ try {
72
+ await this.pending;
73
+ }
74
+ catch (error) {
75
+ failure = error;
76
+ }
77
+ try {
78
+ await closeStream(this.stream);
79
+ }
80
+ catch (error) {
81
+ failure ||= error;
82
+ }
83
+ failure ||= this.streamError;
84
+ if (failure)
85
+ throw failure;
86
+ return this.target;
87
+ }
88
+ }
89
+ function closeStream(stream) {
90
+ return new Promise((resolve, reject) => {
91
+ stream.once("error", reject);
92
+ stream.end(resolve);
93
+ });
94
+ }
95
+ /** The `trajectory/--<normalized-cwd>--/<encoded-session-id>/session.jsonl` path under a run directory. */
96
+ export function trajectoryLogPath(runDirectory, cwd, sessionId) {
97
+ return logPath(path.join(runDirectory, "trajectory", "canonical"), cwd, sessionId);
98
+ }
99
+ export function trajectoryRefPath(runDirectory) {
100
+ return path.join(runDirectory, "trajectory.ref.json");
101
+ }
102
+ export function trajectoryRef(runId, sessionId, fidelity, trajectoryPath, sha256, providerSessionId) {
103
+ const ref = {
104
+ schema_version: "1",
105
+ run_id: runId,
106
+ session_id: sessionId,
107
+ format: TRAJECTORY_FORMAT,
108
+ fidelity,
109
+ path: trajectoryPath,
110
+ sha256: sha256,
111
+ };
112
+ if (providerSessionId !== undefined)
113
+ ref.provider_session_id = providerSessionId;
114
+ return ref;
115
+ }
116
+ export async function canonicalTrajectoryFileRef(runDirectory, trajectoryPath) {
117
+ const relative = path.relative(runDirectory, trajectoryPath).split(path.sep).join("/");
118
+ if (!relative || relative.startsWith("../") || path.isAbsolute(relative)) {
119
+ throw new Error("canonical trajectory must be inside its run directory");
120
+ }
121
+ const info = await stat(trajectoryPath);
122
+ return {
123
+ role: "canonical_session",
124
+ path: relative,
125
+ media_type: "application/x-ndjson",
126
+ sha256: await trajectoryFileSha256(trajectoryPath),
127
+ bytes: info.size,
128
+ };
129
+ }
130
+ export function trajectoryRefV2(options) {
131
+ const ref = {
132
+ schema_version: "2",
133
+ run_id: options.runId,
134
+ fidelity: options.fidelity,
135
+ files: options.files,
136
+ };
137
+ if (options.provider)
138
+ ref.provider = options.provider;
139
+ if (options.providerSessionId)
140
+ ref.provider_session_id = options.providerSessionId;
141
+ if (options.redactions?.length)
142
+ ref.redactions = options.redactions;
143
+ return validateTrajectoryRef(ref);
144
+ }
145
+ /**
146
+ * Read and validate a canonical trajectory. Validates header identity, the
147
+ * declared file set, contiguous sequence numbers, and relational invariants.
148
+ */
149
+ export async function readTrajectory(file) {
150
+ const content = await readFile(file, "utf8");
151
+ const sha256 = `sha256:${createHash("sha256").update(content).digest("hex")}`;
152
+ const lines = content.split(/\r?\n/);
153
+ const nonEmpty = lines.filter((line) => line.length > 0);
154
+ if (nonEmpty.length === 0)
155
+ throw new Error(`trajectory is empty: ${file}`);
156
+ const header = parseHeaderLine(JSON.parse(nonEmpty[0]));
157
+ const events = [];
158
+ for (let i = 1; i < nonEmpty.length; i += 1) {
159
+ const parsed = parseEventLine(JSON.parse(nonEmpty[i]));
160
+ if (parsed.seq !== i - 1) {
161
+ throw new Error(`trajectory seq must be contiguous: expected ${i - 1}, got ${parsed.seq}`);
162
+ }
163
+ events.push(parsed);
164
+ }
165
+ validateTrajectoryInvariants(header, events);
166
+ return { header, events, sha256 };
167
+ }
168
+ /** Validate the required relational invariants of a canonical trajectory (spec §5.4). */
169
+ export function validateTrajectoryInvariants(header, events) {
170
+ const knownTypes = new Set([
171
+ "turn/start", "turn/end", "step/start", "step/end",
172
+ "request/header", "user/message", "assistant/chunk", "assistant/message",
173
+ "tool/call", "tool/result",
174
+ ]);
175
+ let turnOpen = false;
176
+ let stepOpen = false;
177
+ let openTurn = null;
178
+ let openStep = null;
179
+ const openCalls = new Set();
180
+ let seq = 0;
181
+ for (const event of events) {
182
+ if (event.seq !== seq)
183
+ throw new Error(`trajectory seq must be contiguous: expected ${seq}, got ${event.seq}`);
184
+ seq += 1;
185
+ const data = (event.data || {});
186
+ switch (event.type) {
187
+ case "turn/start": {
188
+ if (turnOpen)
189
+ throw new Error(`nested turn/start at seq ${event.seq}`);
190
+ turnOpen = true;
191
+ openTurn = data.turn;
192
+ break;
193
+ }
194
+ case "turn/end": {
195
+ if (!turnOpen)
196
+ throw new Error(`turn/end without turn/start at seq ${event.seq}`);
197
+ if (stepOpen)
198
+ throw new Error(`turn/end with open step at seq ${event.seq}`);
199
+ turnOpen = false;
200
+ openTurn = null;
201
+ break;
202
+ }
203
+ case "step/start": {
204
+ if (!turnOpen)
205
+ throw new Error(`step/start outside a turn at seq ${event.seq}`);
206
+ if (stepOpen)
207
+ throw new Error(`nested step/start at seq ${event.seq}`);
208
+ stepOpen = true;
209
+ openStep = { turn: data.turn, step: data.step };
210
+ break;
211
+ }
212
+ case "step/end": {
213
+ if (!stepOpen)
214
+ throw new Error(`step/end without step/start at seq ${event.seq}`);
215
+ if (openCalls.size > 0)
216
+ throw new Error(`step/end with open tool calls at seq ${event.seq}`);
217
+ stepOpen = false;
218
+ openStep = null;
219
+ break;
220
+ }
221
+ case "tool/call": {
222
+ if (!stepOpen)
223
+ throw new Error(`tool/call outside a step at seq ${event.seq}`);
224
+ const callId = data.callId;
225
+ if (openCalls.has(callId))
226
+ throw new Error(`duplicate tool call ${callId} at seq ${event.seq}`);
227
+ openCalls.add(callId);
228
+ break;
229
+ }
230
+ case "tool/result": {
231
+ const message = (data.message || {});
232
+ const source = (message.source || {});
233
+ const content = Array.isArray(message.content) ? message.content : [];
234
+ const callId = (source.callId ?? content[0]?.toolCallId);
235
+ if (!callId || !openCalls.has(callId)) {
236
+ throw new Error(`tool/result without a matching open tool call at seq ${event.seq}`);
237
+ }
238
+ openCalls.delete(callId);
239
+ break;
240
+ }
241
+ default:
242
+ if (!knownTypes.has(event.type) && !event.ignorable) {
243
+ throw new Error(`unknown required event type ${event.type} at seq ${event.seq}`);
244
+ }
245
+ }
246
+ }
247
+ if (turnOpen)
248
+ throw new Error("trajectory ends with an open turn");
249
+ if (stepOpen)
250
+ throw new Error("trajectory ends with an open step");
251
+ if (openCalls.size > 0)
252
+ throw new Error("trajectory ends with open tool calls");
253
+ if (openTurn !== null)
254
+ throw new Error("trajectory ends with an open turn bracket");
255
+ if (openStep !== null)
256
+ throw new Error("trajectory ends with an open step bracket");
257
+ }
258
+ /**
259
+ * Seal the structurally valid prefix left by an interrupted native provider.
260
+ * Provider rows remain untouched; Hitch only appends canonical recovery
261
+ * events for calls whose outcome is unknown and for open step/turn brackets.
262
+ */
263
+ export function finalizeInterruptedTrajectory(header, events, status) {
264
+ const finalized = [...events];
265
+ let openTurn = null;
266
+ let openStep = null;
267
+ const openCalls = new Map();
268
+ for (const event of finalized) {
269
+ const data = (event.data || {});
270
+ switch (event.type) {
271
+ case "turn/start":
272
+ openTurn = data.turn;
273
+ break;
274
+ case "turn/end":
275
+ openTurn = null;
276
+ break;
277
+ case "step/start":
278
+ openStep = { turn: data.turn, step: data.step };
279
+ break;
280
+ case "step/end":
281
+ openStep = null;
282
+ break;
283
+ case "tool/call": {
284
+ const callId = data.callId;
285
+ openCalls.set(callId, { name: typeof data.name === "string" ? data.name : "unknown" });
286
+ break;
287
+ }
288
+ case "tool/result": {
289
+ const message = (data.message || {});
290
+ const source = (message.source || {});
291
+ const content = Array.isArray(message.content) ? message.content : [];
292
+ const callId = (source.callId ?? content[0]?.toolCallId);
293
+ if (callId)
294
+ openCalls.delete(callId);
295
+ break;
296
+ }
297
+ }
298
+ }
299
+ let nextTime = Math.max(Date.now(), (finalized.at(-1)?.time ?? 0) + 1);
300
+ const append = (event) => {
301
+ finalized.push({ ...event, seq: finalized.length, time: nextTime });
302
+ nextTime += 1;
303
+ };
304
+ if (finalized.length === 0) {
305
+ openTurn = 1;
306
+ append({ type: "turn/start", data: { turn: openTurn } });
307
+ }
308
+ for (const [callId, call] of openCalls) {
309
+ if (!openStep)
310
+ break;
311
+ append({
312
+ type: "tool/result",
313
+ data: {
314
+ turn: openStep.turn,
315
+ step: openStep.step,
316
+ message: {
317
+ id: randomUUID(),
318
+ role: "user",
319
+ content: [{
320
+ type: "tool-result",
321
+ toolCallId: callId,
322
+ content: [{ type: "text", text: `tool call interrupted: ${call.name} outcome unknown` }],
323
+ isError: true,
324
+ }],
325
+ source: { kind: "tool", callId },
326
+ },
327
+ error: { name: call.name, code: "TOOL_OUTCOME_UNKNOWN" },
328
+ },
329
+ surfaceOp: "append",
330
+ });
331
+ }
332
+ if (openStep)
333
+ append({ type: "step/end", data: { turn: openStep.turn, step: openStep.step } });
334
+ if (openTurn !== null) {
335
+ append({ type: "turn/end", data: { turn: openTurn, reason: interruptedTerminalReason(status) } });
336
+ }
337
+ validateTrajectoryInvariants(header, finalized);
338
+ return finalized;
339
+ }
340
+ function interruptedTerminalReason(status) {
341
+ if (status === "timed_out")
342
+ return { kind: "aborted", reason: { kind: "hook", reason: "timeout" } };
343
+ if (status === "cancelled")
344
+ return { kind: "aborted", reason: { kind: "user" } };
345
+ return { kind: "error", error: { message: "agent process failed", code: "UNKNOWN" } };
346
+ }
347
+ export async function loadTrajectoryRef(runDirectory) {
348
+ const raw = await readJSON(trajectoryRefPath(runDirectory), null);
349
+ if (!raw)
350
+ return null;
351
+ const ref = validateTrajectoryRef(raw);
352
+ if (ref.schema_version === "1")
353
+ return ref;
354
+ const canonical = ref.files.find((file) => file.role === "canonical_session");
355
+ if (!canonical)
356
+ return null;
357
+ const absolute = path.resolve(runDirectory, ...canonical.path.split("/"));
358
+ const relative = path.relative(path.resolve(runDirectory), absolute);
359
+ if (!relative || relative.startsWith("..") || path.isAbsolute(relative)) {
360
+ throw new Error(`trajectory path escapes run directory: ${canonical.path}`);
361
+ }
362
+ const content = await readFile(absolute, "utf8");
363
+ const first = content.split(/\r?\n/).find((line) => line.length > 0);
364
+ if (!first)
365
+ throw new Error(`canonical trajectory is empty: ${canonical.path}`);
366
+ const header = parseHeaderLine(JSON.parse(first));
367
+ return {
368
+ ...ref,
369
+ path: absolute,
370
+ session_id: header.id,
371
+ sha256: canonical.sha256,
372
+ };
373
+ }
374
+ export async function removeTrajectory(runDirectory) {
375
+ await rm(path.join(runDirectory, "trajectory"), { recursive: true, force: true });
376
+ }
377
+ /** Compute the SHA-256 digest of an existing trajectory file. */
378
+ export async function trajectoryFileSha256(file) {
379
+ const content = await readFile(file, "utf8");
380
+ return `sha256:${createHash("sha256").update(content).digest("hex")}`;
381
+ }
382
+ export async function listTrajectorySessions(runDirectory) {
383
+ const canonicalRoot = path.join(runDirectory, "trajectory", "canonical");
384
+ const root = await stat(canonicalRoot).then(() => canonicalRoot).catch(() => path.join(runDirectory, "trajectory"));
385
+ let projects;
386
+ try {
387
+ projects = await readdir(root, { withFileTypes: true });
388
+ }
389
+ catch (error) {
390
+ if (error?.code === "ENOENT")
391
+ return [];
392
+ throw error;
393
+ }
394
+ const sessions = [];
395
+ for (const project of projects) {
396
+ if (!project.isDirectory())
397
+ continue;
398
+ let entries;
399
+ try {
400
+ entries = await readdir(path.join(root, project.name), { withFileTypes: true });
401
+ }
402
+ catch {
403
+ continue;
404
+ }
405
+ for (const entry of entries) {
406
+ if (!entry.isDirectory())
407
+ continue;
408
+ const candidate = path.join(root, project.name, entry.name, "session.jsonl");
409
+ try {
410
+ await stat(candidate);
411
+ sessions.push(candidate);
412
+ }
413
+ catch {
414
+ // Not a session directory.
415
+ }
416
+ }
417
+ }
418
+ return sessions.sort();
419
+ }
420
+ export { TRAJECTORY_FORMAT };
421
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/trajectories/store.ts"],"names":[],"mappings":"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"}