@recombine-ai/platform 0.9.1-test.2 → 0.9.1-test.4

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 (145) hide show
  1. package/build/bosun-app/frontend/client/_app/immutable/chunks/{YRWW-SW8.js → AHiDv00n.js} +1 -1
  2. package/build/bosun-app/frontend/client/_app/immutable/chunks/AHiDv00n.js.br +0 -0
  3. package/build/bosun-app/frontend/client/_app/immutable/chunks/AHiDv00n.js.gz +0 -0
  4. package/build/bosun-app/frontend/client/_app/immutable/chunks/{CdiiHmb_.js → B85uAto8.js} +1 -1
  5. package/build/bosun-app/frontend/client/_app/immutable/chunks/B85uAto8.js.br +0 -0
  6. package/build/bosun-app/frontend/client/_app/immutable/chunks/B85uAto8.js.gz +0 -0
  7. package/build/bosun-app/frontend/client/_app/immutable/chunks/{COI2cH3y.js → BQd-oRUg.js} +1 -1
  8. package/build/bosun-app/frontend/client/_app/immutable/chunks/BQd-oRUg.js.br +0 -0
  9. package/build/bosun-app/frontend/client/_app/immutable/chunks/BQd-oRUg.js.gz +0 -0
  10. package/build/bosun-app/frontend/client/_app/immutable/chunks/{B3sRmUmR.js → CKe6BxWL.js} +1 -1
  11. package/build/bosun-app/frontend/client/_app/immutable/chunks/CKe6BxWL.js.br +0 -0
  12. package/build/bosun-app/frontend/client/_app/immutable/chunks/CKe6BxWL.js.gz +0 -0
  13. package/build/bosun-app/frontend/client/_app/immutable/chunks/{BIYJrTTr.js → MfNXj3Ue.js} +1 -1
  14. package/build/bosun-app/frontend/client/_app/immutable/chunks/MfNXj3Ue.js.br +0 -0
  15. package/build/bosun-app/frontend/client/_app/immutable/chunks/MfNXj3Ue.js.gz +0 -0
  16. package/build/bosun-app/frontend/client/_app/immutable/entry/{app.0r1adPhk.js → app.DKwJRMGa.js} +2 -2
  17. package/build/bosun-app/frontend/client/_app/immutable/entry/app.DKwJRMGa.js.br +0 -0
  18. package/build/bosun-app/frontend/client/_app/immutable/entry/app.DKwJRMGa.js.gz +0 -0
  19. package/build/bosun-app/frontend/client/_app/immutable/entry/start.Shg1qVuj.js +1 -0
  20. package/build/bosun-app/frontend/client/_app/immutable/entry/start.Shg1qVuj.js.br +0 -0
  21. package/build/bosun-app/frontend/client/_app/immutable/entry/start.Shg1qVuj.js.gz +0 -0
  22. package/build/bosun-app/frontend/client/_app/immutable/nodes/{0.BCslgDHp.js → 0.CM_uGID6.js} +1 -1
  23. package/build/bosun-app/frontend/client/_app/immutable/nodes/0.CM_uGID6.js.br +0 -0
  24. package/build/bosun-app/frontend/client/_app/immutable/nodes/0.CM_uGID6.js.gz +0 -0
  25. package/build/bosun-app/frontend/client/_app/immutable/nodes/{1.DfDHVqM0.js → 1.424_xIvV.js} +1 -1
  26. package/build/bosun-app/frontend/client/_app/immutable/nodes/1.424_xIvV.js.br +0 -0
  27. package/build/bosun-app/frontend/client/_app/immutable/nodes/1.424_xIvV.js.gz +0 -0
  28. package/build/bosun-app/frontend/client/_app/immutable/nodes/{10.BXbQQ1q5.js → 10.CBmyaxPa.js} +1 -1
  29. package/build/bosun-app/frontend/client/_app/immutable/nodes/10.CBmyaxPa.js.br +0 -0
  30. package/build/bosun-app/frontend/client/_app/immutable/nodes/10.CBmyaxPa.js.gz +0 -0
  31. package/build/bosun-app/frontend/client/_app/immutable/nodes/{17.DSps31HJ.js → 17.d8VRcLNZ.js} +1 -1
  32. package/build/bosun-app/frontend/client/_app/immutable/nodes/17.d8VRcLNZ.js.br +0 -0
  33. package/build/bosun-app/frontend/client/_app/immutable/nodes/17.d8VRcLNZ.js.gz +0 -0
  34. package/build/bosun-app/frontend/client/_app/immutable/nodes/{18.8hAfbPPt.js → 18.xvo_JAG6.js} +1 -1
  35. package/build/bosun-app/frontend/client/_app/immutable/nodes/18.xvo_JAG6.js.br +0 -0
  36. package/build/bosun-app/frontend/client/_app/immutable/nodes/18.xvo_JAG6.js.gz +0 -0
  37. package/build/bosun-app/frontend/client/_app/immutable/nodes/{2.DLZcnXo3.js → 2.BMIMNLut.js} +1 -1
  38. package/build/bosun-app/frontend/client/_app/immutable/nodes/2.BMIMNLut.js.br +0 -0
  39. package/build/bosun-app/frontend/client/_app/immutable/nodes/2.BMIMNLut.js.gz +0 -0
  40. package/build/bosun-app/frontend/client/_app/immutable/nodes/{3.Dzl7FcjU.js → 3.DH723ik1.js} +1 -1
  41. package/build/bosun-app/frontend/client/_app/immutable/nodes/3.DH723ik1.js.br +0 -0
  42. package/build/bosun-app/frontend/client/_app/immutable/nodes/3.DH723ik1.js.gz +0 -0
  43. package/build/bosun-app/frontend/client/_app/immutable/nodes/{4.BlHeYRVW.js → 4.D7MQfqBW.js} +1 -1
  44. package/build/bosun-app/frontend/client/_app/immutable/nodes/4.D7MQfqBW.js.br +0 -0
  45. package/build/bosun-app/frontend/client/_app/immutable/nodes/4.D7MQfqBW.js.gz +0 -0
  46. package/build/bosun-app/frontend/client/_app/immutable/nodes/{5.DE3muGEs.js → 5.CgFgE7jv.js} +1 -1
  47. package/build/bosun-app/frontend/client/_app/immutable/nodes/5.CgFgE7jv.js.br +0 -0
  48. package/build/bosun-app/frontend/client/_app/immutable/nodes/5.CgFgE7jv.js.gz +0 -0
  49. package/build/bosun-app/frontend/client/_app/immutable/nodes/{6.DauPUI6w.js → 6.CAfGncmh.js} +1 -1
  50. package/build/bosun-app/frontend/client/_app/immutable/nodes/6.CAfGncmh.js.br +0 -0
  51. package/build/bosun-app/frontend/client/_app/immutable/nodes/6.CAfGncmh.js.gz +0 -0
  52. package/build/bosun-app/frontend/client/_app/immutable/nodes/{8.DIwMEVk7.js → 8.BaUuXdDP.js} +1 -1
  53. package/build/bosun-app/frontend/client/_app/immutable/nodes/8.BaUuXdDP.js.br +0 -0
  54. package/build/bosun-app/frontend/client/_app/immutable/nodes/8.BaUuXdDP.js.gz +0 -0
  55. package/build/bosun-app/frontend/client/_app/immutable/nodes/{9.BoyHpLCi.js → 9.CdDczpYU.js} +1 -1
  56. package/build/bosun-app/frontend/client/_app/immutable/nodes/9.CdDczpYU.js.br +0 -0
  57. package/build/bosun-app/frontend/client/_app/immutable/nodes/9.CdDczpYU.js.gz +0 -0
  58. package/build/bosun-app/frontend/client/_app/version.json +1 -1
  59. package/build/bosun-app/frontend/client/_app/version.json.br +0 -0
  60. package/build/bosun-app/frontend/client/_app/version.json.gz +0 -0
  61. package/build/bosun-app/frontend/handler.js +4 -4
  62. package/build/bosun-app/frontend/index.js +4 -4
  63. package/build/bosun-app/frontend/server/chunks/chunks/{internal.js-Cr3b1H4k.js → internal.js-grF_FC95.js} +2 -2
  64. package/build/bosun-app/frontend/server/chunks/chunks/{internal.js-Cr3b1H4k.js.map → internal.js-grF_FC95.js.map} +1 -1
  65. package/build/bosun-app/frontend/server/chunks/{handler-DqsNau3u.js → handler-DtRK2f71.js} +3 -3
  66. package/build/bosun-app/frontend/server/chunks/{handler-DqsNau3u.js.map → handler-DtRK2f71.js.map} +1 -1
  67. package/build/bosun-app/frontend/server/chunks/{index.js-DZUC5rml.js → index.js-CGN8fkKf.js} +2 -2
  68. package/build/bosun-app/frontend/server/chunks/{index.js-DZUC5rml.js.map → index.js-CGN8fkKf.js.map} +1 -1
  69. package/build/bosun-app/frontend/server/chunks/{manifest.js-Ba8Iww95.js → manifest.js-4yfNPJrj.js} +14 -14
  70. package/build/bosun-app/frontend/server/chunks/{manifest.js-Ba8Iww95.js.map → manifest.js-4yfNPJrj.js.map} +1 -1
  71. package/build/bosun-app/frontend/server/chunks/nodes/{0.js-ErWLOg9o.js → 0.js-VI8hFMMF.js} +2 -2
  72. package/build/bosun-app/frontend/server/chunks/nodes/{0.js-ErWLOg9o.js.map → 0.js-VI8hFMMF.js.map} +1 -1
  73. package/build/bosun-app/frontend/server/chunks/nodes/{1.js-BucIct8J.js → 1.js-CcFXNzkf.js} +2 -2
  74. package/build/bosun-app/frontend/server/chunks/nodes/{1.js-BucIct8J.js.map → 1.js-CcFXNzkf.js.map} +1 -1
  75. package/build/bosun-app/frontend/server/chunks/nodes/{10.js-CmuGuxqs.js → 10.js-B4Y1IcD4.js} +2 -2
  76. package/build/bosun-app/frontend/server/chunks/nodes/{10.js-CmuGuxqs.js.map → 10.js-B4Y1IcD4.js.map} +1 -1
  77. package/build/bosun-app/frontend/server/chunks/nodes/{17.js-R-YLRxxY.js → 17.js-CgVKVxzg.js} +2 -2
  78. package/build/bosun-app/frontend/server/chunks/nodes/{17.js-R-YLRxxY.js.map → 17.js-CgVKVxzg.js.map} +1 -1
  79. package/build/bosun-app/frontend/server/chunks/nodes/{18.js-Bwqlseie.js → 18.js-BMMFbpKI.js} +2 -2
  80. package/build/bosun-app/frontend/server/chunks/nodes/{18.js-Bwqlseie.js.map → 18.js-BMMFbpKI.js.map} +1 -1
  81. package/build/bosun-app/frontend/server/chunks/nodes/{2.js-DWsjBpYQ.js → 2.js-C9DJjLy5.js} +2 -2
  82. package/build/bosun-app/frontend/server/chunks/nodes/{2.js-DWsjBpYQ.js.map → 2.js-C9DJjLy5.js.map} +1 -1
  83. package/build/bosun-app/frontend/server/chunks/nodes/{3.js-Bw_XtVfk.js → 3.js-Cao3jg5z.js} +2 -2
  84. package/build/bosun-app/frontend/server/chunks/nodes/{3.js-Bw_XtVfk.js.map → 3.js-Cao3jg5z.js.map} +1 -1
  85. package/build/bosun-app/frontend/server/chunks/nodes/{4.js-ZjhIMlzQ.js → 4.js-BVIkfL-J.js} +2 -2
  86. package/build/bosun-app/frontend/server/chunks/nodes/{4.js-ZjhIMlzQ.js.map → 4.js-BVIkfL-J.js.map} +1 -1
  87. package/build/bosun-app/frontend/server/chunks/nodes/{5.js-1hrIQeCi.js → 5.js-DxBXI3Tn.js} +2 -2
  88. package/build/bosun-app/frontend/server/chunks/nodes/{5.js-1hrIQeCi.js.map → 5.js-DxBXI3Tn.js.map} +1 -1
  89. package/build/bosun-app/frontend/server/chunks/nodes/{6.js-DqwEZ7GV.js → 6.js-GyWS2kBZ.js} +2 -2
  90. package/build/bosun-app/frontend/server/chunks/nodes/{6.js-DqwEZ7GV.js.map → 6.js-GyWS2kBZ.js.map} +1 -1
  91. package/build/bosun-app/frontend/server/chunks/nodes/{8.js-DN3WDIfO.js → 8.js-BejmyzcM.js} +2 -2
  92. package/build/bosun-app/frontend/server/chunks/nodes/{8.js-DN3WDIfO.js.map → 8.js-BejmyzcM.js.map} +1 -1
  93. package/build/bosun-app/frontend/server/chunks/nodes/{9.js-C_SjLW8b.js → 9.js-BOGJ7h8n.js} +2 -2
  94. package/build/bosun-app/frontend/server/chunks/nodes/{9.js-C_SjLW8b.js.map → 9.js-BOGJ7h8n.js.map} +1 -1
  95. package/build/call-control/schemas.generated.d.ts +2 -0
  96. package/build/call-control/schemas.generated.d.ts.map +1 -1
  97. package/build/call-control/schemas.generated.js +2 -0
  98. package/build/call-control/voice-agent-config.d.ts +2 -0
  99. package/build/call-control/voice-agent-config.d.ts.map +1 -1
  100. package/build/engine/interfaces/stream.d.ts +7 -0
  101. package/build/engine/interfaces/stream.d.ts.map +1 -1
  102. package/build/engine/stream/jev-prediction-chooser.d.ts.map +1 -1
  103. package/build/engine/stream/jev-prediction-chooser.js +45 -11
  104. package/build/engine/stream/predictive-workflow.d.ts.map +1 -1
  105. package/build/engine/stream/predictive-workflow.js +172 -21
  106. package/package.json +1 -1
  107. package/build/bosun-app/frontend/client/_app/immutable/chunks/B3sRmUmR.js.br +0 -0
  108. package/build/bosun-app/frontend/client/_app/immutable/chunks/B3sRmUmR.js.gz +0 -0
  109. package/build/bosun-app/frontend/client/_app/immutable/chunks/BIYJrTTr.js.br +0 -0
  110. package/build/bosun-app/frontend/client/_app/immutable/chunks/BIYJrTTr.js.gz +0 -0
  111. package/build/bosun-app/frontend/client/_app/immutable/chunks/COI2cH3y.js.br +0 -3
  112. package/build/bosun-app/frontend/client/_app/immutable/chunks/COI2cH3y.js.gz +0 -0
  113. package/build/bosun-app/frontend/client/_app/immutable/chunks/CdiiHmb_.js.br +0 -0
  114. package/build/bosun-app/frontend/client/_app/immutable/chunks/CdiiHmb_.js.gz +0 -0
  115. package/build/bosun-app/frontend/client/_app/immutable/chunks/YRWW-SW8.js.br +0 -0
  116. package/build/bosun-app/frontend/client/_app/immutable/chunks/YRWW-SW8.js.gz +0 -0
  117. package/build/bosun-app/frontend/client/_app/immutable/entry/app.0r1adPhk.js.br +0 -0
  118. package/build/bosun-app/frontend/client/_app/immutable/entry/app.0r1adPhk.js.gz +0 -0
  119. package/build/bosun-app/frontend/client/_app/immutable/entry/start.BNSaABB8.js +0 -1
  120. package/build/bosun-app/frontend/client/_app/immutable/entry/start.BNSaABB8.js.br +0 -0
  121. package/build/bosun-app/frontend/client/_app/immutable/entry/start.BNSaABB8.js.gz +0 -0
  122. package/build/bosun-app/frontend/client/_app/immutable/nodes/0.BCslgDHp.js.br +0 -0
  123. package/build/bosun-app/frontend/client/_app/immutable/nodes/0.BCslgDHp.js.gz +0 -0
  124. package/build/bosun-app/frontend/client/_app/immutable/nodes/1.DfDHVqM0.js.br +0 -0
  125. package/build/bosun-app/frontend/client/_app/immutable/nodes/1.DfDHVqM0.js.gz +0 -0
  126. package/build/bosun-app/frontend/client/_app/immutable/nodes/10.BXbQQ1q5.js.br +0 -0
  127. package/build/bosun-app/frontend/client/_app/immutable/nodes/10.BXbQQ1q5.js.gz +0 -0
  128. package/build/bosun-app/frontend/client/_app/immutable/nodes/17.DSps31HJ.js.br +0 -0
  129. package/build/bosun-app/frontend/client/_app/immutable/nodes/17.DSps31HJ.js.gz +0 -0
  130. package/build/bosun-app/frontend/client/_app/immutable/nodes/18.8hAfbPPt.js.br +0 -0
  131. package/build/bosun-app/frontend/client/_app/immutable/nodes/18.8hAfbPPt.js.gz +0 -0
  132. package/build/bosun-app/frontend/client/_app/immutable/nodes/2.DLZcnXo3.js.br +0 -0
  133. package/build/bosun-app/frontend/client/_app/immutable/nodes/2.DLZcnXo3.js.gz +0 -0
  134. package/build/bosun-app/frontend/client/_app/immutable/nodes/3.Dzl7FcjU.js.br +0 -0
  135. package/build/bosun-app/frontend/client/_app/immutable/nodes/3.Dzl7FcjU.js.gz +0 -0
  136. package/build/bosun-app/frontend/client/_app/immutable/nodes/4.BlHeYRVW.js.br +0 -0
  137. package/build/bosun-app/frontend/client/_app/immutable/nodes/4.BlHeYRVW.js.gz +0 -0
  138. package/build/bosun-app/frontend/client/_app/immutable/nodes/5.DE3muGEs.js.br +0 -0
  139. package/build/bosun-app/frontend/client/_app/immutable/nodes/5.DE3muGEs.js.gz +0 -0
  140. package/build/bosun-app/frontend/client/_app/immutable/nodes/6.DauPUI6w.js.br +0 -0
  141. package/build/bosun-app/frontend/client/_app/immutable/nodes/6.DauPUI6w.js.gz +0 -0
  142. package/build/bosun-app/frontend/client/_app/immutable/nodes/8.DIwMEVk7.js.br +0 -0
  143. package/build/bosun-app/frontend/client/_app/immutable/nodes/8.DIwMEVk7.js.gz +0 -0
  144. package/build/bosun-app/frontend/client/_app/immutable/nodes/9.BoyHpLCi.js.br +0 -0
  145. package/build/bosun-app/frontend/client/_app/immutable/nodes/9.BoyHpLCi.js.gz +0 -0
