@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
package/dist/state/chats.js
CHANGED
|
@@ -1,252 +1,468 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { c as _c } from "react/compiler-runtime";
|
|
2
|
+
import { useContext } from 'react';
|
|
2
3
|
import { create } from 'zustand';
|
|
3
4
|
import { appendToolOutput } from '@adecore/agent-contracts/text';
|
|
4
5
|
import { ChatScopeContext, useChatScope } from '../scope.js';
|
|
5
6
|
function isWaiting(item) {
|
|
6
|
-
|
|
7
|
+
return item?.kind === 'approval' && item.decision === 'pending' || item?.kind === 'question' && item.state === 'pending';
|
|
7
8
|
}
|
|
8
9
|
function stateOf(info, items, page) {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
return { info, items: byId, structure: byId, order };
|
|
13
|
-
}
|
|
14
|
-
const before = page.pending.filter((item) => !(item.id in byId));
|
|
15
|
-
const subagents = (page.subagents ?? []).filter((item) => !(item.id in byId));
|
|
16
|
-
for (const item of [...before, ...subagents]) {
|
|
17
|
-
byId[item.id] = item;
|
|
18
|
-
}
|
|
10
|
+
const byId = Object.fromEntries(items.map(item => [item.id, item]));
|
|
11
|
+
const order = items.map(item => item.id);
|
|
12
|
+
if (page === undefined || page.history.cursor === null) {
|
|
19
13
|
return {
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
history: page.history,
|
|
25
|
-
waitingBefore: before.map((item) => item.id),
|
|
26
|
-
subagentsBefore: subagents.map((item) => item.id)
|
|
14
|
+
info,
|
|
15
|
+
items: byId,
|
|
16
|
+
structure: byId,
|
|
17
|
+
order
|
|
27
18
|
};
|
|
19
|
+
}
|
|
20
|
+
const before = page.pending.filter(item => !(item.id in byId));
|
|
21
|
+
const subagents = (page.subagents ?? []).filter(item => !(item.id in byId));
|
|
22
|
+
for (const item of [...before, ...subagents]) {
|
|
23
|
+
byId[item.id] = item;
|
|
24
|
+
}
|
|
25
|
+
return {
|
|
26
|
+
info,
|
|
27
|
+
items: byId,
|
|
28
|
+
structure: byId,
|
|
29
|
+
order,
|
|
30
|
+
history: page.history,
|
|
31
|
+
waitingBefore: before.map(item => item.id),
|
|
32
|
+
subagentsBefore: subagents.map(item => item.id)
|
|
33
|
+
};
|
|
28
34
|
}
|
|
29
35
|
/* An older host names no place in the thread, and it always hands over the whole of it. */
|
|
30
36
|
function isBeforePage(state, historyIndex) {
|
|
31
|
-
|
|
37
|
+
return state.history !== undefined && historyIndex !== undefined && historyIndex < state.history.start;
|
|
32
38
|
}
|
|
33
39
|
/* An item from before the page this client holds matters only as a sub-agent, a request that waits, or one that stopped waiting. */
|
|
34
40
|
function withEarlierItem(state, item) {
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
41
|
+
if (item.kind === 'subagent') {
|
|
42
|
+
const subagents = state.subagentsBefore ?? [];
|
|
43
|
+
return {
|
|
44
|
+
...withItem(state, item),
|
|
45
|
+
subagentsBefore: subagents.includes(item.id) ? subagents : [...subagents, item.id]
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
const waiting = state.waitingBefore ?? [];
|
|
49
|
+
const held = waiting.includes(item.id);
|
|
50
|
+
if (isWaiting(item)) {
|
|
51
|
+
return {
|
|
52
|
+
...withItem(state, item),
|
|
53
|
+
waitingBefore: held ? waiting : [...waiting, item.id]
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
return held ? {
|
|
57
|
+
...withItem(state, item),
|
|
58
|
+
waitingBefore: waiting.filter(id => id !== item.id)
|
|
59
|
+
} : state;
|
|
45
60
|
}
|
|
46
61
|
/* The page before the one a chat holds, unless the thread was read again since that page was asked for. */
|
|
47
62
|
export function prependPage(state, cursor, page) {
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
63
|
+
if (state.history?.cursor !== cursor) {
|
|
64
|
+
return state;
|
|
65
|
+
}
|
|
66
|
+
const held = new Set(state.order);
|
|
67
|
+
const older = page.items.filter(item => !held.has(item.id));
|
|
68
|
+
const olderIds = new Set(older.map(item => item.id));
|
|
69
|
+
const items = {
|
|
70
|
+
...state.items
|
|
71
|
+
};
|
|
72
|
+
for (const item of older) {
|
|
73
|
+
// A request from before the page that this client already holds came in live, which is never older than the page.
|
|
74
|
+
items[item.id] = state.items[item.id] ?? item;
|
|
75
|
+
}
|
|
76
|
+
const order = [...olderIds, ...state.order];
|
|
77
|
+
if (page.history.cursor === null) {
|
|
78
|
+
const {
|
|
79
|
+
history: _history,
|
|
80
|
+
waitingBefore: _waitingBefore,
|
|
81
|
+
subagentsBefore: _subagentsBefore,
|
|
82
|
+
...rest
|
|
83
|
+
} = state;
|
|
84
|
+
return {
|
|
85
|
+
...rest,
|
|
86
|
+
items,
|
|
87
|
+
structure: items,
|
|
88
|
+
order
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
const waitingBefore = (state.waitingBefore ?? []).filter(id => !olderIds.has(id));
|
|
92
|
+
const subagentsBefore = (state.subagentsBefore ?? []).filter(id => !olderIds.has(id));
|
|
93
|
+
return {
|
|
94
|
+
...state,
|
|
95
|
+
items,
|
|
96
|
+
structure: items,
|
|
97
|
+
order,
|
|
98
|
+
history: page.history,
|
|
99
|
+
waitingBefore,
|
|
100
|
+
subagentsBefore
|
|
101
|
+
};
|
|
67
102
|
}
|
|
68
103
|
/* The requests that still wait, oldest first: those from before the page this client holds, then the thread's own. */
|
|
69
104
|
export function waitingRequestsOf(chat) {
|
|
70
|
-
|
|
105
|
+
return [...(chat?.waitingBefore ?? []), ...(chat?.order ?? [])].map(id => chat?.structure[id]).filter(isWaiting);
|
|
71
106
|
}
|
|
72
107
|
/* The state with one item replaced, in the thread and in the structure the rows come from. */
|
|
73
108
|
function withItem(state, item) {
|
|
74
|
-
|
|
75
|
-
|
|
109
|
+
const items = {
|
|
110
|
+
...state.items,
|
|
111
|
+
[item.id]: item
|
|
112
|
+
};
|
|
113
|
+
return {
|
|
114
|
+
...state,
|
|
115
|
+
items,
|
|
116
|
+
structure: items
|
|
117
|
+
};
|
|
76
118
|
}
|
|
77
119
|
/* Cheap enough, since a status only arrives when the host saw one change, never on a streamed word. */
|
|
78
120
|
function sameInfo(left, right) {
|
|
79
|
-
|
|
121
|
+
return JSON.stringify(left) === JSON.stringify(right);
|
|
80
122
|
}
|
|
81
123
|
/* The statuses with this chat's info in them, the same object when that info is already there. */
|
|
82
124
|
function withStatus(statuses, key, info) {
|
|
83
|
-
|
|
125
|
+
return statuses[key]?.info === info ? statuses : {
|
|
126
|
+
...statuses,
|
|
127
|
+
[key]: {
|
|
128
|
+
info
|
|
129
|
+
}
|
|
130
|
+
};
|
|
84
131
|
}
|
|
85
132
|
function without(rows, matches) {
|
|
86
|
-
|
|
133
|
+
return Object.fromEntries(Object.entries(rows).filter(([key]) => !matches(key)));
|
|
87
134
|
}
|
|
88
135
|
export function applyEvent(state, event) {
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
const known = event.item.id in state.items;
|
|
95
|
-
return { ...withItem(state, event.item), order: known ? state.order : [...state.order, event.item.id] };
|
|
136
|
+
switch (event.type) {
|
|
137
|
+
case 'item':
|
|
138
|
+
{
|
|
139
|
+
if (isBeforePage(state, event.historyIndex)) {
|
|
140
|
+
return withEarlierItem(state, event.item);
|
|
96
141
|
}
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
142
|
+
const known = event.item.id in state.items;
|
|
143
|
+
return {
|
|
144
|
+
...withItem(state, event.item),
|
|
145
|
+
order: known ? state.order : [...state.order, event.item.id]
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
case 'delta':
|
|
149
|
+
{
|
|
150
|
+
const item = state.items[event.itemId];
|
|
151
|
+
if (event.uiQueries && item?.kind === 'assistant') {
|
|
152
|
+
// The text first, as the daemon's thread applies it, then the metadata on what it grew into.
|
|
153
|
+
const {
|
|
154
|
+
uiQueries,
|
|
155
|
+
...text
|
|
156
|
+
} = event;
|
|
157
|
+
const grown = event.text === '' ? state : applyEvent(state, text);
|
|
158
|
+
const reply = grown.items[event.itemId] ?? item;
|
|
159
|
+
return {
|
|
160
|
+
...grown,
|
|
161
|
+
items: {
|
|
162
|
+
...grown.items,
|
|
163
|
+
[event.itemId]: {
|
|
164
|
+
...reply,
|
|
165
|
+
uiQueries
|
|
166
|
+
}
|
|
105
167
|
}
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
if (event.ui !== undefined && event.text === '') {
|
|
171
|
+
if (item?.kind === 'assistant' && item.streaming && event.textLength === item.text.length) {
|
|
172
|
+
return {
|
|
173
|
+
...state,
|
|
174
|
+
items: {
|
|
175
|
+
...state.items,
|
|
176
|
+
[event.itemId]: {
|
|
177
|
+
...item,
|
|
178
|
+
ui: event.ui
|
|
109
179
|
}
|
|
110
|
-
|
|
180
|
+
}
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
return state;
|
|
184
|
+
}
|
|
185
|
+
if (item?.kind === 'assistant' || item?.kind === 'thinking') {
|
|
186
|
+
const grown = {
|
|
187
|
+
...item,
|
|
188
|
+
text: item.text + event.text
|
|
189
|
+
};
|
|
190
|
+
// The first text is structure after all, since an empty reply that is not streaming has no row.
|
|
191
|
+
if (item.text === '') {
|
|
192
|
+
return withItem(state, grown);
|
|
193
|
+
}
|
|
194
|
+
return {
|
|
195
|
+
...state,
|
|
196
|
+
items: {
|
|
197
|
+
...state.items,
|
|
198
|
+
[event.itemId]: grown
|
|
111
199
|
}
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
if (item?.kind === 'tool' && item.state === 'running') {
|
|
203
|
+
const progress = item.progress ?? {
|
|
204
|
+
startedAt: null,
|
|
205
|
+
description: null,
|
|
206
|
+
output: null
|
|
207
|
+
};
|
|
208
|
+
const grown = {
|
|
209
|
+
...item,
|
|
210
|
+
progress: {
|
|
211
|
+
...progress,
|
|
212
|
+
output: appendToolOutput(progress.output, event.text)
|
|
119
213
|
}
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
214
|
+
};
|
|
215
|
+
return {
|
|
216
|
+
...state,
|
|
217
|
+
items: {
|
|
218
|
+
...state.items,
|
|
219
|
+
[event.itemId]: grown
|
|
124
220
|
}
|
|
125
|
-
|
|
221
|
+
};
|
|
126
222
|
}
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
223
|
+
return state;
|
|
224
|
+
}
|
|
225
|
+
case 'info':
|
|
226
|
+
return {
|
|
227
|
+
...state,
|
|
228
|
+
info: event.info
|
|
229
|
+
};
|
|
230
|
+
case 'reset':
|
|
231
|
+
return stateOf(event.info, event.items);
|
|
232
|
+
}
|
|
132
233
|
}
|
|
133
234
|
/* Fields of a held chat that are not part of its thread; a chat this client does not hold stays as it is. */
|
|
134
235
|
function withFields(store, key, fields) {
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
// The bookmarks and the visuals are not part of the thread; they come in on their own and outlive a reset of it.
|
|
147
|
-
const { bookmarks, visuals } = s.byKey[key] ?? {};
|
|
148
|
-
const next = { ...stateOf(info, items, page), ...(bookmarks === undefined ? {} : { bookmarks }), ...(visuals === undefined ? {} : { visuals }) };
|
|
149
|
-
return {
|
|
150
|
-
byKey: { ...s.byKey, [key]: next },
|
|
151
|
-
statusByKey: withStatus(s.statusByKey, key, info)
|
|
152
|
-
};
|
|
153
|
-
});
|
|
154
|
-
},
|
|
155
|
-
prepend(key, cursor, page) {
|
|
156
|
-
set((s) => {
|
|
157
|
-
const current = s.byKey[key];
|
|
158
|
-
if (!current) {
|
|
159
|
-
return {};
|
|
160
|
-
}
|
|
161
|
-
const next = prependPage(current, cursor, page);
|
|
162
|
-
return next === current ? {} : { byKey: { ...s.byKey, [key]: next } };
|
|
163
|
-
});
|
|
164
|
-
},
|
|
165
|
-
apply(key, event) {
|
|
166
|
-
set((s) => {
|
|
167
|
-
const current = s.byKey[key];
|
|
168
|
-
if (!current) {
|
|
169
|
-
return {};
|
|
170
|
-
}
|
|
171
|
-
const next = applyEvent(current, event);
|
|
172
|
-
return { byKey: { ...s.byKey, [key]: next }, statusByKey: withStatus(s.statusByKey, key, next.info) };
|
|
173
|
-
});
|
|
174
|
-
},
|
|
175
|
-
/*
|
|
176
|
-
* The status of a chat this window is not reading, which the host sends for every chat it has
|
|
177
|
-
* loaded. The thread stays empty until somebody attaches, since this is what a header, a list and
|
|
178
|
-
* the counters need, and they ask the info and never the items.
|
|
179
|
-
*/
|
|
180
|
-
status(key, info) {
|
|
181
|
-
set((s) => {
|
|
182
|
-
const current = s.byKey[key];
|
|
183
|
-
if (!current) {
|
|
184
|
-
return { byKey: { ...s.byKey, [key]: stateOf(info, []) }, statusByKey: withStatus(s.statusByKey, key, info) };
|
|
185
|
-
}
|
|
186
|
-
// An attached client already had this on `chat.event`; writing it again would redraw the thread.
|
|
187
|
-
if (sameInfo(current.info, info)) {
|
|
188
|
-
return {};
|
|
189
|
-
}
|
|
190
|
-
return { byKey: { ...s.byKey, [key]: { ...current, info } }, statusByKey: withStatus(s.statusByKey, key, info) };
|
|
191
|
-
});
|
|
192
|
-
},
|
|
193
|
-
bookmarks(key, bookmarks) {
|
|
194
|
-
set((s) => withFields(s, key, { bookmarks }));
|
|
195
|
-
},
|
|
196
|
-
visuals(key, visuals) {
|
|
197
|
-
set((s) => withFields(s, key, { visuals }));
|
|
198
|
-
},
|
|
199
|
-
forget(key) {
|
|
200
|
-
set((s) => {
|
|
201
|
-
const next = { ...s.byKey };
|
|
202
|
-
delete next[key];
|
|
203
|
-
const statuses = { ...s.statusByKey };
|
|
204
|
-
delete statuses[key];
|
|
205
|
-
return { byKey: next, statusByKey: statuses };
|
|
206
|
-
});
|
|
207
|
-
},
|
|
208
|
-
forgetWhere(matches) {
|
|
209
|
-
set((s) => ({ byKey: without(s.byKey, matches), statusByKey: without(s.statusByKey, matches) }));
|
|
236
|
+
const current = store.byKey[key];
|
|
237
|
+
if (!current) {
|
|
238
|
+
return {};
|
|
239
|
+
}
|
|
240
|
+
return {
|
|
241
|
+
byKey: {
|
|
242
|
+
...store.byKey,
|
|
243
|
+
[key]: {
|
|
244
|
+
...current,
|
|
245
|
+
...fields
|
|
246
|
+
}
|
|
210
247
|
}
|
|
248
|
+
};
|
|
249
|
+
}
|
|
250
|
+
export const useChats = create(set => ({
|
|
251
|
+
byKey: {},
|
|
252
|
+
statusByKey: {},
|
|
253
|
+
reset(key, info, items, page) {
|
|
254
|
+
set(s => {
|
|
255
|
+
// The bookmarks and the visuals are not part of the thread; they come in on their own and outlive a reset of it.
|
|
256
|
+
const {
|
|
257
|
+
bookmarks,
|
|
258
|
+
visuals
|
|
259
|
+
} = s.byKey[key] ?? {};
|
|
260
|
+
const next = {
|
|
261
|
+
...stateOf(info, items, page),
|
|
262
|
+
...(bookmarks === undefined ? {} : {
|
|
263
|
+
bookmarks
|
|
264
|
+
}),
|
|
265
|
+
...(visuals === undefined ? {} : {
|
|
266
|
+
visuals
|
|
267
|
+
})
|
|
268
|
+
};
|
|
269
|
+
return {
|
|
270
|
+
byKey: {
|
|
271
|
+
...s.byKey,
|
|
272
|
+
[key]: next
|
|
273
|
+
},
|
|
274
|
+
statusByKey: withStatus(s.statusByKey, key, info)
|
|
275
|
+
};
|
|
276
|
+
});
|
|
277
|
+
},
|
|
278
|
+
prepend(key, cursor, page) {
|
|
279
|
+
set(s => {
|
|
280
|
+
const current = s.byKey[key];
|
|
281
|
+
if (!current) {
|
|
282
|
+
return {};
|
|
283
|
+
}
|
|
284
|
+
const next = prependPage(current, cursor, page);
|
|
285
|
+
return next === current ? {} : {
|
|
286
|
+
byKey: {
|
|
287
|
+
...s.byKey,
|
|
288
|
+
[key]: next
|
|
289
|
+
}
|
|
290
|
+
};
|
|
291
|
+
});
|
|
292
|
+
},
|
|
293
|
+
apply(key, event) {
|
|
294
|
+
set(s => {
|
|
295
|
+
const current = s.byKey[key];
|
|
296
|
+
if (!current) {
|
|
297
|
+
return {};
|
|
298
|
+
}
|
|
299
|
+
const next = applyEvent(current, event);
|
|
300
|
+
return {
|
|
301
|
+
byKey: {
|
|
302
|
+
...s.byKey,
|
|
303
|
+
[key]: next
|
|
304
|
+
},
|
|
305
|
+
statusByKey: withStatus(s.statusByKey, key, next.info)
|
|
306
|
+
};
|
|
307
|
+
});
|
|
308
|
+
},
|
|
309
|
+
/*
|
|
310
|
+
* The status of a chat this window is not reading, which the host sends for every chat it has
|
|
311
|
+
* loaded. The thread stays empty until somebody attaches, since this is what a header, a list and
|
|
312
|
+
* the counters need, and they ask the info and never the items.
|
|
313
|
+
*/
|
|
314
|
+
status(key, info) {
|
|
315
|
+
set(s => {
|
|
316
|
+
const current = s.byKey[key];
|
|
317
|
+
if (!current) {
|
|
318
|
+
return {
|
|
319
|
+
byKey: {
|
|
320
|
+
...s.byKey,
|
|
321
|
+
[key]: stateOf(info, [])
|
|
322
|
+
},
|
|
323
|
+
statusByKey: withStatus(s.statusByKey, key, info)
|
|
324
|
+
};
|
|
325
|
+
}
|
|
326
|
+
// An attached client already had this on `chat.event`; writing it again would redraw the thread.
|
|
327
|
+
if (sameInfo(current.info, info)) {
|
|
328
|
+
return {};
|
|
329
|
+
}
|
|
330
|
+
return {
|
|
331
|
+
byKey: {
|
|
332
|
+
...s.byKey,
|
|
333
|
+
[key]: {
|
|
334
|
+
...current,
|
|
335
|
+
info
|
|
336
|
+
}
|
|
337
|
+
},
|
|
338
|
+
statusByKey: withStatus(s.statusByKey, key, info)
|
|
339
|
+
};
|
|
340
|
+
});
|
|
341
|
+
},
|
|
342
|
+
bookmarks(key, bookmarks) {
|
|
343
|
+
set(s => withFields(s, key, {
|
|
344
|
+
bookmarks
|
|
345
|
+
}));
|
|
346
|
+
},
|
|
347
|
+
visuals(key, visuals) {
|
|
348
|
+
set(s => withFields(s, key, {
|
|
349
|
+
visuals
|
|
350
|
+
}));
|
|
351
|
+
},
|
|
352
|
+
forget(key) {
|
|
353
|
+
set(s => {
|
|
354
|
+
const next = {
|
|
355
|
+
...s.byKey
|
|
356
|
+
};
|
|
357
|
+
delete next[key];
|
|
358
|
+
const statuses = {
|
|
359
|
+
...s.statusByKey
|
|
360
|
+
};
|
|
361
|
+
delete statuses[key];
|
|
362
|
+
return {
|
|
363
|
+
byKey: next,
|
|
364
|
+
statusByKey: statuses
|
|
365
|
+
};
|
|
366
|
+
});
|
|
367
|
+
},
|
|
368
|
+
forgetWhere(matches) {
|
|
369
|
+
set(s => ({
|
|
370
|
+
byKey: without(s.byKey, matches),
|
|
371
|
+
statusByKey: without(s.statusByKey, matches)
|
|
372
|
+
}));
|
|
373
|
+
}
|
|
211
374
|
}));
|
|
212
375
|
/* The sink of one host's chat client: it hands over chat ids, this puts them under the keys of its scope. */
|
|
213
376
|
export function chatSink(keyOf) {
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
377
|
+
return {
|
|
378
|
+
reset: (chatId, info, items, page) => useChats.getState().reset(keyOf(chatId), info, items, page),
|
|
379
|
+
prepend: (chatId, cursor, page) => useChats.getState().prepend(keyOf(chatId), cursor, page),
|
|
380
|
+
apply: (chatId, event) => useChats.getState().apply(keyOf(chatId), event),
|
|
381
|
+
status: (chatId, info) => useChats.getState().status(keyOf(chatId), info),
|
|
382
|
+
bookmarks: (chatId, bookmarks) => useChats.getState().bookmarks(keyOf(chatId), bookmarks),
|
|
383
|
+
visuals: (chatId, visuals) => useChats.getState().visuals(keyOf(chatId), visuals),
|
|
384
|
+
forget: chatId => useChats.getState().forget(keyOf(chatId))
|
|
385
|
+
};
|
|
223
386
|
}
|
|
224
387
|
/* One chat's thread in the scope this is rendered in. The selector keeps a render tied to the field it reads. */
|
|
225
388
|
export function useChatRow(chatId, select) {
|
|
226
|
-
|
|
227
|
-
|
|
389
|
+
const $ = _c(4);
|
|
390
|
+
const {
|
|
391
|
+
keyOf
|
|
392
|
+
} = useChatScope();
|
|
393
|
+
let t0;
|
|
394
|
+
if ($[0] !== chatId || $[1] !== keyOf || $[2] !== select) {
|
|
395
|
+
t0 = s => select(s.byKey[keyOf(chatId)]);
|
|
396
|
+
$[0] = chatId;
|
|
397
|
+
$[1] = keyOf;
|
|
398
|
+
$[2] = select;
|
|
399
|
+
$[3] = t0;
|
|
400
|
+
} else {
|
|
401
|
+
t0 = $[3];
|
|
402
|
+
}
|
|
403
|
+
return useChats(t0);
|
|
228
404
|
}
|
|
229
405
|
/*
|
|
230
406
|
* The models the CLI of this provider reported running in the chats this client holds of the host.
|
|
231
407
|
* A model it ran is proof the CLI offers it, whatever the version says. Outside a scope there is none.
|
|
232
408
|
*/
|
|
233
409
|
export function useReportedModels(provider) {
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
410
|
+
const $ = _c(5);
|
|
411
|
+
const scope = useContext(ChatScopeContext);
|
|
412
|
+
let t0;
|
|
413
|
+
if ($[0] !== provider || $[1] !== scope) {
|
|
414
|
+
t0 = s => {
|
|
415
|
+
const names = new Set();
|
|
416
|
+
for (const [key, state] of Object.entries(s.statusByKey)) {
|
|
417
|
+
if (scope?.owns(key) === true && state.info.provider === provider && state.info.model !== null) {
|
|
418
|
+
names.add(state.info.model);
|
|
241
419
|
}
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
420
|
+
}
|
|
421
|
+
return [...names].sort().join("\n");
|
|
422
|
+
};
|
|
423
|
+
$[0] = provider;
|
|
424
|
+
$[1] = scope;
|
|
425
|
+
$[2] = t0;
|
|
426
|
+
} else {
|
|
427
|
+
t0 = $[2];
|
|
428
|
+
}
|
|
429
|
+
const joined = useChats(t0);
|
|
430
|
+
let t1;
|
|
431
|
+
if ($[3] !== joined) {
|
|
432
|
+
t1 = new Set(joined === "" ? [] : joined.split("\n"));
|
|
433
|
+
$[3] = joined;
|
|
434
|
+
$[4] = t1;
|
|
435
|
+
} else {
|
|
436
|
+
t1 = $[4];
|
|
437
|
+
}
|
|
438
|
+
return t1;
|
|
439
|
+
}
|
|
440
|
+
/* Whether a call still waits on the person's answer to an approval of it, when its clock is not running yet. */
|
|
441
|
+
export function useAwaitsApproval(chatId, toolUseId) {
|
|
442
|
+
const $ = _c(2);
|
|
443
|
+
let t0;
|
|
444
|
+
if ($[0] !== toolUseId) {
|
|
445
|
+
t0 = row => waitingRequestsOf(row).some(request => request.kind === "approval" && request.toolUseId === toolUseId);
|
|
446
|
+
$[0] = toolUseId;
|
|
447
|
+
$[1] = t0;
|
|
448
|
+
} else {
|
|
449
|
+
t0 = $[1];
|
|
450
|
+
}
|
|
451
|
+
return useChatRow(chatId, t0);
|
|
245
452
|
}
|
|
246
453
|
/* The item as the thread holds it now, for a row derived from the structure, which a delta leaves alone. */
|
|
247
454
|
export function useCurrentItem(chatId, derived) {
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
455
|
+
const $ = _c(2);
|
|
456
|
+
let t0;
|
|
457
|
+
if ($[0] !== derived) {
|
|
458
|
+
t0 = row => {
|
|
459
|
+
const item = row?.items[derived.id];
|
|
460
|
+
return item?.kind === derived.kind ? item : derived;
|
|
461
|
+
};
|
|
462
|
+
$[0] = derived;
|
|
463
|
+
$[1] = t0;
|
|
464
|
+
} else {
|
|
465
|
+
t0 = $[1];
|
|
466
|
+
}
|
|
467
|
+
return useChatRow(chatId, t0);
|
|
468
|
+
}
|
package/dist/state/index.js
CHANGED
|
@@ -2,4 +2,4 @@
|
|
|
2
2
|
export { waitingRequestsOf, applyEvent, useChats, chatSink, useChatRow } from './chats.js';
|
|
3
3
|
export { useProviderAccountsStore, useProviderAccounts, providerAccountsOf, knownAccounts, watchProviderAccounts } from './provider-accounts.js';
|
|
4
4
|
export { useProvidersStore, useProviders, providersOf, providerSinkFor } from './providers.js';
|
|
5
|
-
export { USAGE_PREFERENCES_KEY, dayOf, windowFor, reloadUsagePreferences, useUsageStore } from './usage.js';
|
|
5
|
+
export { USAGE_PREFERENCES_KEY, dayOf, windowFor, reloadUsagePreferences, useUsageStore } from './usage.js';
|