@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.
- package/CHANGELOG.md +150 -2
- package/README.md +109 -23
- package/esm/_dnt.polyfills.d.ts +17 -0
- package/esm/_dnt.polyfills.d.ts.map +1 -1
- package/esm/_dnt.polyfills.js +123 -0
- package/esm/deps/jsr.io/@std/collections/1.1.6/deep_merge.d.ts +322 -0
- package/esm/deps/jsr.io/@std/collections/1.1.6/deep_merge.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/collections/1.1.6/deep_merge.js +105 -0
- package/esm/deps/jsr.io/@std/fs/1.0.23/_create_walk_entry.d.ts +14 -0
- package/esm/deps/jsr.io/@std/fs/1.0.23/_create_walk_entry.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/fs/1.0.23/_create_walk_entry.js +34 -0
- package/esm/deps/jsr.io/@std/fs/1.0.23/_get_file_info_type.d.ts +13 -0
- package/esm/deps/jsr.io/@std/fs/1.0.23/_get_file_info_type.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/fs/1.0.23/_get_file_info_type.js +18 -0
- package/esm/deps/jsr.io/@std/fs/1.0.23/_is_same_path.d.ts +10 -0
- package/esm/deps/jsr.io/@std/fs/1.0.23/_is_same_path.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/fs/1.0.23/_is_same_path.js +17 -0
- package/esm/deps/jsr.io/@std/fs/1.0.23/_is_subdir.d.ts +12 -0
- package/esm/deps/jsr.io/@std/fs/1.0.23/_is_subdir.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/fs/1.0.23/_is_subdir.js +25 -0
- package/esm/deps/jsr.io/@std/fs/1.0.23/_to_path_string.d.ts +9 -0
- package/esm/deps/jsr.io/@std/fs/1.0.23/_to_path_string.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/fs/1.0.23/_to_path_string.js +13 -0
- package/esm/deps/jsr.io/@std/fs/1.0.23/copy.d.ts +117 -0
- package/esm/deps/jsr.io/@std/fs/1.0.23/copy.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/fs/1.0.23/copy.js +313 -0
- package/esm/deps/jsr.io/@std/fs/1.0.23/empty_dir.d.ts +48 -0
- package/esm/deps/jsr.io/@std/fs/1.0.23/empty_dir.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/fs/1.0.23/empty_dir.js +87 -0
- package/esm/deps/jsr.io/@std/fs/1.0.23/ensure_dir.d.ts +49 -0
- package/esm/deps/jsr.io/@std/fs/1.0.23/ensure_dir.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/fs/1.0.23/ensure_dir.js +102 -0
- package/esm/deps/jsr.io/@std/fs/1.0.23/ensure_file.d.ts +47 -0
- package/esm/deps/jsr.io/@std/fs/1.0.23/ensure_file.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/fs/1.0.23/ensure_file.js +90 -0
- package/esm/deps/jsr.io/@std/fs/1.0.23/ensure_link.d.ts +49 -0
- package/esm/deps/jsr.io/@std/fs/1.0.23/ensure_link.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/fs/1.0.23/ensure_link.js +61 -0
- package/esm/deps/jsr.io/@std/fs/1.0.23/ensure_symlink.d.ts +70 -0
- package/esm/deps/jsr.io/@std/fs/1.0.23/ensure_symlink.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/fs/1.0.23/ensure_symlink.js +156 -0
- package/esm/deps/jsr.io/@std/fs/1.0.23/eol.d.ts +52 -0
- package/esm/deps/jsr.io/@std/fs/1.0.23/eol.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/fs/1.0.23/eol.js +67 -0
- package/esm/deps/jsr.io/@std/fs/1.0.23/exists.d.ts +218 -0
- package/esm/deps/jsr.io/@std/fs/1.0.23/exists.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/fs/1.0.23/exists.js +271 -0
- package/esm/deps/jsr.io/@std/fs/1.0.23/expand_glob.d.ts +267 -0
- package/esm/deps/jsr.io/@std/fs/1.0.23/expand_glob.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/fs/1.0.23/expand_glob.js +442 -0
- package/esm/deps/jsr.io/@std/fs/1.0.23/mod.d.ts +29 -0
- package/esm/deps/jsr.io/@std/fs/1.0.23/mod.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/fs/1.0.23/mod.js +29 -0
- package/esm/deps/jsr.io/@std/fs/1.0.23/move.d.ts +86 -0
- package/esm/deps/jsr.io/@std/fs/1.0.23/move.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/fs/1.0.23/move.js +142 -0
- package/esm/deps/jsr.io/@std/fs/1.0.23/walk.d.ts +777 -0
- package/esm/deps/jsr.io/@std/fs/1.0.23/walk.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/fs/1.0.23/walk.js +846 -0
- package/esm/deps/jsr.io/@std/json/1.0.3/types.d.ts +7 -0
- package/esm/deps/jsr.io/@std/json/1.0.3/types.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/json/1.0.3/types.js +3 -0
- package/esm/deps/jsr.io/@std/jsonc/1.0.2/mod.d.ts +20 -0
- package/esm/deps/jsr.io/@std/jsonc/1.0.2/mod.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/jsonc/1.0.2/mod.js +21 -0
- package/esm/deps/jsr.io/@std/jsonc/1.0.2/parse.d.ts +21 -0
- package/esm/deps/jsr.io/@std/jsonc/1.0.2/parse.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/jsonc/1.0.2/parse.js +320 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/constants.d.ts +1 -1
- package/esm/deps/jsr.io/@std/toml/1.0.11/_parser.d.ts +93 -0
- package/esm/deps/jsr.io/@std/toml/1.0.11/_parser.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/toml/1.0.11/_parser.js +753 -0
- package/esm/deps/jsr.io/@std/toml/1.0.11/mod.d.ts +109 -0
- package/esm/deps/jsr.io/@std/toml/1.0.11/mod.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/toml/1.0.11/mod.js +110 -0
- package/esm/deps/jsr.io/@std/toml/1.0.11/parse.d.ts +21 -0
- package/esm/deps/jsr.io/@std/toml/1.0.11/parse.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/toml/1.0.11/parse.js +25 -0
- package/esm/deps/jsr.io/@std/toml/1.0.11/stringify.d.ts +35 -0
- package/esm/deps/jsr.io/@std/toml/1.0.11/stringify.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/toml/1.0.11/stringify.js +283 -0
- package/esm/gambit/simulator-ui/dist/bundle.js +12670 -5471
- package/esm/gambit/simulator-ui/dist/bundle.js.map +4 -4
- package/esm/gambit/simulator-ui/dist/favicon.ico +0 -0
- package/esm/mod.d.ts +21 -7
- package/esm/mod.d.ts.map +1 -1
- package/esm/mod.js +14 -4
- package/esm/src/cli_utils.d.ts +1 -0
- package/esm/src/cli_utils.d.ts.map +1 -1
- package/esm/src/cli_utils.js +52 -4
- package/esm/src/default_runtime.d.ts +46 -0
- package/esm/src/default_runtime.d.ts.map +1 -0
- package/esm/src/default_runtime.js +415 -0
- package/esm/src/durable_streams.js +26 -1
- package/esm/src/model_matchers.d.ts +10 -0
- package/esm/src/model_matchers.d.ts.map +1 -0
- package/esm/src/model_matchers.js +26 -0
- package/esm/src/openai_compat.d.ts +74 -0
- package/esm/src/openai_compat.d.ts.map +1 -0
- package/esm/src/openai_compat.js +329 -0
- package/esm/src/project_config.d.ts +47 -0
- package/esm/src/project_config.d.ts.map +1 -0
- package/esm/src/project_config.js +134 -0
- package/esm/src/providers/codex.d.ts +37 -0
- package/esm/src/providers/codex.d.ts.map +1 -0
- package/esm/src/providers/codex.js +810 -0
- package/esm/src/providers/google.d.ts +18 -0
- package/esm/src/providers/google.d.ts.map +1 -0
- package/esm/src/providers/google.js +428 -0
- package/esm/src/providers/ollama.d.ts +19 -0
- package/esm/src/providers/ollama.d.ts.map +1 -0
- package/esm/src/providers/ollama.js +789 -0
- package/esm/src/providers/openrouter.d.ts +26 -0
- package/esm/src/providers/openrouter.d.ts.map +1 -0
- package/esm/src/providers/openrouter.js +886 -0
- package/esm/src/providers/router.d.ts +19 -0
- package/esm/src/providers/router.d.ts.map +1 -0
- package/esm/src/providers/router.js +93 -0
- package/esm/src/server.d.ts +11 -0
- package/esm/src/server.d.ts.map +1 -1
- package/esm/src/server.js +3927 -689
- package/esm/src/server_feedback_grading_routes.d.ts +32 -0
- package/esm/src/server_feedback_grading_routes.d.ts.map +1 -0
- package/esm/src/server_feedback_grading_routes.js +305 -0
- package/esm/src/server_helpers.d.ts +4 -0
- package/esm/src/server_helpers.d.ts.map +1 -0
- package/esm/src/server_helpers.js +46 -0
- package/esm/src/server_session_store.d.ts +87 -0
- package/esm/src/server_session_store.d.ts.map +1 -0
- package/esm/src/server_session_store.js +873 -0
- package/esm/src/server_types.d.ts +110 -0
- package/esm/src/server_types.d.ts.map +1 -0
- package/esm/src/server_types.js +1 -0
- package/esm/src/server_ui_routes.d.ts +33 -0
- package/esm/src/server_ui_routes.d.ts.map +1 -0
- package/esm/src/server_ui_routes.js +136 -0
- package/esm/src/session_artifacts.d.ts +22 -0
- package/esm/src/session_artifacts.d.ts.map +1 -0
- package/esm/src/session_artifacts.js +243 -0
- package/esm/src/trace.d.ts.map +1 -1
- package/esm/src/trace.js +8 -5
- package/esm/src/workspace.d.ts +19 -0
- package/esm/src/workspace.d.ts.map +1 -0
- package/esm/src/workspace.js +162 -0
- package/esm/src/workspace_contract.d.ts +78 -0
- package/esm/src/workspace_contract.d.ts.map +1 -0
- package/esm/src/workspace_contract.js +76 -0
- package/package.json +3 -2
- package/script/_dnt.polyfills.d.ts +17 -0
- package/script/_dnt.polyfills.d.ts.map +1 -1
- package/script/_dnt.polyfills.js +123 -0
- package/script/deps/jsr.io/@std/collections/1.1.6/deep_merge.d.ts +322 -0
- package/script/deps/jsr.io/@std/collections/1.1.6/deep_merge.d.ts.map +1 -0
- package/script/deps/jsr.io/@std/collections/1.1.6/deep_merge.js +108 -0
- package/script/deps/jsr.io/@std/fs/1.0.23/_create_walk_entry.d.ts +14 -0
- package/script/deps/jsr.io/@std/fs/1.0.23/_create_walk_entry.d.ts.map +1 -0
- package/script/deps/jsr.io/@std/fs/1.0.23/_create_walk_entry.js +71 -0
- package/script/deps/jsr.io/@std/fs/1.0.23/_get_file_info_type.d.ts +13 -0
- package/script/deps/jsr.io/@std/fs/1.0.23/_get_file_info_type.d.ts.map +1 -0
- package/script/deps/jsr.io/@std/fs/1.0.23/_get_file_info_type.js +21 -0
- package/script/deps/jsr.io/@std/fs/1.0.23/_is_same_path.d.ts +10 -0
- package/script/deps/jsr.io/@std/fs/1.0.23/_is_same_path.d.ts.map +1 -0
- package/script/deps/jsr.io/@std/fs/1.0.23/_is_same_path.js +20 -0
- package/script/deps/jsr.io/@std/fs/1.0.23/_is_subdir.d.ts +12 -0
- package/script/deps/jsr.io/@std/fs/1.0.23/_is_subdir.d.ts.map +1 -0
- package/script/deps/jsr.io/@std/fs/1.0.23/_is_subdir.js +28 -0
- package/script/deps/jsr.io/@std/fs/1.0.23/_to_path_string.d.ts +9 -0
- package/script/deps/jsr.io/@std/fs/1.0.23/_to_path_string.d.ts.map +1 -0
- package/script/deps/jsr.io/@std/fs/1.0.23/_to_path_string.js +16 -0
- package/script/deps/jsr.io/@std/fs/1.0.23/copy.d.ts +117 -0
- package/script/deps/jsr.io/@std/fs/1.0.23/copy.d.ts.map +1 -0
- package/script/deps/jsr.io/@std/fs/1.0.23/copy.js +350 -0
- package/script/deps/jsr.io/@std/fs/1.0.23/empty_dir.d.ts +48 -0
- package/script/deps/jsr.io/@std/fs/1.0.23/empty_dir.d.ts.map +1 -0
- package/script/deps/jsr.io/@std/fs/1.0.23/empty_dir.js +124 -0
- package/script/deps/jsr.io/@std/fs/1.0.23/ensure_dir.d.ts +49 -0
- package/script/deps/jsr.io/@std/fs/1.0.23/ensure_dir.d.ts.map +1 -0
- package/script/deps/jsr.io/@std/fs/1.0.23/ensure_dir.js +139 -0
- package/script/deps/jsr.io/@std/fs/1.0.23/ensure_file.d.ts +47 -0
- package/script/deps/jsr.io/@std/fs/1.0.23/ensure_file.d.ts.map +1 -0
- package/script/deps/jsr.io/@std/fs/1.0.23/ensure_file.js +127 -0
- package/script/deps/jsr.io/@std/fs/1.0.23/ensure_link.d.ts +49 -0
- package/script/deps/jsr.io/@std/fs/1.0.23/ensure_link.d.ts.map +1 -0
- package/script/deps/jsr.io/@std/fs/1.0.23/ensure_link.js +98 -0
- package/script/deps/jsr.io/@std/fs/1.0.23/ensure_symlink.d.ts +70 -0
- package/script/deps/jsr.io/@std/fs/1.0.23/ensure_symlink.d.ts.map +1 -0
- package/script/deps/jsr.io/@std/fs/1.0.23/ensure_symlink.js +193 -0
- package/script/deps/jsr.io/@std/fs/1.0.23/eol.d.ts +52 -0
- package/script/deps/jsr.io/@std/fs/1.0.23/eol.d.ts.map +1 -0
- package/script/deps/jsr.io/@std/fs/1.0.23/eol.js +105 -0
- package/script/deps/jsr.io/@std/fs/1.0.23/exists.d.ts +218 -0
- package/script/deps/jsr.io/@std/fs/1.0.23/exists.d.ts.map +1 -0
- package/script/deps/jsr.io/@std/fs/1.0.23/exists.js +308 -0
- package/script/deps/jsr.io/@std/fs/1.0.23/expand_glob.d.ts +267 -0
- package/script/deps/jsr.io/@std/fs/1.0.23/expand_glob.d.ts.map +1 -0
- package/script/deps/jsr.io/@std/fs/1.0.23/expand_glob.js +479 -0
- package/script/deps/jsr.io/@std/fs/1.0.23/mod.d.ts +29 -0
- package/script/deps/jsr.io/@std/fs/1.0.23/mod.d.ts.map +1 -0
- package/script/deps/jsr.io/@std/fs/1.0.23/mod.js +45 -0
- package/script/deps/jsr.io/@std/fs/1.0.23/move.d.ts +86 -0
- package/script/deps/jsr.io/@std/fs/1.0.23/move.d.ts.map +1 -0
- package/script/deps/jsr.io/@std/fs/1.0.23/move.js +179 -0
- package/script/deps/jsr.io/@std/fs/1.0.23/walk.d.ts +777 -0
- package/script/deps/jsr.io/@std/fs/1.0.23/walk.d.ts.map +1 -0
- package/script/deps/jsr.io/@std/fs/1.0.23/walk.js +883 -0
- package/script/deps/jsr.io/@std/json/1.0.3/types.d.ts +7 -0
- package/script/deps/jsr.io/@std/json/1.0.3/types.d.ts.map +1 -0
- package/script/deps/jsr.io/@std/json/1.0.3/types.js +4 -0
- package/script/deps/jsr.io/@std/jsonc/1.0.2/mod.d.ts +20 -0
- package/script/deps/jsr.io/@std/jsonc/1.0.2/mod.d.ts.map +1 -0
- package/script/deps/jsr.io/@std/jsonc/1.0.2/mod.js +37 -0
- package/script/deps/jsr.io/@std/jsonc/1.0.2/parse.d.ts +21 -0
- package/script/deps/jsr.io/@std/jsonc/1.0.2/parse.d.ts.map +1 -0
- package/script/deps/jsr.io/@std/jsonc/1.0.2/parse.js +323 -0
- package/script/deps/jsr.io/@std/path/1.1.4/constants.d.ts +1 -1
- package/script/deps/jsr.io/@std/toml/1.0.11/_parser.d.ts +93 -0
- package/script/deps/jsr.io/@std/toml/1.0.11/_parser.d.ts.map +1 -0
- package/script/deps/jsr.io/@std/toml/1.0.11/_parser.js +781 -0
- package/script/deps/jsr.io/@std/toml/1.0.11/mod.d.ts +109 -0
- package/script/deps/jsr.io/@std/toml/1.0.11/mod.d.ts.map +1 -0
- package/script/deps/jsr.io/@std/toml/1.0.11/mod.js +126 -0
- package/script/deps/jsr.io/@std/toml/1.0.11/parse.d.ts +21 -0
- package/script/deps/jsr.io/@std/toml/1.0.11/parse.d.ts.map +1 -0
- package/script/deps/jsr.io/@std/toml/1.0.11/parse.js +28 -0
- package/script/deps/jsr.io/@std/toml/1.0.11/stringify.d.ts +35 -0
- package/script/deps/jsr.io/@std/toml/1.0.11/stringify.d.ts.map +1 -0
- package/script/deps/jsr.io/@std/toml/1.0.11/stringify.js +286 -0
- package/script/gambit/simulator-ui/dist/bundle.js +12670 -5471
- package/script/gambit/simulator-ui/dist/bundle.js.map +4 -4
- package/script/gambit/simulator-ui/dist/favicon.ico +0 -0
- package/script/mod.d.ts +21 -7
- package/script/mod.d.ts.map +1 -1
- package/script/mod.js +22 -7
- package/script/src/cli_utils.d.ts +1 -0
- package/script/src/cli_utils.d.ts.map +1 -1
- package/script/src/cli_utils.js +52 -3
- package/script/src/default_runtime.d.ts +46 -0
- package/script/src/default_runtime.d.ts.map +1 -0
- package/script/src/default_runtime.js +452 -0
- package/script/src/durable_streams.js +26 -1
- package/script/src/model_matchers.d.ts +10 -0
- package/script/src/model_matchers.d.ts.map +1 -0
- package/script/src/model_matchers.js +29 -0
- package/script/src/openai_compat.d.ts +74 -0
- package/script/src/openai_compat.d.ts.map +1 -0
- package/script/src/openai_compat.js +366 -0
- package/script/src/project_config.d.ts +47 -0
- package/script/src/project_config.d.ts.map +1 -0
- package/script/src/project_config.js +173 -0
- package/script/src/providers/codex.d.ts +37 -0
- package/script/src/providers/codex.d.ts.map +1 -0
- package/script/src/providers/codex.js +850 -0
- package/script/src/providers/google.d.ts +18 -0
- package/script/src/providers/google.d.ts.map +1 -0
- package/script/src/providers/google.js +435 -0
- package/script/src/providers/ollama.d.ts +19 -0
- package/script/src/providers/ollama.d.ts.map +1 -0
- package/script/src/providers/ollama.js +831 -0
- package/script/src/providers/openrouter.d.ts +26 -0
- package/script/src/providers/openrouter.d.ts.map +1 -0
- package/script/src/providers/openrouter.js +926 -0
- package/script/src/providers/router.d.ts +19 -0
- package/script/src/providers/router.d.ts.map +1 -0
- package/script/src/providers/router.js +96 -0
- package/script/src/server.d.ts +11 -0
- package/script/src/server.d.ts.map +1 -1
- package/script/src/server.js +3931 -693
- package/script/src/server_feedback_grading_routes.d.ts +32 -0
- package/script/src/server_feedback_grading_routes.d.ts.map +1 -0
- package/script/src/server_feedback_grading_routes.js +343 -0
- package/script/src/server_helpers.d.ts +4 -0
- package/script/src/server_helpers.d.ts.map +1 -0
- package/script/src/server_helpers.js +84 -0
- package/script/src/server_session_store.d.ts +87 -0
- package/script/src/server_session_store.d.ts.map +1 -0
- package/script/src/server_session_store.js +910 -0
- package/script/src/server_types.d.ts +110 -0
- package/script/src/server_types.d.ts.map +1 -0
- package/script/src/server_types.js +2 -0
- package/script/src/server_ui_routes.d.ts +33 -0
- package/script/src/server_ui_routes.d.ts.map +1 -0
- package/script/src/server_ui_routes.js +173 -0
- package/script/src/session_artifacts.d.ts +22 -0
- package/script/src/session_artifacts.d.ts.map +1 -0
- package/script/src/session_artifacts.js +279 -0
- package/script/src/trace.d.ts.map +1 -1
- package/script/src/trace.js +8 -5
- package/script/src/workspace.d.ts +19 -0
- package/script/src/workspace.d.ts.map +1 -0
- package/script/src/workspace.js +199 -0
- package/script/src/workspace_contract.d.ts +78 -0
- package/script/src/workspace_contract.d.ts.map +1 -0
- 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
|
+
}
|
package/esm/src/trace.d.ts.map
CHANGED
|
@@ -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,
|
|
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"}
|