@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
|
@@ -14,12 +14,12 @@ import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel,
|
|
|
14
14
|
import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, } from "../components/ui/tooltip.js";
|
|
15
15
|
import { ThumbsFeedback } from "../observability/ThumbsFeedback.js";
|
|
16
16
|
import { McpConnectionSuggestion } from "../resources/McpConnectionSuggestion.js";
|
|
17
|
-
import {
|
|
17
|
+
import { isCallAgentToolCallShadowed, shadowedCallAgentToolCallIds, } from "../tool-display.js";
|
|
18
18
|
import { cn } from "../utils.js";
|
|
19
19
|
import { MarkdownText, renderMarkdownToClipboardHtml, SmoothMarkdownText, } from "./markdown-renderer.js";
|
|
20
20
|
import { getAssistantRunDurationMs } from "./repo-helpers.js";
|
|
21
21
|
import { getRunErrorMetadata, runErrorHeadline, runErrorKey, } from "./run-recovery.js";
|
|
22
|
-
import { ToolCallFallback, ToolActivityPresentation, ToolCallStackMotion, FilesChangedSummary, ASSISTANT_VISIBLE_TOOL_CALL_LIMIT, ChatRunningContext, ChatRunDurationContext, formatWorkedDuration, RanToolsSummary, ReasoningCell, WorkedForSummary, toolCallHasPendingApproval, } from "./tool-call-display.js";
|
|
22
|
+
import { ToolCallFallback, ToolActivityPresentation, ToolCallStackMotion, FilesChangedSummary, ASSISTANT_VISIBLE_TOOL_CALL_LIMIT, ChatRunningContext, ChatRunningRunIdContext, ChatRunningTurnIdContext, ChatRunDurationContext, formatWorkedDuration, RanToolsSummary, ReasoningCell, WorkedForSummary, toolCallHasPendingApproval, } from "./tool-call-display.js";
|
|
23
23
|
export { toolCallHasPendingApproval };
|
|
24
24
|
// ─── Pending selection context key ───────────────────────────────────────────
|
|
25
25
|
// Mirrored from AssistantChat to avoid a cross-import on a private constant.
|
|
@@ -172,6 +172,19 @@ export function assistantMessageRunId(message) {
|
|
|
172
172
|
? metadata.runId
|
|
173
173
|
: undefined;
|
|
174
174
|
}
|
|
175
|
+
/** Stable logical-turn identity shared by chained continuation run IDs. */
|
|
176
|
+
export function assistantMessageTurnId(message) {
|
|
177
|
+
const metadata = message?.metadata;
|
|
178
|
+
return typeof metadata?.custom?.turnId === "string"
|
|
179
|
+
? metadata.custom.turnId
|
|
180
|
+
: typeof metadata?.turnId === "string"
|
|
181
|
+
? metadata.turnId
|
|
182
|
+
: undefined;
|
|
183
|
+
}
|
|
184
|
+
export function resolveAssistantRequestId(message, activeRun, threadId) {
|
|
185
|
+
return (assistantMessageRunId(message) ||
|
|
186
|
+
(activeRun?.threadId === threadId ? activeRun.runId : undefined));
|
|
187
|
+
}
|
|
175
188
|
// ─── MessageBranchPicker ──────────────────────────────────────────────────────
|
|
176
189
|
export function MessageBranchPicker() {
|
|
177
190
|
return (_jsxs(BranchPickerPrimitive.Root, { hideWhenSingleBranch: true, className: "flex items-center gap-0.5 text-[11px] text-muted-foreground", children: [_jsx(BranchPickerPrimitive.Previous, { asChild: true, children: _jsx("button", { type: "button", "aria-label": "Previous branch", className: "flex h-6 w-6 cursor-pointer items-center justify-center rounded-md text-muted-foreground/70 transition-colors duration-150 hover:bg-accent hover:text-foreground disabled:cursor-not-allowed disabled:opacity-40", children: _jsx(IconChevronLeft, { className: "h-3.5 w-3.5" }) }) }), _jsxs("span", { className: "tabular-nums select-none", children: [_jsx(BranchPickerPrimitive.Number, {}), "/", _jsx(BranchPickerPrimitive.Count, {})] }), _jsx(BranchPickerPrimitive.Next, { asChild: true, children: _jsx("button", { type: "button", "aria-label": "Next branch", className: "flex h-6 w-6 cursor-pointer items-center justify-center rounded-md text-muted-foreground/70 transition-colors duration-150 hover:bg-accent hover:text-foreground disabled:cursor-not-allowed disabled:opacity-40", children: _jsx(IconChevronRight, { className: "h-3.5 w-3.5" }) }) })] }));
|
|
@@ -284,7 +297,7 @@ function UserMessageEditComposer() {
|
|
|
284
297
|
return (_jsxs(ComposerPrimitive.Root, { className: "flex flex-col gap-2 rounded-lg border border-border bg-background px-3 py-2 shadow-sm", children: [_jsx(ComposerPrimitive.Input, { className: "w-full resize-none bg-transparent text-sm leading-relaxed text-foreground placeholder:text-muted-foreground focus:outline-none", rows: 1, submitMode: "enter" }), _jsxs("div", { className: "flex justify-end gap-2", children: [_jsx(ComposerPrimitive.Cancel, { asChild: true, children: _jsx("button", { type: "button", className: "cursor-pointer rounded-md px-2 py-1 text-xs font-medium text-muted-foreground hover:bg-accent hover:text-foreground", children: "Cancel" }) }), _jsx(ComposerPrimitive.Send, { asChild: true, children: _jsx("button", { type: "submit", className: "cursor-pointer rounded-md bg-foreground px-2 py-1 text-xs font-medium text-background hover:opacity-90 disabled:opacity-50", children: "Save" }) })] })] }));
|
|
285
298
|
}
|
|
286
299
|
// ─── MessageActionsMenu ────────────────────────────────────────────────────────
|
|
287
|
-
export function MessageActionsMenu({ showRevert, onRevert, } = {}) {
|
|
300
|
+
export function MessageActionsMenu({ showRevert, onRevert, threadId = "", } = {}) {
|
|
288
301
|
const [open, setOpen] = useState(false);
|
|
289
302
|
const [copied, setCopied] = useState(null);
|
|
290
303
|
const messageRuntime = useMessageRuntime();
|
|
@@ -311,24 +324,23 @@ export function MessageActionsMenu({ showRevert, onRevert, } = {}) {
|
|
|
311
324
|
}, [messageRuntime]);
|
|
312
325
|
const handleCopyRequestId = useCallback(() => {
|
|
313
326
|
const m = messageRuntime.getState();
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
(typeof window !== "undefined" ? getActiveRun()?.runId : null) ||
|
|
320
|
-
m.id ||
|
|
321
|
-
"";
|
|
327
|
+
const runId = resolveAssistantRequestId(m, getActiveRun(), threadId);
|
|
328
|
+
if (!runId) {
|
|
329
|
+
setCopied("id-unavailable");
|
|
330
|
+
return;
|
|
331
|
+
}
|
|
322
332
|
void writeClipboardText(runId).then((ok) => {
|
|
323
|
-
if (!ok)
|
|
333
|
+
if (!ok) {
|
|
334
|
+
setCopied("id-failed");
|
|
324
335
|
return;
|
|
336
|
+
}
|
|
325
337
|
setCopied("id");
|
|
326
338
|
setTimeout(() => {
|
|
327
339
|
setCopied(null);
|
|
328
340
|
setOpen(false);
|
|
329
341
|
}, 1000);
|
|
330
342
|
});
|
|
331
|
-
}, [messageRuntime]);
|
|
343
|
+
}, [messageRuntime, threadId]);
|
|
332
344
|
const handleForkChat = useCallback(() => {
|
|
333
345
|
setOpen(false);
|
|
334
346
|
actionsCtx?.onForkChat?.();
|
|
@@ -343,7 +355,13 @@ export function MessageActionsMenu({ showRevert, onRevert, } = {}) {
|
|
|
343
355
|
}, children: [copied === "message" ? (_jsx(IconCheck, { className: "h-3.5 w-3.5" })) : (_jsx(IconCopy, { className: "h-3.5 w-3.5" })), copied === "message" ? "Copied!" : "Copy Message"] }), _jsxs(DropdownMenuItem, { onSelect: (e) => {
|
|
344
356
|
e.preventDefault();
|
|
345
357
|
handleCopyRequestId();
|
|
346
|
-
}, children: [copied === "id" ? (_jsx(IconCheck, { className: "h-3.5 w-3.5" })) : (_jsx(IconId, { className: "h-3.5 w-3.5" })), copied === "id"
|
|
358
|
+
}, children: [copied === "id" ? (_jsx(IconCheck, { className: "h-3.5 w-3.5" })) : (_jsx(IconId, { className: "h-3.5 w-3.5" })), copied === "id"
|
|
359
|
+
? "Copied!"
|
|
360
|
+
: copied === "id-unavailable"
|
|
361
|
+
? "Request ID unavailable"
|
|
362
|
+
: copied === "id-failed"
|
|
363
|
+
? "Copy failed"
|
|
364
|
+
: "Copy Request ID"] }), showRevert && (_jsxs(DropdownMenuItem, { onSelect: handleRevert, children: [_jsx(IconArrowBackUp, { className: "h-3.5 w-3.5" }), "Revert to here"] })), timestamp && (_jsxs(_Fragment, { children: [_jsx(DropdownMenuSeparator, {}), _jsxs(DropdownMenuLabel, { className: "px-2 py-1 text-[11px] font-normal text-muted-foreground", children: ["Sent ", timestamp.short] })] }))] })] }));
|
|
347
365
|
}
|
|
348
366
|
// ─── UserMessage ──────────────────────────────────────────────────────────────
|
|
349
367
|
export function UserMessage() {
|
|
@@ -481,29 +499,6 @@ function missingFinalResponseWarningText(content) {
|
|
|
481
499
|
}
|
|
482
500
|
return null;
|
|
483
501
|
}
|
|
484
|
-
export function completedAssistantToolNamesAfterLastText(content) {
|
|
485
|
-
let lastTextIndex = -1;
|
|
486
|
-
for (let index = content.length - 1; index >= 0; index -= 1) {
|
|
487
|
-
if (content[index]?.type === "text") {
|
|
488
|
-
lastTextIndex = index;
|
|
489
|
-
break;
|
|
490
|
-
}
|
|
491
|
-
}
|
|
492
|
-
const names = new Set();
|
|
493
|
-
for (let index = lastTextIndex + 1; index < content.length; index += 1) {
|
|
494
|
-
const part = content[index];
|
|
495
|
-
if (part?.type !== "tool-call" ||
|
|
496
|
-
part.activity === true ||
|
|
497
|
-
part.result === undefined ||
|
|
498
|
-
part.isError === true ||
|
|
499
|
-
part.outcome === "unknown" ||
|
|
500
|
-
isCallAgentToolCallShadowed(content, index)) {
|
|
501
|
-
continue;
|
|
502
|
-
}
|
|
503
|
-
names.add(humanizeToolName(part.toolName));
|
|
504
|
-
}
|
|
505
|
-
return [...names];
|
|
506
|
-
}
|
|
507
502
|
export function latestUserMessageText(messages) {
|
|
508
503
|
for (let index = messages.length - 1; index >= 0; index -= 1) {
|
|
509
504
|
const message = messages[index];
|
|
@@ -606,13 +601,24 @@ export function computeActiveTailToolCallId(content, { chatRunning, isLast }) {
|
|
|
606
601
|
? part.toolCallId
|
|
607
602
|
: latestToolCallId, null) ?? null);
|
|
608
603
|
}
|
|
609
|
-
export function shouldShowAssistantMessageFooter({ isLast, chatRunning, hasRenderableContent, statusIsTerminal, hasUnresolvedTool, }) {
|
|
604
|
+
export function shouldShowAssistantMessageFooter({ isLast, chatRunning, activeRunId, messageRunId, activeTurnId, messageTurnId, hasRenderableContent, statusIsTerminal, hasUnresolvedTool, }) {
|
|
610
605
|
if (!hasRenderableContent)
|
|
611
606
|
return false;
|
|
607
|
+
const ownsActiveTurn = activeTurnId != null &&
|
|
608
|
+
(messageTurnId == null || activeTurnId === messageTurnId);
|
|
609
|
+
// Keep the run-id comparison only for legacy messages that predate the
|
|
610
|
+
// turn-id metadata. Once either side has a logical-turn identity, absent
|
|
611
|
+
// turn evidence must not be treated as proof of a different run.
|
|
612
|
+
const ownsLegacyRun = activeTurnId == null &&
|
|
613
|
+
messageTurnId == null &&
|
|
614
|
+
activeRunId != null &&
|
|
615
|
+
messageRunId != null &&
|
|
616
|
+
activeRunId === messageRunId;
|
|
617
|
+
const ownsActiveRun = isLast || ownsActiveTurn || ownsLegacyRun;
|
|
618
|
+
if (chatRunning && ownsActiveRun)
|
|
619
|
+
return false;
|
|
612
620
|
if (!isLast)
|
|
613
621
|
return true;
|
|
614
|
-
if (chatRunning)
|
|
615
|
-
return false;
|
|
616
622
|
if (hasUnresolvedTool)
|
|
617
623
|
return false;
|
|
618
624
|
return statusIsTerminal;
|
|
@@ -781,11 +787,6 @@ export function InlineRunErrorNotice({ info, durationMs, onRetry, }) {
|
|
|
781
787
|
: headline;
|
|
782
788
|
return (_jsxs("div", { className: "my-1 w-full", children: [_jsxs("button", { type: "button", onClick: () => setOpen((v) => !v), "aria-expanded": open, className: "flex cursor-pointer items-center gap-1.5 py-0.5 text-[13px] text-muted-foreground transition-colors hover:text-foreground", children: [_jsx(IconAlertTriangle, { className: "size-3.5 shrink-0 text-amber-500" }), _jsx("span", { className: "truncate", children: label }), _jsx(IconChevronRight, { className: cn("size-3.5 shrink-0 transition-transform", open && "rotate-90") })] }), open && (_jsxs("div", { className: "mt-1 rounded-md border border-border/60 bg-background/70 p-2 text-[11px] leading-relaxed text-muted-foreground", children: [_jsx("p", { className: "whitespace-pre-wrap break-words", children: info.message }), info.errorCode && (_jsxs("div", { className: "mt-1 font-mono", children: ["code: ", info.errorCode] })), info.runId && _jsxs("div", { className: "font-mono", children: ["run: ", info.runId] }), info.details && (_jsx("pre", { className: "mt-1 max-h-28 overflow-auto whitespace-pre-wrap break-words font-mono", children: info.details })), onRetry && (_jsxs("button", { type: "button", onClick: onRetry, className: "mt-2 inline-flex h-7 cursor-pointer items-center gap-1.5 rounded-md border border-border bg-background px-2.5 text-[11px] font-medium text-foreground hover:bg-accent", children: [_jsx(IconRefresh, { className: "size-3" }), "Retry"] }))] }))] }));
|
|
783
789
|
}
|
|
784
|
-
function AssistantCompletionProgress({ messageId, toolNames, }) {
|
|
785
|
-
if (toolNames.length === 0)
|
|
786
|
-
return null;
|
|
787
|
-
return (_jsx("div", { className: "my-1 w-full text-[13px] text-muted-foreground", role: "status", "aria-live": "polite", "data-testid": "assistant-completion-progress", children: _jsx(SmoothMarkdownText, { text: `The agent completed these actions: ${toolNames.join(", ")}`, streaming: true, resetKey: `assistant-completion-progress:${messageId}`, statusType: "running" }) }));
|
|
788
|
-
}
|
|
789
790
|
function MissingFinalResponseNotice({ messageId, text, animate, onRevealComplete, }) {
|
|
790
791
|
return (_jsx("div", { className: "my-1 w-full text-muted-foreground", role: "status", "aria-live": "polite", "data-testid": "missing-final-response", children: _jsx(SmoothMarkdownText, { text: text, streaming: animate, resetKey: `missing-final-response:${messageId}`, statusType: animate ? "running" : "complete", onRevealComplete: animate ? onRevealComplete : undefined }) }));
|
|
791
792
|
}
|
|
@@ -795,6 +796,8 @@ export function AssistantMessage() {
|
|
|
795
796
|
const messageRuntime = useMessageRuntime();
|
|
796
797
|
const thread = useThread();
|
|
797
798
|
const chatRunning = React.useContext(ChatRunningContext);
|
|
799
|
+
const activeRunId = React.useContext(ChatRunningRunIdContext);
|
|
800
|
+
const activeTurnId = React.useContext(ChatRunningTurnIdContext);
|
|
798
801
|
const lastRunDurationMs = React.useContext(ChatRunDurationContext);
|
|
799
802
|
const msg = messageRuntime.getState();
|
|
800
803
|
const persistedDurationMs = getAssistantRunDurationMs(msg);
|
|
@@ -809,6 +812,8 @@ export function AssistantMessage() {
|
|
|
809
812
|
const statusIsTerminal = assistantMessageStatusIsTerminal(msg);
|
|
810
813
|
const hasCompletedCustomUi = assistantMessageHasCompletedCustomUi(msg.content);
|
|
811
814
|
const hasCustomUi = assistantMessageHasCustomUi(msg.content);
|
|
815
|
+
const messageRunId = assistantMessageRunId(msg);
|
|
816
|
+
const messageTurnId = assistantMessageTurnId(msg);
|
|
812
817
|
const serverRunActive = React.useContext(ServerRunActiveContext);
|
|
813
818
|
const messageRunError = getRunErrorMetadata(msg);
|
|
814
819
|
const messageActions = React.useContext(MessageActionsContext);
|
|
@@ -849,9 +854,6 @@ export function AssistantMessage() {
|
|
|
849
854
|
return;
|
|
850
855
|
setRevealedMissingFinalResponseKey(missingFinalResponseAnimationKey);
|
|
851
856
|
}, [missingFinalResponseAnimationKey]);
|
|
852
|
-
const completedToolNames = isLast && chatRunning && !hasCompletedCustomUi && Array.isArray(msg.content)
|
|
853
|
-
? completedAssistantToolNamesAfterLastText(msg.content)
|
|
854
|
-
: [];
|
|
855
857
|
const shouldHoldCompletionFooter = isLast &&
|
|
856
858
|
((missingFinalResponseCandidate && !showMissingFinalResponse) ||
|
|
857
859
|
(animateMissingFinalResponse && !missingFinalResponseRevealed));
|
|
@@ -860,6 +862,10 @@ export function AssistantMessage() {
|
|
|
860
862
|
shouldShowAssistantMessageFooter({
|
|
861
863
|
isLast,
|
|
862
864
|
chatRunning,
|
|
865
|
+
activeRunId,
|
|
866
|
+
messageRunId,
|
|
867
|
+
activeTurnId,
|
|
868
|
+
messageTurnId,
|
|
863
869
|
hasRenderableContent,
|
|
864
870
|
statusIsTerminal,
|
|
865
871
|
hasUnresolvedTool,
|
|
@@ -903,7 +909,6 @@ export function AssistantMessage() {
|
|
|
903
909
|
}
|
|
904
910
|
wasRunningRef.current = chatRunning && isLast;
|
|
905
911
|
}, [chatRunning, isComplete, isLast]);
|
|
906
|
-
const messageRunId = assistantMessageRunId(msg);
|
|
907
912
|
const handleRestore = useCallback(async () => {
|
|
908
913
|
if (restoreState === "idle" || restoreState === "error") {
|
|
909
914
|
setRestoreError(null);
|
|
@@ -1004,15 +1009,15 @@ export function AssistantMessage() {
|
|
|
1004
1009
|
case "tool-call":
|
|
1005
1010
|
if (shadowedToolCallIds.has(part.toolCallId))
|
|
1006
1011
|
return null;
|
|
1007
|
-
return part.toolUI ? (_jsx(ToolActivityPresentation, { toolName: part.toolName, isRunning: part.status?.type === "running",
|
|
1012
|
+
return part.toolUI ? (_jsx(ToolActivityPresentation, { toolName: part.toolName, isRunning: part.status?.type === "running", toolCallId: part.toolCallId, children: part.toolUI })) : (_jsx(ToolCallFallback, { ...part, isActiveTail: part.toolCallId === activeTailToolCallId }));
|
|
1008
1013
|
default:
|
|
1009
1014
|
return null;
|
|
1010
1015
|
}
|
|
1011
|
-
} }) }),
|
|
1016
|
+
} }) }), showInlineRunError && messageRunError && (_jsx(InlineRunErrorNotice, { info: messageRunError, durationMs: capturedDurationMs ?? persistedDurationMs, onRetry: isLast && messageRunError.recoverable
|
|
1012
1017
|
? messageActions?.onRetryRunError
|
|
1013
1018
|
: undefined })), missingWarningText == null &&
|
|
1014
1019
|
missingFinalResponseNoticeText != null &&
|
|
1015
|
-
!showInlineRunError && (_jsx(MissingFinalResponseNotice, { messageId: msg.id, text: missingFinalResponseNoticeText, animate: animateMissingFinalResponse, onRevealComplete: handleMissingFinalResponseReveal })), isComplete && hasCodeAgentTools && msgContent && (_jsx(FilesChangedSummary, { parts: msgContent })), isComplete && (_jsx(McpConnectionSuggestion, { text: responseConnectionText, contextText: responseConnectionContext, variant: "response" }))] }), isComplete && (_jsxs("div", { className: "mt-1 flex items-center justify-between", children: [_jsxs("div", { className: "flex min-w-0 items-center gap-1", children: [_jsx(MessageActionsMenu, { showRevert: showRestore && restoreState === "idle", onRevert: handleRestore }), isLast && (_jsx(TooltipProvider, { delayDuration: 400, children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx(ActionBarPrimitive.Reload, { asChild: true, children: _jsx("button", { type: "button", "aria-label": "Regenerate response", className: `flex h-6 w-6 cursor-pointer items-center justify-center rounded-md text-muted-foreground/70 hover:bg-accent hover:text-foreground ${messageFooterFadeClassName} disabled:cursor-not-allowed disabled:opacity-40`, children: _jsx(IconRefresh, { className: "h-3.5 w-3.5" }) }) }) }), _jsx(TooltipContent, { side: "top", className: "text-xs", children: "Regenerate response" })] }) })), _jsx(MessageBranchPicker, {}), timestamp && (_jsx(MessageTimestamp, { timestamp: timestamp, className: messageFooterFadeClassName }))] }), showRestore && restoreState === "confirming" ? (_jsxs("div", { className: "flex items-center gap-1 text-xs", children: [_jsx("button", { onClick: handleRestore, className: "rounded-md bg-destructive px-1.5 py-0.5 text-destructive-foreground hover:bg-destructive/90", children: "Restore to here?" }), _jsx("button", { onClick: cancelRestore, className: "rounded-md px-1.5 py-0.5 text-muted-foreground hover:bg-accent", children: "Cancel" })] })) : showRestore && restoreState === "restoring" ? (_jsxs("span", { className: "flex items-center gap-1 text-xs text-muted-foreground", children: [_jsx(IconLoader2, { className: "h-3 w-3 animate-spin" }), "Restoring..."] })) : restoreState === "error" ? (_jsxs("span", { className: "flex items-center gap-1 text-xs text-destructive", children: [_jsx(IconAlertTriangle, { className: "h-3 w-3 shrink-0" }), _jsx("span", { className: "truncate", children: restoreError }), _jsx("button", { onClick: cancelRestore, className: "cursor-pointer rounded-md px-1.5 py-0.5 text-muted-foreground hover:bg-accent", children: "Dismiss" })] })) : (_jsx(ThumbsFeedback, { threadId: cpCtx?.threadId ?? "", runId: messageRunId ?? "", messageSeq: thread.messages.findIndex((m) => m.id === msg.id) }))] }))] }));
|
|
1020
|
+
!showInlineRunError && (_jsx(MissingFinalResponseNotice, { messageId: msg.id, text: missingFinalResponseNoticeText, animate: animateMissingFinalResponse, onRevealComplete: handleMissingFinalResponseReveal })), isComplete && hasCodeAgentTools && msgContent && (_jsx(FilesChangedSummary, { parts: msgContent })), isComplete && (_jsx(McpConnectionSuggestion, { text: responseConnectionText, contextText: responseConnectionContext, variant: "response" }))] }), isComplete && (_jsxs("div", { className: "mt-1 flex items-center justify-between", children: [_jsxs("div", { className: "flex min-w-0 items-center gap-1", children: [_jsx(MessageActionsMenu, { showRevert: showRestore && restoreState === "idle", onRevert: handleRestore, threadId: cpCtx?.threadId ?? "" }), isLast && (_jsx(TooltipProvider, { delayDuration: 400, children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx(ActionBarPrimitive.Reload, { asChild: true, children: _jsx("button", { type: "button", "aria-label": "Regenerate response", className: `flex h-6 w-6 cursor-pointer items-center justify-center rounded-md text-muted-foreground/70 hover:bg-accent hover:text-foreground ${messageFooterFadeClassName} disabled:cursor-not-allowed disabled:opacity-40`, children: _jsx(IconRefresh, { className: "h-3.5 w-3.5" }) }) }) }), _jsx(TooltipContent, { side: "top", className: "text-xs", children: "Regenerate response" })] }) })), _jsx(MessageBranchPicker, {}), timestamp && (_jsx(MessageTimestamp, { timestamp: timestamp, className: messageFooterFadeClassName }))] }), showRestore && restoreState === "confirming" ? (_jsxs("div", { className: "flex items-center gap-1 text-xs", children: [_jsx("button", { onClick: handleRestore, className: "rounded-md bg-destructive px-1.5 py-0.5 text-destructive-foreground hover:bg-destructive/90", children: "Restore to here?" }), _jsx("button", { onClick: cancelRestore, className: "rounded-md px-1.5 py-0.5 text-muted-foreground hover:bg-accent", children: "Cancel" })] })) : showRestore && restoreState === "restoring" ? (_jsxs("span", { className: "flex items-center gap-1 text-xs text-muted-foreground", children: [_jsx(IconLoader2, { className: "h-3 w-3 animate-spin" }), "Restoring..."] })) : restoreState === "error" ? (_jsxs("span", { className: "flex items-center gap-1 text-xs text-destructive", children: [_jsx(IconAlertTriangle, { className: "h-3 w-3 shrink-0" }), _jsx("span", { className: "truncate", children: restoreError }), _jsx("button", { onClick: cancelRestore, className: "cursor-pointer rounded-md px-1.5 py-0.5 text-muted-foreground hover:bg-accent", children: "Dismiss" })] })) : (_jsx(ThumbsFeedback, { threadId: cpCtx?.threadId ?? "", runId: messageRunId ?? "", messageSeq: thread.messages.findIndex((m) => m.id === msg.id) }))] }))] }));
|
|
1016
1021
|
}
|
|
1017
1022
|
// ─── RunningActivityStatus / ThinkingIndicator ────────────────────────────────
|
|
1018
1023
|
export function RunningActivityStatus({ label }) {
|
|
@@ -39,6 +39,13 @@ export function getRunErrorMetadata(message) {
|
|
|
39
39
|
: typeof meta?.runId === "string"
|
|
40
40
|
? meta.runId
|
|
41
41
|
: undefined;
|
|
42
|
+
const turnId = typeof runError.turnId === "string"
|
|
43
|
+
? runError.turnId
|
|
44
|
+
: typeof meta?.custom?.turnId === "string"
|
|
45
|
+
? meta.custom.turnId
|
|
46
|
+
: typeof meta?.turnId === "string"
|
|
47
|
+
? meta.turnId
|
|
48
|
+
: undefined;
|
|
42
49
|
return {
|
|
43
50
|
message: messageText,
|
|
44
51
|
...(typeof runError.details === "string"
|
|
@@ -48,6 +55,7 @@ export function getRunErrorMetadata(message) {
|
|
|
48
55
|
? { errorCode: runError.errorCode }
|
|
49
56
|
: {}),
|
|
50
57
|
...(runId ? { runId } : {}),
|
|
58
|
+
...(turnId ? { turnId } : {}),
|
|
51
59
|
...(runError.recoverable ? { recoverable: true } : {}),
|
|
52
60
|
};
|
|
53
61
|
}
|
|
@@ -5,12 +5,13 @@ import type { AgentMcpAppPayload } from "../../mcp-client/app-result.js";
|
|
|
5
5
|
import type { ContentPart } from "../sse-event-processor.js";
|
|
6
6
|
import { FilesChangedSummary } from "../tool-cells/index.js";
|
|
7
7
|
export declare const ChatRunningContext: React.Context<boolean>;
|
|
8
|
+
export declare const ChatRunningRunIdContext: React.Context<string | null>;
|
|
9
|
+
export declare const ChatRunningTurnIdContext: React.Context<string | null>;
|
|
8
10
|
export declare const ChatRunDurationContext: React.Context<number | null>;
|
|
9
11
|
export declare const ASSISTANT_VISIBLE_TOOL_CALL_LIMIT = 3;
|
|
10
12
|
/**
|
|
11
|
-
* Keeps the
|
|
12
|
-
*
|
|
13
|
-
* untouched; this only animates the DOM's before/after positions.
|
|
13
|
+
* Keeps the tool-call stack layout-transparent. Tool-entry motion is disabled
|
|
14
|
+
* until it can stay stable while streaming calls are added and summarized.
|
|
14
15
|
*/
|
|
15
16
|
export declare function ToolCallStackMotion({ children, className, }: {
|
|
16
17
|
children: React.ReactNode;
|
|
@@ -55,10 +56,9 @@ export declare function toolCallHasPendingApproval(part: {
|
|
|
55
56
|
} | null;
|
|
56
57
|
}): boolean;
|
|
57
58
|
export declare const TOOL_LONG_RUNNING_HINT_DELAY_MS = 45000;
|
|
58
|
-
export declare function ToolActivityPresentation({ toolName, isRunning,
|
|
59
|
+
export declare function ToolActivityPresentation({ toolName, isRunning, toolCallId, suppressLongRunningHint, children, }: {
|
|
59
60
|
toolName: string;
|
|
60
61
|
isRunning: boolean;
|
|
61
|
-
isActiveTail: boolean;
|
|
62
62
|
toolCallId?: string;
|
|
63
63
|
suppressLongRunningHint?: boolean;
|
|
64
64
|
children: React.ReactNode;
|
|
@@ -18,209 +18,16 @@ import { resolveToolRenderer } from "./tool-render-registry.js";
|
|
|
18
18
|
import { isBuiltinDataWidgetActionRenderer, resolveBuiltinActionChatRenderer, resolveBuiltinFallbackToolRenderer, } from "./widgets/builtin-tool-renderers.js";
|
|
19
19
|
// Exported so AssistantChatInner can provide a context value.
|
|
20
20
|
export const ChatRunningContext = React.createContext(false);
|
|
21
|
+
export const ChatRunningRunIdContext = React.createContext(null);
|
|
22
|
+
export const ChatRunningTurnIdContext = React.createContext(null);
|
|
21
23
|
export const ChatRunDurationContext = React.createContext(null);
|
|
22
24
|
export const ASSISTANT_VISIBLE_TOOL_CALL_LIMIT = 3;
|
|
23
|
-
const TOOL_CALL_ENTRY_DURATION_MS = 220;
|
|
24
|
-
const TOOL_CALL_STACK_MOTION_DURATION_MS = 220;
|
|
25
|
-
const TOOL_CALL_STACK_EASING = "cubic-bezier(0.23, 1, 0.32, 1)";
|
|
26
|
-
function toolStackMotionKey(element, index) {
|
|
27
|
-
const toolCallId = element.dataset.agentToolCallId;
|
|
28
|
-
if (toolCallId)
|
|
29
|
-
return `tool:${toolCallId}`;
|
|
30
|
-
const summaryId = element.dataset.agentToolSummary;
|
|
31
|
-
if (summaryId)
|
|
32
|
-
return `summary:${summaryId}`;
|
|
33
|
-
return `anonymous:${index}`;
|
|
34
|
-
}
|
|
35
|
-
function prefersReducedMotionForToolStack() {
|
|
36
|
-
return (typeof window !== "undefined" &&
|
|
37
|
-
typeof window.matchMedia === "function" &&
|
|
38
|
-
window.matchMedia("(prefers-reduced-motion: reduce)").matches);
|
|
39
|
-
}
|
|
40
|
-
function startToolStackAnimation(element, keyframes) {
|
|
41
|
-
if (typeof element.animate !== "function")
|
|
42
|
-
return null;
|
|
43
|
-
return element.animate(keyframes, {
|
|
44
|
-
duration: TOOL_CALL_STACK_MOTION_DURATION_MS,
|
|
45
|
-
easing: TOOL_CALL_STACK_EASING,
|
|
46
|
-
fill: "both",
|
|
47
|
-
});
|
|
48
|
-
}
|
|
49
|
-
function prepareToolStackExitClone(clone, snapshot) {
|
|
50
|
-
clone.classList.remove("agent-tool-call--entering", "agent-tool-call--stack-entering");
|
|
51
|
-
clone
|
|
52
|
-
.querySelectorAll(".agent-tool-call--entering, .agent-tool-call--stack-entering")
|
|
53
|
-
.forEach((element) => {
|
|
54
|
-
element.classList.remove("agent-tool-call--entering", "agent-tool-call--stack-entering");
|
|
55
|
-
});
|
|
56
|
-
clone.classList.add("agent-tool-call-stack__exit");
|
|
57
|
-
clone.setAttribute("aria-hidden", "true");
|
|
58
|
-
clone.removeAttribute("data-agent-tool-call-id");
|
|
59
|
-
clone.removeAttribute("data-agent-tool-summary");
|
|
60
|
-
clone.removeAttribute("data-agent-tool-motion-token");
|
|
61
|
-
clone.style.left = `${snapshot.left}px`;
|
|
62
|
-
clone.style.top = `${snapshot.top}px`;
|
|
63
|
-
clone.style.width = `${snapshot.width}px`;
|
|
64
|
-
clone.style.height = `${snapshot.height}px`;
|
|
65
|
-
clone.style.transform = "translate3d(0, 0, 0)";
|
|
66
|
-
clone.style.transition = "none";
|
|
67
|
-
clone.style.animation = "none";
|
|
68
|
-
clone.style.opacity = "1";
|
|
69
|
-
}
|
|
70
25
|
/**
|
|
71
|
-
* Keeps the
|
|
72
|
-
*
|
|
73
|
-
* untouched; this only animates the DOM's before/after positions.
|
|
26
|
+
* Keeps the tool-call stack layout-transparent. Tool-entry motion is disabled
|
|
27
|
+
* until it can stay stable while streaming calls are added and summarized.
|
|
74
28
|
*/
|
|
75
29
|
export function ToolCallStackMotion({ children, className, }) {
|
|
76
|
-
|
|
77
|
-
const previousRef = useRef(new Map());
|
|
78
|
-
const previousStructureRef = useRef([]);
|
|
79
|
-
const activeMotionsRef = useRef(new Map());
|
|
80
|
-
const exitAnimationsRef = useRef(new Map());
|
|
81
|
-
useLayoutEffect(() => {
|
|
82
|
-
const stack = stackRef.current;
|
|
83
|
-
if (!stack)
|
|
84
|
-
return;
|
|
85
|
-
const previous = previousRef.current;
|
|
86
|
-
const visualPrevious = new Map(previous);
|
|
87
|
-
for (const [key, activeMotion] of activeMotionsRef.current) {
|
|
88
|
-
if (stack.contains(activeMotion.element)) {
|
|
89
|
-
const previousSnapshot = previous.get(key);
|
|
90
|
-
if (previousSnapshot) {
|
|
91
|
-
const rect = activeMotion.element.getBoundingClientRect();
|
|
92
|
-
visualPrevious.set(key, {
|
|
93
|
-
...previousSnapshot,
|
|
94
|
-
top: rect.top,
|
|
95
|
-
left: rect.left,
|
|
96
|
-
});
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
activeMotion.animation.cancel();
|
|
100
|
-
}
|
|
101
|
-
activeMotionsRef.current.clear();
|
|
102
|
-
for (const [ghost, animation] of exitAnimationsRef.current) {
|
|
103
|
-
animation.cancel();
|
|
104
|
-
ghost.remove();
|
|
105
|
-
}
|
|
106
|
-
exitAnimationsRef.current.clear();
|
|
107
|
-
const elements = Array.from(stack.querySelectorAll("[data-agent-tool-call-id], [data-agent-tool-summary]"));
|
|
108
|
-
const structure = elements.map((element, index) => toolStackMotionKey(element, index));
|
|
109
|
-
const previousStructure = previousStructureRef.current;
|
|
110
|
-
const structureChanged = structure.length !== previousStructure.length ||
|
|
111
|
-
structure.some((key, index) => key !== previousStructure[index]);
|
|
112
|
-
previousStructureRef.current = structure;
|
|
113
|
-
const current = new Map();
|
|
114
|
-
for (const [index, element] of elements.entries()) {
|
|
115
|
-
const rect = element.getBoundingClientRect();
|
|
116
|
-
current.set(toolStackMotionKey(element, index), {
|
|
117
|
-
top: rect.top,
|
|
118
|
-
left: rect.left,
|
|
119
|
-
width: rect.width,
|
|
120
|
-
height: rect.height,
|
|
121
|
-
clone: element.cloneNode(true),
|
|
122
|
-
});
|
|
123
|
-
}
|
|
124
|
-
previousRef.current = current;
|
|
125
|
-
// Entry motion changes the measured transform without changing the stack
|
|
126
|
-
// structure. Do not turn that animation's cleanup into a second FLIP pass.
|
|
127
|
-
if (previous.size === 0 ||
|
|
128
|
-
!structureChanged ||
|
|
129
|
-
prefersReducedMotionForToolStack())
|
|
130
|
-
return;
|
|
131
|
-
const summary = elements.find((element) => element.dataset.agentToolSummary !== undefined);
|
|
132
|
-
const summaryRect = summary?.getBoundingClientRect();
|
|
133
|
-
const elementsByKey = new Map(elements.map((element, index) => [
|
|
134
|
-
toolStackMotionKey(element, index),
|
|
135
|
-
element,
|
|
136
|
-
]));
|
|
137
|
-
for (const [key, after] of current.entries()) {
|
|
138
|
-
const before = visualPrevious.get(key);
|
|
139
|
-
if (!before) {
|
|
140
|
-
const node = elementsByKey.get(key);
|
|
141
|
-
if (!node)
|
|
142
|
-
continue;
|
|
143
|
-
if (node.dataset.agentToolSummary !== undefined)
|
|
144
|
-
continue;
|
|
145
|
-
if (node.dataset.agentToolCallId !== undefined &&
|
|
146
|
-
!node.classList.contains("agent-tool-call--entering")) {
|
|
147
|
-
node.classList.add("agent-tool-call--stack-entering");
|
|
148
|
-
window.setTimeout(() => {
|
|
149
|
-
node.classList.remove("agent-tool-call--stack-entering");
|
|
150
|
-
}, TOOL_CALL_ENTRY_DURATION_MS);
|
|
151
|
-
}
|
|
152
|
-
continue;
|
|
153
|
-
}
|
|
154
|
-
const dx = before.left - after.left;
|
|
155
|
-
const dy = before.top - after.top;
|
|
156
|
-
if (Math.abs(dx) < 0.5 && Math.abs(dy) < 0.5)
|
|
157
|
-
continue;
|
|
158
|
-
const node = elementsByKey.get(key);
|
|
159
|
-
if (!node)
|
|
160
|
-
continue;
|
|
161
|
-
if (node.dataset.agentToolSummary !== undefined)
|
|
162
|
-
continue;
|
|
163
|
-
const animation = startToolStackAnimation(node, [
|
|
164
|
-
{ transform: `translate3d(${dx}px, ${dy}px, 0)` },
|
|
165
|
-
{ transform: "translate3d(0, 0, 0)" },
|
|
166
|
-
]);
|
|
167
|
-
if (!animation)
|
|
168
|
-
continue;
|
|
169
|
-
activeMotionsRef.current.set(key, { element: node, animation });
|
|
170
|
-
const clearMotion = () => {
|
|
171
|
-
if (activeMotionsRef.current.get(key)?.animation === animation) {
|
|
172
|
-
activeMotionsRef.current.delete(key);
|
|
173
|
-
}
|
|
174
|
-
};
|
|
175
|
-
animation.onfinish = clearMotion;
|
|
176
|
-
animation.oncancel = clearMotion;
|
|
177
|
-
}
|
|
178
|
-
for (const [key, before] of visualPrevious.entries()) {
|
|
179
|
-
if (current.has(key) || !key.startsWith("tool:"))
|
|
180
|
-
continue;
|
|
181
|
-
const ghost = before.clone;
|
|
182
|
-
prepareToolStackExitClone(ghost, before);
|
|
183
|
-
document.body?.appendChild(ghost);
|
|
184
|
-
if (!ghost.isConnected)
|
|
185
|
-
continue;
|
|
186
|
-
const targetTop = summaryRect?.top ?? before.top - 8;
|
|
187
|
-
const targetLeft = summaryRect?.left ?? before.left;
|
|
188
|
-
const animation = startToolStackAnimation(ghost, [
|
|
189
|
-
{ transform: "translate3d(0, 0, 0)", opacity: 1 },
|
|
190
|
-
{
|
|
191
|
-
transform: `translate3d(${targetLeft - before.left}px, ${targetTop - before.top}px, 0)`,
|
|
192
|
-
opacity: 0,
|
|
193
|
-
},
|
|
194
|
-
]);
|
|
195
|
-
if (!animation) {
|
|
196
|
-
ghost.remove();
|
|
197
|
-
continue;
|
|
198
|
-
}
|
|
199
|
-
exitAnimationsRef.current.set(ghost, animation);
|
|
200
|
-
const clearExit = () => {
|
|
201
|
-
if (exitAnimationsRef.current.get(ghost) === animation) {
|
|
202
|
-
exitAnimationsRef.current.delete(ghost);
|
|
203
|
-
}
|
|
204
|
-
ghost.remove();
|
|
205
|
-
};
|
|
206
|
-
animation.onfinish = clearExit;
|
|
207
|
-
animation.oncancel = clearExit;
|
|
208
|
-
}
|
|
209
|
-
});
|
|
210
|
-
useEffect(() => {
|
|
211
|
-
return () => {
|
|
212
|
-
for (const { animation } of activeMotionsRef.current.values()) {
|
|
213
|
-
animation.cancel();
|
|
214
|
-
}
|
|
215
|
-
activeMotionsRef.current.clear();
|
|
216
|
-
for (const [ghost, animation] of exitAnimationsRef.current) {
|
|
217
|
-
animation.cancel();
|
|
218
|
-
ghost.remove();
|
|
219
|
-
}
|
|
220
|
-
exitAnimationsRef.current.clear();
|
|
221
|
-
};
|
|
222
|
-
}, []);
|
|
223
|
-
return (_jsx("div", { ref: stackRef, className: cn("agent-tool-call-stack", className), children: children }));
|
|
30
|
+
return (_jsx("div", { className: cn("agent-tool-call-stack", className), children: children }));
|
|
224
31
|
}
|
|
225
32
|
export const ApprovalContext = React.createContext(null);
|
|
226
33
|
/** Pending human-in-the-loop gate still waiting for Approve/Deny. */
|
|
@@ -231,18 +38,8 @@ export function toolCallHasPendingApproval(part) {
|
|
|
231
38
|
approval.dismissed !== true);
|
|
232
39
|
}
|
|
233
40
|
export const TOOL_LONG_RUNNING_HINT_DELAY_MS = 45_000;
|
|
234
|
-
export function ToolActivityPresentation({ toolName, isRunning,
|
|
41
|
+
export function ToolActivityPresentation({ toolName, isRunning, toolCallId, suppressLongRunningHint = false, children, }) {
|
|
235
42
|
const [showLongRunningHint, setShowLongRunningHint] = useState(false);
|
|
236
|
-
// A batched update can first reveal a tool with its result already attached.
|
|
237
|
-
// Presentation follows the active chat tail rather than execution state so
|
|
238
|
-
// that newly revealed completed tools still get their entrance motion.
|
|
239
|
-
const [animateEntry, setAnimateEntry] = useState(isActiveTail);
|
|
240
|
-
useEffect(() => {
|
|
241
|
-
if (!animateEntry)
|
|
242
|
-
return;
|
|
243
|
-
const timeout = window.setTimeout(() => setAnimateEntry(false), TOOL_CALL_ENTRY_DURATION_MS);
|
|
244
|
-
return () => window.clearTimeout(timeout);
|
|
245
|
-
}, [animateEntry]);
|
|
246
43
|
useEffect(() => {
|
|
247
44
|
if (!isRunning || suppressLongRunningHint) {
|
|
248
45
|
setShowLongRunningHint(false);
|
|
@@ -254,7 +51,7 @@ export function ToolActivityPresentation({ toolName, isRunning, isActiveTail, to
|
|
|
254
51
|
}, TOOL_LONG_RUNNING_HINT_DELAY_MS);
|
|
255
52
|
return () => window.clearTimeout(timeout);
|
|
256
53
|
}, [isRunning, suppressLongRunningHint, toolName]);
|
|
257
|
-
return (_jsx("div", { className:
|
|
54
|
+
return (_jsx("div", { className: "agent-tool-call", "data-agent-tool-call-id": toolCallId, "data-running": isRunning ? "true" : undefined, children: _jsxs("div", { className: "agent-tool-call__content", children: [children, isRunning && showLongRunningHint && (_jsx("div", { className: "mt-0.5 px-2.5 pb-2 text-[11px] leading-snug text-muted-foreground/80", children: "Still working. Large updates can take a minute or two." }))] }) }));
|
|
258
55
|
}
|
|
259
56
|
function stringifyToolValue(value, pretty = false) {
|
|
260
57
|
if (typeof value === "string")
|
|
@@ -480,7 +277,7 @@ export function ToolCallDisplay({ toolName, toolCallId, argsText, args, result,
|
|
|
480
277
|
// These must be separate components so hook order in ToolCallDisplayGeneric
|
|
481
278
|
// is always stable (no conditional hook calls).
|
|
482
279
|
const toolKind = structuredMeta?.toolKind;
|
|
483
|
-
const wrapToolDisplay = (children) => (_jsx(ToolActivityPresentation, { toolName: toolName, isRunning: isRunning,
|
|
280
|
+
const wrapToolDisplay = (children) => (_jsx(ToolActivityPresentation, { toolName: toolName, isRunning: isRunning, toolCallId: toolCallId, suppressLongRunningHint: toolName === "call-agent" || toolName.startsWith("agent:"), children: children }));
|
|
484
281
|
if (toolKind === "bash") {
|
|
485
282
|
return wrapToolDisplay(_jsx(BashCell, { meta: structuredMeta, output: result, isRunning: isRunning }));
|
|
486
283
|
}
|
|
@@ -642,7 +439,7 @@ function AgentCallCell({ agentName, activity, progress, responseText, isRunning,
|
|
|
642
439
|
function AgentActivityToolCallRow({ tool, isActiveTail, }) {
|
|
643
440
|
const isRunning = tool.status === "running";
|
|
644
441
|
const ToolIcon = resolveToolIcon(tool.name);
|
|
645
|
-
return (_jsx(ToolActivityPresentation, { toolName: tool.name, isRunning: isRunning,
|
|
442
|
+
return (_jsx(ToolActivityPresentation, { toolName: tool.name, isRunning: isRunning, toolCallId: tool.id, suppressLongRunningHint: true, children: _jsxs("div", { className: "my-0.5 flex w-full items-center gap-1.5 rounded-md py-0.5 text-left text-[13px] text-muted-foreground", children: [_jsx("span", { className: "flex size-4 shrink-0 items-center justify-center", children: isRunning ? (_jsx(IconLoader2, { className: "size-3.5 animate-spin" })) : (_jsx(ToolIcon, { className: "size-3.5" })) }), _jsx("span", { className: cn("min-w-0 truncate font-normal", isActiveTail && "agent-running-shimmer"), children: humanizeToolName(tool.name) })] }) }));
|
|
646
443
|
}
|
|
647
444
|
// ─── ToolCallFallback ──────────────────────────────────────────────────────────
|
|
648
445
|
export function ToolCallFallback({ toolName, toolCallId, args, argsText, result, ...rest }) {
|
|
@@ -15,12 +15,12 @@ function AppRows({ apps, activeAppId, layout, onDragStart, onDrop, onDragEnd, on
|
|
|
15
15
|
const active = activeAppId === app.id;
|
|
16
16
|
const pinned = layout.pinnedIds.includes(app.id);
|
|
17
17
|
const index = orderedApps.indexOf(app);
|
|
18
|
-
return (_jsxs(ContextMenu, { children: [_jsx(ContextMenuTrigger, { asChild: true, children: _jsxs("li", { draggable: true, "data-chat-first-app": true, "data-app-id": app.id, className: cn("group flex h-8 w-full min-w-0 items-center gap-1 rounded-md px-
|
|
18
|
+
return (_jsxs(ContextMenu, { children: [_jsx(ContextMenuTrigger, { asChild: true, children: _jsxs("li", { draggable: true, "data-chat-first-app": true, "data-app-id": app.id, className: cn("group flex h-8 w-full min-w-0 items-center gap-1 rounded-md px-0 text-sm", active
|
|
19
19
|
? "bg-sidebar-accent font-medium text-sidebar-accent-foreground"
|
|
20
20
|
: "text-sidebar-foreground/75 hover:bg-sidebar-accent hover:text-sidebar-accent-foreground"), onDragStart: (event) => {
|
|
21
21
|
event.dataTransfer.effectAllowed = "move";
|
|
22
22
|
onDragStart(app.id);
|
|
23
|
-
}, onDragOver: (event) => event.preventDefault(), onDrop: () => onDrop(app.id), onDragEnd: onDragEnd, children: [_jsxs("button", { type: "button", className: "flex h-full min-w-0 flex-1 items-center gap-2 px-
|
|
23
|
+
}, onDragOver: (event) => event.preventDefault(), onDrop: () => onDrop(app.id), onDragEnd: onDragEnd, children: [_jsxs("button", { type: "button", className: "flex h-full min-w-0 flex-1 items-center gap-2 px-2 text-start", onClick: () => onOpenApp(app), onKeyDown: (event) => {
|
|
24
24
|
if (!event.altKey)
|
|
25
25
|
return;
|
|
26
26
|
if (event.key === "ArrowUp") {
|
|
@@ -99,5 +99,5 @@ export const ChatFirstAppsRail = memo(function ChatFirstAppsRail({ apps, activeA
|
|
|
99
99
|
? "bg-sidebar-accent text-sidebar-accent-foreground"
|
|
100
100
|
: "text-sidebar-foreground/70 hover:bg-sidebar-accent hover:text-sidebar-accent-foreground"), onClick: () => onOpenApp(app), "aria-label": copy("openApp", { name: app.name }), title: app.name, children: renderIcon(app) }, app.id))), onOpenAllApps ? (_jsx("button", { type: "button", "data-chat-first-all-apps": true, className: "flex size-9 items-center justify-center rounded-md text-sidebar-foreground/70 hover:bg-sidebar-accent hover:text-sidebar-accent-foreground", onClick: onOpenAllApps, "aria-label": copy("allApps"), title: copy("allApps"), children: _jsx(IconApps, { size: 16, "aria-hidden": "true" }) })) : null, error ? (_jsx("span", { className: "size-1.5 rounded-full bg-destructive", title: error, "aria-label": error })) : null] }));
|
|
101
101
|
}
|
|
102
|
-
return (_jsxs("section", { "data-chat-first-apps-rail": true, className: "mt-3 px-2 pb-2 pt-2", "aria-label": copy("workspaceApps"), children: [_jsxs("div", { className: "mb-1 flex items-center gap-1.5 px-
|
|
102
|
+
return (_jsxs("section", { "data-chat-first-apps-rail": true, className: "mt-3 px-2 pb-2 pt-2", "aria-label": copy("workspaceApps"), children: [_jsxs("div", { className: "mb-1 flex items-center gap-1.5 px-2 text-[11px] font-medium text-sidebar-foreground/50", children: [_jsx("span", { children: copy("workspaceApps") }), _jsx("span", { className: "ml-auto", children: createTrigger })] }), loading && apps.length === 0 ? (_jsx("div", { className: "space-y-0.5 px-2", children: [0, 1, 2].map((index) => (_jsx(Skeleton, { className: "h-8 w-full rounded-md" }, index))) })) : apps.length === 0 ? (_jsxs("div", { className: "px-2", children: [_jsx("p", { className: "text-xs text-sidebar-foreground/55", children: copy("noWorkspaceApps") }), createAppTrigger ? (createTrigger) : onCreateApp ? (_jsxs("button", { type: "button", className: "mt-1 inline-flex h-6 items-center gap-1.5 rounded-md border border-sidebar-border px-2 text-xs text-sidebar-foreground/75 hover:bg-sidebar-accent hover:text-sidebar-foreground", onClick: onCreateApp, children: [_jsx(IconPlus, { size: 13, "aria-hidden": "true" }), copy("createApp")] })) : (createTrigger)] })) : (_jsx(AppRows, { apps: visibleApps, activeAppId: activeAppId, layout: layout, onDragStart: setDraggedAppId, onDrop: reorderApps, onDragEnd: () => setDraggedAppId(null), onOpenApp: onOpenApp, onTogglePinned: togglePinned, onMove: moveApp, renderIcon: renderIcon, copy: copy })), hasMoreApps || showAllApps ? (_jsxs("button", { type: "button", className: "mt-0.5 flex h-8 w-full items-center gap-2 rounded-md px-2 text-xs text-sidebar-foreground/50 hover:bg-sidebar-accent hover:text-sidebar-foreground", onClick: () => setShowAllApps((value) => !value), children: [showAllApps ? (_jsx(IconChevronUp, { size: 14, "aria-hidden": "true" })) : (_jsx(IconChevronDown, { size: 14, "aria-hidden": "true" })), showAllApps ? copy("showLess") : copy("showMore")] })) : null, onOpenAllApps ? (_jsx("div", { className: "mt-1 border-t border-sidebar-border/60 pt-1", children: _jsxs("button", { type: "button", "data-chat-first-all-apps": true, className: "flex h-8 w-full items-center gap-2 rounded-md px-2 text-xs text-sidebar-foreground/55 hover:bg-sidebar-accent hover:text-sidebar-foreground", onClick: onOpenAllApps, children: [_jsx(IconApps, { size: 14, "aria-hidden": "true" }), _jsx("span", { children: copy("allApps") })] }) })) : null, error ? (_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsxs("button", { type: "button", className: "mt-1 flex items-center gap-1 px-2 text-[10px] text-destructive/80", onClick: onRetry, "aria-label": error, children: [_jsx("span", { className: "size-1.5 rounded-full bg-destructive" }), onRetry ? copy("retry") : copy("appsLoadError")] }) }), _jsx(TooltipContent, { side: "right", children: error })] })) : null] }));
|
|
103
103
|
});
|
|
@@ -17,6 +17,9 @@ export function ChatFirstBrowserPane({ url, title, status, statusMessage, onClos
|
|
|
17
17
|
setHistoryIndex(0);
|
|
18
18
|
setNavigationError(null);
|
|
19
19
|
}, [url]);
|
|
20
|
+
const currentTarget = resolveChatFirstBrowserTarget({ url: currentUrl });
|
|
21
|
+
const isExternalOnly = currentTarget.status === "ready" &&
|
|
22
|
+
currentTarget.target.openExternally === true;
|
|
20
23
|
function navigate(event) {
|
|
21
24
|
event.preventDefault();
|
|
22
25
|
const target = resolveChatFirstBrowserTarget({ url: draftUrl });
|
|
@@ -56,7 +59,7 @@ export function ChatFirstBrowserPane({ url, title, status, statusMessage, onClos
|
|
|
56
59
|
}
|
|
57
60
|
return (_jsxs("section", { "data-chat-first-browser-pane": true, className: "flex h-full min-h-0 w-full flex-col overflow-hidden bg-background", "aria-label": copy("surface.browser.label"), children: [_jsxs("header", { className: "flex h-12 shrink-0 items-center gap-1.5 border-b border-border bg-card px-2", children: [_jsxs("div", { className: "flex shrink-0 items-center gap-0.5", children: [_jsx("button", { type: "button", disabled: historyIndex <= 0, onClick: goBack, "aria-label": copy("browserBack"), title: copy("browserBack"), className: "flex size-7 items-center justify-center rounded-md text-muted-foreground hover:bg-accent hover:text-foreground disabled:opacity-35", children: _jsx(IconArrowLeft, { size: 15 }) }), _jsx("button", { type: "button", disabled: historyIndex >= history.length - 1, onClick: goForward, "aria-label": copy("browserForward"), title: copy("browserForward"), className: "flex size-7 items-center justify-center rounded-md text-muted-foreground hover:bg-accent hover:text-foreground disabled:opacity-35", children: _jsx(IconArrowRight, { size: 15 }) }), _jsx("button", { type: "button", onClick: () => setReloadKey((key) => key + 1), "aria-label": copy("browserReload"), title: copy("browserReload"), className: "flex size-7 items-center justify-center rounded-md text-muted-foreground hover:bg-accent hover:text-foreground", children: _jsx(IconRefresh, { size: 15 }) })] }), _jsxs("form", { className: "flex min-w-0 flex-1 items-center gap-1.5 rounded-md border border-input bg-background px-2", onSubmit: navigate, children: [_jsx(IconWorld, { size: 13, className: "shrink-0 text-muted-foreground", "aria-hidden": "true" }), _jsx("input", { value: draftUrl, onChange: (event) => setDraftUrl(event.target.value), "aria-label": copy("browserAddress"), spellCheck: false, className: "h-7 min-w-0 flex-1 bg-transparent text-xs text-foreground outline-none placeholder:text-muted-foreground" })] }), _jsxs("div", { className: "flex shrink-0 items-center gap-0.5", children: [title ? (_jsx("span", { className: "hidden max-w-28 truncate px-1 text-xs text-muted-foreground xl:block", title: title, children: title })) : null, _jsx("button", { type: "button", onClick: () => window.open(currentUrl, "_blank", "noopener,noreferrer"), "aria-label": copy("browserOpenExternal"), title: copy("browserOpenExternal"), className: "flex size-7 items-center justify-center rounded-md text-muted-foreground hover:bg-accent hover:text-foreground", children: _jsx(IconExternalLink, { size: 15 }) }), _jsx("button", { type: "button", onClick: onClose, "aria-label": copy("browserClose"), title: copy("browserClose"), className: "flex size-7 items-center justify-center rounded-md text-muted-foreground hover:bg-accent hover:text-foreground", children: _jsx(IconX, { size: 15 }) })] })] }), navigationError ? (_jsx("p", { className: "border-b border-destructive/30 bg-destructive/10 px-3 py-1.5 text-xs text-destructive", role: "alert", children: navigationError })) : null, _jsx("div", { className: "relative min-h-0 flex-1 overflow-hidden", children: status === "starting" || status === "error" ? (_jsx("div", { className: "flex h-full items-center justify-center px-6 text-center", role: status === "error" ? "alert" : "status", "aria-live": "polite", children: _jsxs("div", { className: "max-w-xs space-y-1", children: [_jsx("p", { className: "text-sm font-medium text-foreground", children: status === "starting"
|
|
58
61
|
? copy("browserPreviewStarting")
|
|
59
|
-
: copy("browserPreviewError") }), statusMessage ? (_jsx("p", { className: "text-xs text-muted-foreground", children: statusMessage })) : null] }) })) : (renderEmbed({
|
|
62
|
+
: copy("browserPreviewError") }), statusMessage ? (_jsx("p", { className: "text-xs text-muted-foreground", children: statusMessage })) : null] }) })) : isExternalOnly ? (_jsx("div", { className: "flex h-full items-center justify-center p-6 text-center", children: _jsxs("div", { className: "max-w-sm space-y-3", children: [_jsx("p", { className: "text-sm text-muted-foreground", children: copy("browserPreviewError") }), _jsxs("a", { href: currentUrl, target: "_blank", rel: "noopener noreferrer", className: "inline-flex items-center gap-1.5 rounded-md border border-border px-3 py-1.5 text-xs font-medium text-foreground hover:bg-accent", children: [_jsx(IconExternalLink, { size: 14, "aria-hidden": "true" }), copy("browserOpenExternal")] })] }) })) : (renderEmbed({
|
|
60
63
|
url: currentUrl,
|
|
61
64
|
title: title || copy("browserPage"),
|
|
62
65
|
key: `${currentUrl}:${reloadKey}`,
|