@agent-native/core-corpus 0.221.0-nightly-20261027212258 → 0.221.0

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/corpus/README.md +1 -1
  2. package/corpus/templates/analytics/CHANGELOG.md +38 -0
  3. package/corpus/templates/assets/CHANGELOG.md +12 -0
  4. package/corpus/templates/calendar/CHANGELOG.md +24 -0
  5. package/corpus/templates/clips/CHANGELOG.md +62 -70
  6. package/corpus/templates/clips/app/routes/_app.r.$recordingId.tsx +48 -17
  7. package/corpus/templates/clips/changelog/2026-10-23-video-playback-respects-clip-availability.md +6 -0
  8. package/corpus/templates/clips/changelog/2026-10-26-opening-a-private-clip-while-signed-out-goes-straight-to-the.md +6 -0
  9. package/corpus/templates/clips/server/routes/api/video/[recordingId].get.ts +4 -1
  10. package/corpus/templates/content/CHANGELOG.md +70 -0
  11. package/corpus/templates/content/actions/_builder-cms-unpublished-changes.ts +70 -1
  12. package/corpus/templates/content/actions/_builder-cms-write-adapter.ts +13 -0
  13. package/corpus/templates/content/actions/_builder-status-property.ts +4 -0
  14. package/corpus/templates/content/actions/_database-source-utils.ts +813 -144
  15. package/corpus/templates/content/actions/execute-builder-source-execution.ts +15 -1
  16. package/corpus/templates/content/actions/review-content-database-source-change-set.ts +90 -35
  17. package/corpus/templates/content/actions/set-builder-entry-status.ts +4 -0
  18. package/corpus/templates/content/actions/stage-builder-source-bulk-update.ts +434 -92
  19. package/corpus/templates/content/app/components/editor/DocumentProperties.tsx +10 -2
  20. package/corpus/templates/content/app/i18n-data.ts +2 -0
  21. package/corpus/templates/content/changelog/2026-10-24-refreshing-a-builder-collection-keeps-edits-content-has-not.md +6 -0
  22. package/corpus/templates/crm/CHANGELOG.md +18 -0
  23. package/corpus/templates/design/CHANGELOG.md +69 -0
  24. package/corpus/templates/dispatch/CHANGELOG.md +7 -0
  25. package/corpus/templates/factory/.agents/skills/review-latest-feedback/SKILL.md +13 -3
  26. package/corpus/templates/factory/CHANGELOG.md +8 -0
  27. package/corpus/templates/mail/CHANGELOG.md +29 -0
  28. package/corpus/templates/mail/app/components/email/EmailListItem.tsx +1 -0
  29. package/corpus/templates/mail/app/components/layout/AppLayout.tsx +38 -11
  30. package/corpus/templates/mail/app/lib/inbox-tabs.ts +15 -2
  31. package/corpus/templates/mail/changelog/2026-10-27-configured-mail-labels-now-show-archived-messages-and-checkb.md +6 -0
  32. package/corpus/templates/plan/CHANGELOG.md +6 -0
  33. package/corpus/templates/slides/CHANGELOG.md +37 -0
  34. package/corpus/templates/slides-2/CHANGELOG.md +18 -0
  35. package/corpus/templates/tasks/CHANGELOG.md +6 -0
  36. package/package.json +1 -1
  37. package/corpus/templates/analytics/.deploy-tmp/agent-native-provided-plugins.mjs +0 -10
  38. package/corpus/templates/assets/.deploy-tmp/agent-native-provided-plugins.mjs +0 -10
  39. package/corpus/templates/brain/.deploy-tmp/agent-native-provided-plugins.mjs +0 -10
  40. package/corpus/templates/calendar/.deploy-tmp/agent-native-provided-plugins.mjs +0 -10
  41. package/corpus/templates/chat/.deploy-tmp/agent-native-provided-plugins.mjs +0 -10
  42. package/corpus/templates/clips/.deploy-tmp/agent-native-provided-plugins.mjs +0 -10
  43. package/corpus/templates/content/.deploy-tmp/agent-native-provided-plugins.mjs +0 -10
  44. package/corpus/templates/crm/.deploy-tmp/agent-native-provided-plugins.mjs +0 -10
  45. package/corpus/templates/design/.deploy-tmp/agent-native-provided-plugins.mjs +0 -10
  46. package/corpus/templates/design/.generated/bridge/native-builtin-metadata.generated.ts +0 -326
  47. package/corpus/templates/design/.generated/bridge/native-worker-source.generated.ts +0 -6
  48. package/corpus/templates/dispatch/.deploy-tmp/agent-native-provided-plugins.mjs +0 -10
  49. package/corpus/templates/forms/.deploy-tmp/agent-native-provided-plugins.mjs +0 -10
  50. package/corpus/templates/mail/.deploy-tmp/agent-native-provided-plugins.mjs +0 -10
  51. package/corpus/templates/plan/.deploy-tmp/agent-native-provided-plugins.mjs +0 -10
  52. package/corpus/templates/slides/.deploy-tmp/agent-native-provided-plugins.mjs +0 -10
  53. package/corpus/templates/slides-2/.deploy-tmp/agent-native-provided-plugins.mjs +0 -10
