@talqing/client 0.5.0 → 0.7.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 CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2026 Talqing
3
+ Copyright (c) 2026 Oggnai Technologies Private Limited
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
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 two userdata RPC methods, the `talqing.images` byte-stream topic and its
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
@@ -83,6 +71,42 @@ mid-upload, which is a third outcome and not a failure you can describe.
83
71
  `talqingImageDataUrl(file)` are the three steps on their own. The last produces
84
72
  the `data:` URL a **text** message carries.
85
73
 
74
+ ## Chats
75
+
76
+ The one thing here with no room behind it: a text chat, over HTTP. Your
77
+ **server** starts the chat with `POST /v1/chats`, mints a token for it with
78
+ `POST /v1/chats/{id}/token`, and hands the browser that response unchanged. The
79
+ token opens that one chat and nothing else.
80
+
81
+ ```ts
82
+ import { TalqingChat } from "@talqing/client";
83
+
84
+ const chat = new TalqingChat({
85
+ fetchToken: async () => {
86
+ const response = await fetch("/api/talqing-chat-token", { method: "POST" });
87
+ return await response.json(); // { chat_id, token, expires_at, api_url }
88
+ },
89
+ });
90
+
91
+ const { events, result } = chat.send("Where is my order?");
92
+ for await (const event of events) {
93
+ if (event.event === "assistant.delta") append(event.text);
94
+ }
95
+ const turn = await result; // { status, items, chat_status, … }
96
+ ```
97
+
98
+ `events` and `result` are two views of one request; use either alone. A turn's
99
+ `status` is `canceled` when the person sent a newer message first — that
100
+ message's own `send` carries the reply — and `chat_status` is `ended` when the
101
+ agent closed the chat. `send` takes `{ images }` as `data:` URLs, which
102
+ `talqingImageDataUrl(file)` produces.
103
+
104
+ `chat.items()` is the chat so far, oldest first, and `chat.end()` ends it. A
105
+ browser only ever receives what the person can see — never the agent's tool
106
+ calls. A token lasts an hour, so `fetchToken` is called again shortly before
107
+ each one expires: have it mint a token for the **same** chat rather than start a
108
+ new one. A refused request throws `TalqingChatError`, with the HTTP `status`.
109
+
86
110
  ## Frontend RPC
87
111
 
88
112
  A tool's `frontend_rpc` operation calls into your page. The agent sends one
