@synsci/sdk 2.0.77 → 2.0.78-test.34098503148
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/src/gen/core/queryKeySerializer.gen.d.ts +18 -0
- package/dist/src/gen/core/queryKeySerializer.gen.js +93 -0
- package/dist/src/index.d.ts +2 -1
- package/dist/src/index.js +3 -0
- package/dist/src/server-process.d.ts +36 -0
- package/dist/src/server-process.js +199 -0
- package/dist/src/server.d.ts +5 -7
- package/dist/src/server.js +3 -67
- package/dist/src/v2/gen/sdk.gen.d.ts +66 -2
- package/dist/src/v2/gen/sdk.gen.js +113 -0
- package/dist/src/v2/gen/types.gen.d.ts +246 -30
- package/dist/src/v2/index.d.ts +2 -1
- package/dist/src/v2/index.js +3 -0
- package/dist/src/v2/runtime.d.ts +22 -1
- package/dist/src/v2/runtime.js +37 -0
- package/dist/src/v2/server.d.ts +5 -7
- package/dist/src/v2/server.js +3 -67
- package/package.json +1 -1
- package/dist/test/mcp-auth-contract.test.d.ts +0 -1
- package/dist/test/mcp-auth-contract.test.js +0 -56
- package/dist/test/notebook-contract.d.ts +0 -38
- package/dist/test/notebook-contract.js +0 -11
- package/dist/test/runtime-contract.d.ts +0 -19
- package/dist/test/runtime-contract.js +0 -6
- package/dist/test/runtime.test.d.ts +0 -1
- package/dist/test/runtime.test.js +0 -203
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
import assert from "node:assert/strict";
|
|
2
|
-
import { test } from "node:test";
|
|
3
|
-
import { createOpenScienceClient } from "../src/v2/client.js";
|
|
4
|
-
const pending = {
|
|
5
|
-
state: "pending",
|
|
6
|
-
authorizationUrl: "https://provider.example/authorize",
|
|
7
|
-
flowId: "flow_exact",
|
|
8
|
-
};
|
|
9
|
-
const settled = {
|
|
10
|
-
state: "settled",
|
|
11
|
-
result: { status: "connected" },
|
|
12
|
-
};
|
|
13
|
-
const resumable = {
|
|
14
|
-
pending: true,
|
|
15
|
-
authorizationUrl: "https://provider.example/authorize",
|
|
16
|
-
flowId: "flow_exact",
|
|
17
|
-
};
|
|
18
|
-
test("generated MCP OAuth client preserves start, pending, wait, and exact cancel requests", async () => {
|
|
19
|
-
const requests = [];
|
|
20
|
-
const responses = [pending, resumable, { status: "connected" }, { success: true }, settled];
|
|
21
|
-
const client = createOpenScienceClient({
|
|
22
|
-
baseUrl: "http://sdk.test",
|
|
23
|
-
throwOnError: true,
|
|
24
|
-
fetch: async (input) => {
|
|
25
|
-
requests.push(input instanceof Request ? input : new Request(input));
|
|
26
|
-
return Response.json(responses[requests.length - 1]);
|
|
27
|
-
},
|
|
28
|
-
});
|
|
29
|
-
const started = await client.mcp.auth.start({ name: "givemeanode" }, { throwOnError: true });
|
|
30
|
-
assert.deepEqual(started.data, pending);
|
|
31
|
-
if (started.data.state !== "pending")
|
|
32
|
-
throw new Error("Expected a pending OAuth start");
|
|
33
|
-
assert.equal(started.data.flowId, "flow_exact");
|
|
34
|
-
const resumed = await client.mcp.auth.pending({ name: "givemeanode" }, { throwOnError: true });
|
|
35
|
-
assert.deepEqual(resumed.data, resumable);
|
|
36
|
-
if (!resumed.data.pending)
|
|
37
|
-
throw new Error("Expected a resumable OAuth flow");
|
|
38
|
-
assert.equal(resumed.data.flowId, "flow_exact");
|
|
39
|
-
await client.mcp.auth.wait({ name: "givemeanode", flow_id: "flow_exact" }, { throwOnError: true });
|
|
40
|
-
await client.mcp.auth.cancel({ name: "givemeanode", flow_id: "flow_exact" }, { throwOnError: true });
|
|
41
|
-
const restarted = await client.mcp.auth.start({ name: "givemeanode" }, { throwOnError: true });
|
|
42
|
-
assert.deepEqual(restarted.data, settled);
|
|
43
|
-
if (restarted.data.state !== "settled")
|
|
44
|
-
throw new Error("Expected a settled OAuth start");
|
|
45
|
-
assert.equal(restarted.data.result.status, "connected");
|
|
46
|
-
assert.deepEqual(requests.map((request) => ({
|
|
47
|
-
method: request.method,
|
|
48
|
-
url: request.url,
|
|
49
|
-
})), [
|
|
50
|
-
{ method: "POST", url: "http://sdk.test/mcp/givemeanode/auth" },
|
|
51
|
-
{ method: "GET", url: "http://sdk.test/mcp/givemeanode/auth/pending" },
|
|
52
|
-
{ method: "POST", url: "http://sdk.test/mcp/givemeanode/auth/wait?flow_id=flow_exact" },
|
|
53
|
-
{ method: "DELETE", url: "http://sdk.test/mcp/givemeanode/auth/pending?flow_id=flow_exact" },
|
|
54
|
-
{ method: "POST", url: "http://sdk.test/mcp/givemeanode/auth" },
|
|
55
|
-
]);
|
|
56
|
-
});
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
import type { OpenScienceClient } from "../src/v2/client.js";
|
|
2
|
-
import type { NotebookExecuteData, NotebookInterruptData, NotebookKernelDeleteData, NotebookKernelInterruptData, NotebookKernelRestartData, NotebookKernelStopData, NotebookRestartData, NotebookStatusData, NotebookStopData } from "../src/v2/gen/types.gen.js";
|
|
3
|
-
type Assert<T extends true> = T;
|
|
4
|
-
type Owner<T> = NonNullable<T> extends {
|
|
5
|
-
sessionID: string;
|
|
6
|
-
} ? true : false;
|
|
7
|
-
type Field<T, K extends PropertyKey> = K extends keyof NonNullable<T> ? true : false;
|
|
8
|
-
type _executeOwner = Assert<Owner<NotebookExecuteData["body"]>>;
|
|
9
|
-
type _statusOwner = Assert<Owner<NotebookStatusData["query"]>>;
|
|
10
|
-
type _restartOwner = Assert<Owner<NotebookRestartData["body"]>>;
|
|
11
|
-
type _stopOwner = Assert<Owner<NotebookStopData["body"]>>;
|
|
12
|
-
type _interruptOwner = Assert<Owner<NotebookInterruptData["body"]>>;
|
|
13
|
-
type _kernelRestartOwner = Assert<Owner<NotebookKernelRestartData["body"]>>;
|
|
14
|
-
type _kernelStopOwner = Assert<Owner<NotebookKernelStopData["body"]>>;
|
|
15
|
-
type _kernelInterruptOwner = Assert<Owner<NotebookKernelInterruptData["body"]>>;
|
|
16
|
-
type _kernelDeleteOwner = Assert<Owner<NotebookKernelDeleteData["query"]>>;
|
|
17
|
-
type Notebook = OpenScienceClient["notebook"];
|
|
18
|
-
type _executeMethodOwner = Assert<Field<Parameters<Notebook["execute"]>[0], "sessionID">>;
|
|
19
|
-
type _statusMethodOwner = Assert<Field<Parameters<Notebook["status"]>[0], "sessionID">>;
|
|
20
|
-
type _restartMethodOwner = Assert<Field<Parameters<Notebook["restart"]>[0], "sessionID">>;
|
|
21
|
-
type _stopMethodOwner = Assert<Field<Parameters<Notebook["stop"]>[0], "sessionID">>;
|
|
22
|
-
type _interruptMethodOwner = Assert<Field<Parameters<Notebook["interrupt"]>[0], "sessionID">>;
|
|
23
|
-
type _kernelRestart = Assert<Field<Notebook["kernel"], "restart">>;
|
|
24
|
-
type _kernelStop = Assert<Field<Notebook["kernel"], "stop">>;
|
|
25
|
-
type _kernelInterrupt = Assert<Field<Notebook["kernel"], "interrupt">>;
|
|
26
|
-
type _kernelDelete = Assert<Field<Notebook["kernel"], "delete">>;
|
|
27
|
-
export declare const notebookContract: {
|
|
28
|
-
readonly execute: _executeOwner & _executeMethodOwner;
|
|
29
|
-
readonly status: _statusOwner & _statusMethodOwner;
|
|
30
|
-
readonly restart: _restartOwner & _restartMethodOwner;
|
|
31
|
-
readonly stop: _stopOwner & _stopMethodOwner;
|
|
32
|
-
readonly interrupt: _interruptOwner & _interruptMethodOwner;
|
|
33
|
-
readonly kernelRestart: _kernelRestartOwner & _kernelRestart;
|
|
34
|
-
readonly kernelStop: _kernelStopOwner & _kernelStop;
|
|
35
|
-
readonly kernelInterrupt: _kernelInterruptOwner & _kernelInterrupt;
|
|
36
|
-
readonly kernelDelete: _kernelDeleteOwner & _kernelDelete;
|
|
37
|
-
};
|
|
38
|
-
export {};
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import { createOpenScienceRuntime, type RuntimePromptInput } from "../src/v2/runtime.js";
|
|
2
|
-
import type { RuntimeEvent, RuntimeEventReplay, RuntimePromptAccepted } from "../src/v2/gen/types.gen.js";
|
|
3
|
-
type Assert<T extends true> = T;
|
|
4
|
-
type Equal<A, B> = (<T>() => T extends A ? 1 : 2) extends <T>() => T extends B ? 1 : 2 ? true : false;
|
|
5
|
-
type _promptInput = Assert<Equal<RuntimePromptInput, {
|
|
6
|
-
sessionID: string;
|
|
7
|
-
message: string;
|
|
8
|
-
effort: "normal" | "ultra";
|
|
9
|
-
}>>;
|
|
10
|
-
type _promptResult = Assert<Equal<Awaited<ReturnType<ReturnType<typeof createOpenScienceRuntime>["prompt"]>>, RuntimePromptAccepted>>;
|
|
11
|
-
type _replayResult = Assert<Equal<Awaited<ReturnType<ReturnType<typeof createOpenScienceRuntime>["replay"]>>, RuntimeEventReplay>>;
|
|
12
|
-
type _eventsResult = Assert<Equal<ReturnType<ReturnType<typeof createOpenScienceRuntime>["events"]>, AsyncGenerator<RuntimeEvent, void, void>>>;
|
|
13
|
-
export declare const runtimeContract: {
|
|
14
|
-
promptInput: _promptInput;
|
|
15
|
-
promptResult: _promptResult;
|
|
16
|
-
replayResult: _replayResult;
|
|
17
|
-
eventsResult: _eventsResult;
|
|
18
|
-
};
|
|
19
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,203 +0,0 @@
|
|
|
1
|
-
import assert from "node:assert/strict";
|
|
2
|
-
import { describe, test } from "node:test";
|
|
3
|
-
import { createOpenScienceRuntime, RuntimeEventCursorError } from "../src/v2/runtime.js";
|
|
4
|
-
describe("OpenScienceRuntime", () => {
|
|
5
|
-
test("sends the strict public prompt contract and returns the accepted run", async () => {
|
|
6
|
-
let request;
|
|
7
|
-
const runtime = createOpenScienceRuntime({
|
|
8
|
-
baseUrl: "http://runtime.test",
|
|
9
|
-
fetch: async (input) => {
|
|
10
|
-
request = input instanceof Request ? input : new Request(input);
|
|
11
|
-
return Response.json({ runID: "run_public", acceptedAt: 123 }, { status: 202 });
|
|
12
|
-
},
|
|
13
|
-
});
|
|
14
|
-
assert.deepEqual(await runtime.prompt({ sessionID: "ses_public", message: "Analyze this", effort: "ultra" }), {
|
|
15
|
-
runID: "run_public",
|
|
16
|
-
acceptedAt: 123,
|
|
17
|
-
});
|
|
18
|
-
assert.equal(request?.url, "http://runtime.test/runtime/prompt");
|
|
19
|
-
assert.equal(request?.method, "POST");
|
|
20
|
-
assert.deepEqual(await request?.json(), {
|
|
21
|
-
sessionID: "ses_public",
|
|
22
|
-
message: "Analyze this",
|
|
23
|
-
effort: "ultra",
|
|
24
|
-
});
|
|
25
|
-
});
|
|
26
|
-
test("generated prompt serialization keeps normal effort in the request body", async () => {
|
|
27
|
-
let body;
|
|
28
|
-
const runtime = createOpenScienceRuntime({
|
|
29
|
-
baseUrl: "http://runtime.test",
|
|
30
|
-
fetch: async (input) => {
|
|
31
|
-
const request = input instanceof Request ? input : new Request(input);
|
|
32
|
-
body = await request.json();
|
|
33
|
-
return Response.json({ runID: "run_normal", acceptedAt: 321 }, { status: 202 });
|
|
34
|
-
},
|
|
35
|
-
});
|
|
36
|
-
await runtime.prompt({ sessionID: "ses_normal", message: "Summarize", effort: "normal" });
|
|
37
|
-
assert.deepEqual(body, { sessionID: "ses_normal", message: "Summarize", effort: "normal" });
|
|
38
|
-
});
|
|
39
|
-
test("replays from a sequence cursor and yields typed SSE events", async () => {
|
|
40
|
-
const urls = [];
|
|
41
|
-
const controller = new AbortController();
|
|
42
|
-
const event = {
|
|
43
|
-
sequence: 4,
|
|
44
|
-
sessionID: "ses_public",
|
|
45
|
-
runID: "run_public",
|
|
46
|
-
type: "runtime.completed",
|
|
47
|
-
properties: { messageID: "msg_public" },
|
|
48
|
-
time: 456,
|
|
49
|
-
};
|
|
50
|
-
const runtime = createOpenScienceRuntime({
|
|
51
|
-
baseUrl: "http://runtime.test",
|
|
52
|
-
fetch: async (input) => {
|
|
53
|
-
const request = input instanceof Request ? input : new Request(input);
|
|
54
|
-
urls.push(request.url);
|
|
55
|
-
if (request.url.includes("/replay")) {
|
|
56
|
-
return Response.json({ events: [event], oldestSequence: 1, latestSequence: 4 });
|
|
57
|
-
}
|
|
58
|
-
return new Response(`id: 4\nevent: runtime.completed\ndata: ${JSON.stringify(event)}\n\n`, {
|
|
59
|
-
headers: { "content-type": "text/event-stream" },
|
|
60
|
-
});
|
|
61
|
-
},
|
|
62
|
-
});
|
|
63
|
-
assert.deepEqual(await runtime.replay({ sessionID: "ses_public", afterSequence: 3 }), {
|
|
64
|
-
events: [event],
|
|
65
|
-
oldestSequence: 1,
|
|
66
|
-
latestSequence: 4,
|
|
67
|
-
});
|
|
68
|
-
const received = [];
|
|
69
|
-
for await (const item of runtime.events({ sessionID: "ses_public", afterSequence: 3, signal: controller.signal })) {
|
|
70
|
-
received.push(item);
|
|
71
|
-
controller.abort();
|
|
72
|
-
}
|
|
73
|
-
assert.deepEqual(received, [event]);
|
|
74
|
-
assert.deepEqual(urls, [
|
|
75
|
-
"http://runtime.test/runtime/events/replay?sessionID=ses_public&afterSequence=3",
|
|
76
|
-
"http://runtime.test/runtime/events?sessionID=ses_public&afterSequence=3",
|
|
77
|
-
]);
|
|
78
|
-
});
|
|
79
|
-
test("reconnects after clean EOF with the last delivered sequence", async () => {
|
|
80
|
-
const requests = [];
|
|
81
|
-
const controller = new AbortController();
|
|
82
|
-
const event = (sequence) => ({
|
|
83
|
-
sequence,
|
|
84
|
-
sessionID: "ses_reconnect",
|
|
85
|
-
runID: "run_reconnect",
|
|
86
|
-
type: sequence === 1 ? "runtime.accepted" : "runtime.completed",
|
|
87
|
-
properties: sequence === 1 ? { effort: "normal" } : { messageID: "msg_done" },
|
|
88
|
-
time: sequence,
|
|
89
|
-
});
|
|
90
|
-
const runtime = createOpenScienceRuntime({
|
|
91
|
-
baseUrl: "http://runtime.test",
|
|
92
|
-
runtimeReconnectDelayMs: 0,
|
|
93
|
-
fetch: async (input) => {
|
|
94
|
-
const request = input instanceof Request ? input : new Request(input);
|
|
95
|
-
requests.push(request);
|
|
96
|
-
const current = event(requests.length);
|
|
97
|
-
return new Response(`id: ${current.sequence}\nevent: ${current.type}\ndata: ${JSON.stringify(current)}\n\n`, {
|
|
98
|
-
headers: { "content-type": "text/event-stream" },
|
|
99
|
-
});
|
|
100
|
-
},
|
|
101
|
-
});
|
|
102
|
-
const received = [];
|
|
103
|
-
for await (const item of runtime.events({
|
|
104
|
-
sessionID: "ses_reconnect",
|
|
105
|
-
afterSequence: 0,
|
|
106
|
-
signal: controller.signal,
|
|
107
|
-
})) {
|
|
108
|
-
received.push(item);
|
|
109
|
-
if (received.length === 2)
|
|
110
|
-
controller.abort();
|
|
111
|
-
}
|
|
112
|
-
assert.deepEqual(received.map((item) => item.sequence), [1, 2]);
|
|
113
|
-
assert.equal(requests.length, 2);
|
|
114
|
-
assert.equal(requests[0]?.headers.get("Last-Event-ID"), "0");
|
|
115
|
-
assert.equal(requests[1]?.headers.get("Last-Event-ID"), "1");
|
|
116
|
-
});
|
|
117
|
-
test("backs off after empty clean closes and resets once events arrive", async () => {
|
|
118
|
-
const times = [];
|
|
119
|
-
const controller = new AbortController();
|
|
120
|
-
const event = {
|
|
121
|
-
sequence: 1,
|
|
122
|
-
sessionID: "ses_empty",
|
|
123
|
-
runID: "run_empty",
|
|
124
|
-
type: "runtime.accepted",
|
|
125
|
-
properties: { effort: "normal" },
|
|
126
|
-
time: 1,
|
|
127
|
-
};
|
|
128
|
-
const runtime = createOpenScienceRuntime({
|
|
129
|
-
baseUrl: "http://runtime.test",
|
|
130
|
-
runtimeReconnectDelayMs: 20,
|
|
131
|
-
fetch: async () => {
|
|
132
|
-
times.push(Date.now());
|
|
133
|
-
if (times.length === 6)
|
|
134
|
-
controller.abort();
|
|
135
|
-
const body = times.length === 5 ? `id: 1\nevent: runtime.accepted\ndata: ${JSON.stringify(event)}\n\n` : "";
|
|
136
|
-
return new Response(body, { headers: { "content-type": "text/event-stream" } });
|
|
137
|
-
},
|
|
138
|
-
});
|
|
139
|
-
const received = [];
|
|
140
|
-
for await (const item of runtime.events({ sessionID: "ses_empty", signal: controller.signal })) {
|
|
141
|
-
received.push(item);
|
|
142
|
-
}
|
|
143
|
-
assert.equal(received.length, 1);
|
|
144
|
-
assert.equal(times.length, 6);
|
|
145
|
-
const gaps = times.slice(1).map((time, index) => time - (times[index] ?? time));
|
|
146
|
-
// Four empty closes wait 20, 40, 80, and 160 ms; the delivered event on
|
|
147
|
-
// the fifth connection resets the next wait to the 20 ms base.
|
|
148
|
-
assert.ok((gaps[3] ?? 0) >= 150, `fourth reconnect waited ${gaps[3]}ms`);
|
|
149
|
-
assert.ok((gaps[0] ?? 0) + (gaps[1] ?? 0) + (gaps[2] ?? 0) + (gaps[3] ?? 0) >= 280, `empty closes waited ${gaps}`);
|
|
150
|
-
assert.ok((gaps[4] ?? 0) < 200, `reconnect after a delivered event waited ${gaps[4]}ms`);
|
|
151
|
-
});
|
|
152
|
-
test("surfaces a retained-window conflict without retrying forever", async () => {
|
|
153
|
-
let calls = 0;
|
|
154
|
-
const runtime = createOpenScienceRuntime({
|
|
155
|
-
baseUrl: "http://runtime.test",
|
|
156
|
-
runtimeReconnectDelayMs: 0,
|
|
157
|
-
fetch: async () => {
|
|
158
|
-
calls += 1;
|
|
159
|
-
return Response.json({ error: "cursor_expired" }, { status: 409, statusText: "Conflict" });
|
|
160
|
-
},
|
|
161
|
-
});
|
|
162
|
-
await assert.rejects(async () => {
|
|
163
|
-
for await (const _ of runtime.events({ sessionID: "ses_expired", afterSequence: 1 })) {
|
|
164
|
-
// No event is expected.
|
|
165
|
-
}
|
|
166
|
-
}, RuntimeEventCursorError);
|
|
167
|
-
assert.equal(calls, 1);
|
|
168
|
-
});
|
|
169
|
-
test("settles a rejecting stream cancellation when the caller aborts", async () => {
|
|
170
|
-
const controller = new AbortController();
|
|
171
|
-
let connected = false;
|
|
172
|
-
const unhandled = [];
|
|
173
|
-
const onUnhandled = (error) => unhandled.push(error);
|
|
174
|
-
process.on("unhandledRejection", onUnhandled);
|
|
175
|
-
try {
|
|
176
|
-
const runtime = createOpenScienceRuntime({
|
|
177
|
-
baseUrl: "http://runtime.test",
|
|
178
|
-
runtimeReconnectDelayMs: 0,
|
|
179
|
-
fetch: async () => {
|
|
180
|
-
connected = true;
|
|
181
|
-
return new Response(new ReadableStream({
|
|
182
|
-
pull: () => new Promise(() => { }),
|
|
183
|
-
cancel: () => Promise.reject(new Error("upstream cancel failed")),
|
|
184
|
-
}), { headers: { "content-type": "text/event-stream" } });
|
|
185
|
-
},
|
|
186
|
-
});
|
|
187
|
-
const consuming = (async () => {
|
|
188
|
-
for await (const _ of runtime.events({ sessionID: "ses_abort", signal: controller.signal })) {
|
|
189
|
-
// No event is expected.
|
|
190
|
-
}
|
|
191
|
-
})();
|
|
192
|
-
while (!connected)
|
|
193
|
-
await new Promise((resolve) => setTimeout(resolve, 1));
|
|
194
|
-
controller.abort();
|
|
195
|
-
await consuming;
|
|
196
|
-
await new Promise((resolve) => setImmediate(resolve));
|
|
197
|
-
assert.deepEqual(unhandled, []);
|
|
198
|
-
}
|
|
199
|
-
finally {
|
|
200
|
-
process.off("unhandledRejection", onUnhandled);
|
|
201
|
-
}
|
|
202
|
-
});
|
|
203
|
-
});
|