@pinecall/room 0.1.0 → 0.1.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/README.md +75 -36
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/karaoke.d.ts +29 -0
- package/dist/karaoke.d.ts.map +1 -0
- package/dist/karaoke.js +64 -0
- package/dist/karaoke.js.map +1 -0
- package/dist/log/follow.d.ts +1 -1
- package/dist/log/follow.d.ts.map +1 -1
- package/dist/log/follow.js +9 -1
- package/dist/log/follow.js.map +1 -1
- package/dist/react/index.d.ts +7 -1
- package/dist/react/index.d.ts.map +1 -1
- package/dist/react/index.js +30 -1
- package/dist/react/index.js.map +1 -1
- package/dist/room.d.ts +9 -3
- package/dist/room.d.ts.map +1 -1
- package/dist/room.js +30 -6
- package/dist/room.js.map +1 -1
- package/dist/server/index.d.ts +9 -1
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +7 -6
- package/dist/server/index.js.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -11,13 +11,13 @@ that change it. The package has three entry points, and each one is for a differ
|
|
|
11
11
|
|
|
12
12
|
| import | where it runs | what it gives you |
|
|
13
13
|
|---|---|---|
|
|
14
|
-
| `@pinecall/room` | the page | `room()`, the store of one conversation,
|
|
14
|
+
| `@pinecall/room` | the page | `room()`, the store of one conversation, `rowsOf`, `knownBy`, `brief` to draw it, and the karaoke of what is being said |
|
|
15
15
|
| `@pinecall/room/react` | the page, in React | `useRoom()` and `useStore()` |
|
|
16
16
|
| `@pinecall/room/server` | your server | `mint()`, `dial()` and `GatewayRefused`: the only code that touches the key |
|
|
17
17
|
|
|
18
18
|
A conversation has two parts, and they are not the same thing. **The seat** is a LiveKit room: it
|
|
19
|
-
carries the audio and the typed lines. **The log** is the call's record on the gateway,
|
|
20
|
-
|
|
19
|
+
carries the audio and the typed lines. **The log** is the call's record on the gateway, read
|
|
20
|
+
straight from it with a token minted for that one call: every turn, every tool the agent called and what came back, the agent's own state, and
|
|
21
21
|
at the end the cost and the score. The store joins the two. What the page draws is the log folded
|
|
22
22
|
by `@pinecall/protocol`, the same fold the Pinecall console draws from.
|
|
23
23
|
|
|
@@ -47,7 +47,6 @@ const call = room({
|
|
|
47
47
|
if (!answer.ok) throw new Error(body.detail ?? `the server answered ${answer.status}`);
|
|
48
48
|
return body;
|
|
49
49
|
},
|
|
50
|
-
log: (call) => `/api/log?call=${encodeURIComponent(call)}`,
|
|
51
50
|
});
|
|
52
51
|
|
|
53
52
|
call.subscribe((state) => {
|
|
@@ -83,7 +82,7 @@ import { rowsOf } from "@pinecall/room";
|
|
|
83
82
|
|
|
84
83
|
// `tokens` is the function from the page above.
|
|
85
84
|
export function Visitor() {
|
|
86
|
-
const call = useRoom({ tokens
|
|
85
|
+
const call = useRoom({ tokens });
|
|
87
86
|
|
|
88
87
|
if (call.phase === "idle") return <button onClick={() => call.start("talk")}>Talk</button>;
|
|
89
88
|
if (call.phase === "failed") return <p>{call.error}</p>;
|
|
@@ -107,17 +106,16 @@ back the state with the five verbs beside it.
|
|
|
107
106
|
`useStore(store)` is the plain version: any store of this package, read with React's
|
|
108
107
|
`useSyncExternalStore`. `useRoom` is `useStore` over a room it owns.
|
|
109
108
|
|
|
110
|
-
## Your server:
|
|
109
|
+
## Your server: two routes
|
|
111
110
|
|
|
112
|
-
The page never holds a key.
|
|
113
|
-
gateway with the org's key
|
|
114
|
-
|
|
111
|
+
The page never holds a key. It asks your server for a seat and, if you offer it, for a call to its
|
|
112
|
+
phone; your server asks the gateway with the org's key. The key needs the `talk` scope and never
|
|
113
|
+
reaches the page.
|
|
115
114
|
|
|
116
115
|
| route | the page sends | your server does | it answers |
|
|
117
116
|
|---|---|---|---|
|
|
118
|
-
| `POST /api/token` | `{scope}`, `talk` or `chat` | `mint(key, {url, agent, scope})` | `{server_url, participant_token, call}` |
|
|
119
|
-
| `
|
|
120
|
-
| `POST /api/call-me` | `{to}`, a number in E.164 | `dial(key, {url, agent, to})` | `{call}` |
|
|
117
|
+
| `POST /api/token` | `{scope}`, `talk` or `chat` | `mint(key, {url, agent, scope, log})` | the gateway's answer whole: `{server_url, participant_token, call, log_token}` |
|
|
118
|
+
| `POST /api/call-me` | `{to}`, a number in E.164 | `dial(key, {url, agent, to, log})` | `{call, log_token}` |
|
|
121
119
|
|
|
122
120
|
The names of the routes are yours; the page only knows the functions you give `room()`. With
|
|
123
121
|
Hono:
|
|
@@ -139,34 +137,25 @@ const refused = (error: unknown) => {
|
|
|
139
137
|
|
|
140
138
|
app.post("/api/token", async (c) => {
|
|
141
139
|
const { scope } = await c.req.json();
|
|
142
|
-
return mint(KEY, { url, agent, scope }).then((minted) => c.json(minted), refused);
|
|
140
|
+
return mint(KEY, { url, agent, scope, log: "tenant" }).then((minted) => c.json(minted), refused);
|
|
143
141
|
});
|
|
144
142
|
|
|
145
143
|
app.post("/api/call-me", async (c) => {
|
|
146
144
|
const { to } = await c.req.json();
|
|
147
|
-
return dial(KEY, { url, agent, to }).then(({ call }) => c.json({ call }), refused);
|
|
148
|
-
});
|
|
149
|
-
|
|
150
|
-
app.get("/api/log", async (c) => {
|
|
151
|
-
const call = c.req.query("call") ?? "";
|
|
152
|
-
if (!mine(c, call)) return c.body(null, 404);
|
|
153
|
-
const resume = c.req.header("last-event-id");
|
|
154
|
-
const answer = await fetch(`${url}/v1/calls/${encodeURIComponent(call)}/events`, {
|
|
155
|
-
headers: { authorization: `Bearer ${KEY}`, accept: "text/event-stream", ...(resume ? { "last-event-id": resume } : {}) },
|
|
156
|
-
signal: c.req.raw.signal,
|
|
157
|
-
});
|
|
158
|
-
return new Response(answer.body, { status: answer.status, headers: { "content-type": "text/event-stream" } });
|
|
145
|
+
return dial(KEY, { url, agent, to, log: "tenant" }).then(({ call, log_token }) => c.json({ call, log_token }), refused);
|
|
159
146
|
});
|
|
160
147
|
```
|
|
161
148
|
|
|
162
|
-
The
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
149
|
+
**The log is read from the gateway, not relayed.** Beside the seat, the gateway mints a
|
|
150
|
+
`log_token`: it reads that one call's log, its state and its recording, for four hours, before
|
|
151
|
+
the call ends and after, and opens nothing else — no room, no other call, no verb. The page
|
|
152
|
+
follows `GET /v1/calls/{call}/events` with it, and those doors answer a page on any origin. Your
|
|
153
|
+
server keeps no list of the calls it opened, so restarting it touches no call a page is showing.
|
|
166
154
|
|
|
167
|
-
`
|
|
168
|
-
|
|
169
|
-
|
|
155
|
+
`log` is what the token reads the call through: `public` (the default) is the turns and the
|
|
156
|
+
state the agent declared public; `tenant` is everything — the tools, the latency, the cost — with a
|
|
157
|
+
`pii` field masked. Ask for `tenant` when the page draws those, as a demo does. `gateway` in
|
|
158
|
+
`room()` names your own box; `https://box.pinecall.io` otherwise.
|
|
170
159
|
|
|
171
160
|
## Have the agent call me
|
|
172
161
|
|
|
@@ -175,7 +164,6 @@ Give `room()` a `callMe`, and the page can ask for a phone call instead of a sea
|
|
|
175
164
|
```ts
|
|
176
165
|
const call = room({
|
|
177
166
|
tokens,
|
|
178
|
-
log: (id) => `/api/log?call=${encodeURIComponent(id)}`,
|
|
179
167
|
callMe: async (to) => {
|
|
180
168
|
const answer = await fetch("/api/call-me", {
|
|
181
169
|
method: "POST",
|
|
@@ -200,6 +188,15 @@ The gateway refuses a dial to a number that has never called or written to the o
|
|
|
200
188
|
dials per minute and per day. Those refusals reach the page as a failed call with the gateway's
|
|
201
189
|
sentence.
|
|
202
190
|
|
|
191
|
+
## Relaying the log yourself
|
|
192
|
+
|
|
193
|
+
A page that must not reach the gateway — a network that only lets it talk to your own domain —
|
|
194
|
+
gives `room()` a `log` — `(call) => "/api/log?call=" + call` — and the log token is not used.
|
|
195
|
+
Your relay streams `GET /v1/calls/{call}/events` with the key, forwards `last-event-id`, and passes
|
|
196
|
+
the gateway's status and body through as they came. It must relay only the calls that visitor's
|
|
197
|
+
session opened: a relay that streams any call id it is handed is a window onto every call of the
|
|
198
|
+
org. `recording` is then `""`, and the recording is yours to relay too.
|
|
199
|
+
|
|
203
200
|
## What `state` says
|
|
204
201
|
|
|
205
202
|
Every field is the truth at the moment it was published. A new state is a new object; one you were
|
|
@@ -211,6 +208,7 @@ handed is never changed afterwards, so it can be compared by reference and kept.
|
|
|
211
208
|
| `mode` | `talk`, `chat`, `phone`, or `null` before anything started |
|
|
212
209
|
| `call` | the call id, once the tokens or the dial answered it; `""` before |
|
|
213
210
|
| `error` | the sentence to show when `phase` is `failed`; `""` otherwise |
|
|
211
|
+
| `recording` | where the call's recording plays from, with its token: an `<audio src>` once the call has ended; `""` when the log is relayed |
|
|
214
212
|
| `log` | the call as `@pinecall/protocol` folds it: `turns`, `tools`, `app_state`, `status`, `live` (the words being said right now), `cost` |
|
|
215
213
|
| `entries` | every entry of the log read so far, in order |
|
|
216
214
|
| `connection` | the log's stream: `connecting` · `live` · `reconnecting` · `ended` (also before anything opened) |
|
|
@@ -226,8 +224,9 @@ score are entries that arrive after the visitor has gone, so `cost` is `null` un
|
|
|
226
224
|
which comes after `call.ended`. The stream is followed until `call.score`, the last thing a log ever
|
|
227
225
|
says, or for `linger` milliseconds after the call ended (60 000 by default: the worker notices a caller has gone some twenty seconds after the fact, and the score comes after that), whichever is first.
|
|
228
226
|
|
|
229
|
-
A stream that drops
|
|
230
|
-
|
|
227
|
+
A stream that drops, a network that fails, or a gateway answering `5xx` — a proxy while the gateway
|
|
228
|
+
behind it restarts, a deploy — is asked again from the last entry read, after half a second,
|
|
229
|
+
doubling to eight seconds, for as long as it takes. A `4xx` is the gateway saying no, and ends it.
|
|
231
230
|
|
|
232
231
|
## Drawing the conversation
|
|
233
232
|
|
|
@@ -246,6 +245,44 @@ as one short line each, `status` (`running`, `done`, `failed`) and `error` — a
|
|
|
246
245
|
`[name, value]` pairs with the empty ones left out. `brief(value, max)` is a value as one line of
|
|
247
246
|
JSON, cut at `max` characters. A field that is an object is opened one level — `person.name`, `person.email` — so a page shows a name rather than a JSON blob.
|
|
248
247
|
|
|
248
|
+
## What is being said right now
|
|
249
|
+
|
|
250
|
+
Both sides of a spoken call can be drawn as they happen, karaoke-style.
|
|
251
|
+
|
|
252
|
+
**The visitor** — `state.log.live.user` is what the recogniser has heard so far of the turn in
|
|
253
|
+
progress, rewritten as they speak ("Hi", "Hi ther", "Hi there. I would…"), and `null` once the
|
|
254
|
+
turn closes.
|
|
255
|
+
|
|
256
|
+
**The agent** — a voice call's log carries its reply one word at a time, each with the second it
|
|
257
|
+
is spoken at. The words usually reach the page before the voice says them, so a page can draw the
|
|
258
|
+
whole sentence and light each word as it sounds:
|
|
259
|
+
|
|
260
|
+
```tsx
|
|
261
|
+
import { useKaraoke } from "@pinecall/room/react";
|
|
262
|
+
|
|
263
|
+
const saying = useKaraoke(room.entries); // null when nobody is mid-reply
|
|
264
|
+
{saying && <p><b>{saying.lit}</b><span className="dim">{saying.coming}</span></p>}
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
Without React, the same with a clock of your own: note the time the reply's first word arrived,
|
|
268
|
+
and on each frame split it with `litAt`.
|
|
269
|
+
|
|
270
|
+
```ts
|
|
271
|
+
import { litAt, sayingOf } from "@pinecall/room";
|
|
272
|
+
|
|
273
|
+
let began: { speech: string; at: number } | null = null;
|
|
274
|
+
function frame() {
|
|
275
|
+
const saying = sayingOf(call.state.entries);
|
|
276
|
+
if (saying && began?.speech !== saying.speech) began = { speech: saying.speech, at: performance.now() };
|
|
277
|
+
if (saying && began) draw(litAt(saying, performance.now() - began.at)); // { lit, coming }
|
|
278
|
+
requestAnimationFrame(frame);
|
|
279
|
+
}
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
A written call's reply comes as model tokens with no timing: every token is lit as it arrives,
|
|
283
|
+
which reads as the agent typing. Once the turn closes, the reply is a turn in `rowsOf` like any
|
|
284
|
+
other, and `useKaraoke` returns `null`.
|
|
285
|
+
|
|
249
286
|
## Sound and the browser's permission
|
|
250
287
|
|
|
251
288
|
In `talk`, the microphone is turned on once the room is joined, and the agent's voice plays through
|
|
@@ -272,7 +309,9 @@ Nothing fails silently. Every refusal is a phase and a sentence, or a rejected p
|
|
|
272
309
|
| `livekit-client` could not be loaded | `failed`, `error` is the loader's message |
|
|
273
310
|
| `callMe` threw | `failed`, `error` is its message |
|
|
274
311
|
| `callMe()` on a room given no `callMe` | `failed`, `error` says so |
|
|
275
|
-
| the log
|
|
312
|
+
| the log answered a `4xx` | on the phone: `failed`, "the log answered 401". In a room: `connection` is `ended` and the phase is left to the seat, which is the call |
|
|
313
|
+
| the log answered a `5xx`, or its stream dropped | `connection` is `reconnecting`, and it resumes where it was; nothing ends |
|
|
314
|
+
| `tokens` or `callMe` answered no `log_token`, and there is no `log` to relay it | `failed`, `error` says so |
|
|
276
315
|
| the room closed from the other side | `ended`; the log is read on until the score |
|
|
277
316
|
| an entry of the log this version cannot read | skipped; `onSkipped(why)` is called, and the rest of the call still draws |
|
|
278
317
|
| `send()` outside a live seat | the promise rejects with "not in a call"; an empty line is nothing |
|
package/dist/index.d.ts
CHANGED
|
@@ -6,4 +6,5 @@ export type { Connection } from "./log/follow.js";
|
|
|
6
6
|
export type { Speaking } from "./seat/join.js";
|
|
7
7
|
export type { LivekitModule } from "./seat/livekit.js";
|
|
8
8
|
export { brief, knownBy, rowsOf, type Row } from "./rows.js";
|
|
9
|
+
export { joined, litAt, sayingOf, soundedBy, type Lit, type Saying, type Word } from "./karaoke.js";
|
|
9
10
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,mGAAmG;AAEnG,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACxF,YAAY,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACxC,YAAY,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,YAAY,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC/C,YAAY,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,GAAG,EAAE,MAAM,WAAW,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,mGAAmG;AAEnG,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACxF,YAAY,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACxC,YAAY,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,YAAY,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC/C,YAAY,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,GAAG,EAAE,MAAM,WAAW,CAAC;AAC7D,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,GAAG,EAAE,KAAK,MAAM,EAAE,KAAK,IAAI,EAAE,MAAM,cAAc,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
/** @pinecall/room: the caller's side of a Pinecall call in a browser — one store, no framework. */
|
|
2
2
|
export { room } from "./room.js";
|
|
3
3
|
export { brief, knownBy, rowsOf } from "./rows.js";
|
|
4
|
+
export { joined, litAt, sayingOf, soundedBy } from "./karaoke.js";
|
|
4
5
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,mGAAmG;AAEnG,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAMjC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAY,MAAM,WAAW,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,mGAAmG;AAEnG,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAMjC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAY,MAAM,WAAW,CAAC;AAC7D,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAoC,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/** The agent's reply while it is being said: its words as the log delivers them, and which have sounded. */
|
|
2
|
+
import { type Entry } from "@pinecall/protocol";
|
|
3
|
+
/** One delta of the reply: a word (voice) or a token (text), and when it sounds, if it does. */
|
|
4
|
+
export interface Word {
|
|
5
|
+
text: string;
|
|
6
|
+
start: number | null;
|
|
7
|
+
}
|
|
8
|
+
/** The reply in progress: its speech id and every delta so far. */
|
|
9
|
+
export interface Saying {
|
|
10
|
+
speech: string;
|
|
11
|
+
words: Word[];
|
|
12
|
+
}
|
|
13
|
+
/** A reply split where the voice is: what has sounded, and what is still to come. */
|
|
14
|
+
export interface Lit {
|
|
15
|
+
lit: string;
|
|
16
|
+
coming: string;
|
|
17
|
+
}
|
|
18
|
+
/** The reply being said now, read back from the newest entry to the last closed turn; null when nobody is mid-reply. */
|
|
19
|
+
export declare function sayingOf(entries: readonly Entry[]): Saying | null;
|
|
20
|
+
/**
|
|
21
|
+
* How many words have sounded `elapsed` ms after the reply's first word reached the page. A word
|
|
22
|
+
* with no timing is lit at once; the count never skips a word, so a late one holds back the rest.
|
|
23
|
+
*/
|
|
24
|
+
export declare function soundedBy(words: readonly Word[], elapsed: number): number;
|
|
25
|
+
/** The deltas as one line, the way the wire's reducer joins them: a timed word is its own word. */
|
|
26
|
+
export declare function joined(words: readonly Word[]): string;
|
|
27
|
+
/** The reply split at `elapsed` ms: the words that have sounded, and the rest. */
|
|
28
|
+
export declare function litAt(saying: Saying, elapsed: number): Lit;
|
|
29
|
+
//# sourceMappingURL=karaoke.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"karaoke.d.ts","sourceRoot":"","sources":["../src/karaoke.ts"],"names":[],"mappings":"AAAA,4GAA4G;AAQ5G,OAAO,EAAyB,KAAK,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAEvE,gGAAgG;AAChG,MAAM,WAAW,IAAI;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED,mEAAmE;AACnE,MAAM,WAAW,MAAM;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,IAAI,EAAE,CAAC;CACf;AAED,qFAAqF;AACrF,MAAM,WAAW,GAAG;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wHAAwH;AACxH,wBAAgB,QAAQ,CAAC,OAAO,EAAE,SAAS,KAAK,EAAE,GAAG,MAAM,GAAG,IAAI,CAgBjE;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,SAAS,IAAI,EAAE,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAOzE;AAED,mGAAmG;AACnG,wBAAgB,MAAM,CAAC,KAAK,EAAE,SAAS,IAAI,EAAE,GAAG,MAAM,CAQrD;AAED,kFAAkF;AAClF,wBAAgB,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,GAAG,CAG1D"}
|
package/dist/karaoke.js
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/** The agent's reply while it is being said: its words as the log delivers them, and which have sounded. */
|
|
2
|
+
//
|
|
3
|
+
// A voice call delivers one agent.transcript per word, each with `start`: the second, from the
|
|
4
|
+
// top of the reply, at which the voice says it (the TTS measures it; the runtime passes it on).
|
|
5
|
+
// A word is lit when the clock reaches it, so the words on screen are the words in the ear. A
|
|
6
|
+
// written call's deltas are model tokens with no timing: they are lit the moment they arrive.
|
|
7
|
+
// The visitor's side needs nothing here: `state.log.live.user` is what the ear has heard so far.
|
|
8
|
+
import { AgentTranscriptSchema } from "@pinecall/protocol";
|
|
9
|
+
/** The reply being said now, read back from the newest entry to the last closed turn; null when nobody is mid-reply. */
|
|
10
|
+
export function sayingOf(entries) {
|
|
11
|
+
const words = [];
|
|
12
|
+
let speech = null;
|
|
13
|
+
for (let at = entries.length - 1; at >= 0; at -= 1) {
|
|
14
|
+
const entry = entries[at];
|
|
15
|
+
if (entry === undefined || entry.type === "turn.agent")
|
|
16
|
+
break;
|
|
17
|
+
if (entry.type !== "agent.transcript")
|
|
18
|
+
continue;
|
|
19
|
+
const delta = AgentTranscriptSchema.safeParse(entry.data);
|
|
20
|
+
if (!delta.success)
|
|
21
|
+
continue;
|
|
22
|
+
if (delta.data.final)
|
|
23
|
+
break;
|
|
24
|
+
// Only the newest reply: a delta of an earlier speech is a reply that already closed.
|
|
25
|
+
if (speech === null)
|
|
26
|
+
speech = delta.data.speech_id;
|
|
27
|
+
else if (delta.data.speech_id !== speech)
|
|
28
|
+
break;
|
|
29
|
+
words.unshift({ text: delta.data.text, start: delta.data.start ?? null });
|
|
30
|
+
}
|
|
31
|
+
return speech === null ? null : { speech, words };
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* How many words have sounded `elapsed` ms after the reply's first word reached the page. A word
|
|
35
|
+
* with no timing is lit at once; the count never skips a word, so a late one holds back the rest.
|
|
36
|
+
*/
|
|
37
|
+
export function soundedBy(words, elapsed) {
|
|
38
|
+
let lit = 0;
|
|
39
|
+
for (const word of words) {
|
|
40
|
+
if (word.start !== null && word.start * 1000 > elapsed)
|
|
41
|
+
break;
|
|
42
|
+
lit += 1;
|
|
43
|
+
}
|
|
44
|
+
return lit;
|
|
45
|
+
}
|
|
46
|
+
/** The deltas as one line, the way the wire's reducer joins them: a timed word is its own word. */
|
|
47
|
+
export function joined(words) {
|
|
48
|
+
let line = "";
|
|
49
|
+
for (const word of words) {
|
|
50
|
+
if (line === "")
|
|
51
|
+
line = word.text;
|
|
52
|
+
else if (word.start !== null && !/\s$/.test(line) && !/^\s/.test(word.text))
|
|
53
|
+
line = `${line} ${word.text}`;
|
|
54
|
+
else
|
|
55
|
+
line = `${line}${word.text}`;
|
|
56
|
+
}
|
|
57
|
+
return line;
|
|
58
|
+
}
|
|
59
|
+
/** The reply split at `elapsed` ms: the words that have sounded, and the rest. */
|
|
60
|
+
export function litAt(saying, elapsed) {
|
|
61
|
+
const lit = joined(saying.words.slice(0, soundedBy(saying.words, elapsed)));
|
|
62
|
+
return { lit, coming: joined(saying.words).slice(lit.length) };
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=karaoke.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"karaoke.js","sourceRoot":"","sources":["../src/karaoke.ts"],"names":[],"mappings":"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"}
|
package/dist/log/follow.d.ts
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import { type SseMessage } from "./sse.js";
|
|
3
3
|
/** What the page can honestly say about its stream. Nothing here is a guess. */
|
|
4
4
|
export type Connection = "connecting" | "live" | "reconnecting" | "ended";
|
|
5
|
-
/** Why a follow stopped by itself: the score arrived, the call was sealed, or the
|
|
5
|
+
/** Why a follow stopped by itself: the score arrived, the call was sealed, or the gateway said no. */
|
|
6
6
|
export type Ending = {
|
|
7
7
|
kind: "scored";
|
|
8
8
|
} | {
|
package/dist/log/follow.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"follow.d.ts","sourceRoot":"","sources":["../../src/log/follow.ts"],"names":[],"mappings":"AAAA,iGAAiG;AAIjG,OAAO,EAAa,KAAK,UAAU,EAAE,MAAM,UAAU,CAAC;AAEtD,gFAAgF;AAChF,MAAM,MAAM,UAAU,GAAG,YAAY,GAAG,MAAM,GAAG,cAAc,GAAG,OAAO,CAAC;AAE1E,
|
|
1
|
+
{"version":3,"file":"follow.d.ts","sourceRoot":"","sources":["../../src/log/follow.ts"],"names":[],"mappings":"AAAA,iGAAiG;AAIjG,OAAO,EAAa,KAAK,UAAU,EAAE,MAAM,UAAU,CAAC;AAEtD,gFAAgF;AAChF,MAAM,MAAM,UAAU,GAAG,YAAY,GAAG,MAAM,GAAG,cAAc,GAAG,OAAO,CAAC;AAE1E,sGAAsG;AACtG,MAAM,MAAM,MAAM,GAAG;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnG,kGAAkG;AAClG,MAAM,WAAW,SAAS;IACxB,kGAAkG;IAClG,SAAS,EAAE,CAAC,OAAO,EAAE,UAAU,KAAK,IAAI,CAAC;IACzC,YAAY,EAAE,CAAC,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;IACjE,gGAAgG;IAChG,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;CACnC;AAaD,8FAA8F;AAC9F,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,KAAK,GAAG,MAAM,IAAI,CA2E3F"}
|
package/dist/log/follow.js
CHANGED
|
@@ -2,11 +2,14 @@
|
|
|
2
2
|
import { TERMINAL_EVENT } from "@pinecall/protocol";
|
|
3
3
|
import { SseParser } from "./sse.js";
|
|
4
4
|
// A dropped stream is opened again after this, doubling to the ceiling: a gateway restarting is
|
|
5
|
-
// seconds, and a page hammering it every 100 ms would only make those seconds longer.
|
|
5
|
+
// seconds, and a page hammering it every 100 ms would only make those seconds longer. A 5xx is the
|
|
6
|
+
// same thing seen from a proxy — the gateway behind it is restarting — and is asked again too.
|
|
6
7
|
const RECONNECT_MS = 500;
|
|
7
8
|
const RECONNECT_CEILING_MS = 8_000;
|
|
8
9
|
// The relay answers 204 to a sealed call whose cursor is at the end: nothing more will be said.
|
|
9
10
|
const NOTHING_MORE = 204;
|
|
11
|
+
// From here up the gateway, or the proxy in front of it, is away rather than saying no.
|
|
12
|
+
const AWAY = 500;
|
|
10
13
|
/** Open the log at `url`. Returns the call that stops it; stopping twice is stopping once. */
|
|
11
14
|
export function followLog(url, reader, fetcher) {
|
|
12
15
|
const controller = new AbortController();
|
|
@@ -64,6 +67,11 @@ export function followLog(url, reader, fetcher) {
|
|
|
64
67
|
return;
|
|
65
68
|
if (answer.status === NOTHING_MORE)
|
|
66
69
|
return end({ kind: "sealed" });
|
|
70
|
+
if (answer.status >= AWAY) {
|
|
71
|
+
await answer.body?.cancel().catch(() => undefined);
|
|
72
|
+
await again();
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
67
75
|
if (!answer.ok || answer.body === null)
|
|
68
76
|
return end({ kind: "refused", status: answer.status });
|
|
69
77
|
reader.onConnection("live");
|
package/dist/log/follow.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"follow.js","sourceRoot":"","sources":["../../src/log/follow.ts"],"names":[],"mappings":"AAAA,iGAAiG;AAEjG,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEpD,OAAO,EAAE,SAAS,EAAmB,MAAM,UAAU,CAAC;AAiBtD,gGAAgG;AAChG,
|
|
1
|
+
{"version":3,"file":"follow.js","sourceRoot":"","sources":["../../src/log/follow.ts"],"names":[],"mappings":"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"}
|
package/dist/react/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/** @pinecall/room/react: a store read the way React reads one, and one room per mounted component. */
|
|
2
|
-
import { type RoomOptions, type RoomState, type RoomStore, type Store } from "../index.js";
|
|
2
|
+
import { type Lit, type RoomOptions, type RoomState, type RoomStore, type Store } from "../index.js";
|
|
3
3
|
/** The store's state, re-rendering when it changes. Any store of this package. */
|
|
4
4
|
export declare function useStore<T>(store: Store<T>): T;
|
|
5
5
|
/** What `useRoom` hands a component: the state, and the verbs to change it. */
|
|
@@ -10,4 +10,10 @@ export type RoomHandle = RoomState & Pick<RoomStore, "start" | "send" | "callMe"
|
|
|
10
10
|
* is the one that runs.
|
|
11
11
|
*/
|
|
12
12
|
export declare function useRoom(options: RoomOptions): RoomHandle;
|
|
13
|
+
/**
|
|
14
|
+
* The agent's reply as the voice says it: `lit` has sounded, `coming` has not, or null when nobody
|
|
15
|
+
* is mid-reply. The clock starts when the reply's first word reaches the page and ticks one frame
|
|
16
|
+
* at a time only while a word is still due. Pass `state.entries` of a live room.
|
|
17
|
+
*/
|
|
18
|
+
export declare function useKaraoke(entries: RoomState["entries"]): Lit | null;
|
|
13
19
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAAA,sGAAsG;AAItG,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAAA,sGAAsG;AAItG,OAAO,EAAyB,KAAK,GAAG,EAAE,KAAK,WAAW,EAAE,KAAK,SAAS,EAAE,KAAK,SAAS,EAAE,KAAK,KAAK,EAAE,MAAM,aAAa,CAAC;AAE5H,kFAAkF;AAClF,wBAAgB,QAAQ,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAI9C;AAED,+EAA+E;AAC/E,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE,OAAO,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,GAAG,WAAW,CAAC,CAAC;AAE1G;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,OAAO,EAAE,WAAW,GAAG,UAAU,CAuBxD;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,SAAS,CAAC,SAAS,CAAC,GAAG,GAAG,GAAG,IAAI,CAqBpE"}
|
package/dist/react/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/** @pinecall/room/react: a store read the way React reads one, and one room per mounted component. */
|
|
2
2
|
import { useCallback, useEffect, useRef, useState, useSyncExternalStore } from "react";
|
|
3
|
-
import { room } from "../index.js";
|
|
3
|
+
import { litAt, room, sayingOf } from "../index.js";
|
|
4
4
|
/** The store's state, re-rendering when it changes. Any store of this package. */
|
|
5
5
|
export function useStore(store) {
|
|
6
6
|
const subscribe = useCallback((changed) => store.subscribe(changed), [store]);
|
|
@@ -36,12 +36,41 @@ export function useRoom(options) {
|
|
|
36
36
|
const { start, send, callMe, leave, playSound } = store;
|
|
37
37
|
return { ...state, start, send, callMe, leave, playSound };
|
|
38
38
|
}
|
|
39
|
+
/**
|
|
40
|
+
* The agent's reply as the voice says it: `lit` has sounded, `coming` has not, or null when nobody
|
|
41
|
+
* is mid-reply. The clock starts when the reply's first word reaches the page and ticks one frame
|
|
42
|
+
* at a time only while a word is still due. Pass `state.entries` of a live room.
|
|
43
|
+
*/
|
|
44
|
+
export function useKaraoke(entries) {
|
|
45
|
+
const saying = sayingOf(entries);
|
|
46
|
+
const began = useRef(null);
|
|
47
|
+
const [now, setNow] = useState(() => performance.now());
|
|
48
|
+
if (saying === null)
|
|
49
|
+
began.current = null;
|
|
50
|
+
else if (began.current?.speech !== saying.speech)
|
|
51
|
+
began.current = { speech: saying.speech, at: performance.now() };
|
|
52
|
+
const split = saying === null || saying.words.length === 0 ? null : litAt(saying, now - (began.current?.at ?? now));
|
|
53
|
+
const waiting = split !== null && split.coming !== "";
|
|
54
|
+
useEffect(() => {
|
|
55
|
+
if (!waiting)
|
|
56
|
+
return;
|
|
57
|
+
let frame = requestAnimationFrame(function tick() {
|
|
58
|
+
setNow(performance.now());
|
|
59
|
+
frame = requestAnimationFrame(tick);
|
|
60
|
+
});
|
|
61
|
+
return () => cancelAnimationFrame(frame);
|
|
62
|
+
}, [waiting]);
|
|
63
|
+
return split;
|
|
64
|
+
}
|
|
39
65
|
/** Options whose every field is the one the component rendered last. */
|
|
40
66
|
function readingLatest(latest) {
|
|
41
67
|
return {
|
|
42
68
|
get tokens() {
|
|
43
69
|
return latest.current.tokens;
|
|
44
70
|
},
|
|
71
|
+
get gateway() {
|
|
72
|
+
return latest.current.gateway;
|
|
73
|
+
},
|
|
45
74
|
get log() {
|
|
46
75
|
return latest.current.log;
|
|
47
76
|
},
|
package/dist/react/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAAA,sGAAsG;AAEtG,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,oBAAoB,EAAE,MAAM,OAAO,CAAC;AAEvF,OAAO,EAAE,IAAI,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAAA,sGAAsG;AAEtG,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,oBAAoB,EAAE,MAAM,OAAO,CAAC;AAEvF,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAA0E,MAAM,aAAa,CAAC;AAE5H,kFAAkF;AAClF,MAAM,UAAU,QAAQ,CAAI,KAAe;IACzC,MAAM,SAAS,GAAG,WAAW,CAAC,CAAC,OAAmB,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAC1F,MAAM,IAAI,GAAG,GAAM,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC;IAClC,OAAO,oBAAoB,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AACrD,CAAC;AAKD;;;;GAIG;AACH,MAAM,UAAU,OAAO,CAAC,OAAoB;IAC1C,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IAC/B,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,CAAC,OAAO,GAAG,OAAO,CAAC;IAC3B,CAAC,CAAC,CAAC;IACH,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACtE,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IAC1B,SAAS,CAAC,GAAG,EAAE;QACb,4FAA4F;QAC5F,oDAAoD;QACpD,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;YACpB,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YACtC,OAAO;QACT,CAAC;QACD,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;YACrB,KAAK,CAAC,KAAK,EAAE,CAAC;QAChB,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IACZ,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC9B,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC;IACxD,OAAO,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;AAC7D,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,OAA6B;IACtD,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;IACjC,MAAM,KAAK,GAAG,MAAM,CAAwC,IAAI,CAAC,CAAC;IAClE,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,CAAC;IAExD,IAAI,MAAM,KAAK,IAAI;QAAE,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC;SACrC,IAAI,KAAK,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM;QAAE,KAAK,CAAC,OAAO,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,EAAE,EAAE,WAAW,CAAC,GAAG,EAAE,EAAE,CAAC;IAEnH,MAAM,KAAK,GAAG,MAAM,KAAK,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC;IACpH,MAAM,OAAO,GAAG,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,MAAM,KAAK,EAAE,CAAC;IAEtD,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,OAAO;YAAE,OAAO;QACrB,IAAI,KAAK,GAAG,qBAAqB,CAAC,SAAS,IAAI;YAC7C,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,CAAC;YAC1B,KAAK,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;QACH,OAAO,GAAG,EAAE,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;IAC3C,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAEd,OAAO,KAAK,CAAC;AACf,CAAC;AAED,wEAAwE;AACxE,SAAS,aAAa,CAAC,MAAyC;IAC9D,OAAO;QACL,IAAI,MAAM;YACR,OAAO,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;QAC/B,CAAC;QACD,IAAI,OAAO;YACT,OAAO,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC;QAChC,CAAC;QACD,IAAI,GAAG;YACL,OAAO,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC;QAC5B,CAAC;QACD,IAAI,MAAM;YACR,OAAO,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;QAC/B,CAAC;QACD,IAAI,MAAM;YACR,OAAO,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;QAC/B,CAAC;QACD,IAAI,KAAK;YACP,OAAO,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;QAC9B,CAAC;QACD,IAAI,OAAO;YACT,OAAO,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC;QAChC,CAAC;QACD,IAAI,SAAS;YACX,OAAO,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC;QAClC,CAAC;KACF,CAAC;AACJ,CAAC"}
|
package/dist/room.d.ts
CHANGED
|
@@ -17,6 +17,8 @@ export interface RoomState {
|
|
|
17
17
|
call: string;
|
|
18
18
|
/** The sentence to show when phase is "failed". */
|
|
19
19
|
error: string;
|
|
20
|
+
/** Where the call's recording plays from once it has ended, or "" when the log is relayed. */
|
|
21
|
+
recording: string;
|
|
20
22
|
/** The call as the protocol folds it: turns, tools, the agent's state, the cost once it is known. */
|
|
21
23
|
log: State;
|
|
22
24
|
entries: Entry[];
|
|
@@ -28,11 +30,15 @@ export interface RoomState {
|
|
|
28
30
|
export interface RoomOptions {
|
|
29
31
|
/** A ticket for a seat, from the tenant's own server. The page never holds a key. */
|
|
30
32
|
tokens: (scope: "talk" | "chat") => Promise<Minted>;
|
|
31
|
-
/** The
|
|
32
|
-
|
|
33
|
-
/**
|
|
33
|
+
/** The gateway the log is read from with the call's own token. Default `https://box.pinecall.io`. */
|
|
34
|
+
gateway?: string | undefined;
|
|
35
|
+
/** The URL the call's log is relayed at by the tenant's server, for a page that must not reach
|
|
36
|
+
* the gateway itself. Given, the log token is not used. */
|
|
37
|
+
log?: ((call: string, minted?: Minted) => string) | undefined;
|
|
38
|
+
/** Ask the tenant's server to have the agent call `to`: the call, and its log token. */
|
|
34
39
|
callMe?: ((to: string) => Promise<{
|
|
35
40
|
call: string;
|
|
41
|
+
log_token?: string | undefined;
|
|
36
42
|
}>) | undefined;
|
|
37
43
|
/** How long the log is read after the seat closes, waiting for the score. Default 60 000 ms: a worker
|
|
38
44
|
* notices a caller has gone some twenty seconds after the fact, and the score comes after that. */
|
package/dist/room.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"room.d.ts","sourceRoot":"","sources":["../src/room.ts"],"names":[],"mappings":"AAAA,kHAAkH;AASlH,OAAO,EAAgB,KAAK,KAAK,EAAE,KAAK,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAG1E,OAAO,EAAa,KAAK,UAAU,EAAe,MAAM,iBAAiB,CAAC;AAE1E,OAAO,EAAuB,KAAK,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AACpE,OAAO,EAAe,KAAK,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEpE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAQ,KAAK,KAAK,EAAE,MAAM,YAAY,CAAC;AAE9C,YAAY,EAAE,MAAM,EAAE,CAAC;AAEvB,oFAAoF;AACpF,MAAM,MAAM,KAAK,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;AAEjF,gFAAgF;AAChF,MAAM,MAAM,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAE7C,+FAA+F;AAC/F,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,KAAK,CAAC;IACb,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,mDAAmD;IACnD,KAAK,EAAE,MAAM,CAAC;IACd,qGAAqG;IACrG,GAAG,EAAE,KAAK,CAAC;IACX,OAAO,EAAE,KAAK,EAAE,CAAC;IACjB,UAAU,EAAE,UAAU,CAAC;IACvB,oFAAoF;IACpF,UAAU,EAAE,OAAO,CAAC;IACpB,QAAQ,EAAE,QAAQ,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,qFAAqF;IACrF,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACpD,
|
|
1
|
+
{"version":3,"file":"room.d.ts","sourceRoot":"","sources":["../src/room.ts"],"names":[],"mappings":"AAAA,kHAAkH;AASlH,OAAO,EAAgB,KAAK,KAAK,EAAE,KAAK,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAG1E,OAAO,EAAa,KAAK,UAAU,EAAe,MAAM,iBAAiB,CAAC;AAE1E,OAAO,EAAuB,KAAK,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AACpE,OAAO,EAAe,KAAK,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEpE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAQ,KAAK,KAAK,EAAE,MAAM,YAAY,CAAC;AAE9C,YAAY,EAAE,MAAM,EAAE,CAAC;AAEvB,oFAAoF;AACpF,MAAM,MAAM,KAAK,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;AAEjF,gFAAgF;AAChF,MAAM,MAAM,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAE7C,+FAA+F;AAC/F,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,KAAK,CAAC;IACb,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,mDAAmD;IACnD,KAAK,EAAE,MAAM,CAAC;IACd,8FAA8F;IAC9F,SAAS,EAAE,MAAM,CAAC;IAClB,qGAAqG;IACrG,GAAG,EAAE,KAAK,CAAC;IACX,OAAO,EAAE,KAAK,EAAE,CAAC;IACjB,UAAU,EAAE,UAAU,CAAC;IACvB,oFAAoF;IACpF,UAAU,EAAE,OAAO,CAAC;IACpB,QAAQ,EAAE,QAAQ,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,qFAAqF;IACrF,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACpD,qGAAqG;IACrG,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B;+DAC2D;IAC3D,GAAG,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC,GAAG,SAAS,CAAC;IAC9D,wFAAwF;IACxF,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;KAAE,CAAC,CAAC,GAAG,SAAS,CAAC;IACjG;uGACmG;IACnG,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,KAAK,CAAC,EAAE,OAAO,KAAK,GAAG,SAAS,CAAC;IACjC,OAAO,CAAC,EAAE,CAAC,MAAM,OAAO,CAAC,aAAa,CAAC,CAAC,GAAG,SAAS,CAAC;IACrD,kGAAkG;IAClG,SAAS,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;CACjD;AAED,MAAM,WAAW,SAAU,SAAQ,KAAK,CAAC,SAAS,CAAC;IACjD,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5C,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,SAAS,IAAI,IAAI,CAAC;CACnB;AAoBD,oEAAoE;AACpE,wBAAgB,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,SAAS,CAuPpD"}
|
package/dist/room.js
CHANGED
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
//
|
|
3
3
|
// Two things happen at once and they are not the same thing. LiveKit carries the audio and the
|
|
4
4
|
// typed lines — the room the visitor joins with a ticket the tenant's own server minted, so the
|
|
5
|
-
// org's key never reaches a browser. The call's LOG,
|
|
6
|
-
// agent is actually doing: the turns, every tool it called and what came back, its declared state.
|
|
5
|
+
// org's key never reaches a browser. The call's LOG, read straight from the gateway with the token
|
|
6
|
+
// minted beside that ticket for that one call, carries what the agent is actually doing: the turns, every tool it called and what came back, its declared state.
|
|
7
7
|
// The log is folded by the protocol's own reducer, so what the page draws is what the console
|
|
8
8
|
// draws, from the same bytes. A phone call has no seat at all: the log is the whole of it.
|
|
9
9
|
import { initialState } from "@pinecall/protocol";
|
|
@@ -19,6 +19,8 @@ const PARTING_MS = 3_000;
|
|
|
19
19
|
const QUIET = { agent: false, user: false, level: 0 };
|
|
20
20
|
const NO_MICROPHONE = "I could not get to your microphone. Check the browser's permission, or write instead.";
|
|
21
21
|
const NO_CALL_ME = "room() was given no callMe: the call is placed by your server";
|
|
22
|
+
const NO_LOG_TOKEN = "the server answered no log_token, and room() was given no log to relay it through";
|
|
23
|
+
const GATEWAY = "https://box.pinecall.io";
|
|
22
24
|
/** A room for one visitor. Nothing opens until a verb is called. */
|
|
23
25
|
export function room(options) {
|
|
24
26
|
const store = cell(idle());
|
|
@@ -39,6 +41,18 @@ export function room(options) {
|
|
|
39
41
|
c.seat = null;
|
|
40
42
|
return seat === null ? Promise.resolve() : seat.leave().catch(() => undefined);
|
|
41
43
|
};
|
|
44
|
+
// Where the call is read: the tenant's relay when it gave one, the gateway with the call's own
|
|
45
|
+
// token otherwise. None when neither is there to read it with.
|
|
46
|
+
const read = (call, token, minted) => {
|
|
47
|
+
if (options.log !== undefined) {
|
|
48
|
+
return { log: minted === undefined ? options.log(call) : options.log(call, minted), recording: "" };
|
|
49
|
+
}
|
|
50
|
+
if (typeof token !== "string" || token === "")
|
|
51
|
+
return null;
|
|
52
|
+
const at = `${bare(options.gateway ?? GATEWAY)}/v1/calls/${encodeURIComponent(call)}`;
|
|
53
|
+
const ticket = `?token=${encodeURIComponent(token)}`;
|
|
54
|
+
return { log: `${at}/events${ticket}`, recording: `${at}/recording${ticket}` };
|
|
55
|
+
};
|
|
42
56
|
// A verb's first move, read from the store and never from a closure: a second click while the
|
|
43
57
|
// first is still opening is nothing, and an old conversation is shut before a new one opens.
|
|
44
58
|
const begin = (mode) => {
|
|
@@ -195,10 +209,13 @@ export function room(options) {
|
|
|
195
209
|
}
|
|
196
210
|
if (!current(c) || store.state.phase !== "opening")
|
|
197
211
|
return;
|
|
198
|
-
|
|
212
|
+
const reading = read(minted.call, minted.log_token, minted);
|
|
213
|
+
if (reading === null)
|
|
214
|
+
return fail(c, NO_LOG_TOKEN);
|
|
215
|
+
publish({ call: minted.call, recording: reading.recording });
|
|
199
216
|
// The call id exists before the room is joined, so the log is followed from its first entry
|
|
200
217
|
// rather than from wherever the room happened to open.
|
|
201
|
-
follow(c,
|
|
218
|
+
follow(c, reading.log);
|
|
202
219
|
await seated(c, mode, minted);
|
|
203
220
|
},
|
|
204
221
|
async callMe(to) {
|
|
@@ -217,8 +234,11 @@ export function room(options) {
|
|
|
217
234
|
}
|
|
218
235
|
if (!current(c) || store.state.phase !== "opening")
|
|
219
236
|
return;
|
|
220
|
-
|
|
221
|
-
|
|
237
|
+
const reading = read(placed.call, placed.log_token);
|
|
238
|
+
if (reading === null)
|
|
239
|
+
return fail(c, NO_LOG_TOKEN);
|
|
240
|
+
publish({ call: placed.call, phase: "ringing", recording: reading.recording });
|
|
241
|
+
follow(c, reading.log);
|
|
222
242
|
},
|
|
223
243
|
async send(text) {
|
|
224
244
|
if (text.trim() === "")
|
|
@@ -270,6 +290,7 @@ function idle() {
|
|
|
270
290
|
mode: null,
|
|
271
291
|
call: "",
|
|
272
292
|
error: "",
|
|
293
|
+
recording: "",
|
|
273
294
|
log: initialState(),
|
|
274
295
|
entries: [],
|
|
275
296
|
connection: "ended",
|
|
@@ -277,6 +298,9 @@ function idle() {
|
|
|
277
298
|
speaking: QUIET,
|
|
278
299
|
};
|
|
279
300
|
}
|
|
301
|
+
function bare(url) {
|
|
302
|
+
return url.replace(/\/+$/, "");
|
|
303
|
+
}
|
|
280
304
|
function messageOf(refused) {
|
|
281
305
|
return refused instanceof Error ? refused.message : String(refused);
|
|
282
306
|
}
|
package/dist/room.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"room.js","sourceRoot":"","sources":["../src/room.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"room.js","sourceRoot":"","sources":["../src/room.ts"],"names":[],"mappings":"AAAA,kHAAkH;AAClH,EAAE;AACF,+FAA+F;AAC/F,gGAAgG;AAChG,mGAAmG;AACnG,iKAAiK;AACjK,8FAA8F;AAC9F,2FAA2F;AAE3F,OAAO,EAAE,YAAY,EAA0B,MAAM,oBAAoB,CAAC;AAE1E,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,SAAS,EAAgC,MAAM,iBAAiB,CAAC;AAE1E,OAAO,EAAE,QAAQ,EAA4B,MAAM,gBAAgB,CAAC;AACpE,OAAO,EAAE,WAAW,EAAsB,MAAM,mBAAmB,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAE5C,OAAO,EAAE,IAAI,EAAc,MAAM,YAAY,CAAC;AAuD9C,MAAM,SAAS,GAAG,MAAM,CAAC;AACzB,+FAA+F;AAC/F,MAAM,UAAU,GAAG,KAAK,CAAC;AACzB,MAAM,KAAK,GAAa,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;AAChE,MAAM,aAAa,GAAG,uFAAuF,CAAC;AAC9G,MAAM,UAAU,GAAG,+DAA+D,CAAC;AACnF,MAAM,YAAY,GAAG,mFAAmF,CAAC;AACzG,MAAM,OAAO,GAAG,yBAAyB,CAAC;AAW1C,oEAAoE;AACpE,MAAM,UAAU,IAAI,CAAC,OAAoB;IACvC,MAAM,KAAK,GAAG,IAAI,CAAY,IAAI,EAAE,CAAC,CAAC;IACtC,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC;IAC1B,MAAM,OAAO,GAAG,IAAI,GAAG,EAAc,CAAC;IACtC,IAAI,GAAG,GAAwB,IAAI,CAAC;IACpC,IAAI,MAAM,GAAG,KAAK,CAAC;IAEnB,MAAM,IAAI,GAAG,GAAY,EAAE,CAAC,CAAC,SAAS,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACvF,MAAM,OAAO,GAAG,CAAC,CAAe,EAAW,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC;IAExD,gGAAgG;IAChG,MAAM,IAAI,GAAG,CAAC,CAAe,EAAiB,EAAE;QAC9C,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC;QACjB,CAAC,CAAC,UAAU,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC,CAAC,MAAM,KAAK,IAAI;YAAE,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QAC9C,CAAC,CAAC,MAAM,GAAG,IAAI,CAAC;QAChB,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC;QACpB,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC;QACd,OAAO,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IACjF,CAAC,CAAC;IAEF,+FAA+F;IAC/F,+DAA+D;IAC/D,MAAM,IAAI,GAAG,CAAC,IAAY,EAAE,KAAyB,EAAE,MAAe,EAA6C,EAAE;QACnH,IAAI,OAAO,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;YAC9B,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;QACtG,CAAC;QACD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,EAAE;YAAE,OAAO,IAAI,CAAC;QAC3D,MAAM,EAAE,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,aAAa,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC;QACtF,MAAM,MAAM,GAAG,UAAU,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC;QACrD,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,UAAU,MAAM,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,aAAa,MAAM,EAAE,EAAE,CAAC;IACjF,CAAC,CAAC;IAEF,8FAA8F;IAC9F,6FAA6F;IAC7F,MAAM,KAAK,GAAG,CAAC,IAAU,EAAuB,EAAE;QAChD,IAAI,MAAM,IAAI,IAAI,EAAE;YAAE,OAAO,IAAI,CAAC;QAClC,IAAI,GAAG,KAAK,IAAI;YAAE,KAAK,IAAI,CAAC,GAAG,CAAC,CAAC;QACjC,MAAM,IAAI,GAAG,IAAI,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QAC5D,MAAM,CAAC,GAAiB,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;QACnF,GAAG,GAAG,CAAC,CAAC;QACR,OAAO,CAAC,EAAE,GAAG,IAAI,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,YAAY,EAAE,CAAC,CAAC;QACzE,OAAO,CAAC,CAAC;IACX,CAAC,CAAC;IAEF,MAAM,IAAI,GAAG,CAAC,CAAe,EAAE,KAAa,EAAQ,EAAE;QACpD,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;YAAE,OAAO;QACxB,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC;QACb,OAAO,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;IAC/F,CAAC,CAAC;IAEF,+FAA+F;IAC/F,gGAAgG;IAChG,MAAM,GAAG,GAAG,CAAC,CAAe,EAAiB,EAAE;QAC7C,OAAO,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;QAChE,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC;QACpB,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC;QACd,IAAI,CAAC,CAAC,UAAU,KAAK,IAAI,IAAI,CAAC,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;YAC/C,CAAC,CAAC,MAAM,GAAG,UAAU,CAAC,GAAG,EAAE;gBACzB,CAAC,CAAC,MAAM,GAAG,IAAI,CAAC;gBAChB,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC;gBACjB,CAAC,CAAC,UAAU,GAAG,IAAI,CAAC;gBACpB,OAAO,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,CAAC;YACnC,CAAC,EAAE,OAAO,CAAC,MAAM,IAAI,SAAS,CAAC,CAAC;QAClC,CAAC;QACD,OAAO,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IACjF,CAAC,CAAC;IAEF,MAAM,KAAK,GAAG,CAAC,CAAe,EAAE,OAAmB,EAAQ,EAAE;QAC3D,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI;YAAE,OAAO;QAC1C,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QACrC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;QAC3C,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC;QAChC,IAAI,MAAM,KAAK,OAAO,IAAI,CAAC,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,MAAM,CAAC;YAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;QACxG,4FAA4F;QAC5F,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO,IAAI,MAAM,KAAK,QAAQ,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QACjG,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,KAAK,MAAM,EAAE,CAAC;YACvD,MAAM,QAAQ,GAAG,CAAC,KAAe,EAAW,EAAE,CAC5C,KAAK,EAAE,YAAY,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC;YACvF,GAAG,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;QACnF,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,KAAK,GAAG,CAAC,CAAe,EAAE,MAAc,EAAQ,EAAE;QACtD,CAAC,CAAC,UAAU,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC,CAAC,MAAM,KAAK,IAAI;YAAE,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QAC9C,CAAC,CAAC,MAAM,GAAG,IAAI,CAAC;QAChB,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC;QAChC,MAAM,OAAO,GAAG,CAAC,CAAC,IAAI,KAAK,OAAO,IAAI,CAAC,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,MAAM,CAAC,CAAC;QAChF,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,IAAI,OAAO,EAAE,CAAC;YACzC,OAAO,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,oBAAoB,MAAM,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;QACjH,CAAC;aAAM,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACjF,OAAO,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;QACnD,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,CAAC;QACnC,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,MAAM,GAAG,CAAC,CAAe,EAAE,GAAW,EAAQ,EAAE;QACpD,CAAC,CAAC,UAAU,GAAG,SAAS,CACtB,GAAG,EACH;YACE,SAAS,EAAE,CAAC,OAAO,EAAE,EAAE;gBACrB,IAAI,OAAO,CAAC,CAAC,CAAC;oBAAE,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;YACpC,CAAC;YACD,YAAY,EAAE,CAAC,UAAU,EAAE,EAAE;gBAC3B,IAAI,OAAO,CAAC,CAAC,CAAC;oBAAE,OAAO,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC;YAC1C,CAAC;YACD,OAAO,EAAE,CAAC,MAAM,EAAE,EAAE;gBAClB,IAAI,OAAO,CAAC,CAAC,CAAC;oBAAE,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;YACnC,CAAC;SACF,EACD,OAAO,CAAC,KAAK,IAAI,KAAK,CACvB,CAAC;IACJ,CAAC,CAAC;IAEF,MAAM,GAAG,GAAG,CAAC,QAAkB,EAAQ,EAAE;QACvC,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC;QACjC,IAAI,GAAG,CAAC,KAAK,KAAK,QAAQ,CAAC,KAAK,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,CAAC,IAAI,IAAI,GAAG,CAAC,KAAK,KAAK,QAAQ,CAAC,KAAK;YAAE,OAAO;QACvG,OAAO,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;IACxB,CAAC,CAAC;IAEF,MAAM,MAAM,GAAG,KAAK,EAAE,CAAe,EAAE,IAAqB,EAAE,MAAc,EAAiB,EAAE;QAC7F,IAAI,OAAsB,CAAC;QAC3B,IAAI,CAAC;YACH,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,IAAI,WAAW,CAAC,EAAE,CAAC;QACrD,CAAC;QAAC,OAAO,OAAO,EAAE,CAAC;YACjB,OAAO,IAAI,CAAC,CAAC,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;QACrC,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,KAAK,SAAS;YAAE,OAAO;QAC3D,IAAI,IAAU,CAAC;QACf,IAAI,CAAC;YACH,IAAI,GAAG,MAAM,QAAQ,CAAC;gBACpB,OAAO;gBACP,IAAI;gBACJ,UAAU,EAAE,MAAM,CAAC,UAAU;gBAC7B,iBAAiB,EAAE,MAAM,CAAC,iBAAiB;gBAC3C,IAAI,EAAE,UAAU,EAAE;gBAClB,EAAE,EAAE;oBACF,YAAY,EAAE,GAAG,EAAE;wBACjB,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;4BAAE,OAAO;wBACxB,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC;wBACd,IAAI,IAAI,EAAE;4BAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;oBAC1B,CAAC;oBACD,QAAQ,EAAE,CAAC,QAAQ,EAAE,EAAE;wBACrB,IAAI,OAAO,CAAC,CAAC,CAAC;4BAAE,GAAG,CAAC,QAAQ,CAAC,CAAC;oBAChC,CAAC;oBACD,UAAU,EAAE,CAAC,UAAU,EAAE,EAAE;wBACzB,IAAI,OAAO,CAAC,CAAC,CAAC;4BAAE,OAAO,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC;oBAC1C,CAAC;iBACF;aACF,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,OAAO,EAAE,CAAC;YACjB,OAAO,IAAI,CAAC,CAAC,EAAE,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;QACvE,CAAC;QACD,uFAAuF;QACvF,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YACnD,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;YACzC,OAAO;QACT,CAAC;QACD,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC;QACd,OAAO,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC;IACnE,CAAC,CAAC;IAEF,OAAO;QACL,IAAI,KAAK;YACP,OAAO,KAAK,CAAC,KAAK,CAAC;QACrB,CAAC;QACD,SAAS,EAAE,KAAK,CAAC,SAAS;QAE1B,KAAK,CAAC,KAAK,CAAC,IAAI;YACd,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;YACtB,IAAI,CAAC,KAAK,IAAI;gBAAE,OAAO;YACvB,IAAI,MAAc,CAAC;YACnB,IAAI,CAAC;gBACH,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACtC,CAAC;YAAC,OAAO,OAAO,EAAE,CAAC;gBACjB,OAAO,IAAI,CAAC,CAAC,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;YACrC,CAAC;YACD,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,KAAK,SAAS;gBAAE,OAAO;YAC3D,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;YAC5D,IAAI,OAAO,KAAK,IAAI;gBAAE,OAAO,IAAI,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;YACnD,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;YAC7D,4FAA4F;YAC5F,uDAAuD;YACvD,MAAM,CAAC,CAAC,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;YACvB,MAAM,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QAChC,CAAC;QAED,KAAK,CAAC,MAAM,CAAC,EAAE;YACb,MAAM,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC;YACzB,IAAI,CAAC,KAAK,IAAI;gBAAE,OAAO;YACvB,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC;YAC5B,IAAI,IAAI,KAAK,SAAS;gBAAE,OAAO,IAAI,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;YACnD,IAAI,MAAwD,CAAC;YAC7D,IAAI,CAAC;gBACH,MAAM,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,CAAC;YAC1B,CAAC;YAAC,OAAO,OAAO,EAAE,CAAC;gBACjB,OAAO,IAAI,CAAC,CAAC,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;YACrC,CAAC;YACD,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,KAAK,SAAS;gBAAE,OAAO;YAC3D,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;YACpD,IAAI,OAAO,KAAK,IAAI;gBAAE,OAAO,IAAI,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;YACnD,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;YAC/E,MAAM,CAAC,CAAC,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;QACzB,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,IAAI;YACb,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE;gBAAE,OAAO;YAC/B,MAAM,IAAI,GAAG,GAAG,EAAE,IAAI,IAAI,IAAI,CAAC;YAC/B,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,KAAK,MAAM,IAAI,IAAI,KAAK,IAAI;gBAAE,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;YACpF,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxB,CAAC;QAED,KAAK,CAAC,KAAK;YACT,MAAM,CAAC,GAAG,GAAG,CAAC;YACd,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,EAAE;gBAAE,OAAO;YAClC,MAAM,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;YACvB,IAAI,IAAI,GAAG,GAAS,EAAE,GAAE,CAAC,CAAC;YAC1B,MAAM,MAAM,GAAG,IAAI,OAAO,CAAO,CAAC,IAAI,EAAE,EAAE;gBACxC,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;gBAC3C,IAAI,GAAG,GAAG,EAAE;oBACV,YAAY,CAAC,KAAK,CAAC,CAAC;oBACpB,IAAI,EAAE,CAAC;gBACT,CAAC,CAAC;YACJ,CAAC,CAAC,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAClB,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;YACtC,IAAI,EAAE,CAAC;YACP,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACvB,CAAC;QAED,SAAS;YACP,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;YACvB,OAAO,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC;QACjC,CAAC;QAED,KAAK;YACH,IAAI,MAAM;gBAAE,OAAO;YACnB,MAAM,GAAG,IAAI,CAAC;YACd,IAAI,GAAG,KAAK,IAAI;gBAAE,KAAK,IAAI,CAAC,GAAG,CAAC,CAAC;YACjC,GAAG,GAAG,IAAI,CAAC;YACX,KAAK,MAAM,IAAI,IAAI,OAAO;gBAAE,IAAI,EAAE,CAAC;YACnC,OAAO,CAAC,KAAK,EAAE,CAAC;YAChB,KAAK,CAAC,KAAK,EAAE,CAAC;QAChB,CAAC;KACF,CAAC;AACJ,CAAC;AAED,SAAS,IAAI;IACX,OAAO;QACL,KAAK,EAAE,MAAM;QACb,IAAI,EAAE,IAAI;QACV,IAAI,EAAE,EAAE;QACR,KAAK,EAAE,EAAE;QACT,SAAS,EAAE,EAAE;QACb,GAAG,EAAE,YAAY,EAAE;QACnB,OAAO,EAAE,EAAE;QACX,UAAU,EAAE,OAAO;QACnB,UAAU,EAAE,KAAK;QACjB,QAAQ,EAAE,KAAK;KAChB,CAAC;AACJ,CAAC;AAED,SAAS,IAAI,CAAC,GAAW;IACvB,OAAO,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AACjC,CAAC;AAED,SAAS,SAAS,CAAC,OAAgB;IACjC,OAAO,OAAO,YAAY,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AACtE,CAAC"}
|
package/dist/server/index.d.ts
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
/** @pinecall/room/server: what a tenant's server does with its key — a ticket for a seat, a call placed. */
|
|
2
|
-
/** What `POST /v1/tokens` answers: where the room is, the ticket into it,
|
|
2
|
+
/** What `POST /v1/tokens` answers: where the room is, the ticket into it, the call's id, and the
|
|
3
|
+
* token the page reads that call's log and recording with. The protocol's `Minted`, in rest.json. */
|
|
3
4
|
export interface Minted {
|
|
4
5
|
server_url: string;
|
|
5
6
|
participant_token: string;
|
|
6
7
|
call: string;
|
|
8
|
+
log_token: string;
|
|
7
9
|
}
|
|
8
10
|
/** What `POST /v1/agents/{agent}/dial` answers: the call's id, before anything has rung. */
|
|
9
11
|
export interface Dialed {
|
|
@@ -12,7 +14,11 @@ export interface Dialed {
|
|
|
12
14
|
to: string;
|
|
13
15
|
from: string;
|
|
14
16
|
env: string;
|
|
17
|
+
log_token: string;
|
|
15
18
|
}
|
|
19
|
+
/** What the page's log token reads the call through: the public projection, or the tenant's own —
|
|
20
|
+
* the tools, the latency, the cost — when the page draws them. */
|
|
21
|
+
export type LogProjection = "public" | "tenant";
|
|
16
22
|
export interface MintOptions {
|
|
17
23
|
/** The gateway, `https://box.pinecall.io` or your own. */
|
|
18
24
|
url: string;
|
|
@@ -23,6 +29,7 @@ export interface MintOptions {
|
|
|
23
29
|
/** Who is calling: memory files the call under it. */
|
|
24
30
|
contact?: string | undefined;
|
|
25
31
|
metadata?: Record<string, unknown> | undefined;
|
|
32
|
+
log?: LogProjection | undefined;
|
|
26
33
|
fetch?: typeof fetch | undefined;
|
|
27
34
|
}
|
|
28
35
|
export interface DialOptions {
|
|
@@ -32,6 +39,7 @@ export interface DialOptions {
|
|
|
32
39
|
to: string;
|
|
33
40
|
/** Which of the agent's own numbers the far end sees. Unsaid, the first one it answers at. */
|
|
34
41
|
from?: string | undefined;
|
|
42
|
+
log?: LogProjection | undefined;
|
|
35
43
|
fetch?: typeof fetch | undefined;
|
|
36
44
|
}
|
|
37
45
|
/** The gateway said no. `detail` is its own sentence when it sent one; it names the fix. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA,4GAA4G;AAM5G
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA,4GAA4G;AAM5G;qGACqG;AACrG,MAAM,WAAW,MAAM;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,4FAA4F;AAC5F,MAAM,WAAW,MAAM;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;kEACkE;AAClE,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAEhD,MAAM,WAAW,WAAW;IAC1B,0DAA0D;IAC1D,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,oFAAoF;IACpF,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,sDAAsD;IACtD,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;IAC/C,GAAG,CAAC,EAAE,aAAa,GAAG,SAAS,CAAC;IAChC,KAAK,CAAC,EAAE,OAAO,KAAK,GAAG,SAAS,CAAC;CAClC;AAED,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,iCAAiC;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,8FAA8F;IAC9F,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,GAAG,CAAC,EAAE,aAAa,GAAG,SAAS,CAAC;IAChC,KAAK,CAAC,EAAE,OAAO,KAAK,GAAG,SAAS,CAAC;CAClC;AAED,4FAA4F;AAC5F,qBAAa,cAAe,SAAQ,KAAK;IACvC,SAAkB,IAAI,oBAAoB;IAC1C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAE/B,YAAY,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,EAIhD;CACF;AAKD,6EAA6E;AAC7E,wBAAsB,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAM7E;AAED,6GAA6G;AAC7G,wBAAsB,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAM7E"}
|
package/dist/server/index.js
CHANGED
|
@@ -18,17 +18,18 @@ export class GatewayRefused extends Error {
|
|
|
18
18
|
const TIMEOUT_MS = 10_000;
|
|
19
19
|
/** A ticket for one seat in one new call. The key needs the `talk` scope. */
|
|
20
20
|
export async function mint(key, options) {
|
|
21
|
-
const { url, agent, scope, ttl_s, contact, metadata } = options;
|
|
22
|
-
const
|
|
21
|
+
const { url, agent, scope, ttl_s, contact, metadata, log } = options;
|
|
22
|
+
const said = { agent, scope, ttl_s, contact, metadata, log };
|
|
23
|
+
const body = await post(key, `${bare(url)}/v1/tokens`, said, options.fetch);
|
|
23
24
|
if (!isMinted(body))
|
|
24
25
|
throw new Error("the gateway answered /v1/tokens with a shape this package does not know");
|
|
25
26
|
return body;
|
|
26
27
|
}
|
|
27
28
|
/** Have the agent call `to`. The key needs the `talk` scope; the number must have reached the org before. */
|
|
28
29
|
export async function dial(key, options) {
|
|
29
|
-
const { url, agent, to, from } = options;
|
|
30
|
+
const { url, agent, to, from, log } = options;
|
|
30
31
|
const path = `${bare(url)}/v1/agents/${encodeURIComponent(agent)}/dial`;
|
|
31
|
-
const body = await post(key, path, { to, from }, options.fetch);
|
|
32
|
+
const body = await post(key, path, { to, from, log }, options.fetch);
|
|
32
33
|
if (!isDialed(body))
|
|
33
34
|
throw new Error("the gateway answered the dial with a shape this package does not know");
|
|
34
35
|
return body;
|
|
@@ -62,10 +63,10 @@ function bare(url) {
|
|
|
62
63
|
return url.replace(/\/+$/, "");
|
|
63
64
|
}
|
|
64
65
|
function isMinted(body) {
|
|
65
|
-
return hasStrings(body, ["server_url", "participant_token", "call"]);
|
|
66
|
+
return hasStrings(body, ["server_url", "participant_token", "call", "log_token"]);
|
|
66
67
|
}
|
|
67
68
|
function isDialed(body) {
|
|
68
|
-
return hasStrings(body, ["call", "agent", "to", "from", "env"]);
|
|
69
|
+
return hasStrings(body, ["call", "agent", "to", "from", "env", "log_token"]);
|
|
69
70
|
}
|
|
70
71
|
function hasStrings(body, fields) {
|
|
71
72
|
return typeof body === "object" && body !== null && fields.every((field) => typeof Reflect.get(body, field) === "string");
|
package/dist/server/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA,4GAA4G;AAC5G,EAAE;AACF,mGAAmG;AACnG,mGAAmG;AACnG,iEAAiE;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pinecall/room",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2",
|
|
4
4
|
"description": "The caller's side of a Pinecall call in a browser: one store, the seat and the log joined, no framework",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"author": "Pinecall <hello@pinecall.io>",
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
"dist"
|
|
31
31
|
],
|
|
32
32
|
"dependencies": {
|
|
33
|
-
"@pinecall/protocol": "^0.6.
|
|
33
|
+
"@pinecall/protocol": "^0.6.6"
|
|
34
34
|
},
|
|
35
35
|
"peerDependencies": {
|
|
36
36
|
"livekit-client": "^2.0.0",
|