@alpaca-editor/core 1.0.4114 → 1.0.4120
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/dist/components/FilterInput.js +3 -7
- package/dist/components/FilterInput.js.map +1 -1
- package/dist/components/ui/input.js +3 -1
- package/dist/components/ui/input.js.map +1 -1
- package/dist/components/ui/textarea.js +3 -1
- package/dist/components/ui/textarea.js.map +1 -1
- package/dist/config/config.js +1 -1
- package/dist/editor/AspectRatioSelector.js +3 -3
- package/dist/editor/AspectRatioSelector.js.map +1 -1
- package/dist/editor/ContentTree.js +52 -4
- package/dist/editor/ContentTree.js.map +1 -1
- package/dist/editor/ContextMenu.d.ts +2 -0
- package/dist/editor/ContextMenu.js +9 -7
- package/dist/editor/ContextMenu.js.map +1 -1
- package/dist/editor/EditorWarning.js +2 -2
- package/dist/editor/EditorWarning.js.map +1 -1
- package/dist/editor/FieldEditorPopup.js +7 -6
- package/dist/editor/FieldEditorPopup.js.map +1 -1
- package/dist/editor/FieldHistory.js +2 -1
- package/dist/editor/FieldHistory.js.map +1 -1
- package/dist/editor/FieldListField.js +1 -1
- package/dist/editor/LinkEditorDialog.d.ts +3 -1
- package/dist/editor/LinkEditorDialog.js +7 -3
- package/dist/editor/LinkEditorDialog.js.map +1 -1
- package/dist/editor/MainLayout.js +3 -3
- package/dist/editor/MainLayout.js.map +1 -1
- package/dist/editor/PictureCropper.js +3 -3
- package/dist/editor/PictureCropper.js.map +1 -1
- package/dist/editor/PictureEditor.d.ts +2 -1
- package/dist/editor/PictureEditor.js +2 -2
- package/dist/editor/PictureEditor.js.map +1 -1
- package/dist/editor/PictureEditorDialog.js +55 -50
- package/dist/editor/PictureEditorDialog.js.map +1 -1
- package/dist/editor/Terminal.js +4 -4
- package/dist/editor/Terminal.js.map +1 -1
- package/dist/editor/ai/AgentTerminal.js +298 -53
- package/dist/editor/ai/AgentTerminal.js.map +1 -1
- package/dist/editor/ai/Agents.js +2 -2
- package/dist/editor/ai/Agents.js.map +1 -1
- package/dist/editor/ai/ContextInfoBar.js +2 -2
- package/dist/editor/ai/ContextInfoBar.js.map +1 -1
- package/dist/editor/client/EditorShell.js +3 -0
- package/dist/editor/client/EditorShell.js.map +1 -1
- package/dist/editor/client/GenericDialog.js +3 -3
- package/dist/editor/client/GenericDialog.js.map +1 -1
- package/dist/editor/client/editContext.d.ts +2 -1
- package/dist/editor/client/editContext.js.map +1 -1
- package/dist/editor/client/ui/EditorChrome.js +8 -2
- package/dist/editor/client/ui/EditorChrome.js.map +1 -1
- package/dist/editor/commands/localizeItem/LocalizeItemDialog.js +9 -7
- package/dist/editor/commands/localizeItem/LocalizeItemDialog.js.map +1 -1
- package/dist/editor/context-menu/CopyMoveMenu.js +3 -3
- package/dist/editor/context-menu/CopyMoveMenu.js.map +1 -1
- package/dist/editor/control-center/IndexOverview.js +39 -17
- package/dist/editor/control-center/IndexOverview.js.map +1 -1
- package/dist/editor/control-center/setup-steps/SettingsSetupStep.js +9 -6
- package/dist/editor/control-center/setup-steps/SettingsSetupStep.js.map +1 -1
- package/dist/editor/field-types/CheckboxEditor.js +2 -2
- package/dist/editor/field-types/CheckboxEditor.js.map +1 -1
- package/dist/editor/field-types/DateFieldEditor.js +2 -2
- package/dist/editor/field-types/DateFieldEditor.js.map +1 -1
- package/dist/editor/field-types/DateTimeFieldEditor.js.map +1 -1
- package/dist/editor/field-types/ImageFieldEditor.js +2 -2
- package/dist/editor/field-types/ImageFieldEditor.js.map +1 -1
- package/dist/editor/field-types/InternalLinkFieldEditor.js +2 -2
- package/dist/editor/field-types/InternalLinkFieldEditor.js.map +1 -1
- package/dist/editor/field-types/LinkFieldEditor.js +8 -3
- package/dist/editor/field-types/LinkFieldEditor.js.map +1 -1
- package/dist/editor/field-types/MultiLineText.js +2 -2
- package/dist/editor/field-types/MultiLineText.js.map +1 -1
- package/dist/editor/field-types/PictureFieldEditor.js +3 -2
- package/dist/editor/field-types/PictureFieldEditor.js.map +1 -1
- package/dist/editor/field-types/RawEditor.js +2 -2
- package/dist/editor/field-types/RawEditor.js.map +1 -1
- package/dist/editor/field-types/SingleLineText.js +2 -2
- package/dist/editor/field-types/SingleLineText.js.map +1 -1
- package/dist/editor/field-types/richtext/components/ReactSlate.js +2 -2
- package/dist/editor/field-types/richtext/components/ReactSlate.js.map +1 -1
- package/dist/editor/field-types/richtext/components/SimpleRichTextEditor.js +2 -2
- package/dist/editor/field-types/richtext/components/SimpleRichTextEditor.js.map +1 -1
- package/dist/editor/fieldTypes.d.ts +1 -0
- package/dist/editor/media-selector/AiImageSearch.js +5 -4
- package/dist/editor/media-selector/AiImageSearch.js.map +1 -1
- package/dist/editor/media-selector/MediaFolderBrowser.js +8 -8
- package/dist/editor/media-selector/MediaFolderBrowser.js.map +1 -1
- package/dist/editor/media-selector/Thumbnails.js +2 -2
- package/dist/editor/media-selector/Thumbnails.js.map +1 -1
- package/dist/editor/media-selector/TreeSelector.js +2 -2
- package/dist/editor/media-selector/TreeSelector.js.map +1 -1
- package/dist/editor/media-selector/UploadZone.js +2 -2
- package/dist/editor/media-selector/UploadZone.js.map +1 -1
- package/dist/editor/menubar/NavButtons.js +3 -5
- package/dist/editor/menubar/NavButtons.js.map +1 -1
- package/dist/editor/menubar/Separator.js +2 -2
- package/dist/editor/menubar/Separator.js.map +1 -1
- package/dist/editor/menubar/SiteInfo.js +9 -9
- package/dist/editor/menubar/SiteInfo.js.map +1 -1
- package/dist/editor/page-editor-chrome/CommentHighlighting.js +2 -2
- package/dist/editor/page-editor-chrome/CommentHighlighting.js.map +1 -1
- package/dist/editor/page-editor-chrome/FieldActionIndicator.js +2 -2
- package/dist/editor/page-editor-chrome/FieldActionIndicator.js.map +1 -1
- package/dist/editor/page-editor-chrome/FrameMenu.js +6 -1
- package/dist/editor/page-editor-chrome/FrameMenu.js.map +1 -1
- package/dist/editor/page-editor-chrome/PictureEditorOverlay.js +34 -1
- package/dist/editor/page-editor-chrome/PictureEditorOverlay.js.map +1 -1
- package/dist/editor/page-editor-chrome/PlaceholderDropZone.js +6 -1
- package/dist/editor/page-editor-chrome/PlaceholderDropZone.js.map +1 -1
- package/dist/editor/page-editor-chrome/SuggestionHighlighting.js +2 -2
- package/dist/editor/page-editor-chrome/SuggestionHighlighting.js.map +1 -1
- package/dist/editor/page-viewer/DeviceToolbar.js +3 -3
- package/dist/editor/page-viewer/DeviceToolbar.js.map +1 -1
- package/dist/editor/page-viewer/PageViewerFrame.js +20 -4
- package/dist/editor/page-viewer/PageViewerFrame.js.map +1 -1
- package/dist/editor/reviews/Reviews.js +55 -54
- package/dist/editor/reviews/Reviews.js.map +1 -1
- package/dist/editor/services/agentService.d.ts +4 -3
- package/dist/editor/services/agentService.js.map +1 -1
- package/dist/editor/services/aiService.js +5 -5
- package/dist/editor/services/aiService.js.map +1 -1
- package/dist/editor/sidebar/ComponentPalette.js +3 -3
- package/dist/editor/sidebar/ComponentPalette.js.map +1 -1
- package/dist/editor/sidebar/ComponentTree.js +14 -10
- package/dist/editor/sidebar/ComponentTree.js.map +1 -1
- package/dist/editor/sidebar/DictionaryEditor.js +9 -9
- package/dist/editor/sidebar/DictionaryEditor.js.map +1 -1
- package/dist/editor/sidebar/EditHistory.js +4 -3
- package/dist/editor/sidebar/EditHistory.js.map +1 -1
- package/dist/editor/sidebar/SEOInfo.js +3 -2
- package/dist/editor/sidebar/SEOInfo.js.map +1 -1
- package/dist/editor/sidebar/SidebarView.js +5 -6
- package/dist/editor/sidebar/SidebarView.js.map +1 -1
- package/dist/editor/sidebar/Translations.js +5 -2
- package/dist/editor/sidebar/Translations.js.map +1 -1
- package/dist/editor/sidebar/Validation.js +2 -2
- package/dist/editor/sidebar/Validation.js.map +1 -1
- package/dist/editor/sidebar/ViewSelector.js +22 -5
- package/dist/editor/sidebar/ViewSelector.js.map +1 -1
- package/dist/editor/sidebar/Workbox.js +14 -13
- package/dist/editor/sidebar/Workbox.js.map +1 -1
- package/dist/editor/ui/DragPreview.d.ts +3 -2
- package/dist/editor/ui/DragPreview.js +4 -6
- package/dist/editor/ui/DragPreview.js.map +1 -1
- package/dist/editor/ui/ItemNameDialogNew.js +2 -2
- package/dist/editor/ui/ItemNameDialogNew.js.map +1 -1
- package/dist/editor/ui/PerfectTree.d.ts +4 -2
- package/dist/editor/ui/PerfectTree.js +6 -6
- package/dist/editor/ui/PerfectTree.js.map +1 -1
- package/dist/editor/ui/Section.js +3 -3
- package/dist/editor/ui/Section.js.map +1 -1
- package/dist/editor/ui/SimpleTable.js +3 -3
- package/dist/editor/ui/SimpleTable.js.map +1 -1
- package/dist/editor/ui/Splitter.js +8 -5
- package/dist/editor/ui/Splitter.js.map +1 -1
- package/dist/editor/views/ItemEditor.js +1 -1
- package/dist/editor/views/ItemEditor.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/page-wizard/WizardSteps.js +2 -3
- package/dist/page-wizard/WizardSteps.js.map +1 -1
- package/dist/page-wizard/steps/CollectStep.js +2 -2
- package/dist/page-wizard/steps/CollectStep.js.map +1 -1
- package/dist/page-wizard/steps/ContentStep.js +3 -4
- package/dist/page-wizard/steps/ContentStep.js.map +1 -1
- package/dist/page-wizard/steps/Generate.js +2 -2
- package/dist/page-wizard/steps/Generate.js.map +1 -1
- package/dist/page-wizard/steps/ImagesStep.js +17 -15
- package/dist/page-wizard/steps/ImagesStep.js.map +1 -1
- package/dist/page-wizard/steps/MetaDataStep.js +2 -2
- package/dist/page-wizard/steps/MetaDataStep.js.map +1 -1
- package/dist/page-wizard/steps/SelectStep.js +5 -5
- package/dist/page-wizard/steps/SelectStep.js.map +1 -1
- package/dist/page-wizard/steps/StructureStep.js +3 -3
- package/dist/page-wizard/steps/StructureStep.js.map +1 -1
- package/dist/page-wizard/steps/TranslateStep.js +2 -2
- package/dist/page-wizard/steps/TranslateStep.js.map +1 -1
- package/dist/revision.d.ts +2 -2
- package/dist/revision.js +2 -2
- package/dist/splash-screen/NewPage.js +2 -2
- package/dist/splash-screen/NewPage.js.map +1 -1
- package/dist/splash-screen/SectionHeadline.js +2 -2
- package/dist/splash-screen/SectionHeadline.js.map +1 -1
- package/dist/styles.css +52 -26
- package/package.json +1 -1
- package/src/components/FilterInput.tsx +13 -16
- package/src/components/ui/input.tsx +3 -2
- package/src/components/ui/textarea.tsx +3 -1
- package/src/config/config.tsx +1 -1
- package/src/editor/AspectRatioSelector.tsx +3 -3
- package/src/editor/ContentTree.tsx +51 -2
- package/src/editor/ContextMenu.tsx +30 -8
- package/src/editor/EditorWarning.tsx +6 -6
- package/src/editor/FieldEditorPopup.tsx +36 -26
- package/src/editor/FieldHistory.tsx +2 -1
- package/src/editor/FieldListField.tsx +2 -2
- package/src/editor/LinkEditorDialog.tsx +20 -0
- package/src/editor/MainLayout.tsx +3 -3
- package/src/editor/PictureCropper.tsx +3 -3
- package/src/editor/PictureEditor.tsx +3 -0
- package/src/editor/PictureEditorDialog.tsx +167 -145
- package/src/editor/Terminal.tsx +5 -6
- package/src/editor/ai/AgentTerminal.tsx +410 -87
- package/src/editor/ai/Agents.tsx +2 -2
- package/src/editor/ai/ContextInfoBar.tsx +15 -7
- package/src/editor/client/EditorShell.tsx +3 -0
- package/src/editor/client/GenericDialog.tsx +13 -9
- package/src/editor/client/editContext.ts +2 -1
- package/src/editor/client/ui/EditorChrome.tsx +8 -4
- package/src/editor/commands/localizeItem/LocalizeItemDialog.tsx +30 -11
- package/src/editor/context-menu/CopyMoveMenu.tsx +5 -3
- package/src/editor/control-center/IndexOverview.tsx +63 -34
- package/src/editor/control-center/setup-steps/SettingsSetupStep.tsx +11 -6
- package/src/editor/field-types/CheckboxEditor.tsx +2 -2
- package/src/editor/field-types/DateFieldEditor.tsx +2 -2
- package/src/editor/field-types/DateTimeFieldEditor.tsx +0 -1
- package/src/editor/field-types/ImageFieldEditor.tsx +3 -4
- package/src/editor/field-types/InternalLinkFieldEditor.tsx +2 -2
- package/src/editor/field-types/LinkFieldEditor.tsx +8 -2
- package/src/editor/field-types/MultiLineText.tsx +4 -5
- package/src/editor/field-types/PictureFieldEditor.tsx +5 -5
- package/src/editor/field-types/RawEditor.tsx +4 -5
- package/src/editor/field-types/SingleLineText.tsx +4 -6
- package/src/editor/field-types/richtext/components/ReactSlate.tsx +2 -2
- package/src/editor/field-types/richtext/components/SimpleRichTextEditor.tsx +2 -2
- package/src/editor/fieldTypes.ts +1 -0
- package/src/editor/media-selector/AiImageSearch.tsx +11 -14
- package/src/editor/media-selector/MediaFolderBrowser.tsx +42 -35
- package/src/editor/media-selector/Thumbnails.tsx +3 -3
- package/src/editor/media-selector/TreeSelector.tsx +2 -2
- package/src/editor/media-selector/UploadZone.tsx +2 -2
- package/src/editor/menubar/NavButtons.tsx +12 -14
- package/src/editor/menubar/Separator.tsx +2 -2
- package/src/editor/menubar/SiteInfo.tsx +29 -23
- package/src/editor/page-editor-chrome/CommentHighlighting.tsx +2 -2
- package/src/editor/page-editor-chrome/FieldActionIndicator.tsx +2 -2
- package/src/editor/page-editor-chrome/FrameMenu.tsx +6 -1
- package/src/editor/page-editor-chrome/PictureEditorOverlay.tsx +46 -0
- package/src/editor/page-editor-chrome/PlaceholderDropZone.tsx +6 -1
- package/src/editor/page-editor-chrome/SuggestionHighlighting.tsx +2 -2
- package/src/editor/page-viewer/DeviceToolbar.tsx +4 -3
- package/src/editor/page-viewer/PageViewerFrame.tsx +19 -3
- package/src/editor/reviews/Reviews.tsx +116 -106
- package/src/editor/services/agentService.ts +8 -3
- package/src/editor/services/aiService.ts +5 -5
- package/src/editor/sidebar/ComponentPalette.tsx +3 -3
- package/src/editor/sidebar/ComponentTree.tsx +19 -10
- package/src/editor/sidebar/DictionaryEditor.tsx +12 -13
- package/src/editor/sidebar/EditHistory.tsx +4 -3
- package/src/editor/sidebar/SEOInfo.tsx +9 -7
- package/src/editor/sidebar/SidebarView.tsx +8 -6
- package/src/editor/sidebar/Translations.tsx +9 -5
- package/src/editor/sidebar/Validation.tsx +2 -2
- package/src/editor/sidebar/ViewSelector.tsx +32 -6
- package/src/editor/sidebar/Workbox.tsx +81 -63
- package/src/editor/ui/DragPreview.tsx +10 -5
- package/src/editor/ui/ItemNameDialogNew.tsx +2 -2
- package/src/editor/ui/PerfectTree.tsx +14 -6
- package/src/editor/ui/Section.tsx +4 -4
- package/src/editor/ui/SimpleTable.tsx +3 -3
- package/src/editor/ui/Splitter.tsx +11 -5
- package/src/editor/views/ItemEditor.tsx +1 -1
- package/src/index.ts +6 -0
- package/src/page-wizard/WizardSteps.tsx +2 -3
- package/src/page-wizard/steps/CollectStep.tsx +3 -3
- package/src/page-wizard/steps/ContentStep.tsx +4 -5
- package/src/page-wizard/steps/Generate.tsx +2 -2
- package/src/page-wizard/steps/ImagesStep.tsx +43 -24
- package/src/page-wizard/steps/MetaDataStep.tsx +5 -5
- package/src/page-wizard/steps/SelectStep.tsx +8 -6
- package/src/page-wizard/steps/StructureStep.tsx +9 -8
- package/src/page-wizard/steps/TranslateStep.tsx +5 -3
- package/src/revision.ts +2 -2
- package/src/splash-screen/NewPage.tsx +2 -2
- package/src/splash-screen/SectionHeadline.tsx +4 -4
- package/dist/editor/component-designer/ComponentDesigner.d.ts +0 -1
- package/dist/editor/component-designer/ComponentDesigner.js +0 -51
- package/dist/editor/component-designer/ComponentDesigner.js.map +0 -1
- package/dist/editor/component-designer/ComponentDesignerMenu.d.ts +0 -1
- package/dist/editor/component-designer/ComponentDesignerMenu.js +0 -65
- package/dist/editor/component-designer/ComponentDesignerMenu.js.map +0 -1
- package/dist/editor/component-designer/ComponentEditor.d.ts +0 -4
- package/dist/editor/component-designer/ComponentEditor.js +0 -55
- package/dist/editor/component-designer/ComponentEditor.js.map +0 -1
- package/dist/editor/component-designer/ComponentRenderingCodeEditor.d.ts +0 -5
- package/dist/editor/component-designer/ComponentRenderingCodeEditor.js +0 -11
- package/dist/editor/component-designer/ComponentRenderingCodeEditor.js.map +0 -1
- package/dist/editor/component-designer/ComponentRenderingEditor.d.ts +0 -1
- package/dist/editor/component-designer/ComponentRenderingEditor.js +0 -69
- package/dist/editor/component-designer/ComponentRenderingEditor.js.map +0 -1
- package/dist/editor/component-designer/ComponentsDropdown.d.ts +0 -4
- package/dist/editor/component-designer/ComponentsDropdown.js +0 -20
- package/dist/editor/component-designer/ComponentsDropdown.js.map +0 -1
- package/dist/editor/component-designer/PlaceholdersEditor.d.ts +0 -4
- package/dist/editor/component-designer/PlaceholdersEditor.js +0 -63
- package/dist/editor/component-designer/PlaceholdersEditor.js.map +0 -1
- package/dist/editor/component-designer/RenderingsDropdown.d.ts +0 -1
- package/dist/editor/component-designer/RenderingsDropdown.js +0 -23
- package/dist/editor/component-designer/RenderingsDropdown.js.map +0 -1
- package/dist/editor/component-designer/TemplateEditor.d.ts +0 -1
- package/dist/editor/component-designer/TemplateEditor.js +0 -142
- package/dist/editor/component-designer/TemplateEditor.js.map +0 -1
- package/dist/editor/component-designer/aiContext.d.ts +0 -5
- package/dist/editor/component-designer/aiContext.js +0 -14
- package/dist/editor/component-designer/aiContext.js.map +0 -1
- package/src/editor/component-designer/ComponentDesigner.tsx +0 -66
- package/src/editor/component-designer/ComponentDesignerMenu.tsx +0 -91
- package/src/editor/component-designer/ComponentEditor.tsx +0 -95
- package/src/editor/component-designer/ComponentRenderingCodeEditor.tsx +0 -31
- package/src/editor/component-designer/ComponentRenderingEditor.tsx +0 -104
- package/src/editor/component-designer/ComponentsDropdown.tsx +0 -39
- package/src/editor/component-designer/PlaceholdersEditor.tsx +0 -179
- package/src/editor/component-designer/RenderingsDropdown.tsx +0 -36
- package/src/editor/component-designer/TemplateEditor.tsx +0 -236
- package/src/editor/component-designer/aiContext.ts +0 -21
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Terminal.js","sourceRoot":"","sources":["../../src/editor/Terminal.tsx"],"names":[],"mappings":";AAAA,OAAc,EACZ,UAAU,EACV,SAAS,EACT,MAAM,EACN,QAAQ,EACR,mBAAmB,GACpB,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"Terminal.js","sourceRoot":"","sources":["../../src/editor/Terminal.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import React, { useEffect, useState, useRef, useCallback, useLayoutEffect, } from "react";
|
|
3
|
-
import { Send, AlertCircle, Loader2, User, Wand2, Square } from "lucide-react";
|
|
3
|
+
import { Send, AlertCircle, Loader2, User, Wand2, Square, Mic, MicOff, } from "lucide-react";
|
|
4
4
|
import { DancingDots } from "./DancingDots";
|
|
5
5
|
import { getAgent, startAgent, connectToAgentStream, updateAgentMetadata, updateAgentSettings, updateAgentCostLimit, } from "../services/agentService";
|
|
6
6
|
import { useEditContext, useFieldsEditContext } from "../client/editContext";
|
|
@@ -13,6 +13,7 @@ import { getComponentById } from "../componentTreeHelper";
|
|
|
13
13
|
import { Popover, PopoverContent, PopoverTrigger, } from "../../components/ui/popover";
|
|
14
14
|
import { SecretAgentIcon } from "../ui/Icons";
|
|
15
15
|
import { formatTime } from "../utils";
|
|
16
|
+
import { Tooltip, TooltipTrigger, TooltipContent, } from "../../components/ui/tooltip";
|
|
16
17
|
// Simple user message component
|
|
17
18
|
const UserMessage = ({ message }) => {
|
|
18
19
|
return (_jsxs("div", { className: "flex gap-3 p-4", children: [_jsx("div", { className: "flex-shrink-0", children: _jsx(User, { className: "h-6 w-6 text-blue-600", strokeWidth: 1 }) }), _jsxs("div", { className: "min-w-0 flex-1 select-text", children: [_jsxs("div", { className: "mb-1 flex items-center gap-2", children: [_jsx("span", { className: "text-xs font-medium text-gray-900", children: "You" }), message.createdDate && (_jsx("span", { className: "text-xs text-gray-400", children: formatTime(new Date(message.createdDate)) }))] }), _jsx("div", { className: "prose prose-sm max-w-none text-xs text-gray-700 select-text", children: message.content })] })] }));
|
|
@@ -115,6 +116,12 @@ export function AgentTerminal({ agentStub, initialMetadata, profiles, }) {
|
|
|
115
116
|
const [isConnecting, setIsConnecting] = useState(false);
|
|
116
117
|
const [isSubmitting, setIsSubmitting] = useState(false);
|
|
117
118
|
const [agentMetadata, setAgentMetadata] = useState(null);
|
|
119
|
+
// Voice input state
|
|
120
|
+
const [isVoiceSupported, setIsVoiceSupported] = useState(false);
|
|
121
|
+
const [isListening, setIsListening] = useState(false);
|
|
122
|
+
const recognitionRef = useRef(null);
|
|
123
|
+
const prevPlaceholderRef = useRef(null);
|
|
124
|
+
const [voiceError, setVoiceError] = useState(null);
|
|
118
125
|
const [isWaitingForResponse, setIsWaitingForResponse] = useState(false);
|
|
119
126
|
const isWaitingRef = useRef(false);
|
|
120
127
|
useEffect(() => {
|
|
@@ -161,7 +168,7 @@ export function AgentTerminal({ agentStub, initialMetadata, profiles, }) {
|
|
|
161
168
|
const [showPredefined, setShowPredefined] = useState(false);
|
|
162
169
|
const [activeProfile, setActiveProfile] = useState(undefined);
|
|
163
170
|
const [selectedModelId, setSelectedModelId] = useState(undefined);
|
|
164
|
-
const [mode, setMode] = useState("
|
|
171
|
+
const [mode, setMode] = useState("restricted");
|
|
165
172
|
// Read deterministic flags from query string once
|
|
166
173
|
const deterministicFlags = React.useMemo(() => {
|
|
167
174
|
try {
|
|
@@ -221,6 +228,127 @@ export function AgentTerminal({ agentStub, initialMetadata, profiles, }) {
|
|
|
221
228
|
// Jump precisely to the bottom to avoid ending slightly above due to smooth scrolling animations
|
|
222
229
|
container.scrollTop = container.scrollHeight;
|
|
223
230
|
}, []);
|
|
231
|
+
// Detect speech recognition support (client-only)
|
|
232
|
+
useEffect(() => {
|
|
233
|
+
try {
|
|
234
|
+
if (typeof window === "undefined")
|
|
235
|
+
return;
|
|
236
|
+
const SR = window.SpeechRecognition ||
|
|
237
|
+
window.webkitSpeechRecognition;
|
|
238
|
+
setIsVoiceSupported(!!SR);
|
|
239
|
+
}
|
|
240
|
+
catch {
|
|
241
|
+
setIsVoiceSupported(false);
|
|
242
|
+
}
|
|
243
|
+
}, []);
|
|
244
|
+
// Start voice recognition
|
|
245
|
+
const startVoice = useCallback(() => {
|
|
246
|
+
try {
|
|
247
|
+
if (isListening)
|
|
248
|
+
return;
|
|
249
|
+
if (typeof window === "undefined")
|
|
250
|
+
return;
|
|
251
|
+
const SR = window.SpeechRecognition ||
|
|
252
|
+
window.webkitSpeechRecognition;
|
|
253
|
+
if (!SR) {
|
|
254
|
+
setVoiceError("Voice input is not supported in this browser");
|
|
255
|
+
return;
|
|
256
|
+
}
|
|
257
|
+
const r = new SR();
|
|
258
|
+
r.lang = editContext?.currentItemDescriptor?.language || "en-US";
|
|
259
|
+
r.continuous = true;
|
|
260
|
+
r.interimResults = true;
|
|
261
|
+
r.onstart = () => {
|
|
262
|
+
setIsListening(true);
|
|
263
|
+
prevPlaceholderRef.current = inputPlaceholder;
|
|
264
|
+
setVoiceError(null);
|
|
265
|
+
setInputPlaceholder("Listening...");
|
|
266
|
+
};
|
|
267
|
+
r.onresult = (event) => {
|
|
268
|
+
let finalText = "";
|
|
269
|
+
let interimText = "";
|
|
270
|
+
for (let i = event.resultIndex; i < event.results.length; i++) {
|
|
271
|
+
const res = event.results[i];
|
|
272
|
+
if (res.isFinal)
|
|
273
|
+
finalText += res[0]?.transcript || "";
|
|
274
|
+
else
|
|
275
|
+
interimText += res[0]?.transcript || "";
|
|
276
|
+
}
|
|
277
|
+
if (interimText) {
|
|
278
|
+
setInputPlaceholder(`Listening... ${interimText.trim()}`);
|
|
279
|
+
}
|
|
280
|
+
else {
|
|
281
|
+
setInputPlaceholder("Listening...");
|
|
282
|
+
}
|
|
283
|
+
if (finalText && finalText.trim()) {
|
|
284
|
+
setPrompt((prev) => {
|
|
285
|
+
const prefix = prev && !prev.endsWith(" ") ? prev + " " : prev;
|
|
286
|
+
return (prefix || "") + finalText.trim() + " ";
|
|
287
|
+
});
|
|
288
|
+
if (textareaRef.current) {
|
|
289
|
+
try {
|
|
290
|
+
const v = textareaRef.current.value || "";
|
|
291
|
+
textareaRef.current.selectionStart = v.length;
|
|
292
|
+
textareaRef.current.selectionEnd = v.length;
|
|
293
|
+
}
|
|
294
|
+
catch { }
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
};
|
|
298
|
+
r.onerror = (e) => {
|
|
299
|
+
console.warn("Speech recognition error", e);
|
|
300
|
+
setVoiceError(e?.error || "Voice input error");
|
|
301
|
+
};
|
|
302
|
+
r.onend = () => {
|
|
303
|
+
setIsListening(false);
|
|
304
|
+
if (prevPlaceholderRef.current !== null) {
|
|
305
|
+
setInputPlaceholder(prevPlaceholderRef.current);
|
|
306
|
+
prevPlaceholderRef.current = null;
|
|
307
|
+
}
|
|
308
|
+
recognitionRef.current = null;
|
|
309
|
+
};
|
|
310
|
+
recognitionRef.current = r;
|
|
311
|
+
r.start();
|
|
312
|
+
}
|
|
313
|
+
catch (e) {
|
|
314
|
+
console.error("Failed to start voice input", e);
|
|
315
|
+
setVoiceError("Failed to start voice input");
|
|
316
|
+
}
|
|
317
|
+
}, [
|
|
318
|
+
editContext?.currentItemDescriptor?.language,
|
|
319
|
+
inputPlaceholder,
|
|
320
|
+
isListening,
|
|
321
|
+
]);
|
|
322
|
+
const stopVoice = useCallback(() => {
|
|
323
|
+
try {
|
|
324
|
+
const r = recognitionRef.current;
|
|
325
|
+
if (r)
|
|
326
|
+
r.stop();
|
|
327
|
+
}
|
|
328
|
+
catch { }
|
|
329
|
+
}, []);
|
|
330
|
+
const toggleVoice = useCallback(() => {
|
|
331
|
+
if (isListening)
|
|
332
|
+
stopVoice();
|
|
333
|
+
else
|
|
334
|
+
startVoice();
|
|
335
|
+
}, [isListening, startVoice, stopVoice]);
|
|
336
|
+
// Cleanup any active recognition on unmount
|
|
337
|
+
useEffect(() => {
|
|
338
|
+
return () => {
|
|
339
|
+
try {
|
|
340
|
+
const r = recognitionRef.current;
|
|
341
|
+
if (r) {
|
|
342
|
+
r.onresult = null;
|
|
343
|
+
r.onerror = null;
|
|
344
|
+
r.onend = null;
|
|
345
|
+
r.stop();
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
catch { }
|
|
349
|
+
recognitionRef.current = null;
|
|
350
|
+
};
|
|
351
|
+
}, []);
|
|
224
352
|
// Check if user is at the bottom of the scroll container
|
|
225
353
|
const isAtBottom = useCallback(() => {
|
|
226
354
|
const container = messagesContainerRef.current;
|
|
@@ -329,7 +457,17 @@ export function AgentTerminal({ agentStub, initialMetadata, profiles, }) {
|
|
|
329
457
|
}, [createNewStreamMessage]);
|
|
330
458
|
const handleToolCall = useCallback((message, agentData) => {
|
|
331
459
|
const toolCallId = message.data?.toolCallId || message.data?.id || crypto.randomUUID();
|
|
332
|
-
|
|
460
|
+
// Prefer provided messageId, otherwise fall back to the last streaming assistant message
|
|
461
|
+
let toolCallMessageId = message.data?.messageId;
|
|
462
|
+
if (!toolCallMessageId) {
|
|
463
|
+
const current = messagesRef.current;
|
|
464
|
+
const lastStreaming = [...current]
|
|
465
|
+
.reverse()
|
|
466
|
+
.find((m) => m.role === "assistant" && !m.isCompleted);
|
|
467
|
+
if (lastStreaming?.id) {
|
|
468
|
+
toolCallMessageId = lastStreaming.id;
|
|
469
|
+
}
|
|
470
|
+
}
|
|
333
471
|
// Find or create the target message for this tool call
|
|
334
472
|
if (toolCallMessageId) {
|
|
335
473
|
const currentMessages = messagesRef.current;
|
|
@@ -404,10 +542,20 @@ export function AgentTerminal({ agentStub, initialMetadata, profiles, }) {
|
|
|
404
542
|
}, [createNewStreamMessage]);
|
|
405
543
|
const handleToolResult = useCallback((message, agentData) => {
|
|
406
544
|
const resultToolCallId = message.data?.toolCallId || message.data?.id || crypto.randomUUID();
|
|
407
|
-
|
|
545
|
+
// Prefer provided messageId, otherwise fall back to the last streaming assistant message
|
|
546
|
+
let resultMessageId = message.data?.messageId;
|
|
547
|
+
if (!resultMessageId) {
|
|
548
|
+
const current = messagesRef.current;
|
|
549
|
+
const lastStreaming = [...current]
|
|
550
|
+
.reverse()
|
|
551
|
+
.find((m) => m.role === "assistant" && !m.isCompleted);
|
|
552
|
+
if (lastStreaming?.id) {
|
|
553
|
+
resultMessageId = lastStreaming.id;
|
|
554
|
+
}
|
|
555
|
+
}
|
|
408
556
|
// Update tool result directly in the messages array
|
|
409
557
|
if (!resultMessageId) {
|
|
410
|
-
console.warn("⚠️ No messageId
|
|
558
|
+
console.warn("⚠️ No messageId available for tool result");
|
|
411
559
|
return;
|
|
412
560
|
}
|
|
413
561
|
console.log("📋 Updating tool result in message:", resultMessageId);
|
|
@@ -504,6 +652,73 @@ export function AgentTerminal({ agentStub, initialMetadata, profiles, }) {
|
|
|
504
652
|
handleToolResult(message, currentAgent);
|
|
505
653
|
break;
|
|
506
654
|
case "statusUpdate":
|
|
655
|
+
try {
|
|
656
|
+
const kind = message?.data?.kind;
|
|
657
|
+
if (kind === "contextWindow") {
|
|
658
|
+
const data = message.data || {};
|
|
659
|
+
// Store last context window status in a ref so we can render it below
|
|
660
|
+
window.__agentContextWindowStatus = {
|
|
661
|
+
model: data.model,
|
|
662
|
+
normalizedModel: data.normalizedModel,
|
|
663
|
+
contextWindowTokens: data.contextWindowTokens,
|
|
664
|
+
maxCompletionTokens: data.maxCompletionTokens,
|
|
665
|
+
estimatedInputTokens: data.estimatedInputTokens,
|
|
666
|
+
messageCount: data.messageCount,
|
|
667
|
+
contextUsedPercent: data.contextUsedPercent,
|
|
668
|
+
};
|
|
669
|
+
// Force a re-render by toggling state (cheap no-op)
|
|
670
|
+
setMessages((prev) => [...prev]);
|
|
671
|
+
}
|
|
672
|
+
else if (kind === "contextChanged") {
|
|
673
|
+
const data = message.data || {};
|
|
674
|
+
const nextContext = data.context || {};
|
|
675
|
+
// Merge incoming context into local metadata
|
|
676
|
+
setAgentMetadata((prev) => {
|
|
677
|
+
const current = (prev || {});
|
|
678
|
+
const next = {
|
|
679
|
+
...current,
|
|
680
|
+
additionalData: {
|
|
681
|
+
...(current.additionalData || {}),
|
|
682
|
+
context: nextContext,
|
|
683
|
+
},
|
|
684
|
+
};
|
|
685
|
+
return next;
|
|
686
|
+
});
|
|
687
|
+
// Also reflect in agent metadata string for consistency
|
|
688
|
+
setAgent((prevAgent) => {
|
|
689
|
+
if (!prevAgent)
|
|
690
|
+
return prevAgent;
|
|
691
|
+
try {
|
|
692
|
+
const currentMeta = (() => {
|
|
693
|
+
try {
|
|
694
|
+
return prevAgent.metadata
|
|
695
|
+
? JSON.parse(prevAgent.metadata)
|
|
696
|
+
: null;
|
|
697
|
+
}
|
|
698
|
+
catch {
|
|
699
|
+
return null;
|
|
700
|
+
}
|
|
701
|
+
})();
|
|
702
|
+
const nextMeta = {
|
|
703
|
+
...(currentMeta || {}),
|
|
704
|
+
additionalData: {
|
|
705
|
+
...(currentMeta?.additionalData ||
|
|
706
|
+
{}),
|
|
707
|
+
context: nextContext,
|
|
708
|
+
},
|
|
709
|
+
};
|
|
710
|
+
return {
|
|
711
|
+
...prevAgent,
|
|
712
|
+
metadata: JSON.stringify(nextMeta),
|
|
713
|
+
};
|
|
714
|
+
}
|
|
715
|
+
catch {
|
|
716
|
+
return prevAgent;
|
|
717
|
+
}
|
|
718
|
+
});
|
|
719
|
+
}
|
|
720
|
+
}
|
|
721
|
+
catch { }
|
|
507
722
|
break;
|
|
508
723
|
case "completed":
|
|
509
724
|
const completedMessageId = message.data?.messageId;
|
|
@@ -793,25 +1008,32 @@ export function AgentTerminal({ agentStub, initialMetadata, profiles, }) {
|
|
|
793
1008
|
if (localCtx?.additionalData?.context) {
|
|
794
1009
|
const ctx = base.additionalData.context;
|
|
795
1010
|
const local = localCtx.additionalData.context;
|
|
1011
|
+
// Normalize existing shape: migrate items -> pages if needed
|
|
1012
|
+
if (!ctx.pages && ctx.items) {
|
|
1013
|
+
ctx.pages = ctx.items;
|
|
1014
|
+
delete ctx.items;
|
|
1015
|
+
}
|
|
796
1016
|
// Merge pages (avoid duplicates)
|
|
797
|
-
if (local.pages && local.pages.length)
|
|
798
|
-
|
|
799
|
-
const
|
|
800
|
-
...
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
1017
|
+
if ((local.pages && local.pages.length) ||
|
|
1018
|
+
(local.items && local.items.length)) {
|
|
1019
|
+
const targetPages = Array.isArray(ctx.pages)
|
|
1020
|
+
? [...ctx.pages]
|
|
1021
|
+
: [];
|
|
1022
|
+
const existingKeys = new Set(targetPages.map((p) => `${p.id}-${p.language || ""}-${p.version || ""}`));
|
|
1023
|
+
const incoming = (local.pages || local.items);
|
|
1024
|
+
const additions = incoming.filter((p) => !existingKeys.has(`${p.id}-${p.language || ""}-${p.version || ""}`));
|
|
1025
|
+
if (additions.length)
|
|
1026
|
+
ctx.pages = [...targetPages, ...additions];
|
|
805
1027
|
}
|
|
806
|
-
// Merge componentIds
|
|
1028
|
+
// Merge componentIds (avoid duplicates)
|
|
807
1029
|
if (local.componentIds && local.componentIds.length) {
|
|
808
|
-
const
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
if (
|
|
814
|
-
ctx.componentIds =
|
|
1030
|
+
const currentIds = Array.isArray(ctx.componentIds)
|
|
1031
|
+
? ctx.componentIds
|
|
1032
|
+
: [];
|
|
1033
|
+
const existingIds = new Set(currentIds);
|
|
1034
|
+
const additions = local.componentIds.filter((id) => !!id && !existingIds.has(id));
|
|
1035
|
+
if (additions.length)
|
|
1036
|
+
ctx.componentIds = [...currentIds, ...additions];
|
|
815
1037
|
}
|
|
816
1038
|
// Set field if missing
|
|
817
1039
|
if (!ctx.field && local.field) {
|
|
@@ -960,7 +1182,9 @@ export function AgentTerminal({ agentStub, initialMetadata, profiles, }) {
|
|
|
960
1182
|
useEffect(() => {
|
|
961
1183
|
try {
|
|
962
1184
|
const metaMode = agentMetadata?.mode;
|
|
963
|
-
if (metaMode === "agent" ||
|
|
1185
|
+
if (metaMode === "agent" ||
|
|
1186
|
+
metaMode === "ask" ||
|
|
1187
|
+
metaMode === "restricted") {
|
|
964
1188
|
setMode(metaMode);
|
|
965
1189
|
return;
|
|
966
1190
|
}
|
|
@@ -968,7 +1192,9 @@ export function AgentTerminal({ agentStub, initialMetadata, profiles, }) {
|
|
|
968
1192
|
catch { }
|
|
969
1193
|
try {
|
|
970
1194
|
const serverMode = agent?.mode;
|
|
971
|
-
if (serverMode === "agent" ||
|
|
1195
|
+
if (serverMode === "agent" ||
|
|
1196
|
+
serverMode === "ask" ||
|
|
1197
|
+
serverMode === "restricted") {
|
|
972
1198
|
setMode(serverMode);
|
|
973
1199
|
}
|
|
974
1200
|
}
|
|
@@ -1109,6 +1335,7 @@ export function AgentTerminal({ agentStub, initialMetadata, profiles, }) {
|
|
|
1109
1335
|
addSelectedComponents: !!effectiveSelection?.length,
|
|
1110
1336
|
addContextContent: false,
|
|
1111
1337
|
addAllContent: false,
|
|
1338
|
+
context: agentMetadata?.additionalData?.context,
|
|
1112
1339
|
deterministic: deterministicFlags.deterministic,
|
|
1113
1340
|
seed: deterministicFlags.seed,
|
|
1114
1341
|
};
|
|
@@ -1267,6 +1494,7 @@ export function AgentTerminal({ agentStub, initialMetadata, profiles, }) {
|
|
|
1267
1494
|
addSelectedComponents: !!effectiveSelection?.length,
|
|
1268
1495
|
addContextContent: false,
|
|
1269
1496
|
addAllContent: false,
|
|
1497
|
+
context: agentMetadata?.additionalData?.context,
|
|
1270
1498
|
deterministic: deterministicFlags.deterministic,
|
|
1271
1499
|
seed: deterministicFlags.seed,
|
|
1272
1500
|
};
|
|
@@ -1816,35 +2044,39 @@ export function AgentTerminal({ agentStub, initialMetadata, profiles, }) {
|
|
|
1816
2044
|
if (currentHistoryIndex !== -1) {
|
|
1817
2045
|
setCurrentHistoryIndex(-1);
|
|
1818
2046
|
}
|
|
1819
|
-
}, onKeyDown: handleKeyPress, placeholder: inputPlaceholder, className: "h-[80px] flex-1 resize-none overflow-y-auto text-xs", "data-testid": "agent-terminal-prompt", disabled: isSubmitting }) }), _jsxs("div", { className: "flex items-stretch justify-between gap-2", children: [_jsxs("div", { className: "mt-2 flex items-center justify-start gap-2", children: [_jsxs("select", { className:
|
|
1820
|
-
|
|
1821
|
-
|
|
1822
|
-
|
|
1823
|
-
|
|
1824
|
-
|
|
1825
|
-
|
|
1826
|
-
|
|
1827
|
-
|
|
1828
|
-
|
|
1829
|
-
|
|
1830
|
-
|
|
1831
|
-
|
|
1832
|
-
|
|
1833
|
-
|
|
1834
|
-
|
|
1835
|
-
|
|
1836
|
-
|
|
1837
|
-
|
|
1838
|
-
|
|
1839
|
-
|
|
1840
|
-
|
|
1841
|
-
|
|
1842
|
-
|
|
1843
|
-
|
|
1844
|
-
|
|
1845
|
-
|
|
1846
|
-
|
|
1847
|
-
|
|
2047
|
+
}, onKeyDown: handleKeyPress, placeholder: inputPlaceholder, className: "h-[80px] flex-1 resize-none overflow-y-auto text-xs", "data-testid": "agent-terminal-prompt", disabled: isSubmitting }) }), _jsxs("div", { className: "flex items-stretch justify-between gap-2", children: [_jsxs("div", { className: "mt-2 flex items-center justify-start gap-2", children: [_jsxs(Tooltip, { delayDuration: 400, children: [_jsx(TooltipTrigger, { asChild: true, children: _jsxs("select", { className: `h-5 rounded border px-1.5 text-[10px] ${mode === "ask"
|
|
2048
|
+
? "border-green-300 bg-green-50 text-green-700"
|
|
2049
|
+
: mode === "restricted"
|
|
2050
|
+
? "border-amber-300 bg-amber-50 text-amber-700"
|
|
2051
|
+
: "border-red-300 bg-red-50 text-red-700"}`, value: mode, onChange: async (e) => {
|
|
2052
|
+
const nextMode = e.target.value || "agent";
|
|
2053
|
+
// Optimistic UI update
|
|
2054
|
+
setMode(nextMode);
|
|
2055
|
+
const current = agentMetadata || {};
|
|
2056
|
+
const nextMeta = {
|
|
2057
|
+
...current,
|
|
2058
|
+
mode: nextMode,
|
|
2059
|
+
};
|
|
2060
|
+
try {
|
|
2061
|
+
if (!agent?.id || agent.status === "new") {
|
|
2062
|
+
setAgentMetadata(nextMeta);
|
|
2063
|
+
// Cache until first start when agent is persisted
|
|
2064
|
+
pendingSettingsRef.current = {
|
|
2065
|
+
...(pendingSettingsRef.current || {}),
|
|
2066
|
+
mode: nextMode,
|
|
2067
|
+
};
|
|
2068
|
+
return;
|
|
2069
|
+
}
|
|
2070
|
+
await updateAgentSettings(agent.id, { mode: nextMode });
|
|
2071
|
+
setAgentMetadata(nextMeta);
|
|
2072
|
+
setAgent((prev) => prev
|
|
2073
|
+
? { ...prev, metadata: JSON.stringify(nextMeta) }
|
|
2074
|
+
: prev);
|
|
2075
|
+
}
|
|
2076
|
+
catch (e2) {
|
|
2077
|
+
console.error("Failed to persist mode change", e2);
|
|
2078
|
+
}
|
|
2079
|
+
}, title: "Mode", "aria-label": "Mode", "data-testid": "agent-mode-select", children: [_jsx("option", { value: "restricted", children: "Restricted" }), _jsx("option", { value: "agent", children: "Agent" }), _jsx("option", { value: "ask", children: "Ask" })] }) }), _jsx(TooltipContent, { side: "top", sideOffset: 6, children: _jsxs("div", { className: "max-w-[320px] space-y-1", children: [_jsxs("div", { children: [_jsx("span", { className: "font-semibold", children: "Restricted" }), ": Same as Agent, but writes are limited to pages/items in the current context."] }), _jsxs("div", { children: [_jsx("span", { className: "font-semibold", children: "Agent" }), ": Full tool access; can write across the site/project."] }), _jsxs("div", { children: [_jsx("span", { className: "font-semibold", children: "Ask" }), ": Limited tool access as configured by the profile (Ask Mode Tools)."] })] }) })] }), profiles?.length > 0 && (_jsx("select", { className: "h-5 rounded border px-1.5 text-[10px] text-gray-500", value: activeProfile?.id || "", onChange: (e) => {
|
|
1848
2080
|
const p = profiles.find((x) => x.id === e.target.value);
|
|
1849
2081
|
if (p)
|
|
1850
2082
|
setActiveProfile(p);
|
|
@@ -1875,6 +2107,19 @@ export function AgentTerminal({ agentStub, initialMetadata, profiles, }) {
|
|
|
1875
2107
|
setShowPredefined(false);
|
|
1876
2108
|
if (textareaRef.current)
|
|
1877
2109
|
textareaRef.current.focus();
|
|
1878
|
-
}, children: p.title }, index))) }) })] })) : null, _jsx(
|
|
2110
|
+
}, children: p.title }, index))) }) })] })) : null] }), _jsxs("div", { className: "flex items-center gap-1 self-end", children: [isVoiceSupported ? (_jsx(Button, { onClick: toggleVoice, size: "sm", className: "h-5.5 w-5.5 cursor-pointer rounded-full", title: isListening ? "Stop voice input" : "Start voice input", "aria-label": isListening ? "Stop voice input" : "Start voice input", "aria-pressed": isListening, children: isListening ? (_jsx(MicOff, { className: "size-3", strokeWidth: 1 })) : (_jsx(Mic, { className: "size-3", strokeWidth: 1 })) })) : null, _jsx(Button, { onClick: isExecuting ? handleStop : handleSubmit, disabled: !isExecuting && !prompt.trim(), size: "sm", className: "h-5.5 w-5.5 cursor-pointer rounded-full", title: isExecuting ? "Stop" : "Send", "aria-label": isExecuting ? "Stop" : "Send", "data-testid": "agent-send-stop-button", "data-executing": isExecuting ? "true" : "false", children: isExecuting ? (_jsx(Square, { className: "size-3", strokeWidth: 1 })) : (_jsx(Send, { className: "size-3", strokeWidth: 1 })) })] })] }), _jsx("div", { className: "mt-1 flex justify-start", children: _jsx(AgentCostDisplay, { totalTokens: totalTokens }) }), _jsx("div", { className: "mt-1 flex items-center gap-2 text-[10px] text-gray-500", children: (() => {
|
|
2111
|
+
try {
|
|
2112
|
+
const s = window.__agentContextWindowStatus;
|
|
2113
|
+
if (!s || !s.contextWindowTokens)
|
|
2114
|
+
return null;
|
|
2115
|
+
const pct = typeof s.contextUsedPercent === "number"
|
|
2116
|
+
? `${s.contextUsedPercent.toFixed(1)}%`
|
|
2117
|
+
: undefined;
|
|
2118
|
+
return (_jsxs("div", { className: "rounded border border-gray-200 bg-gray-50 px-2 py-0.5", children: [_jsxs("span", { title: `Model: ${s.model} (${s.normalizedModel || ""})`, children: ["Context window: ", s.estimatedInputTokens || 0, " /", " ", s.contextWindowTokens] }), typeof s.maxCompletionTokens === "number" && (_jsxs("span", { children: [" \u00B7 Max completion: ", s.maxCompletionTokens] })), pct && _jsxs("span", { children: [" \u00B7 Used: ", pct] })] }));
|
|
2119
|
+
}
|
|
2120
|
+
catch {
|
|
2121
|
+
return null;
|
|
2122
|
+
}
|
|
2123
|
+
})() })] })] }));
|
|
1879
2124
|
}
|
|
1880
2125
|
//# sourceMappingURL=AgentTerminal.js.map
|