@@ -0,0 +1,104 @@
1
+ /** What `POST /v1/chats/{id}/token` returns, named as the API names it — so a
2
+ * server that mints one can forward the response through unchanged. */
3
+ export interface TalqingChatCredentials {
4
+ chat_id: string;
5
+ token: string;
6
+ /** ISO 8601. A token lasts an hour. */
7
+ expires_at: string;
8
+ /** The API this chat lives on. */
9
+ api_url: string;
10
+ }
11
+ export interface TalqingChatAttachment {
12
+ id: string;
13
+ kind: "image";
14
+ mime_type: string;
15
+ bytes: number;
16
+ width: number;
17
+ height: number;
18
+ filename: string | null;
19
+ /** Signed, and short-lived: valid until `url_expires_at`. */
20
+ url: string;
21
+ url_expires_at: string;
22
+ }
23
+ /** One message in the chat. A browser only ever receives what the person
24
+ * chatting can see — never the agent's tool calls. */
25
+ export interface TalqingChatItem {
26
+ id: string;
27
+ /** The message this one answers; null on the person's own messages. */
28
+ trigger_item_id: string | null;
29
+ direction: "inbound" | "outbound" | "internal";
30
+ type: string;
31
+ role: "user" | "assistant" | "system" | "developer" | "tool" | null;
32
+ /** Null on a message that is only images. */
33
+ text: string | null;
34
+ attachments: TalqingChatAttachment[];
35
+ created_at: string;
36
+ }
37
+ /** What one message led to. */
38
+ export interface TalqingChatTurn {
39
+ input: TalqingChatItem;
40
+ /** `canceled`: a newer message arrived first, named by `superseded_by_item_id`. */
41
+ status: "done" | "error" | "canceled" | "running";
42
+ error: string | null;
43
+ superseded_by_item_id: string | null;
44
+ /** Everything the agent said in reply, oldest first. */
45
+ items: TalqingChatItem[];
46
+ /** `ended` when the agent ended the chat on this turn. */
47
+ chat_status: "open" | "ended";
48
+ }
49
+ /** A frame of a reply as it is generated. `assistant.delta` chunks append. */
50
+ export type TalqingChatEvent = {
51
+ event: "assistant.started";
52
+ trigger_item_id: string;
53
+ } | {
54
+ event: "assistant.delta";
55
+ trigger_item_id: string;
56
+ text: string;
57
+ } | {
58
+ event: "assistant.completed";
59
+ trigger_item_id: string;
60
+ text: string | null;
61
+ } | ({
62
+ event: "item.created";
63
+ } & TalqingChatItem) | ({
64
+ event: "turn.result";
65
+ } & TalqingChatTurn);
66
+ /** An image to send with a message, as a `data:` URL. */
67
+ export interface TalqingChatImage {
68
+ data_url: string;
69
+ filename?: string;
70
+ }
71
+ /** An error response from the API. */
72
+ export declare class TalqingChatError extends Error {
73
+ readonly name = "TalqingChatError";
74
+ readonly status: number;
75
+ /** Per-field problems, when the failure had more than one. */
76
+ readonly errors: string[];
77
+ constructor(status: number, message: string, errors: string[]);
78
+ }
79
+ /** One chat, driven from a browser.
80
+ *
81
+ * `fetchToken` asks YOUR server for the chat's token, and is called again
82
+ * shortly before each one expires. */
83
+ export declare class TalqingChat {
84
+ private readonly fetchToken;
85
+ private minted;
86
+ constructor(options: {
87
+ fetchToken: () => Promise<TalqingChatCredentials>;
88
+ });
89
+ /** Send a message. `events` yields the reply as it is generated; `result`
90
+ * resolves with the whole turn. Either can be used without the other. */
91
+ send(text: string, options?: {
92
+ images?: TalqingChatImage[];
93
+ }): {
94
+ events: AsyncIterable<TalqingChatEvent>;
95
+ result: Promise<TalqingChatTurn>;
96
+ };
97
+ /** The chat so far, oldest first. */
98
+ items(): Promise<TalqingChatItem[]>;
99
+ /** End the chat. Further messages are refused. */
100
+ end(): Promise<void>;
101
+ private credentials;
102
+ private request;
103
+ }
104
+ //# sourceMappingURL=chat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat.d.ts","sourceRoot":"","sources":["../../src/chat.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,158 @@
1
+ "use strict";
2
+ /* ── chats ────────────────────────────────────────────────────────────────
3
+ *
4
+ * A text chat with an agent, from a browser. Your SERVER starts the chat
5
+ * (`POST /v1/chats`) and mints a token for it (`POST /v1/chats/{id}/token`);
6
+ * the browser holds only that token, which opens that one chat and nothing
7
+ * else.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.TalqingChat = exports.TalqingChatError = void 0;
11
+ /** An error response from the API. */
12
+ class TalqingChatError extends Error {
13
+ constructor(status, message, errors) {
14
+ super(message);
15
+ this.name = "TalqingChatError";
16
+ this.status = status;
17
+ this.errors = errors;
18
+ }
19
+ }
20
+ exports.TalqingChatError = TalqingChatError;
21
+ /** How long before `expires_at` a new token is fetched. */
22
+ const REFRESH_BEFORE_EXPIRY_MS = 60000;
23
+ /** One chat, driven from a browser.
24
+ *
25
+ * `fetchToken` asks YOUR server for the chat's token, and is called again
26
+ * shortly before each one expires. */
27
+ class TalqingChat {
28
+ constructor(options) {
29
+ this.minted = null;
30
+ this.fetchToken = options.fetchToken;
31
+ }
32
+ /** Send a message. `events` yields the reply as it is generated; `result`
33
+ * resolves with the whole turn. Either can be used without the other. */
34
+ send(text, options = {}) {
35
+ const queue = [];
36
+ let finished = false;
37
+ let failure;
38
+ let wake = null;
39
+ const notify = () => {
40
+ wake?.();
41
+ wake = null;
42
+ };
43
+ const result = (async () => {
44
+ const response = await this.request("/messages", {
45
+ method: "POST",
46
+ body: JSON.stringify({
47
+ message: text,
48
+ images: options.images ?? [],
49
+ client_message_id: crypto.randomUUID(),
50
+ stream: true,
51
+ }),
52
+ });
53
+ for await (const event of readEvents(response)) {
54
+ queue.push(event);
55
+ notify();
56
+ if (event.event === "turn.result") {
57
+ const { event: _name, ...turn } = event;
58
+ return turn;
59
+ }
60
+ }
61
+ throw new TalqingChatError(response.status, "the reply ended before it finished", []);
62
+ })();
63
+ result
64
+ .catch((error) => {
65
+ failure = error;
66
+ })
67
+ .finally(() => {
68
+ finished = true;
69
+ notify();
70
+ });
71
+ const events = {
72
+ [Symbol.asyncIterator]: async function* () {
73
+ for (;;) {
74
+ while (queue.length > 0)
75
+ yield queue.shift();
76
+ if (finished) {
77
+ if (failure !== undefined)
78
+ throw failure;
79
+ return;
80
+ }
81
+ await new Promise((resolve) => {
82
+ wake = resolve;
83
+ });
84
+ }
85
+ },
86
+ };
87
+ return { events, result };
88
+ }
89
+ /** The chat so far, oldest first. */
90
+ async items() {
91
+ const items = [];
92
+ for (;;) {
93
+ const response = await this.request(`/items?limit=500&offset=${items.length}`, {
94
+ method: "GET",
95
+ });
96
+ const page = (await response.json());
97
+ items.push(...page.items);
98
+ if (!page.has_more)
99
+ return items;
100
+ }
101
+ }
102
+ /** End the chat. Further messages are refused. */
103
+ async end() {
104
+ await this.request("/end", { method: "POST" });
105
+ }
106
+ credentials() {
107
+ const current = this.minted;
108
+ this.minted = (async () => {
109
+ const held = await current?.catch(() => null);
110
+ if (held && Date.parse(held.expires_at) - Date.now() > REFRESH_BEFORE_EXPIRY_MS) {
111
+ return held;
112
+ }
113
+ return this.fetchToken();
114
+ })();
115
+ return this.minted;
116
+ }
117
+ async request(path, init) {
118
+ const { api_url, chat_id, token } = await this.credentials();
119
+ const response = await fetch(`${api_url}/v1/chats/${chat_id}${path}`, {
120
+ ...init,
121
+ headers: { authorization: `Bearer ${token}`, "content-type": "application/json" },
122
+ });
123
+ if (!response.ok) {
124
+ const body = (await response.json().catch(() => null));
125
+ throw new TalqingChatError(response.status, body?.detail?.message ?? response.statusText, body?.detail?.errors ?? []);
126
+ }
127
+ return response;
128
+ }
129
+ }
130
+ exports.TalqingChat = TalqingChat;
131
+ /** Parse a `text/event-stream` body into its frames. Keep-alive comments are dropped. */
132
+ async function* readEvents(response) {
133
+ if (!response.body)
134
+ return;
135
+ const reader = response.body.getReader();
136
+ const decoder = new TextDecoder();
137
+ let buffer = "";
138
+ for (;;) {
139
+ const { done, value } = await reader.read();
140
+ if (done)
141
+ return;
142
+ buffer += decoder.decode(value, { stream: true });
143
+ let boundary = buffer.indexOf("\n\n");
144
+ while (boundary !== -1) {
145
+ const frame = buffer.slice(0, boundary);
146
+ buffer = buffer.slice(boundary + 2);
147
+ const data = frame
148
+ .split("\n")
149
+ .filter((line) => line.startsWith("data:"))
150
+ .map((line) => line.slice(5).trimStart())
151
+ .join("\n");
152
+ if (data)
153
+ yield JSON.parse(data);
154
+ boundary = buffer.indexOf("\n\n");
155
+ }
156
+ }
157
+ }
158
+ //# sourceMappingURL=chat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat.js","sourceRoot":"","sources":["../../src/chat.ts"],"names":[],"mappings":"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"}
@@ -6,7 +6,7 @@ exports.talqingDownscaleImage = talqingDownscaleImage;
6
6
  exports.talqingImageDataUrl = talqingImageDataUrl;
