@livekit/agents 0.1.0 → 0.3.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.
Files changed (155) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/CHANGELOG.md +47 -0
  3. package/LICENSE +201 -0
  4. package/dist/audio.d.ts +9 -0
  5. package/dist/audio.d.ts.map +1 -0
  6. package/dist/audio.js +54 -0
  7. package/dist/audio.js.map +1 -0
  8. package/dist/cli.d.ts +12 -1
  9. package/dist/cli.d.ts.map +1 -1
  10. package/dist/cli.js +102 -19
  11. package/dist/cli.js.map +1 -1
  12. package/dist/generator.d.ts +17 -6
  13. package/dist/generator.d.ts.map +1 -1
  14. package/dist/generator.js +20 -3
  15. package/dist/generator.js.map +1 -1
  16. package/dist/http_server.d.ts +1 -1
  17. package/dist/http_server.d.ts.map +1 -1
  18. package/dist/http_server.js +5 -3
  19. package/dist/http_server.js.map +1 -1
  20. package/dist/index.d.ts +14 -3
  21. package/dist/index.d.ts.map +1 -1
  22. package/dist/index.js +14 -3
  23. package/dist/index.js.map +1 -1
  24. package/dist/ipc/job_executor.d.ts +19 -0
  25. package/dist/ipc/job_executor.d.ts.map +1 -0
  26. package/dist/ipc/job_executor.js +8 -0
  27. package/dist/ipc/job_executor.js.map +1 -0
  28. package/dist/ipc/job_main.d.ts +7 -4
  29. package/dist/ipc/job_main.d.ts.map +1 -1
  30. package/dist/ipc/job_main.js +102 -59
  31. package/dist/ipc/job_main.js.map +1 -1
  32. package/dist/ipc/message.d.ts +41 -0
  33. package/dist/ipc/message.d.ts.map +1 -0
  34. package/dist/ipc/message.js +2 -0
  35. package/dist/ipc/message.js.map +1 -0
  36. package/dist/ipc/proc_job_executor.d.ts +15 -0
  37. package/dist/ipc/proc_job_executor.d.ts.map +1 -0
  38. package/dist/ipc/proc_job_executor.js +150 -0
  39. package/dist/ipc/proc_job_executor.js.map +1 -0
  40. package/dist/ipc/proc_pool.d.ts +26 -0
  41. package/dist/ipc/proc_pool.d.ts.map +1 -0
  42. package/dist/ipc/proc_pool.js +83 -0
  43. package/dist/ipc/proc_pool.js.map +1 -0
  44. package/dist/job.d.ts +100 -0
  45. package/dist/job.d.ts.map +1 -0
  46. package/dist/job.js +213 -0
  47. package/dist/job.js.map +1 -0
  48. package/dist/llm/function_context.d.ts +20 -0
  49. package/dist/llm/function_context.d.ts.map +1 -0
  50. package/dist/llm/function_context.js +37 -0
  51. package/dist/llm/function_context.js.map +1 -0
  52. package/dist/llm/index.d.ts +3 -0
  53. package/dist/llm/index.d.ts.map +1 -0
  54. package/dist/llm/index.js +6 -0
  55. package/dist/llm/index.js.map +1 -0
  56. package/dist/log.d.ts +12 -1
  57. package/dist/log.d.ts.map +1 -1
  58. package/dist/log.js +28 -11
  59. package/dist/log.js.map +1 -1
  60. package/dist/multimodal/agent_playout.d.ts +34 -0
  61. package/dist/multimodal/agent_playout.d.ts.map +1 -0
  62. package/dist/multimodal/agent_playout.js +221 -0
  63. package/dist/multimodal/agent_playout.js.map +1 -0
  64. package/dist/multimodal/index.d.ts +3 -0
  65. package/dist/multimodal/index.d.ts.map +1 -0
  66. package/dist/multimodal/index.js +6 -0
  67. package/dist/multimodal/index.js.map +1 -0
  68. package/dist/multimodal/multimodal_agent.d.ts +47 -0
  69. package/dist/multimodal/multimodal_agent.d.ts.map +1 -0
  70. package/dist/multimodal/multimodal_agent.js +331 -0
  71. package/dist/multimodal/multimodal_agent.js.map +1 -0
  72. package/dist/plugin.js +20 -7
  73. package/dist/plugin.js.map +1 -1
  74. package/dist/stt/index.d.ts +1 -1
  75. package/dist/stt/index.d.ts.map +1 -1
  76. package/dist/stt/index.js.map +1 -1
  77. package/dist/stt/stream_adapter.d.ts +2 -11
  78. package/dist/stt/stream_adapter.d.ts.map +1 -1
  79. package/dist/stt/stream_adapter.js +47 -33
  80. package/dist/stt/stream_adapter.js.map +1 -1
  81. package/dist/stt/stt.d.ts +27 -0
  82. package/dist/stt/stt.d.ts.map +1 -1
  83. package/dist/stt/stt.js +32 -5
  84. package/dist/stt/stt.js.map +1 -1
  85. package/dist/transcription.d.ts +22 -0
  86. package/dist/transcription.d.ts.map +1 -0
  87. package/dist/transcription.js +111 -0
  88. package/dist/transcription.js.map +1 -0
  89. package/dist/tts/stream_adapter.d.ts +4 -11
  90. package/dist/tts/stream_adapter.d.ts.map +1 -1
  91. package/dist/tts/stream_adapter.js +66 -32
  92. package/dist/tts/stream_adapter.js.map +1 -1
  93. package/dist/tts/tts.d.ts +10 -0
  94. package/dist/tts/tts.d.ts.map +1 -1
  95. package/dist/tts/tts.js +48 -7
  96. package/dist/tts/tts.js.map +1 -1
  97. package/dist/utils.d.ts +59 -0
  98. package/dist/utils.d.ts.map +1 -1
  99. package/dist/utils.js +212 -6
  100. package/dist/utils.js.map +1 -1
  101. package/dist/vad.d.ts +29 -0
  102. package/dist/vad.d.ts.map +1 -1
  103. package/dist/vad.js.map +1 -1
  104. package/dist/worker.d.ts +69 -50
  105. package/dist/worker.d.ts.map +1 -1
  106. package/dist/worker.js +414 -213
  107. package/dist/worker.js.map +1 -1
  108. package/package.json +12 -10
  109. package/src/audio.ts +62 -0
  110. package/src/cli.ts +108 -20
  111. package/src/generator.ts +27 -7
  112. package/src/http_server.ts +5 -0
  113. package/src/index.ts +15 -3
  114. package/src/ipc/job_executor.ts +25 -0
  115. package/src/ipc/job_main.ts +141 -61
  116. package/src/ipc/message.ts +39 -0
  117. package/src/ipc/proc_job_executor.ts +162 -0
  118. package/src/ipc/proc_pool.ts +109 -0
  119. package/src/job.ts +278 -0
  120. package/src/llm/function_context.ts +61 -0
  121. package/src/llm/index.ts +11 -0
  122. package/src/log.ts +40 -8
  123. package/src/multimodal/agent_playout.ts +254 -0
  124. package/src/multimodal/index.ts +5 -0
  125. package/src/multimodal/multimodal_agent.ts +428 -0
  126. package/src/stt/index.ts +1 -1
  127. package/src/stt/stream_adapter.ts +32 -32
  128. package/src/stt/stt.ts +27 -0
  129. package/src/transcription.ts +128 -0
  130. package/src/tts/stream_adapter.ts +32 -31
  131. package/src/tts/tts.ts +10 -0
  132. package/src/utils.ts +257 -3
  133. package/src/vad.ts +29 -0
  134. package/src/worker.ts +465 -172
  135. package/tsconfig.json +7 -1
  136. package/dist/ipc/job_process.d.ts +0 -22
  137. package/dist/ipc/job_process.d.ts.map +0 -1
  138. package/dist/ipc/job_process.js +0 -73
  139. package/dist/ipc/job_process.js.map +0 -1
  140. package/dist/ipc/protocol.d.ts +0 -40
  141. package/dist/ipc/protocol.d.ts.map +0 -1
  142. package/dist/ipc/protocol.js +0 -14
  143. package/dist/ipc/protocol.js.map +0 -1
  144. package/dist/job_context.d.ts +0 -16
  145. package/dist/job_context.d.ts.map +0 -1
  146. package/dist/job_context.js +0 -31
  147. package/dist/job_context.js.map +0 -1
  148. package/dist/job_request.d.ts +0 -42
  149. package/dist/job_request.d.ts.map +0 -1
  150. package/dist/job_request.js +0 -79
  151. package/dist/job_request.js.map +0 -1
  152. package/src/ipc/job_process.ts +0 -96
  153. package/src/ipc/protocol.ts +0 -51
  154. package/src/job_context.ts +0 -49
  155. package/src/job_request.ts +0 -118
