@agent-native/core 0.178.0-nightly-20260909183543 → 0.178.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 (42) hide show
  1. package/corpus/README.md +1 -1
  2. package/corpus/templates/analytics/CHANGELOG.md +16 -0
  3. package/corpus/templates/calendar/CHANGELOG.md +19 -0
  4. package/corpus/templates/clips/CHANGELOG.md +6 -0
  5. package/corpus/templates/content/CHANGELOG.md +5 -0
  6. package/corpus/templates/content/app/i18n-data.ts +3 -3
  7. package/corpus/templates/content/app/lib/local-folder-picker-safety.ts +9 -0
  8. package/corpus/templates/content/app/routes/_app.local-files.tsx +5 -0
  9. package/corpus/templates/design/CHANGELOG.md +6 -0
  10. package/corpus/templates/factory/CHANGELOG.md +18 -0
  11. package/corpus/templates/mail/CHANGELOG.md +20 -0
  12. package/corpus/templates/plan/CHANGELOG.md +6 -0
  13. package/corpus/templates/slides/.agents/skills/create-deck/SKILL.md +36 -152
  14. package/corpus/templates/slides/CHANGELOG.md +11 -0
  15. package/corpus/templates/slides/actions/add-slide.ts +1 -0
  16. package/corpus/templates/slides/actions/create-deck.ts +1 -1
  17. package/corpus/templates/slides/actions/export-html.ts +342 -12
  18. package/corpus/templates/slides/app/components/deck/SlideRenderer.tsx +69 -20
  19. package/corpus/templates/slides/app/components/editor/SlideEditor.tsx +3 -2
  20. package/corpus/templates/slides/app/components/editor/SlideInlineEditor.tsx +49 -15
  21. package/corpus/templates/slides/app/global.css +27 -22
  22. package/corpus/templates/slides/app/hooks/use-deck-design-system.ts +19 -15
  23. package/corpus/templates/slides/app/lib/create-deck-generation.ts +2 -2
  24. package/corpus/templates/slides/app/lib/normalize-slide-padding.ts +2 -2
  25. package/corpus/templates/slides/app/pages/Index.tsx +2 -2
  26. package/corpus/templates/slides/changelog/2026-09-09-slides-default-generation-style.md +6 -0
  27. package/corpus/templates/slides/server/plugins/agent-chat.ts +1 -1
  28. package/corpus/templates/slides/shared/slide-background.ts +18 -2
  29. package/dist/cli/index.js +17 -0
  30. package/dist/client/org/OrgSwitcher.js +16 -21
  31. package/dist/collab/awareness.d.ts +2 -2
  32. package/dist/collab/routes.d.ts +1 -1
  33. package/dist/file-upload/actions/upload-image.d.ts +3 -3
  34. package/dist/observability/routes.d.ts +2 -2
  35. package/dist/org/federation.d.ts +1 -1
  36. package/dist/org/federation.js +6 -4
  37. package/dist/org/index.d.ts +2 -1
  38. package/dist/org/index.js +2 -1
  39. package/dist/org/membership.js +1 -1
  40. package/dist/org/workspace-app-access.d.ts +1 -0
  41. package/dist/org/workspace-app-access.js +21 -7
  42. package/package.json +3 -3
package/corpus/README.md CHANGED
@@ -31,4 +31,4 @@ rg -n "defineAction|useActionQuery" node_modules/@agent-native/core/corpus
31
31
 
32
32
  ## Generated Counts
33
33
 
34
- - template files: 9087
34
+ - template files: 9088
@@ -3,6 +3,22 @@
3
3
  All notable user-facing changes to Agent-Native Analytics 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-09-09
7
+
8
+ ### Improved
9
+
10
+ - Collaborator avatars use a slimmer border.
11
+
12
+ ## 2026-09-08
13
+
14
+ ### Improved
15
+
16
+ - Login pages use the same mouse-reactive wave background as the docs and booking experiences.
17
+
18
+ ### Fixed
19
+
20
+ - Analytics dashboards and daily emails include current zero-activity dates.
21
+
6
22
  ## 2026-09-04
7
23
 
8
24
  ### Improved
@@ -3,6 +3,25 @@
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-09-09
7
+
8
+ ### Improved
9
+
10
+ - Calendar can color Google events by meeting type again
11
+ - Connected account avatars use a slimmer border.
12
+
13
+ ## 2026-09-08
14
+
15
+ ### Improved
16
+
17
+ - Login pages use the same mouse-reactive wave background as the docs and booking experiences.
18
+
19
+ ### Fixed
20
+
21
+ - Calendar overlay status now queries a valid one-day range
22
+ - Calendar shows proposed-time actions for Google event invitations
23
+ - Provider-supplied full-day meetings stay in the compact top bar.
24
+
6
25
  ## 2026-09-05
