@kynver-app/runtime 0.1.122 → 0.1.128

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 (38) hide show
  1. package/dist/chat/chat-claim-loop.d.ts +11 -0
  2. package/dist/chat/command-allowlist.d.ts +8 -0
  3. package/dist/chat/command-executor.d.ts +13 -0
  4. package/dist/cli.js +54 -17773
  5. package/dist/cron/cron-cli-bin.d.ts +7 -0
  6. package/dist/cron/cron-readiness.d.ts +35 -0
  7. package/dist/disk-gate.d.ts +7 -0
  8. package/dist/index.js +71 -19272
  9. package/dist/mesh-liveness/mesh-cron-lease-store.d.ts +9 -0
  10. package/dist/server/cleanup.js +16 -4054
  11. package/dist/server/default-repo.js +1 -458
  12. package/dist/server/harness-notice.js +15 -287
  13. package/dist/server/heavy-verification.js +1 -223
  14. package/dist/server/landing.js +1 -44
  15. package/dist/server/memory-cost-enforce.js +2 -480
  16. package/dist/server/memory-cost.js +2 -184
  17. package/dist/server/monitor.js +8 -1805
  18. package/dist/server/orchestration.js +1 -444
  19. package/dist/server/pr-evidence.js +1 -163
  20. package/dist/server/repo-search.js +1 -224
  21. package/dist/server/worker-policy.js +1 -432
  22. package/dist/worker-persona-catalog.js +1 -138
  23. package/package.json +3 -2
  24. package/dist/cli.js.map +0 -7
  25. package/dist/index.js.map +0 -7
  26. package/dist/server/cleanup.js.map +0 -7
  27. package/dist/server/default-repo.js.map +0 -7
  28. package/dist/server/harness-notice.js.map +0 -7
  29. package/dist/server/heavy-verification.js.map +0 -7
  30. package/dist/server/landing.js.map +0 -7
  31. package/dist/server/memory-cost-enforce.js.map +0 -7
  32. package/dist/server/memory-cost.js.map +0 -7
  33. package/dist/server/monitor.js.map +0 -7
  34. package/dist/server/orchestration.js.map +0 -7
  35. package/dist/server/pr-evidence.js.map +0 -7
  36. package/dist/server/repo-search.js.map +0 -7
  37. package/dist/server/worker-policy.js.map +0 -7
  38. package/dist/worker-persona-catalog.js.map +0 -7