7
7
  exports.sendTalqingImage = sendTalqingImage;
8
8
  exports.onTalqingImageResult = onTalqingImageResult;
9
- const userdata_js_1 = require("./userdata.js");
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, userdata_js_1.talqingAgentParticipant)(room);
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);
@@ -1 +1 @@
1
- {"version":3,"file":"images.js","sourceRoot":"","sources":["../../src/images.ts"],"names":[],"mappings":"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"}
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"}
@@ -1,10 +1,12 @@
1
1
  export { createTalqingTokenSource } from "./token.js";
2
2
  export type { TalqingCallCredentials } from "./token.js";
3
- export { getTalqingUserdata, setTalqingUserdata, talqingAgentParticipant, } from "./userdata.js";
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
6
  export { registerTalqingRpcHandlers, TalqingRpcError } from "./rpc.js";
7
7
  export type { TalqingFrontendRpcEnvelope, TalqingRpcHandler, TalqingRpcHandlers, TalqingRpcInvocation, } from "./rpc.js";
8
8
  export { TALQING_AUDIO_CAPTURE_DEFAULTS, TALQING_SCREEN_SHARE_CAPTURE, TALQING_SCREEN_SHARE_PUBLISH, } from "./media.js";
9
+ export { TalqingChat, TalqingChatError } from "./chat.js";
10
+ export type { TalqingChatAttachment, TalqingChatCredentials, TalqingChatEvent, TalqingChatImage, TalqingChatItem, TalqingChatTurn, } from "./chat.js";
9
11
  export type { JsonObject, JsonPrimitive, JsonValue } from "./json.js";
