@agent-native/core 0.165.0 → 0.165.2

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 (58) hide show
  1. package/corpus/README.md +1 -1
  2. package/corpus/templates/analytics/CHANGELOG.md +37 -3
  3. package/corpus/templates/analytics/changelog/2026-08-20-staged-data-limit-recovery.md +5 -0
  4. package/corpus/templates/assets/CHANGELOG.md +36 -2
  5. package/corpus/templates/brain/CHANGELOG.md +33 -3
  6. package/corpus/templates/calendar/CHANGELOG.md +45 -2
  7. package/corpus/templates/chat/CHANGELOG.md +29 -3
  8. package/corpus/templates/clips/CHANGELOG.md +55 -2
  9. package/corpus/templates/clips/app/i18n/en-US.ts +0 -9
  10. package/corpus/templates/clips/app/root.tsx +2 -1
  11. package/corpus/templates/clips/app/routes/_app.settings._index.tsx +3 -3
  12. package/corpus/templates/clips/changelog/2026-08-20-cross-tab-recording-controls.md +5 -0
  13. package/corpus/templates/clips/changelog/2026-08-20-overlay-follow-review-fixes.md +5 -0
  14. package/corpus/templates/clips/changelog/2026-08-20-provider-key-recovery.md +5 -0
  15. package/corpus/templates/clips/chrome-extension/PERMISSIONS.md +29 -46
  16. package/corpus/templates/clips/chrome-extension/STORE_DRAFT.md +1 -1
  17. package/corpus/templates/clips/chrome-extension/public/manifest.json +9 -2
  18. package/corpus/templates/clips/chrome-extension/src/background.ts +65 -46
  19. package/corpus/templates/clips/chrome-extension/src/content-script.ts +25 -17
  20. package/corpus/templates/clips/chrome-extension/src/overlay-follow.ts +25 -0
  21. package/corpus/templates/content/CHANGELOG.md +45 -2
  22. package/corpus/templates/crm/CHANGELOG.md +28 -16
  23. package/corpus/templates/design/CHANGELOG.md +54 -2
  24. package/corpus/templates/dispatch/CHANGELOG.md +51 -2
  25. package/corpus/templates/dispatch/changelog/2026-08-20-dispatch-chat-loads-openrouter-provider-reliably.md +6 -0
  26. package/corpus/templates/dispatch/package.json +2 -0
  27. package/corpus/templates/factory/CHANGELOG.md +28 -2
  28. package/corpus/templates/forms/CHANGELOG.md +39 -3
  29. package/corpus/templates/macros/CHANGELOG.md +30 -2
  30. package/corpus/templates/macros/netlify.toml +2 -0
  31. package/corpus/templates/mail/CHANGELOG.md +34 -3
  32. package/corpus/templates/plan/CHANGELOG.md +34 -3
  33. package/corpus/templates/slides/CHANGELOG.md +73 -2
  34. package/corpus/templates/tasks/CHANGELOG.md +35 -0
  35. package/corpus/templates/tasks/app/root.tsx +8 -1
  36. package/dist/changelog/parse.d.ts +12 -4
  37. package/dist/changelog/parse.js +61 -23
  38. package/dist/cli/changelog.js +9 -11
  39. package/dist/client/chat/run-recovery.js +8 -3
  40. package/dist/client/integrations/IntegrationsPanel.js +12 -1
  41. package/dist/collab/routes.d.ts +1 -1
  42. package/dist/mcp/screen-memory-stdio.d.ts +7 -7
  43. package/dist/mcp-client/oauth-routes.d.ts +1 -0
  44. package/dist/mcp-client/oauth-routes.js +37 -9
  45. package/dist/mcp-client/remote-store.d.ts +12 -0
  46. package/dist/mcp-client/remote-store.js +71 -0
  47. package/dist/notifications/routes.d.ts +3 -3
  48. package/dist/provider-api/actions/provider-api.js +16 -4
  49. package/dist/resources/handlers.d.ts +2 -2
  50. package/dist/templates/chat/CHANGELOG.md +29 -3
  51. package/package.json +1 -1
  52. package/src/templates/chat/CHANGELOG.md +29 -3
  53. package/corpus/templates/.retired/issues/package.json +0 -7
  54. package/corpus/templates/.retired/meeting-notes/package.json +0 -7
  55. package/corpus/templates/.retired/recruiting/package.json +0 -7
  56. package/corpus/templates/.retired/scheduling/package.json +0 -7
  57. package/corpus/templates/.retired/voice/package.json +0 -7
  58. package/corpus/templates/voice/.agents/skills/upgrade-agent-native/SKILL.md +0 -87
