@claudexor/daemon 1.0.0 → 2.1.2
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/dist/client.d.ts +29 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +24 -4
- package/dist/client.js.map +1 -1
- package/dist/command-authority.d.ts +11 -0
- package/dist/command-authority.d.ts.map +1 -0
- package/dist/command-authority.js +15 -0
- package/dist/command-authority.js.map +1 -0
- package/dist/command-retention.d.ts +5 -0
- package/dist/command-retention.d.ts.map +1 -0
- package/dist/command-retention.js +18 -0
- package/dist/command-retention.js.map +1 -0
- package/dist/command-store.d.ts +41 -0
- package/dist/command-store.d.ts.map +1 -0
- package/dist/command-store.js +197 -0
- package/dist/command-store.js.map +1 -0
- package/dist/events.d.ts +2 -3
- package/dist/events.d.ts.map +1 -1
- package/dist/events.js +2 -3
- package/dist/events.js.map +1 -1
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -1
- package/dist/interactions.d.ts +32 -22
- package/dist/interactions.d.ts.map +1 -1
- package/dist/interactions.js +183 -56
- package/dist/interactions.js.map +1 -1
- package/dist/journal-events.d.ts +4 -0
- package/dist/journal-events.d.ts.map +1 -0
- package/dist/journal-events.js +23 -0
- package/dist/journal-events.js.map +1 -0
- package/dist/journal-manager.d.ts +72 -0
- package/dist/journal-manager.d.ts.map +1 -0
- package/dist/journal-manager.js +463 -0
- package/dist/journal-manager.js.map +1 -0
- package/dist/journal-projection.d.ts +11 -0
- package/dist/journal-projection.d.ts.map +1 -0
- package/dist/journal-projection.js +2 -0
- package/dist/journal-projection.js.map +1 -0
- package/dist/journal-recovery-files.d.ts +27 -0
- package/dist/journal-recovery-files.d.ts.map +1 -0
- package/dist/journal-recovery-files.js +209 -0
- package/dist/journal-recovery-files.js.map +1 -0
- package/dist/operator-decisions.d.ts +30 -0
- package/dist/operator-decisions.d.ts.map +1 -0
- package/dist/operator-decisions.js +137 -0
- package/dist/operator-decisions.js.map +1 -0
- package/dist/project-partitions.d.ts +167 -0
- package/dist/project-partitions.d.ts.map +1 -0
- package/dist/project-partitions.js +365 -0
- package/dist/project-partitions.js.map +1 -0
- package/dist/projects.d.ts +29 -0
- package/dist/projects.d.ts.map +1 -0
- package/dist/projects.js +180 -0
- package/dist/projects.js.map +1 -0
- package/dist/quota-registry.d.ts +75 -0
- package/dist/quota-registry.d.ts.map +1 -0
- package/dist/quota-registry.js +208 -0
- package/dist/quota-registry.js.map +1 -0
- package/dist/resource-store.d.ts +22 -0
- package/dist/resource-store.d.ts.map +1 -0
- package/dist/resource-store.js +272 -0
- package/dist/resource-store.js.map +1 -0
- package/dist/run-events.d.ts +15 -0
- package/dist/run-events.d.ts.map +1 -0
- package/dist/run-events.js +29 -0
- package/dist/run-events.js.map +1 -0
- package/dist/server.d.ts +33 -33
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +231 -238
- package/dist/server.js.map +1 -1
- package/dist/spec-sessions.d.ts +72 -0
- package/dist/spec-sessions.d.ts.map +1 -0
- package/dist/spec-sessions.js +301 -0
- package/dist/spec-sessions.js.map +1 -0
- package/dist/terminate.d.ts +52 -0
- package/dist/terminate.d.ts.map +1 -0
- package/dist/terminate.js +111 -0
- package/dist/terminate.js.map +1 -0
- package/dist/thread-head-ping.d.ts +35 -0
- package/dist/thread-head-ping.d.ts.map +1 -0
- package/dist/thread-head-ping.js +67 -0
- package/dist/thread-head-ping.js.map +1 -0
- package/dist/thread-lifecycle.d.ts +5 -0
- package/dist/thread-lifecycle.d.ts.map +1 -0
- package/dist/thread-lifecycle.js +57 -0
- package/dist/thread-lifecycle.js.map +1 -0
- package/dist/thread-store-support.d.ts +37 -0
- package/dist/thread-store-support.d.ts.map +1 -0
- package/dist/thread-store-support.js +94 -0
- package/dist/thread-store-support.js.map +1 -0
- package/dist/threads.d.ts +59 -13
- package/dist/threads.d.ts.map +1 -1
- package/dist/threads.js +254 -141
- package/dist/threads.js.map +1 -1
- package/dist/token.d.ts +13 -4
- package/dist/token.d.ts.map +1 -1
- package/dist/token.js +134 -29
- package/dist/token.js.map +1 -1
- package/dist/writer-lease.d.ts +21 -0
- package/dist/writer-lease.d.ts.map +1 -0
- package/dist/writer-lease.js +94 -0
- package/dist/writer-lease.js.map +1 -0
- package/package.json +5 -4
package/dist/interactions.js
CHANGED
|
@@ -1,28 +1,122 @@
|
|
|
1
|
-
import { InteractionAnswerSet as InteractionAnswerSetSchema } from "@claudexor/schema";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
* UI and delivers answers via `answer()`. The orchestrator owns the timeout —
|
|
8
|
-
* entries self-expire here only as hygiene so a timed-out question cannot be
|
|
9
|
-
* answered into a session that already moved on.
|
|
10
|
-
*/
|
|
11
|
-
export class InteractionRegistry {
|
|
1
|
+
import { ControlPendingInteraction as PendingInteractionSchema, InteractionAnswerSet as InteractionAnswerSetSchema, } from "@claudexor/schema";
|
|
2
|
+
const REQUESTED = "interaction.requested";
|
|
3
|
+
const RESOLVED = "interaction.resolved";
|
|
4
|
+
/** Journal-backed authority for pending interaction projections. */
|
|
5
|
+
export class InteractionStore {
|
|
6
|
+
journal;
|
|
12
7
|
pending = new Map();
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
8
|
+
resolved = new Set();
|
|
9
|
+
constructor(journal) {
|
|
10
|
+
this.journal = journal;
|
|
11
|
+
this.replay();
|
|
12
|
+
this.interruptAfterRestart();
|
|
13
|
+
}
|
|
14
|
+
request(ctx) {
|
|
15
|
+
const value = PendingInteractionSchema.parse({
|
|
16
|
+
interactionId: ctx.request.interaction_id,
|
|
17
|
+
runId: ctx.runId,
|
|
18
|
+
attemptId: ctx.attemptId,
|
|
19
|
+
harnessId: ctx.harnessId,
|
|
20
|
+
sourceTool: ctx.request.source_tool,
|
|
21
|
+
questions: ctx.request.questions,
|
|
22
|
+
requestedAt: ctx.requestedAt,
|
|
23
|
+
timeoutAt: ctx.timeoutAt,
|
|
24
|
+
});
|
|
25
|
+
const key = interactionKey(value.runId, value.interactionId);
|
|
26
|
+
if (this.pending.has(key) || this.resolved.has(key)) {
|
|
27
|
+
throw new Error(`duplicate interaction '${value.interactionId}' for run '${value.runId}'`);
|
|
28
|
+
}
|
|
29
|
+
this.journal.append(REQUESTED, value);
|
|
30
|
+
this.pending.set(key, value);
|
|
31
|
+
return value;
|
|
32
|
+
}
|
|
33
|
+
resolve(runId, interactionId, terminal) {
|
|
34
|
+
const key = interactionKey(runId, interactionId);
|
|
35
|
+
if (this.resolved.has(key))
|
|
36
|
+
return "already_resolved";
|
|
37
|
+
if (!this.pending.has(key))
|
|
38
|
+
return "not_found";
|
|
39
|
+
this.commitResolution({ runId, interactionIds: [interactionId], terminal });
|
|
40
|
+
return "resolved";
|
|
41
|
+
}
|
|
42
|
+
resolveRun(runId, terminal) {
|
|
43
|
+
const interactionIds = this.pendingForRun(runId).map((value) => value.interactionId);
|
|
44
|
+
if (interactionIds.length > 0)
|
|
45
|
+
this.commitResolution({ runId, interactionIds, terminal });
|
|
46
|
+
return interactionIds;
|
|
47
|
+
}
|
|
48
|
+
status(runId, interactionId) {
|
|
49
|
+
const key = interactionKey(runId, interactionId);
|
|
50
|
+
if (this.pending.has(key))
|
|
51
|
+
return "pending";
|
|
52
|
+
return this.resolved.has(key) ? "resolved" : "missing";
|
|
53
|
+
}
|
|
54
|
+
pendingForRun(runId) {
|
|
55
|
+
return [...this.pending.values()].filter((value) => value.runId === runId);
|
|
56
|
+
}
|
|
57
|
+
validateProjection() {
|
|
58
|
+
for (const value of this.pending.values())
|
|
59
|
+
PendingInteractionSchema.parse(value);
|
|
60
|
+
for (const key of this.pending.keys()) {
|
|
61
|
+
if (this.resolved.has(key))
|
|
62
|
+
throw new Error("interaction is both pending and resolved");
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
replay() {
|
|
66
|
+
for (const record of this.journal.records()) {
|
|
67
|
+
if (record.type === REQUESTED) {
|
|
68
|
+
const value = PendingInteractionSchema.parse(record.payload);
|
|
69
|
+
const key = interactionKey(value.runId, value.interactionId);
|
|
70
|
+
if (this.pending.has(key) || this.resolved.has(key)) {
|
|
71
|
+
throw new Error("duplicate interaction request history");
|
|
72
|
+
}
|
|
73
|
+
this.pending.set(key, value);
|
|
74
|
+
}
|
|
75
|
+
else if (record.type === RESOLVED) {
|
|
76
|
+
this.applyResolution(parseResolution(record.payload));
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
this.validateProjection();
|
|
80
|
+
}
|
|
81
|
+
interruptAfterRestart() {
|
|
82
|
+
const byRun = new Map();
|
|
83
|
+
for (const value of this.pending.values()) {
|
|
84
|
+
const ids = byRun.get(value.runId) ?? [];
|
|
85
|
+
ids.push(value.interactionId);
|
|
86
|
+
byRun.set(value.runId, ids);
|
|
87
|
+
}
|
|
88
|
+
for (const [runId, interactionIds] of byRun) {
|
|
89
|
+
this.commitResolution({ runId, interactionIds, terminal: "interrupted" });
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
commitResolution(value) {
|
|
93
|
+
const parsed = parseResolution(value);
|
|
94
|
+
this.journal.append(RESOLVED, parsed);
|
|
95
|
+
this.applyResolution(parsed);
|
|
96
|
+
}
|
|
97
|
+
applyResolution(value) {
|
|
98
|
+
for (const interactionId of value.interactionIds) {
|
|
99
|
+
const key = interactionKey(value.runId, interactionId);
|
|
100
|
+
if (!this.pending.delete(key))
|
|
101
|
+
throw new Error("interaction resolution precedes request");
|
|
102
|
+
this.resolved.add(key);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
/** Live answer bridge; durable state remains owned by InteractionStore. */
|
|
107
|
+
export class InteractionRegistry {
|
|
108
|
+
stores;
|
|
109
|
+
live = new Map();
|
|
110
|
+
constructor(stores) {
|
|
111
|
+
this.stores = stores;
|
|
112
|
+
}
|
|
113
|
+
register(ctx, params) {
|
|
22
114
|
this.prune();
|
|
115
|
+
const store = this.stores.forRequest(params);
|
|
116
|
+
store.request(ctx);
|
|
23
117
|
return new Promise((resolve) => {
|
|
24
|
-
this.
|
|
25
|
-
|
|
118
|
+
this.live.set(interactionKey(ctx.runId, ctx.request.interaction_id), {
|
|
119
|
+
store,
|
|
26
120
|
resolve,
|
|
27
121
|
expiresAtMs: Date.parse(ctx.timeoutAt) || Date.now() + 900_000,
|
|
28
122
|
});
|
|
@@ -30,52 +124,85 @@ export class InteractionRegistry {
|
|
|
30
124
|
}
|
|
31
125
|
answer(runId, interactionId, rawAnswers) {
|
|
32
126
|
this.prune();
|
|
33
|
-
const entry = this.pending.get(this.key(runId, interactionId));
|
|
34
|
-
if (!entry)
|
|
35
|
-
return { status: "not_found", message: `no pending interaction '${interactionId}' for run '${runId}'` };
|
|
36
127
|
const parsed = InteractionAnswerSetSchema.safeParse(rawAnswers);
|
|
37
|
-
if (!parsed.success)
|
|
128
|
+
if (!parsed.success) {
|
|
38
129
|
return { status: "rejected", message: parsed.error.issues[0]?.message ?? "invalid answers" };
|
|
39
|
-
|
|
40
|
-
|
|
130
|
+
}
|
|
131
|
+
const store = this.stores
|
|
132
|
+
.all()
|
|
133
|
+
.find((candidate) => candidate.status(runId, interactionId) !== "missing");
|
|
134
|
+
if (!store)
|
|
135
|
+
return { status: "not_found", message: missingMessage(runId, interactionId) };
|
|
136
|
+
const status = store.resolve(runId, interactionId, "answered");
|
|
137
|
+
if (status !== "resolved") {
|
|
138
|
+
return {
|
|
139
|
+
status: status === "already_resolved" ? "already_resolved" : "not_found",
|
|
140
|
+
message: status === "not_found" ? missingMessage(runId, interactionId) : undefined,
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
const key = interactionKey(runId, interactionId);
|
|
144
|
+
const entry = this.live.get(key);
|
|
145
|
+
this.live.delete(key);
|
|
146
|
+
entry?.resolve(parsed.data);
|
|
41
147
|
return { status: "delivered" };
|
|
42
148
|
}
|
|
43
|
-
/** Resolve-and-drop every pending question of a run that reached a terminal
|
|
44
|
-
* (cancel/failed/succeeded): a dead run must not advertise waiting_on_user
|
|
45
|
-
* for up to the interaction timeout. Resolving null mirrors the
|
|
46
|
-
* orchestrator's own decline path. */
|
|
47
149
|
dropForRun(runId) {
|
|
48
|
-
for (const
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
150
|
+
for (const store of this.stores.all())
|
|
151
|
+
store.resolveRun(runId, "run_terminal");
|
|
152
|
+
for (const [key, entry] of this.live) {
|
|
153
|
+
if (!key.startsWith(`${runId}\u0000`))
|
|
154
|
+
continue;
|
|
155
|
+
this.live.delete(key);
|
|
156
|
+
entry.resolve(null);
|
|
53
157
|
}
|
|
54
158
|
}
|
|
55
159
|
pendingForRun(runId) {
|
|
56
160
|
this.prune();
|
|
57
|
-
return
|
|
58
|
-
|
|
59
|
-
.map((e) => ({
|
|
60
|
-
interactionId: e.ctx.request.interaction_id,
|
|
61
|
-
runId: e.ctx.runId,
|
|
62
|
-
attemptId: e.ctx.attemptId,
|
|
63
|
-
harnessId: e.ctx.harnessId,
|
|
64
|
-
sourceTool: e.ctx.request.source_tool,
|
|
65
|
-
questions: e.ctx.request.questions,
|
|
66
|
-
requestedAt: e.ctx.requestedAt,
|
|
67
|
-
timeoutAt: e.ctx.timeoutAt,
|
|
68
|
-
}));
|
|
69
|
-
}
|
|
70
|
-
/** Drop expired entries (the orchestrator already declined them). */
|
|
161
|
+
return this.stores.all().flatMap((store) => store.pendingForRun(runId));
|
|
162
|
+
}
|
|
71
163
|
prune() {
|
|
72
164
|
const now = Date.now();
|
|
73
|
-
for (const [
|
|
74
|
-
if (entry.expiresAtMs
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
165
|
+
for (const [key, entry] of this.live) {
|
|
166
|
+
if (entry.expiresAtMs > now)
|
|
167
|
+
continue;
|
|
168
|
+
const split = key.indexOf("\u0000");
|
|
169
|
+
const runId = key.slice(0, split);
|
|
170
|
+
const interactionId = key.slice(split + 1);
|
|
171
|
+
entry.store.resolve(runId, interactionId, "timeout");
|
|
172
|
+
this.live.delete(key);
|
|
173
|
+
entry.resolve(null);
|
|
78
174
|
}
|
|
79
175
|
}
|
|
80
176
|
}
|
|
177
|
+
export function interactionProjection() {
|
|
178
|
+
return {
|
|
179
|
+
name: "interactions",
|
|
180
|
+
create: (journal) => new InteractionStore(journal),
|
|
181
|
+
validate: (store) => store.validateProjection(),
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
function interactionKey(runId, interactionId) {
|
|
185
|
+
return `${runId}\u0000${interactionId}`;
|
|
186
|
+
}
|
|
187
|
+
function parseResolution(value) {
|
|
188
|
+
if (!value || typeof value !== "object" || Array.isArray(value))
|
|
189
|
+
throw new Error("invalid interaction resolution");
|
|
190
|
+
const input = value;
|
|
191
|
+
const terminals = ["answered", "timeout", "run_terminal", "interrupted"];
|
|
192
|
+
if (typeof input.runId !== "string" ||
|
|
193
|
+
!Array.isArray(input.interactionIds) ||
|
|
194
|
+
input.interactionIds.length === 0 ||
|
|
195
|
+
input.interactionIds.some((id) => typeof id !== "string" || !id) ||
|
|
196
|
+
!terminals.includes(input.terminal)) {
|
|
197
|
+
throw new Error("invalid interaction resolution");
|
|
198
|
+
}
|
|
199
|
+
return {
|
|
200
|
+
runId: input.runId,
|
|
201
|
+
interactionIds: [...input.interactionIds],
|
|
202
|
+
terminal: input.terminal,
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
function missingMessage(runId, interactionId) {
|
|
206
|
+
return `no pending interaction '${interactionId}' for run '${runId}'`;
|
|
207
|
+
}
|
|
81
208
|
//# sourceMappingURL=interactions.js.map
|
package/dist/interactions.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interactions.js","sourceRoot":"","sources":["../src/interactions.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"interactions.js","sourceRoot":"","sources":["../src/interactions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { DurableJournal, type JournalRecoveryState } from "@claudexor/journal";
|
|
2
|
+
import type { ControlJournalEvent } from "@claudexor/schema";
|
|
3
|
+
export declare function journalEvents(journal: DurableJournal | null, recovery: JournalRecoveryState, afterCursor?: string): ControlJournalEvent[];
|
|
4
|
+
//# sourceMappingURL=journal-events.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"journal-events.d.ts","sourceRoot":"","sources":["../src/journal-events.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EAEd,KAAK,oBAAoB,EAC1B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAE7D,wBAAgB,aAAa,CAC3B,OAAO,EAAE,cAAc,GAAG,IAAI,EAC9B,QAAQ,EAAE,oBAAoB,EAC9B,WAAW,CAAC,EAAE,MAAM,GACnB,mBAAmB,EAAE,CAsBvB"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { JournalRecoveryRequiredError, } from "@claudexor/journal";
|
|
2
|
+
export function journalEvents(journal, recovery, afterCursor) {
|
|
3
|
+
if (!journal || recovery.status === "recovery_required") {
|
|
4
|
+
throw new JournalRecoveryRequiredError(recovery.status === "recovery_required"
|
|
5
|
+
? recovery
|
|
6
|
+
: {
|
|
7
|
+
status: "recovery_required",
|
|
8
|
+
location: { kind: "byte", byteOffset: 0 },
|
|
9
|
+
reason: "journal partition is unavailable",
|
|
10
|
+
discardedTailBytes: 0,
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
const afterSeq = afterCursor ? journal.sequenceAfter(afterCursor) : 0;
|
|
14
|
+
return journal.records(afterSeq).map((record) => ({
|
|
15
|
+
schemaVersion: 1,
|
|
16
|
+
cursor: journal.cursorAt(record.seq),
|
|
17
|
+
partition: record.partition,
|
|
18
|
+
type: record.type,
|
|
19
|
+
observedAt: record.time,
|
|
20
|
+
payload: record.payload,
|
|
21
|
+
}));
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=journal-events.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"journal-events.js","sourceRoot":"","sources":["../src/journal-events.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,4BAA4B,GAE7B,MAAM,oBAAoB,CAAC;AAG5B,MAAM,UAAU,aAAa,CAC3B,OAA8B,EAC9B,QAA8B,EAC9B,WAAoB;IAEpB,IAAI,CAAC,OAAO,IAAI,QAAQ,CAAC,MAAM,KAAK,mBAAmB,EAAE,CAAC;QACxD,MAAM,IAAI,4BAA4B,CACpC,QAAQ,CAAC,MAAM,KAAK,mBAAmB;YACrC,CAAC,CAAC,QAAQ;YACV,CAAC,CAAC;gBACE,MAAM,EAAE,mBAAmB;gBAC3B,QAAQ,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,EAAE;gBACzC,MAAM,EAAE,kCAAkC;gBAC1C,kBAAkB,EAAE,CAAC;aACtB,CACN,CAAC;IACJ,CAAC;IACD,MAAM,QAAQ,GAAG,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACtE,OAAO,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAChD,aAAa,EAAE,CAAC;QAChB,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC;QACpC,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,UAAU,EAAE,MAAM,CAAC,IAAI;QACvB,OAAO,EAAE,MAAM,CAAC,OAAO;KACxB,CAAC,CAAC,CAAC;AACN,CAAC"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { type ControlJournalExportReceipt, type ControlJournalInspection, type ControlJournalQuarantineReceipt, type ControlJournalQuarantineRequest, type ControlJournalValidation } from "@claudexor/schema";
|
|
2
|
+
import type { JournalProjectionDescriptor, JournalProjectionSlot } from "./journal-projection.js";
|
|
3
|
+
export type { JournalProjectionDescriptor, JournalProjectionSlot } from "./journal-projection.js";
|
|
4
|
+
export type JournalQuarantineRequest = ControlJournalQuarantineRequest & {
|
|
5
|
+
idempotencyKey: string;
|
|
6
|
+
};
|
|
7
|
+
type JournalManagerFault = "afterQuarantineRename" | "afterQuarantineReceipt";
|
|
8
|
+
export interface JournalManagerOptions {
|
|
9
|
+
partition?: string;
|
|
10
|
+
now?: () => Date;
|
|
11
|
+
faults?: Partial<Record<JournalManagerFault, () => void>>;
|
|
12
|
+
}
|
|
13
|
+
export declare class JournalManager {
|
|
14
|
+
readonly rootDir: string;
|
|
15
|
+
readonly partition: string;
|
|
16
|
+
readonly journalRoot: string;
|
|
17
|
+
readonly partitionDir: string;
|
|
18
|
+
private readonly operationsDir;
|
|
19
|
+
private readonly quarantineDir;
|
|
20
|
+
private readonly artifactPrefix;
|
|
21
|
+
private readonly now;
|
|
22
|
+
private readonly faults;
|
|
23
|
+
private readonly registrations;
|
|
24
|
+
private journal;
|
|
25
|
+
private recovery;
|
|
26
|
+
private generationValue;
|
|
27
|
+
private started;
|
|
28
|
+
private closed;
|
|
29
|
+
constructor(rootDir: string, options?: JournalManagerOptions);
|
|
30
|
+
registerProjection<T>(descriptor: JournalProjectionDescriptor<T>): JournalProjectionSlot<T>;
|
|
31
|
+
start(): ControlJournalInspection;
|
|
32
|
+
inspect(): ControlJournalInspection;
|
|
33
|
+
ready(): boolean;
|
|
34
|
+
validate(): ControlJournalValidation;
|
|
35
|
+
events(afterCursor?: string): {
|
|
36
|
+
type: string;
|
|
37
|
+
cursor: string;
|
|
38
|
+
observedAt: string;
|
|
39
|
+
schemaVersion: 1;
|
|
40
|
+
partition: string;
|
|
41
|
+
payload?: unknown;
|
|
42
|
+
}[];
|
|
43
|
+
exportRecovery(): ControlJournalExportReceipt;
|
|
44
|
+
preflightQuarantine(input: JournalQuarantineRequest): {
|
|
45
|
+
disposition: string;
|
|
46
|
+
receipt: {
|
|
47
|
+
schemaVersion: 1;
|
|
48
|
+
completedAt: string;
|
|
49
|
+
partition: string;
|
|
50
|
+
operationId: string;
|
|
51
|
+
previousFingerprint: string;
|
|
52
|
+
quarantineArtifactId: string;
|
|
53
|
+
quarantinePath: string;
|
|
54
|
+
newEpoch: string;
|
|
55
|
+
};
|
|
56
|
+
} | {
|
|
57
|
+
disposition: string;
|
|
58
|
+
receipt: null;
|
|
59
|
+
};
|
|
60
|
+
quarantineAndStartFresh(input: JournalQuarantineRequest): ControlJournalQuarantineReceipt;
|
|
61
|
+
close(): void;
|
|
62
|
+
private openGeneration;
|
|
63
|
+
private resume;
|
|
64
|
+
private completeFromReceipt;
|
|
65
|
+
private reconcilePrepared;
|
|
66
|
+
private inspection;
|
|
67
|
+
private enterRecovery;
|
|
68
|
+
private clearSlots;
|
|
69
|
+
private assertStarted;
|
|
70
|
+
private assertOpen;
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=journal-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"journal-manager.d.ts","sourceRoot":"","sources":["../src/journal-manager.ts"],"names":[],"mappings":"AASA,OAAO,EAEL,KAAK,2BAA2B,EAChC,KAAK,wBAAwB,EAC7B,KAAK,+BAA+B,EACpC,KAAK,+BAA+B,EACpC,KAAK,wBAAwB,EAC9B,MAAM,mBAAmB,CAAC;AAiB3B,OAAO,KAAK,EAAE,2BAA2B,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAClG,YAAY,EAAE,2BAA2B,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAElG,MAAM,MAAM,wBAAwB,GAAG,+BAA+B,GAAG;IACvE,cAAc,EAAE,MAAM,CAAC;CACxB,CAAC;AAkBF,KAAK,mBAAmB,GAAG,uBAAuB,GAAG,wBAAwB,CAAC;AAE9E,MAAM,WAAW,qBAAqB;IACpC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,mBAAmB,EAAE,MAAM,IAAI,CAAC,CAAC,CAAC;CAC3D;AAED,qBAAa,cAAc;IAiBvB,QAAQ,CAAC,OAAO,EAAE,MAAM;IAhB1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAa;IACjC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAmD;IAC1E,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA6C;IAC3E,OAAO,CAAC,OAAO,CAA+B;IAC9C,OAAO,CAAC,QAAQ,CAAoE;IACpF,OAAO,CAAC,eAAe,CAAK;IAC5B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,MAAM,CAAS;gBAGZ,OAAO,EAAE,MAAM,EACxB,OAAO,GAAE,qBAA0B;IAcrC,kBAAkB,CAAC,CAAC,EAAE,UAAU,EAAE,2BAA2B,CAAC,CAAC,CAAC,GAAG,qBAAqB,CAAC,CAAC,CAAC;IAW3F,KAAK,IAAI,wBAAwB;IASjC,OAAO,IAAI,wBAAwB;IASnC,KAAK,IAAI,OAAO;IAShB,QAAQ,IAAI,wBAAwB;IA6BpC,MAAM,CAAC,WAAW,CAAC,EAAE,MAAM;;;;;;;;IAK3B,cAAc,IAAI,2BAA2B;IAmD7C,mBAAmB,CAAC,KAAK,EAAE,wBAAwB;;;;;;;;;;;;;;;;IA8BnD,uBAAuB,CAAC,KAAK,EAAE,wBAAwB,GAAG,+BAA+B;IA+BzF,KAAK,IAAI,IAAI;IAQb,OAAO,CAAC,cAAc;IAgCtB,OAAO,CAAC,MAAM;IAsDd,OAAO,CAAC,mBAAmB;IAyB3B,OAAO,CAAC,iBAAiB;IA8BzB,OAAO,CAAC,UAAU;IAalB,OAAO,CAAC,aAAa;IAKrB,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,aAAa;IAKrB,OAAO,CAAC,UAAU;CAGnB"}
|