@agent-native/core 0.149.1 → 0.149.3
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/actions/SKILL.md +54 -488
- package/corpus/templates/analytics/.agents/skills/actions/references/action-fields.md +136 -0
- package/corpus/templates/analytics/.agents/skills/actions/references/examples.md +94 -0
- package/corpus/templates/analytics/.agents/skills/actions/references/provider-apis.md +95 -0
- package/corpus/templates/analytics/.agents/skills/create-skill/SKILL.md +9 -35
- package/corpus/templates/analytics/.agents/skills/creative-context/SKILL.md +4 -2
- package/corpus/templates/analytics/.agents/skills/dashboard-management/SKILL.md +2 -0
- package/corpus/templates/analytics/.agents/skills/frontend-design/SKILL.md +4 -5
- package/corpus/templates/analytics/.agents/skills/turn-into-app/SKILL.md +18 -31
- package/corpus/templates/analytics/AGENTS.md +25 -32
- package/corpus/templates/analytics/app/components/dashboard/SqlChart.tsx +150 -46
- package/corpus/templates/analytics/app/global.css +1 -1
- package/corpus/templates/analytics/app/i18n-data.ts +37 -0
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/PanelEditorDialog.tsx +1 -1
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/SqlChartCard.tsx +32 -0
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/types.ts +2 -0
- package/corpus/templates/analytics/changelog/2026-08-10-dashboard-tables-can-be-copied-and-sorted-by-multiple-column.md +6 -0
- package/corpus/templates/analytics/changelog/2026-08-10-full-page-chat-now-uses-the-available-width-up-to-1000px-for.md +6 -0
- package/corpus/templates/analytics/changelog/2026-08-11-full-page-chat-composers-stay-at-a-focused-750px-width.md +6 -0
- package/corpus/templates/assets/.agents/skills/actions/SKILL.md +54 -488
- package/corpus/templates/assets/.agents/skills/actions/references/action-fields.md +136 -0
- package/corpus/templates/assets/.agents/skills/actions/references/examples.md +94 -0
- package/corpus/templates/assets/.agents/skills/actions/references/provider-apis.md +95 -0
- package/corpus/templates/assets/.agents/skills/create-skill/SKILL.md +9 -35
- package/corpus/templates/assets/.agents/skills/creative-context/SKILL.md +4 -2
- package/corpus/templates/assets/.agents/skills/frontend-design/SKILL.md +4 -5
- package/corpus/templates/assets/.agents/skills/turn-into-app/SKILL.md +18 -31
- package/corpus/templates/assets/AGENTS.md +6 -9
- package/corpus/templates/assets/app/global.css +1 -1
- package/corpus/templates/assets/changelog/2026-08-10-full-page-chat-now-uses-the-available-width-up-to-1000px-for.md +6 -0
- package/corpus/templates/assets/changelog/2026-08-11-full-page-chat-composers-stay-at-a-focused-750px-width.md +6 -0
- package/corpus/templates/brain/.agents/skills/actions/SKILL.md +54 -488
- package/corpus/templates/brain/.agents/skills/actions/references/action-fields.md +136 -0
- package/corpus/templates/brain/.agents/skills/actions/references/examples.md +94 -0
- package/corpus/templates/brain/.agents/skills/actions/references/provider-apis.md +95 -0
- package/corpus/templates/brain/.agents/skills/create-skill/SKILL.md +9 -35
- package/corpus/templates/brain/.agents/skills/frontend-design/SKILL.md +4 -5
- package/corpus/templates/brain/.agents/skills/turn-into-app/SKILL.md +18 -31
- package/corpus/templates/brain/AGENTS.md +5 -12
- package/corpus/templates/brain/app/global.css +1 -1
- package/corpus/templates/brain/changelog/2026-08-10-full-page-chat-now-uses-the-available-width-up-to-1000px-for.md +6 -0
- package/corpus/templates/brain/changelog/2026-08-11-full-page-chat-composers-stay-at-a-focused-750px-width.md +6 -0
- package/corpus/templates/calendar/.agents/skills/actions/SKILL.md +54 -488
- package/corpus/templates/calendar/.agents/skills/actions/references/action-fields.md +136 -0
- package/corpus/templates/calendar/.agents/skills/actions/references/examples.md +94 -0
- package/corpus/templates/calendar/.agents/skills/actions/references/provider-apis.md +95 -0
- package/corpus/templates/calendar/.agents/skills/create-skill/SKILL.md +9 -35
- package/corpus/templates/calendar/.agents/skills/frontend-design/SKILL.md +4 -5
- package/corpus/templates/calendar/.agents/skills/turn-into-app/SKILL.md +18 -31
- package/corpus/templates/calendar/AGENTS.md +8 -9
- package/corpus/templates/chat/.agents/skills/actions/SKILL.md +54 -488
- package/corpus/templates/chat/.agents/skills/actions/references/action-fields.md +136 -0
- package/corpus/templates/chat/.agents/skills/actions/references/examples.md +94 -0
- package/corpus/templates/chat/.agents/skills/actions/references/provider-apis.md +95 -0
- package/corpus/templates/chat/.agents/skills/create-skill/SKILL.md +9 -35
- package/corpus/templates/chat/.agents/skills/frontend-design/SKILL.md +4 -5
- package/corpus/templates/chat/.agents/skills/turn-into-app/SKILL.md +18 -31
- package/corpus/templates/chat/AGENTS.md +32 -80
- package/corpus/templates/chat/changelog/2026-08-10-full-page-chat-now-uses-the-available-width-up-to-1000px-for.md +6 -0
- package/corpus/templates/clips/.agents/skills/actions/SKILL.md +54 -488
- package/corpus/templates/clips/.agents/skills/actions/references/action-fields.md +136 -0
- package/corpus/templates/clips/.agents/skills/actions/references/examples.md +94 -0
- package/corpus/templates/clips/.agents/skills/actions/references/provider-apis.md +95 -0
- package/corpus/templates/clips/.agents/skills/create-skill/SKILL.md +9 -35
- package/corpus/templates/clips/.agents/skills/frontend-design/SKILL.md +4 -5
- package/corpus/templates/clips/.agents/skills/turn-into-app/SKILL.md +18 -31
- package/corpus/templates/clips/AGENTS.md +25 -31
- package/corpus/templates/clips/changelog/2026-08-10-clips-desktop-sign-in-now-starts-with-magic-links-and-google.md +6 -0
- package/corpus/templates/clips/chrome-extension/src/overlay.css +1 -0
- package/corpus/templates/clips/desktop/src/app.tsx +274 -137
- package/corpus/templates/clips/desktop/src/styles.css +35 -0
- package/corpus/templates/content/.agents/skills/actions/SKILL.md +54 -488
- package/corpus/templates/content/.agents/skills/actions/references/action-fields.md +136 -0
- package/corpus/templates/content/.agents/skills/actions/references/examples.md +94 -0
- package/corpus/templates/content/.agents/skills/actions/references/provider-apis.md +95 -0
- package/corpus/templates/content/.agents/skills/create-skill/SKILL.md +9 -35
- package/corpus/templates/content/.agents/skills/creative-context/SKILL.md +4 -2
- package/corpus/templates/content/.agents/skills/frontend-design/SKILL.md +4 -5
- package/corpus/templates/content/.agents/skills/turn-into-app/SKILL.md +18 -31
- package/corpus/templates/content/AGENTS.md +5 -9
- package/corpus/templates/content/app/global.css +1 -0
- package/corpus/templates/crm/.agents/skills/turn-into-app/SKILL.md +18 -31
- package/corpus/templates/crm/AGENTS.md +7 -11
- package/corpus/templates/crm/app/global.css +1 -1
- package/corpus/templates/crm/changelog/2026-08-10-full-page-chat-now-uses-the-available-width-up-to-1000px-for.md +6 -0
- package/corpus/templates/crm/changelog/2026-08-11-full-page-chat-composers-stay-at-a-focused-750px-width.md +6 -0
- package/corpus/templates/design/.agents/skills/actions/SKILL.md +54 -488
- package/corpus/templates/design/.agents/skills/actions/references/action-fields.md +136 -0
- package/corpus/templates/design/.agents/skills/actions/references/examples.md +94 -0
- package/corpus/templates/design/.agents/skills/actions/references/provider-apis.md +95 -0
- package/corpus/templates/design/.agents/skills/create-skill/SKILL.md +9 -35
- package/corpus/templates/design/.agents/skills/creative-context/SKILL.md +4 -2
- package/corpus/templates/design/.agents/skills/frontend-design/SKILL.md +4 -5
- package/corpus/templates/design/.agents/skills/turn-into-app/SKILL.md +18 -31
- package/corpus/templates/design/.generated/bridge/editor-chrome.generated.ts +70 -3
- package/corpus/templates/design/AGENTS.md +13 -21
- package/corpus/templates/design/app/components/design/DesignCanvas.tsx +12 -0
- package/corpus/templates/design/app/components/design/LayersPanel.tsx +19 -2
- package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +115 -7
- package/corpus/templates/design/app/components/design/bridge/editor-chrome.bridge.ts +82 -7
- package/corpus/templates/design/app/components/design/design-trace.ts +120 -0
- package/corpus/templates/design/app/components/design/dnd-debug.ts +2 -1
- package/corpus/templates/design/app/components/design/edit-panel/position-layout-properties.tsx +40 -26
- package/corpus/templates/design/app/components/design/multi-screen/board-surface-html.ts +4 -1
- package/corpus/templates/design/app/components/design/multi-screen/frame-geometry.ts +12 -3
- package/corpus/templates/design/app/components/design/multi-screen/screen-content-cache.ts +4 -0
- package/corpus/templates/design/app/components/design/multi-screen/types.ts +7 -0
- package/corpus/templates/design/app/components/editor/PromptDialog.tsx +3 -2
- package/corpus/templates/design/app/components/layout/Sidebar.tsx +2 -2
- package/corpus/templates/design/app/hooks/useDesignHotkeys.ts +3 -0
- package/corpus/templates/design/app/i18n-data.ts +1 -0
- package/corpus/templates/design/app/pages/DesignSystemSetup.tsx +5 -5
- package/corpus/templates/design/app/pages/DesignSystems.tsx +3 -2
- package/corpus/templates/design/app/pages/design-editor/canvas-primitive-insert.ts +100 -13
- package/corpus/templates/design/app/pages/design-editor/cross-screen-text-color.ts +1 -1
- package/corpus/templates/design/app/pages/design-editor/data-operations.ts +14 -0
- package/corpus/templates/design/changelog/2026-08-10-marquee-selecting-layers-far-down-a-tall-screen-now-selects-.md +6 -0
- package/corpus/templates/design/changelog/2026-08-10-the-frame-tool-draws-a-plain-frame-by-default-with-screen-av.md +6 -0
- package/corpus/templates/design/e2e/global-setup.ts +27 -32
- package/corpus/templates/design/playwright.config.ts +3 -5
- package/corpus/templates/design/shared/breakpoint-media.ts +9 -2
- package/corpus/templates/dispatch/.agents/skills/actions/SKILL.md +54 -488
- package/corpus/templates/dispatch/.agents/skills/actions/references/action-fields.md +136 -0
- package/corpus/templates/dispatch/.agents/skills/actions/references/examples.md +94 -0
- package/corpus/templates/dispatch/.agents/skills/actions/references/provider-apis.md +95 -0
- package/corpus/templates/dispatch/.agents/skills/create-skill/SKILL.md +9 -35
- package/corpus/templates/dispatch/.agents/skills/frontend-design/SKILL.md +4 -5
- package/corpus/templates/dispatch/.agents/skills/turn-into-app/SKILL.md +18 -31
- package/corpus/templates/dispatch/AGENTS.md +9 -16
- package/corpus/templates/dispatch/changelog/2026-08-10-full-page-chat-now-uses-the-available-width-up-to-1000px-for.md +6 -0
- package/corpus/templates/factory/.agents/skills/actions/SKILL.md +54 -488
- package/corpus/templates/factory/.agents/skills/actions/references/action-fields.md +136 -0
- package/corpus/templates/factory/.agents/skills/actions/references/examples.md +94 -0
- package/corpus/templates/factory/.agents/skills/actions/references/provider-apis.md +95 -0
- package/corpus/templates/factory/.agents/skills/create-skill/SKILL.md +9 -35
- package/corpus/templates/factory/.agents/skills/frontend-design/SKILL.md +4 -5
- package/corpus/templates/factory/.agents/skills/turn-into-app/SKILL.md +18 -31
- package/corpus/templates/factory/AGENTS.md +10 -24
- package/corpus/templates/factory/changelog/2026-08-10-full-page-chat-now-uses-the-available-width-up-to-1000px-for.md +6 -0
- package/corpus/templates/forms/.agents/skills/actions/SKILL.md +54 -488
- package/corpus/templates/forms/.agents/skills/actions/references/action-fields.md +136 -0
- package/corpus/templates/forms/.agents/skills/actions/references/examples.md +94 -0
- package/corpus/templates/forms/.agents/skills/actions/references/provider-apis.md +95 -0
- package/corpus/templates/forms/.agents/skills/create-skill/SKILL.md +9 -35
- package/corpus/templates/forms/.agents/skills/frontend-design/SKILL.md +4 -5
- package/corpus/templates/forms/.agents/skills/turn-into-app/SKILL.md +18 -31
- package/corpus/templates/forms/AGENTS.md +11 -17
- package/corpus/templates/forms/app/global.css +1 -0
- package/corpus/templates/forms/changelog/2026-08-10-full-page-chat-now-uses-the-available-width-up-to-1000px-for.md +6 -0
- package/corpus/templates/forms/changelog/2026-08-11-full-page-chat-composers-stay-at-a-focused-750px-width.md +6 -0
- package/corpus/templates/macros/.agents/skills/frontend-design/SKILL.md +4 -5
- package/corpus/templates/macros/.agents/skills/turn-into-app/SKILL.md +18 -31
- package/corpus/templates/macros/AGENTS.md +8 -8
- package/corpus/templates/mail/.agents/skills/actions/SKILL.md +54 -488
- package/corpus/templates/mail/.agents/skills/actions/references/action-fields.md +136 -0
- package/corpus/templates/mail/.agents/skills/actions/references/examples.md +94 -0
- package/corpus/templates/mail/.agents/skills/actions/references/provider-apis.md +95 -0
- package/corpus/templates/mail/.agents/skills/create-skill/SKILL.md +9 -35
- package/corpus/templates/mail/.agents/skills/frontend-design/SKILL.md +4 -5
- package/corpus/templates/mail/.agents/skills/turn-into-app/SKILL.md +18 -31
- package/corpus/templates/mail/AGENTS.md +5 -6
- package/corpus/templates/plan/.agents/skills/actions/SKILL.md +54 -488
- package/corpus/templates/plan/.agents/skills/actions/references/action-fields.md +136 -0
- package/corpus/templates/plan/.agents/skills/actions/references/examples.md +94 -0
- package/corpus/templates/plan/.agents/skills/actions/references/provider-apis.md +95 -0
- package/corpus/templates/plan/.agents/skills/create-skill/SKILL.md +9 -35
- package/corpus/templates/plan/.agents/skills/frontend-design/SKILL.md +4 -5
- package/corpus/templates/plan/.agents/skills/turn-into-app/SKILL.md +18 -31
- package/corpus/templates/plan/AGENTS.md +5 -14
- package/corpus/templates/plan/app/global.css +1 -0
- package/corpus/templates/plan/changelog/2026-08-10-full-page-chat-now-uses-the-available-width-up-to-1000px-for.md +6 -0
- package/corpus/templates/plan/changelog/2026-08-11-plan-no-longer-reloads-when-runtime-state-changes.md +6 -0
- package/corpus/templates/plan/server/ui-plan-html.ts +4 -1
- package/corpus/templates/plan/vite.config.ts +5 -0
- package/corpus/templates/slides/.agents/skills/actions/SKILL.md +54 -488
- package/corpus/templates/slides/.agents/skills/actions/references/action-fields.md +136 -0
- package/corpus/templates/slides/.agents/skills/actions/references/examples.md +94 -0
- package/corpus/templates/slides/.agents/skills/actions/references/provider-apis.md +95 -0
- package/corpus/templates/slides/.agents/skills/create-deck/SKILL.md +2 -2
- package/corpus/templates/slides/.agents/skills/create-skill/SKILL.md +9 -35
- package/corpus/templates/slides/.agents/skills/creative-context/SKILL.md +6 -3
- package/corpus/templates/slides/.agents/skills/deck-management/SKILL.md +6 -1
- package/corpus/templates/slides/.agents/skills/frontend-design/SKILL.md +4 -5
- package/corpus/templates/slides/.agents/skills/image-generation-via-a2a/SKILL.md +3 -2
- package/corpus/templates/slides/.agents/skills/slide-editing/SKILL.md +3 -0
- package/corpus/templates/slides/.agents/skills/slide-images/SKILL.md +3 -3
- package/corpus/templates/slides/.agents/skills/turn-into-app/SKILL.md +18 -31
- package/corpus/templates/slides/AGENTS.md +33 -35
- package/corpus/templates/slides/actions/add-deck.ts +2 -0
- package/corpus/templates/slides/actions/add-slide.ts +15 -1
- package/corpus/templates/slides/actions/create-deck.ts +18 -6
- package/corpus/templates/slides/actions/get-deck-reference-context.ts +2 -2
- package/corpus/templates/slides/actions/get-deck.ts +83 -7
- package/corpus/templates/slides/actions/import-file.ts +2 -1
- package/corpus/templates/slides/actions/patch-deck.ts +165 -9
- package/corpus/templates/slides/actions/save-deck.ts +24 -1
- package/corpus/templates/slides/actions/update-slide.ts +1 -1
- package/corpus/templates/slides/app/components/comments/SlideCommentsPanel.tsx +2 -2
- package/corpus/templates/slides/app/components/deck/DeckCard.tsx +1 -23
- package/corpus/templates/slides/app/components/design-system/DesignSystemCard.tsx +2 -2
- package/corpus/templates/slides/app/components/design-system/DesignSystemSetup.tsx +6 -6
- package/corpus/templates/slides/app/components/editor/AnimationsPanel.tsx +3 -3
- package/corpus/templates/slides/app/components/editor/DeckEditorSkeleton.tsx +4 -4
- package/corpus/templates/slides/app/components/editor/EditorSidebar.tsx +1 -1
- package/corpus/templates/slides/app/components/editor/EditorToolbar.tsx +432 -668
- package/corpus/templates/slides/app/components/editor/ExportMenu.tsx +296 -259
- package/corpus/templates/slides/app/components/editor/GeneratingSlidePreview.tsx +1 -1
- package/corpus/templates/slides/app/components/editor/GoogleDriveConnectionCta.tsx +13 -1
- package/corpus/templates/slides/app/components/editor/NewDeckReferenceStep.tsx +56 -174
- package/corpus/templates/slides/app/components/editor/PromptDialog.tsx +241 -116
- package/corpus/templates/slides/app/components/editor/SlideContextToolbar.tsx +1 -1
- package/corpus/templates/slides/app/components/editor/SlideEditor.tsx +42 -14
- package/corpus/templates/slides/app/components/editor/SpeakerNotesPanel.tsx +6 -12
- package/corpus/templates/slides/app/components/editor/editor-command-model.ts +35 -0
- package/corpus/templates/slides/app/components/layout/AgentWorkIndicator.tsx +1 -1
- package/corpus/templates/slides/app/components/layout/Layout.tsx +34 -35
- package/corpus/templates/slides/app/components/layout/Sidebar.tsx +8 -10
- package/corpus/templates/slides/app/components/layout/layout-route-policy.ts +2 -5
- package/corpus/templates/slides/app/components/onboarding/FirstDeckOnboardingFlow.tsx +45 -40
- package/corpus/templates/slides/app/components/presentation/PresentationView.tsx +63 -16
- package/corpus/templates/slides/app/context/DeckContext.tsx +2 -1
- package/corpus/templates/slides/app/global.css +76 -1
- package/corpus/templates/slides/app/hooks/use-generating-slide-preview.ts +25 -3
- package/corpus/templates/slides/app/i18n/en-US.ts +2 -0
- package/corpus/templates/slides/app/lib/create-deck-generation.ts +52 -23
- package/corpus/templates/slides/app/lib/recent-references.ts +23 -1
- package/corpus/templates/slides/app/lib/slide-animation-elements.ts +104 -3
- package/corpus/templates/slides/app/pages/DeckEditor.tsx +17 -33
- package/corpus/templates/slides/app/pages/DesignSystems.tsx +2 -2
- package/corpus/templates/slides/app/pages/Index.tsx +315 -151
- package/corpus/templates/slides/app/root.tsx +43 -0
- package/corpus/templates/slides/changelog/2026-08-10-ai-editing-avatar-badge.md +6 -0
- package/corpus/templates/slides/changelog/2026-08-10-generated-decks-keep-a-clear-human-readable-title.md +6 -0
- package/corpus/templates/slides/changelog/2026-08-10-new-deck-creation-now-shows-progress-opens-the-editor-direct.md +6 -0
- package/corpus/templates/slides/changelog/2026-08-10-presentation-reveals-now-follow-valid-targets.md +6 -0
- package/corpus/templates/slides/changelog/2026-08-10-slides-editing-controls-are-consolidated-into-one-focused-me.md +6 -0
- package/corpus/templates/slides/changelog/2026-08-10-slides-now-verify-and-restyle-every-imported-slide-in-one-pa.md +6 -0
- package/corpus/templates/slides/changelog/2026-08-10-slides-only-suggests-a-google-connection-for-relevant-reques.md +6 -0
- package/corpus/templates/slides/changelog/2026-08-10-the-google-slides-import-option-is-now-labeled-slides.md +6 -0
- package/corpus/templates/slides/changelog/2026-08-11-faster-slides-chat-deck-reads.md +6 -0
- package/corpus/templates/slides/changelog/2026-08-11-slides-chat-can-read-one-slide-without-loading-the-full-deck.md +6 -0
- package/corpus/templates/slides/changelog/2026-08-11-slides-clearly-indicate-when-an-ai-agent-is-editing-alongsid.md +6 -0
- package/corpus/templates/slides/package.json +1 -0
- package/corpus/templates/slides/server/lib/chat-attachments.ts +1 -1
- package/corpus/templates/slides/server/lib/validate-slide-animations.ts +163 -0
- package/corpus/templates/slides/server/plugins/agent-chat.ts +8 -5
- package/corpus/templates/slides/shared/api.ts +47 -15
- package/corpus/templates/slides/shared/deck-title.ts +135 -0
- package/corpus/templates/tasks/.agents/skills/actions/SKILL.md +54 -488
- package/corpus/templates/tasks/.agents/skills/actions/references/action-fields.md +136 -0
- package/corpus/templates/tasks/.agents/skills/actions/references/examples.md +94 -0
- package/corpus/templates/tasks/.agents/skills/actions/references/provider-apis.md +95 -0
- package/corpus/templates/tasks/.agents/skills/agent-watchdog/SKILL.md +1 -0
- package/corpus/templates/tasks/.agents/skills/create-skill/SKILL.md +9 -35
- package/corpus/templates/tasks/.agents/skills/efficient-fable/SKILL.md +1 -0
- package/corpus/templates/tasks/.agents/skills/efficient-frontier/SKILL.md +1 -0
- package/corpus/templates/tasks/.agents/skills/frontend-design/SKILL.md +4 -5
- package/corpus/templates/tasks/.agents/skills/plan-arbiter/SKILL.md +1 -0
- package/corpus/templates/tasks/.agents/skills/plow-ahead/SKILL.md +1 -0
- package/corpus/templates/tasks/.agents/skills/quick-recap/SKILL.md +1 -0
- package/corpus/templates/tasks/.agents/skills/read-the-damn-docs/SKILL.md +1 -0
- package/corpus/templates/tasks/.agents/skills/stay-within-limits/SKILL.md +1 -0
- package/corpus/templates/tasks/.agents/skills/turn-into-app/SKILL.md +18 -31
- package/corpus/templates/tasks/AGENTS.md +5 -20
- package/corpus/templates/tasks/app/components/tasks/TaskListRow.tsx +4 -1
- package/dist/agent/engine/ai-sdk-engine.js +1 -1
- package/dist/agent/production-agent.d.ts +21 -1
- package/dist/agent/production-agent.js +505 -355
- package/dist/agent/run-manager.js +156 -14
- package/dist/agent/run-store.d.ts +11 -10
- package/dist/agent/run-store.js +17 -13
- package/dist/agent/tool-approval-store.d.ts +18 -0
- package/dist/agent/tool-approval-store.js +122 -0
- package/dist/agent/types.d.ts +1 -1
- package/dist/cli/code-agent-executor.js +11 -2
- package/dist/client/AgentPanel.js +31 -6
- package/dist/client/AssistantChat.d.ts +9 -4
- package/dist/client/AssistantChat.js +221 -149
- package/dist/client/active-run-state.d.ts +9 -1
- package/dist/client/active-run-state.js +34 -3
- package/dist/client/agent-chat/index.d.ts +1 -1
- package/dist/client/agent-chat-adapter.d.ts +8 -0
- package/dist/client/agent-chat-adapter.js +125 -28
- package/dist/client/agent-chat.d.ts +1 -1
- package/dist/client/chat/markdown-renderer.js +14 -2
- package/dist/client/chat/message-components.d.ts +13 -3
- package/dist/client/chat/message-components.js +57 -52
- package/dist/client/chat/run-recovery.d.ts +1 -0
- package/dist/client/chat/run-recovery.js +8 -0
- package/dist/client/chat/tool-call-display.d.ts +5 -5
- package/dist/client/chat/tool-call-display.js +9 -212
- package/dist/client/chat-first/apps-rail.js +3 -3
- package/dist/client/chat-first/browser-pane.js +4 -1
- package/dist/client/chat-first/chat-history.d.ts +3 -1
- package/dist/client/chat-first/chat-history.js +7 -4
- package/dist/client/chat-first/surface-tabs.d.ts +1 -1
- package/dist/client/chat-first/surface-tabs.js +52 -41
- package/dist/client/chat-first/types.d.ts +3 -0
- package/dist/client/chat-first.d.ts +10 -0
- package/dist/client/chat-first.js +37 -2
- package/dist/client/components/ui/message-scroller.js +4 -1
- package/dist/client/i18n.js +3 -1
- package/dist/client/resources/McpConnectionSuggestion.js +9 -1
- package/dist/client/sse-event-processor.d.ts +4 -2
- package/dist/client/sse-event-processor.js +46 -6
- package/dist/client/use-chat-models.js +156 -80
- package/dist/client/use-run-stuck-detection.d.ts +2 -0
- package/dist/client/use-run-stuck-detection.js +85 -9
- package/dist/collab/awareness.d.ts +2 -2
- package/dist/collab/routes.d.ts +1 -1
- package/dist/collab/struct-routes.d.ts +1 -1
- package/dist/integrations/adapters/slack.d.ts +0 -4
- package/dist/integrations/adapters/slack.js +6 -30
- package/dist/integrations/catalog.js +1 -1
- package/dist/integrations/pending-tasks-store.d.ts +0 -8
- package/dist/integrations/pending-tasks-store.js +0 -21
- package/dist/integrations/slack-manifest.d.ts +2 -2
- package/dist/integrations/slack-manifest.js +0 -3
- package/dist/integrations/webhook-handler.js +1 -1
- package/dist/mcp/screen-memory-stdio.d.ts +7 -7
- package/dist/observability/routes.d.ts +3 -3
- package/dist/provider-api/actions/custom-provider-registration.d.ts +4 -4
- package/dist/provider-api/actions/provider-api.d.ts +8 -8
- package/dist/scripts/docs/source-search.js +2 -2
- package/dist/server/agent-chat/framework-prompts.js +7 -2
- package/dist/server/agent-chat/prompt-resources.js +2 -2
- package/dist/server/agent-chat/skill-frontmatter.d.ts +31 -2
- package/dist/server/agent-chat/skill-frontmatter.js +41 -15
- package/dist/server/agent-chat-plugin.js +3 -3
- package/dist/server/agent-engine-api-key-route.d.ts +1 -1
- package/dist/server/agents-bundle.d.ts +16 -19
- package/dist/server/agents-bundle.js +19 -35
- package/dist/server/auth.js +262 -31
- package/dist/server/better-auth-instance.d.ts +1 -0
- package/dist/server/better-auth-instance.js +17 -2
- package/dist/server/onboarding-html.js +56 -9
- package/dist/server/prompts/framework-core-compact.d.ts +6 -1
- package/dist/server/prompts/framework-core-compact.js +12 -9
- package/dist/server/prompts/framework-core.d.ts +6 -1
- package/dist/server/prompts/framework-core.js +11 -9
- package/dist/server/prompts/index.d.ts +1 -1
- package/dist/server/prompts/index.js +1 -1
- package/dist/server/prompts/shared-rules.d.ts +15 -11
- package/dist/server/prompts/shared-rules.js +17 -13
- package/dist/server/realtime-token.d.ts +1 -1
- package/dist/server/transcribe-voice.d.ts +1 -1
- package/dist/shared/reasoning-effort.d.ts +8 -8
- package/dist/shared/reasoning-effort.js +10 -10
- package/dist/shared/streaming-text-smoothing.js +41 -11
- package/dist/styles/agent-native.css +19 -32
- package/dist/templates/chat/.agents/skills/actions/SKILL.md +54 -488
- package/dist/templates/chat/.agents/skills/actions/references/action-fields.md +136 -0
- package/dist/templates/chat/.agents/skills/actions/references/examples.md +94 -0
- package/dist/templates/chat/.agents/skills/actions/references/provider-apis.md +95 -0
- package/dist/templates/chat/.agents/skills/create-skill/SKILL.md +9 -35
- package/dist/templates/chat/.agents/skills/frontend-design/SKILL.md +4 -5
- package/dist/templates/chat/.agents/skills/turn-into-app/SKILL.md +18 -31
- package/dist/templates/chat/AGENTS.md +32 -80
- package/dist/templates/chat/changelog/2026-08-10-full-page-chat-now-uses-the-available-width-up-to-1000px-for.md +6 -0
- package/dist/templates/default/.agents/skills/actions/SKILL.md +54 -488
- package/dist/templates/default/.agents/skills/actions/references/action-fields.md +136 -0
- package/dist/templates/default/.agents/skills/actions/references/examples.md +94 -0
- package/dist/templates/default/.agents/skills/actions/references/provider-apis.md +95 -0
- package/dist/templates/default/.agents/skills/create-skill/SKILL.md +9 -35
- package/dist/templates/default/.agents/skills/frontend-design/SKILL.md +4 -5
- package/dist/templates/default/.agents/skills/turn-into-app/SKILL.md +18 -31
- package/dist/templates/headless/.agents/skills/actions/SKILL.md +54 -488
- package/dist/templates/headless/.agents/skills/actions/references/action-fields.md +136 -0
- package/dist/templates/headless/.agents/skills/actions/references/examples.md +94 -0
- package/dist/templates/headless/.agents/skills/actions/references/provider-apis.md +95 -0
- package/dist/templates/headless/.agents/skills/turn-into-app/SKILL.md +18 -31
- package/dist/templates/workspace-core/.agents/skills/actions/SKILL.md +54 -488
- package/dist/templates/workspace-core/.agents/skills/actions/references/action-fields.md +136 -0
- package/dist/templates/workspace-core/.agents/skills/actions/references/examples.md +94 -0
- package/dist/templates/workspace-core/.agents/skills/actions/references/provider-apis.md +95 -0
- package/dist/templates/workspace-core/.agents/skills/adding-workspace-apps/SKILL.md +1 -0
- package/dist/templates/workspace-core/.agents/skills/agent-page/SKILL.md +1 -0
- package/dist/templates/workspace-core/.agents/skills/create-skill/SKILL.md +9 -35
- package/dist/templates/workspace-core/.agents/skills/frontend-design/SKILL.md +4 -5
- package/dist/templates/workspace-core/.agents/skills/recurring-jobs/SKILL.md +21 -29
- package/dist/templates/workspace-core/.agents/skills/turn-into-app/SKILL.md +18 -31
- package/dist/templates/workspace-core/.agents/skills/workspace-conventions/SKILL.md +7 -17
- package/dist/templates/workspace-core/.agents/skills/writing-agent-instructions/SKILL.md +3 -3
- package/dist/templates/workspace-core/AGENTS.md +7 -16
- package/docs/content/messaging.mdx +6 -7
- package/docs/content/template-chat.mdx +1 -1
- package/package.json +2 -2
- package/src/templates/chat/.agents/skills/actions/SKILL.md +54 -488
- package/src/templates/chat/.agents/skills/actions/references/action-fields.md +136 -0
- package/src/templates/chat/.agents/skills/actions/references/examples.md +94 -0
- package/src/templates/chat/.agents/skills/actions/references/provider-apis.md +95 -0
- package/src/templates/chat/.agents/skills/create-skill/SKILL.md +9 -35
- package/src/templates/chat/.agents/skills/frontend-design/SKILL.md +4 -5
- package/src/templates/chat/.agents/skills/turn-into-app/SKILL.md +18 -31
- package/src/templates/chat/AGENTS.md +32 -80
- package/src/templates/chat/changelog/2026-08-10-full-page-chat-now-uses-the-available-width-up-to-1000px-for.md +6 -0
- package/src/templates/default/.agents/skills/actions/SKILL.md +54 -488
- package/src/templates/default/.agents/skills/actions/references/action-fields.md +136 -0
- package/src/templates/default/.agents/skills/actions/references/examples.md +94 -0
- package/src/templates/default/.agents/skills/actions/references/provider-apis.md +95 -0
- package/src/templates/default/.agents/skills/create-skill/SKILL.md +9 -35
- package/src/templates/default/.agents/skills/frontend-design/SKILL.md +4 -5
- package/src/templates/default/.agents/skills/turn-into-app/SKILL.md +18 -31
- package/src/templates/headless/.agents/skills/actions/SKILL.md +54 -488
- package/src/templates/headless/.agents/skills/actions/references/action-fields.md +136 -0
- package/src/templates/headless/.agents/skills/actions/references/examples.md +94 -0
- package/src/templates/headless/.agents/skills/actions/references/provider-apis.md +95 -0
- package/src/templates/headless/.agents/skills/turn-into-app/SKILL.md +18 -31
- package/src/templates/workspace-core/.agents/skills/actions/SKILL.md +54 -488
- package/src/templates/workspace-core/.agents/skills/actions/references/action-fields.md +136 -0
- package/src/templates/workspace-core/.agents/skills/actions/references/examples.md +94 -0
- package/src/templates/workspace-core/.agents/skills/actions/references/provider-apis.md +95 -0
- package/src/templates/workspace-core/.agents/skills/adding-workspace-apps/SKILL.md +1 -0
- package/src/templates/workspace-core/.agents/skills/agent-page/SKILL.md +1 -0
- package/src/templates/workspace-core/.agents/skills/create-skill/SKILL.md +9 -35
- package/src/templates/workspace-core/.agents/skills/frontend-design/SKILL.md +4 -5
- package/src/templates/workspace-core/.agents/skills/recurring-jobs/SKILL.md +21 -29
- package/src/templates/workspace-core/.agents/skills/turn-into-app/SKILL.md +18 -31
- package/src/templates/workspace-core/.agents/skills/workspace-conventions/SKILL.md +7 -17
- package/src/templates/workspace-core/.agents/skills/writing-agent-instructions/SKILL.md +3 -3
- package/src/templates/workspace-core/AGENTS.md +7 -16
|
@@ -3,10 +3,12 @@ import { type ChatHistoryItem, type ChatHistoryListProps } from "../chat/ChatHis
|
|
|
3
3
|
export interface ChatFirstChatHistoryProps extends Omit<ChatHistoryListProps, "items" | "sections" | "variant"> {
|
|
4
4
|
items: ChatHistoryItem[];
|
|
5
5
|
label?: ReactNode;
|
|
6
|
+
/** Optional contextual actions for the Chats section header. */
|
|
7
|
+
headerAction?: ReactNode;
|
|
6
8
|
}
|
|
7
9
|
/**
|
|
8
10
|
* The single chat-list presentation used by the chat-first rail on every
|
|
9
11
|
* host. Hosts still own thread fetching and actions, but row rhythm and the
|
|
10
12
|
* Chats section treatment stay identical.
|
|
11
13
|
*/
|
|
12
|
-
export declare function ChatFirstChatHistory({ items, label, className, ...props }: ChatFirstChatHistoryProps): import("react").JSX.Element
|
|
14
|
+
export declare function ChatFirstChatHistory({ items, label, headerAction, className, ...props }: ChatFirstChatHistoryProps): import("react").JSX.Element;
|
|
@@ -5,8 +5,11 @@ import { ChatHistoryList, } from "../chat/ChatHistoryList.js";
|
|
|
5
5
|
* host. Hosts still own thread fetching and actions, but row rhythm and the
|
|
6
6
|
* Chats section treatment stay identical.
|
|
7
7
|
*/
|
|
8
|
-
export function ChatFirstChatHistory({ items, label = "Chats", className, ...props }) {
|
|
9
|
-
if (items.length === 0)
|
|
10
|
-
return
|
|
11
|
-
|
|
8
|
+
export function ChatFirstChatHistory({ items, label = "Chats", headerAction, className, ...props }) {
|
|
9
|
+
if (items.length === 0) {
|
|
10
|
+
return (_jsx("section", { "data-chat-first-chat-history": true, className: ["min-h-0 min-w-0 flex-1", className]
|
|
11
|
+
.filter(Boolean)
|
|
12
|
+
.join(" ") }));
|
|
13
|
+
}
|
|
14
|
+
return (_jsxs("section", { "data-chat-first-chat-history": true, className: ["min-h-0 min-w-0", className].filter(Boolean).join(" "), children: [_jsxs("div", { "data-chat-first-chat-history-header": true, className: "group mb-1 flex min-h-6 items-center justify-between gap-2 px-2", children: [_jsx("p", { className: "min-w-0 text-[11px] font-medium text-sidebar-foreground/50", children: label }), headerAction ? (_jsx("div", { className: "shrink-0 opacity-0 transition-opacity duration-100 group-hover:opacity-100 group-focus-within:opacity-100", children: headerAction })) : null] }), _jsx(ChatHistoryList, { ...props, items: items, variant: "rail", className: "min-w-0" })] }));
|
|
12
15
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { ReactNode } from "react";
|
|
2
2
|
import { type ChatFirstSurfaceTab } from "../chat-first.js";
|
|
3
3
|
import type { ChatFirstSurfaceTabsProps } from "./types.js";
|
|
4
|
-
export declare function ChatFirstSurfaceTabs({ tabs, activeTabId, onActivate, onClose, onCloseOthers, onCloseToRight, onCloseAll, onOpenSurface, copy, }: ChatFirstSurfaceTabsProps): import("react").JSX.Element;
|
|
4
|
+
export declare function ChatFirstSurfaceTabs({ tabs, activeTabId, onActivate, onClose, onCloseOthers, onCloseToRight, onCloseAll, onOpenSurface, apps, onOpenApp, renderAppIcon, copy, }: ChatFirstSurfaceTabsProps): import("react").JSX.Element;
|
|
5
5
|
export declare function ChatFirstSurfaceContent({ tabs, activeTabId, renderTab, }: {
|
|
6
6
|
tabs: readonly ChatFirstSurfaceTab[];
|
|
7
7
|
activeTabId: string | null;
|
|
@@ -17,54 +17,65 @@ function SurfaceIcon({ kind }) {
|
|
|
17
17
|
const Icon = ICONS[kind];
|
|
18
18
|
return _jsx(Icon, { size: 14, "aria-hidden": "true" });
|
|
19
19
|
}
|
|
20
|
-
export function ChatFirstSurfaceTabs({ tabs, activeTabId, onActivate, onClose, onCloseOthers, onCloseToRight, onCloseAll, onOpenSurface, copy = defaultChatFirstCopy, }) {
|
|
21
|
-
return (_jsx(TooltipProvider, { delayDuration: 400, children: _jsx("div", { "data-chat-first-surface-tabs": true, className: "
|
|
20
|
+
export function ChatFirstSurfaceTabs({ tabs, activeTabId, onActivate, onClose, onCloseOthers, onCloseToRight, onCloseAll, onOpenSurface, apps = [], onOpenApp, renderAppIcon, copy = defaultChatFirstCopy, }) {
|
|
21
|
+
return (_jsx(TooltipProvider, { delayDuration: 400, children: _jsx("div", { "data-chat-first-surface-tabs": true, className: cn("min-w-0 border-b border-border bg-card", tabs.length > 0
|
|
22
|
+
? "shrink-0"
|
|
23
|
+
: "flex min-h-0 min-w-0 flex-1 flex-col overflow-hidden"), children: tabs.length > 0 ? (_jsx("div", { className: "flex min-w-0 items-center gap-1 overflow-x-auto px-2 py-1.5", role: "tablist", "aria-label": copy("openSideSurfaces"), children: tabs.map((tab, index) => (_jsxs(ContextMenu, { children: [_jsx(ContextMenuTrigger, { asChild: true, children: _jsxs("div", { "data-surface-tab-id": tab.id, "data-active": activeTabId === tab.id ? "true" : "false", className: cn("group flex h-8 min-w-0 max-w-48 shrink-0 items-center rounded-md text-xs transition-colors", activeTabId === tab.id
|
|
22
24
|
? "bg-accent text-foreground"
|
|
23
|
-
: "text-muted-foreground hover:bg-accent hover:text-foreground"),
|
|
24
|
-
const nextIndex = event.key === "ArrowRight"
|
|
25
|
-
? (index + 1) % tabs.length
|
|
26
|
-
: event.key === "ArrowLeft"
|
|
27
|
-
? (index - 1 + tabs.length) % tabs.length
|
|
28
|
-
: event.key === "Home"
|
|
29
|
-
? 0
|
|
30
|
-
: event.key === "End"
|
|
31
|
-
? tabs.length - 1
|
|
32
|
-
: -1;
|
|
33
|
-
if (nextIndex < 0)
|
|
34
|
-
return;
|
|
35
|
-
event.preventDefault();
|
|
36
|
-
onActivate(tabs[nextIndex]);
|
|
37
|
-
requestAnimationFrame(() => {
|
|
38
|
-
document
|
|
39
|
-
.querySelector(`[data-chat-first-surface-tab-id="${CSS.escape(tabs[nextIndex].id)}"]`)
|
|
40
|
-
?.focus();
|
|
41
|
-
});
|
|
42
|
-
}, "data-chat-first-surface-tab-id": tab.id, onMouseDown: (event) => {
|
|
25
|
+
: "text-muted-foreground hover:bg-accent hover:text-foreground"), onMouseDown: (event) => {
|
|
43
26
|
if (event.button === 1) {
|
|
44
27
|
event.preventDefault();
|
|
45
28
|
onClose(tab);
|
|
46
29
|
}
|
|
47
|
-
}, title: tab.title, children: [_jsxs("button", { type: "button",
|
|
30
|
+
}, title: tab.title, children: [_jsxs("button", { type: "button", role: "tab", tabIndex: activeTabId === tab.id ? 0 : -1, "aria-selected": activeTabId === tab.id, "data-chat-first-surface-tab-id": tab.id, className: "flex min-w-0 flex-1 items-center gap-1.5 truncate rounded-md px-2 text-start focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring", onKeyDown: (event) => {
|
|
31
|
+
if (event.key === "Enter" || event.key === " ") {
|
|
32
|
+
event.preventDefault();
|
|
33
|
+
onActivate(tab);
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
const nextIndex = event.key === "ArrowRight"
|
|
37
|
+
? (index + 1) % tabs.length
|
|
38
|
+
: event.key === "ArrowLeft"
|
|
39
|
+
? (index - 1 + tabs.length) % tabs.length
|
|
40
|
+
: event.key === "Home"
|
|
41
|
+
? 0
|
|
42
|
+
: event.key === "End"
|
|
43
|
+
? tabs.length - 1
|
|
44
|
+
: -1;
|
|
45
|
+
if (nextIndex < 0)
|
|
46
|
+
return;
|
|
47
|
+
event.preventDefault();
|
|
48
|
+
onActivate(tabs[nextIndex]);
|
|
49
|
+
requestAnimationFrame(() => {
|
|
50
|
+
document
|
|
51
|
+
.querySelector(`[data-chat-first-surface-tab-id="${CSS.escape(tabs[nextIndex].id)}"]`)
|
|
52
|
+
?.focus();
|
|
53
|
+
});
|
|
54
|
+
}, onClick: () => onActivate(tab), children: [_jsx(SurfaceIcon, { kind: tab.kind }), _jsx("span", { className: "truncate", children: tab.title })] }), _jsx("button", { type: "button", className: "mr-1 flex size-5 shrink-0 items-center justify-center rounded text-muted-foreground/65 opacity-0 transition-opacity hover:bg-background/70 hover:text-foreground group-hover:opacity-100 focus-visible:opacity-100", "aria-label": copy("closeTab", { name: tab.title }), title: copy("closeTab", { name: tab.title }), onClick: (event) => {
|
|
48
55
|
event.stopPropagation();
|
|
49
56
|
onClose(tab);
|
|
50
|
-
}, children: _jsx(IconX, { size: 12, "aria-hidden": "true" }) })] }) }), _jsxs(ContextMenuContent, { children: [_jsx(ContextMenuItem, { onSelect: () => onClose(tab), children: copy("close") }), _jsx(ContextMenuItem, { disabled: tabs.length < 2, onSelect: () => onCloseOthers(tab), children: copy("closeOthers") }), _jsx(ContextMenuItem, { disabled: tabs[tabs.length - 1]?.id === tab.id, onSelect: () => onCloseToRight(tab), children: copy("closeToRight") }), _jsx(ContextMenuSeparator, {}), _jsx(ContextMenuItem, { onSelect: onCloseAll, children: copy("closeAll") })] })] }, tab.id))) })) : (
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
57
|
+
}, children: _jsx(IconX, { size: 12, "aria-hidden": "true" }) })] }) }), _jsxs(ContextMenuContent, { children: [_jsx(ContextMenuItem, { onSelect: () => onClose(tab), children: copy("close") }), _jsx(ContextMenuItem, { disabled: tabs.length < 2, onSelect: () => onCloseOthers(tab), children: copy("closeOthers") }), _jsx(ContextMenuItem, { disabled: tabs[tabs.length - 1]?.id === tab.id, onSelect: () => onCloseToRight(tab), children: copy("closeToRight") }), _jsx(ContextMenuSeparator, {}), _jsx(ContextMenuItem, { onSelect: onCloseAll, children: copy("closeAll") })] })] }, tab.id))) })) : (_jsxs("div", { className: "flex min-h-0 min-w-0 flex-1 flex-col overflow-y-auto px-2 py-1", "data-surface-empty-state": true, "aria-label": copy("openSideSurfaces"), children: [CHAT_FIRST_SURFACE_CATALOG.map((surface) => {
|
|
58
|
+
const label = copy(`surface.${surface.kind}.label`);
|
|
59
|
+
const reason = surface.availability === "deferred"
|
|
60
|
+
? copy(`surface.${surface.kind}.reason`)
|
|
61
|
+
: copy(`surface.${surface.kind}.reason`);
|
|
62
|
+
const isDeferred = surface.availability === "deferred";
|
|
63
|
+
const canOpenSurface = onOpenSurface &&
|
|
64
|
+
(surface.kind === "browser" ||
|
|
65
|
+
surface.kind === "side-chat" ||
|
|
66
|
+
surface.kind === "agents");
|
|
67
|
+
const row = (_jsxs("div", { className: cn("flex h-7 min-w-0 items-center gap-2 rounded px-2 text-xs transition-colors", canOpenSurface
|
|
68
|
+
? "text-foreground hover:bg-accent"
|
|
69
|
+
: isDeferred
|
|
70
|
+
? "text-muted-foreground/60"
|
|
71
|
+
: "text-muted-foreground hover:bg-accent hover:text-foreground"), title: !isDeferred ? reason : undefined, "aria-label": `${label}: ${reason}`, children: [_jsx(SurfaceIcon, { kind: surface.kind }), _jsx("span", { className: "min-w-0 flex-1 truncate", children: label }), isDeferred ? (_jsx("span", { "data-surface-availability": "deferred", className: "size-1.5 shrink-0 rounded-full bg-muted-foreground/45", "aria-label": copy("deferred") })) : null] }));
|
|
72
|
+
if (canOpenSurface) {
|
|
73
|
+
return (_jsx("button", { type: "button", className: "block w-full text-start", title: surface.kind === "browser" ? reason : copy("openActivity"), "aria-label": surface.kind === "browser" ? label : copy("openActivity"), onClick: () => onOpenSurface(surface.kind === "side-chat" ? "agents" : surface.kind), children: row }, surface.kind));
|
|
74
|
+
}
|
|
75
|
+
if (!isDeferred)
|
|
76
|
+
return _jsx("div", { children: row }, surface.kind);
|
|
77
|
+
return (_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("div", { className: "text-start", children: row }) }), _jsx(TooltipContent, { side: "left", className: "max-w-72", children: reason })] }, surface.kind));
|
|
78
|
+
}), apps.length > 0 && onOpenApp ? (_jsxs("div", { className: "mt-1 border-t border-border pt-1", children: [_jsx("p", { className: "px-2 py-1 text-[10px] font-medium uppercase tracking-wide text-muted-foreground", children: copy("workspaceApps") }), _jsx("div", { className: "space-y-0.5", children: apps.map((app) => (_jsxs("button", { type: "button", "data-chat-first-surface-app": app.id, className: "flex h-8 w-full min-w-0 items-center gap-2 rounded px-2 text-start text-xs text-foreground transition-colors hover:bg-accent", title: copy("openApp", { name: app.name }), "aria-label": copy("openApp", { name: app.name }), onClick: () => onOpenApp(app), children: [renderAppIcon?.(app) ?? _jsx(SurfaceIcon, { kind: "app" }), _jsx("span", { className: "min-w-0 flex-1 truncate", children: app.name })] }, app.id))) })] })) : null] })) }) }));
|
|
68
79
|
}
|
|
69
80
|
export function ChatFirstSurfaceContent({ tabs, activeTabId, renderTab, }) {
|
|
70
81
|
return (_jsx("div", { className: "min-h-0 flex-1 overflow-hidden", children: tabs.map((tab) => {
|
|
@@ -31,6 +31,9 @@ export interface ChatFirstSurfaceTabsProps {
|
|
|
31
31
|
onCloseToRight: (tab: ChatFirstSurfaceTab) => void;
|
|
32
32
|
onCloseAll: () => void;
|
|
33
33
|
onOpenSurface?: (kind: ChatFirstSurfaceKind) => void;
|
|
34
|
+
apps?: readonly ChatFirstAppItem[];
|
|
35
|
+
onOpenApp?: (app: ChatFirstAppItem) => void;
|
|
36
|
+
renderAppIcon?: (app: ChatFirstAppItem) => ReactNode;
|
|
34
37
|
copy?: ChatFirstCopy;
|
|
35
38
|
}
|
|
36
39
|
export interface ChatFirstAppRailProps {
|
|
@@ -36,11 +36,14 @@ export interface ChatFirstSessionWatchStore {
|
|
|
36
36
|
close: () => void;
|
|
37
37
|
}
|
|
38
38
|
export type ChatFirstSurfaceKind = "app" | "browser" | "terminal" | "diff" | "files" | "side-chat" | "agents";
|
|
39
|
+
export type ChatFirstAppSurfacePlacement = "main" | "side";
|
|
39
40
|
export interface ChatFirstSurfaceTab {
|
|
40
41
|
id: string;
|
|
41
42
|
kind: ChatFirstSurfaceKind;
|
|
42
43
|
title: string;
|
|
43
44
|
appId?: string;
|
|
45
|
+
/** App tabs can either replace the main chat or sit beside it. */
|
|
46
|
+
placement?: ChatFirstAppSurfacePlacement;
|
|
44
47
|
path?: string;
|
|
45
48
|
view?: string;
|
|
46
49
|
url?: string;
|
|
@@ -128,6 +131,7 @@ export type ChatFirstBrowserResolution = {
|
|
|
128
131
|
target: {
|
|
129
132
|
url: string;
|
|
130
133
|
title?: string;
|
|
134
|
+
openExternally?: boolean;
|
|
131
135
|
};
|
|
132
136
|
} | {
|
|
133
137
|
status: "unresolved";
|
|
@@ -202,6 +206,12 @@ export declare function subscribeChatFirstOpenApp(listener: ChatFirstOpenAppList
|
|
|
202
206
|
export declare function emitChatFirstOpenApp(detail: ChatFirstOpenAppDetail): ChatFirstOpenAppDelivery;
|
|
203
207
|
export declare function subscribeChatFirstOpenBrowser(listener: ChatFirstOpenBrowserListener): () => void;
|
|
204
208
|
export declare function emitChatFirstOpenBrowser(detail: ChatFirstOpenBrowserDetail): ChatFirstOpenAppDelivery;
|
|
209
|
+
/**
|
|
210
|
+
* Builder's web app sends frame-blocking headers. Its branch/editor URLs are
|
|
211
|
+
* open-browser targets, not the iframe-backed Fusion preview URLs served from
|
|
212
|
+
* builder.cloud, so keep them out of the chat-first browser iframe.
|
|
213
|
+
*/
|
|
214
|
+
export declare function shouldOpenChatFirstBrowserExternally(value: string): boolean;
|
|
205
215
|
export declare function resolveChatFirstAppTarget(detail: ChatFirstOpenAppDetail, apps: readonly ChatFirstAppRegistration[], options?: {
|
|
206
216
|
currentOrigin?: string;
|
|
207
217
|
}): ChatFirstAppResolution;
|
|
@@ -338,6 +338,9 @@ export function resolveChatFirstBrowserTarget(detail) {
|
|
|
338
338
|
target: {
|
|
339
339
|
url: url.href,
|
|
340
340
|
...(detail.title?.trim() ? { title: detail.title.trim() } : {}),
|
|
341
|
+
...(shouldOpenChatFirstBrowserExternally(url.href)
|
|
342
|
+
? { openExternally: true }
|
|
343
|
+
: {}),
|
|
341
344
|
},
|
|
342
345
|
};
|
|
343
346
|
}
|
|
@@ -464,9 +467,16 @@ function readChatFirstSurfaceTabsState(scope) {
|
|
|
464
467
|
return { tabs: [], activeTabId: null };
|
|
465
468
|
}
|
|
466
469
|
const value = scoped;
|
|
470
|
+
let migratedLegacyPlacement = false;
|
|
467
471
|
const tabs = Array.isArray(value.tabs)
|
|
468
472
|
? value.tabs.flatMap((candidate) => {
|
|
469
473
|
const tab = normalizePersistedChatFirstSurfaceTab(candidate);
|
|
474
|
+
if (tab?.kind === "app" &&
|
|
475
|
+
candidate !== null &&
|
|
476
|
+
typeof candidate === "object" &&
|
|
477
|
+
!("placement" in candidate)) {
|
|
478
|
+
migratedLegacyPlacement = true;
|
|
479
|
+
}
|
|
470
480
|
return tab ? [tab] : [];
|
|
471
481
|
})
|
|
472
482
|
: [];
|
|
@@ -474,7 +484,10 @@ function readChatFirstSurfaceTabsState(scope) {
|
|
|
474
484
|
tabs.some((tab) => tab.id === value.activeTabId)
|
|
475
485
|
? value.activeTabId
|
|
476
486
|
: (tabs[0]?.id ?? null);
|
|
477
|
-
|
|
487
|
+
const state = { tabs, activeTabId };
|
|
488
|
+
if (migratedLegacyPlacement)
|
|
489
|
+
writeChatFirstSurfaceTabsState(scope, state);
|
|
490
|
+
return state;
|
|
478
491
|
}
|
|
479
492
|
catch {
|
|
480
493
|
return { tabs: [], activeTabId: null };
|
|
@@ -498,11 +511,23 @@ function normalizePersistedChatFirstSurfaceTab(candidate) {
|
|
|
498
511
|
const appId = typeof value.appId === "string" ? value.appId.trim() : "";
|
|
499
512
|
if (!appId)
|
|
500
513
|
return null;
|
|
514
|
+
const placement = value.placement;
|
|
515
|
+
if (placement !== undefined &&
|
|
516
|
+
placement !== "main" &&
|
|
517
|
+
placement !== "side") {
|
|
518
|
+
return null;
|
|
519
|
+
}
|
|
501
520
|
if (value.path !== undefined &&
|
|
502
521
|
(typeof value.path !== "string" || normalizedPath(value.path) === null)) {
|
|
503
522
|
return null;
|
|
504
523
|
}
|
|
505
|
-
return {
|
|
524
|
+
return {
|
|
525
|
+
...tab,
|
|
526
|
+
id,
|
|
527
|
+
title,
|
|
528
|
+
appId,
|
|
529
|
+
placement: placement ?? "main",
|
|
530
|
+
};
|
|
506
531
|
}
|
|
507
532
|
if (kind === "browser") {
|
|
508
533
|
const url = typeof value.url === "string" ? value.url.trim() : "";
|
|
@@ -700,6 +725,16 @@ function parseAbsoluteHttpUrl(value) {
|
|
|
700
725
|
return null;
|
|
701
726
|
}
|
|
702
727
|
}
|
|
728
|
+
/**
|
|
729
|
+
* Builder's web app sends frame-blocking headers. Its branch/editor URLs are
|
|
730
|
+
* open-browser targets, not the iframe-backed Fusion preview URLs served from
|
|
731
|
+
* builder.cloud, so keep them out of the chat-first browser iframe.
|
|
732
|
+
*/
|
|
733
|
+
export function shouldOpenChatFirstBrowserExternally(value) {
|
|
734
|
+
const url = parseAbsoluteHttpUrl(value);
|
|
735
|
+
return Boolean(url &&
|
|
736
|
+
(url.hostname === "builder.io" || url.hostname.endsWith(".builder.io")));
|
|
737
|
+
}
|
|
703
738
|
function registrationUrls(app, currentOrigin) {
|
|
704
739
|
const values = [app.url, app.devUrl];
|
|
705
740
|
if (app.path && currentOrigin)
|
|
@@ -10,7 +10,10 @@ function MessageScroller({ className, ...props }) {
|
|
|
10
10
|
}
|
|
11
11
|
function MessageScrollerViewport({ className, children, ...props }) {
|
|
12
12
|
const { start: hasContentAbove } = useMessageScrollerScrollable();
|
|
13
|
-
return (_jsx(ShadcnMessageScroller.Viewport, { className: cn("min-h-0 flex-1 overflow-y-auto overflow-x-hidden",
|
|
13
|
+
return (_jsx(ShadcnMessageScroller.Viewport, { className: cn("min-h-0 flex-1 overflow-y-auto overflow-x-hidden",
|
|
14
|
+
// The base class carries the mask itself so it is never added or
|
|
15
|
+
// removed; the modifier only widens the fade. See agent-native.css.
|
|
16
|
+
"message-scroller-viewport", hasContentAbove && "message-scroller-viewport--top-fade", className), ...props, children: children }));
|
|
14
17
|
}
|
|
15
18
|
function MessageScrollerContent({ className, spacerClassName, ...props }) {
|
|
16
19
|
return (_jsx(ShadcnMessageScroller.Content, { className: cn("flex flex-col", className), spacerClassName: cn("shrink-0", spacerClassName), ...props }));
|
package/dist/client/i18n.js
CHANGED
|
@@ -549,7 +549,9 @@ export function LanguagePicker({ className, includeSystem = true, label, variant
|
|
|
549
549
|
? "flex h-8 w-8 items-center justify-center"
|
|
550
550
|
: variant === "select"
|
|
551
551
|
? "flex h-9 w-full items-center justify-between gap-2 px-3 text-start text-sm"
|
|
552
|
-
: null), children: [_jsxs("span", { className: "flex min-w-0 items-center gap-2", children: [_jsx(IconLanguage, { className: "h-4 w-4 shrink-0 text-muted-foreground" }), variant === "select" ? (_jsx("span", { className: "truncate", children: selectedLabel })) : (_jsx("span", { className: "sr-only", children: triggerLabel }))] }), variant === "select" ? (_jsx(IconChevronDown, { className: "h-3.5 w-3.5 shrink-0 text-muted-foreground", "aria-hidden": "true" })) : null] }) }), _jsx(PopoverPrimitive.Portal, { children: _jsx(PopoverPrimitive.Content, { align: variant === "select" ? "start" : "end", sideOffset: 6, role: "menu", className: cn(
|
|
552
|
+
: null), children: [_jsxs("span", { className: "flex min-w-0 items-center gap-2", children: [_jsx(IconLanguage, { className: "h-4 w-4 shrink-0 text-muted-foreground" }), variant === "select" ? (_jsx("span", { className: "truncate", children: selectedLabel })) : (_jsx("span", { className: "sr-only", children: triggerLabel }))] }), variant === "select" ? (_jsx(IconChevronDown, { className: "h-3.5 w-3.5 shrink-0 text-muted-foreground", "aria-hidden": "true" })) : null] }) }), _jsx(PopoverPrimitive.Portal, { children: _jsx(PopoverPrimitive.Content, { align: variant === "select" ? "start" : "end", sideOffset: 6, role: "menu", className: cn(
|
|
553
|
+
// compositing-ok: popover content unmounts on close.
|
|
554
|
+
"z-[9999] max-h-[min(20rem,var(--radix-popover-content-available-height))] overflow-y-auto rounded-lg border border-border bg-popover p-1 text-popover-foreground shadow-lg outline-none will-change-[transform,opacity] data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:duration-100 data-[state=open]:duration-150 data-[state=closed]:ease-in data-[state=open]:ease-out data-[side=bottom]:slide-in-from-top-1 data-[side=left]:slide-in-from-right-1 data-[side=right]:slide-in-from-left-1 data-[side=top]:slide-in-from-bottom-1", variant === "icon" || variant === "ghost-icon"
|
|
553
555
|
? "min-w-56"
|
|
554
556
|
: "w-[min(20rem,calc(100vw-2rem))] min-w-[var(--radix-popover-trigger-width)]"), children: options.map((option) => {
|
|
555
557
|
const optionSelected = option.value === preference;
|
|
@@ -9,8 +9,16 @@ import { buildMcpOAuthStartUrl, findMcpIntegrationForText, getMcpIntegrationApiF
|
|
|
9
9
|
import { McpIntegrationDialog } from "./McpIntegrationDialog.js";
|
|
10
10
|
import { McpIntegrationLogo } from "./McpIntegrationLogo.js";
|
|
11
11
|
import { useCreateMcpServer, useMcpServers, } from "./use-mcp-servers.js";
|
|
12
|
+
function visibleUserAuthoredText(text) {
|
|
13
|
+
return text
|
|
14
|
+
.replace(/<context\b[^>]*>[\s\S]*?<\/context>\n?/gi, "")
|
|
15
|
+
.replace(/<context\b[^>]*>[\s\S]*$/gi, "")
|
|
16
|
+
.replace(/<\/context>/gi, "")
|
|
17
|
+
.trim();
|
|
18
|
+
}
|
|
12
19
|
export function findMcpConnectionSuggestionIntegration({ text, contextText = "", variant = "composer", integrations = getDefaultMcpIntegrations(), }) {
|
|
13
|
-
|
|
20
|
+
const sourceText = variant === "response" ? contextText : text;
|
|
21
|
+
return findMcpIntegrationForText(visibleUserAuthoredText(sourceText), integrations);
|
|
14
22
|
}
|
|
15
23
|
export function shouldRenderMcpIntegrationFallback(logoUrl, logoLoadFailed) {
|
|
16
24
|
return !logoUrl || logoLoadFailed;
|
|
@@ -196,6 +196,8 @@ export interface SSEStreamOptions {
|
|
|
196
196
|
noProgressTimeoutMs?: number;
|
|
197
197
|
/** Reader-local counterpart to `noProgressTimeoutMs` for action preparation. */
|
|
198
198
|
actionPreparationStallTimeoutMs?: number;
|
|
199
|
+
/** Mark the adapter's final `done` snapshot terminal before it is yielded. */
|
|
200
|
+
markTerminalResults?: boolean;
|
|
199
201
|
/**
|
|
200
202
|
* Optional caller-owned preparation watchdog state. Passing the same object
|
|
201
203
|
* across reconnect reads keeps a stuck action preparation from getting a
|
|
@@ -261,7 +263,7 @@ export declare function processEvent(ev: SSEEvent, content: ContentPart[], toolC
|
|
|
261
263
|
*/
|
|
262
264
|
export declare function readSSEStream(body: ReadableStream<Uint8Array>, content: ContentPart[], toolCallCounter: {
|
|
263
265
|
value: number;
|
|
264
|
-
}, tabId: string | undefined, onSeq?: (seq: number) => void, runId?: string | null, options?: SSEStreamOptions): AsyncGenerator<ChatModelRunResult>;
|
|
266
|
+
}, tabId: string | undefined, onSeq?: (seq: number, isProgress?: boolean) => void, runId?: string | null, options?: SSEStreamOptions): AsyncGenerator<ChatModelRunResult>;
|
|
265
267
|
/**
|
|
266
268
|
* Read raw SSE events from a ReadableStream and process them into ContentPart[].
|
|
267
269
|
* Unlike readSSEStream, this doesn't yield ChatModelRunResult — it updates the
|
|
@@ -270,5 +272,5 @@ export declare function readSSEStream(body: ReadableStream<Uint8Array>, content:
|
|
|
270
272
|
*/
|
|
271
273
|
export declare function readSSEStreamRaw(body: ReadableStream<Uint8Array>, content: ContentPart[], toolCallCounter: {
|
|
272
274
|
value: number;
|
|
273
|
-
}, tabId: string | undefined, onUpdate: (content: ContentPart[]) => void, onSeq?: (seq: number) => void, options?: SSEStreamOptions): Promise<void>;
|
|
275
|
+
}, tabId: string | undefined, onUpdate: (content: ContentPart[]) => void, onSeq?: (seq: number, isProgress?: boolean) => void, options?: SSEStreamOptions): Promise<void>;
|
|
274
276
|
export {};
|
|
@@ -154,6 +154,20 @@ function isMeaningfulProgressEvent(ev, actionPreparationProgress, options) {
|
|
|
154
154
|
}
|
|
155
155
|
return true;
|
|
156
156
|
}
|
|
157
|
+
/**
|
|
158
|
+
* The browser's durable liveness cursor must mirror the server's
|
|
159
|
+
* `last_progress_at` predicate. The stream watchdog intentionally has a
|
|
160
|
+
* broader background policy, so it cannot be reused for this cursor: raw
|
|
161
|
+
* keepalives and repeated zero-byte preparation are not proof of real work.
|
|
162
|
+
*/
|
|
163
|
+
function isDurableProgressEvent(ev, actionPreparationProgress) {
|
|
164
|
+
if (ev.type === "stream_keepalive" || ev.type === "clear")
|
|
165
|
+
return false;
|
|
166
|
+
if (ev.type === "activity" && isPreparingActionActivity(ev)) {
|
|
167
|
+
return actionPreparationProgress === true;
|
|
168
|
+
}
|
|
169
|
+
return true;
|
|
170
|
+
}
|
|
157
171
|
function baseActivityLabel(ev, tool) {
|
|
158
172
|
return humanizeToolLabelText(ev.label ?? "Working", tool);
|
|
159
173
|
}
|
|
@@ -1291,6 +1305,9 @@ export function processEvent(ev, content, toolCallCounter, tabId, state) {
|
|
|
1291
1305
|
detail: { ...runError, tabId },
|
|
1292
1306
|
}));
|
|
1293
1307
|
}
|
|
1308
|
+
// This event is terminal. There may be no visible text or tool_done after
|
|
1309
|
+
// the last preparation activity, so do not leave its label mounted.
|
|
1310
|
+
dispatchActivityClear(tabId);
|
|
1294
1311
|
settleInterruptedToolCalls(content, undefined, { includeActivity: true });
|
|
1295
1312
|
content.push({
|
|
1296
1313
|
type: "text",
|
|
@@ -1386,6 +1403,9 @@ export function processEvent(ev, content, toolCallCounter, tabId, state) {
|
|
|
1386
1403
|
...(ev.errorCode ? { errorCode: ev.errorCode } : {}),
|
|
1387
1404
|
...(ev.recoverable ? { recoverable: ev.recoverable } : {}),
|
|
1388
1405
|
};
|
|
1406
|
+
// Non-recoverable errors end the turn. Recoverable errors return above as
|
|
1407
|
+
// auto-continue signals and must keep their activity state alive.
|
|
1408
|
+
dispatchActivityClear(tabId);
|
|
1389
1409
|
if (typeof window !== "undefined") {
|
|
1390
1410
|
window.dispatchEvent(new CustomEvent("agent-chat:run-error", {
|
|
1391
1411
|
detail: { ...runError, tabId },
|
|
@@ -1406,6 +1426,10 @@ export function processEvent(ev, content, toolCallCounter, tabId, state) {
|
|
|
1406
1426
|
};
|
|
1407
1427
|
}
|
|
1408
1428
|
if (ev.type === "done") {
|
|
1429
|
+
// `done` is authoritative even when the final model chunk contains only
|
|
1430
|
+
// a wrap-up marker. Clear any preparation label before inspecting pending
|
|
1431
|
+
// tools so both success and interrupted-terminal paths settle the UI.
|
|
1432
|
+
dispatchActivityClear(tabId);
|
|
1409
1433
|
const interruptedTools = pendingToolNames(content);
|
|
1410
1434
|
const allInterruptedTools = [
|
|
1411
1435
|
...interruptedTools.running,
|
|
@@ -1593,13 +1617,15 @@ export async function* readSSEStream(body, content, toolCallCounter, tabId, onSe
|
|
|
1593
1617
|
const now = Date.now();
|
|
1594
1618
|
inFlightWork = Math.max(0, inFlightWork + sseInFlightWorkDelta(ev));
|
|
1595
1619
|
const actionPreparationProgress = updatePreparingActionState(preparingActionState, ev, now);
|
|
1596
|
-
|
|
1620
|
+
const meaningfulProgress = isMeaningfulProgressEvent(ev, actionPreparationProgress, options);
|
|
1621
|
+
const durableProgress = isDurableProgressEvent(ev, actionPreparationProgress);
|
|
1622
|
+
if (meaningfulProgress) {
|
|
1597
1623
|
sawProgressEvent = true;
|
|
1598
1624
|
lastMeaningfulEventAt = now;
|
|
1599
1625
|
}
|
|
1600
1626
|
// Track sequence number for reconnection
|
|
1601
1627
|
if (ev.seq !== undefined && onSeq) {
|
|
1602
|
-
onSeq(ev.seq);
|
|
1628
|
+
onSeq(ev.seq, durableProgress);
|
|
1603
1629
|
}
|
|
1604
1630
|
if (ev.type === "clear") {
|
|
1605
1631
|
activityTrail.length = 0;
|
|
@@ -1627,9 +1653,21 @@ export async function* readSSEStream(body, content, toolCallCounter, tabId, onSe
|
|
|
1627
1653
|
}
|
|
1628
1654
|
}
|
|
1629
1655
|
const { action, result, autoContinue } = processEvent(ev, content, toolCallCounter, tabId, processEventState);
|
|
1630
|
-
|
|
1656
|
+
const terminalResult = result &&
|
|
1657
|
+
options?.markTerminalResults === true &&
|
|
1658
|
+
action === "done" &&
|
|
1659
|
+
result.status == null
|
|
1660
|
+
? {
|
|
1661
|
+
...result,
|
|
1662
|
+
status: {
|
|
1663
|
+
type: "complete",
|
|
1664
|
+
reason: "stop",
|
|
1665
|
+
},
|
|
1666
|
+
}
|
|
1667
|
+
: result;
|
|
1668
|
+
if (terminalResult) {
|
|
1631
1669
|
await paceRenderUpdate();
|
|
1632
|
-
yield withStreamMetadata(
|
|
1670
|
+
yield withStreamMetadata(terminalResult);
|
|
1633
1671
|
}
|
|
1634
1672
|
if (hasStalledPreparingAction(preparingActionState, Date.now(), preparationStallTimeoutMs)) {
|
|
1635
1673
|
throw new AgentAutoContinueSignal({
|
|
@@ -1747,12 +1785,14 @@ export async function readSSEStreamRaw(body, content, toolCallCounter, tabId, on
|
|
|
1747
1785
|
const now = Date.now();
|
|
1748
1786
|
inFlightWork = Math.max(0, inFlightWork + sseInFlightWorkDelta(ev));
|
|
1749
1787
|
const actionPreparationProgress = updatePreparingActionState(preparingActionState, ev, now);
|
|
1750
|
-
|
|
1788
|
+
const meaningfulProgress = isMeaningfulProgressEvent(ev, actionPreparationProgress, options);
|
|
1789
|
+
const durableProgress = isDurableProgressEvent(ev, actionPreparationProgress);
|
|
1790
|
+
if (meaningfulProgress) {
|
|
1751
1791
|
sawProgressEvent = true;
|
|
1752
1792
|
lastMeaningfulEventAt = now;
|
|
1753
1793
|
}
|
|
1754
1794
|
if (ev.seq !== undefined && onSeq) {
|
|
1755
|
-
onSeq(ev.seq);
|
|
1795
|
+
onSeq(ev.seq, durableProgress);
|
|
1756
1796
|
}
|
|
1757
1797
|
if (ev.type === "clear") {
|
|
1758
1798
|
activityTrail.length = 0;
|