@alumbwe/anvil 1.0.42 → 1.0.50
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/bin/anvil.js +18 -0
- package/package.json +13 -6
- package/src/agents/bundled-agents.generated.ts +1 -1
- package/src/index.tsx +27 -4
- package/src/login/plain-login.ts +60 -0
- package/src/login/supabase-auth.ts +346 -0
- package/src/utils/anvil-client.ts +4 -0
- package/src/utils/auth.ts +16 -4
- package/src/utils/config-dir.ts +1 -1
- package/vendor/@anvil/common/src/constants/deepseek-direct.ts +30 -1
- package/vendor/@anvil/common/src/util/project-ignore.ts +4 -3
- package/vendor/@anvil/sdk/dist/index.cjs +46 -10
- package/vendor/@anvil/sdk/dist/index.mjs +46 -10
- package/src/commands/__tests__/anvil-command-aliases.test.ts +0 -56
- package/src/commands/__tests__/bash-command.test.ts +0 -445
- package/src/commands/__tests__/command-args.test.ts +0 -349
- package/src/commands/__tests__/copy-conversation-clipboard.test.ts +0 -108
- package/src/commands/__tests__/copy-conversation.test.ts +0 -226
- package/src/commands/__tests__/diagnostics-command.test.ts +0 -35
- package/src/commands/__tests__/image.test.ts +0 -99
- package/src/commands/__tests__/init.test.ts +0 -456
- package/src/commands/__tests__/new-command-rotates-chat.test.ts +0 -91
- package/src/commands/__tests__/process-diagnostics.test.ts +0 -54
- package/src/commands/__tests__/prompt-builders.test.ts +0 -28
- package/src/commands/__tests__/router-input.test.ts +0 -298
- package/src/components/__tests__/ad-banner.test.tsx +0 -83
- package/src/components/__tests__/anvil-landing-heading-row.test.tsx +0 -91
- package/src/components/__tests__/anvil-model-selector.test.tsx +0 -519
- package/src/components/__tests__/anvil-offer-invariants.test.ts +0 -54
- package/src/components/__tests__/anvil-takeover-prompt.test.tsx +0 -212
- package/src/components/__tests__/chat-input-bar.test.tsx +0 -130
- package/src/components/__tests__/grid-layout.integration.test.tsx +0 -304
- package/src/components/__tests__/grid-layout.test.tsx +0 -1051
- package/src/components/__tests__/message-block.completion.test.tsx +0 -104
- package/src/components/__tests__/message-block.streaming.test.tsx +0 -78
- package/src/components/__tests__/message-with-agents.test.tsx +0 -579
- package/src/components/__tests__/multiline-input.test.tsx +0 -1132
- package/src/components/__tests__/queue-panel.test.tsx +0 -398
- package/src/components/__tests__/selectable-list.test.ts +0 -232
- package/src/components/__tests__/status-bar.test.tsx +0 -44
- package/src/components/__tests__/status-indicator.test.tsx +0 -204
- package/src/components/__tests__/terminal-thinking-orb.test.tsx +0 -111
- package/src/components/__tests__/user-error-banner.test.tsx +0 -102
- package/src/components/ask-user/__tests__/multiple-choice-form.test.ts +0 -432
- package/src/components/ask-user/__tests__/validation.test.ts +0 -213
- package/src/components/tools/__tests__/apply-patch.test.tsx +0 -84
- package/src/components/tools/__tests__/code-search.test.tsx +0 -45
- package/src/components/tools/__tests__/gravity-index.test.ts +0 -76
- package/src/components/tools/__tests__/render-ui.test.tsx +0 -92
- package/src/components/tools/__tests__/run-terminal-command.test.ts +0 -233
- package/src/contexts/__tests__/chat-runtime-context.test.tsx +0 -149
- package/src/data/slash-commands.test.ts +0 -24
- package/src/hooks/__tests__/holds-live-anvil-slot.test.ts +0 -49
- package/src/hooks/__tests__/session-fetch-signal.test.ts +0 -63
- package/src/hooks/__tests__/use-activity-query.test.ts +0 -1000
- package/src/hooks/__tests__/use-ask-user-bridge.test.ts +0 -176
- package/src/hooks/__tests__/use-auth-query.test.ts +0 -21
- package/src/hooks/__tests__/use-chat-input-remount.test.tsx +0 -66
- package/src/hooks/__tests__/use-clipboard.test.tsx +0 -73
- package/src/hooks/__tests__/use-connection-status.test.ts +0 -112
- package/src/hooks/__tests__/use-directory-browser.test.ts +0 -203
- package/src/hooks/__tests__/use-gravity-ad.test.ts +0 -73
- package/src/hooks/__tests__/use-grid-layout.test.ts +0 -349
- package/src/hooks/__tests__/use-input-history.test.ts +0 -699
- package/src/hooks/__tests__/use-message-queue-editing.test.tsx +0 -209
- package/src/hooks/__tests__/use-message-queue.test.tsx +0 -71
- package/src/hooks/__tests__/use-path-tab-completion.test.ts +0 -315
- package/src/hooks/__tests__/use-queue-controls.test.ts +0 -68
- package/src/hooks/__tests__/use-queue-ui.test.tsx +0 -83
- package/src/hooks/__tests__/use-searchable-list.test.ts +0 -359
- package/src/hooks/__tests__/use-send-message-timer.test.ts +0 -146
- package/src/hooks/__tests__/use-suggestion-engine-mention.test.ts +0 -361
- package/src/hooks/__tests__/use-suggestion-engine.test.ts +0 -485
- package/src/hooks/__tests__/use-terminal-focus.test.ts +0 -66
- package/src/hooks/__tests__/use-terminal-layout.test.ts +0 -675
- package/src/hooks/__tests__/use-timeout.test.ts +0 -330
- package/src/hooks/__tests__/use-usage-query.test.ts +0 -502
- package/src/hooks/__tests__/use-user-details-query.test.ts +0 -195
- package/src/hooks/helpers/__tests__/send-message.test.ts +0 -1918
- package/src/init/__tests__/init-direnv.test.ts +0 -526
- package/src/state/__tests__/chat-store-focus.test.ts +0 -22
- package/src/state/__tests__/feedback-store.test.ts +0 -257
- package/src/utils/__tests__/active-run.test.ts +0 -140
- package/src/utils/__tests__/activity-tracker.test.ts +0 -440
- package/src/utils/__tests__/agent-display.test.ts +0 -139
- package/src/utils/__tests__/analytics-client.test.ts +0 -262
- package/src/utils/__tests__/anonymous-id.test.ts +0 -74
- package/src/utils/__tests__/anvil-api.test.ts +0 -578
- package/src/utils/__tests__/anvil-instance-owner.test.ts +0 -69
- package/src/utils/__tests__/anvil-model-navigation.test.ts +0 -102
- package/src/utils/__tests__/anvil-premium-reset.test.ts +0 -79
- package/src/utils/__tests__/anvil-referral-cache.test.ts +0 -116
- package/src/utils/__tests__/anvil-session-api.test.ts +0 -215
- package/src/utils/__tests__/anvil-session-display.test.ts +0 -23
- package/src/utils/__tests__/anvil-streak-line.test.ts +0 -217
- package/src/utils/__tests__/arrays.test.ts +0 -264
- package/src/utils/__tests__/bash-context-processor.test.ts +0 -38
- package/src/utils/__tests__/block-processor.test.ts +0 -810
- package/src/utils/__tests__/chat-history.test.ts +0 -203
- package/src/utils/__tests__/chat-input-key-intercept.test.ts +0 -40
- package/src/utils/__tests__/chat-meta.test.ts +0 -130
- package/src/utils/__tests__/clipboard-linux.test.ts +0 -359
- package/src/utils/__tests__/clipboard.test.ts +0 -910
- package/src/utils/__tests__/code-search-summary.test.ts +0 -84
- package/src/utils/__tests__/collapse-helpers.test.ts +0 -1109
- package/src/utils/__tests__/error-handling.test.ts +0 -658
- package/src/utils/__tests__/exit-cleanly.test.ts +0 -110
- package/src/utils/__tests__/feedback-helpers.test.ts +0 -444
- package/src/utils/__tests__/feedback-submission.test.ts +0 -26
- package/src/utils/__tests__/fetch-usage.test.ts +0 -355
- package/src/utils/__tests__/fingerprint.test.ts +0 -144
- package/src/utils/__tests__/fixtures/terminal-command-broker-child.ts +0 -7
- package/src/utils/__tests__/fixtures/terminal-command-broker-entry.ts +0 -3
- package/src/utils/__tests__/fixtures/terminal-command-broker-owner.ts +0 -33
- package/src/utils/__tests__/format-elapsed-time.test.ts +0 -103
- package/src/utils/__tests__/format-timeout.test.ts +0 -87
- package/src/utils/__tests__/image-dimensions.test.ts +0 -249
- package/src/utils/__tests__/image-processor.test.ts +0 -209
- package/src/utils/__tests__/implementor-helpers.test.ts +0 -1458
- package/src/utils/__tests__/keyboard-actions.test.ts +0 -660
- package/src/utils/__tests__/layout-helpers.test.ts +0 -36
- package/src/utils/__tests__/lazy-response-ads.test.ts +0 -167
- package/src/utils/__tests__/log-shipper.test.ts +0 -53
- package/src/utils/__tests__/markdown-renderer.test.tsx +0 -421
- package/src/utils/__tests__/message-block-helpers.test.ts +0 -1263
- package/src/utils/__tests__/message-updater.test.ts +0 -645
- package/src/utils/__tests__/osc-timeout-scenarios.test.ts +0 -172
- package/src/utils/__tests__/pending-attachments.test.ts +0 -277
- package/src/utils/__tests__/polling-backoff.test.ts +0 -51
- package/src/utils/__tests__/queue-panel-actions.test.ts +0 -148
- package/src/utils/__tests__/run-state-storage.test.ts +0 -919
- package/src/utils/__tests__/safe-json.test.ts +0 -77
- package/src/utils/__tests__/sdk-event-handlers.test.ts +0 -685
- package/src/utils/__tests__/send-message-helpers.test.ts +0 -1898
- package/src/utils/__tests__/send-message-timer.test.ts +0 -64
- package/src/utils/__tests__/settings.test.ts +0 -99
- package/src/utils/__tests__/strings.test.ts +0 -192
- package/src/utils/__tests__/terminal-color-detection.test.ts +0 -425
- package/src/utils/__tests__/terminal-command-broker.test.ts +0 -528
- package/src/utils/__tests__/terminal-enter-detection.test.ts +0 -77
- package/src/utils/__tests__/terminal-io.test.ts +0 -137
- package/src/utils/__tests__/terminal-protocol-controller.test.ts +0 -119
- package/src/utils/__tests__/text-layout.test.ts +0 -82
- package/src/utils/__tests__/theme-platform-detection.test.ts +0 -125
- package/src/utils/__tests__/think-tag-parser.test.ts +0 -159
- package/src/utils/__tests__/trace-writer.test.ts +0 -223
- package/src/utils/__tests__/trim-chat-logs.test.ts +0 -78
- package/src/utils/__tests__/usage-banner-state.test.ts +0 -298
- package/src/utils/__tests__/validation-error-formatting.test.ts +0 -126
- package/src/utils/__tests__/windows-terminal-health.test.ts +0 -101
- package/src/utils/__tests__/write-file-atomic.test.ts +0 -127
- package/vendor/@anvil/common/src/__tests__/agent-validation.test.ts +0 -846
- package/vendor/@anvil/common/src/__tests__/anvil-model-availability.test.ts +0 -101
- package/vendor/@anvil/common/src/__tests__/anvil-models.test.ts +0 -1408
- package/vendor/@anvil/common/src/__tests__/anvil-public-data-use-copy.test.ts +0 -258
- package/vendor/@anvil/common/src/__tests__/anvil-referral-tiers.test.ts +0 -48
- package/vendor/@anvil/common/src/__tests__/anvil-spend-ceilings.test.ts +0 -282
- package/vendor/@anvil/common/src/__tests__/anvil-trust.test.ts +0 -526
- package/vendor/@anvil/common/src/__tests__/deepseek-direct.test.ts +0 -68
- package/vendor/@anvil/common/src/__tests__/disposable-email.test.ts +0 -132
- package/vendor/@anvil/common/src/__tests__/dynamic-agent-template-schema.test.ts +0 -422
- package/vendor/@anvil/common/src/__tests__/env-ci.test.ts +0 -167
- package/vendor/@anvil/common/src/__tests__/env-process.test.ts +0 -145
- package/vendor/@anvil/common/src/__tests__/foreign-client-shipped-agents.test.ts +0 -234
- package/vendor/@anvil/common/src/__tests__/foreign-client-signals.test.ts +0 -379
- package/vendor/@anvil/common/src/__tests__/free-agents.test.ts +0 -807
- package/vendor/@anvil/common/src/__tests__/gravity-capi.test.ts +0 -154
- package/vendor/@anvil/common/src/__tests__/handlesteps-parsing.test.ts +0 -246
- package/vendor/@anvil/common/src/__tests__/kimi-k3-god-only.test.ts +0 -77
- package/vendor/@anvil/common/src/__tests__/model-config.test.ts +0 -89
- package/vendor/@anvil/common/src/__tests__/project-file-tree.test.ts +0 -298
- package/vendor/@anvil/common/src/__tests__/provisioned-model-tiers.test.ts +0 -116
- package/vendor/@anvil/common/src/__tests__/reasoning-effort.test.ts +0 -167
- package/vendor/@anvil/common/src/__tests__/reddit-capi.test.ts +0 -132
- package/vendor/@anvil/common/src/__tests__/response-ad-positions.test.ts +0 -72
- package/vendor/@anvil/common/src/__tests__/user-state.test.ts +0 -30
- package/vendor/@anvil/common/src/constants/__tests__/anvil-onboarding-gate.test.ts +0 -63
- package/vendor/@anvil/common/src/constants/__tests__/anvil-onboarding.test.ts +0 -246
- package/vendor/@anvil/common/src/constants/__tests__/cf-worker-signals.test.ts +0 -106
- package/vendor/@anvil/common/src/testing/TESTING_PATTERNS.md +0 -351
- package/vendor/@anvil/common/src/testing/anvil-offer-invariants.ts +0 -169
- package/vendor/@anvil/common/src/testing/errors.ts +0 -33
- package/vendor/@anvil/common/src/testing/fixtures/agent-runtime.ts +0 -334
- package/vendor/@anvil/common/src/testing/impl/agent-runtime.ts +0 -6
- package/vendor/@anvil/common/src/testing/index.ts +0 -84
- package/vendor/@anvil/common/src/testing/mock-modules.ts +0 -53
- package/vendor/@anvil/common/src/testing/mock-types.ts +0 -123
- package/vendor/@anvil/common/src/testing/mocks/analytics.ts +0 -261
- package/vendor/@anvil/common/src/testing/mocks/child-process.ts +0 -93
- package/vendor/@anvil/common/src/testing/mocks/crypto.ts +0 -218
- package/vendor/@anvil/common/src/testing/mocks/database.ts +0 -337
- package/vendor/@anvil/common/src/testing/mocks/fetch.ts +0 -219
- package/vendor/@anvil/common/src/testing/mocks/filesystem.ts +0 -166
- package/vendor/@anvil/common/src/testing/mocks/index.ts +0 -101
- package/vendor/@anvil/common/src/testing/mocks/logger.ts +0 -135
- package/vendor/@anvil/common/src/testing/mocks/stream.ts +0 -313
- package/vendor/@anvil/common/src/testing/mocks/timers.ts +0 -132
- package/vendor/@anvil/common/src/testing/mocks/tree-sitter.ts +0 -127
- package/vendor/@anvil/common/src/testing/setup.ts +0 -282
- package/vendor/@anvil/common/src/tools/__tests__/compile-tool-definitions.test.ts +0 -34
- package/vendor/@anvil/common/src/tools/params/__tests__/coerce-to-array.test.ts +0 -213
- package/vendor/@anvil/common/src/tools/params/__tests__/read-docs.test.ts +0 -47
- package/vendor/@anvil/common/src/tools/params/__tests__/render-ui.test.ts +0 -65
- package/vendor/@anvil/common/src/tools/params/tool/__tests__/run-terminal-command-timeout.test.ts +0 -49
- package/vendor/@anvil/common/src/types/__tests__/dynamic-agent-template.test.ts +0 -20
- package/vendor/@anvil/common/src/util/__tests__/ad-user-agent.test.ts +0 -26
- package/vendor/@anvil/common/src/util/__tests__/analytics-dispatcher.test.ts +0 -122
- package/vendor/@anvil/common/src/util/__tests__/analytics-log.test.ts +0 -102
- package/vendor/@anvil/common/src/util/__tests__/analytics-sampling.test.ts +0 -143
- package/vendor/@anvil/common/src/util/__tests__/anvil-streak.test.ts +0 -202
- package/vendor/@anvil/common/src/util/__tests__/anvil-usage-summary.test.ts +0 -193
- package/vendor/@anvil/common/src/util/__tests__/axiom-only-log.test.ts +0 -140
- package/vendor/@anvil/common/src/util/__tests__/client-user-agent.test.ts +0 -148
- package/vendor/@anvil/common/src/util/__tests__/engagement-tracker.test.ts +0 -115
- package/vendor/@anvil/common/src/util/__tests__/env-file-path.test.ts +0 -57
- package/vendor/@anvil/common/src/util/__tests__/error-abort.test.ts +0 -774
- package/vendor/@anvil/common/src/util/__tests__/error-api-details.test.ts +0 -206
- package/vendor/@anvil/common/src/util/__tests__/file-read-limits.test.ts +0 -173
- package/vendor/@anvil/common/src/util/__tests__/format-code-search.test.ts +0 -60
- package/vendor/@anvil/common/src/util/__tests__/log-mirror.test.ts +0 -31
- package/vendor/@anvil/common/src/util/__tests__/messages.test.ts +0 -1252
- package/vendor/@anvil/common/src/util/__tests__/partial-json-delta.test.ts +0 -505
- package/vendor/@anvil/common/src/util/__tests__/path.test.ts +0 -22
- package/vendor/@anvil/common/src/util/__tests__/project-ignore.test.ts +0 -90
- package/vendor/@anvil/common/src/util/__tests__/promise.test.ts +0 -325
- package/vendor/@anvil/common/src/util/__tests__/rate-limit.test.ts +0 -28
- package/vendor/@anvil/common/src/util/__tests__/reddit-anvil-retention.test.ts +0 -130
- package/vendor/@anvil/common/src/util/__tests__/saxy.test.ts +0 -1008
- package/vendor/@anvil/common/src/util/__tests__/split-data.test.ts +0 -289
- package/vendor/@anvil/common/src/util/__tests__/string.test.ts +0 -239
- package/vendor/@anvil/common/src/util/__tests__/thread-title.test.ts +0 -70
- package/vendor/@anvil/common/src/util/__tests__/tool-result-media-order.test.ts +0 -108
- package/vendor/@anvil/common/src/util/__tests__/ttft-histogram.test.ts +0 -180
- package/vendor/@anvil/common/src/util/__tests__/with-timeout.test.ts +0 -24
- package/vendor/@anvil/common/src/util/__tests__/zoned-time.test.ts +0 -88
- package/vendor/@anvil/common/src/util/skills.test.ts +0 -44
- package/vendor/@anvil/sdk/dist/index.cjs.map +0 -440
- package/vendor/@anvil/sdk/dist/index.mjs.map +0 -440
|
@@ -1,204 +0,0 @@
|
|
|
1
|
-
import { describe, test, expect } from 'bun:test'
|
|
2
|
-
|
|
3
|
-
import { getStatusIndicatorState } from '../../utils/status-indicator-state'
|
|
4
|
-
|
|
5
|
-
import type { StatusIndicatorStateArgs } from '../../utils/status-indicator-state'
|
|
6
|
-
|
|
7
|
-
describe('StatusIndicator state logic', () => {
|
|
8
|
-
describe('getStatusIndicatorState', () => {
|
|
9
|
-
const baseArgs: StatusIndicatorStateArgs = {
|
|
10
|
-
statusMessage: null,
|
|
11
|
-
streamStatus: 'idle',
|
|
12
|
-
nextCtrlCWillExit: false,
|
|
13
|
-
isConnected: true,
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
test('returns idle state when no special conditions', () => {
|
|
17
|
-
const state = getStatusIndicatorState(baseArgs)
|
|
18
|
-
expect(state.kind).toBe('idle')
|
|
19
|
-
})
|
|
20
|
-
|
|
21
|
-
test('returns ctrlC state when nextCtrlCWillExit is true (highest priority)', () => {
|
|
22
|
-
const state = getStatusIndicatorState({
|
|
23
|
-
...baseArgs,
|
|
24
|
-
nextCtrlCWillExit: true,
|
|
25
|
-
statusMessage: 'Some message',
|
|
26
|
-
streamStatus: 'streaming',
|
|
27
|
-
isConnected: false,
|
|
28
|
-
})
|
|
29
|
-
expect(state.kind).toBe('ctrlC')
|
|
30
|
-
})
|
|
31
|
-
|
|
32
|
-
test('returns clipboard state when message exists (second priority)', () => {
|
|
33
|
-
const state = getStatusIndicatorState({
|
|
34
|
-
...baseArgs,
|
|
35
|
-
statusMessage: 'Copied to clipboard!',
|
|
36
|
-
streamStatus: 'streaming',
|
|
37
|
-
isConnected: false,
|
|
38
|
-
})
|
|
39
|
-
expect(state.kind).toBe('clipboard')
|
|
40
|
-
if (state.kind === 'clipboard') {
|
|
41
|
-
expect(state.message).toBe('Copied to clipboard!')
|
|
42
|
-
}
|
|
43
|
-
})
|
|
44
|
-
|
|
45
|
-
test('returns retrying state when auth is retrying even if connected and reachable', () => {
|
|
46
|
-
const state = getStatusIndicatorState({
|
|
47
|
-
...baseArgs,
|
|
48
|
-
isConnected: true,
|
|
49
|
-
authStatus: 'retrying',
|
|
50
|
-
streamStatus: 'streaming',
|
|
51
|
-
})
|
|
52
|
-
expect(state.kind).toBe('retrying')
|
|
53
|
-
})
|
|
54
|
-
|
|
55
|
-
test('returns capacityWait when the retry is a capacity deferral', () => {
|
|
56
|
-
const state = getStatusIndicatorState({
|
|
57
|
-
...baseArgs,
|
|
58
|
-
isRetrying: true,
|
|
59
|
-
isCapacityWait: true,
|
|
60
|
-
streamStatus: 'waiting',
|
|
61
|
-
})
|
|
62
|
-
expect(state.kind).toBe('capacityWait')
|
|
63
|
-
})
|
|
64
|
-
|
|
65
|
-
test('ignores isCapacityWait unless a retry is actually in progress', () => {
|
|
66
|
-
const state = getStatusIndicatorState({
|
|
67
|
-
...baseArgs,
|
|
68
|
-
isRetrying: false,
|
|
69
|
-
isCapacityWait: true,
|
|
70
|
-
streamStatus: 'waiting',
|
|
71
|
-
})
|
|
72
|
-
expect(state.kind).toBe('waiting')
|
|
73
|
-
})
|
|
74
|
-
|
|
75
|
-
test('returns retrying state when message send is retrying', () => {
|
|
76
|
-
const state = getStatusIndicatorState({
|
|
77
|
-
...baseArgs,
|
|
78
|
-
isRetrying: true,
|
|
79
|
-
streamStatus: 'waiting',
|
|
80
|
-
})
|
|
81
|
-
expect(state.kind).toBe('retrying')
|
|
82
|
-
})
|
|
83
|
-
|
|
84
|
-
test('returns connecting state when not connected (third priority)', () => {
|
|
85
|
-
const state = getStatusIndicatorState({
|
|
86
|
-
...baseArgs,
|
|
87
|
-
isConnected: false,
|
|
88
|
-
streamStatus: 'streaming',
|
|
89
|
-
})
|
|
90
|
-
expect(state.kind).toBe('connecting')
|
|
91
|
-
})
|
|
92
|
-
|
|
93
|
-
test('returns connecting state when auth service is unreachable', () => {
|
|
94
|
-
const state = getStatusIndicatorState({
|
|
95
|
-
...baseArgs,
|
|
96
|
-
isConnected: true,
|
|
97
|
-
authStatus: 'unreachable',
|
|
98
|
-
streamStatus: 'streaming',
|
|
99
|
-
})
|
|
100
|
-
expect(state.kind).toBe('connecting')
|
|
101
|
-
})
|
|
102
|
-
|
|
103
|
-
test('returns connecting state when both WebSocket and auth service are unreachable', () => {
|
|
104
|
-
const state = getStatusIndicatorState({
|
|
105
|
-
...baseArgs,
|
|
106
|
-
isConnected: false,
|
|
107
|
-
authStatus: 'unreachable',
|
|
108
|
-
streamStatus: 'streaming',
|
|
109
|
-
})
|
|
110
|
-
expect(state.kind).toBe('connecting')
|
|
111
|
-
})
|
|
112
|
-
|
|
113
|
-
test('returns waiting state when streamStatus is waiting', () => {
|
|
114
|
-
const state = getStatusIndicatorState({
|
|
115
|
-
...baseArgs,
|
|
116
|
-
streamStatus: 'waiting',
|
|
117
|
-
})
|
|
118
|
-
expect(state.kind).toBe('waiting')
|
|
119
|
-
})
|
|
120
|
-
|
|
121
|
-
test('returns streaming state when streamStatus is streaming', () => {
|
|
122
|
-
const state = getStatusIndicatorState({
|
|
123
|
-
...baseArgs,
|
|
124
|
-
streamStatus: 'streaming',
|
|
125
|
-
})
|
|
126
|
-
expect(state.kind).toBe('streaming')
|
|
127
|
-
})
|
|
128
|
-
|
|
129
|
-
test('handles empty clipboard message as falsy', () => {
|
|
130
|
-
const state = getStatusIndicatorState({
|
|
131
|
-
...baseArgs,
|
|
132
|
-
statusMessage: '',
|
|
133
|
-
streamStatus: 'streaming',
|
|
134
|
-
})
|
|
135
|
-
// Empty string is falsy, should fall through to streaming state
|
|
136
|
-
expect(state.kind).toBe('streaming')
|
|
137
|
-
})
|
|
138
|
-
|
|
139
|
-
describe('state priority order', () => {
|
|
140
|
-
test('nextCtrlCWillExit beats clipboard', () => {
|
|
141
|
-
const state = getStatusIndicatorState({
|
|
142
|
-
...baseArgs,
|
|
143
|
-
nextCtrlCWillExit: true,
|
|
144
|
-
statusMessage: 'Test',
|
|
145
|
-
})
|
|
146
|
-
expect(state.kind).toBe('ctrlC')
|
|
147
|
-
})
|
|
148
|
-
|
|
149
|
-
test('clipboard beats connecting', () => {
|
|
150
|
-
const state = getStatusIndicatorState({
|
|
151
|
-
...baseArgs,
|
|
152
|
-
statusMessage: 'Test',
|
|
153
|
-
isConnected: false,
|
|
154
|
-
})
|
|
155
|
-
expect(state.kind).toBe('clipboard')
|
|
156
|
-
})
|
|
157
|
-
|
|
158
|
-
test('retrying beats waiting', () => {
|
|
159
|
-
const state = getStatusIndicatorState({
|
|
160
|
-
...baseArgs,
|
|
161
|
-
isConnected: true,
|
|
162
|
-
authStatus: 'retrying',
|
|
163
|
-
streamStatus: 'waiting',
|
|
164
|
-
})
|
|
165
|
-
expect(state.kind).toBe('retrying')
|
|
166
|
-
})
|
|
167
|
-
|
|
168
|
-
test('connecting beats waiting', () => {
|
|
169
|
-
const state = getStatusIndicatorState({
|
|
170
|
-
...baseArgs,
|
|
171
|
-
isConnected: false,
|
|
172
|
-
streamStatus: 'waiting',
|
|
173
|
-
})
|
|
174
|
-
expect(state.kind).toBe('connecting')
|
|
175
|
-
})
|
|
176
|
-
|
|
177
|
-
test('auth unreachable beats waiting', () => {
|
|
178
|
-
const state = getStatusIndicatorState({
|
|
179
|
-
...baseArgs,
|
|
180
|
-
isConnected: true,
|
|
181
|
-
authStatus: 'unreachable',
|
|
182
|
-
streamStatus: 'waiting',
|
|
183
|
-
})
|
|
184
|
-
expect(state.kind).toBe('connecting')
|
|
185
|
-
})
|
|
186
|
-
|
|
187
|
-
test('waiting beats streaming', () => {
|
|
188
|
-
const state = getStatusIndicatorState({
|
|
189
|
-
...baseArgs,
|
|
190
|
-
streamStatus: 'waiting',
|
|
191
|
-
})
|
|
192
|
-
expect(state.kind).toBe('waiting')
|
|
193
|
-
})
|
|
194
|
-
|
|
195
|
-
test('streaming beats idle', () => {
|
|
196
|
-
const state = getStatusIndicatorState({
|
|
197
|
-
...baseArgs,
|
|
198
|
-
streamStatus: 'streaming',
|
|
199
|
-
})
|
|
200
|
-
expect(state.kind).toBe('streaming')
|
|
201
|
-
})
|
|
202
|
-
})
|
|
203
|
-
})
|
|
204
|
-
})
|
|
@@ -1,111 +0,0 @@
|
|
|
1
|
-
import { beforeAll, describe, expect, test } from 'bun:test'
|
|
2
|
-
import { createTestRenderer } from '@opentui/core/testing'
|
|
3
|
-
import { createRoot, flushSync } from '@opentui/react'
|
|
4
|
-
import React from 'react'
|
|
5
|
-
|
|
6
|
-
import { AnvilMark, ANVIL_MARK_LINES } from '../anvil-mark'
|
|
7
|
-
import { TerminalThinkingOrb } from '../terminal-thinking-orb'
|
|
8
|
-
import { initializeThemeStore } from '../../hooks/use-theme'
|
|
9
|
-
|
|
10
|
-
beforeAll(() => {
|
|
11
|
-
initializeThemeStore()
|
|
12
|
-
})
|
|
13
|
-
|
|
14
|
-
describe('TerminalThinkingOrb', () => {
|
|
15
|
-
const renderOrb = (state: 'waiting' | 'working' | 'searching' | 'connecting' | 'retrying') => (
|
|
16
|
-
<text>
|
|
17
|
-
<TerminalThinkingOrb state={state} />
|
|
18
|
-
</text>
|
|
19
|
-
)
|
|
20
|
-
|
|
21
|
-
test('renders a braille frame for the working state', async () => {
|
|
22
|
-
const setup = await createTestRenderer({ width: 10, height: 1 })
|
|
23
|
-
const root = createRoot(setup.renderer)
|
|
24
|
-
flushSync(() => {
|
|
25
|
-
root.render(renderOrb('working'))
|
|
26
|
-
})
|
|
27
|
-
|
|
28
|
-
try {
|
|
29
|
-
await setup.renderOnce()
|
|
30
|
-
const frame = setup.captureCharFrame()
|
|
31
|
-
expect(frame.length).toBeGreaterThan(0)
|
|
32
|
-
// Every frame is a single braille/particle character.
|
|
33
|
-
expect(frame.trim().length).toBe(1)
|
|
34
|
-
} finally {
|
|
35
|
-
flushSync(() => root.unmount())
|
|
36
|
-
setup.renderer.destroy()
|
|
37
|
-
}
|
|
38
|
-
})
|
|
39
|
-
|
|
40
|
-
test('renders different states without crashing', async () => {
|
|
41
|
-
const setup = await createTestRenderer({ width: 10, height: 1 })
|
|
42
|
-
const root = createRoot(setup.renderer)
|
|
43
|
-
|
|
44
|
-
try {
|
|
45
|
-
for (const state of [
|
|
46
|
-
'waiting',
|
|
47
|
-
'working',
|
|
48
|
-
'searching',
|
|
49
|
-
'connecting',
|
|
50
|
-
'retrying',
|
|
51
|
-
] as const) {
|
|
52
|
-
flushSync(() => {
|
|
53
|
-
root.render(renderOrb(state))
|
|
54
|
-
})
|
|
55
|
-
await setup.renderOnce()
|
|
56
|
-
expect(setup.captureCharFrame().trim().length).toBe(1)
|
|
57
|
-
}
|
|
58
|
-
} finally {
|
|
59
|
-
flushSync(() => root.unmount())
|
|
60
|
-
setup.renderer.destroy()
|
|
61
|
-
}
|
|
62
|
-
})
|
|
63
|
-
|
|
64
|
-
test('renders a rotating spark frame for the spark variant', async () => {
|
|
65
|
-
const setup = await createTestRenderer({ width: 10, height: 1 })
|
|
66
|
-
const root = createRoot(setup.renderer)
|
|
67
|
-
flushSync(() => {
|
|
68
|
-
root.render(
|
|
69
|
-
<text>
|
|
70
|
-
<TerminalThinkingOrb state="working" variant="spark" />
|
|
71
|
-
</text>,
|
|
72
|
-
)
|
|
73
|
-
})
|
|
74
|
-
|
|
75
|
-
try {
|
|
76
|
-
await setup.renderOnce()
|
|
77
|
-
const frame = setup.captureCharFrame()
|
|
78
|
-
expect(frame.length).toBeGreaterThan(0)
|
|
79
|
-
// The spark variant renders exactly one spark glyph per frame.
|
|
80
|
-
expect(frame.trim().length).toBe(1)
|
|
81
|
-
} finally {
|
|
82
|
-
flushSync(() => root.unmount())
|
|
83
|
-
setup.renderer.destroy()
|
|
84
|
-
}
|
|
85
|
-
})
|
|
86
|
-
})
|
|
87
|
-
|
|
88
|
-
describe('AnvilMark', () => {
|
|
89
|
-
test('renders the geometric anvil line-work', async () => {
|
|
90
|
-
const setup = await createTestRenderer({ width: 30, height: 5 })
|
|
91
|
-
const root = createRoot(setup.renderer)
|
|
92
|
-
flushSync(() => {
|
|
93
|
-
root.render(<AnvilMark />)
|
|
94
|
-
})
|
|
95
|
-
|
|
96
|
-
try {
|
|
97
|
-
await setup.renderOnce()
|
|
98
|
-
const frame = setup.captureCharFrame()
|
|
99
|
-
// The mark's first line should contain the top of the striking face.
|
|
100
|
-
expect(frame).toContain('▄')
|
|
101
|
-
} finally {
|
|
102
|
-
flushSync(() => root.unmount())
|
|
103
|
-
setup.renderer.destroy()
|
|
104
|
-
}
|
|
105
|
-
})
|
|
106
|
-
|
|
107
|
-
test('exposes a 5-line mark definition', () => {
|
|
108
|
-
expect(ANVIL_MARK_LINES).toHaveLength(5)
|
|
109
|
-
expect(ANVIL_MARK_LINES[0].includes('▄')).toBe(true)
|
|
110
|
-
})
|
|
111
|
-
})
|
|
@@ -1,102 +0,0 @@
|
|
|
1
|
-
import { describe, test, expect } from 'bun:test'
|
|
2
|
-
import React from 'react'
|
|
3
|
-
import { renderToStaticMarkup } from 'react-dom/server'
|
|
4
|
-
|
|
5
|
-
import { initializeThemeStore } from '../../hooks/use-theme'
|
|
6
|
-
import { UserErrorBanner } from '../user-error-banner'
|
|
7
|
-
|
|
8
|
-
initializeThemeStore()
|
|
9
|
-
|
|
10
|
-
describe('UserErrorBanner', () => {
|
|
11
|
-
test('renders error message', () => {
|
|
12
|
-
const markup = renderToStaticMarkup(
|
|
13
|
-
<UserErrorBanner error="Something went wrong" />,
|
|
14
|
-
)
|
|
15
|
-
|
|
16
|
-
expect(markup).toContain('Error')
|
|
17
|
-
expect(markup).toContain('Something went wrong')
|
|
18
|
-
})
|
|
19
|
-
|
|
20
|
-
test('renders with context length exceeded error', () => {
|
|
21
|
-
const errorMessage =
|
|
22
|
-
"This endpoint's maximum context length is 200000 tokens. However, you requested about 201209 tokens."
|
|
23
|
-
|
|
24
|
-
const markup = renderToStaticMarkup(
|
|
25
|
-
<UserErrorBanner error={errorMessage} />,
|
|
26
|
-
)
|
|
27
|
-
|
|
28
|
-
expect(markup).toContain('Error')
|
|
29
|
-
expect(markup).toContain('200000 tokens')
|
|
30
|
-
expect(markup).toContain('201209 tokens')
|
|
31
|
-
})
|
|
32
|
-
|
|
33
|
-
test('renders with network error', () => {
|
|
34
|
-
const markup = renderToStaticMarkup(
|
|
35
|
-
<UserErrorBanner error="Network request failed: Connection refused" />,
|
|
36
|
-
)
|
|
37
|
-
|
|
38
|
-
expect(markup).toContain('Error')
|
|
39
|
-
expect(markup).toContain('Network request failed')
|
|
40
|
-
expect(markup).toContain('Connection refused')
|
|
41
|
-
})
|
|
42
|
-
|
|
43
|
-
test('returns null for empty error message', () => {
|
|
44
|
-
const markup = renderToStaticMarkup(<UserErrorBanner error="" />)
|
|
45
|
-
|
|
46
|
-
// Empty error should render nothing
|
|
47
|
-
expect(markup).toBe('')
|
|
48
|
-
})
|
|
49
|
-
|
|
50
|
-
test('returns null for whitespace-only error message', () => {
|
|
51
|
-
const markup = renderToStaticMarkup(<UserErrorBanner error=" " />)
|
|
52
|
-
|
|
53
|
-
// Whitespace-only error should render nothing
|
|
54
|
-
expect(markup).toBe('')
|
|
55
|
-
})
|
|
56
|
-
|
|
57
|
-
test('renders with multiline error message', () => {
|
|
58
|
-
const multilineError = 'First line of error\nSecond line of error'
|
|
59
|
-
|
|
60
|
-
const markup = renderToStaticMarkup(
|
|
61
|
-
<UserErrorBanner error={multilineError} />,
|
|
62
|
-
)
|
|
63
|
-
|
|
64
|
-
expect(markup).toContain('Error')
|
|
65
|
-
expect(markup).toContain('First line of error')
|
|
66
|
-
expect(markup).toContain('Second line of error')
|
|
67
|
-
})
|
|
68
|
-
|
|
69
|
-
test('renders with special characters in error message', () => {
|
|
70
|
-
const specialCharsError = 'Error with <html> tags & "quotes"'
|
|
71
|
-
|
|
72
|
-
const markup = renderToStaticMarkup(
|
|
73
|
-
<UserErrorBanner error={specialCharsError} />,
|
|
74
|
-
)
|
|
75
|
-
|
|
76
|
-
expect(markup).toContain('Error')
|
|
77
|
-
// HTML entities should be escaped in the markup
|
|
78
|
-
expect(markup).toContain('<html>')
|
|
79
|
-
expect(markup).toContain('&')
|
|
80
|
-
expect(markup).toContain('"quotes"')
|
|
81
|
-
})
|
|
82
|
-
|
|
83
|
-
test('renders with long error message', () => {
|
|
84
|
-
const longError = 'A'.repeat(500)
|
|
85
|
-
|
|
86
|
-
const markup = renderToStaticMarkup(
|
|
87
|
-
<UserErrorBanner error={longError} />,
|
|
88
|
-
)
|
|
89
|
-
|
|
90
|
-
expect(markup).toContain('Error')
|
|
91
|
-
expect(markup).toContain(longError)
|
|
92
|
-
})
|
|
93
|
-
|
|
94
|
-
test('renders with custom title', () => {
|
|
95
|
-
const markup = renderToStaticMarkup(
|
|
96
|
-
<UserErrorBanner error="Something went wrong" title="Network Error" />,
|
|
97
|
-
)
|
|
98
|
-
|
|
99
|
-
expect(markup).toContain('Network Error')
|
|
100
|
-
expect(markup).toContain('Something went wrong')
|
|
101
|
-
})
|
|
102
|
-
})
|