package/corpus/README.md CHANGED
@@ -32,4 +32,4 @@ rg -n "defineAction|useActionQuery" node_modules/@agent-native/core-corpus/corpu
32
32
 
33
33
  ## Generated Counts
34
34
 
35
- - template files: 15010
35
+ - template files: 14961
@@ -5,12 +5,23 @@ time from the command menu (Cmd+K → "What's new") or from Settings.
5
5
 
6
6
  ## 2026-10-24
7
7
 
8
+ ### Added
9
+
10
+ - Pick dashboard panels for the agent with the Select button in the chat composer.
11
+
8
12
  ### Improved
9
13
 
14
+ - An empty Ask page shows the large composer, and the agent panel opens on the app's default model
15
+ - The Content dashboard ranks articles by signups, adds Authors, New and rising, and Sources tabs, and names missing data sources in one notice.
10
16
  - Organization roster searches now find row-level dbt membership data more reliably.
11
17
 
12
18
  ### Fixed
13
19
 
20
+ - Analytics now clearly indicates incomplete Gong user lists and HubSpot deal pages.
21
+ - Date columns in dashboard tables no longer show the previous day in time zones west of UTC.
22
+ - Gong transcript reads preserve the transcript alias for existing callers.
23
+ - Phones can open the agent from the top bar on every page outside Ask
24
+ - HubSpot and Gong searches keep their filters and page totals visible.
14
25
  - Analytics avoids showing partial warehouse results when a metric or plan request is ambiguous.
15
26
  - Analytics preserves verified results from successful time ranges when another requested range is unavailable.
16
27
  - Analytics uses a warehouse fallback for a failed metric only when requested and supported by a complete metric definition and result.
@@ -18,8 +29,16 @@ time from the command menu (Cmd+K → "What's new") or from Settings.
18
29
 
19
30
  ## 2026-10-23
20
31
 
32
+ ### Improved
33
+
34
+ - Metric tiles can show their change from the period before, tables give the spare width to their first text column and right-align numbers, and callouts read as a list with a severity icon per row, in dashboards and emailed reports.
35
+
21
36
  ### Fixed
22
37
 
38
+ - Content pageviews use their own GA4 property without changing other dashboards.
39
+ - Content signup collection keeps actual query usage and the configured cap, including when collection fails
40
+ - External agents need approval before changing recurring index builds.
41
+ - Query cost tracking distinguishes unknown BigQuery usage from zero-byte results.
23
42
  - Analytics figures require complete, scope-matched warehouse evidence
24
43
  - Analytics keeps malformed metric values out of verified summaries
25
44
  - Analytics keeps verified metrics available when another requested dbt metric is unavailable
@@ -29,8 +48,23 @@ time from the command menu (Cmd+K → "What's new") or from Settings.
29
48
  - Analytics withholds warehouse figures when an owner-defined dbt metric query fails.
30
49
  - Warehouse figures stay hidden when a failed dbt query cannot verify the calculation.
31
50
 
51
+ ## 2026-10-22
52
+
53
+ ### Added
54
+
55
+ - Tables, metric tiles and charts can show a number of seconds as a duration such as 16 min or 7.4 hours, and duration columns sort by time.
56
+
57
+ ### Improved
58
+
59
+ - Approval links from a connected agent, such as Claude Code, now open the review inside the app, in its own theme.
60
+ - Extension panels on dashboards are as tall as their content, so a one-line extension no longer leaves an empty band below it
61
+
32
62
  ## 2026-10-21
33
63
 
64
+ ### Added
65
+
66
+ - You can pin a shared chat just for yourself, or hide it from your list and undo that from the toast.
67
+
34
68
  ### Improved
35
69
 
36
70
  - Analytics recognizes questions about connected data, product analytics, sessions, dashboards, and charts.
@@ -43,6 +77,10 @@ time from the command menu (Cmd+K → "What's new") or from Settings.
43
77
 
44
78
  ## 2026-10-20
