@bolt-foundry/gambit 0.8.5-rc.9 → 0.8.5

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 (53) hide show
  1. package/CHANGELOG.md +40 -2
  2. package/README.md +16 -7
  3. package/esm/_dnt.polyfills.d.ts +7 -7
  4. package/esm/_dnt.polyfills.d.ts.map +1 -1
  5. package/esm/_dnt.polyfills.js +14 -13
  6. package/esm/deps/jsr.io/@std/path/1.1.4/constants.d.ts +1 -1
  7. package/esm/gambit/simulator-ui/dist/bundle.js +2464 -380
  8. package/esm/gambit/simulator-ui/dist/bundle.js.map +4 -4
  9. package/esm/src/providers/codex.d.ts.map +1 -1
  10. package/esm/src/providers/codex.js +5 -1
  11. package/esm/src/providers/ollama.d.ts.map +1 -1
  12. package/esm/src/providers/ollama.js +57 -0
  13. package/esm/src/providers/openrouter.d.ts.map +1 -1
  14. package/esm/src/providers/openrouter.js +75 -1
  15. package/esm/src/server.d.ts.map +1 -1
  16. package/esm/src/server.js +346 -32
  17. package/esm/src/server_session_store.d.ts.map +1 -1
  18. package/esm/src/server_session_store.js +7 -4
  19. package/esm/src/server_types.d.ts +1 -0
  20. package/esm/src/server_types.d.ts.map +1 -1
  21. package/esm/src/server_ui_routes.d.ts.map +1 -1
  22. package/esm/src/server_ui_routes.js +3 -0
  23. package/esm/src/workspace.d.ts.map +1 -1
  24. package/esm/src/workspace.js +0 -2
  25. package/esm/src/workspace_contract.d.ts +1 -1
  26. package/esm/src/workspace_contract.d.ts.map +1 -1
  27. package/esm/src/workspace_contract.js +2 -1
  28. package/package.json +2 -2
  29. package/script/_dnt.polyfills.d.ts +7 -7
  30. package/script/_dnt.polyfills.d.ts.map +1 -1
  31. package/script/_dnt.polyfills.js +14 -13
  32. package/script/deps/jsr.io/@std/path/1.1.4/constants.d.ts +1 -1
  33. package/script/gambit/simulator-ui/dist/bundle.js +2464 -380
  34. package/script/gambit/simulator-ui/dist/bundle.js.map +4 -4
  35. package/script/src/providers/codex.d.ts.map +1 -1
  36. package/script/src/providers/codex.js +5 -1
  37. package/script/src/providers/ollama.d.ts.map +1 -1
  38. package/script/src/providers/ollama.js +57 -0
  39. package/script/src/providers/openrouter.d.ts.map +1 -1
  40. package/script/src/providers/openrouter.js +75 -1
  41. package/script/src/server.d.ts.map +1 -1
  42. package/script/src/server.js +346 -32
  43. package/script/src/server_session_store.d.ts.map +1 -1
  44. package/script/src/server_session_store.js +7 -4
  45. package/script/src/server_types.d.ts +1 -0
  46. package/script/src/server_types.d.ts.map +1 -1
  47. package/script/src/server_ui_routes.d.ts.map +1 -1
  48. package/script/src/server_ui_routes.js +3 -0
  49. package/script/src/workspace.d.ts.map +1 -1
  50. package/script/src/workspace.js +0 -2
  51. package/script/src/workspace_contract.d.ts +1 -1
  52. package/script/src/workspace_contract.d.ts.map +1 -1
  53. package/script/src/workspace_contract.js +2 -1
package/esm/src/server.js CHANGED
@@ -16,6 +16,7 @@ import { handleUiRoutes } from "./server_ui_routes.js";
16
16
  import { resolveWorkspaceIdFromRecord, resolveWorkspaceIdFromSearchParams, WORKSPACE_API_BASE, WORKSPACE_ROUTE_BASE, WORKSPACE_STATE_SCHEMA_VERSION, WORKSPACES_API_BASE, workspaceSchemaError, } from "./workspace_contract.js";
17
17
  import { appendDurableStreamEvent, handleDurableStreamRequest, } from "./durable_streams.js";
18
18
  const GAMBIT_TOOL_RESPOND = "gambit_respond";
19
+ const CODEX_BIN_ENV = "GAMBIT_CODEX_BIN";
19
20
  const logger = console;
