Skip to content

Commit 83717f7

Browse files
committed
sync(bfmono): chore(gambit): cut 0.8.6-rc.6 release (+19 more) (bfmono@30be3ea4a)
This PR is an automated gambitmono sync of bfmono Gambit packages. - Source: `packages/gambit/` - Core: `packages/gambit/packages/gambit-core/` - bfmono rev: 30be3ea4a Changes: - 30be3ea4a chore(gambit): cut 0.8.6-rc.6 release - f2d71bbf4 test(gambit): migrate simulator tests off legacy api routes - 4962281c5 fix(gambit-core): preserve legacy builtin schema uris - c17d28d98 fix(gambit-simulator): simplify isograph workbench chat chrome - 6a6e9c994 fix(gambit): degrade workspace deck graphql reads when state is missing - 738d21273 refactor(gambit): drop unused legacy simulator http routes - 58b61f7a1 refactor(gambit): promote simulator canonical isograph routes - 3f84b44c9 refactor(gambit): polish workbench chat intro copy - 739db1cc8 feat(gambit): streamline workbench chat entry flow - 38d0b544f chore(gambit): cut 0.8.6-rc.5 - 8b0bb6555 refactor(gambit): move simulator chats onto transcript entries - 518646809 docs(initiatives): migrate legacy cross-company initiatives - b13651c28 chore(gambit): cut 0.8.6-rc.4 release - 45487928e refactor(gambit): normalize scenario service Maybe types - 19f30c290 test(gambit): verify graphql-owned test feedback refresh - 122b7edc5 feat(simulator-ui): move test feedback authority into isograph - 75187e0de feat(gambit): add graphql test feedback persistence - e42279f65 docs(gambit): add test feedback graphql authority intent - dceb56711 feat(simulator-ui): add deterministic test-tab openresponses demo - c08bebaae test(gambit): verify scenario openresponses projection for chat providers Do not edit this repo directly; make changes in bfmono and re-run the sync.
1 parent 3098e52 commit 83717f7

49 files changed

Lines changed: 1471 additions & 9946 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

CHANGELOG.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
+++
22
[release]
3-
since = "f05d0cfc7e3d566a802d63a4c0ba1c2682b73a5a"
3+
since = "ef96991c5a8958bd264685b0c21ec40e4f0db17b"
44
+++
55

66
# Changelog
@@ -9,6 +9,10 @@ since = "f05d0cfc7e3d566a802d63a4c0ba1c2682b73a5a"
99

1010
- TBD
1111

12+
## v0.8.6-rc.6
13+
14+
- TBD
15+
1216
## v0.8.6-rc.5
1317

1418
- TBD

