@bolt-foundry/gambit 0.8.6-rc.3 → 0.8.6-rc.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 (338) hide show
  1. package/CHANGELOG.md +20 -1
  2. package/esm/gambit/simulator-ui/dist/bundle.js +2435 -620
  3. package/esm/gambit/simulator-ui/dist/bundle.js.map +4 -4
  4. package/esm/simulator-ui/__generated__/__isograph/Mutation/GambitWorkspaceFeedbackSave/entrypoint.d.ts +7 -0
  5. package/esm/simulator-ui/__generated__/__isograph/Mutation/GambitWorkspaceFeedbackSave/entrypoint.d.ts.map +1 -0
  6. package/esm/simulator-ui/__generated__/__isograph/Mutation/GambitWorkspaceFeedbackSave/entrypoint.js +22 -0
  7. package/esm/simulator-ui/__generated__/__isograph/Mutation/GambitWorkspaceFeedbackSave/normalization_ast.d.ts +4 -0
  8. package/esm/simulator-ui/__generated__/__isograph/Mutation/GambitWorkspaceFeedbackSave/normalization_ast.d.ts.map +1 -0
  9. package/esm/simulator-ui/__generated__/__isograph/Mutation/GambitWorkspaceFeedbackSave/normalization_ast.js +456 -0
  10. package/esm/simulator-ui/__generated__/__isograph/Mutation/GambitWorkspaceFeedbackSave/output_type.d.ts +3 -0
  11. package/esm/simulator-ui/__generated__/__isograph/Mutation/GambitWorkspaceFeedbackSave/output_type.d.ts.map +1 -0
  12. package/esm/simulator-ui/__generated__/__isograph/Mutation/GambitWorkspaceFeedbackSave/output_type.js +1 -0
  13. package/esm/simulator-ui/__generated__/__isograph/Mutation/GambitWorkspaceFeedbackSave/param_type.d.ts +110 -0
  14. package/esm/simulator-ui/__generated__/__isograph/Mutation/GambitWorkspaceFeedbackSave/param_type.d.ts.map +1 -0
  15. package/esm/simulator-ui/__generated__/__isograph/Mutation/GambitWorkspaceFeedbackSave/param_type.js +1 -0
  16. package/esm/simulator-ui/__generated__/__isograph/Mutation/GambitWorkspaceFeedbackSave/parameters_type.d.ts +10 -0
  17. package/esm/simulator-ui/__generated__/__isograph/Mutation/GambitWorkspaceFeedbackSave/parameters_type.d.ts.map +1 -0
  18. package/esm/simulator-ui/__generated__/__isograph/Mutation/GambitWorkspaceFeedbackSave/parameters_type.js +1 -0
  19. package/esm/simulator-ui/__generated__/__isograph/Mutation/GambitWorkspaceFeedbackSave/query_text.d.ts +3 -0
  20. package/esm/simulator-ui/__generated__/__isograph/Mutation/GambitWorkspaceFeedbackSave/query_text.d.ts.map +1 -0
  21. package/esm/simulator-ui/__generated__/__isograph/Mutation/GambitWorkspaceFeedbackSave/query_text.js +96 -0
  22. package/esm/simulator-ui/__generated__/__isograph/Mutation/GambitWorkspaceFeedbackSave/raw_response_type.d.ts +91 -0
  23. package/esm/simulator-ui/__generated__/__isograph/Mutation/GambitWorkspaceFeedbackSave/raw_response_type.d.ts.map +1 -0
  24. package/esm/simulator-ui/__generated__/__isograph/Mutation/GambitWorkspaceFeedbackSave/raw_response_type.js +1 -0
  25. package/esm/simulator-ui/__generated__/__isograph/Mutation/GambitWorkspaceFeedbackSave/resolver_reader.d.ts +6 -0
  26. package/esm/simulator-ui/__generated__/__isograph/Mutation/GambitWorkspaceFeedbackSave/resolver_reader.d.ts.map +1 -0
  27. package/esm/simulator-ui/__generated__/__isograph/Mutation/GambitWorkspaceFeedbackSave/resolver_reader.js +610 -0
  28. package/esm/simulator-ui/__generated__/__isograph/Mutation/GambitWorkspaceScenarioRunSend/normalization_ast.d.ts.map +1 -1
  29. package/esm/simulator-ui/__generated__/__isograph/Mutation/GambitWorkspaceScenarioRunSend/normalization_ast.js +86 -0
  30. package/esm/simulator-ui/__generated__/__isograph/Mutation/GambitWorkspaceScenarioRunSend/param_type.d.ts +18 -0
  31. package/esm/simulator-ui/__generated__/__isograph/Mutation/GambitWorkspaceScenarioRunSend/param_type.d.ts.map +1 -1
  32. package/esm/simulator-ui/__generated__/__isograph/Mutation/GambitWorkspaceScenarioRunSend/query_text.d.ts +1 -1
  33. package/esm/simulator-ui/__generated__/__isograph/Mutation/GambitWorkspaceScenarioRunSend/query_text.d.ts.map +1 -1
  34. package/esm/simulator-ui/__generated__/__isograph/Mutation/GambitWorkspaceScenarioRunSend/query_text.js +18 -0
  35. package/esm/simulator-ui/__generated__/__isograph/Mutation/GambitWorkspaceScenarioRunSend/raw_response_type.d.ts +18 -0
  36. package/esm/simulator-ui/__generated__/__isograph/Mutation/GambitWorkspaceScenarioRunSend/raw_response_type.d.ts.map +1 -1
  37. package/esm/simulator-ui/__generated__/__isograph/Mutation/GambitWorkspaceScenarioRunSend/resolver_reader.d.ts.map +1 -1
  38. package/esm/simulator-ui/__generated__/__isograph/Mutation/GambitWorkspaceScenarioRunSend/resolver_reader.js +120 -0
  39. package/esm/simulator-ui/__generated__/__isograph/Mutation/GambitWorkspaceScenarioRunStart/normalization_ast.d.ts.map +1 -1
  40. package/esm/simulator-ui/__generated__/__isograph/Mutation/GambitWorkspaceScenarioRunStart/normalization_ast.js +43 -0
  41. package/esm/simulator-ui/__generated__/__isograph/Mutation/GambitWorkspaceScenarioRunStart/param_type.d.ts +9 -0
  42. package/esm/simulator-ui/__generated__/__isograph/Mutation/GambitWorkspaceScenarioRunStart/param_type.d.ts.map +1 -1
  43. package/esm/simulator-ui/__generated__/__isograph/Mutation/GambitWorkspaceScenarioRunStart/query_text.d.ts +1 -1
  44. package/esm/simulator-ui/__generated__/__isograph/Mutation/GambitWorkspaceScenarioRunStart/query_text.d.ts.map +1 -1
  45. package/esm/simulator-ui/__generated__/__isograph/Mutation/GambitWorkspaceScenarioRunStart/query_text.js +9 -0
  46. package/esm/simulator-ui/__generated__/__isograph/Mutation/GambitWorkspaceScenarioRunStart/raw_response_type.d.ts +9 -0
  47. package/esm/simulator-ui/__generated__/__isograph/Mutation/GambitWorkspaceScenarioRunStart/raw_response_type.d.ts.map +1 -1
  48. package/esm/simulator-ui/__generated__/__isograph/Mutation/GambitWorkspaceScenarioRunStart/resolver_reader.d.ts.map +1 -1
  49. package/esm/simulator-ui/__generated__/__isograph/Mutation/GambitWorkspaceScenarioRunStart/resolver_reader.js +60 -0
  50. package/esm/simulator-ui/__generated__/__isograph/Query/EntrypointSimulatorTestPage/normalization_ast.d.ts.map +1 -1
  51. package/esm/simulator-ui/__generated__/__isograph/Query/EntrypointSimulatorTestPage/normalization_ast.js +43 -0
  52. package/esm/simulator-ui/__generated__/__isograph/Query/EntrypointSimulatorTestPage/query_text.d.ts +1 -1
  53. package/esm/simulator-ui/__generated__/__isograph/Query/EntrypointSimulatorTestPage/query_text.d.ts.map +1 -1
  54. package/esm/simulator-ui/__generated__/__isograph/Query/EntrypointSimulatorTestPage/query_text.js +9 -0
  55. package/esm/simulator-ui/__generated__/__isograph/Query/EntrypointSimulatorTestPage/raw_response_type.d.ts +9 -0
  56. package/esm/simulator-ui/__generated__/__isograph/Query/EntrypointSimulatorTestPage/raw_response_type.d.ts.map +1 -1
  57. package/esm/simulator-ui/__generated__/__isograph/Workspace/TestTab/param_type.d.ts +9 -0
  58. package/esm/simulator-ui/__generated__/__isograph/Workspace/TestTab/param_type.d.ts.map +1 -1
  59. package/esm/simulator-ui/__generated__/__isograph/Workspace/TestTab/resolver_reader.d.ts.map +1 -1
  60. package/esm/simulator-ui/__generated__/__isograph/Workspace/TestTab/resolver_reader.js +60 -0
  61. package/esm/simulator-ui/__generated__/__isograph/iso.d.ts +4 -0
  62. package/esm/simulator-ui/__generated__/__isograph/iso.d.ts.map +1 -1
  63. package/esm/simulator-ui/__generated__/__isograph/iso.js +3 -0
  64. package/esm/simulator-ui/__generated__/builtRoutes.d.ts +2 -0
  65. package/esm/simulator-ui/__generated__/builtRoutes.d.ts.map +1 -1
  66. package/esm/simulator-ui/__generated__/builtRoutes.js +3 -0
  67. package/esm/simulator-ui/isograph/components/Query/SimulatorTestPage.d.ts.map +1 -1
  68. package/esm/simulator-ui/isograph/components/Query/SimulatorTestPage.js +141 -4
  69. package/esm/simulator-ui/isograph/entrypoints/EntrypointSimulatorWorkspaceShell.d.ts.map +1 -1
  70. package/esm/simulator-ui/isograph/entrypoints/EntrypointSimulatorWorkspaceShell.js +3 -1
  71. package/esm/simulator-ui/mutations/GambitWorkspaceFeedbackSave.d.ts +93 -0
  72. package/esm/simulator-ui/mutations/GambitWorkspaceFeedbackSave.d.ts.map +1 -0
  73. package/esm/simulator-ui/mutations/GambitWorkspaceFeedbackSave.js +101 -0
  74. package/esm/simulator-ui/mutations/GambitWorkspaceFeedbackSaveMutation.d.ts +93 -0
  75. package/esm/simulator-ui/mutations/GambitWorkspaceFeedbackSaveMutation.d.ts.map +1 -0
  76. package/esm/simulator-ui/mutations/GambitWorkspaceFeedbackSaveMutation.js +7 -0
  77. package/esm/simulator-ui/mutations/GambitWorkspaceScenarioRunSend.d.ts +18 -0
  78. package/esm/simulator-ui/mutations/GambitWorkspaceScenarioRunSend.d.ts.map +1 -1
  79. package/esm/simulator-ui/mutations/GambitWorkspaceScenarioRunSend.js +18 -0
  80. package/esm/simulator-ui/mutations/GambitWorkspaceScenarioRunSendMutation.d.ts +18 -0
  81. package/esm/simulator-ui/mutations/GambitWorkspaceScenarioRunSendMutation.d.ts.map +1 -1
  82. package/esm/simulator-ui/mutations/GambitWorkspaceScenarioRunStart.d.ts +9 -0
  83. package/esm/simulator-ui/mutations/GambitWorkspaceScenarioRunStart.d.ts.map +1 -1
  84. package/esm/simulator-ui/mutations/GambitWorkspaceScenarioRunStart.js +9 -0
  85. package/esm/simulator-ui/mutations/GambitWorkspaceScenarioRunStartMutation.d.ts +9 -0
  86. package/esm/simulator-ui/mutations/GambitWorkspaceScenarioRunStartMutation.d.ts.map +1 -1
  87. package/esm/simulator-ui/src/AppIsoMinimal.d.ts +3 -0
  88. package/esm/simulator-ui/src/AppIsoMinimal.d.ts.map +1 -1
  89. package/esm/simulator-ui/src/AppIsoMinimal.js +7 -4
  90. package/esm/simulator-ui/src/AppShell.d.ts.map +1 -1
  91. package/esm/simulator-ui/src/AppShell.js +2 -2
  92. package/esm/simulator-ui/src/MinimalRouterRoot.js +4 -2
  93. package/esm/simulator-ui/src/RouterContext.d.ts.map +1 -1
  94. package/esm/simulator-ui/src/RouterContext.js +7 -3
  95. package/esm/simulator-ui/src/shared.d.ts.map +1 -1
  96. package/esm/simulator-ui/src/shared.js +3 -3
  97. package/esm/src/server/request_handler.d.ts +210 -0
  98. package/esm/src/server/request_handler.d.ts.map +1 -0
  99. package/esm/src/server/request_handler.js +416 -0
  100. package/esm/src/server/workspace/build.d.ts +57 -0
  101. package/esm/src/server/workspace/build.d.ts.map +1 -0
  102. package/esm/src/server/workspace/build.js +377 -0
  103. package/esm/src/server/workspace/conversation_sessions.d.ts +83 -0
  104. package/esm/src/server/workspace/conversation_sessions.d.ts.map +1 -0
  105. package/esm/src/server/workspace/conversation_sessions.js +163 -0
  106. package/esm/src/server/workspace/grading.d.ts +52 -0
  107. package/esm/src/server/workspace/grading.d.ts.map +1 -0
  108. package/esm/src/server/workspace/grading.js +488 -0
  109. package/esm/src/server/workspace/helpers.d.ts +46 -0
  110. package/esm/src/server/workspace/helpers.d.ts.map +1 -0
  111. package/esm/src/server/workspace/helpers.js +340 -0
  112. package/esm/src/server/workspace/read_model.d.ts +35 -0
  113. package/esm/src/server/workspace/read_model.d.ts.map +1 -0
  114. package/esm/src/server/workspace/read_model.js +121 -0
  115. package/esm/src/server/workspace/response_events.d.ts +28 -0
  116. package/esm/src/server/workspace/response_events.d.ts.map +1 -0
  117. package/esm/src/server/workspace/response_events.js +178 -0
  118. package/esm/src/server/workspace/run_deck.d.ts +23 -0
  119. package/esm/src/server/workspace/run_deck.d.ts.map +1 -0
  120. package/esm/src/server/workspace/run_deck.js +79 -0
  121. package/esm/src/server/workspace/scenario_history.d.ts +8 -0
  122. package/esm/src/server/workspace/scenario_history.d.ts.map +1 -0
  123. package/esm/src/server/workspace/scenario_history.js +269 -0
  124. package/esm/src/server/workspace/scenarios.d.ts +93 -0
  125. package/esm/src/server/workspace/scenarios.d.ts.map +1 -0
  126. package/esm/src/server/workspace/scenarios.js +1052 -0
  127. package/esm/src/server/workspace/schema.d.ts +35 -0
  128. package/esm/src/server/workspace/schema.d.ts.map +1 -0
  129. package/esm/src/server/workspace/schema.js +427 -0
  130. package/esm/src/server/workspace/sessions.d.ts +38 -0
  131. package/esm/src/server/workspace/sessions.d.ts.map +1 -0
  132. package/esm/src/server/workspace/sessions.js +232 -0
  133. package/esm/src/server/workspace/types.d.ts +128 -0
  134. package/esm/src/server/workspace/types.d.ts.map +1 -0
  135. package/esm/src/server/workspace/types.js +1 -0
  136. package/esm/src/server/workspace/verify.d.ts +52 -0
  137. package/esm/src/server/workspace/verify.d.ts.map +1 -0
  138. package/esm/src/server/workspace/verify.js +449 -0
  139. package/esm/src/server.d.ts +0 -3
  140. package/esm/src/server.d.ts.map +1 -1
  141. package/esm/src/server.js +324 -6732
  142. package/esm/src/server_isograph_environment.d.ts +12 -1
  143. package/esm/src/server_isograph_environment.d.ts.map +1 -1
  144. package/esm/src/server_legacy_api_routes.d.ts +137 -0
  145. package/esm/src/server_legacy_api_routes.d.ts.map +1 -0
  146. package/esm/src/server_legacy_api_routes.js +629 -0
  147. package/esm/src/server_openresponses.d.ts +6 -0
  148. package/esm/src/server_openresponses.d.ts.map +1 -0
  149. package/esm/src/server_openresponses.js +687 -0
  150. package/esm/src/server_session_store.d.ts +4 -0
  151. package/esm/src/server_session_store.d.ts.map +1 -1
  152. package/esm/src/server_session_store.js +196 -1
  153. package/esm/src/server_simulator_ui.d.ts +27 -0
  154. package/esm/src/server_simulator_ui.d.ts.map +1 -0
  155. package/esm/src/server_simulator_ui.js +501 -0
  156. package/esm/src/server_types.d.ts +22 -0
  157. package/esm/src/server_types.d.ts.map +1 -1
  158. package/esm/src/server_workspace_decks.d.ts +31 -0
  159. package/esm/src/server_workspace_decks.d.ts.map +1 -0
  160. package/esm/src/server_workspace_decks.js +98 -0
  161. package/esm/src/server_workspace_graphql.d.ts +17 -0
  162. package/esm/src/server_workspace_graphql.d.ts.map +1 -0
  163. package/esm/src/server_workspace_graphql.js +52 -0
  164. package/esm/src/server_workspace_runtime.d.ts +55 -0
  165. package/esm/src/server_workspace_runtime.d.ts.map +1 -0
  166. package/esm/src/server_workspace_runtime.js +358 -0
  167. package/esm/src/simulator_graphql.d.ts +14 -1
  168. package/esm/src/simulator_graphql.d.ts.map +1 -1
  169. package/esm/src/simulator_graphql.js +77 -0
  170. package/package.json +1 -1
  171. package/script/gambit/simulator-ui/dist/bundle.js +2435 -620
  172. package/script/gambit/simulator-ui/dist/bundle.js.map +4 -4
  173. package/script/simulator-ui/__generated__/__isograph/Mutation/GambitWorkspaceFeedbackSave/entrypoint.d.ts +7 -0
  174. package/script/simulator-ui/__generated__/__isograph/Mutation/GambitWorkspaceFeedbackSave/entrypoint.d.ts.map +1 -0
  175. package/script/simulator-ui/__generated__/__isograph/Mutation/GambitWorkspaceFeedbackSave/entrypoint.js +27 -0
  176. package/script/simulator-ui/__generated__/__isograph/Mutation/GambitWorkspaceFeedbackSave/normalization_ast.d.ts +4 -0
  177. package/script/simulator-ui/__generated__/__isograph/Mutation/GambitWorkspaceFeedbackSave/normalization_ast.d.ts.map +1 -0
  178. package/script/simulator-ui/__generated__/__isograph/Mutation/GambitWorkspaceFeedbackSave/normalization_ast.js +458 -0
  179. package/script/simulator-ui/__generated__/__isograph/Mutation/GambitWorkspaceFeedbackSave/output_type.d.ts +3 -0
  180. package/script/simulator-ui/__generated__/__isograph/Mutation/GambitWorkspaceFeedbackSave/output_type.d.ts.map +1 -0
  181. package/script/simulator-ui/__generated__/__isograph/Mutation/GambitWorkspaceFeedbackSave/output_type.js +2 -0
  182. package/script/simulator-ui/__generated__/__isograph/Mutation/GambitWorkspaceFeedbackSave/param_type.d.ts +110 -0
  183. package/script/simulator-ui/__generated__/__isograph/Mutation/GambitWorkspaceFeedbackSave/param_type.d.ts.map +1 -0
  184. package/script/simulator-ui/__generated__/__isograph/Mutation/GambitWorkspaceFeedbackSave/param_type.js +2 -0
  185. package/script/simulator-ui/__generated__/__isograph/Mutation/GambitWorkspaceFeedbackSave/parameters_type.d.ts +10 -0
  186. package/script/simulator-ui/__generated__/__isograph/Mutation/GambitWorkspaceFeedbackSave/parameters_type.d.ts.map +1 -0
  187. package/script/simulator-ui/__generated__/__isograph/Mutation/GambitWorkspaceFeedbackSave/parameters_type.js +2 -0
  188. package/script/simulator-ui/__generated__/__isograph/Mutation/GambitWorkspaceFeedbackSave/query_text.d.ts +3 -0
  189. package/script/simulator-ui/__generated__/__isograph/Mutation/GambitWorkspaceFeedbackSave/query_text.d.ts.map +1 -0
  190. package/script/simulator-ui/__generated__/__isograph/Mutation/GambitWorkspaceFeedbackSave/query_text.js +98 -0
  191. package/script/simulator-ui/__generated__/__isograph/Mutation/GambitWorkspaceFeedbackSave/raw_response_type.d.ts +91 -0
  192. package/script/simulator-ui/__generated__/__isograph/Mutation/GambitWorkspaceFeedbackSave/raw_response_type.d.ts.map +1 -0
  193. package/script/simulator-ui/__generated__/__isograph/Mutation/GambitWorkspaceFeedbackSave/raw_response_type.js +2 -0
  194. package/script/simulator-ui/__generated__/__isograph/Mutation/GambitWorkspaceFeedbackSave/resolver_reader.d.ts +6 -0
  195. package/script/simulator-ui/__generated__/__isograph/Mutation/GambitWorkspaceFeedbackSave/resolver_reader.d.ts.map +1 -0
  196. package/script/simulator-ui/__generated__/__isograph/Mutation/GambitWorkspaceFeedbackSave/resolver_reader.js +615 -0
  197. package/script/simulator-ui/__generated__/__isograph/Mutation/GambitWorkspaceScenarioRunSend/normalization_ast.d.ts.map +1 -1
  198. package/script/simulator-ui/__generated__/__isograph/Mutation/GambitWorkspaceScenarioRunSend/normalization_ast.js +86 -0
  199. package/script/simulator-ui/__generated__/__isograph/Mutation/GambitWorkspaceScenarioRunSend/param_type.d.ts +18 -0
  200. package/script/simulator-ui/__generated__/__isograph/Mutation/GambitWorkspaceScenarioRunSend/param_type.d.ts.map +1 -1
  201. package/script/simulator-ui/__generated__/__isograph/Mutation/GambitWorkspaceScenarioRunSend/query_text.d.ts +1 -1
  202. package/script/simulator-ui/__generated__/__isograph/Mutation/GambitWorkspaceScenarioRunSend/query_text.d.ts.map +1 -1
  203. package/script/simulator-ui/__generated__/__isograph/Mutation/GambitWorkspaceScenarioRunSend/query_text.js +18 -0
  204. package/script/simulator-ui/__generated__/__isograph/Mutation/GambitWorkspaceScenarioRunSend/raw_response_type.d.ts +18 -0
  205. package/script/simulator-ui/__generated__/__isograph/Mutation/GambitWorkspaceScenarioRunSend/raw_response_type.d.ts.map +1 -1
  206. package/script/simulator-ui/__generated__/__isograph/Mutation/GambitWorkspaceScenarioRunSend/resolver_reader.d.ts.map +1 -1
  207. package/script/simulator-ui/__generated__/__isograph/Mutation/GambitWorkspaceScenarioRunSend/resolver_reader.js +120 -0
  208. package/script/simulator-ui/__generated__/__isograph/Mutation/GambitWorkspaceScenarioRunStart/normalization_ast.d.ts.map +1 -1
  209. package/script/simulator-ui/__generated__/__isograph/Mutation/GambitWorkspaceScenarioRunStart/normalization_ast.js +43 -0
  210. package/script/simulator-ui/__generated__/__isograph/Mutation/GambitWorkspaceScenarioRunStart/param_type.d.ts +9 -0
  211. package/script/simulator-ui/__generated__/__isograph/Mutation/GambitWorkspaceScenarioRunStart/param_type.d.ts.map +1 -1
  212. package/script/simulator-ui/__generated__/__isograph/Mutation/GambitWorkspaceScenarioRunStart/query_text.d.ts +1 -1
  213. package/script/simulator-ui/__generated__/__isograph/Mutation/GambitWorkspaceScenarioRunStart/query_text.d.ts.map +1 -1
  214. package/script/simulator-ui/__generated__/__isograph/Mutation/GambitWorkspaceScenarioRunStart/query_text.js +9 -0
  215. package/script/simulator-ui/__generated__/__isograph/Mutation/GambitWorkspaceScenarioRunStart/raw_response_type.d.ts +9 -0
  216. package/script/simulator-ui/__generated__/__isograph/Mutation/GambitWorkspaceScenarioRunStart/raw_response_type.d.ts.map +1 -1
  217. package/script/simulator-ui/__generated__/__isograph/Mutation/GambitWorkspaceScenarioRunStart/resolver_reader.d.ts.map +1 -1
  218. package/script/simulator-ui/__generated__/__isograph/Mutation/GambitWorkspaceScenarioRunStart/resolver_reader.js +60 -0
  219. package/script/simulator-ui/__generated__/__isograph/Query/EntrypointSimulatorTestPage/normalization_ast.d.ts.map +1 -1
  220. package/script/simulator-ui/__generated__/__isograph/Query/EntrypointSimulatorTestPage/normalization_ast.js +43 -0
  221. package/script/simulator-ui/__generated__/__isograph/Query/EntrypointSimulatorTestPage/query_text.d.ts +1 -1
  222. package/script/simulator-ui/__generated__/__isograph/Query/EntrypointSimulatorTestPage/query_text.d.ts.map +1 -1
  223. package/script/simulator-ui/__generated__/__isograph/Query/EntrypointSimulatorTestPage/query_text.js +9 -0
  224. package/script/simulator-ui/__generated__/__isograph/Query/EntrypointSimulatorTestPage/raw_response_type.d.ts +9 -0
  225. package/script/simulator-ui/__generated__/__isograph/Query/EntrypointSimulatorTestPage/raw_response_type.d.ts.map +1 -1
  226. package/script/simulator-ui/__generated__/__isograph/Workspace/TestTab/param_type.d.ts +9 -0
  227. package/script/simulator-ui/__generated__/__isograph/Workspace/TestTab/param_type.d.ts.map +1 -1
  228. package/script/simulator-ui/__generated__/__isograph/Workspace/TestTab/resolver_reader.d.ts.map +1 -1
  229. package/script/simulator-ui/__generated__/__isograph/Workspace/TestTab/resolver_reader.js +60 -0
  230. package/script/simulator-ui/__generated__/__isograph/iso.d.ts +4 -0
  231. package/script/simulator-ui/__generated__/__isograph/iso.d.ts.map +1 -1
  232. package/script/simulator-ui/__generated__/__isograph/iso.js +45 -42
  233. package/script/simulator-ui/__generated__/builtRoutes.d.ts +2 -0
  234. package/script/simulator-ui/__generated__/builtRoutes.d.ts.map +1 -1
  235. package/script/simulator-ui/__generated__/builtRoutes.js +18 -15
  236. package/script/simulator-ui/isograph/components/Query/SimulatorTestPage.d.ts.map +1 -1
  237. package/script/simulator-ui/isograph/components/Query/SimulatorTestPage.js +141 -4
  238. package/script/simulator-ui/isograph/entrypoints/EntrypointSimulatorWorkspaceShell.d.ts.map +1 -1
  239. package/script/simulator-ui/isograph/entrypoints/EntrypointSimulatorWorkspaceShell.js +3 -1
  240. package/script/simulator-ui/mutations/GambitWorkspaceFeedbackSave.d.ts +93 -0
  241. package/script/simulator-ui/mutations/GambitWorkspaceFeedbackSave.d.ts.map +1 -0
  242. package/script/simulator-ui/mutations/GambitWorkspaceFeedbackSave.js +104 -0
  243. package/script/simulator-ui/mutations/GambitWorkspaceFeedbackSaveMutation.d.ts +93 -0
  244. package/script/simulator-ui/mutations/GambitWorkspaceFeedbackSaveMutation.d.ts.map +1 -0
  245. package/script/simulator-ui/mutations/GambitWorkspaceFeedbackSaveMutation.js +13 -0
  246. package/script/simulator-ui/mutations/GambitWorkspaceScenarioRunSend.d.ts +18 -0
  247. package/script/simulator-ui/mutations/GambitWorkspaceScenarioRunSend.d.ts.map +1 -1
  248. package/script/simulator-ui/mutations/GambitWorkspaceScenarioRunSend.js +18 -0
  249. package/script/simulator-ui/mutations/GambitWorkspaceScenarioRunSendMutation.d.ts +18 -0
  250. package/script/simulator-ui/mutations/GambitWorkspaceScenarioRunSendMutation.d.ts.map +1 -1
  251. package/script/simulator-ui/mutations/GambitWorkspaceScenarioRunStart.d.ts +9 -0
  252. package/script/simulator-ui/mutations/GambitWorkspaceScenarioRunStart.d.ts.map +1 -1
  253. package/script/simulator-ui/mutations/GambitWorkspaceScenarioRunStart.js +9 -0
  254. package/script/simulator-ui/mutations/GambitWorkspaceScenarioRunStartMutation.d.ts +9 -0
  255. package/script/simulator-ui/mutations/GambitWorkspaceScenarioRunStartMutation.d.ts.map +1 -1
  256. package/script/simulator-ui/src/AppIsoMinimal.d.ts +3 -0
  257. package/script/simulator-ui/src/AppIsoMinimal.d.ts.map +1 -1
  258. package/script/simulator-ui/src/AppIsoMinimal.js +7 -4
  259. package/script/simulator-ui/src/AppShell.d.ts.map +1 -1
  260. package/script/simulator-ui/src/AppShell.js +1 -1
  261. package/script/simulator-ui/src/MinimalRouterRoot.js +4 -2
  262. package/script/simulator-ui/src/RouterContext.d.ts.map +1 -1
  263. package/script/simulator-ui/src/RouterContext.js +6 -2
  264. package/script/simulator-ui/src/shared.d.ts.map +1 -1
  265. package/script/simulator-ui/src/shared.js +3 -3
  266. package/script/src/server/request_handler.d.ts +210 -0
  267. package/script/src/server/request_handler.d.ts.map +1 -0
  268. package/script/src/server/request_handler.js +453 -0
  269. package/script/src/server/workspace/build.d.ts +57 -0
  270. package/script/src/server/workspace/build.d.ts.map +1 -0
  271. package/script/src/server/workspace/build.js +381 -0
  272. package/script/src/server/workspace/conversation_sessions.d.ts +83 -0
  273. package/script/src/server/workspace/conversation_sessions.d.ts.map +1 -0
  274. package/script/src/server/workspace/conversation_sessions.js +167 -0
  275. package/script/src/server/workspace/grading.d.ts +52 -0
  276. package/script/src/server/workspace/grading.d.ts.map +1 -0
  277. package/script/src/server/workspace/grading.js +492 -0
  278. package/script/src/server/workspace/helpers.d.ts +46 -0
  279. package/script/src/server/workspace/helpers.d.ts.map +1 -0
  280. package/script/src/server/workspace/helpers.js +353 -0
  281. package/script/src/server/workspace/read_model.d.ts +35 -0
  282. package/script/src/server/workspace/read_model.d.ts.map +1 -0
  283. package/script/src/server/workspace/read_model.js +125 -0
  284. package/script/src/server/workspace/response_events.d.ts +28 -0
  285. package/script/src/server/workspace/response_events.d.ts.map +1 -0
  286. package/script/src/server/workspace/response_events.js +182 -0
  287. package/script/src/server/workspace/run_deck.d.ts +23 -0
  288. package/script/src/server/workspace/run_deck.d.ts.map +1 -0
  289. package/script/src/server/workspace/run_deck.js +84 -0
  290. package/script/src/server/workspace/scenario_history.d.ts +8 -0
  291. package/script/src/server/workspace/scenario_history.d.ts.map +1 -0
  292. package/script/src/server/workspace/scenario_history.js +310 -0
  293. package/script/src/server/workspace/scenarios.d.ts +93 -0
  294. package/script/src/server/workspace/scenarios.d.ts.map +1 -0
  295. package/script/src/server/workspace/scenarios.js +1089 -0
  296. package/script/src/server/workspace/schema.d.ts +35 -0
  297. package/script/src/server/workspace/schema.d.ts.map +1 -0
  298. package/script/src/server/workspace/schema.js +478 -0
  299. package/script/src/server/workspace/sessions.d.ts +38 -0
  300. package/script/src/server/workspace/sessions.d.ts.map +1 -0
  301. package/script/src/server/workspace/sessions.js +269 -0
  302. package/script/src/server/workspace/types.d.ts +128 -0
  303. package/script/src/server/workspace/types.d.ts.map +1 -0
  304. package/script/src/server/workspace/types.js +2 -0
  305. package/script/src/server/workspace/verify.d.ts +52 -0
  306. package/script/src/server/workspace/verify.d.ts.map +1 -0
  307. package/script/src/server/workspace/verify.js +453 -0
  308. package/script/src/server.d.ts +0 -3
  309. package/script/src/server.d.ts.map +1 -1
  310. package/script/src/server.js +391 -6799
  311. package/script/src/server_isograph_environment.d.ts +12 -1
  312. package/script/src/server_isograph_environment.d.ts.map +1 -1
  313. package/script/src/server_legacy_api_routes.d.ts +137 -0
  314. package/script/src/server_legacy_api_routes.d.ts.map +1 -0
  315. package/script/src/server_legacy_api_routes.js +666 -0
  316. package/script/src/server_openresponses.d.ts +6 -0
  317. package/script/src/server_openresponses.d.ts.map +1 -0
  318. package/script/src/server_openresponses.js +690 -0
  319. package/script/src/server_session_store.d.ts +4 -0
  320. package/script/src/server_session_store.d.ts.map +1 -1
  321. package/script/src/server_session_store.js +196 -1
  322. package/script/src/server_simulator_ui.d.ts +27 -0
  323. package/script/src/server_simulator_ui.d.ts.map +1 -0
  324. package/script/src/server_simulator_ui.js +544 -0
  325. package/script/src/server_types.d.ts +22 -0
  326. package/script/src/server_types.d.ts.map +1 -1
  327. package/script/src/server_workspace_decks.d.ts +31 -0
  328. package/script/src/server_workspace_decks.d.ts.map +1 -0
  329. package/script/src/server_workspace_decks.js +142 -0
  330. package/script/src/server_workspace_graphql.d.ts +17 -0
  331. package/script/src/server_workspace_graphql.d.ts.map +1 -0
  332. package/script/src/server_workspace_graphql.js +56 -0
  333. package/script/src/server_workspace_runtime.d.ts +55 -0
  334. package/script/src/server_workspace_runtime.d.ts.map +1 -0
  335. package/script/src/server_workspace_runtime.js +395 -0
  336. package/script/src/simulator_graphql.d.ts +14 -1
  337. package/script/src/simulator_graphql.d.ts.map +1 -1
  338. package/script/src/simulator_graphql.js +77 -0
