@animalabs/agent-framework 0.19.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/README.md +29 -0
- package/dist/src/agent.d.ts +22 -0
- package/dist/src/agent.d.ts.map +1 -1
- package/dist/src/agent.js +128 -10
- package/dist/src/agent.js.map +1 -1
- package/dist/src/api/types.d.ts +1 -1
- package/dist/src/api/types.d.ts.map +1 -1
- package/dist/src/code-execution/py-runner.d.ts +10 -1
- package/dist/src/code-execution/py-runner.d.ts.map +1 -1
- package/dist/src/code-execution/py-runner.js +27 -2
- package/dist/src/code-execution/py-runner.js.map +1 -1
- package/dist/src/code-execution/tool-definition.d.ts +21 -0
- package/dist/src/code-execution/tool-definition.d.ts.map +1 -1
- package/dist/src/code-execution/tool-definition.js +34 -0
- package/dist/src/code-execution/tool-definition.js.map +1 -1
- package/dist/src/framework.d.ts +153 -2
- package/dist/src/framework.d.ts.map +1 -1
- package/dist/src/framework.js +1169 -76
- package/dist/src/framework.js.map +1 -1
- package/dist/src/index.d.ts +2 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +4 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/mcpl/capability-grant.d.ts +1 -1
- package/dist/src/mcpl/capability-grant.d.ts.map +1 -1
- package/dist/src/mcpl/capability-grant.js +49 -5
- package/dist/src/mcpl/capability-grant.js.map +1 -1
- package/dist/src/mcpl/channel-registry.d.ts +59 -2
- package/dist/src/mcpl/channel-registry.d.ts.map +1 -1
- package/dist/src/mcpl/channel-registry.js +106 -6
- package/dist/src/mcpl/channel-registry.js.map +1 -1
- package/dist/src/mcpl/index.d.ts +3 -0
- package/dist/src/mcpl/index.d.ts.map +1 -1
- package/dist/src/mcpl/index.js +3 -0
- package/dist/src/mcpl/index.js.map +1 -1
- package/dist/src/mcpl/push-coalescer.d.ts +318 -0
- package/dist/src/mcpl/push-coalescer.d.ts.map +1 -0
- package/dist/src/mcpl/push-coalescer.js +709 -0
- package/dist/src/mcpl/push-coalescer.js.map +1 -0
- package/dist/src/mcpl/push-handler.d.ts +7 -2
- package/dist/src/mcpl/push-handler.d.ts.map +1 -1
- package/dist/src/mcpl/push-handler.js +43 -4
- package/dist/src/mcpl/push-handler.js.map +1 -1
- package/dist/src/mcpl/server-connection.d.ts +18 -0
- package/dist/src/mcpl/server-connection.d.ts.map +1 -1
- package/dist/src/mcpl/server-connection.js +44 -1
- package/dist/src/mcpl/server-connection.js.map +1 -1
- package/dist/src/mcpl/tool-classes.d.ts +71 -0
- package/dist/src/mcpl/tool-classes.d.ts.map +1 -0
- package/dist/src/mcpl/tool-classes.js +170 -0
- package/dist/src/mcpl/tool-classes.js.map +1 -0
- package/dist/src/mcpl/tool-glob.d.ts +16 -0
- package/dist/src/mcpl/tool-glob.d.ts.map +1 -0
- package/dist/src/mcpl/tool-glob.js +41 -0
- package/dist/src/mcpl/tool-glob.js.map +1 -0
- package/dist/src/mcpl/tool-lifecycle.d.ts +253 -0
- package/dist/src/mcpl/tool-lifecycle.d.ts.map +1 -0
- package/dist/src/mcpl/tool-lifecycle.js +592 -0
- package/dist/src/mcpl/tool-lifecycle.js.map +1 -0
- package/dist/src/mcpl/transport.d.ts +12 -0
- package/dist/src/mcpl/transport.d.ts.map +1 -1
- package/dist/src/mcpl/transport.js +33 -1
- package/dist/src/mcpl/transport.js.map +1 -1
- package/dist/src/mcpl/types.d.ts +66 -1
- package/dist/src/mcpl/types.d.ts.map +1 -1
- package/dist/src/mcpl/types.js +6 -0
- package/dist/src/mcpl/types.js.map +1 -1
- package/dist/src/modules/discord/index.js +1 -1
- package/dist/src/modules/discord/index.js.map +1 -1
- package/dist/src/modules/history/index.d.ts +85 -0
- package/dist/src/modules/history/index.d.ts.map +1 -1
- package/dist/src/modules/history/index.js +1019 -24
- package/dist/src/modules/history/index.js.map +1 -1
- package/dist/src/modules/history/semantic.d.ts +202 -0
- package/dist/src/modules/history/semantic.d.ts.map +1 -0
- package/dist/src/modules/history/semantic.js +418 -0
- package/dist/src/modules/history/semantic.js.map +1 -0
- package/dist/src/modules/index.d.ts +2 -1
- package/dist/src/modules/index.d.ts.map +1 -1
- package/dist/src/modules/index.js.map +1 -1
- package/dist/src/tool-result-guard.d.ts +82 -0
- package/dist/src/tool-result-guard.d.ts.map +1 -0
- package/dist/src/tool-result-guard.js +306 -0
- package/dist/src/tool-result-guard.js.map +1 -0
- package/dist/src/types/agent.d.ts +14 -0
- package/dist/src/types/agent.d.ts.map +1 -1
- package/dist/src/types/framework.d.ts +21 -0
- package/dist/src/types/framework.d.ts.map +1 -1
- package/dist/src/types/trace.d.ts +17 -0
- package/dist/src/types/trace.d.ts.map +1 -1
- package/dist/test/channel-registry-routing.test.js +59 -0
- package/dist/test/channel-registry-routing.test.js.map +1 -1
- package/dist/test/code-execution.test.js +139 -0
- package/dist/test/code-execution.test.js.map +1 -1
- package/dist/test/helpers/coalescing-fixture.d.ts +72 -0
- package/dist/test/helpers/coalescing-fixture.d.ts.map +1 -0
- package/dist/test/helpers/coalescing-fixture.js +145 -0
- package/dist/test/helpers/coalescing-fixture.js.map +1 -0
- package/dist/test/helpers/coalescing-kill-child.d.ts +2 -0
- package/dist/test/helpers/coalescing-kill-child.d.ts.map +1 -0
- package/dist/test/helpers/coalescing-kill-child.js +24 -0
- package/dist/test/helpers/coalescing-kill-child.js.map +1 -0
- package/dist/test/history-module-realstore.test.d.ts +2 -0
- package/dist/test/history-module-realstore.test.d.ts.map +1 -0
- package/dist/test/history-module-realstore.test.js +363 -0
- package/dist/test/history-module-realstore.test.js.map +1 -0
- package/dist/test/history-module-semantic.test.d.ts +2 -0
- package/dist/test/history-module-semantic.test.d.ts.map +1 -0
- package/dist/test/history-module-semantic.test.js +213 -0
- package/dist/test/history-module-semantic.test.js.map +1 -0
- package/dist/test/history-module-ux.test.d.ts +2 -0
- package/dist/test/history-module-ux.test.d.ts.map +1 -0
- package/dist/test/history-module-ux.test.js +304 -0
- package/dist/test/history-module-ux.test.js.map +1 -0
- package/dist/test/history-module.test.js +25 -1
- package/dist/test/history-module.test.js.map +1 -1
- package/dist/test/history-semantic-review-findings.test.d.ts +2 -0
- package/dist/test/history-semantic-review-findings.test.d.ts.map +1 -0
- package/dist/test/history-semantic-review-findings.test.js +338 -0
- package/dist/test/history-semantic-review-findings.test.js.map +1 -0
- package/dist/test/history-semantic-sync-converges.test.d.ts +2 -0
- package/dist/test/history-semantic-sync-converges.test.d.ts.map +1 -0
- package/dist/test/history-semantic-sync-converges.test.js +109 -0
- package/dist/test/history-semantic-sync-converges.test.js.map +1 -0
- package/dist/test/mcpl-capability-grant.test.js +3 -1
- package/dist/test/mcpl-capability-grant.test.js.map +1 -1
- package/dist/test/mcpl-child-env.test.d.ts +2 -0
- package/dist/test/mcpl-child-env.test.d.ts.map +1 -0
- package/dist/test/mcpl-child-env.test.js +69 -0
- package/dist/test/mcpl-child-env.test.js.map +1 -0
- package/dist/test/mcpl-coalescing.test.d.ts +2 -0
- package/dist/test/mcpl-coalescing.test.d.ts.map +1 -0
- package/dist/test/mcpl-coalescing.test.js +1050 -0
- package/dist/test/mcpl-coalescing.test.js.map +1 -0
- package/dist/test/mcpl-list-status.test.js +4 -0
- package/dist/test/mcpl-list-status.test.js.map +1 -1
- package/dist/test/mcpl-tool-class-listing.test.d.ts +2 -0
- package/dist/test/mcpl-tool-class-listing.test.d.ts.map +1 -0
- package/dist/test/mcpl-tool-class-listing.test.js +147 -0
- package/dist/test/mcpl-tool-class-listing.test.js.map +1 -0
- package/dist/test/mcpl-tool-classes.test.d.ts +7 -0
- package/dist/test/mcpl-tool-classes.test.d.ts.map +1 -0
- package/dist/test/mcpl-tool-classes.test.js +80 -0
- package/dist/test/mcpl-tool-classes.test.js.map +1 -0
- package/dist/test/mcpl-tool-lifecycle-e2e.test.d.ts +2 -0
- package/dist/test/mcpl-tool-lifecycle-e2e.test.d.ts.map +1 -0
- package/dist/test/mcpl-tool-lifecycle-e2e.test.js +237 -0
- package/dist/test/mcpl-tool-lifecycle-e2e.test.js.map +1 -0
- package/dist/test/mcpl-tool-lifecycle-emitter.test.d.ts +11 -0
- package/dist/test/mcpl-tool-lifecycle-emitter.test.d.ts.map +1 -0
- package/dist/test/mcpl-tool-lifecycle-emitter.test.js +307 -0
- package/dist/test/mcpl-tool-lifecycle-emitter.test.js.map +1 -0
- package/dist/test/mcpl-tool-lifecycle.test.d.ts +11 -0
- package/dist/test/mcpl-tool-lifecycle.test.d.ts.map +1 -0
- package/dist/test/mcpl-tool-lifecycle.test.js +270 -0
- package/dist/test/mcpl-tool-lifecycle.test.js.map +1 -0
- package/dist/test/silent-heartbeat.test.d.ts +2 -0
- package/dist/test/silent-heartbeat.test.d.ts.map +1 -0
- package/dist/test/silent-heartbeat.test.js +154 -0
- package/dist/test/silent-heartbeat.test.js.map +1 -0
- package/dist/test/tool-result-guard.test.d.ts +2 -0
- package/dist/test/tool-result-guard.test.d.ts.map +1 -0
- package/dist/test/tool-result-guard.test.js +1081 -0
- package/dist/test/tool-result-guard.test.js.map +1 -0
- package/dist/test/trunk-channel-routing.test.js +67 -0
- package/dist/test/trunk-channel-routing.test.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +2 -2
- package/src/agent.ts +128 -10
- package/src/api/types.ts +2 -0
- package/src/code-execution/py-runner.ts +34 -2
- package/src/code-execution/tool-definition.ts +46 -0
- package/src/framework.ts +1201 -80
- package/src/index.ts +13 -0
- package/src/mcpl/capability-grant.ts +54 -6
- package/src/mcpl/channel-registry.ts +115 -7
- package/src/mcpl/index.ts +29 -0
- package/src/mcpl/push-coalescer.ts +821 -0
- package/src/mcpl/push-handler.ts +40 -4
- package/src/mcpl/server-connection.ts +48 -2
- package/src/mcpl/tool-classes.ts +188 -0
- package/src/mcpl/tool-glob.ts +36 -0
- package/src/mcpl/tool-lifecycle.ts +730 -0
- package/src/mcpl/transport.ts +35 -1
- package/src/mcpl/types.ts +69 -1
- package/src/modules/discord/index.ts +1 -1
- package/src/modules/history/index.ts +1089 -24
- package/src/modules/history/semantic.ts +473 -0
- package/src/modules/index.ts +2 -1
- package/src/tool-result-guard.ts +318 -0
- package/src/types/agent.ts +15 -0
- package/src/types/framework.ts +23 -0
- package/src/types/trace.ts +17 -0
|
@@ -0,0 +1,318 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RFC-006 event coalescing (mcpl PR #5, revision 7): replace-if-unread, deferred
|
|
3
|
+
* rendering, and atomic retraction, for both delivery lanes.
|
|
4
|
+
*
|
|
5
|
+
* The design keeps content IN context. A plain occurrence is delivered through
|
|
6
|
+
* the ordinary channel/push path the moment it is admitted, exactly as today;
|
|
7
|
+
* the coalescer only remembers WHERE it landed. A later occurrence of the same
|
|
8
|
+
* subject edits or removes that message in place while it is still unread
|
|
9
|
+
* (above the agent's consumed watermark, not folded by compression), and
|
|
10
|
+
* appends once it has been read. Nothing is staged, journaled or capped: on
|
|
11
|
+
* any uncertainty (restart, branch switch, eviction) the host behaves as an
|
|
12
|
+
* append-only host would, which is what the RFC's principle 4 asks for.
|
|
13
|
+
*
|
|
14
|
+
* Only deferred batches (§5) wait outside context, because a notice has no
|
|
15
|
+
* model-visible content until `push/render` produces it.
|
|
16
|
+
*
|
|
17
|
+
* All host effects go through {@link CoalescerHost}; this class is pure
|
|
18
|
+
* bookkeeping and is unit-tested without a framework.
|
|
19
|
+
*/
|
|
20
|
+
import type { McplContentBlock, PushEventResult } from './types.js';
|
|
21
|
+
export declare const PUSH_COALESCING_SUPPORT: {
|
|
22
|
+
readonly pushEvents: true;
|
|
23
|
+
readonly channelsIncoming: true;
|
|
24
|
+
readonly deferred: true;
|
|
25
|
+
readonly channelScopedPush: true;
|
|
26
|
+
readonly retryWindowMs: 3600000;
|
|
27
|
+
};
|
|
28
|
+
export declare const COALESCE_OUTCOMES: readonly ["first", "replaced", "appended", "retracted", "noted", "consumed"];
|
|
29
|
+
export type CoalesceOutcome = typeof COALESCE_OUTCOMES[number];
|
|
30
|
+
export declare class CoalesceError extends Error {
|
|
31
|
+
readonly field: string;
|
|
32
|
+
readonly code: number;
|
|
33
|
+
constructor(field: string, message: string, code?: number);
|
|
34
|
+
}
|
|
35
|
+
/** Where an unread occurrence currently lives. */
|
|
36
|
+
export interface CoalescingPlacement {
|
|
37
|
+
agent: string;
|
|
38
|
+
/** Stored message id in that agent's context manager. */
|
|
39
|
+
messageId?: string;
|
|
40
|
+
/** Entry id in the framework's deferred-write queue (turn-alive deferral). */
|
|
41
|
+
deferredId?: string;
|
|
42
|
+
}
|
|
43
|
+
export interface CoalescingScope {
|
|
44
|
+
kind: 'featureSet' | 'channel';
|
|
45
|
+
id: string;
|
|
46
|
+
}
|
|
47
|
+
/** One admitted occurrence, normalized from either lane. */
|
|
48
|
+
export interface CoalescedOccurrence<E = unknown> {
|
|
49
|
+
serverId: string;
|
|
50
|
+
/** Host-owned binding identity (§3.2): stable across reconnects to the same
|
|
51
|
+
* configured peer, different when the id is reassigned to another one. */
|
|
52
|
+
binding: string;
|
|
53
|
+
/** Declaring feature set (push lane), echoed in push/render. */
|
|
54
|
+
featureSet?: string;
|
|
55
|
+
scope: CoalescingScope;
|
|
56
|
+
key: string;
|
|
57
|
+
eventId: string;
|
|
58
|
+
timestamp: string;
|
|
59
|
+
retract: boolean;
|
|
60
|
+
deferred: boolean;
|
|
61
|
+
initial: boolean;
|
|
62
|
+
data?: unknown;
|
|
63
|
+
tags?: string[];
|
|
64
|
+
/** Wire content (fallback for deferred; the notice for retract). */
|
|
65
|
+
content: McplContentBlock[];
|
|
66
|
+
/** Stable platform identity for channel subjects (§3.1). */
|
|
67
|
+
identity?: {
|
|
68
|
+
messageId?: string;
|
|
69
|
+
author?: {
|
|
70
|
+
id: string;
|
|
71
|
+
name: string;
|
|
72
|
+
};
|
|
73
|
+
threadId?: string;
|
|
74
|
+
};
|
|
75
|
+
/** The event the ordinary path would have queued — the host delivers it. */
|
|
76
|
+
event: E;
|
|
77
|
+
/** Set by the coalescer: deliver into this agent only (§3.2 audience may
|
|
78
|
+
* narrow, never widen — a replacement or notice follows the prior delivery). */
|
|
79
|
+
deliverTo?: string;
|
|
80
|
+
}
|
|
81
|
+
export interface DeferredNotice {
|
|
82
|
+
eventId: string;
|
|
83
|
+
timestamp: string;
|
|
84
|
+
data?: unknown;
|
|
85
|
+
}
|
|
86
|
+
export interface PushRenderParams {
|
|
87
|
+
featureSet: string;
|
|
88
|
+
channelId?: string;
|
|
89
|
+
key: string;
|
|
90
|
+
eventId: string;
|
|
91
|
+
notices: DeferredNotice[];
|
|
92
|
+
dropped: number;
|
|
93
|
+
}
|
|
94
|
+
export interface PushRenderResult {
|
|
95
|
+
content: McplContentBlock[];
|
|
96
|
+
timestamp?: string;
|
|
97
|
+
}
|
|
98
|
+
interface DeferredBatch<E> {
|
|
99
|
+
/** Latest notice; its content is the fallback, its tags/event drive delivery. */
|
|
100
|
+
latest: CoalescedOccurrence<E>;
|
|
101
|
+
notices: DeferredNotice[];
|
|
102
|
+
dropped: number;
|
|
103
|
+
/** Set on a batch restored from a snapshot whose render may have started. */
|
|
104
|
+
noRender?: boolean;
|
|
105
|
+
}
|
|
106
|
+
interface Rendering<E> {
|
|
107
|
+
batch: DeferredBatch<E>;
|
|
108
|
+
cancelled: boolean;
|
|
109
|
+
done: Promise<void>;
|
|
110
|
+
}
|
|
111
|
+
interface SubjectState<E> {
|
|
112
|
+
history: 'none' | 'some' | 'unknown';
|
|
113
|
+
occupant?: {
|
|
114
|
+
eventId: string;
|
|
115
|
+
placement: CoalescingPlacement;
|
|
116
|
+
};
|
|
117
|
+
batch?: DeferredBatch<E>;
|
|
118
|
+
rendering?: Rendering<E>;
|
|
119
|
+
consumedEventId?: string;
|
|
120
|
+
identity?: CoalescedOccurrence['identity'];
|
|
121
|
+
/** Agent that received the last delivery; replacements and notices follow it. */
|
|
122
|
+
audienceAgent?: string;
|
|
123
|
+
touchedAt: number;
|
|
124
|
+
}
|
|
125
|
+
export interface CoalescingSnapshot {
|
|
126
|
+
version: 1;
|
|
127
|
+
receipts: Array<[string, {
|
|
128
|
+
result: PushEventResult;
|
|
129
|
+
at: number;
|
|
130
|
+
}]>;
|
|
131
|
+
subjects: Array<{
|
|
132
|
+
subject: string;
|
|
133
|
+
history: SubjectState<unknown>['history'];
|
|
134
|
+
consumedEventId?: string;
|
|
135
|
+
identity?: CoalescedOccurrence['identity'];
|
|
136
|
+
occupant?: {
|
|
137
|
+
eventId: string;
|
|
138
|
+
placement: CoalescingPlacement;
|
|
139
|
+
};
|
|
140
|
+
audienceAgent?: string;
|
|
141
|
+
batch?: {
|
|
142
|
+
latest: CoalescedOccurrence<unknown>;
|
|
143
|
+
notices: DeferredNotice[];
|
|
144
|
+
dropped: number;
|
|
145
|
+
rendering?: boolean;
|
|
146
|
+
};
|
|
147
|
+
}>;
|
|
148
|
+
}
|
|
149
|
+
/** One receipt, written synchronously at acceptance (bridges the snapshot throttle). */
|
|
150
|
+
export interface CoalescingReceiptRecord {
|
|
151
|
+
key: string;
|
|
152
|
+
result: PushEventResult;
|
|
153
|
+
at: number;
|
|
154
|
+
subject: string;
|
|
155
|
+
/** History the subject was created with, for a subject first seen by this receipt. */
|
|
156
|
+
born?: SubjectState<unknown>['history'];
|
|
157
|
+
/** The subject's pending batch AFTER this acceptance: the accepted work
|
|
158
|
+
* itself (so a crash before the snapshot flush cannot lose it while keeping
|
|
159
|
+
* the receipt that suppresses its retry), or `null` when the acceptance
|
|
160
|
+
* left no batch — a retraction or plain replacement must be recoverable
|
|
161
|
+
* too. Records replay in order, so the last one per subject wins. */
|
|
162
|
+
batch: {
|
|
163
|
+
latest: CoalescedOccurrence<unknown>;
|
|
164
|
+
notices: DeferredNotice[];
|
|
165
|
+
dropped: number;
|
|
166
|
+
} | null;
|
|
167
|
+
}
|
|
168
|
+
export interface CoalescerHost<E> {
|
|
169
|
+
/** True iff the placement still exists and no model request has included it. */
|
|
170
|
+
isUnread(placement: CoalescingPlacement): boolean;
|
|
171
|
+
/** False when the unread occurrence could not be removed (it may still be read). */
|
|
172
|
+
remove(placement: CoalescingPlacement): boolean;
|
|
173
|
+
/** Ordinary delivery of the event; undefined when routing delivered nowhere.
|
|
174
|
+
* A replacement is delivered as a fresh message after the unread prior was
|
|
175
|
+
* removed: it lands where a fresh event lands (§4.1 allows either place). */
|
|
176
|
+
deliver(occurrence: CoalescedOccurrence<E>, materialized?: McplContentBlock[], assemblingFor?: string): Promise<CoalescingPlacement | undefined>;
|
|
177
|
+
/** Queue a wake for a batch that has no model-visible content yet. */
|
|
178
|
+
wakeForBatch(occurrence: CoalescedOccurrence<E>): Promise<void>;
|
|
179
|
+
/** Withdraw unstarted wakes whose sole cause is this subject. */
|
|
180
|
+
cancelWake(subject: string): void;
|
|
181
|
+
/** The batch's audience still holds the authority it was admitted under. */
|
|
182
|
+
authorized(occurrence: CoalescedOccurrence<E>): boolean;
|
|
183
|
+
/** Agents that read this occurrence's delivery target (may spawn a fork). */
|
|
184
|
+
audience(occurrence: CoalescedOccurrence<E>): Promise<string[]>;
|
|
185
|
+
render(occurrence: CoalescedOccurrence<E>, params: PushRenderParams): Promise<PushRenderResult>;
|
|
186
|
+
audit(record: Record<string, unknown>): void;
|
|
187
|
+
/** Persist (throttled by the host); the thunk builds the snapshot lazily. */
|
|
188
|
+
save(snapshot: () => CoalescingSnapshot): void;
|
|
189
|
+
/** Persist the snapshot NOW (a render is about to start: that boundary must
|
|
190
|
+
* be recoverable before the RPC is issued, §3.2). Throws on failure. */
|
|
191
|
+
saveNow?(snapshot: CoalescingSnapshot): void;
|
|
192
|
+
/** Persist one receipt now, before the acceptance is acknowledged. Throws
|
|
193
|
+
* on failure, which fails the acceptance (the producer retries). */
|
|
194
|
+
recordReceipt?(record: CoalescingReceiptRecord): void;
|
|
195
|
+
/** Make every write so far DURABLE (fsync, group-committed by the host).
|
|
196
|
+
* Awaited before an acceptance is acknowledged and before push/render is
|
|
197
|
+
* issued: a kill after either boundary must find the receipt, the
|
|
198
|
+
* accepted work, and the render-start on disk. Rejects on failure. */
|
|
199
|
+
commit?(): Promise<void>;
|
|
200
|
+
/** Recovery: is this occurrence's content in a context (its durable
|
|
201
|
+
* delivery identity — subject + eventId in message metadata — is found
|
|
202
|
+
* there)? A published occurrence is read from recovery on (the watermark
|
|
203
|
+
* restarts at the head), whatever a stale record says about its history. */
|
|
204
|
+
wasPublished?(subject: string, eventId: string): boolean;
|
|
205
|
+
now?(): number;
|
|
206
|
+
}
|
|
207
|
+
export interface CoalescerOptions {
|
|
208
|
+
retryWindowMs?: number;
|
|
209
|
+
/** Base delay before re-waking a batch whose render-start commit failed
|
|
210
|
+
* (doubles per attempt, capped at 60× base). Default 1 s. */
|
|
211
|
+
recoveryBackoffMs?: number;
|
|
212
|
+
maxSubjects?: number;
|
|
213
|
+
maxNotices?: number;
|
|
214
|
+
maxContentBytes?: number;
|
|
215
|
+
maxDataBytes?: number;
|
|
216
|
+
}
|
|
217
|
+
export declare function coalescingSubjectKey(serverId: string, binding: string, scope: CoalescingScope, key: string): string;
|
|
218
|
+
export declare function coalescingReceiptKey(serverId: string, binding: string, eventId: string): string;
|
|
219
|
+
/** Validate wire content before it is stored, rendered or converted. */
|
|
220
|
+
export declare function validateCoalescedContent(content: unknown, maxBytes?: number): asserts content is McplContentBlock[];
|
|
221
|
+
/** Validate the `coalesce` member of either lane (§13). */
|
|
222
|
+
export declare function validateCoalesceMember(c: unknown, lane: 'push' | 'channel', maxDataBytes?: number): asserts c is NonNullable<import('./types.js').PushEventParams['coalesce']>;
|
|
223
|
+
export declare class PushCoalescer<E = unknown> {
|
|
224
|
+
private readonly host;
|
|
225
|
+
private readonly options;
|
|
226
|
+
private readonly subjects;
|
|
227
|
+
/** `committed`: the durability barrier succeeded after this receipt was
|
|
228
|
+
* written. An uncommitted receipt deduplicates effects but is not an
|
|
229
|
+
* acknowledgement until a commit succeeds. */
|
|
230
|
+
private readonly receipts;
|
|
231
|
+
private readonly retryWindowMs;
|
|
232
|
+
private readonly maxSubjects;
|
|
233
|
+
private readonly maxNotices;
|
|
234
|
+
/** Outstanding push/render RPCs per server, including cancelled ones (§10.7). */
|
|
235
|
+
private readonly rendersInFlight;
|
|
236
|
+
/**
|
|
237
|
+
* The ONE critical section. Every state transition — an admission, the
|
|
238
|
+
* freezing of a batch for rendering, the settlement of a render's result —
|
|
239
|
+
* runs under it, awaits included (fork spawn, durability commit, delivery).
|
|
240
|
+
* Only the push/render RPC itself runs outside, so it stays cancellable.
|
|
241
|
+
* An admission therefore never observes a half-done assembly transition,
|
|
242
|
+
* and an assembly never acts on a batch an admission moved on from.
|
|
243
|
+
*/
|
|
244
|
+
private serial;
|
|
245
|
+
/** Liveness after a failed freeze: a bounded, backed-off re-wake per
|
|
246
|
+
* subject. `attempt` outlives the armed timer: it counts consecutive
|
|
247
|
+
* failures and resets only on success or disposal of the pending work. */
|
|
248
|
+
private readonly recovery;
|
|
249
|
+
private suspended;
|
|
250
|
+
constructor(host: CoalescerHost<E>, options?: CoalescerOptions);
|
|
251
|
+
private now;
|
|
252
|
+
private locked;
|
|
253
|
+
/** The unread occupant's or batch's placement/identity, for routing continuity. */
|
|
254
|
+
identity(subject: string): CoalescedOccurrence['identity'] | undefined;
|
|
255
|
+
pendingBatches(): number;
|
|
256
|
+
/** §10.7: a server handling push/render must not issue inference/request —
|
|
257
|
+
* including a render whose batch was cancelled while the RPC is outstanding. */
|
|
258
|
+
isRendering(serverId: string): boolean;
|
|
259
|
+
receipt(serverId: string, binding: string, eventId: string): PushEventResult | undefined;
|
|
260
|
+
private receiptEntry;
|
|
261
|
+
/** Acknowledge a receipt: durable first. A receipt whose commit failed is
|
|
262
|
+
* committed now (no effects are repeated); if that fails again, so does
|
|
263
|
+
* the acknowledgement, and the producer retries once more. */
|
|
264
|
+
private acknowledge;
|
|
265
|
+
/**
|
|
266
|
+
* Admit an occurrence that has already passed the lane's ordinary checks and
|
|
267
|
+
* the coalesce-member validation. Returns the wire result, performing the
|
|
268
|
+
* host effects (replace / remove / deliver) synchronously so a create, edit
|
|
269
|
+
* and delete cannot overtake one another.
|
|
270
|
+
*/
|
|
271
|
+
accept(occurrence: CoalescedOccurrence<E>): Promise<PushEventResult>;
|
|
272
|
+
private admit;
|
|
273
|
+
private subjectFor;
|
|
274
|
+
/** Re-check the occupant against the host: consumed occupants become history. */
|
|
275
|
+
private refreshOccupant;
|
|
276
|
+
private scheduleRecovery;
|
|
277
|
+
/** Disarm the timer only (a producer retry wakes now; the count stands). */
|
|
278
|
+
private disarmRecovery;
|
|
279
|
+
/** Success or disposal of the pending work: forget the failure series. */
|
|
280
|
+
private clearRecovery;
|
|
281
|
+
private dropBatches;
|
|
282
|
+
private retract;
|
|
283
|
+
private acceptPlain;
|
|
284
|
+
private acceptDeferred;
|
|
285
|
+
/**
|
|
286
|
+
* Render and materialize every pending batch whose audience includes
|
|
287
|
+
* `agentName`. Called by the host at a turn's assembly boundary, before the
|
|
288
|
+
* compile. Bounded by the host's render timeout; a failed or late render
|
|
289
|
+
* materializes the admitted fallback (§5.3).
|
|
290
|
+
*/
|
|
291
|
+
assemble(agentName: string): Promise<void>;
|
|
292
|
+
/**
|
|
293
|
+
* Under the lock: decide whether `subject`'s batch renders for `agentName`,
|
|
294
|
+
* freeze it, make the render-start durable, re-check authority, and start
|
|
295
|
+
* the RPC. Returns the render's completion (shared by every assembly that
|
|
296
|
+
* waits on this batch, vector 25) or undefined when nothing was started.
|
|
297
|
+
*/
|
|
298
|
+
private freeze;
|
|
299
|
+
private render;
|
|
300
|
+
restore(snapshot: CoalescingSnapshot | null | undefined): void;
|
|
301
|
+
/**
|
|
302
|
+
* A batch restored as RENDERING may already have been published (its
|
|
303
|
+
* result or fallback is a durable context message; only the completion
|
|
304
|
+
* snapshot was lost). Recovery then marks it consumed instead of
|
|
305
|
+
* delivering the fallback a second time.
|
|
306
|
+
*/
|
|
307
|
+
private settlePublished;
|
|
308
|
+
/** Apply receipts written since the last snapshot (crash-window bridge). */
|
|
309
|
+
restoreReceipts(records: CoalescingReceiptRecord[]): void;
|
|
310
|
+
snapshot(): CoalescingSnapshot;
|
|
311
|
+
/** Batches whose wake should be re-queued after a restart (their fallback is pending). */
|
|
312
|
+
pendingBatchOccurrences(): CoalescedOccurrence<E>[];
|
|
313
|
+
suspend(): void;
|
|
314
|
+
private persist;
|
|
315
|
+
private prune;
|
|
316
|
+
}
|
|
317
|
+
export {};
|
|
318
|
+
//# sourceMappingURL=push-coalescer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"push-coalescer.d.ts","sourceRoot":"","sources":["../../../src/mcpl/push-coalescer.ts"],"names":[],"mappings":"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"}
|