@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,361 @@
|
|
|
1
|
+
import { describe, test, expect } from 'bun:test'
|
|
2
|
+
|
|
3
|
+
import { isInsideStringDelimiters, parseAtInLine } from '../use-suggestion-engine'
|
|
4
|
+
|
|
5
|
+
describe('@ mention edge cases - quote detection', () => {
|
|
6
|
+
test('isInsideStringDelimiters detects position inside double quotes', () => {
|
|
7
|
+
expect(isInsideStringDelimiters('"hello @world"', 7)).toBe(true)
|
|
8
|
+
})
|
|
9
|
+
|
|
10
|
+
test('isInsideStringDelimiters does NOT detect position inside single quotes (apostrophes)', () => {
|
|
11
|
+
// Single quotes are ignored - they're commonly used as apostrophes
|
|
12
|
+
expect(isInsideStringDelimiters("'hello @world'", 7)).toBe(false)
|
|
13
|
+
})
|
|
14
|
+
|
|
15
|
+
test('isInsideStringDelimiters detects position inside backticks', () => {
|
|
16
|
+
expect(isInsideStringDelimiters('`hello @world`', 7)).toBe(true)
|
|
17
|
+
})
|
|
18
|
+
|
|
19
|
+
test('isInsideStringDelimiters returns false for position outside quotes', () => {
|
|
20
|
+
expect(isInsideStringDelimiters('"hello" @world', 8)).toBe(false)
|
|
21
|
+
})
|
|
22
|
+
|
|
23
|
+
test('isInsideStringDelimiters handles escaped quotes', () => {
|
|
24
|
+
expect(isInsideStringDelimiters('"hello \\" @world"', 11)).toBe(true)
|
|
25
|
+
})
|
|
26
|
+
})
|
|
27
|
+
|
|
28
|
+
describe('parseAtInLine - @ mention trigger logic', () => {
|
|
29
|
+
test('triggers for @ at start of line', () => {
|
|
30
|
+
const result = parseAtInLine('@agent')
|
|
31
|
+
expect(result.active).toBe(true)
|
|
32
|
+
expect(result.query).toBe('agent')
|
|
33
|
+
})
|
|
34
|
+
|
|
35
|
+
test('triggers for @ after whitespace', () => {
|
|
36
|
+
const result = parseAtInLine('hello @agent')
|
|
37
|
+
expect(result.active).toBe(true)
|
|
38
|
+
expect(result.query).toBe('agent')
|
|
39
|
+
})
|
|
40
|
+
|
|
41
|
+
test('does NOT trigger for @ inside double quotes', () => {
|
|
42
|
+
const result = parseAtInLine('"@agent"')
|
|
43
|
+
expect(result.active).toBe(false)
|
|
44
|
+
})
|
|
45
|
+
|
|
46
|
+
test('does NOT trigger for @ immediately after single quote (whitespace still required)', () => {
|
|
47
|
+
// Single quotes don't create quoted regions, but whitespace before @ is still required
|
|
48
|
+
const result = parseAtInLine("'@agent'")
|
|
49
|
+
expect(result.active).toBe(false)
|
|
50
|
+
})
|
|
51
|
+
|
|
52
|
+
test('does NOT trigger for @ inside backticks', () => {
|
|
53
|
+
const result = parseAtInLine('`@agent`')
|
|
54
|
+
expect(result.active).toBe(false)
|
|
55
|
+
})
|
|
56
|
+
|
|
57
|
+
test('does NOT trigger for email addresses', () => {
|
|
58
|
+
const result = parseAtInLine('user@example.com')
|
|
59
|
+
expect(result.active).toBe(false)
|
|
60
|
+
})
|
|
61
|
+
|
|
62
|
+
test('does NOT trigger for escaped @ symbol', () => {
|
|
63
|
+
const result = parseAtInLine('\\@agent')
|
|
64
|
+
expect(result.active).toBe(false)
|
|
65
|
+
})
|
|
66
|
+
|
|
67
|
+
test('does NOT trigger for @ in URLs with colon', () => {
|
|
68
|
+
const result = parseAtInLine('https://example.com/@user')
|
|
69
|
+
expect(result.active).toBe(false)
|
|
70
|
+
})
|
|
71
|
+
|
|
72
|
+
test('does NOT trigger for @ after dot', () => {
|
|
73
|
+
const result = parseAtInLine('file.@property')
|
|
74
|
+
expect(result.active).toBe(false)
|
|
75
|
+
})
|
|
76
|
+
|
|
77
|
+
test('triggers after closing quote', () => {
|
|
78
|
+
const result = parseAtInLine('"test" @agent')
|
|
79
|
+
expect(result.active).toBe(true)
|
|
80
|
+
expect(result.query).toBe('agent')
|
|
81
|
+
})
|
|
82
|
+
|
|
83
|
+
test('handles nested quotes correctly - @ inside outer quotes', () => {
|
|
84
|
+
const result = parseAtInLine('"test \'nested\' @here"')
|
|
85
|
+
expect(result.active).toBe(false)
|
|
86
|
+
})
|
|
87
|
+
|
|
88
|
+
test('extracts query correctly', () => {
|
|
89
|
+
const result = parseAtInLine('@myagent')
|
|
90
|
+
expect(result.active).toBe(true)
|
|
91
|
+
expect(result.query).toBe('myagent')
|
|
92
|
+
})
|
|
93
|
+
|
|
94
|
+
test('does NOT trigger if @ followed by space', () => {
|
|
95
|
+
const result = parseAtInLine('@ agent')
|
|
96
|
+
expect(result.active).toBe(false)
|
|
97
|
+
})
|
|
98
|
+
|
|
99
|
+
test('uses lastIndexOf to find the rightmost @', () => {
|
|
100
|
+
const result = parseAtInLine('@first @second')
|
|
101
|
+
expect(result.active).toBe(true)
|
|
102
|
+
expect(result.query).toBe('second')
|
|
103
|
+
})
|
|
104
|
+
})
|
|
105
|
+
|
|
106
|
+
describe('parseAtInLine - comprehensive edge cases', () => {
|
|
107
|
+
// Email variations
|
|
108
|
+
test.each([
|
|
109
|
+
['user@mail.example.com', 'email with subdomain'],
|
|
110
|
+
['user123@example.com', 'email with numbers'],
|
|
111
|
+
['user_name@example.com', 'email with underscores'],
|
|
112
|
+
['user-name@example.com', 'email with hyphens'],
|
|
113
|
+
['first.last@example.com', 'email with dots in username'],
|
|
114
|
+
])('does NOT trigger for %s (%s)', (input) => {
|
|
115
|
+
const result = parseAtInLine(input)
|
|
116
|
+
expect(result.active).toBe(false)
|
|
117
|
+
})
|
|
118
|
+
|
|
119
|
+
// URL variations
|
|
120
|
+
test.each([
|
|
121
|
+
['http://example.com/@user', 'http URL'],
|
|
122
|
+
['https://example.com/@user', 'https URL'],
|
|
123
|
+
['http://localhost:3000/@user', 'URL with port'],
|
|
124
|
+
])('does NOT trigger for %s (%s)', (input) => {
|
|
125
|
+
const result = parseAtInLine(input)
|
|
126
|
+
expect(result.active).toBe(false)
|
|
127
|
+
})
|
|
128
|
+
|
|
129
|
+
// Quote escape variations
|
|
130
|
+
test('does NOT trigger for @ after escaped backslash in quotes', () => {
|
|
131
|
+
const result = parseAtInLine('"\\\\@test"')
|
|
132
|
+
expect(result.active).toBe(false)
|
|
133
|
+
})
|
|
134
|
+
|
|
135
|
+
test('does NOT trigger for @ when quote is escaped (string still open)', () => {
|
|
136
|
+
// In "test\" @agent, the \" is an escaped quote, so the string is still open
|
|
137
|
+
const result = parseAtInLine('"test\\" @agent')
|
|
138
|
+
expect(result.active).toBe(false)
|
|
139
|
+
})
|
|
140
|
+
|
|
141
|
+
test('triggers for @ after quote with escaped backslash before it', () => {
|
|
142
|
+
// In "test\\" @agent, the \\ is an escaped backslash, so the " closes the string
|
|
143
|
+
const result = parseAtInLine('"test\\\\" @agent')
|
|
144
|
+
expect(result.active).toBe(true)
|
|
145
|
+
expect(result.query).toBe('agent')
|
|
146
|
+
})
|
|
147
|
+
|
|
148
|
+
test('handles multiple escaped quotes correctly', () => {
|
|
149
|
+
const result = parseAtInLine('"test\\"more\\" @here"')
|
|
150
|
+
expect(result.active).toBe(false)
|
|
151
|
+
})
|
|
152
|
+
|
|
153
|
+
// Mixed quote types
|
|
154
|
+
test('handles single quote inside double quotes', () => {
|
|
155
|
+
const result = parseAtInLine('"it\'s @here"')
|
|
156
|
+
expect(result.active).toBe(false)
|
|
157
|
+
})
|
|
158
|
+
|
|
159
|
+
test('handles double quote inside single quotes', () => {
|
|
160
|
+
const result = parseAtInLine('\'say "@hello"\'')
|
|
161
|
+
expect(result.active).toBe(false)
|
|
162
|
+
})
|
|
163
|
+
|
|
164
|
+
test('handles backticks with quotes inside', () => {
|
|
165
|
+
const result = parseAtInLine('`"@test"`')
|
|
166
|
+
expect(result.active).toBe(false)
|
|
167
|
+
})
|
|
168
|
+
|
|
169
|
+
// Multiple @ symbols
|
|
170
|
+
test('finds last @ when multiple exist outside quotes', () => {
|
|
171
|
+
const result = parseAtInLine('@first "@quoted" @last')
|
|
172
|
+
expect(result.active).toBe(true)
|
|
173
|
+
expect(result.query).toBe('last')
|
|
174
|
+
})
|
|
175
|
+
|
|
176
|
+
test('finds last @ even if previous ones are in quotes', () => {
|
|
177
|
+
const result = parseAtInLine('"@in_quotes" @real_one')
|
|
178
|
+
expect(result.active).toBe(true)
|
|
179
|
+
expect(result.query).toBe('real_one')
|
|
180
|
+
})
|
|
181
|
+
|
|
182
|
+
// Special characters after @
|
|
183
|
+
test('does NOT trigger for @ followed by special characters', () => {
|
|
184
|
+
const result = parseAtInLine('@!')
|
|
185
|
+
expect(result.active).toBe(true)
|
|
186
|
+
expect(result.query).toBe('!')
|
|
187
|
+
})
|
|
188
|
+
|
|
189
|
+
test('extracts alphanumeric query with underscores and hyphens', () => {
|
|
190
|
+
const result = parseAtInLine('@my-agent_v2')
|
|
191
|
+
expect(result.active).toBe(true)
|
|
192
|
+
expect(result.query).toBe('my-agent_v2')
|
|
193
|
+
})
|
|
194
|
+
|
|
195
|
+
// Whitespace variations
|
|
196
|
+
test.each([
|
|
197
|
+
['\t@agent', 'tab before @'],
|
|
198
|
+
[' @agent', 'space before @'],
|
|
199
|
+
['text @agent', 'multiple spaces before @'],
|
|
200
|
+
])('triggers with %s (%s)', (input) => {
|
|
201
|
+
const result = parseAtInLine(input)
|
|
202
|
+
expect(result.active).toBe(true)
|
|
203
|
+
expect(result.query).toBe('agent')
|
|
204
|
+
})
|
|
205
|
+
|
|
206
|
+
// Empty and edge cases
|
|
207
|
+
test('handles empty string', () => {
|
|
208
|
+
const result = parseAtInLine('')
|
|
209
|
+
expect(result.active).toBe(false)
|
|
210
|
+
})
|
|
211
|
+
|
|
212
|
+
test('handles just @', () => {
|
|
213
|
+
const result = parseAtInLine('@')
|
|
214
|
+
expect(result.active).toBe(true)
|
|
215
|
+
expect(result.query).toBe('')
|
|
216
|
+
})
|
|
217
|
+
|
|
218
|
+
test('handles @ at end of string with query', () => {
|
|
219
|
+
const result = parseAtInLine('text @query')
|
|
220
|
+
expect(result.active).toBe(true)
|
|
221
|
+
expect(result.query).toBe('query')
|
|
222
|
+
})
|
|
223
|
+
|
|
224
|
+
// Code-like contexts (where @ might appear)
|
|
225
|
+
test.each([
|
|
226
|
+
['something.@decorator', 'decorator-like syntax'],
|
|
227
|
+
['array.@index', 'array access'],
|
|
228
|
+
])('does NOT trigger for %s (%s)', (input) => {
|
|
229
|
+
const result = parseAtInLine(input)
|
|
230
|
+
expect(result.active).toBe(false)
|
|
231
|
+
})
|
|
232
|
+
|
|
233
|
+
// Social media handles (ambiguous - should these trigger?)
|
|
234
|
+
test('triggers for Twitter-like handles after space', () => {
|
|
235
|
+
const result = parseAtInLine('follow @username')
|
|
236
|
+
expect(result.active).toBe(true)
|
|
237
|
+
expect(result.query).toBe('username')
|
|
238
|
+
})
|
|
239
|
+
|
|
240
|
+
test('does NOT trigger when @ is part of word', () => {
|
|
241
|
+
const result = parseAtInLine('user@mention')
|
|
242
|
+
expect(result.active).toBe(false)
|
|
243
|
+
})
|
|
244
|
+
|
|
245
|
+
// Multiple quotes on same line
|
|
246
|
+
test('handles alternating quotes correctly', () => {
|
|
247
|
+
const result = parseAtInLine('"first" \'second\' "@third"')
|
|
248
|
+
expect(result.active).toBe(false)
|
|
249
|
+
})
|
|
250
|
+
|
|
251
|
+
test('triggers after all quotes are closed', () => {
|
|
252
|
+
const result = parseAtInLine('"first" \'second\' @third')
|
|
253
|
+
expect(result.active).toBe(true)
|
|
254
|
+
expect(result.query).toBe('third')
|
|
255
|
+
})
|
|
256
|
+
|
|
257
|
+
// Unclosed quotes
|
|
258
|
+
test('does NOT trigger when inside unclosed double quote', () => {
|
|
259
|
+
const result = parseAtInLine('"unclosed @mention')
|
|
260
|
+
expect(result.active).toBe(false)
|
|
261
|
+
})
|
|
262
|
+
|
|
263
|
+
test('DOES trigger when inside unclosed single quote (apostrophes dont suppress)', () => {
|
|
264
|
+
// Single quotes are treated as apostrophes, not string delimiters
|
|
265
|
+
const result = parseAtInLine("'unclosed @mention")
|
|
266
|
+
expect(result.active).toBe(true)
|
|
267
|
+
expect(result.query).toBe('mention')
|
|
268
|
+
})
|
|
269
|
+
|
|
270
|
+
test('does NOT trigger when inside unclosed backtick', () => {
|
|
271
|
+
const result = parseAtInLine('`unclosed @mention')
|
|
272
|
+
expect(result.active).toBe(false)
|
|
273
|
+
})
|
|
274
|
+
})
|
|
275
|
+
|
|
276
|
+
describe('single quote handling - apostrophes should NOT suppress @ menu', () => {
|
|
277
|
+
// Common contractions with apostrophes - use test.each for repetitive cases
|
|
278
|
+
const contractions = [
|
|
279
|
+
["don't", 'agent'],
|
|
280
|
+
["it's", 'agent'],
|
|
281
|
+
["I'm", 'agent'],
|
|
282
|
+
["can't", 'agent'],
|
|
283
|
+
["won't", 'agent'],
|
|
284
|
+
["you're", 'agent'],
|
|
285
|
+
["they're", 'agent'],
|
|
286
|
+
["doesn't", 'agent'],
|
|
287
|
+
] as const
|
|
288
|
+
|
|
289
|
+
test.each(contractions)(
|
|
290
|
+
'triggers @ after contraction "%s"',
|
|
291
|
+
(contraction, expectedQuery) => {
|
|
292
|
+
const result = parseAtInLine(`I ${contraction} @${expectedQuery}`)
|
|
293
|
+
expect(result.active).toBe(true)
|
|
294
|
+
expect(result.query).toBe(expectedQuery)
|
|
295
|
+
},
|
|
296
|
+
)
|
|
297
|
+
|
|
298
|
+
// Possessives with apostrophes
|
|
299
|
+
const possessives = [
|
|
300
|
+
["user's", 'mention'],
|
|
301
|
+
["file's", 'content'],
|
|
302
|
+
] as const
|
|
303
|
+
|
|
304
|
+
test.each(possessives)(
|
|
305
|
+
'triggers @ after possessive "%s"',
|
|
306
|
+
(possessive, expectedQuery) => {
|
|
307
|
+
const result = parseAtInLine(`${possessive} @${expectedQuery}`)
|
|
308
|
+
expect(result.active).toBe(true)
|
|
309
|
+
expect(result.query).toBe(expectedQuery)
|
|
310
|
+
},
|
|
311
|
+
)
|
|
312
|
+
|
|
313
|
+
// Multiple apostrophes in sentence
|
|
314
|
+
test('triggers @ with multiple apostrophes in sentence', () => {
|
|
315
|
+
const result = parseAtInLine("I don't think it's working @agent")
|
|
316
|
+
expect(result.active).toBe(true)
|
|
317
|
+
expect(result.query).toBe('agent')
|
|
318
|
+
})
|
|
319
|
+
|
|
320
|
+
// Single quotes that look like string delimiters
|
|
321
|
+
test('triggers @ after space inside single-quoted-looking string', () => {
|
|
322
|
+
// The @ triggers because there's a space before it, not because of single quotes
|
|
323
|
+
const result = parseAtInLine("'hello @world'")
|
|
324
|
+
expect(result.active).toBe(true)
|
|
325
|
+
// Query includes the trailing quote since it's not a delimiter
|
|
326
|
+
expect(result.query).toBe("world'")
|
|
327
|
+
})
|
|
328
|
+
|
|
329
|
+
test('does NOT trigger @ at start of single-quoted-looking string (whitespace required)', () => {
|
|
330
|
+
// Single quotes don't create quoted regions, but whitespace before @ is still required
|
|
331
|
+
const result = parseAtInLine("'@agent'")
|
|
332
|
+
expect(result.active).toBe(false)
|
|
333
|
+
})
|
|
334
|
+
|
|
335
|
+
// Mixed quotes - double quotes still suppress
|
|
336
|
+
test('does NOT trigger when @ is inside double quotes even with apostrophes', () => {
|
|
337
|
+
const result = parseAtInLine('"I don\'t @agent"')
|
|
338
|
+
expect(result.active).toBe(false)
|
|
339
|
+
})
|
|
340
|
+
|
|
341
|
+
test('does NOT trigger when @ is inside backticks even with apostrophes', () => {
|
|
342
|
+
const result = parseAtInLine("`I don't @agent`")
|
|
343
|
+
expect(result.active).toBe(false)
|
|
344
|
+
})
|
|
345
|
+
|
|
346
|
+
// Real-world usage examples
|
|
347
|
+
const realWorldExamples = [
|
|
348
|
+
["Why doesn't this work? @agent", 'agent'],
|
|
349
|
+
["That's what @file-picker", 'file-picker'],
|
|
350
|
+
["What's @commander", 'commander'],
|
|
351
|
+
] as const
|
|
352
|
+
|
|
353
|
+
test.each(realWorldExamples)(
|
|
354
|
+
'triggers in natural sentence: "%s"',
|
|
355
|
+
(sentence, expectedQuery) => {
|
|
356
|
+
const result = parseAtInLine(sentence)
|
|
357
|
+
expect(result.active).toBe(true)
|
|
358
|
+
expect(result.query).toBe(expectedQuery)
|
|
359
|
+
},
|
|
360
|
+
)
|
|
361
|
+
})
|