@relaymessenger/mcp 0.1.3-staging.7 → 0.1.3-staging.8
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 +82 -97
- package/dist/auth.d.ts +2 -0
- package/dist/auth.d.ts.map +1 -1
- package/dist/auth.js +4 -1
- package/dist/auth.js.map +1 -1
- package/dist/execute.d.ts +14 -0
- package/dist/execute.d.ts.map +1 -0
- package/dist/execute.js +198 -0
- package/dist/execute.js.map +1 -0
- package/dist/generated-docs.d.ts +8 -0
- package/dist/generated-docs.d.ts.map +1 -0
- package/dist/generated-docs.js +1015 -0
- package/dist/generated-docs.js.map +1 -0
- package/dist/search-docs.d.ts +20 -0
- package/dist/search-docs.d.ts.map +1 -0
- package/dist/search-docs.js +26 -0
- package/dist/search-docs.js.map +1 -0
- package/dist/server.d.ts +2 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +55 -325
- package/dist/server.js.map +1 -1
- package/package.json +12 -7
package/README.md
CHANGED
|
@@ -1,125 +1,110 @@
|
|
|
1
1
|
# Relay MCP
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
Agent tools. It uses `@modelcontextprotocol/server@2` and delegates every
|
|
5
|
-
Relay request and response type to `@relaymessenger/sdk`.
|
|
3
|
+
Local MCP v2 stdio server with exactly two tools:
|
|
6
4
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
## Transport and security status
|
|
12
|
-
|
|
13
|
-
**Implemented:** local process-spawned stdio, including MCP v2 modern-era
|
|
14
|
-
negotiation and legacy client compatibility.
|
|
5
|
+
| Tool | Use |
|
|
6
|
+
| --- | --- |
|
|
7
|
+
| `search_docs` | Find Relay SDK methods, signatures, parameters, and contract descriptions in the packaged documentation. |
|
|
8
|
+
| `execute` | Run TypeScript or JavaScript against the configured Agent's SDK client. |
|
|
15
9
|
|
|
16
|
-
|
|
17
|
-
not open a port, publish a web address, or claim to sign anyone in remotely.
|
|
18
|
-
Those stay out until Relay has a secure authorization, audience, scope,
|
|
19
|
-
session, origin, revocation, and deployment design with hosted tests.
|
|
10
|
+
There is no `talk` tool and no per-operation `relay_*` tool list.
|
|
20
11
|
|
|
21
|
-
|
|
22
|
-
trusted local MCP client.
|
|
12
|
+
## Start
|
|
23
13
|
|
|
24
|
-
|
|
14
|
+
Requires Node.js 22.22.3 or newer.
|
|
25
15
|
|
|
26
16
|
```sh
|
|
27
|
-
|
|
28
|
-
relay-mcp --version
|
|
17
|
+
npx --yes @relaymessenger/mcp@staging
|
|
29
18
|
```
|
|
30
19
|
|
|
31
|
-
|
|
32
|
-
|
|
20
|
+
Agent authentication is unchanged: `RELAY_AGENT_TOKEN`, or the selected Relay
|
|
21
|
+
CLI profile. Select a profile with `--profile`. The API origin resolves from
|
|
22
|
+
`--api-url`, `RELAY_API_URL`, the selected profile, then the package environment:
|
|
23
|
+
`-staging` prereleases use the staging API; plain releases use production.
|
|
24
|
+
An explicit origin is preserved.
|
|
25
|
+
Do not put a token in a tool argument or submitted code. Configure it in the
|
|
26
|
+
server's environment or private Relay profile instead.
|
|
33
27
|
|
|
34
|
-
|
|
28
|
+
The server remains local stdio. It does not add HTTP, OAuth, a hosted executor,
|
|
29
|
+
or a new authentication flow.
|
|
35
30
|
|
|
36
|
-
|
|
37
|
-
2. `${XDG_CONFIG_HOME:-~/.config}/relay/config.json`, shared with
|
|
38
|
-
`relaymessenger`;
|
|
39
|
-
3. `https://api.relayapp.im` as the default API URL.
|
|
40
|
-
|
|
41
|
-
Example client configuration:
|
|
31
|
+
## `search_docs`
|
|
42
32
|
|
|
43
33
|
```json
|
|
44
|
-
{
|
|
45
|
-
"mcpServers": {
|
|
46
|
-
"relay": {
|
|
47
|
-
"command": "relay-mcp",
|
|
48
|
-
"env": {
|
|
49
|
-
"RELAY_PROFILE": "default"
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
}
|
|
34
|
+
{"query":"send message idempotency","language":"typescript","detail":"default"}
|
|
54
35
|
```
|
|
55
36
|
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
Optional non-secret process flags:
|
|
60
|
-
|
|
61
|
-
```sh
|
|
62
|
-
relay-mcp --profile staging
|
|
63
|
-
relay-mcp --profile local --api-url http://127.0.0.1:8787
|
|
64
|
-
```
|
|
37
|
+
- `query` is required.
|
|
38
|
+
- `language`: `typescript` (default), `javascript`, or `http`.
|
|
39
|
+
- `detail`: `default` or `verbose`.
|
|
65
40
|
|
|
66
|
-
|
|
41
|
+
Search is local and does not need a token. Its method index is generated from
|
|
42
|
+
`packages/sdk/src/client.ts`, SDK types, and the canonical
|
|
43
|
+
`contracts/relay-v1-openapi.yaml`. It returns the source contract hash. It does
|
|
44
|
+
not proxy the hosted documentation MCP or invent methods from a search result.
|
|
67
45
|
|
|
68
|
-
##
|
|
46
|
+
## `execute`
|
|
69
47
|
|
|
70
|
-
|
|
71
|
-
|
|
48
|
+
```json
|
|
49
|
+
{
|
|
50
|
+
"code":"async function run(client) { return await client.contactCard.retrieve(); }",
|
|
51
|
+
"intent":"Read this agent's contact card"
|
|
52
|
+
}
|
|
53
|
+
```
|
|
72
54
|
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
configure and share the authenticated agent's card. There is no add request:
|
|
101
|
-
an agent's first Message to a user who never wrote to it, or accepted it,
|
|
102
|
-
waits as a message request until the user accepts it, and the agent learns
|
|
103
|
-
the answer from the `contact.added` event. These are not human contact sharing or invitations:
|
|
104
|
-
the server exposes no phone address-book, mutual-contact, human discovery, or
|
|
105
|
-
human invite-link tools.
|
|
106
|
-
|
|
107
|
-
## Errors and secrets
|
|
108
|
-
|
|
109
|
-
Tool failures return MCP error results with sanitized text. Environment and
|
|
110
|
-
locally configured Agent Tokens are redacted from tool errors and stderr.
|
|
111
|
-
Successful SDK objects are returned as both JSON text and structured content.
|
|
55
|
+
Define a top-level `run(client)` function. `intent` is optional and does not
|
|
56
|
+
change execution. TypeScript syntax is transpiled; the packaged SDK signatures
|
|
57
|
+
are available through `search_docs`.
|
|
58
|
+
|
|
59
|
+
The result includes `result` and `logs`. `console.log`, `info`, `warn`, `error`,
|
|
60
|
+
and `debug` are captured. SDK and execution failures return `isError: true`.
|
|
61
|
+
Each call starts fresh; variables do not persist between calls.
|
|
62
|
+
|
|
63
|
+
The supplied client exposes the SDK's initialized-client HTTP methods. SDK
|
|
64
|
+
pagination supports `hasNextPage()`, `getNextPage()`, and async iteration over
|
|
65
|
+
an awaited page. Static `Relay.createAgent` is setup documentation, not an
|
|
66
|
+
initialized-client method. WebSocket callbacks and raw attachment upload
|
|
67
|
+
streams are not exposed by this JSON call bridge.
|
|
68
|
+
|
|
69
|
+
Execution uses a separate QuickJS WebAssembly runtime, not Node's `vm` or host
|
|
70
|
+
`eval`. Submitted code cannot access the host filesystem, process, environment,
|
|
71
|
+
imports, shell, or arbitrary `fetch`. Only calls to the generated SDK method
|
|
72
|
+
list cross the boundary. The actual SDK client and its Agent Token stay on the
|
|
73
|
+
host. API arguments and results cross as JSON; known local tokens are redacted
|
|
74
|
+
from returned values, logs, and errors.
|
|
75
|
+
|
|
76
|
+
Calls are limited to 30 seconds, 64 MiB of guest memory, and 1 MiB of accumulated
|
|
77
|
+
SDK/output text. Outstanding SDK requests receive cancellation when a call
|
|
78
|
+
ends. These limits do not undo a request that the API has already accepted.
|
|
79
|
+
Always await SDK calls and reuse a stable idempotency key for the same logical
|
|
80
|
+
message send. `execute` is not read-only: submitted SDK calls can change the
|
|
81
|
+
configured account.
|
|
112
82
|
|
|
113
83
|
## Development
|
|
114
84
|
|
|
115
|
-
|
|
85
|
+
From the monorepo root, in Daytona for Linux:
|
|
116
86
|
|
|
117
87
|
```sh
|
|
118
88
|
npm ci
|
|
119
|
-
npm run
|
|
89
|
+
npm run build --workspace @relaymessenger/sdk
|
|
90
|
+
npm run docs:generate --workspace @relaymessenger/mcp
|
|
91
|
+
npm run validate:mcp
|
|
120
92
|
```
|
|
121
93
|
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
94
|
+
`docs:check` proves the packaged method index still matches canonical source.
|
|
95
|
+
The protocol, Inspector, and installed-tarball tests require the exact two-tool
|
|
96
|
+
list and exercise both tools. Unit tests cover real SDK dispatch through
|
|
97
|
+
fixtures, pagination, auth errors, token redaction, guest isolation, and limits.
|
|
98
|
+
|
|
99
|
+
## Reference semantics
|
|
100
|
+
|
|
101
|
+
The two-tool workflow and `async function run(client)` shape follow Linq's
|
|
102
|
+
primary MCP source at `linq-team/linq-node` commit
|
|
103
|
+
`9f7ada2cf20fde604855dd69eef7d4df5c2f5b48`:
|
|
104
|
+
`packages/mcp-server/src/docs-search-tool.ts`, `code-tool.ts`, and
|
|
105
|
+
`local-docs-search.ts`. Linq's implementation uses Deno; Relay uses QuickJS and
|
|
106
|
+
states its narrower JSON/HTTP boundary above.
|
|
107
|
+
|
|
108
|
+
Photon's `photon-hq/mcp` source at
|
|
109
|
+
`61e3f2a9814b5a2cbe75f843d1cd9a67ae29ac90` documents a different, 67-tool surface.
|
|
110
|
+
Its per-operation list and additional iMessage powers are not copied here.
|
package/dist/auth.d.ts
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
export declare const DEFAULT_API_URL = "https://api.relayapp.im";
|
|
2
|
+
export declare const STAGING_API_URL = "https://api.staging.relayapp.im";
|
|
3
|
+
export declare const defaultApiURL: (version?: string) => string;
|
|
2
4
|
export declare const DEFAULT_PROFILE = "default";
|
|
3
5
|
export interface AuthContext {
|
|
4
6
|
env?: NodeJS.ProcessEnv;
|
package/dist/auth.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,eAAe,4BAA4B,CAAC;AACzD,eAAO,MAAM,eAAe,oCAAoC,CAAC;AACjE,eAAO,MAAM,aAAa,GAAI,UAAS,MAAoB,KAAG,MACS,CAAC;AACxE,eAAO,MAAM,eAAe,YAAY,CAAC;AAazC,MAAM,WAAW,WAAW;IAC1B,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,aAAa,GAAG,SAAS,CAAC;IAClC,UAAU,EAAE,MAAM,CAAC;CACpB;AAQD,eAAO,MAAM,eAAe,GAAI,UAAS,WAAgB,KAAG,MAY3D,CAAC;AAeF,eAAO,MAAM,cAAc,GAAI,OAAO,MAAM,KAAG,MAuB9C,CAAC;AA8DF,eAAO,MAAM,gBAAgB,GAC3B,UAAS,WAAgB,KACxB,OAAO,CAAC,iBAAiB,CA+B3B,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAC7B,UAAS,WAAgB,KACxB,OAAO,CAAC,MAAM,EAAE,CAalB,CAAC"}
|
package/dist/auth.js
CHANGED
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
import { readFile } from "node:fs/promises";
|
|
2
2
|
import { homedir } from "node:os";
|
|
3
3
|
import { isAbsolute, join, resolve } from "node:path";
|
|
4
|
+
import pkg from "../package.json" with { type: "json" };
|
|
4
5
|
export const DEFAULT_API_URL = "https://api.relayapp.im";
|
|
6
|
+
export const STAGING_API_URL = "https://api.staging.relayapp.im";
|
|
7
|
+
export const defaultApiURL = (version = pkg.version) => /-staging(?:\.|$)/u.test(version) ? STAGING_API_URL : DEFAULT_API_URL;
|
|
5
8
|
export const DEFAULT_PROFILE = "default";
|
|
6
9
|
const isRecord = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
|
|
7
10
|
const envFor = (context) => context.env ?? process.env;
|
|
@@ -114,7 +117,7 @@ export const resolveAgentAuth = async (context = {}) => {
|
|
|
114
117
|
const apiURL = validateApiURL(context.apiURL
|
|
115
118
|
?? env.RELAY_API_URL
|
|
116
119
|
?? selected?.api_url
|
|
117
|
-
??
|
|
120
|
+
?? defaultApiURL());
|
|
118
121
|
const environmentToken = env.RELAY_AGENT_TOKEN;
|
|
119
122
|
const token = environmentToken ?? selected?.agent_token;
|
|
120
123
|
if (!token) {
|
package/dist/auth.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import Relay from "@relaymessenger/sdk";
|
|
2
|
+
export interface ExecutionLimits {
|
|
3
|
+
timeoutMs: number;
|
|
4
|
+
memoryBytes: number;
|
|
5
|
+
outputBytes: number;
|
|
6
|
+
}
|
|
7
|
+
export declare function executeCode(code: string, client: Relay, secrets: readonly string[], overrides?: Partial<ExecutionLimits>): Promise<{
|
|
8
|
+
result: unknown;
|
|
9
|
+
logs: Array<{
|
|
10
|
+
level: string;
|
|
11
|
+
text: string;
|
|
12
|
+
}>;
|
|
13
|
+
}>;
|
|
14
|
+
//# sourceMappingURL=execute.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"execute.d.ts","sourceRoot":"","sources":["../src/execute.ts"],"names":[],"mappings":"AAAA,OAAO,KAAoB,MAAM,qBAAqB,CAAC;AAMvD,MAAM,WAAW,eAAe;IAAG,SAAS,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE;AAsBhG,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,MAAM,EAAE,EAAE,SAAS,GAAE,OAAO,CAAC,eAAe,CAAM,GAAG,OAAO,CAAC;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAAC,CA4I/M"}
|
package/dist/execute.js
ADDED
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
import Relay, { RelayPage } from "@relaymessenger/sdk";
|
|
2
|
+
import { getQuickJS } from "quickjs-emscripten";
|
|
3
|
+
import ts from "typescript";
|
|
4
|
+
import { METHOD_DOCS } from "./generated-docs.js";
|
|
5
|
+
import { redact, safeErrorMessage } from "./redact.js";
|
|
6
|
+
const defaults = { timeoutMs: 30_000, memoryBytes: 64 * 1024 * 1024, outputBytes: 1024 * 1024 };
|
|
7
|
+
const methods = new Map(METHOD_DOCS.filter(row => row.executable).map(row => [row.method.slice("client.".length), row]));
|
|
8
|
+
function compile(code) {
|
|
9
|
+
const file = ts.createSourceFile("relay-execute.ts", code, ts.ScriptTarget.Latest, true);
|
|
10
|
+
let invalidModule = false;
|
|
11
|
+
const visit = (node) => {
|
|
12
|
+
if (ts.isImportDeclaration(node) || ts.isImportEqualsDeclaration(node) || ts.isExportDeclaration(node)
|
|
13
|
+
|| ts.isExportAssignment(node) || node.kind === ts.SyntaxKind.ImportKeyword
|
|
14
|
+
|| (ts.canHaveModifiers(node) && ts.getModifiers(node)?.some(x => x.kind === ts.SyntaxKind.ExportKeyword)))
|
|
15
|
+
invalidModule = true;
|
|
16
|
+
ts.forEachChild(node, visit);
|
|
17
|
+
};
|
|
18
|
+
visit(file);
|
|
19
|
+
if (invalidModule)
|
|
20
|
+
throw new Error("Imports and exports are not available. Define async function run(client) using the supplied client.");
|
|
21
|
+
const compiled = ts.transpileModule(code, { fileName: "relay-execute.ts", reportDiagnostics: true,
|
|
22
|
+
compilerOptions: { target: ts.ScriptTarget.ES2022, module: ts.ModuleKind.ESNext, strict: true } });
|
|
23
|
+
const errors = (compiled.diagnostics ?? []).filter(x => x.category === ts.DiagnosticCategory.Error);
|
|
24
|
+
if (errors.length)
|
|
25
|
+
throw new Error(errors.map(x => ts.flattenDiagnosticMessageText(x.messageText, "\n")).join("\n"));
|
|
26
|
+
return compiled.outputText;
|
|
27
|
+
}
|
|
28
|
+
export async function executeCode(code, client, secrets, overrides = {}) {
|
|
29
|
+
const limits = { ...defaults, ...overrides };
|
|
30
|
+
const javascript = compile(code);
|
|
31
|
+
const QuickJS = await getQuickJS();
|
|
32
|
+
const runtime = QuickJS.newRuntime();
|
|
33
|
+
runtime.setMemoryLimit(limits.memoryBytes);
|
|
34
|
+
runtime.setMaxStackSize(512 * 1024);
|
|
35
|
+
const deadline = Date.now() + limits.timeoutMs;
|
|
36
|
+
const abort = new AbortController();
|
|
37
|
+
runtime.setInterruptHandler(() => Date.now() >= deadline || abort.signal.aborted);
|
|
38
|
+
const vm = runtime.newContext();
|
|
39
|
+
const promises = [];
|
|
40
|
+
const pages = new Map();
|
|
41
|
+
const logs = [];
|
|
42
|
+
let outputBytes = 0;
|
|
43
|
+
let disposed = false;
|
|
44
|
+
let promiseHandle;
|
|
45
|
+
let outputError;
|
|
46
|
+
const limited = (text) => {
|
|
47
|
+
outputBytes += Buffer.byteLength(text);
|
|
48
|
+
if (outputBytes > limits.outputBytes) {
|
|
49
|
+
outputError = new Error("Execution output exceeded the limit.");
|
|
50
|
+
throw outputError;
|
|
51
|
+
}
|
|
52
|
+
return text;
|
|
53
|
+
};
|
|
54
|
+
const encode = (value) => {
|
|
55
|
+
const page = value instanceof RelayPage ? pages.size + 1 : undefined;
|
|
56
|
+
if (page !== undefined)
|
|
57
|
+
pages.set(page, value);
|
|
58
|
+
return limited(redact(JSON.stringify({ value: value ?? null, ...(page === undefined ? {} : { page }) }), secrets));
|
|
59
|
+
};
|
|
60
|
+
async function call(method, args) {
|
|
61
|
+
if (abort.signal.aborted)
|
|
62
|
+
throw new Error("Execution ended.");
|
|
63
|
+
if (method === "__pageNext") {
|
|
64
|
+
const page = pages.get(Number(args[0]));
|
|
65
|
+
if (!page)
|
|
66
|
+
throw new Error("Unknown page in this execution.");
|
|
67
|
+
return page.getNextPage();
|
|
68
|
+
}
|
|
69
|
+
const doc = methods.get(method);
|
|
70
|
+
if (!doc)
|
|
71
|
+
throw new Error(`Unknown SDK method: client.${method}. Use search_docs to find a supported HTTP method.`);
|
|
72
|
+
if (args.length > doc.optionsIndex + 1)
|
|
73
|
+
throw new Error(`Too many arguments for client.${method}.`);
|
|
74
|
+
let target = client;
|
|
75
|
+
const parts = method.split(".");
|
|
76
|
+
for (const part of parts.slice(0, -1))
|
|
77
|
+
target = target[part];
|
|
78
|
+
const fn = target[parts.at(-1)];
|
|
79
|
+
if (typeof fn !== "function")
|
|
80
|
+
throw new Error(`SDK method is unavailable: client.${method}`);
|
|
81
|
+
const options = args[doc.optionsIndex];
|
|
82
|
+
if (options !== undefined && options !== null && (typeof options !== "object" || Array.isArray(options)))
|
|
83
|
+
throw new Error("SDK request options must be a JSON object.");
|
|
84
|
+
args[doc.optionsIndex] = { ...options, signal: abort.signal };
|
|
85
|
+
return Reflect.apply(fn, target, args);
|
|
86
|
+
}
|
|
87
|
+
const bridge = vm.newFunction("relaySdkCall", (methodHandle, argsHandle) => {
|
|
88
|
+
const method = vm.getString(methodHandle);
|
|
89
|
+
const args = JSON.parse(limited(vm.getString(argsHandle)));
|
|
90
|
+
if (!Array.isArray(args))
|
|
91
|
+
throw new Error("SDK arguments must be a JSON array.");
|
|
92
|
+
const promise = vm.newPromise();
|
|
93
|
+
promises.push(promise);
|
|
94
|
+
void call(method, args).then(value => {
|
|
95
|
+
if (disposed)
|
|
96
|
+
return;
|
|
97
|
+
const handle = vm.newString(encode(value));
|
|
98
|
+
promise.resolve(handle);
|
|
99
|
+
handle.dispose();
|
|
100
|
+
}).catch(error => {
|
|
101
|
+
if (disposed)
|
|
102
|
+
return;
|
|
103
|
+
const handle = vm.newError(safeErrorMessage(error, secrets));
|
|
104
|
+
if (error && typeof error === "object" && "status" in error && typeof error.status === "number") {
|
|
105
|
+
const status = vm.newNumber(error.status);
|
|
106
|
+
vm.setProp(handle, "status", status);
|
|
107
|
+
status.dispose();
|
|
108
|
+
}
|
|
109
|
+
promise.reject(handle);
|
|
110
|
+
handle.dispose();
|
|
111
|
+
});
|
|
112
|
+
return promise.handle;
|
|
113
|
+
});
|
|
114
|
+
const logger = vm.newFunction("relayLog", (level, ...values) => {
|
|
115
|
+
const text = limited(redact(values.map(value => {
|
|
116
|
+
const data = vm.dump(value);
|
|
117
|
+
return typeof data === "string" ? data : JSON.stringify(data);
|
|
118
|
+
}).join(" "), secrets));
|
|
119
|
+
logs.push({ level: vm.getString(level), text });
|
|
120
|
+
return vm.undefined;
|
|
121
|
+
});
|
|
122
|
+
vm.setProp(vm.global, "__relayCall", bridge);
|
|
123
|
+
bridge.dispose();
|
|
124
|
+
vm.setProp(vm.global, "__relayLog", logger);
|
|
125
|
+
logger.dispose();
|
|
126
|
+
try {
|
|
127
|
+
vm.unwrapResult(vm.evalCode(`
|
|
128
|
+
((call, log) => {
|
|
129
|
+
const hydrate = envelope => {
|
|
130
|
+
const value = envelope.value;
|
|
131
|
+
if (envelope.page !== undefined && value !== null) {
|
|
132
|
+
Object.defineProperties(value, {
|
|
133
|
+
hasNextPage: { value: () => value.nextCursor !== null },
|
|
134
|
+
getNextPage: { value: () => invoke('__pageNext', [envelope.page]) },
|
|
135
|
+
[Symbol.asyncIterator]: { value: async function* () {
|
|
136
|
+
let page = value;
|
|
137
|
+
while (page) { yield* page.data; page = await page.getNextPage(); }
|
|
138
|
+
} },
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
return value;
|
|
142
|
+
};
|
|
143
|
+
const invoke = (method, args) => call(method, JSON.stringify(args)).then(text => hydrate(JSON.parse(text)));
|
|
144
|
+
const client = Object.create(null);
|
|
145
|
+
for (const method of ${JSON.stringify([...methods.keys()])}) {
|
|
146
|
+
const parts = method.split('.'); let target = client;
|
|
147
|
+
for (const part of parts.slice(0, -1)) target = target[part] ??= Object.create(null);
|
|
148
|
+
target[parts[parts.length - 1]] = (...args) => invoke(method, args);
|
|
149
|
+
}
|
|
150
|
+
client.baseURL = ${JSON.stringify(client.baseURL ?? null)};
|
|
151
|
+
const freeze = value => { for (const key of Object.keys(value)) if (value[key] && typeof value[key] === 'object') freeze(value[key]); return Object.freeze(value); };
|
|
152
|
+
Object.defineProperty(globalThis, '__relayClient', { value: freeze(client) });
|
|
153
|
+
Object.defineProperty(globalThis, 'console', { value: Object.freeze(Object.fromEntries(['log','info','warn','error','debug'].map(level => [level, (...values) => log(level, ...values)]))) });
|
|
154
|
+
})(__relayCall, __relayLog);
|
|
155
|
+
delete globalThis.__relayCall; delete globalThis.__relayLog;
|
|
156
|
+
`, "relay-runtime.js")).dispose();
|
|
157
|
+
promiseHandle = vm.unwrapResult(vm.evalCode(`(async () => {
|
|
158
|
+
${javascript}
|
|
159
|
+
if (typeof run !== 'function') throw new Error('Define a top-level async function run(client).');
|
|
160
|
+
const result = await run(globalThis.__relayClient);
|
|
161
|
+
return JSON.stringify(result ?? null);
|
|
162
|
+
})()`, "relay-execute.js"));
|
|
163
|
+
for (;;) {
|
|
164
|
+
if (Date.now() >= deadline)
|
|
165
|
+
throw new Error("Execution timed out.");
|
|
166
|
+
if (outputError)
|
|
167
|
+
throw outputError;
|
|
168
|
+
const jobs = runtime.executePendingJobs();
|
|
169
|
+
if (jobs.error) {
|
|
170
|
+
const error = vm.dump(jobs.error);
|
|
171
|
+
jobs.error.dispose();
|
|
172
|
+
throw new Error(`Execution failed: ${JSON.stringify(error)}`);
|
|
173
|
+
}
|
|
174
|
+
const state = vm.getPromiseState(promiseHandle);
|
|
175
|
+
if (state.type === "fulfilled") {
|
|
176
|
+
const text = vm.getString(state.value);
|
|
177
|
+
state.value.dispose();
|
|
178
|
+
return { result: JSON.parse(limited(redact(text, secrets))), logs };
|
|
179
|
+
}
|
|
180
|
+
if (state.type === "rejected") {
|
|
181
|
+
const error = vm.dump(state.error);
|
|
182
|
+
state.error.dispose();
|
|
183
|
+
throw new Error(error?.message ?? JSON.stringify(error));
|
|
184
|
+
}
|
|
185
|
+
await new Promise(resolve => setTimeout(resolve, 2));
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
finally {
|
|
189
|
+
disposed = true;
|
|
190
|
+
abort.abort(new Error("Execution ended."));
|
|
191
|
+
promiseHandle?.dispose();
|
|
192
|
+
for (const promise of promises)
|
|
193
|
+
promise.dispose();
|
|
194
|
+
vm.dispose();
|
|
195
|
+
runtime.dispose();
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
//# sourceMappingURL=execute.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"execute.js","sourceRoot":"","sources":["../src/execute.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generated-docs.d.ts","sourceRoot":"","sources":["../src/generated-docs.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClD,eAAO,MAAM,WAAW;;;;CAIvB,CAAC;AACF,eAAO,MAAM,WAAW,EAAE,SAAS,SAAS,EAg/B3C,CAAC"}
|