@adecore/agents-react 0.31.12 → 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 +1945 -164
- 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 +34 -0
- package/dist/locales/en/agent-chat.js +747 -713
- 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 +34 -0
- package/dist/locales/nl/agent-chat.js +747 -713
- 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 -27
- 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.js +404 -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 +10 -5
- 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 +134 -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 +126 -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/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 +2 -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
|
@@ -2,55 +2,79 @@ import i18next from 'i18next';
|
|
|
2
2
|
import { accountFor, readChatPreferences, rememberChatAccount } from '../chat/preferences.js';
|
|
3
3
|
import { providerAccountsOf, useProviderAccountsStore } from '../state/provider-accounts.js';
|
|
4
4
|
function words(key, values) {
|
|
5
|
-
|
|
5
|
+
return i18next.t(`agent-providers:${key}`, values);
|
|
6
6
|
}
|
|
7
7
|
function reason(e) {
|
|
8
|
-
|
|
8
|
+
return e instanceof Error ? e.message : String(e);
|
|
9
9
|
}
|
|
10
10
|
function linkTo(scope) {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
11
|
+
if (scope.transport.status !== 'open') {
|
|
12
|
+
throw new Error(words('notAnswering'));
|
|
13
|
+
}
|
|
14
|
+
return scope.transport;
|
|
15
15
|
}
|
|
16
16
|
/* The whole map, as `accounts.save` takes it. Answers false when the host refused, which a toast then says. */
|
|
17
17
|
export async function saveAccounts(scope, host, accounts) {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
18
|
+
try {
|
|
19
|
+
useProviderAccountsStore.getState().set(scope.id, await linkTo(scope).request('accounts.save', {
|
|
20
|
+
accounts
|
|
21
|
+
}));
|
|
22
|
+
return true;
|
|
23
|
+
} catch (e) {
|
|
24
|
+
host.notify({
|
|
25
|
+
id: `providers-save-${scope.id}`,
|
|
26
|
+
kind: 'error',
|
|
27
|
+
title: words('account.saveFailed'),
|
|
28
|
+
description: reason(e)
|
|
29
|
+
});
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
26
32
|
}
|
|
27
33
|
/* One account changed and every other one as the host last said. */
|
|
28
34
|
export function saveAccount(scope, host, id, account) {
|
|
29
|
-
|
|
30
|
-
|
|
35
|
+
const current = providerAccountsOf(scope.id).accounts?.accounts ?? {};
|
|
36
|
+
return saveAccounts(scope, host, {
|
|
37
|
+
...current,
|
|
38
|
+
[id]: account
|
|
39
|
+
});
|
|
31
40
|
}
|
|
32
41
|
/*
|
|
33
42
|
* Forgets an account; its folder stays where it is. A pick for new agents that named it goes back to
|
|
34
43
|
* the CLI's default account, since no chat started from it yet.
|
|
35
44
|
*/
|
|
36
45
|
export async function removeAccount(scope, host, id, kind) {
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
46
|
+
const {
|
|
47
|
+
[id]: _gone,
|
|
48
|
+
...rest
|
|
49
|
+
} = providerAccountsOf(scope.id).accounts?.accounts ?? {};
|
|
50
|
+
if (!(await saveAccounts(scope, host, rest))) {
|
|
51
|
+
throw new Error(words('account.saveFailed'));
|
|
52
|
+
}
|
|
53
|
+
if (accountFor(readChatPreferences(), scope.id, kind) === id) {
|
|
54
|
+
rememberChatAccount(scope.id, kind, null);
|
|
55
|
+
}
|
|
44
56
|
}
|
|
45
57
|
/* An account in a folder the host makes for it; answers its id. Throws what the host said, for the form to show. */
|
|
46
58
|
export async function createAccount(scope, kind, label, color) {
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
59
|
+
const created = await linkTo(scope).request('accounts.create', {
|
|
60
|
+
kind,
|
|
61
|
+
label,
|
|
62
|
+
color
|
|
63
|
+
});
|
|
64
|
+
const {
|
|
65
|
+
id,
|
|
66
|
+
...accounts
|
|
67
|
+
} = created;
|
|
68
|
+
useProviderAccountsStore.getState().set(scope.id, accounts);
|
|
69
|
+
return id;
|
|
51
70
|
}
|
|
52
71
|
/* An account in a folder that is already on the host. Throws what the host said, for the form to show. */
|
|
53
72
|
export async function linkAccount(scope, id, account) {
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
73
|
+
const current = providerAccountsOf(scope.id).accounts?.accounts ?? {};
|
|
74
|
+
useProviderAccountsStore.getState().set(scope.id, await linkTo(scope).request('accounts.save', {
|
|
75
|
+
accounts: {
|
|
76
|
+
...current,
|
|
77
|
+
[id]: account
|
|
78
|
+
}
|
|
79
|
+
}));
|
|
80
|
+
}
|
package/dist/providers/index.js
CHANGED
|
@@ -8,4 +8,4 @@ export { modelName, useModelName, shortModelName } from '../agents/model-name.js
|
|
|
8
8
|
export { carryOptions } from '../agents/model-options.js';
|
|
9
9
|
export {} from '../agents/model-requirement.js';
|
|
10
10
|
export { ProvidersPane } from './ProvidersPane.js';
|
|
11
|
-
export { CliMark, CliTile } from './parts.js';
|
|
11
|
+
export { CliMark, CliTile } from './parts.js';
|
|
@@ -2,18 +2,21 @@ import { isApplePlatform } from '@adecore/ui';
|
|
|
2
2
|
const PLATFORMS = ['darwin', 'linux', 'win32'];
|
|
3
3
|
/* The first step not done is the current one. */
|
|
4
4
|
export function installStepStates(done) {
|
|
5
|
-
|
|
6
|
-
|
|
5
|
+
const first = done.indexOf(false);
|
|
6
|
+
return done.map((value, index) => value ? 'done' : index === first ? 'current' : 'later');
|
|
7
7
|
}
|
|
8
8
|
/* The system of the page, for a host that does not say which system its machine runs. */
|
|
9
9
|
export function pagePlatform() {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
10
|
+
if (isApplePlatform()) {
|
|
11
|
+
return 'darwin';
|
|
12
|
+
}
|
|
13
|
+
return typeof navigator !== 'undefined' && /windows/i.test(navigator.userAgent) ? 'win32' : 'linux';
|
|
14
14
|
}
|
|
15
15
|
/* The systems a provider has a command for, and the one the page opens on: the machine's when it has one there. */
|
|
16
16
|
export function installPlatforms(provider, machine) {
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
17
|
+
const offered = PLATFORMS.filter(platform => Boolean(provider.install?.commands[platform]));
|
|
18
|
+
return {
|
|
19
|
+
offered,
|
|
20
|
+
initial: offered.includes(machine) ? machine : offered[0] ?? null
|
|
21
|
+
};
|
|
22
|
+
}
|
|
@@ -11,5 +11,8 @@ export type Picked = {
|
|
|
11
11
|
} | {
|
|
12
12
|
kind: 'add';
|
|
13
13
|
cli: AgentKind;
|
|
14
|
+
} | {
|
|
15
|
+
kind: 'catalog';
|
|
14
16
|
};
|
|
15
17
|
export declare function pickOfTarget(target: string | null, providers: ProviderInfo[]): Picked | null;
|
|
18
|
+
export declare function pickOfCli(cli: AgentKind, providers: ProviderInfo[]): Picked;
|
|
@@ -1,17 +1,38 @@
|
|
|
1
1
|
const INSTALL_TARGET = 'providers.install.';
|
|
2
|
+
const ADD_TARGET = 'providers.add';
|
|
2
3
|
/* What a target opens on its own, before any CLI is picked; null for a target that only lands on a row of the CLI already shown. */
|
|
3
4
|
export function pickOfTarget(target, providers) {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
return
|
|
5
|
+
if (target === 'providers.apple') {
|
|
6
|
+
return {
|
|
7
|
+
kind: 'cli',
|
|
8
|
+
cli: 'apple'
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
if (target === ADD_TARGET) {
|
|
12
|
+
return {
|
|
13
|
+
kind: 'catalog'
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
if (!target?.startsWith(INSTALL_TARGET) || target.length === INSTALL_TARGET.length) {
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
return pickOfCli(target.slice(INSTALL_TARGET.length), providers);
|
|
17
20
|
}
|
|
21
|
+
/*
|
|
22
|
+
* A CLI opened by name, from a target or from the host's page that just added it: its detail once it is there, its
|
|
23
|
+
* install page while it is missing. A CLI the host has not reported yet is taken as missing, so the pick holds until
|
|
24
|
+
* the next list names it; once it is installed and signed in, its install page gives way to its detail.
|
|
25
|
+
*/
|
|
26
|
+
export function pickOfCli(cli, providers) {
|
|
27
|
+
const provider = providers.find(entry => entry.kind === cli);
|
|
28
|
+
if (provider !== undefined && (provider.installed || !provider.capabilities.terminal)) {
|
|
29
|
+
return {
|
|
30
|
+
kind: 'cli',
|
|
31
|
+
cli
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
return {
|
|
35
|
+
kind: 'install',
|
|
36
|
+
cli
|
|
37
|
+
};
|
|
38
|
+
}
|
package/dist/providers/parts.js
CHANGED
|
@@ -1,20 +1,70 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { c as _c } from "react/compiler-runtime";
|
|
2
2
|
import clsx from 'clsx';
|
|
3
3
|
import { AgentIcon } from '../agents/AgentIcon.js';
|
|
4
4
|
// Each CLI in its color of the usage charts, so a mark here reads as the same CLI there. A CLI without
|
|
5
5
|
// a chart color of its own is muted.
|
|
6
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
6
7
|
const CLI_COLORS = {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
8
|
+
claude: 'text-chart-claude',
|
|
9
|
+
codex: 'text-chart-codex',
|
|
10
|
+
gemini: 'text-chart-gemini',
|
|
11
|
+
copilot: 'text-chart-copilot',
|
|
12
|
+
nanogpt: 'text-chart-nanogpt',
|
|
13
|
+
grok: 'text-chart-grok'
|
|
13
14
|
};
|
|
14
|
-
export function CliMark(
|
|
15
|
-
|
|
15
|
+
export function CliMark(t0) {
|
|
16
|
+
const $ = _c(7);
|
|
17
|
+
const {
|
|
18
|
+
kind,
|
|
19
|
+
size: t1,
|
|
20
|
+
className
|
|
21
|
+
} = t0;
|
|
22
|
+
const size = t1 === undefined ? 14 : t1;
|
|
23
|
+
const t2 = CLI_COLORS[kind] ?? "text-text-muted";
|
|
24
|
+
let t3;
|
|
25
|
+
if ($[0] !== className || $[1] !== t2) {
|
|
26
|
+
t3 = clsx("shrink-0", t2, className);
|
|
27
|
+
$[0] = className;
|
|
28
|
+
$[1] = t2;
|
|
29
|
+
$[2] = t3;
|
|
30
|
+
} else {
|
|
31
|
+
t3 = $[2];
|
|
32
|
+
}
|
|
33
|
+
let t4;
|
|
34
|
+
if ($[3] !== kind || $[4] !== size || $[5] !== t3) {
|
|
35
|
+
t4 = /*#__PURE__*/_jsx(AgentIcon, {
|
|
36
|
+
kind: kind,
|
|
37
|
+
size: size,
|
|
38
|
+
className: t3
|
|
39
|
+
});
|
|
40
|
+
$[3] = kind;
|
|
41
|
+
$[4] = size;
|
|
42
|
+
$[5] = t3;
|
|
43
|
+
$[6] = t4;
|
|
44
|
+
} else {
|
|
45
|
+
t4 = $[6];
|
|
46
|
+
}
|
|
47
|
+
return t4;
|
|
16
48
|
}
|
|
17
49
|
/* As tall as the title's first line, so the mark sits beside the name rather than between the two lines. */
|
|
18
|
-
export function CliTile(
|
|
19
|
-
|
|
20
|
-
|
|
50
|
+
export function CliTile(t0) {
|
|
51
|
+
const $ = _c(2);
|
|
52
|
+
const {
|
|
53
|
+
kind
|
|
54
|
+
} = t0;
|
|
55
|
+
let t1;
|
|
56
|
+
if ($[0] !== kind) {
|
|
57
|
+
t1 = /*#__PURE__*/_jsx("span", {
|
|
58
|
+
className: "grid h-6 shrink-0 place-items-center",
|
|
59
|
+
children: /*#__PURE__*/_jsx(CliMark, {
|
|
60
|
+
kind: kind,
|
|
61
|
+
size: 24
|
|
62
|
+
})
|
|
63
|
+
});
|
|
64
|
+
$[0] = kind;
|
|
65
|
+
$[1] = t1;
|
|
66
|
+
} else {
|
|
67
|
+
t1 = $[1];
|
|
68
|
+
}
|
|
69
|
+
return t1;
|
|
70
|
+
}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import i18next from 'i18next';
|
|
2
2
|
/* What a provider offers, in one sentence, where it can be opened and whether its hooks report status. */
|
|
3
3
|
export function providerAbilities(provider) {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
4
|
+
const where = provider.capabilities.chat ? i18next.t('agent-providers:abilities.chatAndTerminal') : i18next.t('agent-providers:abilities.terminalOnly');
|
|
5
|
+
const status = provider.capabilities.hooks ? i18next.t('agent-providers:abilities.reportsStatus') : i18next.t('agent-providers:abilities.noStatus');
|
|
6
|
+
return `${where} ${status}`;
|
|
7
7
|
}
|
|
8
8
|
/* Whether a message sent while a turn runs may join it. Undefined while the host has not answered `provider.list`, which steers nothing. */
|
|
9
9
|
export function canSteer(capabilities) {
|
|
10
|
-
|
|
11
|
-
}
|
|
10
|
+
return capabilities?.steer === true;
|
|
11
|
+
}
|
|
@@ -2,51 +2,86 @@ import i18next from 'i18next';
|
|
|
2
2
|
import { accountsOfKind } from '../agents/accounts.js';
|
|
3
3
|
/* What an account says beside its name: its plan while it is ready, a short word when it is not, nothing while it is checked. */
|
|
4
4
|
export function accountNote(status) {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
5
|
+
const words = key => i18next.t(`agent-providers:${key}`);
|
|
6
|
+
switch (status?.state ?? 'checking') {
|
|
7
|
+
case 'checking':
|
|
8
|
+
return null;
|
|
9
|
+
case 'ready':
|
|
10
|
+
return status?.plan ? {
|
|
11
|
+
text: status.plan,
|
|
12
|
+
tone: 'muted'
|
|
13
|
+
} : null;
|
|
14
|
+
case 'signed-out':
|
|
15
|
+
return {
|
|
16
|
+
text: words('list.signedOut'),
|
|
17
|
+
tone: 'warning'
|
|
18
|
+
};
|
|
19
|
+
case 'failed':
|
|
20
|
+
return {
|
|
21
|
+
text: words('status.failed'),
|
|
22
|
+
tone: 'warning'
|
|
23
|
+
};
|
|
24
|
+
case 'folder-missing':
|
|
25
|
+
return {
|
|
26
|
+
text: words('status.folderMissing'),
|
|
27
|
+
tone: 'warning'
|
|
28
|
+
};
|
|
29
|
+
case 'disabled':
|
|
30
|
+
return {
|
|
31
|
+
text: words('status.disabled'),
|
|
32
|
+
tone: 'muted'
|
|
33
|
+
};
|
|
34
|
+
case 'not-found':
|
|
35
|
+
return {
|
|
36
|
+
text: words('status.notFound'),
|
|
37
|
+
tone: 'muted'
|
|
38
|
+
};
|
|
39
|
+
case 'unavailable':
|
|
40
|
+
return {
|
|
41
|
+
text: words('status.unavailable'),
|
|
42
|
+
tone: 'muted'
|
|
43
|
+
};
|
|
44
|
+
}
|
|
24
45
|
}
|
|
25
46
|
// An account still being checked counts as usable, so a provider does not hop between groups while the checks run.
|
|
26
|
-
const usable =
|
|
47
|
+
const usable = entry => entry.status === null || entry.status.state === 'ready' || entry.status.state === 'checking';
|
|
27
48
|
/*
|
|
28
49
|
* The providers in the three groups of the list. A provider the host says is not set up needs setup whatever
|
|
29
50
|
* its accounts say; otherwise one usable account, or none to read, makes it ready.
|
|
30
51
|
*/
|
|
31
52
|
export function groupProviders(providers, accounts, setupStatusOf) {
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
groups.setup.push({ provider, entries, note: hostStatus });
|
|
43
|
-
}
|
|
44
|
-
else if (entries.length === 0 || entries.some(usable)) {
|
|
45
|
-
groups.ready.push({ provider, entries, note: entries.length === 1 ? accountNote(entries[0].status) : null });
|
|
46
|
-
}
|
|
47
|
-
else {
|
|
48
|
-
groups.setup.push({ provider, entries, note: accountNote(entries[0].status) });
|
|
49
|
-
}
|
|
53
|
+
const groups = {
|
|
54
|
+
ready: [],
|
|
55
|
+
setup: [],
|
|
56
|
+
missing: []
|
|
57
|
+
};
|
|
58
|
+
for (const provider of providers) {
|
|
59
|
+
// A provider that never runs in a terminal is no CLI to install: it is turned on in its own detail.
|
|
60
|
+
if (!provider.installed && provider.capabilities.terminal) {
|
|
61
|
+
groups.missing.push(provider);
|
|
62
|
+
continue;
|
|
50
63
|
}
|
|
51
|
-
|
|
52
|
-
|
|
64
|
+
const entries = provider.installed ? accountsOfKind(accounts, provider.kind) : [];
|
|
65
|
+
const hostStatus = setupStatusOf?.(provider) ?? null;
|
|
66
|
+
if (hostStatus !== null) {
|
|
67
|
+
groups.setup.push({
|
|
68
|
+
provider,
|
|
69
|
+
entries,
|
|
70
|
+
note: hostStatus
|
|
71
|
+
});
|
|
72
|
+
} else if (entries.length === 0 || entries.some(usable)) {
|
|
73
|
+
groups.ready.push({
|
|
74
|
+
provider,
|
|
75
|
+
entries,
|
|
76
|
+
note: entries.length === 1 ? accountNote(entries[0].status) : null
|
|
77
|
+
});
|
|
78
|
+
} else {
|
|
79
|
+
groups.setup.push({
|
|
80
|
+
provider,
|
|
81
|
+
entries,
|
|
82
|
+
note: accountNote(entries[0].status)
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return groups;
|
|
87
|
+
}
|
|
@@ -2,62 +2,96 @@ import i18next from 'i18next';
|
|
|
2
2
|
const NAME = /^[A-Za-z_][A-Za-z0-9_]{0,127}$/;
|
|
3
3
|
let drafted = 0;
|
|
4
4
|
function nextKey() {
|
|
5
|
-
|
|
6
|
-
|
|
5
|
+
drafted += 1;
|
|
6
|
+
return `variable-${drafted}`;
|
|
7
7
|
}
|
|
8
8
|
export function draftsOf(env) {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
9
|
+
return (env ?? []).map(variable => ({
|
|
10
|
+
key: nextKey(),
|
|
11
|
+
name: variable.name,
|
|
12
|
+
value: variable.value,
|
|
13
|
+
sensitive: variable.sensitive,
|
|
14
|
+
kept: variable.sensitive && variable.valueRedacted === true ? variable.name : null
|
|
15
|
+
}));
|
|
16
16
|
}
|
|
17
17
|
export function emptyDraft(sensitive) {
|
|
18
|
-
|
|
18
|
+
return {
|
|
19
|
+
key: nextKey(),
|
|
20
|
+
name: '',
|
|
21
|
+
value: '',
|
|
22
|
+
sensitive,
|
|
23
|
+
kept: null
|
|
24
|
+
};
|
|
19
25
|
}
|
|
20
26
|
/*
|
|
21
27
|
* A value the keychain holds only counts under the name it was kept under, and only while it stays
|
|
22
28
|
* sensitive: the machine finds it by that name, and never hands it out to be stored in plain text.
|
|
23
29
|
*/
|
|
24
30
|
function keepsValue(draft) {
|
|
25
|
-
|
|
31
|
+
return draft.value === '' && draft.sensitive && draft.kept === draft.name;
|
|
26
32
|
}
|
|
27
33
|
/* The first thing that keeps these from being saved, in a sentence; null when they can be. */
|
|
28
34
|
export function variablesProblem(drafts) {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
return words('invalidName', name);
|
|
38
|
-
}
|
|
39
|
-
if (seen.has(name)) {
|
|
40
|
-
return words('duplicate', name);
|
|
41
|
-
}
|
|
42
|
-
seen.add(name);
|
|
43
|
-
if (draft.value === '' && !keepsValue({ ...draft, name })) {
|
|
44
|
-
return words('noValue', name);
|
|
45
|
-
}
|
|
35
|
+
const words = (key, name) => i18next.t(`agent-providers:account.variables.problem.${key}`, {
|
|
36
|
+
name
|
|
37
|
+
});
|
|
38
|
+
const seen = new Set();
|
|
39
|
+
for (const draft of drafts) {
|
|
40
|
+
const name = draft.name.trim();
|
|
41
|
+
if (name === '') {
|
|
42
|
+
return words('noName', '');
|
|
46
43
|
}
|
|
47
|
-
|
|
44
|
+
if (!NAME.test(name)) {
|
|
45
|
+
return words('invalidName', name);
|
|
46
|
+
}
|
|
47
|
+
if (seen.has(name)) {
|
|
48
|
+
return words('duplicate', name);
|
|
49
|
+
}
|
|
50
|
+
seen.add(name);
|
|
51
|
+
if (draft.value === '' && !keepsValue({
|
|
52
|
+
...draft,
|
|
53
|
+
name
|
|
54
|
+
})) {
|
|
55
|
+
return words('noValue', name);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return null;
|
|
48
59
|
}
|
|
49
60
|
/* The variables as `accounts.save` takes them; a kept value goes back empty and redacted, so the machine keeps what it has. */
|
|
50
61
|
export function variablesOf(drafts) {
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
62
|
+
return drafts.map(draft => {
|
|
63
|
+
const name = draft.name.trim();
|
|
64
|
+
if (keepsValue({
|
|
65
|
+
...draft,
|
|
66
|
+
name
|
|
67
|
+
})) {
|
|
68
|
+
return {
|
|
69
|
+
name,
|
|
70
|
+
value: '',
|
|
71
|
+
sensitive: true,
|
|
72
|
+
valueRedacted: true
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
return {
|
|
76
|
+
name,
|
|
77
|
+
value: draft.value,
|
|
78
|
+
sensitive: draft.sensitive
|
|
79
|
+
};
|
|
80
|
+
});
|
|
58
81
|
}
|
|
59
82
|
/* Whether the drafts say something other than what the machine holds. */
|
|
60
83
|
export function variablesChanged(drafts, env) {
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
84
|
+
return JSON.stringify(variablesOf(drafts)) !== JSON.stringify((env ?? []).map(({
|
|
85
|
+
name,
|
|
86
|
+
value,
|
|
87
|
+
sensitive,
|
|
88
|
+
valueRedacted
|
|
89
|
+
}) => ({
|
|
90
|
+
name,
|
|
91
|
+
value,
|
|
92
|
+
sensitive,
|
|
93
|
+
...(valueRedacted ? {
|
|
94
|
+
valueRedacted
|
|
95
|
+
} : {})
|
|
96
|
+
})));
|
|
97
|
+
}
|
package/dist/scope.js
CHANGED
|
@@ -2,9 +2,9 @@ import { createContext, useContext } from 'react';
|
|
|
2
2
|
export const ChatScopeContext = createContext(null);
|
|
3
3
|
/* Throws outside a scope on purpose: a component that reads a chat has to know which host it runs on. */
|
|
4
4
|
export function useChatScope() {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
}
|
|
5
|
+
const scope = useContext(ChatScopeContext);
|
|
6
|
+
if (scope === null) {
|
|
7
|
+
throw new Error("This component reads a chat, so it has to be rendered inside a ChatScopeContext");
|
|
8
|
+
}
|
|
9
|
+
return scope;
|
|
10
|
+
}
|
|
@@ -2,18 +2,18 @@ import i18next from 'i18next';
|
|
|
2
2
|
import { Brain, ChartNoAxesColumn } from 'lucide-react';
|
|
3
3
|
/* The agent CLIs of the host and the accounts they sign in with: `ProvidersPane`. */
|
|
4
4
|
export const PROVIDERS_SECTION = {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
5
|
+
id: 'providers',
|
|
6
|
+
icon: Brain,
|
|
7
|
+
split: true,
|
|
8
|
+
label: () => i18next.t('agent-providers:section.label'),
|
|
9
|
+
description: () => i18next.t('agent-providers:section.description')
|
|
10
10
|
};
|
|
11
11
|
/* The currency of the usage page and the way to it: `UsagePane`. */
|
|
12
12
|
export const USAGE_SECTION = {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
13
|
+
id: 'usage',
|
|
14
|
+
icon: ChartNoAxesColumn,
|
|
15
|
+
label: () => i18next.t('agent-usage:section.label'),
|
|
16
|
+
description: () => i18next.t('agent-usage:section.description')
|
|
17
17
|
};
|
|
18
18
|
/*
|
|
19
19
|
* The entry the dialog takes for a section, with the pane the app hands it: the pane of this package
|
|
@@ -21,12 +21,12 @@ export const USAGE_SECTION = {
|
|
|
21
21
|
* draws, since the words follow the language.
|
|
22
22
|
*/
|
|
23
23
|
export function settingsSection(section, pane) {
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
}
|
|
24
|
+
return {
|
|
25
|
+
id: section.id,
|
|
26
|
+
icon: section.icon,
|
|
27
|
+
label: section.label(),
|
|
28
|
+
description: section.description(),
|
|
29
|
+
pane,
|
|
30
|
+
split: section.split
|
|
31
|
+
};
|
|
32
|
+
}
|