@nylorun/agents 0.9.0-beta → 0.11.0-beta

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.
Files changed (52) hide show
  1. package/CHANGELOG.md +165 -0
  2. package/README.md +296 -77
  3. package/dist/a2a/handler.d.ts +59 -0
  4. package/dist/a2a/handler.js +178 -0
  5. package/dist/a2a/index.d.ts +8 -0
  6. package/dist/a2a/index.js +7 -0
  7. package/dist/access.d.ts +101 -0
  8. package/dist/access.js +111 -0
  9. package/dist/action-handler.d.ts +63 -0
  10. package/dist/action-handler.js +279 -0
  11. package/dist/ag-ui/handler.d.ts +12 -4
  12. package/dist/ag-ui/handler.js +87 -281
  13. package/dist/ag-ui/index.d.ts +2 -1
  14. package/dist/ag-ui/index.js +2 -1
  15. package/dist/browser.d.ts +97 -0
  16. package/dist/browser.js +277 -0
  17. package/dist/client.d.ts +3 -230
  18. package/dist/client.js +3 -361
  19. package/dist/connection.d.ts +4 -4
  20. package/dist/connection.js +16 -25
  21. package/dist/delivery-token.d.ts +62 -0
  22. package/dist/delivery-token.js +159 -0
  23. package/dist/execute-action.d.ts +6 -0
  24. package/dist/execute-action.js +24 -0
  25. package/dist/http.d.ts +34 -3
  26. package/dist/http.js +68 -16
  27. package/dist/index.d.ts +10 -8
  28. package/dist/index.js +4 -4
  29. package/dist/sandbox/client.d.ts +4 -5
  30. package/dist/sandbox/client.js +4 -8
  31. package/dist/sandbox/index.d.ts +0 -2
  32. package/dist/sandbox/index.js +0 -1
  33. package/dist/served-definitions.d.ts +20 -0
  34. package/dist/served-definitions.js +100 -0
  35. package/dist/session-client.d.ts +282 -0
  36. package/dist/session-client.js +375 -0
  37. package/dist/sse.js +12 -0
  38. package/dist/studio-embed.d.ts +9 -0
  39. package/dist/studio-embed.js +8 -0
  40. package/dist/token-endpoint.d.ts +23 -0
  41. package/dist/token-endpoint.js +30 -0
  42. package/package.json +15 -8
  43. package/dist/ag-ui/history.d.ts +0 -7
  44. package/dist/ag-ui/history.js +0 -60
  45. package/dist/ag-ui/sse.d.ts +0 -9
  46. package/dist/ag-ui/sse.js +0 -7
  47. package/dist/ag-ui/translate.d.ts +0 -38
  48. package/dist/ag-ui/translate.js +0 -222
  49. package/dist/derived-credentials.d.ts +0 -5
  50. package/dist/derived-credentials.js +0 -17
  51. package/dist/executor.d.ts +0 -20
  52. package/dist/executor.js +0 -417
