@nuanu-ai/agentify 0.5.0 → 0.5.2

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/index.d.ts CHANGED
@@ -1,36 +1,24 @@
1
1
  /**
2
- * The Agentify merchant SDK: what someone else's engineer installs so that
3
- * their catalog sells to agents.
2
+ * The Agentify merchant SDK: what a merchant's engineer installs so that their
3
+ * catalog sells to agents.
4
4
  *
5
- * There are two things in here and they are one process. `createClient` builds
6
- * a handle on the gateway from a key and an address; through it a merchant
7
- * says what their process answers with `on`, opens one outgoing subscription
8
- * that carries paid orders, price questions and order events together, and
9
- * closes orders they took on earlier off the orders themselves. Beside it,
10
- * `checkCard` is the check a merchant runs on their own cards before
11
- * publishing them — the same check the documentation calls
12
- * `agentify verify`, which the published package installs as a command of
13
- * that name. The command's own insides are not exported: what a merchant calls
14
- * from their code is `checkCard`, and what they run from a terminal is the
15
- * command, and neither of those needs the other's exit codes.
5
+ * `createClient` builds a handle on the gateway from a key and an address.
6
+ * Through it a merchant says what their process answers with `on`, opens one
7
+ * outgoing subscription that carries paid orders, price questions and order
8
+ * events together, and closes orders they took on earlier. `checkCard` is the
9
+ * check a merchant runs on their own cards before publishing them; the package
10
+ * also installs it as the `agentify verify` command.
16
11
  *
17
- * Every call that can fail answers in one envelope — `ok` says which, and a
12
+ * Every call that can fail answers in one envelope: `ok` says which, and a
18
13
  * failure carries one `error` with a code, a sentence, whether repeating could
19
- * help, and the findings under `problems` where the call is refusing what it
20
- * was handed. What throws instead is a call with no such branch, as
21
- * `AgentifyError`, under the same codes.
14
+ * help, and the findings under `problems` where the call refuses what it was
15
+ * handed. A call with no such branch throws `AgentifyError` instead, under the
16
+ * same codes.
22
17
  *
23
- * The runtime dependency tree is minimal and listed in full: our own
24
- * `@nuanu-ai/agentify-contracts`, and zod underneath it, and nothing else. A merchant
25
- * installing the SDK into their production should know exactly what arrives
26
- * with it, rather than inherit a foreign package tree they would then be
27
- * maintaining themselves. Every new third-party package in this tree is a
28
- * recorded decision (ADR-0003 §8), and a test in this package holds the line.
29
- *
30
- * The types a merchant needs to write their own functions against — what a
31
- * card is, what an order carries, what a handler may answer — are re-exported
32
- * here from the contracts package, so that integration code has one import and
33
- * not two.
18
+ * The runtime dependencies are `@nuanu-ai/agentify-contracts` and zod beneath
19
+ * it, and nothing else. The types an integration is written against — a card,
20
+ * an order, a handler's answer — are re-exported here, so integration code
21
+ * needs one import.
34
22
  */
35
23
  export type { CallError, Card, CardInput, Delivery, Fulfillment, HandlerAnswer, MerchantFinding, Money, Order, OrderCallResponse, OrderCallResult, OrderEvent, OrderList, OrderStatus, OrderWithStatus, Problem, PublishResult, QuotePurpose, QuoteRequest, QuoteResponse, Refusal, RefusalCode, SalePrice, Shipment, ShipTo, } from "@nuanu-ai/agentify-contracts";
36
24
  export { CARD_REJECTED, MERCHANT_FINDINGS, ORDER_EVENT_TYPES, RECOMMENDED_REFUSAL_CODES, } from "@nuanu-ai/agentify-contracts";