@@ -0,0 +1,1089 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.createWorkspaceScenarioService = void 0;
37
+ const dntShim = __importStar(require("../../../_dnt.shims.js"));
38
+ const path = __importStar(require("../../../deps/jsr.io/@std/path/1.1.4/mod.js"));
39
+ const gambit_core_1 = require("@bolt-foundry/gambit-core");
40
+ const test_bot_js_1 = require("../../test_bot.js");
41
+ const schema_js_1 = require("./schema.js");
42
+ const helpers_js_1 = require("./helpers.js");
43
+ const run_deck_js_1 = require("./run_deck.js");
44
+ const scenario_history_js_1 = require("./scenario_history.js");
45
+ const DEFAULT_TEST_BOT_SEED_PROMPT = "Start the conversation as the user. Do not wait for the assistant to speak first.";
46
+ const traceCategory = (type) => {
47
+ switch (type) {
48
+ case "message.user":
49
+ case "model.result":
50
+ return "turn";
51
+ case "tool.call":
52
+ case "tool.result":
53
+ return "tool";
54
+ case "log":
55
+ case "monolog":
56
+ return "status";
57
+ case "run.start":
58
+ case "run.end":
59
+ case "deck.start":
60
+ case "deck.end":
61
+ case "action.start":
62
+ case "action.end":
63
+ case "model.call":
64
+ return "lifecycle";
65
+ default:
66
+ return "trace";
67
+ }
68
+ };
69
+ const createWorkspaceScenarioService = (deps) => {
70
+ const testBotRuns = new Map();
71
+ const shouldPersistTestWorkspaceEvent = (payload) => {
72
+ if (!payload || typeof payload !== "object" || Array.isArray(payload)) {
73
+ return false;
74
+ }
75
+ const type = payload.type;
76
+ return type === "testBotStatus" || type === "gambit.test.status";
77
+ };
78
+ const broadcastTestBot = (payload, workspaceId) => {
79
+ if (workspaceId && shouldPersistTestWorkspaceEvent(payload)) {
80
+ const state = deps.readSessionState(workspaceId);
81
+ if (state) {
82
+ deps.appendWorkspaceEnvelope(state, "test", payload);
83
+ }
84
+ }
85
+ deps.appendDurableStreamEvent(deps.workspaceStreamId, payload);
86
+ deps.appendDurableStreamEvent(deps.testStreamId, payload);
87
+ };
88
+ const findTestRunByWorkspaceId = (workspaceId) => {
89
+ for (const candidate of testBotRuns.values()) {
90
+ if (candidate.run.workspaceId === workspaceId ||
91
+ candidate.run.sessionId === workspaceId) {
92
+ return candidate;
93
+ }
94
+ }
95
+ return undefined;
96
+ };
97
+ const startTestBotRun = (runOpts = {}) => {
98
+ const botDeckPath = typeof runOpts.botDeckPath === "string"
99
+ ? runOpts.botDeckPath
100
+ : undefined;
101
+ if (!botDeckPath) {
102
+ throw new Error("Missing scenario deck path");
103
+ }
104
+ const defaultMaxTurns = 12;
105
+ const maxTurns = Math.round((0, test_bot_js_1.sanitizeNumber)(runOpts.maxTurnsOverride ?? defaultMaxTurns, defaultMaxTurns, { min: 1, max: 200 }));
106
+ const deckInput = runOpts.deckInput;
107
+ const hasDeckInput = deckInput !== undefined;
108
+ const botInput = runOpts.botInput;
109
+ const initialUserMessage = typeof runOpts.initialUserMessage === "string"
110
+ ? runOpts.initialUserMessage.trim()
111
+ : "";
112
+ const botConfigPath = botDeckPath;
113
+ const testBotName = path.basename(botConfigPath).replace(/\.deck\.(md|ts)$/i, "");
114
+ const selectedScenarioDeckId = runOpts.botDeckId ?? testBotName;
115
+ const selectedScenarioDeckLabel = runOpts.botDeckLabel ?? testBotName;
116
+ const runId = typeof runOpts.runId === "string" &&
117
+ runOpts.runId.trim().length > 0
118
+ ? runOpts.runId.trim()
119
+ : deps.randomId("testbot");
120
+ const startedAt = new Date().toISOString();
121
+ const controller = new AbortController();
122
+ const entry = {
123
+ run: {
124
+ id: runId,
125
+ status: "running",
126
+ startedAt,
127
+ maxTurns,
128
+ messages: [],
129
+ traces: [],
130
+ toolInserts: [],
131
+ },
132
+ state: null,
133
+ promise: null,
134
+ abort: controller,
135
+ };
136
+ testBotRuns.set(runId, entry);
137
+ const run = entry.run;
138
+ if (runOpts.workspaceId) {
139
+ run.workspaceId = runOpts.workspaceId;
140
+ run.sessionId = runOpts.workspaceId;
141
+ }
142
+ const emitTestBot = (payload) => broadcastTestBot(payload, run.workspaceId ?? runOpts.workspaceId);
143
+ if (runOpts.initFill)
144
+ run.initFill = runOpts.initFill;
145
+ let savedState = undefined;
146
+ const openResponsesStartIndex = runOpts.workspaceId
147
+ ? (deps.readSessionState(runOpts.workspaceId)?.messages?.length ?? 0)
148
+ : 0;
149
+ const baseMeta = runOpts.baseMeta ?? {};
150
+ const workspaceMeta = runOpts.workspaceRecord
151
+ ? deps.buildWorkspaceMeta(runOpts.workspaceRecord, baseMeta)
152
+ : baseMeta;
153
+ let lastCount = 0;
154
+ const capturedTraces = [];
155
+ if (runOpts.initFillTrace) {
156
+ const actionCallId = deps.randomId("initfill");
157
+ capturedTraces.push({
158
+ type: "tool.call",
159
+ runId,
160
+ actionCallId,
161
+ name: "gambit_test_bot_init_fill",
162
+ args: runOpts.initFillTrace.args,
163
+ toolKind: "internal",
164
+ }, {
165
+ type: "tool.result",
166
+ runId,
167
+ actionCallId,
168
+ name: "gambit_test_bot_init_fill",
169
+ result: runOpts.initFillTrace.result,
170
+ toolKind: "internal",
171
+ });
172
+ }
173
+ const setWorkspaceId = (state) => {
174
+ const workspaceId = typeof state?.meta?.workspaceId === "string"
175
+ ? state.meta.workspaceId
176
+ : typeof state?.meta?.sessionId === "string"
177
+ ? state.meta.sessionId
178
+ : undefined;
179
+ if (workspaceId) {
180
+ run.workspaceId = workspaceId;
181
+ run.sessionId = workspaceId;
182
+ }
183
+ };
184
+ const appendFromState = (state) => {
185
+ const snapshot = (0, helpers_js_1.buildTestBotSnapshot)(state);
186
+ const rawLength = state.messages?.length ?? 0;
187
+ const toolCount = snapshot.toolInserts.length;
188
+ const shouldBroadcast = rawLength !== lastCount ||
189
+ (run.toolInserts?.length ?? 0) !== toolCount;
190
+ run.messages = snapshot.messages;
191
+ run.toolInserts = snapshot.toolInserts;
192
+ lastCount = rawLength;
193
+ setWorkspaceId(state);
194
+ run.traces = Array.isArray(state.traces) ? [...state.traces] : undefined;
195
+ if (shouldBroadcast) {
196
+ emitTestBot({ type: "testBotStatus", run });
197
+ }
198
+ };
199
+ const pendingTraceEvents = [];
200
+ const flushPendingTraceEvents = (state) => {
201
+ if (!pendingTraceEvents.length)
202
+ return;
203
+ for (const pending of pendingTraceEvents) {
204
+ deps.persistOpenResponsesTraceEvent(state, pending, runId);
205
+ deps.appendSessionEvent(state, {
206
+ ...pending,
207
+ kind: "trace",
208
+ category: traceCategory(pending.type),
209
+ });
210
+ }
211
+ pendingTraceEvents.length = 0;
212
+ };
213
+ const tracer = (event) => {
214
+ const stamped = event.ts ? event : { ...event, ts: Date.now() };
215
+ capturedTraces.push(stamped);
216
+ deps.consoleTracer?.(stamped);
217
+ if (savedState?.meta?.sessionId) {
218
+ deps.persistOpenResponsesTraceEvent(savedState, stamped, runId);
219
+ deps.appendSessionEvent(savedState, {
220
+ ...stamped,
221
+ kind: "trace",
222
+ category: traceCategory(stamped.type),
223
+ });
224
+ }
225
+ else {
226
+ pendingTraceEvents.push(stamped);
227
+ }
228
+ };
229
+ let deckBotState = undefined;
230
+ let sessionEnded = false;
231
+ const getLastAssistantMessage = (history) => {
232
+ for (let i = history.length - 1; i >= 0; i--) {
233
+ const msg = history[i];
234
+ if (msg?.role === "assistant") {
235
+ return (0, helpers_js_1.stringifyContent)(msg.content);
236
+ }
237
+ }
238
+ return undefined;
239
+ };
240
+ const generateDeckBotUserMessage = async (history, streamOptions) => {
241
+ const assistantMessage = getLastAssistantMessage(history)?.trim() || "";
242
+ const seedPrompt = !assistantMessage && streamOptions?.allowEmptyAssistant
243
+ ? DEFAULT_TEST_BOT_SEED_PROMPT
244
+ : undefined;
245
+ if (!assistantMessage && !seedPrompt)
246
+ return "";
247
+ const result = await (0, run_deck_js_1.runDeckWithFallback)({
248
+ path: botDeckPath,
249
+ input: botInput,
250
+ inputProvided: botInput !== undefined,
251
+ modelProvider: deps.modelProvider,
252
+ state: deckBotState,
253
+ allowRootStringInput: true,
254
+ initialUserMessage: assistantMessage || seedPrompt,
255
+ onStateUpdate: (state) => {
256
+ deckBotState = state;
257
+ },
258
+ stream: Boolean(streamOptions?.onStreamText),
259
+ onStreamText: streamOptions?.onStreamText,
260
+ responsesMode: deps.responsesMode,
261
+ workerSandbox: deps.workerSandbox,
262
+ signal: controller.signal,
263
+ });
264
+ if ((0, gambit_core_1.isGambitEndSignal)(result)) {
265
+ sessionEnded = true;
266
+ return "";
267
+ }
268
+ const text = (0, run_deck_js_1.stringifyOutput)(result);
269
+ return text.trim();
270
+ };
271
+ const loop = async () => {
272
+ try {
273
+ const effectiveStartMode = deps.getRootStartMode() ?? "assistant";
274
+ const shouldRunInitial = effectiveStartMode !== "user" ||
275
+ Boolean(initialUserMessage);
276
+ if (!controller.signal.aborted && shouldRunInitial) {
277
+ const initialResult = await (0, gambit_core_1.runDeck)({
278
+ path: deps.getResolvedDeckPath(),
279
+ input: deckInput,
280
+ inputProvided: hasDeckInput,
281
+ modelProvider: deps.modelProvider,
282
+ defaultModel: deps.model,
283
+ modelOverride: deps.modelForce,
284
+ trace: tracer,
285
+ stream: false,
286
+ state: savedState,
287
+ allowRootStringInput: true,
288
+ initialUserMessage: initialUserMessage || undefined,
289
+ responsesMode: deps.responsesMode,
290
+ workerSandbox: (0, run_deck_js_1.resolveWorkerSandboxForSignalAwareRun)({
291
+ workerSandbox: deps.workerSandbox,
292
+ signal: controller.signal,
293
+ }),
294
+ signal: controller.signal,
295
+ onStateUpdate: (state) => {
296
+ const nextStateWithSource = (0, helpers_js_1.applyUserMessageRefSource)(savedState, state, "scenario");
297
+ const nextMeta = {
298
+ ...workspaceMeta,
299
+ ...(nextStateWithSource.meta ?? {}),
300
+ testBot: true,
301
+ testBotRunId: runId,
302
+ testBotConfigPath: botConfigPath,
303
+ testBotName,
304
+ scenarioRunId: runId,
305
+ selectedScenarioDeckId,
306
+ selectedScenarioDeckLabel,
307
+ scenarioConfigPath: botConfigPath,
308
+ ...(run.initFill ? { testBotInitFill: run.initFill } : {}),
309
+ ...(runOpts.workspaceId
310
+ ? { workspaceId: runOpts.workspaceId }
311
+ : {}),
312
+ };
313
+ const enriched = deps.persistSessionState({
314
+ ...nextStateWithSource,
315
+ meta: nextMeta,
316
+ traces: capturedTraces,
317
+ });
318
+ savedState = enriched;
319
+ entry.state = enriched;
320
+ flushPendingTraceEvents(enriched);
321
+ appendFromState(enriched);
322
+ },
323
+ });
324
+ if ((0, gambit_core_1.isGambitEndSignal)(initialResult)) {
325
+ sessionEnded = true;
326
+ }
327
+ }
328
+ for (let turn = 0; turn < maxTurns; turn++) {
329
+ if (sessionEnded)
330
+ break;
331
+ if (controller.signal.aborted)
332
+ break;
333
+ const history = savedState?.messages ?? [];
334
+ const userMessage = await generateDeckBotUserMessage(history, {
335
+ onStreamText: (chunk) => emitTestBot({
336
+ type: "testBotStream",
337
+ workspaceId: run.workspaceId ?? runOpts.workspaceId,
338
+ runId,
339
+ role: "user",
340
+ chunk,
341
+ turn,
342
+ ts: Date.now(),
343
+ }),
344
+ allowEmptyAssistant: effectiveStartMode === "user" &&
345
+ !getLastAssistantMessage(history),
346
+ });
347
+ emitTestBot({
348
+ type: "testBotStreamEnd",
349
+ workspaceId: run.workspaceId ?? runOpts.workspaceId,
350
+ runId,
351
+ role: "user",
352
+ turn,
353
+ ts: Date.now(),
354
+ });
355
+ if (!userMessage)
356
+ break;
357
+ const rootResult = await (0, gambit_core_1.runDeck)({
358
+ path: deps.getResolvedDeckPath(),
359
+ input: deckInput,
360
+ inputProvided: hasDeckInput,
361
+ modelProvider: deps.modelProvider,
362
+ defaultModel: deps.model,
363
+ modelOverride: deps.modelForce,
364
+ trace: tracer,
365
+ stream: true,
366
+ state: savedState,
367
+ allowRootStringInput: true,
368
+ initialUserMessage: userMessage,
369
+ responsesMode: deps.responsesMode,
370
+ workerSandbox: (0, run_deck_js_1.resolveWorkerSandboxForSignalAwareRun)({
371
+ workerSandbox: deps.workerSandbox,
372
+ signal: controller.signal,
373
+ }),
374
+ signal: controller.signal,
375
+ onStateUpdate: (state) => {
376
+ const nextStateWithSource = (0, helpers_js_1.applyUserMessageRefSource)(savedState, state, "scenario");
377
+ const nextMeta = {
378
+ ...workspaceMeta,
379
+ ...(nextStateWithSource.meta ?? {}),
380
+ testBot: true,
381
+ testBotRunId: runId,
382
+ testBotConfigPath: botConfigPath,
383
+ testBotName,
384
+ scenarioRunId: runId,
385
+ selectedScenarioDeckId,
386
+ selectedScenarioDeckLabel,
387
+ scenarioConfigPath: botConfigPath,
388
+ ...(run.initFill ? { testBotInitFill: run.initFill } : {}),
389
+ ...(runOpts.workspaceId
390
+ ? { workspaceId: runOpts.workspaceId }
391
+ : {}),
392
+ };
393
+ const enriched = deps.persistSessionState({
394
+ ...nextStateWithSource,
395
+ meta: nextMeta,
396
+ traces: capturedTraces,
397
+ });
398
+ savedState = enriched;
399
+ entry.state = enriched;
400
+ flushPendingTraceEvents(enriched);
401
+ appendFromState(enriched);
402
+ },
403
+ onStreamText: (chunk) => emitTestBot({
404
+ type: "testBotStream",
405
+ workspaceId: run.workspaceId ?? runOpts.workspaceId,
406
+ runId,
407
+ role: "assistant",
408
+ chunk,
409
+ turn,
410
+ ts: Date.now(),
411
+ }),
412
+ });
413
+ if ((0, gambit_core_1.isGambitEndSignal)(rootResult)) {
414
+ sessionEnded = true;
415
+ break;
416
+ }
417
+ emitTestBot({
418
+ type: "testBotStreamEnd",
419
+ workspaceId: run.workspaceId ?? runOpts.workspaceId,
420
+ runId,
421
+ role: "assistant",
422
+ turn,
423
+ ts: Date.now(),
424
+ });
425
+ }
426
+ run.status = controller.signal.aborted ? "canceled" : "completed";
427
+ emitTestBot({ type: "testBotStatus", run });
428
+ }
429
+ catch (err) {
430
+ if (controller.signal.aborted || (0, gambit_core_1.isRunCanceledError)(err)) {
431
+ run.status = "canceled";
432
+ run.error = undefined;
433
+ }
434
+ else {
435
+ run.status = "error";
436
+ run.error = err instanceof Error ? err.message : String(err);
437
+ const stack = err instanceof Error ? err.stack : undefined;
438
+ deps.logger.error(`[sim] scenario run failed runId=${runId} workspaceId=${run.workspaceId ?? runOpts.workspaceId ?? "unknown"} rootDeck=${deps.getResolvedDeckPath()} scenarioDeck=${botDeckPath} error=${run.error}${stack ? `\n${stack}` : ""}`);
439
+ }
440
+ emitTestBot({ type: "testBotStatus", run });
441
+ }
442
+ finally {
443
+ if (savedState?.messages) {
444
+ const snapshot = (0, helpers_js_1.buildTestBotSnapshot)(savedState);
445
+ run.messages = snapshot.messages;
446
+ run.toolInserts = snapshot.toolInserts;
447
+ }
448
+ setWorkspaceId(savedState);
449
+ run.traces = Array.isArray(savedState?.traces)
450
+ ? [...(savedState?.traces ?? [])]
451
+ : undefined;
452
+ if (savedState) {
453
+ deps.persistCanonicalStateMessages({
454
+ state: savedState,
455
+ runId,
456
+ startIndex: openResponsesStartIndex,
457
+ source: "scenario",
458
+ });
459
+ entry.state = savedState;
460
+ }
461
+ run.finishedAt = new Date().toISOString();
462
+ entry.abort = null;
463
+ entry.promise = null;
464
+ emitTestBot({ type: "testBotStatus", run });
465
+ }
466
+ };
467
+ entry.promise = loop();
468
+ emitTestBot({ type: "testBotStatus", run });
469
+ return run;
470
+ };
471
+ const startWorkspaceScenarioRunForGraphql = async (args) => {
472
+ await deps.activateWorkspaceDeck(args.workspaceId, { forceReload: true });
473
+ const workspaceRecord = deps.resolveWorkspaceRecord(args.workspaceId);
474
+ if (!workspaceRecord) {
475
+ throw new Error("Workspace not found");
476
+ }
477
+ const deckState = deps.readWorkspaceDeckStateStrict(args.workspaceId);
478
+ const requestedDeckId = typeof args.scenarioDeckId === "string" &&
479
+ args.scenarioDeckId.trim().length > 0
480
+ ? args.scenarioDeckId.trim()
481
+ : null;
482
+ const fallbackScenarioDeck = deps.buildRootScenarioFallback(deckState);
483
+ const scenarioDeck = requestedDeckId
484
+ ? deps.resolveScenarioDeckFromState(deckState, requestedDeckId) ??
485
+ (requestedDeckId === deckState.assistantDeck.deck
486
+ ? fallbackScenarioDeck
487
+ : null)
488
+ : fallbackScenarioDeck;
489
+ if (requestedDeckId && !scenarioDeck) {
490
+ throw new Error("Unknown scenario deck selection");
491
+ }
492
+ if (!scenarioDeck) {
493
+ throw new Error("No scenario deck configured for this workspace.");
494
+ }
495
+ try {
496
+ const stat = await dntShim.Deno.stat(scenarioDeck.path);
497
+ if (!stat.isFile) {
498
+ throw new Error(`Scenario deck path is not a file: ${scenarioDeck.path}`);
499
+ }
500
+ }
501
+ catch (error) {
502
+ const message = error instanceof Error ? error.message : String(error);
503
+ deps.logger.error(`[sim] workspaceScenarioRunStart deck preflight failed workspaceId=${args.workspaceId} deckId=${scenarioDeck.id} deckPath=${scenarioDeck.path} error=${message}`);
504
+ throw new Error(`Scenario deck is unavailable (${scenarioDeck.label}): ${message}`);
505
+ }
506
+ const parseOptionalJsonInput = (value, label) => {
507
+ if (value === null || value === undefined)
508
+ return undefined;
509
+ if (typeof value !== "string")
510
+ return value;
511
+ const text = value.trim();
512
+ if (text.length === 0)
513
+ return undefined;
514
+ try {
515
+ return JSON.parse(text);
516
+ }
517
+ catch (error) {
518
+ const message = error instanceof Error ? error.message : "Invalid JSON";
519
+ throw new Error(`${label} must be valid JSON: ${message}`);
520
+ }
521
+ };
522
+ const parsedScenarioInput = parseOptionalJsonInput(args.scenarioInput, "scenarioInput");
523
+ const parsedAssistantInit = parseOptionalJsonInput(args.assistantInit, "assistantInit");
524
+ let assistantInit = parsedAssistantInit;
525
+ if (assistantInit === undefined) {
526
+ try {
527
+ const desc = await deps.getSchemaPromise();
528
+ assistantInit = desc.defaults !== undefined
529
+ ? (0, schema_js_1.cloneValue)(desc.defaults)
530
+ : (0, schema_js_1.deriveInitialFromSchema)(desc.schema);
531
+ }
532
+ catch {
533
+ // keep assistantInit undefined when schema introspection fails
534
+ }
535
+ }
536
+ if (!requestedDeckId) {
537
+ const startedAt = new Date().toISOString();
538
+ const manualRun = {
539
+ id: typeof args.runId === "string" && args.runId.trim().length > 0
540
+ ? args.runId.trim()
541
+ : deps.randomId("testbot"),
542
+ status: "idle",
543
+ workspaceId: args.workspaceId,
544
+ sessionId: args.workspaceId,
545
+ startedAt,
546
+ messages: [],
547
+ traces: [],
548
+ toolInserts: [],
549
+ };
550
+ const existing = deps.readSessionState(args.workspaceId);
551
+ const baseMeta = deps.buildWorkspaceMeta(workspaceRecord, existing?.meta);
552
+ const nextMeta = {
553
+ ...baseMeta,
554
+ testBot: true,
555
+ testBotRunId: manualRun.id,
556
+ testBotConfigPath: scenarioDeck.path,
557
+ testBotName: path.basename(scenarioDeck.path).replace(/\.deck\.(md|ts)$/i, ""),
558
+ scenarioRunId: manualRun.id,
559
+ selectedScenarioDeckId: scenarioDeck.id,
560
+ selectedScenarioDeckLabel: "Manual assistant chat",
561
+ scenarioConfigPath: scenarioDeck.path,
562
+ scenarioRunMode: "manual",
563
+ workspaceId: args.workspaceId,
564
+ };
565
+ const manualState = deps.persistSessionState({
566
+ ...(existing ?? {
567
+ runId: args.workspaceId,
568
+ messages: [],
569
+ }),
570
+ runId: manualRun.id,
571
+ messages: [],
572
+ messageRefs: [],
573
+ traces: [],
574
+ items: [],
575
+ meta: nextMeta,
576
+ });
577
+ testBotRuns.set(manualRun.id, {
578
+ run: manualRun,
579
+ state: manualState,
580
+ promise: null,
581
+ abort: null,
582
+ });
583
+ broadcastTestBot({ type: "testBotStatus", run: manualRun }, args.workspaceId);
584
+ return {
585
+ id: manualRun.id,
586
+ workspaceId: args.workspaceId,
587
+ status: manualRun.status,
588
+ error: manualRun.error,
589
+ startedAt: manualRun.startedAt,
590
+ finishedAt: manualRun.finishedAt,
591
+ messages: [],
592
+ traces: [],
593
+ toolInserts: [],
594
+ };
595
+ }
596
+ const run = startTestBotRun({
597
+ runId: args.runId,
598
+ workspaceId: args.workspaceId,
599
+ workspaceRecord,
600
+ botDeckPath: scenarioDeck.path,
601
+ botDeckId: scenarioDeck.id,
602
+ botDeckLabel: scenarioDeck.label,
603
+ maxTurnsOverride: scenarioDeck.maxTurns,
604
+ botInput: parsedScenarioInput,
605
+ deckInput: assistantInit,
606
+ baseMeta: {
607
+ scenarioRunMode: "scenario",
608
+ },
609
+ });
610
+ return {
611
+ id: run.id ?? deps.randomId("testbot"),
612
+ workspaceId: args.workspaceId,
613
+ status: run.status,
614
+ error: run.error,
615
+ startedAt: run.startedAt,
616
+ finishedAt: run.finishedAt,
617
+ messages: Array.isArray(run.messages) ? [...run.messages] : [],
618
+ traces: Array.isArray(run.traces) ? [...run.traces] : [],
619
+ toolInserts: Array.isArray(run.toolInserts) ? [...run.toolInserts] : [],
620
+ };
621
+ };
622
+ const sendWorkspaceScenarioRunForGraphql = async (args) => {
623
+ await deps.activateWorkspaceDeck(args.workspaceId, { forceReload: true });
624
+ const workspaceRecord = deps.resolveWorkspaceRecord(args.workspaceId);
625
+ if (!workspaceRecord) {
626
+ throw new Error("Workspace not found");
627
+ }
628
+ const active = testBotRuns.get(args.runId);
629
+ if (active &&
630
+ active.run.status === "running" &&
631
+ (active.run.workspaceId === args.workspaceId ||
632
+ active.run.sessionId === args.workspaceId)) {
633
+ throw new Error("Scenario run already in progress.");
634
+ }
635
+ const activeMatchesWorkspace = active
636
+ ? (active.run.workspaceId === args.workspaceId ||
637
+ active.run.sessionId === args.workspaceId)
638
+ : false;
639
+ let state = activeMatchesWorkspace
640
+ ? (active?.state ?? undefined)
641
+ : undefined;
642
+ if (!state) {
643
+ try {
644
+ state = deps.readSessionStateStrict(args.workspaceId, {
645
+ withTraces: true,
646
+ });
647
+ }
648
+ catch {
649
+ state = undefined;
650
+ }
651
+ }
652
+ if (!state) {
653
+ throw new Error("Workspace state unavailable for scenario send.");
654
+ }
655
+ const stateMeta = state.meta && typeof state.meta === "object"
656
+ ? state.meta
657
+ : {};
658
+ const stateRunId = typeof stateMeta.scenarioRunId === "string"
659
+ ? stateMeta.scenarioRunId
660
+ : typeof stateMeta.testBotRunId === "string"
661
+ ? stateMeta.testBotRunId
662
+ : null;
663
+ if (stateRunId !== args.runId) {
664
+ throw new Error("Scenario run is not the active run state. Open latest run first.");
665
+ }
666
+ const scenarioDeckPath = typeof stateMeta.scenarioConfigPath === "string"
667
+ ? stateMeta.scenarioConfigPath
668
+ : typeof stateMeta.testBotConfigPath === "string"
669
+ ? stateMeta.testBotConfigPath
670
+ : null;
671
+ if (!scenarioDeckPath) {
672
+ throw new Error("Scenario deck path unavailable for this run.");
673
+ }
674
+ const scenarioDeckId = typeof stateMeta.selectedScenarioDeckId === "string"
675
+ ? stateMeta.selectedScenarioDeckId
676
+ : undefined;
677
+ const scenarioDeckLabel = typeof stateMeta.selectedScenarioDeckLabel === "string"
678
+ ? stateMeta.selectedScenarioDeckLabel
679
+ : undefined;
680
+ const userMessageSource = stateMeta.scenarioRunMode === "manual"
681
+ ? "manual"
682
+ : "scenario";
683
+ const runMaxTurns = typeof stateMeta.testBotMaxTurns === "number" &&
684
+ Number.isFinite(stateMeta.testBotMaxTurns)
685
+ ? Math.round(stateMeta.testBotMaxTurns)
686
+ : undefined;
687
+ const existingRun = active?.run;
688
+ const openResponsesStartIndex = state.messages?.length ?? 0;
689
+ const run = {
690
+ id: args.runId,
691
+ status: "running",
692
+ workspaceId: args.workspaceId,
693
+ sessionId: args.workspaceId,
694
+ startedAt: existingRun?.startedAt ??
695
+ (typeof stateMeta.startedAt === "string"
696
+ ? stateMeta.startedAt
697
+ : null) ??
698
+ new Date().toISOString(),
699
+ finishedAt: undefined,
700
+ error: undefined,
701
+ maxTurns: existingRun?.maxTurns ?? runMaxTurns,
702
+ messages: existingRun?.messages ? [...existingRun.messages] : [],
703
+ traces: existingRun?.traces
704
+ ? [...existingRun.traces]
705
+ : Array.isArray(state.traces)
706
+ ? [...state.traces]
707
+ : [],
708
+ toolInserts: existingRun?.toolInserts ? [...existingRun.toolInserts] : [],
709
+ initFill: stateMeta.testBotInitFill ??
710
+ existingRun?.initFill,
711
+ };
712
+ const controller = new AbortController();
713
+ const entry = {
714
+ run,
715
+ state,
716
+ promise: null,
717
+ abort: controller,
718
+ };
719
+ testBotRuns.set(args.runId, entry);
720
+ const emitTestBot = (payload) => broadcastTestBot(payload, args.workspaceId);
721
+ const baseMeta = deps.buildWorkspaceMeta(workspaceRecord, stateMeta);
722
+ let savedState = state;
723
+ const capturedTraces = Array.isArray(state.traces)
724
+ ? [...state.traces]
725
+ : [];
726
+ const appendFromState = (nextState) => {
727
+ const snapshot = (0, helpers_js_1.buildTestBotSnapshot)(nextState);
728
+ run.messages = snapshot.messages;
729
+ run.toolInserts = snapshot.toolInserts;
730
+ run.traces = Array.isArray(nextState.traces)
731
+ ? [...nextState.traces]
732
+ : undefined;
733
+ emitTestBot({ type: "testBotStatus", run });
734
+ };
735
+ const tracer = (event) => {
736
+ const stamped = event.ts ? event : { ...event, ts: Date.now() };
737
+ capturedTraces.push(stamped);
738
+ if (savedState) {
739
+ deps.persistOpenResponsesTraceEvent(savedState, stamped, args.runId);
740
+ }
741
+ emitTestBot({
742
+ type: "testBotTrace",
743
+ workspaceId: args.workspaceId,
744
+ runId: args.runId,
745
+ event: stamped,
746
+ });
747
+ };
748
+ const trimmedMessage = args.message.trim();
749
+ const turn = run.messages.filter((message) => message.role === "user")
750
+ .length;
751
+ if (trimmedMessage.length > 0) {
752
+ run.messages = [
753
+ ...run.messages,
754
+ { role: "user", content: trimmedMessage },
755
+ ];
756
+ }
757
+ let hasStartedAssistantStreamMessage = false;
758
+ entry.promise = (async () => {
759
+ try {
760
+ emitTestBot({ type: "testBotStatus", run });
761
+ const rootResult = await (0, gambit_core_1.runDeck)({
762
+ path: scenarioDeckPath,
763
+ input: undefined,
764
+ inputProvided: false,
765
+ modelProvider: deps.modelProvider,
766
+ defaultModel: deps.model,
767
+ modelOverride: deps.modelForce,
768
+ trace: tracer,
769
+ stream: true,
770
+ state: savedState,
771
+ allowRootStringInput: true,
772
+ initialUserMessage: trimmedMessage,
773
+ responsesMode: deps.responsesMode,
774
+ workerSandbox: (0, run_deck_js_1.resolveWorkerSandboxForSignalAwareRun)({
775
+ workerSandbox: deps.workerSandbox,
776
+ signal: controller.signal,
777
+ }),
778
+ signal: controller.signal,
779
+ onStateUpdate: (nextState) => {
780
+ const sourced = (0, helpers_js_1.applyUserMessageRefSource)(savedState, nextState, userMessageSource);
781
+ const nextMeta = {
782
+ ...baseMeta,
783
+ ...(sourced.meta ?? {}),
784
+ testBot: true,
785
+ testBotRunId: args.runId,
786
+ testBotConfigPath: scenarioDeckPath,
787
+ testBotName: path.basename(scenarioDeckPath).replace(/\.deck\.(md|ts)$/i, ""),
788
+ scenarioRunId: args.runId,
789
+ ...(scenarioDeckId
790
+ ? { selectedScenarioDeckId: scenarioDeckId }
791
+ : {}),
792
+ ...(scenarioDeckLabel
793
+ ? { selectedScenarioDeckLabel: scenarioDeckLabel }
794
+ : {}),
795
+ scenarioConfigPath: scenarioDeckPath,
796
+ scenarioRunMode: userMessageSource === "manual"
797
+ ? "manual"
798
+ : "scenario",
799
+ ...(run.initFill ? { testBotInitFill: run.initFill } : {}),
800
+ workspaceId: args.workspaceId,
801
+ ...(run.maxTurns ? { testBotMaxTurns: run.maxTurns } : {}),
802
+ };
803
+ const enriched = deps.persistSessionState({
804
+ ...sourced,
805
+ meta: nextMeta,
806
+ traces: capturedTraces,
807
+ });
808
+ savedState = enriched;
809
+ entry.state = enriched;
810
+ appendFromState(enriched);
811
+ },
812
+ onStreamText: (chunk) => {
813
+ if (typeof chunk === "string" && chunk.length > 0) {
814
+ if (!hasStartedAssistantStreamMessage) {
815
+ run.messages = [
816
+ ...run.messages,
817
+ { role: "assistant", content: chunk },
818
+ ];
819
+ hasStartedAssistantStreamMessage = true;
820
+ }
821
+ else {
822
+ const last = run.messages[run.messages.length - 1];
823
+ if (last?.role === "assistant") {
824
+ last.content += chunk;
825
+ }
826
+ }
827
+ }
828
+ emitTestBot({
829
+ type: "testBotStream",
830
+ workspaceId: args.workspaceId,
831
+ runId: args.runId,
832
+ role: "assistant",
833
+ chunk,
834
+ turn,
835
+ ts: Date.now(),
836
+ });
837
+ },
838
+ });
839
+ if (!(0, gambit_core_1.isGambitEndSignal)(rootResult)) {
840
+ emitTestBot({
841
+ type: "testBotStreamEnd",
842
+ workspaceId: args.workspaceId,
843
+ runId: args.runId,
844
+ role: "assistant",
845
+ turn,
846
+ ts: Date.now(),
847
+ });
848
+ }
849
+ run.status = controller.signal.aborted ? "canceled" : "completed";
850
+ run.error = undefined;
851
+ }
852
+ catch (err) {
853
+ if (controller.signal.aborted || (0, gambit_core_1.isRunCanceledError)(err)) {
854
+ run.status = "canceled";
855
+ run.error = undefined;
856
+ }
857
+ else {
858
+ run.status = "error";
859
+ run.error = err instanceof Error ? err.message : String(err);
860
+ }
861
+ }
862
+ finally {
863
+ if (savedState?.messages) {
864
+ const snapshot = (0, helpers_js_1.buildTestBotSnapshot)(savedState);
865
+ run.messages = snapshot.messages;
866
+ run.toolInserts = snapshot.toolInserts;
867
+ run.traces = Array.isArray(savedState.traces)
868
+ ? [...savedState.traces]
869
+ : run.traces;
870
+ }
871
+ if (savedState) {
872
+ deps.persistCanonicalStateMessages({
873
+ state: savedState,
874
+ runId: args.runId,
875
+ startIndex: openResponsesStartIndex,
876
+ source: userMessageSource,
877
+ });
878
+ entry.state = savedState;
879
+ }
880
+ run.finishedAt = new Date().toISOString();
881
+ entry.abort = null;
882
+ entry.promise = null;
883
+ emitTestBot({ type: "testBotStatus", run });
884
+ }
885
+ })();
886
+ return {
887
+ id: run.id,
888
+ workspaceId: args.workspaceId,
889
+ status: run.status,
890
+ error: run.error,
891
+ startedAt: run.startedAt,
892
+ finishedAt: run.finishedAt,
893
+ messages: Array.isArray(run.messages) ? [...run.messages] : [],
894
+ traces: Array.isArray(run.traces) ? [...run.traces] : [],
895
+ toolInserts: Array.isArray(run.toolInserts) ? [...run.toolInserts] : [],
896
+ };
897
+ };
898
+ const readWorkspaceScenarioRunsForGraphql = (workspaceId) => {
899
+ const latestByRunId = new Map();
900
+ const persistedState = deps.readSessionState(workspaceId);
901
+ if (persistedState) {
902
+ const metaRuns = (0, scenario_history_js_1.listScenarioRunStatusesFromStateMeta)(persistedState, workspaceId);
903
+ if (metaRuns.length > 0) {
904
+ for (const run of metaRuns) {
905
+ latestByRunId.set(run.id, run);
906
+ }
907
+ }
908
+ else {
909
+ for (const run of (0, scenario_history_js_1.listPersistedTestRunStatuses)(persistedState, workspaceId)) {
910
+ latestByRunId.set(run.id, run);
911
+ }
912
+ }
913
+ }
914
+ for (const entry of testBotRuns.values()) {
915
+ const run = entry.run;
916
+ if (run.workspaceId !== workspaceId &&
917
+ run.sessionId !== workspaceId) {
918
+ continue;
919
+ }
920
+ if (!run.id || run.id.trim().length === 0)
921
+ continue;
922
+ latestByRunId.set(run.id, run);
923
+ }
924
+ const records = [...latestByRunId.values()].map((run) => ({
925
+ id: run.id,
926
+ workspaceId,
927
+ status: run.status,
928
+ error: run.error,
929
+ startedAt: run.startedAt,
930
+ finishedAt: run.finishedAt,
931
+ messages: Array.isArray(run.messages) ? [...run.messages] : [],
932
+ traces: Array.isArray(run.traces) ? [...run.traces] : [],
933
+ toolInserts: Array.isArray(run.toolInserts) ? [...run.toolInserts] : [],
934
+ maxTurns: run.maxTurns,
935
+ initFill: run.initFill,
936
+ sessionId: run.sessionId,
937
+ }));
938
+ records.sort((a, b) => {
939
+ const aKey = a.startedAt ?? a.finishedAt ?? a.id;
940
+ const bKey = b.startedAt ?? b.finishedAt ?? b.id;
941
+ return bKey.localeCompare(aKey);
942
+ });
943
+ return records;
944
+ };
945
+ const stopWorkspaceScenarioRunForGraphql = async (args) => {
946
+ const active = testBotRuns.get(args.runId);
947
+ if (active &&
948
+ (active.run.workspaceId === args.workspaceId ||
949
+ active.run.sessionId === args.workspaceId)) {
950
+ active.abort?.abort();
951
+ try {
952
+ await active.promise;
953
+ }
954
+ catch {
955
+ // Abort path can reject internally; run projection remains authoritative.
956
+ }
957
+ }
958
+ const latest = readWorkspaceScenarioRunsForGraphql(args.workspaceId).find((run) => run.id === args.runId);
959
+ if (latest)
960
+ return latest;
961
+ throw new Error(`Scenario run ${args.runId} not found`);
962
+ };
963
+ const readWorkspaceScenarioRunForGraphql = (workspaceId, runId) => {
964
+ return readWorkspaceScenarioRunsForGraphql(workspaceId).find((run) => run.id === runId);
965
+ };
966
+ const saveWorkspaceFeedbackForGraphql = (args) => {
967
+ const workspaceId = args.workspaceId.trim();
968
+ if (!workspaceId)
969
+ throw new Error("Missing workspaceId");
970
+ const messageRefId = args.messageRefId.trim();
971
+ if (!messageRefId)
972
+ throw new Error("Missing messageRefId");
973
+ if (args.score !== null &&
974
+ (typeof args.score !== "number" || Number.isNaN(args.score))) {
975
+ throw new Error("Invalid score");
976
+ }
977
+ const state = deps.readSessionState(workspaceId);
978
+ if (!state)
979
+ throw new Error("Workspace not found");
980
+ const requestedRunId = typeof args.runId === "string" &&
981
+ args.runId.trim().length > 0
982
+ ? args.runId.trim()
983
+ : undefined;
984
+ const feedbackEligible = (0, scenario_history_js_1.isFeedbackEligibleMessageRef)(state, messageRefId) ||
985
+ (requestedRunId
986
+ ? (0, scenario_history_js_1.isFeedbackEligiblePersistedTestRunMessageRef)(state, requestedRunId, messageRefId)
987
+ : false);
988
+ if (!feedbackEligible) {
989
+ throw new Error("Feedback target is not eligible");
990
+ }
991
+ const existing = state.feedback ?? [];
992
+ const idx = existing.findIndex((entry) => entry.messageRefId === messageRefId);
993
+ let feedback = existing;
994
+ let entry;
995
+ let deleted = false;
996
+ if (args.score === null) {
997
+ if (idx >= 0) {
998
+ feedback = existing.filter((_, index) => index !== idx);
999
+ deleted = true;
1000
+ }
1001
+ }
1002
+ else {
1003
+ const clamped = Math.max(-3, Math.min(3, Math.round(args.score)));
1004
+ const reason = typeof args.reason === "string"
1005
+ ? args.reason
1006
+ : idx >= 0
1007
+ ? existing[idx]?.reason
1008
+ : undefined;
1009
+ const runId = requestedRunId ??
1010
+ (typeof state.runId === "string" ? state.runId : "session");
1011
+ const scenarioRunId = requestedRunId ??
1012
+ (typeof state.meta?.scenarioRunId === "string"
1013
+ ? state.meta.scenarioRunId
1014
+ : runId);
1015
+ const now = new Date().toISOString();
1016
+ entry = idx >= 0
1017
+ ? {
1018
+ ...existing[idx],
1019
+ score: clamped,
1020
+ reason,
1021
+ runId: existing[idx]?.runId ?? runId,
1022
+ }
1023
+ : {
1024
+ id: deps.randomId("fb"),
1025
+ runId,
1026
+ messageRefId,
1027
+ score: clamped,
1028
+ reason,
1029
+ createdAt: now,
1030
+ };
1031
+ if (entry) {
1032
+ entry.workspaceId = workspaceId;
1033
+ entry.scenarioRunId = scenarioRunId;
1034
+ }
1035
+ feedback = idx >= 0
1036
+ ? existing.map((item, index) => index === idx ? entry : item)
1037
+ : [...existing, entry];
1038
+ }
1039
+ const nextState = deps.persistSessionState({ ...state, feedback });
1040
+ deps.appendSessionEvent(nextState, {
1041
+ type: "feedback.update",
1042
+ kind: "artifact",
1043
+ category: "feedback",
1044
+ workspaceId,
1045
+ scenarioRunId: typeof nextState.meta?.scenarioRunId === "string"
1046
+ ? nextState.meta.scenarioRunId
1047
+ : nextState.runId,
1048
+ messageRefId,
1049
+ feedback: entry,
1050
+ deleted,
1051
+ });
1052
+ const liveRunId = typeof nextState.meta?.testBotRunId === "string"
1053
+ ? nextState.meta.testBotRunId
1054
+ : undefined;
1055
+ if (liveRunId) {
1056
+ const liveEntry = testBotRuns.get(liveRunId);
1057
+ if (liveEntry) {
1058
+ (0, helpers_js_1.syncTestBotRunFromState)(liveEntry.run, nextState);
1059
+ broadcastTestBot({ type: "testBotStatus", run: liveEntry.run }, workspaceId);
1060
+ }
1061
+ }
1062
+ const effectiveRunId = requestedRunId ??
1063
+ (entry?.runId ??
1064
+ (typeof nextState.meta?.scenarioRunId === "string"
1065
+ ? nextState.meta.scenarioRunId
1066
+ : nextState.runId));
1067
+ const run = readWorkspaceScenarioRunForGraphql(workspaceId, effectiveRunId);
1068
+ if (!run) {
1069
+ throw new Error(`Scenario run ${effectiveRunId} not found`);
1070
+ }
1071
+ return { feedback: entry, deleted, run };
1072
+ };
1073
+ return {
1074
+ broadcastTestBot,
1075
+ startWorkspaceScenarioRunForGraphql,
1076
+ sendWorkspaceScenarioRunForGraphql,
1077
+ readWorkspaceScenarioRunsForGraphql,
1078
+ readWorkspaceScenarioRunForGraphql,
1079
+ saveWorkspaceFeedbackForGraphql,
1080
+ stopWorkspaceScenarioRunForGraphql,
1081
+ getLiveTestRunEntry: (runId) => testBotRuns.get(runId),
1082
+ getLiveTestRunEntryByWorkspaceId: findTestRunByWorkspaceId,
1083
+ readPersistedTestRunStatusById: scenario_history_js_1.readPersistedTestRunStatusById,
1084
+ isFeedbackEligibleMessageRef: scenario_history_js_1.isFeedbackEligibleMessageRef,
1085
+ isFeedbackEligiblePersistedTestRunMessageRef: scenario_history_js_1.isFeedbackEligiblePersistedTestRunMessageRef,
1086
+ syncTestBotRunFromState: helpers_js_1.syncTestBotRunFromState,
1087
+ };
1088
+ };
1089
+ exports.createWorkspaceScenarioService = createWorkspaceScenarioService;