@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.
- package/corpus/README.md +1 -1
- package/corpus/templates/analytics/CHANGELOG.md +38 -0
- package/corpus/templates/assets/CHANGELOG.md +12 -0
- package/corpus/templates/calendar/CHANGELOG.md +24 -0
- package/corpus/templates/clips/CHANGELOG.md +62 -70
- package/corpus/templates/clips/app/routes/_app.r.$recordingId.tsx +48 -17
- package/corpus/templates/clips/changelog/2026-10-23-video-playback-respects-clip-availability.md +6 -0
- package/corpus/templates/clips/changelog/2026-10-26-opening-a-private-clip-while-signed-out-goes-straight-to-the.md +6 -0
- package/corpus/templates/clips/server/routes/api/video/[recordingId].get.ts +4 -1
- package/corpus/templates/content/CHANGELOG.md +70 -0
- package/corpus/templates/content/actions/_builder-cms-unpublished-changes.ts +70 -1
- package/corpus/templates/content/actions/_builder-cms-write-adapter.ts +13 -0
- package/corpus/templates/content/actions/_builder-status-property.ts +4 -0
- package/corpus/templates/content/actions/_database-source-utils.ts +813 -144
- package/corpus/templates/content/actions/execute-builder-source-execution.ts +15 -1
- package/corpus/templates/content/actions/review-content-database-source-change-set.ts +90 -35
- package/corpus/templates/content/actions/set-builder-entry-status.ts +4 -0
- package/corpus/templates/content/actions/stage-builder-source-bulk-update.ts +434 -92
- package/corpus/templates/content/app/components/editor/DocumentProperties.tsx +10 -2
- package/corpus/templates/content/app/i18n-data.ts +2 -0
- package/corpus/templates/content/changelog/2026-10-24-refreshing-a-builder-collection-keeps-edits-content-has-not.md +6 -0
- package/corpus/templates/crm/CHANGELOG.md +18 -0
- package/corpus/templates/design/CHANGELOG.md +69 -0
- package/corpus/templates/dispatch/CHANGELOG.md +7 -0
- package/corpus/templates/factory/.agents/skills/review-latest-feedback/SKILL.md +13 -3
- package/corpus/templates/factory/CHANGELOG.md +8 -0
- package/corpus/templates/mail/CHANGELOG.md +29 -0
- package/corpus/templates/mail/app/components/email/EmailListItem.tsx +1 -0
- package/corpus/templates/mail/app/components/layout/AppLayout.tsx +38 -11
- package/corpus/templates/mail/app/lib/inbox-tabs.ts +15 -2
- package/corpus/templates/mail/changelog/2026-10-27-configured-mail-labels-now-show-archived-messages-and-checkb.md +6 -0
- package/corpus/templates/plan/CHANGELOG.md +6 -0
- package/corpus/templates/slides/CHANGELOG.md +37 -0
- package/corpus/templates/slides-2/CHANGELOG.md +18 -0
- package/corpus/templates/tasks/CHANGELOG.md +6 -0
- package/package.json +1 -1
- package/corpus/templates/analytics/.deploy-tmp/agent-native-provided-plugins.mjs +0 -10
- package/corpus/templates/assets/.deploy-tmp/agent-native-provided-plugins.mjs +0 -10
- package/corpus/templates/brain/.deploy-tmp/agent-native-provided-plugins.mjs +0 -10
- package/corpus/templates/calendar/.deploy-tmp/agent-native-provided-plugins.mjs +0 -10
- package/corpus/templates/chat/.deploy-tmp/agent-native-provided-plugins.mjs +0 -10
- package/corpus/templates/clips/.deploy-tmp/agent-native-provided-plugins.mjs +0 -10
- package/corpus/templates/content/.deploy-tmp/agent-native-provided-plugins.mjs +0 -10
- package/corpus/templates/crm/.deploy-tmp/agent-native-provided-plugins.mjs +0 -10
- package/corpus/templates/design/.deploy-tmp/agent-native-provided-plugins.mjs +0 -10
- package/corpus/templates/design/.generated/bridge/native-builtin-metadata.generated.ts +0 -326
- package/corpus/templates/design/.generated/bridge/native-worker-source.generated.ts +0 -6
- package/corpus/templates/dispatch/.deploy-tmp/agent-native-provided-plugins.mjs +0 -10
- package/corpus/templates/forms/.deploy-tmp/agent-native-provided-plugins.mjs +0 -10
- package/corpus/templates/mail/.deploy-tmp/agent-native-provided-plugins.mjs +0 -10
- package/corpus/templates/plan/.deploy-tmp/agent-native-provided-plugins.mjs +0 -10
- package/corpus/templates/slides/.deploy-tmp/agent-native-provided-plugins.mjs +0 -10
- package/corpus/templates/slides-2/.deploy-tmp/agent-native-provided-plugins.mjs +0 -10
package/corpus/README.md
CHANGED
|
@@ -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
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
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 (
|
|
2641
|
-
|
|
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 (
|
|
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">
|
|
@@ -441,7 +441,10 @@ export default defineEventHandler(async (event: H3Event) => {
|
|
|
441
441
|
rec = footage as RecordingRow;
|
|
442
442
|
}
|
|
443
443
|
|
|
444
|
-
if (
|
|
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
|
-
|
|
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(
|