agent-hitch 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (92) hide show
  1. package/README.md +240 -126
  2. package/README.zh-CN.md +330 -0
  3. package/dist/bin/hitch.js +9 -0
  4. package/dist/bin/hitch.js.map +1 -0
  5. package/dist/scripts/check-release.js +25 -0
  6. package/dist/scripts/check-release.js.map +1 -0
  7. package/dist/scripts/check-syntax.js +32 -0
  8. package/dist/scripts/check-syntax.js.map +1 -0
  9. package/dist/src/adapters.js +461 -0
  10. package/dist/src/adapters.js.map +1 -0
  11. package/dist/src/artifacts.js +1081 -0
  12. package/dist/src/artifacts.js.map +1 -0
  13. package/dist/src/cli.js +699 -0
  14. package/dist/src/cli.js.map +1 -0
  15. package/dist/src/config.js +53 -0
  16. package/dist/src/config.js.map +1 -0
  17. package/dist/src/controller-runtime/hash.js +353 -0
  18. package/dist/src/controller-runtime/hash.js.map +1 -0
  19. package/dist/src/controller-runtime/store.js +323 -0
  20. package/dist/src/controller-runtime/store.js.map +1 -0
  21. package/dist/src/daemon.js +461 -0
  22. package/dist/src/daemon.js.map +1 -0
  23. package/dist/src/domain/types.js +10 -0
  24. package/dist/src/domain/types.js.map +1 -0
  25. package/dist/src/domain/validate.js +240 -0
  26. package/dist/src/domain/validate.js.map +1 -0
  27. package/dist/src/engine.js +465 -0
  28. package/dist/src/engine.js.map +1 -0
  29. package/dist/src/errors.js +14 -0
  30. package/dist/src/errors.js.map +1 -0
  31. package/dist/src/eval-tools.js +318 -0
  32. package/dist/src/eval-tools.js.map +1 -0
  33. package/dist/src/evals.js +313 -0
  34. package/dist/src/evals.js.map +1 -0
  35. package/dist/src/events.js +80 -0
  36. package/dist/src/events.js.map +1 -0
  37. package/dist/src/feedback/service.js +315 -0
  38. package/dist/src/feedback/service.js.map +1 -0
  39. package/dist/src/fs.js +45 -0
  40. package/dist/src/fs.js.map +1 -0
  41. package/dist/src/harbor-backend.js +280 -0
  42. package/dist/src/harbor-backend.js.map +1 -0
  43. package/dist/src/harness-reference.js +83 -0
  44. package/dist/src/harness-reference.js.map +1 -0
  45. package/dist/src/line-stream.js +20 -0
  46. package/dist/src/line-stream.js.map +1 -0
  47. package/dist/src/locks.js +38 -0
  48. package/dist/src/locks.js.map +1 -0
  49. package/dist/src/package-root.js +40 -0
  50. package/dist/src/package-root.js.map +1 -0
  51. package/dist/src/process.js +50 -0
  52. package/dist/src/process.js.map +1 -0
  53. package/dist/src/registry.js +81 -0
  54. package/dist/src/registry.js.map +1 -0
  55. package/dist/src/scheduler.js +162 -0
  56. package/dist/src/scheduler.js.map +1 -0
  57. package/dist/src/trajectories/contract.js +17 -0
  58. package/dist/src/trajectories/contract.js.map +1 -0
  59. package/dist/src/trajectories/format.js +127 -0
  60. package/dist/src/trajectories/format.js.map +1 -0
  61. package/dist/src/trajectories/projector.js +385 -0
  62. package/dist/src/trajectories/projector.js.map +1 -0
  63. package/dist/src/trajectories/store.js +281 -0
  64. package/dist/src/trajectories/store.js.map +1 -0
  65. package/dist/src/workspaces.js +858 -0
  66. package/dist/src/workspaces.js.map +1 -0
  67. package/docs/schemas/controller-runtime-manifest.schema.json +57 -0
  68. package/docs/schemas/controller-runtime-ref.schema.json +16 -0
  69. package/docs/schemas/message-feedback.schema.json +37 -0
  70. package/docs/schemas/trajectory-ref.schema.json +30 -0
  71. package/integrations/harbor/hitch_harbor_agent.py +176 -4
  72. package/package.json +19 -11
  73. package/bin/hitch.js +0 -9
  74. package/src/adapters.js +0 -361
  75. package/src/artifacts.js +0 -948
  76. package/src/cli.js +0 -505
  77. package/src/config.js +0 -51
  78. package/src/daemon.js +0 -416
  79. package/src/engine.js +0 -386
  80. package/src/errors.js +0 -12
  81. package/src/eval-tools.js +0 -331
  82. package/src/evals.js +0 -276
  83. package/src/events.js +0 -69
  84. package/src/fs.js +0 -43
  85. package/src/harbor-backend.js +0 -285
  86. package/src/harness-reference.js +0 -78
  87. package/src/line-stream.js +0 -17
  88. package/src/locks.js +0 -33
  89. package/src/process.js +0 -49
  90. package/src/registry.js +0 -84
  91. package/src/scheduler.js +0 -156
  92. package/src/workspaces.js +0 -893
