@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
|
@@ -6,6 +6,10 @@ import {
|
|
|
6
6
|
shouldReconcilePersistedRecording,
|
|
7
7
|
type OffscreenRecordingState,
|
|
8
8
|
} from "./native-recording-state";
|
|
9
|
+
import {
|
|
10
|
+
sendWithInjectionFallback,
|
|
11
|
+
shouldFollowOverlay,
|
|
12
|
+
} from "./overlay-follow";
|
|
9
13
|
import { captureExtensionError, initExtensionSentry } from "./sentry";
|
|
10
14
|
|
|
11
15
|
initExtensionSentry("background");
|
|
@@ -276,16 +280,11 @@ let overlayBaseEpochMs = 0;
|
|
|
276
280
|
// up, for both camera-only AND screen+camera recording (recordingShowsBubble).
|
|
277
281
|
let overlayShowsBubble = false;
|
|
278
282
|
let recordingShowsBubble = false;
|
|
279
|
-
// Cross-tab follow
|
|
280
|
-
//
|
|
281
|
-
//
|
|
282
|
-
|
|
283
|
-
//
|
|
284
|
-
// getDisplayMedia regardless. See PERMISSIONS.md to re-enable.
|
|
285
|
-
// Typed `boolean` (not inferred literal `false`) so the cross-tab branches below
|
|
286
|
-
// don't read as unreachable code; flip the value to re-enable. See PERMISSIONS.md.
|
|
287
|
-
const CROSS_TAB_FOLLOW: boolean = false;
|
|
288
|
-
// The tab the recording was launched from — the only tab activeTab lets us touch.
|
|
283
|
+
// Cross-tab follow stays enabled for the next release. It needs the manifest's
|
|
284
|
+
// broad-host review path (`<all_urls>` + declarative content script coverage) so
|
|
285
|
+
// the face bubble and controls keep following the user across tabs and reloads.
|
|
286
|
+
const CROSS_TAB_FOLLOW: boolean = true;
|
|
287
|
+
// The launch tab stays the anchor for the explicit reload recovery path.
|
|
289
288
|
let overlayTabId: number | null = null;
|
|
290
289
|
let countdownEndsAtMs = 0;
|
|
291
290
|
let armingNativeRecordingSessionId: string | null = null;
|
|
@@ -438,20 +437,19 @@ async function restoreRuntimeState(): Promise<void> {
|
|
|
438
437
|
function sendTabMessage(
|
|
439
438
|
tabId: number,
|
|
440
439
|
message: Record<string, unknown>,
|
|
441
|
-
): Promise<
|
|
440
|
+
): Promise<boolean> {
|
|
442
441
|
return new Promise((resolve) => {
|
|
443
442
|
try {
|
|
444
443
|
chrome.tabs.sendMessage(tabId, message, () => {
|
|
445
|
-
|
|
446
|
-
resolve();
|
|
444
|
+
resolve(!chrome.runtime.lastError);
|
|
447
445
|
});
|
|
448
446
|
} catch {
|
|
449
|
-
resolve();
|
|
447
|
+
resolve(false);
|
|
450
448
|
}
|
|
451
449
|
});
|
|
452
450
|
}
|
|
453
451
|
|
|
454
|
-
async function
|
|
452
|
+
async function injectContentScript(tabId: number): Promise<boolean> {
|
|
455
453
|
const scripting = (
|
|
456
454
|
chrome as typeof chrome & {
|
|
457
455
|
scripting?: {
|
|
@@ -462,18 +460,32 @@ async function ensureContentScript(tabId: number): Promise<void> {
|
|
|
462
460
|
};
|
|
463
461
|
}
|
|
464
462
|
).scripting;
|
|
465
|
-
if (!scripting) return;
|
|
466
|
-
|
|
467
|
-
.executeScript({
|
|
468
|
-
|
|
463
|
+
if (!scripting) return false;
|
|
464
|
+
try {
|
|
465
|
+
await scripting.executeScript({
|
|
466
|
+
target: { tabId },
|
|
467
|
+
files: ["assets/content-script.js"],
|
|
468
|
+
});
|
|
469
|
+
return true;
|
|
470
|
+
} catch {
|
|
471
|
+
// Unsupported pages (chrome://, the Chrome Web Store, and similar) reject
|
|
472
|
+
// injection. They still need to record without an in-page overlay.
|
|
473
|
+
return false;
|
|
474
|
+
}
|
|
469
475
|
}
|
|
470
476
|
|
|
471
|
-
async function mountOverlayOnTab(
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
+
async function mountOverlayOnTab(
|
|
478
|
+
tabId: number,
|
|
479
|
+
parts: OverlayPart[] = desiredParts(),
|
|
480
|
+
): Promise<boolean> {
|
|
481
|
+
return sendWithInjectionFallback(
|
|
482
|
+
() =>
|
|
483
|
+
sendTabMessage(tabId, {
|
|
484
|
+
type: "CLIPS_OVERLAY_MOUNT",
|
|
485
|
+
parts,
|
|
486
|
+
}),
|
|
487
|
+
() => injectContentScript(tabId),
|
|
488
|
+
);
|
|
477
489
|
}
|
|
478
490
|
|
|
479
491
|
function allTabs(): Promise<chrome.tabs.Tab[]> {
|
|
@@ -483,9 +495,8 @@ function allTabs(): Promise<chrome.tabs.Tab[]> {
|
|
|
483
495
|
}
|
|
484
496
|
|
|
485
497
|
async function broadcastMount(): Promise<void> {
|
|
486
|
-
//
|
|
487
|
-
//
|
|
488
|
-
// gated behind CROSS_TAB_FOLLOW because it needs broad host access.
|
|
498
|
+
// Cross-tab follow uses the declarative content script path, so every mounted
|
|
499
|
+
// tab can receive the current overlay parts and survive reloads.
|
|
489
500
|
if (!CROSS_TAB_FOLLOW) {
|
|
490
501
|
if (overlayTabId !== null) await mountOverlayOnTab(overlayTabId);
|
|
491
502
|
return;
|
|
@@ -548,12 +559,9 @@ async function startPreview(wantsCamera: boolean): Promise<void> {
|
|
|
548
559
|
if (!tab || typeof tab.id !== "number") return;
|
|
549
560
|
if (previewTabId !== null && previewTabId !== tab.id) await stopPreview();
|
|
550
561
|
previewTabId = tab.id;
|
|
551
|
-
|
|
552
|
-
//
|
|
553
|
-
await
|
|
554
|
-
type: "CLIPS_OVERLAY_MOUNT",
|
|
555
|
-
parts: ["bubble"],
|
|
556
|
-
});
|
|
562
|
+
// Message delivery reuses the declarative script; fallback injection fails
|
|
563
|
+
// silently on unsupported pages (chrome://, the Web Store, and similar).
|
|
564
|
+
await mountOverlayOnTab(tab.id, ["bubble"]);
|
|
557
565
|
}
|
|
558
566
|
|
|
559
567
|
async function stopPreview(): Promise<void> {
|
|
@@ -2560,29 +2568,40 @@ async function dispatchRuntimeMessage(message: unknown): Promise<unknown> {
|
|
|
2560
2568
|
}
|
|
2561
2569
|
}
|
|
2562
2570
|
|
|
2563
|
-
// While a recording is active, keep the overlay following the user as
|
|
2564
|
-
// switch tabs
|
|
2565
|
-
//
|
|
2571
|
+
// While a recording is active or arming, keep the overlay following the user as
|
|
2572
|
+
// they switch tabs. The message-first path reuses declarative scripts and only
|
|
2573
|
+
// injects for tabs that predate the extension or otherwise have no receiver.
|
|
2566
2574
|
chrome.tabs.onActivated.addListener((info) => {
|
|
2567
|
-
if (!CROSS_TAB_FOLLOW) return;
|
|
2575
|
+
if (!CROSS_TAB_FOLLOW) return;
|
|
2568
2576
|
void (async () => {
|
|
2569
2577
|
await ensureRestored();
|
|
2570
|
-
if (
|
|
2578
|
+
if (
|
|
2579
|
+
!shouldFollowOverlay(
|
|
2580
|
+
overlayPhase,
|
|
2581
|
+
Boolean(activeNativeRecording),
|
|
2582
|
+
Boolean(armingNativeRecordingSessionId),
|
|
2583
|
+
)
|
|
2584
|
+
)
|
|
2585
|
+
return;
|
|
2571
2586
|
await mountOverlayOnTab(info.tabId);
|
|
2572
2587
|
})();
|
|
2573
2588
|
});
|
|
2574
2589
|
|
|
2575
|
-
//
|
|
2576
|
-
//
|
|
2577
|
-
//
|
|
2578
|
-
// Re-inject and re-mount once the launch tab finishes reloading while a recording
|
|
2579
|
-
// is active. Scoped to the launch tab (the only tab activeTab lets us touch); a
|
|
2580
|
-
// same-URL reload keeps that grant.
|
|
2590
|
+
// Keep the launch tab in sync after a reload. Declarative follow covers the
|
|
2591
|
+
// other tabs; this is the explicit recovery path for the tab that originally
|
|
2592
|
+
// started the recording.
|
|
2581
2593
|
chrome.tabs.onUpdated.addListener((tabId, changeInfo) => {
|
|
2582
2594
|
if (changeInfo.status !== "complete") return;
|
|
2583
2595
|
void (async () => {
|
|
2584
2596
|
await ensureRestored();
|
|
2585
|
-
if (
|
|
2597
|
+
if (
|
|
2598
|
+
!shouldFollowOverlay(
|
|
2599
|
+
overlayPhase,
|
|
2600
|
+
Boolean(activeNativeRecording),
|
|
2601
|
+
Boolean(armingNativeRecordingSessionId),
|
|
2602
|
+
)
|
|
2603
|
+
)
|
|
2604
|
+
return;
|
|
2586
2605
|
if (tabId !== overlayTabId) return;
|
|
2587
2606
|
await mountOverlayOnTab(tabId);
|
|
2588
2607
|
broadcastOverlayState();
|
|
@@ -1,12 +1,10 @@
|
|
|
1
|
-
// Loom-style in-page overlay host. The
|
|
2
|
-
//
|
|
3
|
-
//
|
|
4
|
-
//
|
|
5
|
-
//
|
|
6
|
-
//
|
|
7
|
-
//
|
|
8
|
-
// emits a single self-contained classic script with no module imports/exports
|
|
9
|
-
// and leaks no names into the shared global scope. Its only job is to
|
|
1
|
+
// Loom-style in-page overlay host. The next release declares this on every page
|
|
2
|
+
// so the face bubble and controls can survive tab switches and navigations; the
|
|
3
|
+
// background worker can also inject it into the launch tab for immediate and
|
|
4
|
+
// reload recovery. That broad "<all_urls>" host access is the Chrome Web Store
|
|
5
|
+
// in-depth review boundary. Wrapped in an IIFE so it emits a single self-contained
|
|
6
|
+
// classic script with no module imports/exports and leaks no names into the shared
|
|
7
|
+
// global scope. Its only job is to
|
|
10
8
|
// mount/unmount the overlay iframes; all UI and control logic lives inside the
|
|
11
9
|
// extension-origin overlay pages (src/overlay.html). The worker is the source of
|
|
12
10
|
// truth for which "parts" are visible and pushes them here.
|
|
@@ -18,6 +16,12 @@
|
|
|
18
16
|
const ALL_PARTS: OverlayPart[] = ["bubble", "countdown", "toolbar", "saving"];
|
|
19
17
|
const flags = window as unknown as { __clipsOverlayHostReady?: boolean };
|
|
20
18
|
|
|
19
|
+
// Declarative and recovery injection can target the same document. Return
|
|
20
|
+
// before any side effects so global listeners remain one-per-page.
|
|
21
|
+
if (flags.__clipsOverlayHostReady) return;
|
|
22
|
+
flags.__clipsOverlayHostReady = true;
|
|
23
|
+
let recordingActive = false;
|
|
24
|
+
|
|
21
25
|
function errorPayload(error: unknown): {
|
|
22
26
|
name: string;
|
|
23
27
|
message: string;
|
|
@@ -40,6 +44,7 @@
|
|
|
40
44
|
error: unknown,
|
|
41
45
|
context: Record<string, unknown> = {},
|
|
42
46
|
): void {
|
|
47
|
+
if (!recordingActive) return;
|
|
43
48
|
try {
|
|
44
49
|
chrome.runtime.sendMessage(
|
|
45
50
|
{
|
|
@@ -73,6 +78,15 @@
|
|
|
73
78
|
});
|
|
74
79
|
});
|
|
75
80
|
|
|
81
|
+
try {
|
|
82
|
+
chrome.storage.onChanged.addListener((changes, areaName) => {
|
|
83
|
+
if (areaName !== "local" || !changes.clipsRecordingActive) return;
|
|
84
|
+
recordingActive = changes.clipsRecordingActive.newValue === true;
|
|
85
|
+
});
|
|
86
|
+
} catch {
|
|
87
|
+
/* storage unavailable */
|
|
88
|
+
}
|
|
89
|
+
|
|
76
90
|
// ----- Draggable, resizable camera bubble ---------------------------------
|
|
77
91
|
// Size + position persist in storage so the bubble stays where the user put it
|
|
78
92
|
// across pages and recordings (like the desktop app). The iframe can't move or
|
|
@@ -339,7 +353,8 @@
|
|
|
339
353
|
try {
|
|
340
354
|
chrome.storage.local.get("clipsRecordingActive", (value) => {
|
|
341
355
|
if (chrome.runtime.lastError) return;
|
|
342
|
-
|
|
356
|
+
recordingActive = value?.clipsRecordingActive === true;
|
|
357
|
+
if (recordingActive) requestState();
|
|
343
358
|
});
|
|
344
359
|
} catch {
|
|
345
360
|
/* ignore */
|
|
@@ -593,13 +608,6 @@
|
|
|
593
608
|
lastWantedParts = wanted;
|
|
594
609
|
}
|
|
595
610
|
|
|
596
|
-
// Guard against rare double-injection (SPA soft-reloads re-running the script).
|
|
597
|
-
if (flags.__clipsOverlayHostReady) {
|
|
598
|
-
syncIfRecording();
|
|
599
|
-
return;
|
|
600
|
-
}
|
|
601
|
-
flags.__clipsOverlayHostReady = true;
|
|
602
|
-
|
|
603
611
|
chrome.runtime.onMessage.addListener((message) => {
|
|
604
612
|
if (!message || typeof message !== "object") return;
|
|
605
613
|
const type = (message as { type?: unknown }).type;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export type OverlayFollowPhase =
|
|
2
|
+
| "idle"
|
|
3
|
+
| "countdown"
|
|
4
|
+
| "recording"
|
|
5
|
+
| "paused"
|
|
6
|
+
| "saving";
|
|
7
|
+
|
|
8
|
+
export function shouldFollowOverlay(
|
|
9
|
+
phase: OverlayFollowPhase,
|
|
10
|
+
hasActiveNativeRecording: boolean,
|
|
11
|
+
hasArmingNativeRecording: boolean,
|
|
12
|
+
): boolean {
|
|
13
|
+
return (
|
|
14
|
+
phase !== "idle" && (hasActiveNativeRecording || hasArmingNativeRecording)
|
|
15
|
+
);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export async function sendWithInjectionFallback(
|
|
19
|
+
sendMessage: () => Promise<boolean>,
|
|
20
|
+
injectContentScript: () => Promise<boolean>,
|
|
21
|
+
): Promise<boolean> {
|
|
22
|
+
if (await sendMessage()) return true;
|
|
23
|
+
if (!(await injectContentScript())) return false;
|
|
24
|
+
return sendMessage();
|
|
25
|
+
}
|
|
@@ -3,8 +3,51 @@
|
|
|
3
3
|
All notable user-facing changes to Agent-Native Content are documented here. Open it any
|
|
4
4
|
time from the command menu (Cmd+K → "What's new").
|
|
5
5
|
|
|
6
|
-
|
|
6
|
+
Older updates live in [the changelog folder](./changelog/) and are included in the in-app "What's new" view.
|
|
7
|
+
|
|
8
|
+
## 2026-08-14
|
|
9
|
+
|
|
10
|
+
### Fixed
|
|
11
|
+
|
|
12
|
+
- Images fill the page width by default and remain visible when more images are added
|
|
13
|
+
- Images inserted from the slash command stay saved after upload
|
|
14
|
+
- SVG files can be selected reliably from the image picker
|
|
15
|
+
|
|
16
|
+
## 2026-08-13
|
|
17
|
+
|
|
18
|
+
### Fixed
|
|
19
|
+
|
|
20
|
+
- Blocks field conflicts now keep the newer saved version visible instead of leaving a rejected edit on screen
|
|
21
|
+
|
|
22
|
+
## 2026-08-12
|
|
23
|
+
|
|
24
|
+
### Improved
|
|
25
|
+
|
|
26
|
+
- Toggle blocks now follow Notion-style Enter and Shift-Tab behavior while preserving summaries and nested paragraphs.
|
|
27
|
+
- Shared Content documents now keep viewers read-only and let commenters add comments without editing the document.
|
|
28
|
+
|
|
29
|
+
### Fixed
|
|
30
|
+
|
|
31
|
+
- Image uploads now confirm the image can be displayed before reporting success
|
|
32
|
+
|
|
33
|
+
## 2026-08-11
|
|
34
|
+
|
|
35
|
+
### Improved
|
|
36
|
+
|
|
37
|
+
- Content opens your last page on return and gives new users a private welcome page.
|
|
38
|
+
|
|
39
|
+
### Fixed
|
|
40
|
+
|
|
41
|
+
- Chrome no longer offers to install Content as a desktop app.
|
|
42
|
+
- Content mutations delegated from verified Slack DMs now use the member's exact Personal scope and return verified row receipts.
|
|
43
|
+
|
|
44
|
+
## 2026-08-10
|
|
7
45
|
|
|
8
46
|
### Added
|
|
9
47
|
|
|
10
|
-
-
|
|
48
|
+
- Agents can safely insert, update, upsert, delete, and reorder one stable block in a database Blocks field.
|
|
49
|
+
|
|
50
|
+
### Improved
|
|
51
|
+
|
|
52
|
+
- Database Blocks fields now keep logical block identity through editing, reordering, deletion recovery, and reloads
|
|
53
|
+
- Database row actions now validate exact schemas and safe retries before changing data.
|
|
@@ -1,25 +1,37 @@
|
|
|
1
1
|
# CRM changelog
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Older updates live in [the changelog folder](./changelog/) and are included in the in-app "What's new" view.
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
- CRM connects to HubSpot for scoped account intelligence, saved views, follow-up tasks, evidence, and approval-gated write proposals.
|
|
8
|
-
- CRM can prepare a record-scoped, default-off Clips review recipe while keeping media and transcripts in Clips.
|
|
9
|
-
- CRM can now find and review evidence-grounded call signals without storing transcripts or media.
|
|
10
|
-
- Approved sales automations can now update routine local CRM fields while provider changes remain reviewable proposals.
|
|
11
|
-
- CRM can now run as a standalone Native SQL system for accounts, people, opportunities, views, tasks, and cadence without an external provider.
|
|
12
|
-
- Pipeline now gives each CRM user a live, permission-aware view of opportunity value by stage.
|
|
13
|
-
- CRM can now connect to Salesforce alongside HubSpot for scoped account intelligence and follow-up work.
|
|
5
|
+
## 2026-08-11
|
|
14
6
|
|
|
15
7
|
### Improved
|
|
16
8
|
|
|
17
|
-
-
|
|
9
|
+
- Full-page chat composers stay at a focused 750px width.
|
|
18
10
|
|
|
19
11
|
### Fixed
|
|
20
12
|
|
|
21
|
-
-
|
|
22
|
-
|
|
23
|
-
-
|
|
24
|
-
|
|
25
|
-
|
|
13
|
+
- Chrome no longer offers to install CRM as a desktop app.
|
|
14
|
+
|
|
15
|
+
## 2026-08-10
|
|
16
|
+
|
|
17
|
+
### Improved
|
|
18
|
+
|
|
19
|
+
- Full-page chat now uses the available width up to 1000px for more comfortable prompts and responses.
|
|
20
|
+
|
|
21
|
+
## 2026-08-07
|
|
22
|
+
|
|
23
|
+
### Improved
|
|
24
|
+
|
|
25
|
+
- CRM settings show stable skeleton placeholders while lists, fields, connections, and intelligence trackers load.
|
|
26
|
+
|
|
27
|
+
## 2026-08-06
|
|
28
|
+
|
|
29
|
+
### Improved
|
|
30
|
+
|
|
31
|
+
- CRM starts faster after a deploy or idle period — one-time data backfills now run once as tracked migrations instead of on every cold start.
|
|
32
|
+
|
|
33
|
+
## 2026-07-29
|
|
34
|
+
|
|
35
|
+
### Improved
|
|
36
|
+
|
|
37
|
+
- Sidebar footers now keep Feedback, Search, and Collapse together, with language preferences available in Settings.
|
|
@@ -3,8 +3,60 @@
|
|
|
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
|
-
|
|
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
|
+
- Design chat keeps context out of the composer and uses shorter completion summaries.
|
|
13
|
+
|
|
14
|
+
### Changed
|
|
15
|
+
|
|
16
|
+
- Advanced Design editor panels are hidden by default while they are refined.
|
|
17
|
+
|
|
18
|
+
## 2026-08-13
|
|
7
19
|
|
|
8
20
|
### Added
|
|
9
21
|
|
|
10
|
-
-
|
|
22
|
+
- The design audit now catches a screen that renders behind a full-frame Alpine overlay — the failure a screenshot cannot show, because the capture waits for Alpine to settle and the overlay is gone by then.
|
|
23
|
+
- The design audit now reports when a screen uses none of its linked design system's fonts, colors, or token names.
|
|
24
|
+
|
|
25
|
+
### Improved
|
|
26
|
+
|
|
27
|
+
- Attach a UI screenshot and the design is reproduced from it instead of being reinterpreted as three alternative directions.
|
|
28
|
+
- The design system preview now shows how many named tokens were captured, so a large imported system no longer looks like a handful of colors.
|
|
29
|
+
|
|
30
|
+
### Fixed
|
|
31
|
+
|
|
32
|
+
- A screen whose Alpine overlay would cover it on load — `x-cloak` without its hiding rule, or a broken Alpine script URL — is now caught when it is saved instead of shipping as a blank or covered design.
|
|
33
|
+
- Linking a design system means you never get generic direction cards: exploring variants without real HTML is now refused for that design rather than rendering placeholder screens that ignore your tokens.
|
|
34
|
+
- Your design system, original prompt, and reference screenshots now reach the turn that actually generates the design, instead of being spent on the questions step.
|
|
35
|
+
|
|
36
|
+
## 2026-08-12
|
|
37
|
+
|
|
38
|
+
### Improved
|
|
39
|
+
|
|
40
|
+
- Shared designs now keep viewers read-only and let commenters add review comments without editing the design.
|
|
41
|
+
|
|
42
|
+
## 2026-08-11
|
|
43
|
+
|
|
44
|
+
### Improved
|
|
45
|
+
|
|
46
|
+
- Design sharing now identifies viewers who can add review comments
|
|
47
|
+
- New designs now skip the intake questions and follow your existing work when Creative Context already holds closely related pieces.
|
|
48
|
+
|
|
49
|
+
### Fixed
|
|
50
|
+
|
|
51
|
+
- Chrome no longer offers to install Design as a desktop app.
|
|
52
|
+
- Design agent prompts copy successfully in the desktop app.
|
|
53
|
+
|
|
54
|
+
## 2026-08-10
|
|
55
|
+
|
|
56
|
+
### Improved
|
|
57
|
+
|
|
58
|
+
- The frame tool draws a plain frame by default, with Screen available in its dropdown
|
|
59
|
+
|
|
60
|
+
### Fixed
|
|
61
|
+
|
|
62
|
+
- Marquee-selecting layers far down a tall screen now selects the layers you dragged over
|
|
@@ -3,8 +3,57 @@
|
|
|
3
3
|
All notable user-facing changes to Agent-Native Dispatch 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-20
|
|
9
|
+
|
|
10
|
+
### Fixed
|
|
11
|
+
|
|
12
|
+
- Dispatch chat now loads its OpenRouter provider reliably in production.
|
|
13
|
+
|
|
14
|
+
## 2026-08-12
|
|
15
|
+
|
|
16
|
+
### Improved
|
|
17
|
+
|
|
18
|
+
- Search and pin workspace apps from the app catalog
|
|
19
|
+
- Workspace integration access now shows exactly which apps can reuse each connection.
|
|
20
|
+
|
|
21
|
+
### Fixed
|
|
22
|
+
|
|
23
|
+
- Dispatch now appears in authorized workspace app directories for fleet-wide administration
|
|
24
|
+
|
|
25
|
+
## 2026-08-11
|
|
26
|
+
|
|
27
|
+
### Added
|
|
28
|
+
|
|
29
|
+
- Dispatch shows usage trends, recent prompts, and an agent review path
|
|
30
|
+
|
|
31
|
+
### Improved
|
|
32
|
+
|
|
33
|
+
- Dispatch no longer shows the generic Chat starter among default app launchers
|
|
34
|
+
- Dispatch settings now link directly to Admin
|
|
35
|
+
- New apps accept human-friendly names and convert them to URL-safe IDs automatically.
|
|
36
|
+
- Integrations and scheduled work open as first-class Electron pages without a duplicate Dispatch navigation shell.
|
|
37
|
+
- Sidebar text is slightly easier to read in light and dark mode.
|
|
38
|
+
|
|
39
|
+
### Fixed
|
|
40
|
+
|
|
41
|
+
- Chrome no longer offers to install Dispatch as a desktop app.
|
|
42
|
+
- Clicking the Dispatch logo returns to the Overview page
|
|
43
|
+
- Dispatch omits its own app entry from the app switcher.
|
|
44
|
+
|
|
45
|
+
## 2026-08-10
|
|
46
|
+
|
|
47
|
+
### Added
|
|
48
|
+
|
|
49
|
+
- Desktop workspace sign-in can now be rolled out gradually while ordinary app sign-in remains unchanged by default.
|
|
50
|
+
|
|
51
|
+
### Improved
|
|
52
|
+
|
|
53
|
+
- Full-page chat now uses the available width up to 1000px for more comfortable prompts and responses.
|
|
54
|
+
|
|
55
|
+
## 2026-08-08
|
|
7
56
|
|
|
8
57
|
### Added
|
|
9
58
|
|
|
10
|
-
-
|
|
59
|
+
- Chat-first navigation keeps conversations central while opening workspace apps and watched sessions beside them.
|
|
@@ -19,9 +19,11 @@
|
|
|
19
19
|
"@agent-native/toolkit": "workspace:*",
|
|
20
20
|
"@fontsource-variable/inter": "^5.2.8",
|
|
21
21
|
"@libsql/client": "^0.15.8",
|
|
22
|
+
"@openrouter/ai-sdk-provider": "^2.9.1",
|
|
22
23
|
"@radix-ui/react-tooltip": "^1.2.7",
|
|
23
24
|
"@tabler/icons-react": "catalog:",
|
|
24
25
|
"@tanstack/react-query": "^5.99.2",
|
|
26
|
+
"ai": "6.0.258",
|
|
25
27
|
"h3": "catalog:",
|
|
26
28
|
"isbot": "^5",
|
|
27
29
|
"next-themes": "^0.4.6",
|
|
@@ -3,8 +3,34 @@
|
|
|
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
|
-
|
|
6
|
+
Older updates live in [the changelog folder](./changelog/) and are included in the in-app "What's new" view.
|
|
7
|
+
|
|
8
|
+
## 2026-08-11
|
|
9
|
+
|
|
10
|
+
### Fixed
|
|
11
|
+
|
|
12
|
+
- Chrome no longer offers to install Factory as a desktop app.
|
|
13
|
+
|
|
14
|
+
## 2026-08-10
|
|
15
|
+
|
|
16
|
+
### Improved
|
|
17
|
+
|
|
18
|
+
- Full-page chat now uses the available width up to 1000px for more comfortable prompts and responses.
|
|
19
|
+
|
|
20
|
+
## 2026-08-08
|
|
21
|
+
|
|
22
|
+
### Improved
|
|
23
|
+
|
|
24
|
+
- Scheduler health now stays in Settings until diagnostics are needed.
|
|
25
|
+
|
|
26
|
+
## 2026-08-07
|
|
7
27
|
|
|
8
28
|
### Added
|
|
9
29
|
|
|
10
|
-
-
|
|
30
|
+
- Factory can keep Builder bot pull requests moving by requesting fixes for review feedback, CI failures, and merge conflicts.
|
|
31
|
+
|
|
32
|
+
## 2026-08-05
|
|
33
|
+
|
|
34
|
+
### Improved
|
|
35
|
+
|
|
36
|
+
- Factory now keeps production automations running, shows scheduler health and run errors, and can email failure diagnostics.
|
|
@@ -3,8 +3,44 @@
|
|
|
3
3
|
All notable user-facing changes to Agent-Native Forms 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-11
|
|
9
9
|
|
|
10
|
-
|
|
10
|
+
### Improved
|
|
11
|
+
|
|
12
|
+
- Full-page chat composers stay at a focused 750px width.
|
|
13
|
+
|
|
14
|
+
### Fixed
|
|
15
|
+
|
|
16
|
+
- Chrome no longer offers to install Forms as a desktop app.
|
|
17
|
+
- Fixed public forms so conditional questions stay hidden until relevant and submissions retain a safe page link.
|
|
18
|
+
|
|
19
|
+
## 2026-08-10
|
|
20
|
+
|
|
21
|
+
### Improved
|
|
22
|
+
|
|
23
|
+
- Full-page chat now uses the available width up to 1000px for more comfortable prompts and responses.
|
|
24
|
+
|
|
25
|
+
### Fixed
|
|
26
|
+
|
|
27
|
+
- Forms now keep agent-applied field changes visible after an edit
|
|
28
|
+
- Published form links always use the working public form URL
|
|
29
|
+
|
|
30
|
+
## 2026-08-06
|
|
31
|
+
|
|
32
|
+
### Improved
|
|
33
|
+
|
|
34
|
+
- Long-running form requests now continue in the background instead of stopping at the foreground time limit.
|
|
35
|
+
|
|
36
|
+
## 2026-08-05
|
|
37
|
+
|
|
38
|
+
### Fixed
|
|
39
|
+
|
|
40
|
+
- Form links can now be Cmd-clicked to open in a new tab
|
|
41
|
+
|
|
42
|
+
## 2026-07-31
|
|
43
|
+
|
|
44
|
+
### Improved
|
|
45
|
+
|
|
46
|
+
- The Agent Native logo stays visible when the sidebar is collapsed and toggles the sidebar when clicked.
|
|
@@ -3,8 +3,36 @@
|
|
|
3
3
|
All notable user-facing changes to Agent-Native Macros 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-07-29
|
|
9
|
+
|
|
10
|
+
### Improved
|
|
11
|
+
|
|
12
|
+
- Sidebar footers now keep Feedback, Search, and Collapse together without a separate language shortcut.
|
|
13
|
+
|
|
14
|
+
## 2026-07-25
|
|
15
|
+
|
|
16
|
+
### Improved
|
|
17
|
+
|
|
18
|
+
- App branding now uses the product name without the Agent-Native prefix.
|
|
19
|
+
- Settings navigation now keeps Manage agent as a dedicated linked destination at the bottom.
|
|
20
|
+
|
|
21
|
+
## 2026-07-24
|
|
22
|
+
|
|
23
|
+
### Improved
|
|
24
|
+
|
|
25
|
+
- Secondary controls and dashboard surfaces now use quieter borderless styling.
|
|
26
|
+
- Sidebar utility controls now follow a consistent footer order.
|
|
27
|
+
|
|
28
|
+
## 2026-07-22
|
|
29
|
+
|
|
30
|
+
### Improved
|
|
31
|
+
|
|
32
|
+
- Manage agent navigation now uses the connected-nodes icon.
|
|
33
|
+
|
|
34
|
+
## 2026-07-13
|
|
7
35
|
|
|
8
36
|
### Added
|
|
9
37
|
|
|
10
|
-
-
|
|
38
|
+
- New Agent page: see and manage your agent's context, files, connections, jobs, and external access in one place
|