@bolt-foundry/gambit 0.8.1 → 0.8.5-rc.10

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 (293) hide show
  1. package/CHANGELOG.md +150 -2
  2. package/README.md +109 -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 +12670 -5471
  83. package/esm/gambit/simulator-ui/dist/bundle.js.map +4 -4
  84. package/esm/gambit/simulator-ui/dist/favicon.ico +0 -0
  85. package/esm/mod.d.ts +21 -7
  86. package/esm/mod.d.ts.map +1 -1
  87. package/esm/mod.js +14 -4
  88. package/esm/src/cli_utils.d.ts +1 -0
  89. package/esm/src/cli_utils.d.ts.map +1 -1
  90. package/esm/src/cli_utils.js +52 -4
  91. package/esm/src/default_runtime.d.ts +46 -0
  92. package/esm/src/default_runtime.d.ts.map +1 -0
  93. package/esm/src/default_runtime.js +415 -0
  94. package/esm/src/durable_streams.js +26 -1
  95. package/esm/src/model_matchers.d.ts +10 -0
  96. package/esm/src/model_matchers.d.ts.map +1 -0
  97. package/esm/src/model_matchers.js +26 -0
  98. package/esm/src/openai_compat.d.ts +74 -0
  99. package/esm/src/openai_compat.d.ts.map +1 -0
  100. package/esm/src/openai_compat.js +329 -0
  101. package/esm/src/project_config.d.ts +47 -0
  102. package/esm/src/project_config.d.ts.map +1 -0
  103. package/esm/src/project_config.js +134 -0
  104. package/esm/src/providers/codex.d.ts +37 -0
  105. package/esm/src/providers/codex.d.ts.map +1 -0
  106. package/esm/src/providers/codex.js +810 -0
  107. package/esm/src/providers/google.d.ts +18 -0
  108. package/esm/src/providers/google.d.ts.map +1 -0
  109. package/esm/src/providers/google.js +428 -0
  110. package/esm/src/providers/ollama.d.ts +19 -0
  111. package/esm/src/providers/ollama.d.ts.map +1 -0
  112. package/esm/src/providers/ollama.js +789 -0
  113. package/esm/src/providers/openrouter.d.ts +26 -0
  114. package/esm/src/providers/openrouter.d.ts.map +1 -0
  115. package/esm/src/providers/openrouter.js +886 -0
  116. package/esm/src/providers/router.d.ts +19 -0
  117. package/esm/src/providers/router.d.ts.map +1 -0
  118. package/esm/src/providers/router.js +93 -0
  119. package/esm/src/server.d.ts +11 -0
  120. package/esm/src/server.d.ts.map +1 -1
  121. package/esm/src/server.js +3927 -689
  122. package/esm/src/server_feedback_grading_routes.d.ts +32 -0
  123. package/esm/src/server_feedback_grading_routes.d.ts.map +1 -0
  124. package/esm/src/server_feedback_grading_routes.js +305 -0
  125. package/esm/src/server_helpers.d.ts +4 -0
  126. package/esm/src/server_helpers.d.ts.map +1 -0
  127. package/esm/src/server_helpers.js +46 -0
  128. package/esm/src/server_session_store.d.ts +87 -0
  129. package/esm/src/server_session_store.d.ts.map +1 -0
  130. package/esm/src/server_session_store.js +873 -0
  131. package/esm/src/server_types.d.ts +110 -0
  132. package/esm/src/server_types.d.ts.map +1 -0
  133. package/esm/src/server_types.js +1 -0
  134. package/esm/src/server_ui_routes.d.ts +33 -0
  135. package/esm/src/server_ui_routes.d.ts.map +1 -0
  136. package/esm/src/server_ui_routes.js +136 -0
  137. package/esm/src/session_artifacts.d.ts +22 -0
  138. package/esm/src/session_artifacts.d.ts.map +1 -0
  139. package/esm/src/session_artifacts.js +243 -0
  140. package/esm/src/trace.d.ts.map +1 -1
  141. package/esm/src/trace.js +8 -5
  142. package/esm/src/workspace.d.ts +19 -0
  143. package/esm/src/workspace.d.ts.map +1 -0
  144. package/esm/src/workspace.js +162 -0
  145. package/esm/src/workspace_contract.d.ts +78 -0
  146. package/esm/src/workspace_contract.d.ts.map +1 -0
  147. package/esm/src/workspace_contract.js +76 -0
  148. package/package.json +3 -2
  149. package/script/_dnt.polyfills.d.ts +17 -0
  150. package/script/_dnt.polyfills.d.ts.map +1 -1
  151. package/script/_dnt.polyfills.js +123 -0
  152. package/script/deps/jsr.io/@std/collections/1.1.6/deep_merge.d.ts +322 -0
  153. package/script/deps/jsr.io/@std/collections/1.1.6/deep_merge.d.ts.map +1 -0
  154. package/script/deps/jsr.io/@std/collections/1.1.6/deep_merge.js +108 -0
  155. package/script/deps/jsr.io/@std/fs/1.0.23/_create_walk_entry.d.ts +14 -0
  156. package/script/deps/jsr.io/@std/fs/1.0.23/_create_walk_entry.d.ts.map +1 -0
  157. package/script/deps/jsr.io/@std/fs/1.0.23/_create_walk_entry.js +71 -0
  158. package/script/deps/jsr.io/@std/fs/1.0.23/_get_file_info_type.d.ts +13 -0
  159. package/script/deps/jsr.io/@std/fs/1.0.23/_get_file_info_type.d.ts.map +1 -0
  160. package/script/deps/jsr.io/@std/fs/1.0.23/_get_file_info_type.js +21 -0
  161. package/script/deps/jsr.io/@std/fs/1.0.23/_is_same_path.d.ts +10 -0
  162. package/script/deps/jsr.io/@std/fs/1.0.23/_is_same_path.d.ts.map +1 -0
  163. package/script/deps/jsr.io/@std/fs/1.0.23/_is_same_path.js +20 -0
  164. package/script/deps/jsr.io/@std/fs/1.0.23/_is_subdir.d.ts +12 -0
  165. package/script/deps/jsr.io/@std/fs/1.0.23/_is_subdir.d.ts.map +1 -0
  166. package/script/deps/jsr.io/@std/fs/1.0.23/_is_subdir.js +28 -0
  167. package/script/deps/jsr.io/@std/fs/1.0.23/_to_path_string.d.ts +9 -0
  168. package/script/deps/jsr.io/@std/fs/1.0.23/_to_path_string.d.ts.map +1 -0
  169. package/script/deps/jsr.io/@std/fs/1.0.23/_to_path_string.js +16 -0
  170. package/script/deps/jsr.io/@std/fs/1.0.23/copy.d.ts +117 -0
  171. package/script/deps/jsr.io/@std/fs/1.0.23/copy.d.ts.map +1 -0
  172. package/script/deps/jsr.io/@std/fs/1.0.23/copy.js +350 -0
  173. package/script/deps/jsr.io/@std/fs/1.0.23/empty_dir.d.ts +48 -0
  174. package/script/deps/jsr.io/@std/fs/1.0.23/empty_dir.d.ts.map +1 -0
  175. package/script/deps/jsr.io/@std/fs/1.0.23/empty_dir.js +124 -0
  176. package/script/deps/jsr.io/@std/fs/1.0.23/ensure_dir.d.ts +49 -0
  177. package/script/deps/jsr.io/@std/fs/1.0.23/ensure_dir.d.ts.map +1 -0
  178. package/script/deps/jsr.io/@std/fs/1.0.23/ensure_dir.js +139 -0
  179. package/script/deps/jsr.io/@std/fs/1.0.23/ensure_file.d.ts +47 -0
  180. package/script/deps/jsr.io/@std/fs/1.0.23/ensure_file.d.ts.map +1 -0
  181. package/script/deps/jsr.io/@std/fs/1.0.23/ensure_file.js +127 -0
  182. package/script/deps/jsr.io/@std/fs/1.0.23/ensure_link.d.ts +49 -0
  183. package/script/deps/jsr.io/@std/fs/1.0.23/ensure_link.d.ts.map +1 -0
  184. package/script/deps/jsr.io/@std/fs/1.0.23/ensure_link.js +98 -0
  185. package/script/deps/jsr.io/@std/fs/1.0.23/ensure_symlink.d.ts +70 -0
  186. package/script/deps/jsr.io/@std/fs/1.0.23/ensure_symlink.d.ts.map +1 -0
  187. package/script/deps/jsr.io/@std/fs/1.0.23/ensure_symlink.js +193 -0
  188. package/script/deps/jsr.io/@std/fs/1.0.23/eol.d.ts +52 -0
  189. package/script/deps/jsr.io/@std/fs/1.0.23/eol.d.ts.map +1 -0
  190. package/script/deps/jsr.io/@std/fs/1.0.23/eol.js +105 -0
  191. package/script/deps/jsr.io/@std/fs/1.0.23/exists.d.ts +218 -0
  192. package/script/deps/jsr.io/@std/fs/1.0.23/exists.d.ts.map +1 -0
  193. package/script/deps/jsr.io/@std/fs/1.0.23/exists.js +308 -0
  194. package/script/deps/jsr.io/@std/fs/1.0.23/expand_glob.d.ts +267 -0
  195. package/script/deps/jsr.io/@std/fs/1.0.23/expand_glob.d.ts.map +1 -0
  196. package/script/deps/jsr.io/@std/fs/1.0.23/expand_glob.js +479 -0
  197. package/script/deps/jsr.io/@std/fs/1.0.23/mod.d.ts +29 -0
  198. package/script/deps/jsr.io/@std/fs/1.0.23/mod.d.ts.map +1 -0
  199. package/script/deps/jsr.io/@std/fs/1.0.23/mod.js +45 -0
  200. package/script/deps/jsr.io/@std/fs/1.0.23/move.d.ts +86 -0
  201. package/script/deps/jsr.io/@std/fs/1.0.23/move.d.ts.map +1 -0
  202. package/script/deps/jsr.io/@std/fs/1.0.23/move.js +179 -0
  203. package/script/deps/jsr.io/@std/fs/1.0.23/walk.d.ts +777 -0
  204. package/script/deps/jsr.io/@std/fs/1.0.23/walk.d.ts.map +1 -0
  205. package/script/deps/jsr.io/@std/fs/1.0.23/walk.js +883 -0
  206. package/script/deps/jsr.io/@std/json/1.0.3/types.d.ts +7 -0
  207. package/script/deps/jsr.io/@std/json/1.0.3/types.d.ts.map +1 -0
  208. package/script/deps/jsr.io/@std/json/1.0.3/types.js +4 -0
  209. package/script/deps/jsr.io/@std/jsonc/1.0.2/mod.d.ts +20 -0
  210. package/script/deps/jsr.io/@std/jsonc/1.0.2/mod.d.ts.map +1 -0
  211. package/script/deps/jsr.io/@std/jsonc/1.0.2/mod.js +37 -0
  212. package/script/deps/jsr.io/@std/jsonc/1.0.2/parse.d.ts +21 -0
  213. package/script/deps/jsr.io/@std/jsonc/1.0.2/parse.d.ts.map +1 -0
  214. package/script/deps/jsr.io/@std/jsonc/1.0.2/parse.js +323 -0
  215. package/script/deps/jsr.io/@std/path/1.1.4/constants.d.ts +1 -1
  216. package/script/deps/jsr.io/@std/toml/1.0.11/_parser.d.ts +93 -0
  217. package/script/deps/jsr.io/@std/toml/1.0.11/_parser.d.ts.map +1 -0
  218. package/script/deps/jsr.io/@std/toml/1.0.11/_parser.js +781 -0
  219. package/script/deps/jsr.io/@std/toml/1.0.11/mod.d.ts +109 -0
  220. package/script/deps/jsr.io/@std/toml/1.0.11/mod.d.ts.map +1 -0
  221. package/script/deps/jsr.io/@std/toml/1.0.11/mod.js +126 -0
  222. package/script/deps/jsr.io/@std/toml/1.0.11/parse.d.ts +21 -0
  223. package/script/deps/jsr.io/@std/toml/1.0.11/parse.d.ts.map +1 -0
  224. package/script/deps/jsr.io/@std/toml/1.0.11/parse.js +28 -0
  225. package/script/deps/jsr.io/@std/toml/1.0.11/stringify.d.ts +35 -0
  226. package/script/deps/jsr.io/@std/toml/1.0.11/stringify.d.ts.map +1 -0
  227. package/script/deps/jsr.io/@std/toml/1.0.11/stringify.js +286 -0
  228. package/script/gambit/simulator-ui/dist/bundle.js +12670 -5471
  229. package/script/gambit/simulator-ui/dist/bundle.js.map +4 -4
  230. package/script/gambit/simulator-ui/dist/favicon.ico +0 -0
  231. package/script/mod.d.ts +21 -7
  232. package/script/mod.d.ts.map +1 -1
  233. package/script/mod.js +22 -7
  234. package/script/src/cli_utils.d.ts +1 -0
  235. package/script/src/cli_utils.d.ts.map +1 -1
  236. package/script/src/cli_utils.js +52 -3
  237. package/script/src/default_runtime.d.ts +46 -0
  238. package/script/src/default_runtime.d.ts.map +1 -0
  239. package/script/src/default_runtime.js +452 -0
  240. package/script/src/durable_streams.js +26 -1
  241. package/script/src/model_matchers.d.ts +10 -0
  242. package/script/src/model_matchers.d.ts.map +1 -0
  243. package/script/src/model_matchers.js +29 -0
  244. package/script/src/openai_compat.d.ts +74 -0
  245. package/script/src/openai_compat.d.ts.map +1 -0
  246. package/script/src/openai_compat.js +366 -0
  247. package/script/src/project_config.d.ts +47 -0
  248. package/script/src/project_config.d.ts.map +1 -0
  249. package/script/src/project_config.js +173 -0
  250. package/script/src/providers/codex.d.ts +37 -0
  251. package/script/src/providers/codex.d.ts.map +1 -0
  252. package/script/src/providers/codex.js +850 -0
  253. package/script/src/providers/google.d.ts +18 -0
  254. package/script/src/providers/google.d.ts.map +1 -0
  255. package/script/src/providers/google.js +435 -0
  256. package/script/src/providers/ollama.d.ts +19 -0
  257. package/script/src/providers/ollama.d.ts.map +1 -0
  258. package/script/src/providers/ollama.js +831 -0
  259. package/script/src/providers/openrouter.d.ts +26 -0
  260. package/script/src/providers/openrouter.d.ts.map +1 -0
  261. package/script/src/providers/openrouter.js +926 -0
  262. package/script/src/providers/router.d.ts +19 -0
  263. package/script/src/providers/router.d.ts.map +1 -0
  264. package/script/src/providers/router.js +96 -0
  265. package/script/src/server.d.ts +11 -0
  266. package/script/src/server.d.ts.map +1 -1
  267. package/script/src/server.js +3931 -693
  268. package/script/src/server_feedback_grading_routes.d.ts +32 -0
  269. package/script/src/server_feedback_grading_routes.d.ts.map +1 -0
  270. package/script/src/server_feedback_grading_routes.js +343 -0
  271. package/script/src/server_helpers.d.ts +4 -0
  272. package/script/src/server_helpers.d.ts.map +1 -0
  273. package/script/src/server_helpers.js +84 -0
  274. package/script/src/server_session_store.d.ts +87 -0
  275. package/script/src/server_session_store.d.ts.map +1 -0
  276. package/script/src/server_session_store.js +910 -0
  277. package/script/src/server_types.d.ts +110 -0
  278. package/script/src/server_types.d.ts.map +1 -0
  279. package/script/src/server_types.js +2 -0
  280. package/script/src/server_ui_routes.d.ts +33 -0
  281. package/script/src/server_ui_routes.d.ts.map +1 -0
  282. package/script/src/server_ui_routes.js +173 -0
  283. package/script/src/session_artifacts.d.ts +22 -0
  284. package/script/src/session_artifacts.d.ts.map +1 -0
  285. package/script/src/session_artifacts.js +279 -0
  286. package/script/src/trace.d.ts.map +1 -1
  287. package/script/src/trace.js +8 -5
  288. package/script/src/workspace.d.ts +19 -0
  289. package/script/src/workspace.d.ts.map +1 -0
  290. package/script/src/workspace.js +199 -0
  291. package/script/src/workspace_contract.d.ts +78 -0
  292. package/script/src/workspace_contract.d.ts.map +1 -0
  293. package/script/src/workspace_contract.js +84 -0