7
26
 
8
27
  ### Improved
@@ -3,6 +3,12 @@
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-09-09
7
+
8
+ ### Improved
9
+
10
+ - Attendee and viewer avatars use a slimmer border.
11
+
6
12
  ## 2026-09-04
7
13
 
8
14
  ### Fixed
@@ -5,8 +5,13 @@ time from the command menu (Cmd+K → "What's new").
5
5
 
6
6
  ## 2026-09-09
7
7
 
8
+ ### Added
9
+
10
+ - Connected agents can set up ordinary databases, configure fields and table views, and recover them from Trash with verified results.
11
+
8
12
  ### Fixed
9
13
 
14
+ - First title edits no longer hit a stale-version conflict, open databases recover after agent Trash and restore actions, and database settings preserve keyboard focus when closing or returning to Add property. Source-managed database fields stay read-only in tables, page property editors, and agent actions, while local fields remain editable. Property editors stay inside mobile Info so edits can be saved without closing the panel.
10
15
  - Remote collaborator cursors in the document editor now stay compact above the text instead of expanding into full-width color bars.
11
16
 
12
17
  ## 2026-09-03
@@ -3118,7 +3118,7 @@ const localFilesMessages = {
3118
3118
  importedLocalFiles: "Imported local files",
3119
3119
  importedSource: "Imported source",
3120
3120
  lastSync: "Last sync",
3121
- localFolders: "Local folders",
3121
+ localFolders: "Folders",
3122
3122
  mainFolder: "Main folder",
3123
3123
  metaTitle: "Local files - Content",
3124
3124
  noFoldersLinked: "No folders linked",
@@ -3659,7 +3659,7 @@ const rawLiteralLocaleMessages: Partial<Record<LocaleCode, PartialMessages>> = {
3659
3659
  folderLinked: "已链接 {{count}} 个文件夹",
3660
3660
  foldersLinked: "已链接 {{count}} 个文件夹",
3661
3661
  lastSync: "上次同步",
3662
- localFolders: "本地文件夹",
3662
+ localFolders: "文件夹",
3663
3663
  mainFolder: "主文件夹",
3664
3664
  metaTitle: "本地文件 - Content",
3665
3665
  noFoldersLinked: "未链接文件夹",
@@ -3900,7 +3900,7 @@ const rawLiteralLocaleMessages: Partial<Record<LocaleCode, PartialMessages>> = {
3900
3900
  folderLinked: "{{count}} carpeta enlazada",
3901
3901
  foldersLinked: "{{count}} carpetas enlazadas",
3902
3902
  lastSync: "Última sincronización",
3903
- localFolders: "Carpetas locales",
3903
+ localFolders: "Carpetas",
3904
3904
  mainFolder: "Carpeta principal",
3905
3905
  metaTitle: "Archivos locales - Content",
3906
3906
  noFoldersLinked: "No hay carpetas enlazadas",
@@ -22,6 +22,15 @@ export function hasInterruptedNativeFolderPickerAttempt(
22
22
  }
23
23
  }
24
24
 
25
+ export function isUserCancelledFolderPickerError(error: unknown): boolean {
26
+ // DOMException does not extend Error, so check by name/code instead of
27
+ // `instanceof Error`. `showDirectoryPicker()` rejects with this shape when
28
+ // the user dismisses the native picker without choosing a folder.
29
+ if (typeof error !== "object" || error === null) return false;
30
+ const named = error as { name?: unknown; code?: unknown };
31
+ return named.name === "AbortError" || named.code === DOMException.ABORT_ERR;
32
+ }
33
+
25
34
  export async function runNativeFolderPickerWithCrashSentinel<T>(
26
35
  operation: () => Promise<T>,
27
36
  options: {
@@ -53,6 +53,7 @@ import {
53
53
  } from "@/lib/local-folder-live-sync";
54
54
  import {
55
55
  hasInterruptedNativeFolderPickerAttempt,
56
+ isUserCancelledFolderPickerError,
56
57
  runNativeFolderPickerWithCrashSentinel,
57
58
  } from "@/lib/local-folder-picker-safety";
58
59
  import { isUnsafeNativeFolderPickerHost } from "@/lib/local-folder-picker-support";
@@ -1163,6 +1164,10 @@ export default function LocalFilesRoute() {
1163
1164
  toast.success(t("localFiles.pulledLocalFiles"));
1164
1165
  await connectLocalComponentWorkspaces([selected]);
1165
1166
  } catch (err) {
1167
+ if (isUserCancelledFolderPickerError(err)) {
1168
+ // Backing out of the native picker isn't a failure worth surfacing.
1169
+ return;
1170
+ }
1166
1171
  setStatus({
1167
1172
  kind: "error",
1168
1173
  title: t("localFiles.folderAddFailed"),
@@ -3,6 +3,12 @@
3
3
  All notable user-facing changes to Design 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-09-09
7
+
8
+ ### Improved
9
+
10
+ - Collaborator avatars in the design editor use a slimmer border.
11
+
6
12
  ## 2026-09-04
7
13
 
8
14
  ### Improved
@@ -3,10 +3,28 @@
3
3
  All notable user-facing changes to Chat are documented here. Open it any
4
4
  time from the command menu (Cmd+K → "What's new").
5
5
 
6
+ ## 2026-09-08
7
+
8
+ ### Fixed
9
+
10
+ - A second GitHub or Sentry automation no longer flips to Slack, and author filters, destinations, and Run now keep the job you actually saved.
11
+ - The automation editor now shows the saved values after you save, refuses to Run now while edits are unsaved, and says so when the automation you opened no longer exists.
12
+ - Factory automations keep Slack channels and display names after enable, disable, or schedule updates.
13
+ - Tagging @builderio-bot now works for factories whose GitHub repository comes from their automation instead of the factory's own field, and a dispatch that would post to a different repository than the factory is configured for is refused instead of posting there.
14
+ - GitHub polling now looks past a page of filtered-out authors or already-queued items to find the pull requests and issues you asked for, and a run that stopped early is recorded as incomplete with the reason named — more pages remained, the author filter skipped something, or the inbox limit was reached — instead of blaming the author filter for all three.
15
+ - PR governance now accepts the repository configured on the automation, so pull requests polled into the inbox are no longer rejected as out of scope when the factory's own repository field is empty.
16
+
6
17
  ## 2026-09-04
7
18
 
19
+ ### Improved
20
+
21
+ - Inbox rows now show the GitHub pull request or issue title instead of the first line of its description, and the detail view gives every item a title, a single metadata line, and separated Reason, Evidence, and Log sections so Slack and GitHub items read the same way.
22
+
8
23
  ### Fixed
9
24
 
25
+ - Audit run rows now show the GitHub pull request or issue title in the collapsible header instead of the first line of its description, and Slack rows keep using the message text because those items have no title of their own.
26
+ - An automation's GitHub author filter now applies when items are polled instead of only when the inbox is read, so pull requests from other authors no longer fill the inbox and consume the item limit ahead of the authors you asked for.
27
+ - PR babysitting now accepts the repository configured on the automation, so pull requests that were polled into the inbox no longer sit unreviewed when the factory's own repository field is empty.
10
28
  - The Automations tab still lists Factory jobs after their domain tag is missing.
11
29
  - The built-in Factory map can be saved the first time without a stale-version error.
12
30
  - Agent view-screen follows the Factory tab you are looking at when more than one is open.
@@ -3,6 +3,26 @@
3
3
  All notable user-facing changes to Agent-Native Mail 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-09-09
7
+
8
+ ### Improved
9
+
10
+ - Account avatars use a slimmer border.
11
+
12
+ ### Fixed
13
+
14
+ - Select the first top label by default on open, cycle labels with Tab from anywhere, and eliminate skeleton flicker on label change
15
+
16
+ ## 2026-09-08
17
+
18
+ ### Improved
19
+
20
+ - Login pages use the same mouse-reactive wave background as the docs and booking experiences.
21
+
22
+ ### Fixed
23
+
24
+ - Mail renders Gmail signature email and social links correctly
25
+
6
26
  ## 2026-09-04
7
27
 
8
28
  ### Fixed
@@ -3,6 +3,12 @@
3
3
  All notable user-facing changes to Agent-Native Plan are documented here. Open it any
4
4
  time from the command menu (Cmd+K → "What's new").
5
5
 
6
+ ## 2026-09-09
7
+
8
+ ### Improved
9
+
10
+ - Collaborator avatars use a slimmer border.
11
+
6
12
  ## 2026-09-02
7
13
 
8
14
  ### Improved
@@ -157,7 +157,7 @@ pnpm action add-slide --deckId=<id> --layout content --content "..."
157
157
  Every slide's `content` must use this exact outer div:
158
158
 
159
159
  ```html
160
- <div class="fmd-slide" style="padding: 80px 110px; display: flex; flex-direction: column; justify-content: flex-start; font-family: var(--ds-body-font, sans-serif);">
160
+ <div class="fmd-slide" style="padding: 64px 80px; display: flex; flex-direction: column; justify-content: flex-start; font-family: var(--ds-body-font, Inter, sans-serif);">
161
161
  <!-- slide content here -->
162
162
  </div>
163
163
  ```
@@ -171,8 +171,8 @@ Poppins, cyan, white, black, or a stock radius into new markup.
171
171
  ## Fit budget
172
172
 
173
173
  The canvas is fixed at its aspect-ratio dimensions. With the standard 16:9
174
- canvas (960x540) and `padding: 80px 110px`, the usable content area is only
175
- 740x380px. Treat that as a hard budget for the main flow: use at most two title
174
+ canvas (960x540) and `padding: 64px 80px`, the usable content area is only
175
+ 800x412px. Treat that as a hard budget for the main flow: use at most two title
176
176
  lines, three short bullets or cards, and two or three short items per column.
177
177
  Split dense source material across slides instead of shrinking it into a dense
178
178
  stack. Keep body text at or above 16px. Never hide overflow with zoom,
@@ -180,13 +180,16 @@ stack. Keep body text at or above 16px. Never hide overflow with zoom,
180
180
  may reduce the slide's explicit padding, and that padding must remain intact
181
181
  when the saved HTML is rendered.
182
182
 
183
- Background is pure black (`bg-[#000000]`) set by the renderer, not the slide HTML.
184
-
185
- When no reference deck or hydrated design system is available, use a restrained,
186
- content-first visual language. Do not invent colorful cards, boxes, or
187
- decorative rectangles behind or over text. Add a colored shape only when it has
188
- a clear semantic role and leaves the text unobscured; prefer typography,
189
- spacing, alignment, and one restrained accent.
183
+ When no reference deck or hydrated design system is available, use the fallback
184
+ direction: warm neutral paper (`#F5F2EA`), ink text (`#1F2933`), Inter or a
185
+ close sans-serif, 64px vertical and 80px horizontal padding, and one restrained
186
+ blue or coral accent. Build an intentional composition beyond a text dump: use
187
+ a title block, two-column split, metric treatment, rule, callout, visual
188
+ placeholder, or simple diagram where it fits the message. Never use a black
189
+ background with white text as the generic fallback, never omit the padded
190
+ wrapper, and never let body copy touch the canvas edge. Do not add decorative
191
+ cards or shapes without a semantic role, and keep any accent treatment away
192
+ from text so contrast stays readable.
190
193
 
191
194
  ## Bounded visual QA
192
195
 
@@ -200,149 +203,46 @@ was rendered and compared.
200
203
 
201
204
  ## Ready-to-Use Templates
202
205
 
203
- Copy and fill in the bracketed values. Use `\` to escape quotes inside the JSON string.
204
-
205
- ---
206
+ Copy and fill in the bracketed values. Keep the wrapper styles and replace
207
+ tokens with the hydrated design-system values when available.
206
208
 
207
209
  ### Title Slide
208
210
 
209
211
  ```html
210
- <div class="fmd-slide" style="padding: 80px 110px; display: flex; flex-direction: column; justify-content: center; align-items: flex-start; font-family: 'Poppins', sans-serif;">
211
- <div style="font-size: 16px; font-weight: 700; letter-spacing: 3px; text-transform: uppercase; color: #00E5FF; margin-bottom: 24px;">[LABEL OR DATE]</div>
212
- <h1 style="font-size: 64px; font-weight: 900; color: #fff; line-height: 1.1; letter-spacing: -2px; margin: 0 0 24px 0;">[TITLE]</h1>
213
- <p style="font-size: 22px; color: rgba(255,255,255,0.55); margin: 0;">[SUBTITLE OR PRESENTER]</p>
212
+ <div class="fmd-slide" style="padding: 64px 80px; display: flex; flex-direction: column; justify-content: center; align-items: flex-start; gap: 18px; font-family: var(--ds-body-font, Inter, sans-serif);">
213
+ <div style="font-size: 14px; font-weight: 700; letter-spacing: 0.12em; text-transform: uppercase; color: var(--ds-accent, #2457D6);">[LABEL OR DATE]</div>
214
+ <h1 style="font-size: 56px; font-weight: 750; color: var(--ds-text, #1F2933); line-height: 1.05; letter-spacing: -0.04em; margin: 0; max-width: 760px;">[TITLE]</h1>
215
+ <p style="font-size: 20px; color: var(--ds-text-muted, #667085); margin: 4px 0 0;">[SUBTITLE OR PRESENTER]</p>
214
216
  </div>
215
217
  ```
216
218
 
217
- ---
218
-
219
- ### Section Divider
219
+ ### Content or Two-Column Slide
220
220
 
221
221
  ```html
222
- <div class="fmd-slide" style="padding: 80px 110px; display: flex; flex-direction: column; justify-content: center; align-items: flex-start; font-family: 'Poppins', sans-serif;">
223
- <div style="font-size: 16px; font-weight: 700; letter-spacing: 3px; text-transform: uppercase; color: #00E5FF; margin-bottom: 20px;">[SECTION NUMBER, e.g. 01]</div>
224
- <h2 style="font-size: 72px; font-weight: 900; color: #fff; line-height: 1.05; letter-spacing: -2px; margin: 0;">[SECTION TITLE]</h2>
225
- </div>
226
- ```
227
-
228
- ---
229
-
230
- ### Content Slide (bullets)
231
-
232
- ```html
233
- <div class="fmd-slide" style="padding: 80px 110px; display: flex; flex-direction: column; justify-content: flex-start; font-family: 'Poppins', sans-serif;">
234
- <div style="font-size: 14px; font-weight: 700; letter-spacing: 3px; text-transform: uppercase; color: #00E5FF; margin-bottom: 16px;">[SECTION LABEL]</div>
235
- <h2 style="font-size: 40px; font-weight: 900; color: #fff; line-height: 1.15; letter-spacing: -1px; margin: 0 0 48px 0;">[SLIDE HEADING]</h2>
236
- <div style="display: flex; flex-direction: column; gap: 20px;">
237
- <div style="display: flex; align-items: flex-start; gap: 16px;">
238
- <span style="font-size: 8px; color: #fff; margin-top: 8px; flex-shrink: 0;">&#x25CF;</span>
239
- <span style="font-size: 22px; color: rgba(255,255,255,0.85); line-height: 1.5;">[BULLET TEXT]</span>
240
- </div>
241
- <div style="display: flex; align-items: flex-start; gap: 16px;">
242
- <span style="font-size: 8px; color: #fff; margin-top: 8px; flex-shrink: 0;">&#x25CF;</span>
243
- <span style="font-size: 22px; color: rgba(255,255,255,0.85); line-height: 1.5;">[BULLET TEXT]</span>
244
- </div>
245
- <div style="display: flex; align-items: flex-start; gap: 16px;">
246
- <span style="font-size: 8px; color: #fff; margin-top: 8px; flex-shrink: 0;">&#x25CF;</span>
247
- <span style="font-size: 22px; color: rgba(255,255,255,0.85); line-height: 1.5;">[BULLET TEXT]</span>
222
+ <div class="fmd-slide" style="padding: 64px 80px; display: flex; flex-direction: column; justify-content: flex-start; gap: 18px; font-family: var(--ds-body-font, Inter, sans-serif);">
223
+ <div style="font-size: 13px; font-weight: 700; letter-spacing: 0.1em; text-transform: uppercase; color: var(--ds-accent, #2457D6);">[SECTION LABEL]</div>
224
+ <h2 style="font-size: 34px; font-weight: 750; color: var(--ds-text, #1F2933); line-height: 1.12; letter-spacing: -0.03em; margin: 0 0 18px;">[SLIDE HEADING]</h2>
225
+ <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 24px; align-items: start;">
226
+ <div style="display: flex; flex-direction: column; gap: 14px;">
227
+ <div style="border-left: 3px solid var(--ds-accent, #2457D6); padding: 12px 16px; background: var(--ds-surface, #FFFFFF); border-radius: var(--ds-radius, 14px); font-size: 18px; line-height: 1.4;">[KEY POINT]</div>
228
+ <div style="border-left: 3px solid var(--ds-secondary, #C85C3A); padding: 12px 16px; background: var(--ds-surface, #FFFFFF); border-radius: var(--ds-radius, 14px); font-size: 18px; line-height: 1.4;">[KEY POINT]</div>
248
229
  </div>
230
+ <div class="fmd-img-placeholder" style="min-height: 220px; border-radius: var(--ds-radius, 14px);">[VISUAL OR IMAGE DESCRIPTION]</div>
249
231
  </div>
250
232
  </div>
251
233
  ```
252
234
 
253
- ---
254
-
255
- ### Two-Column Slide (text left, image/visual right)
256
-
257
- ```html
258
- <div class="fmd-slide" style="padding: 80px 110px; display: flex; flex-direction: column; justify-content: flex-start; font-family: 'Poppins', sans-serif;">
259
- <div style="font-size: 14px; font-weight: 700; letter-spacing: 3px; text-transform: uppercase; color: #00E5FF; margin-bottom: 16px;">[SECTION LABEL]</div>
260
- <h2 style="font-size: 40px; font-weight: 900; color: #fff; line-height: 1.15; letter-spacing: -1px; margin: 0 0 40px 0;">[HEADING]</h2>
261
- <div style="display: flex; gap: 60px; flex: 1;">
262
- <div style="flex: 1; display: flex; flex-direction: column; gap: 20px;">
263
- <div style="display: flex; align-items: flex-start; gap: 16px;">
264
- <span style="font-size: 8px; color: #fff; margin-top: 8px; flex-shrink: 0;">&#x25CF;</span>
265
- <span style="font-size: 20px; color: rgba(255,255,255,0.85); line-height: 1.5;">[BULLET]</span>
266
- </div>
267
- <div style="display: flex; align-items: flex-start; gap: 16px;">
268
- <span style="font-size: 8px; color: #fff; margin-top: 8px; flex-shrink: 0;">&#x25CF;</span>
269
- <span style="font-size: 20px; color: rgba(255,255,255,0.85); line-height: 1.5;">[BULLET]</span>
270
- </div>
271
- </div>
272
- <div class="fmd-img-placeholder" style="flex: 1; border-radius: 12px; min-height: 300px;">[IMAGE DESCRIPTION]</div>
273
- </div>
274
- </div>
275
- ```
276
-
277
- ---
278
-
279
- ### Statement / Quote Slide
280
-
281
- ```html
282
- <div class="fmd-slide" style="padding: 80px 110px; display: flex; flex-direction: column; justify-content: center; align-items: flex-start; font-family: 'Poppins', sans-serif;">
283
- <div style="width: 60px; height: 4px; background: #00E5FF; margin-bottom: 40px;"></div>
284
- <p style="font-size: 48px; font-weight: 800; color: #fff; line-height: 1.2; letter-spacing: -1px; margin: 0 0 32px 0;">&ldquo;[STATEMENT OR QUOTE]&rdquo;</p>
285
- <p style="font-size: 18px; color: rgba(255,255,255,0.45); margin: 0;">[SOURCE OR ATTRIBUTION]</p>
286
- </div>
287
- ```
288
-
289
- ---
290
-
291
- ### Metrics / Stats Slide
292
-
293
- ```html
294
- <div class="fmd-slide" style="padding: 80px 110px; display: flex; flex-direction: column; justify-content: flex-start; font-family: 'Poppins', sans-serif;">
295
- <div style="font-size: 14px; font-weight: 700; letter-spacing: 3px; text-transform: uppercase; color: #00E5FF; margin-bottom: 16px;">[SECTION LABEL]</div>
296
- <h2 style="font-size: 40px; font-weight: 900; color: #fff; line-height: 1.15; letter-spacing: -1px; margin: 0 0 60px 0;">[HEADING]</h2>
297
- <div style="display: flex; gap: 60px;">
298
- <div style="flex: 1;">
299
- <div style="font-size: 72px; font-weight: 900; color: #00E5FF; letter-spacing: -2px; line-height: 1;">[METRIC]</div>
300
- <div style="font-size: 18px; color: rgba(255,255,255,0.55); margin-top: 12px;">[LABEL]</div>
301
- </div>
302
- <div style="flex: 1;">
303
- <div style="font-size: 72px; font-weight: 900; color: #00E5FF; letter-spacing: -2px; line-height: 1;">[METRIC]</div>
304
- <div style="font-size: 18px; color: rgba(255,255,255,0.55); margin-top: 12px;">[LABEL]</div>
305
- </div>
306
- <div style="flex: 1;">
307
- <div style="font-size: 72px; font-weight: 900; color: #00E5FF; letter-spacing: -2px; line-height: 1;">[METRIC]</div>
308
- <div style="font-size: 18px; color: rgba(255,255,255,0.55); margin-top: 12px;">[LABEL]</div>
309
- </div>
310
- </div>
311
- </div>
312
- ```
313
-
314
- ---
315
-
316
- ### Closing / CTA Slide
317
-
318
- ```html
319
- <div class="fmd-slide" style="padding: 80px 110px; display: flex; flex-direction: column; justify-content: center; align-items: flex-start; font-family: 'Poppins', sans-serif;">
320
- <div style="font-size: 16px; font-weight: 700; letter-spacing: 3px; text-transform: uppercase; color: #00E5FF; margin-bottom: 24px;">[LABEL, e.g. GET STARTED]</div>
321
- <h2 style="font-size: 64px; font-weight: 900; color: #fff; line-height: 1.1; letter-spacing: -2px; margin: 0 0 32px 0;">[CLOSING STATEMENT]</h2>
322
- <p style="font-size: 22px; color: rgba(255,255,255,0.55); margin: 0;">[CONTACT OR NEXT STEP]</p>
323
- </div>
324
- ```
235
+ Use the same wrapper and tokens for section, statement, metrics, and closing
236
+ slides, changing only the composition. An image placeholder, metric row,
237
+ short rule, or callout should support the message, not fill empty space.
325
238
 
326
239
  ## Image Placeholders
327
240
 
328
- When a slide needs a visual, use this div it renders as a styled placeholder and can later be replaced with a generated image:
329
-
330
- ```html
331
- <div class="fmd-img-placeholder" style="width: 100%; height: 300px; border-radius: 12px;">[Description of what image should show]</div>
332
- ```
333
-
334
- ## Bold Terms with Description
335
-
336
- For definition-style bullets:
241
+ When a slide needs a visual, use this div. It renders as a styled placeholder
242
+ and can later be replaced with a generated image:
337
243
 
338
244
  ```html
339
- <div style="display: flex; align-items: flex-start; gap: 16px;">
340
- <span style="font-size: 8px; color: #fff; margin-top: 8px; flex-shrink: 0;">&#x25CF;</span>
341
- <span style="font-size: 22px; line-height: 1.5;">
342
- <strong style="font-weight: 800; color: #fff;">[Term]</strong>
343
- <span style="color: rgba(255,255,255,0.55);"> — [description]</span>
344
- </span>
345
- </div>
245
+ <div class="fmd-img-placeholder" style="width: 100%; min-height: 220px; border-radius: var(--ds-radius, 14px);">[Description of what image should show]</div>
346
246
  ```
347
247
 
348
248
  ## Bulk Replacement Only
@@ -351,24 +251,8 @@ Use a non-empty `create-deck --slides '[...]'` payload only for imports or an
351
251
  intentional atomic bulk replacement. For normal AI-generated decks, use the
352
252
  empty-deck plus sequential `add-slide` workflow above.
353
253
 
354
- A bulk payload looks like this:
355
-
356
- ```bash
357
- pnpm action create-deck --title "Product Vision 2025" --slides '[
358
- {
359
- "id": "slide-1",
360
- "layout": "title",
361
- "content": "<div class=\"fmd-slide\" style=\"padding: 80px 110px; display: flex; flex-direction: column; justify-content: center; align-items: flex-start; font-family: '\''Poppins'\'', sans-serif;\"><div style=\"font-size: 16px; font-weight: 700; letter-spacing: 3px; text-transform: uppercase; color: #00E5FF; margin-bottom: 24px;\">ANNUAL STRATEGY</div><h1 style=\"font-size: 64px; font-weight: 900; color: #fff; line-height: 1.1; letter-spacing: -2px; margin: 0 0 24px 0;\">Product Vision 2025</h1><p style=\"font-size: 22px; color: rgba(255,255,255,0.55); margin: 0;\">Engineering Leadership — Q1 2025</p></div>"
362
- },
363
- {
364
- "id": "slide-2",
365
- "layout": "content",
366
- "content": "<div class=\"fmd-slide\" style=\"padding: 80px 110px; display: flex; flex-direction: column; justify-content: flex-start; font-family: '\''Poppins'\'', sans-serif;\"><div style=\"font-size: 14px; font-weight: 700; letter-spacing: 3px; text-transform: uppercase; color: #00E5FF; margin-bottom: 16px;\">OVERVIEW</div><h2 style=\"font-size: 40px; font-weight: 900; color: #fff; line-height: 1.15; letter-spacing: -1px; margin: 0 0 48px 0;\">Three Core Priorities</h2><div style=\"display: flex; flex-direction: column; gap: 20px;\"><div style=\"display: flex; align-items: flex-start; gap: 16px;\"><span style=\"font-size: 8px; color: #fff; margin-top: 8px; flex-shrink: 0;\">&#x25CF;</span><span style=\"font-size: 22px; color: rgba(255,255,255,0.85); line-height: 1.5;\">Ship the agent platform by March</span></div><div style=\"display: flex; align-items: flex-start; gap: 16px;\"><span style=\"font-size: 8px; color: #fff; margin-top: 8px; flex-shrink: 0;\">&#x25CF;</span><span style=\"font-size: 22px; color: rgba(255,255,255,0.85); line-height: 1.5;\">Grow to 10k active teams</span></div><div style=\"display: flex; align-items: flex-start; gap: 16px;\"><span style=\"font-size: 8px; color: #fff; margin-top: 8px; flex-shrink: 0;\">&#x25CF;</span><span style=\"font-size: 22px; color: rgba(255,255,255,0.85); line-height: 1.5;\">Reduce time-to-value to under 5 minutes</span></div></div></div>"
367
- }
368
- ]'
369
- ```
370
-
371
- After creating, navigate to the deck:
254
+ For a bulk replacement, pass the same fully styled HTML templates in the
255
+ `slides` array. After creating, navigate to the deck:
372
256
  ```bash
373
257
  pnpm action navigate --deckId=<id>
374
258
  ```
@@ -3,6 +3,17 @@
3
3
  All notable user-facing changes to Agent-Native Slides are documented here. Open it any
4
4
  time from the command menu (Cmd+K → "What's new").
5
5
 
6
+ ## 2026-09-09
7
+
8
+ ### Improved
9
+
10
+ - Comment and editor avatars use a slimmer border.
11
+ - Slides use a polished light visual style by default when no brand system is selected.
12
+
13
+ ### Fixed
14
+
15
+ - When an agent's slide edit does not match the slide, it now says so instead of reporting an internal server error, so the agent can correct the edit rather than retrying the same one.
16
+
6
17
  ## 2026-09-03
7
18
 
8
19
  ### Fixed
@@ -115,6 +115,7 @@ export default defineAction({
115
115
  "For an agent-generated deck with a persisted target slide count, stop once that count is reached. If the user explicitly asks for more slides after the target, re-read the deck and set targetSlideCountOverride to the new total on the first add-slide call. " +
116
116
  "Before the first slide you add to an existing deck, call `get-deck` with compact=true once and use its `designSystem`, `deckStyle`, and `representativeSlideId`; if designSystem.scope is summary, call `get-design-system` once with its id. Reuse that context for every following slide. Never use generic slide styling from an id alone. " +
117
117
  "Pass presenter-only speaker notes in `notes`; keep them out of the slide HTML. " +
118
+ "Every new slide must be a fully styled composition with the exact padded `fmd-slide` wrapper, a clear type hierarchy, intentional alignment, readable contrast, and at least one visual or structural treatment beyond plain text. If no design system is linked, use a light neutral canvas with ink text and one or two restrained accents; never default to a black canvas with white text. " +
118
119
  "For a single-call bulk append, use `patch-deck` with add-slide operations. " +
119
120
  "Returns the new slide ID, 1-based slideNumber, updated slide count, and pending layoutFit identity that can be checked later with get-layout-overflows.",
120
121
  schema: z.object({
@@ -123,7 +123,7 @@ export default defineAction({
123
123
  "For longer decks or live in-app generation, create the deck with slides: [] and then use add-slide sequentially so progress appears live; the new deck is also opened in the connected Slides UI. " +
124
124
  "Pass presenter-only speaker notes in each slide's `notes` field; keep them out of slide HTML. " +
125
125
  "Pass deckId to replace an existing deck. " +
126
- "Returns the deck id, title, effective designSystemId, linked designSystem.agentContext when readable, and slide count. Apply that context before authoring slides.",
126
+ "Returns the deck id, title, effective designSystemId, linked designSystem.agentContext when readable, and slide count. Apply that context before authoring slides. Every generated slide must be a fully styled composition with the exact padded `fmd-slide` wrapper, a clear type hierarchy, intentional alignment, readable contrast, and at least one visual or structural treatment beyond plain text. If no design system is linked, use a light neutral canvas with ink text and one or two restrained accents; never default to a black canvas with white text.",
127
127
  schema: z.object({
128
128
  title: z.string().describe("Deck title"),
129
129
  slides: SlidesSchema.describe(