package/dist/index.js CHANGED
@@ -1,36 +1,24 @@
1
1
  /**
2
- * The Agentify merchant SDK: what someone else's engineer installs so that
3
- * their catalog sells to agents.
2
+ * The Agentify merchant SDK: what a merchant's engineer installs so that their
3
+ * catalog sells to agents.
4
4
  *
5
- * There are two things in here and they are one process. `createClient` builds
6
- * a handle on the gateway from a key and an address; through it a merchant
7
- * says what their process answers with `on`, opens one outgoing subscription
8
- * that carries paid orders, price questions and order events together, and
9
- * closes orders they took on earlier off the orders themselves. Beside it,
10
- * `checkCard` is the check a merchant runs on their own cards before
11
- * publishing them — the same check the documentation calls
12
- * `agentify verify`, which the published package installs as a command of
13
- * that name. The command's own insides are not exported: what a merchant calls
14
- * from their code is `checkCard`, and what they run from a terminal is the
15
- * command, and neither of those needs the other's exit codes.
5
+ * `createClient` builds a handle on the gateway from a key and an address.
6
+ * Through it a merchant says what their process answers with `on`, opens one
7
+ * outgoing subscription that carries paid orders, price questions and order
8
+ * events together, and closes orders they took on earlier. `checkCard` is the
9
+ * check a merchant runs on their own cards before publishing them; the package
10
+ * also installs it as the `agentify verify` command.
16
11
  *
17
- * Every call that can fail answers in one envelope — `ok` says which, and a
12
+ * Every call that can fail answers in one envelope: `ok` says which, and a
18
13
  * failure carries one `error` with a code, a sentence, whether repeating could
19
- * help, and the findings under `problems` where the call is refusing what it
20
- * was handed. What throws instead is a call with no such branch, as
21
- * `AgentifyError`, under the same codes.
14
+ * help, and the findings under `problems` where the call refuses what it was
15
+ * handed. A call with no such branch throws `AgentifyError` instead, under the
16
+ * same codes.
22
17
  *
23
- * The runtime dependency tree is minimal and listed in full: our own
24
- * `@nuanu-ai/agentify-contracts`, and zod underneath it, and nothing else. A merchant
25
- * installing the SDK into their production should know exactly what arrives
26
- * with it, rather than inherit a foreign package tree they would then be
27
- * maintaining themselves. Every new third-party package in this tree is a
28
- * recorded decision (ADR-0003 §8), and a test in this package holds the line.
29
- *
30
- * The types a merchant needs to write their own functions against — what a
31
- * card is, what an order carries, what a handler may answer — are re-exported
32
- * here from the contracts package, so that integration code has one import and
33
- * not two.
18
+ * The runtime dependencies are `@nuanu-ai/agentify-contracts` and zod beneath
19
+ * it, and nothing else. The types an integration is written against — a card,
20
+ * an order, a handler's answer — are re-exported here, so integration code
21
+ * needs one import.
34
22
  */
35
23
  export { CARD_REJECTED, MERCHANT_FINDINGS, ORDER_EVENT_TYPES, RECOMMENDED_REFUSAL_CODES, } from "@nuanu-ai/agentify-contracts";
36
24
  export { checkCard } from "./check-card.js";
package/dist/schema.d.ts CHANGED
@@ -1,55 +1,31 @@
1
1
  /**
2
- * The small amount of schema machinery this package needs, written against the
3
- * shape of a result rather than against the library that produces it.
4
- *
5
- * The reason is the dependency tree a merchant installs. The SDK declares one
6
- * runtime dependency, `@nuanu-ai/agentify-contracts`, and zod arrives underneath it
7
- * (ADR-0003 §8). Importing zod here by name would add a package to that tree
8
- * without a recorded decision — and under a strict install it would not even
9
- * resolve, because zod is the contracts package's dependency and not ours. So
10
- * the schemas are used through the objects contracts exports, and where a type
11
- * has to be named at all it is named by its shape.
12
- *
13
- * Nothing here reimplements validation. The checking is the contracts
14
- * schemas', every time; this file only carries their findings across into the
15
- * shape a merchant reads.
2
+ * The little schema machinery this package needs, written against the shape of
3
+ * a result rather than against zod. zod arrives beneath
4
+ * `@nuanu-ai/agentify-contracts` and is not this package's dependency, so under
5
+ * a strict install it would not even resolve here. Nothing here validates; it
6
+ * carries the contract schemas' findings into the shape a merchant reads.
16
7
  */
17
8
  import type { Problem } from "@nuanu-ai/agentify-contracts";
18
9
  /**
19
- * One finding of a schema, as much of it as this package reads.
20
- *
21
- * `code` is optional because it is optional on the shape zod produces, and a
22
- * finding with no code still has a path and a sentence. Where it is missing
23
- * the translation below supplies one rather than leaving the field out: a
24
- * consumer branching on the code should never have to tell "no code" from "the
25
- * field did not arrive".
10
+ * One finding of a schema, as much of it as this package reads. A finding
11
+ * with no code is given `UNNAMED_FINDING`, so a consumer never has to tell "no
12
+ * code" from "the field did not arrive".
26
13
  */
