@recombine-ai/platform 0.4.0 → 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 (169) hide show
  1. package/build/bosun-app/backend/server.js +1 -1
  2. package/build/bosun-app/backend/server.js.map +2 -2
  3. package/build/bosun-app/frontend/client/_app/immutable/chunks/{BEtU89l8.js → BfQeNRSV.js} +1 -1
  4. package/build/bosun-app/frontend/client/_app/immutable/chunks/BfQeNRSV.js.br +3 -0
  5. package/build/bosun-app/frontend/client/_app/immutable/chunks/BfQeNRSV.js.gz +0 -0
  6. package/build/bosun-app/frontend/client/_app/immutable/chunks/{BVp4hYzT.js → BwC8XjMu.js} +1 -1
  7. package/build/bosun-app/frontend/client/_app/immutable/chunks/BwC8XjMu.js.br +0 -0
  8. package/build/bosun-app/frontend/client/_app/immutable/chunks/BwC8XjMu.js.gz +0 -0
  9. package/build/bosun-app/frontend/client/_app/immutable/chunks/{zpyNGpfC.js → CKcQhCJC.js} +1 -1
  10. package/build/bosun-app/frontend/client/_app/immutable/chunks/CKcQhCJC.js.br +0 -0
  11. package/build/bosun-app/frontend/client/_app/immutable/chunks/CKcQhCJC.js.gz +0 -0
  12. package/build/bosun-app/frontend/client/_app/immutable/chunks/{BOj6p3qj.js → DWlUaO0d.js} +1 -1
  13. package/build/bosun-app/frontend/client/_app/immutable/chunks/DWlUaO0d.js.br +0 -0
  14. package/build/bosun-app/frontend/client/_app/immutable/chunks/DWlUaO0d.js.gz +0 -0
  15. package/build/bosun-app/frontend/client/_app/immutable/chunks/{CNWRsnQ2.js → dqHFzkrz.js} +1 -1
  16. package/build/bosun-app/frontend/client/_app/immutable/chunks/dqHFzkrz.js.br +0 -0
  17. package/build/bosun-app/frontend/client/_app/immutable/chunks/dqHFzkrz.js.gz +0 -0
  18. package/build/bosun-app/frontend/client/_app/immutable/entry/{app.DJfhEB0w.js → app.D21MRecj.js} +2 -2
  19. package/build/bosun-app/frontend/client/_app/immutable/entry/app.D21MRecj.js.br +0 -0
  20. package/build/bosun-app/frontend/client/_app/immutable/entry/app.D21MRecj.js.gz +0 -0
  21. package/build/bosun-app/frontend/client/_app/immutable/entry/start.CfsLMJez.js +1 -0
  22. package/build/bosun-app/frontend/client/_app/immutable/entry/start.CfsLMJez.js.br +0 -0
  23. package/build/bosun-app/frontend/client/_app/immutable/entry/start.CfsLMJez.js.gz +0 -0
  24. package/build/bosun-app/frontend/client/_app/immutable/nodes/{0.BrSNCmq3.js → 0.DTw_tt3s.js} +1 -1
  25. package/build/bosun-app/frontend/client/_app/immutable/nodes/0.DTw_tt3s.js.br +0 -0
  26. package/build/bosun-app/frontend/client/_app/immutable/nodes/0.DTw_tt3s.js.gz +0 -0
  27. package/build/bosun-app/frontend/client/_app/immutable/nodes/{1.br7GI-g3.js → 1.llCYq9Hg.js} +1 -1
  28. package/build/bosun-app/frontend/client/_app/immutable/nodes/1.llCYq9Hg.js.br +0 -0
  29. package/build/bosun-app/frontend/client/_app/immutable/nodes/1.llCYq9Hg.js.gz +0 -0
  30. package/build/bosun-app/frontend/client/_app/immutable/nodes/{10.BI2Z0Is-.js → 10.D9R5gFET.js} +1 -1
  31. package/build/bosun-app/frontend/client/_app/immutable/nodes/10.D9R5gFET.js.br +0 -0
  32. package/build/bosun-app/frontend/client/_app/immutable/nodes/10.D9R5gFET.js.gz +0 -0
  33. package/build/bosun-app/frontend/client/_app/immutable/nodes/{17.BpaLQSZh.js → 17.BJPfWzEW.js} +1 -1
  34. package/build/bosun-app/frontend/client/_app/immutable/nodes/17.BJPfWzEW.js.br +0 -0
  35. package/build/bosun-app/frontend/client/_app/immutable/nodes/17.BJPfWzEW.js.gz +0 -0
  36. package/build/bosun-app/frontend/client/_app/immutable/nodes/{18.CYbvSJai.js → 18.vMqDwRaL.js} +1 -1
  37. package/build/bosun-app/frontend/client/_app/immutable/nodes/18.vMqDwRaL.js.br +0 -0
  38. package/build/bosun-app/frontend/client/_app/immutable/nodes/18.vMqDwRaL.js.gz +0 -0
  39. package/build/bosun-app/frontend/client/_app/immutable/nodes/{2.BYBSEm-Y.js → 2.DqYksi1m.js} +1 -1
  40. package/build/bosun-app/frontend/client/_app/immutable/nodes/2.DqYksi1m.js.br +0 -0
  41. package/build/bosun-app/frontend/client/_app/immutable/nodes/2.DqYksi1m.js.gz +0 -0
  42. package/build/bosun-app/frontend/client/_app/immutable/nodes/{3.BuP4tAto.js → 3.DY4cCysm.js} +1 -1
  43. package/build/bosun-app/frontend/client/_app/immutable/nodes/3.DY4cCysm.js.br +0 -0
  44. package/build/bosun-app/frontend/client/_app/immutable/nodes/3.DY4cCysm.js.gz +0 -0
  45. package/build/bosun-app/frontend/client/_app/immutable/nodes/{4.Dlg932RB.js → 4.CT5azNVy.js} +1 -1
  46. package/build/bosun-app/frontend/client/_app/immutable/nodes/4.CT5azNVy.js.br +0 -0
  47. package/build/bosun-app/frontend/client/_app/immutable/nodes/4.CT5azNVy.js.gz +0 -0
  48. package/build/bosun-app/frontend/client/_app/immutable/nodes/{5.BWt6bVnz.js → 5.D3K2hLe5.js} +1 -1
  49. package/build/bosun-app/frontend/client/_app/immutable/nodes/5.D3K2hLe5.js.br +0 -0
  50. package/build/bosun-app/frontend/client/_app/immutable/nodes/5.D3K2hLe5.js.gz +0 -0
  51. package/build/bosun-app/frontend/client/_app/immutable/nodes/{6.DL1bd1xV.js → 6.C50_01kw.js} +1 -1
  52. package/build/bosun-app/frontend/client/_app/immutable/nodes/6.C50_01kw.js.br +0 -0
  53. package/build/bosun-app/frontend/client/_app/immutable/nodes/6.C50_01kw.js.gz +0 -0
  54. package/build/bosun-app/frontend/client/_app/immutable/nodes/{8.BJXaarvf.js → 8.BDWagOdA.js} +1 -1
  55. package/build/bosun-app/frontend/client/_app/immutable/nodes/8.BDWagOdA.js.br +0 -0
  56. package/build/bosun-app/frontend/client/_app/immutable/nodes/8.BDWagOdA.js.gz +0 -0
  57. package/build/bosun-app/frontend/client/_app/immutable/nodes/{9.DZnil4g8.js → 9.DjkNtG73.js} +1 -1
  58. package/build/bosun-app/frontend/client/_app/immutable/nodes/9.DjkNtG73.js.br +0 -0
  59. package/build/bosun-app/frontend/client/_app/immutable/nodes/9.DjkNtG73.js.gz +0 -0
  60. package/build/bosun-app/frontend/client/_app/version.json +1 -1
  61. package/build/bosun-app/frontend/client/_app/version.json.br +0 -0
  62. package/build/bosun-app/frontend/client/_app/version.json.gz +0 -0
  63. package/build/bosun-app/frontend/handler.js +4 -4
  64. package/build/bosun-app/frontend/index.js +4 -4
  65. package/build/bosun-app/frontend/server/chunks/chunks/{internal.js-Bu4L_cnE.js → internal.js-CZxAejkO.js} +2 -2
  66. package/build/bosun-app/frontend/server/chunks/chunks/{internal.js-Bu4L_cnE.js.map → internal.js-CZxAejkO.js.map} +1 -1
  67. package/build/bosun-app/frontend/server/chunks/{handler-Caqo1h-B.js → handler-Jnrg3wPg.js} +3 -3
  68. package/build/bosun-app/frontend/server/chunks/{handler-Caqo1h-B.js.map → handler-Jnrg3wPg.js.map} +1 -1
  69. package/build/bosun-app/frontend/server/chunks/{index.js-B6JFIJIn.js → index.js-CHqxWZDr.js} +2 -2
  70. package/build/bosun-app/frontend/server/chunks/{index.js-B6JFIJIn.js.map → index.js-CHqxWZDr.js.map} +1 -1
  71. package/build/bosun-app/frontend/server/chunks/{manifest.js-BQmpznei.js → manifest.js-DmcqihPV.js} +14 -14
  72. package/build/bosun-app/frontend/server/chunks/{manifest.js-BQmpznei.js.map → manifest.js-DmcqihPV.js.map} +1 -1
  73. package/build/bosun-app/frontend/server/chunks/nodes/{0.js-DFPCfgZg.js → 0.js-AzmZoy1E.js} +2 -2
  74. package/build/bosun-app/frontend/server/chunks/nodes/{0.js-DFPCfgZg.js.map → 0.js-AzmZoy1E.js.map} +1 -1
  75. package/build/bosun-app/frontend/server/chunks/nodes/{1.js-BujyKhW9.js → 1.js-DHw5LmcV.js} +2 -2
  76. package/build/bosun-app/frontend/server/chunks/nodes/{1.js-BujyKhW9.js.map → 1.js-DHw5LmcV.js.map} +1 -1
  77. package/build/bosun-app/frontend/server/chunks/nodes/{10.js-Dbiu4FpX.js → 10.js-Bma8SASV.js} +2 -2
  78. package/build/bosun-app/frontend/server/chunks/nodes/{10.js-Dbiu4FpX.js.map → 10.js-Bma8SASV.js.map} +1 -1
  79. package/build/bosun-app/frontend/server/chunks/nodes/{17.js-9Acvxo6X.js → 17.js-CDQ0obMk.js} +2 -2
  80. package/build/bosun-app/frontend/server/chunks/nodes/{17.js-9Acvxo6X.js.map → 17.js-CDQ0obMk.js.map} +1 -1
  81. package/build/bosun-app/frontend/server/chunks/nodes/{18.js-D294qrHb.js → 18.js-3gRfKzfa.js} +2 -2
  82. package/build/bosun-app/frontend/server/chunks/nodes/{18.js-D294qrHb.js.map → 18.js-3gRfKzfa.js.map} +1 -1
  83. package/build/bosun-app/frontend/server/chunks/nodes/{2.js-DiVDZRco.js → 2.js-BxBjD7OX.js} +2 -2
  84. package/build/bosun-app/frontend/server/chunks/nodes/{2.js-DiVDZRco.js.map → 2.js-BxBjD7OX.js.map} +1 -1
  85. package/build/bosun-app/frontend/server/chunks/nodes/{3.js-DiaPSM0a.js → 3.js-bfS0t-8E.js} +2 -2
  86. package/build/bosun-app/frontend/server/chunks/nodes/{3.js-DiaPSM0a.js.map → 3.js-bfS0t-8E.js.map} +1 -1
  87. package/build/bosun-app/frontend/server/chunks/nodes/{4.js-DQhC-gZ_.js → 4.js--eSSRL0B.js} +2 -2
  88. package/build/bosun-app/frontend/server/chunks/nodes/{4.js-DQhC-gZ_.js.map → 4.js--eSSRL0B.js.map} +1 -1
  89. package/build/bosun-app/frontend/server/chunks/nodes/{5.js-C3vjOcSE.js → 5.js-D6sqQZLO.js} +2 -2
  90. package/build/bosun-app/frontend/server/chunks/nodes/{5.js-C3vjOcSE.js.map → 5.js-D6sqQZLO.js.map} +1 -1
  91. package/build/bosun-app/frontend/server/chunks/nodes/{6.js-DpCeETlI.js → 6.js-DAEsXANu.js} +2 -2
  92. package/build/bosun-app/frontend/server/chunks/nodes/{6.js-DpCeETlI.js.map → 6.js-DAEsXANu.js.map} +1 -1
  93. package/build/bosun-app/frontend/server/chunks/nodes/{8.js-BjNCuX0D.js → 8.js-CaZXsO-L.js} +2 -2
  94. package/build/bosun-app/frontend/server/chunks/nodes/{8.js-BjNCuX0D.js.map → 8.js-CaZXsO-L.js.map} +1 -1
  95. package/build/bosun-app/frontend/server/chunks/nodes/{9.js-BuUuEII0.js → 9.js-B8aSYLuv.js} +2 -2
  96. package/build/bosun-app/frontend/server/chunks/nodes/{9.js-BuUuEII0.js.map → 9.js-B8aSYLuv.js.map} +1 -1
  97. package/build/core/{make-text-platform.d.ts → get-text-platform.d.ts} +3 -3
  98. package/build/core/get-text-platform.d.ts.map +1 -0
  99. package/build/core/{make-text-platform.js → get-text-platform.js} +7 -3
  100. package/build/core/{make-voice-platform.d.ts → get-voice-platform.d.ts} +3 -3
  101. package/build/core/get-voice-platform.d.ts.map +1 -0
  102. package/build/core/{make-voice-platform.js → get-voice-platform.js} +7 -3
  103. package/build/core/index.d.ts +4 -4
  104. package/build/core/index.d.ts.map +1 -1
  105. package/build/core/index.js +2 -2
  106. package/build/engine/interfaces/other.d.ts +1 -1
  107. package/build/engine/interfaces/other.d.ts.map +1 -1
  108. package/build/engine/stream/get-client.d.ts.map +1 -1
  109. package/build/engine/stream/get-client.js +8 -102
  110. package/build/text-agent-handlers/incoming-message.d.ts +3 -2
  111. package/build/text-agent-handlers/incoming-message.d.ts.map +1 -1
  112. package/build/text-agent-handlers/incoming-message.js +8 -10
  113. package/build/text-agent-handlers/index.d.ts +1 -1
  114. package/build/text-agent-handlers/index.d.ts.map +1 -1
  115. package/build/text-agent-handlers/instrument.d.ts +0 -1
  116. package/build/text-agent-handlers/instrument.d.ts.map +1 -1
  117. package/build/text-agent-handlers/instrument.js +5 -5
  118. package/build/text-agent-handlers/jobs-handler.d.ts +3 -2
  119. package/build/text-agent-handlers/jobs-handler.d.ts.map +1 -1
  120. package/build/text-agent-handlers/jobs-handler.js +12 -9
  121. package/build/text-agent-handlers/jobs.d.ts +1 -1
  122. package/build/text-agent-handlers/jobs.d.ts.map +1 -1
  123. package/build/text-agent-handlers/ports.d.ts +2 -4
  124. package/build/text-agent-handlers/ports.d.ts.map +1 -1
  125. package/build/text-agent-handlers/ports.js +12 -0
  126. package/build/voice-agent-api/voice-http.d.ts.map +1 -1
  127. package/build/voice-agent-api/voice-http.js +9 -26
  128. package/package.json +1 -1
  129. package/build/bosun-app/frontend/client/_app/immutable/chunks/BEtU89l8.js.br +0 -0
  130. package/build/bosun-app/frontend/client/_app/immutable/chunks/BEtU89l8.js.gz +0 -0
  131. package/build/bosun-app/frontend/client/_app/immutable/chunks/BOj6p3qj.js.br +0 -0
  132. package/build/bosun-app/frontend/client/_app/immutable/chunks/BOj6p3qj.js.gz +0 -0
  133. package/build/bosun-app/frontend/client/_app/immutable/chunks/BVp4hYzT.js.br +0 -0
  134. package/build/bosun-app/frontend/client/_app/immutable/chunks/BVp4hYzT.js.gz +0 -0
  135. package/build/bosun-app/frontend/client/_app/immutable/chunks/CNWRsnQ2.js.br +0 -0
  136. package/build/bosun-app/frontend/client/_app/immutable/chunks/CNWRsnQ2.js.gz +0 -0
  137. package/build/bosun-app/frontend/client/_app/immutable/chunks/zpyNGpfC.js.br +0 -0
  138. package/build/bosun-app/frontend/client/_app/immutable/chunks/zpyNGpfC.js.gz +0 -0
  139. package/build/bosun-app/frontend/client/_app/immutable/entry/app.DJfhEB0w.js.br +0 -0
  140. package/build/bosun-app/frontend/client/_app/immutable/entry/app.DJfhEB0w.js.gz +0 -0
  141. package/build/bosun-app/frontend/client/_app/immutable/entry/start.CvCep2Ct.js +0 -1
  142. package/build/bosun-app/frontend/client/_app/immutable/entry/start.CvCep2Ct.js.br +0 -0
  143. package/build/bosun-app/frontend/client/_app/immutable/entry/start.CvCep2Ct.js.gz +0 -0
  144. package/build/bosun-app/frontend/client/_app/immutable/nodes/0.BrSNCmq3.js.br +0 -0
  145. package/build/bosun-app/frontend/client/_app/immutable/nodes/0.BrSNCmq3.js.gz +0 -0
  146. package/build/bosun-app/frontend/client/_app/immutable/nodes/1.br7GI-g3.js.br +0 -0
  147. package/build/bosun-app/frontend/client/_app/immutable/nodes/1.br7GI-g3.js.gz +0 -0
  148. package/build/bosun-app/frontend/client/_app/immutable/nodes/10.BI2Z0Is-.js.br +0 -0
  149. package/build/bosun-app/frontend/client/_app/immutable/nodes/10.BI2Z0Is-.js.gz +0 -0
  150. package/build/bosun-app/frontend/client/_app/immutable/nodes/17.BpaLQSZh.js.br +0 -0
  151. package/build/bosun-app/frontend/client/_app/immutable/nodes/17.BpaLQSZh.js.gz +0 -0
  152. package/build/bosun-app/frontend/client/_app/immutable/nodes/18.CYbvSJai.js.br +0 -0
  153. package/build/bosun-app/frontend/client/_app/immutable/nodes/18.CYbvSJai.js.gz +0 -0
  154. package/build/bosun-app/frontend/client/_app/immutable/nodes/2.BYBSEm-Y.js.br +0 -0
  155. package/build/bosun-app/frontend/client/_app/immutable/nodes/2.BYBSEm-Y.js.gz +0 -0
  156. package/build/bosun-app/frontend/client/_app/immutable/nodes/3.BuP4tAto.js.br +0 -0
  157. package/build/bosun-app/frontend/client/_app/immutable/nodes/3.BuP4tAto.js.gz +0 -0
  158. package/build/bosun-app/frontend/client/_app/immutable/nodes/4.Dlg932RB.js.br +0 -0
  159. package/build/bosun-app/frontend/client/_app/immutable/nodes/4.Dlg932RB.js.gz +0 -0
  160. package/build/bosun-app/frontend/client/_app/immutable/nodes/5.BWt6bVnz.js.br +0 -0
  161. package/build/bosun-app/frontend/client/_app/immutable/nodes/5.BWt6bVnz.js.gz +0 -0
  162. package/build/bosun-app/frontend/client/_app/immutable/nodes/6.DL1bd1xV.js.br +0 -0
  163. package/build/bosun-app/frontend/client/_app/immutable/nodes/6.DL1bd1xV.js.gz +0 -0
  164. package/build/bosun-app/frontend/client/_app/immutable/nodes/8.BJXaarvf.js.br +0 -0
  165. package/build/bosun-app/frontend/client/_app/immutable/nodes/8.BJXaarvf.js.gz +0 -0
  166. package/build/bosun-app/frontend/client/_app/immutable/nodes/9.DZnil4g8.js.br +0 -0
  167. package/build/bosun-app/frontend/client/_app/immutable/nodes/9.DZnil4g8.js.gz +0 -0
  168. package/build/core/make-text-platform.d.ts.map +0 -1
  169. package/build/core/make-voice-platform.d.ts.map +0 -1
