botmux 2.104.0 → 2.105.1

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 (339) hide show
  1. package/README.en.md +10 -10
  2. package/README.md +10 -10
  3. package/dist/adapters/backend/sandbox.d.ts +5 -1
  4. package/dist/adapters/backend/sandbox.d.ts.map +1 -1
  5. package/dist/adapters/backend/sandbox.js +54 -5
  6. package/dist/adapters/backend/sandbox.js.map +1 -1
  7. package/dist/adapters/backend/tmux-pipe-backend.d.ts +1 -1
  8. package/dist/adapters/backend/tmux-pipe-backend.js +1 -1
  9. package/dist/adapters/backend/zellij-observe-backend.d.ts +1 -1
  10. package/dist/adapters/backend/zellij-observe-backend.js +1 -1
  11. package/dist/adapters/cli/claude-code.d.ts +1 -1
  12. package/dist/adapters/cli/read-isolation.d.ts +2 -1
  13. package/dist/adapters/cli/read-isolation.d.ts.map +1 -1
  14. package/dist/adapters/cli/read-isolation.js +51 -4
  15. package/dist/adapters/cli/read-isolation.js.map +1 -1
  16. package/dist/adapters/cli/relay.d.ts +2 -2
  17. package/dist/adapters/cli/relay.js +2 -2
  18. package/dist/adapters/cli/seed.d.ts +2 -2
  19. package/dist/adapters/cli/seed.js +2 -2
  20. package/dist/adapters/cli/shared-hints.d.ts.map +1 -1
  21. package/dist/adapters/cli/shared-hints.js +1 -0
  22. package/dist/adapters/cli/shared-hints.js.map +1 -1
  23. package/dist/bot-registry.d.ts +65 -1
  24. package/dist/bot-registry.d.ts.map +1 -1
  25. package/dist/bot-registry.js +145 -0
  26. package/dist/bot-registry.js.map +1 -1
  27. package/dist/cli/send-dispatch.d.ts +44 -0
  28. package/dist/cli/send-dispatch.d.ts.map +1 -1
  29. package/dist/cli/send-dispatch.js +79 -0
  30. package/dist/cli/send-dispatch.js.map +1 -1
  31. package/dist/cli/vc-agent.d.ts +2 -0
  32. package/dist/cli/vc-agent.d.ts.map +1 -0
  33. package/dist/cli/vc-agent.js +331 -0
  34. package/dist/cli/vc-agent.js.map +1 -0
  35. package/dist/cli.d.ts.map +1 -1
  36. package/dist/cli.js +125 -24
  37. package/dist/cli.js.map +1 -1
  38. package/dist/config.d.ts +8 -0
  39. package/dist/config.d.ts.map +1 -1
  40. package/dist/config.js +13 -1
  41. package/dist/config.js.map +1 -1
  42. package/dist/core/auto-start.d.ts +2 -2
  43. package/dist/core/auto-start.js +2 -2
  44. package/dist/core/command-handler.d.ts.map +1 -1
  45. package/dist/core/command-handler.js +2 -1
  46. package/dist/core/command-handler.js.map +1 -1
  47. package/dist/core/dashboard-events.d.ts +5 -0
  48. package/dist/core/dashboard-events.d.ts.map +1 -1
  49. package/dist/core/dashboard-events.js.map +1 -1
  50. package/dist/core/dashboard-ipc-server.d.ts.map +1 -1
  51. package/dist/core/dashboard-ipc-server.js +47 -2
  52. package/dist/core/dashboard-ipc-server.js.map +1 -1
  53. package/dist/core/idle-worker-sweeper.d.ts +1 -1
  54. package/dist/core/idle-worker-sweeper.js +1 -1
  55. package/dist/core/passthrough-commands.d.ts.map +1 -1
  56. package/dist/core/passthrough-commands.js +1 -0
  57. package/dist/core/passthrough-commands.js.map +1 -1
  58. package/dist/core/scheduler.d.ts +12 -0
  59. package/dist/core/scheduler.d.ts.map +1 -1
  60. package/dist/core/scheduler.js +67 -7
  61. package/dist/core/scheduler.js.map +1 -1
  62. package/dist/core/session-discovery.js +1 -1
  63. package/dist/core/session-discovery.js.map +1 -1
  64. package/dist/core/session-manager.d.ts +1 -1
  65. package/dist/core/session-manager.d.ts.map +1 -1
  66. package/dist/core/session-manager.js +55 -10
  67. package/dist/core/session-manager.js.map +1 -1
  68. package/dist/core/trigger-session.d.ts.map +1 -1
  69. package/dist/core/trigger-session.js +78 -23
  70. package/dist/core/trigger-session.js.map +1 -1
  71. package/dist/core/types.d.ts +3 -3
  72. package/dist/core/types.d.ts.map +1 -1
  73. package/dist/core/worker-pool.d.ts +8 -1
  74. package/dist/core/worker-pool.d.ts.map +1 -1
  75. package/dist/core/worker-pool.js +31 -9
  76. package/dist/core/worker-pool.js.map +1 -1
  77. package/dist/core/zellij-adopt-discovery.js +1 -1
  78. package/dist/core/zellij-adopt-discovery.js.map +1 -1
  79. package/dist/daemon.d.ts +121 -0
  80. package/dist/daemon.d.ts.map +1 -1
  81. package/dist/daemon.js +2644 -2
  82. package/dist/daemon.js.map +1 -1
  83. package/dist/dashboard/federated-group-core.js +1 -1
  84. package/dist/dashboard/federated-group-core.js.map +1 -1
  85. package/dist/dashboard/federation-api.js +1 -1
  86. package/dist/dashboard/schedule-card-model.d.ts +4 -3
  87. package/dist/dashboard/schedule-card-model.d.ts.map +1 -1
  88. package/dist/dashboard/schedule-card-model.js +5 -4
  89. package/dist/dashboard/schedule-card-model.js.map +1 -1
  90. package/dist/dashboard/settings-write-applier.d.ts +37 -3
  91. package/dist/dashboard/settings-write-applier.d.ts.map +1 -1
  92. package/dist/dashboard/settings-write-applier.js +63 -0
  93. package/dist/dashboard/settings-write-applier.js.map +1 -1
  94. package/dist/dashboard/web/i18n.d.ts.map +1 -1
  95. package/dist/dashboard/web/i18n.js +28 -0
  96. package/dist/dashboard/web/i18n.js.map +1 -1
  97. package/dist/dashboard/web/insights.js +19 -19
  98. package/dist/dashboard/web/insights.js.map +1 -1
  99. package/dist/dashboard/web/overview-page.d.ts.map +1 -1
  100. package/dist/dashboard/web/overview-page.js +7 -4
  101. package/dist/dashboard/web/overview-page.js.map +1 -1
  102. package/dist/dashboard/web/schedules-page.d.ts +1 -1
  103. package/dist/dashboard/web/schedules-page.d.ts.map +1 -1
  104. package/dist/dashboard/web/schedules-page.js +7 -3
  105. package/dist/dashboard/web/schedules-page.js.map +1 -1
  106. package/dist/dashboard/web/sessions.js +2 -2
  107. package/dist/dashboard/web/settings-page.d.ts +9 -0
  108. package/dist/dashboard/web/settings-page.d.ts.map +1 -1
  109. package/dist/dashboard/web/settings-page.js +132 -43
  110. package/dist/dashboard/web/settings-page.js.map +1 -1
  111. package/dist/dashboard/web/store.d.ts +6 -0
  112. package/dist/dashboard/web/store.d.ts.map +1 -1
  113. package/dist/dashboard/web/store.js +18 -1
  114. package/dist/dashboard/web/store.js.map +1 -1
  115. package/dist/dashboard/webhook-routes.d.ts.map +1 -1
  116. package/dist/dashboard/webhook-routes.js +24 -0
  117. package/dist/dashboard/webhook-routes.js.map +1 -1
  118. package/dist/dashboard-web/app.js +3 -3
  119. package/dist/dashboard-web/chunks/{bot-defaults-page-Z36I5CKM.js → bot-defaults-page-3OIY7N76.js} +1 -1
  120. package/dist/dashboard-web/chunks/{chunk-2BBCKWNO.js → chunk-BNEXMNQD.js} +3 -3
  121. package/dist/dashboard-web/chunks/{chunk-QDKIUULH.js → chunk-DKKOGZCG.js} +1 -1
  122. package/dist/dashboard-web/chunks/chunk-LXIK7OUJ.js +1 -0
  123. package/dist/dashboard-web/chunks/{chunk-BAMNP73K.js → chunk-VFCACTRF.js} +1 -1
  124. package/dist/dashboard-web/chunks/{connectors-I3MGERCM.js → connectors-VDOAKUW3.js} +1 -1
  125. package/dist/dashboard-web/chunks/{groups-page-DTP2L4FQ.js → groups-page-CX5AN4XG.js} +1 -1
  126. package/dist/dashboard-web/chunks/{insights-page-FNI24WYF.js → insights-page-DOMRL4S6.js} +1 -1
  127. package/dist/dashboard-web/chunks/overview-page-AZBAXVZ7.js +1 -0
  128. package/dist/dashboard-web/chunks/{roles-page-A5DZ7Q6U.js → roles-page-3FEAH6S4.js} +1 -1
  129. package/dist/dashboard-web/chunks/schedules-CTQEA7IE.js +1 -0
  130. package/dist/dashboard-web/chunks/{sessions-YJ735IH4.js → sessions-LVZCXO2Z.js} +1 -1
  131. package/dist/dashboard-web/chunks/{sessions-page-2REIJ56C.js → sessions-page-NHBJDSBC.js} +1 -1
  132. package/dist/dashboard-web/chunks/settings-page-CRDIHRNE.js +2 -0
  133. package/dist/dashboard-web/chunks/{skills-page-ZCCLHWMJ.js → skills-page-VUG3EPWX.js} +1 -1
  134. package/dist/dashboard-web/chunks/{team-federation-page-4FCGO3WW.js → team-federation-page-ZKL3YMGN.js} +1 -1
  135. package/dist/dashboard-web/chunks/{workflows-KFJ7O57L.js → workflows-4BYQQBFP.js} +1 -1
  136. package/dist/dashboard-web/index.html +1 -1
  137. package/dist/dashboard-web/style.css +111 -16
  138. package/dist/dashboard.js +196 -2
  139. package/dist/dashboard.js.map +1 -1
  140. package/dist/global-config.d.ts +30 -0
  141. package/dist/global-config.d.ts.map +1 -1
  142. package/dist/global-config.js +64 -1
  143. package/dist/global-config.js.map +1 -1
  144. package/dist/i18n/en.d.ts.map +1 -1
  145. package/dist/i18n/en.js +10 -7
  146. package/dist/i18n/en.js.map +1 -1
  147. package/dist/i18n/zh.d.ts.map +1 -1
  148. package/dist/i18n/zh.js +10 -7
  149. package/dist/i18n/zh.js.map +1 -1
  150. package/dist/im/lark/card-builder.d.ts +1 -1
  151. package/dist/im/lark/card-builder.js +1 -1
  152. package/dist/im/lark/card-handler.d.ts +3 -0
  153. package/dist/im/lark/card-handler.d.ts.map +1 -1
  154. package/dist/im/lark/card-handler.js +8 -0
  155. package/dist/im/lark/card-handler.js.map +1 -1
  156. package/dist/im/lark/client.d.ts +1 -0
  157. package/dist/im/lark/client.d.ts.map +1 -1
  158. package/dist/im/lark/client.js +19 -0
  159. package/dist/im/lark/client.js.map +1 -1
  160. package/dist/im/lark/event-dispatcher.d.ts +10 -0
  161. package/dist/im/lark/event-dispatcher.d.ts.map +1 -1
  162. package/dist/im/lark/event-dispatcher.js +100 -21
  163. package/dist/im/lark/event-dispatcher.js.map +1 -1
  164. package/dist/im/lark/grant-command.d.ts +1 -1
  165. package/dist/im/lark/grant-command.js +1 -1
  166. package/dist/im/lark/workflow-slash-command.js +4 -0
  167. package/dist/im/lark/workflow-slash-command.js.map +1 -1
  168. package/dist/mir-prompt.d.ts +16 -0
  169. package/dist/mir-prompt.d.ts.map +1 -0
  170. package/dist/mir-prompt.js +170 -0
  171. package/dist/mir-prompt.js.map +1 -0
  172. package/dist/mir-runner.js +1 -149
  173. package/dist/mir-runner.js.map +1 -1
  174. package/dist/platform/bind.d.ts.map +1 -1
  175. package/dist/platform/bind.js +3 -11
  176. package/dist/platform/bind.js.map +1 -1
  177. package/dist/platform/binding.d.ts +4 -5
  178. package/dist/platform/binding.d.ts.map +1 -1
  179. package/dist/platform/binding.js +0 -11
  180. package/dist/platform/binding.js.map +1 -1
  181. package/dist/platform/tunnel-client.d.ts.map +1 -1
  182. package/dist/platform/tunnel-client.js +37 -28
  183. package/dist/platform/tunnel-client.js.map +1 -1
  184. package/dist/services/deployment-identity.d.ts +1 -1
  185. package/dist/services/deployment-identity.d.ts.map +1 -1
  186. package/dist/services/deployment-identity.js +1 -1
  187. package/dist/services/deployment-identity.js.map +1 -1
  188. package/dist/services/doc-subs-store.js +1 -1
  189. package/dist/services/team-board-store.js +1 -1
  190. package/dist/services/team-board-store.js.map +1 -1
  191. package/dist/services/trigger-types.d.ts +2 -1
  192. package/dist/services/trigger-types.d.ts.map +1 -1
  193. package/dist/services/trigger-types.js +11 -2
  194. package/dist/services/trigger-types.js.map +1 -1
  195. package/dist/services/vc-meeting-runtime-store.d.ts +55 -0
  196. package/dist/services/vc-meeting-runtime-store.d.ts.map +1 -0
  197. package/dist/services/vc-meeting-runtime-store.js +313 -0
  198. package/dist/services/vc-meeting-runtime-store.js.map +1 -0
  199. package/dist/services/voice/index.d.ts +6 -1
  200. package/dist/services/voice/index.d.ts.map +1 -1
  201. package/dist/services/voice/index.js +12 -5
  202. package/dist/services/voice/index.js.map +1 -1
  203. package/dist/services/voice/sami.js +1 -1
  204. package/dist/setup/lark-scopes.json +5 -0
  205. package/dist/setup/verify-permissions.d.ts +6 -0
  206. package/dist/setup/verify-permissions.d.ts.map +1 -1
  207. package/dist/setup/verify-permissions.js +17 -0
  208. package/dist/setup/verify-permissions.js.map +1 -1
  209. package/dist/skills/definitions.d.ts.map +1 -1
  210. package/dist/skills/definitions.js +10 -0
  211. package/dist/skills/definitions.js.map +1 -1
  212. package/dist/types.d.ts +4 -0
  213. package/dist/types.d.ts.map +1 -1
  214. package/dist/utils/daemon-discovery.d.ts +2 -0
  215. package/dist/utils/daemon-discovery.d.ts.map +1 -1
  216. package/dist/utils/daemon-discovery.js +2 -0
  217. package/dist/utils/daemon-discovery.js.map +1 -1
  218. package/dist/utils/timezone.d.ts +51 -0
  219. package/dist/utils/timezone.d.ts.map +1 -0
  220. package/dist/utils/timezone.js +110 -0
  221. package/dist/utils/timezone.js.map +1 -0
  222. package/dist/vc-agent/cards.d.ts +47 -0
  223. package/dist/vc-agent/cards.d.ts.map +1 -0
  224. package/dist/vc-agent/cards.js +489 -0
  225. package/dist/vc-agent/cards.js.map +1 -0
  226. package/dist/vc-agent/meeting-state.d.ts +39 -0
  227. package/dist/vc-agent/meeting-state.d.ts.map +1 -0
  228. package/dist/vc-agent/meeting-state.js +186 -0
  229. package/dist/vc-agent/meeting-state.js.map +1 -0
  230. package/dist/vc-agent/normalizer.d.ts +13 -0
  231. package/dist/vc-agent/normalizer.d.ts.map +1 -0
  232. package/dist/vc-agent/normalizer.js +411 -0
  233. package/dist/vc-agent/normalizer.js.map +1 -0
  234. package/dist/vc-agent/polling-source.d.ts +36 -0
  235. package/dist/vc-agent/polling-source.d.ts.map +1 -0
  236. package/dist/vc-agent/polling-source.js +129 -0
  237. package/dist/vc-agent/polling-source.js.map +1 -0
  238. package/dist/vc-agent/push-source.d.ts +13 -0
  239. package/dist/vc-agent/push-source.d.ts.map +1 -0
  240. package/dist/vc-agent/push-source.js +109 -0
  241. package/dist/vc-agent/push-source.js.map +1 -0
  242. package/dist/vc-agent/realtime/audio-source.d.ts +6 -0
  243. package/dist/vc-agent/realtime/audio-source.d.ts.map +1 -0
  244. package/dist/vc-agent/realtime/audio-source.js +17 -0
  245. package/dist/vc-agent/realtime/audio-source.js.map +1 -0
  246. package/dist/vc-agent/realtime/endpoint.d.ts +6 -0
  247. package/dist/vc-agent/realtime/endpoint.d.ts.map +1 -0
  248. package/dist/vc-agent/realtime/endpoint.js +25 -0
  249. package/dist/vc-agent/realtime/endpoint.js.map +1 -0
  250. package/dist/vc-agent/realtime/errors.d.ts +9 -0
  251. package/dist/vc-agent/realtime/errors.d.ts.map +1 -0
  252. package/dist/vc-agent/realtime/errors.js +17 -0
  253. package/dist/vc-agent/realtime/errors.js.map +1 -0
  254. package/dist/vc-agent/realtime/events.d.ts +24 -0
  255. package/dist/vc-agent/realtime/events.d.ts.map +1 -0
  256. package/dist/vc-agent/realtime/events.js +190 -0
  257. package/dist/vc-agent/realtime/events.js.map +1 -0
  258. package/dist/vc-agent/realtime/frontier.d.ts +34 -0
  259. package/dist/vc-agent/realtime/frontier.d.ts.map +1 -0
  260. package/dist/vc-agent/realtime/frontier.js +40 -0
  261. package/dist/vc-agent/realtime/frontier.js.map +1 -0
  262. package/dist/vc-agent/realtime/index.d.ts +11 -0
  263. package/dist/vc-agent/realtime/index.d.ts.map +1 -0
  264. package/dist/vc-agent/realtime/index.js +11 -0
  265. package/dist/vc-agent/realtime/index.js.map +1 -0
  266. package/dist/vc-agent/realtime/pacer.d.ts +21 -0
  267. package/dist/vc-agent/realtime/pacer.d.ts.map +1 -0
  268. package/dist/vc-agent/realtime/pacer.js +80 -0
  269. package/dist/vc-agent/realtime/pacer.js.map +1 -0
  270. package/dist/vc-agent/realtime/protobuf.d.ts +33 -0
  271. package/dist/vc-agent/realtime/protobuf.d.ts.map +1 -0
  272. package/dist/vc-agent/realtime/protobuf.js +159 -0
  273. package/dist/vc-agent/realtime/protobuf.js.map +1 -0
  274. package/dist/vc-agent/realtime/protocol.d.ts +4 -0
  275. package/dist/vc-agent/realtime/protocol.d.ts.map +1 -0
  276. package/dist/vc-agent/realtime/protocol.js +59 -0
  277. package/dist/vc-agent/realtime/protocol.js.map +1 -0
  278. package/dist/vc-agent/realtime/session.d.ts +39 -0
  279. package/dist/vc-agent/realtime/session.d.ts.map +1 -0
  280. package/dist/vc-agent/realtime/session.js +221 -0
  281. package/dist/vc-agent/realtime/session.js.map +1 -0
  282. package/dist/vc-agent/realtime/transport.d.ts +23 -0
  283. package/dist/vc-agent/realtime/transport.d.ts.map +1 -0
  284. package/dist/vc-agent/realtime/transport.js +112 -0
  285. package/dist/vc-agent/realtime/transport.js.map +1 -0
  286. package/dist/vc-agent/realtime/types.d.ts +84 -0
  287. package/dist/vc-agent/realtime/types.d.ts.map +1 -0
  288. package/dist/vc-agent/realtime/types.js +5 -0
  289. package/dist/vc-agent/realtime/types.js.map +1 -0
  290. package/dist/vc-agent/types.d.ts +142 -0
  291. package/dist/vc-agent/types.d.ts.map +1 -0
  292. package/dist/vc-agent/types.js +2 -0
  293. package/dist/vc-agent/types.js.map +1 -0
  294. package/dist/worker.js +8 -5
  295. package/dist/worker.js.map +1 -1
  296. package/dist/workflows/attempt-resume.d.ts +4 -0
  297. package/dist/workflows/attempt-resume.d.ts.map +1 -1
  298. package/dist/workflows/attempt-resume.js +2 -0
  299. package/dist/workflows/attempt-resume.js.map +1 -1
  300. package/dist/workflows/attempt-terminal.d.ts +4 -0
  301. package/dist/workflows/attempt-terminal.d.ts.map +1 -1
  302. package/dist/workflows/attempt-terminal.js.map +1 -1
  303. package/dist/workflows/daemon-spawn.d.ts.map +1 -1
  304. package/dist/workflows/daemon-spawn.js +7 -0
  305. package/dist/workflows/daemon-spawn.js.map +1 -1
  306. package/dist/workflows/definition.d.ts +14 -14
  307. package/dist/workflows/events/payloads.d.ts +40 -8
  308. package/dist/workflows/events/payloads.d.ts.map +1 -1
  309. package/dist/workflows/events/payloads.js +4 -0
  310. package/dist/workflows/events/payloads.js.map +1 -1
  311. package/dist/workflows/events/schema.d.ts +508 -452
  312. package/dist/workflows/events/schema.d.ts.map +1 -1
  313. package/dist/workflows/runtime.d.ts +4 -0
  314. package/dist/workflows/runtime.d.ts.map +1 -1
  315. package/dist/workflows/runtime.js.map +1 -1
  316. package/dist/workflows/spawn-policy.d.ts +14 -0
  317. package/dist/workflows/spawn-policy.d.ts.map +1 -0
  318. package/dist/workflows/spawn-policy.js +9 -0
  319. package/dist/workflows/spawn-policy.js.map +1 -0
  320. package/dist/workflows/v3/bot-resolve.d.ts.map +1 -1
  321. package/dist/workflows/v3/bot-resolve.js +4 -0
  322. package/dist/workflows/v3/bot-resolve.js.map +1 -1
  323. package/dist/workflows/v3/cli-run.d.ts.map +1 -1
  324. package/dist/workflows/v3/cli-run.js +4 -0
  325. package/dist/workflows/v3/cli-run.js.map +1 -1
  326. package/dist/workflows/v3/contract.d.ts +9 -3
  327. package/dist/workflows/v3/contract.d.ts.map +1 -1
  328. package/dist/workflows/v3/contract.js +3 -3
  329. package/dist/workflows/v3/contract.js.map +1 -1
  330. package/dist/workflows/v3/ephemeral-pool.d.ts.map +1 -1
  331. package/dist/workflows/v3/ephemeral-pool.js +2 -0
  332. package/dist/workflows/v3/ephemeral-pool.js.map +1 -1
  333. package/dist/workflows/v3/runtime.js +1 -1
  334. package/dist/workflows/v3/runtime.js.map +1 -1
  335. package/package.json +1 -1
  336. package/dist/dashboard-web/chunks/chunk-76J7PNZI.js +0 -1
  337. package/dist/dashboard-web/chunks/overview-page-EHCZJBWY.js +0 -1
  338. package/dist/dashboard-web/chunks/schedules-RSXALJU4.js +0 -1
  339. package/dist/dashboard-web/chunks/settings-page-XKFTXTDE.js +0 -2
