@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.
- package/corpus/README.md +1 -1
- package/corpus/templates/analytics/CHANGELOG.md +37 -3
- package/corpus/templates/analytics/changelog/2026-08-20-staged-data-limit-recovery.md +5 -0
- package/corpus/templates/assets/CHANGELOG.md +36 -2
- package/corpus/templates/brain/CHANGELOG.md +33 -3
- package/corpus/templates/calendar/CHANGELOG.md +45 -2
- package/corpus/templates/chat/CHANGELOG.md +29 -3
- package/corpus/templates/clips/CHANGELOG.md +55 -2
- package/corpus/templates/clips/app/i18n/en-US.ts +0 -9
- package/corpus/templates/clips/app/root.tsx +2 -1
- package/corpus/templates/clips/app/routes/_app.settings._index.tsx +3 -3
- package/corpus/templates/clips/changelog/2026-08-20-cross-tab-recording-controls.md +5 -0
- package/corpus/templates/clips/changelog/2026-08-20-overlay-follow-review-fixes.md +5 -0
- package/corpus/templates/clips/changelog/2026-08-20-provider-key-recovery.md +5 -0
- package/corpus/templates/clips/chrome-extension/PERMISSIONS.md +29 -46
- package/corpus/templates/clips/chrome-extension/STORE_DRAFT.md +1 -1
- package/corpus/templates/clips/chrome-extension/public/manifest.json +9 -2
- package/corpus/templates/clips/chrome-extension/src/background.ts +65 -46
- package/corpus/templates/clips/chrome-extension/src/content-script.ts +25 -17
- package/corpus/templates/clips/chrome-extension/src/overlay-follow.ts +25 -0
- package/corpus/templates/content/CHANGELOG.md +45 -2
- package/corpus/templates/crm/CHANGELOG.md +28 -16
- package/corpus/templates/design/CHANGELOG.md +54 -2
- package/corpus/templates/dispatch/CHANGELOG.md +51 -2
- package/corpus/templates/dispatch/changelog/2026-08-20-dispatch-chat-loads-openrouter-provider-reliably.md +6 -0
- package/corpus/templates/dispatch/package.json +2 -0
- package/corpus/templates/factory/CHANGELOG.md +28 -2
- package/corpus/templates/forms/CHANGELOG.md +39 -3
- package/corpus/templates/macros/CHANGELOG.md +30 -2
- package/corpus/templates/macros/netlify.toml +2 -0
- package/corpus/templates/mail/CHANGELOG.md +34 -3
- package/corpus/templates/plan/CHANGELOG.md +34 -3
- package/corpus/templates/slides/CHANGELOG.md +73 -2
- package/corpus/templates/tasks/CHANGELOG.md +35 -0
- package/corpus/templates/tasks/app/root.tsx +8 -1
- package/dist/changelog/parse.d.ts +12 -4
- package/dist/changelog/parse.js +61 -23
- package/dist/cli/changelog.js +9 -11
- package/dist/client/chat/run-recovery.js +8 -3
- package/dist/client/integrations/IntegrationsPanel.js +12 -1
- package/dist/collab/routes.d.ts +1 -1
- package/dist/mcp/screen-memory-stdio.d.ts +7 -7
- package/dist/mcp-client/oauth-routes.d.ts +1 -0
- package/dist/mcp-client/oauth-routes.js +37 -9
- package/dist/mcp-client/remote-store.d.ts +12 -0
- package/dist/mcp-client/remote-store.js +71 -0
- package/dist/notifications/routes.d.ts +3 -3
- package/dist/provider-api/actions/provider-api.js +16 -4
- package/dist/resources/handlers.d.ts +2 -2
- package/dist/templates/chat/CHANGELOG.md +29 -3
- package/package.json +1 -1
- package/src/templates/chat/CHANGELOG.md +29 -3
- package/corpus/templates/.retired/issues/package.json +0 -7
- package/corpus/templates/.retired/meeting-notes/package.json +0 -7
- package/corpus/templates/.retired/recruiting/package.json +0 -7
- package/corpus/templates/.retired/scheduling/package.json +0 -7
- package/corpus/templates/.retired/voice/package.json +0 -7
- 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
|
-
|
|
6
|
+
Older updates live in [the changelog folder](./changelog/) and are included in the in-app "What's new" view.
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
## 2026-08-18
|
|
9
9
|
|
|
10
|
-
|
|
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
|
-
|
|
6
|
+
Older updates live in [the changelog folder](./changelog/) and are included in the in-app "What's new" view.
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
## 2026-08-19
|
|
9
9
|
|
|
10
|
-
|
|
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
|
-
|
|
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
|
-
-
|
|
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
|
|
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
|
|
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
|
|
74
|
-
*
|
|
75
|
-
*
|
|
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 };
|
package/dist/changelog/parse.js
CHANGED
|
@@ -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
|
|
224
|
-
*
|
|
225
|
-
*
|
|
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
|
|
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 =
|
|
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
|
|
249
|
-
sections.
|
|
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
|
-
|
|
253
|
-
const
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
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
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
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 };
|
package/dist/cli/changelog.js
CHANGED
|
@@ -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
|
|
7
|
-
*
|
|
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 #
|
|
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,
|
|
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\`
|
|
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 =
|
|
135
|
+
const next = compactChangelog(existing, pending);
|
|
135
136
|
fs.writeFileSync(changelogPath, next, "utf-8");
|
|
136
|
-
|
|
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.
|
|
217
|
-
//
|
|
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
|
-
|
|
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
|
-
? () =>
|
|
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));
|
package/dist/collab/routes.d.ts
CHANGED
|
@@ -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;
|