@@ -123,6 +123,8 @@ export declare const configSchema: z.ZodObject<{
123
123
  eleven_flash_v2: "eleven_flash_v2";
124
124
  eleven_v3: "eleven_v3";
125
125
  eleven_v3_conversational: "eleven_v3_conversational";
126
+ eleven_v4: "eleven_v4";
127
+ eleven_v4_turbo: "eleven_v4_turbo";
126
128
  }>>;
127
129
  tts_text_prefix: z.ZodDefault<z.ZodString>;
128
130
  tts_inactivity_timeout: z.ZodDefault<z.ZodNumber>;
@@ -1 +1 @@
1
- {"version":3,"file":"schemas.generated.d.ts","sourceRoot":"","sources":["../../src/call-control/schemas.generated.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAwTvB,CAAA"}
1
+ {"version":3,"file":"schemas.generated.d.ts","sourceRoot":"","sources":["../../src/call-control/schemas.generated.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA0TvB,CAAA"}
@@ -228,6 +228,8 @@ export const configSchema = z.object({
228
228
  'eleven_flash_v2',
229
229
  'eleven_v3',
230
230
  'eleven_v3_conversational',
231
+ 'eleven_v4',
232
+ 'eleven_v4_turbo',
231
233
  ])
232
234
  .describe('ElevenLabs model to use')
233
235
  .default('eleven_turbo_v2'),
@@ -122,6 +122,8 @@ export declare const voiceAgentConfigSchema: import("zod").ZodObject<{
122
122
  eleven_flash_v2: "eleven_flash_v2";
123
123
  eleven_v3: "eleven_v3";
124
124
  eleven_v3_conversational: "eleven_v3_conversational";
125
+ eleven_v4: "eleven_v4";
126
+ eleven_v4_turbo: "eleven_v4_turbo";
125
127
  }>>;
126
128
  tts_text_prefix: import("zod").ZodDefault<import("zod").ZodString>;
127
129
  tts_inactivity_timeout: import("zod").ZodDefault<import("zod").ZodNumber>;
@@ -1 +1 @@
1
- {"version":3,"file":"voice-agent-config.d.ts","sourceRoot":"","sources":["../../src/call-control/voice-agent-config.ts"],"names":[],"mappings":"AAyDA,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gCAGjC,CAAA;AAEF,wBAAgB,uCAAuC,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAK/E"}
1
+ {"version":3,"file":"voice-agent-config.d.ts","sourceRoot":"","sources":["../../src/call-control/voice-agent-config.ts"],"names":[],"mappings":"AAyDA,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gCAGjC,CAAA;AAEF,wBAAgB,uCAAuC,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAK/E"}
@@ -39,9 +39,16 @@ export interface PredictionChooserResult {
39
39
  inputTokens: number;
40
40
  outputTokens: number;
41
41
  };
42
+ diagnostics?: {
43
+ requestDurationMs: number;
44
+ upstreamDurationMs?: number;
45
+ requestId?: string;
46
+ retryCount: number;
47
+ };
42
48
  }
43
49
  export interface PredictionChooser {
44
50
  choose: (input: PredictionChooserInput) => Promise<PredictionChooserResult>;
51
+ prewarm?: () => Promise<void>;
45
52
  getOptions: () => unknown;
46
53
  getProviderInfo?: () => LlmProviderInfo;
47
54
  }
@@ -1 +1 @@
1
- {"version":3,"file":"stream.d.ts","sourceRoot":"","sources":["../../../src/engine/interfaces/stream.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"stream.d.ts","sourceRoot":"","sources":["../../../src/engine/interfaces/stream.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"jev-prediction-chooser.d.ts","sourceRoot":"","sources":["../../../src/engine/stream/jev-prediction-chooser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,KAAK,EAA2C,MAAM,kBAAkB,CAAA;AAEtF,OAAO,KAAK,EAAE,iBAAiB,EAA2B,MAAM,wBAAwB,CAAA;AAGxF,MAAM,WAAW,2BAA2B;IACxC,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;IACb,cAAc,EAAE,MAAM,CAAA;IACtB,SAAS,EAAE,MAAM,CAAA;IAEjB,KAAK,CAAC,EAAE,KAAK,CAAA;CAChB;AAED,wBAAgB,0BAA0B,CACtC,OAAO,EAAE,2BAA2B,GACrC,iBAAiB,CAgEnB"}
1
+ {"version":3,"file":"jev-prediction-chooser.d.ts","sourceRoot":"","sources":["../../../src/engine/stream/jev-prediction-chooser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,KAAK,EAA2C,MAAM,kBAAkB,CAAA;AAEtF,OAAO,KAAK,EAAE,iBAAiB,EAA2B,MAAM,wBAAwB,CAAA;AAGxF,MAAM,WAAW,2BAA2B;IACxC,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;IACb,cAAc,EAAE,MAAM,CAAA;IACtB,SAAS,EAAE,MAAM,CAAA;IAEjB,KAAK,CAAC,EAAE,KAAK,CAAA;CAChB;AAED,wBAAgB,0BAA0B,CACtC,OAAO,EAAE,2BAA2B,GACrC,iBAAiB,CA6EnB"}
@@ -2,13 +2,7 @@ import { TypeSafeClient, noul } from '@typesafe-ai/sdk';
2
2
  import { chooserPrompt } from './predictive-prompts.js';
3
3
  export function createJevPredictionChooser(options) {
4
4
  validateOptions(options);
5
- const client = new TypeSafeClient({
6
- apiKey: options.apiKey,
7
- defaultModel: options.model,
8
- fetch: options.fetch,
9
- logLevel: 'off',
10
- timeout: options.timeoutMs,
11
- });
5
+ const transport = options.fetch ?? ((input, init) => globalThis.fetch(input, init));
12
6
  return {
13
7
  getOptions: () => ({
14
8
  model: options.model,
@@ -16,14 +10,24 @@ export function createJevPredictionChooser(options) {
16
10
  timeoutMs: options.timeoutMs,
17
11
  }),
18
12
  getProviderInfo: () => ({ provider: 'typesafe', model: options.model }),
13
+ async prewarm() {
14
+ await Promise.all([prewarm(transport, options), prewarm(transport, options)]);
15
+ },
19
16
  async choose(input) {
20
17
  if (input.candidates.length === 0) {
21
18
  throw new Error('Jev prediction chooser requires at least one candidate.');
22
19
  }
20
+ let attemptCount = 0;
21
+ const client = createClient(options, async (request, init) => {
22
+ attemptCount += 1;
23
+ return transport(request, init);
24
+ });
23
25
  const questions = createQuestions(input.candidates.length);
24
- const result = await client.systemOne({
26
+ const startedAt = Date.now();
27
+ const request = client.systemOne({
25
28
  model: options.model,
26
29
  state: {
30
+ reply_safety_policy: chooserPrompt,
27
31
  conversation_history: input.history.map((message) => ({
28
32
  role: message.sender,
29
33
  text: message.text,
@@ -36,6 +40,7 @@ export function createJevPredictionChooser(options) {
36
40
  },
37
41
  questions,
38
42
  });
43
+ const { data: result, response, requestId } = await request.withResponse();
39
44
  const scores = input.candidates.map((_, index) => {
40
45
  const answer = result.answers[questionId(index)];
41
46
  if (!answer ||
@@ -56,6 +61,12 @@ export function createJevPredictionChooser(options) {
56
61
  inputTokens: result.usage.input_tokens,
57
62
  outputTokens: result.usage.output_tokens,
58
63
  },
64
+ diagnostics: {
65
+ requestDurationMs: Date.now() - startedAt,
66
+ upstreamDurationMs: parseDurationHeader(response.headers.get('x-envoy-upstream-service-time')),
67
+ requestId,
68
+ retryCount: Math.max(0, attemptCount - 1),
69
+ },
59
70
  };
60
71
  },
61
72
  };
@@ -63,12 +74,35 @@ export function createJevPredictionChooser(options) {
63
74
  function createQuestions(candidateCount) {
64
75
  return Object.fromEntries(Array.from({ length: candidateCount }, (_, index) => [
65
76
  questionId(index),
66
- noul(`${chooserPrompt}\n\nEvaluate \`candidates[${index}]\` against \`actual_user_response\` and \`conversation_history\`.`, {
67
- true: 'The prepared agent response meets every safety and relevance condition.',
68
- false: 'The prepared agent response violates one or more safety or relevance conditions.',
77
+ noul(`Is \`candidates[${index}].prepared_agent_response\` safe and natural immediately after \`actual_user_response\`? The predicted user response only explains where the prepared response came from. It does not replace the actual response. Apply every rule in \`reply_safety_policy\`.`, {
78
+ true: 'Every requirement in reply_safety_policy is met.',
79
+ false: 'At least one requirement in reply_safety_policy is not met.',
69
80
  }),
70
81
  ]));
71
82
  }
83
+ function createClient(options, fetch) {
84
+ return new TypeSafeClient({
85
+ apiKey: options.apiKey,
86
+ defaultModel: options.model,
87
+ fetch,
88
+ logLevel: 'off',
89
+ timeout: options.timeoutMs,
90
+ });
91
+ }
92
+ async function prewarm(transport, options) {
93
+ const client = createClient(options, transport);
94
+ await client.systemOne({
95
+ model: options.model,
96
+ state: 'Hello.',
97
+ questions: { greeting: noul('Is this a greeting?') },
98
+ });
99
+ }
100
+ function parseDurationHeader(value) {
101
+ if (value === null)
102
+ return undefined;
103
+ const duration = Number(value);
104
+ return Number.isFinite(duration) && duration >= 0 ? duration : undefined;
105
+ }
72
106
  function selectCandidate(scores, threshold) {
73
107
  let selectedIndex;
74
108
  let selectedScore = threshold;
@@ -1 +1 @@
1
- {"version":3,"file":"predictive-workflow.d.ts","sourceRoot":"","sources":["../../../src/engine/stream/predictive-workflow.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,UAAU,CAAA;AAM/B,OAAO,KAAK,EAOR,2BAA2B,EAC3B,wBAAwB,EAExB,qBAAqB,EAExB,MAAM,wBAAwB,CAAA;AAgD/B,wBAAgB,wBAAwB,CAAC,GAAG,SAAS,MAAM,EACvD,MAAM,EAAE,wBAAwB,CAAC,GAAG,CAAC,EACrC,YAAY,EAAE,qBAAqB,EACnC,WAAW,EAAE,QAAQ,CAAC,WAAW,GAClC,2BAA2B,CAAC,GAAG,CAAC,CAoclC"}
1
+ {"version":3,"file":"predictive-workflow.d.ts","sourceRoot":"","sources":["../../../src/engine/stream/predictive-workflow.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,UAAU,CAAA;AAM/B,OAAO,KAAK,EAOR,2BAA2B,EAC3B,wBAAwB,EAExB,qBAAqB,EAExB,MAAM,wBAAwB,CAAA;AAkD/B,wBAAgB,wBAAwB,CAAC,GAAG,SAAS,MAAM,EACvD,MAAM,EAAE,wBAAwB,CAAC,GAAG,CAAC,EACrC,YAAY,EAAE,qBAAqB,EACnC,WAAW,EAAE,QAAQ,CAAC,WAAW,GAClC,2BAA2B,CAAC,GAAG,CAAC,CAumBlC"}
@@ -48,8 +48,10 @@ export function createPredictiveWorkflow(config, engineConfig, nunjucksEnv) {
48
48
  state.stopCurrent?.();
49
49
  state.requestGeneration += 1;
50
50
  const generation = state.requestGeneration;
51
- const isUserTurn = messages.at(-1)?.sender === 'user';
52
- const predictionSets = isUserTurn
51
+ const lastMessage = messages.at(-1);
52
+ const isUserTurn = lastMessage?.sender === 'user';
53
+ const isSubstantiveUserTurn = isUserTurn && lastMessage.text.trim().length > 0;
54
+ const predictionSets = isSubstantiveUserTurn
53
55
  ? [state.preparedPrewarm, state.preparedNormal].filter(isPreparedSet)
54
56
  : [];
55
57
  const predictions = predictionSets.flatMap((set) => set.pairs);
@@ -57,6 +59,7 @@ export function createPredictiveWorkflow(config, engineConfig, nunjucksEnv) {
57
59
  const renderedPrompt = nunjucksEnv.renderString(template, ctx || {});
58
60
  const stringifiedConversation = stringifyMessages(messages);
59
61
  const runId = crypto.randomUUID();
62
+ const responseStartedAt = Date.now();
60
63
  const mainTrace = {
61
64
  workflowId: config.name,
62
65
  workflowRunId: runId,
@@ -69,6 +72,18 @@ export function createPredictiveWorkflow(config, engineConfig, nunjucksEnv) {
69
72
  renderedPrompt,
70
73
  stringifiedConversation,
71
74
  };
75
+ logger.info('Predictive response started', {
76
+ callId,
77
+ runId,
78
+ generation,
79
+ messageCount: messages.length,
80
+ lastMessageSender: lastMessage?.sender,
81
+ lastMessageLength: lastMessage?.text.length ?? 0,
82
+ isSubstantiveUserTurn,
83
+ prewarmPredictionCount: state.preparedPrewarm?.pairs.length ?? 0,
84
+ normalPredictionCount: state.preparedNormal?.pairs.length ?? 0,
85
+ chooserCandidateCount: predictions.length,
86
+ });
72
87
  let active = true;
73
88
  let output = '';
74
89
  let outputStarted = false;
@@ -88,23 +103,48 @@ export function createPredictiveWorkflow(config, engineConfig, nunjucksEnv) {
88
103
  return active && !state.closed && state.requestGeneration === generation;
89
104
  }
90
105
  function consumePredictions() {
106
+ const consumesPrewarm = isSubstantiveUserTurn && !state.prewarmConsumed;
107
+ const consumedPrewarmCount = consumesPrewarm
108
+ ? (state.preparedPrewarm?.pairs.length ?? 0)
109
+ : 0;
110
+ let consumedNormalCount = 0;
91
111
  for (const set of predictionSets) {
92
- if (state.preparedPrewarm?.id === set.id) {
93
- state.preparedPrewarm = undefined;
94
- state.prewarmConsumed = true;
95
- }
96
112
  if (state.preparedNormal?.id === set.id) {
113
+ consumedNormalCount = set.pairs.length;
97
114
  state.preparedNormal = undefined;
98
115
  }
99
116
  }
117
+ if (consumesPrewarm) {
118
+ state.preparedPrewarm = undefined;
119
+ state.prewarmConsumed = true;
120
+ }
121
+ if (isSubstantiveUserTurn || consumedNormalCount > 0) {
122
+ logger.info('Prepared predictions consumed', {
123
+ callId,
124
+ runId,
125
+ generation,
126
+ prewarmPredictionCount: consumedPrewarmCount,
127
+ normalPredictionCount: consumedNormalCount,
128
+ });
129
+ }
100
130
  }
101
- function publish(controller, delta) {
131
+ function publish(controller, delta, source, match) {
102
132
  if (!isCurrent() || !delta)
103
133
  return false;
104
134
  if (!outputStarted) {
105
135
  outputStarted = true;
106
136
  consumePredictions();
107
137
  logger.debug(`[MARK] Predictive workflow TTFT: ${config.name}`);
138
+ logger.info('Predictive response winner selected', {
139
+ callId,
140
+ runId,
141
+ generation,
142
+ source,
143
+ ttftMs: Date.now() - responseStartedAt,
144
+ chooserCandidateCount: predictions.length,
145
+ selectedIndex: match?.index,
146
+ selectedScore: match?.score,
147
+ });
108
148
  }
109
149
  output += delta;
110
150
  controller.enqueue({ role: 'agent', delta });
@@ -118,6 +158,13 @@ export function createPredictiveWorkflow(config, engineConfig, nunjucksEnv) {
118
158
  state.stopCurrent = undefined;
119
159
  mainTrace.response = output;
120
160
  void addAndFlushTrace(stepTracer, mainTrace, logger);
161
+ logger.info('Predictive response completed', {
162
+ callId,
163
+ runId,
164
+ generation,
165
+ durationMs: Date.now() - responseStartedAt,
166
+ outputLength: output.length,
167
+ });
121
168
  if (!state.closed) {
122
169
  startNormalPrediction(messages, output, renderedPrompt, ctx, state, generation);
123
170
  }
@@ -126,6 +173,13 @@ export function createPredictiveWorkflow(config, engineConfig, nunjucksEnv) {
126
173
  if (!active)
127
174
  return;
128
175
  active = false;
176
+ logger.info('Predictive response stopped', {
177
+ callId,
178
+ runId,
179
+ generation,
180
+ outputStarted,
181
+ durationMs: Date.now() - responseStartedAt,
182
+ });
129
183
  void provisionalReader?.cancel();
130
184
  try {
131
185
  publicController?.close();
@@ -172,20 +226,20 @@ export function createPredictiveWorkflow(config, engineConfig, nunjucksEnv) {
172
226
  void firstProvisionalChunk
173
227
  .then(({ reader }) => reader.cancel())
174
228
  .catch(() => undefined);
175
- publish(controller, winner.pair.agentResponse);
229
+ publish(controller, winner.pair.agentResponse, winner.kind, winner);
176
230
  controller.close();
177
231
  finishSuccessfulResponse();
178
232
  return;
179
233
  }
180
234
  provisionalReader = winner.reader;
181
- if (!publish(controller, winner.chunk))
235
+ if (!publish(controller, winner.chunk, winner.kind))
182
236
  return;
183
237
  while (isCurrent()) {
184
238
  try {
185
239
  const next = await winner.reader.read();
186
240
  if (next.done)
187
241
  break;
188
- if (!publish(controller, next.value))
242
+ if (!publish(controller, next.value, winner.kind))
189
243
  return;
190
244
  }
191
245
  catch (error) {
@@ -212,14 +266,42 @@ export function createPredictiveWorkflow(config, engineConfig, nunjucksEnv) {
212
266
  });
213
267
  }
214
268
  function prewarmForUsersHello(ctx) {
215
- if (config.prewarmPredictions.length === 0)
216
- return;
217
269
  const callId = getCallId(ctx);
218
270
  const state = getOrCreateState(callId);
219
- if (state.prewarmStarted || state.prewarmConsumed)
271
+ if (state.prewarmStarted || state.prewarmConsumed) {
272
+ logger.debug('Opening prediction prewarm skipped', {
273
+ callId,
274
+ prewarmStarted: state.prewarmStarted,
275
+ prewarmConsumed: state.prewarmConsumed,
276
+ });
220
277
  return;
278
+ }
221
279
  state.prewarmStarted = true;
280
+ logger.info('Opening prediction prewarm started', {
281
+ callId,
282
+ predictionCount: config.prewarmPredictions.length,
283
+ chooserPrewarmEnabled: chooser.prewarm !== undefined,
284
+ });
285
+ const chooserPrewarmStartedAt = Date.now();
286
+ void chooser
287
+ .prewarm?.()
288
+ .then(() => {
289
+ logger.info('Prediction chooser prewarm completed', {
290
+ callId,
291
+ durationMs: Date.now() - chooserPrewarmStartedAt,
292
+ });
293
+ })
294
+ .catch((error) => {
295
+ logger.warn('Prediction chooser prewarm failed', {
296
+ callId,
297
+ durationMs: Date.now() - chooserPrewarmStartedAt,
298
+ error,
299
+ });
300
+ });
301
+ if (config.prewarmPredictions.length === 0)
302
+ return;
222
303
  const generation = state.requestGeneration;
304
+ const predictionStartedAt = Date.now();
223
305
  const task = (async () => {
224
306
  const template = typeof config.prompt === 'string' ? config.prompt : await config.prompt.content();
225
307
  const renderedPrompt = nunjucksEnv.renderString(template, ctx || {});
@@ -231,18 +313,32 @@ export function createPredictiveWorkflow(config, engineConfig, nunjucksEnv) {
231
313
  supplementalPredictions: config.prewarmPredictions,
232
314
  traceName: 'predictor[prewarm]',
233
315
  });
234
- if (!state.closed && !state.prewarmConsumed && state.requestGeneration === generation) {
316
+ const stored = !state.closed && !state.prewarmConsumed;
317
+ if (stored) {
235
318
  state.preparedPrewarm = { id: crypto.randomUUID(), pairs: prediction.pairs };
319
+ }
320
+ logger.info('Opening prediction prewarm completed', {
321
+ callId,
322
+ durationMs: Date.now() - predictionStartedAt,
323
+ predictionCount: prediction.pairs.length,
324
+ stored,
325
+ discardReason: state.closed
326
+ ? 'call-closed'
327
+ : state.prewarmConsumed
328
+ ? 'opening-turn-consumed'
329
+ : undefined,
330
+ });
331
+ if (!state.closed) {
236
332
  await addAndFlushTrace(stepTracer, prediction.trace, logger);
237
333
  }
238
334
  })();
239
- trackPrediction(task, state, ctx, generation);
335
+ trackPrediction(task, state, ctx, generation, () => !state.prewarmConsumed);
240
336
  }
241
337
  async function waitForPendingPrediction(callId) {
242
338
  const state = states.get(callId);
243
339
  if (!state)
244
340
  return;
245
- await Promise.all([...(state.pendingPredictions.get(state.requestGeneration) ?? [])]);
341
+ await Promise.all([...state.pendingPredictions.values()].flatMap((predictions) => [...predictions]));
246
342
  }
247
343
  function clear(callId) {
248
344
  const state = states.get(callId);
@@ -269,6 +365,12 @@ export function createPredictiveWorkflow(config, engineConfig, nunjucksEnv) {
269
365
  return state;
270
366
  }
271
367
  function startNormalPrediction(messages, agentResponse, renderedMainPrompt, ctx, state, generation) {
368
+ const callId = getCallId(ctx);
369
+ const predictionStartedAt = Date.now();
370
+ logger.debug('Normal prediction generation started', {
371
+ callId,
372
+ generation,
373
+ });
272
374
  const conversationWithResponse = [
273
375
  stringifyMessages(messages).trim(),
274
376
  `Agent: ${agentResponse.trim()}`,
@@ -283,16 +385,31 @@ export function createPredictiveWorkflow(config, engineConfig, nunjucksEnv) {
283
385
  supplementalPredictions: config.normalFlowPredictions,
284
386
  traceName: 'predictor[normal]',
285
387
  }).then(async (prediction) => {
286
- if (!state.closed && state.requestGeneration === generation) {
388
+ const stored = !state.closed && state.requestGeneration === generation;
389
+ if (stored) {
287
390
  state.preparedNormal = { id: crypto.randomUUID(), pairs: prediction.pairs };
391
+ }
392
+ logger.info('Normal prediction generation completed', {
393
+ callId,
394
+ generation,
395
+ durationMs: Date.now() - predictionStartedAt,
396
+ predictionCount: prediction.pairs.length,
397
+ stored,
398
+ discardReason: state.closed
399
+ ? 'call-closed'
400
+ : state.requestGeneration !== generation
401
+ ? 'conversation-changed'
402
+ : undefined,
403
+ });
404
+ if (!state.closed) {
288
405
  await addAndFlushTrace(stepTracer, prediction.trace, logger);
289
406
  }
290
407
  });
291
408
  trackPrediction(task, state, ctx, generation);
292
409
  }
293
- function trackPrediction(task, state, ctx, generation) {
410
+ function trackPrediction(task, state, ctx, generation, isRelevant = () => state.requestGeneration === generation) {
294
411
  const handled = task.catch(async (error) => {
295
- if (state.closed || state.requestGeneration !== generation)
412
+ if (state.closed || !isRelevant())
296
413
  return;
297
414
  const operation = isOperationError(error) ? error : undefined;
298
415
  const cause = operation?.cause ?? error;
@@ -367,6 +484,8 @@ export function createPredictiveWorkflow(config, engineConfig, nunjucksEnv) {
367
484
  return { pairs, trace };
368
485
  }
369
486
  async function choosePrediction(pairs, messages, ctx, parentRunId, isActive) {
487
+ const callId = getCallId(ctx);
488
+ const chooserStartedAt = Date.now();
370
489
  const actualUserResponse = messages.at(-1)?.text ?? '';
371
490
  const history = messages.slice(0, -1);
372
491
  const stringifiedHistory = stringifyMessages(history);
@@ -390,13 +509,29 @@ export function createPredictiveWorkflow(config, engineConfig, nunjucksEnv) {
390
509
  catch (error) {
391
510
  throw createOperationError(error, chooser, trace);
392
511
  }
393
- if (!isActive())
512
+ if (!isActive()) {
513
+ logger.debug('Prediction chooser result ignored', {
514
+ callId,
515
+ parentRunId,
516
+ durationMs: Date.now() - chooserStartedAt,
517
+ reason: 'response-replaced',
518
+ });
394
519
  return new Promise(() => undefined);
520
+ }
395
521
  trace.response = JSON.stringify(result);
396
522
  if (result.scores.length !== pairs.length) {
397
523
  throw createOperationError(new Error('Chooser returned the wrong number of candidate scores.'), chooser, trace);
398
524
  }
399
525
  if (result.selectedIndex === undefined) {
526
+ logger.info('Prediction chooser completed', {
527
+ callId,
528
+ parentRunId,
529
+ durationMs: Date.now() - chooserStartedAt,
530
+ candidateCount: pairs.length,
531
+ scores: result.scores,
532
+ usage: result.usage,
533
+ diagnostics: result.diagnostics,
534
+ });
400
535
  void addAndFlushTrace(stepTracer, trace, logger);
401
536
  return new Promise(() => undefined);
402
537
  }
@@ -405,8 +540,24 @@ export function createPredictiveWorkflow(config, engineConfig, nunjucksEnv) {
405
540
  result.selectedIndex >= pairs.length) {
406
541
  throw createOperationError(new Error('Chooser returned an invalid candidate index.'), chooser, trace);
407
542
  }
543
+ logger.info('Prediction chooser completed', {
544
+ callId,
545
+ parentRunId,
546
+ durationMs: Date.now() - chooserStartedAt,
547
+ candidateCount: pairs.length,
548
+ selectedIndex: result.selectedIndex,
549
+ selectedScore: result.scores[result.selectedIndex],
550
+ scores: result.scores,
551
+ usage: result.usage,
552
+ diagnostics: result.diagnostics,
553
+ });
408
554
  void addAndFlushTrace(stepTracer, trace, logger);
409
- return { kind: 'prediction', pair: pairs[result.selectedIndex] };
555
+ return {
556
+ kind: 'prediction',
557
+ pair: pairs[result.selectedIndex],
558
+ index: result.selectedIndex,
559
+ score: result.scores[result.selectedIndex],
560
+ };
410
561
  }
411
562
  return { run, prewarmForUsersHello, waitForPendingPrediction, clear };
412
563
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@recombine-ai/platform",
3
3
  "type": "module",
4
- "version": "0.9.1-test.2",
4
+ "version": "0.9.1-test.4",
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",
@@ -1,3 +0,0 @@
1
- 1@deN?��) x<�Dn��َ!�2��/ vQ���A�B�]5V�|Zȓp
2
- ��
3
- 3����W4�io<����أ��1^4�������3O@�w�"mH�o�
@@ -1 +0,0 @@
1
- import{a as r}from"../chunks/B3sRmUmR.js";import{y as t}from"../chunks/YRWW-SW8.js";export{t as load_css,r as start};