Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
fa1b27b
fix(mobile): style inline code with the app mono face (#6631)
TolgaCinisli Sep 8, 2026
86c189e
fix(buzz-acp): wake held ACP threads and fence forked sessions (#7340)
salman1993 Sep 8, 2026
cd54e26
fix(agent): route GPT-5+ model-service FQNs to Responses (#7358)
baxen Sep 8, 2026
44316ff
feat(mesh): upgrade to mesh-llm 0.76.0-rc8 and recommend Qwen3.8 27B …
micspiral Sep 8, 2026
218633b
fix(link-preview): keep composer fetches user-paced (#7211)
tellaho Sep 8, 2026
c045321
fix(acp): pace targeted overflow recovery on consumer capacity (#7325)
loganj Sep 8, 2026
93761e4
fix(mobile): render push notification sender identity as npub (#7494)
loganj Sep 9, 2026
bfc3848
fix(desktop): shared npub identity foundation (canonicalNpub, PubKey …
loganj Sep 9, 2026
27c62be
[lenny] merge: integrate upstream block/main bfc3848558 into product/…
mfethe1 Sep 9, 2026
ee2988c
test(mobile): match SDK font filename case
mfethe1 Sep 7, 2026
ad2a841
fix(desktop): npub identity displays for mention, member, and workflo…
loganj Sep 9, 2026
2226b6f
fix(desktop): npub identity controls across profile, agents, and work…
loganj Sep 9, 2026
82656ff
fix(mobile): standardize public-key identity display on npub (#7493)
loganj Sep 9, 2026
908e07b
[lenny] merge: integrate upstream block/main 82656ffea0 into product/…
mfethe1 Sep 9, 2026
ac55660
test(mobile): align fork identity fixtures with upstream npub labels
mfethe1 Sep 9, 2026
ad9591c
fix(desktop): order unnamed roster members by full canonical npub (#7…
loganj Sep 9, 2026
12023a3
fix(desktop): require a Codex adapter with Astra support (#7427)
sbddesign Sep 9, 2026
051c3a2
fix(buzz-acp): report missing models without retrying (#7538)
ngthuydiem Sep 9, 2026
ae5f003
[lenny] merge: integrate upstream block/main 051c3a270b (3 commits: #…
mfethe1 Sep 10, 2026
a0b2d0a
Merge remote-tracking branch 'origin/product/main' into integration/u…
mfethe1 Sep 12, 2026
4c1d2d1
[lenny] fix(deps): sync Cargo.lock with merged Cargo.toml manifests
mfethe1 Sep 12, 2026
4cd9563
[lenny] fix(mobile): dart format thread_summarize_action_test
mfethe1 Sep 14, 2026
7599722
[lenny] fix(deps): bump rustls 0.23.42 -> 0.23.45 for RUSTSEC-2026-0285
mfethe1 Sep 14, 2026
6ffdbd8
test(desktop): scope e2e text locators past the timeline aria-live re…
Sep 14, 2026
ec40ffe
Merge branch 'product/main' into integration/upstream-bfc3848558
mfethe1 Sep 14, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 15 additions & 1 deletion .github/workflows/_ci-clients.yml
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,10 @@ jobs:
key: ${{ runner.os }}-hermit-cache-${{ steps.hermit-bin-hash.outputs.hash }}
restore-keys: ${{ runner.os }}-hermit-cache-
- name: Prime Flutter SDK
run: flutter --version
run: |
flutter --version
flutter --version --machine > "$RUNNER_TEMP/mobile-flutter-version.json"
printf '%s\n' "$GITHUB_SHA" > "$RUNNER_TEMP/mobile-tested-sha.txt"
- name: Save Hermit package cache
if: always() && steps.hermit-cache.outputs.cache-hit != 'true'
uses: actions/cache/save@caa296126883cff596d87d8935842f9db880ef25 # v5
Expand Down Expand Up @@ -112,6 +115,17 @@ jobs:
run: cd mobile && flutter analyze
- name: Test
run: cd mobile && flutter test
- name: Upload mobile failure evidence
if: ${{ failure() }}
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
with:
name: mobile-failures-${{ github.run_id }}-${{ github.run_attempt }}
path: |
mobile/test/**/failures/*.png
${{ runner.temp }}/mobile-flutter-version.json
${{ runner.temp }}/mobile-tested-sha.txt
if-no-files-found: error
retention-days: 7
- name: Build Android debug APK
run: just mobile-build-android

Expand Down
28 changes: 21 additions & 7 deletions desktop/tests/e2e/thread-reply-anchor-roleplay.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -202,8 +202,12 @@ test.describe("thread reply anchor A/B roleplay screenshots", () => {

await openThread(page);
await expandReply(page, humanReply.id);
await expect(page.getByText("Nora: adding context")).toBeVisible();
await expect(page.getByText("Pinky: Got it")).toBeVisible();
// Scope to the thread panel: the timeline's sr-only aria-live region
// (message-timeline-announcements) echoes message text and otherwise
// makes these text locators resolve to 2 elements (strict mode).
const threadPanel = page.getByTestId("message-thread-panel");
await expect(threadPanel.getByText("Nora: adding context")).toBeVisible();
await expect(threadPanel.getByText("Pinky: Got it")).toBeVisible();
await expect(
page.getByTestId("message-thread-replies").getByTestId("message-row"),
).toHaveCount(2);
Expand Down Expand Up @@ -253,8 +257,10 @@ test.describe("thread reply anchor A/B roleplay screenshots", () => {
);

await openThread(page);
await expect(page.getByText("Nora: adding context")).toBeVisible();
await expect(page.getByText("Pinky: Got it")).toBeVisible();
// Scoped to the thread panel — see test 01 for the aria-live note.
const threadPanel = page.getByTestId("message-thread-panel");
await expect(threadPanel.getByText("Nora: adding context")).toBeVisible();
await expect(threadPanel.getByText("Pinky: Got it")).toBeVisible();
await expect(
page.getByTestId("message-thread-replies").getByTestId("message-row"),
).toHaveCount(2);
Expand Down Expand Up @@ -292,7 +298,11 @@ test.describe("thread reply anchor A/B roleplay screenshots", () => {
);

await openThread(page);
await expect(page.getByText("Pinky: Starting the audit")).toBeVisible();
// Scoped to the thread panel — see test 01 for the aria-live note.
const threadPanel = page.getByTestId("message-thread-panel");
await expect(
threadPanel.getByText("Pinky: Starting the audit"),
).toBeVisible();
await expect(
page.getByTestId("message-thread-replies").getByTestId("message-row"),
).toHaveCount(1);
Expand Down Expand Up @@ -339,8 +349,12 @@ test.describe("thread reply anchor A/B roleplay screenshots", () => {

await openThread(page);
await expandReply(page, brainReply.id);
await expect(page.getByText("Brain: Check the anchor")).toBeVisible();
await expect(page.getByText("Pinky: Good catch")).toBeVisible();
// Scoped to the thread panel — see test 01 for the aria-live note.
const threadPanel = page.getByTestId("message-thread-panel");
await expect(
threadPanel.getByText("Brain: Check the anchor"),
).toBeVisible();
await expect(threadPanel.getByText("Pinky: Good catch")).toBeVisible();
await expect(
page.getByTestId("message-thread-replies").getByTestId("message-row"),
).toHaveCount(2);
Expand Down
5 changes: 4 additions & 1 deletion desktop/tests/e2e/thread-unread.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -986,7 +986,10 @@ test.describe("thread unread indicator", () => {
const openMenu = async () => {
await expect(toggle).toHaveCount(0);
await page.mouse.move(0, 0);
await page.getByText("Toggle me").hover();
// Scope the hover to the timeline: the sr-only aria-live region
// (message-timeline-announcements) echoes message text and would
// otherwise make this locator resolve to 2 elements (strict mode).
await page.getByTestId("message-timeline").getByText("Toggle me").hover();
await moreActions.click();
await expect(toggle).toHaveCount(1);
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -239,11 +239,11 @@ void main() {
expect(find.textContaining('To do'), findsOneWidget);
// 'In progress' appears in the header status and the transition row.
expect(find.textContaining('In progress'), findsWidgets);
// Actor pubkeys render truncated, plain text.
// Actor pubkeys render as the canonical compact npub label, plain text.
final actorText = tester.widget<Text>(
find.byKey(const ValueKey('task-event-actor-1')),
);
expect(actorText.data, '${'a' * 8}\u2026');
expect(actorText.data, 'npub1424…rcaj');
});

testWidgets('omits the summary section entirely when absent', (
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,19 +29,15 @@ void main() {
},
);

expect(digest.map((entry) => entry.author), ['Ada', 'def456']);
expect(digest.map((entry) => entry.author), ['Ada', 'Unknown identity']);
expect(digest.map((entry) => entry.text), ['first', 'second']);
});

test('shortens a long pubkey when no profile is cached', () {
final digest = threadSummaryDigest([
_message(
id: '1',
pubkey: 'aaaaaaaabbbbbbbbccccccccdddddddd',
content: 'hello',
),
_message(id: '1', pubkey: 'b' * 64, content: 'hello'),
], profiles: const {});
expect(digest.single.author, 'aaaaaaaa…');
expect(digest.single.author, 'npub1hwa…04hu');
});

test('drops system rows, which are chrome rather than conversation', () {
Expand Down
Loading