Skip to content

Commit c171b79

Browse files
committed
sync(bfmono): chore(gambit): cut 0.8.6-rc.7 release (+19 more) (bfmono@29c7ebc15)
This PR is an automated gambitmono sync of bfmono Gambit packages. - Source: `packages/gambit/` - Core: `packages/gambit/packages/gambit-core/` - bfmono rev: 29c7ebc15 Changes: - 29c7ebc15 chore(gambit): cut 0.8.6-rc.7 release - fc2b3e06d fix(gambit): remove dead legacy simulator UI paths - 44c4f7694 test(simulator-ui): prove test feedback chips in workbench demo - 88db0014b feat(simulator-ui): add test feedback chips to workbench - bfe36d614 fix(simulator-ui): preserve grade flag reasons in workbench chips - 5c086e843 test(simulator-ui): add explicit prompt to grade chip demo - b248de0ed test(simulator-ui): send grade chip through workbench demo - fcd572953 test(simulator-ui): capture workbench chip demo flows - 16def2f4f test(simulator-ui): cover workbench chip transport - f156e0533 feat(simulator-ui): wire workbench chips through isograph pages - e420d9dbb feat(simulator-ui): add shared workbench chip state - 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 Do not edit this repo directly; make changes in bfmono and re-run the sync.
1 parent 846d5eb commit c171b79

55 files changed

Lines changed: 2067 additions & 7881 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 = "ef96991c5a8958bd264685b0c21ec40e4f0db17b"
3+
since = "71cdddc2e7c84e60f9ec674ffea7dfb600a6fc86"
44
+++
55

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

1010
- TBD
1111

12+
## v0.8.6-rc.7
13+
14+
- TBD
15+
1216
## v0.8.6-rc.6
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.6",
5+
"version": "0.8.6-rc.7",
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.6",
3+
"version": "0.8.6-rc.7",
44
"description": "Core runtime for Gambit decks.",
55
"license": "Apache-2.0",
66
"repository": {

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

Lines changed: 96 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,53 @@ async function runWithTempServeRoot(
1919
}
2020
}
2121

