@forwardimpact/libharness 3.1.0 → 3.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.
- package/package.json +1 -1
- package/src/commands/callback.js +28 -13
- package/src/events/github.js +1 -2
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@forwardimpact/libharness",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.2.0",
|
|
4
4
|
"description": "Autonomous agent team harness — coordinate a lead and participant agents in one async session, with eval, benchmark, and trace tooling to prove the changes worked.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"orchestration",
|
package/src/commands/callback.js
CHANGED
|
@@ -52,18 +52,27 @@ function readTraceSummary(content) {
|
|
|
52
52
|
return summary;
|
|
53
53
|
}
|
|
54
54
|
|
|
55
|
+
/** Terminal summary when the run wrote no trace the verb can read. */
|
|
56
|
+
const NO_TRACE_SUMMARY = "The run produced no trace file. See the run log.";
|
|
57
|
+
|
|
58
|
+
/** Terminal summary when a trace exists but carries no orchestrator summary. */
|
|
59
|
+
const NO_SUMMARY_TEXT = "The run ended and produced no summary.";
|
|
60
|
+
|
|
55
61
|
/**
|
|
56
62
|
* Callback command — read an NDJSON trace and extract the terminal
|
|
57
63
|
* orchestrator summary. POST a canonical callback body to the configured
|
|
58
|
-
* URL.
|
|
59
|
-
*
|
|
64
|
+
* URL.
|
|
65
|
+
*
|
|
66
|
+
* `--trace-file` is optional: an absent or empty path posts the same shape
|
|
67
|
+
* with `verdict: failed`, so a run that produced no trace never strands its
|
|
68
|
+
* caller.
|
|
60
69
|
*
|
|
61
70
|
* Wire shape (single shape across modes):
|
|
62
71
|
*
|
|
63
72
|
* ```
|
|
64
73
|
* {
|
|
65
|
-
* correlation_id, verdict, summary, run_url,
|
|
66
|
-
*
|
|
74
|
+
* correlation_id, kind, verdict, summary, run_url, cost_usd,
|
|
75
|
+
* replies: [], last_acted_seq, discussion_id?, trigger?
|
|
67
76
|
* }
|
|
68
77
|
* ```
|
|
69
78
|
*
|
|
@@ -79,20 +88,26 @@ export async function runCallbackCommand(ctx) {
|
|
|
79
88
|
const runUrl = values["run-url"] ?? "";
|
|
80
89
|
const discussionIdOverride = values["discussion-id"] ?? null;
|
|
81
90
|
|
|
82
|
-
if (!traceFile)
|
|
83
|
-
return { ok: false, code: 1, error: "--trace-file is required" };
|
|
84
91
|
if (!callbackUrl)
|
|
85
92
|
return { ok: false, code: 1, error: "--callback-url is required" };
|
|
86
93
|
|
|
87
|
-
const content =
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
94
|
+
const content =
|
|
95
|
+
traceFile && runtime.fsSync.existsSync(traceFile)
|
|
96
|
+
? runtime.fsSync.readFileSync(traceFile, "utf8")
|
|
97
|
+
: null;
|
|
98
|
+
const found =
|
|
99
|
+
content === null
|
|
100
|
+
? { verdict: "failed", summary: NO_TRACE_SUMMARY, replies: [] }
|
|
101
|
+
: (readTraceSummary(content) ?? {
|
|
102
|
+
verdict: "failed",
|
|
103
|
+
summary: NO_SUMMARY_TEXT,
|
|
104
|
+
replies: [],
|
|
105
|
+
});
|
|
93
106
|
// Total spend across every participant in the trace. The bridge surfaces
|
|
94
107
|
// it alongside the verdict, so a dispatched run reports what it cost.
|
|
95
|
-
const { totalCostUsd } = sumTraceCost(
|
|
108
|
+
const { totalCostUsd } = sumTraceCost(
|
|
109
|
+
content === null ? [] : content.split("\n"),
|
|
110
|
+
);
|
|
96
111
|
|
|
97
112
|
const discussionId = found.discussionId ?? discussionIdOverride ?? null;
|
|
98
113
|
const payload = {
|
package/src/events/github.js
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* GitHub event → task-prompt composition.
|
|
3
|
-
* kata-dispatch.yml's `Compose task text` step. Each branch in the dispatch
|
|
2
|
+
* GitHub event → task-prompt composition. Each branch in the dispatch
|
|
4
3
|
* function corresponds to one (event_name, action) the agent workflows react
|
|
5
4
|
* to.
|
|
6
5
|
*
|