@@ -1,287 +1,15 @@
1
- // src/harness-notice/harness-notice.parse.ts
2
- var MAX_DIAGNOSTIC_CHARS = 2400;
3
- function tryParseJsonValue(text) {
4
- const trimmed = text.trim();
5
- if (!trimmed.startsWith("{") && !trimmed.startsWith("[")) return null;
6
- try {
7
- return JSON.parse(trimmed);
8
- } catch {
9
- return null;
10
- }
11
- }
12
- function diagnosticJson(value, maxChars = MAX_DIAGNOSTIC_CHARS) {
13
- if (value === void 0 || value === null) return void 0;
14
- const raw = typeof value === "string" ? value : JSON.stringify(value, null, 2);
15
- const trimmed = raw.trim();
16
- if (!trimmed) return void 0;
17
- if (trimmed.length <= maxChars) return trimmed;
18
- return `${trimmed.slice(0, maxChars - 1).trimEnd()}\u2026`;
19
- }
20
- function firstJsonFromStdout(stdout) {
21
- const trimmed = stdout.trim();
22
- if (!trimmed) return null;
23
- const direct = tryParseJsonValue(trimmed);
24
- if (direct !== null) return direct;
25
- for (const line of trimmed.split("\n")) {
26
- const parsed = tryParseJsonValue(line);
27
- if (parsed !== null) return parsed;
28
- }
29
- return null;
30
- }
31
-
32
- // src/harness-notice/harness-notice.auto-complete.ts
33
- function formatAutoCompleteOutcomeNotice(outcome) {
34
- const lines = [];
35
- lines.push(`Background auto-complete \xB7 ${outcome.runId} / ${outcome.worker}`);
36
- switch (outcome.outcome) {
37
- case "completed":
38
- lines.push("Outcome: harness completion posted to AgentOS successfully.");
39
- lines.push("AgentOS task should close or advance to review per completion routing.");
40
- lines.push("Next: check Command Center \u2014 no manual complete needed unless the board still shows running.");
41
- break;
42
- case "blocked":
43
- lines.push(
44
- `Outcome: worker finished but completion was blocked${outcome.httpStatus ? ` (HTTP ${outcome.httpStatus})` : ""}.`
45
- );
46
- if (outcome.reason) lines.push(`Blocker: ${outcome.reason}`);
47
- lines.push("Next: fix the blocker (auth, landing gate, dirty worktree) and replay completion from Command Center.");
48
- break;
49
- case "timed_out":
50
- lines.push(`Outcome: monitor gave up waiting \u2014 ${outcome.reason ?? "worker did not finish in time"}.`);
51
- lines.push("Next: inspect the worker process/logs; stop or unblock the worker, then retry auto-complete.");
52
- break;
53
- case "missing_link":
54
- lines.push(`Outcome: cannot complete \u2014 ${outcome.reason ?? "worker missing agentOsId/taskId"}.`);
55
- lines.push("Next: re-dispatch with board linkage or run `kynver worker complete` with --agent-os-id.");
56
- break;
57
- default:
58
- lines.push(`Outcome: ${outcome.outcome}`);
59
- }
60
- return { primary: lines.join("\n"), diagnostic: diagnosticJson(outcome) };
61
- }
62
-
63
- // src/harness-notice/harness-notice.monitor-tick.ts
64
- function formatMonitorTickNotice(tick) {
65
- const lines = [];
66
- const monitorId = typeof tick.monitorId === "string" ? tick.monitorId : void 0;
67
- lines.push(
68
- monitorId ? `Harness monitor tick \xB7 ${tick.runId} (${monitorId})` : `Harness monitor tick \xB7 ${tick.runId}`
69
- );
70
- if (!tick.workers.length) {
71
- lines.push("No workers in scope for this poll.");
72
- return { primary: lines.join("\n"), diagnostic: diagnosticJson(tick) };
73
- }
74
- for (const view of tick.workers) {
75
- const auto = view.autoComplete.eligible ? "eligible for auto-complete" : "not auto-completing";
76
- const blockers = view.autoComplete.blockers.length > 0 ? ` (${view.autoComplete.blockers.slice(0, 2).join("; ")})` : "";
77
- lines.push(
78
- `\u2022 ${view.worker}: ${view.workerStatus}, ${view.health}${view.healthReason ? ` \u2014 ${view.healthReason}` : ""}; ${auto}${blockers}`
79
- );
80
- if (view.taskStatus) {
81
- lines.push(` Board task: ${view.taskStatus}${view.leaseOwner ? ` (lease: ${view.leaseOwner})` : ""}`);
82
- }
83
- }
84
- const completed = tick.autoCompleted?.filter((a) => a.outcome === "completed" && a.ok) ?? [];
85
- const blocked = tick.autoCompleted?.filter((a) => !a.ok && a.outcome !== "skipped") ?? [];
86
- if (completed.length) {
87
- lines.push(
88
- `Auto-completed: ${completed.map((c) => c.worker).join(", ")} \u2014 AgentOS completion should be posted.`
89
- );
90
- }
91
- if (blocked.length) {
92
- lines.push(
93
- `Auto-complete blocked: ${blocked.map((c) => `${c.worker}${c.reason ? ` (${c.reason})` : ""}`).join("; ")}`
94
- );
95
- }
96
- if (tick.leaseRenewal?.failed?.length) {
97
- lines.push(`Lease renew failed for: ${tick.leaseRenewal.failed.map((f) => f.worker).join(", ")}`);
98
- }
99
- const allDone = tick.workers.length > 0 && tick.workers.every((w) => w.autoComplete.terminalVerified) && (tick.autoCompleted?.every((a) => a.ok || a.outcome === "skipped") ?? true);
100
- lines.push(
101
- allDone ? "Next: monitor loop should stop \u2014 all workers terminal and handled." : "Next: monitor will poll again until workers are terminal-verified or max time elapses."
102
- );
103
- return { primary: lines.join("\n"), diagnostic: diagnosticJson(tick) };
104
- }
105
-
106
- // src/harness-notice/harness-notice.worker-complete.ts
107
- function record(value) {
108
- return value !== null && typeof value === "object" && !Array.isArray(value) ? value : null;
109
- }
110
- function str(value) {
111
- return typeof value === "string" && value.trim() ? value.trim() : null;
112
- }
113
- function formatWorkerCompleteNotice(data) {
114
- const rec = record(data);
115
- if (!rec) {
116
- return {
117
- primary: "Harness worker complete finished with no parseable result.",
118
- diagnostic: diagnosticJson(data)
119
- };
120
- }
121
- const worker = str(rec.worker) ?? "worker";
122
- const runId = str(rec.runId);
123
- const skipped = str(rec.status) === "skipped";
124
- const httpStatus = typeof rec.httpStatus === "number" ? rec.httpStatus : null;
125
- const response = record(rec.response);
126
- const lines = [];
127
- lines.push(`Harness worker complete \xB7 ${worker}${runId ? ` (${runId})` : ""}`);
128
- if (skipped) {
129
- lines.push(`Outcome: skipped \u2014 ${str(rec.reason) ?? "worker not finished yet"}.`);
130
- lines.push("Next: wait for the worker to exit or post a finalResult, then retry complete.");
131
- return { primary: lines.join("\n"), diagnostic: diagnosticJson(data) };
132
- }
133
- const routeOutcome = str(response?.outcome);
134
- const taskRec = record(response?.task);
135
- const taskStatus = str(taskRec?.status);
136
- const prUrl = str(taskRec?.prUrl) ?? str(response?.prUrl);
137
- if (httpStatus && httpStatus >= 200 && httpStatus < 300) {
138
- lines.push("Outcome: completion callback accepted by AgentOS.");
139
- if (routeOutcome) lines.push(`Routing: ${routeOutcome.replace(/_/g, " ")}`);
140
- if (taskStatus) lines.push(`AgentOS task status: ${taskStatus}`);
141
- if (prUrl) lines.push(`PR: ${prUrl}`);
142
- lines.push("Next: check Command Center for review scheduling or blockers.");
143
- } else {
144
- lines.push(
145
- `Outcome: completion failed${httpStatus != null ? ` (HTTP ${httpStatus})` : ""}.`
146
- );
147
- const detail = str(response?.detail) ?? str(response?.error);
148
- if (detail) lines.push(`Blocker: ${detail}`);
149
- lines.push("Next: fix the reported blocker and replay completion from the board.");
150
- }
151
- return { primary: lines.join("\n"), diagnostic: diagnosticJson(data) };
152
- }
153
-
154
- // src/harness-notice/harness-notice.worker-status.ts
155
- function str2(value) {
156
- return typeof value === "string" && value.trim() ? value.trim() : null;
157
- }
158
- function record2(value) {
159
- return value !== null && typeof value === "object" && !Array.isArray(value) ? value : null;
160
- }
161
- function prFromFinalResult(finalResult) {
162
- const fr = record2(finalResult);
163
- if (!fr) return null;
164
- return str2(fr.prUrl) ?? str2(fr.pr);
165
- }
166
- function formatWorkerStatusNotice(status) {
167
- const rec = record2(status);
168
- if (!rec) {
169
- return {
170
- primary: "Harness worker status unavailable.",
171
- diagnostic: diagnosticJson(status)
172
- };
173
- }
174
- const worker = str2(rec.worker) ?? str2(rec.name) ?? "worker";
175
- const runId = str2(rec.runId);
176
- const workerStatus = str2(rec.status) ?? "unknown";
177
- const alive = rec.alive === true;
178
- const attention = record2(rec.attention);
179
- const attentionState = str2(attention?.state) ?? str2(rec.attentionState);
180
- const attentionReason = str2(attention?.reason) ?? str2(rec.attentionReason);
181
- const taskId = str2(rec.taskId);
182
- const prUrl = str2(rec.prUrl) ?? prFromFinalResult(rec.finalResult);
183
- const branch = str2(rec.branch);
184
- const headCommit = str2(rec.headCommit);
185
- const lines = [];
186
- lines.push(`Harness worker ${worker}${runId ? ` (${runId})` : ""}`);
187
- lines.push(`Process: ${alive ? "running" : "stopped"} \xB7 harness status: ${workerStatus}`);
188
- if (attentionState) {
189
- lines.push(
190
- attentionReason ? `Attention: ${attentionState} \u2014 ${attentionReason}` : `Attention: ${attentionState}`
191
- );
192
- }
193
- if (taskId) lines.push(`AgentOS task: ${taskId}`);
194
- if (prUrl) lines.push(`PR: ${prUrl}`);
195
- if (branch) lines.push(`Branch: ${branch}`);
196
- if (headCommit) lines.push(`Commit: ${headCommit.slice(0, 12)}`);
197
- if (workerStatus === "done" || workerStatus === "exited") {
198
- lines.push(
199
- prUrl ? "Outcome: worker finished \u2014 open the PR or check Command Center for review routing." : "Outcome: worker finished \u2014 check Command Center for task status and next action."
200
- );
201
- } else if (attentionState === "blocked" || attentionState === "needs_attention") {
202
- lines.push("Next: resolve the blocker on the board or wait for the monitor to auto-complete when terminal.");
203
- } else if (alive) {
204
- lines.push("Next: wait for completion or poll again; background monitor will auto-complete when eligible.");
205
- }
206
- return { primary: lines.join("\n"), diagnostic: diagnosticJson(status) };
207
- }
208
-
209
- // src/harness-notice/harness-notice.tool-response.ts
210
- var DIVIDER = "\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Diagnostic (JSON) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500";
211
- function joinHarnessNotice(notice) {
212
- if (!notice.diagnostic?.trim()) return notice.primary;
213
- return `${notice.primary}
214
-
215
- ${DIVIDER}
216
- ${notice.diagnostic}`;
217
- }
218
- function failureNotice(ctx) {
219
- const lines = [`Harness ${ctx.scope} ${ctx.action} failed.`];
220
- if (ctx.timedOut) lines.push("Reason: command timed out on the runner host.");
221
- else if (ctx.error) lines.push(`Reason: ${ctx.error}`);
222
- else if (ctx.exitCode != null) lines.push(`Exit code: ${ctx.exitCode}`);
223
- const errText = ctx.stderr.trim();
224
- if (errText) lines.push(`Stderr: ${errText.split("\n").slice(-3).join(" ")}`);
225
- lines.push("Next: retry on the runner host or inspect harness logs.");
226
- const parsed = firstJsonFromStdout(ctx.stdout);
227
- return {
228
- primary: lines.join("\n"),
229
- diagnostic: diagnosticJson(parsed ?? { stdout: ctx.stdout, stderr: ctx.stderr })
230
- };
231
- }
232
- function formatHarnessToolReadable(ctx) {
233
- if (!ctx.ok) return failureNotice(ctx);
234
- const parsed = firstJsonFromStdout(ctx.stdout);
235
- if (parsed === null) {
236
- const text = ctx.stdout.trim() || ctx.stderr.trim() || "(no output)";
237
- return {
238
- primary: `Harness ${ctx.scope} ${ctx.action} finished.
239
- ${text.slice(0, 800)}`,
240
- diagnostic: diagnosticJson({ stdout: ctx.stdout, stderr: ctx.stderr })
241
- };
242
- }
243
- if (ctx.scope === "worker" && ctx.action === "status") {
244
- return formatWorkerStatusNotice(parsed);
245
- }
246
- if (ctx.scope === "worker" && ctx.action === "complete") {
247
- return formatWorkerCompleteNotice(parsed);
248
- }
249
- if (ctx.scope === "monitor" && (ctx.action === "tick" || ctx.action === "run-loop")) {
250
- return formatMonitorTickNotice(parsed);
251
- }
252
- if (ctx.scope === "monitor" && ctx.action === "auto-complete") {
253
- const rec = parsed;
254
- if (rec.outcome && rec.worker && rec.runId) {
255
- return formatAutoCompleteOutcomeNotice(parsed);
256
- }
257
- if (Array.isArray(rec.blockers)) {
258
- return {
259
- primary: [
260
- `Monitor auto-complete blocked \xB7 ${rec.runId ?? "run"} / ${rec.worker ?? "worker"}`,
261
- `Blockers: ${rec.blockers.join("; ")}`,
262
- "Next: resolve blockers on the runner, then retry auto-complete."
263
- ].join("\n"),
264
- diagnostic: diagnosticJson(parsed)
265
- };
266
- }
267
- }
268
- if (ctx.scope === "run" && ctx.action === "status") {
269
- const workers = parsed.workers;
270
- if (Array.isArray(workers) && workers.length === 1) {
271
- return formatWorkerStatusNotice(workers[0]);
272
- }
273
- return {
274
- primary: `Harness run status \xB7 ${parsed.runId ?? "run"} (${Array.isArray(workers) ? workers.length : 0} workers).`,
275
- diagnostic: diagnosticJson(parsed)
276
- };
277
- }
278
- return {
279
- primary: `Harness ${ctx.scope} ${ctx.action} completed successfully on the runner.`,
280
- diagnostic: diagnosticJson(parsed)
281
- };
282
- }
283
- export {
284
- formatHarnessToolReadable,
285
- joinHarnessNotice
286
- };
287
- //# sourceMappingURL=harness-notice.js.map
1
+ function C(e){let o=e.trim();if(!o.startsWith("{")&&!o.startsWith("["))return null;try{return JSON.parse(o)}catch{return null}}function s(e,o=2400){if(e==null)return;let i=(typeof e=="string"?e:JSON.stringify(e,null,2)).trim();if(i)return i.length<=o?i:`${i.slice(0,o-1).trimEnd()}\u2026`}function g(e){let o=e.trim();if(!o)return null;let r=C(o);if(r!==null)return r;for(let i of o.split(`
2
+ `)){let u=C(i);if(u!==null)return u}return null}function $(e){let o=[];switch(o.push(`Background auto-complete \xB7 ${e.runId} / ${e.worker}`),e.outcome){case"completed":o.push("Outcome: harness completion posted to AgentOS successfully."),o.push("AgentOS task should close or advance to review per completion routing."),o.push("Next: check Command Center \u2014 no manual complete needed unless the board still shows running.");break;case"blocked":o.push(`Outcome: worker finished but completion was blocked${e.httpStatus?` (HTTP ${e.httpStatus})`:""}.`),e.reason&&o.push(`Blocker: ${e.reason}`),o.push("Next: fix the blocker (auth, landing gate, dirty worktree) and replay completion from Command Center.");break;case"timed_out":o.push(`Outcome: monitor gave up waiting \u2014 ${e.reason??"worker did not finish in time"}.`),o.push("Next: inspect the worker process/logs; stop or unblock the worker, then retry auto-complete.");break;case"missing_link":o.push(`Outcome: cannot complete \u2014 ${e.reason??"worker missing agentOsId/taskId"}.`),o.push("Next: re-dispatch with board linkage or run `kynver worker complete` with --agent-os-id.");break;default:o.push(`Outcome: ${e.outcome}`)}return{primary:o.join(`
3
+ `),diagnostic:s(e)}}function y(e){let o=[],r=typeof e.monitorId=="string"?e.monitorId:void 0;if(o.push(r?`Harness monitor tick \xB7 ${e.runId} (${r})`:`Harness monitor tick \xB7 ${e.runId}`),!e.workers.length)return o.push("No workers in scope for this poll."),{primary:o.join(`
4
+ `),diagnostic:s(e)};for(let t of e.workers){let n=t.autoComplete.eligible?"eligible for auto-complete":"not auto-completing",m=t.autoComplete.blockers.length>0?` (${t.autoComplete.blockers.slice(0,2).join("; ")})`:"";o.push(`\u2022 ${t.worker}: ${t.workerStatus}, ${t.health}${t.healthReason?` \u2014 ${t.healthReason}`:""}; ${n}${m}`),t.taskStatus&&o.push(` Board task: ${t.taskStatus}${t.leaseOwner?` (lease: ${t.leaseOwner})`:""}`)}let i=e.autoCompleted?.filter(t=>t.outcome==="completed"&&t.ok)??[],u=e.autoCompleted?.filter(t=>!t.ok&&t.outcome!=="skipped")??[];i.length&&o.push(`Auto-completed: ${i.map(t=>t.worker).join(", ")} \u2014 AgentOS completion should be posted.`),u.length&&o.push(`Auto-complete blocked: ${u.map(t=>`${t.worker}${t.reason?` (${t.reason})`:""}`).join("; ")}`),e.leaseRenewal?.failed?.length&&o.push(`Lease renew failed for: ${e.leaseRenewal.failed.map(t=>t.worker).join(", ")}`);let p=e.workers.length>0&&e.workers.every(t=>t.autoComplete.terminalVerified)&&(e.autoCompleted?.every(t=>t.ok||t.outcome==="skipped")??!0);return o.push(p?"Next: monitor loop should stop \u2014 all workers terminal and handled.":"Next: monitor will poll again until workers are terminal-verified or max time elapses."),{primary:o.join(`
5
+ `),diagnostic:s(e)}}function b(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)?e:null}function c(e){return typeof e=="string"&&e.trim()?e.trim():null}function N(e){let o=b(e);if(!o)return{primary:"Harness worker complete finished with no parseable result.",diagnostic:s(e)};let r=c(o.worker)??"worker",i=c(o.runId),u=c(o.status)==="skipped",p=typeof o.httpStatus=="number"?o.httpStatus:null,t=b(o.response),n=[];if(n.push(`Harness worker complete \xB7 ${r}${i?` (${i})`:""}`),u)return n.push(`Outcome: skipped \u2014 ${c(o.reason)??"worker not finished yet"}.`),n.push("Next: wait for the worker to exit or post a finalResult, then retry complete."),{primary:n.join(`
6
+ `),diagnostic:s(e)};let m=c(t?.outcome),f=b(t?.task),d=c(f?.status),h=c(f?.prUrl)??c(t?.prUrl);if(p&&p>=200&&p<300)n.push("Outcome: completion callback accepted by AgentOS."),m&&n.push(`Routing: ${m.replace(/_/g," ")}`),d&&n.push(`AgentOS task status: ${d}`),h&&n.push(`PR: ${h}`),n.push("Next: check Command Center for review scheduling or blockers.");else{n.push(`Outcome: completion failed${p!=null?` (HTTP ${p})`:""}.`);let k=c(t?.detail)??c(t?.error);k&&n.push(`Blocker: ${k}`),n.push("Next: fix the reported blocker and replay completion from the board.")}return{primary:n.join(`
7
+ `),diagnostic:s(e)}}function a(e){return typeof e=="string"&&e.trim()?e.trim():null}function R(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)?e:null}function O(e){let o=R(e);return o?a(o.prUrl)??a(o.pr):null}function w(e){let o=R(e);if(!o)return{primary:"Harness worker status unavailable.",diagnostic:s(e)};let r=a(o.worker)??a(o.name)??"worker",i=a(o.runId),u=a(o.status)??"unknown",p=o.alive===!0,t=R(o.attention),n=a(t?.state)??a(o.attentionState),m=a(t?.reason)??a(o.attentionReason),f=a(o.taskId),d=a(o.prUrl)??O(o.finalResult),h=a(o.branch),k=a(o.headCommit),l=[];return l.push(`Harness worker ${r}${i?` (${i})`:""}`),l.push(`Process: ${p?"running":"stopped"} \xB7 harness status: ${u}`),n&&l.push(m?`Attention: ${n} \u2014 ${m}`:`Attention: ${n}`),f&&l.push(`AgentOS task: ${f}`),d&&l.push(`PR: ${d}`),h&&l.push(`Branch: ${h}`),k&&l.push(`Commit: ${k.slice(0,12)}`),u==="done"||u==="exited"?l.push(d?"Outcome: worker finished \u2014 open the PR or check Command Center for review routing.":"Outcome: worker finished \u2014 check Command Center for task status and next action."):n==="blocked"||n==="needs_attention"?l.push("Next: resolve the blocker on the board or wait for the monitor to auto-complete when terminal."):p&&l.push("Next: wait for completion or poll again; background monitor will auto-complete when eligible."),{primary:l.join(`
8
+ `),diagnostic:s(e)}}var S="\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Diagnostic (JSON) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500";function H(e){return e.diagnostic?.trim()?`${e.primary}
9
+
10
+ ${S}
11
+ ${e.diagnostic}`:e.primary}function j(e){let o=[`Harness ${e.scope} ${e.action} failed.`];e.timedOut?o.push("Reason: command timed out on the runner host."):e.error?o.push(`Reason: ${e.error}`):e.exitCode!=null&&o.push(`Exit code: ${e.exitCode}`);let r=e.stderr.trim();r&&o.push(`Stderr: ${r.split(`
12
+ `).slice(-3).join(" ")}`),o.push("Next: retry on the runner host or inspect harness logs.");let i=g(e.stdout);return{primary:o.join(`
13
+ `),diagnostic:s(i??{stdout:e.stdout,stderr:e.stderr})}}function A(e){if(!e.ok)return j(e);let o=g(e.stdout);if(o===null){let r=e.stdout.trim()||e.stderr.trim()||"(no output)";return{primary:`Harness ${e.scope} ${e.action} finished.
14
+ ${r.slice(0,800)}`,diagnostic:s({stdout:e.stdout,stderr:e.stderr})}}if(e.scope==="worker"&&e.action==="status")return w(o);if(e.scope==="worker"&&e.action==="complete")return N(o);if(e.scope==="monitor"&&(e.action==="tick"||e.action==="run-loop"))return y(o);if(e.scope==="monitor"&&e.action==="auto-complete"){let r=o;if(r.outcome&&r.worker&&r.runId)return $(o);if(Array.isArray(r.blockers))return{primary:[`Monitor auto-complete blocked \xB7 ${r.runId??"run"} / ${r.worker??"worker"}`,`Blockers: ${r.blockers.join("; ")}`,"Next: resolve blockers on the runner, then retry auto-complete."].join(`
15
+ `),diagnostic:s(o)}}if(e.scope==="run"&&e.action==="status"){let r=o.workers;return Array.isArray(r)&&r.length===1?w(r[0]):{primary:`Harness run status \xB7 ${o.runId??"run"} (${Array.isArray(r)?r.length:0} workers).`,diagnostic:s(o)}}return{primary:`Harness ${e.scope} ${e.action} completed successfully on the runner.`,diagnostic:s(o)}}export{A as formatHarnessToolReadable,H as joinHarnessNotice};
@@ -1,223 +1 @@
1
- // src/heavy-verification/slot.ts
2
- import {
3
- closeSync,
4
- existsSync,
5
- mkdirSync as mkdirSync2,
6
- openSync,
7
- readdirSync,
8
- readFileSync,
9
- unlinkSync,
10
- writeFileSync
11
- } from "node:fs";
12
- import path3 from "node:path";
13
-
14
- // src/util.ts
15
- function isPidAlive(pid) {
16
- if (!pid) return false;
17
- try {
18
- process.kill(pid, 0);
19
- return true;
20
- } catch {
21
- return false;
22
- }
23
- }
24
-
25
- // src/heavy-verification/paths.ts
26
- import { mkdirSync } from "node:fs";
27
- import path2 from "node:path";
28
-
29
- // src/plan-persist/paths.ts
30
- import { homedir } from "node:os";
31
- import path from "node:path";
32
- function resolveKynverStateRoot() {
33
- const env = process.env.KYNVER_STATE_ROOT;
34
- if (env) return path.resolve(env);
35
- return path.join(homedir(), ".kynver", "state");
36
- }
37
-
38
- // src/heavy-verification/paths.ts
39
- function resolveHeavyVerificationRoot() {
40
- return path2.join(resolveKynverStateRoot(), "heavy-verification");
41
- }
42
- function heavyVerificationSlotsDir() {
43
- return path2.join(resolveHeavyVerificationRoot(), "slots");
44
- }
45
- function ensureHeavyVerificationDirs() {
46
- const dir = heavyVerificationSlotsDir();
47
- mkdirSync(dir, { recursive: true });
48
- return dir;
49
- }
50
-
51
- // src/heavy-verification/slot.ts
52
- var DEFAULT_HEAVY_VERIFICATION_STALE_MS = 2 * 60 * 6e4;
53
- var DEFAULT_HEAVY_VERIFICATION_MAX_CONCURRENT = 1;
54
- function positiveInt(value, fallback) {
55
- const n = Number(value);
56
- if (!Number.isFinite(n) || n <= 0) return fallback;
57
- return Math.floor(n);
58
- }
59
- function isHeavyVerificationGateSkipped() {
60
- const v = process.env.KYNVER_HEAVY_VERIFICATION_SKIP?.trim().toLowerCase();
61
- return v === "1" || v === "true" || v === "yes";
62
- }
63
- function resolveHeavyVerificationMaxConcurrent() {
64
- const env = process.env.KYNVER_HEAVY_VERIFICATION_MAX_CONCURRENT;
65
- if (env) return positiveInt(env, DEFAULT_HEAVY_VERIFICATION_MAX_CONCURRENT);
66
- return DEFAULT_HEAVY_VERIFICATION_MAX_CONCURRENT;
67
- }
68
- function readSlotRecord(filePath) {
69
- if (!existsSync(filePath)) return null;
70
- try {
71
- const parsed = JSON.parse(readFileSync(filePath, "utf8"));
72
- if (typeof parsed.slotId === "string" && typeof parsed.pid === "number" && typeof parsed.acquiredAt === "string" && typeof parsed.command === "string") {
73
- return parsed;
74
- }
75
- } catch {
76
- return null;
77
- }
78
- return null;
79
- }
80
- function slotIsStale(record, staleMs = DEFAULT_HEAVY_VERIFICATION_STALE_MS) {
81
- if (!record) return true;
82
- if (!isPidAlive(record.pid)) return true;
83
- const atMs = Date.parse(record.acquiredAt);
84
- if (Number.isNaN(atMs)) return true;
85
- return Date.now() - atMs > staleMs;
86
- }
87
- function reclaimStaleSlot(filePath, staleMs) {
88
- const record = readSlotRecord(filePath);
89
- if (!slotIsStale(record, staleMs)) return;
90
- try {
91
- unlinkSync(filePath);
92
- } catch {
93
- }
94
- }
95
- function ensureSlotsDir(slotsDir) {
96
- mkdirSync2(slotsDir, { recursive: true });
97
- return slotsDir;
98
- }
99
- function reclaimStaleHeavyVerificationSlots(opts = {}) {
100
- const slotsDir = ensureSlotsDir(opts.slotsDir ?? ensureHeavyVerificationDirs());
101
- const staleMs = opts.staleMs ?? DEFAULT_HEAVY_VERIFICATION_STALE_MS;
102
- let reclaimed = 0;
103
- for (const name of readdirSync(slotsDir)) {
104
- if (!name.endsWith(".json")) continue;
105
- const filePath = path3.join(slotsDir, name);
106
- const before = existsSync(filePath);
107
- reclaimStaleSlot(filePath, staleMs);
108
- if (before && !existsSync(filePath)) reclaimed += 1;
109
- }
110
- return reclaimed;
111
- }
112
- function listActiveHeavyVerificationSlots(opts = {}) {
113
- const slotsDir = opts.slotsDir ?? ensureHeavyVerificationDirs();
114
- const staleMs = opts.staleMs ?? DEFAULT_HEAVY_VERIFICATION_STALE_MS;
115
- reclaimStaleHeavyVerificationSlots({ slotsDir, staleMs });
116
- const active = [];
117
- for (const name of readdirSync(slotsDir)) {
118
- if (!name.endsWith(".json")) continue;
119
- const record = readSlotRecord(path3.join(slotsDir, name));
120
- if (record && !slotIsStale(record, staleMs)) active.push(record);
121
- }
122
- return active;
123
- }
124
- function countActiveHeavyVerificationSlots(opts = {}) {
125
- return listActiveHeavyVerificationSlots(opts).length;
126
- }
127
- function assessHeavyVerificationGate(command, opts = {}) {
128
- if (isHeavyVerificationGateSkipped()) {
129
- return {
130
- admitted: true,
131
- slotId: null,
132
- activeSlots: 0,
133
- maxSlots: resolveHeavyVerificationMaxConcurrent(),
134
- reason: null
135
- };
136
- }
137
- const slotsDir = opts.slotsDir ?? ensureHeavyVerificationDirs();
138
- const staleMs = opts.staleMs ?? DEFAULT_HEAVY_VERIFICATION_STALE_MS;
139
- const maxSlots = opts.maxSlots ?? resolveHeavyVerificationMaxConcurrent();
140
- reclaimStaleHeavyVerificationSlots({ slotsDir, staleMs });
141
- const activeSlots = countActiveHeavyVerificationSlots({ slotsDir, staleMs });
142
- const admitted = activeSlots < maxSlots;
143
- return {
144
- admitted,
145
- slotId: null,
146
- activeSlots,
147
- maxSlots,
148
- reason: admitted ? null : `heavy verification at capacity (${activeSlots}/${maxSlots} slots); waiting for ${command}`
149
- };
150
- }
151
-
152
- // src/worker-env.ts
153
- var FORBIDDEN_WORKER_ENV_KEYS = [
154
- "ANTHROPIC_API_KEY",
155
- "ANALYST_API_KEY",
156
- "RECRUITER_API_KEY",
157
- "AUTH_SECRET",
158
- "NEXTAUTH_SECRET",
159
- "DATABASE_URL",
160
- "PRODUCTION_DATABASE_URL",
161
- "KYNVER_PRODUCTION_DATABASE_URL",
162
- "REDIS_URL",
163
- "GOOGLE_CLIENT_SECRET",
164
- "GITHUB_CLIENT_SECRET",
165
- "KYNVER_API_KEY",
166
- "KYNVER_SERVICE_SECRET",
167
- "KYNVER_RUNTIME_SECRET",
168
- "KYNVER_CRON_SECRET",
169
- "OPENCLAW_CRON_SECRET",
170
- "QSTASH_TOKEN",
171
- "QSTASH_CURRENT_SIGNING_KEY",
172
- "QSTASH_NEXT_SIGNING_KEY",
173
- "TOOL_SECRETS_KEK",
174
- "TOOL_EXECUTOR_DISPATCH_SECRET",
175
- "CLOUDFLARE_API_TOKEN",
176
- "STRIPE_SECRET_KEY",
177
- "STRIPE_WEBHOOK_SECRET",
178
- "STRIPE_IDENTITY_WEBHOOK_SECRET",
179
- "VOYAGE_API_KEY",
180
- "PERPLEXITY_API_KEY",
181
- "FRED_API_KEY",
182
- "FMP_API_KEY",
183
- "CURSOR_API_KEY"
184
- ];
185
- var FORBIDDEN_KEY_SET = new Set(FORBIDDEN_WORKER_ENV_KEYS);
186
-
187
- // src/memory-cost-package-version-guard.ts
188
- var MEMORY_COST_PACKAGE_MIN_VERSIONS = {
189
- "@kynver-app/runtime": "0.1.83",
190
- "@kynver-app/openclaw-agent-os": "0.1.43",
191
- "@kynver-app/mcp-agent-os": "0.3.34"
192
- };
193
- var MEMORY_COST_MANAGED_PACKAGES = Object.keys(
194
- MEMORY_COST_PACKAGE_MIN_VERSIONS
195
- );
196
- function parseSemverParts(version) {
197
- const core = version.trim().split("-")[0]?.split("+")[0];
198
- if (!core) return null;
199
- const parts = core.split(".");
200
- if (parts.length < 1 || parts.length > 3) return null;
201
- const nums = parts.map((p) => Number.parseInt(p, 10));
202
- if (nums.some((n) => !Number.isFinite(n) || n < 0)) return null;
203
- while (nums.length < 3) nums.push(0);
204
- return [nums[0], nums[1], nums[2]];
205
- }
206
- function compareSemver(a, b) {
207
- const pa = parseSemverParts(a);
208
- const pb = parseSemverParts(b);
209
- if (!pa || !pb) return 0;
210
- for (let i = 0; i < 3; i += 1) {
211
- if (pa[i] > pb[i]) return 1;
212
- if (pa[i] < pb[i]) return -1;
213
- }
214
- return 0;
215
- }
216
- export {
217
- assessHeavyVerificationGate,
218
- compareSemver,
219
- countActiveHeavyVerificationSlots,
220
- isHeavyVerificationGateSkipped,
221
- resolveHeavyVerificationMaxConcurrent
222
- };
223
- //# sourceMappingURL=heavy-verification.js.map
1
+ import{closeSync as B,existsSync as u,mkdirSync as M,openSync as X,readdirSync as v,readFileSync as P,unlinkSync as I,writeFileSync as q}from"node:fs";import S from"node:path";function f(e){if(!e)return!1;try{return process.kill(e,0),!0}catch{return!1}}import{mkdirSync as b}from"node:fs";import d from"node:path";import{homedir as C}from"node:os";import p from"node:path";function m(){let e=process.env.KYNVER_STATE_ROOT;return e?p.resolve(e):p.join(C(),".kynver","state")}function _(){return d.join(m(),"heavy-verification")}function g(){return d.join(_(),"slots")}function a(){let e=g();return b(e,{recursive:!0}),e}var c=120*6e4,y=1;function O(e,r){let t=Number(e);return!Number.isFinite(t)||t<=0?r:Math.floor(t)}function E(){let e=process.env.KYNVER_HEAVY_VERIFICATION_SKIP?.trim().toLowerCase();return e==="1"||e==="true"||e==="yes"}function l(){let e=process.env.KYNVER_HEAVY_VERIFICATION_MAX_CONCURRENT;return e?O(e,y):y}function k(e){if(!u(e))return null;try{let r=JSON.parse(P(e,"utf8"));if(typeof r.slotId=="string"&&typeof r.pid=="number"&&typeof r.acquiredAt=="string"&&typeof r.command=="string")return r}catch{return null}return null}function h(e,r=c){if(!e||!f(e.pid))return!0;let t=Date.parse(e.acquiredAt);return Number.isNaN(t)?!0:Date.now()-t>r}function V(e,r){let t=k(e);if(h(t,r))try{I(e)}catch{}}function N(e){return M(e,{recursive:!0}),e}function R(e={}){let r=N(e.slotsDir??a()),t=e.staleMs??c,o=0;for(let n of v(r)){if(!n.endsWith(".json"))continue;let s=S.join(r,n),i=u(s);V(s,t),i&&!u(s)&&(o+=1)}return o}function T(e={}){let r=e.slotsDir??a(),t=e.staleMs??c;R({slotsDir:r,staleMs:t});let o=[];for(let n of v(r)){if(!n.endsWith(".json"))continue;let s=k(S.join(r,n));s&&!h(s,t)&&o.push(s)}return o}function x(e={}){return T(e).length}function D(e,r={}){if(E())return{admitted:!0,slotId:null,activeSlots:0,maxSlots:l(),reason:null};let t=r.slotsDir??a(),o=r.staleMs??c,n=r.maxSlots??l();R({slotsDir:t,staleMs:o});let s=x({slotsDir:t,staleMs:o}),i=s<n;return{admitted:i,slotId:null,activeSlots:s,maxSlots:n,reason:i?null:`heavy verification at capacity (${s}/${n} slots); waiting for ${e}`}}var w=["ANTHROPIC_API_KEY","ANALYST_API_KEY","RECRUITER_API_KEY","AUTH_SECRET","NEXTAUTH_SECRET","DATABASE_URL","PRODUCTION_DATABASE_URL","KYNVER_PRODUCTION_DATABASE_URL","REDIS_URL","GOOGLE_CLIENT_SECRET","GITHUB_CLIENT_SECRET","KYNVER_API_KEY","KYNVER_SERVICE_SECRET","KYNVER_RUNTIME_SECRET","KYNVER_CRON_SECRET","OPENCLAW_CRON_SECRET","QSTASH_TOKEN","QSTASH_CURRENT_SIGNING_KEY","QSTASH_NEXT_SIGNING_KEY","TOOL_SECRETS_KEK","TOOL_EXECUTOR_DISPATCH_SECRET","CLOUDFLARE_API_TOKEN","STRIPE_SECRET_KEY","STRIPE_WEBHOOK_SECRET","STRIPE_IDENTITY_WEBHOOK_SECRET","VOYAGE_API_KEY","PERPLEXITY_API_KEY","FRED_API_KEY","FMP_API_KEY","CURSOR_API_KEY"],re=new Set(w);var H={"@kynver-app/runtime":"0.1.83","@kynver-app/openclaw-agent-os":"0.1.43","@kynver-app/mcp-agent-os":"0.3.34"},Se=Object.keys(H);function A(e){let r=e.trim().split("-")[0]?.split("+")[0];if(!r)return null;let t=r.split(".");if(t.length<1||t.length>3)return null;let o=t.map(n=>Number.parseInt(n,10));if(o.some(n=>!Number.isFinite(n)||n<0))return null;for(;o.length<3;)o.push(0);return[o[0],o[1],o[2]]}function $(e,r){let t=A(e),o=A(r);if(!t||!o)return 0;for(let n=0;n<3;n+=1){if(t[n]>o[n])return 1;if(t[n]<o[n])return-1}return 0}export{D as assessHeavyVerificationGate,$ as compareSemver,x as countActiveHeavyVerificationSlots,E as isHeavyVerificationGateSkipped,l as resolveHeavyVerificationMaxConcurrent};
@@ -1,44 +1 @@
1
- // src/landing-gate.ts
2
- function trimOrNull(value) {
3
- if (typeof value !== "string") return null;
4
- const trimmed = value.trim();
5
- return trimmed.length ? trimmed : null;
6
- }
7
- function hasFinalResult(value) {
8
- if (value === void 0 || value === null) return false;
9
- if (typeof value === "string") return value.trim().length > 0;
10
- if (typeof value === "boolean") return value;
11
- if (Array.isArray(value)) return value.length > 0;
12
- if (typeof value === "object") return Object.keys(value).length > 0;
13
- return true;
14
- }
15
- function hasCommittedLandingRef(snapshot) {
16
- if (trimOrNull(snapshot.headCommit)) return true;
17
- if (trimOrNull(snapshot.prUrl)) return true;
18
- if (trimOrNull(snapshot.artifactBundlePath)) return true;
19
- if (trimOrNull(snapshot.patchPath)) return true;
20
- const ancestry = snapshot.gitAncestry;
21
- if (ancestry?.checked && ancestry.headIsAncestorOfBase === false && trimOrNull(ancestry.head)) {
22
- return true;
23
- }
24
- return false;
25
- }
26
- function assessWorkerLanding(snapshot) {
27
- if (!hasFinalResult(snapshot.finalResult)) return { blocked: false };
28
- if (snapshot.changedFiles.length === 0) return { blocked: false };
29
- if (!hasCommittedLandingRef(snapshot)) {
30
- return {
31
- blocked: true,
32
- reason: "dirty_worktree_no_pr",
33
- detail: `Worktree has ${snapshot.changedFiles.length} uncommitted change(s) with no commit or PR; commit, open a PR, or discard before landing`
34
- };
35
- }
36
- return {
37
- blocked: true,
38
- detail: `Worktree has ${snapshot.changedFiles.length} uncommitted change(s); commit or discard before landing`
39
- };
40
- }
41
- export {
42
- assessWorkerLanding
43
- };
44
- //# sourceMappingURL=landing.js.map
1
+ function n(e){if(typeof e!="string")return null;let r=e.trim();return r.length?r:null}function t(e){return e==null?!1:typeof e=="string"?e.trim().length>0:typeof e=="boolean"?e:Array.isArray(e)?e.length>0:typeof e=="object"?Object.keys(e).length>0:!0}function i(e){if(n(e.headCommit)||n(e.prUrl)||n(e.artifactBundlePath)||n(e.patchPath))return!0;let r=e.gitAncestry;return!!(r?.checked&&r.headIsAncestorOfBase===!1&&n(r.head))}function o(e){return t(e.finalResult)?e.changedFiles.length===0?{blocked:!1}:i(e)?{blocked:!0,detail:`Worktree has ${e.changedFiles.length} uncommitted change(s); commit or discard before landing`}:{blocked:!0,reason:"dirty_worktree_no_pr",detail:`Worktree has ${e.changedFiles.length} uncommitted change(s) with no commit or PR; commit, open a PR, or discard before landing`}:{blocked:!1}}export{o as assessWorkerLanding};