@alumbwe/anvil 1.0.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/README.md +84 -0
- package/bin/anvil +2 -0
- package/bin/tree-sitter.wasm +0 -0
- package/package.json +67 -0
- package/src/__tests__/README.md +256 -0
- package/src/__tests__/bash-mode.test.ts +442 -0
- package/src/__tests__/cli-args.test.ts +181 -0
- package/src/__tests__/cli-harness.test.ts +52 -0
- package/src/__tests__/e2e/first-time-login.test.ts +173 -0
- package/src/__tests__/e2e/logout-relogin-flow.test.ts +110 -0
- package/src/__tests__/e2e/returning-user-auth.test.ts +113 -0
- package/src/__tests__/e2e-cli.test.ts +183 -0
- package/src/__tests__/helpers/launcher-disconnect-fixture.cjs +176 -0
- package/src/__tests__/helpers/mock-api-client.ts +64 -0
- package/src/__tests__/helpers/renderer-cleanup-fixture.tsx +89 -0
- package/src/__tests__/helpers/terminal-watchdog-fixture.ts +75 -0
- package/src/__tests__/home-directory-detection.test.ts +213 -0
- package/src/__tests__/integration/api-integration.test.ts +288 -0
- package/src/__tests__/integration/credentials-storage.test.ts +486 -0
- package/src/__tests__/integration/local-agents.test.ts +1187 -0
- package/src/__tests__/integration/login-flow-instrumentation.test.ts +134 -0
- package/src/__tests__/integration/login-polling-working.test.ts +285 -0
- package/src/__tests__/integration/queue-editing.test.tsx +261 -0
- package/src/__tests__/integration/usage-refresh-on-completion.test.ts +168 -0
- package/src/__tests__/integration-tmux.test.ts +188 -0
- package/src/__tests__/launcher-avx2-fallback.test.ts +630 -0
- package/src/__tests__/launcher-disconnect.test.ts +104 -0
- package/src/__tests__/mocks/hover-toggle-controller.ts +71 -0
- package/src/__tests__/open-tui-native-bundle.test.ts +378 -0
- package/src/__tests__/path-completion.test.ts +243 -0
- package/src/__tests__/project-files-chat-id.test.ts +34 -0
- package/src/__tests__/release/proxy-http-get.test.ts +667 -0
- package/src/__tests__/release/wrapper-safety.test.ts +412 -0
- package/src/__tests__/renderer-cleanup.test.ts +174 -0
- package/src/__tests__/rerender-perf.integration.test.ts +283 -0
- package/src/__tests__/terminal-reset-sequences.test.ts +36 -0
- package/src/__tests__/terminal-watchdog.test.ts +388 -0
- package/src/__tests__/test-utils.ts +271 -0
- package/src/__tests__/tmux-poc.ts +150 -0
- package/src/__tests__/unit/agent-mode-toggle.test.ts +137 -0
- package/src/__tests__/unit/copy-button.test.ts +157 -0
- package/src/__tests__/unit/create-run-config.test.ts +66 -0
- package/src/__tests__/unit/publish-confirmation.test.ts +70 -0
- package/src/__tests__/unit/segmented-control.test.ts +152 -0
- package/src/__tests__/utils/env.test.ts +169 -0
- package/src/__tests__/utils/project-picker.test.ts +39 -0
- package/src/agents/bundled-agents.generated.d.ts +14 -0
- package/src/agents/bundled-agents.generated.ts +3692 -0
- package/src/app.tsx +399 -0
- package/src/chat.tsx +1698 -0
- package/src/cli-args.ts +134 -0
- package/src/commands/__tests__/bash-command.test.ts +445 -0
- package/src/commands/__tests__/command-args.test.ts +349 -0
- package/src/commands/__tests__/copy-conversation-clipboard.test.ts +108 -0
- package/src/commands/__tests__/copy-conversation.test.ts +226 -0
- package/src/commands/__tests__/diagnostics-command.test.ts +35 -0
- package/src/commands/__tests__/freebuff-command-aliases.test.ts +56 -0
- package/src/commands/__tests__/image.test.ts +99 -0
- package/src/commands/__tests__/init.test.ts +456 -0
- package/src/commands/__tests__/new-command-rotates-chat.test.ts +91 -0
- package/src/commands/__tests__/process-diagnostics.test.ts +54 -0
- package/src/commands/__tests__/prompt-builders.test.ts +28 -0
- package/src/commands/__tests__/router-input.test.ts +298 -0
- package/src/commands/ads.ts +44 -0
- package/src/commands/command-registry.ts +726 -0
- package/src/commands/copy-conversation.ts +392 -0
- package/src/commands/help.ts +13 -0
- package/src/commands/image.ts +20 -0
- package/src/commands/init.ts +121 -0
- package/src/commands/process-diagnostics.ts +120 -0
- package/src/commands/prompt-builders.ts +100 -0
- package/src/commands/publish.ts +203 -0
- package/src/commands/router-utils.ts +80 -0
- package/src/commands/router.ts +487 -0
- package/src/commands/usage.ts +26 -0
- package/src/components/__tests__/ad-banner.test.tsx +83 -0
- package/src/components/__tests__/chat-input-bar.test.tsx +130 -0
- package/src/components/__tests__/freebuff-landing-heading-row.test.tsx +91 -0
- package/src/components/__tests__/freebuff-model-selector.test.tsx +519 -0
- package/src/components/__tests__/freebuff-offer-invariants.test.ts +54 -0
- package/src/components/__tests__/freebuff-takeover-prompt.test.tsx +212 -0
- package/src/components/__tests__/grid-layout.integration.test.tsx +304 -0
- package/src/components/__tests__/grid-layout.test.tsx +1051 -0
- package/src/components/__tests__/message-block.completion.test.tsx +104 -0
- package/src/components/__tests__/message-block.streaming.test.tsx +78 -0
- package/src/components/__tests__/message-with-agents.test.tsx +579 -0
- package/src/components/__tests__/multiline-input.test.tsx +1132 -0
- package/src/components/__tests__/queue-panel.test.tsx +398 -0
- package/src/components/__tests__/selectable-list.test.ts +232 -0
- package/src/components/__tests__/status-bar.test.tsx +44 -0
- package/src/components/__tests__/status-indicator.test.tsx +204 -0
- package/src/components/__tests__/terminal-thinking-orb.test.tsx +111 -0
- package/src/components/__tests__/user-error-banner.test.tsx +102 -0
- package/src/components/ad-banner.tsx +323 -0
- package/src/components/agent-checklist.tsx +350 -0
- package/src/components/agent-mode-toggle.tsx +241 -0
- package/src/components/anvil-mark.tsx +52 -0
- package/src/components/ask-user/__tests__/multiple-choice-form.test.ts +432 -0
- package/src/components/ask-user/__tests__/validation.test.ts +213 -0
- package/src/components/ask-user/components/accordion-question.tsx +153 -0
- package/src/components/ask-user/components/custom-answer-input.tsx +66 -0
- package/src/components/ask-user/components/options-list.tsx +133 -0
- package/src/components/ask-user/components/question-header.tsx +80 -0
- package/src/components/ask-user/components/question-option.tsx +89 -0
- package/src/components/ask-user/constants.ts +38 -0
- package/src/components/ask-user/index.tsx +631 -0
- package/src/components/ask-user/utils/validation.ts +85 -0
- package/src/components/attachment-card.tsx +65 -0
- package/src/components/blocks/agent-block-grid.tsx +58 -0
- package/src/components/blocks/agent-branch-item.tsx +311 -0
- package/src/components/blocks/agent-branch-wrapper.tsx +493 -0
- package/src/components/blocks/agent-list-branch.tsx +77 -0
- package/src/components/blocks/ask-user-branch.tsx +81 -0
- package/src/components/blocks/block-helpers.ts +11 -0
- package/src/components/blocks/blocks-renderer.tsx +289 -0
- package/src/components/blocks/content-with-markdown.tsx +33 -0
- package/src/components/blocks/image-block.tsx +128 -0
- package/src/components/blocks/implementor-row.tsx +429 -0
- package/src/components/blocks/single-block.tsx +201 -0
- package/src/components/blocks/thinking-block.tsx +67 -0
- package/src/components/blocks/tool-block-group.tsx +57 -0
- package/src/components/blocks/tool-branch.tsx +206 -0
- package/src/components/blocks/user-content-copy.tsx +157 -0
- package/src/components/bottom-banner.tsx +136 -0
- package/src/components/build-mode-buttons.tsx +110 -0
- package/src/components/button.tsx +66 -0
- package/src/components/chat-header.tsx +77 -0
- package/src/components/chat-history-screen.tsx +413 -0
- package/src/components/chat-input-bar.tsx +523 -0
- package/src/components/clickable-title-box.tsx +66 -0
- package/src/components/clickable.tsx +119 -0
- package/src/components/collapse-button.tsx +34 -0
- package/src/components/copy-button.tsx +203 -0
- package/src/components/elapsed-timer.tsx +55 -0
- package/src/components/error-boundary.tsx +55 -0
- package/src/components/feedback-container.tsx +181 -0
- package/src/components/feedback-icon-button.tsx +89 -0
- package/src/components/feedback-input-mode.tsx +344 -0
- package/src/components/file-attachment-card.tsx +98 -0
- package/src/components/freebuff-active-session-summary.tsx +63 -0
- package/src/components/freebuff-landing-screen.tsx +865 -0
- package/src/components/freebuff-model-selector.tsx +1087 -0
- package/src/components/freebuff-referral-banner.tsx +604 -0
- package/src/components/freebuff-superseded-screen.tsx +62 -0
- package/src/components/grid-layout.tsx +80 -0
- package/src/components/help-banner.tsx +127 -0
- package/src/components/highlighted-text.tsx +52 -0
- package/src/components/image-card.tsx +167 -0
- package/src/components/image-thumbnail.tsx +114 -0
- package/src/components/input-cursor.tsx +77 -0
- package/src/components/input-mode-banner.tsx +57 -0
- package/src/components/load-previous-button.tsx +48 -0
- package/src/components/login-modal.tsx +475 -0
- package/src/components/message-block.tsx +346 -0
- package/src/components/message-footer.tsx +258 -0
- package/src/components/message-with-agents.tsx +506 -0
- package/src/components/mode-divider.tsx +43 -0
- package/src/components/multiline-input.tsx +1241 -0
- package/src/components/out-of-credits-banner.tsx +160 -0
- package/src/components/pending-attachments-banner.tsx +116 -0
- package/src/components/pending-bash-message.tsx +59 -0
- package/src/components/progress-bar.tsx +81 -0
- package/src/components/project-picker-screen.tsx +485 -0
- package/src/components/publish-confirmation.tsx +493 -0
- package/src/components/publish-container.tsx +687 -0
- package/src/components/queue-panel.tsx +310 -0
- package/src/components/raised-pill.tsx +95 -0
- package/src/components/renderers/plan-box.tsx +59 -0
- package/src/components/review-screen.tsx +112 -0
- package/src/components/scroll-to-bottom-button.tsx +34 -0
- package/src/components/segmented-control.tsx +187 -0
- package/src/components/selectable-list.tsx +248 -0
- package/src/components/selected-chips.tsx +80 -0
- package/src/components/separator.tsx +40 -0
- package/src/components/session-ended-banner.tsx +226 -0
- package/src/components/shimmer-text.tsx +248 -0
- package/src/components/status-bar.tsx +313 -0
- package/src/components/subscription-limit-banner.tsx +206 -0
- package/src/components/suggested-prompts.tsx +184 -0
- package/src/components/suggestion-menu.tsx +215 -0
- package/src/components/terminal-command-display.tsx +151 -0
- package/src/components/terminal-link.tsx +97 -0
- package/src/components/terminal-thinking-orb.tsx +95 -0
- package/src/components/text-attachment-card.tsx +77 -0
- package/src/components/thinking.tsx +109 -0
- package/src/components/tools/__tests__/apply-patch.test.tsx +84 -0
- package/src/components/tools/__tests__/code-search.test.tsx +45 -0
- package/src/components/tools/__tests__/gravity-index.test.ts +76 -0
- package/src/components/tools/__tests__/render-ui.test.tsx +92 -0
- package/src/components/tools/__tests__/run-terminal-command.test.ts +233 -0
- package/src/components/tools/apply-patch.tsx +95 -0
- package/src/components/tools/code-search.tsx +45 -0
- package/src/components/tools/composio.tsx +152 -0
- package/src/components/tools/diff-viewer.tsx +76 -0
- package/src/components/tools/glob.tsx +61 -0
- package/src/components/tools/gravity-index.tsx +77 -0
- package/src/components/tools/list-directory.tsx +61 -0
- package/src/components/tools/read-docs.tsx +37 -0
- package/src/components/tools/read-files.tsx +91 -0
- package/src/components/tools/read-subtree.tsx +44 -0
- package/src/components/tools/read-url.tsx +33 -0
- package/src/components/tools/registry.ts +126 -0
- package/src/components/tools/render-ui.tsx +122 -0
- package/src/components/tools/run-terminal-command.tsx +79 -0
- package/src/components/tools/skill.tsx +29 -0
- package/src/components/tools/str-replace.tsx +77 -0
- package/src/components/tools/suggest-followups.tsx +369 -0
- package/src/components/tools/task-completed.tsx +16 -0
- package/src/components/tools/tool-call-item.tsx +273 -0
- package/src/components/tools/types.ts +55 -0
- package/src/components/tools/web-search.tsx +33 -0
- package/src/components/tools/write-file.tsx +16 -0
- package/src/components/tools/write-todos.tsx +95 -0
- package/src/components/top-banner.tsx +178 -0
- package/src/components/usage-banner.tsx +244 -0
- package/src/components/user-error-banner.tsx +56 -0
- package/src/components/validation-error-popover.tsx +192 -0
- package/src/contexts/__tests__/chat-runtime-context.test.tsx +149 -0
- package/src/contexts/chat-runtime-context.tsx +240 -0
- package/src/data/slash-commands.test.ts +24 -0
- package/src/data/slash-commands.ts +249 -0
- package/src/entry.ts +12 -0
- package/src/hooks/__tests__/holds-live-freebuff-slot.test.ts +49 -0
- package/src/hooks/__tests__/session-fetch-signal.test.ts +63 -0
- package/src/hooks/__tests__/use-activity-query.test.ts +1000 -0
- package/src/hooks/__tests__/use-ask-user-bridge.test.ts +176 -0
- package/src/hooks/__tests__/use-auth-query.test.ts +21 -0
- package/src/hooks/__tests__/use-chat-input-remount.test.tsx +66 -0
- package/src/hooks/__tests__/use-clipboard.test.tsx +73 -0
- package/src/hooks/__tests__/use-connection-status.test.ts +112 -0
- package/src/hooks/__tests__/use-directory-browser.test.ts +203 -0
- package/src/hooks/__tests__/use-gravity-ad.test.ts +73 -0
- package/src/hooks/__tests__/use-grid-layout.test.ts +349 -0
- package/src/hooks/__tests__/use-input-history.test.ts +699 -0
- package/src/hooks/__tests__/use-message-queue-editing.test.tsx +209 -0
- package/src/hooks/__tests__/use-message-queue.test.tsx +71 -0
- package/src/hooks/__tests__/use-path-tab-completion.test.ts +315 -0
- package/src/hooks/__tests__/use-queue-controls.test.ts +68 -0
- package/src/hooks/__tests__/use-queue-ui.test.tsx +83 -0
- package/src/hooks/__tests__/use-searchable-list.test.ts +359 -0
- package/src/hooks/__tests__/use-send-message-timer.test.ts +146 -0
- package/src/hooks/__tests__/use-suggestion-engine-mention.test.ts +361 -0
- package/src/hooks/__tests__/use-suggestion-engine.test.ts +485 -0
- package/src/hooks/__tests__/use-terminal-focus.test.ts +66 -0
- package/src/hooks/__tests__/use-terminal-layout.test.ts +675 -0
- package/src/hooks/__tests__/use-timeout.test.ts +330 -0
- package/src/hooks/__tests__/use-usage-query.test.ts +502 -0
- package/src/hooks/__tests__/use-user-details-query.test.ts +195 -0
- package/src/hooks/helpers/__tests__/send-message.test.ts +1918 -0
- package/src/hooks/helpers/send-message.ts +654 -0
- package/src/hooks/stream-state.ts +83 -0
- package/src/hooks/use-activity-query.ts +668 -0
- package/src/hooks/use-agent-validation.ts +74 -0
- package/src/hooks/use-ask-user-bridge.ts +92 -0
- package/src/hooks/use-auth-query.ts +253 -0
- package/src/hooks/use-auth-state.ts +152 -0
- package/src/hooks/use-chat-input.ts +105 -0
- package/src/hooks/use-chat-keyboard.ts +321 -0
- package/src/hooks/use-chat-messages.ts +254 -0
- package/src/hooks/use-chat-state.ts +165 -0
- package/src/hooks/use-chat-streaming.ts +180 -0
- package/src/hooks/use-chat-ui.ts +131 -0
- package/src/hooks/use-clipboard.ts +151 -0
- package/src/hooks/use-connection-status.ts +142 -0
- package/src/hooks/use-directory-browser.ts +88 -0
- package/src/hooks/use-elapsed-time.ts +116 -0
- package/src/hooks/use-event.ts +34 -0
- package/src/hooks/use-exit-handler.ts +66 -0
- package/src/hooks/use-fetch-login-url.ts +65 -0
- package/src/hooks/use-fingerprint.ts +61 -0
- package/src/hooks/use-freebuff-ctrl-c-exit.ts +23 -0
- package/src/hooks/use-freebuff-session-progress.ts +34 -0
- package/src/hooks/use-freebuff-session.ts +806 -0
- package/src/hooks/use-freebuff-streak-query.ts +61 -0
- package/src/hooks/use-gravity-ad.ts +656 -0
- package/src/hooks/use-grid-layout.ts +73 -0
- package/src/hooks/use-input-history.ts +173 -0
- package/src/hooks/use-login-keyboard-handlers.ts +75 -0
- package/src/hooks/use-login-polling.ts +114 -0
- package/src/hooks/use-logo.tsx +161 -0
- package/src/hooks/use-message-queue.ts +387 -0
- package/src/hooks/use-now.ts +20 -0
- package/src/hooks/use-path-tab-completion.ts +88 -0
- package/src/hooks/use-publish-mutation.ts +60 -0
- package/src/hooks/use-queue-controls.ts +68 -0
- package/src/hooks/use-queue-ui.ts +74 -0
- package/src/hooks/use-scroll-management.ts +184 -0
- package/src/hooks/use-searchable-list.ts +98 -0
- package/src/hooks/use-send-message.ts +773 -0
- package/src/hooks/use-sheen-animation.tsx +88 -0
- package/src/hooks/use-subscription-query.ts +71 -0
- package/src/hooks/use-suggestion-engine.ts +783 -0
- package/src/hooks/use-terminal-breakpoints.ts +77 -0
- package/src/hooks/use-terminal-dimensions.ts +46 -0
- package/src/hooks/use-terminal-focus.ts +29 -0
- package/src/hooks/use-terminal-layout.ts +189 -0
- package/src/hooks/use-theme.tsx +140 -0
- package/src/hooks/use-timeout.ts +85 -0
- package/src/hooks/use-update-preference.ts +66 -0
- package/src/hooks/use-usage-monitor.ts +55 -0
- package/src/hooks/use-usage-query.ts +124 -0
- package/src/hooks/use-user-details-query.ts +93 -0
- package/src/hooks/use-why-did-you-update.ts +177 -0
- package/src/index.tsx +441 -0
- package/src/init/__tests__/init-direnv.test.ts +526 -0
- package/src/init/init-app.ts +34 -0
- package/src/init/init-direnv.ts +133 -0
- package/src/login/constants.ts +60 -0
- package/src/login/login-flow.ts +204 -0
- package/src/login/plain-login.ts +108 -0
- package/src/login/utils.ts +183 -0
- package/src/native/ripgrep.ts +80 -0
- package/src/polyfills/bun-strip-ansi.ts +12 -0
- package/src/pre-init/tree-sitter-wasm.ts +96 -0
- package/src/project-files.ts +102 -0
- package/src/smoke/terminal-command-broker.ts +439 -0
- package/src/state/__tests__/chat-store-focus.test.ts +22 -0
- package/src/state/__tests__/feedback-store.test.ts +257 -0
- package/src/state/chat-history-store.ts +30 -0
- package/src/state/chat-store.ts +544 -0
- package/src/state/feedback-store.ts +160 -0
- package/src/state/freebuff-model-store.ts +42 -0
- package/src/state/freebuff-session-store.ts +53 -0
- package/src/state/login-store.ts +150 -0
- package/src/state/message-block-store.ts +149 -0
- package/src/state/publish-store.ts +146 -0
- package/src/state/queue-panel-store.ts +26 -0
- package/src/state/review-store.ts +24 -0
- package/src/testing/env.ts +46 -0
- package/src/types/chat-state.ts +15 -0
- package/src/types/chat.ts +241 -0
- package/src/types/contracts/send-message.ts +12 -0
- package/src/types/env.ts +98 -0
- package/src/types/freebuff-session.ts +17 -0
- package/src/types/function-params.ts +28 -0
- package/src/types/react19-compat.d.ts +19 -0
- package/src/types/store.ts +111 -0
- package/src/types/theme-system.ts +144 -0
- package/src/types/utils.ts +3 -0
- package/src/utils/__tests__/active-run.test.ts +140 -0
- package/src/utils/__tests__/activity-tracker.test.ts +440 -0
- package/src/utils/__tests__/agent-display.test.ts +139 -0
- package/src/utils/__tests__/analytics-client.test.ts +262 -0
- package/src/utils/__tests__/anonymous-id.test.ts +74 -0
- package/src/utils/__tests__/anvil-api.test.ts +578 -0
- package/src/utils/__tests__/arrays.test.ts +264 -0
- package/src/utils/__tests__/bash-context-processor.test.ts +38 -0
- package/src/utils/__tests__/block-processor.test.ts +810 -0
- package/src/utils/__tests__/chat-history.test.ts +203 -0
- package/src/utils/__tests__/chat-input-key-intercept.test.ts +40 -0
- package/src/utils/__tests__/chat-meta.test.ts +130 -0
- package/src/utils/__tests__/clipboard-linux.test.ts +359 -0
- package/src/utils/__tests__/clipboard.test.ts +910 -0
- package/src/utils/__tests__/code-search-summary.test.ts +84 -0
- package/src/utils/__tests__/collapse-helpers.test.ts +1109 -0
- package/src/utils/__tests__/error-handling.test.ts +658 -0
- package/src/utils/__tests__/exit-cleanly.test.ts +110 -0
- package/src/utils/__tests__/feedback-helpers.test.ts +444 -0
- package/src/utils/__tests__/feedback-submission.test.ts +26 -0
- package/src/utils/__tests__/fetch-usage.test.ts +355 -0
- package/src/utils/__tests__/fingerprint.test.ts +144 -0
- package/src/utils/__tests__/fixtures/terminal-command-broker-child.ts +7 -0
- package/src/utils/__tests__/fixtures/terminal-command-broker-entry.ts +3 -0
- package/src/utils/__tests__/fixtures/terminal-command-broker-owner.ts +33 -0
- package/src/utils/__tests__/format-elapsed-time.test.ts +103 -0
- package/src/utils/__tests__/format-timeout.test.ts +87 -0
- package/src/utils/__tests__/freebuff-instance-owner.test.ts +69 -0
- package/src/utils/__tests__/freebuff-model-navigation.test.ts +102 -0
- package/src/utils/__tests__/freebuff-premium-reset.test.ts +79 -0
- package/src/utils/__tests__/freebuff-referral-cache.test.ts +116 -0
- package/src/utils/__tests__/freebuff-session-api.test.ts +215 -0
- package/src/utils/__tests__/freebuff-session-display.test.ts +23 -0
- package/src/utils/__tests__/freebuff-streak-line.test.ts +217 -0
- package/src/utils/__tests__/image-dimensions.test.ts +249 -0
- package/src/utils/__tests__/image-processor.test.ts +209 -0
- package/src/utils/__tests__/implementor-helpers.test.ts +1458 -0
- package/src/utils/__tests__/keyboard-actions.test.ts +660 -0
- package/src/utils/__tests__/layout-helpers.test.ts +36 -0
- package/src/utils/__tests__/lazy-response-ads.test.ts +167 -0
- package/src/utils/__tests__/log-shipper.test.ts +53 -0
- package/src/utils/__tests__/markdown-renderer.test.tsx +421 -0
- package/src/utils/__tests__/message-block-helpers.test.ts +1263 -0
- package/src/utils/__tests__/message-updater.test.ts +645 -0
- package/src/utils/__tests__/osc-timeout-scenarios.test.ts +172 -0
- package/src/utils/__tests__/pending-attachments.test.ts +277 -0
- package/src/utils/__tests__/polling-backoff.test.ts +51 -0
- package/src/utils/__tests__/queue-panel-actions.test.ts +148 -0
- package/src/utils/__tests__/run-state-storage.test.ts +919 -0
- package/src/utils/__tests__/safe-json.test.ts +77 -0
- package/src/utils/__tests__/sdk-event-handlers.test.ts +685 -0
- package/src/utils/__tests__/send-message-helpers.test.ts +1898 -0
- package/src/utils/__tests__/send-message-timer.test.ts +64 -0
- package/src/utils/__tests__/settings.test.ts +99 -0
- package/src/utils/__tests__/strings.test.ts +192 -0
- package/src/utils/__tests__/terminal-color-detection.test.ts +425 -0
- package/src/utils/__tests__/terminal-command-broker.test.ts +528 -0
- package/src/utils/__tests__/terminal-enter-detection.test.ts +77 -0
- package/src/utils/__tests__/terminal-io.test.ts +137 -0
- package/src/utils/__tests__/terminal-protocol-controller.test.ts +119 -0
- package/src/utils/__tests__/text-layout.test.ts +82 -0
- package/src/utils/__tests__/theme-platform-detection.test.ts +125 -0
- package/src/utils/__tests__/think-tag-parser.test.ts +159 -0
- package/src/utils/__tests__/trace-writer.test.ts +223 -0
- package/src/utils/__tests__/trim-chat-logs.test.ts +78 -0
- package/src/utils/__tests__/usage-banner-state.test.ts +298 -0
- package/src/utils/__tests__/validation-error-formatting.test.ts +126 -0
- package/src/utils/__tests__/windows-terminal-health.test.ts +101 -0
- package/src/utils/__tests__/write-file-atomic.test.ts +127 -0
- package/src/utils/active-run.ts +131 -0
- package/src/utils/activity-tracker.ts +66 -0
- package/src/utils/agent-display.ts +87 -0
- package/src/utils/agent-helpers.ts +27 -0
- package/src/utils/agent-id-utils.ts +14 -0
- package/src/utils/ai-message-id.ts +12 -0
- package/src/utils/analytics.ts +361 -0
- package/src/utils/anonymous-id.ts +87 -0
- package/src/utils/anvil-api.ts +612 -0
- package/src/utils/anvil-client.ts +217 -0
- package/src/utils/arrays.ts +117 -0
- package/src/utils/auth.ts +258 -0
- package/src/utils/bash-context-processor.ts +47 -0
- package/src/utils/bash-messages.ts +108 -0
- package/src/utils/block-margins.ts +35 -0
- package/src/utils/block-operations.ts +523 -0
- package/src/utils/block-processor.ts +213 -0
- package/src/utils/chat-history.ts +253 -0
- package/src/utils/chat-input-key-intercept.ts +52 -0
- package/src/utils/chat-meta.ts +90 -0
- package/src/utils/chat-scroll-accel.ts +151 -0
- package/src/utils/clipboard-image.ts +588 -0
- package/src/utils/clipboard.ts +397 -0
- package/src/utils/code-search-summary.ts +70 -0
- package/src/utils/collapse-helpers.ts +256 -0
- package/src/utils/config-dir.ts +24 -0
- package/src/utils/constants.ts +190 -0
- package/src/utils/create-event-handler-state.ts +73 -0
- package/src/utils/create-run-config.ts +121 -0
- package/src/utils/detect-shell.ts +116 -0
- package/src/utils/directory-browser.ts +72 -0
- package/src/utils/engagement.ts +55 -0
- package/src/utils/env.ts +92 -0
- package/src/utils/error-handling.ts +255 -0
- package/src/utils/error-messages.ts +62 -0
- package/src/utils/exit-cleanly.ts +86 -0
- package/src/utils/feedback-helpers.ts +103 -0
- package/src/utils/feedback-submission.ts +22 -0
- package/src/utils/fetch-usage.ts +76 -0
- package/src/utils/fingerprint.ts +245 -0
- package/src/utils/format-elapsed-time.ts +33 -0
- package/src/utils/format-session-units.ts +6 -0
- package/src/utils/format-timeout.ts +28 -0
- package/src/utils/format-validation-errors-for-message.ts +84 -0
- package/src/utils/freebuff-agent-selection.ts +33 -0
- package/src/utils/freebuff-instance-owner.ts +66 -0
- package/src/utils/freebuff-model-navigation.ts +50 -0
- package/src/utils/freebuff-premium-reset.ts +55 -0
- package/src/utils/freebuff-referral-cache.ts +51 -0
- package/src/utils/freebuff-session-api.ts +243 -0
- package/src/utils/freebuff-session-display.ts +21 -0
- package/src/utils/freebuff-streak-line.ts +93 -0
- package/src/utils/git.ts +17 -0
- package/src/utils/helpers.ts +47 -0
- package/src/utils/image-display.ts +67 -0
- package/src/utils/image-handler.ts +325 -0
- package/src/utils/image-processor.ts +133 -0
- package/src/utils/image-thumbnail.ts +78 -0
- package/src/utils/implementor-helpers.ts +787 -0
- package/src/utils/input-modes.ts +174 -0
- package/src/utils/keyboard-actions.ts +392 -0
- package/src/utils/keypad-keys.ts +47 -0
- package/src/utils/layout-helpers.ts +33 -0
- package/src/utils/lazy-response-ads.ts +1 -0
- package/src/utils/local-agent-registry.ts +474 -0
- package/src/utils/log-shipper.ts +126 -0
- package/src/utils/logger.ts +327 -0
- package/src/utils/markdown-renderer.tsx +1090 -0
- package/src/utils/math.ts +3 -0
- package/src/utils/message-block-helpers.ts +684 -0
- package/src/utils/message-history.ts +143 -0
- package/src/utils/message-tree-utils.ts +67 -0
- package/src/utils/message-updater.ts +279 -0
- package/src/utils/open-file.ts +146 -0
- package/src/utils/open-url.ts +63 -0
- package/src/utils/path-completion.ts +111 -0
- package/src/utils/path-helpers.ts +38 -0
- package/src/utils/pending-attachments.ts +360 -0
- package/src/utils/polling-backoff.ts +59 -0
- package/src/utils/project-picker.ts +12 -0
- package/src/utils/queue-panel-actions.ts +70 -0
- package/src/utils/recent-projects.ts +156 -0
- package/src/utils/renderer-cleanup.ts +233 -0
- package/src/utils/response-ad-positions.ts +1 -0
- package/src/utils/run-state-storage.ts +603 -0
- package/src/utils/safe-json.ts +153 -0
- package/src/utils/sdk-event-handlers.ts +571 -0
- package/src/utils/send-message-helpers.ts +210 -0
- package/src/utils/send-message-timer.ts +110 -0
- package/src/utils/settings.ts +226 -0
- package/src/utils/skill-registry.ts +94 -0
- package/src/utils/spawn-agent-matcher.ts +55 -0
- package/src/utils/status-indicator-state.ts +107 -0
- package/src/utils/stream-chunk-processor.ts +57 -0
- package/src/utils/strings.ts +271 -0
- package/src/utils/subscription.ts +31 -0
- package/src/utils/syntax-highlighter.tsx +19 -0
- package/src/utils/terminal-color-detection.ts +474 -0
- package/src/utils/terminal-command-broker.ts +467 -0
- package/src/utils/terminal-enter-detection.ts +63 -0
- package/src/utils/terminal-images.ts +229 -0
- package/src/utils/terminal-io.ts +85 -0
- package/src/utils/terminal-protocol-controller.ts +173 -0
- package/src/utils/terminal-reset-sequences.ts +33 -0
- package/src/utils/terminal-title.ts +84 -0
- package/src/utils/terminal-watchdog.ts +366 -0
- package/src/utils/text-layout.ts +149 -0
- package/src/utils/theme-config.ts +141 -0
- package/src/utils/theme-system.ts +1206 -0
- package/src/utils/think-tag-parser.ts +95 -0
- package/src/utils/time-format.ts +21 -0
- package/src/utils/trace-writer.ts +162 -0
- package/src/utils/ui-constants.ts +69 -0
- package/src/utils/update-checker.ts +110 -0
- package/src/utils/usage-banner-state.ts +146 -0
- package/src/utils/validation-error-formatting.ts +86 -0
- package/src/utils/validation-error-helpers.ts +19 -0
- package/src/utils/windows-terminal-health.ts +124 -0
- package/src/utils/word-wrap-utils.ts +53 -0
- package/src/utils/write-file-atomic.ts +54 -0
- package/src/utils/yield-to-event-loop.ts +9 -0
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
import type { ChatTheme } from './theme-system'
|
|
2
|
+
import type { ToolName } from '@anvil/sdk'
|
|
3
|
+
import type { ReactNode } from 'react'
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* isCollapsed/userOpened are duplicated across block types intentionally - each UI
|
|
7
|
+
* element tracks collapse state independently for different defaults and to persist
|
|
8
|
+
* user intent vs programmatic state.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
export type ChatVariant = 'ai' | 'user' | 'agent' | 'error'
|
|
12
|
+
|
|
13
|
+
export type ThinkingCollapseState = 'expanded' | 'preview' | 'hidden'
|
|
14
|
+
|
|
15
|
+
export type TextContentBlock = {
|
|
16
|
+
type: 'text'
|
|
17
|
+
content: string
|
|
18
|
+
color?: string
|
|
19
|
+
marginTop?: number
|
|
20
|
+
marginBottom?: number
|
|
21
|
+
status?: 'running' | 'complete'
|
|
22
|
+
textType?: 'reasoning' | 'text'
|
|
23
|
+
isCollapsed?: boolean
|
|
24
|
+
thinkingId?: string
|
|
25
|
+
userOpened?: boolean
|
|
26
|
+
/** True if this is a reasoning block from a <think> tag that hasn't been closed yet */
|
|
27
|
+
thinkingOpen?: boolean
|
|
28
|
+
thinkingCollapseState?: ThinkingCollapseState
|
|
29
|
+
}
|
|
30
|
+
/** Renders dynamic React content. NOT serializable - don't use for persistent data. */
|
|
31
|
+
export type HtmlContentBlock = {
|
|
32
|
+
type: 'html'
|
|
33
|
+
marginTop?: number
|
|
34
|
+
marginBottom?: number
|
|
35
|
+
render: (context: { textColor: string; theme: ChatTheme }) => ReactNode
|
|
36
|
+
}
|
|
37
|
+
export type ToolContentBlock = {
|
|
38
|
+
type: 'tool'
|
|
39
|
+
toolCallId: string
|
|
40
|
+
toolName: ToolName
|
|
41
|
+
input: any
|
|
42
|
+
output?: string
|
|
43
|
+
outputRaw?: unknown
|
|
44
|
+
agentId?: string
|
|
45
|
+
includeToolCall?: boolean
|
|
46
|
+
isCollapsed?: boolean
|
|
47
|
+
userOpened?: boolean
|
|
48
|
+
}
|
|
49
|
+
export type AgentContentBlock = {
|
|
50
|
+
type: 'agent'
|
|
51
|
+
agentId: string
|
|
52
|
+
agentName: string
|
|
53
|
+
agentType: string
|
|
54
|
+
content: string
|
|
55
|
+
status: 'running' | 'complete' | 'failed' | 'cancelled'
|
|
56
|
+
blocks?: ContentBlock[]
|
|
57
|
+
initialPrompt?: string
|
|
58
|
+
params?: Record<string, any>
|
|
59
|
+
isCollapsed?: boolean
|
|
60
|
+
userOpened?: boolean
|
|
61
|
+
/** The spawn_agents tool call ID that created this block, used to match results */
|
|
62
|
+
spawnToolCallId?: string
|
|
63
|
+
/** The index within the spawn_agents call, used to match the correct result */
|
|
64
|
+
spawnIndex?: number
|
|
65
|
+
}
|
|
66
|
+
export type AgentListContentBlock = {
|
|
67
|
+
type: 'agent-list'
|
|
68
|
+
id: string
|
|
69
|
+
agents: Array<{ id: string; displayName: string }>
|
|
70
|
+
agentsDir: string
|
|
71
|
+
isCollapsed?: boolean
|
|
72
|
+
userOpened?: boolean
|
|
73
|
+
}
|
|
74
|
+
export type ModeDividerContentBlock = {
|
|
75
|
+
type: 'mode-divider'
|
|
76
|
+
mode: string
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export type PlanContentBlock = {
|
|
80
|
+
type: 'plan'
|
|
81
|
+
content: string
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
export type AskUserContentBlock = {
|
|
85
|
+
type: 'ask-user'
|
|
86
|
+
toolCallId: string
|
|
87
|
+
questions: Array<{
|
|
88
|
+
question: string
|
|
89
|
+
header?: string
|
|
90
|
+
options: Array<{
|
|
91
|
+
label: string
|
|
92
|
+
description?: string
|
|
93
|
+
}>
|
|
94
|
+
multiSelect?: boolean
|
|
95
|
+
validation?: {
|
|
96
|
+
maxLength?: number
|
|
97
|
+
minLength?: number
|
|
98
|
+
pattern?: string
|
|
99
|
+
patternError?: string
|
|
100
|
+
}
|
|
101
|
+
}>
|
|
102
|
+
answers?: Array<{
|
|
103
|
+
questionIndex: number
|
|
104
|
+
selectedOption?: string
|
|
105
|
+
selectedOptions?: string[]
|
|
106
|
+
otherText?: string
|
|
107
|
+
}>
|
|
108
|
+
skipped?: boolean
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
export type ImageContentBlock = {
|
|
112
|
+
type: 'image'
|
|
113
|
+
image: string // base64 encoded
|
|
114
|
+
mediaType: string
|
|
115
|
+
filename?: string
|
|
116
|
+
size?: number
|
|
117
|
+
width?: number
|
|
118
|
+
height?: number
|
|
119
|
+
isCollapsed?: boolean
|
|
120
|
+
userOpened?: boolean
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
export type ImageAttachment = {
|
|
124
|
+
filename: string
|
|
125
|
+
path: string
|
|
126
|
+
size?: number
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
export type TextAttachment = {
|
|
130
|
+
id: string
|
|
131
|
+
content: string
|
|
132
|
+
preview: string
|
|
133
|
+
charCount: number
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
export type FileAttachment = {
|
|
137
|
+
path: string
|
|
138
|
+
filename: string
|
|
139
|
+
isDirectory: boolean
|
|
140
|
+
note?: string
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
export type ContentBlock =
|
|
144
|
+
| AgentContentBlock
|
|
145
|
+
| AgentListContentBlock
|
|
146
|
+
| AskUserContentBlock
|
|
147
|
+
| HtmlContentBlock
|
|
148
|
+
| ImageContentBlock
|
|
149
|
+
| ModeDividerContentBlock
|
|
150
|
+
| TextContentBlock
|
|
151
|
+
| ToolContentBlock
|
|
152
|
+
| PlanContentBlock
|
|
153
|
+
|
|
154
|
+
export type AgentMessage = {
|
|
155
|
+
agentName: string
|
|
156
|
+
agentType: string
|
|
157
|
+
responseCount: number
|
|
158
|
+
subAgentCount?: number
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
export type ChatMessageMetadata = {
|
|
162
|
+
/** Working directory where a bash command was executed */
|
|
163
|
+
bashCwd?: string
|
|
164
|
+
/** UI-only marker for a response created in this process. Restored messages
|
|
165
|
+
* strip it so ads are never fetched retroactively into settled history. */
|
|
166
|
+
allowInlineAds?: boolean
|
|
167
|
+
/** Whether this message/agent is collapsed in the UI */
|
|
168
|
+
isCollapsed?: boolean
|
|
169
|
+
/** Whether the user manually opened this collapsed item */
|
|
170
|
+
userOpened?: boolean
|
|
171
|
+
/** RunState stored after completion */
|
|
172
|
+
runState?: unknown
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
export type ChatMessage = {
|
|
176
|
+
id: string
|
|
177
|
+
variant: ChatVariant
|
|
178
|
+
content: string
|
|
179
|
+
blocks?: ContentBlock[]
|
|
180
|
+
timestamp: string
|
|
181
|
+
parentId?: string
|
|
182
|
+
agent?: AgentMessage
|
|
183
|
+
isCompletion?: boolean
|
|
184
|
+
credits?: number
|
|
185
|
+
completionTime?: string
|
|
186
|
+
isComplete?: boolean
|
|
187
|
+
metadata?: ChatMessageMetadata
|
|
188
|
+
validationErrors?: Array<{ id: string; message: string }>
|
|
189
|
+
/**
|
|
190
|
+
* UI-only runtime error displayed in UserErrorBanner (not sent to LLM).
|
|
191
|
+
* Set by setError() when an error occurs during message streaming.
|
|
192
|
+
* Can be cleared by clearUserError() when starting a new successful interaction.
|
|
193
|
+
*/
|
|
194
|
+
userError?: string
|
|
195
|
+
attachments?: ImageAttachment[]
|
|
196
|
+
textAttachments?: TextAttachment[]
|
|
197
|
+
fileAttachments?: FileAttachment[]
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
// Type guard functions for safe type narrowing
|
|
201
|
+
export function isTextBlock(block: ContentBlock): block is TextContentBlock {
|
|
202
|
+
return block.type === 'text'
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
export function isToolBlock(block: ContentBlock): block is ToolContentBlock {
|
|
206
|
+
return block.type === 'tool'
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
export function isAgentBlock(block: ContentBlock): block is AgentContentBlock {
|
|
210
|
+
return block.type === 'agent'
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
export function isHtmlBlock(block: ContentBlock): block is HtmlContentBlock {
|
|
214
|
+
return block.type === 'html'
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
export function isAgentListBlock(
|
|
218
|
+
block: ContentBlock,
|
|
219
|
+
): block is AgentListContentBlock {
|
|
220
|
+
return block.type === 'agent-list'
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
export function isPlanBlock(block: ContentBlock): block is PlanContentBlock {
|
|
224
|
+
return block.type === 'plan'
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
export function isModeDividerBlock(
|
|
228
|
+
block: ContentBlock,
|
|
229
|
+
): block is ModeDividerContentBlock {
|
|
230
|
+
return block.type === 'mode-divider'
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
export function isAskUserBlock(
|
|
234
|
+
block: ContentBlock,
|
|
235
|
+
): block is AskUserContentBlock {
|
|
236
|
+
return block.type === 'ask-user'
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
export function isImageBlock(block: ContentBlock): block is ImageContentBlock {
|
|
240
|
+
return block.type === 'image'
|
|
241
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { PendingAttachment } from '../store'
|
|
2
|
+
import type { AgentMode } from '../../utils/constants'
|
|
3
|
+
import type { ChatMessage } from '../chat'
|
|
4
|
+
|
|
5
|
+
export type PostUserMessageFn = (prev: ChatMessage[]) => ChatMessage[]
|
|
6
|
+
|
|
7
|
+
export type SendMessageFn = (params: {
|
|
8
|
+
content: string
|
|
9
|
+
agentMode: AgentMode
|
|
10
|
+
postUserMessage?: PostUserMessageFn
|
|
11
|
+
attachments?: PendingAttachment[]
|
|
12
|
+
}) => Promise<void>
|
package/src/types/env.ts
ADDED
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI-specific environment variable types.
|
|
3
|
+
*
|
|
4
|
+
* Extends base types from common with CLI-specific vars for:
|
|
5
|
+
* - Terminal/IDE detection
|
|
6
|
+
* - Editor preferences
|
|
7
|
+
* - Binary build configuration
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import type { BaseEnv, ClientEnv } from '@anvil/common/types/contracts/env'
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* CLI-specific env vars for terminal/IDE detection and editor preferences.
|
|
14
|
+
*/
|
|
15
|
+
export type CliEnv = BaseEnv & {
|
|
16
|
+
// Windows system paths
|
|
17
|
+
SystemRoot?: string
|
|
18
|
+
|
|
19
|
+
// Terminal detection (for tmux/screen passthrough)
|
|
20
|
+
TERM?: string
|
|
21
|
+
TMUX?: string
|
|
22
|
+
STY?: string
|
|
23
|
+
|
|
24
|
+
// SSH/remote session detection
|
|
25
|
+
SSH_CLIENT?: string
|
|
26
|
+
SSH_TTY?: string
|
|
27
|
+
SSH_CONNECTION?: string
|
|
28
|
+
CODESPACES?: string
|
|
29
|
+
|
|
30
|
+
// Display server detection (Linux headless check)
|
|
31
|
+
DISPLAY?: string
|
|
32
|
+
WAYLAND_DISPLAY?: string
|
|
33
|
+
|
|
34
|
+
// Terminal-specific
|
|
35
|
+
KITTY_WINDOW_ID?: string
|
|
36
|
+
SIXEL_SUPPORT?: string
|
|
37
|
+
ZED_NODE_ENV?: string
|
|
38
|
+
ZED_TERM?: string
|
|
39
|
+
ZED_SHELL?: string
|
|
40
|
+
COLORTERM?: string
|
|
41
|
+
|
|
42
|
+
// VS Code family detection
|
|
43
|
+
VSCODE_THEME_KIND?: string
|
|
44
|
+
VSCODE_COLOR_THEME_KIND?: string
|
|
45
|
+
VSCODE_GIT_IPC_HANDLE?: string
|
|
46
|
+
VSCODE_PID?: string
|
|
47
|
+
VSCODE_CWD?: string
|
|
48
|
+
VSCODE_NLS_CONFIG?: string
|
|
49
|
+
|
|
50
|
+
// Cursor editor detection
|
|
51
|
+
CURSOR_PORT?: string
|
|
52
|
+
CURSOR?: string
|
|
53
|
+
|
|
54
|
+
// JetBrains IDE detection
|
|
55
|
+
JETBRAINS_REMOTE_RUN?: string
|
|
56
|
+
IDEA_INITIAL_DIRECTORY?: string
|
|
57
|
+
IDE_CONFIG_DIR?: string
|
|
58
|
+
JB_IDE_CONFIG_DIR?: string
|
|
59
|
+
|
|
60
|
+
// Editor preferences
|
|
61
|
+
VISUAL?: string
|
|
62
|
+
EDITOR?: string
|
|
63
|
+
ANVIL_CLI_EDITOR?: string
|
|
64
|
+
ANVIL_EDITOR?: string
|
|
65
|
+
|
|
66
|
+
// Theme preferences
|
|
67
|
+
OPEN_TUI_THEME?: string
|
|
68
|
+
OPENTUI_THEME?: string
|
|
69
|
+
|
|
70
|
+
// Anvil CLI-specific (set during binary build)
|
|
71
|
+
ANVIL_IS_BINARY?: string
|
|
72
|
+
ANVIL_CLI_VERSION?: string
|
|
73
|
+
ANVIL_CLI_TARGET?: string
|
|
74
|
+
ANVIL_RG_PATH?: string
|
|
75
|
+
ANVIL_SCROLL_MULTIPLIER?: string
|
|
76
|
+
ANVIL_PERF_TEST?: string
|
|
77
|
+
ANVIL_TRACE?: string
|
|
78
|
+
ANVIL_LAUNCHER_PID?: string
|
|
79
|
+
// Toggle for mirroring CLI logs to the server's /api/logs sink (Axiom).
|
|
80
|
+
ANVIL_SHIP_LOGS?: string
|
|
81
|
+
// Set to 1/true to suppress the terminal-reset watchdog on machines where
|
|
82
|
+
// the PowerShell process shape conflicts with endpoint-security policy.
|
|
83
|
+
ANVIL_NO_TERMINAL_WATCHDOG?: string
|
|
84
|
+
FREEBUFF_MODE?: string
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Full CLI env deps combining client env and CLI env.
|
|
89
|
+
*/
|
|
90
|
+
export type CliEnvDeps = {
|
|
91
|
+
clientEnv: ClientEnv
|
|
92
|
+
env: CliEnv
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Function type for getting CLI env values.
|
|
97
|
+
*/
|
|
98
|
+
export type GetCliEnvFn = () => CliEnv
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export type { FreebuffSessionServerResponse } from '@anvil/common/types/freebuff-session'
|
|
2
|
+
|
|
3
|
+
import type { FreebuffSessionServerResponse } from '@anvil/common/types/freebuff-session'
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* CLI session shape. Most states are wire-level `/api/v1/freebuff/session`
|
|
7
|
+
* responses; `takeover_prompt` is local-only so startup can ask before POSTing
|
|
8
|
+
* and rotating another running CLI's instance id.
|
|
9
|
+
*/
|
|
10
|
+
export type FreebuffSessionResponse =
|
|
11
|
+
| FreebuffSessionServerResponse
|
|
12
|
+
| {
|
|
13
|
+
status: 'takeover_prompt'
|
|
14
|
+
model: string
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export type FreebuffSessionStatus = FreebuffSessionResponse['status']
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { Prettify } from './utils'
|
|
2
|
+
import type { UnionToIntersection } from 'bun-types/vendor/expect-type'
|
|
3
|
+
|
|
4
|
+
type StripExact<T> = T extends infer U & { [x: string]: never } ? U : T
|
|
5
|
+
|
|
6
|
+
type ParamsOfFunction<T> = T extends (params: infer C) => any ? StripExact<C> : never
|
|
7
|
+
|
|
8
|
+
type IsUnion<T, U = T> = T extends any ? ([U] extends [T] ? false : true) : false
|
|
9
|
+
type ParamsOfArray<T> = UnionToIntersection<
|
|
10
|
+
T extends [infer fn, ...infer rest]
|
|
11
|
+
? ParamsOfFunction<fn> | ParamsOfArray<rest>
|
|
12
|
+
: {}
|
|
13
|
+
>
|
|
14
|
+
type ParamsOfUnion<T> = IsUnion<T> extends true
|
|
15
|
+
? UnionToIntersection<ParamsOfFunction<T>>
|
|
16
|
+
: ParamsOfFunction<T>
|
|
17
|
+
|
|
18
|
+
export type ParamsOf<T> = Prettify<
|
|
19
|
+
T extends any[] ? ParamsOfArray<T> : ParamsOfUnion<T>
|
|
20
|
+
>
|
|
21
|
+
|
|
22
|
+
export type OptionalFields<T, K extends keyof T> = Prettify<
|
|
23
|
+
Omit<T, K> & Partial<Pick<T, K>>
|
|
24
|
+
>
|
|
25
|
+
|
|
26
|
+
export type ParamsExcluding<T, K extends keyof ParamsOf<T>> = Prettify<
|
|
27
|
+
Omit<ParamsOf<T>, K>
|
|
28
|
+
>
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* React 19 compatibility shim for OpenTUI JSX types.
|
|
3
|
+
*
|
|
4
|
+
* OpenTUI's JSX namespace defines `type Element = React.ReactNode`.
|
|
5
|
+
* In React 19, `FunctionComponent` returns `ReactNode | Promise<ReactNode>`,
|
|
6
|
+
* but `Promise<ReactNode>` is not assignable to `ReactNode`.
|
|
7
|
+
*
|
|
8
|
+
* This augmentation adds a narrower call signature to `FunctionComponent`
|
|
9
|
+
* that returns just `ReactNode`. Due to TypeScript's interface merging rules,
|
|
10
|
+
* the later declaration's overloads have higher precedence, so the narrower
|
|
11
|
+
* signature is resolved first — fixing all `React.FC` JSX compatibility errors.
|
|
12
|
+
*/
|
|
13
|
+
import 'react'
|
|
14
|
+
|
|
15
|
+
declare module 'react' {
|
|
16
|
+
interface FunctionComponent<P = {}> {
|
|
17
|
+
(props: P): ReactNode
|
|
18
|
+
}
|
|
19
|
+
}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/** Types of banners that can appear at the top of the chat */
|
|
2
|
+
export type TopBannerType = 'homeDir' | 'gitRoot' | null
|
|
3
|
+
|
|
4
|
+
export type InputValue = {
|
|
5
|
+
text: string
|
|
6
|
+
cursorPosition: number
|
|
7
|
+
lastEditDueToNav: boolean
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export type AskUserQuestion = {
|
|
11
|
+
question: string
|
|
12
|
+
header?: string
|
|
13
|
+
options:
|
|
14
|
+
| string[]
|
|
15
|
+
| Array<{
|
|
16
|
+
label: string
|
|
17
|
+
description?: string
|
|
18
|
+
}>
|
|
19
|
+
multiSelect?: boolean
|
|
20
|
+
validation?: {
|
|
21
|
+
maxLength?: number
|
|
22
|
+
minLength?: number
|
|
23
|
+
pattern?: string
|
|
24
|
+
patternError?: string
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export type AnswerState = number | number[]
|
|
29
|
+
|
|
30
|
+
export type AskUserState = {
|
|
31
|
+
toolCallId: string
|
|
32
|
+
questions: AskUserQuestion[]
|
|
33
|
+
selectedAnswers: AnswerState[] // Single-select: number (-1 = not answered), Multi-select: number[]
|
|
34
|
+
otherTexts: string[] // Custom text input for each question (empty string if not used)
|
|
35
|
+
} | null
|
|
36
|
+
|
|
37
|
+
export type PendingImageStatus = 'processing' | 'ready' | 'error'
|
|
38
|
+
|
|
39
|
+
/** Image attachment with processed data */
|
|
40
|
+
export type PendingImageAttachment = {
|
|
41
|
+
kind: 'image'
|
|
42
|
+
path: string
|
|
43
|
+
filename: string
|
|
44
|
+
status: PendingImageStatus
|
|
45
|
+
size?: number
|
|
46
|
+
width?: number
|
|
47
|
+
height?: number
|
|
48
|
+
note?: string // Display note: "compressed" | error message
|
|
49
|
+
processedImage?: {
|
|
50
|
+
base64: string
|
|
51
|
+
mediaType: string
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/** Text attachment (large pasted text) */
|
|
56
|
+
export type PendingTextAttachment = {
|
|
57
|
+
kind: 'text'
|
|
58
|
+
id: string
|
|
59
|
+
content: string
|
|
60
|
+
preview: string // First ~100 chars for display
|
|
61
|
+
charCount: number
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/** File or folder attachment (dragged or copied from file manager) */
|
|
65
|
+
export type PendingFileAttachment = {
|
|
66
|
+
kind: 'file'
|
|
67
|
+
id: string
|
|
68
|
+
path: string
|
|
69
|
+
filename: string
|
|
70
|
+
isDirectory: boolean
|
|
71
|
+
content: string
|
|
72
|
+
status: 'processing' | 'ready' | 'error'
|
|
73
|
+
note?: string // e.g. "3.2 KB" / "12 items" / error message
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/** Unified attachment type with discriminator */
|
|
77
|
+
export type PendingAttachment = PendingImageAttachment | PendingTextAttachment | PendingFileAttachment
|
|
78
|
+
|
|
79
|
+
/** @deprecated Use PendingImageAttachment instead */
|
|
80
|
+
export type PendingImage = PendingImageAttachment
|
|
81
|
+
|
|
82
|
+
export type PendingBashMessage = {
|
|
83
|
+
id: string
|
|
84
|
+
command: string
|
|
85
|
+
stdout: string
|
|
86
|
+
stderr: string
|
|
87
|
+
exitCode: number
|
|
88
|
+
/** Whether the command is still running */
|
|
89
|
+
isRunning: boolean
|
|
90
|
+
startTime?: number
|
|
91
|
+
cwd?: string
|
|
92
|
+
/** Whether the message was already added to UI chat history (non-ghost mode) */
|
|
93
|
+
addedToHistory?: boolean
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
export type SuggestedFollowup = {
|
|
97
|
+
prompt: string
|
|
98
|
+
label?: string
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
export type SuggestedFollowupsState = {
|
|
102
|
+
/** The tool call ID that created these followups */
|
|
103
|
+
toolCallId: string
|
|
104
|
+
/** The list of followup suggestions */
|
|
105
|
+
followups: SuggestedFollowup[]
|
|
106
|
+
/** Set of indices that have been clicked */
|
|
107
|
+
clickedIndices: Set<number>
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/** Map of toolCallId -> Set of clicked indices (persists across followup sets) */
|
|
111
|
+
export type ClickedFollowupsMap = Map<string, Set<number>>
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
export type ThemeName = 'dark' | 'light'
|
|
2
|
+
|
|
3
|
+
export type MarkdownHeadingLevel = 1 | 2 | 3 | 4 | 5 | 6
|
|
4
|
+
|
|
5
|
+
// ThemeColor is always a resolved color string (never 'default' or undefined)
|
|
6
|
+
export type ThemeColor = string
|
|
7
|
+
|
|
8
|
+
export interface MarkdownThemeOverrides {
|
|
9
|
+
codeBackground?: string
|
|
10
|
+
codeHeaderFg?: string
|
|
11
|
+
inlineCodeFg?: string
|
|
12
|
+
codeTextFg?: string
|
|
13
|
+
headingFg?: Partial<Record<MarkdownHeadingLevel, string>>
|
|
14
|
+
listBulletFg?: string
|
|
15
|
+
blockquoteBorderFg?: string
|
|
16
|
+
blockquoteTextFg?: string
|
|
17
|
+
dividerFg?: string
|
|
18
|
+
codeMonochrome?: boolean
|
|
19
|
+
linkFg?: string
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Semantic Color Theme Interface
|
|
24
|
+
* Inspired by Tailwind - uses semantic color roles instead of specific names
|
|
25
|
+
* This makes theming easier and more intuitive
|
|
26
|
+
*/
|
|
27
|
+
export interface ChatTheme {
|
|
28
|
+
/** Theme identifier ('dark' or 'light') */
|
|
29
|
+
name: ThemeName
|
|
30
|
+
// ============================================================================
|
|
31
|
+
// CORE SEMANTIC COLORS
|
|
32
|
+
// ============================================================================
|
|
33
|
+
|
|
34
|
+
/** Primary brand color - main actions, highlights, important elements */
|
|
35
|
+
primary: string
|
|
36
|
+
|
|
37
|
+
/** Secondary brand color - supporting elements, less emphasis */
|
|
38
|
+
secondary: string
|
|
39
|
+
|
|
40
|
+
/** Success color - checkmarks, completed states, positive feedback */
|
|
41
|
+
success: string
|
|
42
|
+
|
|
43
|
+
/** Error/danger color - errors, destructive actions, failures */
|
|
44
|
+
error: string
|
|
45
|
+
|
|
46
|
+
/** Warning color - cautions, alerts, validation issues */
|
|
47
|
+
warning: string
|
|
48
|
+
|
|
49
|
+
/** Info color - informational elements, hints */
|
|
50
|
+
info: string
|
|
51
|
+
|
|
52
|
+
/** Link color - hyperlinks, clickable references */
|
|
53
|
+
link: string
|
|
54
|
+
|
|
55
|
+
/** Directory color - folder/directory paths */
|
|
56
|
+
directory: string
|
|
57
|
+
|
|
58
|
+
// ============================================================================
|
|
59
|
+
// NEUTRAL SCALE
|
|
60
|
+
// ============================================================================
|
|
61
|
+
|
|
62
|
+
/** Default text color */
|
|
63
|
+
foreground: ThemeColor
|
|
64
|
+
|
|
65
|
+
/** Base background color */
|
|
66
|
+
background: string
|
|
67
|
+
|
|
68
|
+
/** Subdued/secondary text color */
|
|
69
|
+
muted: ThemeColor
|
|
70
|
+
|
|
71
|
+
/** Border and divider color */
|
|
72
|
+
border: string
|
|
73
|
+
|
|
74
|
+
/** Surface color for panels, cards, chrome */
|
|
75
|
+
surface: string
|
|
76
|
+
|
|
77
|
+
/** Hover state for interactive surfaces */
|
|
78
|
+
surfaceHover: string
|
|
79
|
+
|
|
80
|
+
// ============================================================================
|
|
81
|
+
// CONTEXT-SPECIFIC COLORS (Minimal - most use semantic colors)
|
|
82
|
+
// ============================================================================
|
|
83
|
+
|
|
84
|
+
// AI/User differentiation
|
|
85
|
+
/** AI message indicator line color */
|
|
86
|
+
aiLine: string
|
|
87
|
+
|
|
88
|
+
/** User message indicator line color */
|
|
89
|
+
userLine: string
|
|
90
|
+
|
|
91
|
+
// Agent backgrounds (specific states that don't map to semantics)
|
|
92
|
+
/** Agent toggle header background */
|
|
93
|
+
agentToggleHeaderBg: string
|
|
94
|
+
|
|
95
|
+
/** Agent toggle expanded background */
|
|
96
|
+
agentToggleExpandedBg: string
|
|
97
|
+
|
|
98
|
+
/** Agent focused background */
|
|
99
|
+
agentFocusedBg: string
|
|
100
|
+
|
|
101
|
+
/** Agent content background */
|
|
102
|
+
agentContentBg: string
|
|
103
|
+
/** Input text color */
|
|
104
|
+
inputFg: ThemeColor
|
|
105
|
+
|
|
106
|
+
/** Focused input text color */
|
|
107
|
+
inputFocusedFg: ThemeColor
|
|
108
|
+
|
|
109
|
+
// Mode toggles (distinct UI elements)
|
|
110
|
+
/** Fast mode toggle background */
|
|
111
|
+
modeFastBg: string
|
|
112
|
+
|
|
113
|
+
/** Fast mode toggle text */
|
|
114
|
+
modeFastText: string
|
|
115
|
+
|
|
116
|
+
/** Max mode toggle background */
|
|
117
|
+
modeMaxBg: string
|
|
118
|
+
|
|
119
|
+
/** Max mode toggle text */
|
|
120
|
+
modeMaxText: string
|
|
121
|
+
|
|
122
|
+
/** Plan mode toggle background */
|
|
123
|
+
modePlanBg: string
|
|
124
|
+
|
|
125
|
+
/** Plan mode toggle text */
|
|
126
|
+
modePlanText: string
|
|
127
|
+
|
|
128
|
+
// ============================================================================
|
|
129
|
+
// IMAGE CARD
|
|
130
|
+
// ============================================================================
|
|
131
|
+
|
|
132
|
+
/** Image card border color */
|
|
133
|
+
imageCardBorder: string
|
|
134
|
+
|
|
135
|
+
// ============================================================================
|
|
136
|
+
// MARKDOWN
|
|
137
|
+
// ============================================================================
|
|
138
|
+
|
|
139
|
+
/** Markdown-specific styling */
|
|
140
|
+
markdown?: MarkdownThemeOverrides
|
|
141
|
+
|
|
142
|
+
/** Text attributes (bold, dim, etc.) */
|
|
143
|
+
messageTextAttributes?: number
|
|
144
|
+
}
|