@livekit/agents 0.4.6 → 0.5.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 (197) hide show
  1. package/README.md +17 -0
  2. package/dist/audio.cjs +77 -0
  3. package/dist/audio.cjs.map +1 -0
  4. package/dist/audio.js +48 -37
  5. package/dist/audio.js.map +1 -1
  6. package/dist/cli.cjs +131 -0
  7. package/dist/cli.cjs.map +1 -0
  8. package/dist/cli.js +96 -122
  9. package/dist/cli.js.map +1 -1
  10. package/dist/generator.cjs +36 -0
  11. package/dist/generator.cjs.map +1 -0
  12. package/dist/generator.js +8 -22
  13. package/dist/generator.js.map +1 -1
  14. package/dist/http_server.cjs +72 -0
  15. package/dist/http_server.cjs.map +1 -0
  16. package/dist/http_server.d.ts +1 -1
  17. package/dist/http_server.js +44 -47
  18. package/dist/http_server.js.map +1 -1
  19. package/dist/index.cjs +78 -0
  20. package/dist/index.cjs.map +1 -0
  21. package/dist/index.js +26 -28
  22. package/dist/index.js.map +1 -1
  23. package/dist/ipc/job_executor.cjs +33 -0
  24. package/dist/ipc/job_executor.cjs.map +1 -0
  25. package/dist/ipc/job_executor.js +7 -4
  26. package/dist/ipc/job_executor.js.map +1 -1
  27. package/dist/ipc/job_main.cjs +147 -0
  28. package/dist/ipc/job_main.cjs.map +1 -0
  29. package/dist/ipc/job_main.d.ts +1 -1
  30. package/dist/ipc/job_main.js +103 -103
  31. package/dist/ipc/job_main.js.map +1 -1
  32. package/dist/ipc/message.cjs +17 -0
  33. package/dist/ipc/message.cjs.map +1 -0
  34. package/dist/ipc/message.js +0 -1
  35. package/dist/ipc/message.js.map +1 -1
  36. package/dist/ipc/proc_job_executor.cjs +174 -0
  37. package/dist/ipc/proc_job_executor.cjs.map +1 -0
  38. package/dist/ipc/proc_job_executor.js +130 -126
  39. package/dist/ipc/proc_job_executor.js.map +1 -1
  40. package/dist/ipc/proc_pool.cjs +126 -0
  41. package/dist/ipc/proc_pool.cjs.map +1 -0
  42. package/dist/ipc/proc_pool.js +93 -96
  43. package/dist/ipc/proc_pool.js.map +1 -1
  44. package/dist/job.cjs +230 -0
  45. package/dist/job.cjs.map +1 -0
  46. package/dist/job.js +195 -198
  47. package/dist/job.js.map +1 -1
  48. package/dist/llm/chat_context.cjs +131 -0
  49. package/dist/llm/chat_context.cjs.map +1 -0
  50. package/dist/llm/chat_context.js +98 -86
  51. package/dist/llm/chat_context.js.map +1 -1
  52. package/dist/llm/function_context.cjs +103 -0
  53. package/dist/llm/function_context.cjs.map +1 -0
  54. package/dist/llm/function_context.js +72 -81
  55. package/dist/llm/function_context.js.map +1 -1
  56. package/dist/llm/function_context.test.cjs +218 -0
  57. package/dist/llm/function_context.test.cjs.map +1 -0
  58. package/dist/llm/function_context.test.js +209 -210
  59. package/dist/llm/function_context.test.js.map +1 -1
  60. package/dist/llm/index.cjs +43 -0
  61. package/dist/llm/index.cjs.map +1 -0
  62. package/dist/llm/index.js +22 -6
  63. package/dist/llm/index.js.map +1 -1
  64. package/dist/llm/llm.cjs +76 -0
  65. package/dist/llm/llm.cjs.map +1 -0
  66. package/dist/llm/llm.js +48 -42
  67. package/dist/llm/llm.js.map +1 -1
  68. package/dist/log.cjs +57 -0
  69. package/dist/log.cjs.map +1 -0
  70. package/dist/log.js +27 -26
  71. package/dist/log.js.map +1 -1
  72. package/dist/multimodal/agent_playout.cjs +228 -0
  73. package/dist/multimodal/agent_playout.cjs.map +1 -0
  74. package/dist/multimodal/agent_playout.d.ts +1 -1
  75. package/dist/multimodal/agent_playout.js +193 -180
  76. package/dist/multimodal/agent_playout.js.map +1 -1
  77. package/dist/multimodal/index.cjs +25 -0
  78. package/dist/multimodal/index.cjs.map +1 -0
  79. package/dist/multimodal/index.js +2 -5
  80. package/dist/multimodal/index.js.map +1 -1
  81. package/dist/multimodal/multimodal_agent.cjs +404 -0
  82. package/dist/multimodal/multimodal_agent.cjs.map +1 -0
  83. package/dist/multimodal/multimodal_agent.d.ts +1 -1
  84. package/dist/multimodal/multimodal_agent.js +351 -330
  85. package/dist/multimodal/multimodal_agent.js.map +1 -1
  86. package/dist/pipeline/agent_output.cjs +172 -0
  87. package/dist/pipeline/agent_output.cjs.map +1 -0
  88. package/dist/pipeline/agent_output.js +136 -138
  89. package/dist/pipeline/agent_output.js.map +1 -1
  90. package/dist/pipeline/agent_playout.cjs +169 -0
  91. package/dist/pipeline/agent_playout.cjs.map +1 -0
  92. package/dist/pipeline/agent_playout.js +126 -136
  93. package/dist/pipeline/agent_playout.js.map +1 -1
  94. package/dist/pipeline/human_input.cjs +158 -0
  95. package/dist/pipeline/human_input.cjs.map +1 -0
  96. package/dist/pipeline/human_input.js +124 -125
  97. package/dist/pipeline/human_input.js.map +1 -1
  98. package/dist/pipeline/index.cjs +31 -0
  99. package/dist/pipeline/index.cjs.map +1 -0
  100. package/dist/pipeline/index.js +8 -4
  101. package/dist/pipeline/index.js.map +1 -1
  102. package/dist/pipeline/pipeline_agent.cjs +642 -0
  103. package/dist/pipeline/pipeline_agent.cjs.map +1 -0
  104. package/dist/pipeline/pipeline_agent.js +595 -651
  105. package/dist/pipeline/pipeline_agent.js.map +1 -1
  106. package/dist/pipeline/speech_handle.cjs +128 -0
  107. package/dist/pipeline/speech_handle.cjs.map +1 -0
  108. package/dist/pipeline/speech_handle.js +102 -100
  109. package/dist/pipeline/speech_handle.js.map +1 -1
  110. package/dist/plugin.cjs +46 -0
  111. package/dist/plugin.cjs.map +1 -0
  112. package/dist/plugin.js +20 -20
  113. package/dist/plugin.js.map +1 -1
  114. package/dist/stt/index.cjs +38 -0
  115. package/dist/stt/index.cjs.map +1 -0
  116. package/dist/stt/index.js +13 -5
  117. package/dist/stt/index.js.map +1 -1
  118. package/dist/stt/stream_adapter.cjs +87 -0
  119. package/dist/stt/stream_adapter.cjs.map +1 -0
  120. package/dist/stt/stream_adapter.js +58 -55
  121. package/dist/stt/stream_adapter.js.map +1 -1
  122. package/dist/stt/stt.cjs +98 -0
  123. package/dist/stt/stt.cjs.map +1 -0
  124. package/dist/stt/stt.js +63 -98
  125. package/dist/stt/stt.js.map +1 -1
  126. package/dist/tokenize/basic/basic.cjs +98 -0
  127. package/dist/tokenize/basic/basic.cjs.map +1 -0
  128. package/dist/tokenize/basic/basic.js +56 -45
  129. package/dist/tokenize/basic/basic.js.map +1 -1
  130. package/dist/tokenize/basic/hyphenator.cjs +425 -0
  131. package/dist/tokenize/basic/hyphenator.cjs.map +1 -0
  132. package/dist/tokenize/basic/hyphenator.js +66 -82
  133. package/dist/tokenize/basic/hyphenator.js.map +1 -1
  134. package/dist/tokenize/basic/index.cjs +35 -0
  135. package/dist/tokenize/basic/index.cjs.map +1 -0
  136. package/dist/tokenize/basic/index.js +7 -4
  137. package/dist/tokenize/basic/index.js.map +1 -1
  138. package/dist/tokenize/basic/paragraph.cjs +57 -0
  139. package/dist/tokenize/basic/paragraph.cjs.map +1 -0
  140. package/dist/tokenize/basic/paragraph.js +30 -35
  141. package/dist/tokenize/basic/paragraph.js.map +1 -1
  142. package/dist/tokenize/basic/sentence.cjs +83 -0
  143. package/dist/tokenize/basic/sentence.cjs.map +1 -0
  144. package/dist/tokenize/basic/sentence.js +56 -57
  145. package/dist/tokenize/basic/sentence.js.map +1 -1
  146. package/dist/tokenize/basic/word.cjs +44 -0
  147. package/dist/tokenize/basic/word.cjs.map +1 -0
  148. package/dist/tokenize/basic/word.js +17 -20
  149. package/dist/tokenize/basic/word.js.map +1 -1
  150. package/dist/tokenize/index.cjs +55 -0
  151. package/dist/tokenize/index.cjs.map +1 -0
  152. package/dist/tokenize/index.js +18 -7
  153. package/dist/tokenize/index.js.map +1 -1
  154. package/dist/tokenize/token_stream.cjs +164 -0
  155. package/dist/tokenize/token_stream.cjs.map +1 -0
  156. package/dist/tokenize/token_stream.js +133 -139
  157. package/dist/tokenize/token_stream.js.map +1 -1
  158. package/dist/tokenize/tokenizer.cjs +184 -0
  159. package/dist/tokenize/tokenizer.cjs.map +1 -0
  160. package/dist/tokenize/tokenizer.js +138 -99
  161. package/dist/tokenize/tokenizer.js.map +1 -1
  162. package/dist/transcription.cjs +131 -0
  163. package/dist/transcription.cjs.map +1 -0
  164. package/dist/transcription.js +99 -96
  165. package/dist/transcription.js.map +1 -1
  166. package/dist/tts/index.cjs +38 -0
  167. package/dist/tts/index.cjs.map +1 -0
  168. package/dist/tts/index.js +13 -5
  169. package/dist/tts/index.js.map +1 -1
  170. package/dist/tts/stream_adapter.cjs +78 -0
  171. package/dist/tts/stream_adapter.cjs.map +1 -0
  172. package/dist/tts/stream_adapter.js +50 -47
  173. package/dist/tts/stream_adapter.js.map +1 -1
  174. package/dist/tts/tts.cjs +127 -0
  175. package/dist/tts/tts.cjs.map +1 -0
  176. package/dist/tts/tts.js +90 -120
  177. package/dist/tts/tts.js.map +1 -1
  178. package/dist/utils.cjs +284 -0
  179. package/dist/utils.cjs.map +1 -0
  180. package/dist/utils.js +242 -247
  181. package/dist/utils.js.map +1 -1
  182. package/dist/vad.cjs +92 -0
  183. package/dist/vad.cjs.map +1 -0
  184. package/dist/vad.js +57 -52
  185. package/dist/vad.js.map +1 -1
  186. package/dist/version.cjs +29 -0
  187. package/dist/version.cjs.map +1 -0
  188. package/dist/version.js +4 -4
  189. package/dist/version.js.map +1 -1
  190. package/dist/worker.cjs +576 -0
  191. package/dist/worker.cjs.map +1 -0
  192. package/dist/worker.d.ts +1 -1
  193. package/dist/worker.js +511 -484
  194. package/dist/worker.js.map +1 -1
  195. package/package.json +18 -8
  196. package/src/ipc/job_main.ts +66 -64
  197. package/src/pipeline/pipeline_agent.ts +23 -23
