@acquiredintelligence/attend 0.0.0-stage → 0.1.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/LICENSE +21 -0
- package/README.md +580 -2
- package/dist/attend.d.ts +30 -0
- package/dist/attend.d.ts.map +1 -0
- package/dist/attend.js +428 -0
- package/dist/attend.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +4 -0
- package/dist/cli.js.map +1 -0
- package/dist/core/ids.d.ts +12 -0
- package/dist/core/ids.d.ts.map +1 -0
- package/dist/core/ids.js +97 -0
- package/dist/core/ids.js.map +1 -0
- package/dist/core/reducer.d.ts +26 -0
- package/dist/core/reducer.d.ts.map +1 -0
- package/dist/core/reducer.js +437 -0
- package/dist/core/reducer.js.map +1 -0
- package/dist/core/seen.d.ts +22 -0
- package/dist/core/seen.d.ts.map +1 -0
- package/dist/core/seen.js +61 -0
- package/dist/core/seen.js.map +1 -0
- package/dist/core/state.d.ts +12 -0
- package/dist/core/state.d.ts.map +1 -0
- package/dist/core/state.js +90 -0
- package/dist/core/state.js.map +1 -0
- package/dist/core/step.d.ts +14 -0
- package/dist/core/step.d.ts.map +1 -0
- package/dist/core/step.js +17 -0
- package/dist/core/step.js.map +1 -0
- package/dist/core/threshold.d.ts +40 -0
- package/dist/core/threshold.d.ts.map +1 -0
- package/dist/core/threshold.js +72 -0
- package/dist/core/threshold.js.map +1 -0
- package/dist/core/types.d.ts +704 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +24 -0
- package/dist/core/types.js.map +1 -0
- package/dist/core/window.d.ts +38 -0
- package/dist/core/window.d.ts.map +1 -0
- package/dist/core/window.js +322 -0
- package/dist/core/window.js.map +1 -0
- package/dist/decisions.d.ts +53 -0
- package/dist/decisions.d.ts.map +1 -0
- package/dist/decisions.js +115 -0
- package/dist/decisions.js.map +1 -0
- package/dist/errors.d.ts +36 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +53 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/internal/adapter.d.ts +21 -0
- package/dist/internal/adapter.d.ts.map +1 -0
- package/dist/internal/adapter.js +62 -0
- package/dist/internal/adapter.js.map +1 -0
- package/dist/internal/assert.d.ts +5 -0
- package/dist/internal/assert.d.ts.map +1 -0
- package/dist/internal/assert.js +14 -0
- package/dist/internal/assert.js.map +1 -0
- package/dist/internal/clock.d.ts +8 -0
- package/dist/internal/clock.d.ts.map +1 -0
- package/dist/internal/clock.js +38 -0
- package/dist/internal/clock.js.map +1 -0
- package/dist/internal/http.d.ts +42 -0
- package/dist/internal/http.d.ts.map +1 -0
- package/dist/internal/http.js +122 -0
- package/dist/internal/http.js.map +1 -0
- package/dist/internal/images.d.ts +18 -0
- package/dist/internal/images.d.ts.map +1 -0
- package/dist/internal/images.js +75 -0
- package/dist/internal/images.js.map +1 -0
- package/dist/internal/json.d.ts +3 -0
- package/dist/internal/json.d.ts.map +1 -0
- package/dist/internal/json.js +5 -0
- package/dist/internal/json.js.map +1 -0
- package/dist/internal/prompt.d.ts +31 -0
- package/dist/internal/prompt.d.ts.map +1 -0
- package/dist/internal/prompt.js +149 -0
- package/dist/internal/prompt.js.map +1 -0
- package/dist/internal/shared.d.ts +12 -0
- package/dist/internal/shared.d.ts.map +1 -0
- package/dist/internal/shared.js +134 -0
- package/dist/internal/shared.js.map +1 -0
- package/dist/jev.d.ts +74 -0
- package/dist/jev.d.ts.map +1 -0
- package/dist/jev.js +156 -0
- package/dist/jev.js.map +1 -0
- package/dist/llm.d.ts +164 -0
- package/dist/llm.d.ts.map +1 -0
- package/dist/llm.js +79 -0
- package/dist/llm.js.map +1 -0
- package/dist/mcp.d.ts +130 -0
- package/dist/mcp.d.ts.map +1 -0
- package/dist/mcp.js +550 -0
- package/dist/mcp.js.map +1 -0
- package/dist/memory.d.ts +10 -0
- package/dist/memory.d.ts.map +1 -0
- package/dist/memory.js +50 -0
- package/dist/memory.js.map +1 -0
- package/dist/postgres.d.ts +25 -0
- package/dist/postgres.d.ts.map +1 -0
- package/dist/postgres.js +56 -0
- package/dist/postgres.js.map +1 -0
- package/dist/redis.d.ts +20 -0
- package/dist/redis.d.ts.map +1 -0
- package/dist/redis.js +83 -0
- package/dist/redis.js.map +1 -0
- package/dist/server/compat.d.ts +13 -0
- package/dist/server/compat.d.ts.map +1 -0
- package/dist/server/compat.js +5 -0
- package/dist/server/compat.js.map +1 -0
- package/dist/server/cursor.d.ts +15 -0
- package/dist/server/cursor.d.ts.map +1 -0
- package/dist/server/cursor.js +50 -0
- package/dist/server/cursor.js.map +1 -0
- package/dist/server/events.d.ts +42 -0
- package/dist/server/events.d.ts.map +1 -0
- package/dist/server/events.js +189 -0
- package/dist/server/events.js.map +1 -0
- package/dist/server/fanout.d.ts +28 -0
- package/dist/server/fanout.d.ts.map +1 -0
- package/dist/server/fanout.js +184 -0
- package/dist/server/fanout.js.map +1 -0
- package/dist/server/guard.d.ts +19 -0
- package/dist/server/guard.d.ts.map +1 -0
- package/dist/server/guard.js +27 -0
- package/dist/server/guard.js.map +1 -0
- package/dist/server/http.d.ts +4 -0
- package/dist/server/http.d.ts.map +1 -0
- package/dist/server/http.js +323 -0
- package/dist/server/http.js.map +1 -0
- package/dist/server/ingest.d.ts +4 -0
- package/dist/server/ingest.d.ts.map +1 -0
- package/dist/server/ingest.js +400 -0
- package/dist/server/ingest.js.map +1 -0
- package/dist/server/install.d.ts +5 -0
- package/dist/server/install.d.ts.map +1 -0
- package/dist/server/install.js +91 -0
- package/dist/server/install.js.map +1 -0
- package/dist/server/poll.d.ts +4 -0
- package/dist/server/poll.d.ts.map +1 -0
- package/dist/server/poll.js +45 -0
- package/dist/server/poll.js.map +1 -0
- package/dist/server/serve.d.ts +19 -0
- package/dist/server/serve.d.ts.map +1 -0
- package/dist/server/serve.js +238 -0
- package/dist/server/serve.js.map +1 -0
- package/dist/server/sessions.d.ts +14 -0
- package/dist/server/sessions.d.ts.map +1 -0
- package/dist/server/sessions.js +54 -0
- package/dist/server/sessions.js.map +1 -0
- package/dist/server/stream.d.ts +11 -0
- package/dist/server/stream.d.ts.map +1 -0
- package/dist/server/stream.js +216 -0
- package/dist/server/stream.js.map +1 -0
- package/dist/server/tools.d.ts +22 -0
- package/dist/server/tools.d.ts.map +1 -0
- package/dist/server/tools.js +55 -0
- package/dist/server/tools.js.map +1 -0
- package/dist/server/types.d.ts +351 -0
- package/dist/server/types.d.ts.map +1 -0
- package/dist/server/types.js +5 -0
- package/dist/server/types.js.map +1 -0
- package/dist/server.d.ts +11 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +10 -0
- package/dist/server.js.map +1 -0
- package/dist/shell/budget.d.ts +4 -0
- package/dist/shell/budget.d.ts.map +1 -0
- package/dist/shell/budget.js +5 -0
- package/dist/shell/budget.js.map +1 -0
- package/dist/shell/copy.d.ts +17 -0
- package/dist/shell/copy.d.ts.map +1 -0
- package/dist/shell/copy.js +67 -0
- package/dist/shell/copy.js.map +1 -0
- package/dist/shell/decisions.d.ts +6 -0
- package/dist/shell/decisions.d.ts.map +1 -0
- package/dist/shell/decisions.js +42 -0
- package/dist/shell/decisions.js.map +1 -0
- package/dist/shell/read.d.ts +7 -0
- package/dist/shell/read.d.ts.map +1 -0
- package/dist/shell/read.js +21 -0
- package/dist/shell/read.js.map +1 -0
- package/dist/shell/scheduler.d.ts +4 -0
- package/dist/shell/scheduler.d.ts.map +1 -0
- package/dist/shell/scheduler.js +90 -0
- package/dist/shell/scheduler.js.map +1 -0
- package/dist/shell/scope.d.ts +27 -0
- package/dist/shell/scope.d.ts.map +1 -0
- package/dist/shell/scope.js +343 -0
- package/dist/shell/scope.js.map +1 -0
- package/dist/shell/types.d.ts +156 -0
- package/dist/shell/types.d.ts.map +1 -0
- package/dist/shell/types.js +2 -0
- package/dist/shell/types.js.map +1 -0
- package/dist/sqlite.d.ts +14 -0
- package/dist/sqlite.d.ts.map +1 -0
- package/dist/sqlite.js +39 -0
- package/dist/sqlite.js.map +1 -0
- package/dist/step.d.ts +18 -0
- package/dist/step.d.ts.map +1 -0
- package/dist/step.js +14 -0
- package/dist/step.js.map +1 -0
- package/dist/store/memory.d.ts +12 -0
- package/dist/store/memory.d.ts.map +1 -0
- package/dist/store/memory.js +264 -0
- package/dist/store/memory.js.map +1 -0
- package/dist/store/postgres.d.ts +24 -0
- package/dist/store/postgres.d.ts.map +1 -0
- package/dist/store/postgres.js +364 -0
- package/dist/store/postgres.js.map +1 -0
- package/dist/store/redis.d.ts +12 -0
- package/dist/store/redis.d.ts.map +1 -0
- package/dist/store/redis.js +540 -0
- package/dist/store/redis.js.map +1 -0
- package/dist/store/sqlite-worker.d.ts +91 -0
- package/dist/store/sqlite-worker.d.ts.map +1 -0
- package/dist/store/sqlite-worker.js +322 -0
- package/dist/store/sqlite-worker.js.map +1 -0
- package/dist/store/sqlite.d.ts +34 -0
- package/dist/store/sqlite.d.ts.map +1 -0
- package/dist/store/sqlite.js +238 -0
- package/dist/store/sqlite.js.map +1 -0
- package/dist/store/types.d.ts +137 -0
- package/dist/store/types.d.ts.map +1 -0
- package/dist/store/types.js +2 -0
- package/dist/store/types.js.map +1 -0
- package/dist/testing/conformance.d.ts +13 -0
- package/dist/testing/conformance.d.ts.map +1 -0
- package/dist/testing/conformance.js +542 -0
- package/dist/testing/conformance.js.map +1 -0
- package/dist/testing/wire.d.ts +16 -0
- package/dist/testing/wire.d.ts.map +1 -0
- package/dist/testing/wire.js +304 -0
- package/dist/testing/wire.js.map +1 -0
- package/dist/testing.d.ts +113 -0
- package/dist/testing.d.ts.map +1 -0
- package/dist/testing.js +655 -0
- package/dist/testing.js.map +1 -0
- package/dist/types.d.ts +5 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/package.json +130 -4
- package/skills/attend/SKILL.md +231 -0
- package/skills/attend/references/judges.md +283 -0
- package/skills/attend/references/kinds.md +62 -0
- package/skills/attend/references/mcp.md +132 -0
- package/skills/attend/references/sinks.md +73 -0
- package/skills/attend/references/stores.md +90 -0
- package/skills/attend/references/testing.md +120 -0
package/dist/mcp.js
ADDED
|
@@ -0,0 +1,550 @@
|
|
|
1
|
+
import { ErrorCode } from '@modelcontextprotocol/sdk/types.js';
|
|
2
|
+
import { z } from 'zod/v4';
|
|
3
|
+
import { PermanentError } from './errors.js';
|
|
4
|
+
import { sleep, systemClock } from './internal/clock.js';
|
|
5
|
+
import { stableJson } from './internal/json.js';
|
|
6
|
+
import { assertNever, messageOf } from './internal/shared.js';
|
|
7
|
+
/** What a request error means to the subscription. Codes not listed are permanent. */
|
|
8
|
+
const ERROR_POLICY = {
|
|
9
|
+
[-32023]: 'permanent',
|
|
10
|
+
[-32024]: 'permanent',
|
|
11
|
+
[-32025]: 'retry',
|
|
12
|
+
[-32026]: 'fallback',
|
|
13
|
+
[-32027]: 'permanent',
|
|
14
|
+
[ErrorCode.RequestTimeout]: 'retry',
|
|
15
|
+
[ErrorCode.ConnectionClosed]: 'closed',
|
|
16
|
+
};
|
|
17
|
+
/** The longest delay `setTimeout` honours; past it the SDK's timeout fires at once. */
|
|
18
|
+
const STREAM_TIMEOUT_MS = 2 ** 31 - 1;
|
|
19
|
+
/**
|
|
20
|
+
* Pause before reopening a stream the server ended or the source found idle, so a server that
|
|
21
|
+
* ends every stream at once never spins. An overflow that moved the committed cursor reopens at
|
|
22
|
+
* once: the source closed that stream itself, and the backlog behind it is real. One that did
|
|
23
|
+
* not pauses too, or a server that sends no cursors would flood the reopened stream with the
|
|
24
|
+
* same backlog at once.
|
|
25
|
+
*/
|
|
26
|
+
const REOPEN_MS = 1000;
|
|
27
|
+
/** Events already waiting in the inbox fold into one `emit`, so a slow store costs one write per batch rather than per event. */
|
|
28
|
+
const EMIT_BATCH = 500;
|
|
29
|
+
/** Closed subscription ids remembered, so a straggling notification from a stream this Client just closed is dropped rather than reported. */
|
|
30
|
+
const CLOSED_REMEMBERED = 256;
|
|
31
|
+
const SUBSCRIPTION_KEY = 'io.modelcontextprotocol/subscriptionId';
|
|
32
|
+
const STREAM_METHODS = ['active', 'event', 'heartbeat', 'error', 'terminated'];
|
|
33
|
+
// ─── wire schemas ────────────────────────────────────────────────────────────
|
|
34
|
+
const Occurrence = z.object({
|
|
35
|
+
eventId: z.string().min(1),
|
|
36
|
+
name: z.string().min(1),
|
|
37
|
+
timestamp: z.string().refine((s) => Number.isFinite(Date.parse(s)), 'not a parseable timestamp'),
|
|
38
|
+
data: z.record(z.string(), z.json()),
|
|
39
|
+
cursor: z.string().nullable().optional(),
|
|
40
|
+
});
|
|
41
|
+
const Active = z.object({ cursor: z.string().nullable().optional(), truncated: z.boolean().optional() });
|
|
42
|
+
const Heartbeat = z.object({ cursor: z.string().nullable().optional() });
|
|
43
|
+
const StreamError = z.object({ error: z.object({ code: z.number(), message: z.string(), data: z.unknown().optional() }) });
|
|
44
|
+
const StreamResult = z.looseObject({});
|
|
45
|
+
const PollResult = z.object({
|
|
46
|
+
events: z.array(z.unknown()),
|
|
47
|
+
cursor: z.string().nullable(),
|
|
48
|
+
truncated: z.boolean().optional(),
|
|
49
|
+
hasMore: z.boolean().optional(),
|
|
50
|
+
nextPollMs: z.number().optional(),
|
|
51
|
+
});
|
|
52
|
+
const ListResult = z.object({
|
|
53
|
+
events: z.array(z.looseObject({ name: z.string(), delivery: z.array(z.string()).optional() })),
|
|
54
|
+
nextCursor: z.string().optional(),
|
|
55
|
+
});
|
|
56
|
+
const Routed = z.looseObject({ _meta: z.looseObject({ [SUBSCRIPTION_KEY]: z.union([z.string(), z.number()]).optional() }).optional() });
|
|
57
|
+
const envelope = (method) => z.object({ method: z.literal(method), params: Routed.optional() });
|
|
58
|
+
const demuxes = new WeakMap();
|
|
59
|
+
const wrappedTransports = new WeakSet();
|
|
60
|
+
const closings = new WeakMap();
|
|
61
|
+
/**
|
|
62
|
+
* Aborts when the connection `transport` carries right now closes. The SDK sets
|
|
63
|
+
* `transport.onclose` at connect and clears `client.transport` inside it, so a wrapper
|
|
64
|
+
* installed after connect fires once the Client already reads as closed. A signal that has
|
|
65
|
+
* fired belongs to a connection that is gone; a live transport that still maps to one has been
|
|
66
|
+
* reconnected since, and gets a fresh signal around the new connection's `onclose`.
|
|
67
|
+
*/
|
|
68
|
+
function closingOf(transport) {
|
|
69
|
+
let signal = closings.get(transport);
|
|
70
|
+
if (!signal || signal.aborted) {
|
|
71
|
+
const controller = new AbortController();
|
|
72
|
+
const onclose = transport.onclose;
|
|
73
|
+
transport.onclose = () => {
|
|
74
|
+
onclose?.();
|
|
75
|
+
controller.abort();
|
|
76
|
+
};
|
|
77
|
+
signal = controller.signal;
|
|
78
|
+
closings.set(transport, signal);
|
|
79
|
+
}
|
|
80
|
+
return signal;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* The SDK never returns a request's JSON-RPC id, so the demux wraps `transport.send` and
|
|
84
|
+
* reads the id off each outgoing `events/stream` as it leaves. `request()` sends inside its
|
|
85
|
+
* Promise executor with the caller's `params` object by reference, so identity pairs the
|
|
86
|
+
* outgoing message with its subscription even when several streams open at once.
|
|
87
|
+
*/
|
|
88
|
+
function demuxFor(client) {
|
|
89
|
+
let demux = demuxes.get(client);
|
|
90
|
+
if (!demux) {
|
|
91
|
+
demux = { live: new Map(), pending: new WeakMap(), closed: new Set() };
|
|
92
|
+
demuxes.set(client, demux);
|
|
93
|
+
for (const kind of STREAM_METHODS) {
|
|
94
|
+
const d = demux;
|
|
95
|
+
const method = `notifications/events/${kind}`;
|
|
96
|
+
client.setNotificationHandler(envelope(method), (notification) => {
|
|
97
|
+
const raw = notification.params?._meta?.[SUBSCRIPTION_KEY];
|
|
98
|
+
const id = raw === undefined ? null : String(raw);
|
|
99
|
+
const subscription = id === null ? undefined : d.live.get(id);
|
|
100
|
+
if (subscription)
|
|
101
|
+
subscription.push({ kind, params: notification.params });
|
|
102
|
+
else if (id === null || !d.closed.has(id))
|
|
103
|
+
for (const live of d.live.values())
|
|
104
|
+
live.report({ kind: 'unrouted', method, subscriptionId: id });
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
const transport = client.transport;
|
|
109
|
+
if (transport && !wrappedTransports.has(transport)) {
|
|
110
|
+
wrappedTransports.add(transport);
|
|
111
|
+
const d = demux;
|
|
112
|
+
const send = transport.send.bind(transport);
|
|
113
|
+
transport.send = (message, options) => {
|
|
114
|
+
if (isStreamRequest(message)) {
|
|
115
|
+
const subscription = d.pending.get(message.params);
|
|
116
|
+
if (subscription) {
|
|
117
|
+
d.pending.delete(message.params);
|
|
118
|
+
subscription.id = String(message.id);
|
|
119
|
+
d.live.set(subscription.id, subscription);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
return send(message, options);
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
return demux;
|
|
126
|
+
}
|
|
127
|
+
function isStreamRequest(message) {
|
|
128
|
+
return 'id' in message && 'method' in message && message.method === 'events/stream' && typeof message.params === 'object' && message.params !== null;
|
|
129
|
+
}
|
|
130
|
+
function forget(demux, id) {
|
|
131
|
+
demux.live.delete(id);
|
|
132
|
+
demux.closed.add(id);
|
|
133
|
+
if (demux.closed.size <= CLOSED_REMEMBERED)
|
|
134
|
+
return;
|
|
135
|
+
const oldest = demux.closed.values().next().value;
|
|
136
|
+
if (oldest !== undefined)
|
|
137
|
+
demux.closed.delete(oldest);
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* The queue between the SDK's notification handlers and the stream loop, which takes the next
|
|
141
|
+
* run of items only once `emit` resolves. A notification past `max` closes the intake: it and
|
|
142
|
+
* every later one are dropped, `onOverflow` runs, and `overflow` queues behind what is held, so
|
|
143
|
+
* the loop persists all of it before it sees the marker. The request's outcome always queues.
|
|
144
|
+
*/
|
|
145
|
+
function inbox(max, onOverflow) {
|
|
146
|
+
const items = [];
|
|
147
|
+
let overflowed = false;
|
|
148
|
+
let wake = null;
|
|
149
|
+
const enqueue = (item) => {
|
|
150
|
+
items.push(item);
|
|
151
|
+
wake?.();
|
|
152
|
+
wake = null;
|
|
153
|
+
};
|
|
154
|
+
return {
|
|
155
|
+
push(note) {
|
|
156
|
+
if (overflowed)
|
|
157
|
+
return;
|
|
158
|
+
if (items.length < max) {
|
|
159
|
+
enqueue(note);
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
overflowed = true;
|
|
163
|
+
enqueue({ kind: 'overflow', buffered: items.length });
|
|
164
|
+
onOverflow();
|
|
165
|
+
},
|
|
166
|
+
close: enqueue,
|
|
167
|
+
async take(limit) {
|
|
168
|
+
while (items.length === 0)
|
|
169
|
+
await new Promise((resolve) => (wake = resolve));
|
|
170
|
+
return items.splice(0, limit);
|
|
171
|
+
},
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* One subscription (name + arguments) as a `Source`, keyed `mcp:<name>:<arguments as sorted
|
|
176
|
+
* JSON>`. It holds no cursor of its own: every emit carries the server's cursor, the record
|
|
177
|
+
* persists it, and every open resumes from the committed one. `eventId` becomes `Event.id`, so
|
|
178
|
+
* the record's seen ring dedups redelivery. `truncated` becomes the batch's `truncated`, which
|
|
179
|
+
* marks the window as a gap.
|
|
180
|
+
*
|
|
181
|
+
* The subscription runs until `signal` aborts. A terminated or idle stream reopens from the last
|
|
182
|
+
* committed cursor after a short pause; an overflowed one at once, when it moved that cursor. A request error that the server says to
|
|
183
|
+
* retry (-32025, a request timeout) is thrown as a plain Error, so `attach` backs off through the
|
|
184
|
+
* app's `retryBackoffMs` and resubscribes; any other error, and a closed Client, is thrown as a
|
|
185
|
+
* `PermanentError` with the SDK error as its `cause`, and `attach` rejects.
|
|
186
|
+
*/
|
|
187
|
+
export function mcpEventsSource(client, options) {
|
|
188
|
+
const mode = options.mode ?? 'auto';
|
|
189
|
+
const pollMs = options.pollMs ?? 10_000;
|
|
190
|
+
const maxBuffered = options.maxBuffered ?? 1000;
|
|
191
|
+
if (!Number.isInteger(maxBuffered) || maxBuffered < 1)
|
|
192
|
+
throw new RangeError(`attend/mcp: maxBuffered must be a positive integer, got ${maxBuffered}`);
|
|
193
|
+
const idleTimeoutMs = options.idleTimeoutMs ?? 300_000;
|
|
194
|
+
const clock = options.clock ?? systemClock();
|
|
195
|
+
const report = options.onError ?? (() => undefined);
|
|
196
|
+
const base = { name: options.name };
|
|
197
|
+
if (options.arguments !== undefined)
|
|
198
|
+
base.arguments = options.arguments;
|
|
199
|
+
if (options.maxAgeMs !== undefined)
|
|
200
|
+
base.maxAgeMs = options.maxAgeMs;
|
|
201
|
+
return {
|
|
202
|
+
key: `mcp:${options.name}:${stableJson(options.arguments ?? {})}`,
|
|
203
|
+
async subscribe(cursor, emit, signal) {
|
|
204
|
+
const position = { cursor };
|
|
205
|
+
const deliver = async (batch) => {
|
|
206
|
+
const moved = typeof batch.cursor === 'string' && batch.cursor !== position.cursor;
|
|
207
|
+
if (batch.events.length === 0 && !batch.truncated && !moved)
|
|
208
|
+
return;
|
|
209
|
+
await emit(batch);
|
|
210
|
+
if (typeof batch.cursor === 'string')
|
|
211
|
+
position.cursor = batch.cursor;
|
|
212
|
+
};
|
|
213
|
+
let delivery = mode === 'auto' ? await listedDelivery(signal) : mode;
|
|
214
|
+
while (delivery !== null && !signal.aborted) {
|
|
215
|
+
const outcome = delivery === 'stream' ? await runStream(position, deliver, signal) : await runPoll(position, deliver, signal);
|
|
216
|
+
if (signal.aborted)
|
|
217
|
+
return;
|
|
218
|
+
if (outcome.kind === 'overflowed')
|
|
219
|
+
continue;
|
|
220
|
+
if (outcome.kind === 'ended') {
|
|
221
|
+
await pause(REOPEN_MS, signal);
|
|
222
|
+
continue;
|
|
223
|
+
}
|
|
224
|
+
if (policyOf(outcome.error) === 'fallback' && mode === 'auto' && delivery === 'stream') {
|
|
225
|
+
delivery = 'poll';
|
|
226
|
+
continue;
|
|
227
|
+
}
|
|
228
|
+
throw classify(outcome.error);
|
|
229
|
+
}
|
|
230
|
+
},
|
|
231
|
+
};
|
|
232
|
+
/** `events/list`, paged, until the event is found. Unlisted events poll; null means aborted. */
|
|
233
|
+
async function listedDelivery(signal) {
|
|
234
|
+
let cursor;
|
|
235
|
+
do {
|
|
236
|
+
if (!client.transport)
|
|
237
|
+
throw closedClient(undefined);
|
|
238
|
+
let page;
|
|
239
|
+
try {
|
|
240
|
+
page = await client.request({ method: 'events/list', params: cursor === undefined ? {} : { cursor } }, ListResult, { signal });
|
|
241
|
+
}
|
|
242
|
+
catch (error) {
|
|
243
|
+
if (signal.aborted)
|
|
244
|
+
return null;
|
|
245
|
+
throw classify(error);
|
|
246
|
+
}
|
|
247
|
+
const listed = page.events.find((e) => e.name === options.name);
|
|
248
|
+
if (listed)
|
|
249
|
+
return listed.delivery?.includes('push') ? 'stream' : 'poll';
|
|
250
|
+
cursor = page.nextCursor;
|
|
251
|
+
} while (cursor !== undefined);
|
|
252
|
+
return 'poll';
|
|
253
|
+
}
|
|
254
|
+
async function runPoll(position, deliver, signal) {
|
|
255
|
+
while (!signal.aborted) {
|
|
256
|
+
const params = { ...base, cursor: position.cursor };
|
|
257
|
+
if (options.maxEvents !== undefined)
|
|
258
|
+
params.maxEvents = options.maxEvents;
|
|
259
|
+
if (!client.transport)
|
|
260
|
+
throw closedClient(undefined);
|
|
261
|
+
let result;
|
|
262
|
+
try {
|
|
263
|
+
result = await client.request({ method: 'events/poll', params }, PollResult, { signal });
|
|
264
|
+
}
|
|
265
|
+
catch (error) {
|
|
266
|
+
return signal.aborted ? { kind: 'ended' } : { kind: 'failed', error };
|
|
267
|
+
}
|
|
268
|
+
const events = [];
|
|
269
|
+
for (const raw of result.events) {
|
|
270
|
+
const parsed = parseOccurrence(raw);
|
|
271
|
+
if (parsed.ok)
|
|
272
|
+
events.push(parsed.event);
|
|
273
|
+
else
|
|
274
|
+
report({ kind: 'malformed', method: 'events/poll', message: parsed.message, payload: raw });
|
|
275
|
+
}
|
|
276
|
+
await deliver(batch(events, result.cursor, result.truncated));
|
|
277
|
+
if (result.hasMore)
|
|
278
|
+
continue;
|
|
279
|
+
await pause(result.nextPollMs ?? pollMs, signal);
|
|
280
|
+
}
|
|
281
|
+
return { kind: 'ended' };
|
|
282
|
+
}
|
|
283
|
+
async function runStream(position, deliver, signal) {
|
|
284
|
+
if (!client.transport)
|
|
285
|
+
throw closedClient(undefined);
|
|
286
|
+
const opened = position.cursor;
|
|
287
|
+
const demux = demuxFor(client);
|
|
288
|
+
const controller = new AbortController();
|
|
289
|
+
const items = inbox(maxBuffered, () => controller.abort(new Error('attend: stream inbox overflowed')));
|
|
290
|
+
let cancelIdle = () => undefined;
|
|
291
|
+
const armIdle = () => {
|
|
292
|
+
cancelIdle();
|
|
293
|
+
cancelIdle = clock.at(clock.now() + idleTimeoutMs, () => items.close({ kind: 'idle' }));
|
|
294
|
+
};
|
|
295
|
+
const subscription = {
|
|
296
|
+
id: null,
|
|
297
|
+
push(note) {
|
|
298
|
+
armIdle();
|
|
299
|
+
items.push(note);
|
|
300
|
+
},
|
|
301
|
+
report,
|
|
302
|
+
};
|
|
303
|
+
const params = { ...base, cursor: opened };
|
|
304
|
+
const onAbort = () => controller.abort(signal.reason);
|
|
305
|
+
signal.addEventListener('abort', onAbort, { once: true });
|
|
306
|
+
let settled = false;
|
|
307
|
+
demux.pending.set(params, subscription);
|
|
308
|
+
client.request({ method: 'events/stream', params }, StreamResult, { signal: controller.signal, timeout: STREAM_TIMEOUT_MS }).then(() => {
|
|
309
|
+
settled = true;
|
|
310
|
+
items.close({ kind: 'done' });
|
|
311
|
+
}, (error) => {
|
|
312
|
+
settled = true;
|
|
313
|
+
items.close({ kind: 'failed', error });
|
|
314
|
+
});
|
|
315
|
+
try {
|
|
316
|
+
if (subscription.id === null) {
|
|
317
|
+
throw new PermanentError('attend/mcp: the events/stream request left the Client without the demux seeing its id, so its notifications cannot be routed. Please report this at https://github.com/acquiredintelligence/attend/issues');
|
|
318
|
+
}
|
|
319
|
+
armIdle();
|
|
320
|
+
// Consecutive events fold into one batch, which carries the last cursor among them: the
|
|
321
|
+
// same position a one-by-one emit would have left, in one store write.
|
|
322
|
+
let folded = [];
|
|
323
|
+
let foldedCursor;
|
|
324
|
+
const flush = async () => {
|
|
325
|
+
if (signal.aborted || (folded.length === 0 && foldedCursor === undefined))
|
|
326
|
+
return;
|
|
327
|
+
const out = batch(folded, foldedCursor);
|
|
328
|
+
folded = [];
|
|
329
|
+
foldedCursor = undefined;
|
|
330
|
+
await deliver(out);
|
|
331
|
+
};
|
|
332
|
+
while (!signal.aborted) {
|
|
333
|
+
for (const item of await items.take(EMIT_BATCH)) {
|
|
334
|
+
if (signal.aborted)
|
|
335
|
+
return { kind: 'ended' };
|
|
336
|
+
if (item.kind === 'event') {
|
|
337
|
+
const parsed = parseOccurrence(item.params);
|
|
338
|
+
if (parsed.ok)
|
|
339
|
+
folded.push(parsed.event);
|
|
340
|
+
else
|
|
341
|
+
report({ kind: 'malformed', method: 'notifications/events/event', message: parsed.message, payload: item.params });
|
|
342
|
+
const cursor = parsed.ok ? parsed.cursor : cursorOf(item.params);
|
|
343
|
+
if (typeof cursor === 'string')
|
|
344
|
+
foldedCursor = cursor;
|
|
345
|
+
continue;
|
|
346
|
+
}
|
|
347
|
+
await flush();
|
|
348
|
+
if (signal.aborted)
|
|
349
|
+
return { kind: 'ended' };
|
|
350
|
+
switch (item.kind) {
|
|
351
|
+
case 'done':
|
|
352
|
+
case 'terminated':
|
|
353
|
+
return { kind: 'ended' };
|
|
354
|
+
case 'failed':
|
|
355
|
+
return signal.aborted ? { kind: 'ended' } : { kind: 'failed', error: item.error };
|
|
356
|
+
case 'overflow': {
|
|
357
|
+
const moved = position.cursor !== opened;
|
|
358
|
+
report({ kind: 'overflow', buffered: item.buffered, reopenMs: moved ? 0 : REOPEN_MS });
|
|
359
|
+
return moved ? { kind: 'overflowed' } : { kind: 'ended' };
|
|
360
|
+
}
|
|
361
|
+
case 'idle':
|
|
362
|
+
report({ kind: 'idle' });
|
|
363
|
+
return { kind: 'ended' };
|
|
364
|
+
case 'active': {
|
|
365
|
+
const active = parsePayload(Active, item.params, 'notifications/events/active');
|
|
366
|
+
if (active)
|
|
367
|
+
await deliver(batch([], active.cursor, active.truncated));
|
|
368
|
+
break;
|
|
369
|
+
}
|
|
370
|
+
case 'heartbeat': {
|
|
371
|
+
const heartbeat = parsePayload(Heartbeat, item.params, 'notifications/events/heartbeat');
|
|
372
|
+
if (heartbeat)
|
|
373
|
+
await deliver(batch([], heartbeat.cursor));
|
|
374
|
+
break;
|
|
375
|
+
}
|
|
376
|
+
case 'error': {
|
|
377
|
+
const failure = parsePayload(StreamError, item.params, 'notifications/events/error');
|
|
378
|
+
if (failure)
|
|
379
|
+
report({ kind: 'stream', code: failure.error.code, message: failure.error.message, data: failure.error.data });
|
|
380
|
+
break;
|
|
381
|
+
}
|
|
382
|
+
default:
|
|
383
|
+
return assertNever(item);
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
await flush();
|
|
387
|
+
}
|
|
388
|
+
return { kind: 'ended' };
|
|
389
|
+
}
|
|
390
|
+
finally {
|
|
391
|
+
cancelIdle();
|
|
392
|
+
signal.removeEventListener('abort', onAbort);
|
|
393
|
+
demux.pending.delete(params);
|
|
394
|
+
if (subscription.id !== null)
|
|
395
|
+
forget(demux, subscription.id);
|
|
396
|
+
if (!settled)
|
|
397
|
+
controller.abort(new Error('attend: stream closed'));
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
/** Sleep `ms` on the clock, or return at once when `signal` aborts or the Client's transport closes. */
|
|
401
|
+
function pause(ms, signal) {
|
|
402
|
+
const transport = client.transport;
|
|
403
|
+
return transport ? sleep(clock, ms, AbortSignal.any([signal, closingOf(transport)])) : Promise.resolve();
|
|
404
|
+
}
|
|
405
|
+
function parsePayload(schema, payload, method) {
|
|
406
|
+
const result = schema.safeParse(payload);
|
|
407
|
+
if (result.success)
|
|
408
|
+
return result.data;
|
|
409
|
+
report({ kind: 'malformed', method, message: z.prettifyError(result.error), payload });
|
|
410
|
+
return null;
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
// ─── parsing at the boundary ─────────────────────────────────────────────────
|
|
414
|
+
/** The draft documents no summary key in `_meta`, so `text` is left unset for the sink to build. */
|
|
415
|
+
function parseOccurrence(raw) {
|
|
416
|
+
const result = Occurrence.safeParse(raw);
|
|
417
|
+
if (!result.success)
|
|
418
|
+
return { ok: false, message: z.prettifyError(result.error) };
|
|
419
|
+
const o = result.data;
|
|
420
|
+
return { ok: true, event: { id: o.eventId, at: Date.parse(o.timestamp), name: o.name, data: o.data }, cursor: o.cursor };
|
|
421
|
+
}
|
|
422
|
+
function cursorOf(payload) {
|
|
423
|
+
return typeof payload === 'object' && payload !== null && 'cursor' in payload && typeof payload.cursor === 'string' ? payload.cursor : undefined;
|
|
424
|
+
}
|
|
425
|
+
/** A batch whose cursor is set only when the server gave one, so a missing cursor leaves the record's alone. */
|
|
426
|
+
function batch(events, cursor, truncated) {
|
|
427
|
+
const out = { events };
|
|
428
|
+
if (typeof cursor === 'string')
|
|
429
|
+
out.cursor = cursor;
|
|
430
|
+
if (truncated)
|
|
431
|
+
out.truncated = true;
|
|
432
|
+
return out;
|
|
433
|
+
}
|
|
434
|
+
function policyOf(error) {
|
|
435
|
+
const code = typeof error === 'object' && error !== null && 'code' in error && typeof error.code === 'number' ? error.code : null;
|
|
436
|
+
return code === null ? 'permanent' : (ERROR_POLICY[code] ?? 'permanent');
|
|
437
|
+
}
|
|
438
|
+
/** A retryable error passes through as it is, for `attach` to back off on; anything else ends the subscription for good. */
|
|
439
|
+
function classify(error) {
|
|
440
|
+
switch (policyOf(error)) {
|
|
441
|
+
case 'retry':
|
|
442
|
+
return error instanceof Error ? error : new Error(messageOf(error));
|
|
443
|
+
case 'closed':
|
|
444
|
+
return closedClient(error);
|
|
445
|
+
default:
|
|
446
|
+
return new PermanentError(`attend/mcp: ${messageOf(error)}`, { cause: error });
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
/** The SDK fails an in-flight request with -32000 on close, but a later one with a bare, code-less "Not connected"; both get this. */
|
|
450
|
+
function closedClient(cause) {
|
|
451
|
+
return new PermanentError('attend/mcp: the Client closed; reconnect it and attach again', cause === undefined ? undefined : { cause });
|
|
452
|
+
}
|
|
453
|
+
/** Subscribes through `mcpEventsSource` and yields one item at a time; the subscription waits while the caller handles an item. */
|
|
454
|
+
export async function* decisionFeed(client, options) {
|
|
455
|
+
const controller = new AbortController();
|
|
456
|
+
const signal = AbortSignal.any([options.signal, controller.signal]);
|
|
457
|
+
const source = mcpEventsSource(client, {
|
|
458
|
+
name: options.name ?? 'attention.decision',
|
|
459
|
+
...(options.arguments === undefined ? {} : { arguments: { ...options.arguments } }),
|
|
460
|
+
...(options.mode === undefined ? {} : { mode: options.mode }),
|
|
461
|
+
...(options.maxAgeMs === undefined ? {} : { maxAgeMs: options.maxAgeMs }),
|
|
462
|
+
idleTimeoutMs: options.idleTimeoutMs ?? 30_000,
|
|
463
|
+
});
|
|
464
|
+
let committed = options.cursor;
|
|
465
|
+
let pending;
|
|
466
|
+
let failure;
|
|
467
|
+
let ended = false;
|
|
468
|
+
let wake = () => undefined;
|
|
469
|
+
const onAbort = () => { pending?.release(); wake(); };
|
|
470
|
+
signal.addEventListener('abort', onAbort, { once: true });
|
|
471
|
+
const running = (async () => {
|
|
472
|
+
try {
|
|
473
|
+
while (!signal.aborted) {
|
|
474
|
+
try {
|
|
475
|
+
await source.subscribe(committed, (batch) => new Promise((release) => {
|
|
476
|
+
if (signal.aborted) {
|
|
477
|
+
release();
|
|
478
|
+
return;
|
|
479
|
+
}
|
|
480
|
+
pending = { batch, release };
|
|
481
|
+
wake();
|
|
482
|
+
}), signal);
|
|
483
|
+
return;
|
|
484
|
+
}
|
|
485
|
+
catch (error) {
|
|
486
|
+
if (signal.aborted)
|
|
487
|
+
return;
|
|
488
|
+
if (error instanceof PermanentError)
|
|
489
|
+
throw error;
|
|
490
|
+
await sleep(systemClock(), 1000, signal);
|
|
491
|
+
}
|
|
492
|
+
}
|
|
493
|
+
}
|
|
494
|
+
catch (error) {
|
|
495
|
+
failure = error;
|
|
496
|
+
}
|
|
497
|
+
finally {
|
|
498
|
+
ended = true;
|
|
499
|
+
wake();
|
|
500
|
+
}
|
|
501
|
+
})();
|
|
502
|
+
try {
|
|
503
|
+
while (!signal.aborted) {
|
|
504
|
+
if (!pending) {
|
|
505
|
+
if (ended) {
|
|
506
|
+
if (failure !== undefined)
|
|
507
|
+
throw failure;
|
|
508
|
+
return;
|
|
509
|
+
}
|
|
510
|
+
await new Promise((resolve) => { wake = resolve; });
|
|
511
|
+
continue;
|
|
512
|
+
}
|
|
513
|
+
const { batch, release } = pending;
|
|
514
|
+
try {
|
|
515
|
+
const items = [];
|
|
516
|
+
const next = batch.cursor ?? committed;
|
|
517
|
+
if (batch.truncated)
|
|
518
|
+
items.push({ kind: 'cursor', cursor: batch.events.length > 0 ? committed : next, truncated: true });
|
|
519
|
+
const delivered = batch.events.filter((event) => event.name === 'attention.decision' || event.name === 'attention.deadLetter');
|
|
520
|
+
for (const [index, event] of delivered.entries()) {
|
|
521
|
+
const cursor = index === delivered.length - 1 ? next : committed;
|
|
522
|
+
if (event.name === 'attention.decision')
|
|
523
|
+
items.push({ kind: 'decision', eventId: event.id, data: event.data, cursor });
|
|
524
|
+
if (event.name === 'attention.deadLetter')
|
|
525
|
+
items.push({ kind: 'deadLetter', eventId: event.id, data: event.data, cursor });
|
|
526
|
+
}
|
|
527
|
+
if (delivered.length === 0 && next !== committed && (!batch.truncated || batch.events.length > 0)) {
|
|
528
|
+
items.push({ kind: 'cursor', cursor: next, truncated: false });
|
|
529
|
+
}
|
|
530
|
+
for (const item of items) {
|
|
531
|
+
if (signal.aborted)
|
|
532
|
+
return;
|
|
533
|
+
committed = item.cursor;
|
|
534
|
+
yield item;
|
|
535
|
+
}
|
|
536
|
+
}
|
|
537
|
+
finally {
|
|
538
|
+
pending = undefined;
|
|
539
|
+
release();
|
|
540
|
+
}
|
|
541
|
+
}
|
|
542
|
+
}
|
|
543
|
+
finally {
|
|
544
|
+
controller.abort();
|
|
545
|
+
signal.removeEventListener('abort', onAbort);
|
|
546
|
+
pending?.release();
|
|
547
|
+
await running;
|
|
548
|
+
}
|
|
549
|
+
}
|
|
550
|
+
//# sourceMappingURL=mcp.js.map
|
package/dist/mcp.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"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"}
|
package/dist/memory.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { EventLog } from './types.js';
|
|
2
|
+
/** The in-memory log and snapshot store. */
|
|
3
|
+
export { memoryStore } from './store/memory.js';
|
|
4
|
+
/** Retention options for the in-memory decision log. */
|
|
5
|
+
export type { MemoryStoreOptions } from './store/memory.js';
|
|
6
|
+
/** An in-memory event log with optional retention. */
|
|
7
|
+
export declare function memoryLog(options?: {
|
|
8
|
+
retain?: number;
|
|
9
|
+
}): EventLog;
|
|
10
|
+
//# sourceMappingURL=memory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../src/memory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAS,QAAQ,EAAY,MAAM,YAAY,CAAC;AAE5D,4CAA4C;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,wDAAwD;AACxD,YAAY,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAE5D,sDAAsD;AACtD,wBAAgB,SAAS,CAAC,OAAO,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,QAAQ,CA0CjE"}
|
package/dist/memory.js
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/** The in-memory log and snapshot store. */
|
|
2
|
+
export { memoryStore } from './store/memory.js';
|
|
3
|
+
/** An in-memory event log with optional retention. */
|
|
4
|
+
export function memoryLog(options) {
|
|
5
|
+
const retain = options?.retain ?? Number.POSITIVE_INFINITY;
|
|
6
|
+
const partitions = new Map();
|
|
7
|
+
const partition = (scope) => {
|
|
8
|
+
let p = partitions.get(scope);
|
|
9
|
+
if (!p) {
|
|
10
|
+
p = { next: 1, entries: [], waiters: new Set() };
|
|
11
|
+
partitions.set(scope, p);
|
|
12
|
+
}
|
|
13
|
+
return p;
|
|
14
|
+
};
|
|
15
|
+
const page = (scope, after, limit) => {
|
|
16
|
+
const entries = partition(scope).entries;
|
|
17
|
+
const from = after === null ? 0 : entries.findIndex((e) => e.position > after);
|
|
18
|
+
return from === -1 ? [] : entries.slice(from, from + limit).map((e) => ({ position: e.position, event: structuredClone(e.event) }));
|
|
19
|
+
};
|
|
20
|
+
return {
|
|
21
|
+
async append(scope, events) {
|
|
22
|
+
const p = partition(scope);
|
|
23
|
+
for (const event of events) {
|
|
24
|
+
p.entries.push({ position: String(p.next).padStart(20, '0'), event: structuredClone(event) });
|
|
25
|
+
p.next += 1;
|
|
26
|
+
}
|
|
27
|
+
if (p.entries.length > retain)
|
|
28
|
+
p.entries.splice(0, p.entries.length - retain);
|
|
29
|
+
for (const wake of p.waiters)
|
|
30
|
+
wake();
|
|
31
|
+
},
|
|
32
|
+
async read(scope, after, { limit, blockMs }) {
|
|
33
|
+
const first = page(scope, after, limit);
|
|
34
|
+
if (first.length > 0 || blockMs === undefined || blockMs <= 0)
|
|
35
|
+
return first;
|
|
36
|
+
const p = partition(scope);
|
|
37
|
+
await new Promise((resolve) => {
|
|
38
|
+
const done = () => {
|
|
39
|
+
p.waiters.delete(done);
|
|
40
|
+
clearTimeout(timer);
|
|
41
|
+
resolve();
|
|
42
|
+
};
|
|
43
|
+
const timer = setTimeout(done, blockMs);
|
|
44
|
+
p.waiters.add(done);
|
|
45
|
+
});
|
|
46
|
+
return page(scope, after, limit);
|
|
47
|
+
},
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=memory.js.map
|