deno.jsonc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"$schema": "https://deno.land/x/deno/cli/schemas/config-file.v1.json",
33
"name": "@bolt-foundry/gambit",
44
"description": "Agent harness framework for building, running, and verifying LLM workflows in Markdown and code.",
5-
"version": "0.8.6-rc.5",
5+
"version": "0.8.6-rc.6",
66
"license": "Apache-2.0",
77
"repository": {
88
"type": "git",

packages/gambit-core/deno.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@bolt-foundry/gambit-core",
3-
"version": "0.8.6-rc.5",
3+
"version": "0.8.6-rc.6",
44
"description": "Core runtime for Gambit decks.",
55
"license": "Apache-2.0",
66
"repository": {

packages/gambit-core/src/builtins.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ const DECKS_BASE_URL = new URL("../decks/", import.meta.url);
1212

1313
const LEGACY_CARD_WARNINGS = new Set<string>();
1414
const LEGACY_SCHEMA_WARNINGS = new Set<string>();
15+
const LEGACY_SCHEMA_CONTEXT_WARNINGS = new Set<string>();
1516
const LEGACY_DECK_WARNINGS = new Set<string>();
1617
const logger = console;
1718

@@ -49,6 +50,15 @@ export function resolveBuiltinSchemaPath(target: string): string | undefined {
4950
if (!relative) {
5051
throw new Error(`Invalid gambit schema specifier: ${target}`);
5152
}
53+
if (relative.startsWith("contexts/")) {
54+
if (!LEGACY_SCHEMA_CONTEXT_WARNINGS.has(target)) {
55+
LEGACY_SCHEMA_CONTEXT_WARNINGS.add(target);
56+
logger.warn(
57+
`[gambit] "${target}" is deprecated; use gambit://schemas/graders/${relative} instead.`,
58+
);
59+
}
60+
relative = `graders/${relative}`;
61+
}
5262
if (relative.endsWith(".ts") && !relative.endsWith(".zod.ts")) {
5363
if (!LEGACY_SCHEMA_WARNINGS.has(target)) {
5464
LEGACY_SCHEMA_WARNINGS.add(target);

packages/gambit-core/src/markdown.test.ts

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,46 @@ Schema deck.
121121
assertEquals(parsed, { status: 200 });
122122
});
123123

124+
Deno.test("markdown deck resolves legacy gambit://schemas/contexts references", async () => {
125+
const dir = await Deno.makeTempDir();
126+
127+
const deckPath = await writeTempDeck(
128+
dir,
129+
"legacy-context-schema.deck.md",
130+
`+++
131+
label = "legacy-context-schema"
132+
contextSchema = "gambit://schemas/contexts/conversation.zod.ts"
133+
+++
134+
135+
Schema deck.
136+
`,
137+
);
138+
139+
const deck = await loadMarkdownDeck(deckPath);
140+
141+
assert(deck.contextSchema, "expected context schema to resolve");
142+
const parsed = deck.contextSchema.parse({
143+
session: {
144+
messages: [
145+
{
146+
role: "user",
147+
content: "hello",
148+
},
149+
],
150+
},
151+
});
152+
assertEquals(parsed, {
153+
session: {
154+
messages: [
155+
{
156+
role: "user",
157+
content: "hello",
158+
},
159+
],
160+
},
161+
});
162+
});
163+
124164
Deno.test("markdown deck resolves tool-call-aware grader context schema", async () => {
125165
const dir = await Deno.makeTempDir();
126166

simulator-ui/__demos__/flows/workspace-tab-flows.ts

Lines changed: 8 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,9 @@ export async function ensureWorkspaceBuildPath(
1414
wait,
1515
(pathname) =>
1616
pathname === "/" ||
17-
pathname === "/isograph" ||
18-
pathname === "/isograph/" ||
1917
pathname === "/workspaces" ||
2018
pathname === "/workspaces/new" ||
21-
pathname === "/isograph/workspaces" ||
22-
pathname === "/isograph/workspaces/new" ||
23-
/^\/isograph\/workspaces\/[^/]+\/build(?:\/.*)?$/.test(pathname),
19+
/^\/workspaces\/[^/]+\/build(?:\/.*)?$/.test(pathname),
2420
10_000,
2521
{ label: "simulator load", logEveryMs: 250 },
2622
);
@@ -43,9 +39,7 @@ export async function ensureWorkspaceBuildPath(
4339
wait,
4440
(pathname) =>
4541
pathname === "/workspaces" ||
46-
pathname === "/workspaces/new" ||
47-
pathname === "/isograph/workspaces" ||
48-
pathname === "/isograph/workspaces/new",
42+
pathname === "/workspaces/new",
4943
10_000,
5044
{ label: "workspaces landing", logEveryMs: 250 },
5145
);
@@ -60,8 +54,7 @@ export async function ensureWorkspaceBuildPath(
6054
return await waitForPath(
6155
demoTarget,
6256
wait,
63-
(pathname) =>
64-
/^\/isograph\/workspaces\/[^/]+\/build(?:\/.*)?$/.test(pathname),
57+
(pathname) => /^\/workspaces\/[^/]+\/build(?:\/.*)?$/.test(pathname),
6558
20_000,
6659
{ label: "build tab load", logEveryMs: 250 },
6760
);
@@ -112,8 +105,7 @@ export async function runTestSmokeFlow(
112105
const testPath = await waitForPath(
113106
demoTarget,
114107
wait,
115-
(pathname) =>
116-
/^\/isograph\/workspaces\/[^/]+\/test(?:\/[^/]+)?$/.test(pathname),
108+
(pathname) => /^\/workspaces\/[^/]+\/test(?:\/[^/]+)?$/.test(pathname),
117109
10_000,
118110
{ label: "test tab load", logEveryMs: 250 },
119111
);
@@ -131,7 +123,7 @@ export async function runTestSmokeFlow(
131123
const testRunPath = await waitForPath(
132124
demoTarget,
133125
wait,
134-
(pathname) => /^\/isograph\/workspaces\/[^/]+\/test\/[^/]+$/.test(pathname),
126+
(pathname) => /^\/workspaces\/[^/]+\/test\/[^/]+$/.test(pathname),
135127
40_000,
136128
{ label: "test run path", logEveryMs: 250 },
137129
);
@@ -149,8 +141,7 @@ export async function runGradeSmokeFlow(
149141
await waitForPath(
150142
demoTarget,
151143
wait,
152-
(pathname) =>
153-
/^\/isograph\/workspaces\/[^/]+\/grade(?:\/[^/]+)?$/.test(pathname),
144+
(pathname) => /^\/workspaces\/[^/]+\/grade(?:\/[^/]+)?$/.test(pathname),
154145
10_000,
155146
{ label: "grade tab load", logEveryMs: 250 },
156147
);
@@ -161,8 +152,7 @@ export async function runGradeSmokeFlow(
161152
const gradeRunPath = await waitForPath(
162153
demoTarget,
163154
wait,
164-
(pathname) =>
165-
/^\/isograph\/workspaces\/[^/]+\/grade\/[^/]+$/.test(pathname),
155+
(pathname) => /^\/workspaces\/[^/]+\/grade\/[^/]+$/.test(pathname),
166156
60_000,
167157
{ label: "grade run deep-link", logEveryMs: 500 },
168158
);
@@ -183,7 +173,7 @@ export async function runVerifySmokeFlow(
183173
const verifyPath = await waitForPath(
184174
demoTarget,
185175
wait,
186-
(pathname) => /^\/isograph\/workspaces\/[^/]+\/verify$/.test(pathname),
176+
(pathname) => /^\/workspaces\/[^/]+\/verify$/.test(pathname),
187177
15_000,
188178
{ label: "verify tab load", logEveryMs: 250 },
189179
);

simulator-ui/__demos__/run-build-tab-demo.ts

Lines changed: 37 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,11 @@ async function main(): Promise<void> {
3838
async ({ demoTarget, screenshot, wait }) => {
3939
const sendBuildPrompt = async (
4040
prompt: string,
41-
userBubbleText = prompt,
4241
): Promise<void> => {
42+
const userBubbles = demoTarget.locator(
43+
'.imessage-bubble[title="user"]',
44+
);
45+
const userBubbleCountBefore = await userBubbles.count();
4346
await demoTarget.locator('[data-testid="build-chat-input"]').fill(
4447
prompt,
4548
);
@@ -50,18 +53,40 @@ async function main(): Promise<void> {
5053
timeout: 120_000,
5154
});
5255
await sendButton.click();
53-
await demoTarget.locator('.imessage-bubble[title="user"]', {
54-
hasText: userBubbleText,
55-
}).waitFor({
56-
timeout: 20_000,
56+
await demoTarget.locator('[data-testid="build-chat-input"]').evaluate(
57+
(element) => {
58+
if (!(element instanceof HTMLTextAreaElement)) {
59+
throw new Error("Expected build chat input textarea.");
60+
}
61+
return element.value;
62+
},
63+
).then((value) => {
64+
if (typeof value !== "string") {
65+
throw new Error("Expected build chat input value.");
66+
}
5767
});
68+
const acceptedStart = Date.now();
69+
while (Date.now() - acceptedStart < 20_000) {
70+
const currentUserBubbleCount = await userBubbles.count();
71+
const draftValue = await demoTarget.locator(
72+
'[data-testid="build-chat-input"]',
73+
).evaluate((element) =>
74+
element instanceof HTMLTextAreaElement ? element.value : ""
75+
);
76+
if (
77+
currentUserBubbleCount > userBubbleCountBefore ||
78+
draftValue.trim().length === 0
79+
) {
80+
return;
81+
}
82+
await wait(250);
83+
}
84+
throw new Error(
85+
`Timed out waiting for build prompt to be accepted: ${prompt}`,
86+
);
5887
};
5988

60-
const normalizeWorkspacePath = (pathname: string): string => {
61-
return pathname.startsWith("/isograph/")
62-
? pathname.slice("/isograph".length)
63-
: pathname;
64-
};
89+
const normalizeWorkspacePath = (pathname: string): string => pathname;
6590
const isWorkspaceBuildPath = (pathname: string): boolean =>
6691
/^\/workspaces\/[^/]+\/build(?:\/.*)?$/.test(
6792
normalizeWorkspacePath(pathname),
@@ -72,12 +97,8 @@ async function main(): Promise<void> {
7297
wait,
7398
(pathname) =>
7499
pathname === "/" ||
75-
pathname === "/isograph" ||
76-
pathname === "/isograph/" ||
77100
pathname === "/workspaces" ||
78101
pathname === "/workspaces/new" ||
79-
pathname === "/isograph/workspaces" ||
80-
pathname === "/isograph/workspaces/new" ||
81102
isWorkspaceBuildPath(pathname),
82103
5_000,
83104
{ label: "simulator load", logEveryMs: 250 },
@@ -101,9 +122,7 @@ async function main(): Promise<void> {
101122
wait,
102123
(pathname) =>
103124
pathname === "/workspaces" ||
104-
pathname === "/workspaces/new" ||
105-
pathname === "/isograph/workspaces" ||
106-
pathname === "/isograph/workspaces/new",
125+
pathname === "/workspaces/new",
107126
10_000,
108127
{ label: "workspaces landing", logEveryMs: 250 },
109128
);
@@ -158,7 +177,6 @@ async function main(): Promise<void> {
158177
const refreshMarker = `refresh-marker-${Date.now()}`;
159178
await sendBuildPrompt(
160179
`${updateModelPrompt} and include a single line "${refreshMarker}"`,
161-
"please update the root PROMPT.md model",
162180
);
163181
await demoTarget.locator(".build-file-preview", {
164182
hasText: "openai/gpt-5.1-chat",
@@ -220,7 +238,7 @@ async function main(): Promise<void> {
220238
{
221239
slug: Deno.env.get("GAMBIT_DEMO_SLUG")?.trim() ||
222240
"gambit-build-tab-demo",
223-
iframeTargetPath: "/isograph",
241+
iframeTargetPath: "/",
224242
server: {
225243
cwd: serveRoot,
226244
command: (targetPort: number) => [

simulator-ui/__demos__/run-full-demo.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -56,19 +56,19 @@ async function main(): Promise<void> {
5656
);
5757
await screenshot("04-test-tab");
5858

59-
if (!buildPath.startsWith("/isograph/workspaces/")) {
59+
if (!buildPath.startsWith("/workspaces/")) {
6060
throw new Error(`Unexpected build path: ${buildPath}`);
6161
}
62-
if (!testPath.startsWith("/isograph/workspaces/")) {
62+
if (!testPath.startsWith("/workspaces/")) {
6363
throw new Error(`Unexpected test path: ${testPath}`);
6464
}
65-
if (!testRunPath.startsWith("/isograph/workspaces/")) {
65+
if (!testRunPath.startsWith("/workspaces/")) {
6666
throw new Error(`Unexpected test run path: ${testRunPath}`);
6767
}
6868

6969
const gradeRunPath = await runGradeSmokeFlow(demoTarget, wait);
7070
await screenshot("05-grade-tab");
71-
if (!gradeRunPath.startsWith("/isograph/workspaces/")) {
71+
if (!gradeRunPath.startsWith("/workspaces/")) {
7272
throw new Error(`Unexpected grade run path: ${gradeRunPath}`);
7373
}
7474

@@ -92,7 +92,7 @@ async function main(): Promise<void> {
9292
demoTarget,
9393
wait,
9494
(pathname) =>
95-
/^\/isograph\/workspaces\/[^/]+\/grade(?:\/[^/]+)?$/.test(pathname),
95+
/^\/workspaces\/[^/]+\/grade(?:\/[^/]+)?$/.test(pathname),
9696
15_000,
9797
{ label: "grade return", logEveryMs: 250 },
9898
);
@@ -102,7 +102,7 @@ async function main(): Promise<void> {
102102
},
103103
{
104104
slug: Deno.env.get("GAMBIT_DEMO_SLUG")?.trim() || "gambit-full-demo",
105-
iframeTargetPath: "/isograph",
105+
iframeTargetPath: "/",
106106
server: {
107107
cwd: serveRoot,
108108
command: (targetPort: number) => [

0 commit comments

Comments
 (0)