@agent-native/core-corpus 0.216.0 → 0.218.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/corpus/README.md +1 -1
- package/corpus/templates/analytics/.agents/skills/session-replay/SKILL.md +61 -1
- package/corpus/templates/analytics/AGENTS.md +1 -1
- package/corpus/templates/analytics/CHANGELOG.md +3 -0
- package/corpus/templates/analytics/actions/get-session-replay-summary.ts +9 -65
- package/corpus/templates/analytics/actions/list-event-catalog.ts +1 -1
- package/corpus/templates/analytics/actions/list-session-outputs.ts +40 -0
- package/corpus/templates/analytics/actions/list-session-recordings.ts +17 -4
- package/corpus/templates/analytics/actions/view-screen.ts +29 -3
- package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +38 -167
- package/corpus/templates/analytics/app/i18n/en-US.ts +27 -0
- package/corpus/templates/analytics/app/pages/sessions/EventCatalogPage.tsx +18 -1
- package/corpus/templates/analytics/app/pages/sessions/SessionDetailPage.tsx +3 -1
- package/corpus/templates/analytics/app/pages/sessions/SessionOutputs.tsx +197 -0
- package/corpus/templates/analytics/app/pages/sessions/SessionsTriagePage.tsx +114 -4
- package/corpus/templates/analytics/changelog/2026-10-15-sessions-can-find-people-who-made-a-slides-deck-but-didn-t-p.md +6 -0
- package/corpus/templates/analytics/changelog/2026-10-16-owned-and-shared-chats-appear-in-separate-history-sections.md +6 -0
- package/corpus/templates/analytics/changelog/2026-10-16-the-activation-funnel-counts-visitors-who-decline-analytics-.md +6 -0
- package/corpus/templates/analytics/server/db/schema.ts +67 -0
- package/corpus/templates/analytics/server/lib/canonical-first-party-dashboard-repair.ts +9 -0
- package/corpus/templates/analytics/server/lib/first-party-analytics.ts +28 -22
- package/corpus/templates/analytics/server/lib/first-party-metric-catalog.ts +36 -1
- package/corpus/templates/analytics/server/lib/output-outcomes.ts +712 -0
- package/corpus/templates/analytics/server/lib/replay-origins.ts +33 -0
- package/corpus/templates/analytics/server/lib/session-event-index.ts +20 -0
- package/corpus/templates/analytics/server/lib/session-performance.ts +6 -40
- package/corpus/templates/analytics/server/lib/session-recording-associations.ts +30 -1
- package/corpus/templates/analytics/server/lib/session-replay-triage.ts +99 -0
- package/corpus/templates/analytics/server/lib/session-replay.ts +45 -31
- package/corpus/templates/analytics/server/lib/sessions-triage-lab.ts +8 -2
- package/corpus/templates/analytics/server/plugins/db.ts +46 -0
- package/corpus/templates/analytics/shared/output-use.ts +205 -0
- package/corpus/templates/analytics/shared/session-events.ts +6 -0
- package/corpus/templates/assets/CHANGELOG.md +6 -0
- package/corpus/templates/assets/app/components/layout/Sidebar.tsx +51 -117
- package/corpus/templates/assets/changelog/2026-10-16-owned-and-shared-chats-appear-in-separate-history-sections.md +6 -0
- package/corpus/templates/brain/app/components/layout/Sidebar.tsx +34 -101
- package/corpus/templates/brain/app/routes/sources.tsx +1 -1
- package/corpus/templates/brain/vitest.config.ts +7 -0
- package/corpus/templates/calendar/CHANGELOG.md +12 -0
- package/corpus/templates/calendar/actions/create-event.ts +2 -4
- package/corpus/templates/calendar/actions/update-event.ts +35 -6
- package/corpus/templates/calendar/app/pages/BookingLinksPage.tsx +1 -1
- package/corpus/templates/calendar/changelog/2026-10-16-booking-links-show-localized-visibility-badges.md +6 -0
- package/corpus/templates/calendar/changelog/2026-10-21-solo-events-avoid-notification-approval.md +6 -0
- package/corpus/templates/chat/app/components/layout/Sidebar.tsx +62 -101
- package/corpus/templates/clips/CHANGELOG.md +7 -20
- package/corpus/templates/clips/app/components/meetings/share-meeting-dialog.tsx +20 -77
- package/corpus/templates/clips/app/components/player/share-dialog.tsx +63 -90
- package/corpus/templates/clips/app/components/sharing/share-test-support.tsx +180 -0
- package/corpus/templates/clips/app/components/sharing/share-ui.tsx +5 -584
- package/corpus/templates/clips/changelog/2026-10-16-share-dialogs-make-it-easier-to-see-who-has-access-and-manag.md +6 -0
- package/corpus/templates/clips/changelog/2026-10-21-share-panels-describe-general-access-in-a-sentence.md +6 -0
- package/corpus/templates/community/qr/package.json +1 -1
- package/corpus/templates/content/.agents/skills/document-editing/references/databases.md +6 -3
- package/corpus/templates/content/CHANGELOG.md +10 -0
- package/corpus/templates/content/actions/_browser-document-save-attempt.ts +23 -1
- package/corpus/templates/content/actions/_builder-cms-blob-custody.ts +467 -0
- package/corpus/templates/content/actions/_builder-cms-execution-lease.ts +17 -0
- package/corpus/templates/content/actions/_builder-cms-intent-lookup.ts +5 -0
- package/corpus/templates/content/actions/_builder-cms-read-client.ts +881 -21
- package/corpus/templates/content/actions/_builder-cms-write-adapter.ts +28 -2
- package/corpus/templates/content/actions/_builder-cms-write-client.ts +109 -11
- package/corpus/templates/content/actions/_builder-docs-client.ts +1 -0
- package/corpus/templates/content/actions/_builder-private-blob.test-fixture.ts +90 -0
- package/corpus/templates/content/actions/_builder-source-execution-guard.ts +48 -0
- package/corpus/templates/content/actions/_content-save-outcomes.ts +5 -0
- package/corpus/templates/content/actions/_database-source-utils.ts +290 -8
- package/corpus/templates/content/actions/_database-utils.ts +93 -7
- package/corpus/templates/content/actions/_database-view-setup.ts +21 -2
- package/corpus/templates/content/actions/_delete-content-space.ts +8 -1
- package/corpus/templates/content/actions/_github-source-freshness.ts +30 -4
- package/corpus/templates/content/actions/add-content-database-source-field-property.ts +23 -6
- package/corpus/templates/content/actions/cancel-prepared-builder-source-update.ts +110 -26
- package/corpus/templates/content/actions/change-content-database-source-role.ts +51 -7
- package/corpus/templates/content/actions/delete-document.ts +41 -3
- package/corpus/templates/content/actions/disconnect-content-database-source.ts +68 -2
- package/corpus/templates/content/actions/disconnect-local-folder-source.ts +33 -2
- package/corpus/templates/content/actions/execute-builder-source-execution.ts +900 -140
- package/corpus/templates/content/actions/get-document.ts +2 -0
- package/corpus/templates/content/actions/permanently-delete-document.ts +6 -0
- package/corpus/templates/content/actions/prepare-builder-source-execution.ts +155 -13
- package/corpus/templates/content/actions/prepare-builder-source-review.ts +299 -73
- package/corpus/templates/content/actions/set-live-body-switch.ts +45 -0
- package/corpus/templates/content/actions/update-document.ts +139 -20
- package/corpus/templates/content/actions/validate-builder-source-execution.ts +135 -26
- package/corpus/templates/content/app/components/editor/CommentsSidebar.tsx +119 -30
- package/corpus/templates/content/app/components/editor/DocumentEditor.tsx +56 -13
- package/corpus/templates/content/app/components/editor/SuggestionText.tsx +18 -3
- package/corpus/templates/content/app/components/editor/VisualEditor.tsx +89 -22
- package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +23 -0
- package/corpus/templates/content/app/components/editor/database/GitHubSourceStatusLine.tsx +27 -2
- package/corpus/templates/content/app/components/editor/database/ListItemLayout.tsx +32 -8
- package/corpus/templates/content/app/components/editor/database/ListItemRow.tsx +27 -2
- package/corpus/templates/content/app/components/editor/database-sources/BuilderSourceReviewDialog.tsx +1 -0
- package/corpus/templates/content/app/components/editor/extensions/SuggestionHighlight.ts +383 -34
- package/corpus/templates/content/app/components/editor/suggestions/draft-session.ts +31 -0
- package/corpus/templates/content/app/components/editor/suggestions/presentation-rebase.ts +82 -4
- package/corpus/templates/content/app/global.css +31 -0
- package/corpus/templates/content/app/hooks/use-content-database.ts +40 -2
- package/corpus/templates/content/app/hooks/use-documents.ts +14 -0
- package/corpus/templates/content/app/i18n-data.ts +1 -0
- package/corpus/templates/content/changelog/2026-10-16-accepting-a-suggestion-on-a-page-that-changed-since-it-was-s.md +6 -0
- package/corpus/templates/content/changelog/2026-10-17-builder-content-avoids-retrying-a-write-when-builder-accepte.md +6 -0
- package/corpus/templates/content/changelog/2026-10-18-link-a-new-collection-to-a-github-folder-from-its-sources.md +1 -1
- package/corpus/templates/content/changelog/2026-10-20-builder-content-sync-keeps-read-and-write-status-accurate-wh.md +6 -0
- package/corpus/templates/content/changelog/2026-10-20-suggested-edits-that-add-remove-split-or-merge-paragraphs-li.md +6 -0
- package/corpus/templates/content/changelog/2026-10-21-list-rows-can-show-each-pages-first-lines.md +6 -0
- package/corpus/templates/content/changelog/2026-10-22-a-collection-linked-to-a-big-github-folder-fills-faster-and-p.md +6 -0
- package/corpus/templates/content/docs/product/capabilities/content.source.adapters.md +29 -0
- package/corpus/templates/content/parity/matrix.md +42 -42
- package/corpus/templates/content/parity/matrix.ts +3 -1
- package/corpus/templates/content/server/db/schema.ts +20 -0
- package/corpus/templates/content/server/lib/content-trash-purge.ts +15 -1
- package/corpus/templates/content/server/lib/live-body-writer.ts +138 -26
- package/corpus/templates/content/server/live-copy/binding.ts +31 -0
- package/corpus/templates/content/server/live-copy/bounded-task.d.ts +6 -0
- package/corpus/templates/content/server/live-copy/exec-db.ts +1 -0
- package/corpus/templates/content/server/live-copy/holds.ts +59 -0
- package/corpus/templates/content/server/live-copy/persist.ts +656 -0
- package/corpus/templates/content/server/live-copy/switch.ts +136 -0
- package/corpus/templates/content/server/live-copy/task-names.ts +4 -0
- package/corpus/templates/content/server/live-copy/tasks.ts +183 -0
- package/corpus/templates/content/server/live-copy/write-cause.ts +85 -0
- package/corpus/templates/content/server/live-copy/write.ts +85 -0
- package/corpus/templates/content/server/plugins/builder-private-payload-cleanup.ts +22 -0
- package/corpus/templates/content/server/plugins/collab.ts +3 -0
- package/corpus/templates/content/server/plugins/db.ts +28 -0
- package/corpus/templates/content/shared/api.ts +30 -1
- package/corpus/templates/content/shared/database-item-layout.ts +54 -22
- package/corpus/templates/content/shared/document-intent-merge.ts +16 -9
- package/corpus/templates/content/shared/og-description.ts +258 -36
- package/corpus/templates/content/shared/suggestion-diff.ts +23 -6
- package/corpus/templates/content/shared/suggestion-formatting.ts +44 -14
- package/corpus/templates/content/shared/suggestion-text.ts +20 -5
- package/corpus/templates/design/.agents/skills/design-templates/SKILL.md +5 -1
- package/corpus/templates/design/.generated/bridge/shader-runtime.generated.ts +25 -4
- package/corpus/templates/design/CHANGELOG.md +5 -0
- package/corpus/templates/design/actions/get-getting-started.ts +53 -0
- package/corpus/templates/design/app/components/design/DesignCanvas.tsx +10 -0
- package/corpus/templates/design/app/components/design/bridge/native-shader-runtime.bridge.ts +132 -79
- package/corpus/templates/design/app/components/design/bridge/native-source-provider.ts +268 -130
- package/corpus/templates/design/app/components/design/bridge/native-worker-scene-host.ts +122 -42
- package/corpus/templates/design/app/components/design/bridge/shader-runtime.bridge.ts +41 -4
- package/corpus/templates/design/app/components/design/design-canvas/text-content-change-result.ts +46 -12
- package/corpus/templates/design/app/components/home/DesignHomeLibrary.tsx +15 -8
- package/corpus/templates/design/app/components/layout/GettingStarted.tsx +50 -0
- package/corpus/templates/design/app/components/layout/Sidebar.tsx +3 -0
- package/corpus/templates/design/app/components/templates/DesignTemplateGrid.tsx +163 -0
- package/corpus/templates/design/app/components/templates/DesignTemplateLibrary.tsx +65 -78
- package/corpus/templates/design/app/components/templates/TemplatePreview.tsx +6 -2
- package/corpus/templates/design/app/global.css +6 -0
- package/corpus/templates/design/app/i18n/en-US.ts +17 -0
- package/corpus/templates/design/app/lib/canvas-load-outcome.ts +147 -0
- package/corpus/templates/design/app/lib/canvas-outcome-tracking.ts +531 -0
- package/corpus/templates/design/app/lib/canvas-style-kind.ts +50 -0
- package/corpus/templates/design/app/pages/DesignSystems.tsx +1 -1
- package/corpus/templates/design/app/pages/Index.tsx +28 -67
- package/corpus/templates/design/app/pages/design-editor/commands/commit-visual-styles.ts +86 -29
- package/corpus/templates/design/app/pages/design-editor/commands/save-file-content.ts +38 -3
- package/corpus/templates/design/app/pages/design-editor/domains/use-editor-core.ts +9 -0
- package/corpus/templates/design/app/pages/design-editor/domains/use-editor-files-and-saving.ts +2 -0
- package/corpus/templates/design/changelog/2026-10-16-design-pages-use-localized-visibility-badges-and-a-shared-ow.md +6 -0
- package/corpus/templates/design/changelog/2026-10-21-a-getting-started-checklist-at-the-bottom-of-the-sidebar-tra.md +6 -0
- package/corpus/templates/design/changelog/2026-10-21-templates-now-open-a-read-only-preview-from-the-card-and-the.md +6 -0
- package/corpus/templates/design/changelog/2026-10-22-collapsed-shader-layers-no-longer-interrupt-other-shaders-on.md +6 -0
- package/corpus/templates/design/changelog/2026-10-22-shader-fills-keep-rendering-when-other-screen-content-cannot.md +6 -0
- package/corpus/templates/design/scripts/design-export-validation/export-baseline.json +24 -0
- package/corpus/templates/design/server/lib/getting-started.ts +267 -0
- package/corpus/templates/design/server/plugins/getting-started.ts +5 -0
- package/corpus/templates/design/shared/design-template-presets/analytics-dashboard.ts +127 -0
- package/corpus/templates/design/shared/design-template-presets/design-studio.ts +98 -0
- package/corpus/templates/design/shared/design-template-presets/messaging-app.ts +101 -0
- package/corpus/templates/design/shared/design-template-presets/project-tasks.ts +120 -0
- package/corpus/templates/design/shared/design-template-presets.ts +8 -0
- package/corpus/templates/dispatch/CHANGELOG.md +4 -0
- package/corpus/templates/dispatch/app/i18n-data.ts +75 -0
- package/corpus/templates/dispatch/changelog/2026-10-21-owned-and-shared-chats-appear-in-separate-history-sections.md +6 -0
- package/corpus/templates/factory/app/components/layout/Sidebar.tsx +34 -100
- package/corpus/templates/forms/app/pages/FormsListPage.tsx +1 -1
- package/corpus/templates/forms/server/plugins/agent-chat.ts +1 -1
- package/corpus/templates/plan/CHANGELOG.md +6 -0
- package/corpus/templates/plan/app/components/layout/Sidebar.tsx +34 -109
- package/corpus/templates/plan/changelog/2026-10-16-owned-and-shared-chats-appear-in-separate-history-sections.md +6 -0
- package/corpus/templates/slides/CHANGELOG.md +7 -0
- package/corpus/templates/slides/actions/delete-deck.ts +7 -0
- package/corpus/templates/slides/app/components/deck/DeckCard.tsx +1 -1
- package/corpus/templates/slides/app/components/design-system/DesignSystemCard.tsx +1 -1
- package/corpus/templates/slides/app/pages/Index.tsx +7 -2
- package/corpus/templates/slides/changelog/2026-10-16-deck-lists-use-the-shared-ownership-filter-and-visibility-ba.md +6 -0
- package/corpus/templates/slides/changelog/2026-10-21-connected-deck-deletion-requires-approval.md +6 -0
- package/corpus/templates/slides/scripts/edit-fidelity/client-action.ts +61 -0
- package/corpus/templates/slides/scripts/edit-fidelity/run.ts +10 -0
- package/package.json +1 -1
- package/corpus/templates/chat/app/lib/sidebar-thread-state.ts +0 -29
- package/corpus/templates/slides/app/components/deck/DeckFilterMenu.tsx +0 -83
|
@@ -4,7 +4,7 @@ import {
|
|
|
4
4
|
} from "@agent-native/core/client/hooks";
|
|
5
5
|
import { useT } from "@agent-native/core/client/i18n";
|
|
6
6
|
import { ShareButton } from "@agent-native/toolkit/app/sharing";
|
|
7
|
-
import { VisibilityBadge } from "@agent-native/toolkit/sharing";
|
|
7
|
+
import { VisibilityBadge } from "@agent-native/toolkit/app/sharing/VisibilityBadge";
|
|
8
8
|
import {
|
|
9
9
|
IconAlertTriangle,
|
|
10
10
|
IconArchive,
|
|
@@ -1,9 +1,16 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
|
|
1
3
|
import baseConfig from "@agent-native/core/vitest-config";
|
|
2
4
|
import { defineConfig, mergeConfig } from "vitest/config";
|
|
3
5
|
|
|
4
6
|
export default mergeConfig(
|
|
5
7
|
baseConfig,
|
|
6
8
|
defineConfig({
|
|
9
|
+
resolve: {
|
|
10
|
+
alias: {
|
|
11
|
+
"@": path.resolve(__dirname, "./app"),
|
|
12
|
+
},
|
|
13
|
+
},
|
|
7
14
|
test: {
|
|
8
15
|
passWithNoTests: true,
|
|
9
16
|
exclude: [
|
|
@@ -3,12 +3,24 @@
|
|
|
3
3
|
All notable user-facing changes to Agent-Native Calendar are documented here. Open it any
|
|
4
4
|
time from the command menu (Cmd+K → "What's new") or from Settings.
|
|
5
5
|
|
|
6
|
+
## 2026-10-21
|
|
7
|
+
|
|
8
|
+
### Fixed
|
|
9
|
+
|
|
10
|
+
- Calendar skips notification approval for solo events while preserving it for guest invitations and cancellations.
|
|
11
|
+
|
|
6
12
|
## 2026-10-19
|
|
7
13
|
|
|
8
14
|
### Changed
|
|
9
15
|
|
|
10
16
|
- Apps no longer keep server functions and databases warm by default; set `AGENT_NATIVE_ENABLE_KEEP_WARM=1` to opt in.
|
|
11
17
|
|
|
18
|
+
## 2026-10-16
|
|
19
|
+
|
|
20
|
+
### Improved
|
|
21
|
+
|
|
22
|
+
- Booking links show localized visibility badges.
|
|
23
|
+
|
|
12
24
|
## 2026-10-08
|
|
13
25
|
|
|
14
26
|
### Added
|
|
@@ -338,10 +338,8 @@ export default defineAction({
|
|
|
338
338
|
),
|
|
339
339
|
}),
|
|
340
340
|
needsApproval: ({ sendUpdates, attendees, eventType, autoDeclineMode }) =>
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
(sendUpdates === undefined &&
|
|
344
|
-
(normalizeAttendees(attendees)?.length ?? 0) > 0) ||
|
|
341
|
+
((normalizeAttendees(attendees)?.length ?? 0) > 0 &&
|
|
342
|
+
sendUpdates !== "none") ||
|
|
345
343
|
(eventType === "outOfOffice" && autoDeclineMode !== "declineNone"),
|
|
346
344
|
run: async (args, actionContext?: ActionRunContext) => {
|
|
347
345
|
const email = getRequestUserEmail();
|
|
@@ -224,16 +224,45 @@ export default defineAction({
|
|
|
224
224
|
),
|
|
225
225
|
}),
|
|
226
226
|
toolCallable: false,
|
|
227
|
-
needsApproval: ({
|
|
227
|
+
needsApproval: async ({
|
|
228
|
+
id,
|
|
229
|
+
accountEmail: requestedAccountEmail,
|
|
230
|
+
scope,
|
|
228
231
|
sendUpdates,
|
|
229
232
|
notificationMessage,
|
|
230
233
|
targetAccountEmail,
|
|
234
|
+
attendees,
|
|
231
235
|
addAttendees,
|
|
232
|
-
}) =>
|
|
233
|
-
targetAccountEmail !== undefined ||
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
(sendUpdates ===
|
|
236
|
+
}) => {
|
|
237
|
+
if (targetAccountEmail !== undefined || !!notificationMessage?.trim()) {
|
|
238
|
+
return true;
|
|
239
|
+
}
|
|
240
|
+
if (sendUpdates === "none") return false;
|
|
241
|
+
if (sendUpdates === undefined) return namesGuests(addAttendees);
|
|
242
|
+
|
|
243
|
+
if (namesGuests(attendees) || namesGuests(addAttendees)) return true;
|
|
244
|
+
|
|
245
|
+
// An empty replacement can still send cancellation notices to removed guests.
|
|
246
|
+
const ownerEmail = requireActionUserEmail();
|
|
247
|
+
const accountEmail = await resolveOwnedAccountEmail(
|
|
248
|
+
resolveGoogleEventAccountEmail(id, requestedAccountEmail),
|
|
249
|
+
ownerEmail,
|
|
250
|
+
);
|
|
251
|
+
let event = await googleCalendar.getEvent(
|
|
252
|
+
normalizeWritableGoogleEventId(id),
|
|
253
|
+
{
|
|
254
|
+
ownerEmail,
|
|
255
|
+
accountEmail,
|
|
256
|
+
},
|
|
257
|
+
);
|
|
258
|
+
if (scope === "all" && event.recurringEventId) {
|
|
259
|
+
event = await googleCalendar.getEvent(event.recurringEventId, {
|
|
260
|
+
ownerEmail,
|
|
261
|
+
accountEmail,
|
|
262
|
+
});
|
|
263
|
+
}
|
|
264
|
+
return (event.attendees?.length ?? 0) > 0;
|
|
265
|
+
},
|
|
237
266
|
run: async (args, actionContext?: ActionRunContext) => {
|
|
238
267
|
const ownerEmail = requireActionUserEmail();
|
|
239
268
|
if (args.addGoogleMeet && args.addZoom) {
|
|
@@ -6,7 +6,7 @@ import {
|
|
|
6
6
|
SlugEditor,
|
|
7
7
|
} from "@agent-native/scheduling/react/components";
|
|
8
8
|
import { ShareButton } from "@agent-native/toolkit/app/sharing";
|
|
9
|
-
import { VisibilityBadge } from "@agent-native/toolkit/sharing";
|
|
9
|
+
import { VisibilityBadge } from "@agent-native/toolkit/app/sharing/VisibilityBadge";
|
|
10
10
|
import type {
|
|
11
11
|
AvailabilityConfig,
|
|
12
12
|
BookingHost,
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { appPath } from "@agent-native/core/client/api-path";
|
|
1
2
|
import { useT } from "@agent-native/core/client/i18n";
|
|
2
3
|
import {
|
|
3
4
|
navigateWithAgentChatViewTransition,
|
|
@@ -5,14 +6,15 @@ import {
|
|
|
5
6
|
useChatThreads,
|
|
6
7
|
type ChatThreadSummary,
|
|
7
8
|
} from "@agent-native/toolkit/app/chat/agentkit-chat/rail";
|
|
9
|
+
import {
|
|
10
|
+
ownDraftRows,
|
|
11
|
+
OwnershipChatHistoryRail,
|
|
12
|
+
useOwnershipChatHistory,
|
|
13
|
+
type OwnDraftRow,
|
|
14
|
+
} from "@agent-native/toolkit/app/chat/ownership-history";
|
|
8
15
|
import { OrgSwitcher } from "@agent-native/toolkit/app/org";
|
|
9
16
|
import { openCommandMenu } from "@agent-native/toolkit/app/shared";
|
|
10
17
|
import { AgentNativeIcon } from "@agent-native/toolkit/app/shared/AgentNativeIcon";
|
|
11
|
-
import {
|
|
12
|
-
ChatHistoryList,
|
|
13
|
-
type ChatHistoryItem,
|
|
14
|
-
type ChatHistorySection,
|
|
15
|
-
} from "@agent-native/toolkit/chat-history/ChatHistoryList";
|
|
16
18
|
import {
|
|
17
19
|
IconApps,
|
|
18
20
|
IconClock,
|
|
@@ -25,7 +27,7 @@ import {
|
|
|
25
27
|
IconPin,
|
|
26
28
|
IconSearch,
|
|
27
29
|
} from "@tabler/icons-react";
|
|
28
|
-
import { useEffect,
|
|
30
|
+
import { useEffect, useRef, useState } from "react";
|
|
29
31
|
import { Link, useLocation, useNavigate } from "react-router";
|
|
30
32
|
import { toast } from "sonner";
|
|
31
33
|
|
|
@@ -41,7 +43,6 @@ import {
|
|
|
41
43
|
} from "@/components/ui/tooltip";
|
|
42
44
|
import { APP_TITLE } from "@/lib/app-config";
|
|
43
45
|
import { chatThreadPath, HOME_PATH, threadIdFromPath } from "@/lib/chat-paths";
|
|
44
|
-
import { visibleChatThreads } from "@/lib/sidebar-thread-state";
|
|
45
46
|
import { cn } from "@/lib/utils";
|
|
46
47
|
|
|
47
48
|
const CHAT_STORAGE_KEY = "chat";
|
|
@@ -53,11 +54,9 @@ interface SidebarProps {
|
|
|
53
54
|
onCollapsedChange?: (collapsed: boolean) => void;
|
|
54
55
|
}
|
|
55
56
|
|
|
56
|
-
function
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
function threadUpdatedAt(thread: ChatThreadSummary) {
|
|
57
|
+
function threadUpdatedAt(
|
|
58
|
+
thread: Pick<ChatThreadSummary, "createdAt" | "updatedAt">,
|
|
59
|
+
) {
|
|
61
60
|
return Number.isFinite(thread.updatedAt)
|
|
62
61
|
? thread.updatedAt
|
|
63
62
|
: Number.isFinite(thread.createdAt)
|
|
@@ -65,14 +64,6 @@ function threadUpdatedAt(thread: ChatThreadSummary) {
|
|
|
65
64
|
: 0;
|
|
66
65
|
}
|
|
67
66
|
|
|
68
|
-
function compareRecentThreads(a: ChatThreadSummary, b: ChatThreadSummary) {
|
|
69
|
-
return threadUpdatedAt(b) - threadUpdatedAt(a);
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
function comparePinnedThreads(a: ChatThreadSummary, b: ChatThreadSummary) {
|
|
73
|
-
return (b.pinnedAt ?? 0) - (a.pinnedAt ?? 0);
|
|
74
|
-
}
|
|
75
|
-
|
|
76
67
|
function formatRelativeTime(timestamp: number) {
|
|
77
68
|
const elapsed = timestamp - Date.now();
|
|
78
69
|
const intervals = [
|
|
@@ -106,7 +97,10 @@ function ThreadHistoryTitle({
|
|
|
106
97
|
title,
|
|
107
98
|
running,
|
|
108
99
|
}: {
|
|
109
|
-
thread:
|
|
100
|
+
thread: OwnDraftRow &
|
|
101
|
+
Partial<
|
|
102
|
+
Pick<ChatThreadSummary, "preview" | "scope" | "source" | "pinnedAt">
|
|
103
|
+
>;
|
|
110
104
|
title: string;
|
|
111
105
|
running: boolean;
|
|
112
106
|
}) {
|
|
@@ -287,7 +281,7 @@ function ChatThreadsSection({ collapsed }: { collapsed: boolean }) {
|
|
|
287
281
|
pinThread,
|
|
288
282
|
archiveThread,
|
|
289
283
|
renameThread,
|
|
290
|
-
|
|
284
|
+
isNewThread,
|
|
291
285
|
} = useChatThreads(undefined, CHAT_STORAGE_KEY, undefined, {
|
|
292
286
|
autoCreate: false,
|
|
293
287
|
restoreActiveThread: false,
|
|
@@ -295,66 +289,46 @@ function ChatThreadsSection({ collapsed }: { collapsed: boolean }) {
|
|
|
295
289
|
const { workingThreadIds, observedThreadStarts } =
|
|
296
290
|
useAgentChatRunningThreads();
|
|
297
291
|
|
|
298
|
-
const
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
292
|
+
const localMineRows = ownDraftRows({
|
|
293
|
+
threads,
|
|
294
|
+
isNewThread,
|
|
295
|
+
observedThreadStarts,
|
|
296
|
+
});
|
|
297
|
+
const history = useOwnershipChatHistory({
|
|
298
|
+
getThreadUrl: (threadId) => appPath(chatThreadPath(threadId)),
|
|
299
|
+
activeId:
|
|
300
|
+
threadIdFromPath(location.pathname) ??
|
|
301
|
+
activeThreadId ??
|
|
302
|
+
persistedActiveThreadId(),
|
|
303
|
+
localMineRows,
|
|
304
|
+
pinned: { label: t("chat.pinned") },
|
|
305
|
+
mutations: {
|
|
306
|
+
pin: pinThread,
|
|
307
|
+
rename: renameThread,
|
|
308
|
+
archive: archiveThread,
|
|
309
|
+
},
|
|
310
|
+
onMutationFailed: (kind) => {
|
|
311
|
+
if (kind === "archive") toast.error(t("chat.archiveFailed"));
|
|
312
|
+
if (kind === "rename") toast.error(t("chat.renameFailed"));
|
|
313
|
+
},
|
|
314
|
+
decorateItem: (item, row) => {
|
|
315
|
+
const title = row.title || row.preview || t("chat.untitledChat");
|
|
311
316
|
return {
|
|
312
|
-
|
|
317
|
+
...item,
|
|
313
318
|
title: (
|
|
314
319
|
<ThreadHistoryTitle
|
|
315
|
-
thread={
|
|
320
|
+
thread={row}
|
|
316
321
|
title={title}
|
|
317
|
-
running={workingThreadIds.has(
|
|
322
|
+
running={workingThreadIds.has(row.id)}
|
|
318
323
|
/>
|
|
319
324
|
),
|
|
320
|
-
titleText: title,
|
|
321
|
-
pinned: Boolean(thread.pinnedAt),
|
|
322
325
|
};
|
|
323
|
-
}
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
.filter((thread) => !thread.pinnedAt)
|
|
330
|
-
.sort(compareRecentThreads)
|
|
331
|
-
.slice(0, 30)
|
|
332
|
-
.map(toItem);
|
|
333
|
-
|
|
334
|
-
return [
|
|
335
|
-
{ id: "pinned", label: t("chat.pinned"), items: pinned },
|
|
336
|
-
{ id: "recents", label: t("chat.recents"), items: recent },
|
|
337
|
-
];
|
|
338
|
-
}, [t, visibleThreads, workingThreadIds]);
|
|
339
|
-
|
|
340
|
-
useEffect(() => {
|
|
341
|
-
const refresh = () => refreshThreads();
|
|
342
|
-
const handleRunning = (event: Event) => {
|
|
343
|
-
const detail = (event as CustomEvent).detail as
|
|
344
|
-
| { isRunning?: unknown }
|
|
345
|
-
| undefined;
|
|
346
|
-
if (typeof detail?.isRunning === "boolean") refreshThreads();
|
|
347
|
-
};
|
|
348
|
-
|
|
349
|
-
window.addEventListener("agent-chat:threads-updated", refresh);
|
|
350
|
-
window.addEventListener("agentNative.chatRunning", handleRunning);
|
|
351
|
-
window.addEventListener("focus", refresh);
|
|
352
|
-
return () => {
|
|
353
|
-
window.removeEventListener("agent-chat:threads-updated", refresh);
|
|
354
|
-
window.removeEventListener("agentNative.chatRunning", handleRunning);
|
|
355
|
-
window.removeEventListener("focus", refresh);
|
|
356
|
-
};
|
|
357
|
-
}, [refreshThreads]);
|
|
326
|
+
},
|
|
327
|
+
});
|
|
328
|
+
const displayedActiveThreadId =
|
|
329
|
+
threadIdFromPath(location.pathname) ??
|
|
330
|
+
activeThreadId ??
|
|
331
|
+
persistedActiveThreadId();
|
|
358
332
|
|
|
359
333
|
function openThread(threadId: string, options?: { isNew?: boolean }) {
|
|
360
334
|
switchThread(threadId);
|
|
@@ -382,23 +356,6 @@ function ChatThreadsSection({ collapsed }: { collapsed: boolean }) {
|
|
|
382
356
|
if (threadId) openThread(threadId, { isNew: true });
|
|
383
357
|
}
|
|
384
358
|
|
|
385
|
-
async function handleArchiveThread(threadId: string) {
|
|
386
|
-
const wasActive =
|
|
387
|
-
threadId === activeThreadId || threadId === persistedActiveThreadId();
|
|
388
|
-
const archived = await archiveThread(threadId);
|
|
389
|
-
if (!archived) {
|
|
390
|
-
toast.error(t("chat.archiveFailed"));
|
|
391
|
-
return;
|
|
392
|
-
}
|
|
393
|
-
if (wasActive) await handleNewChat();
|
|
394
|
-
}
|
|
395
|
-
|
|
396
|
-
function handleRenameThread(threadId: string, title: string) {
|
|
397
|
-
void renameThread(threadId, title).then((renamed) => {
|
|
398
|
-
if (!renamed) toast.error(t("chat.renameFailed"));
|
|
399
|
-
});
|
|
400
|
-
}
|
|
401
|
-
|
|
402
359
|
const newChatButton = (
|
|
403
360
|
<button
|
|
404
361
|
type="button"
|
|
@@ -430,17 +387,20 @@ function ChatThreadsSection({ collapsed }: { collapsed: boolean }) {
|
|
|
430
387
|
return (
|
|
431
388
|
<div className="flex min-h-0 flex-1 flex-col">
|
|
432
389
|
<div className="px-2 pb-3">{newChatButton}</div>
|
|
433
|
-
<
|
|
434
|
-
|
|
390
|
+
<OwnershipChatHistoryRail
|
|
391
|
+
{...history}
|
|
392
|
+
onNewChat={() => void handleNewChat()}
|
|
393
|
+
showNewChat={false}
|
|
435
394
|
activeId={displayedActiveThreadId}
|
|
436
395
|
onSelect={openThread}
|
|
437
|
-
|
|
438
|
-
const
|
|
439
|
-
|
|
396
|
+
onDelete={async (threadId) => {
|
|
397
|
+
const wasActive =
|
|
398
|
+
threadId === activeThreadId ||
|
|
399
|
+
threadId === persistedActiveThreadId();
|
|
400
|
+
const archived = await history.listProps.onDelete?.(threadId);
|
|
401
|
+
if (archived && wasActive) await handleNewChat();
|
|
440
402
|
}}
|
|
441
|
-
onRename={handleRenameThread}
|
|
442
403
|
renameMaxLength={160}
|
|
443
|
-
onDelete={(threadId) => void handleArchiveThread(threadId)}
|
|
444
404
|
labels={{
|
|
445
405
|
options: (item) =>
|
|
446
406
|
t("chat.optionsFor", { title: item.titleText ?? "" }),
|
|
@@ -451,8 +411,9 @@ function ChatThreadsSection({ collapsed }: { collapsed: boolean }) {
|
|
|
451
411
|
unpin: t("chat.unpinChat"),
|
|
452
412
|
delete: t("chat.archiveChat"),
|
|
453
413
|
}}
|
|
454
|
-
|
|
455
|
-
|
|
414
|
+
railLabels={{
|
|
415
|
+
newChat: t("chat.newChat"),
|
|
416
|
+
}}
|
|
456
417
|
className="chat-sidebar-history min-h-0 flex-1"
|
|
457
418
|
listClassName="pb-4"
|
|
458
419
|
/>
|
|
@@ -3,6 +3,12 @@
|
|
|
3
3
|
All notable user-facing changes to Clips are documented here. Open it any time
|
|
4
4
|
from the command menu (Cmd+K → "What's new") or from Settings.
|
|
5
5
|
|
|
6
|
+
## 2026-10-21
|
|
7
|
+
|
|
8
|
+
### Improved
|
|
9
|
+
|
|
10
|
+
- Share panels describe general access in a sentence and no longer open an empty people list when you click into them.
|
|
11
|
+
|
|
6
12
|
## 2026-10-20
|
|
7
13
|
|
|
8
14
|
### Fixed
|
|
@@ -59,6 +65,7 @@ from the command menu (Cmd+K → "What's new") or from Settings.
|
|
|
59
65
|
|
|
60
66
|
### Improved
|
|
61
67
|
|
|
68
|
+
- Share dialogs make it easier to see who has access and manage common sharing changes.
|
|
62
69
|
- Rewind settings now show whether Rewind is remembering screen only or screen + audio.
|
|
63
70
|
- Clips detects browser meetings more reliably and keeps notes until the meeting stop and transcript save are confirmed.
|
|
64
71
|
- Clips detects browser meetings sooner, asks before starting when the active tab is unclear, and retries failed stops.
|
|
@@ -1617,24 +1624,4 @@ from the command menu (Cmd+K → "What's new") or from Settings.
|
|
|
1617
1624
|
- The agent sidebar now slides in smoothly without duplicate edge borders.
|
|
1618
1625
|
- The clip details sidebar now collapses into a slide-out panel on smaller screens.
|
|
1619
1626
|
|
|
1620
|
-
## 2026-06-25
|
|
1621
|
-
|
|
1622
|
-
### Added
|
|
1623
|
-
|
|
1624
|
-
- GitHub issue and pull request pages can now preview playable Clips links when the Chrome extension is installed.
|
|
1625
|
-
- Recording pages now offer a download action for viewers with video download access.
|
|
1626
|
-
|
|
1627
|
-
### Improved
|
|
1628
|
-
|
|
1629
|
-
- Clip titles are now edited only from a clip's detail view, not from the library grid
|
|
1630
|
-
- Console diagnostics keep more useful non-secret details when clips are shared with agents.
|
|
1631
|
-
- Recording cards now avoid duplicate rename controls in the overflow menu.
|
|
1632
|
-
|
|
1633
|
-
### Fixed
|
|
1634
|
-
|
|
1635
|
-
- Chrome extension recordings now upload large capture bursts reliably and report extension errors to Sentry.
|
|
1636
|
-
- Fixed owner recognition so Clips created from desktop and web sessions remain editable by the same signed-in user.
|
|
1637
|
-
- Fixed the Mac menu bar popover so it opens reliably after launch at login.
|
|
1638
|
-
- Localized Clips Settings changelog and extension sidebar labels in every supported interface language.
|
|
1639
|
-
|
|
1640
1627
|
For the full list of updates, see the [changelog folder](./changelog/).
|
|
@@ -1,9 +1,15 @@
|
|
|
1
1
|
import { appPath } from "@agent-native/core/client/api-path";
|
|
2
|
-
import {
|
|
3
|
-
useActionQuery,
|
|
4
|
-
useActionMutation,
|
|
5
|
-
} from "@agent-native/core/client/hooks";
|
|
2
|
+
import { useActionMutation } from "@agent-native/core/client/hooks";
|
|
6
3
|
import { useT } from "@agent-native/core/client/i18n";
|
|
4
|
+
import {
|
|
5
|
+
useShareButtonController,
|
|
6
|
+
type ShareButtonController,
|
|
7
|
+
} from "@agent-native/core/client/sharing/useShareButtonController";
|
|
8
|
+
import {
|
|
9
|
+
ShareGeneralAccessRow,
|
|
10
|
+
SharePeopleInvite,
|
|
11
|
+
SharePeopleList,
|
|
12
|
+
} from "@agent-native/toolkit/app/sharing";
|
|
7
13
|
import {
|
|
8
14
|
useCallback,
|
|
9
15
|
useEffect,
|
|
@@ -16,15 +22,8 @@ import { toast } from "sonner";
|
|
|
16
22
|
|
|
17
23
|
import {
|
|
18
24
|
CopyButton,
|
|
19
|
-
GeneralAccessSelect,
|
|
20
|
-
InvitePeopleField,
|
|
21
|
-
PeopleAccessSection,
|
|
22
25
|
ShareSectionLabel,
|
|
23
26
|
nestedLayerDismissGuards,
|
|
24
|
-
useResourceVisibilityMutation,
|
|
25
|
-
type SharesQuery,
|
|
26
|
-
type SharesResponse,
|
|
27
|
-
type Visibility,
|
|
28
27
|
} from "@/components/sharing/share-ui";
|
|
29
28
|
import { Button } from "@/components/ui/button";
|
|
30
29
|
import {
|
|
@@ -53,6 +52,7 @@ export function ShareMeetingPopover({
|
|
|
53
52
|
<PopoverTrigger asChild>{children}</PopoverTrigger>
|
|
54
53
|
<PopoverContent
|
|
55
54
|
align="end"
|
|
55
|
+
onOpenAutoFocus={(event) => event.preventDefault()}
|
|
56
56
|
{...nestedLayerDismissGuards()}
|
|
57
57
|
className="max-h-[calc(100vh-1rem)] w-[440px] max-w-[calc(100vw-1rem)] overflow-y-auto border-border p-0"
|
|
58
58
|
>
|
|
@@ -80,32 +80,18 @@ function ShareMeetingContent({
|
|
|
80
80
|
[meetingId],
|
|
81
81
|
);
|
|
82
82
|
|
|
83
|
-
const
|
|
83
|
+
const controller = useShareButtonController({
|
|
84
84
|
resourceType: "meeting",
|
|
85
85
|
resourceId: meetingId,
|
|
86
|
+
defaultOpen: true,
|
|
86
87
|
});
|
|
87
88
|
|
|
88
|
-
const data = sharesQuery.data;
|
|
89
|
-
const canManage = data?.role === "owner" || data?.role === "admin";
|
|
90
|
-
const visibility: Visibility =
|
|
91
|
-
(data?.visibility as Visibility | null) ?? "private";
|
|
92
|
-
const { setResourceVisibility, isPending } = useResourceVisibilityMutation(
|
|
93
|
-
"meeting",
|
|
94
|
-
meetingId,
|
|
95
|
-
sharesQuery,
|
|
96
|
-
);
|
|
97
|
-
const visibilityPending = isPending || sharesQuery.isLoading;
|
|
98
|
-
|
|
99
89
|
return (
|
|
100
90
|
<div className="min-w-0 px-4 py-3">
|
|
101
91
|
<LinkTab
|
|
102
92
|
meetingId={meetingId}
|
|
103
93
|
shareUrl={shareUrl}
|
|
104
|
-
|
|
105
|
-
canManage={canManage}
|
|
106
|
-
visibility={visibility}
|
|
107
|
-
visibilityPending={visibilityPending}
|
|
108
|
-
onVisibilityChange={setResourceVisibility}
|
|
94
|
+
controller={controller}
|
|
109
95
|
shareTranscript={shareTranscript}
|
|
110
96
|
transcriptReady={transcriptReady}
|
|
111
97
|
/>
|
|
@@ -116,24 +102,13 @@ function ShareMeetingContent({
|
|
|
116
102
|
function LinkTab({
|
|
117
103
|
meetingId,
|
|
118
104
|
shareUrl,
|
|
119
|
-
|
|
120
|
-
canManage,
|
|
121
|
-
visibility,
|
|
122
|
-
visibilityPending,
|
|
123
|
-
onVisibilityChange,
|
|
105
|
+
controller,
|
|
124
106
|
shareTranscript,
|
|
125
107
|
transcriptReady,
|
|
126
108
|
}: {
|
|
127
109
|
meetingId: string;
|
|
128
110
|
shareUrl: string;
|
|
129
|
-
|
|
130
|
-
canManage: boolean;
|
|
131
|
-
visibility: Visibility;
|
|
132
|
-
visibilityPending: boolean;
|
|
133
|
-
onVisibilityChange: (
|
|
134
|
-
next: Visibility,
|
|
135
|
-
options?: { onSuccess?: () => void },
|
|
136
|
-
) => void;
|
|
111
|
+
controller: ShareButtonController;
|
|
137
112
|
shareTranscript: boolean;
|
|
138
113
|
transcriptReady: boolean;
|
|
139
114
|
}) {
|
|
@@ -143,7 +118,7 @@ function LinkTab({
|
|
|
143
118
|
{ id: string; shareTranscript: boolean }
|
|
144
119
|
>("update-meeting");
|
|
145
120
|
const [includeTranscript, setIncludeTranscript] = useState(shareTranscript);
|
|
146
|
-
const data =
|
|
121
|
+
const { sharesQuery, data, canManage, visibility } = controller;
|
|
147
122
|
const isPublic = visibility === "public";
|
|
148
123
|
const sharesLoaded = data?.visibility != null;
|
|
149
124
|
const createAgentLink = useActionMutation("create-agent-resource-link");
|
|
@@ -216,45 +191,13 @@ function LinkTab({
|
|
|
216
191
|
|
|
217
192
|
return (
|
|
218
193
|
<div className="space-y-3">
|
|
219
|
-
{
|
|
220
|
-
<InvitePeopleField
|
|
221
|
-
resourceType="meeting"
|
|
222
|
-
resourceId={meetingId}
|
|
223
|
-
sharesQuery={sharesQuery}
|
|
224
|
-
onError={(err) =>
|
|
225
|
-
toast.error(
|
|
226
|
-
err instanceof Error
|
|
227
|
-
? err.message
|
|
228
|
-
: t("clipsFinalRaw.inviteFailed"),
|
|
229
|
-
)
|
|
230
|
-
}
|
|
231
|
-
/>
|
|
232
|
-
) : null}
|
|
194
|
+
<SharePeopleInvite controller={controller} />
|
|
233
195
|
|
|
234
196
|
<div className="space-y-2">
|
|
235
197
|
<ShareSectionLabel>{t("shareUi.whoHasAccess")}</ShareSectionLabel>
|
|
236
198
|
<div className="flex flex-col gap-1">
|
|
237
|
-
<
|
|
238
|
-
|
|
239
|
-
resourceId={meetingId}
|
|
240
|
-
sharesQuery={sharesQuery}
|
|
241
|
-
canManage={canManage}
|
|
242
|
-
onError={(err, action) =>
|
|
243
|
-
toast.error(
|
|
244
|
-
err instanceof Error
|
|
245
|
-
? err.message
|
|
246
|
-
: action === "permission"
|
|
247
|
-
? t("clipsFinalRaw.permissionUpdateFailed")
|
|
248
|
-
: t("clipsFinalRaw.removePersonFailed"),
|
|
249
|
-
)
|
|
250
|
-
}
|
|
251
|
-
/>
|
|
252
|
-
<GeneralAccessSelect
|
|
253
|
-
visibility={visibility}
|
|
254
|
-
canManage={canManage}
|
|
255
|
-
isPending={visibilityPending}
|
|
256
|
-
onChange={onVisibilityChange}
|
|
257
|
-
/>
|
|
199
|
+
<SharePeopleList controller={controller} />
|
|
200
|
+
<ShareGeneralAccessRow controller={controller} sentenceTrigger />
|
|
258
201
|
</div>
|
|
259
202
|
</div>
|
|
260
203
|
|