@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.
- package/CHANGELOG.md +40 -2
- package/README.md +16 -7
- package/esm/_dnt.polyfills.d.ts +7 -7
- package/esm/_dnt.polyfills.d.ts.map +1 -1
- package/esm/_dnt.polyfills.js +14 -13
- package/esm/deps/jsr.io/@std/path/1.1.4/constants.d.ts +1 -1
- package/esm/gambit/simulator-ui/dist/bundle.js +2464 -380
- package/esm/gambit/simulator-ui/dist/bundle.js.map +4 -4
- package/esm/src/providers/codex.d.ts.map +1 -1
- package/esm/src/providers/codex.js +5 -1
- package/esm/src/providers/ollama.d.ts.map +1 -1
- package/esm/src/providers/ollama.js +57 -0
- package/esm/src/providers/openrouter.d.ts.map +1 -1
- package/esm/src/providers/openrouter.js +75 -1
- package/esm/src/server.d.ts.map +1 -1
- package/esm/src/server.js +346 -32
- package/esm/src/server_session_store.d.ts.map +1 -1
- package/esm/src/server_session_store.js +7 -4
- package/esm/src/server_types.d.ts +1 -0
- package/esm/src/server_types.d.ts.map +1 -1
- package/esm/src/server_ui_routes.d.ts.map +1 -1
- package/esm/src/server_ui_routes.js +3 -0
- package/esm/src/workspace.d.ts.map +1 -1
- package/esm/src/workspace.js +0 -2
- package/esm/src/workspace_contract.d.ts +1 -1
- package/esm/src/workspace_contract.d.ts.map +1 -1
- package/esm/src/workspace_contract.js +2 -1
- package/package.json +2 -2
- package/script/_dnt.polyfills.d.ts +7 -7
- package/script/_dnt.polyfills.d.ts.map +1 -1
- package/script/_dnt.polyfills.js +14 -13
- package/script/deps/jsr.io/@std/path/1.1.4/constants.d.ts +1 -1
- package/script/gambit/simulator-ui/dist/bundle.js +2464 -380
- package/script/gambit/simulator-ui/dist/bundle.js.map +4 -4
- package/script/src/providers/codex.d.ts.map +1 -1
- package/script/src/providers/codex.js +5 -1
- package/script/src/providers/ollama.d.ts.map +1 -1
- package/script/src/providers/ollama.js +57 -0
- package/script/src/providers/openrouter.d.ts.map +1 -1
- package/script/src/providers/openrouter.js +75 -1
- package/script/src/server.d.ts.map +1 -1
- package/script/src/server.js +346 -32
- package/script/src/server_session_store.d.ts.map +1 -1
- package/script/src/server_session_store.js +7 -4
- package/script/src/server_types.d.ts +1 -0
- package/script/src/server_types.d.ts.map +1 -1
- package/script/src/server_ui_routes.d.ts.map +1 -1
- package/script/src/server_ui_routes.js +3 -0
- package/script/src/workspace.d.ts.map +1 -1
- package/script/src/workspace.js +0 -2
- package/script/src/workspace_contract.d.ts +1 -1
- package/script/src/workspace_contract.d.ts.map +1 -1
- 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:
|
|
832
|
-
id: item.id ?? `
|
|
833
|
-
|
|
834
|
-
|
|
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:
|
|
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:
|
|
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(
|
|
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(
|
|
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(
|
|
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 = (
|
|
3202
|
-
const
|
|
3203
|
-
|
|
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(
|
|
3206
|
-
?
|
|
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
|
-
...
|
|
3456
|
+
...latestState,
|
|
3214
3457
|
meta: {
|
|
3215
|
-
...(
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
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
|
|
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
|
|
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":"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;
|
|
1
|
+
{"version":3,"file":"server_session_store.d.ts","sourceRoot":"","sources":["../../src/src/server_session_store.ts"],"names":[],"mappings":"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"}
|
|
@@ -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
|
|
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
|
-
|
|
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
|
-
|
|
113
|
+
stack.push(candidate);
|
|
111
114
|
return candidate;
|
|
112
115
|
}, space);
|
|
113
116
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server_types.d.ts","sourceRoot":"","sources":["../../src/src/server_types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAExE,MAAM,MAAM,iBAAiB,GAAG;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;
|
|
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,
|
|
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"}
|