@@ -0,0 +1,147 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var job_main_exports = {};
20
+ __export(job_main_exports, {
21
+ runProcess: () => runProcess
22
+ });
23
+ module.exports = __toCommonJS(job_main_exports);
24
+ var getImportMetaUrl = () => typeof document === "undefined" ? new URL(`file:${__filename}`).href : document.currentScript && document.currentScript.src || new URL("main.js", document.baseURI).href;
25
+ var importMetaUrl = /* @__PURE__ */ getImportMetaUrl();
26
+ var import_rtc_node = require("@livekit/rtc-node");
27
+ var import_node_child_process = require("node:child_process");
28
+ var import_node_events = require("node:events");
29
+ var import_node_url = require("node:url");
30
+ var import_generator = require("../generator.cjs");
31
+ var import_job = require("../job.cjs");
32
+ var import_job2 = require("../job.cjs");
33
+ var import_log = require("../log.cjs");
34
+ var import_worker = require("../worker.cjs");
35
+ const ORPHANED_TIMEOUT = 15 * 1e3;
36
+ const runProcess = (args) => {
37
+ return (0, import_node_child_process.fork)(new URL(importMetaUrl), [args.agentFile]);
38
+ };
39
+ const startJob = (proc, func, info, closeEvent, logger) => {
40
+ let connect = false;
41
+ let shutdown = false;
42
+ const room = new import_rtc_node.Room();
43
+ room.on(import_rtc_node.RoomEvent.Disconnected, () => {
44
+ closeEvent.emit("close", false);
45
+ });
46
+ const onConnect = () => {
47
+ connect = true;
48
+ };
49
+ const onShutdown = (reason) => {
50
+ shutdown = true;
51
+ closeEvent.emit("close", true, reason);
52
+ };
53
+ const ctx = new import_job.JobContext(proc, info, room, onConnect, onShutdown);
54
+ const task = new Promise(async () => {
55
+ const unconnectedTimeout = setTimeout(() => {
56
+ if (!(connect || shutdown)) {
57
+ logger.warn(
58
+ "room not connect after job_entry was called after 10 seconds, ",
59
+ "did you forget to call ctx.connect()?"
60
+ );
61
+ }
62
+ }, 1e4);
63
+ func(ctx).finally(() => clearTimeout(unconnectedTimeout));
64
+ await (0, import_node_events.once)(closeEvent, "close").then((close) => {
65
+ logger.debug("shutting down");
66
+ process.send({ case: "exiting", value: { reason: close[1] } });
67
+ });
68
+ await room.disconnect();
69
+ logger.debug("disconnected from room");
70
+ const shutdownTasks = [];
71
+ for (const callback of ctx.shutdownCallbacks) {
72
+ shutdownTasks.push(callback());
73
+ }
74
+ await Promise.all(shutdownTasks).catch(() => logger.error("error while shutting down the job"));
75
+ process.send({ case: "done" });
76
+ process.exit();
77
+ });
78
+ return { ctx, task };
79
+ };
80
+ (async () => {
81
+ if (process.send) {
82
+ const moduleFile = process.argv[2];
83
+ const agent = await import((0, import_node_url.pathToFileURL)(moduleFile).pathname).then((module2) => {
84
+ const agent2 = module2.default;
85
+ if (agent2 === void 0 || !(0, import_generator.isAgent)(agent2)) {
86
+ throw new Error(`Unable to load agent: Missing or invalid default export in ${moduleFile}`);
87
+ }
88
+ return agent2;
89
+ });
90
+ if (!agent.prewarm) {
91
+ agent.prewarm = import_worker.defaultInitializeProcessFunc;
92
+ }
93
+ process.on("SIGINT", () => {
94
+ });
95
+ await (0, import_node_events.once)(process, "message").then(([msg]) => {
96
+ msg = msg;
97
+ if (msg.case !== "initializeRequest") {
98
+ throw new Error("first message must be InitializeRequest");
99
+ }
100
+ (0, import_log.initializeLogger)(msg.value.loggerOptions);
101
+ });
102
+ const proc = new import_job2.JobProcess();
103
+ let logger = (0, import_log.log)().child({ pid: proc.pid });
104
+ logger.debug("initializing job runner");
105
+ agent.prewarm(proc);
106
+ logger.debug("job runner initialized");
107
+ process.send({ case: "initializeResponse" });
108
+ let job = void 0;
109
+ const closeEvent = new import_node_events.EventEmitter();
110
+ const orphanedTimeout = setTimeout(() => {
111
+ logger.warn("process orphaned, shutting down");
112
+ process.exit();
113
+ }, ORPHANED_TIMEOUT);
114
+ process.on("message", (msg) => {
115
+ switch (msg.case) {
116
+ case "pingRequest": {
117
+ orphanedTimeout.refresh();
118
+ process.send({
119
+ case: "pongResponse",
120
+ value: { lastTimestamp: msg.value.timestamp, timestamp: Date.now() }
121
+ });
122
+ break;
123
+ }
124
+ case "startJobRequest": {
125
+ if (job) {
126
+ throw new Error("job task already running");
127
+ }
128
+ logger = logger.child({ jobID: msg.value.runningJob.job.id });
129
+ job = startJob(proc, agent.entry, msg.value.runningJob, closeEvent, logger);
130
+ logger.debug("job started");
131
+ break;
132
+ }
133
+ case "shutdownRequest": {
134
+ if (!job) {
135
+ break;
136
+ }
137
+ closeEvent.emit("close", "");
138
+ }
139
+ }
140
+ });
141
+ }
142
+ })();
143
+ // Annotate the CommonJS export names for ESM import in node:
144
+ 0 && (module.exports = {
145
+ runProcess
146
+ });
147
+ //# sourceMappingURL=job_main.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/ipc/job_main.ts","../../../node_modules/.pnpm/tsup@8.3.5_@microsoft+api-extractor@7.43.7_@types+node@22.5.5__postcss@8.4.38_tsx@4.19.2_typescript@5.4.5/node_modules/tsup/assets/cjs_shims.js"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { Room, RoomEvent } from '@livekit/rtc-node';\nimport type { ChildProcess } from 'node:child_process';\nimport { fork } from 'node:child_process';\nimport { EventEmitter, once } from 'node:events';\nimport { pathToFileURL } from 'node:url';\nimport type { Logger } from 'pino';\nimport { type Agent, isAgent } from '../generator.js';\nimport type { RunningJobInfo } from '../job.js';\nimport { JobContext } from '../job.js';\nimport { JobProcess } from '../job.js';\nimport { initializeLogger, log } from '../log.js';\nimport { defaultInitializeProcessFunc } from '../worker.js';\nimport type { IPCMessage } from './message.js';\n\nconst ORPHANED_TIMEOUT = 15 * 1000;\n\ntype StartArgs = {\n agentFile: string;\n // userArguments: unknown;\n};\n\ntype JobTask = {\n ctx: JobContext;\n task: Promise<void>;\n};\n\nexport const runProcess = (args: StartArgs): ChildProcess => {\n return fork(new URL(import.meta.url), [args.agentFile]);\n};\n\nconst startJob = (\n proc: JobProcess,\n func: (ctx: JobContext) => Promise<void>,\n info: RunningJobInfo,\n closeEvent: EventEmitter,\n logger: Logger,\n): JobTask => {\n let connect = false;\n let shutdown = false;\n\n const room = new Room();\n room.on(RoomEvent.Disconnected, () => {\n closeEvent.emit('close', false);\n });\n\n const onConnect = () => {\n connect = true;\n };\n const onShutdown = (reason: string) => {\n shutdown = true;\n closeEvent.emit('close', true, reason);\n };\n\n const ctx = new JobContext(proc, info, room, onConnect, onShutdown);\n\n const task = new Promise<void>(async () => {\n const unconnectedTimeout = setTimeout(() => {\n if (!(connect || shutdown)) {\n logger.warn(\n 'room not connect after job_entry was called after 10 seconds, ',\n 'did you forget to call ctx.connect()?',\n );\n }\n }, 10000);\n func(ctx).finally(() => clearTimeout(unconnectedTimeout));\n\n await once(closeEvent, 'close').then((close) => {\n logger.debug('shutting down');\n process.send!({ case: 'exiting', value: { reason: close[1] } });\n });\n\n await room.disconnect();\n logger.debug('disconnected from room');\n\n const shutdownTasks = [];\n for (const callback of ctx.shutdownCallbacks) {\n shutdownTasks.push(callback());\n }\n await Promise.all(shutdownTasks).catch(() => logger.error('error while shutting down the job'));\n\n process.send!({ case: 'done' });\n process.exit();\n });\n\n return { ctx, task };\n};\n\n(async () => {\n if (process.send) {\n // process.argv:\n // [0] `node'\n // [1] import.meta.filename\n // [2] import.meta.filename of function containing entry file\n const moduleFile = process.argv[2];\n const agent: Agent = await import(pathToFileURL(moduleFile!).pathname).then((module) => {\n const agent = module.default;\n if (agent === undefined || !isAgent(agent)) {\n throw new Error(`Unable to load agent: Missing or invalid default export in ${moduleFile}`);\n }\n return agent;\n });\n if (!agent.prewarm) {\n agent.prewarm = defaultInitializeProcessFunc;\n }\n\n // don't do anything on C-c\n // this is handled in cli, triggering a termination of all child processes at once.\n process.on('SIGINT', () => {});\n\n await once(process, 'message').then(([msg]: IPCMessage[]) => {\n msg = msg!;\n if (msg.case !== 'initializeRequest') {\n throw new Error('first message must be InitializeRequest');\n }\n initializeLogger(msg.value.loggerOptions);\n });\n const proc = new JobProcess();\n let logger = log().child({ pid: proc.pid });\n\n logger.debug('initializing job runner');\n agent.prewarm(proc);\n logger.debug('job runner initialized');\n process.send({ case: 'initializeResponse' });\n\n let job: JobTask | undefined = undefined;\n const closeEvent = new EventEmitter();\n\n const orphanedTimeout = setTimeout(() => {\n logger.warn('process orphaned, shutting down');\n process.exit();\n }, ORPHANED_TIMEOUT);\n\n process.on('message', (msg: IPCMessage) => {\n switch (msg.case) {\n case 'pingRequest': {\n orphanedTimeout.refresh();\n process.send!({\n case: 'pongResponse',\n value: { lastTimestamp: msg.value.timestamp, timestamp: Date.now() },\n });\n break;\n }\n case 'startJobRequest': {\n if (job) {\n throw new Error('job task already running');\n }\n\n logger = logger.child({ jobID: msg.value.runningJob.job.id });\n\n job = startJob(proc, agent.entry, msg.value.runningJob, closeEvent, logger);\n logger.debug('job started');\n break;\n }\n case 'shutdownRequest': {\n if (!job) {\n break;\n }\n closeEvent.emit('close', '');\n }\n }\n });\n }\n})();\n","// Shim globals in cjs bundle\n// There's a weird bug that esbuild will always inject importMetaUrl\n// if we export it as `const importMetaUrl = ... __filename ...`\n// But using a function will not cause this issue\n\nconst getImportMetaUrl = () =>\n typeof document === 'undefined'\n ? new URL(`file:${__filename}`).href\n : (document.currentScript && document.currentScript.src) ||\n new URL('main.js', document.baseURI).href\n\nexport const importMetaUrl = /* @__PURE__ */ getImportMetaUrl()\n"],"mappings":"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","names":["import_job","module","agent"]}
@@ -1,4 +1,4 @@
1
- /// <reference types="node" />
1
+ /// <reference types="node" resolution-mode="require"/>
2
2
  import type { ChildProcess } from 'node:child_process';