@@ -3,7 +3,7 @@ import { ContextCache } from '../context-cache';
3
3
  import { LlmAdapter, Scheduler } from '../engine';
4
4
  import type { ITelescope } from '../telescope';
5
5
  import { IModels, TextPlatform } from './platform';
6
- export interface MakeTextPlatformOptions<TContext extends object> {
6
+ export interface TextPlatformOptions<TContext extends object> {
7
7
  telescope: ITelescope;
8
8
  scheduler: Scheduler;
9
9
  promptBasePath: string;
@@ -11,5 +11,5 @@ export interface MakeTextPlatformOptions<TContext extends object> {
11
11
  contextCache?: ContextCache<TContext>;
12
12
  nunjucksEnv?: nunjucks.Environment;
13
13
  }
14
- export declare function makeTextPlatform<TContext extends object, TModels extends IModels>(models: TModels, options: MakeTextPlatformOptions<TContext>): TextPlatform<TContext, TModels>;
15
- //# sourceMappingURL=make-text-platform.d.ts.map
14
+ export declare function getTextPlatform<TContext extends object, TModels extends IModels>(models: TModels, options: TextPlatformOptions<TContext>): TextPlatform<TContext, TModels>;
15
+ //# sourceMappingURL=get-text-platform.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-text-platform.d.ts","sourceRoot":"","sources":["../../src/core/get-text-platform.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,UAAU,CAAA;AAEpC,OAAO,EAAE,YAAY,EAAuB,MAAM,kBAAkB,CAAA;AAEpE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAiC,MAAM,WAAW,CAAA;AAEhF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAC9C,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAIlD,MAAM,WAAW,mBAAmB,CAAC,QAAQ,SAAS,MAAM;IACxD,SAAS,EAAE,UAAU,CAAA;IAErB,SAAS,EAAE,SAAS,CAAA;IACpB,cAAc,EAAE,MAAM,CAAA;IAEtB,iBAAiB,EAAE,UAAU,CAAA;IAE7B,YAAY,CAAC,EAAE,YAAY,CAAC,QAAQ,CAAC,CAAA;IAErC,WAAW,CAAC,EAAE,QAAQ,CAAC,WAAW,CAAA;CACrC;AAUD,wBAAgB,eAAe,CAAC,QAAQ,SAAS,MAAM,EAAE,OAAO,SAAS,OAAO,EAC5E,MAAM,EAAE,OAAO,EACf,OAAO,EAAE,mBAAmB,CAAC,QAAQ,CAAC,GACvC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAGjC"}
@@ -3,9 +3,14 @@ import createLogger from '../dockyard';
3
3
  import { createAIEngine, createLocalFS } from '../engine';
4
4
  import { createSlotBooker } from '../steps';
5
5
  const logger = createLogger();
6
- export function makeTextPlatform(models, options) {
6
+ let platform;
7
+ export function getTextPlatform(models, options) {
8
+ platform ??= makeTextPlatform(models, options);
9
+ return platform;
10
+ }
11
+ function makeTextPlatform(models, options) {
7
12
  const { telescope, scheduler, promptBasePath, slotBookerAdapter, contextCache = createInMemoryCache(), nunjucksEnv, } = options;
8
- const platform = {
13
+ return {
9
14
  scheduler,
10
15
  contextCache,
11
16
  ai: createAIEngine({
@@ -23,5 +28,4 @@ export function makeTextPlatform(models, options) {
23
28
  }),
24
29
  ...models,
25
30
  };
26
- return platform;
27
31
  }
@@ -4,7 +4,7 @@ import { LlmAdapter } from '../engine';
4
4
  import type { ITelescope } from '../telescope';
5
5
  import { TimeoutsState } from '../timeout-manager';
6
6
  import { IModels, VoicePlatform } from './platform';
7
- export interface MakeVoicePlatformOptions<TContext extends object> {
7
+ export interface VoicePlatformOptions<TContext extends object> {
8
8
  telescope: ITelescope;
9
9
  callControl: CallControl;
10
10
  slotBookerAdapter: LlmAdapter;
@@ -12,5 +12,5 @@ export interface MakeVoicePlatformOptions<TContext extends object> {
12
12
  timeoutsCache?: ContextCache<TimeoutsState>;
13
13
  promptBasePath?: string;
14
14
  }
15
- export declare function makeVoicePlatform<TContext extends object, TModels extends IModels>(models: TModels, options: MakeVoicePlatformOptions<TContext>): VoicePlatform<TContext, TModels>;
16
- //# sourceMappingURL=make-voice-platform.d.ts.map
15
+ export declare function getVoicePlatform<TContext extends object, TModels extends IModels>(models: TModels, options: VoicePlatformOptions<TContext>): VoicePlatform<TContext, TModels>;
16
+ //# sourceMappingURL=get-voice-platform.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-voice-platform.d.ts","sourceRoot":"","sources":["../../src/core/get-voice-platform.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,WAAW,MAAM,iBAAiB,CAAA;AAC9C,OAAO,EAAE,YAAY,EAAuB,MAAM,kBAAkB,CAAA;AAEpE,OAAO,EAAE,UAAU,EAAgE,MAAM,WAAW,CAAA;AAEpG,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAC9C,OAAO,EAAkB,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAClE,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAInD,MAAM,WAAW,oBAAoB,CAAC,QAAQ,SAAS,MAAM;IACzD,SAAS,EAAE,UAAU,CAAA;IAErB,WAAW,EAAE,WAAW,CAAA;IAExB,iBAAiB,EAAE,UAAU,CAAA;IAE7B,YAAY,CAAC,EAAE,YAAY,CAAC,QAAQ,CAAC,CAAA;IAErC,aAAa,CAAC,EAAE,YAAY,CAAC,aAAa,CAAC,CAAA;IAE3C,cAAc,CAAC,EAAE,MAAM,CAAA;CAC1B;AAUD,wBAAgB,gBAAgB,CAAC,QAAQ,SAAS,MAAM,EAAE,OAAO,SAAS,OAAO,EAC7E,MAAM,EAAE,OAAO,EACf,OAAO,EAAE,oBAAoB,CAAC,QAAQ,CAAC,GACxC,aAAa,CAAC,QAAQ,EAAE,OAAO,CAAC,CAGlC"}
@@ -5,7 +5,12 @@ import { createAIEngine, createAIStreamEngine, createLocalFS } from '../engine';
5
5
  import { createSlotBooker } from '../steps';
6
6
  import { TimeoutManager } from '../timeout-manager';
7
7
  const logger = createLogger();
8
- export function makeVoicePlatform(models, options) {
8
+ let platform;
9
+ export function getVoicePlatform(models, options) {
10
+ platform ??= makeVoicePlatform(models, options);
11
+ return platform;
12
+ }
13
+ function makeVoicePlatform(models, options) {
9
14
  const { telescope, callControl, slotBookerAdapter, contextCache = createInMemoryCache(), timeoutsCache = createInMemoryCache(), promptBasePath = path.join(process.cwd(), '/src/agents'), } = options;
10
15
  const streamAi = createAIStreamEngine({
11
16
  stepRegistry: { addStep: () => { } },
@@ -23,7 +28,7 @@ export function makeVoicePlatform(models, options) {
23
28
  specificInstructionsBasePath: promptBasePath,
24
29
  llmAdapter: slotBookerAdapter,
25
30
  });
26
- const platform = {
31
+ return {
27
32
  ai,
28
33
  fs: createLocalFS({ basePath: promptBasePath }),
29
34
  logger,
@@ -35,7 +40,6 @@ export function makeVoicePlatform(models, options) {
35
40
  telescope,
36
41
  ...models,
37
42
  };
38
- return platform;
39
43
  }
40
44
  const loggingStepRegistry = {
41
45
  addStep: (step) => {
@@ -1,6 +1,6 @@
1
1
  export type { BasePlatform, IModels, OmnichannelPlatform, TextPlatform, VoicePlatform, } from './platform';
2
- export { makeVoicePlatform } from './make-voice-platform';
3
- export type { MakeVoicePlatformOptions } from './make-voice-platform';
4
- export { makeTextPlatform } from './make-text-platform';
5
- export type { MakeTextPlatformOptions } from './make-text-platform';
2
+ export { getVoicePlatform } from './get-voice-platform';
3
+ export type { VoicePlatformOptions } from './get-voice-platform';
4
+ export { getTextPlatform } from './get-text-platform';
5
+ export type { TextPlatformOptions } from './get-text-platform';
6
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACR,YAAY,EACZ,OAAO,EACP,mBAAmB,EACnB,YAAY,EACZ,aAAa,GAChB,MAAM,YAAY,CAAA;AACnB,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAA;AACzD,YAAY,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAA;AACrE,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AACvD,YAAY,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACR,YAAY,EACZ,OAAO,EACP,mBAAmB,EACnB,YAAY,EACZ,aAAa,GAChB,MAAM,YAAY,CAAA;AACnB,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AACvD,YAAY,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAA;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AACrD,YAAY,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAA"}
@@ -1,2 +1,2 @@
1
- export { makeVoicePlatform } from './make-voice-platform';
2
- export { makeTextPlatform } from './make-text-platform';
1
+ export { getVoicePlatform } from './get-voice-platform';
2
+ export { getTextPlatform } from './get-text-platform';
@@ -1,7 +1,7 @@
1
1
  export type { Logger } from '../../dockyard';
2
2
  export type ScheduleAction = (delay: Date, phone: string) => Promise<void>;
3
3
  export interface Scheduler {
4
- registerAction: (actionName: string, action: (phone: string) => Promise<unknown>) => ScheduleAction;
4
+ registerAction: (agentId: string, actionName: string, action: (phone: string) => Promise<unknown>) => ScheduleAction;
5
5
  clearAllPendingActions: (phone: string) => Promise<unknown>;
6
6
  }
7
7
  //# sourceMappingURL=other.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"other.d.ts","sourceRoot":"","sources":["../../../src/engine/interfaces/other.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AAQ5C,MAAM,MAAM,cAAc,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;AAE1E,MAAM,WAAW,SAAS;IAOtB,cAAc,EAAE,CACZ,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,KAC1C,cAAc,CAAA;IAKnB,sBAAsB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;CAC9D"}
1
+ {"version":3,"file":"other.d.ts","sourceRoot":"","sources":["../../../src/engine/interfaces/other.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AAQ5C,MAAM,MAAM,cAAc,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;AAG1E,MAAM,WAAW,SAAS;IAQtB,cAAc,EAAE,CACZ,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,KAC1C,cAAc,CAAA;IAKnB,sBAAsB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;CAC9D"}
@@ -1 +1 @@
1
- {"version":3,"file":"get-client.d.ts","sourceRoot":"","sources":["../../../src/engine/stream/get-client.ts"],"names":[],"mappings":"AACA,OAAO,MAAM,EAAE,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAA;AAG5C,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAA;AAEtC,UAAU,WAAW;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,MAAM,CAAA;IAClB,MAAM,EAAE,MAAM,CAAA;CACjB;AAED,UAAU,YAAY;IAClB,MAAM,EAAE,MAAM,CAAA;CACjB;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,eASjE;AACD,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,UAMnE"}
1
+ {"version":3,"file":"get-client.d.ts","sourceRoot":"","sources":["../../../src/engine/stream/get-client.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,EAAE,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAA;AAG5C,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAA;AAEtC,UAAU,WAAW;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,MAAM,CAAA;IAClB,MAAM,EAAE,MAAM,CAAA;CACjB;AAED,UAAU,YAAY;IAClB,MAAM,EAAE,MAAM,CAAA;CACjB;AAeD,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,eASjE;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,UAMnE"}
@@ -1,5 +1,10 @@
1
1
  import OpenAI, { AzureOpenAI } from 'openai';
2
- import { Client as HttpClient } from 'undici';
2
+ import { Agent } from 'undici';
3
+ const dispatcher = new Agent({
4
+ keepAliveTimeout: 120_000,
5
+ headersTimeout: 30_000,
6
+ bodyTimeout: 60_000,
7
+ });
3
8
  export function getAzureClient(logger, config) {
4
9
  logger.debug(`getting azure client: ${config.endpoint}, v: ${config.apiVersion}`);
5
10
  return new AzureOpenAI({
@@ -7,112 +12,13 @@ export function getAzureClient(logger, config) {
7
12
  apiVersion: config.apiVersion,
8
13
  endpoint: config.endpoint,
9
14
  deployment: config.deployment,
10
- fetch: getOptimizedFetch(logger, new URL(config.endpoint).origin),
15
+ fetchOptions: { dispatcher },
11
16
  });
12
17
  }
13
18
  export function getOpenAiClient(logger, config) {
14
19
  logger.debug(`getting OpenAi client.`);
15
20
  return new OpenAI({
16
21
  apiKey: config.apiKey,
17
- fetch: getOptimizedFetch(logger, 'https://api.openai.com'),
22
+ fetchOptions: { dispatcher },
18
23
  });
19
24
  }
20
- function getOptimizedFetch(logger, url) {
21
- const defaultHeaders = {
22
- 'content-type': 'application/json',
23
- accept: 'application/json',
24
- connection: 'keep-alive',
25
- };
26
- const httpClient = new HttpClient(url, {
27
- keepAliveTimeout: 120_000,
28
- keepAliveMaxTimeout: 300_000,
29
- pipelining: 10,
30
- connect: {
31
- noDelay: true,
32
- keepAlive: true,
33
- rejectUnauthorized: false,
34
- },
35
- maxCachedSessions: 100,
36
- headersTimeout: 30000,
37
- bodyTimeout: 60000,
38
- });
39
- process.on('SIGTERM', () => {
40
- void httpClient.close();
41
- });
42
- process.on('SIGINT', () => {
43
- void httpClient.close();
44
- });
45
- async function customFetch(url, options = {}) {
46
- const requestUrl = url instanceof Request ? url.url : url.toString();
47
- const method = options.method || 'GET';
48
- logger.debug('Optimized Fetch', { method, url });
49
- const originalHeaders = options.headers instanceof Headers
50
- ? Object.fromEntries(options.headers.entries())
51
- : options.headers;
52
- const headers = {
53
- ...defaultHeaders,
54
- ...(originalHeaders || {}),
55
- };
56
- const response = await httpClient.request({
57
- path: new URL(requestUrl).pathname + new URL(requestUrl).search,
58
- method,
59
- headers,
60
- body: options.body,
61
- origin: new URL(requestUrl).origin,
62
- });
63
- const responseHeaders = new Headers();
64
- Object.entries(response.headers).forEach(([key, value]) => {
65
- if (Array.isArray(value)) {
66
- value.forEach((v) => responseHeaders.append(key, v));
67
- }
68
- else if (value !== undefined) {
69
- responseHeaders.append(key, value);
70
- }
71
- });
72
- if (response.statusCode === 429) {
73
- logger.debug('LLM provider returned 429', { url: requestUrl });
74
- }
75
- let canceled = false;
76
- return new Response(new ReadableStream({
77
- cancel() {
78
- canceled = true;
79
- },
80
- start(controller) {
81
- response.body.on('data', (chunk) => {
82
- if (canceled)
83
- return;
84
- try {
85
- controller.enqueue(chunk);
86
- }
87
- catch (e) {
88
- logger.error(e);
89
- }
90
- });
91
- response.body.on('end', () => {
92
- if (canceled)
93
- return;
94
- try {
95
- controller.close();
96
- }
97
- catch (e) {
98
- logger.error(e);
99
- }
100
- });
101
- response.body.on('error', (err) => {
102
- if (canceled)
103
- return;
104
- try {
105
- controller.error(err);
106
- }
107
- catch (e) {
108
- logger.error(e);
109
- }
110
- });
111
- },
112
- }), {
113
- status: response.statusCode,
114
- headers: responseHeaders,
115
- });
116
- }
117
- return customFetch;
118
- }
@@ -1,10 +1,11 @@
1
1
  import type { Logger } from '../dockyard';
2
2
  import type { Event } from './event';
3
- import type { AgentCreator, AgentRegistry, ChatLockStore } from './ports';
3
+ import type { AgentRegistry, ChatLockStore, GetTextAgent, JobRunner } from './ports';
4
4
  export interface IncomingMessageOptions<TMeta> {
5
5
  registry: AgentRegistry;
6
6
  chatLocks: ChatLockStore;
7
- getAgentCreator: (agentId: string) => AgentCreator<TMeta> | null;
7
+ scheduler: JobRunner;
8
+ getTextAgent: GetTextAgent<TMeta>;
8
9
  parseMetadata: (event: Event) => Event<TMeta>;
9
10
  logger: Logger;
10
11
  delays?: {
@@ -1 +1 @@
1
- {"version":3,"file":"incoming-message.d.ts","sourceRoot":"","sources":["../../src/text-agent-handlers/incoming-message.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACzC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AACpC,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAY,aAAa,EAAE,MAAM,SAAS,CAAA;AAYnF,MAAM,WAAW,sBAAsB,CAAC,KAAK;IACzC,QAAQ,EAAE,aAAa,CAAA;IACvB,SAAS,EAAE,aAAa,CAAA;IACxB,eAAe,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,YAAY,CAAC,KAAK,CAAC,GAAG,IAAI,CAAA;IAChE,aAAa,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,KAAK,CAAC,KAAK,CAAC,CAAA;IAC7C,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE;QAAE,cAAc,CAAC,EAAE,MAAM,CAAC;QAAC,cAAc,CAAC,EAAE,MAAM,CAAC;QAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CAC3F;AAOD,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,OAAO,EAAE,sBAAsB,CAAC,KAAK,CAAC,IAuI1C,OAAO,KAAK,KAAG,OAAO,CAAC,IAAI,CAAC,CAW3E"}
1
+ {"version":3,"file":"incoming-message.d.ts","sourceRoot":"","sources":["../../src/text-agent-handlers/incoming-message.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACzC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AACpC,OAAO,KAAK,EAAE,aAAa,EAAY,aAAa,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAa9F,MAAM,WAAW,sBAAsB,CAAC,KAAK;IACzC,QAAQ,EAAE,aAAa,CAAA;IACvB,SAAS,EAAE,aAAa,CAAA;IAExB,SAAS,EAAE,SAAS,CAAA;IAEpB,YAAY,EAAE,YAAY,CAAC,KAAK,CAAC,CAAA;IACjC,aAAa,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,KAAK,CAAC,KAAK,CAAC,CAAA;IAC7C,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE;QAAE,cAAc,CAAC,EAAE,MAAM,CAAC;QAAC,cAAc,CAAC,EAAE,MAAM,CAAC;QAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CAC3F;AAOD,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,OAAO,EAAE,sBAAsB,CAAC,KAAK,CAAC,IAmI1C,OAAO,KAAK,KAAG,OAAO,CAAC,IAAI,CAAC,CAW3E"}
@@ -1,3 +1,4 @@
1
+ import { cacheTextAgents } from './ports';
1
2
  const DEFAULT_MESSAGE_DELAY_SECONDS = 60;
2
3
  const DEFAULT_WEBCHAT_DELAY_SECONDS = 30;
3
4
  const DEFAULT_TIME_LIMIT_SECONDS = 14 * 60;
@@ -6,27 +7,24 @@ const isAfter = (date, dateToCompare) => date.getTime() > dateToCompare.getTime(
6
7
  const differenceInMilliseconds = (later, earlier) => later.getTime() - earlier.getTime();
7
8
  const differenceInSeconds = (later, earlier) => Math.trunc(differenceInMilliseconds(later, earlier) / 1000);
8
9
  export function createIncomingMessageHandler(options) {
9
- const { registry, chatLocks, getAgentCreator, parseMetadata, logger, delays = {} } = options;
10
+ const { registry, chatLocks, scheduler, parseMetadata, logger, delays = {} } = options;
11
+ const getTextAgent = cacheTextAgents(options.getTextAgent);
10
12
  const messageDelaySeconds = delays.messageSeconds ?? DEFAULT_MESSAGE_DELAY_SECONDS;
11
13
  const webchatDelaySeconds = delays.webchatSeconds ?? DEFAULT_WEBCHAT_DELAY_SECONDS;
12
14
  const timeLimitSeconds = delays.timeLimitSeconds ?? DEFAULT_TIME_LIMIT_SECONDS;
13
- async function createAgent(conversationId) {
15
+ async function getAgent(conversationId) {
14
16
  const agentRecord = await registry.getAgent(conversationId);
15
17
  if (!agentRecord) {
16
18
  throw new Error(`incoming-message, agent not found for ${conversationId}`);
17
19
  }
18
- const agentCreator = getAgentCreator(agentRecord.agentId);
19
- if (!agentCreator) {
20
- throw new Error(`incoming-message, agent creator not found for ${agentRecord.agentId}`);
21
- }
22
- const { agent, scheduler } = await agentCreator(conversationId, agentRecord.agentId);
23
- return { agent, scheduler, agentRecord };
20
+ const agent = await getTextAgent(agentRecord.agentId);
21
+ return { agent, agentRecord };
24
22
  }
25
23
  async function handleChatMessage(event) {
26
24
  logger.debug('incoming-message.handleChatMessage, handling message', {
27
25
  conversationId: event.conversationId,
28
26
  });
29
- const { agent, scheduler, agentRecord } = await createAgent(event.conversationId);
27
+ const { agent, agentRecord } = await getAgent(event.conversationId);
30
28
  let shouldContinue = true;
31
29
  try {
32
30
  if (!(await agent.isAssigned(event.conversationId))) {
@@ -70,7 +68,7 @@ export function createIncomingMessageHandler(options) {
70
68
  conversationId: event.conversationId,
71
69
  });
72
70
  const currentLock = chatLock ?? (await chatLocks.getChatLock(event.conversationId));
73
- const { agent, scheduler, agentRecord } = await createAgent(event.conversationId);
71
+ const { agent, agentRecord } = await getAgent(event.conversationId);
74
72
  if (currentLock)
75
73
  logger.debug('incoming-message.handleMessageOnLockRelease, is chat lock expired', {
76
74
  isExpired: isAfter(new Date(), currentLock.expiresAt),
@@ -1,7 +1,7 @@
1
1
  export { CHANNEL_TYPES } from './event';
2
2
  export type { ChannelType, Event } from './event';
3
3
  export type { Job, JobInput, JobsPersistence } from './jobs';
4
- export type { AgentCreator, AgentRecord, AgentRegistry, ChatLock, ChatLockStore, HandlerResponse, JobRunner, } from './ports';
4
+ export type { AgentRecord, AgentRegistry, ChatLock, ChatLockStore, GetTextAgent, HandlerResponse, JobRunner, } from './ports';
5
5
  export { createIncomingMessageHandler } from './incoming-message';
6
6
  export type { IncomingMessageOptions } from './incoming-message';
7
7
  export { createJobsHandler } from './jobs-handler';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/text-agent-handlers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AACvC,YAAY,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AACjD,YAAY,EAAE,GAAG,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAA;AAC5D,YAAY,EACR,YAAY,EACZ,WAAW,EACX,aAAa,EACb,QAAQ,EACR,aAAa,EACb,eAAe,EACf,SAAS,GACZ,MAAM,SAAS,CAAA;AAChB,OAAO,EAAE,4BAA4B,EAAE,MAAM,oBAAoB,CAAA;AACjE,YAAY,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAA;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AAClD,YAAY,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AACxD,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAA;AAC1D,YAAY,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAA;AAChE,OAAO,EAAE,6BAA6B,EAAE,MAAM,qBAAqB,CAAA;AACnE,YAAY,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAA;AAC3F,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAClD,YAAY,EAAE,0BAA0B,EAAE,MAAM,cAAc,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/text-agent-handlers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AACvC,YAAY,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AACjD,YAAY,EAAE,GAAG,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAA;AAC5D,YAAY,EACR,WAAW,EACX,aAAa,EACb,QAAQ,EACR,aAAa,EACb,YAAY,EACZ,eAAe,EACf,SAAS,GACZ,MAAM,SAAS,CAAA;AAChB,OAAO,EAAE,4BAA4B,EAAE,MAAM,oBAAoB,CAAA;AACjE,YAAY,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAA;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AAClD,YAAY,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AACxD,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAA;AAC1D,YAAY,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAA;AAChE,OAAO,EAAE,6BAA6B,EAAE,MAAM,qBAAqB,CAAA;AACnE,YAAY,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAA;AAC3F,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAClD,YAAY,EAAE,0BAA0B,EAAE,MAAM,cAAc,CAAA"}
@@ -4,7 +4,6 @@ import type { Event } from './event';
4
4
  export interface InstrumentTextAgentOptions<TMeta> {
5
5
  telescope: ITelescope;
6
6
  agent: TextAgent<TMeta>;
7
- fallbackConversationId: string;
8
7
  messagingProvider?: MonitoringProvider;
9
8
  onEvent?: (event: Event<TMeta>) => Promise<void>;
10
9
  }
@@ -1 +1 @@
1
- {"version":3,"file":"instrument.d.ts","sourceRoot":"","sources":["../../src/text-agent-handlers/instrument.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AACzC,OAAO,KAAK,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AAElE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAEpC,MAAM,WAAW,0BAA0B,CAAC,KAAK;IAC7C,SAAS,EAAE,UAAU,CAAA;IACrB,KAAK,EAAE,SAAS,CAAC,KAAK,CAAC,CAAA;IAEvB,sBAAsB,EAAE,MAAM,CAAA;IAE9B,iBAAiB,CAAC,EAAE,kBAAkB,CAAA;IAEtC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CACnD;AAaD,wBAAgB,mBAAmB,CAAC,KAAK,EACrC,OAAO,EAAE,0BAA0B,CAAC,KAAK,CAAC,GAC3C,SAAS,CAAC,KAAK,CAAC,CAiDlB"}
1
+ {"version":3,"file":"instrument.d.ts","sourceRoot":"","sources":["../../src/text-agent-handlers/instrument.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AACzC,OAAO,KAAK,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AAElE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAEpC,MAAM,WAAW,0BAA0B,CAAC,KAAK;IAC7C,SAAS,EAAE,UAAU,CAAA;IACrB,KAAK,EAAE,SAAS,CAAC,KAAK,CAAC,CAAA;IAEvB,iBAAiB,CAAC,EAAE,kBAAkB,CAAA;IAEtC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CACnD;AAaD,wBAAgB,mBAAmB,CAAC,KAAK,EACrC,OAAO,EAAE,0BAA0B,CAAC,KAAK,CAAC,GAC3C,SAAS,CAAC,KAAK,CAAC,CAoClB"}
@@ -1,11 +1,11 @@
1
1
  import { emitConversationalTrace, textEventTrace } from '../telescope';
2
2
  export function instrumentTextAgent(options) {
3
- const { telescope, agent, fallbackConversationId, messagingProvider, onEvent } = options;
3
+ const { telescope, agent, messagingProvider, onEvent } = options;
4
4
  const observation = (conversationId) => ({ conversationId, messagingProvider });
5
5
  async function traceReceivedMessage(event) {
6
6
  if (event.kind !== 'message')
7
7
  return;
8
- await emitConversationalTrace(telescope.getConversationalTracer(), textEventTrace(event.conversationId || fallbackConversationId, 'received-message', event.body ?? ''));
8
+ await emitConversationalTrace(telescope.getConversationalTracer(), textEventTrace(event.conversationId, 'received-message', event.body ?? ''));
9
9
  }
10
10
  return {
11
11
  name: agent.name,
@@ -15,13 +15,13 @@ export function instrumentTextAgent(options) {
15
15
  await onEvent?.(event);
16
16
  await traceReceivedMessage(event);
17
17
  return agent.reactOnMessage(event);
18
- }, observation(event.conversationId || fallbackConversationId)),
18
+ }, observation(event.conversationId)),
19
19
  onChatReady: async (id, meta) => telescope.runObservation(() => agent.onChatReady(id, meta), observation(id)),
20
20
  respondToMessage: async (event) => telescope.runObservation(async () => {
21
21
  await onEvent?.(event);
22
22
  return agent.respondToMessage(event);
23
- }, observation(event.conversationId || fallbackConversationId)),
23
+ }, observation(event.conversationId)),
24
24
  isAssigned: async (id) => telescope.runObservation(() => agent.isAssigned(id), observation(id)),
25
- onFatalError: async (error, id) => telescope.runObservation(() => agent.onFatalError(error, id), observation(id || fallbackConversationId)),
25
+ onFatalError: async (error, id) => telescope.runObservation(() => agent.onFatalError(error, id), observation(id)),
26
26
  };
27
27
  }
@@ -1,9 +1,10 @@
1
1
  import type { Logger } from '../dockyard';
2
2
  import type { JobInput } from './jobs';
3
- import type { AgentCreator, AgentRegistry, HandlerResponse } from './ports';
3
+ import type { AgentRegistry, GetTextAgent, HandlerResponse, JobRunner } from './ports';
4
4
  export interface JobsHandlerOptions<TMeta> {
5
5
  registry: AgentRegistry;
6
- getAgentCreator: (agentId: string) => AgentCreator<TMeta> | null;
6
+ scheduler: JobRunner;
7
+ getTextAgent: GetTextAgent<TMeta>;
7
8
  logger: Logger;
8
9
  }
9
10
  export declare function createJobsHandler<TMeta>(options: JobsHandlerOptions<TMeta>): (input: JobInput) => Promise<HandlerResponse>;
@@ -1 +1 @@
1
- {"version":3,"file":"jobs-handler.d.ts","sourceRoot":"","sources":["../../src/text-agent-handlers/jobs-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACzC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;AACtC,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAG3E,MAAM,WAAW,kBAAkB,CAAC,KAAK;IACrC,QAAQ,EAAE,aAAa,CAAA;IACvB,eAAe,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,YAAY,CAAC,KAAK,CAAC,GAAG,IAAI,CAAA;IAChE,MAAM,EAAE,MAAM,CAAA;CACjB;AAMD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,EAAE,kBAAkB,CAAC,KAAK,CAAC,IAGvC,OAAO,QAAQ,KAAG,OAAO,CAAC,eAAe,CAAC,CAuB7E"}
1
+ {"version":3,"file":"jobs-handler.d.ts","sourceRoot":"","sources":["../../src/text-agent-handlers/jobs-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACzC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;AACtC,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAGtF,MAAM,WAAW,kBAAkB,CAAC,KAAK;IACrC,QAAQ,EAAE,aAAa,CAAA;IAEvB,SAAS,EAAE,SAAS,CAAA;IAEpB,YAAY,EAAE,YAAY,CAAC,KAAK,CAAC,CAAA;IACjC,MAAM,EAAE,MAAM,CAAA;CACjB;AAMD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,EAAE,kBAAkB,CAAC,KAAK,CAAC,IAIvC,OAAO,QAAQ,KAAG,OAAO,CAAC,eAAe,CAAC,CAuB7E"}
@@ -1,13 +1,16 @@
1
- import { handlerResponse } from './ports';
1
+ import { cacheTextAgents, handlerResponse } from './ports';
2
2
  export function createJobsHandler(options) {
3
- const { registry, getAgentCreator, logger } = options;
3
+ const { registry, scheduler, logger } = options;
4
+ const getTextAgent = cacheTextAgents(options.getTextAgent);
4
5
  return async function handleJob(input) {
5
- const agentCreator = getAgentCreator(input.workflowId);
6
- if (!agentCreator) {
7
- logger.error('jobs, unknown workflowId', { workflowId: input.workflowId });
8
- return handlerResponse(400, { message: `Unknown workflowId: ${input.workflowId}` });
6
+ let agent;
7
+ try {
8
+ agent = await getTextAgent(input.agentId);
9
+ }
10
+ catch (err) {
11
+ logger.error('jobs, unknown agentId', { agentId: input.agentId, err });
12
+ return handlerResponse(400, { message: `Unknown agentId: ${input.agentId}` });
9
13
  }
10
- const { scheduler, agent } = await agentCreator(input.conversationId, input.workflowId);
11
14
  if (await agent.isAssigned(input.conversationId)) {
12
15
  try {
13
16
  await scheduler.runJob(input);
@@ -15,11 +18,11 @@ export function createJobsHandler(options) {
15
18
  catch (err) {
16
19
  await agent.onFatalError(String(err), input.conversationId);
17
20
  await scheduler.clearAllPendingActions(input.conversationId);
18
- await registry.deleteAgent(input.conversationId, input.workflowId);
21
+ await registry.deleteAgent(input.conversationId, input.agentId);
19
22
  }
20
23
  }
21
24
  else {
22
- await registry.deleteAgent(input.conversationId, input.workflowId);
25
+ await registry.deleteAgent(input.conversationId, input.agentId);
23
26
  await scheduler.clearAllPendingActions(input.conversationId);
24
27
  }
25
28
  return handlerResponse(200, { message: 'OK' });
@@ -5,7 +5,7 @@ export interface Job {
5
5
  }
6
6
  export interface JobInput {
7
7
  jobId: string;
8
- workflowId: string;
8
+ agentId: string;
9
9
  conversationId: string;
10
10
  handlerId: string;
11
11
  }
@@ -1 +1 @@
1
- {"version":3,"file":"jobs.d.ts","sourceRoot":"","sources":["../../src/text-agent-handlers/jobs.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,GAAG;IAChB,KAAK,EAAE,MAAM,CAAA;IACb,cAAc,EAAE,MAAM,CAAA;IACtB,WAAW,EAAE,MAAM,CAAA;CACtB;AAKD,MAAM,WAAW,QAAQ;IACrB,KAAK,EAAE,MAAM,CAAA;IACb,UAAU,EAAE,MAAM,CAAA;IAClB,cAAc,EAAE,MAAM,CAAA;IACtB,SAAS,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,eAAe;IAC5B,UAAU,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAA;IAC5B,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAA;IACvC,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACrC,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACpC,uBAAuB,EAAE,CAAC,cAAc,EAAE,MAAM,KAAK,OAAO,CAAC,GAAG,EAAE,CAAC,CAAA;CACtE"}
1
+ {"version":3,"file":"jobs.d.ts","sourceRoot":"","sources":["../../src/text-agent-handlers/jobs.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,GAAG;IAChB,KAAK,EAAE,MAAM,CAAA;IACb,cAAc,EAAE,MAAM,CAAA;IACtB,WAAW,EAAE,MAAM,CAAA;CACtB;AAKD,MAAM,WAAW,QAAQ;IACrB,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;IACf,cAAc,EAAE,MAAM,CAAA;IACtB,SAAS,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,eAAe;IAC5B,UAAU,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAA;IAC5B,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAA;IACvC,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACrC,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACpC,uBAAuB,EAAE,CAAC,cAAc,EAAE,MAAM,KAAK,OAAO,CAAC,GAAG,EAAE,CAAC,CAAA;CACtE"}
@@ -24,10 +24,8 @@ export interface ChatLockStore {
24
24
  export interface JobRunner extends Scheduler {
25
25
  runJob(input: JobInput): Promise<unknown>;
26
26
  }
27
- export type AgentCreator<TMeta> = (conversationId: string, agentId: string) => Promise<{
28
- agent: TextAgent<TMeta>;
29
- scheduler: JobRunner;
30
- }>;
27
+ export type GetTextAgent<TMeta> = (agentId: string) => Promise<TextAgent<TMeta>>;
28
+ export declare function cacheTextAgents<TMeta>(getTextAgent: GetTextAgent<TMeta>): GetTextAgent<TMeta>;
31
29
  export type HandlerResponse = {
32
30
  statusCode: number;
33
31
  body: string;
@@ -1 +1 @@
1
- {"version":3,"file":"ports.d.ts","sourceRoot":"","sources":["../../src/text-agent-handlers/ports.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AACzC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AAC1C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAGtC,MAAM,WAAW,WAAW;IACxB,cAAc,EAAE,MAAM,CAAA;IACtB,OAAO,EAAE,MAAM,CAAA;CAClB;AAGD,MAAM,WAAW,aAAa;IAC1B,QAAQ,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAA;IAC7D,SAAS,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC7C,WAAW,CAAC,cAAc,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CACtE;AAGD,MAAM,WAAW,QAAQ;IACrB,cAAc,EAAE,MAAM,CAAA;IACtB,SAAS,EAAE,IAAI,CAAA;IACf,SAAS,EAAE,IAAI,CAAA;CAClB;AAED,MAAM,WAAW,aAAa;IAC1B,WAAW,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAA;IAE7D,QAAQ,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IAC1C,oBAAoB,CAAC,cAAc,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IAC/E,WAAW,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;CACxD;AAGD,MAAM,WAAW,SAAU,SAAQ,SAAS;IACxC,MAAM,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;CAC5C;AAGD,MAAM,MAAM,YAAY,CAAC,KAAK,IAAI,CAC9B,cAAc,EAAE,MAAM,EACtB,OAAO,EAAE,MAAM,KACd,OAAO,CAAC;IAAE,KAAK,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC;IAAC,SAAS,EAAE,SAAS,CAAA;CAAE,CAAC,CAAA;AAG/D,MAAM,MAAM,eAAe,GAAG;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAA;AAElE,wBAAgB,eAAe,CAC3B,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,eAAe,CAEjB"}
1
+ {"version":3,"file":"ports.d.ts","sourceRoot":"","sources":["../../src/text-agent-handlers/ports.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AACzC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AAC1C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAGtC,MAAM,WAAW,WAAW;IACxB,cAAc,EAAE,MAAM,CAAA;IACtB,OAAO,EAAE,MAAM,CAAA;CAClB;AAGD,MAAM,WAAW,aAAa;IAC1B,QAAQ,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAA;IAC7D,SAAS,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC7C,WAAW,CAAC,cAAc,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CACtE;AAGD,MAAM,WAAW,QAAQ;IACrB,cAAc,EAAE,MAAM,CAAA;IACtB,SAAS,EAAE,IAAI,CAAA;IACf,SAAS,EAAE,IAAI,CAAA;CAClB;AAED,MAAM,WAAW,aAAa;IAC1B,WAAW,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAA;IAE7D,QAAQ,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IAC1C,oBAAoB,CAAC,cAAc,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IAC/E,WAAW,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;CACxD;AAGD,MAAM,WAAW,SAAU,SAAQ,SAAS;IACxC,MAAM,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;CAC5C;AAGD,MAAM,MAAM,YAAY,CAAC,KAAK,IAAI,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAA;AAGhF,wBAAgB,eAAe,CAAC,KAAK,EAAE,YAAY,EAAE,YAAY,CAAC,KAAK,CAAC,GAAG,YAAY,CAAC,KAAK,CAAC,CAW7F;AAGD,MAAM,MAAM,eAAe,GAAG;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAA;AAElE,wBAAgB,eAAe,CAC3B,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,eAAe,CAEjB"}
@@ -1,3 +1,15 @@
1
+ export function cacheTextAgents(getTextAgent) {
2
+ const agents = new Map();
3
+ return (agentId) => {
4
+ let agent = agents.get(agentId);
5
+ if (!agent) {
6
+ agent = getTextAgent(agentId);
7
+ agents.set(agentId, agent);
8
+ agent.catch(() => agents.delete(agentId));
9
+ }
10
+ return agent;
11
+ };
12
+ }
1
13
  export function handlerResponse(statusCode, body) {
2
14
  return { statusCode, body: JSON.stringify(body) };
3
15
  }
@@ -1 +1 @@
1
- {"version":3,"file":"voice-http.d.ts","sourceRoot":"","sources":["../../src/voice-agent-api/voice-http.ts"],"names":[],"mappings":"AAGA,OAAgB,EAAgB,cAAc,EAAE,MAAM,SAAS,CAAA;AAG/D,OAAO,EAAY,UAAU,EAAE,MAAM,UAAU,CAAA;AAC/C,OAAO,KAAK,WAAW,MAAM,iBAAiB,CAAA;AAE9C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AAC1D,OAAO,KAAK,EAAE,UAAU,EAAyB,MAAM,cAAc,CAAA;AAOrE,OAAO,QAAQ,SAAS,CAAC;IACrB,UAAU,cAAc;QACpB,MAAM,EAAE,MAAM,CAAA;QACd,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;QAC3B,SAAS,EAAE,MAAM,CAAA;QACjB,SAAS,EAAE,MAAM,CAAA;QACjB,WAAW,CAAC,EAAE,MAAM,CAAA;KACvB;CACJ;AAED,MAAM,WAAW,iBAAiB,CAAC,KAAK;IACpC,aAAa,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAA;IAChE,SAAS,EAAE,UAAU,CAAA;IAErB,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IAC5B,cAAc,EAAE,MAAM,EAAE,CAAA;IACxB,aAAa,EAAE,CAAC,OAAO,EAAE,cAAc,CAAC,SAAS,CAAC,KAAK,KAAK,CAAA;IAE5D,mBAAmB,EAAE,CAAC,OAAO,EAAE,cAAc,CAAC,SAAS,CAAC,KAAK;QACzD,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,WAAW,CAAC,EAAE,MAAM,CAAA;KACvB,CAAA;IAED,WAAW,EAAE,WAAW,CAAA;IACxB,kBAAkB,CAAC,EAAE,kBAAkB,CAAA;IACvC,yBAAyB,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,CAAC,SAAS,CAAC,KAAK,MAAM,GAAG,SAAS,CAAA;IAEtF,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC5B;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,EACpC,aAAa,EACb,SAAS,EACT,OAAO,EACP,cAAc,EACd,aAAa,EACb,mBAAmB,EACnB,WAAW,EACX,kBAAkB,EAClB,yBAAyB,EACzB,gBAAgB,GACnB,EAAE,iBAAiB,CAAC,KAAK,CAAC;;EA+c1B"}
1
+ {"version":3,"file":"voice-http.d.ts","sourceRoot":"","sources":["../../src/voice-agent-api/voice-http.ts"],"names":[],"mappings":"AAGA,OAAgB,EAAgB,cAAc,EAAE,MAAM,SAAS,CAAA;AAG/D,OAAO,EAAY,UAAU,EAAE,MAAM,UAAU,CAAA;AAC/C,OAAO,KAAK,WAAW,MAAM,iBAAiB,CAAA;AAE9C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AAC1D,OAAO,KAAK,EAAE,UAAU,EAAyB,MAAM,cAAc,CAAA;AAOrE,OAAO,QAAQ,SAAS,CAAC;IACrB,UAAU,cAAc;QACpB,MAAM,EAAE,MAAM,CAAA;QACd,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;QAC3B,SAAS,EAAE,MAAM,CAAA;QACjB,SAAS,EAAE,MAAM,CAAA;QACjB,WAAW,CAAC,EAAE,MAAM,CAAA;KACvB;CACJ;AAED,MAAM,WAAW,iBAAiB,CAAC,KAAK;IACpC,aAAa,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAA;IAChE,SAAS,EAAE,UAAU,CAAA;IAErB,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IAC5B,cAAc,EAAE,MAAM,EAAE,CAAA;IACxB,aAAa,EAAE,CAAC,OAAO,EAAE,cAAc,CAAC,SAAS,CAAC,KAAK,KAAK,CAAA;IAE5D,mBAAmB,EAAE,CAAC,OAAO,EAAE,cAAc,CAAC,SAAS,CAAC,KAAK;QACzD,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,WAAW,CAAC,EAAE,MAAM,CAAA;KACvB,CAAA;IAED,WAAW,EAAE,WAAW,CAAA;IACxB,kBAAkB,CAAC,EAAE,kBAAkB,CAAA;IACvC,yBAAyB,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,CAAC,SAAS,CAAC,KAAK,MAAM,GAAG,SAAS,CAAA;IAEtF,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC5B;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,EACpC,aAAa,EACb,SAAS,EACT,OAAO,EACP,cAAc,EACd,aAAa,EACb,mBAAmB,EACnB,WAAW,EACX,kBAAkB,EAClB,yBAAyB,EACzB,gBAAgB,GACnB,EAAE,iBAAiB,CAAC,KAAK,CAAC;;EA8b1B"}
@@ -280,33 +280,16 @@ export function voiceHttpConnect({ getVoiceAgent, telescope, onStart, hostsToPre
280
280
  started = true;
281
281
  await prewarmDNS();
282
282
  }
283
- const agentForCall = {};
284
- const agentLoadingForCall = {};
285
- const callHandledBy = {};
286
- async function getAgent(req) {
287
- const agent = agentForCall[req.callId];
288
- if (agent && callHandledBy[req.callId] === req.agentName) {
289
- return agent;
290
- }
291
- let loadingAgent = agentLoadingForCall[req.callId];
292
- if (loadingAgent === undefined || callHandledBy[req.callId] !== req.agentName) {
283
+ const agents = new Map();
284
+ function getAgent(req) {
285
+ let agent = agents.get(req.agentName);
286
+ if (!agent) {
293
287
  logger.debug('Loading agent', { agentName: req.agentName });
294
- loadingAgent = getVoiceAgent(req.agentName);
295
- agentLoadingForCall[req.callId] = loadingAgent;
296
- callHandledBy[req.callId] = req.agentName;
297
- }
298
- try {
299
- const loadedAgent = await loadingAgent;
300
- if (callHandledBy[req.callId] === req.agentName) {
301
- agentForCall[req.callId] = loadedAgent;
302
- }
303
- return loadedAgent;
304
- }
305
- finally {
306
- if (agentLoadingForCall[req.callId] === loadingAgent) {
307
- delete agentLoadingForCall[req.callId];
308
- }
288
+ agent = getVoiceAgent(req.agentName);
289
+ agents.set(req.agentName, agent);
290
+ agent.catch(() => agents.delete(req.agentName));
309
291
  }
292
+ return agent;
310
293
  }
311
294
  async function prewarmDNS() {
312
295
  const dnsLookup = promisify(dns.lookup);
@@ -331,7 +314,7 @@ export function voiceHttpConnect({ getVoiceAgent, telescope, onStart, hostsToPre
331
314
  const conversation = {
332
315
  conversationId,
333
316
  medium: 'phone',
334
- agentId: agentForCall[conversationId]?.name || req.agentName || undefined,
317
+ agentId: req.agentName || undefined,
335
318
  region,
336
319
  phoneNumber: phoneNumber ?? req.phoneNumber,
337
320
  createdAt: Date.now(),
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@recombine-ai/platform",
3
3
  "type": "module",
4
- "version": "0.4.0",
4
+ "version": "0.5.0",
5
5
  "description": "The Recombine platform: engine, telescope, dockyard, call control, the voice agent API, and the Bosun bindings in one package",
6
6
  "license": "EULA",
7
7
  "author": "recombine.ai",