@@ -0,0 +1,178 @@
1
+ import { createClient } from "../client.js";
2
+ import { IncompatibleRuntimeError, RuntimeError } from "../http.js";
3
+ /** The Host feature the handler forwards to. */
4
+ const REQUIRED_FEATURE = "a2a-endpoint";
5
+ /** A2A callers run tasks in their own sessions; nothing else. */
6
+ const SCOPES = ["sessions:own"];
7
+ const CARD_PATH = [".well-known", "agent-card.json"];
8
+ class Problem extends Error {
9
+ status;
10
+ code;
11
+ headers;
12
+ constructor(status, message, code, headers = {}) {
13
+ super(message);
14
+ this.status = status;
15
+ this.code = code;
16
+ this.headers = headers;
17
+ }
18
+ }
19
+ function problem(failure) {
20
+ return Response.json({ error: failure.message, ...(failure.code ? { code: failure.code } : {}) }, { status: failure.status, headers: failure.headers });
21
+ }
22
+ function problemOf(error) {
23
+ if (error instanceof Problem)
24
+ return error;
25
+ if (error instanceof IncompatibleRuntimeError)
26
+ return new Problem(502, error.message, "runtime_incompatible");
27
+ if (error instanceof RuntimeError && error.status === 404)
28
+ return new Problem(404, "Not found");
29
+ return new Problem(502, "The agent service failed", "runtime_error");
30
+ }
31
+ function normalizeBase(basePath = "/") {
32
+ const trimmed = basePath.replace(/\/+$/, "");
33
+ return trimmed === "" ? "" : trimmed.startsWith("/") ? trimmed : `/${trimmed}`;
34
+ }
35
+ export function createA2aHandler(options) {
36
+ const allowed = new Set(options.agents.map((agent) => (typeof agent === "string" ? agent : agent.id)));
37
+ const base = normalizeBase(options.basePath);
38
+ const publicUrl = options.publicUrl?.replace(/\/+$/, "");
39
+ if (publicUrl !== undefined && !/^https?:\/\//.test(publicUrl))
40
+ throw new TypeError("createA2aHandler: publicUrl must be an http(s) URL");
41
+ let ready;
42
+ /** The client, once the Runtime is known to serve A2A. Retries after a failure. */
43
+ function connected() {
44
+ ready ??= (async () => {
45
+ const client = await (options.client ?? createClient());
46
+ const features = await client.hostFeatures();
47
+ if (!features.includes(REQUIRED_FEATURE))
48
+ throw new Problem(502, `The Runtime does not support ${REQUIRED_FEATURE}; upgrade the stack (nylorun up).`, "runtime_feature_missing");
49
+ return client;
50
+ })();
51
+ ready.catch(() => {
52
+ ready = undefined;
53
+ });
54
+ return ready;
55
+ }
56
+ const runtimePath = (agentId) => `/v1/a2a/agents/${encodeURIComponent(agentId)}`;
57
+ async function callerOf(request, agentId) {
58
+ const found = await options.subject(request);
59
+ if (!found)
60
+ throw new Problem(401, "Authentication required");
61
+ const caller = typeof found === "string" ? { subject: found } : found;
62
+ // An agent this partner may not use is the same 404 as one that does not exist.
63
+ if (caller.agents !== undefined && !caller.agents.includes(agentId))
64
+ throw new Problem(404, "Not found");
65
+ return caller.subject;
66
+ }
67
+ async function call(request, agentId) {
68
+ try {
69
+ if (!allowed.has(agentId))
70
+ throw new Problem(404, "Not found");
71
+ const subject = await callerOf(request, agentId);
72
+ const client = await connected();
73
+ let runtime;
74
+ try {
75
+ runtime = client.as(subject, { scopes: SCOPES });
76
+ }
77
+ catch (error) {
78
+ // The host's `subject` returned something the Runtime cannot name (see `as`).
79
+ throw new Problem(500, error.message, "subject_invalid");
80
+ }
81
+ const headers = {};
82
+ const version = request.headers.get("a2a-version") ??
83
+ new URL(request.url).searchParams.get("A2A-Version");
84
+ if (version !== null)
85
+ headers["A2A-Version"] = version;
86
+ const extensions = request.headers.get("a2a-extensions");
87
+ if (extensions !== null)
88
+ headers["A2A-Extensions"] = extensions;
89
+ const response = await runtime.transport.forward(runtimePath(agentId), {
90
+ method: "POST",
91
+ body: await request.text(),
92
+ headers,
93
+ signal: request.signal,
94
+ });
95
+ if (response.ok)
96
+ return new Response(response.body, {
97
+ status: response.status,
98
+ headers: { "content-type": response.headers.get("content-type") ?? "application/json" },
99
+ });
100
+ await response.body?.cancel().catch(() => { });
101
+ if (response.status === 404)
102
+ throw new Problem(404, "Not found");
103
+ if (response.status === 429)
104
+ throw new Problem(429, "Too many requests", "limit_exceeded", {
105
+ ...(response.headers.get("retry-after")
106
+ ? { "retry-after": response.headers.get("retry-after") }
107
+ : {}),
108
+ });
109
+ if (response.status === 503)
110
+ throw new Problem(503, "The agent service is unavailable", "runtime_unavailable");
111
+ throw new Problem(502, "The agent service failed", "runtime_error");
112
+ }
113
+ catch (error) {
114
+ return problem(problemOf(error));
115
+ }
116
+ }
117
+ async function card(request, agentId) {
118
+ try {
119
+ if (!allowed.has(agentId))
120
+ throw new Problem(404, "Not found");
121
+ const client = await connected();
122
+ const template = await client.transport.json(`${runtimePath(agentId)}/card`);
123
+ const root = publicUrl ?? `${new URL(request.url).origin}${base}`;
124
+ const extra = options.card ?? {};
125
+ return Response.json({
126
+ ...template,
127
+ supportedInterfaces: [
128
+ {
129
+ url: `${root}/${encodeURIComponent(agentId)}`,
130
+ protocolBinding: "JSONRPC",
131
+ protocolVersion: "1.0",
132
+ },
133
+ ],
134
+ ...(extra.provider ? { provider: extra.provider } : {}),
135
+ ...(extra.documentationUrl ? { documentationUrl: extra.documentationUrl } : {}),
136
+ ...(extra.iconUrl ? { iconUrl: extra.iconUrl } : {}),
137
+ ...(extra.securitySchemes ? { securitySchemes: extra.securitySchemes } : {}),
138
+ ...(extra.securityRequirements
139
+ ? { securityRequirements: extra.securityRequirements }
140
+ : {}),
141
+ }, { headers: { "cache-control": "public, max-age=300" } });
142
+ }
143
+ catch (error) {
144
+ return problem(problemOf(error));
145
+ }
146
+ }
147
+ async function route(request) {
148
+ const path = new URL(request.url).pathname;
149
+ if (path !== base && !path.startsWith(`${base}/`))
150
+ return problem(new Problem(404, "Not found"));
151
+ let segments;
152
+ try {
153
+ segments = path
154
+ .slice(base.length)
155
+ .split("/")
156
+ .slice(1)
157
+ .map((segment) => decodeURIComponent(segment));
158
+ }
159
+ catch {
160
+ return problem(new Problem(404, "Not found"));
161
+ }
162
+ if (segments.some((segment) => segment === ""))
163
+ return problem(new Problem(404, "Not found"));
164
+ const [agentId, ...rest] = segments;
165
+ if (!agentId || !allowed.has(agentId))
166
+ return problem(new Problem(404, "Not found"));
167
+ const method = request.method.toUpperCase();
168
+ const only = (allow, handle) => method === allow
169
+ ? handle()
170
+ : Promise.resolve(problem(new Problem(405, "Method not allowed", undefined, { allow })));
171
+ if (rest.length === 0)
172
+ return only("POST", () => call(request, agentId));
173
+ if (rest.length === 2 && rest[0] === CARD_PATH[0] && rest[1] === CARD_PATH[1])
174
+ return only("GET", () => card(request, agentId));
175
+ return problem(new Problem(404, "Not found"));
176
+ }
177
+ return { fetch: route, call, card };
178
+ }
@@ -0,0 +1,8 @@
1
+ /**
2
+ * `@nylorun/agents/a2a`: serve the Tenant's agents to A2A clients through the app's own server
3
+ * (gateway mode). The handler forwards A2A requests to the Runtime, which speaks the protocol;
4
+ * this entry point loads no A2A package.
5
+ */
6
+ export { createA2aHandler } from "./handler.js";
7
+ export type { A2aCaller, A2aCardOptions, A2aHandler, A2aHandlerOptions, } from "./handler.js";
8
+ export { toNodeListener } from "../ag-ui/node.js";
@@ -0,0 +1,7 @@
1
+ /**
2
+ * `@nylorun/agents/a2a`: serve the Tenant's agents to A2A clients through the app's own server
3
+ * (gateway mode). The handler forwards A2A requests to the Runtime, which speaks the protocol;
4
+ * this entry point loads no A2A package.
5
+ */
6
+ export { createA2aHandler } from "./handler.js";
7
+ export { toNodeListener } from "../ag-ui/node.js";
@@ -0,0 +1,101 @@
1
+ /**
2
+ * Subject tokens and access management for app servers (Host feature `subject-tokens`), on the
3
+ * application key. `client.tokens.create` mints a short-lived token for one signed-in person;
4
+ * `client.access` manages the policy that decides what each role may do, the signing keys and
5
+ * revocations. Each call checks the Host feature before sending anything.
6
+ */
7
+ import type { AccessPolicy, CreateTokenResponse, Jwks, PublishableKey, SigningKeyView, TokenScope } from "@nylorun/core/contracts";
8
+ import { type Transport } from "./http.js";
9
+ export interface CreateTokenOptions {
10
+ /** The person the token is for, e.g. `app:42`. */
11
+ subject: string;
12
+ /** A role of the Tenant's access policy. */
13
+ role: string;
14
+ /** Narrow the role's scopes. Default: all of the role's scopes. */
15
+ scopes?: readonly TokenScope[];
16
+ /** Narrow the role's agents. Default: all of the role's agents. */
17
+ agents?: readonly string[];
18
+ /** 60 to 900 seconds, at most the policy's `maxTtlSeconds`. Default: that maximum. */
19
+ ttlSeconds?: number;
20
+ signal?: AbortSignal;
21
+ }
22
+ export declare class TokensClient {
23
+ private readonly transport;
24
+ constructor(transport: Transport);
25
+ /** Mints a subject token. Only the application key may; never acting for a subject. */
26
+ create(options: CreateTokenOptions): Promise<CreateTokenResponse>;
27
+ }
28
+ export declare class SigningKeysClient {
29
+ private readonly transport;
30
+ constructor(transport: Transport);
31
+ list(options?: {
32
+ signal?: AbortSignal;
33
+ }): Promise<SigningKeyView[]>;
34
+ /**
35
+ * standby → current → previous → revoked, and a new standby. Refused while the previous key
36
+ * may still verify live tokens; `force` skips that and signs those tokens out.
37
+ */
38
+ rotate(options?: {
39
+ force?: boolean;
40
+ signal?: AbortSignal;
41
+ }): Promise<SigningKeyView[]>;
42
+ /** Revokes a previous or standby key; the current key must be rotated first. */
43
+ revoke(keyId: string, options?: {
44
+ signal?: AbortSignal;
45
+ }): Promise<SigningKeyView>;
46
+ }
47
+ /**
48
+ * Publishable keys (Host feature `browser-access`): shipped in a web page or an app, they name
49
+ * the Tenant and the app, and list the origins a browser may use them from.
50
+ */
51
+ export declare class PublishableKeysClient {
52
+ private readonly transport;
53
+ constructor(transport: Transport);
54
+ list(options?: {
55
+ signal?: AbortSignal;
56
+ }): Promise<PublishableKey[]>;
57
+ /**
58
+ * A new key. `origins` are exact origins (`https://app.example.com`) or
59
+ * `http://localhost:*`; `[]` allows native apps only.
60
+ */
61
+ create(options: {
62
+ name: string;
63
+ origins: readonly string[];
64
+ signal?: AbortSignal;
65
+ }): Promise<PublishableKey>;
66
+ /** Replaces the key's origins. */
67
+ update(keyId: string, options: {
68
+ origins: readonly string[];
69
+ signal?: AbortSignal;
70
+ }): Promise<PublishableKey>;
71
+ /** Revokes the key: every request that sends it gets the opaque 404. */
72
+ revoke(keyId: string, options?: {
73
+ signal?: AbortSignal;
74
+ }): Promise<PublishableKey>;
75
+ }
76
+ export declare class AccessClient {
77
+ private readonly transport;
78
+ readonly signingKeys: SigningKeysClient;
79
+ readonly publishableKeys: PublishableKeysClient;
80
+ constructor(transport: Transport);
81
+ getPolicy(options?: {
82
+ signal?: AbortSignal;
83
+ }): Promise<AccessPolicy>;
84
+ putPolicy(policy: AccessPolicy, options?: {
85
+ signal?: AbortSignal;
86
+ }): Promise<AccessPolicy>;
87
+ /**
88
+ * Ends every token minted so far for `subject` and its open streams. Running turns continue;
89
+ * cancel them separately if they must stop.
90
+ */
91
+ revokeSubject(subject: string, options?: {
92
+ signal?: AbortSignal;
93
+ }): Promise<{
94
+ subject: string;
95
+ epoch: number;
96
+ }>;
97
+ /** The public keys that verify the Tenant's subject tokens. */
98
+ jwks(options?: {
99
+ signal?: AbortSignal;
100
+ }): Promise<Jwks>;
101
+ }
package/dist/access.js ADDED
@@ -0,0 +1,111 @@
1
+ import { id, segment } from "./http.js";
2
+ const FEATURE = "subject-tokens";
3
+ export class TokensClient {
4
+ transport;
5
+ constructor(transport) {
6
+ this.transport = transport;
7
+ }
8
+ /** Mints a subject token. Only the application key may; never acting for a subject. */
9
+ async create(options) {
10
+ await this.transport.requireFeature(FEATURE, options.signal);
11
+ return this.transport.json("/v1/tokens", "POST", {
12
+ requestId: id(),
13
+ subject: options.subject,
14
+ role: options.role,
15
+ ...(options.scopes ? { scopes: [...options.scopes] } : {}),
16
+ ...(options.agents ? { agents: [...options.agents] } : {}),
17
+ ...(options.ttlSeconds === undefined ? {} : { ttlSeconds: options.ttlSeconds }),
18
+ }, options.signal);
19
+ }
20
+ }
21
+ export class SigningKeysClient {
22
+ transport;
23
+ constructor(transport) {
24
+ this.transport = transport;
25
+ }
26
+ async list(options = {}) {
27
+ await this.transport.requireFeature(FEATURE, options.signal);
28
+ const reply = await this.transport.json("/v1/access/signing-keys", "GET", undefined, options.signal);
29
+ return reply.keys;
30
+ }
31
+ /**
32
+ * standby → current → previous → revoked, and a new standby. Refused while the previous key
33
+ * may still verify live tokens; `force` skips that and signs those tokens out.
34
+ */
35
+ async rotate(options = {}) {
36
+ await this.transport.requireFeature(FEATURE, options.signal);
37
+ const reply = await this.transport.json("/v1/access/signing-keys/rotate", "POST", { requestId: id(), ...(options.force ? { force: true } : {}) }, options.signal);
38
+ return reply.keys;
39
+ }
40
+ /** Revokes a previous or standby key; the current key must be rotated first. */
41
+ async revoke(keyId, options = {}) {
42
+ await this.transport.requireFeature(FEATURE, options.signal);
43
+ return this.transport.json(`/v1/access/signing-keys/${segment(keyId)}/revoke`, "POST", { requestId: id() }, options.signal);
44
+ }
45
+ }
46
+ /**
47
+ * Publishable keys (Host feature `browser-access`): shipped in a web page or an app, they name
48
+ * the Tenant and the app, and list the origins a browser may use them from.
49
+ */
50
+ export class PublishableKeysClient {
51
+ transport;
52
+ constructor(transport) {
53
+ this.transport = transport;
54
+ }
55
+ async list(options = {}) {
56
+ await this.transport.requireFeature("browser-access", options.signal);
57
+ const reply = await this.transport.json("/v1/access/publishable-keys", "GET", undefined, options.signal);
58
+ return reply.keys;
59
+ }
60
+ /**
61
+ * A new key. `origins` are exact origins (`https://app.example.com`) or
62
+ * `http://localhost:*`; `[]` allows native apps only.
63
+ */
64
+ async create(options) {
65
+ await this.transport.requireFeature("browser-access", options.signal);
66
+ return this.transport.json("/v1/access/publishable-keys", "POST", { requestId: id(), name: options.name, origins: [...options.origins] }, options.signal);
67
+ }
68
+ /** Replaces the key's origins. */
69
+ async update(keyId, options) {
70
+ await this.transport.requireFeature("browser-access", options.signal);
71
+ return this.transport.json(`/v1/access/publishable-keys/${segment(keyId)}`, "PUT", { requestId: id(), origins: [...options.origins] }, options.signal);
72
+ }
73
+ /** Revokes the key: every request that sends it gets the opaque 404. */
74
+ async revoke(keyId, options = {}) {
75
+ await this.transport.requireFeature("browser-access", options.signal);
76
+ return this.transport.json(`/v1/access/publishable-keys/${segment(keyId)}`, "DELETE", undefined, options.signal);
77
+ }
78
+ }
79
+ export class AccessClient {
80
+ transport;
81
+ signingKeys;
82
+ publishableKeys;
83
+ constructor(transport) {
84
+ this.transport = transport;
85
+ this.signingKeys = new SigningKeysClient(transport);
86
+ this.publishableKeys = new PublishableKeysClient(transport);
87
+ }
88
+ async getPolicy(options = {}) {
89
+ await this.transport.requireFeature(FEATURE, options.signal);
90
+ const reply = await this.transport.json("/v1/access/policy", "GET", undefined, options.signal);
91
+ return reply.policy;
92
+ }
93
+ async putPolicy(policy, options = {}) {
94
+ await this.transport.requireFeature(FEATURE, options.signal);
95
+ const reply = await this.transport.json("/v1/access/policy", "PUT", { requestId: id(), policy }, options.signal);
96
+ return reply.policy;
97
+ }
98
+ /**
99
+ * Ends every token minted so far for `subject` and its open streams. Running turns continue;
100
+ * cancel them separately if they must stop.
101
+ */
102
+ async revokeSubject(subject, options = {}) {
103
+ await this.transport.requireFeature(FEATURE, options.signal);
104
+ return this.transport.json("/v1/access/revocations", "POST", { requestId: id(), subject }, options.signal);
105
+ }
106
+ /** The public keys that verify the Tenant's subject tokens. */
107
+ async jwks(options = {}) {
108
+ await this.transport.requireFeature(FEATURE, options.signal);
109
+ return this.transport.json("/v1/access/jwks", "GET", undefined, options.signal);
110
+ }
111
+ }
@@ -0,0 +1,63 @@
1
+ import { type EndpointPingResponse } from "@nylorun/core/contracts";
2
+ import type { BuiltWorkflow } from "@nylorun/core/define";
3
+ import { toNodeListener } from "./ag-ui/node.js";
4
+ import { type AgentSource, type AgentsClient } from "./client.js";
5
+ export interface ActionHandlerOptions {
6
+ /** The agents and workflows this endpoint serves. Agents they embed are served too. */
7
+ agents: readonly (AgentSource | BuiltWorkflow)[];
8
+ /**
9
+ * Application client, used by `register` (and, when `runtime` is not set, to read the
10
+ * Tenant's public keys). Default: `createClient()`, from the environment or the Project link.
11
+ */
12
+ client?: AgentsClient | Promise<AgentsClient>;
13
+ /**
14
+ * Where to read the Tenant's public keys without a key. Set it for a process that only
15
+ * serves Actions and holds no application key.
16
+ */
17
+ runtime?: {
18
+ url: string;
19
+ fetch?: typeof fetch;
20
+ };
21
+ /** The Tenant's public keys, instead of reading them from the Runtime. */
22
+ jwks?: {
23
+ keys: readonly JsonWebKey[];
24
+ };
25
+ /**
26
+ * The URL the Runtime calls, as registered. Every delivery token must name it. Default: the
27
+ * URL passed to `register` in this process; until then, any URL of the Tenant.
28
+ */
29
+ url?: string;
30
+ /** Registered with each endpoint. Default: `NYLORUN_IMPLEMENTATION_VERSION`, else `dev`. */
31
+ implementationVersion?: string;
32
+ /** Receives errors that are answered with a status instead of thrown. */
33
+ onError?: (error: unknown) => void;
34
+ /**
35
+ * Keeps the process alive for a background tool's work after its `202` answer, on platforms
36
+ * that end a request's work with its response (for example a serverless platform's
37
+ * `waitUntil`). A Node server needs nothing.
38
+ */
39
+ waitUntil?: (work: Promise<unknown>) => void;
40
+ }
41
+ export interface RegisterOptions {
42
+ /** The URL the Runtime calls, e.g. `http://localhost:3000/nylorun/actions`. */
43
+ url: string;
44
+ /** Save the definitions first. Default true. */
45
+ saveDefinitions?: boolean;
46
+ /** How long one inline delivery may take, in milliseconds. */
47
+ timeoutMs?: number;
48
+ /** In-flight deliveries per agent. */
49
+ maxConcurrent?: number;
50
+ signal?: AbortSignal;
51
+ }
52
+ export interface ActionHandler {
53
+ /** A web-standard handler: Hono, Next.js route handlers, Workers, Bun, Deno. */
54
+ fetch(request: Request): Promise<Response>;
55
+ /** The same handler for `node:http` and Express. */
56
+ readonly node: ReturnType<typeof toNodeListener>;
57
+ /**
58
+ * Saves the definitions, points the Runtime at `url` for every served agent and pings each
59
+ * one through the Runtime, so a wrong URL or a tunnel that is down fails here.
60
+ */
61
+ register(options: RegisterOptions): Promise<EndpointPingResponse[]>;
62
+ }
63
+ export declare function createActionHandler(options: ActionHandlerOptions): ActionHandler;