ankka 0.10.0 → 0.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -0
- package/dist/_proto/ankka/protocol/v1/agent_pb.d.ts +35 -0
- package/dist/_proto/ankka/protocol/v1/agent_pb.js +8 -1
- package/dist/_proto/ankka/protocol/v1/client_pb.d.ts +858 -2
- package/dist/_proto/ankka/protocol/v1/client_pb.js +184 -9
- package/dist/_proto/ankka/protocol/v1/consumer_pb.d.ts +10 -1
- package/dist/_proto/ankka/protocol/v1/consumer_pb.js +1 -1
- package/dist/_proto/ankka/protocol/v1/discovery_pb.d.ts +373 -0
- package/dist/_proto/ankka/protocol/v1/discovery_pb.js +81 -16
- package/dist/_proto/ankka/protocol/v1/endpoint_pb.d.ts +210 -0
- package/dist/_proto/ankka/protocol/v1/endpoint_pb.js +35 -5
- package/dist/_proto/ankka/protocol/v1/event_sourced_pb.d.ts +86 -0
- package/dist/_proto/ankka/protocol/v1/event_sourced_pb.js +11 -1
- package/dist/_proto/ankka/protocol/v1/payload_pb.d.ts +61 -0
- package/dist/_proto/ankka/protocol/v1/payload_pb.js +18 -1
- package/dist/_proto/ankka/protocol/v1/view_pb.d.ts +70 -1
- package/dist/_proto/ankka/protocol/v1/view_pb.js +11 -1
- package/dist/_proto/ankka/protocol/v1/wasm_pb.d.ts +12 -0
- package/dist/_proto/ankka/protocol/v1/wasm_pb.js +1 -1
- package/dist/_proto/ankka/protocol/v1/workflow_pb.d.ts +7 -0
- package/dist/_proto/ankka/protocol/v1/workflow_pb.js +1 -1
- package/dist/agent.d.ts +15 -1
- package/dist/agent.js +20 -0
- package/dist/approvals.d.ts +47 -0
- package/dist/approvals.js +57 -0
- package/dist/autonomous.d.ts +23 -1
- package/dist/autonomous.js +30 -1
- package/dist/client.d.ts +188 -7
- package/dist/client.js +490 -21
- package/dist/consumer.d.ts +42 -3
- package/dist/consumer.js +35 -1
- package/dist/context.d.ts +29 -1
- package/dist/context.js +5 -2
- package/dist/contract.d.ts +40 -0
- package/dist/contract.js +60 -0
- package/dist/effects/common.d.ts +7 -0
- package/dist/effects/common.js +9 -1
- package/dist/effects/eventSourced.d.ts +26 -1
- package/dist/effects/eventSourced.js +58 -5
- package/dist/effects/keyed.d.ts +33 -0
- package/dist/effects/keyed.js +41 -0
- package/dist/endpoint.d.ts +10 -1
- package/dist/endpoint.js +20 -0
- package/dist/eventSourcedEntity.d.ts +8 -3
- package/dist/graph.d.ts +24 -2
- package/dist/graph.js +27 -1
- package/dist/handlers.d.ts +10 -2
- package/dist/handlers.js +6 -2
- package/dist/index.d.ts +15 -6
- package/dist/index.js +12 -3
- package/dist/keyedView.d.ts +59 -0
- package/dist/keyedView.js +73 -0
- package/dist/kinds.js +2 -0
- package/dist/mcp.d.ts +57 -0
- package/dist/mcp.js +64 -0
- package/dist/routes.d.ts +44 -4
- package/dist/routes.js +43 -4
- package/dist/server/agent.js +12 -4
- package/dist/server/discovery.d.ts +17 -1
- package/dist/server/discovery.js +182 -1
- package/dist/server/eventSourced.d.ts +4 -1
- package/dist/server/eventSourced.js +24 -6
- package/dist/server/http.d.ts +2 -1
- package/dist/server/http.js +80 -4
- package/dist/server/stateless.js +42 -3
- package/dist/server/workflow.js +5 -1
- package/dist/service.d.ts +46 -2
- package/dist/service.js +235 -15
- package/dist/services.d.ts +137 -0
- package/dist/services.js +259 -0
- package/dist/socket.d.ts +15 -0
- package/dist/socket.js +25 -0
- package/dist/spec.d.ts +1 -1
- package/dist/spec.js +94 -15
- package/dist/standing.d.ts +18 -0
- package/dist/standing.js +26 -0
- package/dist/startFrom.d.ts +36 -0
- package/dist/startFrom.js +51 -0
- package/dist/testkit/index.d.ts +2 -2
- package/dist/testkit/index.js +1 -1
- package/dist/testkit/integration.js +5 -0
- package/dist/testkit/kinds.d.ts +50 -5
- package/dist/testkit/kinds.js +208 -35
- package/dist/testkit/unit.d.ts +41 -3
- package/dist/testkit/unit.js +87 -10
- package/dist/timedAction.d.ts +17 -2
- package/dist/timedAction.js +33 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/view.d.ts +48 -1
- package/dist/view.js +18 -1
- package/dist/workflow.d.ts +18 -1
- package/dist/workflow.js +39 -0
- package/package.json +3 -2
package/dist/client.d.ts
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import { type Client as ConnectClient, type Transport } from "@connectrpc/connect";
|
|
2
2
|
import { Client } from "./_proto/ankka/protocol/v1/client_pb.ts";
|
|
3
3
|
import { jsonCodec, type Shape } from "./codec.ts";
|
|
4
|
-
import { type Metadata } from "./effects/common.ts";
|
|
4
|
+
import { CommandError, type Metadata } from "./effects/common.ts";
|
|
5
5
|
import type { HandlerRef } from "./handlers.ts";
|
|
6
6
|
import { type ComponentKind } from "./kinds.ts";
|
|
7
|
-
import
|
|
7
|
+
import { Duration } from "./time.ts";
|
|
8
8
|
import { AutonomousAgentCalls, TaskCalls, Tasks } from "./autonomous.ts";
|
|
9
|
+
import { type AgentOutcome, type DecisionInput } from "./approvals.ts";
|
|
9
10
|
/** A component class as the typed client sees it: an id and, on its prototype, its kind. */
|
|
10
11
|
export interface ComponentRef {
|
|
11
12
|
readonly componentId: string;
|
|
@@ -18,21 +19,78 @@ interface Connection {
|
|
|
18
19
|
transport: Transport | undefined;
|
|
19
20
|
stub: ConnectClient<typeof Client> | undefined;
|
|
20
21
|
}
|
|
22
|
+
/** The first protocol whose runtime can wait for a workflow's end; an older one answers `UNIMPLEMENTED`. */
|
|
23
|
+
export declare const AWAIT_SINCE = "1.18";
|
|
24
|
+
/** One part of a wait served as a stream: the wait goes on, or how it ended. */
|
|
25
|
+
export type AwaitPart<S> = {
|
|
26
|
+
readonly kind: "heartbeat";
|
|
27
|
+
} | {
|
|
28
|
+
readonly kind: "ended";
|
|
29
|
+
readonly state: S;
|
|
30
|
+
} | {
|
|
31
|
+
readonly kind: "failed";
|
|
32
|
+
readonly error: CommandError;
|
|
33
|
+
} | {
|
|
34
|
+
readonly kind: "timed-out";
|
|
35
|
+
readonly message: string;
|
|
36
|
+
};
|
|
37
|
+
/** A part as one line of JSON, which is what an `sse` route yields for it. */
|
|
38
|
+
export declare function awaitPartJson<S>(part: AwaitPart<S>): string;
|
|
21
39
|
/** One call, ready to invoke or stream. */
|
|
22
40
|
export declare class Invocation<I, R> {
|
|
23
41
|
#private;
|
|
24
|
-
constructor(connection: Connection, metadata: Metadata, kind: ComponentKind, componentId: string, entityId: string, name: string, input: Shape<I> | undefined, reply: Shape<R> | undefined);
|
|
25
|
-
/**
|
|
42
|
+
constructor(connection: Connection, metadata: Metadata, kind: ComponentKind, componentId: string, entityId: string, name: string, input: Shape<I> | undefined, reply: Shape<R> | undefined, state?: Shape<unknown>);
|
|
43
|
+
/**
|
|
44
|
+
* Invokes and decodes the reply; a refusal rejects with `CommandError`. An agent's turn that waits for a
|
|
45
|
+
* person rejects with `ApprovalAwaited`; `ask` answers it instead.
|
|
46
|
+
*/
|
|
26
47
|
invoke(input?: I): Promise<R>;
|
|
27
|
-
/**
|
|
48
|
+
/**
|
|
49
|
+
* Sends this command to the workflow and then waits for its end, as one call: answered with the state it
|
|
50
|
+
* ended with, within `timeoutMillis` of the command being sent. A refusal of the command rejects at once and
|
|
51
|
+
* no wait begins; the command's own reply is not kept. `state` decodes it, unless the workflow class did.
|
|
52
|
+
*/
|
|
53
|
+
thenAwaitEnd<S>(timeoutMillis: number, state?: Shape<S>): AwaitingInvocation<I, S>;
|
|
54
|
+
/** Calls an agent's handler for its outcome: the model's answer, or the approval requests the turn waits on. */
|
|
55
|
+
ask(input?: I): Promise<AgentOutcome<R>>;
|
|
56
|
+
/**
|
|
57
|
+
* Decides one of the session's approval requests; this invocation names the handler whose turn waits.
|
|
58
|
+
* `by` names who decided and is required. When it was the turn's last awaited decision the turn goes on,
|
|
59
|
+
* and this answers as `ask` would have. A request already decided is a conflict.
|
|
60
|
+
*/
|
|
61
|
+
decide(approvalId: string, decision: DecisionInput): Promise<AgentOutcome<R>>;
|
|
62
|
+
/** Invokes a streaming handler; yields tokens in order; a failure rejects with `CommandError`, a turn that waits with `ApprovalAwaited`. */
|
|
28
63
|
stream(input?: I): AsyncIterable<string>;
|
|
64
|
+
/** As `stream`, ending with one awaiting part when the turn waits for a person. */
|
|
65
|
+
streamParts(input?: I): AsyncIterable<string | Extract<AgentOutcome<never>, {
|
|
66
|
+
kind: "awaiting-approval";
|
|
67
|
+
}>>;
|
|
68
|
+
}
|
|
69
|
+
/** A command to a workflow followed by a wait for its end, with one deadline from the send. */
|
|
70
|
+
export declare class AwaitingInvocation<I, S> {
|
|
71
|
+
#private;
|
|
72
|
+
constructor(timeoutMillis: number, send: (input: I | undefined) => Promise<unknown>, wait: (leftMillis: number) => Promise<S>);
|
|
73
|
+
/** Sends the command and waits for the end; rejects as `Calls.awaitEnd` does. */
|
|
74
|
+
invoke(input?: I): Promise<S>;
|
|
29
75
|
}
|
|
30
76
|
/** Calls on one component instance, by wire name. */
|
|
31
77
|
export declare class Calls {
|
|
32
78
|
#private;
|
|
33
|
-
constructor(connection: Connection, metadata: Metadata, kind: ComponentKind, componentId: string, entityId: string);
|
|
79
|
+
constructor(connection: Connection, metadata: Metadata, kind: ComponentKind, componentId: string, entityId: string, state?: Shape<unknown>);
|
|
34
80
|
/** `call("add-item", LineItem, Done)`: the wire name, the input shape (omit for none) and the reply shape (omit for `done`). */
|
|
35
81
|
call<I = undefined, R = unknown>(name: string, input?: Shape<I>, reply?: Shape<R>): Invocation<I, R>;
|
|
82
|
+
/**
|
|
83
|
+
* Waits for this workflow's end, for at most `timeoutMillis`, and resolves with the state it ended with — at
|
|
84
|
+
* once when it already has. A workflow that failed or was deleted rejects with `CommandError` whose code is
|
|
85
|
+
* `WORKFLOW_FAILED` and whose `details` hold `step`, `reason` and `deleted`; a wait not answered in time
|
|
86
|
+
* rejects with `TIMEOUT` and the workflow runs on. A paused workflow has not ended. There is no default.
|
|
87
|
+
*/
|
|
88
|
+
awaitEnd<S>(timeoutMillis: number, state?: Shape<S>): Promise<S>;
|
|
89
|
+
/**
|
|
90
|
+
* The same wait as a stream, for an `sse` route that must outlast the idle timeout: a heartbeat while it goes
|
|
91
|
+
* on, then exactly one `ended`, `failed` or `timed-out` part. `awaitPartJson` renders a part as a line.
|
|
92
|
+
*/
|
|
93
|
+
awaitEndParts<S>(timeoutMillis: number, state?: Shape<S>): AsyncIterable<AwaitPart<S>>;
|
|
36
94
|
}
|
|
37
95
|
/** Calls on one component instance through its class's handler table, fully typed. */
|
|
38
96
|
export declare class TypedCalls<C> {
|
|
@@ -40,14 +98,70 @@ export declare class TypedCalls<C> {
|
|
|
40
98
|
constructor(calls: Calls);
|
|
41
99
|
/** `call(ShoppingCartEntity.handlers.addItem)`: the handler's wire name and shapes come from the declaration. */
|
|
42
100
|
call<I, R>(handler: HandlerRef<C, I, R, any>): Invocation<I, R>;
|
|
101
|
+
/** For a workflow: waits for its end and resolves with its state, decoded as the class declares it. */
|
|
102
|
+
awaitEnd<S = StateOf<C>>(timeoutMillis: number): Promise<S>;
|
|
103
|
+
/** For a workflow: the same wait as a stream of parts. */
|
|
104
|
+
awaitEndParts<S = StateOf<C>>(timeoutMillis: number): AsyncIterable<AwaitPart<S>>;
|
|
105
|
+
}
|
|
106
|
+
/** The first protocol in which a view's query can be streamed and watched. */
|
|
107
|
+
export declare const VIEW_STREAMS_SINCE = "1.17";
|
|
108
|
+
/** What a watch of a view gives: a row as the query sees it now, a removal of one it gave, or the caught-up marker. */
|
|
109
|
+
export type WatchEvent<Row> = {
|
|
110
|
+
readonly kind: "row";
|
|
111
|
+
readonly key: string;
|
|
112
|
+
readonly row: Row;
|
|
113
|
+
} | {
|
|
114
|
+
readonly kind: "removed";
|
|
115
|
+
readonly key: string;
|
|
116
|
+
} | {
|
|
117
|
+
readonly kind: "caughtUp";
|
|
118
|
+
};
|
|
119
|
+
/** What a watch does past its unread bound: none slows the view. */
|
|
120
|
+
export type Overflow = "dropHead" | "dropTail" | "dropNew" | "dropAll" | "fail";
|
|
121
|
+
export interface WatchOptions {
|
|
122
|
+
/** How many unread rows the watch holds, one per key; the instance's own bound when absent. */
|
|
123
|
+
readonly unread?: number;
|
|
124
|
+
/** What it does past that bound; `dropHead`, the row changed longest ago, when absent. */
|
|
125
|
+
readonly overflow?: Overflow;
|
|
126
|
+
}
|
|
127
|
+
/** A watch ended for `reason`: `rebuilt`, `instance-stopping`, `listener-lost` or `unread`. Watch again for the rows now. */
|
|
128
|
+
export declare class WatchEnded extends Error {
|
|
129
|
+
readonly reason: string;
|
|
130
|
+
constructor(reason: string);
|
|
43
131
|
}
|
|
132
|
+
/** A workflow instance's state type, read from its `state` getter. */
|
|
133
|
+
type StateOf<C> = C extends {
|
|
134
|
+
readonly state: infer S;
|
|
135
|
+
} ? S : unknown;
|
|
44
136
|
/** View queries: rows come back as a JSON array decoded with the row shape. */
|
|
45
137
|
export declare class Views {
|
|
46
138
|
#private;
|
|
47
|
-
constructor(connection: Connection);
|
|
139
|
+
constructor(connection: Connection, metadata?: Metadata);
|
|
48
140
|
get<Row>(viewId: string, key: string, row: Shape<Row>): Promise<Row | null>;
|
|
49
141
|
all<Row>(viewId: string, row: Shape<Row>): Promise<Row[]>;
|
|
50
142
|
query<Row>(viewId: string, name: string, key: string | null, row: Shape<Row>): Promise<Row[]>;
|
|
143
|
+
/**
|
|
144
|
+
* The rows of one of a view's declared queries, asked by name with the values it takes. At most
|
|
145
|
+
* `limit` rows, 1000 when it is not given, in the statement's own order.
|
|
146
|
+
*/
|
|
147
|
+
ask<Row>(viewId: string, name: string, values: Readonly<Record<string, string>>, row: Shape<Row>, limit?: number): Promise<Row[]>;
|
|
148
|
+
/**
|
|
149
|
+
* The rows of `all` or one of a view's declared queries as the database yields them: nothing
|
|
150
|
+
* collected, and no limit unless one is given. A statement the database ends, or a reader that
|
|
151
|
+
* takes nothing for its timeout, throws.
|
|
152
|
+
*/
|
|
153
|
+
stream<Row>(viewId: string, name: string, values: Readonly<Record<string, string>>, row: Shape<Row>, options?: {
|
|
154
|
+
readonly limit?: number;
|
|
155
|
+
}): AsyncIterable<Row>;
|
|
156
|
+
/**
|
|
157
|
+
* A watch of one of a view's declared queries, declared `{ watched: true }`: every row it matches
|
|
158
|
+
* now, then `caughtUp`, then each row as it is written and matches and a `removed` for each given row
|
|
159
|
+
* that stops matching. Throws `WatchEnded` when it ends with a reason. `unread` bounds the rows held
|
|
160
|
+
* for a reader that has not read them, and `overflow` says what happens past that bound.
|
|
161
|
+
*/
|
|
162
|
+
watch<Row>(viewId: string, name: string, values: Readonly<Record<string, string>>, row: Shape<Row>, options?: WatchOptions): AsyncIterable<WatchEvent<Row>>;
|
|
163
|
+
/** A watch of one row by its key: the row now, then `caughtUp`, then each version and a `removed` when it is deleted. */
|
|
164
|
+
watchRow<Row>(viewId: string, key: string, row: Shape<Row>, options?: WatchOptions): AsyncIterable<WatchEvent<Row>>;
|
|
51
165
|
}
|
|
52
166
|
/** What a timer fires: a component class and one of its handlers, or the same by name. */
|
|
53
167
|
export type TimerTarget = {
|
|
@@ -61,13 +175,78 @@ export type TimerTarget = {
|
|
|
61
175
|
readonly input?: Shape<any>;
|
|
62
176
|
readonly entityId?: string;
|
|
63
177
|
};
|
|
178
|
+
/** What a recurring timer fires: a timed action's class and one of its handlers, or the same by name. */
|
|
179
|
+
export type TimedActionTarget = {
|
|
180
|
+
readonly component: ComponentRef;
|
|
181
|
+
readonly handler: HandlerRef<any, any, any, any>;
|
|
182
|
+
} | {
|
|
183
|
+
readonly componentId: string;
|
|
184
|
+
readonly name: string;
|
|
185
|
+
readonly input?: Shape<any>;
|
|
186
|
+
};
|
|
64
187
|
export declare class Timers {
|
|
65
188
|
#private;
|
|
66
189
|
constructor(connection: Connection);
|
|
67
190
|
/** Schedules `target` after `delay`. Scheduling twice under one id replaces the earlier schedule. */
|
|
68
191
|
schedule(timerId: string, delay: Duration, target: TimerTarget, input?: unknown): Promise<void>;
|
|
192
|
+
/**
|
|
193
|
+
* Schedules `target`, a timed action's handler, first after `delay` (zero or less is due at once) and
|
|
194
|
+
* then every `period` until it is cancelled or replaced. Setting it again with the same handler and
|
|
195
|
+
* period keeps its next due time, so a service may set its recurring timers every time it starts.
|
|
196
|
+
* A period outside 1 millisecond to 36,500 days is refused with `BAD_REQUEST` before anything is sent.
|
|
197
|
+
*/
|
|
198
|
+
scheduleRecurring(timerId: string, delay: Duration, period: Duration, target: TimedActionTarget, input?: unknown): Promise<void>;
|
|
199
|
+
/** Cancels the timer under `timerId`, whether it fires once or recurs. */
|
|
69
200
|
cancel(timerId: string): Promise<void>;
|
|
70
201
|
}
|
|
202
|
+
export declare const MAX_SECRET_NAME_LENGTH = 253;
|
|
203
|
+
export declare const MAX_SECRET_VALUE_BYTES = 65536;
|
|
204
|
+
/** What is wrong with a secret's name, if anything: the runtime's own rule. */
|
|
205
|
+
export declare function secretNameProblem(name: string): string | undefined;
|
|
206
|
+
/** What is wrong with a secret's value, if anything. Never quotes the value. */
|
|
207
|
+
export declare function secretValueProblem(value: string): string | undefined;
|
|
208
|
+
/**
|
|
209
|
+
* The service's secret store: named text values the runtime keeps in the service's own database,
|
|
210
|
+
* encrypted with a key this process never sees. Offered to endpoints, workflow steps, consumers,
|
|
211
|
+
* timed actions and agents; an entity and a view have no `secrets` at all.
|
|
212
|
+
*
|
|
213
|
+
* Every refusal is a `CommandError` with the runtime's code: `BAD_REQUEST` for a name or a value that
|
|
214
|
+
* breaks its rule, `INTERNAL` when the service has no secret key or a value was kept with another
|
|
215
|
+
* one, `UNAVAILABLE` when the database cannot be reached.
|
|
216
|
+
*/
|
|
217
|
+
export declare class Secrets {
|
|
218
|
+
#private;
|
|
219
|
+
/** The store reached through `client`'s sidecar; with none, every call throws. */
|
|
220
|
+
constructor(client?: ComponentClient);
|
|
221
|
+
/** Keeps `value` under `name`, replacing what was there. */
|
|
222
|
+
put(name: string, value: string): Promise<void>;
|
|
223
|
+
/** The value kept under `name`, or `undefined` when there is none. Never an empty string. */
|
|
224
|
+
get(name: string): Promise<string | undefined>;
|
|
225
|
+
/** Removes what is kept under `name`. Removing nothing is not an error. */
|
|
226
|
+
delete(name: string): Promise<void>;
|
|
227
|
+
}
|
|
228
|
+
/** A secret store for unit tests: a map, applying the runtime's rules with its words. */
|
|
229
|
+
export declare class InMemorySecrets extends Secrets {
|
|
230
|
+
readonly values: Map<string, string>;
|
|
231
|
+
put(name: string, value: string): Promise<void>;
|
|
232
|
+
get(name: string): Promise<string | undefined>;
|
|
233
|
+
delete(name: string): Promise<void>;
|
|
234
|
+
}
|
|
235
|
+
/** A store for unit tests whose every call throws: the unit kit's default, beside `noClient()`. */
|
|
236
|
+
export declare function noSecrets(): Secrets;
|
|
237
|
+
/**
|
|
238
|
+
* @internal What a call to another service is sent through: `client`'s sidecar, and the metadata of
|
|
239
|
+
* the handler `client` was scoped to. Not a member of the client, which an entity holds too.
|
|
240
|
+
*/
|
|
241
|
+
export declare function channelOf(client: ComponentClient): {
|
|
242
|
+
stub(): ConnectClient<typeof Client>;
|
|
243
|
+
metadata: Metadata;
|
|
244
|
+
} | undefined;
|
|
245
|
+
/**
|
|
246
|
+
* @internal The secret store reached through `client`'s sidecar. Not a member of the client, which
|
|
247
|
+
* an entity holds too: only the component kinds that may have a store call this.
|
|
248
|
+
*/
|
|
249
|
+
export declare function secretsFor(client: ComponentClient): Secrets;
|
|
71
250
|
export declare class ComponentClient {
|
|
72
251
|
#private;
|
|
73
252
|
readonly views: Views;
|
|
@@ -93,6 +272,8 @@ export declare class ComponentClient {
|
|
|
93
272
|
} | string, instanceId?: string): AutonomousAgentCalls;
|
|
94
273
|
/** @internal A call with a JSON body and a JSON reply, as the platform's own components take them. */
|
|
95
274
|
_raw(kind: ComponentKind, componentId: string, entityId: string, name: string, body?: unknown): Promise<unknown>;
|
|
275
|
+
/** @internal A decision on an approval request; a refusal rejects with `CommandError`. */
|
|
276
|
+
_decide(kind: ComponentKind, componentId: string, entityId: string, name: string, approvalId: string, decision: DecisionInput): Promise<void>;
|
|
96
277
|
/** @internal A streaming call whose tokens are text. */
|
|
97
278
|
_rawStream(kind: ComponentKind, componentId: string, entityId: string, name: string): AsyncIterable<string>;
|
|
98
279
|
/** Typed calls through a component class's handler table: `client.of(ShoppingCartEntity, cartId).call(ShoppingCartEntity.handlers.addItem).invoke(item)`. */
|