@@ -0,0 +1,190 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { concatProtoFields, decodeProtoFields, encodeBytes, encodeInt64, encodeString, encodeUint32, fieldBigInt, fieldBool, fieldBytes, fieldNumber, fieldString, } from './protobuf.js';
3
+ export const CLIENT_EVENT_SESSION_CREATE = 'session.create';
4
+ export const CLIENT_EVENT_AUDIO_UPSTREAM_APPEND = 'audio.upstream.append';
5
+ export const CLIENT_EVENT_AUDIO_UPSTREAM_CLEAR = 'audio.upstream.clear';
6
+ export const CLIENT_EVENT_SESSION_CLOSE = 'session.close';
7
+ export const SERVER_EVENT_SESSION_CREATED = 'session.created';
8
+ export const SERVER_EVENT_AUDIO_DOWNSTREAM_DELTA = 'audio.downstream.delta';
9
+ export const SERVER_EVENT_SESSION_CLOSED = 'session.closed';
10
+ export const SERVER_EVENT_ERROR = 'error';
11
+ export const CLIENT_CLOSE_REASON_USER_LEFT = 1;
12
+ function nowRfc3339() {
13
+ return new Date().toISOString().replace(/\.\d{3}Z$/, 'Z');
14
+ }
15
+ function eventIdOrNew(eventId) {
16
+ return eventId ?? randomUUID();
17
+ }
18
+ function realtimeMimeType(format) {
19
+ if (format.encoding !== 'pcm_s16le') {
20
+ throw new Error(`unsupported realtime audio encoding: ${format.encoding}`);
21
+ }
22
+ return 'audio/pcm';
23
+ }
24
+ function encodeAudioFormat(format) {
25
+ return concatProtoFields([
26
+ encodeString(1, realtimeMimeType(format)),
27
+ encodeString(2, 's16le'),
28
+ encodeUint32(3, format.sampleRate),
29
+ ]);
30
+ }
31
+ function encodeMedia(format) {
32
+ const audio = encodeAudioFormat(format);
33
+ return concatProtoFields([
34
+ encodeBytes(1, audio),
35
+ encodeBytes(2, audio),
36
+ ]);
37
+ }
38
+ function encodeSession(format) {
39
+ return concatProtoFields([
40
+ encodeBytes(1, encodeMedia(format)),
41
+ ]);
42
+ }
43
+ function encodeClientEvent(fields) {
44
+ return {
45
+ eventId: fields.eventId,
46
+ payload: concatProtoFields([
47
+ encodeString(1, fields.type),
48
+ encodeString(2, fields.eventId),
49
+ fields.sessionId === undefined ? undefined : encodeInt64(3, fields.sessionId),
50
+ encodeString(4, fields.createdAt),
51
+ encodeBytes(fields.payloadField, fields.payload, { emitEmpty: true }),
52
+ ]),
53
+ };
54
+ }
55
+ export function encodeSessionCreateEvent(format, opts = {}) {
56
+ const eventId = eventIdOrNew(opts.eventId);
57
+ const sessionCreate = concatProtoFields([
58
+ encodeBytes(1, encodeSession(format)),
59
+ ]);
60
+ return encodeClientEvent({
61
+ type: CLIENT_EVENT_SESSION_CREATE,
62
+ eventId,
63
+ createdAt: opts.createdAt ?? nowRfc3339(),
64
+ payloadField: 10,
65
+ payload: sessionCreate,
66
+ });
67
+ }
68
+ export function encodeAudioFrameEvent(frame, sessionId, opts = {}) {
69
+ const payload = concatProtoFields([
70
+ encodeBytes(1, frame.data, { emitEmpty: true }),
71
+ ]);
72
+ return encodeClientEvent({
73
+ type: CLIENT_EVENT_AUDIO_UPSTREAM_APPEND,
74
+ eventId: opts.eventId ?? '',
75
+ sessionId,
76
+ createdAt: opts.createdAt ?? nowRfc3339(),
77
+ payloadField: 11,
78
+ payload,
79
+ });
80
+ }
81
+ export function encodeAudioUpstreamClearEvent(sessionId, opts = {}) {
82
+ return encodeClientEvent({
83
+ type: CLIENT_EVENT_AUDIO_UPSTREAM_CLEAR,
84
+ eventId: eventIdOrNew(opts.eventId),
85
+ sessionId,
86
+ createdAt: opts.createdAt ?? nowRfc3339(),
87
+ payloadField: 12,
88
+ payload: Buffer.alloc(0),
89
+ });
90
+ }
91
+ export function encodeSessionCloseEvent(sessionId, opts = {}) {
92
+ const payload = concatProtoFields([
93
+ encodeUint32(1, CLIENT_CLOSE_REASON_USER_LEFT),
94
+ ]);
95
+ return encodeClientEvent({
96
+ type: CLIENT_EVENT_SESSION_CLOSE,
97
+ eventId: eventIdOrNew(opts.eventId),
98
+ sessionId,
99
+ createdAt: opts.createdAt ?? nowRfc3339(),
100
+ payloadField: 13,
101
+ payload,
102
+ });
103
+ }
104
+ function decodeSessionCreated(payload) {
105
+ const fields = decodeProtoFields(payload);
106
+ return { clientEventId: fieldString(fields, 1) };
107
+ }
108
+ function decodeAudioDownstreamDelta(payload) {
109
+ const fields = decodeProtoFields(payload);
110
+ return {
111
+ trackId: fieldString(fields, 1),
112
+ source: fieldString(fields, 2),
113
+ ptsMs: fieldBigInt(fields, 4),
114
+ durationMs: fieldNumber(fields, 5),
115
+ delta: fieldBytes(fields, 6),
116
+ };
117
+ }
118
+ function decodeSessionClosed(payload) {
119
+ const fields = decodeProtoFields(payload);
120
+ return {
121
+ sessionId: fieldBigInt(fields, 1),
122
+ reason: fieldNumber(fields, 2),
123
+ };
124
+ }
125
+ function decodeError(payload) {
126
+ const fields = decodeProtoFields(payload);
127
+ return {
128
+ clientEventId: fieldString(fields, 1),
129
+ code: fieldNumber(fields, 2),
130
+ message: fieldString(fields, 3),
131
+ retryable: fieldBool(fields, 4),
132
+ };
133
+ }
134
+ export function decodeServerEvent(data) {
135
+ const fields = decodeProtoFields(data);
136
+ const type = fieldString(fields, 1) ?? '';
137
+ const eventId = fieldString(fields, 2);
138
+ const sessionId = fieldBigInt(fields, 3);
139
+ const createdAt = fieldString(fields, 4);
140
+ if (type === SERVER_EVENT_SESSION_CREATED) {
141
+ const payload = fieldBytes(fields, 10);
142
+ const sessionCreated = payload ? decodeSessionCreated(payload) : {};
143
+ return {
144
+ type,
145
+ ...(eventId ? { eventId } : {}),
146
+ ...(sessionId !== undefined ? { sessionId } : {}),
147
+ ...(createdAt ? { createdAt } : {}),
148
+ ...sessionCreated,
149
+ };
150
+ }
151
+ if (type === SERVER_EVENT_AUDIO_DOWNSTREAM_DELTA) {
152
+ const payload = fieldBytes(fields, 20);
153
+ return {
154
+ type,
155
+ ...(eventId ? { eventId } : {}),
156
+ ...(sessionId !== undefined ? { sessionId } : {}),
157
+ ...(createdAt ? { createdAt } : {}),
158
+ ...(payload ? decodeAudioDownstreamDelta(payload) : {}),
159
+ };
160
+ }
161
+ if (type === SERVER_EVENT_SESSION_CLOSED) {
162
+ const payload = fieldBytes(fields, 30);
163
+ const sessionClosed = payload ? decodeSessionClosed(payload) : {};
164
+ return {
165
+ type,
166
+ ...(eventId ? { eventId } : {}),
167
+ ...(sessionId !== undefined ? { sessionId } : {}),
168
+ ...(createdAt ? { createdAt } : {}),
169
+ ...sessionClosed,
170
+ };
171
+ }
172
+ if (type === SERVER_EVENT_ERROR) {
173
+ const payload = fieldBytes(fields, 90);
174
+ return {
175
+ type,
176
+ ...(eventId ? { eventId } : {}),
177
+ ...(sessionId !== undefined ? { sessionId } : {}),
178
+ ...(createdAt ? { createdAt } : {}),
179
+ ...(payload ? decodeError(payload) : {}),
180
+ };
181
+ }
182
+ return {
183
+ type: 'unknown',
184
+ ...(type ? { rawType: type } : {}),
185
+ ...(eventId ? { eventId } : {}),
186
+ ...(sessionId !== undefined ? { sessionId } : {}),
187
+ ...(createdAt ? { createdAt } : {}),
188
+ };
189
+ }
190
+ //# sourceMappingURL=events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.js","sourceRoot":"","sources":["../../../src/vc-agent/realtime/events.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ export declare const FRONTIER_SERVICE = 33555721;
2
+ export declare const FRONTIER_METHOD = 1;
3
+ export declare const FRONTIER_FRAME_TYPE_NORMAL = 0;
4
+ export declare const FRONTIER_SKIP_FRAME_TYPES: Set<number>;
5
+ export declare const FRONTIER_PAYLOAD_ENCODING = "binary";
6
+ export declare const FRONTIER_PAYLOAD_TYPE = "application/x-protobuf";
7
+ export interface FrontierFrameInput {
8
+ seqId: bigint | number;
9
+ logId?: bigint | number;
10
+ service: number;
11
+ method: number;
12
+ payload: Buffer;
13
+ payloadEncoding?: string;
14
+ payloadType?: string;
15
+ logIdNew?: string;
16
+ msgId?: string;
17
+ frameType?: number;
18
+ }
19
+ export interface DecodedFrontierFrame {
20
+ seqId?: bigint;
21
+ logId?: bigint;
22
+ service?: number;
23
+ method?: number;
24
+ payload?: Buffer;
25
+ payloadEncoding?: string;
26
+ payloadType?: string;
27
+ logIdNew?: string;
28
+ msgId?: string;
29
+ frameType?: number;
30
+ skipped: boolean;
31
+ }
32
+ export declare function encodeFrontierFrame(input: FrontierFrameInput): Buffer;
33
+ export declare function decodeFrontierFrame(data: Buffer): DecodedFrontierFrame;
34
+ //# sourceMappingURL=frontier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frontier.d.ts","sourceRoot":"","sources":["../../../src/vc-agent/realtime/frontier.ts"],"names":[],"mappings":"AAaA,eAAO,MAAM,gBAAgB,WAAa,CAAC;AAC3C,eAAO,MAAM,eAAe,IAAI,CAAC;AACjC,eAAO,MAAM,0BAA0B,IAAI,CAAC;AAC5C,eAAO,MAAM,yBAAyB,aAA0B,CAAC;AACjE,eAAO,MAAM,yBAAyB,WAAW,CAAC;AAClD,eAAO,MAAM,qBAAqB,2BAA2B,CAAC;AAE9D,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,kBAAkB,GAAG,MAAM,CAcrE;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,oBAAoB,CAgBtE"}
@@ -0,0 +1,40 @@
1
+ import { concatProtoFields, decodeProtoFields, encodeBytes, encodeInt32, encodeString, encodeUint64, fieldBigInt, fieldBytes, fieldNumber, fieldString, } from './protobuf.js';
2
+ export const FRONTIER_SERVICE = 33_555_721;
3
+ export const FRONTIER_METHOD = 1;
4
+ export const FRONTIER_FRAME_TYPE_NORMAL = 0;
5
+ export const FRONTIER_SKIP_FRAME_TYPES = new Set([1, 2, 16, 32]);
6
+ export const FRONTIER_PAYLOAD_ENCODING = 'binary';
7
+ export const FRONTIER_PAYLOAD_TYPE = 'application/x-protobuf';
8
+ export function encodeFrontierFrame(input) {
9
+ const frameType = input.frameType ?? FRONTIER_FRAME_TYPE_NORMAL;
10
+ return concatProtoFields([
11
+ encodeUint64(1, input.seqId),
12
+ encodeUint64(2, input.logId ?? 0n),
13
+ encodeInt32(3, input.service),
14
+ encodeInt32(4, input.method),
15
+ encodeString(6, input.payloadEncoding ?? FRONTIER_PAYLOAD_ENCODING),
16
+ encodeString(7, input.payloadType ?? FRONTIER_PAYLOAD_TYPE),
17
+ encodeBytes(8, input.payload, { emitEmpty: true }),
18
+ encodeString(9, input.logIdNew ?? '', { emitEmpty: true }),
19
+ encodeString(11, input.msgId ?? '', { emitEmpty: true }),
20
+ encodeInt32(12, frameType),
21
+ ]);
22
+ }
23
+ export function decodeFrontierFrame(data) {
24
+ const fields = decodeProtoFields(data);
25
+ const frameType = fieldNumber(fields, 12) ?? FRONTIER_FRAME_TYPE_NORMAL;
26
+ return {
27
+ seqId: fieldBigInt(fields, 1),
28
+ logId: fieldBigInt(fields, 2),
29
+ service: fieldNumber(fields, 3),
30
+ method: fieldNumber(fields, 4),
31
+ payloadEncoding: fieldString(fields, 6),
32
+ payloadType: fieldString(fields, 7),
33
+ payload: fieldBytes(fields, 8),
34
+ logIdNew: fieldString(fields, 9),
35
+ msgId: fieldString(fields, 11),
36
+ frameType,
37
+ skipped: FRONTIER_SKIP_FRAME_TYPES.has(frameType),
38
+ };
39
+ }
40
+ //# sourceMappingURL=frontier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frontier.js","sourceRoot":"","sources":["../../../src/vc-agent/realtime/frontier.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,WAAW,EACX,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,UAAU,EACV,WAAW,EACX,WAAW,GACZ,MAAM,eAAe,CAAC;AAEvB,MAAM,CAAC,MAAM,gBAAgB,GAAG,UAAU,CAAC;AAC3C,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC;AACjC,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,CAAC;AAC5C,MAAM,CAAC,MAAM,yBAAyB,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;AACjE,MAAM,CAAC,MAAM,yBAAyB,GAAG,QAAQ,CAAC;AAClD,MAAM,CAAC,MAAM,qBAAqB,GAAG,wBAAwB,CAAC;AA6B9D,MAAM,UAAU,mBAAmB,CAAC,KAAyB;IAC3D,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,IAAI,0BAA0B,CAAC;IAChE,OAAO,iBAAiB,CAAC;QACvB,YAAY,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC;QAC5B,YAAY,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC;QAClC,WAAW,CAAC,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC;QAC7B,WAAW,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC;QAC5B,YAAY,CAAC,CAAC,EAAE,KAAK,CAAC,eAAe,IAAI,yBAAyB,CAAC;QACnE,YAAY,CAAC,CAAC,EAAE,KAAK,CAAC,WAAW,IAAI,qBAAqB,CAAC;QAC3D,WAAW,CAAC,CAAC,EAAE,KAAK,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;QAClD,YAAY,CAAC,CAAC,EAAE,KAAK,CAAC,QAAQ,IAAI,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;QAC1D,YAAY,CAAC,EAAE,EAAE,KAAK,CAAC,KAAK,IAAI,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;QACxD,WAAW,CAAC,EAAE,EAAE,SAAS,CAAC;KAC3B,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAC9C,MAAM,MAAM,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;IACvC,MAAM,SAAS,GAAG,WAAW,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,0BAA0B,CAAC;IACxE,OAAO;QACL,KAAK,EAAE,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC;QAC7B,KAAK,EAAE,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC;QAC7B,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC;QAC/B,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC;QAC9B,eAAe,EAAE,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC;QACvC,WAAW,EAAE,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC;QACnC,OAAO,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;QAC9B,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC;QAChC,KAAK,EAAE,WAAW,CAAC,MAAM,EAAE,EAAE,CAAC;QAC9B,SAAS;QACT,OAAO,EAAE,yBAAyB,CAAC,GAAG,CAAC,SAAS,CAAC;KAClD,CAAC;AACJ,CAAC"}
@@ -0,0 +1,11 @@
1
+ export { DEFAULT_REALTIME_VOICE_CHANNELS, DEFAULT_REALTIME_VOICE_FRAME_MS, DEFAULT_REALTIME_VOICE_SAMPLE_RATE, REALTIME_VOICE_ENCODING, type RealtimeVoiceAudioFormat, type DecodedRealtimeServerEvent, type RealtimeVoiceFrame, type RealtimeVoiceFrameBatch, type RealtimeVoiceProtocol, type RealtimeVoiceSessionInfo, type RealtimeVoiceSessionStatus, type RealtimeVoiceTransport, } from './types.js';
2
+ export { REALTIME_VOICE_PROTO_NOT_CONFIGURED, REALTIME_VOICE_TRANSPORT_NOT_CONFIGURED, RealtimeVoiceNotConfiguredError, } from './errors.js';
3
+ export { bytesPerRealtimeFrame, paceRealtimeVoiceFrames, realtimeAudioFormatFromPcm, splitPcmIntoRealtimeFrames, } from './pacer.js';
4
+ export { pcmToRealtimeVoiceFrameBatch, synthesizeRealtimeVoiceFrameBatch, } from './audio-source.js';
5
+ export { fetchRealtimeVoiceEndpoint, type RealtimeEndpointResult, } from './endpoint.js';
6
+ export { createProtoRealtimeVoiceProtocol, createUnavailableRealtimeVoiceProtocol, } from './protocol.js';
7
+ export { decodeFrontierFrame, encodeFrontierFrame, FRONTIER_FRAME_TYPE_NORMAL, FRONTIER_METHOD, FRONTIER_PAYLOAD_ENCODING, FRONTIER_PAYLOAD_TYPE, FRONTIER_SERVICE, } from './frontier.js';
8
+ export { decodeServerEvent, encodeAudioFrameEvent, encodeAudioUpstreamClearEvent, encodeSessionCloseEvent, encodeSessionCreateEvent, SERVER_EVENT_ERROR, SERVER_EVENT_SESSION_CLOSED, SERVER_EVENT_SESSION_CREATED, } from './events.js';
9
+ export { RealtimeVoiceSession, type RealtimeVoiceSessionOptions, } from './session.js';
10
+ export { connectRealtimeVoiceTransport, WebSocketRealtimeVoiceTransport, type ConnectRealtimeVoiceTransportOptions, } from './transport.js';
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/vc-agent/realtime/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,+BAA+B,EAC/B,+BAA+B,EAC/B,kCAAkC,EAClC,uBAAuB,EACvB,KAAK,wBAAwB,EAC7B,KAAK,0BAA0B,EAC/B,KAAK,kBAAkB,EACvB,KAAK,uBAAuB,EAC5B,KAAK,qBAAqB,EAC1B,KAAK,wBAAwB,EAC7B,KAAK,0BAA0B,EAC/B,KAAK,sBAAsB,GAC5B,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,mCAAmC,EACnC,uCAAuC,EACvC,+BAA+B,GAChC,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,qBAAqB,EACrB,uBAAuB,EACvB,0BAA0B,EAC1B,0BAA0B,GAC3B,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,4BAA4B,EAC5B,iCAAiC,GAClC,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,0BAA0B,EAC1B,KAAK,sBAAsB,GAC5B,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,gCAAgC,EAChC,sCAAsC,GACvC,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,0BAA0B,EAC1B,eAAe,EACf,yBAAyB,EACzB,qBAAqB,EACrB,gBAAgB,GACjB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,6BAA6B,EAC7B,uBAAuB,EACvB,wBAAwB,EACxB,kBAAkB,EAClB,2BAA2B,EAC3B,4BAA4B,GAC7B,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,oBAAoB,EACpB,KAAK,2BAA2B,GACjC,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,6BAA6B,EAC7B,+BAA+B,EAC/B,KAAK,oCAAoC,GAC1C,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,11 @@
1
+ export { DEFAULT_REALTIME_VOICE_CHANNELS, DEFAULT_REALTIME_VOICE_FRAME_MS, DEFAULT_REALTIME_VOICE_SAMPLE_RATE, REALTIME_VOICE_ENCODING, } from './types.js';
2
+ export { REALTIME_VOICE_PROTO_NOT_CONFIGURED, REALTIME_VOICE_TRANSPORT_NOT_CONFIGURED, RealtimeVoiceNotConfiguredError, } from './errors.js';
3
+ export { bytesPerRealtimeFrame, paceRealtimeVoiceFrames, realtimeAudioFormatFromPcm, splitPcmIntoRealtimeFrames, } from './pacer.js';
4
+ export { pcmToRealtimeVoiceFrameBatch, synthesizeRealtimeVoiceFrameBatch, } from './audio-source.js';
5
+ export { fetchRealtimeVoiceEndpoint, } from './endpoint.js';
6
+ export { createProtoRealtimeVoiceProtocol, createUnavailableRealtimeVoiceProtocol, } from './protocol.js';
7
+ export { decodeFrontierFrame, encodeFrontierFrame, FRONTIER_FRAME_TYPE_NORMAL, FRONTIER_METHOD, FRONTIER_PAYLOAD_ENCODING, FRONTIER_PAYLOAD_TYPE, FRONTIER_SERVICE, } from './frontier.js';
8
+ export { decodeServerEvent, encodeAudioFrameEvent, encodeAudioUpstreamClearEvent, encodeSessionCloseEvent, encodeSessionCreateEvent, SERVER_EVENT_ERROR, SERVER_EVENT_SESSION_CLOSED, SERVER_EVENT_SESSION_CREATED, } from './events.js';
9
+ export { RealtimeVoiceSession, } from './session.js';
10
+ export { connectRealtimeVoiceTransport, WebSocketRealtimeVoiceTransport, } from './transport.js';
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/vc-agent/realtime/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,+BAA+B,EAC/B,+BAA+B,EAC/B,kCAAkC,EAClC,uBAAuB,GASxB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,mCAAmC,EACnC,uCAAuC,EACvC,+BAA+B,GAChC,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,qBAAqB,EACrB,uBAAuB,EACvB,0BAA0B,EAC1B,0BAA0B,GAC3B,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,4BAA4B,EAC5B,iCAAiC,GAClC,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,0BAA0B,GAE3B,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,gCAAgC,EAChC,sCAAsC,GACvC,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,0BAA0B,EAC1B,eAAe,EACf,yBAAyB,EACzB,qBAAqB,EACrB,gBAAgB,GACjB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,6BAA6B,EAC7B,uBAAuB,EACvB,wBAAwB,EACxB,kBAAkB,EAClB,2BAA2B,EAC3B,4BAA4B,GAC7B,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,oBAAoB,GAErB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,6BAA6B,EAC7B,+BAA+B,GAEhC,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,21 @@
1
+ import type { Pcm } from '../../services/voice/audio.js';
2
+ import { type RealtimeVoiceAudioFormat, type RealtimeVoiceFrame } from './types.js';
3
+ export interface SplitPcmFrameOptions {
4
+ frameMs?: number;
5
+ }
6
+ export interface PaceRealtimeVoiceFramesOptions {
7
+ sleep?: (ms: number) => Promise<void>;
8
+ now?: () => number;
9
+ bufferedAmount?: () => number;
10
+ maxBufferedAmount?: number;
11
+ backpressureSleepMs?: number;
12
+ }
13
+ export declare function realtimeAudioFormatFromPcm(pcm: Pcm, opts?: SplitPcmFrameOptions): RealtimeVoiceAudioFormat;
14
+ export declare function bytesPerRealtimeFrame(format: RealtimeVoiceAudioFormat): number;
15
+ export declare function splitPcmIntoRealtimeFrames(pcm: Pcm, opts?: SplitPcmFrameOptions): {
16
+ format: RealtimeVoiceAudioFormat;
17
+ frames: RealtimeVoiceFrame[];
18
+ durationMs: number;
19
+ };
20
+ export declare function paceRealtimeVoiceFrames(frames: RealtimeVoiceFrame[], send: (frame: RealtimeVoiceFrame) => void | Promise<void>, opts?: PaceRealtimeVoiceFramesOptions): Promise<void>;
21
+ //# sourceMappingURL=pacer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pacer.d.ts","sourceRoot":"","sources":["../../../src/vc-agent/realtime/pacer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,+BAA+B,CAAC;AACzD,OAAO,EAGL,KAAK,wBAAwB,EAC7B,KAAK,kBAAkB,EACxB,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,oBAAoB;IACnC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,8BAA8B;IAC7C,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,MAAM,CAAC;IAC9B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AASD,wBAAgB,0BAA0B,CACxC,GAAG,EAAE,GAAG,EACR,IAAI,GAAE,oBAAyB,GAC9B,wBAAwB,CAO1B;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,wBAAwB,GAAG,MAAM,CAkB9E;AAED,wBAAgB,0BAA0B,CACxC,GAAG,EAAE,GAAG,EACR,IAAI,GAAE,oBAAyB,GAC9B;IAAE,MAAM,EAAE,wBAAwB,CAAC;IAAC,MAAM,EAAE,kBAAkB,EAAE,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CA6BxF;AAED,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,kBAAkB,EAAE,EAC5B,IAAI,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,EACzD,IAAI,GAAE,8BAAmC,GACxC,OAAO,CAAC,IAAI,CAAC,CAef"}
@@ -0,0 +1,80 @@
1
+ import { DEFAULT_REALTIME_VOICE_FRAME_MS, REALTIME_VOICE_ENCODING, } from './types.js';
2
+ const DEFAULT_MAX_BUFFERED_AMOUNT = 512 * 1024;
3
+ const DEFAULT_BACKPRESSURE_SLEEP_MS = 10;
4
+ function defaultSleep(ms) {
5
+ return new Promise(resolve => setTimeout(resolve, ms));
6
+ }
7
+ export function realtimeAudioFormatFromPcm(pcm, opts = {}) {
8
+ return {
9
+ encoding: REALTIME_VOICE_ENCODING,
10
+ sampleRate: pcm.sampleRate,
11
+ channels: pcm.channels,
12
+ frameMs: opts.frameMs ?? DEFAULT_REALTIME_VOICE_FRAME_MS,
13
+ };
14
+ }
15
+ export function bytesPerRealtimeFrame(format) {
16
+ if (format.encoding !== REALTIME_VOICE_ENCODING) {
17
+ throw new Error(`unsupported realtime audio encoding: ${format.encoding}`);
18
+ }
19
+ if (!Number.isInteger(format.sampleRate) || format.sampleRate <= 0) {
20
+ throw new Error(`invalid realtime audio sampleRate: ${format.sampleRate}`);
21
+ }
22
+ if (!Number.isInteger(format.channels) || format.channels <= 0) {
23
+ throw new Error(`invalid realtime audio channels: ${format.channels}`);
24
+ }
25
+ if (!Number.isInteger(format.frameMs) || format.frameMs <= 0) {
26
+ throw new Error(`invalid realtime audio frameMs: ${format.frameMs}`);
27
+ }
28
+ const bytes = (format.sampleRate * format.channels * 2 * format.frameMs) / 1000;
29
+ if (!Number.isInteger(bytes)) {
30
+ throw new Error(`realtime audio frame size is fractional: ${bytes} bytes`);
31
+ }
32
+ return bytes;
33
+ }
34
+ export function splitPcmIntoRealtimeFrames(pcm, opts = {}) {
35
+ const format = realtimeAudioFormatFromPcm(pcm, opts);
36
+ const bytesPerSampleFrame = format.channels * 2;
37
+ if (pcm.data.length % bytesPerSampleFrame !== 0) {
38
+ throw new Error(`PCM byte length ${pcm.data.length} is not aligned to ${bytesPerSampleFrame}-byte sample frames`);
39
+ }
40
+ const frameBytes = bytesPerRealtimeFrame(format);
41
+ const frames = [];
42
+ let offset = 0;
43
+ let seq = 0;
44
+ while (offset < pcm.data.length) {
45
+ const next = Math.min(offset + frameBytes, pcm.data.length);
46
+ const data = pcm.data.subarray(offset, next);
47
+ const sampleFrames = data.length / bytesPerSampleFrame;
48
+ frames.push({
49
+ seq,
50
+ offsetMs: Math.round((offset / bytesPerSampleFrame / format.sampleRate) * 1000),
51
+ durationMs: Math.round((sampleFrames / format.sampleRate) * 1000),
52
+ data,
53
+ format,
54
+ });
55
+ offset = next;
56
+ seq += 1;
57
+ }
58
+ return {
59
+ format,
60
+ frames,
61
+ durationMs: Math.round((pcm.data.length / bytesPerSampleFrame / format.sampleRate) * 1000),
62
+ };
63
+ }
64
+ export async function paceRealtimeVoiceFrames(frames, send, opts = {}) {
65
+ const sleep = opts.sleep ?? defaultSleep;
66
+ const now = opts.now ?? Date.now;
67
+ const start = now();
68
+ const maxBufferedAmount = opts.maxBufferedAmount ?? DEFAULT_MAX_BUFFERED_AMOUNT;
69
+ const backpressureSleepMs = opts.backpressureSleepMs ?? DEFAULT_BACKPRESSURE_SLEEP_MS;
70
+ for (const frame of frames) {
71
+ const waitMs = start + frame.offsetMs - now();
72
+ if (waitMs > 0)
73
+ await sleep(waitMs);
74
+ while (opts.bufferedAmount && opts.bufferedAmount() > maxBufferedAmount) {
75
+ await sleep(backpressureSleepMs);
76
+ }
77
+ await send(frame);
78
+ }
79
+ }
80
+ //# sourceMappingURL=pacer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pacer.js","sourceRoot":"","sources":["../../../src/vc-agent/realtime/pacer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ export declare const WIRE_VARINT = 0;
2
+ export declare const WIRE_LEN = 2;
3
+ export interface DecodedProtoField {
4
+ field: number;
5
+ wire: number;
6
+ value: bigint | Buffer;
7
+ }
8
+ export declare function encodeVarint(value: bigint | number): Buffer;
9
+ export declare function encodeTag(field: number, wire: number): Buffer;
10
+ export declare function encodeUint64(field: number, value: bigint | number | undefined): Buffer | undefined;
11
+ export declare function encodeInt64(field: number, value: bigint | number | undefined): Buffer | undefined;
12
+ export declare function encodeUint32(field: number, value: number | undefined): Buffer | undefined;
13
+ export declare function encodeInt32(field: number, value: number | undefined): Buffer | undefined;
14
+ export declare function encodeBool(field: number, value: boolean | undefined): Buffer | undefined;
15
+ export declare function encodeString(field: number, value: string | undefined, opts?: {
16
+ emitEmpty?: boolean;
17
+ }): Buffer | undefined;
18
+ export declare function encodeBytes(field: number, value: Buffer | undefined, opts?: {
19
+ emitEmpty?: boolean;
20
+ }): Buffer | undefined;
21
+ export declare function concatProtoFields(fields: Array<Buffer | undefined>): Buffer;
22
+ export declare function readVarint(data: Buffer, offset?: number): {
23
+ value: bigint;
24
+ next: number;
25
+ };
26
+ export declare function decodeProtoFields(data: Buffer): DecodedProtoField[];
27
+ export declare function firstField(fields: DecodedProtoField[], field: number): DecodedProtoField | undefined;
28
+ export declare function fieldString(fields: DecodedProtoField[], field: number): string | undefined;
29
+ export declare function fieldBytes(fields: DecodedProtoField[], field: number): Buffer | undefined;
30
+ export declare function fieldBigInt(fields: DecodedProtoField[], field: number): bigint | undefined;
31
+ export declare function fieldNumber(fields: DecodedProtoField[], field: number): number | undefined;
32
+ export declare function fieldBool(fields: DecodedProtoField[], field: number): boolean | undefined;
33
+ //# sourceMappingURL=protobuf.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protobuf.d.ts","sourceRoot":"","sources":["../../../src/vc-agent/realtime/protobuf.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,WAAW,IAAI,CAAC;AAC7B,eAAO,MAAM,QAAQ,IAAI,CAAC;AAE1B,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;CACxB;AAQD,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAW3D;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAG7D;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAGlG;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAEjG;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAIzF;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAKxF;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAGxF;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,IAAI,GAAE;IAAE,SAAS,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,MAAM,GAAG,SAAS,CAK7H;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,IAAI,GAAE;IAAE,SAAS,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,MAAM,GAAG,SAAS,CAI5H;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC,GAAG,MAAM,CAE3E;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,SAAI,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAapF;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,iBAAiB,EAAE,CAqCnE;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,iBAAiB,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,iBAAiB,GAAG,SAAS,CAEpG;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,iBAAiB,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAG1F;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,iBAAiB,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAGzF;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,iBAAiB,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAG1F;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,iBAAiB,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAM1F;AAED,wBAAgB,SAAS,CAAC,MAAM,EAAE,iBAAiB,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAGzF"}
@@ -0,0 +1,159 @@
1
+ export const WIRE_VARINT = 0;
2
+ export const WIRE_LEN = 2;
3
+ function assertFieldNumber(field) {
4
+ if (!Number.isInteger(field) || field <= 0) {
5
+ throw new Error(`invalid protobuf field number: ${field}`);
6
+ }
7
+ }
8
+ export function encodeVarint(value) {
9
+ let n = typeof value === 'bigint' ? value : BigInt(value);
10
+ if (n < 0n)
11
+ throw new Error(`negative varint is unsupported: ${n}`);
12
+ const bytes = [];
13
+ do {
14
+ let byte = Number(n & 0x7fn);
15
+ n >>= 7n;
16
+ if (n !== 0n)
17
+ byte |= 0x80;
18
+ bytes.push(byte);
19
+ } while (n !== 0n);
20
+ return Buffer.from(bytes);
21
+ }
22
+ export function encodeTag(field, wire) {
23
+ assertFieldNumber(field);
24
+ return encodeVarint(BigInt((field << 3) | wire));
25
+ }
26
+ export function encodeUint64(field, value) {
27
+ if (value === undefined)
28
+ return undefined;
29
+ return Buffer.concat([encodeTag(field, WIRE_VARINT), encodeVarint(value)]);
30
+ }
31
+ export function encodeInt64(field, value) {
32
+ return encodeUint64(field, value);
33
+ }
34
+ export function encodeUint32(field, value) {
35
+ if (value === undefined)
36
+ return undefined;
37
+ if (!Number.isInteger(value) || value < 0)
38
+ throw new Error(`invalid uint32 value: ${value}`);
39
+ return Buffer.concat([encodeTag(field, WIRE_VARINT), encodeVarint(value)]);
40
+ }
41
+ export function encodeInt32(field, value) {
42
+ if (value === undefined)
43
+ return undefined;
44
+ if (!Number.isInteger(value))
45
+ throw new Error(`invalid int32 value: ${value}`);
46
+ if (value < 0)
47
+ throw new Error(`negative int32 values are not needed for realtime voice: ${value}`);
48
+ return Buffer.concat([encodeTag(field, WIRE_VARINT), encodeVarint(value)]);
49
+ }
50
+ export function encodeBool(field, value) {
51
+ if (value === undefined)
52
+ return undefined;
53
+ return Buffer.concat([encodeTag(field, WIRE_VARINT), encodeVarint(value ? 1 : 0)]);
54
+ }
55
+ export function encodeString(field, value, opts = {}) {
56
+ if (value === undefined)
57
+ return undefined;
58
+ if (value.length === 0 && opts.emitEmpty !== true)
59
+ return undefined;
60
+ const data = Buffer.from(value, 'utf8');
61
+ return Buffer.concat([encodeTag(field, WIRE_LEN), encodeVarint(data.length), data]);
62
+ }
63
+ export function encodeBytes(field, value, opts = {}) {
64
+ if (value === undefined)
65
+ return undefined;
66
+ if (value.length === 0 && opts.emitEmpty !== true)
67
+ return undefined;
68
+ return Buffer.concat([encodeTag(field, WIRE_LEN), encodeVarint(value.length), value]);
69
+ }
70
+ export function concatProtoFields(fields) {
71
+ return Buffer.concat(fields.filter((f) => Boolean(f)));
72
+ }
73
+ export function readVarint(data, offset = 0) {
74
+ let shift = 0n;
75
+ let value = 0n;
76
+ let pos = offset;
77
+ while (pos < data.length) {
78
+ const byte = data[pos];
79
+ value |= BigInt(byte & 0x7f) << shift;
80
+ pos += 1;
81
+ if ((byte & 0x80) === 0)
82
+ return { value, next: pos };
83
+ shift += 7n;
84
+ if (shift > 70n)
85
+ throw new Error('protobuf varint is too long');
86
+ }
87
+ throw new Error('truncated protobuf varint');
88
+ }
89
+ export function decodeProtoFields(data) {
90
+ const fields = [];
91
+ let offset = 0;
92
+ while (offset < data.length) {
93
+ const tag = readVarint(data, offset);
94
+ offset = tag.next;
95
+ const field = Number(tag.value >> 3n);
96
+ const wire = Number(tag.value & 0x07n);
97
+ if (field <= 0)
98
+ throw new Error(`invalid protobuf field tag: ${tag.value}`);
99
+ if (wire === WIRE_VARINT) {
100
+ const decoded = readVarint(data, offset);
101
+ offset = decoded.next;
102
+ fields.push({ field, wire, value: decoded.value });
103
+ continue;
104
+ }
105
+ if (wire === WIRE_LEN) {
106
+ const len = readVarint(data, offset);
107
+ offset = len.next;
108
+ const end = offset + Number(len.value);
109
+ if (end > data.length)
110
+ throw new Error('truncated protobuf length-delimited field');
111
+ fields.push({ field, wire, value: data.subarray(offset, end) });
112
+ offset = end;
113
+ continue;
114
+ }
115
+ if (wire === 1) {
116
+ offset += 8;
117
+ if (offset > data.length)
118
+ throw new Error('truncated protobuf fixed64 field');
119
+ continue;
120
+ }
121
+ if (wire === 5) {
122
+ offset += 4;
123
+ if (offset > data.length)
124
+ throw new Error('truncated protobuf fixed32 field');
125
+ continue;
126
+ }
127
+ throw new Error(`unsupported protobuf wire type: ${wire}`);
128
+ }
129
+ return fields;
130
+ }
131
+ export function firstField(fields, field) {
132
+ return fields.find(f => f.field === field);
133
+ }
134
+ export function fieldString(fields, field) {
135
+ const value = firstField(fields, field)?.value;
136
+ return Buffer.isBuffer(value) ? value.toString('utf8') : undefined;
137
+ }
138
+ export function fieldBytes(fields, field) {
139
+ const value = firstField(fields, field)?.value;
140
+ return Buffer.isBuffer(value) ? value : undefined;
141
+ }
142
+ export function fieldBigInt(fields, field) {
143
+ const value = firstField(fields, field)?.value;
144
+ return typeof value === 'bigint' ? value : undefined;
145
+ }
146
+ export function fieldNumber(fields, field) {
147
+ const value = fieldBigInt(fields, field);
148
+ if (value === undefined)
149
+ return undefined;
150
+ const n = Number(value);
151
+ if (!Number.isSafeInteger(n))
152
+ throw new Error(`protobuf integer is outside safe JS range: ${value}`);
153
+ return n;
154
+ }
155
+ export function fieldBool(fields, field) {
156
+ const value = fieldBigInt(fields, field);
157
+ return value === undefined ? undefined : value !== 0n;
158
+ }
159
+ //# sourceMappingURL=protobuf.js.map