45
79
 
80
+ ### Added
81
+
82
+ - Custom SQL charts can open configured record details on click
83
+
46
84
  ### Fixed
47
85
 
48
86
  - Blog signup attribution excludes signups before the first visit and URLs on unrelated hosts
@@ -3,6 +3,18 @@
3
3
  All notable user-facing changes to Assets are documented here. Open it any
4
4
  time from the command menu (Cmd+K → "What's new") or from Settings.
5
5
 
6
+ ## 2026-10-22
7
+
8
+ ### Improved
9
+
10
+ - Approval links from a connected agent, such as Claude Code, now open the review inside the app, in its own theme.
11
+
12
+ ## 2026-10-21
13
+
14
+ ### Added
15
+
16
+ - You can pin a shared chat just for yourself, or hide it from your list and undo that from the toast.
17
+
6
18
  ## 2026-10-19
7
19
 
8
20
  ### Changed
@@ -3,6 +3,30 @@
3
3
  All notable user-facing changes to Agent-Native Calendar are documented here. Open it any
4
4
  time from the command menu (Cmd+K → "What's new") or from Settings.
5
5
 
6
+ ## 2026-10-27
7
+
8
+ ### Fixed
9
+
10
+ - Calendar keeps successful invitation rules applied while another rule is retried.
11
+
12
+ ## 2026-10-26
13
+
14
+ ### Improved
15
+
16
+ - Calendar event rules can use OpenAI when Jev is unavailable.
17
+
18
+ ## 2026-10-25
19
+
20
+ ### Fixed
21
+
22
+ - Moving one event in a recurring series keeps the series on the right weekday after a time-zone change and at the right local time across daylight-saving changes
23
+
24
+ ## 2026-10-22
25
+
26
+ ### Improved
27
+
28
+ - Approval links from a connected agent, such as Claude Code, now open the review inside the app, in its own theme.
29
+
6
30
  ## 2026-10-21
7
31
 
8
32
  ### Fixed
@@ -3,16 +3,74 @@
3
3
  All notable user-facing changes to Clips are documented here. Open it any time
4
4
  from the command menu (Cmd+K → "What's new") or from Settings.
5
5
 
6
+ ## 2026-10-27
7
+
8
+ ### Improved
9
+
10
+ - First-run setup makes free credits the primary path while keeping personal API keys one click away
11
+
12
+ ### Fixed
13
+
14
+ - Meeting transcripts follow their sharing settings and the linked Clip's access protections.
15
+ - The Rewind consent dialog stays visible on shorter screens.
16
+ - Thumbnails respect attached footage availability.
17
+ - Workflow generation now shows updates while it runs, offers cancellation, and settles cleanly when an agent run ends.
18
+ - Workflow generation avoids duplicate runs when its state is incomplete and reports rejected starts or ended runs clearly.
19
+ - Workflow generation progress and cancellation stay tied to the viewer who started them
20
+
21
+ ## 2026-10-26
22
+
23
+ ### Improved
24
+
25
+ - Agents reading a clip now get its recommended frames from storage instead of re-downloading the video on every request.
26
+ - Clip cleanup waits for active transcripts and offers recovery when a transcript has failed.
27
+
28
+ ### Fixed
29
+
30
+ - Opening a private clip while signed out goes straight to the Private clip screen, without a brief error first
31
+ - Recording activity notifications follow Trash visibility.
32
+ - Recording search and shared access respect expiry, and owners can delete their own saved comments while discussion is disabled.
33
+ - Silence and filler-word cleanup wait until a transcript is ready
34
+ - Silence cleanup waits for an in-progress transcript before offering regeneration
35
+ - Agents now get frames spread across the whole clip, and the opening frame skips the black first moment.
36
+
37
+ ## 2026-10-25
38
+
39
+ ### Fixed
40
+
41
+ - Long recordings remain scrollable in short desktop windows
42
+
43
+ ## 2026-10-23
44
+
45
+ ### Fixed
46
+
47
+ - Video playback respects Clip availability.
48
+
49
+ ## 2026-10-22
50
+
51
+ ### Improved
52
+
53
+ - Approval links from a connected agent, such as Claude Code, now open the review inside the app, in its own theme.
54
+
55
+ ### Fixed
56
+
57
+ - Recording sharing and discussion settings apply consistently.
58
+ - Turning comments off hides saved comments from viewers while keeping them available to the owner
59
+
6
60
  ## 2026-10-21
7
61
 
8
62
  ### Improved
9
63
 