20
21
  const moduleLocation = (() => {
21
22
  const directoryFromUrl = (url) => {
@@ -107,6 +108,20 @@ const extractPersistedWorkspacePayload = (record) => {
107
108
  }
108
109
  return nested;
109
110
  };
111
+ const safeJsonStringify = (value) => {
112
+ const stack = [];
113
+ return JSON.stringify(value, function (_key, candidate) {
114
+ if (!candidate || typeof candidate !== "object")
115
+ return candidate;
116
+ while (stack.length > 0 && stack[stack.length - 1] !== this) {
117
+ stack.pop();
118
+ }
119
+ if (stack.includes(candidate))
120
+ return "[Circular]";
121
+ stack.push(candidate);
122
+ return candidate;
123
+ });
124
+ };
110
125
  const GAMBIT_BOT_SOURCE_DECK_URL = new URL("./decks/gambit-bot/PROMPT.md", globalThis[Symbol.for("import-meta-ponyfill-esmodule")](import.meta).url);
111
126
  const GAMBIT_BOT_SOURCE_DIR = GAMBIT_BOT_SOURCE_DECK_URL.protocol === "file:"
112
127
  ? path.dirname(path.fromFileUrl(GAMBIT_BOT_SOURCE_DECK_URL))
@@ -131,12 +146,6 @@ async function ensureGambitPolicyInBotRoot(root) {
131
146
  await ensureDir(path.dirname(dest));
132
147
  await copy(GAMBIT_BOT_POLICY_DIR, dest, { overwrite: false });
133
148
  }
134
- let availableTestDecks = [];
135
- const testDeckByPath = new Map();
136
- const testDeckById = new Map();
137
- let availableGraderDecks = [];
138
- const graderDeckByPath = new Map();
139
- const graderDeckById = new Map();
140
149
  async function describeDeckInputSchemaFromPath(deckPath) {
141
150
  try {
142
151
  const deck = await loadDeck(deckPath);
@@ -652,6 +661,22 @@ function normalizeInputItems(input) {
652
661
  });
653
662
  continue;
654
663
  }
664
+ if (type.includes(":")) {
665
+ const data = Object.hasOwn(item, "data")
666
+ ? asJsonValue(item.data)
667
+ : Object.entries(item)
668
+ .filter(([key]) => key !== "type" && key !== "id")
669
+ .reduce((acc, [key, value]) => {
670
+ acc[key] = asJsonValue(value);
671
+ return acc;
672
+ }, {});
673
+ items.push({
674
+ type: type,
675
+ id: typeof item.id === "string" ? item.id : undefined,
676
+ data,
677
+ });
678
+ continue;
679
+ }
655
680
  throw new Error(`Unsupported input item type: ${type || "(missing type)"}`);
656
681
  }
657
682
  return items;
@@ -827,12 +852,20 @@ function toStrictResponseItem(item, index) {
827
852
  status: "completed",
828
853
  };
829
854
  }
855
+ if (item.type === "reasoning") {
856
+ return {
857
+ type: "reasoning",
858
+ id: item.id ?? `rs_${index + 1}`,
859
+ content: (item.content ?? []).map((part) => toStrictContentPart(part)),
860
+ summary: item.summary.map((part) => toStrictContentPart(part)),
861
+ encrypted_content: item.encrypted_content ?? null,
862
+ };
863
+ }
830
864
  return {
831
- type: "reasoning",
832
- id: item.id ?? `rs_${index + 1}`,
833
- content: (item.content ?? []).map((part) => toStrictContentPart(part)),
834
- summary: item.summary.map((part) => toStrictContentPart(part)),
835
- encrypted_content: item.encrypted_content ?? null,
865
+ type: item.type,
866
+ id: item.id ?? `ext_${index + 1}`,
867
+ data: item.data,
868
+ status: "completed",
836
869
  };
837
870
  }
