harnery 0.34.1 → 0.35.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 (212) hide show
  1. package/dist/commander.d.ts.map +1 -1
  2. package/dist/commander.js +2 -0
  3. package/dist/commands/agents.d.ts +15 -4
  4. package/dist/commands/agents.d.ts.map +1 -1
  5. package/dist/commands/agents.js +89 -175
  6. package/dist/commands/browse.d.ts.map +1 -1
  7. package/dist/commands/browse.js +26 -2
  8. package/dist/commands/decision.d.ts.map +1 -1
  9. package/dist/commands/decision.js +2 -2
  10. package/dist/commands/events.d.ts.map +1 -1
  11. package/dist/commands/events.js +18 -1
  12. package/dist/commands/presence.d.ts.map +1 -1
  13. package/dist/commands/presence.js +2 -2
  14. package/dist/commands/semantic.d.ts +4 -0
  15. package/dist/commands/semantic.d.ts.map +1 -0
  16. package/dist/commands/semantic.js +147 -0
  17. package/dist/commands/web.d.ts.map +1 -1
  18. package/dist/commands/web.js +17 -0
  19. package/dist/core/agents/canonical-emit.d.ts +3 -0
  20. package/dist/core/agents/canonical-emit.d.ts.map +1 -1
  21. package/dist/core/agents/canonical-emit.js +12 -0
  22. package/dist/core/agents/claim-path.d.ts +11 -0
  23. package/dist/core/agents/claim-path.d.ts.map +1 -0
  24. package/dist/core/agents/claim-path.js +22 -0
  25. package/dist/core/agents/coord-client.d.ts +29 -3
  26. package/dist/core/agents/coord-client.d.ts.map +1 -1
  27. package/dist/core/agents/coord-client.js +88 -9
  28. package/dist/core/agents/live-authority-v3.d.ts.map +1 -1
  29. package/dist/core/agents/live-authority-v3.js +1 -3
  30. package/dist/core/agents/live-lifecycle-v3.js +3 -3
  31. package/dist/core/agents/live-observation-v3.d.ts.map +1 -1
  32. package/dist/core/agents/live-observation-v3.js +2 -2
  33. package/dist/core/agents/render/prompt-context.js +12 -10
  34. package/dist/core/agents/rules/stop-hook.d.ts.map +1 -1
  35. package/dist/core/agents/rules/stop-hook.js +23 -11
  36. package/dist/core/agents/session-name-display.d.ts +1 -0
  37. package/dist/core/agents/session-name-display.d.ts.map +1 -1
  38. package/dist/core/agents/session-name-display.js +8 -1
  39. package/dist/core/agents/state/heartbeat-reader.d.ts +46 -0
  40. package/dist/core/agents/state/heartbeat-reader.d.ts.map +1 -0
  41. package/dist/core/agents/state/heartbeat-reader.js +25 -0
  42. package/dist/core/agents/state/heartbeat-writer.d.ts +3 -48
  43. package/dist/core/agents/state/heartbeat-writer.d.ts.map +1 -1
  44. package/dist/core/agents/state/heartbeat-writer.js +16 -34
  45. package/dist/core/agents/state/live-coordination-view.d.ts +1 -1
  46. package/dist/core/agents/state/live-coordination-view.d.ts.map +1 -1
  47. package/dist/core/agents/state/live-coordination-view.js +25 -1
  48. package/dist/core/agents/state/names.d.ts +9 -1
  49. package/dist/core/agents/state/names.d.ts.map +1 -1
  50. package/dist/core/agents/state/names.js +190 -182
  51. package/dist/core/agents/state/stale-sweep.d.ts.map +1 -1
  52. package/dist/core/agents/state/stale-sweep.js +23 -5
  53. package/dist/core/artifacts/constants.d.ts +5 -0
  54. package/dist/core/artifacts/constants.d.ts.map +1 -0
  55. package/dist/core/artifacts/constants.js +4 -0
  56. package/dist/core/artifacts/index.d.ts +3 -3
  57. package/dist/core/artifacts/index.d.ts.map +1 -1
  58. package/dist/core/artifacts/index.js +50 -7
  59. package/dist/core/events/v3/base-contract.d.ts +795 -0
  60. package/dist/core/events/v3/base-contract.d.ts.map +1 -1
  61. package/dist/core/events/v3/base-contract.js +33 -0
  62. package/dist/core/events/v3/capabilities.d.ts +11 -0
  63. package/dist/core/events/v3/capabilities.d.ts.map +1 -1
  64. package/dist/core/events/v3/capabilities.js +23 -0
  65. package/dist/core/events/v3/generated.d.ts +1 -1
  66. package/dist/core/events/v3/generated.js +1 -1
  67. package/dist/core/events/v3/index.d.ts +4 -3
  68. package/dist/core/events/v3/index.d.ts.map +1 -1
  69. package/dist/core/events/v3/index.js +4 -3
  70. package/dist/core/events/v3/latency.d.ts +31 -1
  71. package/dist/core/events/v3/latency.d.ts.map +1 -1
  72. package/dist/core/events/v3/latency.js +127 -3
  73. package/dist/core/events/v3/live-routing.d.ts +30 -0
  74. package/dist/core/events/v3/live-routing.d.ts.map +1 -1
  75. package/dist/core/events/v3/live-routing.js +109 -1
  76. package/dist/core/events/v3/producers/command-recorder.d.ts.map +1 -1
  77. package/dist/core/events/v3/producers/command-recorder.js +10 -1
  78. package/dist/core/events/v3/producers/coordination-recorder.d.ts.map +1 -1
  79. package/dist/core/events/v3/producers/coordination-recorder.js +14 -3
  80. package/dist/core/events/v3/producers/hook-base.d.ts +17 -1
  81. package/dist/core/events/v3/producers/hook-base.d.ts.map +1 -1
  82. package/dist/core/events/v3/producers/hook-base.js +82 -1
  83. package/dist/core/events/v3/producers/intake.d.ts +6 -0
  84. package/dist/core/events/v3/producers/intake.d.ts.map +1 -1
  85. package/dist/core/events/v3/producers/intake.js +11 -0
  86. package/dist/core/events/v3/producers/recorder.d.ts +62 -0
  87. package/dist/core/events/v3/producers/recorder.d.ts.map +1 -1
  88. package/dist/core/events/v3/producers/recorder.js +654 -18
  89. package/dist/core/events/v3/runtime-telemetry-capabilities.d.ts +51 -0
  90. package/dist/core/events/v3/runtime-telemetry-capabilities.d.ts.map +1 -0
  91. package/dist/core/events/v3/runtime-telemetry-capabilities.js +54 -0
  92. package/dist/core/events/v3/turn-telemetry.d.ts +9 -0
  93. package/dist/core/events/v3/turn-telemetry.d.ts.map +1 -1
  94. package/dist/core/hooks/adapter/parse.d.ts +3 -0
  95. package/dist/core/hooks/adapter/parse.d.ts.map +1 -1
  96. package/dist/core/hooks/adapter/parse.js +14 -0
  97. package/dist/core/hooks/adapter/runtime-telemetry.d.ts +119 -0
  98. package/dist/core/hooks/adapter/runtime-telemetry.d.ts.map +1 -0
  99. package/dist/core/hooks/adapter/runtime-telemetry.js +568 -0
  100. package/dist/core/hooks/cli.js +111 -36
  101. package/dist/core/hooks/remediation-cap.d.ts +34 -0
  102. package/dist/core/hooks/remediation-cap.d.ts.map +1 -0
  103. package/dist/core/hooks/remediation-cap.js +71 -0
  104. package/dist/core/hooks/resolve/transcript.d.ts +25 -9
  105. package/dist/core/hooks/resolve/transcript.d.ts.map +1 -1
  106. package/dist/core/hooks/resolve/transcript.js +22 -10
  107. package/dist/core/semantic/adapters.d.ts +34 -0
  108. package/dist/core/semantic/adapters.d.ts.map +1 -0
  109. package/dist/core/semantic/adapters.js +222 -0
  110. package/dist/core/semantic/contract.d.ts +588 -0
  111. package/dist/core/semantic/contract.d.ts.map +1 -0
  112. package/dist/core/semantic/contract.js +230 -0
  113. package/dist/core/semantic/evidence.d.ts +11 -0
  114. package/dist/core/semantic/evidence.d.ts.map +1 -0
  115. package/dist/core/semantic/evidence.js +262 -0
  116. package/dist/core/semantic/index.d.ts +10 -0
  117. package/dist/core/semantic/index.d.ts.map +1 -0
  118. package/dist/core/semantic/index.js +9 -0
  119. package/dist/core/semantic/once.d.ts +33 -0
  120. package/dist/core/semantic/once.d.ts.map +1 -0
  121. package/dist/core/semantic/once.js +293 -0
  122. package/dist/core/semantic/prompt.d.ts +12 -0
  123. package/dist/core/semantic/prompt.d.ts.map +1 -0
  124. package/dist/core/semantic/prompt.js +70 -0
  125. package/dist/core/semantic/scheduler.d.ts +16 -0
  126. package/dist/core/semantic/scheduler.d.ts.map +1 -0
  127. package/dist/core/semantic/scheduler.js +67 -0
  128. package/dist/core/semantic/service-status.d.ts +31 -0
  129. package/dist/core/semantic/service-status.d.ts.map +1 -0
  130. package/dist/core/semantic/service-status.js +84 -0
  131. package/dist/core/semantic/service.d.ts +51 -0
  132. package/dist/core/semantic/service.d.ts.map +1 -0
  133. package/dist/core/semantic/service.js +470 -0
  134. package/dist/core/semantic/storage.d.ts +71 -0
  135. package/dist/core/semantic/storage.d.ts.map +1 -0
  136. package/dist/core/semantic/storage.js +179 -0
  137. package/dist/core/semantic/validate.d.ts +16 -0
  138. package/dist/core/semantic/validate.d.ts.map +1 -0
  139. package/dist/core/semantic/validate.js +174 -0
  140. package/dist/lib/browser/client.d.ts +11 -0
  141. package/dist/lib/browser/client.d.ts.map +1 -1
  142. package/dist/lib/browser/client.js +13 -0
  143. package/dist/lib/browser/index.d.ts +1 -0
  144. package/dist/lib/browser/index.d.ts.map +1 -1
  145. package/dist/lib/browser/standalone-html.d.ts +25 -0
  146. package/dist/lib/browser/standalone-html.d.ts.map +1 -0
  147. package/dist/lib/browser/standalone-html.js +284 -0
  148. package/dist/lib/instructions/apply.d.ts.map +1 -1
  149. package/dist/lib/instructions/apply.js +1 -0
  150. package/dist/lib/instructions/templates.d.ts +2 -0
  151. package/dist/lib/instructions/templates.d.ts.map +1 -1
  152. package/dist/lib/instructions/templates.js +144 -4
  153. package/package.json +6 -1
  154. package/schemas/event-v3.schema.json +2758 -478
  155. package/src/commander.ts +2 -0
  156. package/src/commands/agents.ts +102 -167
  157. package/src/commands/browse.ts +25 -2
  158. package/src/commands/decision.ts +8 -2
  159. package/src/commands/events.ts +21 -1
  160. package/src/commands/presence.ts +7 -2
  161. package/src/commands/semantic.ts +179 -0
  162. package/src/commands/web.ts +15 -0
  163. package/src/core/agents/canonical-emit.ts +15 -0
  164. package/src/core/agents/claim-path.ts +23 -0
  165. package/src/core/agents/coord-client.ts +92 -8
  166. package/src/core/agents/live-authority-v3.ts +1 -4
  167. package/src/core/agents/live-lifecycle-v3.ts +8 -3
  168. package/src/core/agents/live-observation-v3.ts +7 -2
  169. package/src/core/agents/render/prompt-context.ts +13 -10
  170. package/src/core/agents/rules/stop-hook.ts +24 -11
  171. package/src/core/agents/session-name-display.ts +9 -1
  172. package/src/core/agents/state/heartbeat-reader.ts +69 -0
  173. package/src/core/agents/state/heartbeat-writer.ts +20 -84
  174. package/src/core/agents/state/live-coordination-view.ts +26 -1
  175. package/src/core/agents/state/names.ts +190 -182
  176. package/src/core/agents/state/stale-sweep.ts +25 -5
  177. package/src/core/artifacts/constants.ts +4 -0
  178. package/src/core/artifacts/index.ts +49 -7
  179. package/src/core/events/v3/base-contract.ts +39 -0
  180. package/src/core/events/v3/capabilities.ts +34 -0
  181. package/src/core/events/v3/generated.ts +1 -1
  182. package/src/core/events/v3/index.ts +21 -0
  183. package/src/core/events/v3/latency.ts +213 -2
  184. package/src/core/events/v3/live-routing.ts +120 -1
  185. package/src/core/events/v3/producers/command-recorder.ts +10 -1
  186. package/src/core/events/v3/producers/coordination-recorder.ts +17 -5
  187. package/src/core/events/v3/producers/hook-base.ts +115 -1
  188. package/src/core/events/v3/producers/intake.ts +18 -0
  189. package/src/core/events/v3/producers/recorder.ts +856 -21
  190. package/src/core/events/v3/runtime-telemetry-capabilities.ts +137 -0
  191. package/src/core/events/v3/turn-telemetry.ts +10 -0
  192. package/src/core/hooks/adapter/parse.ts +16 -0
  193. package/src/core/hooks/adapter/runtime-telemetry.ts +805 -0
  194. package/src/core/hooks/cli.ts +123 -39
  195. package/src/core/hooks/remediation-cap.ts +77 -0
  196. package/src/core/hooks/resolve/transcript.ts +37 -11
  197. package/src/core/semantic/adapters.ts +293 -0
  198. package/src/core/semantic/contract.ts +298 -0
  199. package/src/core/semantic/evidence.ts +336 -0
  200. package/src/core/semantic/index.ts +127 -0
  201. package/src/core/semantic/once.ts +410 -0
  202. package/src/core/semantic/prompt.ts +84 -0
  203. package/src/core/semantic/scheduler.ts +107 -0
  204. package/src/core/semantic/service-status.ts +118 -0
  205. package/src/core/semantic/service.ts +580 -0
  206. package/src/core/semantic/storage.ts +286 -0
  207. package/src/core/semantic/validate.ts +212 -0
  208. package/src/lib/browser/client.ts +21 -0
  209. package/src/lib/browser/index.ts +4 -0
  210. package/src/lib/browser/standalone-html.ts +312 -0
  211. package/src/lib/instructions/apply.ts +1 -0
  212. package/src/lib/instructions/templates.ts +149 -4