27
14
  export interface SchemaIssue {
28
15
  readonly code?: string | undefined;
29
16
  readonly path: readonly PropertyKey[];
30
17
  readonly message: string;
31
18
  }
32
- /** The code a finding travels under when the schema did not name one. */
33
- export declare const UNNAMED_FINDING = "invalid";
34
19
  /**
35
- * A schema's findings, in the shape the publish call answers in.
36
- *
37
- * One shape for both sides is the point. A merchant who ran the check locally
38
- * and a merchant who published and was refused read the same object under the
39
- * same word — a path to the field, a code for their code, a sentence for the
40
- * person fixing it — so neither of the two has a reader of its own.
41
- *
42
- * The path is flattened to text because that is what the contract carries. An
43
- * index inside an array arrives as a number and would otherwise be a number in
44
- * one finding and a name in the next.
20
+ * A schema's findings, in the shape the publish call answers in, so a local
21
+ * check and a refused publish read the same. The path is flattened to text,
22
+ * since an array index would otherwise be a number in one finding and a name
23
+ * in the next.
45
24
  */
46
25
  export declare const problemsOf: (issues: readonly SchemaIssue[]) => Problem[];
47
26
  /**
48
- * The findings of a schema rendered as one block of text, one finding a line,
49
- * each pointing at the field it is about.
50
- *
51
- * A finding about the whole document has an empty path and is written as such
52
- * rather than with a blank where the field would be, so that "this is about
53
- * the card" and "the path went missing" do not look the same.
27
+ * The findings as one block of text, one a line, each pointing at its field.
28
+ * A finding with an empty path is written as about the card as a whole, so it
29
+ * cannot be mistaken for a path that went missing.
54
30
  */
55
31
  export declare const describeProblems: (problems: readonly Problem[]) => string;
package/dist/schema.js CHANGED
@@ -1,32 +1,17 @@
1
1
  /**
2
- * The small amount of schema machinery this package needs, written against the
3
- * shape of a result rather than against the library that produces it.
4
- *
5
- * The reason is the dependency tree a merchant installs. The SDK declares one
6
- * runtime dependency, `@nuanu-ai/agentify-contracts`, and zod arrives underneath it
7
- * (ADR-0003 §8). Importing zod here by name would add a package to that tree
8
- * without a recorded decision — and under a strict install it would not even
9
- * resolve, because zod is the contracts package's dependency and not ours. So
10
- * the schemas are used through the objects contracts exports, and where a type
11
- * has to be named at all it is named by its shape.
12
- *
13
- * Nothing here reimplements validation. The checking is the contracts
14
- * schemas', every time; this file only carries their findings across into the
15
- * shape a merchant reads.
2
+ * The little schema machinery this package needs, written against the shape of
3
+ * a result rather than against zod. zod arrives beneath
4
+ * `@nuanu-ai/agentify-contracts` and is not this package's dependency, so under
5
+ * a strict install it would not even resolve here. Nothing here validates; it
6
+ * carries the contract schemas' findings into the shape a merchant reads.
16
7
  */
17
8
  /** The code a finding travels under when the schema did not name one. */
18
- export const UNNAMED_FINDING = "invalid";
9
+ const UNNAMED_FINDING = "invalid";
19
10
  /**
20
- * A schema's findings, in the shape the publish call answers in.
21
- *
22
- * One shape for both sides is the point. A merchant who ran the check locally
23
- * and a merchant who published and was refused read the same object under the
24
- * same word — a path to the field, a code for their code, a sentence for the
25
- * person fixing it — so neither of the two has a reader of its own.
26
- *
27
- * The path is flattened to text because that is what the contract carries. An
28
- * index inside an array arrives as a number and would otherwise be a number in
29
- * one finding and a name in the next.
11
+ * A schema's findings, in the shape the publish call answers in, so a local
12
+ * check and a refused publish read the same. The path is flattened to text,
13
+ * since an array index would otherwise be a number in one finding and a name
14
+ * in the next.
30
15
  */