22+
async function ensureWorkbenchDrawerVisible(
23+
demoTarget: {
24+
locator: (selector: string) => {
25+
count(): Promise<number>;
26+
first(): { isVisible(): Promise<boolean> };
27+
click(): Promise<void>;
28+
waitFor(args?: { timeout?: number }): Promise<void>;
29+
};
30+
},
31+
): Promise<void> {
32+
const drawer = demoTarget.locator(".workbench-drawer-docked");
33+
if (await drawer.count() > 0 && await drawer.first().isVisible()) {
34+
return;
35+
}
36+
await demoTarget.locator('[data-testid="nav-workbench"]').click();
37+
await drawer.waitFor({ timeout: 10_000 });
38+
}
39+
40+
async function waitForAssistantWorkbenchReply(
41+
demoTarget: {
42+
locator: (selector: string, options?: { hasText?: string }) => {
43+
count(): Promise<number>;
44+
first(): {
45+
waitFor(args?: { timeout?: number }): Promise<void>;
46+
textContent(): Promise<string | null>;
47+
};
48+
};
49+
},
50+
wait: (ms: number) => Promise<void>,
51+
): Promise<void> {
52+
const assistantBubbles = demoTarget.locator(
53+
".workbench-drawer-docked .imessage-row.left .imessage-bubble.left",
54+
);
55+
const deadline = Date.now() + 120_000;
56+
while (Date.now() < deadline) {
57+
const count = await assistantBubbles.count();
58+
if (count > 0) {
59+
const text = await assistantBubbles.first().textContent().catch(() => "");
60+
if (typeof text === "string" && text.trim().length > 0) {
61+
return;
62+
}
63+
}
64+
await wait(500);
65+
}
66+
throw new Error("Timed out waiting for a Workbench assistant response.");
67+
}
68+
2269
async function main(): Promise<void> {
2370
const moduleDir = path.dirname(path.fromFileUrl(import.meta.url));
2471
const repoRoot = path.resolve(moduleDir, "..", "..", "..", "..");
@@ -30,6 +77,9 @@ async function main(): Promise<void> {
3077
await runE2e(
3178
"gambit grade tab demo",
3279
async ({ demoTarget, screenshot, wait }) => {
80+
await demoTarget.evaluate(() => {
81+
globalThis.localStorage?.setItem("gambit:build-chat-debug", "true");
82+
});
3383
await waitForPath(
3484
demoTarget,
3585
wait,
@@ -42,21 +92,31 @@ async function main(): Promise<void> {
4292
{ label: "simulator load", logEveryMs: 250 },
4393
);
4494

45-
await demoTarget.locator('[data-testid="nav-workspaces"]').waitFor({
46-
timeout: 10_000,
47-
});
48-
await demoTarget.locator('[data-testid="nav-workspaces"]').click();
49-
await waitForPath(
50-
demoTarget,
51-
wait,
52-
(pathname) =>
53-
pathname === "/workspaces" || pathname === "/workspaces/new",
54-
5_000,
55-
{ label: "workspaces landing", logEveryMs: 250 },
95+
const createWorkspaceCta = demoTarget.locator(
96+
'[data-testid="workspace-create-cta"]',
5697
);
98+
if (await createWorkspaceCta.count() > 0) {
99+
await createWorkspaceCta.first().waitFor({
100+
timeout: 10_000,
101+
});
102+
await createWorkspaceCta.first().click();
103+
} else {
104+
await demoTarget.locator('[data-testid="nav-workspaces"]').waitFor({
105+
timeout: 10_000,
106+
});
107+
await demoTarget.locator('[data-testid="nav-workspaces"]').click();
108+
await waitForPath(
109+
demoTarget,
110+
wait,
111+
(pathname) =>
112+
pathname === "/workspaces" || pathname === "/workspaces/new",
113+
5_000,
114+
{ label: "workspaces landing", logEveryMs: 250 },
115+
);
57116

58-
await demoTarget.locator('[data-testid="workspace-create-cta"]')
59-
.click();
117+
await demoTarget.locator('[data-testid="workspace-create-cta"]')
118+
.click();
119+
}
60120
const buildPath = await waitForPath(
61121
demoTarget,
62122
wait,
@@ -149,11 +209,33 @@ async function main(): Promise<void> {
149209
await runReason.waitFor({ timeout: 10_000 });
150210
await screenshot("04-grade-flagged");
151211

212+
await runBody.locator('[data-testid="grade-flag-add-to-chat"]').first()
213+
.click();
214+
await ensureWorkbenchDrawerVisible(demoTarget);
215+
await demoTarget.locator('[data-testid="build-composer-chip-row"]')
216+
.waitFor({
217+
timeout: 10_000,
218+
});
219+
await screenshot("05-grade-chip-added-to-workbench");
220+
221+
await demoTarget.locator('[data-testid="build-chat-input"]').fill(
222+
"what flagged reason did they leave",
223+
);
224+
await demoTarget.locator('[data-testid="build-send"]:not([disabled])')
225+
.waitFor({
226+
timeout: 15_000,
227+
});
228+
await demoTarget.locator('[data-testid="build-send"]:not([disabled])')
229+
.click();
230+
await waitForAssistantWorkbenchReply(demoTarget, wait);
231+
await screenshot("06-grade-chip-sent-response");
232+
152233
await runBody.locator('button:has-text("Flagged")').first().click();
153234
await runBody.locator('button:has-text("Flag")').first().waitFor({
154235
timeout: 10_000,
155236
});
156-
await screenshot("05-grade-unflagged");
237+
await screenshot("07-grade-unflagged");
238+
await wait(2_000);
157239

158240
const finalPath = await demoTarget.evaluate(() =>
159241
globalThis.location.pathname

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

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,53 @@ async function waitForFeedbackReason(
7676
}, timeoutMs);
7777
}
7878

79+
async function ensureWorkbenchDrawerVisible(
80+
demoTarget: {
81+
locator: (selector: string) => {
82+
count(): Promise<number>;
83+
first(): { isVisible(): Promise<boolean> };
84+
click(): Promise<void>;
85+
waitFor(args?: { timeout?: number }): Promise<void>;
86+
};
87+
},
88+
): Promise<void> {
89+
const drawer = demoTarget.locator(".workbench-drawer-docked");
90+
if (await drawer.count() > 0 && await drawer.first().isVisible()) {
91+
return;
92+
}
93+
await demoTarget.locator('[data-testid="nav-workbench"]').click();
94+
await drawer.waitFor({ timeout: 10_000 });
95+
}
96+
97+
async function waitForAssistantWorkbenchReply(
98+
demoTarget: {
99+
locator: (selector: string, options?: { hasText?: string }) => {
100+
count(): Promise<number>;
101+
first(): {
102+
waitFor(args?: { timeout?: number }): Promise<void>;
103+
textContent(): Promise<string | null>;
104+
};
105+
};
106+
},
107+
wait: (ms: number) => Promise<void>,
108+
): Promise<void> {
109+
const assistantBubbles = demoTarget.locator(
110+
".workbench-drawer-docked .imessage-row.left .imessage-bubble.left",
111+
);
112+
const deadline = Date.now() + 120_000;
113+
while (Date.now() < deadline) {
114+
const count = await assistantBubbles.count();
115+
if (count > 0) {
116+
const text = await assistantBubbles.first().textContent().catch(() => "");
117+
if (typeof text === "string" && text.trim().length > 0) {
118+
return;
119+
}
120+
}
121+
await wait(500);
122+
}
123+
throw new Error("Timed out waiting for a Workbench assistant response.");
124+
}
125+
79126
async function installLegacyFeedbackRouteMonitor(
80127
demoTarget: {
81128
addInitScript?: (script: () => void) => Promise<void>;
@@ -407,6 +454,9 @@ async function main(): Promise<void> {
407454
await runE2e(
408455
"gambit test tab demo",
409456
async ({ demoTarget, screenshot, wait }) => {
457+
await demoTarget.evaluate(() => {
458+
globalThis.localStorage?.setItem("gambit:build-chat-debug", "true");
459+
});
410460
await installLegacyFeedbackRouteMonitor(demoTarget);
411461
const normalizeWorkspacePath = (pathname: string): string => pathname;
412462
const isWorkspaceBuildPath = (pathname: string): boolean =>
@@ -803,6 +853,29 @@ async function main(): Promise<void> {
803853
}
804854
await screenshot("06-test-feedback-after-refresh");
805855

856+
await followupAssistantBubble.locator(
857+
'[data-testid="feedback-add-to-chat"]',
858+
).click();
859+
await ensureWorkbenchDrawerVisible(demoTarget);
860+
await demoTarget.locator('[data-testid="build-composer-chip-row"]')
861+
.waitFor({
862+
timeout: 10_000,
863+
});
864+
await screenshot("07-test-feedback-chip-added-to-workbench");
865+
866+
await demoTarget.locator('[data-testid="build-chat-input"]').fill(
867+
"do you see what feedback they left",
868+
);
869+
await demoTarget.locator('[data-testid="build-send"]:not([disabled])')
870+
.waitFor({
871+
timeout: 15_000,
872+
});
873+
await demoTarget.locator('[data-testid="build-send"]:not([disabled])')
874+
.click();
875+
await waitForAssistantWorkbenchReply(demoTarget, wait);
876+
await screenshot("08-test-feedback-chip-sent-response");
877+
await wait(2_000);
878+
806879
logTestTabDemo("demo-complete", {
807880
workspaceId: ids.workspaceId,
808881
runId: ids.runId,

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

Lines changed: 55 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,24 @@ async function runWithTempServeRoot(
1919
}
2020
}
2121

22+
async function ensureWorkbenchDrawerVisible(
23+
demoTarget: {
24+
locator: (selector: string) => {
25+
count(): Promise<number>;
26+
first(): { isVisible(): Promise<boolean> };
27+
click(): Promise<void>;
28+
waitFor(args?: { timeout?: number }): Promise<void>;
29+
};
30+
},
31+
): Promise<void> {
32+
const drawer = demoTarget.locator(".workbench-drawer-docked");
33+
if (await drawer.count() > 0 && await drawer.first().isVisible()) {
34+
return;
35+
}
36+
await demoTarget.locator('[data-testid="nav-workbench"]').click();
37+
await drawer.waitFor({ timeout: 10_000 });
38+
}
39+
2240
async function main(): Promise<void> {
2341
const moduleDir = path.dirname(path.fromFileUrl(import.meta.url));
2442
const repoRoot = path.resolve(moduleDir, "..", "..", "..", "..");
@@ -42,21 +60,31 @@ async function main(): Promise<void> {
4260
{ label: "simulator load", logEveryMs: 250 },
4361
);
4462

45-
await demoTarget.locator('[data-testid="nav-workspaces"]').waitFor({
46-
timeout: 10_000,
47-
});
48-
await demoTarget.locator('[data-testid="nav-workspaces"]').click();
49-
await waitForPath(
50-
demoTarget,
51-
wait,
52-
(pathname) =>
53-
pathname === "/workspaces" || pathname === "/workspaces/new",
54-
5_000,
55-
{ label: "workspaces landing", logEveryMs: 250 },
63+
const createWorkspaceCta = demoTarget.locator(
64+
'[data-testid="workspace-create-cta"]',
5665
);
66+
if (await createWorkspaceCta.count() > 0) {
67+
await createWorkspaceCta.first().waitFor({
68+
timeout: 10_000,
69+
});
70+
await createWorkspaceCta.first().click();
71+
} else {
72+
await demoTarget.locator('[data-testid="nav-workspaces"]').waitFor({
73+
timeout: 10_000,
74+
});
75+
await demoTarget.locator('[data-testid="nav-workspaces"]').click();
76+
await waitForPath(
77+
demoTarget,
78+
wait,
79+
(pathname) =>
80+
pathname === "/workspaces" || pathname === "/workspaces/new",
81+
5_000,
82+
{ label: "workspaces landing", logEveryMs: 250 },
83+
);
5784

58-
await demoTarget.locator('[data-testid="workspace-create-cta"]')
59-
.click();
85+
await demoTarget.locator('[data-testid="workspace-create-cta"]')
86+
.click();
87+
}
6088
await waitForPath(
6189
demoTarget,
6290
wait,
@@ -185,6 +213,19 @@ async function main(): Promise<void> {
185213
}
186214
await screenshot("03-verify-batch-complete");
187215

216+
await demoTarget.locator('[data-testid="verify-outlier-add-to-chat"]')
217+
.first()
218+
.waitFor({ timeout: 15_000 });
219+
await demoTarget.locator('[data-testid="verify-outlier-add-to-chat"]')
220+
.first()
221+
.click();
222+
await ensureWorkbenchDrawerVisible(demoTarget);
223+
await demoTarget.locator('[data-testid="build-composer-chip-row"]')
224+
.waitFor({
225+
timeout: 10_000,
226+
});
227+
await screenshot("04-verify-chip-added-to-workbench");
228+
188229
const firstRunLink = requestRows.locator("a").first();
189230
if (await firstRunLink.count() > 0) {
190231
await firstRunLink.click();
@@ -195,7 +236,7 @@ async function main(): Promise<void> {
195236
30_000,
196237
{ label: "verify request grade deep-link", logEveryMs: 500 },
197238
);
198-
await screenshot("04-verify-open-grade-run");
239+
await screenshot("05-verify-open-grade-run");
199240
}
200241
},
201242
{

simulator-ui/__generated__/__isograph/Query/EntrypointSimulatorGradePage/normalization_ast.ts

Lines changed: 5 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

simulator-ui/__generated__/__isograph/Query/EntrypointSimulatorGradePage/query_text.ts

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)