@adecore/agents-react 0.31.11 → 0.32.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agents/AccountDot.js +57 -6
- package/dist/agents/AgentIcon.js +88 -12
- package/dist/agents/ModelOptionControl.js +153 -18
- package/dist/agents/ProviderLogo.js +49 -4
- package/dist/agents/account-limits.js +17 -14
- package/dist/agents/accounts.js +99 -67
- package/dist/agents/agent-marks.js +5 -3
- package/dist/agents/model-name.js +42 -31
- package/dist/agents/model-options.js +8 -8
- package/dist/agents/model-requirement.js +17 -14
- package/dist/agents/option-words.d.ts +7 -0
- package/dist/agents/option-words.js +35 -0
- package/dist/agents/provider-paths.js +6 -6
- package/dist/agents/status-look.js +32 -12
- package/dist/chat/account-choice.d.ts +13 -0
- package/dist/chat/account-choice.js +90 -20
- package/dist/chat/actions.js +126 -59
- package/dist/chat/activity.js +5 -5
- package/dist/chat/attachments.js +74 -53
- package/dist/chat/bookmarks.js +58 -48
- package/dist/chat/chat-client.js +344 -263
- package/dist/chat/chat-references.js +3 -3
- package/dist/chat/composer-effort.d.ts +5 -0
- package/dist/chat/composer-effort.js +26 -0
- package/dist/chat/composer-send.js +13 -13
- package/dist/chat/drafts.js +115 -79
- package/dist/chat/forks.js +81 -24
- package/dist/chat/guards.js +15 -43
- package/dist/chat/index.d.ts +3 -1
- package/dist/chat/index.js +3 -2
- package/dist/chat/logic/ansi.js +170 -167
- package/dist/chat/logic/answers.js +2 -2
- package/dist/chat/logic/bookmarks.js +19 -19
- package/dist/chat/logic/command-looks.js +138 -96
- package/dist/chat/logic/context-usage.js +13 -9
- package/dist/chat/logic/continue-after-stop.js +15 -19
- package/dist/chat/logic/effort.d.ts +14 -0
- package/dist/chat/logic/effort.js +34 -0
- package/dist/chat/logic/embedded-code.js +387 -326
- package/dist/chat/logic/fork.js +134 -110
- package/dist/chat/logic/generated-image.js +54 -23
- package/dist/chat/logic/goal.js +28 -20
- package/dist/chat/logic/handback.js +6 -6
- package/dist/chat/logic/json.js +2 -2
- package/dist/chat/logic/limit.js +46 -30
- package/dist/chat/logic/picker-entries.d.ts +5 -3
- package/dist/chat/logic/picker-entries.js +83 -43
- package/dist/chat/logic/resume-compaction.d.ts +14 -1
- package/dist/chat/logic/resume-compaction.js +93 -24
- package/dist/chat/logic/scrubber.js +188 -136
- package/dist/chat/logic/thought.js +13 -16
- package/dist/chat/logic/thread-cards.js +60 -48
- package/dist/chat/logic/timeline-copy.js +30 -38
- package/dist/chat/logic/timeline-target.js +92 -63
- package/dist/chat/logic/timeline.js +499 -355
- package/dist/chat/logic/tool-catalog.js +54 -34
- package/dist/chat/logic/tools.js +106 -82
- package/dist/chat/logic/visual-height.js +18 -18
- package/dist/chat/logic/visual-viewport.js +6 -3
- package/dist/chat/logic/welcome.js +9 -9
- package/dist/chat/logic/workflow.js +45 -34
- package/dist/chat/mentions.js +149 -109
- package/dist/chat/persisted-json.js +51 -54
- package/dist/chat/preferences.d.ts +4 -0
- package/dist/chat/preferences.js +162 -84
- package/dist/chat/prompt-hold.js +9 -9
- package/dist/chat/quote.js +21 -30
- package/dist/chat/reading-width.js +12 -10
- package/dist/chat/recent-messages.js +34 -21
- package/dist/chat/resume-compaction-dismissals.js +25 -5
- package/dist/chat/runtime-modes.js +3 -3
- package/dist/chat/send-key.js +11 -7
- package/dist/chat/stash.js +89 -69
- package/dist/chat/subagent-conversation.js +181 -139
- package/dist/chat/subagent-list.js +65 -67
- package/dist/chat/subagent-support.js +12 -7
- package/dist/chat/subagent-view.js +132 -44
- package/dist/chat/thumbnails.js +88 -60
- package/dist/chat/timeline-flash.js +24 -12
- package/dist/chat/timeline-scroll.js +116 -86
- package/dist/chat/ui/AccountPill.js +126 -15
- package/dist/chat/ui/AnsiOutput.js +62 -6
- package/dist/chat/ui/BookmarkMarker.js +231 -41
- package/dist/chat/ui/BookmarkSubmenu.js +165 -18
- package/dist/chat/ui/ChatActivity.js +649 -70
- package/dist/chat/ui/ChatReferenceChip.js +104 -9
- package/dist/chat/ui/CodeBlock.js +132 -58
- package/dist/chat/ui/Composer.js +866 -132
- package/dist/chat/ui/ComposerInput.js +309 -120
- package/dist/chat/ui/DiffPool.js +75 -14
- package/dist/chat/ui/EditDiff.js +160 -21
- package/dist/chat/ui/FadingWords.js +32 -3
- package/dist/chat/ui/GoalDock.js +235 -42
- package/dist/chat/ui/ImageView.js +617 -61
- package/dist/chat/ui/LimitState.js +446 -72
- package/dist/chat/ui/Markdown.js +991 -173
- package/dist/chat/ui/MermaidBlock.js +238 -68
- package/dist/chat/ui/MessageActions.js +251 -39
- package/dist/chat/ui/ModelMarks.js +55 -5
- package/dist/chat/ui/Pickers.js +664 -113
- package/dist/chat/ui/PromptComposer.js +281 -51
- package/dist/chat/ui/QuoteButton.js +151 -57
- package/dist/chat/ui/ResumeCompactionDock.d.ts +6 -2
- package/dist/chat/ui/ResumeCompactionDock.js +141 -6
- package/dist/chat/ui/RowTime.js +59 -5
- package/dist/chat/ui/RunSettings.js +1744 -154
- package/dist/chat/ui/Scrubber.js +517 -88
- package/dist/chat/ui/ShellCommand.js +183 -107
- package/dist/chat/ui/SubagentControls.js +212 -24
- package/dist/chat/ui/SubagentInfo.js +170 -13
- package/dist/chat/ui/SubagentStopButton.js +115 -24
- package/dist/chat/ui/SubagentTimeline.js +357 -91
- package/dist/chat/ui/Timeline.js +988 -476
- package/dist/chat/ui/TimelineMenu.js +552 -37
- package/dist/chat/ui/UnifiedDiff.js +234 -27
- package/dist/chat/ui/UploadThumb.js +37 -7
- package/dist/chat/ui/VisualDialogs.js +251 -20
- package/dist/chat/ui/VisualFrame.js +321 -95
- package/dist/chat/ui/Welcome.js +72 -7
- package/dist/chat/ui/chips.js +1 -1
- package/dist/chat/ui/code-lines.js +36 -36
- package/dist/chat/ui/code-streaming.js +1 -1
- package/dist/chat/ui/code-theme.js +7 -7
- package/dist/chat/ui/composer/ComposerControls.js +329 -21
- package/dist/chat/ui/composer/ComposerMenu.js +358 -30
- package/dist/chat/ui/composer/DraftParts.js +185 -11
- package/dist/chat/ui/composer/QueuedMessages.js +138 -13
- package/dist/chat/ui/composer/chips.js +29 -19
- package/dist/chat/ui/composer/editor.js +79 -63
- package/dist/chat/ui/composer/insert.js +26 -12
- package/dist/chat/ui/composer/key-handler.js +180 -127
- package/dist/chat/ui/composer/keys.js +90 -73
- package/dist/chat/ui/composer/menu-aria.js +18 -9
- package/dist/chat/ui/composer/placeholder.js +78 -31
- package/dist/chat/ui/composer/surface.js +13 -37
- package/dist/chat/ui/composer/use-chat-controls.js +230 -90
- package/dist/chat/ui/composer/use-compaction-offer.js +50 -18
- package/dist/chat/ui/composer/use-composer-draft.js +65 -34
- package/dist/chat/ui/composer/use-composer-menus.js +478 -193
- package/dist/chat/ui/composer/use-composer-submit.js +251 -109
- package/dist/chat/ui/composer/use-continuable-turn.js +33 -6
- package/dist/chat/ui/composer/use-draft-files.js +245 -93
- package/dist/chat/ui/composer/use-effort-stepper.d.ts +13 -0
- package/dist/chat/ui/composer/use-effort-stepper.js +88 -0
- package/dist/chat/ui/composer/use-notice.js +61 -16
- package/dist/chat/ui/composer/use-pending-requests.js +38 -17
- package/dist/chat/ui/composer/use-prompt-history.js +117 -45
- package/dist/chat/ui/composer/use-prompt-hold.js +119 -35
- package/dist/chat/ui/composer/use-take-back.js +94 -72
- package/dist/chat/ui/diff/ApprovalReview.js +101 -23
- package/dist/chat/ui/diff/DiffFallbackBoundary.js +21 -13
- package/dist/chat/ui/diff/DiffOmitted.js +56 -6
- package/dist/chat/ui/diff/DiffStack.js +92 -8
- package/dist/chat/ui/diff/DiffUnavailable.js +56 -6
- package/dist/chat/ui/diff/EditorEditDiff.js +263 -51
- package/dist/chat/ui/diff/EditorPatchDiff.js +39 -14
- package/dist/chat/ui/diff/LegacyDiffPool.js +27 -10
- package/dist/chat/ui/diff/LegacyEditDiff.js +97 -20
- package/dist/chat/ui/diff/LegacyUnifiedDiff.js +172 -42
- package/dist/chat/ui/diff/RawDiff.js +65 -5
- package/dist/chat/ui/diff/ReviewDiff.js +77 -5
- package/dist/chat/ui/diff/diff-props.js +1 -1
- package/dist/chat/ui/diff/diff-source-budget.js +46 -35
- package/dist/chat/ui/diff/editor-edit-model.js +18 -14
- package/dist/chat/ui/diff/review-plan.js +63 -40
- package/dist/chat/ui/diff/review-settle.js +24 -9
- package/dist/chat/ui/diff/syntax-runtime.js +236 -201
- package/dist/chat/ui/diff/use-review-stack.js +146 -25
- package/dist/chat/ui/diff-syntax.js +70 -58
- package/dist/chat/ui/diff-theme.js +31 -12
- package/dist/chat/ui/file-links.js +39 -10
- package/dist/chat/ui/find-reveal.js +29 -8
- package/dist/chat/ui/full-diff.js +17 -12
- package/dist/chat/ui/highlighter.js +143 -113
- package/dist/chat/ui/icons.js +16 -7
- package/dist/chat/ui/index.js +1 -1
- package/dist/chat/ui/intelligent-ui/UiBlockFrame.js +556 -82
- package/dist/chat/ui/intelligent-ui/UiFallbackPart.js +73 -5
- package/dist/chat/ui/intelligent-ui/UiReply.js +666 -262
- package/dist/chat/ui/intelligent-ui/block-local.js +59 -31
- package/dist/chat/ui/intelligent-ui/chart-data.js +77 -67
- package/dist/chat/ui/intelligent-ui/node-text.js +77 -91
- package/dist/chat/ui/intelligent-ui/registry.js +46 -46
- package/dist/chat/ui/intelligent-ui/render-context.js +1 -1
- package/dist/chat/ui/intelligent-ui/renderers/base-land.js +1 -1
- package/dist/chat/ui/intelligent-ui/renderers/binding.js +3 -3
- package/dist/chat/ui/intelligent-ui/renderers/chart.js +1223 -123
- package/dist/chat/ui/intelligent-ui/renderers/choices.js +312 -34
- package/dist/chat/ui/intelligent-ui/renderers/content.js +1241 -86
- package/dist/chat/ui/intelligent-ui/renderers/data.js +619 -54
- package/dist/chat/ui/intelligent-ui/renderers/inputs.js +868 -67
- package/dist/chat/ui/intelligent-ui/renderers/links.js +366 -62
- package/dist/chat/ui/intelligent-ui/renderers/map-slots.js +118 -60
- package/dist/chat/ui/intelligent-ui/renderers/map-style.js +85 -78
- package/dist/chat/ui/intelligent-ui/renderers/map-view.js +282 -217
- package/dist/chat/ui/intelligent-ui/renderers/map.js +621 -69
- package/dist/chat/ui/intelligent-ui/renderers/place-point.js +15 -8
- package/dist/chat/ui/intelligent-ui/renderers/structure.js +262 -20
- package/dist/chat/ui/intelligent-ui/renderers/text.js +674 -49
- package/dist/chat/ui/intelligent-ui/reply-parts.js +24 -15
- package/dist/chat/ui/intelligent-ui/table-data.js +97 -57
- package/dist/chat/ui/intelligent-ui/tones.js +31 -31
- package/dist/chat/ui/intelligent-ui/use-in-view.js +30 -12
- package/dist/chat/ui/intelligent-ui/use-later.js +28 -13
- package/dist/chat/ui/intelligent-ui/use-truncated.js +45 -21
- package/dist/chat/ui/intelligent-ui/use-ui-links.js +296 -109
- package/dist/chat/ui/intelligent-ui/use-ui-queries.js +256 -246
- package/dist/chat/ui/markdown-blocks.js +296 -262
- package/dist/chat/ui/mermaid.js +60 -72
- package/dist/chat/ui/quote-selection.js +32 -29
- package/dist/chat/ui/rehype-chips.js +35 -23
- package/dist/chat/ui/rehype-fade.js +28 -17
- package/dist/chat/ui/remark-html-as-text.js +22 -15
- package/dist/chat/ui/reply-context.js +1 -1
- package/dist/chat/ui/reveal.js +161 -72
- package/dist/chat/ui/rows/ForksRow.js +226 -24
- package/dist/chat/ui/rows/GeneratedImageRow.js +541 -87
- package/dist/chat/ui/rows/MessageRows.js +1706 -159
- package/dist/chat/ui/rows/RowContainer.js +57 -7
- package/dist/chat/ui/rows/Rows.js +463 -54
- package/dist/chat/ui/rows/SubagentRow.js +577 -60
- package/dist/chat/ui/rows/TaskRow.js +359 -40
- package/dist/chat/ui/rows/VisualRow.js +233 -11
- package/dist/chat/ui/rows/WorkRows.js +1946 -163
- package/dist/chat/ui/rows/WorkflowRow.js +293 -34
- package/dist/chat/ui/rows/row-rhythm.js +27 -17
- package/dist/chat/ui/theme-watch.js +26 -23
- package/dist/chat/ui/timestamp-format.js +4 -1
- package/dist/chat/ui/use-diff-source-tokens.js +70 -34
- package/dist/chat/ui/useToggleSet.js +51 -19
- package/dist/chat/ui/visual-theme.js +153 -128
- package/dist/chat/visual-bridge.js +123 -123
- package/dist/chat/visual-viewport.js +94 -83
- package/dist/chat/visuals.js +13 -5
- package/dist/host-hooks.d.ts +29 -0
- package/dist/host-hooks.js +78 -0
- package/dist/host.js +120 -48
- package/dist/index.js +1 -1
- package/dist/lazy.js +38 -32
- package/dist/locales/en/agent-chat.d.ts +35 -0
- package/dist/locales/en/agent-chat.js +747 -712
- package/dist/locales/en/agent-prompts.js +42 -42
- package/dist/locales/en/agent-providers.d.ts +1 -0
- package/dist/locales/en/agent-providers.js +166 -165
- package/dist/locales/en/agent-usage.d.ts +6 -0
- package/dist/locales/en/agent-usage.js +129 -123
- package/dist/locales/nl/agent-chat.d.ts +35 -0
- package/dist/locales/nl/agent-chat.js +747 -712
- package/dist/locales/nl/agent-prompts.js +42 -42
- package/dist/locales/nl/agent-providers.d.ts +1 -0
- package/dist/locales/nl/agent-providers.js +166 -165
- package/dist/locales/nl/agent-usage.d.ts +6 -0
- package/dist/locales/nl/agent-usage.js +129 -123
- package/dist/locales.js +14 -14
- package/dist/mounted-registry.js +31 -30
- package/dist/port-transport.js +122 -111
- package/dist/prompts/index.js +1 -1
- package/dist/prompts/logic/focus.js +15 -14
- package/dist/prompts/logic/keys.js +93 -59
- package/dist/prompts/logic/prompts.js +27 -14
- package/dist/prompts/logic/subjects.js +60 -46
- package/dist/prompts/logic/useFocusAfterAnswer.js +60 -20
- package/dist/prompts/logic/usePromptSession.js +88 -77
- package/dist/prompts/ui/ApprovalBody.js +246 -25
- package/dist/prompts/ui/PromptActions.js +215 -9
- package/dist/prompts/ui/PromptCard.js +215 -36
- package/dist/prompts/ui/PromptView.js +372 -34
- package/dist/prompts/ui/QuestionBody.js +269 -73
- package/dist/providers/AccountColors.js +36 -5
- package/dist/providers/AccountDetail.js +683 -50
- package/dist/providers/AccountVariables.js +139 -32
- package/dist/providers/AddAccountForm.js +125 -38
- package/dist/providers/CliDetail.js +343 -36
- package/dist/providers/InstallPage.js +644 -59
- package/dist/providers/ProviderList.d.ts +2 -1
- package/dist/providers/ProviderList.js +215 -23
- package/dist/providers/ProvidersPane.d.ts +4 -2
- package/dist/providers/ProvidersPane.js +244 -64
- package/dist/providers/account-actions.js +54 -30
- package/dist/providers/index.js +1 -1
- package/dist/providers/install-steps.js +12 -9
- package/dist/providers/pane-target.d.ts +3 -0
- package/dist/providers/pane-target.js +34 -13
- package/dist/providers/parts.js +62 -12
- package/dist/providers/provider-abilities.js +5 -5
- package/dist/providers/provider-groups.js +75 -40
- package/dist/providers/variables.js +73 -39
- package/dist/scope.js +6 -6
- package/dist/settings/sections.js +18 -18
- package/dist/state/chats.d.ts +1 -0
- package/dist/state/chats.js +408 -192
- package/dist/state/index.js +1 -1
- package/dist/state/provider-accounts.js +70 -47
- package/dist/state/providers.js +45 -16
- package/dist/state/usage.js +154 -77
- package/dist/storage.js +69 -68
- package/dist/testing/index.js +1 -1
- package/dist/testing/prompts.js +105 -67
- package/dist/transport.js +10 -10
- package/dist/ui/PlainTextarea.js +27 -3
- package/dist/usage/LimitsList.js +646 -40
- package/dist/usage/UsageBreakdown.js +879 -38
- package/dist/usage/UsageChart.js +311 -32
- package/dist/usage/UsageDialog.js +46 -4
- package/dist/usage/UsageLimits.js +467 -34
- package/dist/usage/UsageLimitsCard.js +95 -11
- package/dist/usage/UsagePage.js +817 -96
- package/dist/usage/UsagePane.js +164 -10
- package/dist/usage/UsageSummary.js +151 -6
- package/dist/usage/UsageTiles.js +164 -14
- package/dist/usage/format.js +32 -32
- package/dist/usage/index.d.ts +1 -1
- package/dist/usage/index.js +2 -1
- package/dist/usage/limit-groups.d.ts +2 -0
- package/dist/usage/limit-groups.js +77 -59
- package/dist/usage/limits.js +78 -43
- package/dist/usage/money.js +20 -4
- package/dist/usage/summary.js +85 -64
- package/package.json +8 -8
- package/src/agents/ModelOptionControl.tsx +3 -1
- package/src/agents/option-words.ts +27 -0
- package/src/chat/account-choice.ts +41 -1
- package/src/chat/composer-effort.ts +32 -0
- package/src/chat/forks.ts +4 -5
- package/src/chat/index.ts +3 -1
- package/src/chat/logic/effort.ts +32 -0
- package/src/chat/logic/picker-entries.ts +45 -10
- package/src/chat/logic/resume-compaction.ts +95 -17
- package/src/chat/logic/timeline.ts +11 -3
- package/src/chat/preferences.ts +35 -0
- package/src/chat/subagent-view.ts +2 -3
- package/src/chat/ui/AnsiOutput.tsx +1 -2
- package/src/chat/ui/BookmarkSubmenu.tsx +3 -3
- package/src/chat/ui/ChatActivity.tsx +14 -22
- package/src/chat/ui/ChatReferenceChip.tsx +2 -3
- package/src/chat/ui/Composer.tsx +15 -7
- package/src/chat/ui/EditDiff.tsx +2 -3
- package/src/chat/ui/LimitState.tsx +2 -2
- package/src/chat/ui/Markdown.tsx +10 -8
- package/src/chat/ui/MermaidBlock.tsx +2 -3
- package/src/chat/ui/Pickers.tsx +49 -29
- package/src/chat/ui/PromptComposer.tsx +7 -9
- package/src/chat/ui/ResumeCompactionDock.tsx +16 -4
- package/src/chat/ui/RunSettings.tsx +67 -28
- package/src/chat/ui/Scrubber.tsx +3 -3
- package/src/chat/ui/ShellCommand.tsx +2 -0
- package/src/chat/ui/SubagentInfo.tsx +2 -3
- package/src/chat/ui/SubagentTimeline.tsx +12 -16
- package/src/chat/ui/Timeline.tsx +6 -6
- package/src/chat/ui/UnifiedDiff.tsx +3 -4
- package/src/chat/ui/VisualFrame.tsx +5 -8
- package/src/chat/ui/code-theme.ts +4 -4
- package/src/chat/ui/composer/placeholder.ts +2 -2
- package/src/chat/ui/composer/use-compaction-offer.ts +36 -16
- package/src/chat/ui/composer/use-composer-menus.ts +4 -9
- package/src/chat/ui/composer/use-composer-submit.ts +2 -1
- package/src/chat/ui/composer/use-effort-stepper.ts +56 -0
- package/src/chat/ui/composer/use-notice.ts +2 -2
- package/src/chat/ui/diff/EditorEditDiff.tsx +9 -13
- package/src/chat/ui/diff/LegacyEditDiff.tsx +12 -17
- package/src/chat/ui/diff/LegacyUnifiedDiff.tsx +13 -21
- package/src/chat/ui/diff/use-review-stack.ts +4 -4
- package/src/chat/ui/diff-theme.ts +3 -3
- package/src/chat/ui/file-links.ts +2 -2
- package/src/chat/ui/intelligent-ui/UiReply.tsx +2 -0
- package/src/chat/ui/intelligent-ui/renderers/chart.tsx +3 -3
- package/src/chat/ui/intelligent-ui/renderers/content.tsx +5 -6
- package/src/chat/ui/intelligent-ui/renderers/map-view.tsx +2 -1
- package/src/chat/ui/intelligent-ui/renderers/map.tsx +2 -1
- package/src/chat/ui/intelligent-ui/use-truncated.ts +16 -19
- package/src/chat/ui/intelligent-ui/use-ui-links.ts +3 -3
- package/src/chat/ui/rows/ForksRow.tsx +3 -5
- package/src/chat/ui/rows/GeneratedImageRow.tsx +2 -1
- package/src/chat/ui/rows/MessageRows.tsx +12 -21
- package/src/chat/ui/rows/SubagentRow.tsx +3 -3
- package/src/chat/ui/rows/TaskRow.tsx +1 -1
- package/src/chat/ui/rows/WorkRows.tsx +20 -7
- package/src/chat/ui/useToggleSet.ts +15 -18
- package/src/chat/ui/visual-theme.ts +2 -3
- package/src/host-hooks.ts +113 -0
- package/src/lazy.tsx +2 -0
- package/src/locales/en/agent-chat.ts +135 -108
- package/src/locales/en/agent-prompts.ts +7 -7
- package/src/locales/en/agent-providers.ts +35 -34
- package/src/locales/en/agent-usage.ts +26 -20
- package/src/locales/nl/agent-chat.ts +127 -100
- package/src/locales/nl/agent-prompts.ts +5 -5
- package/src/locales/nl/agent-providers.ts +33 -32
- package/src/locales/nl/agent-usage.ts +25 -20
- package/src/prompts/ui/ApprovalBody.tsx +3 -1
- package/src/providers/CliDetail.tsx +2 -1
- package/src/providers/InstallPage.tsx +2 -4
- package/src/providers/ProviderList.tsx +12 -2
- package/src/providers/ProvidersPane.tsx +45 -15
- package/src/providers/pane-target.ts +20 -4
- package/src/state/chats.ts +7 -2
- package/src/usage/LimitsList.tsx +12 -13
- package/src/usage/UsageBreakdown.tsx +17 -6
- package/src/usage/UsageLimits.tsx +2 -1
- package/src/usage/UsagePage.tsx +3 -3
- package/src/usage/index.ts +1 -1
- package/src/usage/limit-groups.ts +12 -0
- package/src/usage/limits.ts +2 -2
- package/src/usage/money.ts +1 -2
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { c as _c } from "react/compiler-runtime";
|
|
1
2
|
import { useMemo } from 'react';
|
|
2
3
|
import { accountName, accountsOfKind, hasAccountChoice, offeredAccounts } from '../agents/accounts.js';
|
|
3
4
|
import { useProviderAccounts } from '../state/provider-accounts.js';
|
|
@@ -7,24 +8,93 @@ import { useProviders } from '../state/providers.js';
|
|
|
7
8
|
* the CLI has fewer than two accounts that are on: with one there is nothing to choose or tell apart.
|
|
8
9
|
*/
|
|
9
10
|
export function useAccountChoice(kind, account) {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
11
|
+
const $ = _c(7);
|
|
12
|
+
const accounts = useProviderAccounts(_temp);
|
|
13
|
+
const providerName = useProviders(row_0 => row_0.providers.find(entry => entry.kind === kind)?.name) ?? kind ?? "";
|
|
14
|
+
let t0;
|
|
15
|
+
if ($[0] !== account || $[1] !== accounts || $[2] !== kind || $[3] !== providerName) {
|
|
16
|
+
bb0: {
|
|
17
|
+
if (kind === null || accounts === null) {
|
|
18
|
+
t0 = null;
|
|
19
|
+
break bb0;
|
|
20
|
+
}
|
|
21
|
+
const entries = accountsOfKind(accounts, kind);
|
|
22
|
+
if (!hasAccountChoice(entries)) {
|
|
23
|
+
t0 = null;
|
|
24
|
+
break bb0;
|
|
25
|
+
}
|
|
26
|
+
const currentId = account ?? kind;
|
|
27
|
+
let t1;
|
|
28
|
+
if ($[5] !== providerName) {
|
|
29
|
+
t1 = entry_1 => accountName(entry_1, providerName);
|
|
30
|
+
$[5] = providerName;
|
|
31
|
+
$[6] = t1;
|
|
32
|
+
} else {
|
|
33
|
+
t1 = $[6];
|
|
34
|
+
}
|
|
35
|
+
t0 = {
|
|
36
|
+
accounts,
|
|
37
|
+
offered: offeredAccounts(entries, currentId),
|
|
38
|
+
currentId,
|
|
39
|
+
current: entries.find(entry_0 => entry_0.id === currentId) ?? null,
|
|
40
|
+
providerName,
|
|
41
|
+
nameOf: t1
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
$[0] = account;
|
|
45
|
+
$[1] = accounts;
|
|
46
|
+
$[2] = kind;
|
|
47
|
+
$[3] = providerName;
|
|
48
|
+
$[4] = t0;
|
|
49
|
+
} else {
|
|
50
|
+
t0 = $[4];
|
|
51
|
+
}
|
|
52
|
+
return t0;
|
|
30
53
|
}
|
|
54
|
+
// One object each, so a render that changes nothing hands back the same answer.
|
|
55
|
+
function _temp(row) {
|
|
56
|
+
return row.accounts;
|
|
57
|
+
}
|
|
58
|
+
const LOADING = {
|
|
59
|
+
status: 'loading'
|
|
60
|
+
};
|
|
61
|
+
const UNSUPPORTED = {
|
|
62
|
+
status: 'unsupported'
|
|
63
|
+
};
|
|
64
|
+
/* `useNewAccountChoice` without React, for its tests. */
|
|
65
|
+
export function newAccountChoiceOf(row, kind, providerName) {
|
|
66
|
+
if (kind === null || !row.loaded) {
|
|
67
|
+
return LOADING;
|
|
68
|
+
}
|
|
69
|
+
const entries = accountsOfKind(row.accounts, kind);
|
|
70
|
+
// An older machine lists no accounts at all, or none of a CLI it does not know.
|
|
71
|
+
if (entries.length === 0) {
|
|
72
|
+
return UNSUPPORTED;
|
|
73
|
+
}
|
|
74
|
+
return {
|
|
75
|
+
status: 'ready',
|
|
76
|
+
offered: offeredAccounts(entries, undefined),
|
|
77
|
+
providerName,
|
|
78
|
+
nameOf: entry => accountName(entry, providerName)
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
/* The accounts a new chat or agent of this CLI may start under on the machine in scope. */
|
|
82
|
+
export function useNewAccountChoice(kind) {
|
|
83
|
+
const $ = _c(4);
|
|
84
|
+
const row = useProviderAccounts(_temp2);
|
|
85
|
+
const providerName = useProviders(entry_0 => entry_0.providers.find(provider => provider.kind === kind)?.name) ?? kind ?? "";
|
|
86
|
+
let t0;
|
|
87
|
+
if ($[0] !== kind || $[1] !== providerName || $[2] !== row) {
|
|
88
|
+
t0 = newAccountChoiceOf(row, kind, providerName);
|
|
89
|
+
$[0] = kind;
|
|
90
|
+
$[1] = providerName;
|
|
91
|
+
$[2] = row;
|
|
92
|
+
$[3] = t0;
|
|
93
|
+
} else {
|
|
94
|
+
t0 = $[3];
|
|
95
|
+
}
|
|
96
|
+
return t0;
|
|
97
|
+
}
|
|
98
|
+
function _temp2(entry) {
|
|
99
|
+
return entry;
|
|
100
|
+
}
|
package/dist/chat/actions.js
CHANGED
|
@@ -1,71 +1,138 @@
|
|
|
1
|
+
import { c as _c } from "react/compiler-runtime";
|
|
1
2
|
import i18next from 'i18next';
|
|
2
3
|
import { useChatHost } from '../host.js';
|
|
3
4
|
import { useChatScope } from '../scope.js';
|
|
4
5
|
import { ChatTransportError } from '../transport.js';
|
|
5
6
|
/* Every action as the request a chat host answers, for an app that runs them through nothing of its own. */
|
|
6
7
|
export function transportActions(transport) {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
}
|
|
8
|
+
return {
|
|
9
|
+
clear: async (chatId, force) => {
|
|
10
|
+
await transport.request('chat.clear', {
|
|
11
|
+
chatId,
|
|
12
|
+
...(force ? {
|
|
13
|
+
force: true
|
|
14
|
+
} : {})
|
|
15
|
+
});
|
|
16
|
+
},
|
|
17
|
+
stopTurn: async (chatId, subagents) => {
|
|
18
|
+
await transport.request('chat.cancel', {
|
|
19
|
+
chatId,
|
|
20
|
+
...(subagents ? {
|
|
21
|
+
subagents: true
|
|
22
|
+
} : {})
|
|
23
|
+
});
|
|
24
|
+
},
|
|
25
|
+
unqueue: async (chatId, messageId) => {
|
|
26
|
+
const {
|
|
27
|
+
message
|
|
28
|
+
} = await transport.request('chat.unqueue', {
|
|
29
|
+
chatId,
|
|
30
|
+
messageId
|
|
31
|
+
});
|
|
32
|
+
// A host answers without the message once it went out, which is what the composer tells a person.
|
|
33
|
+
if (message === undefined) {
|
|
34
|
+
throw new ChatTransportError('request-not-found', i18next.t('agent-chat:composer.queue.alreadySent'));
|
|
35
|
+
}
|
|
36
|
+
},
|
|
37
|
+
sendNow: async (chatId, messageId) => {
|
|
38
|
+
await transport.request('chat.sendNow', {
|
|
39
|
+
chatId,
|
|
40
|
+
messageId
|
|
41
|
+
});
|
|
42
|
+
},
|
|
43
|
+
compact: async chatId => {
|
|
44
|
+
await transport.request('chat.compact', {
|
|
45
|
+
chatId
|
|
46
|
+
});
|
|
47
|
+
},
|
|
48
|
+
configure: async (chatId, patch) => {
|
|
49
|
+
await transport.request('chat.configure', {
|
|
50
|
+
chatId,
|
|
51
|
+
...patch
|
|
52
|
+
});
|
|
53
|
+
},
|
|
54
|
+
continueOn: async (chatId, account) => {
|
|
55
|
+
await transport.request('chat.continueOn', {
|
|
56
|
+
chatId,
|
|
57
|
+
account
|
|
58
|
+
});
|
|
59
|
+
},
|
|
60
|
+
turnDiff: async (chatId, turnId) => (await transport.request('chat.turnDiff', {
|
|
61
|
+
chatId,
|
|
62
|
+
turnId
|
|
63
|
+
})).diff,
|
|
64
|
+
stopSubagent: async (chatId, toolUseId) => {
|
|
65
|
+
await transport.request('chat.stopSubagent', {
|
|
66
|
+
chatId,
|
|
67
|
+
toolUseId
|
|
68
|
+
});
|
|
69
|
+
},
|
|
70
|
+
stopTask: async (chatId, taskId) => {
|
|
71
|
+
await transport.request('chat.stopTask', {
|
|
72
|
+
chatId,
|
|
73
|
+
taskId
|
|
74
|
+
});
|
|
75
|
+
},
|
|
76
|
+
goal: async (chatId, action) => {
|
|
77
|
+
await transport.request('chat.goal', {
|
|
78
|
+
chatId,
|
|
79
|
+
action
|
|
80
|
+
});
|
|
81
|
+
},
|
|
82
|
+
approve: async (chatId, requestId, decision, message) => {
|
|
83
|
+
await transport.request('chat.approve', {
|
|
84
|
+
chatId,
|
|
85
|
+
requestId,
|
|
86
|
+
decision,
|
|
87
|
+
...(message === undefined ? {} : {
|
|
88
|
+
message
|
|
89
|
+
})
|
|
90
|
+
});
|
|
91
|
+
},
|
|
92
|
+
answer: async (chatId, requestId, answers) => {
|
|
93
|
+
await transport.request('chat.answer', {
|
|
94
|
+
chatId,
|
|
95
|
+
requestId,
|
|
96
|
+
answers
|
|
97
|
+
});
|
|
98
|
+
},
|
|
99
|
+
dismiss: async (chatId, itemId) => {
|
|
100
|
+
await transport.request('chat.dismiss', {
|
|
101
|
+
chatId,
|
|
102
|
+
itemId
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
};
|
|
53
106
|
}
|
|
54
107
|
const byTransport = new WeakMap();
|
|
55
108
|
/* The app's own actions when its host has them, and the requests of this scope's host of chats otherwise. */
|
|
56
109
|
export function actionsOf(scope, host) {
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
110
|
+
const own = host.actions;
|
|
111
|
+
if (own !== null) {
|
|
112
|
+
return own;
|
|
113
|
+
}
|
|
114
|
+
const {
|
|
115
|
+
transport
|
|
116
|
+
} = scope;
|
|
117
|
+
let actions = byTransport.get(transport);
|
|
118
|
+
if (actions === undefined) {
|
|
119
|
+
actions = transportActions(transport);
|
|
120
|
+
byTransport.set(transport, actions);
|
|
121
|
+
}
|
|
122
|
+
return actions;
|
|
68
123
|
}
|
|
69
124
|
export function useChatActions() {
|
|
70
|
-
|
|
71
|
-
|
|
125
|
+
const $ = _c(3);
|
|
126
|
+
const t0 = useChatScope();
|
|
127
|
+
const t1 = useChatHost();
|
|
128
|
+
let t2;
|
|
129
|
+
if ($[0] !== t0 || $[1] !== t1) {
|
|
130
|
+
t2 = actionsOf(t0, t1);
|
|
131
|
+
$[0] = t0;
|
|
132
|
+
$[1] = t1;
|
|
133
|
+
$[2] = t2;
|
|
134
|
+
} else {
|
|
135
|
+
t2 = $[2];
|
|
136
|
+
}
|
|
137
|
+
return t2;
|
|
138
|
+
}
|
package/dist/chat/activity.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export function backgroundCounts(tasks) {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
}
|
|
2
|
+
return {
|
|
3
|
+
shells: tasks.filter(task => task.kind === 'shell').length,
|
|
4
|
+
monitors: tasks.filter(task => task.kind === 'monitor').length
|
|
5
|
+
};
|
|
6
|
+
}
|
package/dist/chat/attachments.js
CHANGED
|
@@ -2,85 +2,106 @@ import i18next from 'i18next';
|
|
|
2
2
|
import { attachmentBytes, attachmentImageMime, CHAT_ATTACHMENTS_MAX_BYTES, CHAT_ATTACHMENTS_MAX_COUNT, CHAT_ATTACHMENT_MAX_BYTES } from '@adecore/agent-contracts';
|
|
3
3
|
import { formatBytes as bytesOf } from '@adecore/ui/format';
|
|
4
4
|
export function isImageAttachment(mime) {
|
|
5
|
-
|
|
5
|
+
return mime.startsWith('image/');
|
|
6
6
|
}
|
|
7
7
|
/* The type on a file card: the extension, as long as it is short enough to read as one. */
|
|
8
8
|
export function fileBadge(name) {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
9
|
+
const dot = name.lastIndexOf('.');
|
|
10
|
+
if (dot <= 0 || dot === name.length - 1) {
|
|
11
|
+
return null;
|
|
12
|
+
}
|
|
13
|
+
const extension = name.slice(dot + 1);
|
|
14
|
+
return extension.length <= 5 ? extension.toUpperCase() : null;
|
|
15
15
|
}
|
|
16
16
|
/* Whole kilobytes, which is all a row under a file name has room for, and a decimal once it runs into megabytes. */
|
|
17
17
|
export function formatBytes(bytes) {
|
|
18
|
-
|
|
18
|
+
return bytesOf(bytes, bytes < 1024 * 1024);
|
|
19
19
|
}
|
|
20
20
|
/* Which of the incoming files fit next to what the composer already holds, and why the rest do not. */
|
|
21
21
|
export function checkAttachmentLimits(current, incoming, currentBytes = 0) {
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
22
|
+
const accepted = [];
|
|
23
|
+
const rejected = [];
|
|
24
|
+
let bytes = currentBytes;
|
|
25
|
+
for (const file of incoming) {
|
|
26
|
+
if (file.bytes === 0) {
|
|
27
|
+
rejected.push({
|
|
28
|
+
name: file.name,
|
|
29
|
+
reason: i18next.t('agent-chat:attachments.rejected.empty')
|
|
30
|
+
});
|
|
31
|
+
} else if (file.bytes > CHAT_ATTACHMENT_MAX_BYTES) {
|
|
32
|
+
rejected.push({
|
|
33
|
+
name: file.name,
|
|
34
|
+
reason: i18next.t('agent-chat:attachments.rejected.tooLarge', {
|
|
35
|
+
size: formatBytes(CHAT_ATTACHMENT_MAX_BYTES)
|
|
36
|
+
})
|
|
37
|
+
});
|
|
38
|
+
} else if (current + accepted.length >= CHAT_ATTACHMENTS_MAX_COUNT) {
|
|
39
|
+
rejected.push({
|
|
40
|
+
name: file.name,
|
|
41
|
+
reason: i18next.t('agent-chat:attachments.rejected.tooMany', {
|
|
42
|
+
count: CHAT_ATTACHMENTS_MAX_COUNT
|
|
43
|
+
})
|
|
44
|
+
});
|
|
45
|
+
} else if (bytes + file.bytes > CHAT_ATTACHMENTS_MAX_BYTES) {
|
|
46
|
+
rejected.push({
|
|
47
|
+
name: file.name,
|
|
48
|
+
reason: i18next.t('agent-chat:attachments.rejected.tooHeavy', {
|
|
49
|
+
size: formatBytes(CHAT_ATTACHMENTS_MAX_BYTES)
|
|
50
|
+
})
|
|
51
|
+
});
|
|
52
|
+
} else {
|
|
53
|
+
accepted.push(file);
|
|
54
|
+
bytes += file.bytes;
|
|
45
55
|
}
|
|
46
|
-
|
|
56
|
+
}
|
|
57
|
+
return {
|
|
58
|
+
accepted,
|
|
59
|
+
rejected
|
|
60
|
+
};
|
|
47
61
|
}
|
|
48
62
|
/* The files in a paste or a drop; a paste of plain text gives none. */
|
|
49
63
|
export function filesOf(transfer) {
|
|
50
|
-
|
|
64
|
+
return transfer ? [...transfer.files] : [];
|
|
51
65
|
}
|
|
52
66
|
function readAsBase64(file) {
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
}
|
|
67
|
+
return new Promise((resolve, reject) => {
|
|
68
|
+
const reader = new FileReader();
|
|
69
|
+
reader.onerror = () => reject(reader.error ?? new Error(i18next.t('agent-chat:attachments.unreadable', {
|
|
70
|
+
name: file.name
|
|
71
|
+
})));
|
|
72
|
+
reader.onload = () => {
|
|
73
|
+
const url = String(reader.result);
|
|
74
|
+
resolve(url.slice(url.indexOf(',') + 1));
|
|
75
|
+
};
|
|
76
|
+
reader.readAsDataURL(file);
|
|
77
|
+
});
|
|
62
78
|
}
|
|
63
79
|
// A pasted screenshot has no name; the clock gives it one so the row and the agent can tell them apart.
|
|
64
80
|
function nameFor(file, index) {
|
|
65
|
-
|
|
81
|
+
return file.name || `pasted-${Date.now()}-${index + 1}.${file.type.split('/')[1] ?? 'bin'}`;
|
|
66
82
|
}
|
|
67
83
|
export async function readAttachments(files) {
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
84
|
+
return Promise.all(files.map(async (file, index) => ({
|
|
85
|
+
name: nameFor(file, index),
|
|
86
|
+
mime: attachmentImageMime({
|
|
87
|
+
name: file.name,
|
|
88
|
+
mime: file.type
|
|
89
|
+
}) ?? (file.type || 'application/octet-stream'),
|
|
90
|
+
data: await readAsBase64(file)
|
|
91
|
+
})));
|
|
73
92
|
}
|
|
74
93
|
/* Files the host already stored for a chat, back as uploads the composer can hold again. */
|
|
75
94
|
export async function readStoredAttachments(read, stored) {
|
|
76
|
-
|
|
77
|
-
|
|
95
|
+
const files = await Promise.all(stored.map(async attachment => new File([await read(attachment)], attachment.name, {
|
|
96
|
+
type: attachment.mime
|
|
97
|
+
})));
|
|
98
|
+
return readAttachments(files);
|
|
78
99
|
}
|
|
79
100
|
/* A preview of a file the composer still holds; the bytes have not reached the host yet. */
|
|
80
101
|
export function uploadPreviewUrl(upload) {
|
|
81
|
-
|
|
102
|
+
return `data:${upload.mime};base64,${upload.data}`;
|
|
82
103
|
}
|
|
83
104
|
/* What the file weighs, from the base64 the composer is holding: three bytes per four characters. */
|
|
84
105
|
export function uploadBytes(upload) {
|
|
85
|
-
|
|
86
|
-
}
|
|
106
|
+
return attachmentBytes(upload.data);
|
|
107
|
+
}
|
package/dist/chat/bookmarks.js
CHANGED
|
@@ -1,72 +1,82 @@
|
|
|
1
1
|
import i18next from 'i18next';
|
|
2
2
|
import { create } from 'zustand';
|
|
3
3
|
import { jumpToTimelineItem } from './timeline-scroll.js';
|
|
4
|
-
export const useBookmarkNaming = create(
|
|
4
|
+
export const useBookmarkNaming = create(set => ({
|
|
5
|
+
chatKey: null,
|
|
6
|
+
itemId: null,
|
|
7
|
+
open: (chatKey, itemId) => set({
|
|
8
|
+
chatKey,
|
|
9
|
+
itemId
|
|
10
|
+
}),
|
|
11
|
+
close: () => set({
|
|
5
12
|
chatKey: null,
|
|
6
|
-
itemId: null
|
|
7
|
-
|
|
8
|
-
close: () => set({ chatKey: null, itemId: null })
|
|
13
|
+
itemId: null
|
|
14
|
+
})
|
|
9
15
|
}));
|
|
10
16
|
function failed(host, title, e) {
|
|
11
|
-
|
|
17
|
+
host.notify({
|
|
18
|
+
title,
|
|
19
|
+
description: e instanceof Error ? e.message : String(e),
|
|
20
|
+
kind: 'error'
|
|
21
|
+
});
|
|
12
22
|
}
|
|
13
23
|
async function add(scope, host, chatId, itemId, name) {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
}
|
|
24
|
+
try {
|
|
25
|
+
await scope.chats.addBookmark(chatId, itemId, name);
|
|
26
|
+
return true;
|
|
27
|
+
} catch (e) {
|
|
28
|
+
failed(host, i18next.t('agent-chat:bookmarks.addFailed'), e);
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
22
31
|
}
|
|
23
32
|
/* Marks a message and opens the field for its name at once, before the host answered. */
|
|
24
33
|
export async function placeBookmark(scope, host, chatId, itemId) {
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
34
|
+
useBookmarkNaming.getState().open(scope.keyOf(chatId), itemId);
|
|
35
|
+
if (!(await add(scope, host, chatId, itemId))) {
|
|
36
|
+
useBookmarkNaming.getState().close();
|
|
37
|
+
}
|
|
29
38
|
}
|
|
30
39
|
/*
|
|
31
40
|
* The name a field settles on. A name goes through `addBookmark`, which also names a bookmark that
|
|
32
41
|
* already stands, so a name typed before the mark itself landed is not refused.
|
|
33
42
|
*/
|
|
34
43
|
export async function nameBookmark(scope, host, chatId, itemId, name, previous) {
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
}
|
|
44
|
+
const next = name.trim();
|
|
45
|
+
if (next === (previous ?? '')) {
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
if (next !== '') {
|
|
49
|
+
await add(scope, host, chatId, itemId, next);
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
try {
|
|
53
|
+
await scope.chats.renameBookmark(chatId, itemId, '');
|
|
54
|
+
} catch (e) {
|
|
55
|
+
failed(host, i18next.t('agent-chat:bookmarks.renameFailed'), e);
|
|
56
|
+
}
|
|
49
57
|
}
|
|
50
58
|
/* Takes a bookmark away at once; the toast puts it back, name and all. */
|
|
51
59
|
export async function removeBookmark(scope, host, chatId, bookmark) {
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
60
|
+
try {
|
|
61
|
+
await scope.chats.removeBookmark(chatId, bookmark.itemId);
|
|
62
|
+
} catch (e) {
|
|
63
|
+
failed(host, i18next.t('agent-chat:bookmarks.removeFailed'), e);
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
host.notify({
|
|
67
|
+
title: i18next.t('agent-chat:bookmarks.removed'),
|
|
68
|
+
kind: 'deleted',
|
|
69
|
+
action: {
|
|
70
|
+
label: i18next.t('agent-chat:common.action.undo'),
|
|
71
|
+
run: () => void add(scope, host, chatId, bookmark.itemId, bookmark.name)
|
|
58
72
|
}
|
|
59
|
-
|
|
60
|
-
title: i18next.t('agent-chat:bookmarks.removed'),
|
|
61
|
-
kind: 'deleted',
|
|
62
|
-
action: { label: i18next.t('agent-chat:common.action.undo'), run: () => void add(scope, host, chatId, bookmark.itemId, bookmark.name) }
|
|
63
|
-
});
|
|
73
|
+
});
|
|
64
74
|
}
|
|
65
75
|
/* Scrolls the chat's thread to the message, and opens its name field for a rename. False when no thread of it is on screen yet. */
|
|
66
76
|
export function goToBookmark(scope, chatId, itemId, rename = false) {
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
}
|
|
77
|
+
const key = scope.keyOf(chatId);
|
|
78
|
+
if (rename) {
|
|
79
|
+
useBookmarkNaming.getState().open(key, itemId);
|
|
80
|
+
}
|
|
81
|
+
return jumpToTimelineItem(key, itemId);
|
|
82
|
+
}
|