@@ -0,0 +1,240 @@
1
+ /**
2
+ * Runtime validators for external JSON, provider events, CLI input, and
3
+ * process output. Values enter as `unknown` and are narrowed here before any
4
+ * domain code touches them (spec §8.2).
5
+ *
6
+ * Pure functions only — no CLI, daemon, backend, or filesystem imports.
7
+ */
8
+ export function isRecord(value) {
9
+ return typeof value === "object" && value !== null && !Array.isArray(value);
10
+ }
11
+ export function asRecord(value, label = "value") {
12
+ if (!isRecord(value))
13
+ throw new TypeError(`${label} must be a JSON object`);
14
+ return value;
15
+ }
16
+ export function asString(value, label = "value") {
17
+ if (typeof value !== "string")
18
+ throw new TypeError(`${label} must be a string`);
19
+ return value;
20
+ }
21
+ export function asOptionalString(value, label = "value") {
22
+ if (value === undefined)
23
+ return undefined;
24
+ return asString(value, label);
25
+ }
26
+ export function asNumber(value, label = "value") {
27
+ if (typeof value !== "number" || !Number.isFinite(value))
28
+ throw new TypeError(`${label} must be a finite number`);
29
+ return value;
30
+ }
31
+ export function asInteger(value, label = "value") {
32
+ const number = asNumber(value, label);
33
+ if (!Number.isSafeInteger(number))
34
+ throw new TypeError(`${label} must be a safe integer`);
35
+ return number;
36
+ }
37
+ export function asBoolean(value, label = "value") {
38
+ if (typeof value !== "boolean")
39
+ throw new TypeError(`${label} must be a boolean`);
40
+ return value;
41
+ }
42
+ export function asArray(value, label = "value") {
43
+ if (!Array.isArray(value))
44
+ throw new TypeError(`${label} must be an array`);
45
+ return value;
46
+ }
47
+ /** Non-negative safe-integer Unix epoch milliseconds. */
48
+ export function asEpochMillis(value, label = "value") {
49
+ const number = asInteger(value, label);
50
+ if (number < 0)
51
+ throw new TypeError(`${label} must be a non-negative epoch millisecond value`);
52
+ return number;
53
+ }
54
+ export function validateSessionHeaderLine(value) {
55
+ const record = asRecord(value, "session header line");
56
+ if (record.type !== "session")
57
+ throw new TypeError("session header line must have type 'session'");
58
+ const version = asInteger(record.version, "session header version");
59
+ if (version !== 0)
60
+ throw new TypeError(`unsupported session format version: ${version}`);
61
+ const id = asString(record.id, "session id");
62
+ const createdAt = asEpochMillis(record.createdAt, "session createdAt");
63
+ const delegationDepth = asInteger(record.delegationDepth, "delegationDepth");
64
+ if (delegationDepth < 0)
65
+ throw new TypeError("delegationDepth must be non-negative");
66
+ const header = {
67
+ type: "session",
68
+ version,
69
+ id,
70
+ createdAt,
71
+ delegationDepth,
72
+ };
73
+ const cwd = asOptionalString(record.cwd, "session cwd");
74
+ if (cwd !== undefined)
75
+ header.cwd = cwd;
76
+ const parentSession = asOptionalString(record.parentSession, "parentSession");
77
+ if (parentSession !== undefined)
78
+ header.parentSession = parentSession;
79
+ const seedLength = record.seedLength === undefined ? undefined : asInteger(record.seedLength, "seedLength");
80
+ if (seedLength !== undefined)
81
+ header.seedLength = seedLength;
82
+ if (record.origin !== undefined) {
83
+ if (record.origin !== "subagent")
84
+ throw new TypeError("origin must be 'subagent'");
85
+ header.origin = "subagent";
86
+ }
87
+ const agentPreset = asOptionalString(record.agentPreset, "agentPreset");
88
+ if (agentPreset !== undefined)
89
+ header.agentPreset = agentPreset;
90
+ return header;
91
+ }
92
+ export function validateSessionEvent(value) {
93
+ const record = asRecord(value, "session event");
94
+ const type = asString(record.type, "event type");
95
+ const seq = asInteger(record.seq, "event seq");
96
+ if (seq < 0)
97
+ throw new TypeError("event seq must be non-negative");
98
+ const time = asEpochMillis(record.time, "event time");
99
+ if (!("data" in record) || !isRecord(record.data)) {
100
+ throw new TypeError("event data must be a JSON object");
101
+ }
102
+ const event = { type, seq, time, data: record.data };
103
+ if (record.ignorable === true)
104
+ event.ignorable = true;
105
+ if (record.sourceEventSeqs !== undefined) {
106
+ event.sourceEventSeqs = asArray(record.sourceEventSeqs, "sourceEventSeqs").map((item) => asInteger(item, "sourceEventSeq"));
107
+ }
108
+ if (record.surfaceOp !== undefined) {
109
+ if (record.surfaceOp === "append") {
110
+ event.surfaceOp = "append";
111
+ }
112
+ else {
113
+ const op = asRecord(record.surfaceOp, "surfaceOp");
114
+ if (op.op !== "replace")
115
+ throw new TypeError("surfaceOp must be 'append' or { op: 'replace' }");
116
+ event.surfaceOp = { op: "replace", start: asInteger(op.start, "surfaceOp.start"), end: asInteger(op.end, "surfaceOp.end") };
117
+ }
118
+ }
119
+ return event;
120
+ }
121
+ export function validateTrajectoryRef(value) {
122
+ const record = asRecord(value, "trajectory ref");
123
+ if (record.schema_version !== "1")
124
+ throw new TypeError("trajectory ref schema_version must be '1'");
125
+ const format = asRecord(record.format, "trajectory format");
126
+ if (format.family !== "dsh-session")
127
+ throw new TypeError("trajectory format family must be 'dsh-session'");
128
+ if (format.version !== 0)
129
+ throw new TypeError("trajectory format version must be 0");
130
+ if (format.compression !== "none")
131
+ throw new TypeError("trajectory compression must be 'none'");
132
+ if (format.pack_chunks !== false)
133
+ throw new TypeError("trajectory pack_chunks must be false");
134
+ const contractCommit = asString(format.contract_commit, "contract_commit");
135
+ const fidelity = asString(record.fidelity, "fidelity");
136
+ if (fidelity !== "native" && fidelity !== "normalized" && fidelity !== "minimal") {
137
+ throw new TypeError(`invalid trajectory fidelity: ${fidelity}`);
138
+ }
139
+ const ref = {
140
+ schema_version: "1",
141
+ run_id: asString(record.run_id, "run_id"),
142
+ session_id: asString(record.session_id, "session_id"),
143
+ format: {
144
+ family: "dsh-session",
145
+ version: 0,
146
+ contract_commit: contractCommit,
147
+ compression: "none",
148
+ pack_chunks: false,
149
+ },
150
+ fidelity,
151
+ path: asString(record.path, "path"),
152
+ };
153
+ const providerSessionId = asOptionalString(record.provider_session_id, "provider_session_id");
154
+ if (providerSessionId !== undefined)
155
+ ref.provider_session_id = providerSessionId;
156
+ const sha256 = asOptionalString(record.sha256, "sha256");
157
+ if (sha256 !== undefined) {
158
+ if (!/^sha256:[0-9a-f]{64}$/.test(sha256))
159
+ throw new TypeError("trajectory sha256 must be a sha256 digest");
160
+ ref.sha256 = sha256;
161
+ }
162
+ return ref;
163
+ }
164
+ export function validateMessageFeedbackItem(value) {
165
+ const record = asRecord(value, "feedback item");
166
+ const rating = asString(record.rating, "rating");
167
+ if (rating !== "positive" && rating !== "negative")
168
+ throw new TypeError("rating must be 'positive' or 'negative'");
169
+ const version = asString(record.version, "version");
170
+ const item = {
171
+ messageId: asString(record.messageId, "messageId"),
172
+ rating,
173
+ version,
174
+ createdAt: asEpochMillis(record.createdAt, "createdAt"),
175
+ updatedAt: asEpochMillis(record.updatedAt, "updatedAt"),
176
+ };
177
+ const note = asOptionalString(record.note, "note");
178
+ if (note !== undefined)
179
+ item.note = note;
180
+ return item;
181
+ }
182
+ export function validateMessageFeedbackRow(value) {
183
+ const record = asRecord(value, "feedback row");
184
+ const session = asRecord(record.session, "feedback session");
185
+ const row = {
186
+ session: { createdAt: asEpochMillis(session.createdAt, "session.createdAt") },
187
+ items: asArray(record.items, "items").map((item) => validateMessageFeedbackItem(item)),
188
+ };
189
+ const sessionId = asOptionalString(session.sessionId, "session.sessionId");
190
+ if (sessionId !== undefined)
191
+ row.session.sessionId = sessionId;
192
+ const cwd = asOptionalString(session.cwd, "session.cwd");
193
+ if (cwd !== undefined)
194
+ row.session.cwd = cwd;
195
+ return row;
196
+ }
197
+ export function validateControllerRuntimeManifest(value) {
198
+ const record = asRecord(value, "controller runtime manifest");
199
+ if (record.schema_version !== "2")
200
+ throw new TypeError("controller runtime manifest schema_version must be '2'");
201
+ const runtimeId = asString(record.runtime_id, "runtime_id");
202
+ if (!/^sha256:[0-9a-f]{64}$/.test(runtimeId))
203
+ throw new TypeError("runtime_id must be a sha256 digest");
204
+ if (record.node_range !== ">=22")
205
+ throw new TypeError("node_range must be '>=22'");
206
+ const createdAt = asString(record.created_at, "created_at");
207
+ const entrypoints = asRecord(record.entrypoints, "entrypoints");
208
+ const cli = asRecord(entrypoints.cli, "entrypoints.cli");
209
+ const cliPath = asString(cli.path, "entrypoints.cli.path");
210
+ if (!cliPath || cliPath.includes("\\") || cliPath.startsWith("/") || cliPath.startsWith("..")) {
211
+ throw new TypeError(`invalid entrypoint path: ${cliPath}`);
212
+ }
213
+ if (cli.launcher !== "node")
214
+ throw new TypeError("entrypoints.cli.launcher must be 'node'");
215
+ const files = asArray(record.files, "files").map((entry) => {
216
+ const file = asRecord(entry, "runtime file");
217
+ const pathValue = asString(file.path, "file path");
218
+ if (!pathValue || pathValue.includes("\\") || pathValue.startsWith("/") || pathValue.startsWith("..")) {
219
+ throw new TypeError(`invalid runtime file path: ${pathValue}`);
220
+ }
221
+ const digest = asString(file.sha256, "file sha256");
222
+ if (!/^sha256:[0-9a-f]{64}$/.test(digest))
223
+ throw new TypeError("file sha256 must be a sha256 digest");
224
+ return {
225
+ path: pathValue,
226
+ size: asInteger(file.size, "file size"),
227
+ executable: asBoolean(file.executable, "file executable"),
228
+ sha256: digest,
229
+ };
230
+ });
231
+ return {
232
+ schema_version: "2",
233
+ runtime_id: runtimeId,
234
+ node_range: ">=22",
235
+ entrypoints: { cli: { path: cliPath, launcher: "node" } },
236
+ files,
237
+ created_at: createdAt,
238
+ };
239
+ }
240
+ //# sourceMappingURL=validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../../src/domain/validate.ts"],"names":[],"mappings":"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"}