10
12
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AACtD,YAAY,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAEzD,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,uBAAuB,GACxB,MAAM,eAAe,CAAC;AAEvB,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,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,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC"}
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,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,gBAAgB,EAChB,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,21 +2,22 @@
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 two userdata RPC methods, the `talqing.images` byte-stream topic
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.
9
9
  *
10
10
  * React bindings for all of it are `@talqing/react`.
11
+ *
12
+ * `TalqingChat` is the one thing here with no room behind it: a text chat, over
13
+ * HTTP, on a chat token.
11
14
  */
12
15
  Object.defineProperty(exports, "__esModule", { value: true });
13
- 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.setTalqingUserdata = exports.getTalqingUserdata = exports.createTalqingTokenSource = void 0;
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.createTalqingTokenSource = void 0;
14
17
  var token_js_1 = require("./token.js");
15
18
  Object.defineProperty(exports, "createTalqingTokenSource", { enumerable: true, get: function () { return token_js_1.createTalqingTokenSource; } });
16
- var userdata_js_1 = require("./userdata.js");
17
- Object.defineProperty(exports, "getTalqingUserdata", { enumerable: true, get: function () { return userdata_js_1.getTalqingUserdata; } });
18
- Object.defineProperty(exports, "setTalqingUserdata", { enumerable: true, get: function () { return userdata_js_1.setTalqingUserdata; } });
19
- 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; } });
20
21
  var images_js_1 = require("./images.js");
21
22
  Object.defineProperty(exports, "onTalqingImageResult", { enumerable: true, get: function () { return images_js_1.onTalqingImageResult; } });
22
23
  Object.defineProperty(exports, "sendTalqingImage", { enumerable: true, get: function () { return images_js_1.sendTalqingImage; } });
@@ -34,4 +35,7 @@ var media_js_1 = require("./media.js");
34
35
  Object.defineProperty(exports, "TALQING_AUDIO_CAPTURE_DEFAULTS", { enumerable: true, get: function () { return media_js_1.TALQING_AUDIO_CAPTURE_DEFAULTS; } });
35
36
  Object.defineProperty(exports, "TALQING_SCREEN_SHARE_CAPTURE", { enumerable: true, get: function () { return media_js_1.TALQING_SCREEN_SHARE_CAPTURE; } });
36
37
  Object.defineProperty(exports, "TALQING_SCREEN_SHARE_PUBLISH", { enumerable: true, get: function () { return media_js_1.TALQING_SCREEN_SHARE_PUBLISH; } });
