harness-engineering-agent 0.3.11 → 0.3.12
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/README.md +4 -0
- package/dist/controller/agent-session-types.d.ts +17 -1
- package/dist/controller/agent-session-types.d.ts.map +1 -1
- package/dist/controller/agent-session-utils.d.ts +40 -3
- package/dist/controller/agent-session-utils.d.ts.map +1 -1
- package/dist/controller/agent-session-utils.js +67 -21
- package/dist/controller/agent-session-utils.js.map +1 -1
- package/dist/controller/agent-session.d.ts.map +1 -1
- package/dist/controller/agent-session.js +129 -10
- package/dist/controller/agent-session.js.map +1 -1
- package/dist/controller/context-budget.d.ts +71 -0
- package/dist/controller/context-budget.d.ts.map +1 -0
- package/dist/controller/context-budget.js +219 -0
- package/dist/controller/context-budget.js.map +1 -0
- package/dist/controller/context-builder.d.ts +27 -0
- package/dist/controller/context-builder.d.ts.map +1 -0
- package/dist/controller/context-builder.js +184 -0
- package/dist/controller/context-builder.js.map +1 -0
- package/dist/controller/context-validation.d.ts +46 -0
- package/dist/controller/context-validation.d.ts.map +1 -0
- package/dist/controller/context-validation.js +126 -0
- package/dist/controller/context-validation.js.map +1 -0
- package/dist/controller/direct-runner.d.ts +2 -0
- package/dist/controller/direct-runner.d.ts.map +1 -1
- package/dist/controller/direct-runner.js +20 -2
- package/dist/controller/direct-runner.js.map +1 -1
- package/dist/controller/index.d.ts +1 -0
- package/dist/controller/index.d.ts.map +1 -1
- package/dist/controller/index.js +1 -0
- package/dist/controller/index.js.map +1 -1
- package/dist/controller/run-acceptance.d.ts.map +1 -1
- package/dist/controller/run-acceptance.js +12 -0
- package/dist/controller/run-acceptance.js.map +1 -1
- package/dist/controller/run-controller.d.ts.map +1 -1
- package/dist/controller/run-controller.js +2 -0
- package/dist/controller/run-controller.js.map +1 -1
- package/dist/controller/streamlined-runner.d.ts +2 -0
- package/dist/controller/streamlined-runner.d.ts.map +1 -1
- package/dist/controller/streamlined-runner.js +31 -1
- package/dist/controller/streamlined-runner.js.map +1 -1
- package/dist/controller/task-agent-output.d.ts.map +1 -1
- package/dist/controller/task-agent-output.js +85 -0
- package/dist/controller/task-agent-output.js.map +1 -1
- package/dist/domain/clarification.d.ts +92 -0
- package/dist/domain/clarification.d.ts.map +1 -0
- package/dist/domain/clarification.js +80 -0
- package/dist/domain/clarification.js.map +1 -0
- package/dist/domain/context-snapshot.d.ts +140 -0
- package/dist/domain/context-snapshot.d.ts.map +1 -0
- package/dist/domain/context-snapshot.js +140 -0
- package/dist/domain/context-snapshot.js.map +1 -0
- package/dist/domain/index.d.ts +4 -0
- package/dist/domain/index.d.ts.map +1 -1
- package/dist/domain/index.js +2 -0
- package/dist/domain/index.js.map +1 -1
- package/dist/domain/report.d.ts +118 -0
- package/dist/domain/report.d.ts.map +1 -1
- package/dist/domain/run.d.ts +118 -0
- package/dist/domain/run.d.ts.map +1 -1
- package/dist/domain/run.js +2 -0
- package/dist/domain/run.js.map +1 -1
- package/dist/plugin/harness-coordinator.d.ts +5 -0
- package/dist/plugin/harness-coordinator.d.ts.map +1 -1
- package/dist/plugin/harness-coordinator.js +95 -4
- package/dist/plugin/harness-coordinator.js.map +1 -1
- package/dist/plugin/harness-plugin-runtime.d.ts +2 -14
- package/dist/plugin/harness-plugin-runtime.d.ts.map +1 -1
- package/dist/plugin/harness-plugin-runtime.js +7 -1
- package/dist/plugin/harness-plugin-runtime.js.map +1 -1
- package/dist/session/contracts.d.ts +80 -8
- package/dist/session/contracts.d.ts.map +1 -1
- package/dist/session/fake-session-adapter.d.ts.map +1 -1
- package/dist/session/fake-session-adapter.js +14 -0
- package/dist/session/fake-session-adapter.js.map +1 -1
- package/dist/session/opencode-session-adapter.d.ts.map +1 -1
- package/dist/session/opencode-session-adapter.js +16 -0
- package/dist/session/opencode-session-adapter.js.map +1 -1
- package/dist/session/opencode-session-prompts.d.ts.map +1 -1
- package/dist/session/opencode-session-prompts.js +3 -0
- package/dist/session/opencode-session-prompts.js.map +1 -1
- package/dist/store/context-snapshot-store.d.ts +17 -0
- package/dist/store/context-snapshot-store.d.ts.map +1 -0
- package/dist/store/context-snapshot-store.js +96 -0
- package/dist/store/context-snapshot-store.js.map +1 -0
- package/dist/store/filesystem-run-store.d.ts +3 -0
- package/dist/store/filesystem-run-store.d.ts.map +1 -1
- package/dist/store/filesystem-run-store.js +13 -1
- package/dist/store/filesystem-run-store.js.map +1 -1
- package/dist/store/index.d.ts +2 -0
- package/dist/store/index.d.ts.map +1 -1
- package/dist/store/index.js +2 -0
- package/dist/store/index.js.map +1 -1
- package/dist/store/run-event.d.ts +118 -0
- package/dist/store/run-event.d.ts.map +1 -1
- package/dist/store/session-index.d.ts +51 -0
- package/dist/store/session-index.d.ts.map +1 -0
- package/dist/store/session-index.js +163 -0
- package/dist/store/session-index.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
// ─── Index builder ──────────────────────────────────────────────────────────
|
|
2
|
+
/**
|
|
3
|
+
* Build a session index from event logs across all runs.
|
|
4
|
+
*
|
|
5
|
+
* This is a derived index — it can always be rebuilt from the event log.
|
|
6
|
+
* If the index is corrupt or missing, it is rebuilt from scratch.
|
|
7
|
+
* Unknown sessions are NOT treated as released.
|
|
8
|
+
*/
|
|
9
|
+
export const buildSessionIndex = async (store) => {
|
|
10
|
+
const entries = {};
|
|
11
|
+
let runCount = 0;
|
|
12
|
+
let eventCount = 0;
|
|
13
|
+
if (store.listRunIds === undefined) {
|
|
14
|
+
return { entries, rebuiltAt: new Date().toISOString(), runCount: 0, eventCount: 0 };
|
|
15
|
+
}
|
|
16
|
+
const runIds = await store.listRunIds();
|
|
17
|
+
runCount = runIds.length;
|
|
18
|
+
for (const runId of runIds) {
|
|
19
|
+
const events = await store.listEvents(runId);
|
|
20
|
+
eventCount += events.length;
|
|
21
|
+
processEvents(runId, events, entries);
|
|
22
|
+
}
|
|
23
|
+
return {
|
|
24
|
+
entries,
|
|
25
|
+
rebuiltAt: new Date().toISOString(),
|
|
26
|
+
runCount,
|
|
27
|
+
eventCount,
|
|
28
|
+
};
|
|
29
|
+
};
|
|
30
|
+
/**
|
|
31
|
+
* Rebuild the session index incrementally for a single run.
|
|
32
|
+
* Returns the updated entries for that run.
|
|
33
|
+
*/
|
|
34
|
+
export const rebuildSessionIndexForRun = async (runId, store) => {
|
|
35
|
+
const events = await store.listEvents(runId);
|
|
36
|
+
const entries = {};
|
|
37
|
+
processEvents(runId, events, entries);
|
|
38
|
+
return Object.values(entries);
|
|
39
|
+
};
|
|
40
|
+
// ─── Event processing ───────────────────────────────────────────────────────
|
|
41
|
+
const processEvents = (runId, events, entries) => {
|
|
42
|
+
for (const event of events) {
|
|
43
|
+
const sessionId = readStringPayload(event.payload, "sessionId");
|
|
44
|
+
if (sessionId === undefined)
|
|
45
|
+
continue;
|
|
46
|
+
switch (event.type) {
|
|
47
|
+
case "session.created": {
|
|
48
|
+
const role = readRolePayload(event.payload);
|
|
49
|
+
if (role === undefined)
|
|
50
|
+
continue;
|
|
51
|
+
const taskId = readStringPayload(event.payload, "taskId");
|
|
52
|
+
const attempt = readNumberPayload(event.payload, "attempt");
|
|
53
|
+
const contextId = readStringPayload(event.payload, "contextId");
|
|
54
|
+
const leaseId = readStringPayload(event.payload, "leaseId");
|
|
55
|
+
const worktree = readStringPayload(event.payload, "worktree");
|
|
56
|
+
const phase = readStringPayload(event.payload, "phase");
|
|
57
|
+
entries[sessionId] = {
|
|
58
|
+
sessionId,
|
|
59
|
+
runId,
|
|
60
|
+
role,
|
|
61
|
+
state: "created",
|
|
62
|
+
taskId,
|
|
63
|
+
attempt,
|
|
64
|
+
contextId,
|
|
65
|
+
leaseId,
|
|
66
|
+
worktree,
|
|
67
|
+
phase,
|
|
68
|
+
createdAt: event.timestamp,
|
|
69
|
+
};
|
|
70
|
+
break;
|
|
71
|
+
}
|
|
72
|
+
case "session.released": {
|
|
73
|
+
const existing = entries[sessionId];
|
|
74
|
+
if (existing !== undefined) {
|
|
75
|
+
const reason = readStringPayload(event.payload, "reason");
|
|
76
|
+
entries[sessionId] = {
|
|
77
|
+
...existing,
|
|
78
|
+
state: "released",
|
|
79
|
+
releasedAt: event.timestamp,
|
|
80
|
+
releaseReason: reason,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
break;
|
|
84
|
+
}
|
|
85
|
+
case "session.safe-abandoned": {
|
|
86
|
+
const existing = entries[sessionId];
|
|
87
|
+
if (existing !== undefined) {
|
|
88
|
+
const reason = readStringPayload(event.payload, "reason");
|
|
89
|
+
entries[sessionId] = {
|
|
90
|
+
...existing,
|
|
91
|
+
state: "released",
|
|
92
|
+
releasedAt: event.timestamp,
|
|
93
|
+
releaseReason: reason ?? "safe-abandoned",
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
break;
|
|
97
|
+
}
|
|
98
|
+
case "session.rebound": {
|
|
99
|
+
const existing = entries[sessionId];
|
|
100
|
+
if (existing !== undefined) {
|
|
101
|
+
const leaseId = readStringPayload(event.payload, "leaseId");
|
|
102
|
+
entries[sessionId] = {
|
|
103
|
+
...existing,
|
|
104
|
+
state: "active",
|
|
105
|
+
leaseId: leaseId ?? existing.leaseId,
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
break;
|
|
109
|
+
}
|
|
110
|
+
case "session.late_result": {
|
|
111
|
+
// Late result events are diagnostic — they don't change session state
|
|
112
|
+
break;
|
|
113
|
+
}
|
|
114
|
+
default:
|
|
115
|
+
break;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
};
|
|
119
|
+
// ─── Query helpers ──────────────────────────────────────────────────────────
|
|
120
|
+
/**
|
|
121
|
+
* Find orphaned sessions from the index.
|
|
122
|
+
* An orphaned session is one that was created but never released or abandoned.
|
|
123
|
+
*/
|
|
124
|
+
export const findOrphanedSessions = (index) => {
|
|
125
|
+
return Object.values(index.entries).filter((entry) => entry.state === "created" || entry.state === "active");
|
|
126
|
+
};
|
|
127
|
+
/**
|
|
128
|
+
* Find sessions for a specific run.
|
|
129
|
+
*/
|
|
130
|
+
export const findSessionsForRun = (index, runId) => {
|
|
131
|
+
return Object.values(index.entries).filter((entry) => entry.runId === runId);
|
|
132
|
+
};
|
|
133
|
+
// ─── Payload readers ────────────────────────────────────────────────────────
|
|
134
|
+
const readStringPayload = (payload, key) => {
|
|
135
|
+
if (typeof payload !== "object" || payload === null || Array.isArray(payload))
|
|
136
|
+
return undefined;
|
|
137
|
+
const record = payload;
|
|
138
|
+
const value = record[key];
|
|
139
|
+
return typeof value === "string" ? value : undefined;
|
|
140
|
+
};
|
|
141
|
+
const readNumberPayload = (payload, key) => {
|
|
142
|
+
if (typeof payload !== "object" || payload === null || Array.isArray(payload))
|
|
143
|
+
return undefined;
|
|
144
|
+
const record = payload;
|
|
145
|
+
const value = record[key];
|
|
146
|
+
return typeof value === "number" ? value : undefined;
|
|
147
|
+
};
|
|
148
|
+
const readRolePayload = (payload) => {
|
|
149
|
+
const role = readStringPayload(payload, "role");
|
|
150
|
+
switch (role) {
|
|
151
|
+
case "intake":
|
|
152
|
+
case "planner":
|
|
153
|
+
case "worker":
|
|
154
|
+
case "verifier":
|
|
155
|
+
case "acceptance":
|
|
156
|
+
case "failure-analyzer":
|
|
157
|
+
case "repair-worker":
|
|
158
|
+
return role;
|
|
159
|
+
default:
|
|
160
|
+
return undefined;
|
|
161
|
+
}
|
|
162
|
+
};
|
|
163
|
+
//# sourceMappingURL=session-index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-index.js","sourceRoot":"","sources":["../../src/store/session-index.ts"],"names":[],"mappings":"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"}
|