@@ -0,0 +1,222 @@
1
+ import { execFile } from "node:child_process";
2
+ import { mkdtempSync, readFileSync, rmSync } from "node:fs";
3
+ import { tmpdir } from "node:os";
4
+ import { join } from "node:path";
5
+ import { promisify } from "node:util";
6
+ import { whichBin } from "../../lib/headless/index.js";
7
+ import { SemanticModelReplyV2Schema, } from "./contract.js";
8
+ const execFileAsync = promisify(execFile);
9
+ const MAX_OUTPUT_BYTES = 512 * 1024;
10
+ const DEFAULT_TIMEOUT_MS = 90_000;
11
+ export const SEMANTIC_READER_ROUTES = {
12
+ "claude-code": {
13
+ harness: "claude-code",
14
+ binary: "claude",
15
+ configured_model: "haiku-4.5",
16
+ invocation_model_id: "claude-haiku-4-5-20251001",
17
+ },
18
+ codex: {
19
+ harness: "codex",
20
+ binary: "codex",
21
+ configured_model: "gpt-5.6-luna",
22
+ invocation_model_id: "gpt-5.6-luna",
23
+ },
24
+ cursor: {
25
+ harness: "cursor",
26
+ binary: "cursor-agent",
27
+ configured_model: "composer-2.5",
28
+ invocation_model_id: "composer-2.5",
29
+ },
30
+ };
31
+ export function createSemanticAdapters() {
32
+ return {
33
+ "claude-code": createAdapter(SEMANTIC_READER_ROUTES["claude-code"]),
34
+ codex: createAdapter(SEMANTIC_READER_ROUTES.codex),
35
+ cursor: createAdapter(SEMANTIC_READER_ROUTES.cursor),
36
+ };
37
+ }
38
+ export function discoverSemanticReaders(adapters = createSemanticAdapters()) {
39
+ return {
40
+ "claude-code": adapters["claude-code"].discover(),
41
+ codex: adapters.codex.discover(),
42
+ cursor: adapters.cursor.discover(),
43
+ };
44
+ }
45
+ function createAdapter(route) {
46
+ return {
47
+ route,
48
+ discover(now = () => new Date()) {
49
+ const installed = whichBin(route.binary) !== undefined;
50
+ return {
51
+ harness: route.harness,
52
+ configured_model: route.configured_model,
53
+ ...(installed
54
+ ? {
55
+ resolved_model_id: route.invocation_model_id,
56
+ model_attestation: "requested-only",
57
+ available: true,
58
+ }
59
+ : { available: false, reason_code: "harness_unavailable" }),
60
+ discovered_at: now().toISOString(),
61
+ };
62
+ },
63
+ async invoke(prompt, timeoutMs = DEFAULT_TIMEOUT_MS, responseSchema = SemanticModelReplyV2Schema) {
64
+ if (!whichBin(route.binary)) {
65
+ return { ok: false, reason_code: "harness_unavailable", duration_ms: 0 };
66
+ }
67
+ return await invokeRoute(route, prompt, timeoutMs, responseSchema);
68
+ },
69
+ };
70
+ }
71
+ async function invokeRoute(route, prompt, timeoutMs, responseSchema) {
72
+ const dir = mkdtempSync(join(tmpdir(), "harnery-semantic-"));
73
+ const started = Date.now();
74
+ try {
75
+ const invocation = buildInvocation(route, prompt, dir, responseSchema);
76
+ const pending = execFileAsync(route.binary, invocation.args, {
77
+ cwd: dir,
78
+ env: semanticChildEnv(),
79
+ timeout: timeoutMs,
80
+ maxBuffer: MAX_OUTPUT_BYTES,
81
+ });
82
+ pending.child.stdin?.end();
83
+ const { stdout } = await pending;
84
+ const raw = invocation.outputFile ? readFileSync(invocation.outputFile, "utf8") : stdout;
85
+ const parsed = parseHarnessOutput(route.harness, raw);
86
+ if (!parsed.text.trim())
87
+ throw new Error("empty semantic response");
88
+ if (parsed.executedModelId && parsed.executedModelId !== route.invocation_model_id) {
89
+ return {
90
+ ok: false,
91
+ reason_code: "model_mismatch",
92
+ resolved_model_id: parsed.executedModelId,
93
+ model_attestation: "verified",
94
+ duration_ms: Date.now() - started,
95
+ };
96
+ }
97
+ return {
98
+ ok: true,
99
+ text: parsed.text,
100
+ resolved_model_id: parsed.executedModelId ?? route.invocation_model_id,
101
+ model_attestation: parsed.executedModelId ? "verified" : "requested-only",
102
+ duration_ms: Date.now() - started,
103
+ output_bytes: Buffer.byteLength(parsed.text),
104
+ };
105
+ }
106
+ catch (error) {
107
+ return {
108
+ ok: false,
109
+ reason_code: classifyFailure(error),
110
+ resolved_model_id: route.invocation_model_id,
111
+ model_attestation: "requested-only",
112
+ duration_ms: Date.now() - started,
113
+ };
114
+ }
115
+ finally {
116
+ rmSync(dir, { recursive: true, force: true });
117
+ }
118
+ }
119
+ function buildInvocation(route, prompt, dir, responseSchema) {
120
+ if (route.harness === "claude-code") {
121
+ return {
122
+ args: [
123
+ "-p",
124
+ prompt,
125
+ "--output-format",
126
+ "json",
127
+ "--json-schema",
128
+ JSON.stringify(responseSchema),
129
+ "--model",
130
+ route.invocation_model_id,
131
+ "--effort",
132
+ "low",
133
+ "--max-turns",
134
+ "1",
135
+ "--tools",
136
+ "",
137
+ "--strict-mcp-config",
138
+ "--mcp-config",
139
+ '{"mcpServers":{}}',
140
+ "--safe-mode",
141
+ "--no-session-persistence",
142
+ ],
143
+ };
144
+ }
145
+ if (route.harness === "codex") {
146
+ const outputFile = join(dir, "last-message.json");
147
+ return {
148
+ outputFile,
149
+ args: [
150
+ "exec",
151
+ "--model",
152
+ route.invocation_model_id,
153
+ "--sandbox",
154
+ "read-only",
155
+ "--skip-git-repo-check",
156
+ "--ephemeral",
157
+ "--ignore-user-config",
158
+ "--ignore-rules",
159
+ "--output-last-message",
160
+ outputFile,
161
+ "--cd",
162
+ dir,
163
+ prompt,
164
+ ],
165
+ };
166
+ }
167
+ return {
168
+ args: [
169
+ "-p",
170
+ prompt,
171
+ "--output-format",
172
+ "json",
173
+ "--mode",
174
+ "ask",
175
+ "--sandbox",
176
+ "enabled",
177
+ "--trust",
178
+ "--model",
179
+ route.invocation_model_id,
180
+ ],
181
+ };
182
+ }
183
+ function parseHarnessOutput(harness, raw) {
184
+ if (harness === "codex")
185
+ return { text: raw };
186
+ try {
187
+ const envelope = JSON.parse(raw);
188
+ if (envelope.is_error)
189
+ throw new Error("harness returned an error envelope");
190
+ return {
191
+ text: typeof envelope.result === "string" ? envelope.result : "",
192
+ ...(typeof envelope.model === "string" ? { executedModelId: envelope.model } : {}),
193
+ };
194
+ }
195
+ catch (error) {
196
+ if (error instanceof SyntaxError)
197
+ return { text: raw };
198
+ throw error;
199
+ }
200
+ }
201
+ function semanticChildEnv() {
202
+ const env = { ...process.env };
203
+ for (const key of Object.keys(env)) {
204
+ if (key.startsWith("HARNERY_") || key === "CODEX_THREAD_ID" || key === "CLAUDECODE") {
205
+ delete env[key];
206
+ }
207
+ }
208
+ return env;
209
+ }
210
+ function classifyFailure(error) {
211
+ const value = error;
212
+ if (value.code === "ENOENT")
213
+ return "harness_unavailable";
214
+ const message = value.message ?? String(error);
215
+ if (/auth|login|credential|unauthorized|forbidden/i.test(message)) {
216
+ return "authentication_unavailable";
217
+ }
218
+ if (/model.*(?:not found|unknown|unavailable|unsupported)|invalid.*model/i.test(message)) {
219
+ return "model_unavailable";
220
+ }
221
+ return "model_unavailable";
222
+ }