@cotal-ai/connector-core 0.18.0 → 0.20.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/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +12 -2
- package/dist/agent.js.map +1 -1
- package/dist/agui-holder.d.ts +89 -0
- package/dist/agui-holder.d.ts.map +1 -0
- package/dist/agui-holder.js +135 -0
- package/dist/agui-holder.js.map +1 -0
- package/dist/agui-render.d.ts +100 -0
- package/dist/agui-render.d.ts.map +1 -0
- package/dist/agui-render.js +283 -0
- package/dist/agui-render.js.map +1 -0
- package/dist/agui-wal-path.d.ts +103 -0
- package/dist/agui-wal-path.d.ts.map +1 -0
- package/dist/agui-wal-path.js +324 -0
- package/dist/agui-wal-path.js.map +1 -0
- package/dist/agui.d.ts +727 -0
- package/dist/agui.d.ts.map +1 -0
- package/dist/agui.js +1114 -0
- package/dist/agui.js.map +1 -0
- package/dist/docs-bundle.generated.d.ts.map +1 -1
- package/dist/docs-bundle.generated.js +16 -9
- package/dist/docs-bundle.generated.js.map +1 -1
- package/dist/durable-source.d.ts +127 -0
- package/dist/durable-source.d.ts.map +1 -0
- package/dist/durable-source.js +219 -0
- package/dist/durable-source.js.map +1 -0
- package/dist/event-wal.d.ts +265 -0
- package/dist/event-wal.d.ts.map +1 -0
- package/dist/event-wal.js +698 -0
- package/dist/event-wal.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -1
- package/dist/launch.d.ts +78 -2
- package/dist/launch.d.ts.map +1 -1
- package/dist/launch.js +120 -0
- package/dist/launch.js.map +1 -1
- package/dist/tool-specs.d.ts +40 -2
- package/dist/tool-specs.d.ts.map +1 -1
- package/dist/tool-specs.js +51 -1
- package/dist/tool-specs.js.map +1 -1
- package/dist/tools.d.ts.map +1 -1
- package/dist/tools.js +5 -6
- package/dist/tools.js.map +1 -1
- package/package.json +8 -2
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
import { type FileHandle } from "node:fs/promises";
|
|
2
|
+
import { type Part } from "@cotal-ai/core";
|
|
3
|
+
import type { BracketState } from "./agui.js";
|
|
4
|
+
/**
|
|
5
|
+
* Bump ONLY with a migration. An OLDER document is migrated forward; a NEWER one fails loud.
|
|
6
|
+
*
|
|
7
|
+
* **v2 added `brackets`** — the AG-UI bracket machine's state, persisted so a mid-run restart can
|
|
8
|
+
* continue instead of refusing the first event it re-reads.
|
|
9
|
+
*
|
|
10
|
+
* **v3 added `gen`** — a counter this writer bumps on every durable replace, so a write can tell
|
|
11
|
+
* whether the document it is about to replace is the one it last read. See {@link EventWal.write}.
|
|
12
|
+
* A v2 document has never been written by a generation-aware writer, so it migrates forward at
|
|
13
|
+
* generation 0; from v3 on the field is REQUIRED, because "absent" and "zero" would otherwise be
|
|
14
|
+
* the same value and stripping the field would disable the guard silently.
|
|
15
|
+
*
|
|
16
|
+
* **THE MIGRATION IS FORWARD-ONLY, AND THAT MAKES THE STATE OUTLIVE A CODE ROLLBACK.** Once a
|
|
17
|
+
* process writes v2, reverting the code does NOT revert the state: the older build refuses the
|
|
18
|
+
* document it now finds. That is the right trade — fail-loud beats silently reading a schema you do
|
|
19
|
+
* not understand — but it converts "revert the commit" into "revert the commit and hand-migrate the
|
|
20
|
+
* state", and the person doing the reverting will otherwise discover that at the worst moment. So
|
|
21
|
+
* the refusal below distinguishes NEWER-than-this-code from unknown, and says which migration.
|
|
22
|
+
* There is deliberately no downgrade path: a lossy downgrade is worse than a halt.
|
|
23
|
+
*/
|
|
24
|
+
export declare const EVENT_WAL_VERSION = 3;
|
|
25
|
+
export interface WalFrontier {
|
|
26
|
+
/** The `seq` of the last frame FOLDED into the frontier. 0 before the first frame lands. */
|
|
27
|
+
seq: number;
|
|
28
|
+
/** The subject sequence the next publish must expect (`E`). 0 on a virgin thread. */
|
|
29
|
+
lastSubjectSeq: number;
|
|
30
|
+
/** The durable source position everything up to `seq` was derived from. */
|
|
31
|
+
sourceCursor: string | undefined;
|
|
32
|
+
}
|
|
33
|
+
export interface WalPending {
|
|
34
|
+
state: "sent_unacked" | "acked";
|
|
35
|
+
/** Frozen at transition 1 and NEVER re-minted — a retry must carry the same id. */
|
|
36
|
+
id: string;
|
|
37
|
+
/** The expectation frozen at transition 1, likewise never recomputed on retry. */
|
|
38
|
+
E: number;
|
|
39
|
+
seq: number;
|
|
40
|
+
sourceCursor: string;
|
|
41
|
+
/**
|
|
42
|
+
* The frame's parts, FROZEN at transition 1 beside the id and `E` that identify them.
|
|
43
|
+
*
|
|
44
|
+
* Without this the WAL froze what NAMES a frame and not the frame: a restart holding
|
|
45
|
+
* `sent_unacked` recovered the id and the expectation and had nothing to re-publish, so
|
|
46
|
+
* "retry the same frame after a crash" — the one thing this file exists to make possible —
|
|
47
|
+
* could not be performed from the document. The write-ahead rule requires it and it was absent.
|
|
48
|
+
*
|
|
49
|
+
* It is the parts and not a rendered message because `multicastExpecting` builds the envelope
|
|
50
|
+
* (`ts`, `from`, `space`) at publish time; storing that too would freeze a second copy of fields
|
|
51
|
+
* the publisher owns, and a retry would then carry a stale `ts` under a frozen id.
|
|
52
|
+
*/
|
|
53
|
+
body: Part[];
|
|
54
|
+
/** Present iff `state === "acked"`: the sequence the server assigned. */
|
|
55
|
+
ackSeq?: number;
|
|
56
|
+
/**
|
|
57
|
+
* The bracket machine's state AFTER this frame's events (v2).
|
|
58
|
+
*
|
|
59
|
+
* Frozen with the frame rather than derived on fold, for the same reason the body is: the state
|
|
60
|
+
* that belongs to a frame is decided when the frame is decided. Transition 3 promotes it to the
|
|
61
|
+
* document's own `brackets`, so what is persisted always describes exactly the events that have
|
|
62
|
+
* been published AND folded — never a batch that was validated and not yet sent.
|
|
63
|
+
*/
|
|
64
|
+
brackets: BracketState;
|
|
65
|
+
}
|
|
66
|
+
export interface WalDoc {
|
|
67
|
+
v: number;
|
|
68
|
+
/**
|
|
69
|
+
* How many durable replaces this document has been through (v3).
|
|
70
|
+
*
|
|
71
|
+
* It is a WITNESS, not a clock: its only job is to let a writer notice that the file it is about
|
|
72
|
+
* to replace is no longer the file it read. Nothing orders two documents by it and nothing derives
|
|
73
|
+
* a position from it.
|
|
74
|
+
*/
|
|
75
|
+
gen: number;
|
|
76
|
+
/**
|
|
77
|
+
* The space this WAL belongs to — stored because it is a PATH COMPONENT and a path component is
|
|
78
|
+
* not a trusted input. `principal` and `threadId` were verified on
|
|
79
|
+
* load and `space` was not, so a WAL copied or mis-resolved between two space directories under
|
|
80
|
+
* the same principal and thread LOADED, and one space's frontier was adopted as another's. Two
|
|
81
|
+
* thirds of a three-part guard is not the guard.
|
|
82
|
+
*/
|
|
83
|
+
space: string;
|
|
84
|
+
epoch: string;
|
|
85
|
+
threadId: string;
|
|
86
|
+
principal: string;
|
|
87
|
+
frontier: WalFrontier;
|
|
88
|
+
pending: WalPending | null;
|
|
89
|
+
/**
|
|
90
|
+
* The bracket machine at the FOLDED position, or `null` for **unknown** (v2).
|
|
91
|
+
*
|
|
92
|
+
* `null` and an explicitly empty state are different facts and the difference is load-bearing.
|
|
93
|
+
* An empty state is this writer saying "nothing is open"; `null` is a document that cannot say —
|
|
94
|
+
* a WAL migrated from v1, which recorded no bracket state at all. A restart on `null` therefore
|
|
95
|
+
* still takes the lost-state path and still says so, while a restart on a recorded state simply
|
|
96
|
+
* continues. Collapsing the two would make a migrated document silently claim a clean boundary it
|
|
97
|
+
* never observed, which is the same class as treating a zero-byte file as a virgin thread.
|
|
98
|
+
*/
|
|
99
|
+
brackets: BracketState | null;
|
|
100
|
+
}
|
|
101
|
+
/** Every refusal in this file is one of these, so a caller can never mistake it for an I/O blip. */
|
|
102
|
+
export declare class WalCorruptError extends Error {
|
|
103
|
+
readonly path: string;
|
|
104
|
+
readonly invariant: string;
|
|
105
|
+
constructor(path: string, invariant: string, detail: string);
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Thrown when this handle's document is not the one on disk any more.
|
|
109
|
+
*
|
|
110
|
+
* A DISTINCT type from {@link WalCorruptError} because the file is not corrupt: it is FINE, and it
|
|
111
|
+
* belongs to somebody else's newer view. An operator reading "corrupt" would go looking for a bad
|
|
112
|
+
* disk; the actual situation is two writers, and only one of them is current.
|
|
113
|
+
*/
|
|
114
|
+
export declare class WalStaleWriterError extends Error {
|
|
115
|
+
readonly path: string;
|
|
116
|
+
readonly expectedGen: number;
|
|
117
|
+
readonly foundGen: number | undefined;
|
|
118
|
+
constructor(path: string, expectedGen: number, foundGen: number | undefined);
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Create a file EXCLUSIVELY and WITHOUT following a symlink, at mode 0600.
|
|
122
|
+
*
|
|
123
|
+
* **Exported so a test can drive the shipped flags rather than recompose them.** A cell that builds
|
|
124
|
+
* `O_WRONLY | O_CREAT | O_EXCL | O_NOFOLLOW` itself is testing a COPY of this rule: it stays green
|
|
125
|
+
* while the production open drifts or loses a flag. That is not hypothetical here — the first
|
|
126
|
+
* version of those cells did exactly that, and a mutation reverting the real open to `"w"` left the
|
|
127
|
+
* suite fully green. Driving this function is what makes the mutation land.
|
|
128
|
+
*
|
|
129
|
+
* `O_EXCL` refuses a pre-existing file rather than adopting it — which matters because `"w"` does
|
|
130
|
+
* NOT re-chmod an existing inode, so an adopted 0644 temp would carry its mode onto the renamed WAL
|
|
131
|
+
* and expose `pending.id`. `O_NOFOLLOW` refuses a symlink rather than truncating its target.
|
|
132
|
+
*/
|
|
133
|
+
export declare function openExclusiveNoFollow(path: string): Promise<FileHandle>;
|
|
134
|
+
export declare class EventWal {
|
|
135
|
+
readonly path: string;
|
|
136
|
+
private doc;
|
|
137
|
+
/**
|
|
138
|
+
* Every mutation runs one-at-a-time on this chain.
|
|
139
|
+
*
|
|
140
|
+
* Without it, two concurrent `beginSend` calls both read `this.doc.pending === null` before either
|
|
141
|
+
* durable replace finishes — the guard is an in-memory read that is NOT atomic with the write
|
|
142
|
+
* across its `await` points. Reviewers reproduced the split: one call fulfils, one rejects, and
|
|
143
|
+
* the process is left holding `pending.id === "A"` in memory while the disk says `"B"`. Recovery
|
|
144
|
+
* would then resume the frame on disk while the live emitter retries the other, which breaks the
|
|
145
|
+
* one thing this file exists to guarantee — that `id` and `E` are frozen and agreed.
|
|
146
|
+
*
|
|
147
|
+
* A per-instance chain is sufficient and honest about its scope, and the scope is narrower than it
|
|
148
|
+
* once claimed: it serializes THIS INSTANCE's callers. It does nothing about a SECOND `EventWal`
|
|
149
|
+
* on the same file, in this process or another — the chain is per object, so two objects are two
|
|
150
|
+
* chains and both of them "succeed". That gap was described here as "solved upstream by the
|
|
151
|
+
* principal-level lock" while no lock was ever acquired. Two things close it now, and neither is
|
|
152
|
+
* this chain: `acquirePrincipalLock` refuses a second emitter for the principal at start, and
|
|
153
|
+
* {@link EventWal.assertNotClobbering} refuses a stale handle's write even when it got past that.
|
|
154
|
+
*/
|
|
155
|
+
private chain;
|
|
156
|
+
/** Run `op` after every previously-queued mutation, whether they resolved or threw. */
|
|
157
|
+
private serialize;
|
|
158
|
+
private constructor();
|
|
159
|
+
get epoch(): string;
|
|
160
|
+
/** The principal this WAL was loaded FOR — exposed so a consumer can prove it is holding its own.
|
|
161
|
+
* `open()` already refuses a document whose stored principal disagrees, but that check protects
|
|
162
|
+
* the FILE, not the caller: an emitter handed the wrong WAL object entirely would sail past it. */
|
|
163
|
+
get principal(): string;
|
|
164
|
+
get threadId(): string;
|
|
165
|
+
/** The bracket machine at the folded position, or `null` when the document cannot say (migrated
|
|
166
|
+
* from v1). The two are different facts; see {@link WalDoc.brackets}. */
|
|
167
|
+
get brackets(): BracketState | null;
|
|
168
|
+
get frontier(): WalFrontier;
|
|
169
|
+
get pending(): WalPending | null;
|
|
170
|
+
/**
|
|
171
|
+
* Load an existing WAL, or start a virgin one.
|
|
172
|
+
*
|
|
173
|
+
* `subjectMayExist` is the caller's honest statement about whether this principal+thread could
|
|
174
|
+
* already have published. It is NOT a convenience flag: with it true, a missing or empty WAL is a
|
|
175
|
+
* refusal, because the tip cannot be inferred — agent creds hold no read shape over the subject,
|
|
176
|
+
* and guessing `E := 0` either CAS-halts forever or appends under a stale expectation. Recovery
|
|
177
|
+
* from that state is an explicit operator act, never a startup heuristic.
|
|
178
|
+
*/
|
|
179
|
+
static open(path: string, opts: {
|
|
180
|
+
space: string;
|
|
181
|
+
threadId: string;
|
|
182
|
+
principal: string;
|
|
183
|
+
subjectMayExist: boolean;
|
|
184
|
+
}): Promise<EventWal>;
|
|
185
|
+
private static virgin;
|
|
186
|
+
/** Transition 1 — record the frame, with `id` and `E` frozen, BEFORE any publish. */
|
|
187
|
+
beginSend(frame: {
|
|
188
|
+
id: string;
|
|
189
|
+
E: number;
|
|
190
|
+
seq: number;
|
|
191
|
+
sourceCursor: string;
|
|
192
|
+
body: Part[];
|
|
193
|
+
/** The bracket machine AFTER this frame's events — frozen with the frame, promoted on fold. */
|
|
194
|
+
brackets: BracketState;
|
|
195
|
+
}): Promise<void>;
|
|
196
|
+
/**
|
|
197
|
+
* Transition 2 — a NON-duplicate ack becomes durable before the frontier moves.
|
|
198
|
+
* A duplicate ack must never reach here; the caller fails loud on one.
|
|
199
|
+
*/
|
|
200
|
+
recordAck(ackSeq: number): Promise<void>;
|
|
201
|
+
/** Transition 3 — fold the acked frame into the frontier and clear pending. */
|
|
202
|
+
fold(): Promise<void>;
|
|
203
|
+
/**
|
|
204
|
+
* Transition 4 — a bounded source range that mapped to NOTHING.
|
|
205
|
+
*
|
|
206
|
+
* A mapper SUCCESS returning zero events advances the cursor atomically and alone: no
|
|
207
|
+
* `seq` consumed, no pending written, no publish. A mapper ERROR never advances it. Empty and
|
|
208
|
+
* failed must not share a path: conflating them turns a parser bug into silently skipped history.
|
|
209
|
+
*/
|
|
210
|
+
advanceCursorOnly(rangeEnd: string): Promise<void>;
|
|
211
|
+
/**
|
|
212
|
+
* Abandonment — explicit, destructive and TOTAL. Mints a new epoch AND resets `seq`,
|
|
213
|
+
* `lastSubjectSeq` and `sourceCursor` together, reusing the same subject; the new epoch is what
|
|
214
|
+
* tells a consumer the chain broke. Partial abandonment is not a state: either all four move or
|
|
215
|
+
* the emitter stays halted. Required after a filtered channel purge, which returns the subject
|
|
216
|
+
* tip to 0 while the WAL still holds a non-zero `E`, permanently CAS-failing every later publish.
|
|
217
|
+
*/
|
|
218
|
+
abandon(): Promise<void>;
|
|
219
|
+
/**
|
|
220
|
+
* Durable replace: write a sibling temp file, fsync it, then rename over the target. The rename
|
|
221
|
+
* is what makes a reader see either the whole old document or the whole new one and never a torn
|
|
222
|
+
* prefix — which is precisely why a zero-byte WAL is treated as corruption rather than as virgin.
|
|
223
|
+
*
|
|
224
|
+
* **MODE 0600, AND THE REASON IS NOT TIDINESS: `pending.id` IS A PRE-PUBLICATION SECRET.**
|
|
225
|
+
* The dedup cache the frozen id is checked against is STREAM-WIDE, so anyone who learns an id
|
|
226
|
+
* BEFORE its frame is published can pre-seed it and make the real publish come back
|
|
227
|
+
* `duplicate: true`. The design attributes the safety of that entirely to `randomUUID()` entropy —
|
|
228
|
+
* which holds only while the id is unguessable AND unread. An id already on the wire is harmless
|
|
229
|
+
* (that message has landed); the only window where it is dangerous is exactly the window this
|
|
230
|
+
* file holds it in, between transition 1 and the ack.
|
|
231
|
+
*
|
|
232
|
+
* So the residual a reviewer raised as "gated on a local disk read rather than mesh access" is
|
|
233
|
+
* gated on a read OF THIS FILE. A world-readable WAL would convert a property the design credits
|
|
234
|
+
* to entropy into one credited to filesystem luck. Under our own rules the attack yields a LOUD
|
|
235
|
+
* halt rather than silent loss — a duplicate ack on a retry fails loud with the frontier and
|
|
236
|
+
* cursor unmoved — so this is denial of service, not corruption. Closing it by construction is
|
|
237
|
+
* cheap enough that naming it as an accepted residual would be the worse trade.
|
|
238
|
+
*/
|
|
239
|
+
private write;
|
|
240
|
+
/**
|
|
241
|
+
* Refuse to replace a document this handle did not read.
|
|
242
|
+
*
|
|
243
|
+
* **THE FAILURE THIS EXISTS FOR WAS EXECUTED, NOT IMAGINED.** Two `EventWal` objects were opened
|
|
244
|
+
* on one file. A ran the full cycle and folded a frontier of `{seq:1, lastSubjectSeq:5}`. B, whose
|
|
245
|
+
* in-memory document was frozen back at the pending write, then called `recordAck(99)` and
|
|
246
|
+
* `fold()` — both SUCCEEDED, each replacing the whole file, and the WAL came back up claiming a
|
|
247
|
+
* durable tip of 99: a subject sequence the broker never assigned. The next publish freezes
|
|
248
|
+
* `E := 99` against a stream whose real tip is 5, so the emitter either CAS-halts forever or
|
|
249
|
+
* recovers a frontier that never existed. Nothing about that is loud; it reads as a healthy WAL.
|
|
250
|
+
*
|
|
251
|
+
* The per-instance `serialize` chain cannot see it (two instances, two chains) and neither can the
|
|
252
|
+
* principal lock (B's handle predates any lock B would take, and a lock is not held against a
|
|
253
|
+
* process's own second object). The guard has to be HERE, on the write, where the two views
|
|
254
|
+
* finally meet.
|
|
255
|
+
*
|
|
256
|
+
* **This is a check, not a transaction, and the difference is stated rather than glossed.** The
|
|
257
|
+
* read and the `rename` are separate syscalls, so a writer that lands in between is not caught by
|
|
258
|
+
* this; what is caught is every stale handle — the case that actually occurs, because a stale
|
|
259
|
+
* handle stays stale for as long as it exists rather than for a syscall's width. The lock is what
|
|
260
|
+
* keeps a second live writer from starting; this is what keeps one that already exists from
|
|
261
|
+
* winning.
|
|
262
|
+
*/
|
|
263
|
+
private assertNotClobbering;
|
|
264
|
+
}
|
|
265
|
+
//# sourceMappingURL=event-wal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-wal.d.ts","sourceRoot":"","sources":["../src/event-wal.ts"],"names":[],"mappings":"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"}
|