64
+ - Meeting notes check sooner when a meeting ends on the web and retry failed end checks
65
+ - New meetings show their transcript on the share link by default; meetings you already have keep their setting.
66
+ - The clip Share panel has People, Agents, Embed and Social tabs, and password, expiry and the meeting transcript setting now live under Advanced.
10
67
  - Share panels describe general access in a sentence and no longer open an empty people list when you click into them.
11
68
 
12
69
  ## 2026-10-20
13
70
 
14
71
  ### Fixed
15
72
 
73
+ - Expired Clips hide comments from viewers while owners retain access
16
74
  - Locally saved desktop recordings now appear in the recovery list with upload and storage setup actions.
17
75
 
18
76
  ### Changed
@@ -21,6 +79,10 @@ from the command menu (Cmd+K → "What's new") or from Settings.
21
79
 
22
80
  ## 2026-10-19
23
81
 
82
+ ### Added
83
+
84
+ - Agents connected over MCP can import video links, update Clip chapters, read comments and reply in threads
85
+
24
86
  ### Fixed
25
87
 
26
88
  - Agents see a clip's frames as soon as it finishes processing instead of a cached "still processing" answer.
@@ -1554,74 +1616,4 @@ from the command menu (Cmd+K → "What's new") or from Settings.
1554
1616
  - Shared clips now start playing and scrub instantly instead of buffering — recordings are made seekable on upload, and you can repair older clips
1555
1617
  - Stalled clip uploads now update in the library and surface as failed instead of staying stuck as uploading.
1556
1618
 
1557
- ## 2026-06-30
1558
-
1559
- ### Fixed
1560
-
1561
- - Chrome extension recordings no longer show an upload failure when the clip finished saving successfully.
1562
- - Longer Chrome extension recordings now keep saving reliably instead of getting stuck or showing a second countdown.
1563
-
1564
- ## 2026-06-29
1565
-
1566
- ### Added
1567
-
1568
- - Screen Memory keeps a local rolling screen buffer and recent app/window context for local agent context.
1569
-
1570
- ### Fixed
1571
-
1572
- - Meeting detail layouts now adapt cleanly when the agent sidebar narrows the app.
1573
- - Video chat is easier to find on recording pages and S3 setup saves from onboarding.
1574
-
1575
- ## 2026-06-28
1576
-
1577
- ### Improved
1578
-
1579
- - Builder.io credit pauses now show friendly upgrade guidance for backup transcription, transcript cleanup, summaries, and AI titles.
1580
- - Left sidebar footer controls now use less divider chrome.
1581
-
1582
- ### Fixed
1583
-
1584
- - Transcription now auto-detects spoken language instead of following the app or system locale.
1585
- - Video uploads now finish even when the browser cannot read exact duration metadata.
1586
-
1587
- ## 2026-06-27
1588
-
1589
- ### Improved
1590
-
1591
- - Desktop recording now guides you to connect storage with a friendly setup flow instead of a red error.
1592
- - Recorder download options now show the Chrome extension and desktop app choices without extra setup copy.
1593
- - Recorder setup keeps screen-capture choices desktop-only on mobile and tones down the selected mode highlight.
1594
-
1595
- ### Fixed
1596
-
1597
- - Clips no longer shows desktop app prompts on mobile screens.
1598
- - Traditional Chinese copy now uses Taiwan terminology and clearer technical wording.
1599
-
1600
- ## 2026-06-26
1601
-
1602
- ### Added
1603
-
1604
- - Bug-report recordings can keep redacted host-app context with the clip.
1605
- - Bug report widgets can launch Clips recordings from embedded product surfaces.
1606
-
1607
- ### Improved
1608
-
1609
- - Shared clip links now guide agents through processing transcripts and exhausted transcription credits.
1610
- - Storage setup now explains why Clips needs connected storage and guides saved desktop or Chrome uploads back to Builder.io.
1611
- - The Clips library now matches the shared recessed shell styling.
1612
-
1613
- ### Fixed
1614
-
1615
- - Brief network blips no longer block recording or wrongly prompt you to reconnect storage in the desktop app.
1616
- - Desktop recording keeps connected users out of the storage setup flow when a status check is indeterminate.
1617
- - Desktop recordings recover more reliably when macOS reports a finalization error.
1618
- - If a recording can't be uploaded, the Chrome extension now saves it to your downloads so it's never lost.
1619
- - Long desktop recordings are checkpointed so macOS finalization failures can recover the saved portions.
1620
- - Non-Mac desktop recordings now try Web Speech transcripts before falling back to upload transcription.
1621
- - The recording details button stays at the far right on small screens.
1622
- - S3-compatible storage keys now save securely from Clips Settings without requiring deployment env vars.
1623
- - Slack unfurls now recognize recording dashboard links pasted from Clips.
1624
- - The agent sidebar now slides in smoothly without duplicate edge borders.
1625
- - The clip details sidebar now collapses into a slide-out panel on smaller screens.
1626
-
1627
1619
  For the full list of updates, see the [changelog folder](./changelog/).
