@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
package/dist/chat/chat-client.js
CHANGED
|
@@ -9,286 +9,367 @@ const HISTORY_PAGE = 90;
|
|
|
9
9
|
* reattach stays on the host these chats run on.
|
|
10
10
|
*/
|
|
11
11
|
export class ChatClient {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
12
|
+
transport;
|
|
13
|
+
sink;
|
|
14
|
+
providers;
|
|
15
|
+
mounted = new MountedRegistry();
|
|
16
|
+
unsubscribe = [];
|
|
17
|
+
earlier = new Map();
|
|
18
|
+
inspections = new Map();
|
|
19
|
+
preferences = null;
|
|
20
|
+
constructor(transport, sink, providers = null) {
|
|
21
|
+
this.transport = transport;
|
|
22
|
+
this.sink = sink;
|
|
23
|
+
this.providers = providers;
|
|
24
|
+
this.unsubscribe.push(transport.on('chat.event', ({
|
|
25
|
+
chatId,
|
|
26
|
+
event,
|
|
27
|
+
seq
|
|
28
|
+
}) => {
|
|
29
|
+
this.sink.apply(chatId, event);
|
|
30
|
+
const entry = this.mounted.get(chatId);
|
|
31
|
+
if (entry && seq !== undefined) {
|
|
32
|
+
entry.seq = seq;
|
|
33
|
+
}
|
|
34
|
+
}),
|
|
35
|
+
// Every chat on the machine, attached or not, so a node waiting on a person says so on a view nobody has open.
|
|
36
|
+
transport.on('chat.status', ({
|
|
37
|
+
chatId,
|
|
38
|
+
info
|
|
39
|
+
}) => this.sink.status(chatId, info)), transport.on('chat.bookmarks', ({
|
|
40
|
+
chatId,
|
|
41
|
+
bookmarks
|
|
42
|
+
}) => this.sink.bookmarks(chatId, bookmarks)), transport.on('chat.visuals', ({
|
|
43
|
+
chatId,
|
|
44
|
+
visuals
|
|
45
|
+
}) => this.sink.visuals(chatId, visuals)), transport.subscribeStatus(status => this.onStatus(status)));
|
|
46
|
+
if (transport.status === 'open') {
|
|
47
|
+
void this.loadProviders();
|
|
48
|
+
void this.loadStatuses();
|
|
37
49
|
}
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
const read = this.transport.request('chat.attach', { chatId, historyLimit: 100 }).finally(async () => {
|
|
44
|
-
this.inspections.delete(chatId);
|
|
45
|
-
// A visible chat owns its attachment; an inspection must never release it.
|
|
46
|
-
if (!this.mounted.get(chatId)) {
|
|
47
|
-
await this.transport.request('chat.detach', { chatId }).catch(() => undefined);
|
|
48
|
-
}
|
|
49
|
-
});
|
|
50
|
-
this.inspections.set(chatId, read);
|
|
51
|
-
return read;
|
|
50
|
+
}
|
|
51
|
+
inspect(chatId) {
|
|
52
|
+
const pending = this.inspections.get(chatId);
|
|
53
|
+
if (pending) {
|
|
54
|
+
return pending;
|
|
52
55
|
}
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
56
|
+
const read = this.transport.request('chat.attach', {
|
|
57
|
+
chatId,
|
|
58
|
+
historyLimit: 100
|
|
59
|
+
}).finally(async () => {
|
|
60
|
+
this.inspections.delete(chatId);
|
|
61
|
+
// A visible chat owns its attachment; an inspection must never release it.
|
|
62
|
+
if (!this.mounted.get(chatId)) {
|
|
63
|
+
await this.transport.request('chat.detach', {
|
|
64
|
+
chatId
|
|
65
|
+
}).catch(() => undefined);
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
this.inspections.set(chatId, read);
|
|
69
|
+
return read;
|
|
70
|
+
}
|
|
71
|
+
/* Answers false when the transport is not connected; the chat opens once it is. */
|
|
72
|
+
async open(chatId, options) {
|
|
73
|
+
this.mounted.set(chatId, {
|
|
74
|
+
...options,
|
|
75
|
+
attached: false
|
|
76
|
+
});
|
|
77
|
+
try {
|
|
78
|
+
await this.attach(chatId);
|
|
79
|
+
return true;
|
|
80
|
+
} catch (e) {
|
|
81
|
+
if (isConnectionError(e)) {
|
|
82
|
+
return false;
|
|
83
|
+
}
|
|
84
|
+
throw e;
|
|
66
85
|
}
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
// The account belonged to the CLI the chat leaves, and the seq to its stream: the new chat's
|
|
78
|
-
// stream starts over, so offering it the old seq would read as nothing missed and reset nothing.
|
|
79
|
-
const { attached: _attached, account: _account, seq: _seq, ...options } = entry;
|
|
80
|
-
this.mounted.delete(chatId);
|
|
81
|
-
await this.transport.request('chat.kill', { chatId });
|
|
82
|
-
try {
|
|
83
|
-
await this.open(chatId, { ...options, provider, selection });
|
|
84
|
-
}
|
|
85
|
-
catch (e) {
|
|
86
|
-
this.sink.forget(chatId);
|
|
87
|
-
throw e;
|
|
88
|
-
}
|
|
86
|
+
}
|
|
87
|
+
/*
|
|
88
|
+
* Points a chat that has not spoken yet at another CLI. The host fixes a chat's provider when
|
|
89
|
+
* it registers the chat, so the only way over is to drop the empty one and register it again.
|
|
90
|
+
* The row stays until the attach of the new one replaces it, so a view keeps what it drew.
|
|
91
|
+
*/
|
|
92
|
+
async retarget(chatId, provider, selection) {
|
|
93
|
+
const entry = this.mounted.get(chatId);
|
|
94
|
+
if (!entry) {
|
|
95
|
+
return;
|
|
89
96
|
}
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
+
// The account belonged to the CLI the chat leaves, and the seq to its stream: the new chat's
|
|
98
|
+
// stream starts over, so offering it the old seq would read as nothing missed and reset nothing.
|
|
99
|
+
const {
|
|
100
|
+
attached: _attached,
|
|
101
|
+
account: _account,
|
|
102
|
+
seq: _seq,
|
|
103
|
+
...options
|
|
104
|
+
} = entry;
|
|
105
|
+
this.mounted.delete(chatId);
|
|
106
|
+
await this.transport.request('chat.kill', {
|
|
107
|
+
chatId
|
|
108
|
+
});
|
|
109
|
+
try {
|
|
110
|
+
await this.open(chatId, {
|
|
111
|
+
...options,
|
|
112
|
+
provider,
|
|
113
|
+
selection
|
|
114
|
+
});
|
|
115
|
+
} catch (e) {
|
|
116
|
+
this.sink.forget(chatId);
|
|
117
|
+
throw e;
|
|
97
118
|
}
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
119
|
+
}
|
|
120
|
+
/*
|
|
121
|
+
* Tells the host what a chat it starts on its own is made with while this socket is connected,
|
|
122
|
+
* since no client mounting that chat sends a composer preference. Said again on every fresh socket.
|
|
123
|
+
*/
|
|
124
|
+
setPreferences(preferences) {
|
|
125
|
+
this.preferences = preferences;
|
|
126
|
+
this.sendPreferences();
|
|
127
|
+
}
|
|
128
|
+
async detach(chatId) {
|
|
129
|
+
const entry = this.mounted.get(chatId);
|
|
130
|
+
this.mounted.delete(chatId);
|
|
131
|
+
if (!entry?.attached) {
|
|
132
|
+
return;
|
|
110
133
|
}
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
mentions: extras.mentions,
|
|
118
|
-
skills: extras.skills,
|
|
119
|
-
chats: extras.chats,
|
|
120
|
-
quoteSource: extras.quoteSource,
|
|
121
|
-
attachments: extras.attachments
|
|
122
|
-
});
|
|
134
|
+
try {
|
|
135
|
+
await this.transport.request('chat.detach', {
|
|
136
|
+
chatId
|
|
137
|
+
});
|
|
138
|
+
} catch {
|
|
139
|
+
// The socket closing detaches every chat server-side anyway.
|
|
123
140
|
}
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
141
|
+
}
|
|
142
|
+
/* Current hosts return the stable turn id; older compatible ones only report whether the message queued. */
|
|
143
|
+
async send(chatId, text, extras = {}) {
|
|
144
|
+
return this.transport.request('chat.send', {
|
|
145
|
+
chatId,
|
|
146
|
+
text,
|
|
147
|
+
delivery: extras.delivery,
|
|
148
|
+
mentions: extras.mentions,
|
|
149
|
+
skills: extras.skills,
|
|
150
|
+
chats: extras.chats,
|
|
151
|
+
quoteSource: extras.quoteSource,
|
|
152
|
+
attachments: extras.attachments
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
/* Marks a message; the list every client of the chat holds comes back as `chat.bookmarks`. */
|
|
156
|
+
async addBookmark(chatId, itemId, name) {
|
|
157
|
+
const {
|
|
158
|
+
bookmarks
|
|
159
|
+
} = await this.transport.request('chat.addBookmark', {
|
|
160
|
+
chatId,
|
|
161
|
+
itemId,
|
|
162
|
+
...(name === undefined ? {} : {
|
|
163
|
+
name
|
|
164
|
+
})
|
|
165
|
+
});
|
|
166
|
+
return bookmarks;
|
|
167
|
+
}
|
|
168
|
+
/* An empty name takes the name away. */
|
|
169
|
+
async renameBookmark(chatId, itemId, name) {
|
|
170
|
+
const {
|
|
171
|
+
bookmarks
|
|
172
|
+
} = await this.transport.request('chat.renameBookmark', {
|
|
173
|
+
chatId,
|
|
174
|
+
itemId,
|
|
175
|
+
name
|
|
176
|
+
});
|
|
177
|
+
return bookmarks;
|
|
178
|
+
}
|
|
179
|
+
async removeBookmark(chatId, itemId) {
|
|
180
|
+
const {
|
|
181
|
+
bookmarks
|
|
182
|
+
} = await this.transport.request('chat.removeBookmark', {
|
|
183
|
+
chatId,
|
|
184
|
+
itemId
|
|
185
|
+
});
|
|
186
|
+
return bookmarks;
|
|
187
|
+
}
|
|
188
|
+
/* Takes a visual and its page out of the chat for good; the list every client of the chat holds comes back as `chat.visuals`. */
|
|
189
|
+
async removeVisual(chatId, visualId) {
|
|
190
|
+
const {
|
|
191
|
+
visuals
|
|
192
|
+
} = await this.transport.request('chat.removeVisual', {
|
|
193
|
+
chatId,
|
|
194
|
+
visualId
|
|
195
|
+
});
|
|
196
|
+
return visuals;
|
|
197
|
+
}
|
|
198
|
+
/* What this chat's CLI would run as a skill, for the composer's `$` picker. */
|
|
199
|
+
async listSkills(chatId) {
|
|
200
|
+
const {
|
|
201
|
+
skills
|
|
202
|
+
} = await this.transport.request('skills.list', {
|
|
203
|
+
chatId
|
|
204
|
+
});
|
|
205
|
+
return skills;
|
|
206
|
+
}
|
|
207
|
+
/* Starts the chat over; refused with `chat-busy` while a turn runs, unless `force` stops that turn. */
|
|
208
|
+
async clear(chatId, force = false) {
|
|
209
|
+
await this.transport.request('chat.clear', {
|
|
210
|
+
chatId,
|
|
211
|
+
...(force ? {
|
|
212
|
+
force: true
|
|
213
|
+
} : {})
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
/*
|
|
217
|
+
* Ends the chat's CLI and keeps its conversation, which the next message resumes in a fresh process
|
|
218
|
+
* that reads its skills, plugins and servers again; refused with `chat-busy` while the chat works.
|
|
219
|
+
*/
|
|
220
|
+
async restart(chatId) {
|
|
221
|
+
await this.transport.request('chat.restart', {
|
|
222
|
+
chatId
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
async kill(chatId) {
|
|
226
|
+
this.mounted.delete(chatId);
|
|
227
|
+
this.sink.forget(chatId);
|
|
228
|
+
await this.transport.request('chat.kill', {
|
|
229
|
+
chatId
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
/*
|
|
233
|
+
* What every chat on this machine is doing right now. `chat.status` only carries a change, so a
|
|
234
|
+
* window that just opened or came back from a lost socket asks for the standing answer.
|
|
235
|
+
*/
|
|
236
|
+
async loadStatuses() {
|
|
237
|
+
try {
|
|
238
|
+
const {
|
|
239
|
+
chats
|
|
240
|
+
} = await this.transport.request('chat.list', {});
|
|
241
|
+
for (const info of chats) {
|
|
242
|
+
this.sink.status(info.chatId, info);
|
|
243
|
+
}
|
|
244
|
+
} catch {
|
|
245
|
+
// The next status event says it instead; an older host never answers this at all.
|
|
128
246
|
}
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
247
|
+
}
|
|
248
|
+
async loadProviders() {
|
|
249
|
+
if (!this.providers) {
|
|
250
|
+
return;
|
|
133
251
|
}
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
252
|
+
try {
|
|
253
|
+
const {
|
|
254
|
+
providers
|
|
255
|
+
} = await this.transport.request('provider.list', {});
|
|
256
|
+
this.providers.setProviders(providers);
|
|
257
|
+
} catch {
|
|
258
|
+
// The list comes with the next connection; pickers show what they had.
|
|
137
259
|
}
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
260
|
+
}
|
|
261
|
+
/*
|
|
262
|
+
* The page before the oldest one this chat holds, one request per chat at a time. A cursor the
|
|
263
|
+
* host no longer knows means the thread changed under it, so the chat is read again from its end.
|
|
264
|
+
*/
|
|
265
|
+
loadEarlier(chatId, cursor) {
|
|
266
|
+
const running = this.earlier.get(chatId);
|
|
267
|
+
if (running) {
|
|
268
|
+
return running;
|
|
142
269
|
}
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
270
|
+
const read = this.transport.request('chat.history', {
|
|
271
|
+
chatId,
|
|
272
|
+
cursor,
|
|
273
|
+
limit: HISTORY_PAGE
|
|
274
|
+
}).then(page => this.sink.prepend(chatId, cursor, page)).catch(async e => {
|
|
275
|
+
const entry = this.mounted.get(chatId);
|
|
276
|
+
if (errorCode(e) !== 'history-expired' || !entry) {
|
|
277
|
+
throw e;
|
|
278
|
+
}
|
|
279
|
+
delete entry.seq;
|
|
280
|
+
await this.attach(chatId);
|
|
281
|
+
}).finally(() => this.earlier.delete(chatId));
|
|
282
|
+
this.earlier.set(chatId, read);
|
|
283
|
+
return read;
|
|
284
|
+
}
|
|
285
|
+
isMounted(chatId) {
|
|
286
|
+
return this.mounted.has(chatId);
|
|
287
|
+
}
|
|
288
|
+
/* Lets go of the machine; the chats keep running there, the host only stops streaming them here. */
|
|
289
|
+
dispose() {
|
|
290
|
+
for (const off of this.unsubscribe) {
|
|
291
|
+
off();
|
|
147
292
|
}
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
293
|
+
this.unsubscribe.length = 0;
|
|
294
|
+
for (const chatId of [...this.mounted.keys()]) {
|
|
295
|
+
void this.detach(chatId);
|
|
151
296
|
}
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
297
|
+
}
|
|
298
|
+
/*
|
|
299
|
+
* A reattach offers the last seq the store holds. The host answers only what came after it when
|
|
300
|
+
* it still has all of that, and the newest page of the thread otherwise, so a short drop costs a
|
|
301
|
+
* few events.
|
|
302
|
+
*/
|
|
303
|
+
async attach(chatId) {
|
|
304
|
+
const entry = this.mounted.get(chatId);
|
|
305
|
+
if (!entry) {
|
|
306
|
+
return;
|
|
158
307
|
}
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
308
|
+
await this.transport.request('chat.create', {
|
|
309
|
+
chatId,
|
|
310
|
+
provider: entry.provider,
|
|
311
|
+
account: entry.account,
|
|
312
|
+
cwd: entry.cwd,
|
|
313
|
+
resume: entry.resume,
|
|
314
|
+
selection: entry.selection,
|
|
315
|
+
runtimeMode: entry.runtimeMode
|
|
316
|
+
});
|
|
317
|
+
// Closed or opened again in the meantime: an opening that is still there attaches itself.
|
|
318
|
+
if (this.mounted.get(chatId) !== entry) {
|
|
319
|
+
return;
|
|
163
320
|
}
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
321
|
+
const since = entry.seq;
|
|
322
|
+
const result = await this.transport.request('chat.attach', {
|
|
323
|
+
chatId,
|
|
324
|
+
historyLimit: HISTORY_PAGE,
|
|
325
|
+
...(since === undefined ? {} : {
|
|
326
|
+
since
|
|
327
|
+
})
|
|
328
|
+
});
|
|
329
|
+
const current = this.mounted.get(chatId);
|
|
330
|
+
if (current !== entry) {
|
|
331
|
+
// Its detach found nothing attached yet, and the host would stream this chat here until the socket closes.
|
|
332
|
+
if (!current) {
|
|
333
|
+
await this.transport.request('chat.detach', {
|
|
334
|
+
chatId
|
|
335
|
+
}).catch(() => undefined);
|
|
336
|
+
}
|
|
337
|
+
return;
|
|
178
338
|
}
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
}
|
|
183
|
-
try {
|
|
184
|
-
const { providers } = await this.transport.request('provider.list', {});
|
|
185
|
-
this.providers.setProviders(providers);
|
|
186
|
-
}
|
|
187
|
-
catch {
|
|
188
|
-
// The list comes with the next connection; pickers show what they had.
|
|
189
|
-
}
|
|
339
|
+
entry.attached = true;
|
|
340
|
+
if (result.seq !== undefined) {
|
|
341
|
+
entry.seq = result.seq;
|
|
190
342
|
}
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
.then((page) => this.sink.prepend(chatId, cursor, page))
|
|
203
|
-
.catch(async (e) => {
|
|
204
|
-
const entry = this.mounted.get(chatId);
|
|
205
|
-
if (errorCode(e) !== 'history-expired' || !entry) {
|
|
206
|
-
throw e;
|
|
207
|
-
}
|
|
208
|
-
delete entry.seq;
|
|
209
|
-
await this.attach(chatId);
|
|
210
|
-
})
|
|
211
|
-
.finally(() => this.earlier.delete(chatId));
|
|
212
|
-
this.earlier.set(chatId, read);
|
|
213
|
-
return read;
|
|
343
|
+
if (result.events && since !== undefined) {
|
|
344
|
+
for (const event of result.events) {
|
|
345
|
+
this.sink.apply(chatId, event);
|
|
346
|
+
}
|
|
347
|
+
} else {
|
|
348
|
+
const page = result.history === undefined ? undefined : {
|
|
349
|
+
history: result.history,
|
|
350
|
+
pending: result.pending ?? [],
|
|
351
|
+
subagents: result.subagents ?? []
|
|
352
|
+
};
|
|
353
|
+
this.sink.reset(chatId, result.info, result.items, page);
|
|
214
354
|
}
|
|
215
|
-
|
|
216
|
-
|
|
355
|
+
// A host without bookmarks or visuals sends none, and then this chat has none.
|
|
356
|
+
this.sink.bookmarks(chatId, result.bookmarks ?? []);
|
|
357
|
+
this.sink.visuals(chatId, result.visuals ?? []);
|
|
358
|
+
}
|
|
359
|
+
sendPreferences() {
|
|
360
|
+
if (this.preferences === null) {
|
|
361
|
+
return;
|
|
217
362
|
}
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
363
|
+
void this.transport.request('chat.setPreferences', this.preferences).catch(() => undefined);
|
|
364
|
+
}
|
|
365
|
+
onStatus(status) {
|
|
366
|
+
if (status === 'open') {
|
|
367
|
+
this.sendPreferences();
|
|
368
|
+
void this.loadProviders();
|
|
369
|
+
void this.loadStatuses();
|
|
370
|
+
void this.mounted.reattachAll(chatId => this.attach(chatId));
|
|
371
|
+
return;
|
|
227
372
|
}
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
* few events.
|
|
232
|
-
*/
|
|
233
|
-
async attach(chatId) {
|
|
234
|
-
const entry = this.mounted.get(chatId);
|
|
235
|
-
if (!entry) {
|
|
236
|
-
return;
|
|
237
|
-
}
|
|
238
|
-
await this.transport.request('chat.create', {
|
|
239
|
-
chatId,
|
|
240
|
-
provider: entry.provider,
|
|
241
|
-
account: entry.account,
|
|
242
|
-
cwd: entry.cwd,
|
|
243
|
-
resume: entry.resume,
|
|
244
|
-
selection: entry.selection,
|
|
245
|
-
runtimeMode: entry.runtimeMode
|
|
246
|
-
});
|
|
247
|
-
// Closed or opened again in the meantime: an opening that is still there attaches itself.
|
|
248
|
-
if (this.mounted.get(chatId) !== entry) {
|
|
249
|
-
return;
|
|
250
|
-
}
|
|
251
|
-
const since = entry.seq;
|
|
252
|
-
const result = await this.transport.request('chat.attach', { chatId, historyLimit: HISTORY_PAGE, ...(since === undefined ? {} : { since }) });
|
|
253
|
-
const current = this.mounted.get(chatId);
|
|
254
|
-
if (current !== entry) {
|
|
255
|
-
// Its detach found nothing attached yet, and the host would stream this chat here until the socket closes.
|
|
256
|
-
if (!current) {
|
|
257
|
-
await this.transport.request('chat.detach', { chatId }).catch(() => undefined);
|
|
258
|
-
}
|
|
259
|
-
return;
|
|
260
|
-
}
|
|
261
|
-
entry.attached = true;
|
|
262
|
-
if (result.seq !== undefined) {
|
|
263
|
-
entry.seq = result.seq;
|
|
264
|
-
}
|
|
265
|
-
if (result.events && since !== undefined) {
|
|
266
|
-
for (const event of result.events) {
|
|
267
|
-
this.sink.apply(chatId, event);
|
|
268
|
-
}
|
|
269
|
-
}
|
|
270
|
-
else {
|
|
271
|
-
const page = result.history === undefined ? undefined : { history: result.history, pending: result.pending ?? [], subagents: result.subagents ?? [] };
|
|
272
|
-
this.sink.reset(chatId, result.info, result.items, page);
|
|
273
|
-
}
|
|
274
|
-
// A host without bookmarks or visuals sends none, and then this chat has none.
|
|
275
|
-
this.sink.bookmarks(chatId, result.bookmarks ?? []);
|
|
276
|
-
this.sink.visuals(chatId, result.visuals ?? []);
|
|
277
|
-
}
|
|
278
|
-
sendPreferences() {
|
|
279
|
-
if (this.preferences === null) {
|
|
280
|
-
return;
|
|
281
|
-
}
|
|
282
|
-
void this.transport.request('chat.setPreferences', this.preferences).catch(() => undefined);
|
|
283
|
-
}
|
|
284
|
-
onStatus(status) {
|
|
285
|
-
if (status === 'open') {
|
|
286
|
-
this.sendPreferences();
|
|
287
|
-
void this.loadProviders();
|
|
288
|
-
void this.loadStatuses();
|
|
289
|
-
void this.mounted.reattachAll((chatId) => this.attach(chatId));
|
|
290
|
-
return;
|
|
291
|
-
}
|
|
292
|
-
this.mounted.detachAll();
|
|
293
|
-
}
|
|
294
|
-
}
|
|
373
|
+
this.mounted.detachAll();
|
|
374
|
+
}
|
|
375
|
+
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/* The chats an `@query` offers: never the chat typing it or one already attached. */
|
|
2
2
|
export function chatSuggestions(chats, query, exclude, limit) {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
}
|
|
3
|
+
const needle = query.toLowerCase();
|
|
4
|
+
return chats.filter(chat => !exclude.includes(chat.id) && chat.title.toLowerCase().includes(needle)).slice(0, limit);
|
|
5
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { EffortStep } from './logic/effort.js';
|
|
2
|
+
type Stepper = (step: EffortStep) => void;
|
|
3
|
+
export declare function registerEffortStepper(key: string, stepper: Stepper): () => void;
|
|
4
|
+
export declare function stepEffortFromComposer(key: string, step: EffortStep): boolean;
|
|
5
|
+
export {};
|