package/tsconfig.json CHANGED
@@ -5,6 +5,12 @@
5
5
  // match output dir to input dir. e.g. dist/index instead of dist/src/index
6
6
  "rootDir": "./src",
7
7
  "declarationDir": "./dist",
8
- "outDir": "./dist"
8
+ "outDir": "./dist",
9
+ },
10
+ "typedocOptions": {
11
+ "name": "agents",
12
+ "entryPointStrategy": "resolve",
13
+ "readme": "none",
14
+ "entryPoints": ["src/index.ts"]
9
15
  }
10
16
  }
@@ -1,22 +0,0 @@
1
- /// <reference types="node" resolution-mode="require"/>
2
- /// <reference types="node" resolution-mode="require"/>
3
- import type { Job } from '@livekit/protocol';
4
- import type { ChildProcess } from 'child_process';
5
- import type { Logger } from 'pino';
6
- import type { AcceptData } from '../job_request.js';
7
- import { type JobMainArgs } from './protocol.js';
8
- export declare class JobProcess {
9
- #private;
10
- args: JobMainArgs;
11
- logger: Logger;
12
- process?: ChildProcess;
13
- startTimeout?: ReturnType<typeof setTimeout>;
14
- pongTimeout?: ReturnType<typeof setTimeout>;
15
- pingInterval?: ReturnType<typeof setInterval>;
16
- constructor(job: Job, acceptData: AcceptData, raw: string, fallbackURL: string);
17
- get job(): Job;
18
- close(): Promise<void>;
19
- clear(): Promise<void>;
20
- run(): Promise<void>;
21
- }
22
- //# sourceMappingURL=job_process.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"job_process.d.ts","sourceRoot":"","sources":["../../src/ipc/job_process.ts"],"names":[],"mappings":";;AAGA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAElD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AACnC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEpD,OAAO,EAEL,KAAK,WAAW,EAIjB,MAAM,eAAe,CAAC;AAOvB,qBAAa,UAAU;;IAErB,IAAI,EAAE,WAAW,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,YAAY,CAAC,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC;IAC7C,WAAW,CAAC,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC;IAC5C,YAAY,CAAC,EAAE,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC;gBAElC,GAAG,EAAE,GAAG,EAAE,UAAU,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM;IAM9E,IAAI,GAAG,IAAI,GAAG,CAEb;IAEK,KAAK;IAQL,KAAK;IAML,GAAG;CAwCV"}
@@ -1,73 +0,0 @@
1
- import { once } from 'events';
2
- import { log } from '../log.js';
3
- import { IPC_MESSAGE, } from './protocol.js';
4
- const START_TIMEOUT = 90 * 1000;
5
- const PING_INTERVAL = 5 * 1000;
6
- const PING_TIMEOUT = 90 * 1000;
7
- const HIGH_PING_THRESHOLD = 10;
8
- export class JobProcess {
9
- #job;
10
- args;
11
- logger;
12
- process;
13
- startTimeout;
14
- pongTimeout;
15
- pingInterval;
16
- constructor(job, acceptData, raw, fallbackURL) {
17
- this.#job = job;
18
- this.args = { entry: acceptData.entry, raw, fallbackURL };
19
- this.logger = log.child({ job_id: this.#job.id });
20
- }
21
- get job() {
22
- return this.#job;
23
- }
24
- async close() {
25
- this.logger.debug('closing job process');
26
- await this.clear();
27
- this.process.send({ type: IPC_MESSAGE.ShutdownRequest });
28
- await once(this.process, 'disconnect');
29
- this.logger.info('job process closed');
30
- }
31
- async clear() {
32
- clearTimeout(this.startTimeout);
33
- clearTimeout(this.pongTimeout);
34
- clearInterval(this.pingInterval);
35
- }
36
- async run() {
37
- let resp = undefined;
38
- this.startTimeout = setTimeout(() => {
39
- if (resp === undefined) {
40
- this.logger.error('process start timed out, killing job');
41
- this.process?.kill();
42
- this.clear();
43
- }
44
- }, START_TIMEOUT);
45
- this.pingInterval = setInterval(() => {
46
- this.process?.send({ type: IPC_MESSAGE.Ping, timestamp: Date.now() });
47
- }, PING_INTERVAL);
48
- this.pongTimeout = setTimeout(() => {
49
- this.logger.error('job ping timed out, killing job');
50
- this.process?.kill();
51
- this.clear();
52
- }, PING_TIMEOUT);
53
- this.process = await import('./job_main.js').then((main) => main.runJob(this.args));
54
- this.process.on('message', (msg) => {
55
- if (msg.type === IPC_MESSAGE.StartJobResponse) {
56
- resp = msg;
57
- }
58
- else if (msg.type === IPC_MESSAGE.Pong) {
59
- const delay = Date.now() - msg.timestamp;
60
- if (delay > HIGH_PING_THRESHOLD) {
61
- this.logger.warn(`job is unresponsive (${delay}ms delay)`);
62
- }
63
- this.pongTimeout?.refresh();
64
- }
65
- else if (msg.type === IPC_MESSAGE.UserExit || msg.type === IPC_MESSAGE.ShutdownResponse) {
66
- this.logger.debug('job exiting');
67
- this.clear();
68
- }
69
- });
70
- await once(this.process, 'disconnect');
71
- }
72
- }
73
- //# sourceMappingURL=job_process.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"job_process.js","sourceRoot":"","sources":["../../src/ipc/job_process.ts"],"names":[],"mappings":"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"}
@@ -1,40 +0,0 @@
1
- export type JobMainArgs = {
2
- entry: string;
3
- raw: string;
4
- fallbackURL: string;
5
- };
6
- export interface Message {
7
- type: IPC_MESSAGE;
8
- }
9
- export interface StartJobResponse extends Message {
10
- type: IPC_MESSAGE.StartJobResponse;
11
- err?: Error;
12
- }
13
- export interface Ping extends Message {
14
- type: IPC_MESSAGE.Ping;
15
- timestamp: number;
16
- }
17
- export interface Pong extends Message {
18
- type: IPC_MESSAGE.Pong;
19
- lastTimestamp: number;
20
- timestamp: number;
21
- }
22
- export interface ShutdownRequest extends Message {
23
- type: IPC_MESSAGE.ShutdownRequest;
24
- }
25
- export interface ShutdownResponse extends Message {
26
- type: IPC_MESSAGE.ShutdownResponse;
27
- }
28
- export interface UserExit extends Message {
29
- type: IPC_MESSAGE.UserExit;
30
- }
31
- export declare enum IPC_MESSAGE {
32
- StartJobRequest = 0,
33
- StartJobResponse = 1,
34
- Ping = 2,
35
- Pong = 3,
36
- ShutdownRequest = 4,
37
- ShutdownResponse = 5,
38
- UserExit = 6
39
- }
40
- //# sourceMappingURL=protocol.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../src/ipc/protocol.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,WAAW,GAAG;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,WAAW,CAAC;CACnB;AAED,MAAM,WAAW,gBAAiB,SAAQ,OAAO;IAC/C,IAAI,EAAE,WAAW,CAAC,gBAAgB,CAAC;IACnC,GAAG,CAAC,EAAE,KAAK,CAAC;CACb;AAED,MAAM,WAAW,IAAK,SAAQ,OAAO;IACnC,IAAI,EAAE,WAAW,CAAC,IAAI,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,IAAK,SAAQ,OAAO;IACnC,IAAI,EAAE,WAAW,CAAC,IAAI,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,eAAgB,SAAQ,OAAO;IAC9C,IAAI,EAAE,WAAW,CAAC,eAAe,CAAC;CACnC;AAED,MAAM,WAAW,gBAAiB,SAAQ,OAAO;IAC/C,IAAI,EAAE,WAAW,CAAC,gBAAgB,CAAC;CACpC;AAED,MAAM,WAAW,QAAS,SAAQ,OAAO;IACvC,IAAI,EAAE,WAAW,CAAC,QAAQ,CAAC;CAC5B;AAED,oBAAY,WAAW;IACrB,eAAe,IAAA;IACf,gBAAgB,IAAA;IAChB,IAAI,IAAA;IACJ,IAAI,IAAA;IACJ,eAAe,IAAA;IACf,gBAAgB,IAAA;IAChB,QAAQ,IAAA;CACT"}
@@ -1,14 +0,0 @@
1
- // SPDX-FileCopyrightText: 2024 LiveKit, Inc.
2
- //
3
- // SPDX-License-Identifier: Apache-2.0
4
- export var IPC_MESSAGE;
5
- (function (IPC_MESSAGE) {
6
- IPC_MESSAGE[IPC_MESSAGE["StartJobRequest"] = 0] = "StartJobRequest";
7
- IPC_MESSAGE[IPC_MESSAGE["StartJobResponse"] = 1] = "StartJobResponse";
8
- IPC_MESSAGE[IPC_MESSAGE["Ping"] = 2] = "Ping";
9
- IPC_MESSAGE[IPC_MESSAGE["Pong"] = 3] = "Pong";
10
- IPC_MESSAGE[IPC_MESSAGE["ShutdownRequest"] = 4] = "ShutdownRequest";
11
- IPC_MESSAGE[IPC_MESSAGE["ShutdownResponse"] = 5] = "ShutdownResponse";
12
- IPC_MESSAGE[IPC_MESSAGE["UserExit"] = 6] = "UserExit";
13
- })(IPC_MESSAGE || (IPC_MESSAGE = {}));
14
- //# sourceMappingURL=protocol.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../src/ipc/protocol.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAC7C,EAAE;AACF,sCAAsC;AAwCtC,MAAM,CAAN,IAAY,WAQX;AARD,WAAY,WAAW;IACrB,mEAAe,CAAA;IACf,qEAAgB,CAAA;IAChB,6CAAI,CAAA;IACJ,6CAAI,CAAA;IACJ,mEAAe,CAAA;IACf,qEAAgB,CAAA;IAChB,qDAAQ,CAAA;AACV,CAAC,EARW,WAAW,KAAX,WAAW,QAQtB"}
@@ -1,16 +0,0 @@
1
- /// <reference types="node" resolution-mode="require"/>
2
- import type { Job } from '@livekit/protocol';
3
- import type { LocalParticipant, RemoteParticipant, Room } from '@livekit/rtc-node';
4
- import type { EventEmitter } from 'events';
5
- export declare class JobContext {
6
- #private;
7
- tx: EventEmitter;
8
- constructor(tx: EventEmitter, job: Job, room: Room, publisher?: RemoteParticipant | undefined);
9
- get id(): string;
10
- get job(): Job;
11
- get room(): Room;
12
- get publisher(): RemoteParticipant | undefined;
13
- get agent(): LocalParticipant | undefined;
14
- shutdown(): Promise<void>;
15
- }
16
- //# sourceMappingURL=job_context.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"job_context.d.ts","sourceRoot":"","sources":["../src/job_context.ts"],"names":[],"mappings":";AAGA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,KAAK,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACnF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAE3C,qBAAa,UAAU;;IAIrB,EAAE,EAAE,YAAY,CAAC;gBAGf,EAAE,EAAE,YAAY,EAChB,GAAG,EAAE,GAAG,EACR,IAAI,EAAE,IAAI,EACV,SAAS,GAAE,iBAAiB,GAAG,SAAqB;IAQtD,IAAI,EAAE,IAAI,MAAM,CAEf;IAED,IAAI,GAAG,IAAI,GAAG,CAEb;IAED,IAAI,IAAI,IAAI,IAAI,CAEf;IAED,IAAI,SAAS,IAAI,iBAAiB,GAAG,SAAS,CAE7C;IAED,IAAI,KAAK,IAAI,gBAAgB,GAAG,SAAS,CAExC;IAEK,QAAQ;CAGf"}
@@ -1,31 +0,0 @@
1
- export class JobContext {
2
- #job;
3
- #room;
4
- #publisher;
5
- tx;
6
- constructor(tx, job, room, publisher = undefined) {
7
- this.#job = job;
8
- this.#room = room;
9
- this.#publisher = publisher;
10
- this.tx = tx;
11
- }
12
- get id() {
13
- return this.#job.id;
14
- }
15
- get job() {
16
- return this.#job;
17
- }
18
- get room() {
19
- return this.#room;
20
- }
21
- get publisher() {
22
- return this.#publisher;
23
- }
24
- get agent() {
25
- return this.#room.localParticipant;
26
- }
27
- async shutdown() {
28
- this.tx.emit('close');
29
- }
30
- }
31
- //# sourceMappingURL=job_context.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"job_context.js","sourceRoot":"","sources":["../src/job_context.ts"],"names":[],"mappings":"AAOA,MAAM,OAAO,UAAU;IACrB,IAAI,CAAM;IACV,KAAK,CAAO;IACZ,UAAU,CAAqB;IAC/B,EAAE,CAAe;IAEjB,YACE,EAAgB,EAChB,GAAQ,EACR,IAAU,EACV,YAA2C,SAAS;QAEpD,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC;QAChB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;QAC5B,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;IACf,CAAC;IAED,IAAI,EAAE;QACJ,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;IACtB,CAAC;IAED,IAAI,GAAG;QACL,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACxB,CAAC;CACF"}
@@ -1,42 +0,0 @@
1
- /// <reference types="node" resolution-mode="require"/>
2
- import type { Job, ParticipantInfo, Room } from '@livekit/protocol';
3
- import { EventEmitter } from 'events';
4
- declare enum AutoDisconnect {
5
- ROOM_EMPTY = 0,
6
- PUBLISHER_LEFT = 1,
7
- NONE = 2
8
- }
9
- export declare enum AutoSubscribe {
10
- SUBSCRIBE_ALL = 0,
11
- SUBSCRIBE_NONE = 1,
12
- VIDEO_ONLY = 2,
13
- AUDIO_ONLY = 3
14
- }
15
- export type AcceptData = {
16
- entry: string;
17
- autoSubscribe: AutoSubscribe;
18
- autoDisconnect: AutoDisconnect;
19
- name: string;
20
- identity: string;
21
- metadata: string;
22
- assign: EventEmitter;
23
- };
24
- export type AvailRes = {
25
- avail: boolean;
26
- data?: AcceptData;
27
- };
28
- export declare class JobRequest {
29
- #private;
30
- tx: EventEmitter;
31
- logger: import("pino").default.Logger<never>;
32
- constructor(job: Job, tx: EventEmitter);
33
- get id(): string;
34
- get job(): Job;
35
- get room(): Room | undefined;
36
- get publisher(): ParticipantInfo | undefined;
37
- get answered(): boolean;
38
- reject(): Promise<void>;
39
- accept(entry: string, autoSubscribe?: AutoSubscribe, autoDisconnect?: AutoDisconnect, name?: string, identity?: string, metadata?: string): Promise<void>;
40
- }
41
- export {};
42
- //# sourceMappingURL=job_request.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"job_request.d.ts","sourceRoot":"","sources":["../src/job_request.ts"],"names":[],"mappings":";AAGA,OAAO,KAAK,EAAE,GAAG,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAWtC,aAAK,cAAc;IACjB,UAAU,IAAA;IACV,cAAc,IAAA;IACd,IAAI,IAAA;CACL;AAED,oBAAY,aAAa;IACvB,aAAa,IAAA;IACb,cAAc,IAAA;IACd,UAAU,IAAA;IACV,UAAU,IAAA;CACX;AAED,MAAM,MAAM,UAAU,GAAG;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,aAAa,CAAC;IAC7B,cAAc,EAAE,cAAc,CAAC;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,YAAY,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG;IACrB,KAAK,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE,UAAU,CAAC;CACnB,CAAC;AAEF,qBAAa,UAAU;;IAGrB,EAAE,EAAE,YAAY,CAAC;IACjB,MAAM,uCAAgC;gBAE1B,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,YAAY;IAKtC,IAAI,EAAE,IAAI,MAAM,CAEf;IAED,IAAI,GAAG,IAAI,GAAG,CAEb;IAED,IAAI,IAAI,IAAI,IAAI,GAAG,SAAS,CAE3B;IAED,IAAI,SAAS,IAAI,eAAe,GAAG,SAAS,CAE3C;IAED,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAEK,MAAM;IASN,MAAM,CACV,KAAK,EAAE,MAAM,EACb,aAAa,GAAE,aAA2C,EAC1D,cAAc,GAAE,cAA0C,EAC1D,IAAI,GAAE,MAAW,EACjB,QAAQ,GAAE,MAAW,EACrB,QAAQ,GAAE,MAAW;CA4BxB"}
@@ -1,79 +0,0 @@
1
- import { EventEmitter } from 'events';
2
- import { log } from './log.js';
3
- class AnsweredError extends Error {
4
- constructor() {
5
- super();
6
- this.name = 'AnsweredError';
7
- this.message = 'request already answered';
8
- }
9
- }
10
- var AutoDisconnect;
11
- (function (AutoDisconnect) {
12
- AutoDisconnect[AutoDisconnect["ROOM_EMPTY"] = 0] = "ROOM_EMPTY";
13
- AutoDisconnect[AutoDisconnect["PUBLISHER_LEFT"] = 1] = "PUBLISHER_LEFT";
14
- AutoDisconnect[AutoDisconnect["NONE"] = 2] = "NONE";
15
- })(AutoDisconnect || (AutoDisconnect = {}));
16
- export var AutoSubscribe;
17
- (function (AutoSubscribe) {
18
- AutoSubscribe[AutoSubscribe["SUBSCRIBE_ALL"] = 0] = "SUBSCRIBE_ALL";
19
- AutoSubscribe[AutoSubscribe["SUBSCRIBE_NONE"] = 1] = "SUBSCRIBE_NONE";
20
- AutoSubscribe[AutoSubscribe["VIDEO_ONLY"] = 2] = "VIDEO_ONLY";
21
- AutoSubscribe[AutoSubscribe["AUDIO_ONLY"] = 3] = "AUDIO_ONLY";
22
- })(AutoSubscribe || (AutoSubscribe = {}));
23
- export class JobRequest {
24
- #job;
25
- #answered = false;
26
- tx;
27
- logger = log.child({ job: this.job });
28
- constructor(job, tx) {
29
- this.#job = job;
30
- this.tx = tx;
31
- }
32
- get id() {
33
- return this.#job.id;
34
- }
35
- get job() {
36
- return this.#job;
37
- }
38
- get room() {
39
- return this.#job.room;
40
- }
41
- get publisher() {
42
- return this.#job.participant;
43
- }
44
- get answered() {
45
- return this.#answered;
46
- }
47
- async reject() {
48
- if (this.#answered) {
49
- throw new AnsweredError();
50
- }
51
- this.#answered = true;
52
- this.tx.emit('recv', { avail: false, data: undefined });
53
- this.logger.info('rejected job', this.id);
54
- }
55
- async accept(entry, autoSubscribe = AutoSubscribe.SUBSCRIBE_ALL, autoDisconnect = AutoDisconnect.ROOM_EMPTY, name = '', identity = '', metadata = '') {
56
- if (this.#answered) {
57
- throw new AnsweredError();
58
- }
59
- this.#answered = true;
60
- const assign = new EventEmitter();
61
- assign.on('error', (e) => {
62
- throw e;
63
- });
64
- if (identity === '')
65
- identity = 'agent-' + this.id;
66
- const data = {
67
- entry,
68
- autoSubscribe,
69
- autoDisconnect,
70
- name,
71
- identity,
72
- metadata,
73
- assign,
74
- };
75
- this.tx.emit('recv', { avail: true, data });
76
- this.logger.info('accepted job', this.id);
77
- }
78
- }
79
- //# sourceMappingURL=job_request.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"job_request.js","sourceRoot":"","sources":["../src/job_request.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAE/B,MAAM,aAAc,SAAQ,KAAK;IAC/B;QACE,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;QAC5B,IAAI,CAAC,OAAO,GAAG,0BAA0B,CAAC;IAC5C,CAAC;CACF;AAED,IAAK,cAIJ;AAJD,WAAK,cAAc;IACjB,+DAAU,CAAA;IACV,uEAAc,CAAA;IACd,mDAAI,CAAA;AACN,CAAC,EAJI,cAAc,KAAd,cAAc,QAIlB;AAED,MAAM,CAAN,IAAY,aAKX;AALD,WAAY,aAAa;IACvB,mEAAa,CAAA;IACb,qEAAc,CAAA;IACd,6DAAU,CAAA;IACV,6DAAU,CAAA;AACZ,CAAC,EALW,aAAa,KAAb,aAAa,QAKxB;AAiBD,MAAM,OAAO,UAAU;IACrB,IAAI,CAAM;IACV,SAAS,GAAG,KAAK,CAAC;IAClB,EAAE,CAAe;IACjB,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IAEtC,YAAY,GAAQ,EAAE,EAAgB;QACpC,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC;QAChB,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;IACf,CAAC;IAED,IAAI,EAAE;QACJ,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;IACtB,CAAC;IAED,IAAI,GAAG;QACL,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;IACxB,CAAC;IAED,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC;IAC/B,CAAC;IAED,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED,KAAK,CAAC,MAAM;QACV,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,MAAM,IAAI,aAAa,EAAE,CAAC;QAC5B,CAAC;QACD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAc,CAAC,CAAC;QACpE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,KAAK,CAAC,MAAM,CACV,KAAa,EACb,gBAA+B,aAAa,CAAC,aAAa,EAC1D,iBAAiC,cAAc,CAAC,UAAU,EAC1D,OAAe,EAAE,EACjB,WAAmB,EAAE,EACrB,WAAmB,EAAE;QAErB,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,MAAM,IAAI,aAAa,EAAE,CAAC;QAC5B,CAAC;QACD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QAEtB,MAAM,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;QAClC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;YACvB,MAAM,CAAC,CAAC;QACV,CAAC,CAAC,CAAC;QAEH,IAAI,QAAQ,KAAK,EAAE;YAAE,QAAQ,GAAG,QAAQ,GAAG,IAAI,CAAC,EAAE,CAAC;QAEnD,MAAM,IAAI,GAAe;YACvB,KAAK;YACL,aAAa;YACb,cAAc;YACd,IAAI;YACJ,QAAQ;YACR,QAAQ;YACR,MAAM;SACP,CAAC;QAEF,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAc,CAAC,CAAC;QAExD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;IAC5C,CAAC;CACF"}
@@ -1,96 +0,0 @@
1
- // SPDX-FileCopyrightText: 2024 LiveKit, Inc.
2
- //
3
- // SPDX-License-Identifier: Apache-2.0
4
- import type { Job } from '@livekit/protocol';
5
- import type { ChildProcess } from 'child_process';
6
- import { once } from 'events';
7
- import type { Logger } from 'pino';
8
- import type { AcceptData } from '../job_request.js';
9
- import { log } from '../log.js';
10
- import {
11
- IPC_MESSAGE,
12
- type JobMainArgs,
13
- type Message,
14
- type Pong,
15
- type StartJobResponse,
16
- } from './protocol.js';
17
-
18
- const START_TIMEOUT = 90 * 1000;
19
- const PING_INTERVAL = 5 * 1000;
20
- const PING_TIMEOUT = 90 * 1000;
21
- const HIGH_PING_THRESHOLD = 10;
22
-
23
- export class JobProcess {
24
- #job: Job;
25
- args: JobMainArgs;
26
- logger: Logger;
27
- process?: ChildProcess;
28
- startTimeout?: ReturnType<typeof setTimeout>;
29
- pongTimeout?: ReturnType<typeof setTimeout>;
30
- pingInterval?: ReturnType<typeof setInterval>;
31
-
32
- constructor(job: Job, acceptData: AcceptData, raw: string, fallbackURL: string) {
33
- this.#job = job;
34
- this.args = { entry: acceptData.entry, raw, fallbackURL };
35
- this.logger = log.child({ job_id: this.#job.id });
36
- }
37
-
38
- get job(): Job {
39
- return this.#job;
40
- }
41
-
42
- async close() {
43
- this.logger.debug('closing job process');
44
- await this.clear();
45
- this.process!.send({ type: IPC_MESSAGE.ShutdownRequest });
46
- await once(this.process!, 'disconnect');
47
- this.logger.info('job process closed');
48
- }
49
-
50
- async clear() {
51
- clearTimeout(this.startTimeout);
52
- clearTimeout(this.pongTimeout);
53
- clearInterval(this.pingInterval);
54
- }
55
-
56
- async run() {
57
- let resp: StartJobResponse | undefined = undefined;
58
-
59
- this.startTimeout = setTimeout(() => {
60
- if (resp === undefined) {
61
- this.logger.error('process start timed out, killing job');
62
- this.process?.kill();
63
- this.clear();
64
- }
65
- }, START_TIMEOUT);
66
-
67
- this.pingInterval = setInterval(() => {
68
- this.process?.send({ type: IPC_MESSAGE.Ping, timestamp: Date.now() });
69
- }, PING_INTERVAL);
70
-
71
- this.pongTimeout = setTimeout(() => {
72
- this.logger.error('job ping timed out, killing job');
73
- this.process?.kill();
74
- this.clear();
75
- }, PING_TIMEOUT);
76
-
77
- this.process = await import('./job_main.js').then((main) => main.runJob(this.args));
78
-
79
- this.process.on('message', (msg: Message) => {
80
- if (msg.type === IPC_MESSAGE.StartJobResponse) {
81
- resp = msg as StartJobResponse;
82
- } else if (msg.type === IPC_MESSAGE.Pong) {
83
- const delay = Date.now() - (msg as Pong).timestamp;
84
- if (delay > HIGH_PING_THRESHOLD) {
85
- this.logger.warn(`job is unresponsive (${delay}ms delay)`);
86
- }
87
- this.pongTimeout?.refresh();
88
- } else if (msg.type === IPC_MESSAGE.UserExit || msg.type === IPC_MESSAGE.ShutdownResponse) {
89
- this.logger.debug('job exiting');
90
- this.clear();
91
- }
92
- });
93
-
94
- await once(this.process, 'disconnect');
95
- }
96
- }
@@ -1,51 +0,0 @@
1
- // SPDX-FileCopyrightText: 2024 LiveKit, Inc.
2
- //
3
- // SPDX-License-Identifier: Apache-2.0
4
-
5
- export type JobMainArgs = {
6
- entry: string;
7
- raw: string;
8
- fallbackURL: string;
9
- };
10
-
11
- export interface Message {
12
- type: IPC_MESSAGE;
13
- }
14
-
15
- export interface StartJobResponse extends Message {
16
- type: IPC_MESSAGE.StartJobResponse;
17
- err?: Error;
18
- }
19
-
20
- export interface Ping extends Message {
21
- type: IPC_MESSAGE.Ping;
22
- timestamp: number;
23
- }
24
-
25
- export interface Pong extends Message {
26
- type: IPC_MESSAGE.Pong;
27
- lastTimestamp: number;
28
- timestamp: number;
29
- }
30
-
31
- export interface ShutdownRequest extends Message {
32
- type: IPC_MESSAGE.ShutdownRequest;
33
- }
34
-
35
- export interface ShutdownResponse extends Message {
36
- type: IPC_MESSAGE.ShutdownResponse;
37
- }
38
-
39
- export interface UserExit extends Message {
40
- type: IPC_MESSAGE.UserExit;
41
- }
42
-
43
- export enum IPC_MESSAGE {
44
- StartJobRequest,
45
- StartJobResponse,
46
- Ping,
47
- Pong,
48
- ShutdownRequest,
49
- ShutdownResponse,
50
- UserExit,
51
- }
@@ -1,49 +0,0 @@
1
- // SPDX-FileCopyrightText: 2024 LiveKit, Inc.
2
- //
3
- // SPDX-License-Identifier: Apache-2.0
4
- import type { Job } from '@livekit/protocol';
5
- import type { LocalParticipant, RemoteParticipant, Room } from '@livekit/rtc-node';
6
- import type { EventEmitter } from 'events';
7
-
8
- export class JobContext {
9
- #job: Job;
10
- #room: Room;
11
- #publisher?: RemoteParticipant;
12
- tx: EventEmitter;
13
-
14
- constructor(
15
- tx: EventEmitter,
16
- job: Job,
17
- room: Room,
18
- publisher: RemoteParticipant | undefined = undefined,
19
- ) {
20
- this.#job = job;
21
- this.#room = room;
22
- this.#publisher = publisher;
23
- this.tx = tx;
24
- }
25
-
26
- get id(): string {
27
- return this.#job.id;
28
- }
29
-
30
- get job(): Job {
31
- return this.#job;
32
- }
33
-
34
- get room(): Room {
35
- return this.#room;
36
- }
37
-
38
- get publisher(): RemoteParticipant | undefined {
39
- return this.#publisher;
40
- }
41
-
42
- get agent(): LocalParticipant | undefined {
43
- return this.#room.localParticipant;
44
- }
45
-
46
- async shutdown() {
47
- this.tx.emit('close');
48
- }
49
- }