@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
@@ -51,6 +51,9 @@ function makeConsoleTracer() {
51
51
  const started = new Map();
52
52
  const now = () => performance.now();
53
53
  const fmtMs = (start) => start !== undefined ? ` elapsed_ms=${Math.round(now() - start)}` : "";
54
+ const fmtPermissions = (permissions) => permissions?.effective !== undefined
55
+ ? ` permissions=${JSON.stringify(permissions.effective)}`
56
+ : "";
54
57
  return (event) => {
55
58
  switch (event.type) {
56
59
  case "run.start":
@@ -59,7 +62,7 @@ function makeConsoleTracer() {
59
62
  ? ` initialUserMessage=${JSON.stringify(event.initialUserMessage)}`
60
63
  : ""}${event.input !== undefined
61
64
  ? ` input=${JSON.stringify(event.input)}`
62
- : ""}`);
65
+ : ""}${fmtPermissions(event.permissions)}`);
63
66
  break;
64
67
  case "run.end": {
65
68
  const start = started.get(event.runId);
@@ -73,7 +76,7 @@ function makeConsoleTracer() {
73
76
  }
74
77
  case "deck.start":
75
78
  started.set(event.actionCallId, now());
76
- logger.log(`[trace] deck.start runId=${event.runId} actionCallId=${event.actionCallId} deck=${event.deckPath}`);
79
+ logger.log(`[trace] deck.start runId=${event.runId} actionCallId=${event.actionCallId} deck=${event.deckPath}${fmtPermissions(event.permissions)}`);
77
80
  break;
78
81
  case "deck.end": {
79
82
  const start = started.get(event.actionCallId);
@@ -83,7 +86,7 @@ function makeConsoleTracer() {
83
86
  }
84
87
  case "action.start":
85
88
  started.set(event.actionCallId, now());
86
- logger.log(`[trace] action.start runId=${event.runId} actionCallId=${event.actionCallId} name=${event.name} path=${event.path}`);
89
+ logger.log(`[trace] action.start runId=${event.runId} actionCallId=${event.actionCallId} name=${event.name} path=${event.path}${fmtPermissions(event.permissions)}`);
87
90
  break;
88
91
  case "action.end": {
89
92
  const start = started.get(event.actionCallId);
@@ -98,10 +101,10 @@ function makeConsoleTracer() {
98
101
  logger.log(`[trace] tool.result runId=${event.runId} actionCallId=${event.actionCallId} name=${event.name} result=${JSON.stringify(event.result)}`);
99
102
  break;
100
103
  case "model.call":
101
- 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}`);
104
+ 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}`);
102
105
  break;
103
106
  case "model.result":
104
- 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}`);
107
+ 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}`);
105
108
  break;
106
109
  case "log": {
107
110
  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"}
@@ -0,0 +1,199 @@
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.createWorkspaceScaffoldAtRoot = createWorkspaceScaffoldAtRoot;
37
+ exports.createWorkspaceScaffold = createWorkspaceScaffold;
38
+ const dntShim = __importStar(require("../_dnt.shims.js"));
39
+ const path = __importStar(require("../deps/jsr.io/@std/path/1.1.4/mod.js"));
40
+ const mod_js_1 = require("../deps/jsr.io/@std/fs/1.0.23/mod.js");
41
+ const ROOT_PROMPT = `+++
42
+ label = "Workspace Root"
43
+ description = "Starter root deck for this workspace."
44
+
45
+ [modelParams]
46
+ model = ["ollama/hf.co/LiquidAI/LFM2-1.2B-Tool-GGUF:latest", "openrouter/openai/gpt-5.1-chat"]
47
+
48
+ [modelParams.reasoning]
49
+ effort = "low"
50
+ summary = "detailed"
51
+
52
+ [[scenarios]]
53
+ path = "./scenarios/default/PROMPT.md"
54
+ label = "Default scenario"
55
+ description = "Quick sanity check scenario."
56
+
57
+ [[graders]]
58
+ path = "./graders/default/PROMPT.md"
59
+ label = "Default grader"
60
+ description = "Simple grader to start."
61
+ +++
62
+
63
+ You are the default deck for a new Gambit workspace.
64
+
65
+ ## Assistant Persona
66
+
67
+ - You are a minimal placeholder deck used to bootstrap a blank workspace.
68
+ - You keep responses short and avoid introducing product narrative.
69
+
70
+ ## User Persona
71
+
72
+ - The user is in the Build tab and expects guidance on what to do next.
73
+
74
+ ## Behavior
75
+
76
+ - If asked what to do, reply exactly: "Use the Build tab to draft your deck."
77
+ - Keep all other responses brief, plain text, and focused on build guidance.
78
+ `;
79
+ const ROOT_INTENT = `# Workspace Intent
80
+
81
+ ## Purpose
82
+
83
+ - Provide a starter workspace deck for the Build/Test/Grade loop.
84
+
85
+ ## Constraints
86
+
87
+ - Keep the initial behavior simple and easy to replace.
88
+
89
+ ## Tradeoffs
90
+
91
+ - Favor clarity over advanced functionality in the starter scaffold.
92
+ `;
93
+ const DEFAULT_SCENARIO_PROMPT = `+++
94
+ label = "Default scenario"
95
+ description = "Starter scenario for this workspace."
96
+ contextSchema = "gambit://schemas/scenarios/plain_chat_input_optional.zod.ts"
97
+ responseSchema = "gambit://schemas/scenarios/plain_chat_output.zod.ts"
98
+
99
+ [modelParams]
100
+ model = ["ollama/hf.co/LiquidAI/LFM2-1.2B-Tool-GGUF:latest", "openrouter/openai/gpt-5.1-chat"]
101
+ +++
102
+
103
+ ![scenario-participant](gambit://snippets/scenario-participant.md)
104
+
105
+ You are a user testing the assistant.
106
+
107
+ Conversation plan:
108
+
109
+ 1. Start by asking: "What can you help me with?"
110
+ 2. If the assistant replies, answer once with: "Thanks!"
111
+ 3. End the scenario by returning an empty response.
112
+
113
+ Rules:
114
+
115
+ - Keep replies short and plain text.
116
+ - Do not include markdown or lists.
117
+ - If the assistant says it is done, or ends the session, respond with an empty message.
118
+ `;
119
+ const DEFAULT_GRADER_PROMPT = `+++
120
+ label = "Default grader"
121
+ description = "Starter grader for this workspace."
122
+ contextSchema = "gambit://schemas/graders/contexts/conversation.zod.ts"
123
+ responseSchema = "gambit://schemas/graders/grader_output.zod.ts"
124
+
125
+ [modelParams]
126
+ model = ["ollama/hf.co/LiquidAI/LFM2-1.2B-Tool-GGUF:latest", "openrouter/openai/gpt-5.1-chat"]
127
+ +++
128
+
129
+ You are grading the assistant's response for clarity and helpfulness.
130
+
131
+ Score 1 if the assistant is clear and directly answers the user.
132
+ Score 0 if the response is vague or unhelpful.
133
+
134
+ Provide a short reason.
135
+ `;
136
+ const toStamp = (date) => date.toISOString().replace(/[:.]/g, "-");
137
+ const generateWorkspaceId = (date) => `workspace-${toStamp(date)}-${crypto.randomUUID().slice(0, 8)}`;
138
+ async function ensureDir(dir) {
139
+ await dntShim.Deno.mkdir(dir, { recursive: true });
140
+ }
141
+ async function writeFile(pathValue, contents) {
142
+ await dntShim.Deno.writeTextFile(pathValue, contents);
143
+ }
144
+ function ensureEmptyPath(pathValue) {
145
+ if ((0, mod_js_1.existsSync)(pathValue)) {
146
+ throw new Error(`Init target already exists: ${pathValue}`);
147
+ }
148
+ }
149
+ async function createWorkspaceScaffoldAtRoot(rootDir) {
150
+ const resolvedRoot = path.resolve(rootDir);
151
+ await ensureDir(resolvedRoot);
152
+ const rootDeckPath = path.join(resolvedRoot, "PROMPT.md");
153
+ const intentPath = path.join(resolvedRoot, "INTENT.md");
154
+ const scenariosDir = path.join(resolvedRoot, "scenarios", "default");
155
+ const gradersDir = path.join(resolvedRoot, "graders", "default");
156
+ const scenarioPromptPath = path.join(scenariosDir, "PROMPT.md");
157
+ const graderPromptPath = path.join(gradersDir, "PROMPT.md");
158
+ await ensureEmptyPath(rootDeckPath);
159
+ await ensureEmptyPath(intentPath);
160
+ await ensureEmptyPath(scenarioPromptPath);
161
+ await ensureEmptyPath(graderPromptPath);
162
+ await ensureDir(scenariosDir);
163
+ await ensureDir(gradersDir);
164
+ await writeFile(rootDeckPath, ROOT_PROMPT);
165
+ await writeFile(intentPath, ROOT_INTENT);
166
+ await writeFile(scenarioPromptPath, DEFAULT_SCENARIO_PROMPT);
167
+ await writeFile(graderPromptPath, DEFAULT_GRADER_PROMPT);
168
+ return {
169
+ rootDir: resolvedRoot,
170
+ rootDeckPath,
171
+ };
172
+ }
173
+ async function createWorkspaceScaffold(opts) {
174
+ const baseDir = path.resolve(opts.baseDir);
175
+ await ensureDir(baseDir);
176
+ const now = opts.now ?? new Date();
177
+ let workspaceId = opts.id ?? generateWorkspaceId(now);
178
+ let rootDir = path.join(baseDir, workspaceId);
179
+ if ((0, mod_js_1.existsSync)(rootDir)) {
180
+ workspaceId = generateWorkspaceId(new Date(now.getTime() + 1));
181
+ rootDir = path.join(baseDir, workspaceId);
182
+ }
183
+ const rootDeckPath = path.join(rootDir, "PROMPT.md");
184
+ const intentPath = path.join(rootDir, "INTENT.md");
185
+ const scenariosDir = path.join(rootDir, "scenarios", "default");
186
+ const gradersDir = path.join(rootDir, "graders", "default");
187
+ await ensureDir(scenariosDir);
188
+ await ensureDir(gradersDir);
189
+ await writeFile(rootDeckPath, ROOT_PROMPT);
190
+ await writeFile(intentPath, ROOT_INTENT);
191
+ await writeFile(path.join(scenariosDir, "PROMPT.md"), DEFAULT_SCENARIO_PROMPT);
192
+ await writeFile(path.join(gradersDir, "PROMPT.md"), DEFAULT_GRADER_PROMPT);
193
+ return {
194
+ id: workspaceId,
195
+ rootDir,
196
+ rootDeckPath,
197
+ createdAt: now.toISOString(),
198
+ };
199
+ }
@@ -0,0 +1,78 @@
1
+ export declare const WORKSPACE_STATE_SCHEMA_VERSION = "workspace-state.v1";
2
+ export declare const WORKSPACE_ROUTE_BASE = "/workspaces";
3
+ export declare const WORKSPACE_API_BASE = "/api/workspace";
4
+ export declare const WORKSPACES_API_BASE = "/api/workspaces";
5
+ export type WorkspaceRouteTab = "debug" | "build" | "test" | "grade";
6
+ export declare const WORKSPACE_ROUTE_TABS: Array<WorkspaceRouteTab>;
7
+ export type WorkspaceRoute = {
8
+ workspaceId: string | null;
9
+ tab: WorkspaceRouteTab;
10
+ isNew: boolean;
11
+ testRunId?: string;
12
+ gradeRunId?: string;
13
+ };
14
+ export type WorkspaceStreamEvent = {
15
+ type: "build.stream";
16
+ workspaceId: string;
17
+ role: "assistant" | "user";
18
+ chunk: string;
19
+ turn?: number;
20
+ ts?: number;
21
+ } | {
22
+ type: "build.stream.end";
23
+ workspaceId: string;
24
+ role: "assistant" | "user";
25
+ turn?: number;
26
+ ts?: number;
27
+ } | {
28
+ type: "test.stream";
29
+ workspaceId: string;
30
+ role: "assistant" | "user";
31
+ chunk: string;
32
+ turn?: number;
33
+ ts?: number;
34
+ } | {
35
+ type: "test.stream.end";
36
+ workspaceId: string;
37
+ role: "assistant" | "user";
38
+ turn?: number;
39
+ ts?: number;
40
+ } | {
41
+ type: "grade.session";
42
+ workspaceId: string;
43
+ runId?: string;
44
+ ts?: number;
45
+ };
46
+ export type WorkspaceReducerEvent = {
47
+ type: "workspace.loaded";
48
+ workspaceId: string;
49
+ state: unknown;
50
+ } | {
51
+ type: "build.status";
52
+ workspaceId: string;
53
+ run: unknown;
54
+ } | {
55
+ type: "test.status";
56
+ workspaceId: string;
57
+ run: unknown;
58
+ } | {
59
+ type: "grade.status";
60
+ workspaceId: string;
61
+ run: unknown;
62
+ } | WorkspaceStreamEvent;
63
+ export type WorkspaceCreateResponse = {
64
+ workspaceId: string;
65
+ deckPath: string;
66
+ workspaceDir: string;
67
+ createdAt: string;
68
+ workspaceSchemaVersion: string;
69
+ };
70
+ export declare const buildWorkspacePath: (tab: WorkspaceRouteTab, workspaceId?: string | null, opts?: {
71
+ runId?: string;
72
+ }) => string;
73
+ export declare const parseWorkspaceRoute: (pathname: string) => WorkspaceRoute | null;
74
+ export declare const WORKSPACE_ID_ALIASES: readonly ["workspaceId"];
75
+ export declare const resolveWorkspaceIdFromRecord: (record: Record<string, unknown>) => string | undefined;
76
+ export declare const resolveWorkspaceIdFromSearchParams: (params: URLSearchParams) => string | undefined;
77
+ export declare const workspaceSchemaError: (workspaceId: string, foundVersion: string | null) => string;
78
+ //# sourceMappingURL=workspace_contract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace_contract.d.ts","sourceRoot":"","sources":["../../src/src/workspace_contract.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,8BAA8B,uBAAuB,CAAC;AAEnE,eAAO,MAAM,oBAAoB,gBAAgB,CAAC;AAClD,eAAO,MAAM,kBAAkB,mBAAmB,CAAC;AACnD,eAAO,MAAM,mBAAmB,oBAAoB,CAAC;AAErD,MAAM,MAAM,iBAAiB,GAAG,OAAO,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC;AAErE,eAAO,MAAM,oBAAoB,EAAE,KAAK,CAAC,iBAAiB,CAKzD,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,GAAG,EAAE,iBAAiB,CAAC;IACvB,KAAK,EAAE,OAAO,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAC5B;IACA,IAAI,EAAE,cAAc,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,WAAW,GAAG,MAAM,CAAC;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,EAAE,CAAC,EAAE,MAAM,CAAC;CACb,GACC;IACA,IAAI,EAAE,kBAAkB,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,WAAW,GAAG,MAAM,CAAC;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,EAAE,CAAC,EAAE,MAAM,CAAC;CACb,GACC;IACA,IAAI,EAAE,aAAa,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,WAAW,GAAG,MAAM,CAAC;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,EAAE,CAAC,EAAE,MAAM,CAAC;CACb,GACC;IACA,IAAI,EAAE,iBAAiB,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,WAAW,GAAG,MAAM,CAAC;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,EAAE,CAAC,EAAE,MAAM,CAAC;CACb,GACC;IACA,IAAI,EAAE,eAAe,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,EAAE,CAAC,EAAE,MAAM,CAAC;CACb,CAAC;AAEJ,MAAM,MAAM,qBAAqB,GAC7B;IAAE,IAAI,EAAE,kBAAkB,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,GACjE;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,OAAO,CAAA;CAAE,GAC3D;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,OAAO,CAAA;CAAE,GAC1D;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,OAAO,CAAA;CAAE,GAC3D,oBAAoB,CAAC;AAEzB,MAAM,MAAM,uBAAuB,GAAG;IACpC,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,sBAAsB,EAAE,MAAM,CAAC;CAChC,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAC7B,KAAK,iBAAiB,EACtB,cAAc,MAAM,GAAG,IAAI,EAC3B,OAAO;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,KACxB,MAOF,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAC9B,UAAU,MAAM,KACf,cAAc,GAAG,IAsBnB,CAAC;AAEF,eAAO,MAAM,oBAAoB,0BAA2B,CAAC;AAa7D,eAAO,MAAM,4BAA4B,GACvC,QAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC9B,MAAM,GAAG,SAMX,CAAC;AAEF,eAAO,MAAM,kCAAkC,GAC7C,QAAQ,eAAe,KACtB,MAAM,GAAG,SAQX,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAC/B,aAAa,MAAM,EACnB,cAAc,MAAM,GAAG,IAAI,KAC1B,MAOF,CAAC"}
@@ -0,0 +1,84 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.workspaceSchemaError = exports.resolveWorkspaceIdFromSearchParams = exports.resolveWorkspaceIdFromRecord = exports.WORKSPACE_ID_ALIASES = exports.parseWorkspaceRoute = exports.buildWorkspacePath = exports.WORKSPACE_ROUTE_TABS = exports.WORKSPACES_API_BASE = exports.WORKSPACE_API_BASE = exports.WORKSPACE_ROUTE_BASE = exports.WORKSPACE_STATE_SCHEMA_VERSION = void 0;
4
+ exports.WORKSPACE_STATE_SCHEMA_VERSION = "workspace-state.v1";
5
+ exports.WORKSPACE_ROUTE_BASE = "/workspaces";
6
+ exports.WORKSPACE_API_BASE = "/api/workspace";
7
+ exports.WORKSPACES_API_BASE = "/api/workspaces";
8
+ exports.WORKSPACE_ROUTE_TABS = [
9
+ "debug",
10
+ "build",
11
+ "test",
12
+ "grade",
13
+ ];
14
+ const buildWorkspacePath = (tab, workspaceId, opts) => {
15
+ const encoded = workspaceId ? encodeURIComponent(workspaceId) : "new";
16
+ const base = `${exports.WORKSPACE_ROUTE_BASE}/${encoded}/${tab}`;
17
+ const runId = opts?.runId;
18
+ if (!runId)
19
+ return base;
20
+ if (tab !== "test" && tab !== "grade")
21
+ return base;
22
+ return `${base}/${encodeURIComponent(runId)}`;
23
+ };
24
+ exports.buildWorkspacePath = buildWorkspacePath;
25
+ const parseWorkspaceRoute = (pathname) => {
26
+ const match = pathname.match(/^\/workspaces\/([^/]+)\/(debug|build|test|grade)(?:\/([^/]+))?$/);
27
+ if (!match)
28
+ return null;
29
+ const rawId = decodeURIComponent(match[1]);
30
+ const tab = match[2];
31
+ const runSegment = typeof match[3] === "string"
32
+ ? decodeURIComponent(match[3])
33
+ : undefined;
34
+ if (runSegment && tab !== "test" && tab !== "grade")
35
+ return null;
36
+ if (rawId === "new" && runSegment)
37
+ return null;
38
+ if (rawId === "new") {
39
+ return { workspaceId: null, tab, isNew: true };
40
+ }
41
+ return {
42
+ workspaceId: rawId,
43
+ tab,
44
+ isNew: false,
45
+ testRunId: tab === "test" ? runSegment : undefined,
46
+ gradeRunId: tab === "grade" ? runSegment : undefined,
47
+ };
48
+ };
49
+ exports.parseWorkspaceRoute = parseWorkspaceRoute;
50
+ exports.WORKSPACE_ID_ALIASES = ["workspaceId"];
51
+ const readString = (record, key) => {
52
+ const value = record[key];
53
+ return typeof value === "string" && value.trim().length > 0
54
+ ? value
55
+ : undefined;
56
+ };
57
+ const resolveWorkspaceIdFromRecord = (record) => {
58
+ for (const key of exports.WORKSPACE_ID_ALIASES) {
59
+ const value = readString(record, key);
60
+ if (value)
61
+ return value;
62
+ }
63
+ return undefined;
64
+ };
65
+ exports.resolveWorkspaceIdFromRecord = resolveWorkspaceIdFromRecord;
66
+ const resolveWorkspaceIdFromSearchParams = (params) => {
67
+ for (const key of exports.WORKSPACE_ID_ALIASES) {
68
+ const value = params.get(key);
69
+ if (typeof value === "string" && value.trim().length > 0) {
70
+ return value;
71
+ }
72
+ }
73
+ return undefined;
74
+ };
75
+ exports.resolveWorkspaceIdFromSearchParams = resolveWorkspaceIdFromSearchParams;
76
+ const workspaceSchemaError = (workspaceId, foundVersion) => {
77
+ const shown = foundVersion ? `"${foundVersion}"` : "missing";
78
+ return [
79
+ `Unsupported workspace state schema for "${workspaceId}" (found ${shown}).`,
80
+ `Expected "${exports.WORKSPACE_STATE_SCHEMA_VERSION}".`,
81
+ `Recreate this workspace with ${exports.WORKSPACE_API_BASE}/new.`,
82
+ ].join(" ");
83
+ };
84
+ exports.workspaceSchemaError = workspaceSchemaError;