3
3
  type StartArgs = {
4
4
  agentFile: string;
@@ -1,121 +1,121 @@
1
- // SPDX-FileCopyrightText: 2024 LiveKit, Inc.
2
- //
3
- // SPDX-License-Identifier: Apache-2.0
4
- import { Room, RoomEvent } from '@livekit/rtc-node';
5
- import { fork } from 'node:child_process';
6
- import { EventEmitter, once } from 'node:events';
7
- import { pathToFileURL } from 'node:url';
8
- import { isAgent } from '../generator.js';
9
- import { JobContext } from '../job.js';
10
- import { JobProcess } from '../job.js';
11
- import { initializeLogger, log } from '../log.js';
12
- import { defaultInitializeProcessFunc } from '../worker.js';
13
- const ORPHANED_TIMEOUT = 15 * 1000;
14
- export const runProcess = (args) => {
15
- return fork(new URL(import.meta.url), [args.agentFile]);
1
+ import { Room, RoomEvent } from "@livekit/rtc-node";
2
+ import { fork } from "node:child_process";
3
+ import { EventEmitter, once } from "node:events";
4
+ import { pathToFileURL } from "node:url";
5
+ import { isAgent } from "../generator.js";
6
+ import { JobContext } from "../job.js";
7
+ import { JobProcess } from "../job.js";
8
+ import { initializeLogger, log } from "../log.js";
9
+ import { defaultInitializeProcessFunc } from "../worker.js";
10
+ const ORPHANED_TIMEOUT = 15 * 1e3;
11
+ const runProcess = (args) => {
12
+ return fork(new URL(import.meta.url), [args.agentFile]);
16
13
  };
17
14
  const startJob = (proc, func, info, closeEvent, logger) => {
18
- let connect = false;
19
- let shutdown = false;
20
- const room = new Room();
21
- room.on(RoomEvent.Disconnected, () => {
22
- closeEvent.emit('close', false);
15
+ let connect = false;
16
+ let shutdown = false;
17
+ const room = new Room();
18
+ room.on(RoomEvent.Disconnected, () => {
19
+ closeEvent.emit("close", false);
20
+ });
21
+ const onConnect = () => {
22
+ connect = true;
23
+ };
24
+ const onShutdown = (reason) => {
25
+ shutdown = true;
26
+ closeEvent.emit("close", true, reason);
27
+ };
28
+ const ctx = new JobContext(proc, info, room, onConnect, onShutdown);
29
+ const task = new Promise(async () => {
30
+ const unconnectedTimeout = setTimeout(() => {
31
+ if (!(connect || shutdown)) {
32
+ logger.warn(
33
+ "room not connect after job_entry was called after 10 seconds, ",
34
+ "did you forget to call ctx.connect()?"
35
+ );
36
+ }
37
+ }, 1e4);
38
+ func(ctx).finally(() => clearTimeout(unconnectedTimeout));
39
+ await once(closeEvent, "close").then((close) => {
40
+ logger.debug("shutting down");
41
+ process.send({ case: "exiting", value: { reason: close[1] } });
23
42
  });
24
- const onConnect = () => {
25
- connect = true;
26
- };
27
- const onShutdown = (reason) => {
28
- shutdown = true;
29
- closeEvent.emit('close', true, reason);
30
- };
31
- const ctx = new JobContext(proc, info, room, onConnect, onShutdown);
32
- const task = new Promise(async () => {
33
- const unconnectedTimeout = setTimeout(() => {
34
- if (!(connect || shutdown)) {
35
- logger.warn('room not connect after job_entry was called after 10 seconds, ', 'did you forget to call ctx.connect()?');
36
- }
37
- }, 10000);
38
- func(ctx).finally(() => clearTimeout(unconnectedTimeout));
39
- await once(closeEvent, 'close').then((close) => {
40
- logger.debug('shutting down');
41
- process.send({ case: 'exiting', value: { reason: close[1] } });
42
- });
43
- await room.disconnect();
44
- logger.debug('disconnected from room');
45
- const shutdownTasks = [];
46
- for (const callback of ctx.shutdownCallbacks) {
47
- shutdownTasks.push(callback());
48
- }
49
- await Promise.all(shutdownTasks).catch(() => logger.error('error while shutting down the job'));
50
- process.send({ case: 'done' });
51
- process.exit();
52
- });
53
- return { ctx, task };
43
+ await room.disconnect();
44
+ logger.debug("disconnected from room");
45
+ const shutdownTasks = [];
46
+ for (const callback of ctx.shutdownCallbacks) {
47
+ shutdownTasks.push(callback());
48
+ }
49
+ await Promise.all(shutdownTasks).catch(() => logger.error("error while shutting down the job"));
50
+ process.send({ case: "done" });
51
+ process.exit();
52
+ });
53
+ return { ctx, task };
54
54
  };
55
- if (process.send) {
56
- // process.argv:
57
- // [0] `node'
58
- // [1] import.meta.filename
59
- // [2] import.meta.filename of function containing entry file
55
+ (async () => {
56
+ if (process.send) {
60
57
  const moduleFile = process.argv[2];
61
- const agent = await import(pathToFileURL(moduleFile).href).then((module) => {
62
- const agent = module.default;
63
- if (agent === undefined || !isAgent(agent)) {
64
- throw new Error(`Unable to load agent: Missing or invalid default export in ${moduleFile}`);
65
- }
66
- return agent;
58
+ const agent = await import(pathToFileURL(moduleFile).pathname).then((module) => {
59
+ const agent2 = module.default;
60
+ if (agent2 === void 0 || !isAgent(agent2)) {
61
+ throw new Error(`Unable to load agent: Missing or invalid default export in ${moduleFile}`);
62
+ }
63
+ return agent2;
67
64
  });
68
65
  if (!agent.prewarm) {
69
- agent.prewarm = defaultInitializeProcessFunc;
66
+ agent.prewarm = defaultInitializeProcessFunc;
70
67
  }
71
- // don't do anything on C-c
72
- // this is handled in cli, triggering a termination of all child processes at once.
73
- process.on('SIGINT', () => { });
74
- await once(process, 'message').then(([msg]) => {
75
- msg = msg;
76
- if (msg.case !== 'initializeRequest') {
77
- throw new Error('first message must be InitializeRequest');
78
- }
79
- initializeLogger(msg.value.loggerOptions);
68
+ process.on("SIGINT", () => {
69
+ });
70
+ await once(process, "message").then(([msg]) => {
71
+ msg = msg;
72
+ if (msg.case !== "initializeRequest") {
73
+ throw new Error("first message must be InitializeRequest");
74
+ }
75
+ initializeLogger(msg.value.loggerOptions);
80
76
  });
81
77
  const proc = new JobProcess();
82
78
  let logger = log().child({ pid: proc.pid });
83
- logger.debug('initializing job runner');
79
+ logger.debug("initializing job runner");
84
80
  agent.prewarm(proc);
85
- logger.debug('job runner initialized');
86
- process.send({ case: 'initializeResponse' });
87
- let job = undefined;
81
+ logger.debug("job runner initialized");
82
+ process.send({ case: "initializeResponse" });
83
+ let job = void 0;
88
84
  const closeEvent = new EventEmitter();
89
85
  const orphanedTimeout = setTimeout(() => {
90
- logger.warn('process orphaned, shutting down');
91
- process.exit();
86
+ logger.warn("process orphaned, shutting down");
87
+ process.exit();
92
88
  }, ORPHANED_TIMEOUT);
93
- process.on('message', (msg) => {
94
- switch (msg.case) {
95
- case 'pingRequest': {
96
- orphanedTimeout.refresh();
97
- process.send({
98
- case: 'pongResponse',
99
- value: { lastTimestamp: msg.value.timestamp, timestamp: Date.now() },
100
- });
101
- break;
102
- }
103
- case 'startJobRequest': {
104
- if (job) {
105
- throw new Error('job task already running');
106
- }
107
- logger = logger.child({ jobID: msg.value.runningJob.job.id });
108
- job = startJob(proc, agent.entry, msg.value.runningJob, closeEvent, logger);
109
- logger.debug('job started');
110
- break;
111
- }
112
- case 'shutdownRequest': {
113
- if (!job) {
114
- break;
115
- }
116
- closeEvent.emit('close', '');
117
- }
89
+ process.on("message", (msg) => {
90
+ switch (msg.case) {
91
+ case "pingRequest": {
92
+ orphanedTimeout.refresh();
93
+ process.send({
94
+ case: "pongResponse",
95
+ value: { lastTimestamp: msg.value.timestamp, timestamp: Date.now() }
96
+ });
97
+ break;
98
+ }
99
+ case "startJobRequest": {
100
+ if (job) {
101
+ throw new Error("job task already running");
102
+ }
103
+ logger = logger.child({ jobID: msg.value.runningJob.job.id });
104
+ job = startJob(proc, agent.entry, msg.value.runningJob, closeEvent, logger);
105
+ logger.debug("job started");
106
+ break;
118
107
  }
108
+ case "shutdownRequest": {
109
+ if (!job) {
110
+ break;
111
+ }
112
+ closeEvent.emit("close", "");
113
+ }
114
+ }
119
115
  });
120
- }
116
+ }
117
+ })();
118
+ export {
119
+ runProcess
120
+ };
121
121
  //# sourceMappingURL=job_main.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"job_main.js","sourceRoot":"","sources":["../../src/ipc/job_main.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/ipc/job_main.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { Room, RoomEvent } from '@livekit/rtc-node';\nimport type { ChildProcess } from 'node:child_process';\nimport { fork } from 'node:child_process';\nimport { EventEmitter, once } from 'node:events';\nimport { pathToFileURL } from 'node:url';\nimport type { Logger } from 'pino';\nimport { type Agent, isAgent } from '../generator.js';\nimport type { RunningJobInfo } from '../job.js';\nimport { JobContext } from '../job.js';\nimport { JobProcess } from '../job.js';\nimport { initializeLogger, log } from '../log.js';\nimport { defaultInitializeProcessFunc } from '../worker.js';\nimport type { IPCMessage } from './message.js';\n\nconst ORPHANED_TIMEOUT = 15 * 1000;\n\ntype StartArgs = {\n agentFile: string;\n // userArguments: unknown;\n};\n\ntype JobTask = {\n ctx: JobContext;\n task: Promise<void>;\n};\n\nexport const runProcess = (args: StartArgs): ChildProcess => {\n return fork(new URL(import.meta.url), [args.agentFile]);\n};\n\nconst startJob = (\n proc: JobProcess,\n func: (ctx: JobContext) => Promise<void>,\n info: RunningJobInfo,\n closeEvent: EventEmitter,\n logger: Logger,\n): JobTask => {\n let connect = false;\n let shutdown = false;\n\n const room = new Room();\n room.on(RoomEvent.Disconnected, () => {\n closeEvent.emit('close', false);\n });\n\n const onConnect = () => {\n connect = true;\n };\n const onShutdown = (reason: string) => {\n shutdown = true;\n closeEvent.emit('close', true, reason);\n };\n\n const ctx = new JobContext(proc, info, room, onConnect, onShutdown);\n\n const task = new Promise<void>(async () => {\n const unconnectedTimeout = setTimeout(() => {\n if (!(connect || shutdown)) {\n logger.warn(\n 'room not connect after job_entry was called after 10 seconds, ',\n 'did you forget to call ctx.connect()?',\n );\n }\n }, 10000);\n func(ctx).finally(() => clearTimeout(unconnectedTimeout));\n\n await once(closeEvent, 'close').then((close) => {\n logger.debug('shutting down');\n process.send!({ case: 'exiting', value: { reason: close[1] } });\n });\n\n await room.disconnect();\n logger.debug('disconnected from room');\n\n const shutdownTasks = [];\n for (const callback of ctx.shutdownCallbacks) {\n shutdownTasks.push(callback());\n }\n await Promise.all(shutdownTasks).catch(() => logger.error('error while shutting down the job'));\n\n process.send!({ case: 'done' });\n process.exit();\n });\n\n return { ctx, task };\n};\n\n(async () => {\n if (process.send) {\n // process.argv:\n // [0] `node'\n // [1] import.meta.filename\n // [2] import.meta.filename of function containing entry file\n const moduleFile = process.argv[2];\n const agent: Agent = await import(pathToFileURL(moduleFile!).pathname).then((module) => {\n const agent = module.default;\n if (agent === undefined || !isAgent(agent)) {\n throw new Error(`Unable to load agent: Missing or invalid default export in ${moduleFile}`);\n }\n return agent;\n });\n if (!agent.prewarm) {\n agent.prewarm = defaultInitializeProcessFunc;\n }\n\n // don't do anything on C-c\n // this is handled in cli, triggering a termination of all child processes at once.\n process.on('SIGINT', () => {});\n\n await once(process, 'message').then(([msg]: IPCMessage[]) => {\n msg = msg!;\n if (msg.case !== 'initializeRequest') {\n throw new Error('first message must be InitializeRequest');\n }\n initializeLogger(msg.value.loggerOptions);\n });\n const proc = new JobProcess();\n let logger = log().child({ pid: proc.pid });\n\n logger.debug('initializing job runner');\n agent.prewarm(proc);\n logger.debug('job runner initialized');\n process.send({ case: 'initializeResponse' });\n\n let job: JobTask | undefined = undefined;\n const closeEvent = new EventEmitter();\n\n const orphanedTimeout = setTimeout(() => {\n logger.warn('process orphaned, shutting down');\n process.exit();\n }, ORPHANED_TIMEOUT);\n\n process.on('message', (msg: IPCMessage) => {\n switch (msg.case) {\n case 'pingRequest': {\n orphanedTimeout.refresh();\n process.send!({\n case: 'pongResponse',\n value: { lastTimestamp: msg.value.timestamp, timestamp: Date.now() },\n });\n break;\n }\n case 'startJobRequest': {\n if (job) {\n throw new Error('job task already running');\n }\n\n logger = logger.child({ jobID: msg.value.runningJob.job.id });\n\n job = startJob(proc, agent.entry, msg.value.runningJob, closeEvent, logger);\n logger.debug('job started');\n break;\n }\n case 'shutdownRequest': {\n if (!job) {\n break;\n }\n closeEvent.emit('close', '');\n }\n }\n });\n }\n})();\n"],"mappings":"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","names":["agent"]}
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __copyProps = (to, from, except, desc) => {
7
+ if (from && typeof from === "object" || typeof from === "function") {
8
+ for (let key of __getOwnPropNames(from))
9
+ if (!__hasOwnProp.call(to, key) && key !== except)
10
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
11
+ }
12
+ return to;
13
+ };
14
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
15
+ var message_exports = {};
16
+ module.exports = __toCommonJS(message_exports);
17
+ //# sourceMappingURL=message.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/ipc/message.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport type { RunningJobInfo } from '../job.js';\nimport type { LoggerOptions } from '../log.js';\n\nexport type IPCMessage =\n | {\n case: 'initializeRequest';\n value: { loggerOptions: LoggerOptions };\n }\n | {\n case: 'initializeResponse';\n value: undefined;\n }\n | {\n case: 'pingRequest';\n value: { timestamp: number };\n }\n | {\n case: 'pongResponse';\n value: { lastTimestamp: number; timestamp: number };\n }\n | {\n case: 'startJobRequest';\n value: { runningJob: RunningJobInfo };\n }\n | {\n case: 'shutdownRequest';\n value: { reason?: string };\n }\n | {\n case: 'exiting';\n value: { reason?: string };\n }\n | {\n case: 'done';\n value: undefined;\n };\n"],"mappings":";;;;;;;;;;;;;;AAAA;AAAA;","names":[]}
@@ -1,2 +1 @@
1
- export {};
2
1
  //# sourceMappingURL=message.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"message.js","sourceRoot":"","sources":["../../src/ipc/message.ts"],"names":[],"mappings":""}
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}