38
+ var chat_js_1 = require("./chat.js");
39
+ Object.defineProperty(exports, "TalqingChat", { enumerable: true, get: function () { return chat_js_1.TalqingChat; } });
40
+ Object.defineProperty(exports, "TalqingChatError", { enumerable: true, get: function () { return chat_js_1.TalqingChatError; } });
37
41
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;GASG;;;AAEH,uCAAsD;AAA7C,oHAAA,wBAAwB,OAAA;AAGjC,6CAIuB;AAHrB,iHAAA,kBAAkB,OAAA;AAClB,iHAAA,kBAAkB,OAAA;AAClB,sHAAA,uBAAuB,OAAA;AAGzB,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,mCAAuE;AAA9D,oHAAA,0BAA0B,OAAA;AAAE,yGAAA,eAAe,OAAA;AAQpD,uCAIoB;AAHlB,0HAAA,8BAA8B,OAAA;AAC9B,wHAAA,4BAA4B,OAAA;AAC5B,wHAAA,4BAA4B,OAAA"}
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,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"}
@@ -0,0 +1,104 @@
1
+ /** What `POST /v1/chats/{id}/token` returns, named as the API names it — so a
2
+ * server that mints one can forward the response through unchanged. */
3
+ export interface TalqingChatCredentials {
4
+ chat_id: string;
5
+ token: string;
6
+ /** ISO 8601. A token lasts an hour. */
7
+ expires_at: string;
8
+ /** The API this chat lives on. */
9
+ api_url: string;
10
+ }
11
+ export interface TalqingChatAttachment {
12
+ id: string;
13
+ kind: "image";
14
+ mime_type: string;
15
+ bytes: number;
16
+ width: number;
17
+ height: number;
18
+ filename: string | null;
19
+ /** Signed, and short-lived: valid until `url_expires_at`. */
20
+ url: string;
21
+ url_expires_at: string;
22
+ }
23
+ /** One message in the chat. A browser only ever receives what the person
24
+ * chatting can see — never the agent's tool calls. */
25
+ export interface TalqingChatItem {
26
+ id: string;
27
+ /** The message this one answers; null on the person's own messages. */
28
+ trigger_item_id: string | null;
29
+ direction: "inbound" | "outbound" | "internal";
30
+ type: string;
31
+ role: "user" | "assistant" | "system" | "developer" | "tool" | null;
32
+ /** Null on a message that is only images. */
33
+ text: string | null;
34
+ attachments: TalqingChatAttachment[];
35
+ created_at: string;
36
+ }
37
+ /** What one message led to. */
38
+ export interface TalqingChatTurn {
39
+ input: TalqingChatItem;
40
+ /** `canceled`: a newer message arrived first, named by `superseded_by_item_id`. */
41
+ status: "done" | "error" | "canceled" | "running";
42
+ error: string | null;
43
+ superseded_by_item_id: string | null;
44
+ /** Everything the agent said in reply, oldest first. */
45
+ items: TalqingChatItem[];
46
+ /** `ended` when the agent ended the chat on this turn. */
47
+ chat_status: "open" | "ended";
48
+ }
49
+ /** A frame of a reply as it is generated. `assistant.delta` chunks append. */
50
+ export type TalqingChatEvent = {
51
+ event: "assistant.started";
52
+ trigger_item_id: string;
53
+ } | {
54
+ event: "assistant.delta";
55
+ trigger_item_id: string;
56
+ text: string;
57
+ } | {
58
+ event: "assistant.completed";
59
+ trigger_item_id: string;
60
+ text: string | null;
61
+ } | ({
62
+ event: "item.created";
63
+ } & TalqingChatItem) | ({
64
+ event: "turn.result";
65
+ } & TalqingChatTurn);
66
+ /** An image to send with a message, as a `data:` URL. */
67
+ export interface TalqingChatImage {
68
+ data_url: string;
69
+ filename?: string;
70
+ }
71
+ /** An error response from the API. */
72
+ export declare class TalqingChatError extends Error {
73
+ readonly name = "TalqingChatError";
74
+ readonly status: number;
75
+ /** Per-field problems, when the failure had more than one. */
76
+ readonly errors: string[];
77
+ constructor(status: number, message: string, errors: string[]);
78
+ }
79
+ /** One chat, driven from a browser.
80
+ *
81
+ * `fetchToken` asks YOUR server for the chat's token, and is called again
82
+ * shortly before each one expires. */
83
+ export declare class TalqingChat {
84
+ private readonly fetchToken;
85
+ private minted;
86
+ constructor(options: {
87
+ fetchToken: () => Promise<TalqingChatCredentials>;
88
+ });
89
+ /** Send a message. `events` yields the reply as it is generated; `result`
90
+ * resolves with the whole turn. Either can be used without the other. */
91
+ send(text: string, options?: {
92
+ images?: TalqingChatImage[];
93
+ }): {
94
+ events: AsyncIterable<TalqingChatEvent>;
95
+ result: Promise<TalqingChatTurn>;
96
+ };
97
+ /** The chat so far, oldest first. */
98
+ items(): Promise<TalqingChatItem[]>;
99
+ /** End the chat. Further messages are refused. */
100
+ end(): Promise<void>;
101
+ private credentials;
102
+ private request;
103
+ }
104
+ //# sourceMappingURL=chat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat.d.ts","sourceRoot":"","sources":["../../src/chat.ts"],"names":[],"mappings":"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"}