@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
|
@@ -3,69 +3,109 @@
|
|
|
3
3
|
* with the rest behind one row that opens all of them. A list of three hundred models is not one to scroll.
|
|
4
4
|
*/
|
|
5
5
|
export const COMPACT_MODEL_LIMIT = 8;
|
|
6
|
+
const NO_FAVORITES = () => new Set();
|
|
6
7
|
function matches(model, query) {
|
|
7
|
-
|
|
8
|
+
return model.name.toLowerCase().includes(query) || model.slug.toLowerCase().includes(query) || (model.vendor?.toLowerCase().includes(query) ?? false);
|
|
8
9
|
}
|
|
9
10
|
/*
|
|
10
11
|
* By maker, then by name, when the provider says who made its models; a list with no makers keeps the order
|
|
11
12
|
* it came in. A model with no maker goes last, so the ones that have one read as groups.
|
|
12
13
|
*/
|
|
13
14
|
export function modelsByVendor(models) {
|
|
14
|
-
|
|
15
|
-
|
|
15
|
+
if (!models.some(model => model.vendor !== undefined)) {
|
|
16
|
+
return models;
|
|
17
|
+
}
|
|
18
|
+
return [...models].sort((a, b) => {
|
|
19
|
+
if (a.vendor === undefined || b.vendor === undefined) {
|
|
20
|
+
return a.vendor === b.vendor ? 0 : a.vendor === undefined ? 1 : -1;
|
|
16
21
|
}
|
|
17
|
-
return
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
a.name.localeCompare(b.name, undefined, { sensitivity: 'base', numeric: true }));
|
|
22
|
+
return a.vendor.localeCompare(b.vendor, undefined, {
|
|
23
|
+
sensitivity: 'base'
|
|
24
|
+
}) || a.name.localeCompare(b.name, undefined, {
|
|
25
|
+
sensitivity: 'base',
|
|
26
|
+
numeric: true
|
|
23
27
|
});
|
|
28
|
+
});
|
|
24
29
|
}
|
|
25
|
-
/* The models
|
|
26
|
-
export function
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
30
|
+
/* The starred models first, in the order they came, then the rest by maker. */
|
|
31
|
+
export function favoritesFirst(models, favorites) {
|
|
32
|
+
if (favorites.size === 0) {
|
|
33
|
+
return modelsByVendor(models);
|
|
34
|
+
}
|
|
35
|
+
return [...models.filter(model => favorites.has(model.slug)), ...modelsByVendor(models.filter(model => !favorites.has(model.slug)))];
|
|
36
|
+
}
|
|
37
|
+
/*
|
|
38
|
+
* The models a long list shows before it is opened: the starred ones, the default and the one that is picked.
|
|
39
|
+
* Null when the list is short enough to show whole.
|
|
40
|
+
*/
|
|
41
|
+
export function shortlistOf(kind, models, current, favorites = new Set()) {
|
|
42
|
+
if (models.length <= COMPACT_MODEL_LIMIT) {
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
return favoritesFirst(models.filter(model => model.isDefault || favorites.has(model.slug) || current?.provider === kind && current.model === model.slug), favorites);
|
|
31
46
|
}
|
|
32
47
|
/* Whether the providers offer enough models together that a search is quicker than reading the list. */
|
|
33
48
|
export function wantsModelSearch(providers) {
|
|
34
|
-
|
|
49
|
+
return providers.reduce((count, entry) => count + entry.models.length, 0) > COMPACT_MODEL_LIMIT;
|
|
35
50
|
}
|
|
36
|
-
/* Every model of every provider that a search finds, legacy ones included, by maker; a provider with none is left out. */
|
|
37
|
-
export function searchModels(providers, query) {
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
51
|
+
/* Every model of every provider that a search finds, legacy ones included, starred first and then by maker; a provider with none is left out. */
|
|
52
|
+
export function searchModels(providers, query, favoritesOf = NO_FAVORITES) {
|
|
53
|
+
const needle = query.trim().toLowerCase();
|
|
54
|
+
return providers.map(entry => ({
|
|
55
|
+
entry,
|
|
56
|
+
models: favoritesFirst(entry.models.filter(model => matches(model, needle)), favoritesOf(entry.kind))
|
|
57
|
+
})).filter(group => group.models.length > 0);
|
|
42
58
|
}
|
|
43
59
|
const NONE = new Set();
|
|
44
60
|
/*
|
|
45
61
|
* The rows of the model list. A model an old CLI cannot run is a row like any other, so a search for
|
|
46
62
|
* only that model still finds the row that explains why it cannot be picked. A search looks through
|
|
47
63
|
* every model of every provider; without one, a provider with many models shows a short list and a row
|
|
48
|
-
* that opens the rest, grouped by maker.
|
|
64
|
+
* that opens the rest, grouped by maker. A provider's starred models come first wherever it lists them.
|
|
49
65
|
*/
|
|
50
|
-
export function pickerEntriesOf(providers, query, legacyOpen, expanded = NONE, current = null) {
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
66
|
+
export function pickerEntriesOf(providers, query, legacyOpen, expanded = NONE, current = null, favoritesOf = NO_FAVORITES) {
|
|
67
|
+
const rowsOf = (entry, models) => favoritesFirst(models, favoritesOf(entry.kind)).map(model => ({
|
|
68
|
+
kind: 'model',
|
|
69
|
+
provider: entry,
|
|
70
|
+
model
|
|
71
|
+
}));
|
|
72
|
+
if (query !== '') {
|
|
73
|
+
return providers.flatMap(entry => rowsOf(entry, entry.models.filter(model => matches(model, query))));
|
|
74
|
+
}
|
|
75
|
+
const legacy = providers.flatMap(entry => entry.models.filter(model => model.legacy).map(model => ({
|
|
76
|
+
kind: 'model',
|
|
77
|
+
provider: entry,
|
|
78
|
+
model
|
|
79
|
+
})));
|
|
80
|
+
const live = providers.flatMap(entry => {
|
|
81
|
+
const models = entry.models.filter(model => !model.legacy);
|
|
82
|
+
const shortlist = shortlistOf(entry.kind, models, current, favoritesOf(entry.kind));
|
|
83
|
+
if (shortlist === null) {
|
|
84
|
+
return rowsOf(entry, models);
|
|
54
85
|
}
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
if (expanded.has(entry.kind)) {
|
|
63
|
-
return [{ kind: 'all', provider: entry, count: models.length, open: true }, ...rowsOf(entry, models)];
|
|
64
|
-
}
|
|
65
|
-
return [...rowsOf(entry, shortlist), { kind: 'all', provider: entry, count: models.length, open: false }];
|
|
66
|
-
});
|
|
67
|
-
if (legacy.length === 0) {
|
|
68
|
-
return live;
|
|
86
|
+
if (expanded.has(entry.kind)) {
|
|
87
|
+
return [{
|
|
88
|
+
kind: 'all',
|
|
89
|
+
provider: entry,
|
|
90
|
+
count: models.length,
|
|
91
|
+
open: true
|
|
92
|
+
}, ...rowsOf(entry, models)];
|
|
69
93
|
}
|
|
70
|
-
return
|
|
71
|
-
|
|
94
|
+
return [...rowsOf(entry, shortlist), {
|
|
95
|
+
kind: 'all',
|
|
96
|
+
provider: entry,
|
|
97
|
+
count: models.length,
|
|
98
|
+
open: false
|
|
99
|
+
}];
|
|
100
|
+
});
|
|
101
|
+
if (legacy.length === 0) {
|
|
102
|
+
return live;
|
|
103
|
+
}
|
|
104
|
+
return legacyOpen ? [...live, {
|
|
105
|
+
kind: 'legacy',
|
|
106
|
+
count: legacy.length
|
|
107
|
+
}, ...legacy] : [...live, {
|
|
108
|
+
kind: 'legacy',
|
|
109
|
+
count: legacy.length
|
|
110
|
+
}];
|
|
111
|
+
}
|
|
@@ -1,14 +1,27 @@
|
|
|
1
1
|
import type { ChatInfo, ChatItem, ProviderCapabilities } from '@adecore/agent-contracts';
|
|
2
2
|
export declare const RESUME_COMPACTION_TOKENS = 100000;
|
|
3
3
|
export declare const RESUME_COMPACTION_IDLE_MS: number;
|
|
4
|
+
export type ResumeCompactionReason = 'cache-expired' | 'idle';
|
|
4
5
|
export interface ResumeCompactionOffer {
|
|
5
6
|
turnId: string;
|
|
6
7
|
tokens: number;
|
|
8
|
+
reason: ResumeCompactionReason;
|
|
7
9
|
}
|
|
8
|
-
|
|
10
|
+
interface OfferInput {
|
|
9
11
|
info: ChatInfo;
|
|
10
12
|
compaction: ProviderCapabilities['compaction'] | undefined;
|
|
11
13
|
items: readonly ChatItem[];
|
|
12
14
|
dismissedTurnId: string | null;
|
|
15
|
+
}
|
|
16
|
+
export declare function resumeCompactionDueAt(input: OfferInput): number | null;
|
|
17
|
+
export declare function resumeCompactionOffer(input: OfferInput & {
|
|
13
18
|
now: number;
|
|
14
19
|
}): ResumeCompactionOffer | null;
|
|
20
|
+
export interface DueClock {
|
|
21
|
+
now(): number;
|
|
22
|
+
setTimer(run: () => void, ms: number): unknown;
|
|
23
|
+
clearTimer(timer: unknown): void;
|
|
24
|
+
onWake(wake: () => void): () => void;
|
|
25
|
+
}
|
|
26
|
+
export declare function watchDueAt(dueAt: number, due: (now: number) => void, clock: DueClock): () => void;
|
|
27
|
+
export {};
|
|
@@ -5,34 +5,103 @@
|
|
|
5
5
|
export const RESUME_COMPACTION_TOKENS = 100_000;
|
|
6
6
|
/* The longest prompt cache Claude keeps is an hour, so past this the whole thread is read again anyway. */
|
|
7
7
|
export const RESUME_COMPACTION_IDLE_MS = 70 * 60_000;
|
|
8
|
+
/* The newest turn by when it started, so a thread that arrives out of order still names the turn that ran last. */
|
|
8
9
|
function lastTurn(items) {
|
|
9
|
-
|
|
10
|
+
let last = null;
|
|
11
|
+
for (const item of items) {
|
|
12
|
+
if (item.kind === 'turn' && (last === null || item.createdAt >= last.createdAt)) {
|
|
13
|
+
last = item;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
return last;
|
|
17
|
+
}
|
|
18
|
+
/* The turn an offer would be about, or null while nothing could be offered whatever the time. */
|
|
19
|
+
function offerableTurn({
|
|
20
|
+
info,
|
|
21
|
+
compaction,
|
|
22
|
+
items,
|
|
23
|
+
dismissedTurnId
|
|
24
|
+
}) {
|
|
25
|
+
if (compaction === undefined || compaction === 'none') {
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
if (info.activeTurnId !== null || (info.queue ?? []).length > 0) {
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
if (info.usage.contextTokens < RESUME_COMPACTION_TOKENS) {
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
const turn = lastTurn(items);
|
|
35
|
+
if (turn === null || turn.endedAt === null || turn.id === dismissedTurnId) {
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
/*
|
|
39
|
+
* `contextTokens` keeps the old number until the next request, so without this the offer would
|
|
40
|
+
* come straight back after a compaction. A native compaction is a turn without a message of the
|
|
41
|
+
* person, which is why this looks at the turn and not at the last thing that was said.
|
|
42
|
+
*/
|
|
43
|
+
if (items.some(item => item.kind === 'compaction' && item.turnId === turn.id)) {
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
return turn;
|
|
47
|
+
}
|
|
48
|
+
/* A silence longer than any cache lives stands in for an expiry from a CLI that names none. */
|
|
49
|
+
function dueAtOf(info, endedAt) {
|
|
50
|
+
return info.usage.cacheExpiresAt ?? endedAt + RESUME_COMPACTION_IDLE_MS;
|
|
51
|
+
}
|
|
52
|
+
/*
|
|
53
|
+
* When the next message would pay for the whole thread again, or null while nothing could be offered,
|
|
54
|
+
* so a surface knows whether to keep a timer.
|
|
55
|
+
*/
|
|
56
|
+
export function resumeCompactionDueAt(input) {
|
|
57
|
+
const endedAt = offerableTurn(input)?.endedAt ?? null;
|
|
58
|
+
return endedAt === null ? null : dueAtOf(input.info, endedAt);
|
|
10
59
|
}
|
|
11
60
|
/* Whether to offer compacting before the next message. */
|
|
12
|
-
export function resumeCompactionOffer(
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
61
|
+
export function resumeCompactionOffer(input) {
|
|
62
|
+
const turn = offerableTurn(input);
|
|
63
|
+
if (turn === null || turn.endedAt === null || input.now < dueAtOf(input.info, turn.endedAt)) {
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
return {
|
|
67
|
+
turnId: turn.id,
|
|
68
|
+
tokens: input.info.usage.contextTokens,
|
|
69
|
+
reason: input.info.usage.cacheExpiresAt === undefined ? 'idle' : 'cache-expired'
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
/*
|
|
73
|
+
* Calls `due` with the time once `dueAt` passed. A timer can fire a few milliseconds early, and one that runs on a
|
|
74
|
+
* monotonic clock fires late after the system slept, so an early timer is armed again and a wake looks at once.
|
|
75
|
+
*/
|
|
76
|
+
export function watchDueAt(dueAt, due, clock) {
|
|
77
|
+
let timer = null;
|
|
78
|
+
let done = false;
|
|
79
|
+
const check = () => {
|
|
80
|
+
if (timer !== null) {
|
|
81
|
+
clock.clearTimer(timer);
|
|
82
|
+
timer = null;
|
|
21
83
|
}
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
return null;
|
|
84
|
+
if (done) {
|
|
85
|
+
return;
|
|
25
86
|
}
|
|
26
|
-
|
|
27
|
-
|
|
87
|
+
const now = clock.now();
|
|
88
|
+
if (now >= dueAt) {
|
|
89
|
+
done = true;
|
|
90
|
+
due(now);
|
|
91
|
+
return;
|
|
28
92
|
}
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
93
|
+
timer = clock.setTimer(() => {
|
|
94
|
+
timer = null;
|
|
95
|
+
check();
|
|
96
|
+
}, dueAt - now);
|
|
97
|
+
};
|
|
98
|
+
const stopWake = clock.onWake(check);
|
|
99
|
+
check();
|
|
100
|
+
return () => {
|
|
101
|
+
done = true;
|
|
102
|
+
stopWake();
|
|
103
|
+
if (timer !== null) {
|
|
104
|
+
clock.clearTimer(timer);
|
|
36
105
|
}
|
|
37
|
-
|
|
38
|
-
}
|
|
106
|
+
};
|
|
107
|
+
}
|