838
871
  function toStrictTools(tools) {
@@ -939,6 +972,12 @@ export function startWebSocketSimulator(opts) {
939
972
  const consoleTracer = opts.verbose ? makeConsoleTracer() : undefined;
940
973
  let resolvedDeckPath = resolveDeckPath(opts.deckPath);
941
974
  const buildBotRootCache = new Map();
975
+ let availableTestDecks = [];
976
+ const testDeckByPath = new Map();
977
+ const testDeckById = new Map();
978
+ let availableGraderDecks = [];
979
+ const graderDeckByPath = new Map();
980
+ const graderDeckById = new Map();
942
981
  const activeWorkspaceId = opts.workspace?.id ?? null;
943
982
  const activeWorkspaceOnboarding = Boolean(opts.workspace?.onboarding);
944
983
  const workspaceScaffoldEnabled = Boolean(opts.workspace?.scaffoldEnabled);
@@ -1063,6 +1102,191 @@ export function startWebSocketSimulator(opts) {
1063
1102
  buildBotRootCache.set(cacheKey, root);
1064
1103
  return root;
1065
1104
  };
1105
+ const resolveCodexConfigPath = (workspaceRoot) => path.join(workspaceRoot, ".codex", "config.toml");
1106
+ const toTomlQuoted = (value) => value.replaceAll("\\", "\\\\").replaceAll('"', '\\"');
1107
+ const hasTomlSection = (content, sectionHeader) => new RegExp(`^${sectionHeader.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}\\s*$`, "m")
1108
+ .test(content);
1109
+ const splitTomlTopLevel = (content) => {
1110
+ const sectionMatch = content.match(/^\s*\[[^\]]+\]\s*$/m);
1111
+ if (!sectionMatch || sectionMatch.index === undefined) {
1112
+ return { topLevel: content, sections: "" };
1113
+ }
1114
+ const index = sectionMatch.index;
1115
+ return {
1116
+ topLevel: content.slice(0, index),
1117
+ sections: content.slice(index),
1118
+ };
1119
+ };
1120
+ const hasTomlScalar = (content, key, expectedValue) => new RegExp(`^\\s*${key}\\s*=\\s*${expectedValue}\\s*$`, "m").test(content);
1121
+ const upsertTopLevelTomlScalar = (content, key, expectedValue) => {
1122
+ const desiredLine = `${key} = ${expectedValue}`;
1123
+ const linePattern = new RegExp(`^\\s*${key}\\s*=\\s*.*$`, "m");
1124
+ const { topLevel, sections } = splitTomlTopLevel(content);
1125
+ if (linePattern.test(topLevel)) {
1126
+ const nextTopLevel = topLevel.replace(linePattern, desiredLine);
1127
+ const next = `${nextTopLevel}${sections}`;
1128
+ return { next, changed: next !== content };
1129
+ }
1130
+ const prefix = topLevel.trim().length === 0
1131
+ ? ""
1132
+ : `${topLevel.replace(/\s*$/, "")}\n`;
1133
+ const next = `${prefix}${desiredLine}\n${sections}`;
1134
+ return { next, changed: true };
1135
+ };
1136
+ const ensureCodexDefaults = (content) => {
1137
+ let next = content;
1138
+ let changed = false;
1139
+ for (const [key, expectedValue] of [
1140
+ ["profile", '"codebot"'],
1141
+ ["sandbox_mode", '"danger-full-access"'],
1142
+ ["approval_policy", '"never"'],
1143
+ ]) {
1144
+ const updated = upsertTopLevelTomlScalar(next, key, expectedValue);
1145
+ next = updated.next;
1146
+ changed = changed || updated.changed;
1147
+ }
1148
+ if (!hasTomlSection(next, "[profiles.codebot]")) {
1149
+ const prefix = next.trim().length === 0
1150
+ ? ""
1151
+ : `${next.replace(/\s*$/, "")}\n\n`;
1152
+ next = `${prefix}[profiles.codebot]\n`;
1153
+ changed = true;
1154
+ }
1155
+ return { next, changed };
1156
+ };
1157
+ const evaluateCodexWriteEnabled = (args) => {
1158
+ const { content, trustedPath } = args;
1159
+ const { topLevel } = splitTomlTopLevel(content);
1160
+ const sectionHeader = `[projects."${toTomlQuoted(trustedPath)}"]`;
1161
+ const sectionStart = content.indexOf(sectionHeader);
1162
+ let trusted = false;
1163
+ if (sectionStart >= 0) {
1164
+ const sectionEndMarker = content.indexOf("\n[", sectionStart + 1);
1165
+ const sectionEnd = sectionEndMarker >= 0
1166
+ ? sectionEndMarker
1167
+ : content.length;
1168
+ const section = content.slice(sectionStart, sectionEnd);
1169
+ trusted = /^\s*trust_level\s*=\s*"trusted"\s*$/m.test(section);
1170
+ }
1171
+ const hasProfile = hasTomlScalar(topLevel, "profile", '"codebot"');
1172
+ const hasSandbox = hasTomlScalar(topLevel, "sandbox_mode", '"danger-full-access"');
1173
+ const hasApproval = hasTomlScalar(topLevel, "approval_policy", '"never"');
1174
+ const hasCodebotProfileSection = hasTomlSection(content, "[profiles.codebot]");
1175
+ return {
1176
+ trusted,
1177
+ writeEnabled: trusted && hasProfile && hasSandbox && hasApproval &&
1178
+ hasCodebotProfileSection,
1179
+ };
1180
+ };
1181
+ const readCodexLoginStatus = async (workspaceRoot) => {
1182
+ const env = dntShim.Deno.env.toObject();
1183
+ env.CODEX_HOME = path.join(workspaceRoot, ".codex");
1184
+ const codexBin = dntShim.Deno.env.get(CODEX_BIN_ENV)?.trim() || "codex";
1185
+ try {
1186
+ const output = await new dntShim.Deno.Command(codexBin, {
1187
+ args: ["login", "status"],
1188
+ env,
1189
+ stdout: "piped",
1190
+ stderr: "piped",
1191
+ }).output();
1192
+ const stdout = new TextDecoder().decode(output.stdout).trim();
1193
+ const stderr = new TextDecoder().decode(output.stderr).trim();
1194
+ const detail = stdout || stderr || "Unknown login status";
1195
+ if (output.success) {
1196
+ return { codexLoggedIn: true, codexLoginStatus: detail };
1197
+ }
1198
+ return { codexLoggedIn: false, codexLoginStatus: detail };
1199
+ }
1200
+ catch (err) {
1201
+ if (err instanceof dntShim.Deno.errors.NotFound) {
1202
+ return {
1203
+ codexLoggedIn: false,
1204
+ codexLoginStatus: "Codex CLI not found in PATH.",
1205
+ };
1206
+ }
1207
+ return {
1208
+ codexLoggedIn: false,
1209
+ codexLoginStatus: err instanceof Error ? err.message : String(err),
1210
+ };
1211
+ }
1212
+ };
1213
+ const readCodexTrustStatus = async (workspaceId) => {
1214
+ const trustedPath = await resolveBuildBotRoot(workspaceId);
1215
+ const configPath = resolveCodexConfigPath(trustedPath);
1216
+ let current = "";
1217
+ try {
1218
+ current = await dntShim.Deno.readTextFile(configPath);
1219
+ }
1220
+ catch (err) {
1221
+ if (err instanceof dntShim.Deno.errors.NotFound) {
1222
+ const login = await readCodexLoginStatus(trustedPath);
1223
+ return {
1224
+ configPath,
1225
+ trustedPath,
1226
+ trusted: false,
1227
+ writeEnabled: false,
1228
+ ...login,
1229
+ };
1230
+ }
1231
+ throw err;
1232
+ }
1233
+ const evaluated = evaluateCodexWriteEnabled({
1234
+ content: current,
1235
+ trustedPath,
1236
+ });
1237
+ const login = await readCodexLoginStatus(trustedPath);
1238
+ return { configPath, trustedPath, ...evaluated, ...login };
1239
+ };
1240
+ const trustWorkspaceInCodexConfig = async (workspaceId) => {
1241
+ const trustedPath = await resolveBuildBotRoot(workspaceId);
1242
+ const configPath = resolveCodexConfigPath(trustedPath);
1243
+ await ensureDir(path.dirname(configPath));
1244
+ let current = "";
1245
+ try {
1246
+ current = await dntShim.Deno.readTextFile(configPath);
1247
+ }
1248
+ catch (err) {
1249
+ if (!(err instanceof dntShim.Deno.errors.NotFound))
1250
+ throw err;
1251
+ }
1252
+ const defaultsApplied = ensureCodexDefaults(current);
1253
+ let updated = defaultsApplied.next;
1254
+ let changed = defaultsApplied.changed;
1255
+ const sectionHeader = `[projects."${toTomlQuoted(trustedPath)}"]`;
1256
+ const sectionStart = updated.indexOf(sectionHeader);
1257
+ if (sectionStart >= 0) {
1258
+ const sectionEndMarker = updated.indexOf("\n[", sectionStart + 1);
1259
+ const sectionEnd = sectionEndMarker >= 0
1260
+ ? sectionEndMarker
1261
+ : updated.length;
1262
+ const section = updated.slice(sectionStart, sectionEnd);
1263
+ const trustedLinePattern = /^\s*trust_level\s*=\s*"trusted"\s*$/m;
1264
+ const trustLevelLinePattern = /^\s*trust_level\s*=\s*"[^"]*"\s*$/m;
1265
+ if (!trustedLinePattern.test(section)) {
1266
+ const nextSection = trustLevelLinePattern.test(section)
1267
+ ? section.replace(trustLevelLinePattern, 'trust_level = "trusted"')
1268
+ : `${section}\ntrust_level = "trusted"`;
1269
+ updated = `${updated.slice(0, sectionStart)}${nextSection}${updated.slice(sectionEnd)}`;
1270
+ changed = true;
1271
+ }
1272
+ }
1273
+ else {
1274
+ const prefix = updated.trim().length === 0
1275
+ ? ""
1276
+ : `${updated.replace(/\s*$/, "")}\n\n`;
1277
+ updated = `${prefix}${sectionHeader}\ntrust_level = "trusted"\n`;
1278
+ changed = true;
1279
+ }
1280
+ if (changed) {
1281
+ await dntShim.Deno.writeTextFile(configPath, updated);
1282
+ }
1283
+ const evaluated = evaluateCodexWriteEnabled({
1284
+ content: updated,
1285
+ trustedPath,
1286
+ });
1287
+ const login = await readCodexLoginStatus(trustedPath);
1288
+ return { configPath, trustedPath, changed, ...evaluated, ...login };
1289
+ };
1066
1290
  const logWorkspaceBotRoot = async (endpoint, workspaceId) => {
1067
1291
  try {
1068
1292
  const root = await resolveBuildBotRoot(workspaceId);
@@ -1137,7 +1361,7 @@ export function startWebSocketSimulator(opts) {
1137
1361
  const entries = [];
1138
1362
  const shouldSkipRelativePath = (relativePath) => {
1139
1363
  const segments = relativePath.split(/\\|\//g).filter(Boolean);
1140
- return segments.includes(".gambit");
1364
+ return segments.includes(".gambit") || segments.includes(".codex");
1141
1365
  };
1142
1366
  const walk = async (dir, relativePrefix) => {
1143
1367
  for await (const entry of dntShim.Deno.readDir(dir)) {
@@ -1795,6 +2019,16 @@ export function startWebSocketSimulator(opts) {
1795
2019
  .replace(/[-_]+/g, " ")
1796
2020
  .trim() || base;
1797
2021
  };
2022
+ const parseDeckMaxTurns = (value) => {
2023
+ if (typeof value !== "number" || !Number.isFinite(value))
2024
+ return undefined;
2025
+ const rounded = Math.round(value);
2026
+ if (rounded < 1)
2027
+ return 1;
2028
+ if (rounded > 200)
2029
+ return 200;
2030
+ return rounded;
2031
+ };
1798
2032
  const buildTestBotSnapshot = (state) => {
1799
2033
  const rawMessages = state.messages ?? [];
1800
2034
  const refs = state.messageRefs ?? [];
@@ -2372,7 +2606,10 @@ export function startWebSocketSimulator(opts) {
2372
2606
  allowRootStringInput: true,
2373
2607
  initialUserMessage: initialUserMessage || undefined,
2374
2608
  responsesMode: opts.responsesMode,
2375
- workerSandbox: opts.workerSandbox,
2609
+ workerSandbox: resolveWorkerSandboxForSignalAwareRun({
2610
+ workerSandbox: opts.workerSandbox,
2611
+ signal: controller.signal,
2612
+ }),
2376
2613
  signal: controller.signal,
2377
2614
  onStateUpdate: (state) => {
2378
2615
  const nextStateWithSource = applyUserMessageRefSource(savedState, state, "scenario");
@@ -2446,7 +2683,10 @@ export function startWebSocketSimulator(opts) {
2446
2683
  allowRootStringInput: true,
2447
2684
  initialUserMessage: userMessage,
2448
2685
  responsesMode: opts.responsesMode,
2449
- workerSandbox: opts.workerSandbox,
2686
+ workerSandbox: resolveWorkerSandboxForSignalAwareRun({
2687
+ workerSandbox: opts.workerSandbox,
2688
+ signal: controller.signal,
2689
+ }),
2450
2690
  signal: controller.signal,
2451
2691
  onStateUpdate: (state) => {
2452
2692
  const nextStateWithSource = applyUserMessageRefSource(savedState, state, "scenario");
@@ -2622,6 +2862,7 @@ export function startWebSocketSimulator(opts) {
2622
2862
  const id = testDeck.id && typeof testDeck.id === "string"
2623
2863
  ? testDeck.id
2624
2864
  : slugify(`${label || "test-deck"}-${index}`);
2865
+ const maxTurns = parseDeckMaxTurns(testDeck.maxTurns);
2625
2866
  return {
2626
2867
  id,
2627
2868
  label: label || id,
@@ -2629,6 +2870,7 @@ export function startWebSocketSimulator(opts) {
2629
2870
  ? testDeck.description
2630
2871
  : undefined,
2631
2872
  path: testDeck.path,
2873
+ ...(maxTurns !== undefined ? { maxTurns } : {}),
2632
2874
  };
2633
2875
  });
2634
2876
  updateTestDeckRegistry(availableTestDecks);
@@ -3061,7 +3303,7 @@ export function startWebSocketSimulator(opts) {
3061
3303
  headers: { "content-type": "application/json" },
3062
3304
  });
3063
3305
  }
3064
- return new Response(JSON.stringify(payload), {
3306
+ return new Response(safeJsonStringify(payload), {
3065
3307
  headers: { "content-type": "application/json" },
3066
3308
  });
3067
3309
  }
@@ -3084,7 +3326,7 @@ export function startWebSocketSimulator(opts) {
3084
3326
  headers: { "content-type": "application/json" },
3085
3327
  });
3086
3328
  }
3087
- return new Response(JSON.stringify(payload), {
3329
+ return new Response(safeJsonStringify(payload), {
3088
3330
  headers: { "content-type": "application/json" },
3089
3331
  });
3090
3332
  }
@@ -3105,7 +3347,7 @@ export function startWebSocketSimulator(opts) {
3105
3347
  headers: { "content-type": "application/json" },
3106
3348
  });
3107
3349
  }
3108
- return new Response(JSON.stringify(payload), {
3350
+ return new Response(safeJsonStringify(payload), {
3109
3351
  headers: { "content-type": "application/json" },
3110
3352
  });
3111
3353
  }
@@ -3198,21 +3440,22 @@ export function startWebSocketSimulator(opts) {
3198
3440
  const startedAt = new Date().toISOString();
3199
3441
  const runId = randomId("cal");
3200
3442
  let entry;
3201
- const upsertCalibrationRun = (state, nextEntry) => {
3202
- const previousRuns = Array.isArray(state.meta?.gradingRuns)
3203
- ? (state.meta
3443
+ const upsertCalibrationRun = (nextEntry) => {
3444
+ const latestState = readSessionState(workspaceId) ?? sessionState;
3445
+ const previousRuns = Array.isArray(latestState.meta?.gradingRuns)
3446
+ ? (latestState.meta
3204
3447
  .gradingRuns)
3205
- : Array.isArray(state.meta?.calibrationRuns)
3206
- ? state.meta?.calibrationRuns
3448
+ : Array.isArray(latestState.meta?.calibrationRuns)
3449
+ ? latestState.meta?.calibrationRuns
3207
3450
  : [];
3208
3451
  const index = previousRuns.findIndex((run) => run.id === nextEntry.id);
3209
3452
  const nextRuns = index >= 0
3210
3453
  ? previousRuns.map((run, i) => (i === index ? nextEntry : run))
3211
3454
  : [...previousRuns, nextEntry];
3212
3455
  const nextState = persistSessionState({
3213
- ...state,
3456
+ ...latestState,
3214
3457
  meta: {
3215
- ...(state.meta ?? {}),
3458
+ ...(latestState.meta ?? {}),
3216
3459
  gradingRuns: nextRuns,
3217
3460
  },
3218
3461
  });
@@ -3235,7 +3478,6 @@ export function startWebSocketSimulator(opts) {
3235
3478
  });
3236
3479
  return nextState;
3237
3480
  };
3238
- let currentState = sessionState;
3239
3481
  try {
3240
3482
  const result = await (async () => {
3241
3483
  if (runMode !== "turns") {
@@ -3250,7 +3492,7 @@ export function startWebSocketSimulator(opts) {
3250
3492
  gradingRunId: runId,
3251
3493
  input: { session: sessionPayload },
3252
3494
  };
3253
- currentState = upsertCalibrationRun(currentState, entry);
3495
+ upsertCalibrationRun(entry);
3254
3496
  return await runDeckWithFallback({
3255
3497
  path: grader.path,
3256
3498
  input: { session: sessionPayload },
@@ -3278,7 +3520,7 @@ export function startWebSocketSimulator(opts) {
3278
3520
  input: { session: sessionPayload },
3279
3521
  result: { mode: "turns", totalTurns, turns: [] },
3280
3522
  };
3281
- currentState = upsertCalibrationRun(currentState, entry);
3523
+ upsertCalibrationRun(entry);
3282
3524
  if (totalTurns === 0) {
3283
3525
  return { mode: "turns", totalTurns, turns: [] };
3284
3526
  }
@@ -3315,7 +3557,7 @@ export function startWebSocketSimulator(opts) {
3315
3557
  ...entry,
3316
3558
  result: { mode: "turns", totalTurns, turns: [...turns] },
3317
3559
  };
3318
- currentState = upsertCalibrationRun(currentState, entry);
3560
+ upsertCalibrationRun(entry);
3319
3561
  }
3320
3562
  return { mode: "turns", totalTurns, turns };
3321
3563
  })();
@@ -3356,7 +3598,7 @@ export function startWebSocketSimulator(opts) {
3356
3598
  error: message,
3357
3599
  };
3358
3600
  }
3359
- const nextState = upsertCalibrationRun(currentState, entry);
3601
+ const nextState = upsertCalibrationRun(entry);
3360
3602
  const sessionMeta = buildSessionMeta(workspaceId, nextState);
3361
3603
  return new Response(JSON.stringify({
3362
3604
  workspaceId,
@@ -3842,7 +4084,7 @@ export function startWebSocketSimulator(opts) {
3842
4084
  registerWorkspace(workspaceRecord);
3843
4085
  }
3844
4086
  const run = startTestBotRun({
3845
- maxTurnsOverride,
4087
+ maxTurnsOverride: maxTurnsOverride ?? botDeckSelection.maxTurns,
3846
4088
  deckInput,
3847
4089
  botInput,
3848
4090
  initialUserMessage,
@@ -4105,6 +4347,10 @@ export function startWebSocketSimulator(opts) {
4105
4347
  stream: shouldStream,
4106
4348
  state: savedState,
4107
4349
  responsesMode: opts.responsesMode,
4350
+ workerSandbox: resolveWorkerSandboxForSignalAwareRun({
4351
+ workerSandbox: opts.workerSandbox,
4352
+ signal: controller.signal,
4353
+ }),
4108
4354
  signal: controller.signal,
4109
4355
  initialUserMessage,
4110
4356
  onStateUpdate: (state) => {
@@ -4529,6 +4775,10 @@ export function startWebSocketSimulator(opts) {
4529
4775
  stream: shouldStream,
4530
4776
  state: entry.state ?? undefined,
4531
4777
  responsesMode: opts.responsesMode,
4778
+ workerSandbox: resolveWorkerSandboxForSignalAwareRun({
4779
+ workerSandbox: opts.workerSandbox,
4780
+ signal: controller.signal,
4781
+ }),
4532
4782
  signal: controller.signal,
4533
4783
  initialUserMessage,
4534
4784
  onStateUpdate: (state) => {
@@ -4657,6 +4907,48 @@ export function startWebSocketSimulator(opts) {
4657
4907
  });
4658
4908
  }
4659
4909
  }
4910
+ if (url.pathname === "/api/codex/trust-workspace") {
4911
+ if (req.method !== "POST" && req.method !== "GET") {
4912
+ return new Response("Method not allowed", { status: 405 });
4913
+ }
4914
+ let workspaceId;
4915
+ if (req.method === "POST") {
4916
+ try {
4917
+ const body = await req.json();
4918
+ if (typeof body.workspaceId === "string") {
4919
+ workspaceId = body.workspaceId;
4920
+ }
4921
+ }
4922
+ catch {
4923
+ // ignore malformed body and fall back to active/default workspace
4924
+ }
4925
+ }
4926
+ else {
4927
+ const queryWorkspaceId = url.searchParams.get("workspaceId");
4928
+ if (queryWorkspaceId && queryWorkspaceId.trim().length > 0) {
4929
+ workspaceId = queryWorkspaceId.trim();
4930
+ }
4931
+ }
4932
+ try {
4933
+ await logWorkspaceBotRoot("/api/codex/trust-workspace", workspaceId);
4934
+ if (req.method === "GET") {
4935
+ const status = await readCodexTrustStatus(workspaceId);
4936
+ return new Response(JSON.stringify({
4937
+ ok: true,
4938
+ ...status,
4939
+ }), { headers: { "content-type": "application/json" } });
4940
+ }
4941
+ const result = await trustWorkspaceInCodexConfig(workspaceId);
4942
+ return new Response(JSON.stringify({
4943
+ ok: true,
4944
+ ...result,
4945
+ }), { headers: { "content-type": "application/json" } });
4946
+ }
4947
+ catch (err) {
4948
+ const message = err instanceof Error ? err.message : String(err);
4949
+ return new Response(JSON.stringify({ ok: false, error: message }), { status: 400, headers: { "content-type": "application/json" } });
4950
+ }
4951
+ }
4660
4952
  if (url.pathname === "/api/build/file") {
4661
4953
  if (req.method !== "GET") {
4662
4954
  return new Response("Method not allowed", { status: 405 });
@@ -5495,6 +5787,15 @@ function simulatorReactHtml(deckPath, deckLabel, opts) {
5495
5787
  normalized === "no" ||
5496
5788
  normalized === "off");
5497
5789
  })();
5790
+ const verifyTabEnabled = (() => {
5791
+ const raw = dntShim.Deno.env.get("GAMBIT_SIMULATOR_VERIFY_TAB");
5792
+ if (raw === undefined)
5793
+ return true;
5794
+ const normalized = raw.trim().toLowerCase();
5795
+ return !(normalized === "0" || normalized === "false" ||
5796
+ normalized === "no" ||
5797
+ normalized === "off");
5798
+ })();
5498
5799
  const chatAccordionEnabled = (() => {
5499
5800
  const raw = dntShim.Deno.env.get("GAMBIT_SIMULATOR_CHAT_ACCORDION");
5500
5801
  if (raw === undefined)
@@ -5546,6 +5847,7 @@ function simulatorReactHtml(deckPath, deckLabel, opts) {
5546
5847
  window.__GAMBIT_DECK_LABEL__ = ${JSON.stringify(safeDeckLabel)};
5547
5848
  window.__GAMBIT_VERSION__ = ${JSON.stringify(gambitVersion)};
5548
5849
  window.__GAMBIT_BUILD_TAB_ENABLED__ = ${JSON.stringify(buildTabEnabled)};
5850
+ window.__GAMBIT_VERIFY_TAB_ENABLED__ = ${JSON.stringify(verifyTabEnabled)};
5549
5851
  window.__GAMBIT_CHAT_ACCORDION_ENABLED__ = ${JSON.stringify(chatAccordionEnabled)};
5550
5852
  window.__GAMBIT_WORKSPACE_ID__ = ${JSON.stringify(workspaceId)};
5551
5853
  window.__GAMBIT_WORKSPACE_ONBOARDING__ = ${JSON.stringify(workspaceOnboarding)};
@@ -5580,7 +5882,19 @@ function shouldRetryWithStringInput(error) {
5580
5882
  }
5581
5883
  return false;
5582
5884
  }
5885
+ function resolveWorkerSandboxForSignalAwareRun(args) {
5886
+ // gambit-core currently rejects worker sandbox runs when an AbortSignal is
5887
+ // supplied. Simulator flows require signals for stop/reset cancellation, so
5888
+ // force in-process execution for those runs.
5889
+ if (args.signal)
5890
+ return false;
5891
+ return args.workerSandbox;
5892
+ }
5583
5893
  async function runDeckWithFallback(args) {
5894
+ const workerSandbox = resolveWorkerSandboxForSignalAwareRun({
5895
+ workerSandbox: args.workerSandbox,
5896
+ signal: args.signal,
5897
+ });
5584
5898
  try {
5585
5899
  return await runDeck({
5586
5900
  path: args.path,
@@ -5594,7 +5908,7 @@ async function runDeckWithFallback(args) {
5594
5908
  stream: args.stream,
5595
5909
  onStreamText: args.onStreamText,
5596
5910
  responsesMode: args.responsesMode,
5597
- workerSandbox: args.workerSandbox,
5911
+ workerSandbox,
5598
5912
  signal: args.signal,
5599
5913
  onCancel: args.onCancel,
5600
5914
  });
@@ -5613,7 +5927,7 @@ async function runDeckWithFallback(args) {
5613
5927
  stream: args.stream,
5614
5928
  onStreamText: args.onStreamText,
5615
5929
  responsesMode: args.responsesMode,
5616
- workerSandbox: args.workerSandbox,
5930
+ workerSandbox,
5617
5931
  signal: args.signal,
5618
5932
  onCancel: args.onCancel,
5619
5933
  });
@@ -1 +1 @@
1
- {"version":3,"file":"server_session_store.d.ts","sourceRoot":"","sources":["../../src/src/server_session_store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server_session_store.d.ts","sourceRoot":"","sources":["../../src/src/server_session_store.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,aAAa,EACb,UAAU,EACV,UAAU,EACX,MAAM,2BAA2B,CAAC;AAEnC,MAAM,MAAM,kBAAkB,GAAG;IAC/B,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,yBAAyB,CAAC,EAAE,MAAM,CAAC;IACnC,kBAAkB,EAAE,MAAM,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;AAE1E,MAAM,MAAM,sBAAsB,GAAG;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,oBAAoB,CAAC;IAC3B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B,CAAC;AAMF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,WAAW,GAAG,OAAO,GAAG,UAAU,CAAC;IAChE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,KAAK,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,EAAE,aAAa,CAAC;QACzB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,cAAc,CAAC,EAAE,OAAO,CAAC;QACzB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KACvC,CAAC,CAAC;IACH,MAAM,CAAC,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;IAC3B,WAAW,CAAC,EAAE,KAAK,CAAC;QAClB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,kBAAkB,CAAC,EAAE,MAAM,CAAC;QAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;KACf,CAAC,CAAC;CACJ,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,GAAG,EAAE,kBAAkB,CAAC;IACxB,KAAK,CAAC,EAAE,UAAU,CAAC;CACpB,CAAC;AAEF,KAAK,gBAAgB,GAAG;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC;IACrC,MAAM,EAAE;QAAE,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,KAAK,IAAI,CAAA;KAAE,CAAC;IACpD,sBAAsB,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK;QAC7C,KAAK,EAAE,UAAU,CAAC;QAClB,GAAG,CAAC,EAAE,MAAM,CAAC;KACd,CAAC;IACF,2BAA2B,EAAE,MAAM,CAAC;IACpC,oBAAoB,EAAE,CACpB,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,GAAG,IAAI,KACxB,MAAM,CAAC;CACb,CAAC;AA6IF,eAAO,MAAM,kBAAkB,GAAI,MAAM,gBAAgB;gCA+DpB,OAAO,KAAG,MAAM,GAAG,SAAS;8CAkSvD,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC5B,kBAAkB,GAAG,IAAI;qCAqMnB,UAAU,aACN,oBAAoB,QACzB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC5B,sBAAsB,GAAG,IAAI;gCAqEvB,UAAU,WACR,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;+BAIzB,UAAU,WACR,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;8BAQzB,UAAU,WACR,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;4BAIzB,UAAU,WACR,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;wCAQnB,MAAM,GAAG,SAAS,WACtB;QACP,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB;iCAqCiC,UAAU,KAAG,UAAU;wCA4F9C,MAAM,SACV;QAAE,UAAU,CAAC,EAAE,OAAO,CAAA;KAAE,KAC9B,UAAU,GAAG,SAAS;kCAwEZ,MAAM,SACV;QAAE,UAAU,CAAC,EAAE,OAAO,CAAA;KAAE,KAC9B,UAAU,GAAG,SAAS;kCAeV,MAAM,KAClB,oBAAoB,GAAG,SAAS;yCArapB,MAAM,aACR,KAAK,CAAC,sBAAsB,CAAC,KACvC,oBAAoB;CA8bxB,CAAC"}
@@ -99,15 +99,18 @@ const normalizeEventType = (type, kind) => {
99
99
  return { canonicalType: `gambit.${type}`, legacyType: type };
100
100
  };
101
101
  const safeStringify = (value, space) => {
102
- const seen = new WeakSet();
103
- return JSON.stringify(value, (_key, candidate) => {
102
+ const stack = [];
103
+ return JSON.stringify(value, function (_key, candidate) {
104
104
  if (!candidate || typeof candidate !== "object") {
105
105
  return candidate;
106
106
  }
107
- if (seen.has(candidate)) {
107
+ while (stack.length > 0 && stack[stack.length - 1] !== this) {
108
+ stack.pop();
109
+ }
110
+ if (stack.includes(candidate)) {
108
111
  return "[Circular]";
109
112
  }
110
- seen.add(candidate);
113
+ stack.push(candidate);
111
114
  return candidate;
112
115
  }, space);
113
116
  };
@@ -4,6 +4,7 @@ export type AvailableTestDeck = {
4
4
  label: string;
5
5
  description?: string;
6
6
  path: string;
7
+ maxTurns?: number;
7
8
  };
8
9
  export type AvailableGraderDeck = {
9
10
  id: string;
@@ -1 +1 @@
1
- {"version":3,"file":"server_types.d.ts","sourceRoot":"","sources":["../../src/src/server_types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server_types.d.ts","sourceRoot":"","sources":["../../src/src/server_types.ts"],"names":[],"mappings":"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"}
@@ -1 +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"}
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,CA2MzB,CAAC"}