@@ -12,6 +12,8 @@ NPM_CONFIG_PRODUCTION = "false"
12
12
 
13
13
  [context.production.environment]
14
14
  AGENT_NATIVE_HOSTED_HARNESS = "true"
15
+ AGENT_NATIVE_ENABLE_KEEP_WARM = "1"
16
+ AGENT_NATIVE_DISABLE_KEEP_WARM_BACKGROUND = "1"
15
17
  # Macros owns its schema at release time (`migrate:production` above), so
16
18
  # production request functions must not probe the database for migrations.
17
19
  # Preview functions still run request-path migrations because previews do not
@@ -3,8 +3,39 @@
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-06-23
6
+ Older updates live in [the changelog folder](./changelog/) and are included in the in-app "What's new" view.
7
7
 
8
- ### Added
8
+ ## 2026-08-18
9
9
 
10
- - See what's new right inside Agent-Native Mail — a changelog now lives in the command menu (Cmd+K) and in Settings.
10
+ ### Fixed
11
+
12
+ - Pinned labels now keep loading until matching inbox messages are found.
13
+
14
+ ## 2026-08-17
15
+
16
+ ### Fixed
17
+
18
+ - Gmail signatures now preserve images and support paste or upload in Mail
19
+ - Mail now updates durable drafting preferences without opening a draft
20
+
21
+ ## 2026-08-12
22
+
23
+ ### Fixed
24
+
25
+ - Agent-sent messages appear in Mail immediately after Gmail sends them.
26
+
27
+ ## 2026-08-11
28
+
29
+ ### Improved
30
+
31
+ - Google sign-in now opens the Gmail connection flow directly
32
+
33
+ ### Fixed
34
+
35
+ - Chrome no longer offers to install Mail as a desktop app.
36
+
37
+ ## 2026-08-06
38
+
39
+ ### Improved
40
+
41
+ - Long-running mail requests now continue in the background instead of stopping at the foreground time limit.
@@ -3,8 +3,39 @@
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-06-23
6
+ Older updates live in [the changelog folder](./changelog/) and are included in the in-app "What's new" view.
7
7
 
8
- ### Added
8
+ ## 2026-08-19
9
9
 
10
- - See what's new right inside Agent-Native Plan — a changelog now lives in the command menu (Cmd+K).
10
+ ### Improved
11
+
12
+ - Plan prompts now guide you to connect AI before sending and offer a clear retry after setup.
13
+
14
+ ## 2026-08-12
15
+
16
+ ### Improved
17
+
18
+ - Shared plans now distinguish read-only viewers from commenters who can add review feedback without editing the plan.
19
+
20
+ ## 2026-08-11
21
+
22
+ ### Improved
23
+
24
+ - Plan sharing now identifies viewers who can add comments
25
+
26
+ ### Fixed
27
+
28
+ - Chrome no longer offers to install Plan as a desktop app.
29
+ - Plan no longer reloads when runtime state changes
30
+
31
+ ## 2026-08-10
32
+
33
+ ### Improved
34
+
35
+ - Full-page chat now uses the available width up to 1000px for more comfortable prompts and responses.
36
+
37
+ ## 2026-08-07
38
+
39
+ ### Improved
40
+
41
+ - Inline help icons now stay visually balanced with nearby text
@@ -3,8 +3,79 @@
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-06-23
6
+ Older updates live in [the changelog folder](./changelog/) and are included in the in-app "What's new" view.
7
+
8
+ ## 2026-08-18
9
+
10
+ ### Improved
11
+
12
+ - Private deck links now explain access and let viewers notify the owner
13
+
14
+ ### Fixed
15
+
16
+ - Decks now appear correctly under Mine.
17
+ - Generated slides now preserve requested speaker notes.
18
+
19
+ ## 2026-08-17
20
+
21
+ ### Improved
22
+
23
+ - Slides now keep generated layouts stable, surface both-axis overflow, and make slide and text-box editing easier to discover.
24
+
25
+ ## 2026-08-13
7
26
 
8
27
  ### Added
9
28
 
