@bolt-foundry/gambit 0.8.3 → 0.8.5-rc.11

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 (291) hide show
  1. package/CHANGELOG.md +95 -2
  2. package/README.md +95 -23
  3. package/esm/_dnt.polyfills.d.ts +17 -0
  4. package/esm/_dnt.polyfills.d.ts.map +1 -1
  5. package/esm/_dnt.polyfills.js +123 -0
  6. package/esm/deps/jsr.io/@std/collections/1.1.6/deep_merge.d.ts +322 -0
  7. package/esm/deps/jsr.io/@std/collections/1.1.6/deep_merge.d.ts.map +1 -0
  8. package/esm/deps/jsr.io/@std/collections/1.1.6/deep_merge.js +105 -0
  9. package/esm/deps/jsr.io/@std/fs/1.0.23/_create_walk_entry.d.ts +14 -0
  10. package/esm/deps/jsr.io/@std/fs/1.0.23/_create_walk_entry.d.ts.map +1 -0
  11. package/esm/deps/jsr.io/@std/fs/1.0.23/_create_walk_entry.js +34 -0
  12. package/esm/deps/jsr.io/@std/fs/1.0.23/_get_file_info_type.d.ts +13 -0
  13. package/esm/deps/jsr.io/@std/fs/1.0.23/_get_file_info_type.d.ts.map +1 -0
  14. package/esm/deps/jsr.io/@std/fs/1.0.23/_get_file_info_type.js +18 -0
  15. package/esm/deps/jsr.io/@std/fs/1.0.23/_is_same_path.d.ts +10 -0
  16. package/esm/deps/jsr.io/@std/fs/1.0.23/_is_same_path.d.ts.map +1 -0
  17. package/esm/deps/jsr.io/@std/fs/1.0.23/_is_same_path.js +17 -0
  18. package/esm/deps/jsr.io/@std/fs/1.0.23/_is_subdir.d.ts +12 -0
  19. package/esm/deps/jsr.io/@std/fs/1.0.23/_is_subdir.d.ts.map +1 -0
  20. package/esm/deps/jsr.io/@std/fs/1.0.23/_is_subdir.js +25 -0
  21. package/esm/deps/jsr.io/@std/fs/1.0.23/_to_path_string.d.ts +9 -0
  22. package/esm/deps/jsr.io/@std/fs/1.0.23/_to_path_string.d.ts.map +1 -0
  23. package/esm/deps/jsr.io/@std/fs/1.0.23/_to_path_string.js +13 -0
  24. package/esm/deps/jsr.io/@std/fs/1.0.23/copy.d.ts +117 -0
  25. package/esm/deps/jsr.io/@std/fs/1.0.23/copy.d.ts.map +1 -0
  26. package/esm/deps/jsr.io/@std/fs/1.0.23/copy.js +313 -0
  27. package/esm/deps/jsr.io/@std/fs/1.0.23/empty_dir.d.ts +48 -0
  28. package/esm/deps/jsr.io/@std/fs/1.0.23/empty_dir.d.ts.map +1 -0
  29. package/esm/deps/jsr.io/@std/fs/1.0.23/empty_dir.js +87 -0
  30. package/esm/deps/jsr.io/@std/fs/1.0.23/ensure_dir.d.ts +49 -0
  31. package/esm/deps/jsr.io/@std/fs/1.0.23/ensure_dir.d.ts.map +1 -0
  32. package/esm/deps/jsr.io/@std/fs/1.0.23/ensure_dir.js +102 -0
  33. package/esm/deps/jsr.io/@std/fs/1.0.23/ensure_file.d.ts +47 -0
  34. package/esm/deps/jsr.io/@std/fs/1.0.23/ensure_file.d.ts.map +1 -0
  35. package/esm/deps/jsr.io/@std/fs/1.0.23/ensure_file.js +90 -0
  36. package/esm/deps/jsr.io/@std/fs/1.0.23/ensure_link.d.ts +49 -0
  37. package/esm/deps/jsr.io/@std/fs/1.0.23/ensure_link.d.ts.map +1 -0
  38. package/esm/deps/jsr.io/@std/fs/1.0.23/ensure_link.js +61 -0
  39. package/esm/deps/jsr.io/@std/fs/1.0.23/ensure_symlink.d.ts +70 -0
  40. package/esm/deps/jsr.io/@std/fs/1.0.23/ensure_symlink.d.ts.map +1 -0
  41. package/esm/deps/jsr.io/@std/fs/1.0.23/ensure_symlink.js +156 -0
  42. package/esm/deps/jsr.io/@std/fs/1.0.23/eol.d.ts +52 -0
  43. package/esm/deps/jsr.io/@std/fs/1.0.23/eol.d.ts.map +1 -0
  44. package/esm/deps/jsr.io/@std/fs/1.0.23/eol.js +67 -0
  45. package/esm/deps/jsr.io/@std/fs/1.0.23/exists.d.ts +218 -0
  46. package/esm/deps/jsr.io/@std/fs/1.0.23/exists.d.ts.map +1 -0
  47. package/esm/deps/jsr.io/@std/fs/1.0.23/exists.js +271 -0
  48. package/esm/deps/jsr.io/@std/fs/1.0.23/expand_glob.d.ts +267 -0
  49. package/esm/deps/jsr.io/@std/fs/1.0.23/expand_glob.d.ts.map +1 -0
  50. package/esm/deps/jsr.io/@std/fs/1.0.23/expand_glob.js +442 -0
  51. package/esm/deps/jsr.io/@std/fs/1.0.23/mod.d.ts +29 -0
  52. package/esm/deps/jsr.io/@std/fs/1.0.23/mod.d.ts.map +1 -0
  53. package/esm/deps/jsr.io/@std/fs/1.0.23/mod.js +29 -0
  54. package/esm/deps/jsr.io/@std/fs/1.0.23/move.d.ts +86 -0
  55. package/esm/deps/jsr.io/@std/fs/1.0.23/move.d.ts.map +1 -0
  56. package/esm/deps/jsr.io/@std/fs/1.0.23/move.js +142 -0
  57. package/esm/deps/jsr.io/@std/fs/1.0.23/walk.d.ts +777 -0
  58. package/esm/deps/jsr.io/@std/fs/1.0.23/walk.d.ts.map +1 -0
  59. package/esm/deps/jsr.io/@std/fs/1.0.23/walk.js +846 -0
  60. package/esm/deps/jsr.io/@std/json/1.0.3/types.d.ts +7 -0
  61. package/esm/deps/jsr.io/@std/json/1.0.3/types.d.ts.map +1 -0
  62. package/esm/deps/jsr.io/@std/json/1.0.3/types.js +3 -0
  63. package/esm/deps/jsr.io/@std/jsonc/1.0.2/mod.d.ts +20 -0
  64. package/esm/deps/jsr.io/@std/jsonc/1.0.2/mod.d.ts.map +1 -0
  65. package/esm/deps/jsr.io/@std/jsonc/1.0.2/mod.js +21 -0
  66. package/esm/deps/jsr.io/@std/jsonc/1.0.2/parse.d.ts +21 -0
  67. package/esm/deps/jsr.io/@std/jsonc/1.0.2/parse.d.ts.map +1 -0
  68. package/esm/deps/jsr.io/@std/jsonc/1.0.2/parse.js +320 -0
  69. package/esm/deps/jsr.io/@std/path/1.1.4/constants.d.ts +1 -1
  70. package/esm/deps/jsr.io/@std/toml/1.0.11/_parser.d.ts +93 -0
  71. package/esm/deps/jsr.io/@std/toml/1.0.11/_parser.d.ts.map +1 -0
  72. package/esm/deps/jsr.io/@std/toml/1.0.11/_parser.js +753 -0
  73. package/esm/deps/jsr.io/@std/toml/1.0.11/mod.d.ts +109 -0
  74. package/esm/deps/jsr.io/@std/toml/1.0.11/mod.d.ts.map +1 -0
  75. package/esm/deps/jsr.io/@std/toml/1.0.11/mod.js +110 -0
  76. package/esm/deps/jsr.io/@std/toml/1.0.11/parse.d.ts +21 -0
  77. package/esm/deps/jsr.io/@std/toml/1.0.11/parse.d.ts.map +1 -0
  78. package/esm/deps/jsr.io/@std/toml/1.0.11/parse.js +25 -0
  79. package/esm/deps/jsr.io/@std/toml/1.0.11/stringify.d.ts +35 -0
  80. package/esm/deps/jsr.io/@std/toml/1.0.11/stringify.d.ts.map +1 -0
  81. package/esm/deps/jsr.io/@std/toml/1.0.11/stringify.js +283 -0
  82. package/esm/gambit/simulator-ui/dist/bundle.js +13788 -5157
  83. package/esm/gambit/simulator-ui/dist/bundle.js.map +4 -4
  84. package/esm/mod.d.ts +13 -3
  85. package/esm/mod.d.ts.map +1 -1
  86. package/esm/mod.js +8 -2
  87. package/esm/src/cli_utils.d.ts +1 -0
  88. package/esm/src/cli_utils.d.ts.map +1 -1
  89. package/esm/src/cli_utils.js +13 -1
  90. package/esm/src/default_runtime.d.ts +46 -0
  91. package/esm/src/default_runtime.d.ts.map +1 -0
  92. package/esm/src/default_runtime.js +415 -0
  93. package/esm/src/durable_streams.js +26 -1
  94. package/esm/src/model_matchers.d.ts +10 -0
  95. package/esm/src/model_matchers.d.ts.map +1 -0
  96. package/esm/src/model_matchers.js +26 -0
  97. package/esm/src/openai_compat.d.ts +12 -1
  98. package/esm/src/openai_compat.d.ts.map +1 -1
  99. package/esm/src/openai_compat.js +53 -1
  100. package/esm/src/project_config.d.ts +47 -0
  101. package/esm/src/project_config.d.ts.map +1 -0
  102. package/esm/src/project_config.js +134 -0
  103. package/esm/src/providers/codex.d.ts +37 -0
  104. package/esm/src/providers/codex.d.ts.map +1 -0
  105. package/esm/src/providers/codex.js +809 -0
  106. package/esm/src/providers/google.d.ts +3 -1
  107. package/esm/src/providers/google.d.ts.map +1 -1
  108. package/esm/src/providers/google.js +82 -6
  109. package/esm/src/providers/ollama.d.ts +3 -1
  110. package/esm/src/providers/ollama.d.ts.map +1 -1
  111. package/esm/src/providers/ollama.js +295 -15
  112. package/esm/src/providers/openrouter.d.ts +6 -2
  113. package/esm/src/providers/openrouter.d.ts.map +1 -1
  114. package/esm/src/providers/openrouter.js +334 -23
  115. package/esm/src/providers/router.d.ts +19 -0
  116. package/esm/src/providers/router.d.ts.map +1 -0
  117. package/esm/src/providers/router.js +93 -0
  118. package/esm/src/server.d.ts +9 -0
  119. package/esm/src/server.d.ts.map +1 -1
  120. package/esm/src/server.js +3361 -670
  121. package/esm/src/server_feedback_grading_routes.d.ts +32 -0
  122. package/esm/src/server_feedback_grading_routes.d.ts.map +1 -0
  123. package/esm/src/server_feedback_grading_routes.js +305 -0
  124. package/esm/src/server_helpers.d.ts +4 -0
  125. package/esm/src/server_helpers.d.ts.map +1 -0
  126. package/esm/src/server_helpers.js +46 -0
  127. package/esm/src/server_session_store.d.ts +87 -0
  128. package/esm/src/server_session_store.d.ts.map +1 -0
  129. package/esm/src/server_session_store.js +876 -0
  130. package/esm/src/server_types.d.ts +111 -0
  131. package/esm/src/server_types.d.ts.map +1 -0
  132. package/esm/src/server_types.js +1 -0
  133. package/esm/src/server_ui_routes.d.ts +33 -0
  134. package/esm/src/server_ui_routes.d.ts.map +1 -0
  135. package/esm/src/server_ui_routes.js +139 -0
  136. package/esm/src/session_artifacts.d.ts +22 -0
  137. package/esm/src/session_artifacts.d.ts.map +1 -0
  138. package/esm/src/session_artifacts.js +243 -0
  139. package/esm/src/trace.d.ts.map +1 -1
  140. package/esm/src/trace.js +6 -3
  141. package/esm/src/workspace.d.ts +19 -0
  142. package/esm/src/workspace.d.ts.map +1 -0
  143. package/esm/src/workspace.js +162 -0
  144. package/esm/src/workspace_contract.d.ts +78 -0
  145. package/esm/src/workspace_contract.d.ts.map +1 -0
  146. package/esm/src/workspace_contract.js +77 -0
  147. package/package.json +2 -2
  148. package/script/_dnt.polyfills.d.ts +17 -0
  149. package/script/_dnt.polyfills.d.ts.map +1 -1
  150. package/script/_dnt.polyfills.js +123 -0
  151. package/script/deps/jsr.io/@std/collections/1.1.6/deep_merge.d.ts +322 -0
  152. package/script/deps/jsr.io/@std/collections/1.1.6/deep_merge.d.ts.map +1 -0
  153. package/script/deps/jsr.io/@std/collections/1.1.6/deep_merge.js +108 -0
  154. package/script/deps/jsr.io/@std/fs/1.0.23/_create_walk_entry.d.ts +14 -0
  155. package/script/deps/jsr.io/@std/fs/1.0.23/_create_walk_entry.d.ts.map +1 -0
  156. package/script/deps/jsr.io/@std/fs/1.0.23/_create_walk_entry.js +71 -0
  157. package/script/deps/jsr.io/@std/fs/1.0.23/_get_file_info_type.d.ts +13 -0
  158. package/script/deps/jsr.io/@std/fs/1.0.23/_get_file_info_type.d.ts.map +1 -0
  159. package/script/deps/jsr.io/@std/fs/1.0.23/_get_file_info_type.js +21 -0
  160. package/script/deps/jsr.io/@std/fs/1.0.23/_is_same_path.d.ts +10 -0
  161. package/script/deps/jsr.io/@std/fs/1.0.23/_is_same_path.d.ts.map +1 -0
  162. package/script/deps/jsr.io/@std/fs/1.0.23/_is_same_path.js +20 -0
  163. package/script/deps/jsr.io/@std/fs/1.0.23/_is_subdir.d.ts +12 -0
  164. package/script/deps/jsr.io/@std/fs/1.0.23/_is_subdir.d.ts.map +1 -0
  165. package/script/deps/jsr.io/@std/fs/1.0.23/_is_subdir.js +28 -0
  166. package/script/deps/jsr.io/@std/fs/1.0.23/_to_path_string.d.ts +9 -0
  167. package/script/deps/jsr.io/@std/fs/1.0.23/_to_path_string.d.ts.map +1 -0
  168. package/script/deps/jsr.io/@std/fs/1.0.23/_to_path_string.js +16 -0
  169. package/script/deps/jsr.io/@std/fs/1.0.23/copy.d.ts +117 -0
  170. package/script/deps/jsr.io/@std/fs/1.0.23/copy.d.ts.map +1 -0
  171. package/script/deps/jsr.io/@std/fs/1.0.23/copy.js +350 -0
  172. package/script/deps/jsr.io/@std/fs/1.0.23/empty_dir.d.ts +48 -0
  173. package/script/deps/jsr.io/@std/fs/1.0.23/empty_dir.d.ts.map +1 -0
  174. package/script/deps/jsr.io/@std/fs/1.0.23/empty_dir.js +124 -0
  175. package/script/deps/jsr.io/@std/fs/1.0.23/ensure_dir.d.ts +49 -0
  176. package/script/deps/jsr.io/@std/fs/1.0.23/ensure_dir.d.ts.map +1 -0
  177. package/script/deps/jsr.io/@std/fs/1.0.23/ensure_dir.js +139 -0
  178. package/script/deps/jsr.io/@std/fs/1.0.23/ensure_file.d.ts +47 -0
  179. package/script/deps/jsr.io/@std/fs/1.0.23/ensure_file.d.ts.map +1 -0
  180. package/script/deps/jsr.io/@std/fs/1.0.23/ensure_file.js +127 -0
  181. package/script/deps/jsr.io/@std/fs/1.0.23/ensure_link.d.ts +49 -0
  182. package/script/deps/jsr.io/@std/fs/1.0.23/ensure_link.d.ts.map +1 -0
  183. package/script/deps/jsr.io/@std/fs/1.0.23/ensure_link.js +98 -0
  184. package/script/deps/jsr.io/@std/fs/1.0.23/ensure_symlink.d.ts +70 -0
  185. package/script/deps/jsr.io/@std/fs/1.0.23/ensure_symlink.d.ts.map +1 -0
  186. package/script/deps/jsr.io/@std/fs/1.0.23/ensure_symlink.js +193 -0
  187. package/script/deps/jsr.io/@std/fs/1.0.23/eol.d.ts +52 -0
  188. package/script/deps/jsr.io/@std/fs/1.0.23/eol.d.ts.map +1 -0
  189. package/script/deps/jsr.io/@std/fs/1.0.23/eol.js +105 -0
  190. package/script/deps/jsr.io/@std/fs/1.0.23/exists.d.ts +218 -0
  191. package/script/deps/jsr.io/@std/fs/1.0.23/exists.d.ts.map +1 -0
  192. package/script/deps/jsr.io/@std/fs/1.0.23/exists.js +308 -0
  193. package/script/deps/jsr.io/@std/fs/1.0.23/expand_glob.d.ts +267 -0
  194. package/script/deps/jsr.io/@std/fs/1.0.23/expand_glob.d.ts.map +1 -0
  195. package/script/deps/jsr.io/@std/fs/1.0.23/expand_glob.js +479 -0
  196. package/script/deps/jsr.io/@std/fs/1.0.23/mod.d.ts +29 -0
  197. package/script/deps/jsr.io/@std/fs/1.0.23/mod.d.ts.map +1 -0
  198. package/script/deps/jsr.io/@std/fs/1.0.23/mod.js +45 -0
  199. package/script/deps/jsr.io/@std/fs/1.0.23/move.d.ts +86 -0
  200. package/script/deps/jsr.io/@std/fs/1.0.23/move.d.ts.map +1 -0
  201. package/script/deps/jsr.io/@std/fs/1.0.23/move.js +179 -0
  202. package/script/deps/jsr.io/@std/fs/1.0.23/walk.d.ts +777 -0
  203. package/script/deps/jsr.io/@std/fs/1.0.23/walk.d.ts.map +1 -0
  204. package/script/deps/jsr.io/@std/fs/1.0.23/walk.js +883 -0
  205. package/script/deps/jsr.io/@std/json/1.0.3/types.d.ts +7 -0
  206. package/script/deps/jsr.io/@std/json/1.0.3/types.d.ts.map +1 -0
  207. package/script/deps/jsr.io/@std/json/1.0.3/types.js +4 -0
  208. package/script/deps/jsr.io/@std/jsonc/1.0.2/mod.d.ts +20 -0
  209. package/script/deps/jsr.io/@std/jsonc/1.0.2/mod.d.ts.map +1 -0
  210. package/script/deps/jsr.io/@std/jsonc/1.0.2/mod.js +37 -0
  211. package/script/deps/jsr.io/@std/jsonc/1.0.2/parse.d.ts +21 -0
  212. package/script/deps/jsr.io/@std/jsonc/1.0.2/parse.d.ts.map +1 -0
  213. package/script/deps/jsr.io/@std/jsonc/1.0.2/parse.js +323 -0
  214. package/script/deps/jsr.io/@std/path/1.1.4/constants.d.ts +1 -1
  215. package/script/deps/jsr.io/@std/toml/1.0.11/_parser.d.ts +93 -0
  216. package/script/deps/jsr.io/@std/toml/1.0.11/_parser.d.ts.map +1 -0
  217. package/script/deps/jsr.io/@std/toml/1.0.11/_parser.js +781 -0
  218. package/script/deps/jsr.io/@std/toml/1.0.11/mod.d.ts +109 -0
  219. package/script/deps/jsr.io/@std/toml/1.0.11/mod.d.ts.map +1 -0
  220. package/script/deps/jsr.io/@std/toml/1.0.11/mod.js +126 -0
  221. package/script/deps/jsr.io/@std/toml/1.0.11/parse.d.ts +21 -0
  222. package/script/deps/jsr.io/@std/toml/1.0.11/parse.d.ts.map +1 -0
  223. package/script/deps/jsr.io/@std/toml/1.0.11/parse.js +28 -0
  224. package/script/deps/jsr.io/@std/toml/1.0.11/stringify.d.ts +35 -0
  225. package/script/deps/jsr.io/@std/toml/1.0.11/stringify.d.ts.map +1 -0
  226. package/script/deps/jsr.io/@std/toml/1.0.11/stringify.js +286 -0
  227. package/script/gambit/simulator-ui/dist/bundle.js +13788 -5157
  228. package/script/gambit/simulator-ui/dist/bundle.js.map +4 -4
  229. package/script/mod.d.ts +13 -3
  230. package/script/mod.d.ts.map +1 -1
  231. package/script/mod.js +14 -5
  232. package/script/src/cli_utils.d.ts +1 -0
  233. package/script/src/cli_utils.d.ts.map +1 -1
  234. package/script/src/cli_utils.js +14 -1
  235. package/script/src/default_runtime.d.ts +46 -0
  236. package/script/src/default_runtime.d.ts.map +1 -0
  237. package/script/src/default_runtime.js +452 -0
  238. package/script/src/durable_streams.js +26 -1
  239. package/script/src/model_matchers.d.ts +10 -0
  240. package/script/src/model_matchers.d.ts.map +1 -0
  241. package/script/src/model_matchers.js +29 -0
  242. package/script/src/openai_compat.d.ts +12 -1
  243. package/script/src/openai_compat.d.ts.map +1 -1
  244. package/script/src/openai_compat.js +85 -0
  245. package/script/src/project_config.d.ts +47 -0
  246. package/script/src/project_config.d.ts.map +1 -0
  247. package/script/src/project_config.js +173 -0
  248. package/script/src/providers/codex.d.ts +37 -0
  249. package/script/src/providers/codex.d.ts.map +1 -0
  250. package/script/src/providers/codex.js +849 -0
  251. package/script/src/providers/google.d.ts +3 -1
  252. package/script/src/providers/google.d.ts.map +1 -1
  253. package/script/src/providers/google.js +82 -6
  254. package/script/src/providers/ollama.d.ts +3 -1
  255. package/script/src/providers/ollama.d.ts.map +1 -1
  256. package/script/src/providers/ollama.js +295 -15
  257. package/script/src/providers/openrouter.d.ts +6 -2
  258. package/script/src/providers/openrouter.d.ts.map +1 -1
  259. package/script/src/providers/openrouter.js +334 -23
  260. package/script/src/providers/router.d.ts +19 -0
  261. package/script/src/providers/router.d.ts.map +1 -0
  262. package/script/src/providers/router.js +96 -0
  263. package/script/src/server.d.ts +9 -0
  264. package/script/src/server.d.ts.map +1 -1
  265. package/script/src/server.js +3368 -677
  266. package/script/src/server_feedback_grading_routes.d.ts +32 -0
  267. package/script/src/server_feedback_grading_routes.d.ts.map +1 -0
  268. package/script/src/server_feedback_grading_routes.js +343 -0
  269. package/script/src/server_helpers.d.ts +4 -0
  270. package/script/src/server_helpers.d.ts.map +1 -0
  271. package/script/src/server_helpers.js +84 -0
  272. package/script/src/server_session_store.d.ts +87 -0
  273. package/script/src/server_session_store.d.ts.map +1 -0
  274. package/script/src/server_session_store.js +913 -0
  275. package/script/src/server_types.d.ts +111 -0
  276. package/script/src/server_types.d.ts.map +1 -0
  277. package/script/src/server_types.js +2 -0
  278. package/script/src/server_ui_routes.d.ts +33 -0
  279. package/script/src/server_ui_routes.d.ts.map +1 -0
  280. package/script/src/server_ui_routes.js +176 -0
  281. package/script/src/session_artifacts.d.ts +22 -0
  282. package/script/src/session_artifacts.d.ts.map +1 -0
  283. package/script/src/session_artifacts.js +279 -0
  284. package/script/src/trace.d.ts.map +1 -1
  285. package/script/src/trace.js +6 -3
  286. package/script/src/workspace.d.ts +19 -0
  287. package/script/src/workspace.d.ts.map +1 -0
  288. package/script/src/workspace.js +199 -0
  289. package/script/src/workspace_contract.d.ts +78 -0
  290. package/script/src/workspace_contract.d.ts.map +1 -0
  291. package/script/src/workspace_contract.js +85 -0