@@ -505,6 +505,28 @@ export function buildRecordingBreadcrumbItems({
505
505
  ];
506
506
  }
507
507
 
508
+ /**
509
+ * What the page shows for its player-data read. "share" hands the visitor to
510
+ * RecordingShareRedirect, which paints only the skeleton until the share page
511
+ * lands.
512
+ */
513
+ export function recordingAccessView({
514
+ isPending,
515
+ accessStatus,
516
+ signedIn,
517
+ }: {
518
+ isPending: boolean;
519
+ accessStatus: number | undefined;
520
+ signedIn: boolean;
521
+ }): "pending" | "share" | "retry" | "page" {
522
+ if (isPending) return "pending";
523
+ if (accessStatus === 403 || (accessStatus === 401 && !signedIn)) {
524
+ return "share";
525
+ }
526
+ if (accessStatus === 401) return "retry";
527
+ return "page";
528
+ }
529
+
508
530
  export function meta() {
509
531
  return [{ title: enMessages.recordingRoute.pageTitle }];
510
532
  }
@@ -918,20 +940,11 @@ export default function RecordingPage() {
918
940
  const playerDataAccessStatus = playerDataQ.isError
919
941
  ? (playerDataQ.error as { status?: number } | undefined)?.status
920
942
  : undefined;
921
- const playerDataUnauthorized = playerDataAccessStatus === 401;
922
- const playerDataForbidden = playerDataAccessStatus === 403;
923
-
924
- const shouldFallbackToShare =
925
- playerDataForbidden || (playerDataUnauthorized && !session);
926
- useEffect(() => {
927
- if (!recordingId || !shouldFallbackToShare) return;
928
- void navigate(
929
- `/share/${encodeURIComponent(recordingId)}?${legacyShareQuery}`,
930
- {
931
- replace: true,
932
- },
933
- );
934
- }, [legacyShareQuery, recordingId, shouldFallbackToShare, navigate]);
943
+ const accessView = recordingAccessView({
944
+ isPending: playerDataQ.isPending,
945
+ accessStatus: playerDataAccessStatus,
946
+ signedIn: Boolean(session),
947
+ });
935
948
 
936
949
  const recording = playerDataQ.data?.recording;
937
950
  const hostedFailureCode = (recording as any)?.failureCode;
@@ -2637,11 +2650,17 @@ export default function RecordingPage() {
2637
2650
 
2638
2651
  if (!recordingId) return null;
2639
2652
 
2640
- if (playerDataQ.isPending || playerDataForbidden) {
2641
- return <RecordingWorkspaceSkeleton />;
2653
+ if (accessView === "pending") return <RecordingWorkspaceSkeleton />;
2654
+
2655
+ if (accessView === "share") {
2656
+ return (
2657
+ <RecordingShareRedirect
2658
+ to={`/share/${encodeURIComponent(recordingId)}?${legacyShareQuery}`}
2659
+ />
2660
+ );
2642
2661
  }
2643
2662
 
2644
- if (playerDataUnauthorized) {
2663
+ if (accessView === "retry") {
2645
2664
  return (
2646
2665
  <Empty className="min-h-[calc(100dvh-3.5rem)] rounded-none border-0">
2647
2666
  <EmptyHeader>
@@ -3828,6 +3847,18 @@ export default function RecordingPage() {
3828
3847
  return viewer;
3829
3848
  }
3830
3849
 
3850
+ // The redirect runs only from here so the page can't send the visitor to the
3851
+ // share page while painting anything but the skeleton; a redirect and a
3852
+ // skeleton read from different checks is how a signed-out private Clip
3853
+ // flashed "Something went wrong".
3854
+ export function RecordingShareRedirect({ to }: { to: string }) {
3855
+ const navigate = useNavigate();
3856
+ useEffect(() => {
3857
+ void navigate(to, { replace: true });
3858
+ }, [navigate, to]);
3859
+ return <RecordingWorkspaceSkeleton />;
3860
+ }
3861
+
3831
3862
  function RecordingWorkspaceSkeleton() {
3832
3863
  return (
3833
3864
  <div className="flex h-full min-h-0 flex-col">
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: fixed
3
+ date: 2026-10-23
4
+ ---
5
+
6
+ Video playback respects Clip availability.
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: fixed
3
+ date: 2026-10-26
4
+ ---
5
+
6
+ Opening a private clip while signed out goes straight to the Private clip screen, without a brief error first
@@ -441,7 +441,10 @@ export default defineEventHandler(async (event: H3Event) => {
441
441
  rec = footage as RecordingRow;
442
442
  }
443
443
 
444
- if (rec.failureCode === "taken_down") {
444
+ if (
445
+ gate.failureCode === "taken_down" ||
446
+ rec.failureCode === "taken_down"
447
+ ) {
445
448
  setResponseStatus(event, 404);
446
449
  return { error: "Not found" };
447
450
  }
@@ -3,14 +3,80 @@
3
3
  All notable user-facing changes to Agent-Native Content are documented here. Open it any
4
4
  time from the command menu (Cmd+K → "What's new").
5
5
 
6
+ ## 2026-10-27
7
+
8
+ ### Fixed
9
+
10
+ - An agent's Accept on words someone is still typing in returns the suggestion to pending instead of failing with a server error
11
+ - Opening a page you can't access goes straight to the no-access screen without a brief error first, including when you come back to it
12
+
13
+ ## 2026-10-26
14
+
15
+ ### Fixed
16
+
17
+ - Document reads preserve bodies containing ordinary prose about starting an embed.
18
+
19
+ ## 2026-10-25
20
+
21
+ ### Fixed
22
+
23
+ - A GitHub folder linked into a Personal space now fills its collection, instead of saying GitHub isn't connected for the person who linked it
24
+ - Changes an agent makes at the end of a page, such as adding an item to a closing list, now stay when you have the page open instead of being saved over. So does a block an agent adds right before or after one you're editing.
25
+ - In Suggesting mode, Accept and Reject show at once on a suggestion you just typed or added to, and the session's other suggestions stay on screen
26
+ - Web addresses in collections and page properties open in a new tab when you click the link, and clicking the rest of the cell still edits them.
27
+ - While suggesting, the struck-out word no longer blinks off with each keystroke
28
+
29
+ ## 2026-10-24
30
+
31
+ ### Added
32
+
33
+ - Agents can register webhooks that send a signed event when a property changes on a collection row or page, or when a comment is created or resolved.
34
+ - Agents can write a property only while it still holds the value they read, even when someone changed it and changed it back in between. Each value also carries a change ID, so an agent can act once per change.
35
+ - Pick Published or Draft in a Builder entry's status to stage a publish or unpublish; the source review sends it.
36
+
37
+ ### Improved
38
+
39
+ - Content responds sooner after a quiet spell, because a newly started server loads and prepares less code before its first response
40
+
41
+ ### Fixed
42
+
43
+ - A copied block that holds data, such as an inline database, keeps its data when pasted instead of disappearing on save.
44
+ - Cmd+Z and Cmd+Shift+Z undo and redo a change to a toggle's title while you're typing in it.
45
+ - Deleting a property no longer leaves filters or sorts on it in shared views or your personal views, so a filter on a deleted property no longer hides every page.
46
+ - Document saves no longer mistake closed editor sessions for active editors
47
+ - Refreshing a Builder collection keeps edits Content has not pushed yet, and the review flags the ones Builder changed too.
48
+ - Resolving a comment from its card in the margin closes the card. In a stack of comments, the next one opens in its place.
49
+
50
+ ## 2026-10-23
51
+
52
+ ### Added
53
+
54
+ - Builder collections show each entry's Builder status (Published, Draft, or Unpublished changes) in the table, board, and page info.
55
+
56
+ ### Improved
57
+
58
+ - A folded comment stack's new front card now comes up over the old one, and an opened stack's clicked comment sits level with its text
59
+
60
+ ### Fixed
61
+
62
+ - A comment on a video now stays attached to that video, sits beside it in the margin, and opens it when clicked, instead of showing Highlight unavailable.
63
+ - A local-folder sync no longer overwrites an edit saved while it runs or leaves that edit out of a conflict it reports, and a file that comes back to the folder no longer offers to unlink its page.
64
+ - Public pages show each block's name while the page is still loading, instead of the block's source.
65
+ - Pushing a Builder update from a large collection now ends on Pushed instead of Checked and Ready to send to Builder.
66
+ - You can comment on text selected across paragraphs and other blocks, and its quote reads with a space where the blocks meet.
67
+
6
68
  ## 2026-10-22
7
69
 
8
70
  ### Added
9
71
 
72
+ - Collection filters add does not contain, starts with, ends with, on or before, and on or after. Date filters can use relative days like today, and is within picks a range the way Notion does, such as the past 2 weeks or this month. A date without a time now counts as the whole day, so "on or before today" keeps rows from later today.
10
73
  - Blocks with several comment threads fold into one stack in the margin, which opens in place when you click it or a highlight
11
74
 
12
75
  ### Improved
13
76
 
77
+ - Approval links from a connected agent, such as Claude Code, now open the review inside the app, in its own theme.
78
+ - Tables get Header row, Header column and Fit to width in their block menu, colours for rows and columns, and menus that close the moment you press Escape.
79
+ - The block menu turns a block into another kind, colours it and comments on it, filters as you type, and shows each action’s shortcut. It says why a locked block can’t be duplicated or deleted, and a click beside the page lets go of a selected block.
14
80
  - A big GitHub folder fills its collection much faster, and keeps filling while the collection is open rather than waiting for the next background sync
15
81
  - Collections with large select or multi-select properties open faster and use less memory, because each property definition is sent once instead of with every row
16
82
  - Pressing Escape while writing a comment, reply or edit cancels it, and asks first if you've written something.
@@ -20,6 +86,9 @@ time from the command menu (Cmd+K → "What's new").
20
86
 
21
87
  ### Fixed
22
88
 
89
+ - A comment on the start of a block no longer highlights blocks added just above it.
90
+ - Saving a Builder entry from Content no longer snaps back on the next refresh, and draft entries get a plain save that Builder shows right away.
91
+ - The Page stays editable while Accept, Reject, Accept remaining, and Reject remaining save, and a failed save returns only that decision to pending
23
92
  - A GitHub folder sync keeps going when file storage fails, filling pages without their images and adding them on a later sync
24
93
  - Opening a page no longer saves an edit again after another open tab's save already stored it.
25
94
  - Changes made from a menu or popover, such as an image's alt text, are always saved.
@@ -40,6 +109,7 @@ time from the command menu (Cmd+K → "What's new").
40
109
 
41
110
  ### Fixed
42
111
 
112
+ - Undoing a slash command now turns the block back in one step, keeps its text, and leaves the caret where it was
43
113
  - Blocks fields keep unconfirmed saves visible, and agent reads handle changing collection fields and older editors reliably
44
114
  - Compact HTML table row groups keep their cells, and unsupported block colors are reported during Markdown checks.
45
115
  - Suggestions keep refusing unmatched emphasis in stored Markdown
@@ -56,6 +56,36 @@ export type BuilderCmsPublicationIntentRead =
56
56
  | { state: "staged"; transition: BuilderCmsPublicationTransitionIntent }
57
57
  | { state: "invalid" };
58
58
 
59
+ /**
60
+ * The source fields Builder changed after Content edited them, while the
61
+ * edit waits for a push. A refresh keeps Content's edit, so the review flags
62
+ * these until the edit is pushed or matches Builder.
63
+ */
64
+ export const BUILDER_CMS_EDIT_CONFLICTS_KEY =
65
+ "__agent_native_builder_edit_conflicts";
66
+
67
+ /**
68
+ * The page title's entry in the edit-conflict record. A property named
69
+ * "Title" maps to Builder's `data.title` too, so the title keeps its own
70
+ * entry and neither writer clears the other's.
71
+ */
72
+ export const BUILDER_CMS_TITLE_CONFLICT_KEY = "__builder.title";
73
+
74
+ /** The edit-conflict entry a field change settles when it is pushed. */
75
+ export function builderCmsEditConflictKey(change: {
76
+ localFieldKey: string;
77
+ sourceFieldKey: string;
78
+ }) {
79
+ return change.localFieldKey === "title"
80
+ ? BUILDER_CMS_TITLE_CONFLICT_KEY
81
+ : change.sourceFieldKey;
82
+ }
83
+
84
+ export type BuilderCmsEditConflictsRead =
85
+ | { state: "none" }
86
+ | { state: "recorded"; sourceFieldKeys: string[] }
87
+ | { state: "invalid" };
88
+
59
89
  export type BuilderCmsUnpublishedChangesRead =
60
90
  | { state: "none" }
61
91
  | { state: "pending"; changes: BuilderCmsUnpublishedChanges }
@@ -230,6 +260,41 @@ export function withBuilderCmsPublicationIntent(
230
260
  return next;
231
261
  }
232
262
 
263
+ export function readBuilderCmsEditConflicts(
264
+ sourceValues: Record<string, DocumentPropertyValue> | null | undefined,
265
+ ): BuilderCmsEditConflictsRead {
266
+ const raw = sourceValues?.[BUILDER_CMS_EDIT_CONFLICTS_KEY];
267
+ if (raw === undefined || raw === null) return { state: "none" };
268
+ return Array.isArray(raw) &&
269
+ raw.length > 0 &&
270
+ raw.every((key) => typeof key === "string" && key)
271
+ ? { state: "recorded", sourceFieldKeys: raw }
272
+ : { state: "invalid" };
273
+ }
274
+
275
+ /**
276
+ * Replaces one writer's keys in the edit-conflicts record: a refresh's fields,
277
+ * its title, a body read, and a push each own theirs and keep the others'. An
278
+ * unreadable record is replaced; the review flagged it until then.
279
+ */
280
+ export function withBuilderCmsEditConflicts(
281
+ sourceValues: Record<string, DocumentPropertyValue>,
282
+ args: { ownedKeys: Iterable<string>; conflictedKeys: Iterable<string> },
283
+ ): Record<string, DocumentPropertyValue> {
284
+ const read = readBuilderCmsEditConflicts(sourceValues);
285
+ const owned = new Set(args.ownedKeys);
286
+ const keys = new Set(
287
+ read.state === "recorded"
288
+ ? read.sourceFieldKeys.filter((key) => !owned.has(key))
289
+ : [],
290
+ );
291
+ for (const key of args.conflictedKeys) keys.add(key);
292
+ const next = { ...sourceValues };
293
+ if (keys.size > 0) next[BUILDER_CMS_EDIT_CONFLICTS_KEY] = [...keys].sort();
294
+ else delete next[BUILDER_CMS_EDIT_CONFLICTS_KEY];
295
+ return next;
296
+ }
297
+
233
298
  /**
234
299
  * Builder's own status words for an entry, as its content list shows them.
235
300
  * Unpublished changes are Content's saves or Builder's own autosaves. An
@@ -366,7 +431,7 @@ export function builderSourceValuesKeepingUnpublishedChanges(
366
431
  args: KeepingUnpublishedChangesArgs,
367
432
  ): Record<string, DocumentPropertyValue> {
368
433
  const refreshed = sourceValuesKeepingUnpublishedChanges(args);
369
- return withBuilderCmsPublicationIntent(
434
+ const next = withBuilderCmsPublicationIntent(
370
435
  refreshed,
371
436
  publicationIntentAfterRead({
372
437
  existing: args.existing,
@@ -374,6 +439,10 @@ export function builderSourceValuesKeepingUnpublishedChanges(
374
439
  builderValues: args.builderValues,
375
440
  }),
376
441
  );
442
+ // Only the writer that compares an edit with Builder settles its conflict.
443
+ const conflicts = args.existing?.[BUILDER_CMS_EDIT_CONFLICTS_KEY];
444
+ if (conflicts !== undefined) next[BUILDER_CMS_EDIT_CONFLICTS_KEY] = conflicts;
445
+ return next;
377
446
  }
378
447
 
379
448
  interface KeepingUnpublishedChangesArgs {
@@ -957,6 +957,19 @@ export function buildBuilderCmsExecutionPlan(args: {
957
957
  fieldBlockers.push(converted.blocker);
958
958
  continue;
959
959
  }
960
+ // The page title and a property mapped to Builder's title field are
961
+ // separate edits to one Builder field, and the patch keeps only one value.
962
+ const sameField = operations.find(
963
+ (operation) => operation.sourceFieldKey === field.sourceFieldKey,
964
+ );
965
+ if (sameField) {
966
+ if (stableJson(sameField.value) !== stableJson(converted.value)) {
967
+ fieldBlockers.push(
968
+ `Two changes set Builder's ${builderFieldName(field.sourceFieldKey)} field to different values. Set one of them back before pushing.`,
969
+ );
970
+ }
971
+ continue;
972
+ }
960
973
  operations.push({
961
974
  sourceFieldKey: field.sourceFieldKey,
962
975
  localFieldKey: field.localFieldKey,
@@ -359,6 +359,10 @@ export async function removeBuilderStatusPropertyWithoutSource(
359
359
  await db
360
360
  .delete(schema.documentPropertyValues)
361
361
  .where(eq(schema.documentPropertyValues.propertyId, propertyId));
362
+ // After the values: deleting them records a tombstone for each one.
363
+ await db
364
+ .delete(schema.documentPropertyValueTombstones)
365
+ .where(eq(schema.documentPropertyValueTombstones.propertyId, propertyId));
362
366
  await db
363
367
  .delete(schema.contentDatabaseItemKeyClaims)
364
368
  .where(