@talqing/client 0.6.0 → 0.8.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/LICENSE +1 -1
- package/README.md +6 -18
- package/dist/cjs/chat.d.ts +41 -5
- package/dist/cjs/chat.d.ts.map +1 -1
- package/dist/cjs/chat.js +1 -1
- package/dist/cjs/chat.js.map +1 -1
- package/dist/cjs/files.d.ts +13 -0
- package/dist/cjs/files.d.ts.map +1 -0
- package/dist/cjs/files.js +46 -0
- package/dist/cjs/files.js.map +1 -0
- package/dist/cjs/images.js +2 -2
- package/dist/cjs/images.js.map +1 -1
- package/dist/cjs/index.d.ts +3 -2
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +10 -7
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/participant.d.ts +8 -0
- package/dist/cjs/participant.d.ts.map +1 -0
- package/dist/cjs/participant.js +13 -0
- package/dist/cjs/participant.js.map +1 -0
- package/dist/esm/chat.d.ts +41 -5
- package/dist/esm/chat.d.ts.map +1 -1
- package/dist/esm/chat.js +1 -1
- package/dist/esm/chat.js.map +1 -1
- package/dist/esm/files.d.ts +13 -0
- package/dist/esm/files.d.ts.map +1 -0
- package/dist/esm/files.js +41 -0
- package/dist/esm/files.js.map +1 -0
- package/dist/esm/images.js +1 -1
- package/dist/esm/images.js.map +1 -1
- package/dist/esm/index.d.ts +3 -2
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +4 -3
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/participant.d.ts +8 -0
- package/dist/esm/participant.d.ts.map +1 -0
- package/dist/esm/participant.js +10 -0
- package/dist/esm/participant.js.map +1 -0
- package/package.json +2 -2
- package/src/chat.ts +46 -6
- package/src/files.ts +40 -0
- package/src/images.ts +1 -1
- package/src/index.ts +13 -7
- package/src/participant.ts +12 -0
- package/src/userdata.ts +0 -57
package/LICENSE
CHANGED
package/README.md
CHANGED
|
@@ -2,12 +2,17 @@
|
|
|
2
2
|
|
|
3
3
|
The Talqing call protocol, over a LiveKit `Room`. Framework-free.
|
|
4
4
|
|
|
5
|
+
> **Breaking changes in 0.7.0.** `getTalqingUserdata` and `setTalqingUserdata`
|
|
6
|
+
> are removed: the browser can no longer read or write a live session's
|
|
7
|
+
> userdata. Seed it with `userdata` when your server mints the call token; tools
|
|
8
|
+
> change it during the call.
|
|
9
|
+
|
|
5
10
|
```bash
|
|
6
11
|
npm install @talqing/client livekit-client
|
|
7
12
|
```
|
|
8
13
|
|
|
9
14
|
Everything here is something only Talqing can write: the mint-once token source,
|
|
10
|
-
the
|
|
15
|
+
the `talqing.images` byte-stream topic and its
|
|
11
16
|
acknowledgement, the `talqing.frontend_rpc` envelope, and the capture settings
|
|
12
17
|
that decide whether the agent can read a shared screen. **Nothing here renames
|
|
13
18
|
LiveKit** — for a room, a track or a participant, use `livekit-client` directly.
|
|
@@ -46,23 +51,6 @@ Leave `TALQING_AUDIO_CAPTURE_DEFAULTS` on. Echo cancellation is what stops the
|
|
|
46
51
|
agent hearing its own speech through the microphone and interrupting itself,
|
|
47
52
|
which sounds exactly like a bad model.
|
|
48
53
|
|
|
49
|
-
## Userdata
|
|
50
|
-
|
|
51
|
-
What the agent knows about the person on the call, readable as
|
|
52
|
-
`{{userdata.field}}` from its prompt and its tools.
|
|
53
|
-
|
|
54
|
-
```ts
|
|
55
|
-
import { getTalqingUserdata, setTalqingUserdata } from "@talqing/client";
|
|
56
|
-
|
|
57
|
-
await setTalqingUserdata(room, { cart_total: 4200 }); // → { ok, error? }
|
|
58
|
-
const { tier } = await getTalqingUserdata(room, ["tier"]);
|
|
59
|
-
```
|
|
60
|
-
|
|
61
|
-
Both are RPCs to the worker running the call, with a 3-second timeout by
|
|
62
|
-
default. `set` resolves `{ ok: false }` when the agent has not joined — a write
|
|
63
|
-
that did not land is a state you can render — while `get` **throws**, because a
|
|
64
|
-
read that returned nothing is not.
|
|
65
|
-
|
|
66
54
|
## Images
|
|
67
55
|
|
|
68
56
|
```ts
|
package/dist/cjs/chat.d.ts
CHANGED
|
@@ -8,7 +8,8 @@ export interface TalqingChatCredentials {
|
|
|
8
8
|
/** The API this chat lives on. */
|
|
9
9
|
api_url: string;
|
|
10
10
|
}
|
|
11
|
-
|
|
11
|
+
/** A photo the person sent. */
|
|
12
|
+
export interface TalqingChatImage {
|
|
12
13
|
id: string;
|
|
13
14
|
kind: "image";
|
|
14
15
|
mime_type: string;
|
|
@@ -20,6 +21,37 @@ export interface TalqingChatAttachment {
|
|
|
20
21
|
url: string;
|
|
21
22
|
url_expires_at: string;
|
|
22
23
|
}
|
|
24
|
+
/** A PDF or Word file the person sent, and whether the agent could read it. */
|
|
25
|
+
export interface TalqingChatDocument {
|
|
26
|
+
id: string;
|
|
27
|
+
kind: "document";
|
|
28
|
+
mime_type: string;
|
|
29
|
+
bytes: number;
|
|
30
|
+
filename: string | null;
|
|
31
|
+
/** `pending` until the agent's next turn reads it. */
|
|
32
|
+
status: "pending" | "read" | "unreadable";
|
|
33
|
+
/** A PDF's page count; null for Word files. */
|
|
34
|
+
pages: number | null;
|
|
35
|
+
unreadable_reason: string | null;
|
|
36
|
+
/** A download link, valid until `url_expires_at`. */
|
|
37
|
+
url: string;
|
|
38
|
+
url_expires_at: string;
|
|
39
|
+
}
|
|
40
|
+
/** Any other file the person sent; the agent cannot open it. */
|
|
41
|
+
export interface TalqingChatFileAttachment {
|
|
42
|
+
id: string;
|
|
43
|
+
kind: "file";
|
|
44
|
+
mime_type: string;
|
|
45
|
+
/** The type read from its bytes, e.g. `xlsx`; `bin` if unknown. */
|
|
46
|
+
extension: string;
|
|
47
|
+
/** Set when `url` plays in an `<audio>` or `<video>` element. */
|
|
48
|
+
playable: "audio" | "video" | null;
|
|
49
|
+
bytes: number;
|
|
50
|
+
filename: string | null;
|
|
51
|
+
url: string;
|
|
52
|
+
url_expires_at: string;
|
|
53
|
+
}
|
|
54
|
+
export type TalqingChatAttachment = TalqingChatImage | TalqingChatDocument | TalqingChatFileAttachment;
|
|
23
55
|
/** One message in the chat. A browser only ever receives what the person
|
|
24
56
|
* chatting can see — never the agent's tool calls. */
|
|
25
57
|
export interface TalqingChatItem {
|
|
@@ -29,9 +61,13 @@ export interface TalqingChatItem {
|
|
|
29
61
|
direction: "inbound" | "outbound" | "internal";
|
|
30
62
|
type: string;
|
|
31
63
|
role: "user" | "assistant" | "system" | "developer" | "tool" | null;
|
|
32
|
-
/** Null on a message that is only
|
|
64
|
+
/** Null on a message that is only files. */
|
|
33
65
|
text: string | null;
|
|
34
66
|
attachments: TalqingChatAttachment[];
|
|
67
|
+
/** Files the person sent that could not be stored, and why. */
|
|
68
|
+
attachments_not_kept: {
|
|
69
|
+
reason: string;
|
|
70
|
+
}[];
|
|
35
71
|
created_at: string;
|
|
36
72
|
}
|
|
37
73
|
/** What one message led to. */
|
|
@@ -63,8 +99,8 @@ export type TalqingChatEvent = {
|
|
|
63
99
|
} & TalqingChatItem) | ({
|
|
64
100
|
event: "turn.result";
|
|
65
101
|
} & TalqingChatTurn);
|
|
66
|
-
/**
|
|
67
|
-
export interface
|
|
102
|
+
/** A file to send with a message, as a `data:` URL — see `talqingFileDataUrl`. */
|
|
103
|
+
export interface TalqingChatFile {
|
|
68
104
|
data_url: string;
|
|
69
105
|
filename?: string;
|
|
70
106
|
}
|
|
@@ -89,7 +125,7 @@ export declare class TalqingChat {
|
|
|
89
125
|
/** Send a message. `events` yields the reply as it is generated; `result`
|
|
90
126
|
* resolves with the whole turn. Either can be used without the other. */
|
|
91
127
|
send(text: string, options?: {
|
|
92
|
-
|
|
128
|
+
files?: TalqingChatFile[];
|
|
93
129
|
}): {
|
|
94
130
|
events: AsyncIterable<TalqingChatEvent>;
|
|
95
131
|
result: Promise<TalqingChatTurn>;
|
package/dist/cjs/chat.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat.d.ts","sourceRoot":"","sources":["../../src/chat.ts"],"names":[],"mappings":"AAQA;wEACwE;AACxE,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,uCAAuC;IACvC,UAAU,EAAE,MAAM,CAAC;IACnB,kCAAkC;IAClC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,
|
|
1
|
+
{"version":3,"file":"chat.d.ts","sourceRoot":"","sources":["../../src/chat.ts"],"names":[],"mappings":"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"}
|
package/dist/cjs/chat.js
CHANGED
package/dist/cjs/chat.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat.js","sourceRoot":"","sources":["../../src/chat.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;
|
|
1
|
+
{"version":3,"file":"chat.js","sourceRoot":"","sources":["../../src/chat.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/** Decoded size the server refuses above, for a file of any type. */
|
|
2
|
+
export declare const TALQING_FILE_MAX_BYTES: number;
|
|
3
|
+
/** Files per message; the server refuses more. */
|
|
4
|
+
export declare const TALQING_MAX_FILES_PER_MESSAGE = 4;
|
|
5
|
+
/** Refuse what the browser can see is wrong, instantly and with no round trip.
|
|
6
|
+
* Returns the sentence to show, or null when the file is fine — the same
|
|
7
|
+
* sentence the server would send. */
|
|
8
|
+
export declare function talqingFileRejection(file: File): string | null;
|
|
9
|
+
/** The `data:` URL a chat message carries for this file. Photos are
|
|
10
|
+
* downscaled first, as on a call; everything else is sent as it is. Throws
|
|
11
|
+
* the sentence to show if the file is refused. */
|
|
12
|
+
export declare function talqingFileDataUrl(file: File): Promise<string>;
|
|
13
|
+
//# sourceMappingURL=files.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../../src/files.ts"],"names":[],"mappings":"AAUA,qEAAqE;AACrE,eAAO,MAAM,sBAAsB,QAAmB,CAAC;AACvD,kDAAkD;AAClD,eAAO,MAAM,6BAA6B,IAAI,CAAC;AAI/C;;sCAEsC;AACtC,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,GAAG,IAAI,CAI9D;AAED;;mDAEmD;AACnD,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAUpE"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TALQING_MAX_FILES_PER_MESSAGE = exports.TALQING_FILE_MAX_BYTES = void 0;
|
|
4
|
+
exports.talqingFileRejection = talqingFileRejection;
|
|
5
|
+
exports.talqingFileDataUrl = talqingFileDataUrl;
|
|
6
|
+
const images_js_1 = require("./images.js");
|
|
7
|
+
/* ── files ────────────────────────────────────────────────────────────────
|
|
8
|
+
*
|
|
9
|
+
* A person attaches files to a text chat message. Any type is accepted and
|
|
10
|
+
* stored; photos, PDFs and Word files are read by the agent, and anything else
|
|
11
|
+
* is kept for you and named to the agent as something it cannot open. The
|
|
12
|
+
* server decides the type from the bytes, so nothing here checks it.
|
|
13
|
+
*/
|
|
14
|
+
/** Decoded size the server refuses above, for a file of any type. */
|
|
15
|
+
exports.TALQING_FILE_MAX_BYTES = 20 * 1024 * 1024;
|
|
16
|
+
/** Files per message; the server refuses more. */
|
|
17
|
+
exports.TALQING_MAX_FILES_PER_MESSAGE = 4;
|
|
18
|
+
/** Photos downscaled before sending, as on a call. */
|
|
19
|
+
const DOWNSCALED_TYPES = ["image/jpeg", "image/png", "image/webp"];
|
|
20
|
+
/** Refuse what the browser can see is wrong, instantly and with no round trip.
|
|
21
|
+
* Returns the sentence to show, or null when the file is fine — the same
|
|
22
|
+
* sentence the server would send. */
|
|
23
|
+
function talqingFileRejection(file) {
|
|
24
|
+
if (file.size === 0)
|
|
25
|
+
return "that file is empty";
|
|
26
|
+
if (file.size > exports.TALQING_FILE_MAX_BYTES)
|
|
27
|
+
return "files are 20 MB or smaller";
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
/** The `data:` URL a chat message carries for this file. Photos are
|
|
31
|
+
* downscaled first, as on a call; everything else is sent as it is. Throws
|
|
32
|
+
* the sentence to show if the file is refused. */
|
|
33
|
+
async function talqingFileDataUrl(file) {
|
|
34
|
+
const rejection = talqingFileRejection(file);
|
|
35
|
+
if (rejection)
|
|
36
|
+
throw new Error(rejection);
|
|
37
|
+
if (DOWNSCALED_TYPES.includes(file.type))
|
|
38
|
+
return await (0, images_js_1.talqingImageDataUrl)(file);
|
|
39
|
+
return await new Promise((resolve, reject) => {
|
|
40
|
+
const reader = new FileReader();
|
|
41
|
+
reader.onerror = () => reject(new Error("that file could not be read"));
|
|
42
|
+
reader.onload = () => resolve(String(reader.result));
|
|
43
|
+
reader.readAsDataURL(file);
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=files.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"files.js","sourceRoot":"","sources":["../../src/files.ts"],"names":[],"mappings":";;;AAoBA,oDAIC;AAKD,gDAUC;AAvCD,2CAAkD;AAElD;;;;;;GAMG;AAEH,qEAAqE;AACxD,QAAA,sBAAsB,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AACvD,kDAAkD;AACrC,QAAA,6BAA6B,GAAG,CAAC,CAAC;AAC/C,sDAAsD;AACtD,MAAM,gBAAgB,GAAG,CAAC,YAAY,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC;AAEnE;;sCAEsC;AACtC,SAAgB,oBAAoB,CAAC,IAAU;IAC7C,IAAI,IAAI,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,oBAAoB,CAAC;IACjD,IAAI,IAAI,CAAC,IAAI,GAAG,8BAAsB;QAAE,OAAO,4BAA4B,CAAC;IAC5E,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;mDAEmD;AAC5C,KAAK,UAAU,kBAAkB,CAAC,IAAU;IACjD,MAAM,SAAS,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;IAC7C,IAAI,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC;IAC1C,IAAI,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,MAAM,IAAA,+BAAmB,EAAC,IAAI,CAAC,CAAC;IACjF,OAAO,MAAM,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACnD,MAAM,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAChC,MAAM,CAAC,OAAO,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC,CAAC;QACxE,MAAM,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;QACrD,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;AACL,CAAC"}
|
package/dist/cjs/images.js
CHANGED
|
@@ -6,7 +6,7 @@ exports.talqingDownscaleImage = talqingDownscaleImage;
|
|
|
6
6
|
exports.talqingImageDataUrl = talqingImageDataUrl;
|
|
7
7
|
exports.sendTalqingImage = sendTalqingImage;
|
|
8
8
|
exports.onTalqingImageResult = onTalqingImageResult;
|
|
9
|
-
const
|
|
9
|
+
const participant_js_1 = require("./participant.js");
|
|
10
10
|
/* ── images ───────────────────────────────────────────────────────────────
|
|
11
11
|
*
|
|
12
12
|
* A caller attaches a photo on a web voice or video call and the agent sees
|
|
@@ -96,7 +96,7 @@ async function talqingImageDataUrl(file) {
|
|
|
96
96
|
* outcome arrives later, on the ack — see `onTalqingImageResult`. Throws the
|
|
97
97
|
* sentence to show if the file is refused or the agent is not there yet. */
|
|
98
98
|
async function sendTalqingImage(room, file) {
|
|
99
|
-
const agent = (0,
|
|
99
|
+
const agent = (0, participant_js_1.talqingAgentParticipant)(room);
|
|
100
100
|
if (!agent)
|
|
101
101
|
throw new Error("the agent is not on the call yet");
|
|
102
102
|
const rejection = talqingImageRejection(file);
|
package/dist/cjs/images.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"images.js","sourceRoot":"","sources":["../../src/images.ts"],"names":[],"mappings":";;;AAkCA,sDAMC;AAOD,sDAsBC;AAOD,kDAUC;AAyBD,4CAwBC;AAMD,oDAkBC;AA9JD
|
|
1
|
+
{"version":3,"file":"images.js","sourceRoot":"","sources":["../../src/images.ts"],"names":[],"mappings":";;;AAkCA,sDAMC;AAOD,sDAsBC;AAOD,kDAUC;AAyBD,4CAwBC;AAMD,oDAkBC;AA9JD,qDAA2D;AAE3D;;;;;;;;;;;GAWG;AAEU,QAAA,mBAAmB,GAAG,gBAAgB,CAAC;AACpD;2EAC2E;AAC9D,QAAA,uBAAuB,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AACxD;;gEAEgE;AACnD,QAAA,yBAAyB,GAAG,IAAI,CAAC;AAC9C,MAAM,mBAAmB,GAAG,CAAC,YAAY,EAAE,WAAW,EAAE,YAAY,CAAU,CAAC;AAC/E;;uBAEuB;AACV,QAAA,4BAA4B,GAAG,KAAM,CAAC;AAEnD;;;wBAGwB;AACxB,SAAgB,qBAAqB,CAAC,IAAU;IAC9C,IAAI,CAAE,mBAAyC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACpE,OAAO,sCAAsC,CAAC;IAChD,CAAC;IACD,IAAI,IAAI,CAAC,IAAI,GAAG,+BAAuB;QAAE,OAAO,6BAA6B,CAAC;IAC9E,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;gCAIgC;AACzB,KAAK,UAAU,qBAAqB,CAAC,IAAU;IACpD,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAC7C,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QACtD,MAAM,KAAK,GAAG,OAAO,GAAG,iCAAyB,CAAC,CAAC,CAAC,iCAAyB,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5F,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QAChD,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC;QAC7D,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC;QAC/D,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACxC,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;QACnE,OAAO,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QAC7D,wEAAwE;QACxE,8BAA8B;QAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,YAAY,CAAC;QACpE,MAAM,IAAI,GAAG,MAAM,IAAI,OAAO,CAAc,CAAC,OAAO,EAAE,EAAE,CACtD,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,CACnC,CAAC;QACF,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;QAC3D,OAAO,IAAI,CAAC;IACd,CAAC;YAAS,CAAC;QACT,MAAM,CAAC,KAAK,EAAE,CAAC;IACjB,CAAC;AACH,CAAC;AAED;;;;6EAI6E;AACtE,KAAK,UAAU,mBAAmB,CAAC,IAAU;IAClD,MAAM,SAAS,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC;IAC9C,IAAI,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC;IAC1C,MAAM,IAAI,GAAG,MAAM,qBAAqB,CAAC,IAAI,CAAC,CAAC;IAC/C,OAAO,MAAM,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACnD,MAAM,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAChC,MAAM,CAAC,OAAO,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC,CAAC;QACzE,MAAM,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;QACrD,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;AACL,CAAC;AAoBD;;;;6EAI6E;AACtE,KAAK,UAAU,gBAAgB,CAAC,IAAU,EAAE,IAAU;IAC3D,MAAM,KAAK,GAAG,IAAA,wCAAuB,EAAC,IAAI,CAAC,CAAC;IAC5C,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;IAChE,MAAM,SAAS,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC;IAC9C,IAAI,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC;IAE1C,MAAM,IAAI,GAAG,MAAM,qBAAqB,CAAC,IAAI,CAAC,CAAC;IAC/C,yEAAyE;IACzE,4DAA4D;IAC5D,MAAM,EAAE,EAAE,EAAE,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CACjD,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,EAChD;QACE,KAAK,EAAE,2BAAmB;QAC1B,QAAQ,EAAE,IAAI,CAAC,IAAI;QACnB,qBAAqB,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC;KACxC,CACF,CAAC;IACF,OAAO;QACL,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,UAAU,EAAE,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC;QACrC,MAAM,EAAE,IAAI,CAAC,GAAG,EAAE;QAClB,MAAM,EAAE,SAAS;KAClB,CAAC;AACJ,CAAC;AAED;;;4EAG4E;AAC5E,SAAgB,oBAAoB,CAClC,IAAU,EACV,QAA6E;IAE7E,IAAI,CAAC,iBAAiB,CAAC,sBAAsB,EAAE,KAAK,EAAE,IAAuB,EAAE,EAAE;QAC/E,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAI/D,CAAC;QACF,QAAQ,CAAC;YACP,QAAQ,EAAE,SAAS;YACnB,EAAE;YACF,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,IAAI,6BAA6B;SAC/D,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;IACH,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,mBAAmB,CAAC,sBAAsB,CAAC,CAAC;AAChE,CAAC"}
|
package/dist/cjs/index.d.ts
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
export { createTalqingTokenSource } from "./token.js";
|
|
2
2
|
export type { TalqingCallCredentials } from "./token.js";
|
|
3
|
-
export {
|
|
3
|
+
export { talqingAgentParticipant } from "./participant.js";
|
|
4
4
|
export { onTalqingImageResult, sendTalqingImage, talqingDownscaleImage, talqingImageDataUrl, talqingImageRejection, TALQING_IMAGE_ACK_TIMEOUT_MS, TALQING_IMAGE_MAX_BYTES, TALQING_IMAGE_MAX_EDGE_PX, TALQING_IMAGE_TOPIC, } from "./images.js";
|
|
5
5
|
export type { TalqingImageStatus, TalqingSentImage } from "./images.js";
|
|
6
|
+
export { talqingFileDataUrl, talqingFileRejection, TALQING_FILE_MAX_BYTES, TALQING_MAX_FILES_PER_MESSAGE, } from "./files.js";
|
|
6
7
|
export { registerTalqingRpcHandlers, TalqingRpcError } from "./rpc.js";
|
|
7
8
|
export type { TalqingFrontendRpcEnvelope, TalqingRpcHandler, TalqingRpcHandlers, TalqingRpcInvocation, } from "./rpc.js";
|
|
8
9
|
export { TALQING_AUDIO_CAPTURE_DEFAULTS, TALQING_SCREEN_SHARE_CAPTURE, TALQING_SCREEN_SHARE_PUBLISH, } from "./media.js";
|
|
9
10
|
export { TalqingChat, TalqingChatError } from "./chat.js";
|
|
10
|
-
export type { TalqingChatAttachment, TalqingChatCredentials, TalqingChatEvent, TalqingChatImage, TalqingChatItem, TalqingChatTurn, } from "./chat.js";
|
|
11
|
+
export type { TalqingChatAttachment, TalqingChatCredentials, TalqingChatDocument, TalqingChatEvent, TalqingChatFile, TalqingChatFileAttachment, TalqingChatImage, TalqingChatItem, TalqingChatTurn, } from "./chat.js";
|
|
11
12
|
export type { JsonObject, JsonPrimitive, JsonValue } from "./json.js";
|
|
12
13
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/cjs/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AACtD,YAAY,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAEzD,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AACtD,YAAY,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAEzD,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAE3D,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,qBAAqB,EACrB,mBAAmB,EACnB,qBAAqB,EACrB,4BAA4B,EAC5B,uBAAuB,EACvB,yBAAyB,EACzB,mBAAmB,GACpB,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAExE,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,sBAAsB,EACtB,6BAA6B,GAC9B,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,0BAA0B,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AACvE,YAAY,EACV,0BAA0B,EAC1B,iBAAiB,EACjB,kBAAkB,EAClB,oBAAoB,GACrB,MAAM,UAAU,CAAC;AAElB,OAAO,EACL,8BAA8B,EAC9B,4BAA4B,EAC5B,4BAA4B,GAC7B,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC1D,YAAY,EACV,qBAAqB,EACrB,sBAAsB,EACtB,mBAAmB,EACnB,gBAAgB,EAChB,eAAe,EACf,yBAAyB,EACzB,gBAAgB,EAChB,eAAe,EACf,eAAe,GAChB,MAAM,WAAW,CAAC;AAEnB,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC"}
|
package/dist/cjs/index.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
/* The Talqing call protocol, over a LiveKit `Room`. Framework-free.
|
|
3
3
|
*
|
|
4
4
|
* Everything here is something only Talqing can write: the mint-once token
|
|
5
|
-
* source, the
|
|
5
|
+
* source, the `talqing.images` byte-stream topic
|
|
6
6
|
* and its ack, the `talqing.frontend_rpc` envelope, and the measured capture
|
|
7
7
|
* settings. Nothing here renames LiveKit — for a room, a track or a
|
|
8
8
|
* participant, use `livekit-client` directly.
|
|
@@ -10,16 +10,14 @@
|
|
|
10
10
|
* React bindings for all of it are `@talqing/react`.
|
|
11
11
|
*
|
|
12
12
|
* `TalqingChat` is the one thing here with no room behind it: a text chat, over
|
|
13
|
-
* HTTP, on a chat token.
|
|
13
|
+
* HTTP, on a chat token, whose messages carry files (`talqingFileDataUrl`).
|
|
14
14
|
*/
|
|
15
15
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
-
exports.TalqingChatError = exports.TalqingChat = exports.TALQING_SCREEN_SHARE_PUBLISH = exports.TALQING_SCREEN_SHARE_CAPTURE = exports.TALQING_AUDIO_CAPTURE_DEFAULTS = exports.TalqingRpcError = exports.registerTalqingRpcHandlers = exports.TALQING_IMAGE_TOPIC = exports.TALQING_IMAGE_MAX_EDGE_PX = exports.TALQING_IMAGE_MAX_BYTES = exports.TALQING_IMAGE_ACK_TIMEOUT_MS = exports.talqingImageRejection = exports.talqingImageDataUrl = exports.talqingDownscaleImage = exports.sendTalqingImage = exports.onTalqingImageResult = exports.talqingAgentParticipant = exports.
|
|
16
|
+
exports.TalqingChatError = exports.TalqingChat = exports.TALQING_SCREEN_SHARE_PUBLISH = exports.TALQING_SCREEN_SHARE_CAPTURE = exports.TALQING_AUDIO_CAPTURE_DEFAULTS = exports.TalqingRpcError = exports.registerTalqingRpcHandlers = exports.TALQING_MAX_FILES_PER_MESSAGE = exports.TALQING_FILE_MAX_BYTES = exports.talqingFileRejection = exports.talqingFileDataUrl = exports.TALQING_IMAGE_TOPIC = exports.TALQING_IMAGE_MAX_EDGE_PX = exports.TALQING_IMAGE_MAX_BYTES = exports.TALQING_IMAGE_ACK_TIMEOUT_MS = exports.talqingImageRejection = exports.talqingImageDataUrl = exports.talqingDownscaleImage = exports.sendTalqingImage = exports.onTalqingImageResult = exports.talqingAgentParticipant = exports.createTalqingTokenSource = void 0;
|
|
17
17
|
var token_js_1 = require("./token.js");
|
|
18
18
|
Object.defineProperty(exports, "createTalqingTokenSource", { enumerable: true, get: function () { return token_js_1.createTalqingTokenSource; } });
|
|
19
|
-
var
|
|
20
|
-
Object.defineProperty(exports, "
|
|
21
|
-
Object.defineProperty(exports, "setTalqingUserdata", { enumerable: true, get: function () { return userdata_js_1.setTalqingUserdata; } });
|
|
22
|
-
Object.defineProperty(exports, "talqingAgentParticipant", { enumerable: true, get: function () { return userdata_js_1.talqingAgentParticipant; } });
|
|
19
|
+
var participant_js_1 = require("./participant.js");
|
|
20
|
+
Object.defineProperty(exports, "talqingAgentParticipant", { enumerable: true, get: function () { return participant_js_1.talqingAgentParticipant; } });
|
|
23
21
|
var images_js_1 = require("./images.js");
|
|
24
22
|
Object.defineProperty(exports, "onTalqingImageResult", { enumerable: true, get: function () { return images_js_1.onTalqingImageResult; } });
|
|
25
23
|
Object.defineProperty(exports, "sendTalqingImage", { enumerable: true, get: function () { return images_js_1.sendTalqingImage; } });
|
|
@@ -30,6 +28,11 @@ Object.defineProperty(exports, "TALQING_IMAGE_ACK_TIMEOUT_MS", { enumerable: tru
|
|
|
30
28
|
Object.defineProperty(exports, "TALQING_IMAGE_MAX_BYTES", { enumerable: true, get: function () { return images_js_1.TALQING_IMAGE_MAX_BYTES; } });
|
|
31
29
|
Object.defineProperty(exports, "TALQING_IMAGE_MAX_EDGE_PX", { enumerable: true, get: function () { return images_js_1.TALQING_IMAGE_MAX_EDGE_PX; } });
|
|
32
30
|
Object.defineProperty(exports, "TALQING_IMAGE_TOPIC", { enumerable: true, get: function () { return images_js_1.TALQING_IMAGE_TOPIC; } });
|
|
31
|
+
var files_js_1 = require("./files.js");
|
|
32
|
+
Object.defineProperty(exports, "talqingFileDataUrl", { enumerable: true, get: function () { return files_js_1.talqingFileDataUrl; } });
|
|
33
|
+
Object.defineProperty(exports, "talqingFileRejection", { enumerable: true, get: function () { return files_js_1.talqingFileRejection; } });
|
|
34
|
+
Object.defineProperty(exports, "TALQING_FILE_MAX_BYTES", { enumerable: true, get: function () { return files_js_1.TALQING_FILE_MAX_BYTES; } });
|
|
35
|
+
Object.defineProperty(exports, "TALQING_MAX_FILES_PER_MESSAGE", { enumerable: true, get: function () { return files_js_1.TALQING_MAX_FILES_PER_MESSAGE; } });
|
|
33
36
|
var rpc_js_1 = require("./rpc.js");
|
|
34
37
|
Object.defineProperty(exports, "registerTalqingRpcHandlers", { enumerable: true, get: function () { return rpc_js_1.registerTalqingRpcHandlers; } });
|
|
35
38
|
Object.defineProperty(exports, "TalqingRpcError", { enumerable: true, get: function () { return rpc_js_1.TalqingRpcError; } });
|
package/dist/cjs/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;GAYG;;;AAEH,uCAAsD;AAA7C,oHAAA,wBAAwB,OAAA;AAGjC,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;GAYG;;;AAEH,uCAAsD;AAA7C,oHAAA,wBAAwB,OAAA;AAGjC,mDAA2D;AAAlD,yHAAA,uBAAuB,OAAA;AAEhC,yCAUqB;AATnB,iHAAA,oBAAoB,OAAA;AACpB,6GAAA,gBAAgB,OAAA;AAChB,kHAAA,qBAAqB,OAAA;AACrB,gHAAA,mBAAmB,OAAA;AACnB,kHAAA,qBAAqB,OAAA;AACrB,yHAAA,4BAA4B,OAAA;AAC5B,oHAAA,uBAAuB,OAAA;AACvB,sHAAA,yBAAyB,OAAA;AACzB,gHAAA,mBAAmB,OAAA;AAIrB,uCAKoB;AAJlB,8GAAA,kBAAkB,OAAA;AAClB,gHAAA,oBAAoB,OAAA;AACpB,kHAAA,sBAAsB,OAAA;AACtB,yHAAA,6BAA6B,OAAA;AAG/B,mCAAuE;AAA9D,oHAAA,0BAA0B,OAAA;AAAE,yGAAA,eAAe,OAAA;AAQpD,uCAIoB;AAHlB,0HAAA,8BAA8B,OAAA;AAC9B,wHAAA,4BAA4B,OAAA;AAC5B,wHAAA,4BAA4B,OAAA;AAG9B,qCAA0D;AAAjD,sGAAA,WAAW,OAAA;AAAE,2GAAA,gBAAgB,OAAA"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type RemoteParticipant, type Room } from "livekit-client";
|
|
2
|
+
/** The agent on this call, or undefined before it has joined.
|
|
3
|
+
*
|
|
4
|
+
* On a video call the avatar worker is an agent participant too, but it joins
|
|
5
|
+
* on the agent's behalf and never answers RPCs, so the first one found is the
|
|
6
|
+
* one to talk to. */
|
|
7
|
+
export declare function talqingAgentParticipant(room: Room): RemoteParticipant | undefined;
|
|
8
|
+
//# sourceMappingURL=participant.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"participant.d.ts","sourceRoot":"","sources":["../../src/participant.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,KAAK,iBAAiB,EAAE,KAAK,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAEpF;;;;sBAIsB;AACtB,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,IAAI,GAAG,iBAAiB,GAAG,SAAS,CAIjF"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.talqingAgentParticipant = talqingAgentParticipant;
|
|
4
|
+
const livekit_client_1 = require("livekit-client");
|
|
5
|
+
/** The agent on this call, or undefined before it has joined.
|
|
6
|
+
*
|
|
7
|
+
* On a video call the avatar worker is an agent participant too, but it joins
|
|
8
|
+
* on the agent's behalf and never answers RPCs, so the first one found is the
|
|
9
|
+
* one to talk to. */
|
|
10
|
+
function talqingAgentParticipant(room) {
|
|
11
|
+
return [...room.remoteParticipants.values()].find((participant) => participant.kind === livekit_client_1.ParticipantKind.AGENT);
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=participant.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"participant.js","sourceRoot":"","sources":["../../src/participant.ts"],"names":[],"mappings":";;AAOA,0DAIC;AAXD,mDAAoF;AAEpF;;;;sBAIsB;AACtB,SAAgB,uBAAuB,CAAC,IAAU;IAChD,OAAO,CAAC,GAAG,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAC/C,CAAC,WAA8B,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,KAAK,gCAAe,CAAC,KAAK,CAC/E,CAAC;AACJ,CAAC"}
|
package/dist/esm/chat.d.ts
CHANGED
|
@@ -8,7 +8,8 @@ export interface TalqingChatCredentials {
|
|
|
8
8
|
/** The API this chat lives on. */
|
|
9
9
|
api_url: string;
|
|
10
10
|
}
|
|
11
|
-
|
|
11
|
+
/** A photo the person sent. */
|
|
12
|
+
export interface TalqingChatImage {
|
|
12
13
|
id: string;
|
|
13
14
|
kind: "image";
|
|
14
15
|
mime_type: string;
|
|
@@ -20,6 +21,37 @@ export interface TalqingChatAttachment {
|
|
|
20
21
|
url: string;
|
|
21
22
|
url_expires_at: string;
|
|
22
23
|
}
|
|
24
|
+
/** A PDF or Word file the person sent, and whether the agent could read it. */
|
|
25
|
+
export interface TalqingChatDocument {
|
|
26
|
+
id: string;
|
|
27
|
+
kind: "document";
|
|
28
|
+
mime_type: string;
|
|
29
|
+
bytes: number;
|
|
30
|
+
filename: string | null;
|
|
31
|
+
/** `pending` until the agent's next turn reads it. */
|
|
32
|
+
status: "pending" | "read" | "unreadable";
|
|
33
|
+
/** A PDF's page count; null for Word files. */
|
|
34
|
+
pages: number | null;
|
|
35
|
+
unreadable_reason: string | null;
|
|
36
|
+
/** A download link, valid until `url_expires_at`. */
|
|
37
|
+
url: string;
|
|
38
|
+
url_expires_at: string;
|
|
39
|
+
}
|
|
40
|
+
/** Any other file the person sent; the agent cannot open it. */
|
|
41
|
+
export interface TalqingChatFileAttachment {
|
|
42
|
+
id: string;
|
|
43
|
+
kind: "file";
|
|
44
|
+
mime_type: string;
|
|
45
|
+
/** The type read from its bytes, e.g. `xlsx`; `bin` if unknown. */
|
|
46
|
+
extension: string;
|
|
47
|
+
/** Set when `url` plays in an `<audio>` or `<video>` element. */
|
|
48
|
+
playable: "audio" | "video" | null;
|
|
49
|
+
bytes: number;
|
|
50
|
+
filename: string | null;
|
|
51
|
+
url: string;
|
|
52
|
+
url_expires_at: string;
|
|
53
|
+
}
|
|
54
|
+
export type TalqingChatAttachment = TalqingChatImage | TalqingChatDocument | TalqingChatFileAttachment;
|
|
23
55
|
/** One message in the chat. A browser only ever receives what the person
|
|
24
56
|
* chatting can see — never the agent's tool calls. */
|
|
25
57
|
export interface TalqingChatItem {
|
|
@@ -29,9 +61,13 @@ export interface TalqingChatItem {
|
|
|
29
61
|
direction: "inbound" | "outbound" | "internal";
|
|
30
62
|
type: string;
|
|
31
63
|
role: "user" | "assistant" | "system" | "developer" | "tool" | null;
|
|
32
|
-
/** Null on a message that is only
|
|
64
|
+
/** Null on a message that is only files. */
|
|
33
65
|
text: string | null;
|
|
34
66
|
attachments: TalqingChatAttachment[];
|
|
67
|
+
/** Files the person sent that could not be stored, and why. */
|
|
68
|
+
attachments_not_kept: {
|
|
69
|
+
reason: string;
|
|
70
|
+
}[];
|
|
35
71
|
created_at: string;
|
|
36
72
|
}
|
|
37
73
|
/** What one message led to. */
|
|
@@ -63,8 +99,8 @@ export type TalqingChatEvent = {
|
|
|
63
99
|
} & TalqingChatItem) | ({
|
|
64
100
|
event: "turn.result";
|
|
65
101
|
} & TalqingChatTurn);
|
|
66
|
-
/**
|
|
67
|
-
export interface
|
|
102
|
+
/** A file to send with a message, as a `data:` URL — see `talqingFileDataUrl`. */
|
|
103
|
+
export interface TalqingChatFile {
|
|
68
104
|
data_url: string;
|
|
69
105
|
filename?: string;
|
|
70
106
|
}
|
|
@@ -89,7 +125,7 @@ export declare class TalqingChat {
|
|
|
89
125
|
/** Send a message. `events` yields the reply as it is generated; `result`
|
|
90
126
|
* resolves with the whole turn. Either can be used without the other. */
|
|
91
127
|
send(text: string, options?: {
|
|
92
|
-
|
|
128
|
+
files?: TalqingChatFile[];
|
|
93
129
|
}): {
|
|
94
130
|
events: AsyncIterable<TalqingChatEvent>;
|
|
95
131
|
result: Promise<TalqingChatTurn>;
|
package/dist/esm/chat.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat.d.ts","sourceRoot":"","sources":["../../src/chat.ts"],"names":[],"mappings":"AAQA;wEACwE;AACxE,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,uCAAuC;IACvC,UAAU,EAAE,MAAM,CAAC;IACnB,kCAAkC;IAClC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,
|
|
1
|
+
{"version":3,"file":"chat.d.ts","sourceRoot":"","sources":["../../src/chat.ts"],"names":[],"mappings":"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"}
|
package/dist/esm/chat.js
CHANGED
package/dist/esm/chat.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat.js","sourceRoot":"","sources":["../../src/chat.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;
|
|
1
|
+
{"version":3,"file":"chat.js","sourceRoot":"","sources":["../../src/chat.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/** Decoded size the server refuses above, for a file of any type. */
|
|
2
|
+
export declare const TALQING_FILE_MAX_BYTES: number;
|
|
3
|
+
/** Files per message; the server refuses more. */
|
|
4
|
+
export declare const TALQING_MAX_FILES_PER_MESSAGE = 4;
|
|
5
|
+
/** Refuse what the browser can see is wrong, instantly and with no round trip.
|
|
6
|
+
* Returns the sentence to show, or null when the file is fine — the same
|
|
7
|
+
* sentence the server would send. */
|
|
8
|
+
export declare function talqingFileRejection(file: File): string | null;
|
|
9
|
+
/** The `data:` URL a chat message carries for this file. Photos are
|
|
10
|
+
* downscaled first, as on a call; everything else is sent as it is. Throws
|
|
11
|
+
* the sentence to show if the file is refused. */
|
|
12
|
+
export declare function talqingFileDataUrl(file: File): Promise<string>;
|
|
13
|
+
//# sourceMappingURL=files.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../../src/files.ts"],"names":[],"mappings":"AAUA,qEAAqE;AACrE,eAAO,MAAM,sBAAsB,QAAmB,CAAC;AACvD,kDAAkD;AAClD,eAAO,MAAM,6BAA6B,IAAI,CAAC;AAI/C;;sCAEsC;AACtC,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,GAAG,IAAI,CAI9D;AAED;;mDAEmD;AACnD,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAUpE"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { talqingImageDataUrl } from "./images.js";
|
|
2
|
+
/* ── files ────────────────────────────────────────────────────────────────
|
|
3
|
+
*
|
|
4
|
+
* A person attaches files to a text chat message. Any type is accepted and
|
|
5
|
+
* stored; photos, PDFs and Word files are read by the agent, and anything else
|
|
6
|
+
* is kept for you and named to the agent as something it cannot open. The
|
|
7
|
+
* server decides the type from the bytes, so nothing here checks it.
|
|
8
|
+
*/
|
|
9
|
+
/** Decoded size the server refuses above, for a file of any type. */
|
|
10
|
+
export const TALQING_FILE_MAX_BYTES = 20 * 1024 * 1024;
|
|
11
|
+
/** Files per message; the server refuses more. */
|
|
12
|
+
export const TALQING_MAX_FILES_PER_MESSAGE = 4;
|
|
13
|
+
/** Photos downscaled before sending, as on a call. */
|
|
14
|
+
const DOWNSCALED_TYPES = ["image/jpeg", "image/png", "image/webp"];
|
|
15
|
+
/** Refuse what the browser can see is wrong, instantly and with no round trip.
|
|
16
|
+
* Returns the sentence to show, or null when the file is fine — the same
|
|
17
|
+
* sentence the server would send. */
|
|
18
|
+
export function talqingFileRejection(file) {
|
|
19
|
+
if (file.size === 0)
|
|
20
|
+
return "that file is empty";
|
|
21
|
+
if (file.size > TALQING_FILE_MAX_BYTES)
|
|
22
|
+
return "files are 20 MB or smaller";
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
/** The `data:` URL a chat message carries for this file. Photos are
|
|
26
|
+
* downscaled first, as on a call; everything else is sent as it is. Throws
|
|
27
|
+
* the sentence to show if the file is refused. */
|
|
28
|
+
export async function talqingFileDataUrl(file) {
|
|
29
|
+
const rejection = talqingFileRejection(file);
|
|
30
|
+
if (rejection)
|
|
31
|
+
throw new Error(rejection);
|
|
32
|
+
if (DOWNSCALED_TYPES.includes(file.type))
|
|
33
|
+
return await talqingImageDataUrl(file);
|
|
34
|
+
return await new Promise((resolve, reject) => {
|
|
35
|
+
const reader = new FileReader();
|
|
36
|
+
reader.onerror = () => reject(new Error("that file could not be read"));
|
|
37
|
+
reader.onload = () => resolve(String(reader.result));
|
|
38
|
+
reader.readAsDataURL(file);
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=files.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"files.js","sourceRoot":"","sources":["../../src/files.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAElD;;;;;;GAMG;AAEH,qEAAqE;AACrE,MAAM,CAAC,MAAM,sBAAsB,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AACvD,kDAAkD;AAClD,MAAM,CAAC,MAAM,6BAA6B,GAAG,CAAC,CAAC;AAC/C,sDAAsD;AACtD,MAAM,gBAAgB,GAAG,CAAC,YAAY,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC;AAEnE;;sCAEsC;AACtC,MAAM,UAAU,oBAAoB,CAAC,IAAU;IAC7C,IAAI,IAAI,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,oBAAoB,CAAC;IACjD,IAAI,IAAI,CAAC,IAAI,GAAG,sBAAsB;QAAE,OAAO,4BAA4B,CAAC;IAC5E,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;mDAEmD;AACnD,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,IAAU;IACjD,MAAM,SAAS,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;IAC7C,IAAI,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC;IAC1C,IAAI,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,MAAM,mBAAmB,CAAC,IAAI,CAAC,CAAC;IACjF,OAAO,MAAM,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACnD,MAAM,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAChC,MAAM,CAAC,OAAO,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC,CAAC;QACxE,MAAM,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;QACrD,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;AACL,CAAC"}
|
package/dist/esm/images.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { talqingAgentParticipant } from "./
|
|
1
|
+
import { talqingAgentParticipant } from "./participant.js";
|
|
2
2
|
/* ── images ───────────────────────────────────────────────────────────────
|
|
3
3
|
*
|
|
4
4
|
* A caller attaches a photo on a web voice or video call and the agent sees
|
package/dist/esm/images.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"images.js","sourceRoot":"","sources":["../../src/images.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,uBAAuB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"images.js","sourceRoot":"","sources":["../../src/images.ts"],"names":[],"mappings":"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"}
|
package/dist/esm/index.d.ts
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
export { createTalqingTokenSource } from "./token.js";
|
|
2
2
|
export type { TalqingCallCredentials } from "./token.js";
|
|
3
|
-
export {
|
|
3
|
+
export { talqingAgentParticipant } from "./participant.js";
|
|
4
4
|
export { onTalqingImageResult, sendTalqingImage, talqingDownscaleImage, talqingImageDataUrl, talqingImageRejection, TALQING_IMAGE_ACK_TIMEOUT_MS, TALQING_IMAGE_MAX_BYTES, TALQING_IMAGE_MAX_EDGE_PX, TALQING_IMAGE_TOPIC, } from "./images.js";
|
|
5
5
|
export type { TalqingImageStatus, TalqingSentImage } from "./images.js";
|
|
6
|
+
export { talqingFileDataUrl, talqingFileRejection, TALQING_FILE_MAX_BYTES, TALQING_MAX_FILES_PER_MESSAGE, } from "./files.js";
|
|
6
7
|
export { registerTalqingRpcHandlers, TalqingRpcError } from "./rpc.js";
|
|
7
8
|
export type { TalqingFrontendRpcEnvelope, TalqingRpcHandler, TalqingRpcHandlers, TalqingRpcInvocation, } from "./rpc.js";
|
|
8
9
|
export { TALQING_AUDIO_CAPTURE_DEFAULTS, TALQING_SCREEN_SHARE_CAPTURE, TALQING_SCREEN_SHARE_PUBLISH, } from "./media.js";
|
|
9
10
|
export { TalqingChat, TalqingChatError } from "./chat.js";
|
|
10
|
-
export type { TalqingChatAttachment, TalqingChatCredentials, TalqingChatEvent, TalqingChatImage, TalqingChatItem, TalqingChatTurn, } from "./chat.js";
|
|
11
|
+
export type { TalqingChatAttachment, TalqingChatCredentials, TalqingChatDocument, TalqingChatEvent, TalqingChatFile, TalqingChatFileAttachment, TalqingChatImage, TalqingChatItem, TalqingChatTurn, } from "./chat.js";
|
|
11
12
|
export type { JsonObject, JsonPrimitive, JsonValue } from "./json.js";
|
|
12
13
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/esm/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AACtD,YAAY,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAEzD,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AACtD,YAAY,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAEzD,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAE3D,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,qBAAqB,EACrB,mBAAmB,EACnB,qBAAqB,EACrB,4BAA4B,EAC5B,uBAAuB,EACvB,yBAAyB,EACzB,mBAAmB,GACpB,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAExE,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,sBAAsB,EACtB,6BAA6B,GAC9B,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,0BAA0B,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AACvE,YAAY,EACV,0BAA0B,EAC1B,iBAAiB,EACjB,kBAAkB,EAClB,oBAAoB,GACrB,MAAM,UAAU,CAAC;AAElB,OAAO,EACL,8BAA8B,EAC9B,4BAA4B,EAC5B,4BAA4B,GAC7B,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC1D,YAAY,EACV,qBAAqB,EACrB,sBAAsB,EACtB,mBAAmB,EACnB,gBAAgB,EAChB,eAAe,EACf,yBAAyB,EACzB,gBAAgB,EAChB,eAAe,EACf,eAAe,GAChB,MAAM,WAAW,CAAC;AAEnB,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC"}
|
package/dist/esm/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/* The Talqing call protocol, over a LiveKit `Room`. Framework-free.
|
|
2
2
|
*
|
|
3
3
|
* Everything here is something only Talqing can write: the mint-once token
|
|
4
|
-
* source, the
|
|
4
|
+
* source, the `talqing.images` byte-stream topic
|
|
5
5
|
* and its ack, the `talqing.frontend_rpc` envelope, and the measured capture
|
|
6
6
|
* settings. Nothing here renames LiveKit — for a room, a track or a
|
|
7
7
|
* participant, use `livekit-client` directly.
|
|
@@ -9,11 +9,12 @@
|
|
|
9
9
|
* React bindings for all of it are `@talqing/react`.
|
|
10
10
|
*
|
|
11
11
|
* `TalqingChat` is the one thing here with no room behind it: a text chat, over
|
|
12
|
-
* HTTP, on a chat token.
|
|
12
|
+
* HTTP, on a chat token, whose messages carry files (`talqingFileDataUrl`).
|
|
13
13
|
*/
|
|
14
14
|
export { createTalqingTokenSource } from "./token.js";
|
|
15
|
-
export {
|
|
15
|
+
export { talqingAgentParticipant } from "./participant.js";
|
|
16
16
|
export { onTalqingImageResult, sendTalqingImage, talqingDownscaleImage, talqingImageDataUrl, talqingImageRejection, TALQING_IMAGE_ACK_TIMEOUT_MS, TALQING_IMAGE_MAX_BYTES, TALQING_IMAGE_MAX_EDGE_PX, TALQING_IMAGE_TOPIC, } from "./images.js";
|
|
17
|
+
export { talqingFileDataUrl, talqingFileRejection, TALQING_FILE_MAX_BYTES, TALQING_MAX_FILES_PER_MESSAGE, } from "./files.js";
|
|
17
18
|
export { registerTalqingRpcHandlers, TalqingRpcError } from "./rpc.js";
|
|
18
19
|
export { TALQING_AUDIO_CAPTURE_DEFAULTS, TALQING_SCREEN_SHARE_CAPTURE, TALQING_SCREEN_SHARE_PUBLISH, } from "./media.js";
|
|
19
20
|
export { TalqingChat, TalqingChatError } from "./chat.js";
|
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAGtD,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAGtD,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAE3D,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,qBAAqB,EACrB,mBAAmB,EACnB,qBAAqB,EACrB,4BAA4B,EAC5B,uBAAuB,EACvB,yBAAyB,EACzB,mBAAmB,GACpB,MAAM,aAAa,CAAC;AAGrB,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,sBAAsB,EACtB,6BAA6B,GAC9B,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,0BAA0B,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAQvE,OAAO,EACL,8BAA8B,EAC9B,4BAA4B,EAC5B,4BAA4B,GAC7B,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type RemoteParticipant, type Room } from "livekit-client";
|
|
2
|
+
/** The agent on this call, or undefined before it has joined.
|
|
3
|
+
*
|
|
4
|
+
* On a video call the avatar worker is an agent participant too, but it joins
|
|
5
|
+
* on the agent's behalf and never answers RPCs, so the first one found is the
|
|
6
|
+
* one to talk to. */
|
|
7
|
+
export declare function talqingAgentParticipant(room: Room): RemoteParticipant | undefined;
|
|
8
|
+
//# sourceMappingURL=participant.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"participant.d.ts","sourceRoot":"","sources":["../../src/participant.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,KAAK,iBAAiB,EAAE,KAAK,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAEpF;;;;sBAIsB;AACtB,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,IAAI,GAAG,iBAAiB,GAAG,SAAS,CAIjF"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { ParticipantKind } from "livekit-client";
|
|
2
|
+
/** The agent on this call, or undefined before it has joined.
|
|
3
|
+
*
|
|
4
|
+
* On a video call the avatar worker is an agent participant too, but it joins
|
|
5
|
+
* on the agent's behalf and never answers RPCs, so the first one found is the
|
|
6
|
+
* one to talk to. */
|
|
7
|
+
export function talqingAgentParticipant(room) {
|
|
8
|
+
return [...room.remoteParticipants.values()].find((participant) => participant.kind === ParticipantKind.AGENT);
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=participant.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"participant.js","sourceRoot":"","sources":["../../src/participant.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAqC,MAAM,gBAAgB,CAAC;AAEpF;;;;sBAIsB;AACtB,MAAM,UAAU,uBAAuB,CAAC,IAAU;IAChD,OAAO,CAAC,GAAG,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAC/C,CAAC,WAA8B,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,KAAK,eAAe,CAAC,KAAK,CAC/E,CAAC;AACJ,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@talqing/client",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.8.0",
|
|
4
4
|
"description": "The Talqing call protocol over a LiveKit room — token, userdata, images, screen share and frontend RPC. Framework-free.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"homepage": "https://talqing.com",
|
|
@@ -56,7 +56,7 @@
|
|
|
56
56
|
"livekit-client": "^2.20.2"
|
|
57
57
|
},
|
|
58
58
|
"devDependencies": {
|
|
59
|
-
"livekit-client": "^2.22.
|
|
59
|
+
"livekit-client": "^2.22.4",
|
|
60
60
|
"typescript": "~5.9.3"
|
|
61
61
|
}
|
|
62
62
|
}
|
package/src/chat.ts
CHANGED
|
@@ -17,7 +17,8 @@ export interface TalqingChatCredentials {
|
|
|
17
17
|
api_url: string;
|
|
18
18
|
}
|
|
19
19
|
|
|
20
|
-
|
|
20
|
+
/** A photo the person sent. */
|
|
21
|
+
export interface TalqingChatImage {
|
|
21
22
|
id: string;
|
|
22
23
|
kind: "image";
|
|
23
24
|
mime_type: string;
|
|
@@ -30,6 +31,43 @@ export interface TalqingChatAttachment {
|
|
|
30
31
|
url_expires_at: string;
|
|
31
32
|
}
|
|
32
33
|
|
|
34
|
+
/** A PDF or Word file the person sent, and whether the agent could read it. */
|
|
35
|
+
export interface TalqingChatDocument {
|
|
36
|
+
id: string;
|
|
37
|
+
kind: "document";
|
|
38
|
+
mime_type: string;
|
|
39
|
+
bytes: number;
|
|
40
|
+
filename: string | null;
|
|
41
|
+
/** `pending` until the agent's next turn reads it. */
|
|
42
|
+
status: "pending" | "read" | "unreadable";
|
|
43
|
+
/** A PDF's page count; null for Word files. */
|
|
44
|
+
pages: number | null;
|
|
45
|
+
unreadable_reason: string | null;
|
|
46
|
+
/** A download link, valid until `url_expires_at`. */
|
|
47
|
+
url: string;
|
|
48
|
+
url_expires_at: string;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/** Any other file the person sent; the agent cannot open it. */
|
|
52
|
+
export interface TalqingChatFileAttachment {
|
|
53
|
+
id: string;
|
|
54
|
+
kind: "file";
|
|
55
|
+
mime_type: string;
|
|
56
|
+
/** The type read from its bytes, e.g. `xlsx`; `bin` if unknown. */
|
|
57
|
+
extension: string;
|
|
58
|
+
/** Set when `url` plays in an `<audio>` or `<video>` element. */
|
|
59
|
+
playable: "audio" | "video" | null;
|
|
60
|
+
bytes: number;
|
|
61
|
+
filename: string | null;
|
|
62
|
+
url: string;
|
|
63
|
+
url_expires_at: string;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export type TalqingChatAttachment =
|
|
67
|
+
| TalqingChatImage
|
|
68
|
+
| TalqingChatDocument
|
|
69
|
+
| TalqingChatFileAttachment;
|
|
70
|
+
|
|
33
71
|
/** One message in the chat. A browser only ever receives what the person
|
|
34
72
|
* chatting can see — never the agent's tool calls. */
|
|
35
73
|
export interface TalqingChatItem {
|
|
@@ -39,9 +77,11 @@ export interface TalqingChatItem {
|
|
|
39
77
|
direction: "inbound" | "outbound" | "internal";
|
|
40
78
|
type: string;
|
|
41
79
|
role: "user" | "assistant" | "system" | "developer" | "tool" | null;
|
|
42
|
-
/** Null on a message that is only
|
|
80
|
+
/** Null on a message that is only files. */
|
|
43
81
|
text: string | null;
|
|
44
82
|
attachments: TalqingChatAttachment[];
|
|
83
|
+
/** Files the person sent that could not be stored, and why. */
|
|
84
|
+
attachments_not_kept: { reason: string }[];
|
|
45
85
|
created_at: string;
|
|
46
86
|
}
|
|
47
87
|
|
|
@@ -66,8 +106,8 @@ export type TalqingChatEvent =
|
|
|
66
106
|
| ({ event: "item.created" } & TalqingChatItem)
|
|
67
107
|
| ({ event: "turn.result" } & TalqingChatTurn);
|
|
68
108
|
|
|
69
|
-
/**
|
|
70
|
-
export interface
|
|
109
|
+
/** A file to send with a message, as a `data:` URL — see `talqingFileDataUrl`. */
|
|
110
|
+
export interface TalqingChatFile {
|
|
71
111
|
data_url: string;
|
|
72
112
|
filename?: string;
|
|
73
113
|
}
|
|
@@ -105,7 +145,7 @@ export class TalqingChat {
|
|
|
105
145
|
* resolves with the whole turn. Either can be used without the other. */
|
|
106
146
|
send(
|
|
107
147
|
text: string,
|
|
108
|
-
options: {
|
|
148
|
+
options: { files?: TalqingChatFile[] } = {},
|
|
109
149
|
): { events: AsyncIterable<TalqingChatEvent>; result: Promise<TalqingChatTurn> } {
|
|
110
150
|
const queue: TalqingChatEvent[] = [];
|
|
111
151
|
let finished = false;
|
|
@@ -121,7 +161,7 @@ export class TalqingChat {
|
|
|
121
161
|
method: "POST",
|
|
122
162
|
body: JSON.stringify({
|
|
123
163
|
message: text,
|
|
124
|
-
|
|
164
|
+
files: options.files ?? [],
|
|
125
165
|
client_message_id: crypto.randomUUID(),
|
|
126
166
|
stream: true,
|
|
127
167
|
}),
|
package/src/files.ts
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { talqingImageDataUrl } from "./images.js";
|
|
2
|
+
|
|
3
|
+
/* ── files ────────────────────────────────────────────────────────────────
|
|
4
|
+
*
|
|
5
|
+
* A person attaches files to a text chat message. Any type is accepted and
|
|
6
|
+
* stored; photos, PDFs and Word files are read by the agent, and anything else
|
|
7
|
+
* is kept for you and named to the agent as something it cannot open. The
|
|
8
|
+
* server decides the type from the bytes, so nothing here checks it.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
/** Decoded size the server refuses above, for a file of any type. */
|
|
12
|
+
export const TALQING_FILE_MAX_BYTES = 20 * 1024 * 1024;
|
|
13
|
+
/** Files per message; the server refuses more. */
|
|
14
|
+
export const TALQING_MAX_FILES_PER_MESSAGE = 4;
|
|
15
|
+
/** Photos downscaled before sending, as on a call. */
|
|
16
|
+
const DOWNSCALED_TYPES = ["image/jpeg", "image/png", "image/webp"];
|
|
17
|
+
|
|
18
|
+
/** Refuse what the browser can see is wrong, instantly and with no round trip.
|
|
19
|
+
* Returns the sentence to show, or null when the file is fine — the same
|
|
20
|
+
* sentence the server would send. */
|
|
21
|
+
export function talqingFileRejection(file: File): string | null {
|
|
22
|
+
if (file.size === 0) return "that file is empty";
|
|
23
|
+
if (file.size > TALQING_FILE_MAX_BYTES) return "files are 20 MB or smaller";
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/** The `data:` URL a chat message carries for this file. Photos are
|
|
28
|
+
* downscaled first, as on a call; everything else is sent as it is. Throws
|
|
29
|
+
* the sentence to show if the file is refused. */
|
|
30
|
+
export async function talqingFileDataUrl(file: File): Promise<string> {
|
|
31
|
+
const rejection = talqingFileRejection(file);
|
|
32
|
+
if (rejection) throw new Error(rejection);
|
|
33
|
+
if (DOWNSCALED_TYPES.includes(file.type)) return await talqingImageDataUrl(file);
|
|
34
|
+
return await new Promise<string>((resolve, reject) => {
|
|
35
|
+
const reader = new FileReader();
|
|
36
|
+
reader.onerror = () => reject(new Error("that file could not be read"));
|
|
37
|
+
reader.onload = () => resolve(String(reader.result));
|
|
38
|
+
reader.readAsDataURL(file);
|
|
39
|
+
});
|
|
40
|
+
}
|
package/src/images.ts
CHANGED
package/src/index.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/* The Talqing call protocol, over a LiveKit `Room`. Framework-free.
|
|
2
2
|
*
|
|
3
3
|
* Everything here is something only Talqing can write: the mint-once token
|
|
4
|
-
* source, the
|
|
4
|
+
* source, the `talqing.images` byte-stream topic
|
|
5
5
|
* and its ack, the `talqing.frontend_rpc` envelope, and the measured capture
|
|
6
6
|
* settings. Nothing here renames LiveKit — for a room, a track or a
|
|
7
7
|
* participant, use `livekit-client` directly.
|
|
@@ -9,17 +9,13 @@
|
|
|
9
9
|
* React bindings for all of it are `@talqing/react`.
|
|
10
10
|
*
|
|
11
11
|
* `TalqingChat` is the one thing here with no room behind it: a text chat, over
|
|
12
|
-
* HTTP, on a chat token.
|
|
12
|
+
* HTTP, on a chat token, whose messages carry files (`talqingFileDataUrl`).
|
|
13
13
|
*/
|
|
14
14
|
|
|
15
15
|
export { createTalqingTokenSource } from "./token.js";
|
|
16
16
|
export type { TalqingCallCredentials } from "./token.js";
|
|
17
17
|
|
|
18
|
-
export {
|
|
19
|
-
getTalqingUserdata,
|
|
20
|
-
setTalqingUserdata,
|
|
21
|
-
talqingAgentParticipant,
|
|
22
|
-
} from "./userdata.js";
|
|
18
|
+
export { talqingAgentParticipant } from "./participant.js";
|
|
23
19
|
|
|
24
20
|
export {
|
|
25
21
|
onTalqingImageResult,
|
|
@@ -34,6 +30,13 @@ export {
|
|
|
34
30
|
} from "./images.js";
|
|
35
31
|
export type { TalqingImageStatus, TalqingSentImage } from "./images.js";
|
|
36
32
|
|
|
33
|
+
export {
|
|
34
|
+
talqingFileDataUrl,
|
|
35
|
+
talqingFileRejection,
|
|
36
|
+
TALQING_FILE_MAX_BYTES,
|
|
37
|
+
TALQING_MAX_FILES_PER_MESSAGE,
|
|
38
|
+
} from "./files.js";
|
|
39
|
+
|
|
37
40
|
export { registerTalqingRpcHandlers, TalqingRpcError } from "./rpc.js";
|
|
38
41
|
export type {
|
|
39
42
|
TalqingFrontendRpcEnvelope,
|
|
@@ -52,7 +55,10 @@ export { TalqingChat, TalqingChatError } from "./chat.js";
|
|
|
52
55
|
export type {
|
|
53
56
|
TalqingChatAttachment,
|
|
54
57
|
TalqingChatCredentials,
|
|
58
|
+
TalqingChatDocument,
|
|
55
59
|
TalqingChatEvent,
|
|
60
|
+
TalqingChatFile,
|
|
61
|
+
TalqingChatFileAttachment,
|
|
56
62
|
TalqingChatImage,
|
|
57
63
|
TalqingChatItem,
|
|
58
64
|
TalqingChatTurn,
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { ParticipantKind, type RemoteParticipant, type Room } from "livekit-client";
|
|
2
|
+
|
|
3
|
+
/** The agent on this call, or undefined before it has joined.
|
|
4
|
+
*
|
|
5
|
+
* On a video call the avatar worker is an agent participant too, but it joins
|
|
6
|
+
* on the agent's behalf and never answers RPCs, so the first one found is the
|
|
7
|
+
* one to talk to. */
|
|
8
|
+
export function talqingAgentParticipant(room: Room): RemoteParticipant | undefined {
|
|
9
|
+
return [...room.remoteParticipants.values()].find(
|
|
10
|
+
(participant: RemoteParticipant) => participant.kind === ParticipantKind.AGENT,
|
|
11
|
+
);
|
|
12
|
+
}
|
package/src/userdata.ts
DELETED
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
import { ParticipantKind, type RemoteParticipant, type Room } from "livekit-client";
|
|
2
|
-
import type { JsonObject } from "./json.js";
|
|
3
|
-
|
|
4
|
-
/** The agent on this call, or undefined before it has joined.
|
|
5
|
-
*
|
|
6
|
-
* On a video call the avatar worker is an agent participant too, but it joins
|
|
7
|
-
* on the agent's behalf and never answers RPCs, so the first one found is the
|
|
8
|
-
* one to talk to. */
|
|
9
|
-
export function talqingAgentParticipant(room: Room): RemoteParticipant | undefined {
|
|
10
|
-
return [...room.remoteParticipants.values()].find(
|
|
11
|
-
(participant: RemoteParticipant) => participant.kind === ParticipantKind.AGENT,
|
|
12
|
-
);
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
/** Merge a patch into the live session's userdata, over RPC to the agent.
|
|
16
|
-
*
|
|
17
|
-
* Resolves rather than throws when the agent is not there: a write that did
|
|
18
|
-
* not land is a state a page can render. */
|
|
19
|
-
export async function setTalqingUserdata(
|
|
20
|
-
room: Room,
|
|
21
|
-
patch: JsonObject,
|
|
22
|
-
responseTimeout = 3,
|
|
23
|
-
): Promise<{ ok: boolean; error?: string }> {
|
|
24
|
-
const agent = talqingAgentParticipant(room);
|
|
25
|
-
if (!agent) return { ok: false, error: "agent participant is not connected" };
|
|
26
|
-
const response = await room.localParticipant.performRpc({
|
|
27
|
-
destinationIdentity: agent.identity,
|
|
28
|
-
method: "talqing.client.userdata_set",
|
|
29
|
-
payload: JSON.stringify(patch),
|
|
30
|
-
responseTimeout,
|
|
31
|
-
});
|
|
32
|
-
return JSON.parse(response || "{}") as { ok: boolean; error?: string };
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
/** Read the live session's userdata, or only the keys named.
|
|
36
|
-
*
|
|
37
|
-
* Throws when the agent is not there, unlike `setTalqingUserdata`: a read that
|
|
38
|
-
* returned nothing is not a state anything can render. */
|
|
39
|
-
export async function getTalqingUserdata(
|
|
40
|
-
room: Room,
|
|
41
|
-
keys?: string[],
|
|
42
|
-
responseTimeout = 3,
|
|
43
|
-
): Promise<JsonObject> {
|
|
44
|
-
const agent = talqingAgentParticipant(room);
|
|
45
|
-
if (!agent) throw new Error("agent participant is not connected");
|
|
46
|
-
const response = await room.localParticipant.performRpc({
|
|
47
|
-
destinationIdentity: agent.identity,
|
|
48
|
-
method: "talqing.client.userdata_get",
|
|
49
|
-
payload: JSON.stringify(keys ? { keys } : {}),
|
|
50
|
-
responseTimeout,
|
|
51
|
-
});
|
|
52
|
-
const parsed = JSON.parse(response || "{}") as JsonObject & { ok?: boolean; error?: string };
|
|
53
|
-
if (parsed.ok === false) {
|
|
54
|
-
throw new Error(String(parsed.error || "userdata RPC failed"));
|
|
55
|
-
}
|
|
56
|
-
return parsed;
|
|
57
|
-
}
|