10
- - See what's new right inside Agent-Native Slides — a changelog now lives in the command menu (Cmd+K).
29
+ - Slide transitions can be set from a visible control in the slide toolbar instead of being agent-only
30
+
31
+ ### Fixed
32
+
33
+ - Clicking a slide thumbnail now focuses it, so the slide copy, paste, and delete shortcuts work after a plain click
34
+ - Duplicating or undoing the deletion of a slide now keeps its transition, animations, and image data after reload
35
+ - Opening presentation mode from the agent now starts on the requested slide instead of the first one
36
+
37
+ ## 2026-08-12
38
+
39
+ ### Added
40
+
41
+ - Duplicate a slide from the film strip with Cmd/Ctrl+C then Cmd/Ctrl+V
42
+
43
+ ### Improved
44
+
45
+ - Shared decks now distinguish read-only viewers from commenters who can add comments without editing slides.
46
+
47
+ ### Fixed
48
+
49
+ - Arrow-key navigation in the slide film strip now scrolls slides below the fold into view
50
+ - Presenting a deck now returns you to the slide you were viewing when you exit
51
+
52
+ ## 2026-08-11
53
+
54
+ ### Added
55
+
56
+ - Slides can copy and paste element styles with Cmd+Option+C/V and the context menu
57
+
58
+ ### Improved
59
+
60
+ - Agent chat now follows the current slide and selection
61
+ - Faster Slides chat deck reads
62
+ - History now opens from the deck overflow menu
63
+ - Images can be dropped directly onto slides and resized or repositioned freely
64
+ - Selected slide layers can be nudged precisely with arrow keys
65
+ - Share dialog roles now use Commenter terminology for people who can view and add comments.
66
+ - Slides chat can read one slide without loading the full deck
67
+ - Slides clearly indicate when an AI agent is editing alongside you.
68
+ - Slides support atomic code-style HTML patches without regenerating whole slides
69
+ - The style toolbar now uses the full available width
70
+
71
+ ### Fixed
72
+
73
+ - Chrome no longer offers to install Slides as a desktop app.
74
+ - Imported decks now use slide content for their title instead of a placeholder filename.
75
+ - New decks now transition directly to a full-page editor loading state
76
+ - PDF requests to restyle and preserve a source deck now import the full deck before editing
77
+ - Slide edits preserve their layout without introducing hidden duplicate elements or stale click reveals
78
+ - Slides reliably imports uploaded PDFs and presentations
79
+ - Slides shows one compact AI marker and keeps your current slide selected while new slides load as skeletons
80
+ - Text edits preserve slide layout when no changes are made
81
+ - Undo and redo now move one visible slide state at a time
@@ -0,0 +1,35 @@
1
+ # Changelog
2
+
3
+ All notable user-facing changes to this app are documented here.
4
+
5
+ Older updates live in [the changelog folder](./changelog/) and are included in the in-app "What's new" view.
6
+
7
+ ## 2026-08-11
8
+
9
+ ### Fixed
10
+
11
+ - Chrome no longer offers to install Tasks as a desktop app.
12
+
13
+ ## 2026-08-03
14
+
15
+ ### Fixed
16
+
17
+ - The Agent sidebar now opens the full Agent workspace for context, resources, connections, automations, and access.
18
+
19
+ ## 2026-07-31
20
+
21
+ ### Improved
22
+
23
+ - Clicking the Agent Native logo now toggles the app sidebar.
24
+
25
+ ## 2026-07-29
26
+
27
+ ### Improved
28
+
29
+ - Sidebar footers now keep Feedback, Search, and Collapse together, with language preferences available in Settings.
30
+
31
+ ## 2026-07-24
32
+
33
+ ### Improved
34
+
35
+ - Secondary controls and dashboard surfaces now use quieter borderless styling.
@@ -26,6 +26,8 @@ import { i18nCatalog } from "@/i18n";
26
26
  import { APP_TITLE } from "@/lib/app-config";
27
27
  import { TAB_ID } from "@/lib/tab-id";
28
28
 
29
+ import changelog from "../CHANGELOG.md?raw";
30
+
29
31
  import stylesheet from "./global.css?url";
30
32
 
