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