@@ -0,0 +1,913 @@
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.createSessionStore = 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 mod_js_1 = require("../deps/jsr.io/@std/fs/1.0.23/mod.js");
40
+ const TRACE_EVENT_TYPES = new Set([
41
+ "run.start",
42
+ "message.user",
43
+ "run.end",
44
+ "deck.start",
45
+ "deck.end",
46
+ "action.start",
47
+ "action.end",
48
+ "tool.call",
49
+ "tool.result",
50
+ "model.call",
51
+ "model.result",
52
+ "model.stream.event",
53
+ "log",
54
+ "monolog",
55
+ ]);
56
+ const isTraceEventType = (type) => TRACE_EVENT_TYPES.has(type) || type.startsWith("response.") ||
57
+ (type.startsWith("gambit.") &&
58
+ TRACE_EVENT_TYPES.has(type.slice("gambit.".length)));
59
+ const normalizePersistedTraceRecord = (record) => {
60
+ const type = typeof record.type === "string" ? record.type : "";
61
+ if (!type)
62
+ return null;
63
+ if (TRACE_EVENT_TYPES.has(type) || type.startsWith("response.")) {
64
+ return record;
65
+ }
66
+ if (!type.startsWith("gambit."))
67
+ return null;
68
+ const rawMeta = record._gambit;
69
+ const meta = rawMeta && typeof rawMeta === "object" && !Array.isArray(rawMeta)
70
+ ? rawMeta
71
+ : undefined;
72
+ const sourceType = typeof meta?.source_type === "string" &&
73
+ meta.source_type.trim().length > 0
74
+ ? meta.source_type.trim()
75
+ : type.slice("gambit.".length);
76
+ if (!TRACE_EVENT_TYPES.has(sourceType))
77
+ return null;
78
+ return {
79
+ ...record,
80
+ type: sourceType,
81
+ };
82
+ };
83
+ const inferWorkspaceDomain = (payloadType) => {
84
+ if (payloadType === "buildBotStatus" || payloadType === "buildBotTrace" ||
85
+ payloadType === "buildBotStream" || payloadType === "buildBotStreamEnd" ||
86
+ payloadType.startsWith("gambit.build.")) {
87
+ return "build";
88
+ }
89
+ if (payloadType === "testBotStatus" || payloadType === "testBotTrace" ||
90
+ payloadType === "testBotStream" || payloadType === "testBotStreamEnd" ||
91
+ payloadType.startsWith("gambit.test.")) {
92
+ return "test";
93
+ }
94
+ if (payloadType === "calibrateSession" || payloadType === "grading.run" ||
95
+ payloadType === "grading.flag" || payloadType === "grading.flag.reason" ||
96
+ payloadType === "grading.reference" ||
97
+ payloadType.startsWith("gambit.grade.") ||
98
+ payloadType.startsWith("gambit.grading.")) {
99
+ return "grade";
100
+ }
101
+ return "session";
102
+ };
103
+ const isWorkspaceEventDomain = (value) => value === "build" || value === "test" || value === "grade" ||
104
+ value === "session";
105
+ const CANONICAL_EVENT_TYPE_BY_LEGACY = new Map([
106
+ ["buildBotStatus", "gambit.build.status"],
107
+ ["buildBotTrace", "gambit.build.trace"],
108
+ ["buildBotStream", "gambit.build.stream.delta"],
109
+ ["buildBotStreamEnd", "gambit.build.stream.done"],
110
+ ["testBotStatus", "gambit.test.status"],
111
+ ["testBotStream", "gambit.test.stream.delta"],
112
+ ["testBotStreamEnd", "gambit.test.stream.done"],
113
+ ["calibrateSession", "gambit.grade.session"],
114
+ ["feedback.update", "gambit.feedback.update"],
115
+ ["grading.run", "gambit.grading.run"],
116
+ ["grading.flag", "gambit.grading.flag"],
117
+ ["grading.flag.reason", "gambit.grading.flag.reason"],
118
+ ["grading.reference", "gambit.grading.reference"],
119
+ ["notes.update", "gambit.notes.update"],
120
+ ["conversation.score.update", "gambit.conversation.score.update"],
121
+ ["session.start", "gambit.session.start"],
122
+ ["server.error", "gambit.server.error"],
123
+ ]);
124
+ const normalizeEventType = (type, kind) => {
125
+ if (type.startsWith("response.") || type.startsWith("gambit.")) {
126
+ return { canonicalType: type };
127
+ }
128
+ if (kind === "trace" || isTraceEventType(type)) {
129
+ return { canonicalType: type };
130
+ }
131
+ const mapped = CANONICAL_EVENT_TYPE_BY_LEGACY.get(type);
132
+ if (mapped) {
133
+ return { canonicalType: mapped, legacyType: type };
134
+ }
135
+ return { canonicalType: `gambit.${type}`, legacyType: type };
136
+ };
137
+ const safeStringify = (value, space) => {
138
+ const stack = [];
139
+ return JSON.stringify(value, function (_key, candidate) {
140
+ if (!candidate || typeof candidate !== "object") {
141
+ return candidate;
142
+ }
143
+ while (stack.length > 0 && stack[stack.length - 1] !== this) {
144
+ stack.pop();
145
+ }
146
+ if (stack.includes(candidate)) {
147
+ return "[Circular]";
148
+ }
149
+ stack.push(candidate);
150
+ return candidate;
151
+ }, space);
152
+ };
153
+ const createSessionStore = (deps) => {
154
+ const { sessionsRoot, ensureDir, randomId, logger, enrichStateWithSession, workspaceStateSchemaVersion, workspaceSchemaError, } = deps;
155
+ const sessionStateCache = new Map();
156
+ const sessionWriteQueues = new Map();
157
+ const sessionWriteActive = new Set();
158
+ const sessionOffsetById = new Map();
159
+ const buildProjectionCache = new Map();
160
+ const enqueueSessionWrite = (sessionId, task) => {
161
+ const queue = sessionWriteQueues.get(sessionId) ?? [];
162
+ queue.push(task);
163
+ sessionWriteQueues.set(sessionId, queue);
164
+ if (sessionWriteActive.has(sessionId))
165
+ return;
166
+ sessionWriteActive.add(sessionId);
167
+ while (queue.length) {
168
+ const next = queue.shift();
169
+ if (!next)
170
+ continue;
171
+ try {
172
+ next();
173
+ }
174
+ catch (err) {
175
+ logger.warn(`[sim] session write failed: ${err instanceof Error ? err.message : err}`);
176
+ }
177
+ }
178
+ sessionWriteActive.delete(sessionId);
179
+ };
180
+ const mergeSessionState = (current, next) => {
181
+ if (!current)
182
+ return next;
183
+ const merged = {
184
+ ...current,
185
+ ...next,
186
+ meta: {
187
+ ...(current.meta ?? {}),
188
+ ...(next.meta ?? {}),
189
+ },
190
+ messages: next.messages ?? current.messages,
191
+ items: next.items ?? current.items,
192
+ format: next.format ?? current.format,
193
+ messageRefs: next.messageRefs ?? current.messageRefs,
194
+ feedback: next.feedback ?? current.feedback,
195
+ notes: next.notes ?? current.notes,
196
+ conversationScore: next.conversationScore ?? current.conversationScore,
197
+ traces: next.traces ?? current.traces,
198
+ };
199
+ return merged;
200
+ };
201
+ const parseFiniteInteger = (value) => {
202
+ if (typeof value !== "number" || !Number.isFinite(value))
203
+ return undefined;
204
+ if (!Number.isInteger(value))
205
+ return undefined;
206
+ return value;
207
+ };
208
+ const normalizeBuildProjectionRun = (workspaceId, value) => {
209
+ if (!value || typeof value !== "object") {
210
+ return {
211
+ id: workspaceId,
212
+ status: "idle",
213
+ messages: [],
214
+ traces: [],
215
+ toolInserts: [],
216
+ };
217
+ }
218
+ const run = value;
219
+ const status = run.status;
220
+ const normalizedStatus = status === "running" || status === "completed" ||
221
+ status === "error" || status === "canceled"
222
+ ? status
223
+ : "idle";
224
+ return {
225
+ id: typeof run.id === "string" && run.id.trim().length > 0
226
+ ? run.id
227
+ : workspaceId,
228
+ status: normalizedStatus,
229
+ error: typeof run.error === "string" ? run.error : undefined,
230
+ startedAt: typeof run.startedAt === "string" ? run.startedAt : undefined,
231
+ finishedAt: typeof run.finishedAt === "string"
232
+ ? run.finishedAt
233
+ : undefined,
234
+ messages: Array.isArray(run.messages)
235
+ ? run.messages
236
+ : [],
237
+ traces: Array.isArray(run.traces) ? run.traces : [],
238
+ toolInserts: Array.isArray(run.toolInserts)
239
+ ? run.toolInserts
240
+ : [],
241
+ };
242
+ };
243
+ const toCanonicalEventRecord = (args) => {
244
+ const payloadType = typeof args.data.type === "string"
245
+ ? args.data.type
246
+ : `gambit.${args.eventType}.event`;
247
+ const rawMeta = args.data._gambit;
248
+ const meta = rawMeta && typeof rawMeta === "object" && !Array.isArray(rawMeta)
249
+ ? rawMeta
250
+ : {};
251
+ return {
252
+ ...args.data,
253
+ type: payloadType,
254
+ offset: args.offset,
255
+ createdAt: args.createdAt,
256
+ _gambit: {
257
+ ...meta,
258
+ domain: args.eventType,
259
+ offset: args.offset,
260
+ },
261
+ };
262
+ };
263
+ const readEnvelopeRecords = (eventsPath) => {
264
+ try {
265
+ const text = dntShim.Deno.readTextFileSync(eventsPath);
266
+ const records = [];
267
+ let maxOffset = -1;
268
+ for (const line of text.split("\n")) {
269
+ if (!line.trim())
270
+ continue;
271
+ const parsed = JSON.parse(line);
272
+ const offset = parseFiniteInteger(parsed.offset) ??
273
+ parseFiniteInteger(parsed._gambit?.offset);
274
+ if (offset === undefined)
275
+ continue;
276
+ const envelopeType = typeof parsed.type === "string" ? parsed.type : "";
277
+ const nestedData = parsed.data;
278
+ const payload = isWorkspaceEventDomain(envelopeType) &&
279
+ nestedData && typeof nestedData === "object" &&
280
+ !Array.isArray(nestedData)
281
+ ? nestedData
282
+ : parsed;
283
+ const payloadType = typeof payload.type === "string"
284
+ ? payload.type
285
+ : "";
286
+ if (!payloadType)
287
+ continue;
288
+ const meta = parsed._gambit &&
289
+ typeof parsed._gambit === "object" &&
290
+ !Array.isArray(parsed._gambit)
291
+ ? parsed._gambit
292
+ : null;
293
+ const domain = (() => {
294
+ const explicit = meta?.domain;
295
+ if (explicit === "build" || explicit === "test" ||
296
+ explicit === "grade" || explicit === "session") {
297
+ return explicit;
298
+ }
299
+ if (isWorkspaceEventDomain(envelopeType)) {
300
+ return envelopeType;
301
+ }
302
+ return inferWorkspaceDomain(payloadType);
303
+ })();
304
+ if (!domain)
305
+ continue;
306
+ const createdAt = typeof parsed.createdAt === "string"
307
+ ? parsed.createdAt
308
+ : typeof parsed.created_at === "string"
309
+ ? parsed.created_at
310
+ : typeof payload.createdAt === "string"
311
+ ? payload.createdAt
312
+ : typeof payload.created_at === "string"
313
+ ? payload.created_at
314
+ : typeof meta?.created_at === "string"
315
+ ? meta.created_at
316
+ : new Date(0).toISOString();
317
+ const envelope = {
318
+ offset,
319
+ type: domain,
320
+ createdAt,
321
+ data: payload,
322
+ };
323
+ records.push(envelope);
324
+ if (offset > maxOffset) {
325
+ maxOffset = offset;
326
+ }
327
+ }
328
+ return { records, maxOffset };
329
+ }
330
+ catch {
331
+ return { records: [], maxOffset: -1 };
332
+ }
333
+ };
334
+ const ensureMonotonicOffsets = (records, eventsPath) => {
335
+ let expected = 0;
336
+ let highest = -1;
337
+ for (const record of records) {
338
+ if (record.offset !== expected) {
339
+ throw new Error(`Non-monotonic offset in ${eventsPath}: expected ${expected}, got ${record.offset}`);
340
+ }
341
+ highest = record.offset;
342
+ expected = record.offset + 1;
343
+ }
344
+ return highest;
345
+ };
346
+ const getCurrentSessionOffset = (sessionId, state) => {
347
+ const cached = sessionOffsetById.get(sessionId);
348
+ if (cached !== undefined)
349
+ return cached;
350
+ const fromMeta = parseFiniteInteger(state?.meta
351
+ ?.lastAppliedOffset) ??
352
+ parseFiniteInteger(state?.meta
353
+ ?.lastAppliedEventSeq);
354
+ if (fromMeta !== undefined) {
355
+ sessionOffsetById.set(sessionId, fromMeta);
356
+ return fromMeta;
357
+ }
358
+ const eventsPath = typeof state?.meta?.sessionEventsPath === "string"
359
+ ? state.meta.sessionEventsPath
360
+ : path.join(sessionsRoot, sessionId, "events.jsonl");
361
+ const { records } = readEnvelopeRecords(eventsPath);
362
+ if (records.length > 0) {
363
+ const validated = ensureMonotonicOffsets(records, eventsPath);
364
+ sessionOffsetById.set(sessionId, validated);
365
+ return validated;
366
+ }
367
+ sessionOffsetById.set(sessionId, -1);
368
+ return -1;
369
+ };
370
+ const nextSessionOffsetCandidate = (sessionId, state) => getCurrentSessionOffset(sessionId, state) + 1;
371
+ const upsertScenarioRunSummary = (meta) => {
372
+ const scenarioRunId = typeof meta.scenarioRunId === "string"
373
+ ? meta.scenarioRunId
374
+ : undefined;
375
+ if (!scenarioRunId)
376
+ return;
377
+ const lastEventSeq = parseFiniteInteger(meta.lastAppliedOffset) ??
378
+ parseFiniteInteger(meta.lastAppliedEventSeq) ??
379
+ 0;
380
+ const updatedAt = typeof meta.sessionUpdatedAt === "string"
381
+ ? meta.sessionUpdatedAt
382
+ : new Date().toISOString();
383
+ const selectedScenarioDeckId = typeof meta.selectedScenarioDeckId === "string"
384
+ ? meta.selectedScenarioDeckId
385
+ : typeof meta.testBotName === "string"
386
+ ? meta.testBotName
387
+ : "unknown";
388
+ const selectedScenarioDeckLabel = typeof meta.selectedScenarioDeckLabel === "string"
389
+ ? meta.selectedScenarioDeckLabel
390
+ : undefined;
391
+ const scenarioConfigPath = typeof meta.scenarioConfigPath === "string"
392
+ ? meta.scenarioConfigPath
393
+ : typeof meta.testBotConfigPath === "string"
394
+ ? meta.testBotConfigPath
395
+ : typeof meta.deck === "string"
396
+ ? meta.deck
397
+ : "unknown";
398
+ const previous = Array.isArray(meta.scenarioRunSummaries)
399
+ ? meta.scenarioRunSummaries
400
+ : [];
401
+ const nextSummary = {
402
+ scenarioRunId,
403
+ lastEventSeq,
404
+ updatedAt,
405
+ selectedScenarioDeckId,
406
+ selectedScenarioDeckLabel,
407
+ scenarioConfigPath,
408
+ };
409
+ const existingIdx = previous.findIndex((entry) => entry.scenarioRunId === scenarioRunId);
410
+ meta.scenarioRunSummaries = existingIdx >= 0
411
+ ? previous.map((entry, idx) => idx === existingIdx ? nextSummary : entry)
412
+ : [...previous, nextSummary];
413
+ meta.scenarioRunSummary = nextSummary;
414
+ };
415
+ const normalizeScenarioRunSummary = (value) => {
416
+ if (!value || typeof value !== "object")
417
+ return null;
418
+ const summary = value;
419
+ const scenarioRunId = typeof summary.scenarioRunId === "string"
420
+ ? summary.scenarioRunId
421
+ : null;
422
+ const lastEventSeq = parseFiniteInteger(summary.lastEventSeq);
423
+ const updatedAt = typeof summary.updatedAt === "string"
424
+ ? summary.updatedAt
425
+ : null;
426
+ const selectedScenarioDeckId = typeof summary.selectedScenarioDeckId === "string"
427
+ ? summary.selectedScenarioDeckId
428
+ : null;
429
+ const selectedScenarioDeckLabel = typeof summary.selectedScenarioDeckLabel === "string"
430
+ ? summary.selectedScenarioDeckLabel
431
+ : undefined;
432
+ const scenarioConfigPath = typeof summary.scenarioConfigPath === "string"
433
+ ? summary.scenarioConfigPath
434
+ : null;
435
+ if (!scenarioRunId || lastEventSeq === undefined || !updatedAt ||
436
+ !selectedScenarioDeckId || !scenarioConfigPath) {
437
+ return null;
438
+ }
439
+ return {
440
+ scenarioRunId,
441
+ lastEventSeq,
442
+ updatedAt,
443
+ selectedScenarioDeckId,
444
+ selectedScenarioDeckLabel,
445
+ scenarioConfigPath,
446
+ };
447
+ };
448
+ const selectCanonicalScenarioRunSummary = (meta) => {
449
+ const fromCurrent = normalizeScenarioRunSummary(meta.scenarioRunSummary);
450
+ const fromListRaw = Array.isArray(meta.scenarioRunSummaries)
451
+ ? meta.scenarioRunSummaries
452
+ : [];
453
+ const fromList = fromListRaw
454
+ .map((entry) => normalizeScenarioRunSummary(entry))
455
+ .filter((entry) => Boolean(entry));
456
+ const all = fromCurrent ? [fromCurrent, ...fromList] : fromList;
457
+ if (!all.length)
458
+ return null;
459
+ all.sort((a, b) => {
460
+ if (a.lastEventSeq !== b.lastEventSeq) {
461
+ return b.lastEventSeq - a.lastEventSeq;
462
+ }
463
+ if (a.updatedAt !== b.updatedAt) {
464
+ return b.updatedAt.localeCompare(a.updatedAt);
465
+ }
466
+ return a.scenarioRunId.localeCompare(b.scenarioRunId);
467
+ });
468
+ return all[0] ?? null;
469
+ };
470
+ const materializeSnapshot = (state) => {
471
+ const snapshot = { ...state };
472
+ const sessionId = typeof snapshot.meta?.sessionId === "string"
473
+ ? snapshot.meta.sessionId
474
+ : undefined;
475
+ if (sessionId) {
476
+ const meta = { ...(snapshot.meta ?? {}) };
477
+ const lastAppliedOffset = getCurrentSessionOffset(sessionId, snapshot);
478
+ meta.lastAppliedOffset = lastAppliedOffset;
479
+ meta.lastAppliedEventSeq = lastAppliedOffset;
480
+ upsertScenarioRunSummary(meta);
481
+ snapshot.meta = meta;
482
+ }
483
+ delete snapshot.traces;
484
+ return snapshot;
485
+ };
486
+ const writeJsonAtomic = (filePath, payload) => {
487
+ const dir = path.dirname(filePath);
488
+ ensureDir(dir);
489
+ const tmpPath = path.join(dir, `.tmp-${path.basename(filePath)}-${randomId("tmp")}`);
490
+ dntShim.Deno.writeTextFileSync(tmpPath, safeStringify(payload, 2));
491
+ dntShim.Deno.renameSync(tmpPath, filePath);
492
+ };
493
+ const appendJsonl = (filePath, payload) => {
494
+ const dir = path.dirname(filePath);
495
+ ensureDir(dir);
496
+ const line = safeStringify(payload);
497
+ dntShim.Deno.writeTextFileSync(filePath, `${line}\n`, { append: true });
498
+ };
499
+ const readBuildProjection = (workspaceId) => {
500
+ const cached = buildProjectionCache.get(workspaceId);
501
+ if (cached)
502
+ return cached;
503
+ const filePath = path.join(sessionsRoot, workspaceId, "build_state.json");
504
+ try {
505
+ const parsed = JSON.parse(dntShim.Deno.readTextFileSync(filePath));
506
+ const lastAppliedOffset = parseFiniteInteger(parsed.lastAppliedOffset) ??
507
+ -1;
508
+ const run = normalizeBuildProjectionRun(workspaceId, parsed.run);
509
+ const projection = {
510
+ workspaceId,
511
+ lastAppliedOffset,
512
+ run,
513
+ state: parsed.state && typeof parsed.state === "object"
514
+ ? parsed.state
515
+ : undefined,
516
+ };
517
+ buildProjectionCache.set(workspaceId, projection);
518
+ return projection;
519
+ }
520
+ catch {
521
+ const empty = {
522
+ workspaceId,
523
+ lastAppliedOffset: -1,
524
+ run: {
525
+ id: workspaceId,
526
+ status: "idle",
527
+ messages: [],
528
+ traces: [],
529
+ toolInserts: [],
530
+ },
531
+ state: undefined,
532
+ };
533
+ buildProjectionCache.set(workspaceId, empty);
534
+ return empty;
535
+ }
536
+ };
537
+ const replayBuildProjection = (workspaceId, envelopes) => {
538
+ const state = {
539
+ workspaceId,
540
+ lastAppliedOffset: -1,
541
+ run: {
542
+ id: workspaceId,
543
+ status: "idle",
544
+ messages: [],
545
+ traces: [],
546
+ toolInserts: [],
547
+ },
548
+ };
549
+ for (const envelope of envelopes) {
550
+ state.lastAppliedOffset = envelope.offset;
551
+ if (envelope.type !== "build")
552
+ continue;
553
+ const payloadType = typeof envelope.data.type === "string"
554
+ ? envelope.data.type
555
+ : "";
556
+ if (payloadType === "buildBotStatus" ||
557
+ payloadType === "gambit.build.status") {
558
+ const run = normalizeBuildProjectionRun(workspaceId, envelope.data.run);
559
+ state.run = run;
560
+ const buildStateSnapshot = envelope.data.state;
561
+ if (buildStateSnapshot && typeof buildStateSnapshot === "object") {
562
+ state.state = buildStateSnapshot;
563
+ }
564
+ continue;
565
+ }
566
+ if (payloadType === "buildBotTrace" || payloadType === "gambit.build.trace") {
567
+ const event = envelope.data.event;
568
+ if (event && typeof event === "object") {
569
+ const currentTraces = Array.isArray(state.run.traces)
570
+ ? state.run.traces
571
+ : [];
572
+ state.run = {
573
+ ...state.run,
574
+ traces: [...currentTraces, event],
575
+ };
576
+ }
577
+ }
578
+ }
579
+ return state;
580
+ };
581
+ const rebuildBuildProjectionFromEvents = (workspaceId, eventsPath) => {
582
+ const { records } = readEnvelopeRecords(eventsPath);
583
+ if (records.length > 0) {
584
+ ensureMonotonicOffsets(records, eventsPath);
585
+ }
586
+ const projection = replayBuildProjection(workspaceId, records);
587
+ const buildPath = path.join(sessionsRoot, workspaceId, "build_state.json");
588
+ writeJsonAtomic(buildPath, projection);
589
+ buildProjectionCache.set(workspaceId, projection);
590
+ };
591
+ const updateSnapshotBoundary = (sessionId, statePath, offset) => {
592
+ if (!statePath || !(0, mod_js_1.existsSync)(statePath))
593
+ return;
594
+ try {
595
+ const text = dntShim.Deno.readTextFileSync(statePath);
596
+ const parsed = JSON.parse(text);
597
+ const parsedMeta = parsed.meta && typeof parsed.meta === "object"
598
+ ? parsed.meta
599
+ : {};
600
+ const previousBoundary = parseFiniteInteger(parsedMeta.lastAppliedOffset) ??
601
+ parseFiniteInteger(parsedMeta.lastAppliedEventSeq) ??
602
+ -1;
603
+ if (offset <= previousBoundary)
604
+ return;
605
+ parsedMeta.lastAppliedOffset = offset;
606
+ parsedMeta.lastAppliedEventSeq = offset;
607
+ parsedMeta.sessionUpdatedAt = new Date().toISOString();
608
+ upsertScenarioRunSummary(parsedMeta);
609
+ const nextState = { ...parsed, meta: parsedMeta };
610
+ writeJsonAtomic(statePath, nextState);
611
+ sessionStateCache.set(sessionId, nextState);
612
+ }
613
+ catch {
614
+ // Keep append-only logging best-effort even if snapshot boundary update fails.
615
+ }
616
+ };
617
+ const appendWorkspaceEnvelope = (state, eventType, data) => {
618
+ const sessionId = typeof state.meta?.sessionId === "string"
619
+ ? state.meta.sessionId
620
+ : undefined;
621
+ const eventsPath = typeof state.meta?.sessionEventsPath === "string"
622
+ ? state.meta.sessionEventsPath
623
+ : undefined;
624
+ const statePath = typeof state.meta?.sessionStatePath === "string"
625
+ ? state.meta.sessionStatePath
626
+ : undefined;
627
+ if (!sessionId || !eventsPath)
628
+ return null;
629
+ const normalizedData = (() => {
630
+ const rawType = typeof data.type === "string" ? data.type : "";
631
+ if (!rawType)
632
+ return data;
633
+ const { canonicalType, legacyType } = normalizeEventType(rawType, data.kind);
634
+ if (!legacyType) {
635
+ return { ...data, type: canonicalType };
636
+ }
637
+ const rawMeta = data._gambit;
638
+ const meta = rawMeta && typeof rawMeta === "object" && !Array.isArray(rawMeta)
639
+ ? rawMeta
640
+ : {};
641
+ return {
642
+ ...data,
643
+ type: canonicalType,
644
+ _gambit: {
645
+ ...meta,
646
+ legacy_type: legacyType,
647
+ domain: eventType,
648
+ },
649
+ };
650
+ })();
651
+ const createdAt = new Date().toISOString();
652
+ const optimisticOffset = nextSessionOffsetCandidate(sessionId, state);
653
+ const envelope = {
654
+ offset: optimisticOffset,
655
+ createdAt,
656
+ type: eventType,
657
+ data: normalizedData,
658
+ };
659
+ enqueueSessionWrite(sessionId, () => {
660
+ const offset = nextSessionOffsetCandidate(sessionId, state);
661
+ appendJsonl(eventsPath, toCanonicalEventRecord({
662
+ eventType,
663
+ offset,
664
+ createdAt,
665
+ data: normalizedData,
666
+ }));
667
+ sessionOffsetById.set(sessionId, offset);
668
+ if (state.meta && typeof state.meta === "object") {
669
+ state.meta.lastAppliedOffset = offset;
670
+ state.meta.lastAppliedEventSeq = offset;
671
+ }
672
+ updateSnapshotBoundary(sessionId, statePath, offset);
673
+ if (eventType === "build") {
674
+ rebuildBuildProjectionFromEvents(sessionId, eventsPath);
675
+ }
676
+ });
677
+ return envelope;
678
+ };
679
+ const appendSessionEvent = (state, payload) => appendWorkspaceEnvelope(state, "session", payload);
680
+ const appendFeedbackLog = (state, payload) => appendWorkspaceEnvelope(state, "session", {
681
+ ...payload,
682
+ logType: "feedback",
683
+ });
684
+ const appendGradingLog = (state, payload) => appendWorkspaceEnvelope(state, "grade", payload);
685
+ const appendErrorLog = (state, payload) => appendWorkspaceEnvelope(state, "session", {
686
+ ...payload,
687
+ logType: "error",
688
+ });
689
+ const appendServerErrorLog = (workspaceId, payload) => {
690
+ if (!workspaceId)
691
+ return;
692
+ const state = readSessionState(workspaceId);
693
+ if (!state)
694
+ return;
695
+ appendErrorLog(state, {
696
+ type: "server.error",
697
+ ...payload,
698
+ });
699
+ };
700
+ const loadSessionTraces = (state) => {
701
+ const eventsPath = typeof state.meta?.sessionEventsPath === "string"
702
+ ? state.meta.sessionEventsPath
703
+ : undefined;
704
+ if (!eventsPath)
705
+ return [];
706
+ try {
707
+ const { records } = readEnvelopeRecords(eventsPath);
708
+ if (records.length > 0) {
709
+ ensureMonotonicOffsets(records, eventsPath);
710
+ }
711
+ const traces = [];
712
+ for (const envelope of records) {
713
+ const record = envelope.data;
714
+ const kind = typeof record.kind === "string" ? record.kind : "";
715
+ const type = typeof record.type === "string" ? record.type : "";
716
+ if (kind === "trace" || isTraceEventType(type)) {
717
+ const normalized = normalizePersistedTraceRecord(record);
718
+ if (normalized)
719
+ traces.push(normalized);
720
+ }
721
+ }
722
+ return traces;
723
+ }
724
+ catch {
725
+ return [];
726
+ }
727
+ };
728
+ const persistSessionState = (state) => {
729
+ const { state: enriched, dir } = enrichStateWithSession(state);
730
+ const sessionId = typeof enriched.meta?.sessionId === "string"
731
+ ? enriched.meta.sessionId
732
+ : undefined;
733
+ const merged = sessionId
734
+ ? mergeSessionState(sessionStateCache.get(sessionId), enriched)
735
+ : enriched;
736
+ if (sessionId) {
737
+ sessionStateCache.set(sessionId, merged);
738
+ }
739
+ if (dir && sessionId) {
740
+ const snapshot = materializeSnapshot(merged);
741
+ const eventsPath = typeof snapshot.meta?.sessionEventsPath === "string"
742
+ ? snapshot.meta.sessionEventsPath
743
+ : path.join(dir, "events.jsonl");
744
+ const statePath = typeof snapshot.meta?.sessionStatePath === "string"
745
+ ? snapshot.meta.sessionStatePath
746
+ : path.join(dir, "state.json");
747
+ enqueueSessionWrite(sessionId, () => {
748
+ try {
749
+ ensureDir(dir);
750
+ const firstWrite = !(0, mod_js_1.existsSync)(eventsPath);
751
+ if (firstWrite) {
752
+ const startOffset = nextSessionOffsetCandidate(sessionId, snapshot);
753
+ appendJsonl(eventsPath, toCanonicalEventRecord({
754
+ eventType: "session",
755
+ offset: startOffset,
756
+ createdAt: new Date().toISOString(),
757
+ data: {
758
+ type: "gambit.session.start",
759
+ _gambit: {
760
+ legacy_type: "session.start",
761
+ domain: "session",
762
+ },
763
+ category: "lifecycle",
764
+ sessionId,
765
+ runId: snapshot.runId,
766
+ deck: snapshot.meta?.deck,
767
+ },
768
+ }));
769
+ sessionOffsetById.set(sessionId, startOffset);
770
+ }
771
+ const snapshotOffset = nextSessionOffsetCandidate(sessionId, snapshot);
772
+ const snapshotToWrite = {
773
+ ...snapshot,
774
+ meta: {
775
+ ...(snapshot.meta ?? {}),
776
+ lastAppliedOffset: snapshotOffset,
777
+ lastAppliedEventSeq: snapshotOffset,
778
+ },
779
+ };
780
+ appendJsonl(eventsPath, toCanonicalEventRecord({
781
+ eventType: "session",
782
+ offset: snapshotOffset,
783
+ createdAt: new Date().toISOString(),
784
+ data: {
785
+ type: "session.snapshot",
786
+ category: "snapshot",
787
+ sessionId,
788
+ runId: snapshotToWrite.runId,
789
+ state: snapshotToWrite,
790
+ },
791
+ }));
792
+ // Advance in-memory offset immediately after append so a later
793
+ // snapshot write failure cannot cause duplicate offsets on retry.
794
+ sessionOffsetById.set(sessionId, snapshotOffset);
795
+ writeJsonAtomic(statePath, snapshotToWrite);
796
+ rebuildBuildProjectionFromEvents(sessionId, eventsPath);
797
+ }
798
+ catch (err) {
799
+ logger.warn(`[sim] failed to persist session state: ${err instanceof Error ? err.message : err}`);
800
+ }
801
+ });
802
+ }
803
+ return merged;
804
+ };
805
+ const readSessionStateStrict = (sessionId, opts) => {
806
+ const dir = path.join(sessionsRoot, sessionId);
807
+ const filePath = path.join(dir, "state.json");
808
+ const text = dntShim.Deno.readTextFileSync(filePath);
809
+ const parsed = JSON.parse(text);
810
+ if (!parsed || typeof parsed !== "object") {
811
+ throw new Error(`Invalid workspace state payload at ${filePath}`);
812
+ }
813
+ const parsedMeta = parsed.meta && typeof parsed.meta === "object"
814
+ ? parsed.meta
815
+ : {};
816
+ const schemaVersion = typeof parsedMeta.workspaceSchemaVersion === "string"
817
+ ? parsedMeta.workspaceSchemaVersion.trim()
818
+ : null;
819
+ // Backward compatibility: legacy workspace state files may not include
820
+ // workspaceSchemaVersion yet. Treat missing schema as v1-equivalent.
821
+ if (schemaVersion && schemaVersion !== workspaceStateSchemaVersion) {
822
+ throw new Error(workspaceSchemaError(sessionId, schemaVersion));
823
+ }
824
+ const meta = {
825
+ ...parsedMeta,
826
+ sessionId,
827
+ workspaceId: typeof parsedMeta.workspaceId === "string" &&
828
+ parsedMeta.workspaceId.trim().length > 0
829
+ ? parsedMeta.workspaceId
830
+ : sessionId,
831
+ sessionDir: dir,
832
+ workspaceSchemaVersion: workspaceStateSchemaVersion,
833
+ };
834
+ if (typeof meta.sessionStatePath !== "string") {
835
+ meta.sessionStatePath = filePath;
836
+ }
837
+ if (typeof meta.sessionEventsPath !== "string") {
838
+ meta.sessionEventsPath = path.join(dir, "events.jsonl");
839
+ }
840
+ if (typeof meta.sessionBuildStatePath !== "string") {
841
+ meta.sessionBuildStatePath = path.join(dir, "build_state.json");
842
+ }
843
+ const eventsPath = typeof meta.sessionEventsPath === "string"
844
+ ? meta.sessionEventsPath
845
+ : undefined;
846
+ if (eventsPath) {
847
+ const { records, maxOffset } = readEnvelopeRecords(eventsPath);
848
+ if (records.length > 0) {
849
+ const validated = ensureMonotonicOffsets(records, eventsPath);
850
+ const lastAppliedOffset = validated >= 0 ? validated : maxOffset;
851
+ meta.lastAppliedOffset = lastAppliedOffset;
852
+ meta.lastAppliedEventSeq = lastAppliedOffset;
853
+ sessionOffsetById.set(sessionId, lastAppliedOffset);
854
+ }
855
+ else if (typeof meta.lastAppliedOffset !== "number") {
856
+ meta.lastAppliedOffset = -1;
857
+ meta.lastAppliedEventSeq = -1;
858
+ }
859
+ }
860
+ const enriched = { ...parsed, meta };
861
+ if (opts?.withTraces) {
862
+ const loadedTraces = loadSessionTraces(enriched);
863
+ const fallbackTraces = Array.isArray(enriched.traces)
864
+ ? enriched.traces
865
+ : [];
866
+ const traces = loadedTraces.length > 0 ? loadedTraces : fallbackTraces;
867
+ const withTraces = { ...enriched, traces };
868
+ sessionStateCache.set(sessionId, withTraces);
869
+ return withTraces;
870
+ }
871
+ sessionStateCache.set(sessionId, enriched);
872
+ return enriched;
873
+ };
874
+ const readSessionState = (sessionId, opts) => {
875
+ try {
876
+ return readSessionStateStrict(sessionId, opts);
877
+ }
878
+ catch (err) {
879
+ if (err instanceof dntShim.Deno.errors.NotFound)
880
+ return undefined;
881
+ logger.warn(`[sim] failed to read workspace state for ${sessionId}: ${err instanceof Error ? err.message : String(err)}`);
882
+ return undefined;
883
+ }
884
+ };
885
+ const readBuildState = (workspaceId) => {
886
+ const state = readSessionState(workspaceId);
887
+ if (!state)
888
+ return undefined;
889
+ const eventsPath = typeof state.meta?.sessionEventsPath === "string"
890
+ ? state.meta.sessionEventsPath
891
+ : path.join(sessionsRoot, workspaceId, "events.jsonl");
892
+ if ((0, mod_js_1.existsSync)(eventsPath)) {
893
+ rebuildBuildProjectionFromEvents(workspaceId, eventsPath);
894
+ }
895
+ return readBuildProjection(workspaceId);
896
+ };
897
+ return {
898
+ parseFiniteInteger,
899
+ selectCanonicalScenarioRunSummary,
900
+ appendWorkspaceEnvelope,
901
+ appendSessionEvent,
902
+ appendFeedbackLog,
903
+ appendGradingLog,
904
+ appendErrorLog,
905
+ appendServerErrorLog,
906
+ persistSessionState,
907
+ readSessionStateStrict,
908
+ readSessionState,
909
+ readBuildState,
910
+ replayBuildProjection,
911
+ };
912
+ };
913
+ exports.createSessionStore = createSessionStore;