@claudexor/control-api 1.0.1
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/LICENSE +21 -0
- package/README.md +7 -0
- package/dist/artifact-paths.d.ts +3 -0
- package/dist/artifact-paths.d.ts.map +1 -0
- package/dist/artifact-paths.js +36 -0
- package/dist/artifact-paths.js.map +1 -0
- package/dist/candidates.d.ts +3 -0
- package/dist/candidates.d.ts.map +1 -0
- package/dist/candidates.js +77 -0
- package/dist/candidates.js.map +1 -0
- package/dist/daemon-server.d.ts +196 -0
- package/dist/daemon-server.d.ts.map +1 -0
- package/dist/daemon-server.js +1971 -0
- package/dist/daemon-server.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/run-events-stream.d.ts +28 -0
- package/dist/run-events-stream.d.ts.map +1 -0
- package/dist/run-events-stream.js +146 -0
- package/dist/run-events-stream.js.map +1 -0
- package/dist/run-start.d.ts +14 -0
- package/dist/run-start.d.ts.map +1 -0
- package/dist/run-start.js +99 -0
- package/dist/run-start.js.map +1 -0
- package/dist/run-timeline.d.ts +22 -0
- package/dist/run-timeline.d.ts.map +1 -0
- package/dist/run-timeline.js +155 -0
- package/dist/run-timeline.js.map +1 -0
- package/dist/sse-shared.d.ts +11 -0
- package/dist/sse-shared.d.ts.map +1 -0
- package/dist/sse-shared.js +47 -0
- package/dist/sse-shared.js.map +1 -0
- package/dist/thread-projection.d.ts +12 -0
- package/dist/thread-projection.d.ts.map +1 -0
- package/dist/thread-projection.js +83 -0
- package/dist/thread-projection.js.map +1 -0
- package/dist/thread-turn-routes.d.ts +63 -0
- package/dist/thread-turn-routes.d.ts.map +1 -0
- package/dist/thread-turn-routes.js +317 -0
- package/dist/thread-turn-routes.js.map +1 -0
- package/package.json +45 -0
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Timeline projection over a run's canonical events.jsonl: severity
|
|
3
|
+
* classification (typed event kinds + typed tool status — no prose parsing),
|
|
4
|
+
* bounded output with an EXPLICIT truncation marker, and the shared
|
|
5
|
+
* event-reading helpers the budget snapshot reuses.
|
|
6
|
+
*/
|
|
7
|
+
import { lstatSync, readFileSync } from "node:fs";
|
|
8
|
+
import { ControlTimelineEvent, FallbackReason } from "@claudexor/schema";
|
|
9
|
+
import { redactSecrets } from "@claudexor/util";
|
|
10
|
+
import { safeArtifactPath } from "./artifact-paths.js";
|
|
11
|
+
const TIMELINE_EVENTS_MAX = 500;
|
|
12
|
+
export function readRunEvents(rec) {
|
|
13
|
+
if (!rec.runDir)
|
|
14
|
+
return [];
|
|
15
|
+
const path = safeArtifactPath(rec.runDir, "events.jsonl");
|
|
16
|
+
if (!path)
|
|
17
|
+
return [];
|
|
18
|
+
let raw;
|
|
19
|
+
try {
|
|
20
|
+
const st = lstatSync(path);
|
|
21
|
+
if (st.isSymbolicLink() || st.isDirectory())
|
|
22
|
+
return [];
|
|
23
|
+
raw = readFileSync(path, "utf8");
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return [];
|
|
27
|
+
}
|
|
28
|
+
const out = [];
|
|
29
|
+
for (const line of raw.split(/\r?\n/)) {
|
|
30
|
+
if (!line.trim())
|
|
31
|
+
continue;
|
|
32
|
+
try {
|
|
33
|
+
const obj = JSON.parse(line);
|
|
34
|
+
if (obj && typeof obj === "object" && !Array.isArray(obj))
|
|
35
|
+
out.push(obj);
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
/* malformed line remains in events.jsonl; omit from projections */
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return out;
|
|
42
|
+
}
|
|
43
|
+
export function eventPayload(ev) {
|
|
44
|
+
return ev["payload"] && typeof ev["payload"] === "object" && !Array.isArray(ev["payload"])
|
|
45
|
+
? ev["payload"]
|
|
46
|
+
: {};
|
|
47
|
+
}
|
|
48
|
+
export function stringOrNull(value) {
|
|
49
|
+
return typeof value === "string" && value.length > 0 ? redactSecrets(value) : null;
|
|
50
|
+
}
|
|
51
|
+
function prettyEventType(type) {
|
|
52
|
+
return type.replace(/\./g, " · ").replace(/_/g, " ");
|
|
53
|
+
}
|
|
54
|
+
const WARNING_EVENT_TYPES = new Set([
|
|
55
|
+
"route.fallback.started",
|
|
56
|
+
"route.fallback.auth_switched",
|
|
57
|
+
"route.fallback.exhausted",
|
|
58
|
+
"policy.web.upgraded",
|
|
59
|
+
"run.blocked",
|
|
60
|
+
]);
|
|
61
|
+
const ERROR_EVENT_TYPES = new Set(["run.failed", "reviewer.failed", "reviewer.timed_out"]);
|
|
62
|
+
function timelineSeverity(type, payload, tool) {
|
|
63
|
+
if (payload["error"] || tool["status"] === "error" || ERROR_EVENT_TYPES.has(type))
|
|
64
|
+
return "error";
|
|
65
|
+
const reason = FallbackReason.safeParse(payload["reason"]);
|
|
66
|
+
if (type === "route.fallback.auth_switched" && reason.success && reason.data === "readiness_preferred")
|
|
67
|
+
return "info";
|
|
68
|
+
if (WARNING_EVENT_TYPES.has(type))
|
|
69
|
+
return "warning";
|
|
70
|
+
return "info";
|
|
71
|
+
}
|
|
72
|
+
export function timelineEvents(rec) {
|
|
73
|
+
const out = [];
|
|
74
|
+
for (const ev of readRunEvents(rec)) {
|
|
75
|
+
const payload = eventPayload(ev);
|
|
76
|
+
const type = String(ev["type"] ?? "event");
|
|
77
|
+
// Typed tool info travels on the normalized HarnessEvent `tool` field.
|
|
78
|
+
const tool = payload["tool"] && typeof payload["tool"] === "object" && !Array.isArray(payload["tool"])
|
|
79
|
+
? payload["tool"]
|
|
80
|
+
: {};
|
|
81
|
+
const harnessId = stringOrNull(payload["harness_id"] ?? payload["harness"]);
|
|
82
|
+
const attemptId = stringOrNull(payload["attempt_id"] ?? payload["attemptId"]);
|
|
83
|
+
const title = stringOrNull(payload["title"] ?? payload["message"] ?? payload["summary"] ?? payload["text"] ?? payload["error"]) ?? prettyEventType(type);
|
|
84
|
+
const errorSummary = stringOrNull(tool["error_summary"] ?? payload["error"]);
|
|
85
|
+
const detail = stringOrNull(payload["detail"] ?? payload["text"] ?? payload["error"]) ?? stringOrNull(tool["content_summary"]) ?? errorSummary;
|
|
86
|
+
const toolName = stringOrNull(tool["name"]);
|
|
87
|
+
const target = stringOrNull(tool["target"]);
|
|
88
|
+
const severity = timelineSeverity(type, payload, tool);
|
|
89
|
+
out.push(ControlTimelineEvent.parse({
|
|
90
|
+
type,
|
|
91
|
+
ts: typeof ev["ts"] === "string" ? ev["ts"] : undefined,
|
|
92
|
+
harnessId,
|
|
93
|
+
attemptId,
|
|
94
|
+
title,
|
|
95
|
+
detail,
|
|
96
|
+
severity,
|
|
97
|
+
toolName,
|
|
98
|
+
target,
|
|
99
|
+
errorSummary,
|
|
100
|
+
rawRef: "events.jsonl",
|
|
101
|
+
}));
|
|
102
|
+
}
|
|
103
|
+
// Bounded projection with an EXPLICIT truncation marker — no silent truncation.
|
|
104
|
+
if (out.length > TIMELINE_EVENTS_MAX) {
|
|
105
|
+
const omitted = out.length - TIMELINE_EVENTS_MAX;
|
|
106
|
+
const tail = out.slice(-TIMELINE_EVENTS_MAX);
|
|
107
|
+
tail.unshift(ControlTimelineEvent.parse({
|
|
108
|
+
type: "timeline.truncated",
|
|
109
|
+
title: `${omitted} earlier event(s) omitted from this projection`,
|
|
110
|
+
detail: "Full history remains in events.jsonl.",
|
|
111
|
+
severity: "info",
|
|
112
|
+
rawRef: "events.jsonl",
|
|
113
|
+
}));
|
|
114
|
+
return tail;
|
|
115
|
+
}
|
|
116
|
+
return out;
|
|
117
|
+
}
|
|
118
|
+
/** The LAST plan.progress event's typed items (the live plan checklist), or
|
|
119
|
+
* null when the run never emitted one. Last-wins by construction: plan tools
|
|
120
|
+
* re-emit the whole list on every revision. On RACES the candidates' lists
|
|
121
|
+
* interleave — prefer the WINNER's attempt (decision.yaml) so the Plan tab
|
|
122
|
+
* shows the shipped candidate's checklist, not whichever emitted last. */
|
|
123
|
+
export function latestPlanProgress(rec, winnerAttemptId) {
|
|
124
|
+
const events = readRunEvents(rec);
|
|
125
|
+
const pick = (matchWinner) => {
|
|
126
|
+
for (let i = events.length - 1; i >= 0; i--) {
|
|
127
|
+
const ev = events[i];
|
|
128
|
+
if (ev?.["type"] !== "plan.progress")
|
|
129
|
+
continue;
|
|
130
|
+
if (matchWinner && eventPayload(ev)["attempt_id"] !== winnerAttemptId)
|
|
131
|
+
continue;
|
|
132
|
+
return ev;
|
|
133
|
+
}
|
|
134
|
+
return null;
|
|
135
|
+
};
|
|
136
|
+
const chosen = (winnerAttemptId ? pick(true) : null) ?? pick(false);
|
|
137
|
+
{
|
|
138
|
+
const ev = chosen;
|
|
139
|
+
if (!ev)
|
|
140
|
+
return null;
|
|
141
|
+
const payload = eventPayload(ev);
|
|
142
|
+
const rawItems = Array.isArray(payload["items"]) ? payload["items"] : [];
|
|
143
|
+
const items = rawItems
|
|
144
|
+
.map((raw) => {
|
|
145
|
+
const r = raw;
|
|
146
|
+
if (typeof r.id !== "string" || typeof r.title !== "string")
|
|
147
|
+
return null;
|
|
148
|
+
const status = r.status === "completed" ? "completed" : r.status === "in_progress" ? "in_progress" : "pending";
|
|
149
|
+
return { id: r.id, title: r.title, status: status };
|
|
150
|
+
})
|
|
151
|
+
.filter((x) => x !== null);
|
|
152
|
+
return { items };
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=run-timeline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-timeline.js","sourceRoot":"","sources":["../src/run-timeline.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/** Daemon job states that end a stream/wait (shared by both SSE surfaces). */
|
|
2
|
+
export declare const TERMINAL_STATES: Set<string>;
|
|
3
|
+
/** One SSE data line: secrets redacted, JSON re-minified when parseable. */
|
|
4
|
+
export declare function redactedSseLine(raw: string): string;
|
|
5
|
+
/** Incremental line reader for events.jsonl tails (rotation-tolerant). */
|
|
6
|
+
export declare function readNewLines(path: string, offset: number, carry: string): {
|
|
7
|
+
lines: string[];
|
|
8
|
+
nextOffset: number;
|
|
9
|
+
rest: string;
|
|
10
|
+
};
|
|
11
|
+
//# sourceMappingURL=sse-shared.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sse-shared.d.ts","sourceRoot":"","sources":["../src/sse-shared.ts"],"names":[],"mappings":"AAGA,8EAA8E;AAC9E,eAAO,MAAM,eAAe,aAY1B,CAAC;AAEH,4EAA4E;AAC5E,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAOnD;AAED,0EAA0E;AAC1E,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAgB/H"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { closeSync, openSync, readSync, statSync } from "node:fs";
|
|
2
|
+
import { redactSecrets } from "@claudexor/util";
|
|
3
|
+
/** Daemon job states that end a stream/wait (shared by both SSE surfaces). */
|
|
4
|
+
export const TERMINAL_STATES = new Set([
|
|
5
|
+
"succeeded",
|
|
6
|
+
"no_op",
|
|
7
|
+
"ungated",
|
|
8
|
+
"review_not_run",
|
|
9
|
+
"blocked",
|
|
10
|
+
"failed",
|
|
11
|
+
"cancelled",
|
|
12
|
+
"interrupted",
|
|
13
|
+
"exhausted",
|
|
14
|
+
"not_converged",
|
|
15
|
+
"stuck_no_progress",
|
|
16
|
+
]);
|
|
17
|
+
/** One SSE data line: secrets redacted, JSON re-minified when parseable. */
|
|
18
|
+
export function redactedSseLine(raw) {
|
|
19
|
+
const redacted = redactSecrets(raw);
|
|
20
|
+
try {
|
|
21
|
+
return JSON.stringify(JSON.parse(redacted));
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
return redacted;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
/** Incremental line reader for events.jsonl tails (rotation-tolerant). */
|
|
28
|
+
export function readNewLines(path, offset, carry) {
|
|
29
|
+
const size = statSync(path).size;
|
|
30
|
+
const start = size < offset ? 0 : offset; // file rotated/truncated; start over
|
|
31
|
+
const len = size - start;
|
|
32
|
+
if (len <= 0)
|
|
33
|
+
return { lines: [], nextOffset: start, rest: carry };
|
|
34
|
+
const fd = openSync(path, "r");
|
|
35
|
+
try {
|
|
36
|
+
const buf = Buffer.allocUnsafe(len);
|
|
37
|
+
readSync(fd, buf, 0, len, start);
|
|
38
|
+
const text = carry + buf.toString("utf8");
|
|
39
|
+
const parts = text.split("\n");
|
|
40
|
+
const rest = parts.pop() ?? "";
|
|
41
|
+
return { lines: parts.filter(Boolean), nextOffset: size, rest };
|
|
42
|
+
}
|
|
43
|
+
finally {
|
|
44
|
+
closeSync(fd);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=sse-shared.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sse-shared.js","sourceRoot":"","sources":["../src/sse-shared.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,8EAA8E;AAC9E,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC;IACrC,WAAW;IACX,OAAO;IACP,SAAS;IACT,gBAAgB;IAChB,SAAS;IACT,QAAQ;IACR,WAAW;IACX,aAAa;IACb,WAAW;IACX,eAAe;IACf,mBAAmB;CACpB,CAAC,CAAC;AAEH,4EAA4E;AAC5E,MAAM,UAAU,eAAe,CAAC,GAAW;IACzC,MAAM,QAAQ,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;IACpC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC9C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,QAAQ,CAAC;IAClB,CAAC;AACH,CAAC;AAED,0EAA0E;AAC1E,MAAM,UAAU,YAAY,CAAC,IAAY,EAAE,MAAc,EAAE,KAAa;IACtE,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC;IACjC,MAAM,KAAK,GAAG,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,qCAAqC;IAC/E,MAAM,GAAG,GAAG,IAAI,GAAG,KAAK,CAAC;IACzB,IAAI,GAAG,IAAI,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IACnE,MAAM,EAAE,GAAG,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAC/B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QACpC,QAAQ,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;QACjC,MAAM,IAAI,GAAG,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC/B,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;QAC/B,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAClE,CAAC;YAAS,CAAC;QACT,SAAS,CAAC,EAAE,CAAC,CAAC;IAChB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Thread-store projections: raw persisted thread/session/turn records ->
|
|
3
|
+
* typed Control DTOs. Pure and schema-parsed — the store shape is validated
|
|
4
|
+
* at the boundary, never trusted.
|
|
5
|
+
*/
|
|
6
|
+
import { ControlSession, ControlThread, ControlThreadTurn, ControlTurnRunCard, type ControlRunSummary } from "@claudexor/schema";
|
|
7
|
+
export declare function projectThread(raw: unknown, needsHuman: boolean): ControlThread;
|
|
8
|
+
export declare function projectSession(raw: unknown): ControlSession;
|
|
9
|
+
/** Project a run summary down to the compact card embedded on a thread turn. */
|
|
10
|
+
export declare function turnRunCard(summary: ControlRunSummary): ControlTurnRunCard;
|
|
11
|
+
export declare function projectTurn(raw: unknown, cards: Map<string, ControlTurnRunCard>): ControlThreadTurn;
|
|
12
|
+
//# sourceMappingURL=thread-projection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"thread-projection.d.ts","sourceRoot":"","sources":["../src/thread-projection.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,KAAK,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEjI,wBAAgB,aAAa,CAAC,GAAG,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,GAAG,aAAa,CAoB9E;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,GAAG,cAAc,CAU3D;AAED,gFAAgF;AAChF,wBAAgB,WAAW,CAAC,OAAO,EAAE,iBAAiB,GAAG,kBAAkB,CAY1E;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAAC,GAAG,iBAAiB,CA8BnG"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Thread-store projections: raw persisted thread/session/turn records ->
|
|
3
|
+
* typed Control DTOs. Pure and schema-parsed — the store shape is validated
|
|
4
|
+
* at the boundary, never trusted.
|
|
5
|
+
*/
|
|
6
|
+
import { ControlSession, ControlThread, ControlThreadTurn, ControlTurnRunCard } from "@claudexor/schema";
|
|
7
|
+
export function projectThread(raw, needsHuman) {
|
|
8
|
+
const t = raw;
|
|
9
|
+
const repo = t["repo"];
|
|
10
|
+
const workspace = t["workspace"];
|
|
11
|
+
return ControlThread.parse({
|
|
12
|
+
id: t["id"],
|
|
13
|
+
title: t["title"] ?? null,
|
|
14
|
+
repoRoot: repo?.root ?? null,
|
|
15
|
+
mode: t["mode"],
|
|
16
|
+
workspaceMode: workspace?.mode ?? "in_place",
|
|
17
|
+
authPreference: t["auth_preference"] ?? "auto",
|
|
18
|
+
primaryHarness: t["primary_harness"] ?? null,
|
|
19
|
+
eligibleHarnesses: t["eligible_harnesses"] ?? [],
|
|
20
|
+
state: t["state"] ?? "active",
|
|
21
|
+
runIds: t["run_ids"] ?? [],
|
|
22
|
+
headRunId: t["head_run_id"] ?? null,
|
|
23
|
+
needsHuman,
|
|
24
|
+
createdAt: t["created_at"],
|
|
25
|
+
updatedAt: t["updated_at"],
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
export function projectSession(raw) {
|
|
29
|
+
const s = raw;
|
|
30
|
+
return ControlSession.parse({
|
|
31
|
+
id: s["id"],
|
|
32
|
+
threadId: s["thread_id"],
|
|
33
|
+
harnessId: s["harness_id"],
|
|
34
|
+
nativeSessionId: s["native_session_id"] ?? null,
|
|
35
|
+
observedModel: s["last_observed_model"] ?? null,
|
|
36
|
+
state: s["state"] ?? "live",
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
/** Project a run summary down to the compact card embedded on a thread turn. */
|
|
40
|
+
export function turnRunCard(summary) {
|
|
41
|
+
return ControlTurnRunCard.parse({
|
|
42
|
+
state: summary.state,
|
|
43
|
+
mode: summary.mode,
|
|
44
|
+
strategy: summary.strategy ?? null,
|
|
45
|
+
n: summary.n,
|
|
46
|
+
result: summary.result,
|
|
47
|
+
spendUsd: summary.spendUsd ?? null,
|
|
48
|
+
outputReadyState: summary.outputReadyState,
|
|
49
|
+
waitingOnUser: summary.waitingOnUser,
|
|
50
|
+
finishedAt: summary.finishedAt ?? null,
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
export function projectTurn(raw, cards) {
|
|
54
|
+
const t = raw;
|
|
55
|
+
const runId = t["run_id"] ?? null;
|
|
56
|
+
const enqueueError = t["enqueue_error"];
|
|
57
|
+
return ControlThreadTurn.parse({
|
|
58
|
+
id: t["id"],
|
|
59
|
+
threadId: t["thread_id"],
|
|
60
|
+
runId,
|
|
61
|
+
parentRunId: t["parent_run_id"] ?? null,
|
|
62
|
+
planRunId: t["plan_run_id"] ?? null,
|
|
63
|
+
kind: t["kind"] ?? "followup",
|
|
64
|
+
prompt: t["prompt"] ?? "",
|
|
65
|
+
// Embedded run card so the chat renders the whole conversation (state +
|
|
66
|
+
// honest outcome) from this one response — no N+1 run-detail fetch per turn.
|
|
67
|
+
run: runId ? cards.get(runId) ?? null : null,
|
|
68
|
+
// A runless turn's refusal (trust gate / preflight) rides the projection so
|
|
69
|
+
// the chat shows WHY there is no run instead of an eternally-empty bubble.
|
|
70
|
+
enqueueError: !runId && enqueueError && typeof enqueueError === "object"
|
|
71
|
+
? {
|
|
72
|
+
message: String(enqueueError.message ?? ""),
|
|
73
|
+
code: typeof enqueueError.code === "string" ? enqueueError.code : null,
|
|
74
|
+
// Legacy records (pre-retryable) default to true — they came from
|
|
75
|
+
// the runner-hook path, where a job exists to replay.
|
|
76
|
+
retryable: enqueueError.retryable !== false,
|
|
77
|
+
failedAt: String(enqueueError.failed_at ?? ""),
|
|
78
|
+
}
|
|
79
|
+
: null,
|
|
80
|
+
createdAt: t["created_at"],
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=thread-projection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"thread-projection.js","sourceRoot":"","sources":["../src/thread-projection.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Thread-turn write routes: POST /threads/:id/turns (create + enqueue) and
|
|
3
|
+
* POST /threads/:id/turns/:turnId/retry (re-enqueue a REFUSED turn).
|
|
4
|
+
*
|
|
5
|
+
* Extracted from daemon-server.ts (INV-124 ratchet). The server passes a thin
|
|
6
|
+
* ctx of bound helpers; these functions own the per-thread serialization and
|
|
7
|
+
* the refused-turn honesty rules (persist the refusal ON the turn, INV-093).
|
|
8
|
+
*/
|
|
9
|
+
import type { ServerResponse } from "node:http";
|
|
10
|
+
import { ControlRunStartRequest } from "@claudexor/schema";
|
|
11
|
+
import type { AttachmentInput } from "@claudexor/schema";
|
|
12
|
+
import type { DaemonFacadeClient, DaemonRunRecord } from "./daemon-server.js";
|
|
13
|
+
export interface ThreadTurnRouteCtx {
|
|
14
|
+
json(res: ServerResponse, status: number, body: unknown): void;
|
|
15
|
+
waitForRunStart(jobId: string): Promise<DaemonRunRecord>;
|
|
16
|
+
readRunArtifactText(runId: string, relPath: string): Promise<string | null>;
|
|
17
|
+
/** The server's single run-start normalizer (scope/prompt/policy validation). */
|
|
18
|
+
normalizeStart(parsed: ControlRunStartRequest): ControlRunStartRequest;
|
|
19
|
+
/** True for terminal job states (the server's TERMINAL_STATES set). */
|
|
20
|
+
isTerminalState(state: string): boolean;
|
|
21
|
+
daemon: DaemonFacadeClient;
|
|
22
|
+
threadDetail(id: string): Promise<{
|
|
23
|
+
thread: unknown;
|
|
24
|
+
sessions: unknown[];
|
|
25
|
+
turns: unknown[];
|
|
26
|
+
}>;
|
|
27
|
+
createThreadTurn(id: string, prompt: string, opts: {
|
|
28
|
+
parentRunId?: string | null;
|
|
29
|
+
planRunId?: string | null;
|
|
30
|
+
attachments?: AttachmentInput[];
|
|
31
|
+
}): Promise<unknown>;
|
|
32
|
+
setTurnEnqueueError?: (turnId: string, message: string, code: string | null, retryable?: boolean) => void;
|
|
33
|
+
/** Per-thread promise chain (owned by the server; shared with turn creation). */
|
|
34
|
+
threadTurnChains: Map<string, Promise<void>>;
|
|
35
|
+
}
|
|
36
|
+
/** A typed throw's machine code (e.g. the trust gate's), null when absent or
|
|
37
|
+
* non-string (a numeric errno-style `code` must not leak into the typed
|
|
38
|
+
* refusal contract). ONE owner — daemon-server's refusal recorder reuses it. */
|
|
39
|
+
export declare function errCode(err: unknown): string | null;
|
|
40
|
+
/**
|
|
41
|
+
* Persist an enqueue failure on a pre-created turn (refused-turn honesty,
|
|
42
|
+
* INV-093). Shared by every pre-create-then-enqueue path OUTSIDE these
|
|
43
|
+
* routes (direct POST /runs with threadId, rerun_with_feedback). Marked
|
|
44
|
+
* retryable=false: these are enqueue-throw paths — no job was recorded, so
|
|
45
|
+
* the retry endpoint has nothing to replay. Best-effort by
|
|
46
|
+
* contract: recording must never mask the original error (callers always
|
|
47
|
+
* return it), and errCode yields null for absent/non-string codes.
|
|
48
|
+
*/
|
|
49
|
+
export declare function recordTurnEnqueueFailure(setTurnEnqueueError: ((turnId: string, message: string, code: string | null, retryable?: boolean) => void) | undefined, turnId: string | undefined, err: unknown): void;
|
|
50
|
+
/**
|
|
51
|
+
* POST /threads/:id/turns — create the turn record FIRST (single-writer), then
|
|
52
|
+
* enqueue its run. Per-thread serialization: concurrent turns on one thread
|
|
53
|
+
* would race the head_run_id lineage (check-then-act across awaits).
|
|
54
|
+
*/
|
|
55
|
+
export declare function handleThreadTurnCreate(ctx: ThreadTurnRouteCtx, res: ServerResponse, threadId: string, body: Record<string, unknown>): Promise<void>;
|
|
56
|
+
/**
|
|
57
|
+
* POST /threads/:id/turns/:turnId/retry — re-enqueue a REFUSED turn (same
|
|
58
|
+
* prompt/options/attachment refs: the job registry is the SSOT of enqueue
|
|
59
|
+
* params, replayed verbatim). No duplicate bubble: the run binds to the SAME
|
|
60
|
+
* turn, which also clears enqueue_error.
|
|
61
|
+
*/
|
|
62
|
+
export declare function handleThreadTurnRetry(ctx: ThreadTurnRouteCtx, res: ServerResponse, threadId: string, turnId: string): Promise<void>;
|
|
63
|
+
//# sourceMappingURL=thread-turn-routes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"thread-turn-routes.d.ts","sourceRoot":"","sources":["../src/thread-turn-routes.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAAuB,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAChF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,KAAK,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAE9E,MAAM,WAAW,kBAAkB;IACjC,IAAI,CAAC,GAAG,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI,CAAC;IAC/D,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IACzD,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC5E,iFAAiF;IACjF,cAAc,CAAC,MAAM,EAAE,sBAAsB,GAAG,sBAAsB,CAAC;IACvE,uEAAuE;IACvE,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;IACxC,MAAM,EAAE,kBAAkB,CAAC;IAC3B,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,OAAO,CAAC;QAAC,QAAQ,EAAE,OAAO,EAAE,CAAC;QAAC,KAAK,EAAE,OAAO,EAAE,CAAA;KAAE,CAAC,CAAC;IAC9F,gBAAgB,CACd,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,MAAM,EACd,IAAI,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,WAAW,CAAC,EAAE,eAAe,EAAE,CAAA;KAAE,GAChG,OAAO,CAAC,OAAO,CAAC,CAAC;IACpB,mBAAmB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,SAAS,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IAC1G,iFAAiF;IACjF,gBAAgB,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;CAC9C;AAoBD;;gFAEgF;AAChF,wBAAgB,OAAO,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAGnD;AAED;;;;;;;;GAQG;AACH,wBAAgB,wBAAwB,CACtC,mBAAmB,EAAE,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,SAAS,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC,GAAG,SAAS,EACtH,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,GAAG,EAAE,OAAO,GACX,IAAI,CAON;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,kBAAkB,EACvB,GAAG,EAAE,cAAc,EACnB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC,IAAI,CAAC,CAuJf;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,kBAAkB,EACvB,GAAG,EAAE,cAAc,EACnB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CAwGf"}
|