31
16
  export const problemsOf = (issues) => issues.map((issue) => ({
32
17
  path: issue.path.map(String),
@@ -34,12 +19,9 @@ export const problemsOf = (issues) => issues.map((issue) => ({
34
19
  message: issue.message,
35
20
  }));
36
21
  /**
37
- * The findings of a schema rendered as one block of text, one finding a line,
38
- * each pointing at the field it is about.
39
- *
40
- * A finding about the whole document has an empty path and is written as such
41
- * rather than with a blank where the field would be, so that "this is about
42
- * the card" and "the path went missing" do not look the same.
22
+ * The findings as one block of text, one a line, each pointing at its field.
23
+ * A finding with an empty path is written as about the card as a whole, so it
24
+ * cannot be mistaken for a path that went missing.
43
25
  */
44
26
  export const describeProblems = (problems) => problems
45
27
  .map((problem) => problem.path.length === 0
@@ -1,48 +1,17 @@
1
1
  /**
2
- * Making one call of the surface.
2
+ * Making one call of the surface. Every address, method and answer document
3
+ * comes from the route table in `@nuanu-ai/agentify-contracts`, and the key's
4
+ * header is built by `merchantKeyHeaderValue` from the same package, so this
5
+ * package writes down no path and no header of its own.
3
6
  *
4
- * Every address, method and answer document comes out of the route table in
5
- * `@nuanu-ai/agentify-contracts`. No path is written down in this package, and the
6
- * table's own `expandPath` does the substituting, because an identifier we
7
- * accept may hold a slash or a space and pasted into an address unencoded it
8
- * becomes two segments and a different route.
7
+ * The answer is read the same way whatever its HTTP status: the route's
8
+ * document if it is one, otherwise the gateway's error envelope if it is one,
9
+ * and only otherwise a failure this package describes itself, with the status.
9
10
  *
10
- * The table deliberately leaves out three things that a program actually
11
- * making the calls cannot avoid deciding, and it is worth saying here what was
12
- * decided, because each of them is a place where the two sides can disagree
13
- * without either of them noticing.
14
- *
15
- * The first is the header the merchant's key travels in. The table says which
16
- * door a call is behind and not how the door is built, so the choice is the
17
- * gateway's and ours to match — and matching it by each writing the same two
18
- * strings down was agreement by luck, where a call behind that door fails with
19
- * an authorisation error and nothing in either repository says why. So the name
20
- * and the scheme live in `@nuanu-ai/agentify-contracts`, in the one place both sides
21
- * already import: `merchantKeyHeaderValue` builds the value this package sends,
22
- * and `merchantKeyFrom` is what the gateway reads it back with.
23
- *
24
- * The second is the status code, about which the table says nothing either.
25
- * Some of the answers this surface gives are refusals that are still documents
26
- * — a card that was not accepted, an order call that did not go through — and
27
- * rather than guess which of those arrive under a 200 and which under a 400,
28
- * the answer is read the same way whatever the status. If the body is the
29
- * document the route names, that is the answer. Otherwise it is asked whether
30
- * it is the one envelope every route refuses in, and if it is, what the caller
31
- * is told is the gateway's own code and its own sentence rather than a
32
- * complaint from here about a document that did not parse — the gateway is the
33
- * side that knows why, and the reason it wrote is the only thing the caller
34
- * can act on. Only a body that is neither is a failure this package has to
35
- * describe itself, and then the status is part of what it says.
36
- *
37
- * The third is what a failure is at all. Nothing here throws: a call comes
38
- * back either as the document or as a failure carrying a sentence and, where
39
- * there was one, the body that could not be read. The layer above decides
40
- * which of those the merchant is entitled to see as a return value and which
41
- * is an exception, and that decision is in `client.ts`, where the contract
42
- * says which calls have a failure branch of their own. The body travels with
43
- * the failure because one caller needs it: a poll answer this SDK cannot parse
44
- * may still name the contract version the gateway speaks, and that is how a
45
- * genuine difference of dialects is told apart from a broken gateway.
11
+ * Nothing here throws. A call comes back as the document or as a failure;
12
+ * `client.ts` decides which failures a merchant sees returned and which
13
+ * thrown. The body travels with a failure because a poll answer this SDK
14
+ * cannot parse may still name the gateway's contract version.
46
15
  */
47
16
  import { API_ROUTES, type RouteName } from "@nuanu-ai/agentify-contracts";
48
17
  /** Where the gateway is and which key opens its doors. */
@@ -52,13 +21,10 @@ export interface Gateway {
52
21
  }
53
22
  /**
54
23
  * The document a route answers with, taken from the schema the table names.
55
- *
56
- * It is written against the shape of a parse result rather than with zod's own
57
- * `infer`, for the reason given in `schema.ts`: zod is not this package's
58
- * dependency to import. The effect is the same — rename a field in a contract
59
- * schema and the call sites here stop compiling.
24
+ * It reads the shape of a parse result rather than using zod's `infer`,
25
+ * because zod is not this package's to import (see `schema.ts`).
60
26
  */
61
- export type DocumentOf<N extends RouteName> = (typeof API_ROUTES)[N]["response"] extends {
27
+ type DocumentOf<N extends RouteName> = (typeof API_ROUTES)[N]["response"] extends {
62
28
  document: {
63
29
  safeParse(value: unknown): infer Result;
64
30
  };
@@ -67,20 +33,11 @@ export type DocumentOf<N extends RouteName> = (typeof API_ROUTES)[N]["response"]
67
33
  data: infer Document;
68
34
  } ? Document : never : never;
69
35
  /**
70
- * What is known about whether the call got there.
71
- *
72
- * Three and not two, and the third is the one that matters. A first draft had
73
- * a boolean, which meant every failure that was not an answer was filed as
74
- * "it did not reach us" — including a request that was fully sent and then
75
- * abandoned when the worker stopped, or one whose connection broke after the
76
- * gateway had it. Those are not the same fact, and a merchant reconciling
77
- * their books from the wrong one of them is reconciling from something we made
78
- * up.
79
- *
80
- * `not_received` is claimed only where the network says so plainly: the
81
- * connection was refused or the name did not resolve, so nothing was ever
82
- * handed over. Everything else that produced no readable answer is `unknown`,
83
- * because it is.
36
+ * What is known about whether the call got there. `not_received` is claimed
37
+ * only where the network says plainly that nothing was handed over: the
38
+ * connection was refused or the name did not resolve. Everything else without
39
+ * a readable answer is `unknown`, so that a merchant never reconciles their
40
+ * books from something this package made up.
84
41
  */
85
42
  export declare const REACH: Readonly<{
86
43
  /** No connection was made, so the gateway certainly has nothing. */
@@ -88,24 +45,18 @@ export declare const REACH: Readonly<{
88
45
  /** The gateway answered, and the answer is not one this package can read. */
89
46
  readonly ANSWERED: "answered";
90
47
  /**
91
- * The exchange was cut short. What the call did is not known here.
92
- *
93
- * Deliberately silent about direction, because three different things end
94
- * up here and they do not agree about it: an abort that may have fired
95
- * before the request left, a connection that broke once it was under way,
96
- * and an answer that started arriving and stopped. What they share is that
97
- * no complete answer was had, and that is all this may be read as saying.
48
+ * The exchange was cut short, and what the call did is not known here. It
49
+ * says nothing about direction: an abort may have fired before the request
50
+ * left, a connection may have broken under way, or an answer may have
51
+ * stopped arriving.
98
52
  */
99
53
  readonly UNKNOWN: "unknown";
100
54
  }>;
101
55
  export type Reach = (typeof REACH)[keyof typeof REACH];
102
56
  /**
103
- * What a failed `fetch` says about whether anything was handed over.
104
- *
105
- * Exported for its own test rather than only through a socket: the rule that
106
- * every address tried has to say nothing was sent — not merely one of them —
107
- * is not reachable from a test that can only produce one address at a time,
108
- * and a rule nothing checks is a rule that will be relaxed by accident.
57
+ * What a failed `fetch` says about whether anything was handed over: nothing,
58
+ * only where every address tried says so. Exported for its own test, which
59
+ * can produce several addresses where a socket test cannot.
109
60
  */
110
61
  export declare const reachOf: (cause: unknown) => Reach;
111
62
  /** A call that did not produce the document the route promises. */
@@ -116,30 +67,16 @@ export interface TransportFailure {
116
67
  /** What is known about whether the gateway got the call. */
117
68
  readonly reach: Reach;
118
69
  /**
119
- * The body, where it was JSON and simply was not the document.
120
- *
121
- * It is here for one reader: the poll loop, which looks in it for the
122
- * contract version, because a gateway of another dialect answers with
123
- * something this SDK cannot parse and would otherwise look exactly like a
124
- * broken one.
70
+ * The body, where it was JSON and was not the document. The poll loop looks
71
+ * in it for the contract version, which tells a gateway of another version
72
+ * apart from a broken one.
125
73
  */
126
74
  readonly body?: unknown;
127
75
  /**
128
- * The gateway's own refusal, where the answer was one.
129
- *
130
- * Present exactly when the body was the contract's error envelope, and it is
131
- * the difference between a failure this package had to describe and one the
132
- * gateway described itself. The two want different sentences in front of
133
- * them: everything else here is some flavour of "we cannot tell you what
134
- * happened", and this one is the gateway saying what it would not do and
135
- * why. It carries the code as a value and not only inside the sentence,
136
- * because a caller that wants to branch on the reason should not be parsing
137
- * prose to find it.
138
- *
139
- * `retryable` travels with it for the same reason and is the gateway's own
140
- * answer about its own refusal: whether making this call again could get
141
- * past it. Only the side that refused knows, and this package must not
142
- * improve on what it was told.
76
+ * The gateway's own refusal, present exactly when the body was the
77
+ * contract's error envelope. Its code and `retryable` are carried as values
78
+ * so a caller can branch without parsing prose, and `retryable` is the
79
+ * gateway's own answer, which this package does not second-guess.
143
80
  */
144
81
  readonly refusal?: {
145
82
  readonly code: string;
@@ -160,41 +97,24 @@ export interface CallOptions {
160
97
  readonly body?: unknown;
161
98
  readonly signal?: AbortSignal;
162
99
  }
163
- /** The address of one call: the gateway's base, then the route's own path. */
164
- export declare const addressOf: (baseUrl: string, name: RouteName, path: CallOptions["path"]) => string;
165
100
  /**
166
- * What is known about a failed call, in a clause that can be dropped into a
167
- * sentence about whatever the call was carrying.
168
- *
169
- * It lives here rather than in each caller so that the four cases are
170
- * described in one place and cannot drift into four different vocabularies.
171
- * Three of them are the reaches; the fourth is a refusal the gateway wrote in
172
- * words we recognise, which is the one failure here that is not a silence and
173
- * so does not belong to any of them.
101
+ * What is known about a failed call, as a clause to put before the failure's
102
+ * own `reason`: one for each reach, and one for a refusal the gateway wrote in
103
+ * words this package recognises.
174
104
  *
175
- * Each clause is held to what its own case actually knows, and the last reach
176
- * is the one that has to be written carefully, because it is one sentence in
177
- * front of three different situations. A call abandoned on an abort throws
178
- * with no code at all and may never have left this process. A connection that
179
- * broke in flight was certainly sent. And an answer that stopped mid-sentence
180
- * means the gateway certainly had the call — a status and part of a body came
181
- * back. So this clause says nothing about direction: not that the call was
182
- * sent, not that nothing came back, and not that whether it arrived is
183
- * unknown, because on the third road it is known and the answer is yes. What
184
- * the three share is that the exchange was cut short, and so what the call did
185
- * is not known — and that is the whole of what may be claimed here. The
186
- * specifics belong to the failure's own `reason`, which every caller prints
187
- * immediately after this clause and which names the road it came down.
105
+ * The clause for `unknown` covers three situations (an abort before sending, a
106
+ * connection broken in flight, an answer cut off mid-way), so it claims only
107
+ * that the exchange did not finish and what the call did is not known; the
108
+ * `reason` that follows names which it was.
188
109
  */
189
110
  export declare const whatIsKnown: (failure: TransportFailure) => string;
190
111
  /**
191
112
  * One call, answered with the route's document or with a sentence about why
192
- * there is no document.
113
+ * there is none.
193
114
  *
194
- * The cast at the end is the one place this file steps outside what the
195
- * compiler can follow. `API_ROUTES[name]` for an unresolved `name` is a union
196
- * of every route, so the schema reached at runtime is the right one while its
197
- * static type is the union of all of them. `DocumentOf<N>` names the same
198
- * schema for the caller, and the two are the same object.
115
+ * The cast at the end is safe though the compiler cannot follow it: for an
116
+ * unresolved `name` the static type of the schema is a union of every route's,
117
+ * while at runtime it is the right one.
199
118
  */
200
119
  export declare const callRoute: <N extends RouteName>(gateway: Gateway, name: N, options?: CallOptions) => Promise<Answer<N>>;
120
+ export {};