31
33
  configureTracking({
@@ -135,7 +137,12 @@ function AppContent() {
135
137
  useCommandMenuShortcut(useCallback(() => setCmdkOpen(true), []));
136
138
  return (
137
139
  <>
138
- <CommandMenu open={cmdkOpen} onOpenChange={setCmdkOpen}>
140
+ <CommandMenu
141
+ open={cmdkOpen}
142
+ onOpenChange={setCmdkOpen}
143
+ changelog={changelog}
144
+ changelogKey="tasks"
145
+ >
139
146
  <CommandMenu.Group heading="Actions">
140
147
  <CommandMenu.Item onSelect={() => {}}>Search</CommandMenu.Item>
141
148
  </CommandMenu.Group>
@@ -24,7 +24,7 @@ export interface ChangelogEntry {
24
24
  /** Markdown body beneath the heading (until the next `## ` section). */
25
25
  body: string;
26
26
  }
27
- /** A not-yet-released entry authored as a `changelog/<file>.md` file. */
27
+ /** A folder-backed entry authored as a `changelog/<file>.md` file. */
28
28
  export interface PendingChangelogEntry {
29
29
  /** Category — `added`, `improved`, `fixed`, `changed`, etc. */
30
30
  type: ChangelogChangeType;
@@ -34,6 +34,8 @@ export interface PendingChangelogEntry {
34
34
  text: string;
35
35
  }
36
36
  export type ChangelogChangeType = "added" | "improved" | "fixed" | "changed" | "removed" | "security";
37
+ export declare const DEFAULT_CHANGELOG_RELEASE_LIMIT = 5;
38
+ export declare const CHANGELOG_ARCHIVE_NOTE = "Older updates live in [the changelog folder](./changelog/) and are included in the in-app \"What's new\" view.";
37
39
  /**
38
40
  * Order changes are grouped under a release heading. Anything not listed here
39
41
  * falls back to the "changed" group, then renders in insertion order.
@@ -70,9 +72,15 @@ declare const CHANGELOG_HEADER: string;
70
72
  export declare function rollupChangelog(existing: string, pending: PendingChangelogEntry[], releaseDate: string): string;
71
73
  /**
72
74
  * Render an app-facing changelog that includes both released CHANGELOG.md
73
- * sections and adjacent pending `changelog/*.md` entries. Unlike `release`,
74
- * this is pure and non-destructive, so build/dev bundles can show current
75
- * product notes without deleting the conflict-free pending files.
75
+ * sections and adjacent folder-backed `changelog/*.md` entries. This is pure
76
+ * and non-destructive, so build/dev bundles can show current product notes
77
+ * without moving or deleting the conflict-free entry files.
76
78
  */
77
79
  export declare function mergePendingChangelog(existing: string, pending: PendingChangelogEntry[]): string;
80
+ /**
81
+ * Keep a short, human-readable release window in `CHANGELOG.md` while the
82
+ * dated `changelog/*.md` files remain the complete source for app history.
83
+ * The Vite raw-import path can still expand the full folder-backed history.
84
+ */
85
+ export declare function compactChangelog(existing: string, folderEntries: PendingChangelogEntry[], releaseLimit?: number): string;
78
86
  export { CHANGELOG_HEADER, GROUP_LABELS };
@@ -11,6 +11,8 @@
11
11
  * markdown shape is the conventional "Keep a Changelog" layout — a top-level
12
12
  * `# Changelog` heading followed by one `## <release>` section per release.
13
13
  */
14
+ export const DEFAULT_CHANGELOG_RELEASE_LIMIT = 5;
15
+ export const CHANGELOG_ARCHIVE_NOTE = 'Older updates live in [the changelog folder](./changelog/) and are included in the in-app "What\'s new" view.';
14
16
  /**
15
17
  * Order changes are grouped under a release heading. Anything not listed here
16
18
  * falls back to the "changed" group, then renders in insertion order.
@@ -218,48 +220,84 @@ function pendingSectionSort(a, b) {
218
220
  return 1;
219
221
  return a.localeCompare(b);
220
222
  }
223
+ function normalizedChangelogText(value) {
224
+ return value
225
+ .replace(/^\s*-\s?/gm, "")
226
+ .replace(/\s+/g, " ")
227
+ .trim();
228
+ }
221
229
  /**
222
230
  * Render an app-facing changelog that includes both released CHANGELOG.md
223
- * sections and adjacent pending `changelog/*.md` entries. Unlike `release`,
224
- * this is pure and non-destructive, so build/dev bundles can show current
225
- * product notes without deleting the conflict-free pending files.
231
+ * sections and adjacent folder-backed `changelog/*.md` entries. This is pure
232
+ * and non-destructive, so build/dev bundles can show current product notes
233
+ * without moving or deleting the conflict-free entry files.
226
234
  */
227
235
  export function mergePendingChangelog(existing, pending) {
228
- const pendingWithText = pending.filter((entry) => entry.text.trim());
236
+ const existingEntries = parseChangelog(existing);
237
+ const pendingWithText = pending.filter((entry) => {
238
+ const text = entry.text.trim();
239
+ if (!text)
240
+ return false;
241
+ return !existingEntries.some((existingEntry) => {
242
+ if (entry.date &&
243
+ existingEntry.date &&
244
+ entry.date !== existingEntry.date) {
245
+ return false;
246
+ }
247
+ return normalizedChangelogText(existingEntry.body).includes(normalizedChangelogText(text));
248
+ });
249
+ });
229
250
  if (pendingWithText.length === 0)
230
251
  return existing || CHANGELOG_HEADER;
231
- const existingEntries = parseChangelog(existing);
232
- const usedExistingIndexes = new Set();
233
252
  const pendingByTitle = new Map();
234
253
  for (const entry of pendingWithText) {
235
254
  const title = pendingSectionTitle(entry);
236
255
  pendingByTitle.set(title, [...(pendingByTitle.get(title) ?? []), entry]);
237
256
  }
238
- const sections = [];
257
+ const sections = existingEntries.map((entry) => ({
258
+ title: entry.title,
259
+ date: entry.date,
260
+ body: entry.body,
261
+ }));
239
262
  for (const title of [...pendingByTitle.keys()].sort(pendingSectionSort)) {
240
263
  const body = renderReleaseBody(pendingByTitle.get(title) ?? []);
241
264
  if (!body)
242
265
  continue;
243
- const existingIndex = existingEntries.findIndex((entry, index) => {
244
- if (usedExistingIndexes.has(index))
245
- return false;
266
+ const existingIndex = sections.findIndex((entry) => {
246
267
  return entry.date === title || entry.title === title;
247
268
  });
248
- if (existingIndex === -1) {
249
- sections.push(`## ${title}\n\n${body}`);
269
+ if (existingIndex !== -1) {
270
+ sections[existingIndex].body = [body, sections[existingIndex].body]
271
+ .filter(Boolean)
272
+ .join("\n\n");
250
273
  continue;
251
274
  }
252
- usedExistingIndexes.add(existingIndex);
253
- const existingEntry = existingEntries[existingIndex];
254
- sections.push(`## ${existingEntry.title}\n\n${[body, existingEntry.body]
255
- .filter(Boolean)
256
- .join("\n\n")}`);
275
+ const newSection = { title, date: title.match(ISO_DATE)?.[1], body };
276
+ const insertAt = newSection.date
277
+ ? sections.findIndex((entry) => entry.date && entry.date < newSection.date)
278
+ : 0;
279
+ sections.splice(insertAt === -1 ? sections.length : insertAt, 0, newSection);
257
280
  }
258
- existingEntries.forEach((entry, index) => {
259
- if (usedExistingIndexes.has(index))
260
- return;
261
- sections.push(`## ${entry.title}\n\n${entry.body}`);
262
- });
263
- return `${changelogHeader(existing)}\n\n${sections.join("\n\n")}\n`;
281
+ return `${changelogHeader(existing)}\n\n${sections
282
+ .map((entry) => `## ${entry.title}\n\n${entry.body}`)
283
+ .join("\n\n")}\n`;
284
+ }
285
+ /**
286
+ * Keep a short, human-readable release window in `CHANGELOG.md` while the
287
+ * dated `changelog/*.md` files remain the complete source for app history.
288
+ * The Vite raw-import path can still expand the full folder-backed history.
289
+ */
290
+ export function compactChangelog(existing, folderEntries, releaseLimit = DEFAULT_CHANGELOG_RELEASE_LIMIT) {
291
+ const merged = mergePendingChangelog(existing, folderEntries);
292
+ const entries = parseChangelog(merged).slice(0, Math.max(1, releaseLimit));
293
+ const header = changelogHeader(merged)
294
+ .replace(CHANGELOG_ARCHIVE_NOTE, "")
295
+ .replace(/\n{3,}/g, "\n\n")
296
+ .trim();
297
+ const sections = entries.map((entry) => `## ${entry.title}\n\n${entry.body}`);
298
+ if (sections.length === 0) {
299
+ return `${header || CHANGELOG_HEADER.trim()}\n\n${CHANGELOG_ARCHIVE_NOTE}\n`;
300
+ }
301
+ return `${header || CHANGELOG_HEADER.trim()}\n\n${CHANGELOG_ARCHIVE_NOTE}\n\n${sections.join("\n\n")}\n`;
264
302
  }
265
303
  export { CHANGELOG_HEADER, GROUP_LABELS };
@@ -3,18 +3,19 @@
3
3
  *
4
4
  * The model mirrors changesets: instead of editing the shared CHANGELOG.md
5
5
  * directly (which conflicts when many agents work in parallel), each change
6
- * drops a small pending entry file under `changelog/`. A later `release` rolls
7
- * every pending file up into a single dated section of CHANGELOG.md.
6
+ * drops a small dated entry file under `changelog/`. A later `release`
7
+ * refreshes the recent CHANGELOG.md window while retaining those files as the
8
+ * complete history.
8
9
  *
9
10
  * agent-native changelog add "Recordings can be trimmed before sharing" --type added
10
- * agent-native changelog release # roll pending → CHANGELOG.md (today)
11
+ * agent-native changelog release # refresh recent window
11
12
  * agent-native changelog list # show pending + released
12
13
  *
13
14
  * Runs in the current app directory (process.cwd()).
14
15
  */
15
16
  import fs from "fs";
16
17
  import path from "path";
17
- import { parsePendingEntry, parseChangelog, rollupChangelog, changelogSlug, CHANGELOG_HEADER, } from "../changelog/parse.js";
18
+ import { parsePendingEntry, parseChangelog, compactChangelog, changelogSlug, CHANGELOG_HEADER, } from "../changelog/parse.js";
18
19
  import { createAgentNativeConfigContext, loadResolvedAgentNativeConfig, } from "../vite/agent-native-config-loader.js";
19
20
  const CHANGELOG_FILE = "CHANGELOG.md";
20
21
  const PENDING_DIR = "changelog";
@@ -61,7 +62,7 @@ function printUsage() {
61
62
  " agent-native changelog list",
62
63
  "",
63
64
  "Entries are user-facing notes. `add` writes a pending file under",
64
- ` ${PENDING_DIR}/; \`release\` rolls all pending files into ${CHANGELOG_FILE}.`,
65
+ ` ${PENDING_DIR}/; \`release\` refreshes the recent window in ${CHANGELOG_FILE}.`,
65
66
  "Generation requires changelog.enabled: true in agent-native.config.ts.",
66
67
  ].join("\n"));
67
68
  }
@@ -126,17 +127,14 @@ async function cmdRelease(args) {
126
127
  console.log("No pending changelog entries to release.");
127
128
  return 0;
128
129
  }
129
- const pending = pendingFiles.map((p) => parsePendingEntry(p.content));
130
+ const pending = pendingFiles.map((p) => parsePendingEntry(p.content, path.basename(p.file).match(/^(\d{4}-\d{2}-\d{2})(?:-|\.md$)/)?.[1]));
130
131
  const changelogPath = path.resolve(CHANGELOG_FILE);
131
132
  const existing = fs.existsSync(changelogPath)
132
133
  ? fs.readFileSync(changelogPath, "utf-8")
133
134
  : "";
134
- const next = rollupChangelog(existing, pending, date);
135
+ const next = compactChangelog(existing, pending);
135
136
  fs.writeFileSync(changelogPath, next, "utf-8");
136
- // Remove the pending entries now that they're released.
137
- for (const p of pendingFiles)
138
- fs.rmSync(p.file);
139
- console.log(`Released ${pendingFiles.length} entr${pendingFiles.length === 1 ? "y" : "ies"} into ${CHANGELOG_FILE} (## ${date}).`);
137
+ console.log(`Refreshed ${CHANGELOG_FILE} from ${pendingFiles.length} folder entr${pendingFiles.length === 1 ? "y" : "ies"} (latest release date: ${date}).`);
140
138
  return 0;
141
139
  }
142
140
  function cmdList() {
@@ -213,10 +213,15 @@ export function RunErrorRecoveryCard({ info, onContinue, onRetry, onFork, onDism
213
213
  const shouldShowMissingProviderSetup = isMissingLlmProviderRunError(info);
214
214
  const isProviderAuthError = isProviderAuthenticationError([info.message, info.details].filter(Boolean).join("\n"), info.errorCode);
215
215
  // Blocked on something the reader goes and fixes elsewhere, then comes back
216
- // to. Without a retry the card is a dead end and its own copy ("then retry")
217
- // points at a button that isn't there.
216
+ // to. Recoverable runs and email verification keep a retry path; rejected
217
+ // provider credentials use the setup flow below so the same bad key is not
218
+ // replayed.
218
219
  const isUnblockableExternally = info.errorCode === "email_verification_required";
219
- const canRetry = canRecover || isProviderAuthError || isUnblockableExternally;
220
+ // Rejected provider keys already have a recovery path: update/connect the
221
+ // credential, then let the setup callback re-run the turn. Exposing a
222
+ // separate retry button here just replays the same rejected credential and
223
+ // turns a permanent auth failure into a loop.
224
+ const canRetry = canRecover || isUnblockableExternally;
220
225
  const builderReconnectResolved = shouldShowBuilderReconnect &&
221
226
  builderReconnect.hasFetchedStatus &&
222
227
  builderReconnect.configured;
@@ -239,6 +239,15 @@ function compareMcpUrl(value) {
239
239
  return value.trim().replace(/\/+$/, "");
240
240
  }
241
241
  }
242
+ function startMcpOAuthReconnect(server) {
243
+ const returnUrl = `${window.location.pathname}${window.location.search}${window.location.hash}`;
244
+ const params = new URLSearchParams({
245
+ serverId: server.id,
246
+ scope: server.scope,
247
+ return: returnUrl,
248
+ });
249
+ window.location.assign(agentNativePath(`/_agent-native/mcp/servers/oauth/start?${params}`));
250
+ }
242
251
  function McpServerStatus({ server, onReconnect, reconnecting = false, reconnectError, }) {
243
252
  const t = useT();
244
253
  if (server.status.state === "connected") {
@@ -362,7 +371,9 @@ function McpIntegrationsSection({ query }) {
362
371
  return (_jsxs("div", { className: "flex items-start gap-3 py-3.5", children: [_jsx("span", { className: "mt-0.5 flex size-9 shrink-0 items-center justify-center rounded-lg border border-border/70 bg-background text-muted-foreground", children: _jsx(IconServer, { className: "size-4" }) }), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [_jsx("span", { className: "truncate text-sm font-medium text-foreground", children: server.name }), _jsx("span", { className: "text-[11px] text-muted-foreground", children: server.scope === "user"
363
372
  ? t("mcpIntegrations.personal")
364
373
  : t("mcpIntegrations.sharedWithWorkspace") })] }), _jsx(McpServerStatus, { server: server, onReconnect: server.status.state === "error"
365
- ? () => void reconnect(server)
374
+ ? () => server.authMode === "oauth"
375
+ ? startMcpOAuthReconnect(server)
376
+ : void reconnect(server)
366
377
  : undefined, reconnecting: reconnectingKey === key, reconnectError: reconnectError?.key === key
367
378
  ? reconnectError.message
368
379
  : undefined })] }), canRemove && (_jsx("button", { type: "button", onClick: () => void removeServer(server), disabled: deleteServer.isPending, className: "shrink-0 rounded-md border border-border px-2.5 py-1.5 text-xs font-medium text-foreground transition-colors hover:bg-accent disabled:opacity-50", children: deleteTarget === key ? "Confirm" : "Remove" }))] }, key));
@@ -26,8 +26,8 @@ export declare const getCollabState: import("h3").EventHandlerWithFetch<import("
26
26
  * Body: { update: string (base64), requestSource?: string }
27
27
  */
28
28
  export declare const postCollabUpdate: import("h3").EventHandlerWithFetch<import("h3").EventHandlerRequest, Promise<{
29
- error: string;
30
29
  ok?: undefined;
30
+ error: string;
31
31
  } | {
32
32
  error?: undefined;
33
33
  ok: boolean;
@@ -137,13 +137,13 @@ export declare function screenMemoryMcpToolDefinitions(): ({
137
137
  inputSchema: {
138
138
  type: string;
139
139
  properties: {
140
- count?: undefined;
141
140
  query?: undefined;
142
141
  minutes?: undefined;
143
142
  limit?: undefined;
144
143
  clientHint?: undefined;
145
144
  timestamp?: undefined;
146
145
  chapterId?: undefined;
146
+ count?: undefined;
147
147
  startAt?: undefined;
148
148
  endAt?: undefined;
149
149
  reason?: undefined;
@@ -159,7 +159,6 @@ export declare function screenMemoryMcpToolDefinitions(): ({
159
159
  inputSchema: {
160
160
  type: string;
161
161
  properties: {
162
- count?: undefined;
163
162
  query: {
164
163
  type: string;
165
164
  description: string;
@@ -175,6 +174,7 @@ export declare function screenMemoryMcpToolDefinitions(): ({
175
174
  clientHint?: undefined;
176
175
  timestamp?: undefined;
177
176
  chapterId?: undefined;
177
+ count?: undefined;
178
178
  startAt?: undefined;
179
179
  endAt?: undefined;
180
180
  reason?: undefined;
@@ -190,7 +190,6 @@ export declare function screenMemoryMcpToolDefinitions(): ({
190
190
  inputSchema: {
191
191
  type: string;
192
192
  properties: {
193
- count?: undefined;
194
193
  minutes: {
195
194
  type: string;
196
195
  description: string;
@@ -200,6 +199,7 @@ export declare function screenMemoryMcpToolDefinitions(): ({
200
199
  clientHint?: undefined;
201
200
  timestamp?: undefined;
202
201
  chapterId?: undefined;
202
+ count?: undefined;
203
203
  startAt?: undefined;
204
204
  endAt?: undefined;
205
205
  reason?: undefined;
@@ -216,7 +216,6 @@ export declare function screenMemoryMcpToolDefinitions(): ({
216
216
  type: string;
217
217
  required: string[];
218
218
  properties: {
219
- count?: undefined;
220
219
  query: {
221
220
  type: string;
222
221
  description: string;
@@ -235,6 +234,7 @@ export declare function screenMemoryMcpToolDefinitions(): ({
235
234
  };
236
235
  timestamp?: undefined;
237
236
  chapterId?: undefined;
237
+ count?: undefined;
238
238
  startAt?: undefined;
239
239
  endAt?: undefined;
240
240
  reason?: undefined;
@@ -250,7 +250,6 @@ export declare function screenMemoryMcpToolDefinitions(): ({
250
250
  type: string;
251
251
  required: string[];
252
252
  properties: {
253
- count?: undefined;
254
253
  query?: undefined;
255
254
  minutes?: undefined;
256
255
  limit?: undefined;
@@ -264,6 +263,7 @@ export declare function screenMemoryMcpToolDefinitions(): ({
264
263
  description: string;
265
264
  };
266
265
  chapterId?: undefined;
266
+ count?: undefined;
267
267
  startAt?: undefined;
268
268
  endAt?: undefined;
269
269
  includeMicrophone?: undefined;
@@ -314,13 +314,13 @@ export declare function screenMemoryMcpToolDefinitions(): ({
314
314
  type: string;
315
315
  required: string[];
316
316
  properties: {
317
- count?: undefined;
318
317
  query?: undefined;
319
318
  minutes?: undefined;
320
319
  limit?: undefined;
321
320
  clientHint?: undefined;
322
321
  timestamp?: undefined;
323
322
  chapterId?: undefined;
323
+ count?: undefined;
324
324
  startAt: {
325
325
  type: string;
326
326
  description: string;
@@ -349,13 +349,13 @@ export declare function screenMemoryMcpToolDefinitions(): ({
349
349
  type: string;
350
350
  required: string[];
351
351
  properties: {
352
- count?: undefined;
353
352
  query?: undefined;
354
353
  minutes?: undefined;
355
354
  limit?: undefined;
356
355
  clientHint?: undefined;
357
356
  timestamp?: undefined;
358
357
  chapterId?: undefined;
358
+ count?: undefined;
359
359
  startAt?: undefined;
360
360
  endAt?: undefined;
361
361
  reason?: undefined;
@@ -16,6 +16,7 @@ export interface McpOAuthFlow {
16
16
  clientInformation: StoredOAuthClientInformation;
17
17
  discoveryState?: McpOAuthDiscoveryState;
18
18
  returnUrl?: string;
19
+ replaceServerId?: string;
19
20
  expiresAt: number;
20
21
  }
21
22
  export interface McpOAuthRoutesOptions {