@@ -0,0 +1,110 @@
1
+ import type { SavedState, TraceEvent } from "@bolt-foundry/gambit-core";
2
+ export type AvailableTestDeck = {
3
+ id: string;
4
+ label: string;
5
+ description?: string;
6
+ path: string;
7
+ };
8
+ export type AvailableGraderDeck = {
9
+ id: string;
10
+ label: string;
11
+ description?: string;
12
+ path: string;
13
+ };
14
+ export type NormalizedSchema = {
15
+ kind: "string" | "number" | "boolean" | "enum" | "object" | "array" | "unknown";
16
+ optional: boolean;
17
+ description?: string;
18
+ example?: unknown;
19
+ defaultValue?: unknown;
20
+ enumValues?: Array<unknown>;
21
+ fields?: Record<string, NormalizedSchema>;
22
+ items?: NormalizedSchema;
23
+ };
24
+ export type DeckToolDescription = {
25
+ name: string;
26
+ label?: string;
27
+ description?: string;
28
+ path?: string;
29
+ };
30
+ export type SchemaDescription = {
31
+ schema?: NormalizedSchema;
32
+ defaults?: unknown;
33
+ error?: string;
34
+ tools?: Array<DeckToolDescription>;
35
+ };
36
+ export type GradingRunRecord = {
37
+ id: string;
38
+ workspaceId?: string;
39
+ gradingRunId?: string;
40
+ graderId: string;
41
+ graderPath: string;
42
+ graderLabel?: string;
43
+ status: "running" | "completed" | "error";
44
+ runAt?: string;
45
+ referenceSample?: {
46
+ score: number;
47
+ reason: string;
48
+ evidence?: Array<string>;
49
+ artifactRevisionId?: string;
50
+ workspaceId?: string;
51
+ gradingRunId?: string;
52
+ };
53
+ input?: unknown;
54
+ result?: unknown;
55
+ error?: string;
56
+ };
57
+ export type GradingFlag = {
58
+ id: string;
59
+ refId: string;
60
+ runId?: string;
61
+ turnIndex?: number;
62
+ reason?: string;
63
+ createdAt: string;
64
+ };
65
+ export type SessionMeta = {
66
+ id: string;
67
+ deck?: string;
68
+ deckSlug?: string;
69
+ testBotName?: string;
70
+ createdAt?: string;
71
+ gradingRuns?: Array<GradingRunRecord>;
72
+ sessionDir?: string;
73
+ statePath?: string;
74
+ };
75
+ export type OutgoingMessage = {
76
+ type: "ready";
77
+ deck: string;
78
+ port: number;
79
+ schema?: NormalizedSchema;
80
+ defaults?: unknown;
81
+ schemaError?: string;
82
+ } | {
83
+ type: "pong";
84
+ } | {
85
+ type: "stream";
86
+ chunk: string;
87
+ runId?: string;
88
+ } | {
89
+ type: "result";
90
+ result: unknown;
91
+ runId?: string;
92
+ streamed: boolean;
93
+ } | {
94
+ type: "trace";
95
+ event: TraceEvent;
96
+ } | {
97
+ type: "state";
98
+ state: SavedState;
99
+ newMessages?: Array<{
100
+ index: number;
101
+ role: string;
102
+ messageRefId?: string;
103
+ content?: unknown;
104
+ }>;
105
+ } | {
106
+ type: "error";
107
+ message: string;
108
+ runId?: string;
109
+ };
110
+ //# sourceMappingURL=server_types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server_types.d.ts","sourceRoot":"","sources":["../../src/src/server_types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,33 @@
1
+ type HandleUiRoutesDeps = {
2
+ url: URL;
3
+ req: Request;
4
+ workspaceRouteBase: string;
5
+ activeWorkspaceId: string | null;
6
+ activeWorkspaceOnboarding: boolean;
7
+ resolvedDeckPath: string;
8
+ deckLabel?: string;
9
+ getWorkspaceIdFromQuery: (url: URL) => string | undefined;
10
+ activateWorkspaceDeck: (workspaceId?: string) => Promise<void>;
11
+ schemaPromise: Promise<unknown>;
12
+ deckLoadPromise: Promise<unknown>;
13
+ canServeReactBundle: () => Promise<boolean>;
14
+ simulatorReactHtml: (deckPath: string, deckLabel?: string, opts?: {
15
+ workspaceId?: string | null;
16
+ onboarding?: boolean;
17
+ }) => string;
18
+ toDeckLabel: (deckPath: string) => string;
19
+ readReactBundle: () => Promise<Uint8Array | null>;
20
+ shouldAdvertiseSourceMap: () => boolean;
21
+ readReactBundleSourceMap: () => Promise<Uint8Array | null>;
22
+ listSessions: () => unknown;
23
+ createWorkspaceSession: () => Promise<{
24
+ id: string;
25
+ rootDeckPath: string;
26
+ rootDir: string;
27
+ createdAt: string;
28
+ }>;
29
+ workspaceStateSchemaVersion: string;
30
+ };
31
+ export declare const handleUiRoutes: (deps: HandleUiRoutesDeps) => Promise<Response | null>;
32
+ export {};
33
+ //# sourceMappingURL=server_ui_routes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server_ui_routes.d.ts","sourceRoot":"","sources":["../../src/src/server_ui_routes.ts"],"names":[],"mappings":"AAMA,KAAK,kBAAkB,GAAG;IACxB,GAAG,EAAE,GAAG,CAAC;IACT,GAAG,EAAE,OAAO,CAAC;IACb,kBAAkB,EAAE,MAAM,CAAC;IAC3B,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,yBAAyB,EAAE,OAAO,CAAC;IACnC,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uBAAuB,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,MAAM,GAAG,SAAS,CAAC;IAC1D,qBAAqB,EAAE,CAAC,WAAW,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/D,aAAa,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IAChC,eAAe,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IAClC,mBAAmB,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5C,kBAAkB,EAAE,CAClB,QAAQ,EAAE,MAAM,EAChB,SAAS,CAAC,EAAE,MAAM,EAClB,IAAI,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,UAAU,CAAC,EAAE,OAAO,CAAA;KAAE,KACzD,MAAM,CAAC;IACZ,WAAW,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,MAAM,CAAC;IAC1C,eAAe,EAAE,MAAM,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IAClD,wBAAwB,EAAE,MAAM,OAAO,CAAC;IACxC,wBAAwB,EAAE,MAAM,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IAC3D,YAAY,EAAE,MAAM,OAAO,CAAC;IAC5B,sBAAsB,EAAE,MAAM,OAAO,CAAC;QACpC,EAAE,EAAE,MAAM,CAAC;QACX,YAAY,EAAE,MAAM,CAAC;QACrB,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC,CAAC;IACH,2BAA2B,EAAE,MAAM,CAAC;CACrC,CAAC;AAEF,eAAO,MAAM,cAAc,GACzB,MAAM,kBAAkB,KACvB,OAAO,CAAC,QAAQ,GAAG,IAAI,CAwMzB,CAAC"}
@@ -0,0 +1,136 @@
1
+ import * as dntShim from "../_dnt.shims.js";
2
+ import { WORKSPACE_API_BASE, WORKSPACES_API_BASE, } from "./workspace_contract.js";
3
+ export const handleUiRoutes = async (deps) => {
4
+ const { url, req, workspaceRouteBase, activeWorkspaceId, activeWorkspaceOnboarding, resolvedDeckPath, deckLabel, getWorkspaceIdFromQuery, activateWorkspaceDeck, schemaPromise, deckLoadPromise, canServeReactBundle, simulatorReactHtml, toDeckLabel, readReactBundle, shouldAdvertiseSourceMap, readReactBundleSourceMap, listSessions, createWorkspaceSession, workspaceStateSchemaVersion, } = deps;
5
+ if (url.pathname === "/" ||
6
+ url.pathname === workspaceRouteBase ||
7
+ url.pathname.startsWith(`${workspaceRouteBase}/`) ||
8
+ url.pathname.startsWith("/simulate") ||
9
+ url.pathname.startsWith("/debug") ||
10
+ url.pathname.startsWith("/build") ||
11
+ url.pathname.startsWith("/editor") ||
12
+ url.pathname.startsWith("/docs")) {
13
+ const hasBundle = await canServeReactBundle();
14
+ if (!hasBundle) {
15
+ return new Response("Simulator UI bundle missing. Run `deno task bundle:sim` (or start with `--bundle`).", { status: 500 });
16
+ }
17
+ await deckLoadPromise.catch(() => null);
18
+ const resolvedLabel = deckLabel ?? toDeckLabel(resolvedDeckPath);
19
+ return new Response(simulatorReactHtml(resolvedDeckPath, resolvedLabel, {
20
+ workspaceId: activeWorkspaceId ?? null,
21
+ onboarding: activeWorkspaceOnboarding,
22
+ }), {
23
+ headers: { "content-type": "text/html; charset=utf-8" },
24
+ });
25
+ }
26
+ if (url.pathname === "/schema") {
27
+ const sessionId = getWorkspaceIdFromQuery(url);
28
+ if (sessionId) {
29
+ await activateWorkspaceDeck(sessionId);
30
+ }
31
+ const descRaw = await schemaPromise;
32
+ const desc = descRaw && typeof descRaw === "object"
33
+ ? descRaw
34
+ : {};
35
+ const deck = await deckLoadPromise.catch(() => null);
36
+ const modelParams = deck && typeof deck === "object"
37
+ ? deck.modelParams
38
+ : undefined;
39
+ const startMode = deck &&
40
+ (deck.startMode === "assistant" || deck.startMode === "user")
41
+ ? deck.startMode
42
+ : "assistant";
43
+ return new Response(JSON.stringify({
44
+ deck: resolvedDeckPath,
45
+ startMode,
46
+ modelParams,
47
+ ...desc,
48
+ }), {
49
+ headers: { "content-type": "application/json; charset=utf-8" },
50
+ });
51
+ }
52
+ if (url.pathname === "/api/deck-source") {
53
+ if (req.method !== "GET") {
54
+ return new Response("Method not allowed", { status: 405 });
55
+ }
56
+ try {
57
+ const content = await dntShim.Deno.readTextFile(resolvedDeckPath);
58
+ return new Response(JSON.stringify({
59
+ path: resolvedDeckPath,
60
+ content,
61
+ }), { headers: { "content-type": "application/json; charset=utf-8" } });
62
+ }
63
+ catch (err) {
64
+ const message = err instanceof Error ? err.message : String(err);
65
+ return new Response(JSON.stringify({
66
+ path: resolvedDeckPath,
67
+ error: message,
68
+ }), {
69
+ status: 500,
70
+ headers: { "content-type": "application/json; charset=utf-8" },
71
+ });
72
+ }
73
+ }
74
+ if (url.pathname === "/ui/bundle.js") {
75
+ const data = await readReactBundle();
76
+ if (!data) {
77
+ return new Response("Bundle missing. Run `deno task bundle:sim` (or start with `--bundle`).", { status: 404 });
78
+ }
79
+ try {
80
+ const headers = new Headers({
81
+ "content-type": "application/javascript; charset=utf-8",
82
+ });
83
+ if (shouldAdvertiseSourceMap()) {
84
+ headers.set("SourceMap", "/ui/bundle.js.map");
85
+ }
86
+ return new Response(data, { headers });
87
+ }
88
+ catch (err) {
89
+ return new Response(`Failed to read bundle: ${err instanceof Error ? err.message : String(err)}`, { status: 500 });
90
+ }
91
+ }
92
+ if (url.pathname === "/ui/bundle.js.map") {
93
+ const data = await readReactBundleSourceMap();
94
+ if (!data) {
95
+ return new Response("Source map missing. Run `deno task bundle:sim:sourcemap` (or start with `--bundle --sourcemap`).", { status: 404 });
96
+ }
97
+ try {
98
+ return new Response(data, {
99
+ headers: {
100
+ "content-type": "application/json; charset=utf-8",
101
+ },
102
+ });
103
+ }
104
+ catch (err) {
105
+ return new Response(`Failed to read source map: ${err instanceof Error ? err.message : String(err)}`, { status: 500 });
106
+ }
107
+ }
108
+ if (url.pathname === WORKSPACES_API_BASE) {
109
+ const workspaces = listSessions();
110
+ return new Response(JSON.stringify({ workspaces }), {
111
+ headers: { "content-type": "application/json; charset=utf-8" },
112
+ });
113
+ }
114
+ if (url.pathname === `${WORKSPACE_API_BASE}/new`) {
115
+ if (req.method !== "POST") {
116
+ return new Response("Method not allowed", { status: 405 });
117
+ }
118
+ try {
119
+ const workspace = await createWorkspaceSession();
120
+ await activateWorkspaceDeck(workspace.id);
121
+ return new Response(JSON.stringify({
122
+ workspaceId: workspace.id,
123
+ deckPath: workspace.rootDeckPath,
124
+ workspaceDir: workspace.rootDir,
125
+ createdAt: workspace.createdAt,
126
+ workspaceSchemaVersion: workspaceStateSchemaVersion,
127
+ }), { headers: { "content-type": "application/json" } });
128
+ }
129
+ catch (err) {
130
+ return new Response(JSON.stringify({
131
+ error: err instanceof Error ? err.message : String(err),
132
+ }), { status: 500, headers: { "content-type": "application/json" } });
133
+ }
134
+ }
135
+ return null;
136
+ };
@@ -0,0 +1,22 @@
1
+ import type { SavedState, TraceEvent } from "@bolt-foundry/gambit-core";
2
+ export type SessionArtifactsConfig = {
3
+ rootDir: string;
4
+ sessionId?: string;
5
+ continueSession?: boolean;
6
+ resumeState?: boolean;
7
+ };
8
+ export type SessionArtifactsRun = {
9
+ state?: SavedState;
10
+ trace: (event: TraceEvent) => void;
11
+ onStateUpdate: (state: SavedState) => void;
12
+ finalize: () => void;
13
+ sessionId: string;
14
+ sessionDir: string;
15
+ };
16
+ export declare function withSessionArtifacts(args: {
17
+ config: SessionArtifactsConfig;
18
+ trace?: (event: TraceEvent) => void;
19
+ onStateUpdate?: (state: SavedState) => void;
20
+ state?: SavedState;
21
+ }): SessionArtifactsRun;
22
+ //# sourceMappingURL=session_artifacts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session_artifacts.d.ts","sourceRoot":"","sources":["../../src/src/session_artifacts.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAExE,MAAM,MAAM,sBAAsB,GAAG;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,OAAO,CAAC;IAI1B,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,KAAK,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;IACnC,aAAa,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;IAC3C,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AA4KF,wBAAgB,oBAAoB,CAAC,IAAI,EAAE;IACzC,MAAM,EAAE,sBAAsB,CAAC;IAC/B,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;IACpC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;IAC5C,KAAK,CAAC,EAAE,UAAU,CAAC;CACpB,GAAG,mBAAmB,CA8ItB"}
@@ -0,0 +1,243 @@
1
+ import * as dntShim from "../_dnt.shims.js";
2
+ import * as path from "../deps/jsr.io/@std/path/1.1.4/mod.js";
3
+ import { existsSync } from "../deps/jsr.io/@std/fs/1.0.23/mod.js";
4
+ function canonicalSessionEventType(type) {
5
+ if (type.startsWith("response.") || type.startsWith("gambit.")) {
6
+ return type;
7
+ }
8
+ return `gambit.${type}`;
9
+ }
10
+ function randomId(prefix) {
11
+ const suffix = crypto.randomUUID().replace(/-/g, "").slice(0, 24);
12
+ return `${prefix}-${suffix}`;
13
+ }
14
+ function parseFiniteInteger(value) {
15
+ if (typeof value !== "number" || !Number.isFinite(value))
16
+ return undefined;
17
+ if (!Number.isInteger(value))
18
+ return undefined;
19
+ return value;
20
+ }
21
+ function normalizeConfig(config) {
22
+ const rootDir = path.resolve(config.rootDir);
23
+ const sessionId = config.sessionId?.trim() || randomId("session");
24
+ const continueSession = Boolean(config.continueSession);
25
+ const resumeState = config.resumeState ?? true;
26
+ if (!rootDir) {
27
+ throw new Error("sessionArtifacts.rootDir is required.");
28
+ }
29
+ if (config.continueSession && !config.sessionId?.trim()) {
30
+ throw new Error("sessionArtifacts.sessionId is required when continueSession is true.");
31
+ }
32
+ return { rootDir, sessionId, continueSession, resumeState };
33
+ }
34
+ function prepare(configInput) {
35
+ const config = normalizeConfig(configInput);
36
+ const sessionDir = path.join(config.rootDir, config.sessionId);
37
+ const statePath = path.join(sessionDir, "state.json");
38
+ const eventsPath = path.join(sessionDir, "events.jsonl");
39
+ const lockPath = path.join(sessionDir, ".lock");
40
+ return { config, sessionDir, statePath, eventsPath, lockPath };
41
+ }
42
+ function ensureMonotonicOffsets(records, eventsPath) {
43
+ let expected = 0;
44
+ let highest = -1;
45
+ for (const record of records) {
46
+ if (record.offset !== expected) {
47
+ throw new Error(`Non-monotonic offset in ${eventsPath}: expected ${expected}, got ${record.offset}`);
48
+ }
49
+ highest = record.offset;
50
+ expected += 1;
51
+ }
52
+ return highest;
53
+ }
54
+ function readEvents(eventsPath) {
55
+ if (!existsSync(eventsPath)) {
56
+ return { records: [], highestOffset: -1 };
57
+ }
58
+ const text = dntShim.Deno.readTextFileSync(eventsPath);
59
+ const records = [];
60
+ for (const line of text.split("\n")) {
61
+ if (!line.trim())
62
+ continue;
63
+ const parsed = JSON.parse(line);
64
+ const offset = parseFiniteInteger(parsed.offset);
65
+ const createdAt = typeof parsed.createdAt === "string"
66
+ ? parsed.createdAt
67
+ : null;
68
+ const type = parsed.type;
69
+ if (offset === undefined ||
70
+ createdAt === null ||
71
+ typeof type !== "string" ||
72
+ type.trim().length === 0) {
73
+ throw new Error(`Invalid event record in ${eventsPath}`);
74
+ }
75
+ records.push({
76
+ offset,
77
+ createdAt,
78
+ type,
79
+ _gambit: parsed._gambit &&
80
+ typeof parsed._gambit === "object" &&
81
+ !Array.isArray(parsed._gambit)
82
+ ? parsed._gambit
83
+ : undefined,
84
+ });
85
+ }
86
+ const highestOffset = records.length
87
+ ? ensureMonotonicOffsets(records, eventsPath)
88
+ : -1;
89
+ return { records, highestOffset };
90
+ }
91
+ function writeJsonAtomic(filePath, payload) {
92
+ const dir = path.dirname(filePath);
93
+ dntShim.Deno.mkdirSync(dir, { recursive: true });
94
+ const tmpPath = path.join(dir, `.tmp-${path.basename(filePath)}-${randomId("tmp")}`);
95
+ dntShim.Deno.writeTextFileSync(tmpPath, JSON.stringify(payload, null, 2));
96
+ dntShim.Deno.renameSync(tmpPath, filePath);
97
+ }
98
+ function appendJsonl(filePath, payload) {
99
+ dntShim.Deno.mkdirSync(path.dirname(filePath), { recursive: true });
100
+ const line = JSON.stringify(payload);
101
+ dntShim.Deno.writeTextFileSync(filePath, `${line}\n`, { append: true });
102
+ }
103
+ function archiveOrphanedEvents(eventsPath) {
104
+ const dir = path.dirname(eventsPath);
105
+ const stamp = new Date().toISOString().replaceAll(":", "-");
106
+ const archivedPath = path.join(dir, `events.orphaned.${stamp}.jsonl`);
107
+ dntShim.Deno.renameSync(eventsPath, archivedPath);
108
+ return archivedPath;
109
+ }
110
+ function writeStateSnapshot(args) {
111
+ const nextMeta = {
112
+ ...(args.state.meta ?? {}),
113
+ sessionId: args.sessionId,
114
+ sessionDir: args.sessionDir,
115
+ sessionStatePath: args.statePath,
116
+ sessionEventsPath: args.eventsPath,
117
+ lastAppliedOffset: args.offset,
118
+ lastAppliedEventSeq: args.offset,
119
+ };
120
+ const snapshot = {
121
+ ...args.state,
122
+ meta: nextMeta,
123
+ };
124
+ writeJsonAtomic(args.statePath, snapshot);
125
+ }
126
+ export function withSessionArtifacts(args) {
127
+ const prepared = prepare(args.config);
128
+ const { config, sessionDir, statePath, eventsPath, lockPath, } = prepared;
129
+ dntShim.Deno.mkdirSync(sessionDir, { recursive: true });
130
+ if (!config.continueSession && (existsSync(statePath) || existsSync(eventsPath))) {
131
+ throw new Error(`Session artifact directory already exists at ${sessionDir}. Pass continueSession: true with the same sessionId to continue.`);
132
+ }
133
+ try {
134
+ dntShim.Deno.writeTextFileSync(lockPath, JSON.stringify({
135
+ pid: dntShim.Deno.pid,
136
+ acquiredAt: new Date().toISOString(),
137
+ }), { createNew: true });
138
+ }
139
+ catch (err) {
140
+ if (err instanceof dntShim.Deno.errors.AlreadyExists) {
141
+ throw new Error(`Session artifact directory is already active: ${sessionDir}`);
142
+ }
143
+ throw err;
144
+ }
145
+ let latestState = args.state;
146
+ let highestOffset = -1;
147
+ let lastStateOffset = -1;
148
+ try {
149
+ const loaded = readEvents(eventsPath);
150
+ highestOffset = loaded.highestOffset;
151
+ if (!latestState &&
152
+ config.continueSession &&
153
+ config.resumeState &&
154
+ existsSync(statePath)) {
155
+ const parsed = JSON.parse(dntShim.Deno.readTextFileSync(statePath));
156
+ latestState = parsed;
157
+ }
158
+ if (!latestState &&
159
+ config.continueSession &&
160
+ config.resumeState &&
161
+ highestOffset >= 0) {
162
+ // Recovery path: preserve prior trace-only history, then start a fresh
163
+ // append-only log so retries can continue without corrupting snapshot
164
+ // boundaries.
165
+ archiveOrphanedEvents(eventsPath);
166
+ highestOffset = -1;
167
+ }
168
+ const meta = latestState?.meta;
169
+ lastStateOffset = parseFiniteInteger(meta?.lastAppliedOffset) ??
170
+ parseFiniteInteger(meta?.lastAppliedEventSeq) ??
171
+ -1;
172
+ }
173
+ catch (err) {
174
+ try {
175
+ dntShim.Deno.removeSync(lockPath);
176
+ }
177
+ catch {
178
+ // no-op
179
+ }
180
+ throw err;
181
+ }
182
+ const persistLatest = () => {
183
+ if (!latestState)
184
+ return;
185
+ writeStateSnapshot({
186
+ statePath,
187
+ state: latestState,
188
+ offset: lastStateOffset,
189
+ sessionId: config.sessionId,
190
+ sessionDir,
191
+ eventsPath,
192
+ });
193
+ };
194
+ const trace = (event) => {
195
+ highestOffset += 1;
196
+ const createdAt = new Date().toISOString();
197
+ const sourceType = typeof event?.type === "string" &&
198
+ event.type.trim().length > 0
199
+ ? event.type.trim()
200
+ : "gambit.session.event";
201
+ const payloadType = canonicalSessionEventType(sourceType);
202
+ const rawMeta = event?._gambit;
203
+ const meta = rawMeta && typeof rawMeta === "object" && !Array.isArray(rawMeta)
204
+ ? rawMeta
205
+ : {};
206
+ const record = {
207
+ ...event,
208
+ type: payloadType,
209
+ offset: highestOffset,
210
+ createdAt,
211
+ _gambit: {
212
+ ...meta,
213
+ ...(payloadType !== sourceType ? { source_type: sourceType } : {}),
214
+ domain: "session",
215
+ offset: highestOffset,
216
+ },
217
+ };
218
+ appendJsonl(eventsPath, record);
219
+ args.trace?.(event);
220
+ };
221
+ const onStateUpdate = (state) => {
222
+ latestState = state;
223
+ lastStateOffset = highestOffset;
224
+ persistLatest();
225
+ args.onStateUpdate?.(state);
226
+ };
227
+ const finalize = () => {
228
+ try {
229
+ dntShim.Deno.removeSync(lockPath);
230
+ }
231
+ catch {
232
+ // no-op
233
+ }
234
+ };
235
+ return {
236
+ state: latestState,
237
+ trace,
238
+ onStateUpdate,
239
+ finalize,
240
+ sessionId: config.sessionId,
241
+ sessionDir,
242
+ };
243
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"trace.d.ts","sourceRoot":"","sources":["../../src/src/trace.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAI5D,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAQ7E;AAED,wBAAgB,iBAAiB,IAAI,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAmI/D"}
1
+ {"version":3,"file":"trace.d.ts","sourceRoot":"","sources":["../../src/src/trace.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAI5D,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAQ7E;AAED,wBAAgB,iBAAiB,IAAI,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CA+I/D"}
package/esm/src/trace.js CHANGED
@@ -14,6 +14,9 @@ export function makeConsoleTracer() {
14
14
  const started = new Map();
15
15
  const now = () => performance.now();
16
16
  const fmtMs = (start) => start !== undefined ? ` elapsed_ms=${Math.round(now() - start)}` : "";
17
+ const fmtPermissions = (permissions) => permissions?.effective !== undefined
18
+ ? ` permissions=${JSON.stringify(permissions.effective)}`
19
+ : "";
17
20
  return (event) => {
18
21
  switch (event.type) {
19
22
  case "run.start":
@@ -22,7 +25,7 @@ export function makeConsoleTracer() {
22
25
  ? ` initialUserMessage=${JSON.stringify(event.initialUserMessage)}`
23
26
  : ""}${event.input !== undefined
24
27
  ? ` input=${JSON.stringify(event.input)}`
25
- : ""}`);
28
+ : ""}${fmtPermissions(event.permissions)}`);
26
29
  break;
27
30
  case "run.end": {
28
31
  const start = started.get(event.runId);
@@ -36,7 +39,7 @@ export function makeConsoleTracer() {
36
39
  }
37
40
  case "deck.start":
38
41
  started.set(event.actionCallId, now());
39
- logger.log(`[trace] deck.start runId=${event.runId} actionCallId=${event.actionCallId} deck=${event.deckPath}`);
42
+ logger.log(`[trace] deck.start runId=${event.runId} actionCallId=${event.actionCallId} deck=${event.deckPath}${fmtPermissions(event.permissions)}`);
40
43
  break;
41
44
  case "deck.end": {
42
45
  const start = started.get(event.actionCallId);
@@ -46,7 +49,7 @@ export function makeConsoleTracer() {
46
49
  }
47
50
  case "action.start":
48
51
  started.set(event.actionCallId, now());
49
- logger.log(`[trace] action.start runId=${event.runId} actionCallId=${event.actionCallId} name=${event.name} path=${event.path}`);
52
+ logger.log(`[trace] action.start runId=${event.runId} actionCallId=${event.actionCallId} name=${event.name} path=${event.path}${fmtPermissions(event.permissions)}`);
50
53
  break;
51
54
  case "action.end": {
52
55
  const start = started.get(event.actionCallId);
@@ -61,10 +64,10 @@ export function makeConsoleTracer() {
61
64
  logger.log(`[trace] tool.result runId=${event.runId} actionCallId=${event.actionCallId} name=${event.name} result=${JSON.stringify(event.result)}`);
62
65
  break;
63
66
  case "model.call":
64
- logger.log(`[trace] model.call runId=${event.runId} actionCallId=${event.actionCallId} deck=${event.deckPath} model=${event.model ?? "(default)"} messages=${event.messageCount ?? event.messages.length} tools=${event.toolCount ?? event.tools?.length ?? 0} stream=${event.stream ?? false} stateMessages=${event.stateMessages ?? 0}`);
67
+ logger.log(`[trace] model.call runId=${event.runId} actionCallId=${event.actionCallId} deck=${event.deckPath} model=${event.model ?? "(default)"} messages=${event.messageCount ?? event.messages.length} tools=${event.toolCount ?? event.tools?.length ?? 0} stream=${event.stream ?? false} mode=${event.mode ?? "chat"} stateMessages=${event.stateMessages ?? 0}`);
65
68
  break;
66
69
  case "model.result":
67
- logger.log(`[trace] model.result runId=${event.runId} actionCallId=${event.actionCallId} deck=${event.deckPath} model=${event.model ?? "(default)"} finish=${event.finishReason} toolCalls=${event.toolCalls?.length ?? 0} stateMessages=${event.stateMessages ?? 0}`);
70
+ logger.log(`[trace] model.result runId=${event.runId} actionCallId=${event.actionCallId} deck=${event.deckPath} model=${event.model ?? "(default)"} finish=${event.finishReason} toolCalls=${event.toolCalls?.length ?? 0} mode=${event.mode ?? "chat"} stateMessages=${event.stateMessages ?? 0}`);
68
71
  break;
69
72
  case "log": {
70
73
  const meta = event.meta !== undefined
@@ -0,0 +1,19 @@
1
+ export type WorkspaceScaffold = {
2
+ id: string;
3
+ rootDir: string;
4
+ rootDeckPath: string;
5
+ createdAt: string;
6
+ };
7
+ export type WorkspaceRootScaffold = {
8
+ rootDir: string;
9
+ rootDeckPath: string;
10
+ };
11
+ type WorkspaceScaffoldOptions = {
12
+ baseDir: string;
13
+ id?: string;
14
+ now?: Date;
15
+ };
16
+ export declare function createWorkspaceScaffoldAtRoot(rootDir: string): Promise<WorkspaceRootScaffold>;
17
+ export declare function createWorkspaceScaffold(opts: WorkspaceScaffoldOptions): Promise<WorkspaceScaffold>;
18
+ export {};
19
+ //# sourceMappingURL=workspace.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace.d.ts","sourceRoot":"","sources":["../../src/src/workspace.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,iBAAiB,GAAG;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,KAAK,wBAAwB,GAAG;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,IAAI,CAAC;CACZ,CAAC;AAyHF,wBAAsB,6BAA6B,CACjD,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,qBAAqB,CAAC,CA4BhC;AAED,wBAAsB,uBAAuB,CAC3C,IAAI,EAAE,wBAAwB,GAC7B,OAAO,CAAC,iBAAiB,CAAC,CAkC5B"}